io.parrots
Version:
Parrots.io App
214 lines (212 loc) • 21.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, HostListener } from '@angular/core';
import { PhloxAppService } from 'com.phloxui';
import { NeedFocusService } from 'com.phloxui';
import { ObservableManager } from 'com.phloxui';
import { NotificationManager } from 'com.phloxui';
import { PhloxAppInfoService } from 'com.phloxui';
import { PhloxAppInfo } from 'com.phloxui';
import { AbstractSideSlidePanel } from 'com.phloxui';
const /** @type {?} */ TYPE_NAME = "parrots-notifier";
const /** @type {?} */ SUB_TOPIC_NAME = 'parrots-notifier';
export class ParrotsNotifier extends AbstractSideSlidePanel {
/**
* @param {?} phloxAppService
* @param {?} observableMgr
* @param {?} needFocusService
* @param {?} notificationManager
* @param {?} phloxAppInfoService
*/
constructor(phloxAppService, observableMgr, needFocusService, notificationManager, phloxAppInfoService) {
super(phloxAppService, observableMgr, needFocusService, ParrotsNotifier.SUB_TOPIC_NAME);
this.notificationManager = notificationManager;
if (phloxAppInfoService != null) {
phloxAppInfoService.getAppInfo().then((result) => {
this.phloxAppInfo = result;
});
}
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
}
/**
* @return {?}
*/
isRinging() {
if (this.notificationManager !== null && typeof this.notificationManager !== 'undefined') {
let /** @type {?} */ unReadArray = this.getUnreadNotifications();
if (unReadArray !== null && typeof unReadArray !== 'undefined') {
return unReadArray.length > 0;
}
}
return false;
}
/**
* @return {?}
*/
getUnreadNotifications() {
if (this.notificationManager !== null && typeof this.notificationManager !== 'undefined') {
let /** @type {?} */ unReadArray = this.notificationManager.getUnreadNotifications();
if (unReadArray !== null && typeof unReadArray !== 'undefined') {
return unReadArray;
}
}
return [];
}
/**
* @return {?}
*/
getNotifications() {
let /** @type {?} */ result = [];
if (this.notificationManager !== null && typeof this.notificationManager !== 'undefined') {
let /** @type {?} */ allNotifyArray = this.notificationManager.getNotifications();
let /** @type {?} */ maxNotification = PhloxAppInfo.DEFAULT_MAX_NOTIFICATIONS;
if (this.phloxAppInfo !== null && typeof this.phloxAppInfo !== 'undefined') {
if (this.phloxAppInfo.settings !== null && typeof this.phloxAppInfo.settings !== 'undefined') {
maxNotification = this.phloxAppInfo.settings.MAX_NOTIFICATIONS;
}
}
if (allNotifyArray !== null && typeof allNotifyArray !== 'undefined') {
let /** @type {?} */ overLength = 0;
if (allNotifyArray.length > maxNotification) {
overLength = allNotifyArray.length - maxNotification;
let /** @type {?} */ removeArray = allNotifyArray.slice(0, overLength);
for (let /** @type {?} */ r of removeArray) {
this.notificationManager.clear(r);
}
allNotifyArray = this.notificationManager.getNotifications();
}
for (let /** @type {?} */ n of allNotifyArray) {
result.push(n);
}
}
}
return result;
}
/**
* @param {?} $event
* @param {?} notification
* @return {?}
*/
onNotificationClicked($event, notification) {
if (notification === null || typeof notification === 'undefined') {
return;
}
if (this.notificationManager !== null && typeof this.notificationManager !== 'undefined') {
this.notificationManager.clear(notification);
}
}
/**
* @param {?} event
* @return {?}
*/
onToggle(event) {
super.onToggle(event);
// mark as read
if (this.notificationManager !== null && typeof this.notificationManager !== 'undefined') {
this.notificationManager.markAsReadAll();
}
}
/**
* @param {?} event
* @return {?}
*/
onClick(event) {
event.stopPropagation();
}
}
ParrotsNotifier.TYPE_NAME = TYPE_NAME;
ParrotsNotifier.SUB_TOPIC_NAME = SUB_TOPIC_NAME;
ParrotsNotifier.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: `<div class="parrots-notifier" [class.active]="isActive()" (click)="onToggle($event)">
<div class="wrapper">
<div>
<div class="table-wrapper fluid">
<div class="table-row-wrapper">
<div class="table-cell-wrapper middle">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" class="bell" [class.ringing]="isRinging()"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 30 30" style="enable-background: new 0 0 30 30;"
xml:space="preserve">
<g>
<g>
<path
d="M21.951,19.175l-1-1.221v-3.271c0-3.123-2-5.723-5-6.294V7.575c0-0.673-0.827-1.221-1.5-1.221
c-0.673,0-1.5,0.548-1.5,1.221v0.814c-3,0.57-5,3.171-5,6.294v3.271l-1,1.221v0.71h-1v2h17v-2h-1V19.175z M22.779,19.175" />
</g>
</g>
</svg>
</div>
</div>
</div>
</div>
<div>
<div class="table-wrapper fluid">
<div class="table-row-wrapper">
<div class="table-cell-wrapper middle">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" class="bell" [class.ringing]="isRinging()"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 30 30" style="enable-background: new 0 0 30 30;"
xml:space="preserve">
<g>
<g>
</g>
<path
d="M15.147,24.513c1.136,0,2.117-0.628,2.574-1.628h-5.149C13.03,23.885,14.011,24.513,15.147,24.513
L15.147,24.513z M15.147,24.873" />
</g>
</svg>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="parrots-notifier-side-panel right" [class.active]="isActive()">
<div class="row" *ngFor="let notify of getNotifications(); let i = index;" (click)="onNotificationClicked($event, notify)">
{{notify.title}} --> click to clear
</div>
</div>
`
},] },
];
/** @nocollapse */
ParrotsNotifier.ctorParameters = () => [
{ type: PhloxAppService, },
{ type: ObservableManager, },
{ type: NeedFocusService, },
{ type: NotificationManager, },
{ type: PhloxAppInfoService, },
];
ParrotsNotifier.propDecorators = {
"onClick": [{ type: HostListener, args: ['click', ['$event'],] },],
};
function ParrotsNotifier_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
ParrotsNotifier.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
ParrotsNotifier.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
ParrotsNotifier.propDecorators;
/** @type {?} */
ParrotsNotifier.TYPE_NAME;
/** @type {?} */
ParrotsNotifier.SUB_TOPIC_NAME;
/** @type {?} */
ParrotsNotifier.prototype.notificationManager;
/** @type {?} */
ParrotsNotifier.prototype.phloxAppInfo;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFycm90c05vdGlmaWVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lvLnBhcnJvdHMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L3BhZ2UvbWFpbi9tZW51LmludGVybmFsL1BhcnJvdHNOb3RpZmllci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWxELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBS3JELHVCQUFNLFNBQVMsR0FBVyxrQkFBa0IsQ0FBQztBQUM3Qyx1QkFBTSxjQUFjLEdBQVcsa0JBQWtCLENBQUM7QUF5RGxELE1BQU0sc0JBQXVCLFNBQVEsc0JBQXNCOzs7Ozs7OztJQVN6RCxZQUFZLGVBQWdDLEVBQUUsYUFBZ0MsRUFBRSxnQkFBa0MsRUFBRSxtQkFBd0MsRUFBRSxtQkFBd0M7UUFDcE0sS0FBSyxDQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXhGLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQztRQUUvQyxFQUFFLENBQUMsQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLG1CQUFtQixDQUFDLFVBQVUsRUFB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QUFnQjtZQUVoQixtQkFBbUI7WUFDbkIsbUJBQW1COzs7d0JBcUt6QixZQUFZLFNBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBQaGxveEFwcFNlcnZpY2UgfSBmcm9tICdjb20ucGhsb3h1aSc7XG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlIH0gZnJvbSAnY29tLnBobG94dWknO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZU1hbmFnZXIgfSBmcm9tICdjb20ucGhsb3h1aSc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25NYW5hZ2VyIH0gZnJvbSAnY29tLnBobG94dWknO1xuaW1wb3J0IHsgUGhsb3hBcHBJbmZvU2VydmljZSB9IGZyb20gJ2NvbS5waGxveHVpJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbiB9IGZyb20gJ2NvbS5waGxveHVpJztcbmltcG9ydCB7IFBobG94QXBwSW5mbyB9IGZyb20gJ2NvbS5waGxveHVpJztcbmltcG9ydCB7IEFic3RyYWN0U2lkZVNsaWRlUGFuZWwgfSBmcm9tICdjb20ucGhsb3h1aSc7XG5pbXBvcnQgeyBJTm90aWZpY2F0aW9uTWFuYWdlciB9IGZyb20gJ2NvbS5waGxveHVpJztcblxuZGVjbGFyZSB2YXIgJDogYW55O1xuXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGFycm90cy1ub3RpZmllclwiO1xuY29uc3QgU1VCX1RPUElDX05BTUU6IHN0cmluZyA9ICdwYXJyb3RzLW5vdGlmaWVyJztcblxuQENvbXBvbmVudCh7XG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInBhcnJvdHMtbm90aWZpZXJcIiBbY2xhc3MuYWN0aXZlXT1cImlzQWN0aXZlKClcIiAoY2xpY2spPVwib25Ub2dnbGUoJGV2ZW50KVwiPlxuXHQ8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuXHRcdDxkaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtd3JhcHBlciBmbHVpZFwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtcm93LXdyYXBwZXJcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtY2VsbC13cmFwcGVyIG1pZGRsZVwiPlxuXHRcdFx0XHRcdFx0PHN2ZyB2ZXJzaW9uPVwiMS4xXCIgaWQ9XCJMYXllcl8xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiYmVsbFwiIFtjbGFzcy5yaW5naW5nXT1cImlzUmluZ2luZygpXCJcblx0XHRcdFx0XHRcdFx0eG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIlxuXHRcdFx0XHRcdFx0XHR2aWV3Qm94PVwiMCAwIDMwIDMwXCIgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDogbmV3IDAgMCAzMCAzMDtcIlxuXHRcdFx0XHRcdFx0XHR4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiPlxuXHRcdFx0XHRcdFx0XHRcdDxnPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGc+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxwYXRoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZD1cIk0yMS45NTEsMTkuMTc1bC0xLTEuMjIxdi0zLjI3MWMwLTMuMTIzLTItNS43MjMtNS02LjI5NFY3LjU3NWMwLTAuNjczLTAuODI3LTEuMjIxLTEuNS0xLjIyMVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGMtMC42NzMsMC0xLjUsMC41NDgtMS41LDEuMjIxdjAuODE0Yy0zLDAuNTctNSwzLjE3MS01LDYuMjk0djMuMjcxbC0xLDEuMjIxdjAuNzFoLTF2MmgxN3YtMmgtMVYxOS4xNzV6IE0yMi43NzksMTkuMTc1XCIgLz5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZz5cblx0XHRcdFx0XHRcdFx0XHQ8L2c+XG5cdFx0XHRcdFx0XHRcdDwvc3ZnPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PlxuXHRcdDxkaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtd3JhcHBlciBmbHVpZFwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtcm93LXdyYXBwZXJcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtY2VsbC13cmFwcGVyIG1pZGRsZVwiPlxuXHRcdFx0XHRcdFx0PHN2ZyB2ZXJzaW9uPVwiMS4xXCIgaWQ9XCJMYXllcl8xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiYmVsbFwiIFtjbGFzcy5yaW5naW5nXT1cImlzUmluZ2luZygpXCJcblx0XHRcdFx0XHRcdFx0eG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIlxuXHRcdFx0XHRcdFx0XHR2aWV3Qm94PVwiMCAwIDMwIDMwXCIgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDogbmV3IDAgMCAzMCAzMDtcIlxuXHRcdFx0XHRcdFx0XHR4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiPlxuXHRcdFx0XHRcdFx0XHRcdDxnPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGc+XG5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZz5cblx0XHRcdFx0XHRcdFx0XHRcdDxwYXRoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZD1cIk0xNS4xNDcsMjQuNTEzYzEuMTM2LDAsMi4xMTctMC42MjgsMi41NzQtMS42MjhoLTUuMTQ5QzEzLjAzLDIzLjg4NSwxNC4wMTEsMjQuNTEzLDE1LjE0NywyNC41MTNcblx0XHRcdFx0XHRcdFx0XHRcdFx0TDE1LjE0NywyNC41MTN6IE0xNS4xNDcsMjQuODczXCIgLz5cblx0XHRcdFx0XHRcdFx0XHQ8L2c+XG5cdFx0XHRcdFx0XHRcdDwvc3ZnPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PlxuXHQ8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cInBhcnJvdHMtbm90aWZpZXItc2lkZS1wYW5lbCByaWdodFwiIFtjbGFzcy5hY3RpdmVdPVwiaXNBY3RpdmUoKVwiPlxuXHQ8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IG5vdGlmeSBvZiBnZXROb3RpZmljYXRpb25zKCk7IGxldCBpID0gaW5kZXg7XCIgKGNsaWNrKT1cIm9uTm90aWZpY2F0aW9uQ2xpY2tlZCgkZXZlbnQsIG5vdGlmeSlcIj5cblx0XHR7e25vdGlmeS50aXRsZX19IC0tPiBjbGljayB0byBjbGVhclxuXHQ8L2Rpdj5cbjwvZGl2PlxuYFxufSlcbmV4cG9ydCBjbGFzcyBQYXJyb3RzTm90aWZpZXIgZXh0ZW5kcyBBYnN0cmFjdFNpZGVTbGlkZVBhbmVsIGltcGxlbWVudHMgT25Jbml0IHtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1VCX1RPUElDX05BTUU6IHN0cmluZyA9IFNVQl9UT1BJQ19OQU1FO1xuXG4gIHByaXZhdGUgbm90aWZpY2F0aW9uTWFuYWdlcjogSU5vdGlmaWNhdGlvbk1hbmFnZXI7XG4gIHByaXZhdGUgcGhsb3hBcHBJbmZvOiBQaGxveEFwcEluZm87XG5cbiAgY29uc3RydWN0b3IocGhsb3hBcHBTZXJ2aWNlOiBQaGxveEFwcFNlcnZpY2UsIG9ic2VydmFibGVNZ3I6IE9ic2VydmFibGVNYW5hZ2VyLCBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlLCBub3RpZmljYXRpb25NYW5hZ2VyOiBOb3RpZmljYXRpb25NYW5hZ2VyLCBwaGxveEFwcEluZm9TZXJ2aWNlOiBQaGxveEFwcEluZm9TZXJ2aWNlKSB7XG4gICAgc3VwZXIocGhsb3hBcHBTZXJ2aWNlLCBvYnNlcnZhYmxlTWdyLCBuZWVkRm9jdXNTZXJ2aWNlLCBQYXJyb3RzTm90aWZpZXIuU1VCX1RPUElDX05BTUUpO1xuXG4gICAgdGhpcy5ub3RpZmljYXRpb25NYW5hZ2VyID0gbm90aWZpY2F0aW9uTWFuYWdlcjtcblxuICAgIGlmIChwaGxveEFwcEluZm9TZXJ2aWNlICE9IG51bGwpIHtcbiAgICAgIHBobG94QXBwSW5mb1NlcnZpY2UuZ2V0QXBwSW5mbygpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICB0aGlzLnBobG94QXBwSW5mbyA9IHJlc3VsdDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICB9XG5cbiAgcHVibGljIGlzUmluZ2luZygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5ub3RpZmljYXRpb25NYW5hZ2VyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgdW5SZWFkQXJyYXkgPSB0aGlzLmdldFVucmVhZE5vdGlmaWNhdGlvbnMoKTtcblxuICAgICAgaWYgKHVuUmVhZEFycmF5ICE9PSBudWxsICYmIHR5cGVvZiB1blJlYWRBcnJheSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHVuUmVhZEFycmF5Lmxlbmd0aCA+IDA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbnJlYWROb3RpZmljYXRpb25zKCk6IE5vdGlmaWNhdGlvbltdIHtcbiAgICBpZiAodGhpcy5ub3RpZmljYXRpb25NYW5hZ2VyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgdW5SZWFkQXJyYXkgPSB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIuZ2V0VW5yZWFkTm90aWZpY2F0aW9ucygpO1xuXG4gICAgICBpZiAodW5SZWFkQXJyYXkgIT09IG51bGwgJiYgdHlwZW9mIHVuUmVhZEFycmF5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdW5SZWFkQXJyYXk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcHVibGljIGdldE5vdGlmaWNhdGlvbnMoKTogTm90aWZpY2F0aW9uW10ge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBpZiAodGhpcy5ub3RpZmljYXRpb25NYW5hZ2VyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgYWxsTm90aWZ5QXJyYXkgPSB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIuZ2V0Tm90aWZpY2F0aW9ucygpO1xuICAgICAgbGV0IG1heE5vdGlmaWNhdGlvbiA9IFBobG94QXBwSW5mby5ERUZBVUxUX01BWF9OT1RJRklDQVRJT05TO1xuICAgICAgaWYgKHRoaXMucGhsb3hBcHBJbmZvICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLnBobG94QXBwSW5mbyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHRoaXMucGhsb3hBcHBJbmZvLnNldHRpbmdzICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBtYXhOb3RpZmljYXRpb24gPSB0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncy5NQVhfTk9USUZJQ0FUSU9OUztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWxsTm90aWZ5QXJyYXkgIT09IG51bGwgJiYgdHlwZW9mIGFsbE5vdGlmeUFycmF5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBsZXQgb3Zlckxlbmd0aCA9IDA7XG4gICAgICAgIGlmIChhbGxOb3RpZnlBcnJheS5sZW5ndGggPiBtYXhOb3RpZmljYXRpb24pIHtcbiAgICAgICAgICBvdmVyTGVuZ3RoID0gYWxsTm90aWZ5QXJyYXkubGVuZ3RoIC0gbWF4Tm90aWZpY2F0aW9uO1xuXG4gICAgICAgICAgbGV0IHJlbW92ZUFycmF5ID0gYWxsTm90aWZ5QXJyYXkuc2xpY2UoMCwgb3Zlckxlbmd0aCk7XG5cbiAgICAgICAgICBmb3IgKGxldCByIG9mIHJlbW92ZUFycmF5KSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIuY2xlYXIocik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFsbE5vdGlmeUFycmF5ID0gdGhpcy5ub3RpZmljYXRpb25NYW5hZ2VyLmdldE5vdGlmaWNhdGlvbnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IG4gb2YgYWxsTm90aWZ5QXJyYXkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgb25Ob3RpZmljYXRpb25DbGlja2VkKCRldmVudDogRXZlbnQsIG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCB7XG4gICAgaWYgKG5vdGlmaWNhdGlvbiA9PT0gbnVsbCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5ub3RpZmljYXRpb25NYW5hZ2VyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIuY2xlYXIobm90aWZpY2F0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25Ub2dnbGUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBzdXBlci5vblRvZ2dsZShldmVudCk7XG5cbiAgICAvLyBtYXJrIGFzIHJlYWRcbiAgICBpZiAodGhpcy5ub3RpZmljYXRpb25NYW5hZ2VyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIubWFya0FzUmVhZEFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxufVxuIl19