com.phloxui
Version:
PhloxUI Ng2+ Framework
392 lines (391 loc) • 32.5 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';
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.beforeClickEvent = 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 {?}
*/
_getStyleClasses() {
if (this.model !== null && this.model !== undefined) {
if (this.model.styleClasses !== null && this.model.styleClasses !== undefined) {
return this.model.styleClasses;
}
}
return [];
}
/**
* @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.beforeClickEvent.emit($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 {?} */ top = $(this.elementRef.nativeElement).offset().top + $(this.elementRef.nativeElement).height();
let /** @type {?} */ leftActionButton = $(this.elementRef.nativeElement).offset().left;
let /** @type {?} */ widthActionButton = $(this.elementRef.nativeElement).outerWidth();
let /** @type {?} */ setLeft = leftActionButton + widthActionButton;
top = top - this.ACTION_CONTEXT_MENU_TOP_REDUCE;
this.contextMenu.showAt(top, setLeft);
}
}
}
}
/**
* @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;
}
/**
* @return {?}
*/
getBeforeClickEvent() {
return this.beforeClickEvent;
}
/**
* @param {?} event
* @return {?}
*/
setBeforeClickedEvent(event) {
this.beforeClickEvent = 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 {?}
*/
onLostFocusing(event) {
}
/**
* @param {?} event
* @return {?}
*/
focusing(event) {
}
/**
* @param {?} event
* @return {?}
*/
onLostFocus(event) {
}
/**
* @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()" [ngClass]="_getStyleClasses()">
<div class="group" [class.more]="_isShowMoreBtn()" *ngIf="!_isShowMoreBtn()">
<button (click)="onActionBtnClicked($event)">
<img *ngIf="_hasIcon()" src="{{getModel().iconURL}}" title="{{getModel().label}}">
{{getModel().label}}
</button>
</div>
<div class="more-menu" *ngIf="_isShowMoreBtn()">
<button (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 },],
"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);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWN0aW9uQnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9lZGl0b3IvZWRpdG9yLmludGVybmFsL0FjdGlvbkJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFVLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBYSxNQUFNLG9CQUFvQixDQUFDO0FBSTdFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDN0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBSTdFLHVCQUFNLFNBQVMsR0FBVyxnQkFBZ0IsQ0FBQztBQTRCM0MsTUFBTSxtQkFBb0IsU0FBUSxzQkFBc0I7Ozs7O0lBK0J0RCxZQUFZLFVBQXNCLEVBQUUsZ0JBQWtDO1FBQ3BFLEtBQUssRUFBRSxDQUFDOzhDQTVCdUMsQ0FBQztRQTZCaEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztLQUMxQzs7OztJQUVN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dGVyLCBPbkluaXQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGlvbk1vZGVsLCBBY3Rpb25Nb2RlbE1lbnUsIE1lbnVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVsL21vZGVscyc7XG5pbXBvcnQgeyBJQ29udGV4dCB9IGZyb20gJy4uLy4uL0lDb250ZXh0JztcbmltcG9ydCB7IElIYXNNb2RlbCB9IGZyb20gJy4uLy4uL0lIYXNNb2RlbCc7XG5pbXBvcnQgeyBJTmVlZEZvY3VzIH0gZnJvbSAnLi4vLi4vSU5lZWRGb2N1cyc7XG5pbXBvcnQgeyBDb250ZXh0TWVudSB9IGZyb20gJy4uLy4uL0NvbnRleHRNZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJTWVudU1vZGVsRmFjdG9yeSB9IGZyb20gJy4uLy4uL0lNZW51TW9kZWxGYWN0b3J5JztcbmltcG9ydCB7IERlZmF1bHRBY3Rpb25Nb2RlbE1lbnVGYWN0b3J5IH0gZnJvbSAnLi4vRGVmYXVsdEFjdGlvbk1vZGVsTWVudUZhY3RvcnknO1xuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xuaW1wb3J0IHsgSTE4TiB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvci9JMThOLmRlY29yYXRvcic7XG5pbXBvcnQgeyBBYnN0cmFjdEkxOE5BcHBsaWNhYmxlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvQWJzdHJhY3RJMThOQXBwbGljYWJsZSc7XG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9OZWVkRm9jdXNTZXJ2aWNlLnNlcnZpY2UnO1xuXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbmNvbnN0IFRZUEVfTkFNRTogc3RyaW5nID0gXCJwaHgtYWN0aW9uLWJ0blwiO1xuXG5AQ29tcG9uZW50KHtcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGh4LWFjdGlvbi1idXR0b25cIiAqbmdJZj1cImhhc01vZGVsKClcIiBbbmdDbGFzc109XCJfZ2V0U3R5bGVDbGFzc2VzKClcIj5cblx0PGRpdiBjbGFzcz1cImdyb3VwXCIgW2NsYXNzLm1vcmVdPVwiX2lzU2hvd01vcmVCdG4oKVwiICpuZ0lmPVwiIV9pc1Nob3dNb3JlQnRuKClcIj5cblx0XHQ8YnV0dG9uIChjbGljayk9XCJvbkFjdGlvbkJ0bkNsaWNrZWQoJGV2ZW50KVwiPlxuXHRcdFx0PGltZyAqbmdJZj1cIl9oYXNJY29uKClcIiBzcmM9XCJ7e2dldE1vZGVsKCkuaWNvblVSTH19XCIgdGl0bGU9XCJ7e2dldE1vZGVsKCkubGFiZWx9fVwiPlxuXHRcdFx0e3tnZXRNb2RlbCgpLmxhYmVsfX1cblx0XHQ8L2J1dHRvbj5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJtb3JlLW1lbnVcIiAqbmdJZj1cIl9pc1Nob3dNb3JlQnRuKClcIj5cblx0XHQ8YnV0dG9uIChjbGljayk9XCJvbk1vcmVCdG5DbGlja2VkKCRldmVudClcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG5cdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0e3tnZXRNb2RlbCgpLmxhYmVsfX1cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImljb24tYXJyb3ctZG93blwiPjwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvYnV0dG9uPlxuXHQ8L2Rpdj5cbjwvZGl2PlxuPHBoeC1jb250ZXh0LW1lbnUgKm5nSWY9XCJnZXRNZW51TW9kZWwoKSAhPT0gbnVsbFwiIFttb2RlbF09XCJnZXRNZW51TW9kZWwoKVwiIFtjb250ZXh0XT1cInRoaXNcIiBjbGFzcz1cInZlcnRpY2FsXCI+PC9waHgtY29udGV4dC1tZW51PlxuYFxufSlcbmV4cG9ydCBjbGFzcyBBY3Rpb25CdXR0b24gZXh0ZW5kcyBBYnN0cmFjdEkxOE5BcHBsaWNhYmxlIGltcGxlbWVudHMgT25Jbml0LCBJQ29udGV4dCwgSUhhc01vZGVsLCBJTmVlZEZvY3VzIHtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xuXG4gIHByaXZhdGUgQUNUSU9OX0NPTlRFWFRfTUVOVV9UT1BfUkVEVUNFOiBudW1iZXIgPSA1OyAvLyBhcyBwaXhlbFxuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJpdmF0ZSBtZW51RmFjdG9yeTogSU1lbnVNb2RlbEZhY3Rvcnk7XG4gIEBJbnB1dCgpXG4gIEBJMThOKClcbiAgQE9wdGlvbigpXG4gIHByaXZhdGUgbW9kZWw6IEFjdGlvbk1vZGVsO1xuICBASW5wdXQoKVxuICBwcm90ZWN0ZWQgb3B0aW9uczogYW55O1xuICBAT3B0aW9uKCdiZWZvcmVDbGljaycpXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNsaWNrJylcbiAgcHJpdmF0ZSBiZWZvcmVDbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignY2xpY2snKVxuICBAT3V0cHV0KCdwaHhDbGljaycpXG4gIHByaXZhdGUgY2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8vIGNvbnRleHRNZW51ICYgbWVudU1vZGVsIGlzIGR5bmFtaWNhbGx5IGNyZWF0ZWQuXG4gIC8vICEgVE9ETyBXaHkgXCJjb250ZXh0TWVudVwiIGlzIG5vdCBib3VuZCB0eSBAVmlld0NoaWxkP1xuICBASTE4TignbWVudScpXG4gIEBPcHRpb24oJ21lbnUnKVxuICBwcml2YXRlIGNvbnRleHRNZW51OiBDb250ZXh0TWVudTtcbiAgcHJpdmF0ZSBtZW51TW9kZWw6IE1lbnVNb2RlbDtcblxuICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gIHByaXZhdGUgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZTtcbiAgcHJpdmF0ZSBfaXRlbUxvc3RGb2N1c2luZ1RpbWVvdXQ6IGFueTtcblxuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5iZWZvcmVDbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuZWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7XG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlID0gbmVlZEZvY3VzU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubW9kZWwgJiYgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9uc1snbW9kZWwnXSkge1xuICAgICAgdGhpcy5tb2RlbCA9IG5ldyBBY3Rpb25Nb2RlbCgpO1xuXG4gICAgICB0aGlzLm1vZGVsLnNldE9wdGlvbnModGhpcy5vcHRpb25zWydtb2RlbCddKTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBfZ2V0U3R5bGVDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICBpZih0aGlzLm1vZGVsICE9PSBudWxsICYmIHRoaXMubW9kZWwgIT09IHVuZGVmaW5lZCl7XG4gICAgICBpZih0aGlzLm1vZGVsLnN0eWxlQ2xhc3NlcyAhPT0gbnVsbCAmJiB0aGlzLm1vZGVsLnN0eWxlQ2xhc3NlcyAhPT0gdW5kZWZpbmVkKXtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuc3R5bGVDbGFzc2VzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbnRleHRNZW51ICE9IG51bGwgJiYgdHlwZW9mIHRoaXMuY29udGV4dE1lbnUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLmNvbnRleHRNZW51LnNldENvbnRleHQodGhpcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1lbnVGYWN0b3J5ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1lbnVGYWN0b3J5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5tZW51TW9kZWwgPSB0aGlzLm1lbnVGYWN0b3J5LmNyZWF0ZU1lbnVNb2RlbCh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZW51RmFjdG9yeSA9IG5ldyBEZWZhdWx0QWN0aW9uTW9kZWxNZW51RmFjdG9yeSgpO1xuICAgICAgdGhpcy5tZW51TW9kZWwgPSB0aGlzLm1lbnVGYWN0b3J5LmNyZWF0ZU1lbnVNb2RlbCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZG9Gb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZChcImRpdiA+IGJ1dHRvblwiKS5mb2N1cygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRvQmx1cigkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZChcImRpdiA+IGJ1dHRvblwiKS5ibHVyKCk7XG4gIH1cblxuICBwdWJsaWMgb25BY3Rpb25CdG5DbGlja2VkKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlbCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5tb2RlbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRvRm9jdXMoJGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmNvbnRleHRNZW51ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbnRleHRNZW51ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5jb250ZXh0TWVudS5oaWRlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGVsLmFjdGlvblBlcmZvcm1lZEhhbmRsZXIgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubW9kZWwuYWN0aW9uUGVyZm9ybWVkSGFuZGxlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMubW9kZWwuYWN0aW9uUGVyZm9ybWVkSGFuZGxlci5jYWxsKG51bGwsICRldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25Nb3JlQnRuQ2xpY2tlZCgkZXZlbnQpO1xuICAgIH1cblxuICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudC5lbWl0KCRldmVudCk7XG4gICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoJGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBvbk1vcmVCdG5DbGlja2VkKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlbCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5tb2RlbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRvRm9jdXMoJGV2ZW50KTtcblxuICAgIGlmICh0aGlzLm1vZGVsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBY3Rpb25Nb2RlbE1lbnUnKSB7XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlmICh0aGlzLm1lbnVGYWN0b3J5ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1lbnVGYWN0b3J5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aGlzLm1lbnVNb2RlbCA9IHRoaXMubWVudUZhY3RvcnkuY3JlYXRlTWVudU1vZGVsKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb250ZXh0TWVudSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dE1lbnUuaXNTaG93KCkpIHtcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcbiAgICAgICAgfSBlbHNlIHsgXG4gICAgICAgICAgbGV0IHRvcCA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLm9mZnNldCgpLnRvcCArICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmhlaWdodCgpO1xuICAgICAgICAgIGxldCBsZWZ0QWN0aW9uQnV0dG9uID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkub2Zmc2V0KCkubGVmdDtcbiAgICAgICAgICBsZXQgd2lkdGhBY3Rpb25CdXR0b24gPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5vdXRlcldpZHRoKCk7XG4gICAgICAgICAgbGV0IHNldExlZnQgPSBsZWZ0QWN0aW9uQnV0dG9uICsgd2lkdGhBY3Rpb25CdXR0b247ICAgXG4gICAgICAgICAgdG9wID0gdG9wIC0gdGhpcy5BQ1RJT05fQ09OVEVYVF9NRU5VX1RPUF9SRURVQ0U7XG5cbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LnNob3dBdCh0b3AsIHNldExlZnQpOyBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBfaXNTaG93TW9yZUJ0bigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tb2RlbCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5tb2RlbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlbCBpbnN0YW5jZW9mIEFjdGlvbk1vZGVsTWVudSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIF9oYXNJY29uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsICE9PSBudWxsICYmIHRoaXMubW9kZWwgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5tb2RlbC5pY29uVVJMICE9PSBudWxsICYmIHRoaXMubW9kZWwuaWNvblVSTCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldENsaWNrRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWNrRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tlZEV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuY2xpY2tFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldEJlZm9yZUNsaWNrRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJlZm9yZUNsaWNrRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QmVmb3JlQ2xpY2tlZEV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGlzU2hvdyhjb250ZXh0OiBJQ29udGV4dCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsLmlzU2hvdyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMubW9kZWwuaXNTaG93ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuaXNTaG93KGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGlzRW5hYmxlZChjb250ZXh0OiBJQ29udGV4dCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsLmlzRW5hYmxlZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMubW9kZWwuaXNFbmFibGVkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuaXNFbmFibGVkKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGdldENvbnRleHRNZW51KCk6IENvbnRleHRNZW51IHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0TWVudTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb250ZXh0TWVudShtZW51OiBDb250ZXh0TWVudSk6IHZvaWQge1xuICAgIHRoaXMuY29udGV4dE1lbnUgPSBtZW51O1xuXG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zWydtZW51J10pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zZXRPcHRpb25zKHRoaXMub3B0aW9uc1snbWVudSddKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmkxOG5WYWx1ZSAmJiB0aGlzLmkxOG5WYWx1ZVsnbWVudSddKSB7XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUuYXBwbHlJMThOKHRoaXMuaTE4blZhbHVlWydtZW51J10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRNZW51TW9kZWxGYWN0b3J5KCk6IElNZW51TW9kZWxGYWN0b3J5IHtcbiAgICByZXR1cm4gdGhpcy5tZW51RmFjdG9yeTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRNZW51TW9kZWxGYWN0b3J5KG1lbnVGYWN0b3J5OiBJTWVudU1vZGVsRmFjdG9yeSk6IHZvaWQge1xuICAgIHRoaXMubWVudUZhY3RvcnkgPSBtZW51RmFjdG9yeTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNNb2RlbCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0aGlzLm1vZGVsICE9IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldE1vZGVsKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gIH1cblxuICBwdWJsaWMgc2V0TW9kZWwobW9kZWw6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICBpZiAodGhpcy5tZW51RmFjdG9yeSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tZW51RmFjdG9yeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMubWVudU1vZGVsID0gdGhpcy5tZW51RmFjdG9yeS5jcmVhdGVNZW51TW9kZWwodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldE1lbnVNb2RlbCgpOiBNZW51TW9kZWwge1xuICAgIHJldHVybiB0aGlzLm1lbnVNb2RlbDtcbiAgfVxuICBcbiAgcHVibGljIG9uTG9zdEZvY3VzaW5nKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBcbiAgfVxuXG4gIHB1YmxpYyBmb2N1c2luZyhldmVudDogYW55KTogdm9pZCB7XG5cbiAgfVxuXG4gIHB1YmxpYyBvbkxvc3RGb2N1cyhldmVudDogYW55KTogdm9pZCB7XG4gICAgXG4gIH1cblxuICBwdWJsaWMgb25Gb2N1cyhldmVudDogYW55KTogdm9pZCB7XG5cbiAgfVxufVxuIl19