com.phloxui
Version:
PhloxUI Ng2+ Framework
436 lines (435 loc) • 34.4 kB
JavaScript
/**
* @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';
var /** @type {?} */ TYPE_NAME = "phx-action-btn";
var ActionButton = /** @class */ (function (_super) {
tslib_1.__extends(ActionButton, _super);
function ActionButton(elementRef, needFocusService) {
var _this = _super.call(this) || this;
_this.ACTION_CONTEXT_MENU_TOP_REDUCE = 5;
_this.clickEvent = new EventEmitter();
_this.elementRef = elementRef;
_this.needFocusService = needFocusService;
return _this;
}
/**
* @return {?}
*/
ActionButton.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (!this.model && this.options && this.options['model']) {
this.model = new ActionModel();
this.model.setOptions(this.options['model']);
}
this.init();
};
/**
* @return {?}
*/
ActionButton.prototype.init = /**
* @return {?}
*/
function () {
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 {?}
*/
ActionButton.prototype.doFocus = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
$(this.elementRef.nativeElement).find("div > button").focus();
};
/**
* @param {?} $event
* @return {?}
*/
ActionButton.prototype.doBlur = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
$(this.elementRef.nativeElement).find("div > button").blur();
};
/**
* @param {?} $event
* @return {?}
*/
ActionButton.prototype.onActionBtnClicked = /**
* @param {?} $event
* @return {?}
*/
function ($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 {?}
*/
ActionButton.prototype.onMoreBtnClicked = /**
* @param {?} $event
* @return {?}
*/
function ($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 {
var /** @type {?} */ scrollTop = $(this.elementRef.nativeElement).scrollTop();
var /** @type {?} */ top_1 = $(this.elementRef.nativeElement).offset().top + $(this.elementRef.nativeElement).height();
var /** @type {?} */ left = $(this.elementRef.nativeElement).offset().left;
top_1 = top_1 - this.ACTION_CONTEXT_MENU_TOP_REDUCE;
this.contextMenu.showAt(top_1, left);
}
}
}
};
/**
* @return {?}
*/
ActionButton.prototype._isShowMoreBtn = /**
* @return {?}
*/
function () {
if (this.model === null || typeof this.model === 'undefined') {
return false;
}
if (this.model instanceof ActionModelMenu) {
return true;
}
return false;
};
/**
* @return {?}
*/
ActionButton.prototype._hasIcon = /**
* @return {?}
*/
function () {
if (this.model !== null && this.model != undefined) {
if (this.model.iconURL !== null && this.model.iconURL != undefined) {
return true;
}
}
return false;
};
/**
* @return {?}
*/
ActionButton.prototype.getClickEvent = /**
* @return {?}
*/
function () {
return this.clickEvent;
};
/**
* @param {?} event
* @return {?}
*/
ActionButton.prototype.setClickedEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.clickEvent = event;
};
/**
* @param {?} context
* @return {?}
*/
ActionButton.prototype.isShow = /**
* @param {?} context
* @return {?}
*/
function (context) {
if (this.model.isShow === null) {
return false;
}
if (typeof this.model.isShow !== 'function') {
return false;
}
return this.model.isShow(context);
};
/**
* @param {?} context
* @return {?}
*/
ActionButton.prototype.isEnabled = /**
* @param {?} context
* @return {?}
*/
function (context) {
if (this.model.isEnabled === null) {
return false;
}
if (typeof this.model.isEnabled !== 'function') {
return false;
}
return this.model.isEnabled(context);
};
/**
* @return {?}
*/
ActionButton.prototype.getContextMenu = /**
* @return {?}
*/
function () {
return this.contextMenu;
};
/**
* @param {?} menu
* @return {?}
*/
ActionButton.prototype.setContextMenu = /**
* @param {?} menu
* @return {?}
*/
function (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 {?}
*/
ActionButton.prototype.getMenuModelFactory = /**
* @return {?}
*/
function () {
return this.menuFactory;
};
/**
* @param {?} menuFactory
* @return {?}
*/
ActionButton.prototype.setMenuModelFactory = /**
* @param {?} menuFactory
* @return {?}
*/
function (menuFactory) {
this.menuFactory = menuFactory;
};
/**
* @return {?}
*/
ActionButton.prototype.hasModel = /**
* @return {?}
*/
function () {
if (this.model !== null && this.model != undefined) {
return true;
}
return false;
};
/**
* @return {?}
*/
ActionButton.prototype.getModel = /**
* @return {?}
*/
function () {
return this.model;
};
/**
* @param {?} model
* @return {?}
*/
ActionButton.prototype.setModel = /**
* @param {?} model
* @return {?}
*/
function (model) {
this.model = model;
if (this.menuFactory !== null && typeof this.menuFactory !== 'undefined') {
this.menuModel = this.menuFactory.createMenuModel(this);
}
};
/**
* @return {?}
*/
ActionButton.prototype.getMenuModel = /**
* @return {?}
*/
function () {
return this.menuModel;
};
/**
* @param {?} $event
* @return {?}
*/
ActionButton.prototype.focusing = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.needFocusService.setFocusingComponent(this, $event);
};
/**
* @param {?} $event
* @return {?}
*/
ActionButton.prototype.onLostFocusing = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var _this = this;
if (this._itemLostFocusingTimeout !== null && typeof this._itemLostFocusingTimeout !== 'undefined') {
clearTimeout(this._itemLostFocusingTimeout);
this._itemLostFocusingTimeout = null;
}
this._itemLostFocusingTimeout = setTimeout(function () {
_this.doBlur($event);
_this.needFocusService.resetFocusingComponent($event);
}, 150);
};
/**
* @param {?} event
* @return {?}
*/
ActionButton.prototype.onLostFocus = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') {
this.contextMenu.hide();
}
};
/**
* @param {?} event
* @return {?}
*/
ActionButton.prototype.onFocus = /**
* @param {?} event
* @return {?}
*/
function (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()\">\n\t<div class=\"group\" [class.more]=\"_isShowMoreBtn()\" *ngIf=\"!_isShowMoreBtn()\">\n\t\t<button (focusin)=\"focusing($event)\" (blur)=\"onLostFocusing($event)\" (click)=\"onActionBtnClicked($event)\">\n\t\t\t<img *ngIf=\"_hasIcon()\" src=\"{{getModel().iconURL}}\" title=\"{{getModel().label}}\">\n\t\t\t{{getModel().label}}\n\t\t</button>\n\t</div>\n\t<div class=\"more-menu\" *ngIf=\"_isShowMoreBtn()\">\n\t\t<button (focusin)=\"focusing($event)\" (blur)=\"onLostFocusing($event)\" (click)=\"onMoreBtnClicked($event)\">\n\t\t\t<div class=\"wrapper\">\n\t\t\t\t<div>\n\t\t\t\t\t{{getModel().label}}\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"icon-arrow-down\"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</button>\n\t</div>\n</div>\n<phx-context-menu *ngIf=\"getMenuModel() !== null\" [model]=\"getMenuModel()\" [context]=\"this\" class=\"vertical\"></phx-context-menu>\n"
},] },
];
/** @nocollapse */
ActionButton.ctorParameters = function () { return [
{ 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);
return ActionButton;
}(AbstractI18NApplicable));
export { ActionButton };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWN0aW9uQnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9lZGl0b3IvQWN0aW9uQnV0dG9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQVUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFJMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFJMUUscUJBQU0sU0FBUyxHQUFXLGdCQUFnQixDQUFDOztJQTRCVCx3Q0FBc0I7SUE0QnRELHNCQUFZLFVBQXNCLEVBQUUsZ0JBQWtDO1FBQXRFLFlBQ0UsaUJBQU8sU0FJUjsrQ0E3QmdELENBQUM7UUEwQmhELEtBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNyQyxLQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixLQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7O0tBQzFDOzs7O0lBRU0sK0JBQVE7Ozs7UUFDYixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENB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bnRFbWl0dGVyLCBPbkluaXQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGlvbk1vZGVsLCBBY3Rpb25Nb2RlbE1lbnUsIE1lbnVNb2RlbCB9IGZyb20gJy4uL21vZGVsL21vZGVscyc7XG5pbXBvcnQgeyBJQ29udGV4dCB9IGZyb20gJy4uL0lDb250ZXh0JztcbmltcG9ydCB7IElIYXNNb2RlbCB9IGZyb20gJy4uL0lIYXNNb2RlbCc7XG5pbXBvcnQgeyBJTmVlZEZvY3VzIH0gZnJvbSAnLi4vSU5lZWRGb2N1cyc7XG5pbXBvcnQgeyBDb250ZXh0TWVudSB9IGZyb20gJy4uL0NvbnRleHRNZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJTWVudU1vZGVsRmFjdG9yeSB9IGZyb20gJy4uL0lNZW51TW9kZWxGYWN0b3J5JztcbmltcG9ydCB7IERlZmF1bHRBY3Rpb25Nb2RlbE1lbnVGYWN0b3J5IH0gZnJvbSAnLi9EZWZhdWx0QWN0aW9uTW9kZWxNZW51RmFjdG9yeSc7XG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi8uLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XG5pbXBvcnQgeyBJMThOIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9yL0kxOE4uZGVjb3JhdG9yJztcbmltcG9ydCB7IEFic3RyYWN0STE4TkFwcGxpY2FibGUgfSBmcm9tICcuLi8uLi9zaGFyZS9BYnN0cmFjdEkxOE5BcHBsaWNhYmxlJztcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XG5cbmRlY2xhcmUgdmFyICQ6IGFueTtcblxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1hY3Rpb24tYnRuXCI7XG5cbkBDb21wb25lbnQoe1xuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxuICBzZWxlY3RvcjogVFlQRV9OQU1FLFxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJwaHgtYWN0aW9uLWJ1dHRvblwiICpuZ0lmPVwiaGFzTW9kZWwoKVwiPlxuXHQ8ZGl2IGNsYXNzPVwiZ3JvdXBcIiBbY2xhc3MubW9yZV09XCJfaXNTaG93TW9yZUJ0bigpXCIgKm5nSWY9XCIhX2lzU2hvd01vcmVCdG4oKVwiPlxuXHRcdDxidXR0b24gKGZvY3VzaW4pPVwiZm9jdXNpbmcoJGV2ZW50KVwiIChibHVyKT1cIm9uTG9zdEZvY3VzaW5nKCRldmVudClcIiAoY2xpY2spPVwib25BY3Rpb25CdG5DbGlja2VkKCRldmVudClcIj5cblx0XHRcdDxpbWcgKm5nSWY9XCJfaGFzSWNvbigpXCIgc3JjPVwie3tnZXRNb2RlbCgpLmljb25VUkx9fVwiIHRpdGxlPVwie3tnZXRNb2RlbCgpLmxhYmVsfX1cIj5cblx0XHRcdHt7Z2V0TW9kZWwoKS5sYWJlbH19XG5cdFx0PC9idXR0b24+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwibW9yZS1tZW51XCIgKm5nSWY9XCJfaXNTaG93TW9yZUJ0bigpXCI+XG5cdFx0PGJ1dHRvbiAoZm9jdXNpbik9XCJmb2N1c2luZygkZXZlbnQpXCIgKGJsdXIpPVwib25Mb3N0Rm9jdXNpbmcoJGV2ZW50KVwiIChjbGljayk9XCJvbk1vcmVCdG5DbGlja2VkKCRldmVudClcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG5cdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0e3tnZXRNb2RlbCgpLmxhYmVsfX1cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImljb24tYXJyb3ctZG93blwiPjwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvYnV0dG9uPlxuXHQ8L2Rpdj5cbjwvZGl2PlxuPHBoeC1jb250ZXh0LW1lbnUgKm5nSWY9XCJnZXRNZW51TW9kZWwoKSAhPT0gbnVsbFwiIFttb2RlbF09XCJnZXRNZW51TW9kZWwoKVwiIFtjb250ZXh0XT1cInRoaXNcIiBjbGFzcz1cInZlcnRpY2FsXCI+PC9waHgtY29udGV4dC1tZW51PlxuYFxufSlcbmV4cG9ydCBjbGFzcyBBY3Rpb25CdXR0b24gZXh0ZW5kcyBBYnN0cmFjdEkxOE5BcHBsaWNhYmxlIGltcGxlbWVudHMgT25Jbml0LCBJQ29udGV4dCwgSUhhc01vZGVsLCBJTmVlZEZvY3VzIHtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xuXG4gIHByaXZhdGUgQUNUSU9OX0NPTlRFWFRfTUVOVV9UT1BfUkVEVUNFOiBudW1iZXIgPSA1OyAvLyBhcyBwaXhlbFxuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJpdmF0ZSBtZW51RmFjdG9yeTogSU1lbnVNb2RlbEZhY3Rvcnk7XG4gIEBJbnB1dCgpXG4gIEBJMThOKClcbiAgQE9wdGlvbigpXG4gIHByaXZhdGUgbW9kZWw6IEFjdGlvbk1vZGVsO1xuICBASW5wdXQoKVxuICBwcm90ZWN0ZWQgb3B0aW9uczogYW55O1xuICBAT3B0aW9uKCdjbGljaycpXG4gIEBPdXRwdXQoJ3BoeENsaWNrJylcbiAgcHJpdmF0ZSBjbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgLy8gY29udGV4dE1lbnUgJiBtZW51TW9kZWwgaXMgZHluYW1pY2FsbHkgY3JlYXRlZC5cbiAgLy8gISBUT0RPIFdoeSBcImNvbnRleHRNZW51XCIgaXMgbm90IGJvdW5kIHR5IEBWaWV3Q2hpbGQ/XG4gIEBJMThOKCdtZW51JylcbiAgQE9wdGlvbignbWVudScpXG4gIHByaXZhdGUgY29udGV4dE1lbnU6IENvbnRleHRNZW51O1xuICBwcml2YXRlIG1lbnVNb2RlbDogTWVudU1vZGVsO1xuXG4gIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgcHJpdmF0ZSBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlO1xuICBwcml2YXRlIF9pdGVtTG9zdEZvY3VzaW5nVGltZW91dDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZSA9IG5lZWRGb2N1c1NlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1vZGVsICYmIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbJ21vZGVsJ10pIHtcbiAgICAgIHRoaXMubW9kZWwgPSBuZXcgQWN0aW9uTW9kZWwoKTtcblxuICAgICAgdGhpcy5tb2RlbC5zZXRPcHRpb25zKHRoaXMub3B0aW9uc1snbW9kZWwnXSk7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbnRleHRNZW51ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5jb250ZXh0TWVudS5zZXRDb250ZXh0KHRoaXMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tZW51RmFjdG9yeSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tZW51RmFjdG9yeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMubWVudU1vZGVsID0gdGhpcy5tZW51RmFjdG9yeS5jcmVhdGVNZW51TW9kZWwodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWVudUZhY3RvcnkgPSBuZXcgRGVmYXVsdEFjdGlvbk1vZGVsTWVudUZhY3RvcnkoKTtcbiAgICAgIHRoaXMubWVudU1vZGVsID0gdGhpcy5tZW51RmFjdG9yeS5jcmVhdGVNZW51TW9kZWwodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRvRm9jdXMoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoXCJkaXYgPiBidXR0b25cIikuZm9jdXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkb0JsdXIoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoXCJkaXYgPiBidXR0b25cIikuYmx1cigpO1xuICB9XG5cbiAgcHVibGljIG9uQWN0aW9uQnRuQ2xpY2tlZCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZWwgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMubW9kZWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kb0ZvY3VzKCRldmVudCk7XG5cbiAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb250ZXh0TWVudSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuY29udGV4dE1lbnUuaGlkZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tb2RlbC5hY3Rpb25QZXJmb3JtZWRIYW5kbGVyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1vZGVsLmFjdGlvblBlcmZvcm1lZEhhbmRsZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLm1vZGVsLmFjdGlvblBlcmZvcm1lZEhhbmRsZXIuY2FsbChudWxsLCAkZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uTW9yZUJ0bkNsaWNrZWQoJGV2ZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdCgkZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIG9uTW9yZUJ0bkNsaWNrZWQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGVsID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLm1vZGVsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZG9Gb2N1cygkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMubW9kZWwuY29uc3RydWN0b3IubmFtZSA9PT0gJ0FjdGlvbk1vZGVsTWVudScpIHtcbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaWYgKHRoaXMubWVudUZhY3RvcnkgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubWVudUZhY3RvcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRoaXMubWVudU1vZGVsID0gdGhpcy5tZW51RmFjdG9yeS5jcmVhdGVNZW51TW9kZWwodGhpcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbnRleHRNZW51ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbnRleHRNZW51ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0TWVudS5pc1Nob3coKSkge1xuICAgICAgICAgIHRoaXMuY29udGV4dE1lbnUuaGlkZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBzY3JvbGxUb3AgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5zY3JvbGxUb3AoKTtcbiAgICAgICAgICBsZXQgdG9wID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkub2Zmc2V0KCkudG9wICsgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuaGVpZ2h0KCk7XG4gICAgICAgICAgbGV0IGxlZnQgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5vZmZzZXQoKS5sZWZ0O1xuICAgICAgICAgIHRvcCA9IHRvcCAtIHRoaXMuQUNUSU9OX0NPTlRFWFRfTUVOVV9UT1BfUkVEVUNFO1xuXG4gICAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zaG93QXQodG9wLCBsZWZ0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBfaXNTaG93TW9yZUJ0bigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tb2RlbCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5tb2RlbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlbCBpbnN0YW5jZW9mIEFjdGlvbk1vZGVsTWVudSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIF9oYXNJY29uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsICE9PSBudWxsICYmIHRoaXMubW9kZWwgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5tb2RlbC5pY29uVVJMICE9PSBudWxsICYmIHRoaXMubW9kZWwuaWNvblVSTCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldENsaWNrRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWNrRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tlZEV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuY2xpY2tFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGlzU2hvdyhjb250ZXh0OiBJQ29udGV4dCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsLmlzU2hvdyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMubW9kZWwuaXNTaG93ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuaXNTaG93KGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGlzRW5hYmxlZChjb250ZXh0OiBJQ29udGV4dCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsLmlzRW5hYmxlZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMubW9kZWwuaXNFbmFibGVkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuaXNFbmFibGVkKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGdldENvbnRleHRNZW51KCk6IENvbnRleHRNZW51IHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0TWVudTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb250ZXh0TWVudShtZW51OiBDb250ZXh0TWVudSk6IHZvaWQge1xuICAgIHRoaXMuY29udGV4dE1lbnUgPSBtZW51O1xuXG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zWydtZW51J10pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zZXRPcHRpb25zKHRoaXMub3B0aW9uc1snbWVudSddKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmkxOG5WYWx1ZSAmJiB0aGlzLmkxOG5WYWx1ZVsnbWVudSddKSB7XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUuYXBwbHlJMThOKHRoaXMuaTE4blZhbHVlWydtZW51J10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRNZW51TW9kZWxGYWN0b3J5KCk6IElNZW51TW9kZWxGYWN0b3J5IHtcbiAgICByZXR1cm4gdGhpcy5tZW51RmFjdG9yeTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRNZW51TW9kZWxGYWN0b3J5KG1lbnVGYWN0b3J5OiBJTWVudU1vZGVsRmFjdG9yeSk6IHZvaWQge1xuICAgIHRoaXMubWVudUZhY3RvcnkgPSBtZW51RmFjdG9yeTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNNb2RlbCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0aGlzLm1vZGVsICE9IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldE1vZGVsKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gIH1cblxuICBwdWJsaWMgc2V0TW9kZWwobW9kZWw6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICBpZiAodGhpcy5tZW51RmFjdG9yeSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tZW51RmFjdG9yeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMubWVudU1vZGVsID0gdGhpcy5tZW51RmFjdG9yeS5jcmVhdGVNZW51TW9kZWwodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldE1lbnVNb2RlbCgpOiBNZW51TW9kZWwge1xuICAgIHJldHVybiB0aGlzLm1lbnVNb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBmb2N1c2luZygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnNldEZvY3VzaW5nQ29tcG9uZW50KHRoaXMsICRldmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25Mb3N0Rm9jdXNpbmcoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pdGVtTG9zdEZvY3VzaW5nVGltZW91dCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5faXRlbUxvc3RGb2N1c2luZ1RpbWVvdXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5faXRlbUxvc3RGb2N1c2luZ1RpbWVvdXQpO1xuICAgICAgdGhpcy5faXRlbUxvc3RGb2N1c2luZ1RpbWVvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuX2l0ZW1Mb3N0Rm9jdXNpbmdUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRvQmx1cigkZXZlbnQpO1xuICAgICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnJlc2V0Rm9jdXNpbmdDb21wb25lbnQoJGV2ZW50KTtcbiAgICB9LCAxNTApO1xuICB9XG5cbiAgcHVibGljIG9uTG9zdEZvY3VzKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb250ZXh0TWVudSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuY29udGV4dE1lbnUuaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkZvY3VzKGV2ZW50OiBhbnkpOiB2b2lkIHtcblxuICB9XG59XG4iXX0=