com.phloxui
Version:
PhloxUI Ng2+ Framework
467 lines (466 loc) • 35.3 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.beforeClickEvent = 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._getStyleClasses = /**
* @return {?}
*/
function () {
if (this.model !== null && this.model !== undefined) {
if (this.model.styleClasses !== null && this.model.styleClasses !== undefined) {
return this.model.styleClasses;
}
}
return [];
};
/**
* @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.beforeClickEvent.emit($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 {?} */ top_1 = $(this.elementRef.nativeElement).offset().top + $(this.elementRef.nativeElement).height();
var /** @type {?} */ leftActionButton = $(this.elementRef.nativeElement).offset().left;
var /** @type {?} */ widthActionButton = $(this.elementRef.nativeElement).outerWidth();
var /** @type {?} */ setLeft = leftActionButton + widthActionButton;
top_1 = top_1 - this.ACTION_CONTEXT_MENU_TOP_REDUCE;
this.contextMenu.showAt(top_1, setLeft);
}
}
}
};
/**
* @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;
};
/**
* @return {?}
*/
ActionButton.prototype.getBeforeClickEvent = /**
* @return {?}
*/
function () {
return this.beforeClickEvent;
};
/**
* @param {?} event
* @return {?}
*/
ActionButton.prototype.setBeforeClickedEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.beforeClickEvent = 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.onLostFocusing = /**
* @param {?} event
* @return {?}
*/
function (event) {
};
/**
* @param {?} event
* @return {?}
*/
ActionButton.prototype.focusing = /**
* @param {?} event
* @return {?}
*/
function (event) {
};
/**
* @param {?} event
* @return {?}
*/
ActionButton.prototype.onLostFocus = /**
* @param {?} event
* @return {?}
*/
function (event) {
};
/**
* @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()\" [ngClass]=\"_getStyleClasses()\">\n\t<div class=\"group\" [class.more]=\"_isShowMoreBtn()\" *ngIf=\"!_isShowMoreBtn()\">\n\t\t<button (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 (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 },],
"beforeClickEvent": [{ type: Output, args: ['phxBeforeClick',] },],
"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('beforeClick'),
tslib_1.__metadata("design:type", EventEmitter)
], ActionButton.prototype, "beforeClickEvent", 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.beforeClickEvent;
/** @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWN0aW9uQnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9lZGl0b3IvZWRpdG9yLmludGVybmFsL0FjdGlvbkJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFVLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBYSxNQUFNLG9CQUFvQixDQUFDO0FBSTdFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDN0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBSTdFLHFCQUFNLFNBQVMsR0FBVyxnQkFBZ0IsQ0FBQzs7SUE0QlQsd0NBQXNCO0lBK0J0RCxzQkFBWSxVQUFzQixFQUFFLGdCQUFrQztRQUF0RSxZQUNFLGlCQUFPLFNBS1I7K0NBakNnRCxDQUFDO1FBNkJoRCxLQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckMsS0FBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0MsS0FBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsS0FBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDOztLQUMxQzs7OztJQUVNLCtCQUFROzs7O1FBQ2IsRUFB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TSxDQUFDOzBDQUNNLFdBQVc7O3VCQW5FbEM7RUEyQ2tDLHNCQUFzQjtTQUEzQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aW9uTW9kZWwsIEFjdGlvbk1vZGVsTWVudSwgTWVudU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWwvbW9kZWxzJztcbmltcG9ydCB7IElDb250ZXh0IH0gZnJvbSAnLi4vLi4vSUNvbnRleHQnO1xuaW1wb3J0IHsgSUhhc01vZGVsIH0gZnJvbSAnLi4vLi4vSUhhc01vZGVsJztcbmltcG9ydCB7IElOZWVkRm9jdXMgfSBmcm9tICcuLi8uLi9JTmVlZEZvY3VzJztcbmltcG9ydCB7IENvbnRleHRNZW51IH0gZnJvbSAnLi4vLi4vQ29udGV4dE1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IElNZW51TW9kZWxGYWN0b3J5IH0gZnJvbSAnLi4vLi4vSU1lbnVNb2RlbEZhY3RvcnknO1xuaW1wb3J0IHsgRGVmYXVsdEFjdGlvbk1vZGVsTWVudUZhY3RvcnkgfSBmcm9tICcuLi9EZWZhdWx0QWN0aW9uTW9kZWxNZW51RmFjdG9yeSc7XG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XG5pbXBvcnQgeyBJMThOIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9yL0kxOE4uZGVjb3JhdG9yJztcbmltcG9ydCB7IEFic3RyYWN0STE4TkFwcGxpY2FibGUgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS9BYnN0cmFjdEkxOE5BcHBsaWNhYmxlJztcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XG5cbmRlY2xhcmUgdmFyICQ6IGFueTtcblxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1hY3Rpb24tYnRuXCI7XG5cbkBDb21wb25lbnQoe1xuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxuICBzZWxlY3RvcjogVFlQRV9OQU1FLFxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJwaHgtYWN0aW9uLWJ1dHRvblwiICpuZ0lmPVwiaGFzTW9kZWwoKVwiIFtuZ0NsYXNzXT1cIl9nZXRTdHlsZUNsYXNzZXMoKVwiPlxuXHQ8ZGl2IGNsYXNzPVwiZ3JvdXBcIiBbY2xhc3MubW9yZV09XCJfaXNTaG93TW9yZUJ0bigpXCIgKm5nSWY9XCIhX2lzU2hvd01vcmVCdG4oKVwiPlxuXHRcdDxidXR0b24gKGNsaWNrKT1cIm9uQWN0aW9uQnRuQ2xpY2tlZCgkZXZlbnQpXCI+XG5cdFx0XHQ8aW1nICpuZ0lmPVwiX2hhc0ljb24oKVwiIHNyYz1cInt7Z2V0TW9kZWwoKS5pY29uVVJMfX1cIiB0aXRsZT1cInt7Z2V0TW9kZWwoKS5sYWJlbH19XCI+XG5cdFx0XHR7e2dldE1vZGVsKCkubGFiZWx9fVxuXHRcdDwvYnV0dG9uPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cIm1vcmUtbWVudVwiICpuZ0lmPVwiX2lzU2hvd01vcmVCdG4oKVwiPlxuXHRcdDxidXR0b24gKGNsaWNrKT1cIm9uTW9yZUJ0bkNsaWNrZWQoJGV2ZW50KVwiPlxuXHRcdFx0PGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cblx0XHRcdFx0PGRpdj5cblx0XHRcdFx0XHR7e2dldE1vZGVsKCkubGFiZWx9fVxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaWNvbi1hcnJvdy1kb3duXCI+PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9idXR0b24+XG5cdDwvZGl2PlxuPC9kaXY+XG48cGh4LWNvbnRleHQtbWVudSAqbmdJZj1cImdldE1lbnVNb2RlbCgpICE9PSBudWxsXCIgW21vZGVsXT1cImdldE1lbnVNb2RlbCgpXCIgW2NvbnRleHRdPVwidGhpc1wiIGNsYXNzPVwidmVydGljYWxcIj48L3BoeC1jb250ZXh0LW1lbnU+XG5gXG59KVxuZXhwb3J0IGNsYXNzIEFjdGlvbkJ1dHRvbiBleHRlbmRzIEFic3RyYWN0STE4TkFwcGxpY2FibGUgaW1wbGVtZW50cyBPbkluaXQsIElDb250ZXh0LCBJSGFzTW9kZWwsIElOZWVkRm9jdXMge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XG5cbiAgcHJpdmF0ZSBBQ1RJT05fQ09OVEVYVF9NRU5VX1RPUF9SRURVQ0U6IG51bWJlciA9IDU7IC8vIGFzIHBpeGVsXG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcml2YXRlIG1lbnVGYWN0b3J5OiBJTWVudU1vZGVsRmFjdG9yeTtcbiAgQElucHV0KClcbiAgQEkxOE4oKVxuICBAT3B0aW9uKClcbiAgcHJpdmF0ZSBtb2RlbDogQWN0aW9uTW9kZWw7XG4gIEBJbnB1dCgpXG4gIHByb3RlY3RlZCBvcHRpb25zOiBhbnk7XG4gIEBPcHRpb24oJ2JlZm9yZUNsaWNrJylcbiAgQE91dHB1dCgncGh4QmVmb3JlQ2xpY2snKVxuICBwcml2YXRlIGJlZm9yZUNsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdjbGljaycpXG4gIEBPdXRwdXQoJ3BoeENsaWNrJylcbiAgcHJpdmF0ZSBjbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgLy8gY29udGV4dE1lbnUgJiBtZW51TW9kZWwgaXMgZHluYW1pY2FsbHkgY3JlYXRlZC5cbiAgLy8gISBUT0RPIFdoeSBcImNvbnRleHRNZW51XCIgaXMgbm90IGJvdW5kIHR5IEBWaWV3Q2hpbGQ/XG4gIEBJMThOKCdtZW51JylcbiAgQE9wdGlvbignbWVudScpXG4gIHByaXZhdGUgY29udGV4dE1lbnU6IENvbnRleHRNZW51O1xuICBwcml2YXRlIG1lbnVNb2RlbDogTWVudU1vZGVsO1xuXG4gIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgcHJpdmF0ZSBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlO1xuICBwcml2YXRlIF9pdGVtTG9zdEZvY3VzaW5nVGltZW91dDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZUNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjtcbiAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2UgPSBuZWVkRm9jdXNTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tb2RlbCAmJiB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zWydtb2RlbCddKSB7XG4gICAgICB0aGlzLm1vZGVsID0gbmV3IEFjdGlvbk1vZGVsKCk7XG5cbiAgICAgIHRoaXMubW9kZWwuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnNbJ21vZGVsJ10pO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgcHVibGljIF9nZXRTdHlsZUNsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIGlmKHRoaXMubW9kZWwgIT09IG51bGwgJiYgdGhpcy5tb2RlbCAhPT0gdW5kZWZpbmVkKXtcbiAgICAgIGlmKHRoaXMubW9kZWwuc3R5bGVDbGFzc2VzICE9PSBudWxsICYmIHRoaXMubW9kZWwuc3R5bGVDbGFzc2VzICE9PSB1bmRlZmluZWQpe1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5zdHlsZUNsYXNzZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcHVibGljIGluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUgIT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb250ZXh0TWVudSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuY29udGV4dE1lbnUuc2V0Q29udGV4dCh0aGlzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWVudUZhY3RvcnkgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubWVudUZhY3RvcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLm1lbnVNb2RlbCA9IHRoaXMubWVudUZhY3RvcnkuY3JlYXRlTWVudU1vZGVsKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1lbnVGYWN0b3J5ID0gbmV3IERlZmF1bHRBY3Rpb25Nb2RlbE1lbnVGYWN0b3J5KCk7XG4gICAgICB0aGlzLm1lbnVNb2RlbCA9IHRoaXMubWVudUZhY3RvcnkuY3JlYXRlTWVudU1vZGVsKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBkb0ZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKFwiZGl2ID4gYnV0dG9uXCIpLmZvY3VzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZG9CbHVyKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKFwiZGl2ID4gYnV0dG9uXCIpLmJsdXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkFjdGlvbkJ0bkNsaWNrZWQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGVsID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLm1vZGVsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZG9Gb2N1cygkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29udGV4dE1lbnUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubW9kZWwuYWN0aW9uUGVyZm9ybWVkSGFuZGxlciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tb2RlbC5hY3Rpb25QZXJmb3JtZWRIYW5kbGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5tb2RlbC5hY3Rpb25QZXJmb3JtZWRIYW5kbGVyLmNhbGwobnVsbCwgJGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbk1vcmVCdG5DbGlja2VkKCRldmVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5iZWZvcmVDbGlja0V2ZW50LmVtaXQoJGV2ZW50KTtcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdCgkZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIG9uTW9yZUJ0bkNsaWNrZWQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGVsID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLm1vZGVsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZG9Gb2N1cygkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMubW9kZWwuY29uc3RydWN0b3IubmFtZSA9PT0gJ0FjdGlvbk1vZGVsTWVudScpIHtcbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaWYgKHRoaXMubWVudUZhY3RvcnkgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubWVudUZhY3RvcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRoaXMubWVudU1vZGVsID0gdGhpcy5tZW51RmFjdG9yeS5jcmVhdGVNZW51TW9kZWwodGhpcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbnRleHRNZW51ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbnRleHRNZW51ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0TWVudS5pc1Nob3coKSkge1xuICAgICAgICAgIHRoaXMuY29udGV4dE1lbnUuaGlkZSgpO1xuICAgICAgICB9IGVsc2UgeyBcbiAgICAgICAgICBsZXQgdG9wID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkub2Zmc2V0KCkudG9wICsgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuaGVpZ2h0KCk7XG4gICAgICAgICAgbGV0IGxlZnRBY3Rpb25CdXR0b24gPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5vZmZzZXQoKS5sZWZ0O1xuICAgICAgICAgIGxldCB3aWR0aEFjdGlvbkJ1dHRvbiA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLm91dGVyV2lkdGgoKTtcbiAgICAgICAgICBsZXQgc2V0TGVmdCA9IGxlZnRBY3Rpb25CdXR0b24gKyB3aWR0aEFjdGlvbkJ1dHRvbjsgICBcbiAgICAgICAgICB0b3AgPSB0b3AgLSB0aGlzLkFDVElPTl9DT05URVhUX01FTlVfVE9QX1JFRFVDRTtcblxuICAgICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvd0F0KHRvcCwgc2V0TGVmdCk7IFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIF9pc1Nob3dNb3JlQnRuKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLm1vZGVsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1vZGVsIGluc3RhbmNlb2YgQWN0aW9uTW9kZWxNZW51KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgX2hhc0ljb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubW9kZWwgIT09IG51bGwgJiYgdGhpcy5tb2RlbCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLm1vZGVsLmljb25VUkwgIT09IG51bGwgJiYgdGhpcy5tb2RlbC5pY29uVVJMICE9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2xpY2tFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpY2tFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDbGlja2VkRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5jbGlja0V2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmVmb3JlQ2xpY2tFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYmVmb3JlQ2xpY2tFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRCZWZvcmVDbGlja2VkRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5iZWZvcmVDbGlja0V2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgaXNTaG93KGNvbnRleHQ6IElDb250ZXh0KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubW9kZWwuaXNTaG93ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5tb2RlbC5pc1Nob3cgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tb2RlbC5pc1Nob3coY29udGV4dCk7XG4gIH1cblxuICBwdWJsaWMgaXNFbmFibGVkKGNvbnRleHQ6IElDb250ZXh0KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubW9kZWwuaXNFbmFibGVkID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5tb2RlbC5pc0VuYWJsZWQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tb2RlbC5pc0VuYWJsZWQoY29udGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29udGV4dE1lbnUoKTogQ29udGV4dE1lbnUge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRNZW51O1xuICB9XG5cbiAgcHVibGljIHNldENvbnRleHRNZW51KG1lbnU6IENvbnRleHRNZW51KTogdm9pZCB7XG4gICAgdGhpcy5jb250ZXh0TWVudSA9IG1lbnU7XG5cbiAgICBpZiAodGhpcy5jb250ZXh0TWVudSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbJ21lbnUnXSkge1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51LnNldE9wdGlvbnModGhpcy5vcHRpb25zWydtZW51J10pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaTE4blZhbHVlICYmIHRoaXMuaTE4blZhbHVlWydtZW51J10pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudS5hcHBseUkxOE4odGhpcy5pMThuVmFsdWVbJ21lbnUnXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldE1lbnVNb2RlbEZhY3RvcnkoKTogSU1lbnVNb2RlbEZhY3Rvcnkge1xuICAgIHJldHVybiB0aGlzLm1lbnVGYWN0b3J5O1xuICB9XG5cbiAgcHVibGljIHNldE1lbnVNb2RlbEZhY3RvcnkobWVudUZhY3Rvcnk6IElNZW51TW9kZWxGYWN0b3J5KTogdm9pZCB7XG4gICAgdGhpcy5tZW51RmFjdG9yeSA9IG1lbnVGYWN0b3J5O1xuICB9XG5cbiAgcHVibGljIGhhc01vZGVsKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsICE9PSBudWxsICYmIHRoaXMubW9kZWwgIT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0TW9kZWwoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRNb2RlbChtb2RlbDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICAgIGlmICh0aGlzLm1lbnVGYWN0b3J5ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1lbnVGYWN0b3J5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5tZW51TW9kZWwgPSB0aGlzLm1lbnVGYWN0b3J5LmNyZWF0ZU1lbnVNb2RlbCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0TWVudU1vZGVsKCk6IE1lbnVNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMubWVudU1vZGVsO1xuICB9XG4gIFxuICBwdWJsaWMgb25Mb3N0Rm9jdXNpbmcoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIFxuICB9XG5cbiAgcHVibGljIGZvY3VzaW5nKGV2ZW50OiBhbnkpOiB2b2lkIHtcblxuICB9XG5cbiAgcHVibGljIG9uTG9zdEZvY3VzKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBcbiAgfVxuXG4gIHB1YmxpYyBvbkZvY3VzKGV2ZW50OiBhbnkpOiB2b2lkIHtcblxuICB9XG59XG4iXX0=