UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

370 lines (369 loc) 31.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, Output, EventEmitter, ElementRef } from '@angular/core'; import { ActionModel, ActionModelMenu } from '../model/models'; import { ContextMenu } from '../ContextMenu.component'; import { DefaultActionModelMenuFactory } from './DefaultActionModelMenuFactory'; import { Option } from '../../decorator/Option.decorator'; import { I18N } from '../../decorator/I18N.decorator'; import { AbstractI18NApplicable } from '../../share/AbstractI18NApplicable'; import { NeedFocusService } from '../../service/NeedFocusService.service'; const /** @type {?} */ TYPE_NAME = "phx-action-btn"; export class ActionButton extends AbstractI18NApplicable { /** * @param {?} elementRef * @param {?} needFocusService */ constructor(elementRef, needFocusService) { super(); this.ACTION_CONTEXT_MENU_TOP_REDUCE = 5; this.clickEvent = new EventEmitter(); this.elementRef = elementRef; this.needFocusService = needFocusService; } /** * @return {?} */ ngOnInit() { if (!this.model && this.options && this.options['model']) { this.model = new ActionModel(); this.model.setOptions(this.options['model']); } this.init(); } /** * @return {?} */ init() { if (this.contextMenu != null && typeof this.contextMenu !== 'undefined') { this.contextMenu.setContext(this); } if (this.menuFactory !== null && typeof this.menuFactory !== 'undefined') { this.menuModel = this.menuFactory.createMenuModel(this); } else { this.menuFactory = new DefaultActionModelMenuFactory(); this.menuModel = this.menuFactory.createMenuModel(this); } } /** * @param {?} $event * @return {?} */ doFocus($event) { $(this.elementRef.nativeElement).find("div > button").focus(); } /** * @param {?} $event * @return {?} */ doBlur($event) { $(this.elementRef.nativeElement).find("div > button").blur(); } /** * @param {?} $event * @return {?} */ onActionBtnClicked($event) { if (this.model === null || typeof this.model === 'undefined') { return; } this.doFocus($event); if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') { this.contextMenu.hide(); } if (this.model.actionPerformedHandler !== null && typeof this.model.actionPerformedHandler !== 'undefined') { this.model.actionPerformedHandler.call(null, $event); } else { this.onMoreBtnClicked($event); } this.clickEvent.emit($event); } /** * @param {?} $event * @return {?} */ onMoreBtnClicked($event) { if (this.model === null || typeof this.model === 'undefined') { return; } this.doFocus($event); if (this.model.constructor.name === 'ActionModelMenu') { $event.stopPropagation(); if (this.menuFactory !== null && typeof this.menuFactory !== 'undefined') { this.menuModel = this.menuFactory.createMenuModel(this); } if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') { if (this.contextMenu.isShow()) { this.contextMenu.hide(); } else { let /** @type {?} */ scrollTop = $(this.elementRef.nativeElement).scrollTop(); let /** @type {?} */ top = $(this.elementRef.nativeElement).offset().top + $(this.elementRef.nativeElement).height(); let /** @type {?} */ left = $(this.elementRef.nativeElement).offset().left; top = top - this.ACTION_CONTEXT_MENU_TOP_REDUCE; this.contextMenu.showAt(top, left); } } } } /** * @return {?} */ _isShowMoreBtn() { if (this.model === null || typeof this.model === 'undefined') { return false; } if (this.model instanceof ActionModelMenu) { return true; } return false; } /** * @return {?} */ _hasIcon() { if (this.model !== null && this.model != undefined) { if (this.model.iconURL !== null && this.model.iconURL != undefined) { return true; } } return false; } /** * @return {?} */ getClickEvent() { return this.clickEvent; } /** * @param {?} event * @return {?} */ setClickedEvent(event) { this.clickEvent = event; } /** * @param {?} context * @return {?} */ isShow(context) { if (this.model.isShow === null) { return false; } if (typeof this.model.isShow !== 'function') { return false; } return this.model.isShow(context); } /** * @param {?} context * @return {?} */ isEnabled(context) { if (this.model.isEnabled === null) { return false; } if (typeof this.model.isEnabled !== 'function') { return false; } return this.model.isEnabled(context); } /** * @return {?} */ getContextMenu() { return this.contextMenu; } /** * @param {?} menu * @return {?} */ setContextMenu(menu) { this.contextMenu = menu; if (this.contextMenu) { if (this.options && this.options['menu']) { this.contextMenu.setOptions(this.options['menu']); } if (this.i18nValue && this.i18nValue['menu']) { this.contextMenu.applyI18N(this.i18nValue['menu']); } } } /** * @return {?} */ getMenuModelFactory() { return this.menuFactory; } /** * @param {?} menuFactory * @return {?} */ setMenuModelFactory(menuFactory) { this.menuFactory = menuFactory; } /** * @return {?} */ hasModel() { if (this.model !== null && this.model != undefined) { return true; } return false; } /** * @return {?} */ getModel() { return this.model; } /** * @param {?} model * @return {?} */ setModel(model) { this.model = model; if (this.menuFactory !== null && typeof this.menuFactory !== 'undefined') { this.menuModel = this.menuFactory.createMenuModel(this); } } /** * @return {?} */ getMenuModel() { return this.menuModel; } /** * @param {?} $event * @return {?} */ focusing($event) { this.needFocusService.setFocusingComponent(this, $event); } /** * @param {?} $event * @return {?} */ onLostFocusing($event) { if (this._itemLostFocusingTimeout !== null && typeof this._itemLostFocusingTimeout !== 'undefined') { clearTimeout(this._itemLostFocusingTimeout); this._itemLostFocusingTimeout = null; } this._itemLostFocusingTimeout = setTimeout(() => { this.doBlur($event); this.needFocusService.resetFocusingComponent($event); }, 150); } /** * @param {?} event * @return {?} */ onLostFocus(event) { if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') { this.contextMenu.hide(); } } /** * @param {?} event * @return {?} */ onFocus(event) { } } ActionButton.TYPE_NAME = TYPE_NAME; ActionButton.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `<div class="phx-action-button" *ngIf="hasModel()"> <div class="group" [class.more]="_isShowMoreBtn()" *ngIf="!_isShowMoreBtn()"> <button (focusin)="focusing($event)" (blur)="onLostFocusing($event)" (click)="onActionBtnClicked($event)"> <img *ngIf="_hasIcon()" src="{{getModel().iconURL}}" title="{{getModel().label}}"> {{getModel().label}} </button> </div> <div class="more-menu" *ngIf="_isShowMoreBtn()"> <button (focusin)="focusing($event)" (blur)="onLostFocusing($event)" (click)="onMoreBtnClicked($event)"> <div class="wrapper"> <div> {{getModel().label}} </div> <div> <div class="icon-arrow-down"></div> </div> </div> </button> </div> </div> <phx-context-menu *ngIf="getMenuModel() !== null" [model]="getMenuModel()" [context]="this" class="vertical"></phx-context-menu> ` },] }, ]; /** @nocollapse */ ActionButton.ctorParameters = () => [ { type: ElementRef, }, { type: NeedFocusService, }, ]; ActionButton.propDecorators = { "menuFactory": [{ type: Input },], "model": [{ type: Input },], "options": [{ type: Input },], "clickEvent": [{ type: Output, args: ['phxClick',] },], }; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], ActionButton.prototype, "menuFactory", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", ActionModel) ], ActionButton.prototype, "model", void 0); tslib_1.__decorate([ Option('click'), tslib_1.__metadata("design:type", EventEmitter) ], ActionButton.prototype, "clickEvent", void 0); tslib_1.__decorate([ I18N('menu'), Option('menu'), tslib_1.__metadata("design:type", ContextMenu) ], ActionButton.prototype, "contextMenu", void 0); function ActionButton_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ ActionButton.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ ActionButton.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ ActionButton.propDecorators; /** @type {?} */ ActionButton.TYPE_NAME; /** @type {?} */ ActionButton.prototype.ACTION_CONTEXT_MENU_TOP_REDUCE; /** @type {?} */ ActionButton.prototype.menuFactory; /** @type {?} */ ActionButton.prototype.model; /** @type {?} */ ActionButton.prototype.options; /** @type {?} */ ActionButton.prototype.clickEvent; /** @type {?} */ ActionButton.prototype.contextMenu; /** @type {?} */ ActionButton.prototype.menuModel; /** @type {?} */ ActionButton.prototype.elementRef; /** @type {?} */ ActionButton.prototype.needFocusService; /** @type {?} */ ActionButton.prototype._itemLostFocusingTimeout; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWN0aW9uQnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9lZGl0b3IvQWN0aW9uQnV0dG9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQVUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFJMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFJMUUsdUJBQU0sU0FBUyxHQUFXLGdCQUFnQixDQUFDO0FBNEIzQyxNQUFNLG1CQUFvQixTQUFRLHNCQUFzQjs7Ozs7SUE0QnRELFlBQVksVUFBc0IsRUFBRSxnQkFBa0M7UUFDcEUsS0FBSyxFQUFFLENBQUM7OENBekJ1QyxDQUFDO1FBMEJoRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0tBQzFDOzs7O0lBRU0sUUFBUTtRQUNiLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsT0FB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RCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN0RCxFQUFFLEdBQUcsQ0FBQyxDQUFDOzs7Ozs7SUFHSCxXQUFXLENBQUMsS0FBVTtRQUMzQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3pCOzs7Ozs7SUFHSSxPQUFPLENBQUMsS0FBVTs7O3lCQXZPa0IsU0FBUzs7WUE1QnJELFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0JBQ25CLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXFCWDthQUNBOzs7O1lBMUN3RCxVQUFVO1lBVzFELGdCQUFnQjs7OzRCQXFDdEIsS0FBSztzQkFHTCxLQUFLO3dCQUlMLEtBQUs7MkJBR0wsTUFBTSxTQUFDLFVBQVU7OztJQVRqQixNQUFNLEVBQUU7Ozs7SUFHUixJQUFJLEVBQUU7SUFDTixNQUFNLEVBQUU7c0NBQ00sV0FBVzs7O0lBR3pCLE1BQU0sQ0FBQyxPQUFPLENBQUM7c0NBRUksWUFBWTs7O0lBRy9CLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDWixNQUFNLENBQUMsTUFBTSxDQUFDO3NDQUNNLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3Rpb25Nb2RlbCwgQWN0aW9uTW9kZWxNZW51LCBNZW51TW9kZWwgfSBmcm9tICcuLi9tb2RlbC9tb2RlbHMnO1xuaW1wb3J0IHsgSUNvbnRleHQgfSBmcm9tICcuLi9JQ29udGV4dCc7XG5pbXBvcnQgeyBJSGFzTW9kZWwgfSBmcm9tICcuLi9JSGFzTW9kZWwnO1xuaW1wb3J0IHsgSU5lZWRGb2N1cyB9IGZyb20gJy4uL0lOZWVkRm9jdXMnO1xuaW1wb3J0IHsgQ29udGV4dE1lbnUgfSBmcm9tICcuLi9Db250ZXh0TWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSU1lbnVNb2RlbEZhY3RvcnkgfSBmcm9tICcuLi9JTWVudU1vZGVsRmFjdG9yeSc7XG5pbXBvcnQgeyBEZWZhdWx0QWN0aW9uTW9kZWxNZW51RmFjdG9yeSB9IGZyb20gJy4vRGVmYXVsdEFjdGlvbk1vZGVsTWVudUZhY3RvcnknO1xuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xuaW1wb3J0IHsgSTE4TiB9IGZyb20gJy4uLy4uL2RlY29yYXRvci9JMThOLmRlY29yYXRvcic7XG5pbXBvcnQgeyBBYnN0cmFjdEkxOE5BcHBsaWNhYmxlIH0gZnJvbSAnLi4vLi4vc2hhcmUvQWJzdHJhY3RJMThOQXBwbGljYWJsZSc7XG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9OZWVkRm9jdXNTZXJ2aWNlLnNlcnZpY2UnO1xuXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbmNvbnN0IFRZUEVfTkFNRTogc3RyaW5nID0gXCJwaHgtYWN0aW9uLWJ0blwiO1xuXG5AQ29tcG9uZW50KHtcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGh4LWFjdGlvbi1idXR0b25cIiAqbmdJZj1cImhhc01vZGVsKClcIj5cblx0PGRpdiBjbGFzcz1cImdyb3VwXCIgW2NsYXNzLm1vcmVdPVwiX2lzU2hvd01vcmVCdG4oKVwiICpuZ0lmPVwiIV9pc1Nob3dNb3JlQnRuKClcIj5cblx0XHQ8YnV0dG9uIChmb2N1c2luKT1cImZvY3VzaW5nKCRldmVudClcIiAoYmx1cik9XCJvbkxvc3RGb2N1c2luZygkZXZlbnQpXCIgKGNsaWNrKT1cIm9uQWN0aW9uQnRuQ2xpY2tlZCgkZXZlbnQpXCI+XG5cdFx0XHQ8aW1nICpuZ0lmPVwiX2hhc0ljb24oKVwiIHNyYz1cInt7Z2V0TW9kZWwoKS5pY29uVVJMfX1cIiB0aXRsZT1cInt7Z2V0TW9kZWwoKS5sYWJlbH19XCI+XG5cdFx0XHR7e2dldE1vZGVsKCkubGFiZWx9fVxuXHRcdDwvYnV0dG9uPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cIm1vcmUtbWVudVwiICpuZ0lmPVwiX2lzU2hvd01vcmVCdG4oKVwiPlxuXHRcdDxidXR0b24gKGZvY3VzaW4pPVwiZm9jdXNpbmcoJGV2ZW50KVwiIChibHVyKT1cIm9uTG9zdEZvY3VzaW5nKCRldmVudClcIiAoY2xpY2spPVwib25Nb3JlQnRuQ2xpY2tlZCgkZXZlbnQpXCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuXHRcdFx0XHQ8ZGl2PlxuXHRcdFx0XHRcdHt7Z2V0TW9kZWwoKS5sYWJlbH19XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpY29uLWFycm93LWRvd25cIj48L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2J1dHRvbj5cblx0PC9kaXY+XG48L2Rpdj5cbjxwaHgtY29udGV4dC1tZW51ICpuZ0lmPVwiZ2V0TWVudU1vZGVsKCkgIT09IG51bGxcIiBbbW9kZWxdPVwiZ2V0TWVudU1vZGVsKClcIiBbY29udGV4dF09XCJ0aGlzXCIgY2xhc3M9XCJ2ZXJ0aWNhbFwiPjwvcGh4LWNvbnRleHQtbWVudT5cbmBcbn0pXG5leHBvcnQgY2xhc3MgQWN0aW9uQnV0dG9uIGV4dGVuZHMgQWJzdHJhY3RJMThOQXBwbGljYWJsZSBpbXBsZW1lbnRzIE9uSW5pdCwgSUNvbnRleHQsIElIYXNNb2RlbCwgSU5lZWRGb2N1cyB7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcblxuICBwcml2YXRlIEFDVElPTl9DT05URVhUX01FTlVfVE9QX1JFRFVDRTogbnVtYmVyID0gNTsgLy8gYXMgcGl4ZWxcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByaXZhdGUgbWVudUZhY3Rvcnk6IElNZW51TW9kZWxGYWN0b3J5O1xuICBASW5wdXQoKVxuICBASTE4TigpXG4gIEBPcHRpb24oKVxuICBwcml2YXRlIG1vZGVsOiBBY3Rpb25Nb2RlbDtcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcbiAgQE9wdGlvbignY2xpY2snKVxuICBAT3V0cHV0KCdwaHhDbGljaycpXG4gIHByaXZhdGUgY2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8vIGNvbnRleHRNZW51ICYgbWVudU1vZGVsIGlzIGR5bmFtaWNhbGx5IGNyZWF0ZWQuXG4gIC8vICEgVE9ETyBXaHkgXCJjb250ZXh0TWVudVwiIGlzIG5vdCBib3VuZCB0eSBAVmlld0NoaWxkP1xuICBASTE4TignbWVudScpXG4gIEBPcHRpb24oJ21lbnUnKVxuICBwcml2YXRlIGNvbnRleHRNZW51OiBDb250ZXh0TWVudTtcbiAgcHJpdmF0ZSBtZW51TW9kZWw6IE1lbnVNb2RlbDtcblxuICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gIHByaXZhdGUgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZTtcbiAgcHJpdmF0ZSBfaXRlbUxvc3RGb2N1c2luZ1RpbWVvdXQ6IGFueTtcblxuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjtcbiAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2UgPSBuZWVkRm9jdXNTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tb2RlbCAmJiB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zWydtb2RlbCddKSB7XG4gICAgICB0aGlzLm1vZGVsID0gbmV3IEFjdGlvbk1vZGVsKCk7XG5cbiAgICAgIHRoaXMubW9kZWwuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnNbJ21vZGVsJ10pO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgcHVibGljIGluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUgIT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb250ZXh0TWVudSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuY29udGV4dE1lbnUuc2V0Q29udGV4dCh0aGlzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWVudUZhY3RvcnkgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubWVudUZhY3RvcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLm1lbnVNb2RlbCA9IHRoaXMubWVudUZhY3RvcnkuY3JlYXRlTWVudU1vZGVsKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1lbnVGYWN0b3J5ID0gbmV3IERlZmF1bHRBY3Rpb25Nb2RlbE1lbnVGYWN0b3J5KCk7XG4gICAgICB0aGlzLm1lbnVNb2RlbCA9IHRoaXMubWVudUZhY3RvcnkuY3JlYXRlTWVudU1vZGVsKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBkb0ZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKFwiZGl2ID4gYnV0dG9uXCIpLmZvY3VzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZG9CbHVyKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKFwiZGl2ID4gYnV0dG9uXCIpLmJsdXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkFjdGlvbkJ0bkNsaWNrZWQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGVsID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLm1vZGVsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZG9Gb2N1cygkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29udGV4dE1lbnUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubW9kZWwuYWN0aW9uUGVyZm9ybWVkSGFuZGxlciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tb2RlbC5hY3Rpb25QZXJmb3JtZWRIYW5kbGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5tb2RlbC5hY3Rpb25QZXJmb3JtZWRIYW5kbGVyLmNhbGwobnVsbCwgJGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbk1vcmVCdG5DbGlja2VkKCRldmVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoJGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBvbk1vcmVCdG5DbGlja2VkKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlbCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5tb2RlbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRvRm9jdXMoJGV2ZW50KTtcblxuICAgIGlmICh0aGlzLm1vZGVsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBY3Rpb25Nb2RlbE1lbnUnKSB7XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlmICh0aGlzLm1lbnVGYWN0b3J5ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1lbnVGYWN0b3J5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aGlzLm1lbnVNb2RlbCA9IHRoaXMubWVudUZhY3RvcnkuY3JlYXRlTWVudU1vZGVsKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb250ZXh0TWVudSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dE1lbnUuaXNTaG93KCkpIHtcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgc2Nyb2xsVG9wID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuc2Nyb2xsVG9wKCk7XG4gICAgICAgICAgbGV0IHRvcCA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLm9mZnNldCgpLnRvcCArICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmhlaWdodCgpO1xuICAgICAgICAgIGxldCBsZWZ0ID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkub2Zmc2V0KCkubGVmdDtcbiAgICAgICAgICB0b3AgPSB0b3AgLSB0aGlzLkFDVElPTl9DT05URVhUX01FTlVfVE9QX1JFRFVDRTtcblxuICAgICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvd0F0KHRvcCwgbGVmdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgX2lzU2hvd01vcmVCdG4oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubW9kZWwgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMubW9kZWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubW9kZWwgaW5zdGFuY2VvZiBBY3Rpb25Nb2RlbE1lbnUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBfaGFzSWNvbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0aGlzLm1vZGVsICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMubW9kZWwuaWNvblVSTCAhPT0gbnVsbCAmJiB0aGlzLm1vZGVsLmljb25VUkwgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDbGlja0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jbGlja0V2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrZWRFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrRXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBpc1Nob3coY29udGV4dDogSUNvbnRleHQpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tb2RlbC5pc1Nob3cgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLm1vZGVsLmlzU2hvdyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vZGVsLmlzU2hvdyhjb250ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBpc0VuYWJsZWQoY29udGV4dDogSUNvbnRleHQpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tb2RlbC5pc0VuYWJsZWQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLm1vZGVsLmlzRW5hYmxlZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vZGVsLmlzRW5hYmxlZChjb250ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb250ZXh0TWVudSgpOiBDb250ZXh0TWVudSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dE1lbnU7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29udGV4dE1lbnUobWVudTogQ29udGV4dE1lbnUpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRleHRNZW51ID0gbWVudTtcblxuICAgIGlmICh0aGlzLmNvbnRleHRNZW51KSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9uc1snbWVudSddKSB7XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnNbJ21lbnUnXSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pMThuVmFsdWUgJiYgdGhpcy5pMThuVmFsdWVbJ21lbnUnXSkge1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51LmFwcGx5STE4Tih0aGlzLmkxOG5WYWx1ZVsnbWVudSddKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0TWVudU1vZGVsRmFjdG9yeSgpOiBJTWVudU1vZGVsRmFjdG9yeSB7XG4gICAgcmV0dXJuIHRoaXMubWVudUZhY3Rvcnk7XG4gIH1cblxuICBwdWJsaWMgc2V0TWVudU1vZGVsRmFjdG9yeShtZW51RmFjdG9yeTogSU1lbnVNb2RlbEZhY3RvcnkpOiB2b2lkIHtcbiAgICB0aGlzLm1lbnVGYWN0b3J5ID0gbWVudUZhY3Rvcnk7XG4gIH1cblxuICBwdWJsaWMgaGFzTW9kZWwoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubW9kZWwgIT09IG51bGwgJiYgdGhpcy5tb2RlbCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNb2RlbCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICB9XG5cbiAgcHVibGljIHNldE1vZGVsKG1vZGVsOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgaWYgKHRoaXMubWVudUZhY3RvcnkgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubWVudUZhY3RvcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLm1lbnVNb2RlbCA9IHRoaXMubWVudUZhY3RvcnkuY3JlYXRlTWVudU1vZGVsKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRNZW51TW9kZWwoKTogTWVudU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5tZW51TW9kZWw7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNpbmcoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5zZXRGb2N1c2luZ0NvbXBvbmVudCh0aGlzLCAkZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIG9uTG9zdEZvY3VzaW5nKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXRlbUxvc3RGb2N1c2luZ1RpbWVvdXQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuX2l0ZW1Mb3N0Rm9jdXNpbmdUaW1lb3V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2l0ZW1Mb3N0Rm9jdXNpbmdUaW1lb3V0KTtcbiAgICAgIHRoaXMuX2l0ZW1Mb3N0Rm9jdXNpbmdUaW1lb3V0ID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLl9pdGVtTG9zdEZvY3VzaW5nVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kb0JsdXIoJGV2ZW50KTtcbiAgICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5yZXNldEZvY3VzaW5nQ29tcG9uZW50KCRldmVudCk7XG4gICAgfSwgMTUwKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkxvc3RGb2N1cyhldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29udGV4dE1lbnUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25Gb2N1cyhldmVudDogYW55KTogdm9pZCB7XG5cbiAgfVxufVxuIl19