UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

531 lines (530 loc) 61.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, ElementRef } from '@angular/core'; import { AbstractAccordion } from './AbstractAccordion'; import { I18N } from '../decorator/I18N.decorator'; import { Option } from '../decorator/Option.decorator'; const /** @type {?} */ TYPE_NAME = "phx-component-accordion"; export class ComponentAccordion extends AbstractAccordion { /** * @param {?} elementRef */ constructor(elementRef) { super(elementRef); this.ACCORDIAN_CONTAINER_SELECTOR = ".accordion-container"; this.inited = false; this.itemComponents = []; this.activeItems = []; // imple for component handler this.pageComponentHandler = (data) => { if (this != null && typeof this !== 'undefined') { if (data.setting !== null && typeof data.setting !== 'undefined') { let /** @type {?} */ index = data.setting.index; if (index > -1) { if (index < this.itemComponents.length) { this.itemComponents[index] = data.instance; } else { let /** @type {?} */ count = this.itemComponents.length; while (count <= index) { if (count === index) { this.itemComponents.push(data.instance); } else { this.itemComponents.push(null); } count++; } } } if (this.items !== null && typeof this.items !== 'undefined') { if (index < this.items.length) { let /** @type {?} */ item = this.items[index]; if (typeof data.instance.setModel === 'function') { data.instance.setModel(item.componentModel); } if (typeof data.instance.setData === 'function') { data.instance.setData(item.componentData); } // by pass child if (this.dataParent !== null && typeof this.dataParent !== 'undefined') { if (typeof this.dataParent.addDataChild === 'function') { let /** @type {?} */ hasDataCompo = /** @type {?} */ (data.instance); if (typeof hasDataCompo !== 'undefined') { this.dataParent.addDataChild(hasDataCompo); } } } // delegate handler if (item.componentHandler !== null && typeof item.componentHandler !== 'undefined') { item.componentHandler.call(null, data); } } } } } }; } /** * @return {?} */ ngOnInit() { super.ngOnInit(); this.setDataParent(this.dataParent); // adding all to active because default is allOpen if (this.items !== null && typeof this.items !== 'undefined') { for (let /** @type {?} */ item of this.items) { this.activeItems.push(item); } } } /** * @param {?} id * @return {?} */ moveUpAccordionBelowId(id) { if (id === null || typeof id === 'undefined') { return; } if (this.elementRef !== null && typeof this.elementRef !== 'undefined') { let /** @type {?} */ accordionSelector = ".accordion-item"; let /** @type {?} */ selector = "#" + id + accordionSelector; let /** @type {?} */ selectorElement = $(this.elementRef.nativeElement).find(selector); let /** @type {?} */ height = 0; if (typeof selectorElement !== 'undefined') { if (typeof $(selectorElement).height() !== 'undefined') { height = $(selectorElement).height(); } let /** @type {?} */ bodySelector = $(selectorElement).find(".body"); if (typeof bodySelector !== 'undefined') { height = $(bodySelector).height(); } let /** @type {?} */ nextElement = $(selectorElement).next(); if (typeof nextElement !== 'undefined') { $(nextElement).css('margin-top', -height); } } let /** @type {?} */ accContainerSelector = this.ACCORDIAN_CONTAINER_SELECTOR; let /** @type {?} */ accContainerElement = $(this.elementRef.nativeElement).find(accContainerSelector); let /** @type {?} */ containerHeight = 0; if (typeof accContainerElement !== 'undefined') { containerHeight = 0; if (typeof $(accContainerElement).height() !== 'undefined') { containerHeight = $(accContainerElement).height(); } } let /** @type {?} */ fakeAccordionSelector = ".fake"; let /** @type {?} */ fakeAccElement = $(this.elementRef.nativeElement).find(fakeAccordionSelector); let /** @type {?} */ fakeHeight = 0; let /** @type {?} */ oldFakeHeight = 0; if (typeof fakeAccElement !== 'undefined') { if (typeof $(fakeAccElement).height() !== 'undefined') { fakeHeight = $(fakeAccElement).height(); oldFakeHeight = $(fakeAccElement).height(); } fakeHeight = fakeHeight + height; if (!this.multipleExpand) { fakeHeight = 0; } $(fakeAccElement).css('height', fakeHeight); } // set height to container if (!this.fixedHeight && typeof accContainerElement !== 'undefined') { containerHeight = containerHeight + oldFakeHeight - fakeHeight; if (containerHeight < 0) { containerHeight = 0; } $(accContainerElement).css('height', containerHeight); } } } /** * @param {?} id * @return {?} */ moveDownAccordionBelowId(id) { if (id === null || typeof id === 'undefined') { return; } if (this.elementRef !== null && typeof this.elementRef !== 'undefined') { let /** @type {?} */ accordionSelector = ".accordion-item"; let /** @type {?} */ selector = "#" + id + accordionSelector; let /** @type {?} */ selectorElement = $(this.elementRef.nativeElement).find(selector); let /** @type {?} */ height = 0; if (typeof selectorElement !== 'undefined') { if (typeof $(selectorElement).height() !== 'undefined') { height = $(selectorElement).height(); } let /** @type {?} */ bodySelector = $(selectorElement).find(".body"); if (typeof bodySelector !== 'undefined') { height = $(bodySelector).height(); } let /** @type {?} */ nextElement = $(selectorElement).next(); if (typeof nextElement !== 'undefined') { $(nextElement).css('margin-top', ''); } } let /** @type {?} */ oldFakeHeight = 0; let /** @type {?} */ fakeHeight = 0; let /** @type {?} */ fakeAccordionSelector = ".fake"; let /** @type {?} */ fakeAccElement = $(this.elementRef.nativeElement).find(fakeAccordionSelector); if (typeof fakeAccElement !== 'undefined') { if (typeof $(fakeAccordionSelector).height() !== 'undefined') { fakeHeight = $(fakeAccordionSelector).height(); oldFakeHeight = $(fakeAccordionSelector).height(); } fakeHeight = fakeHeight - height; if (!this.multipleExpand) { fakeHeight = 0; } $(fakeAccordionSelector).css('height', fakeHeight); } let /** @type {?} */ accContainerSelector = this.ACCORDIAN_CONTAINER_SELECTOR; let /** @type {?} */ accContainerElement = $(this.elementRef.nativeElement).find(accContainerSelector); if (!this.fixedHeight && typeof accContainerElement !== 'undefined') { let /** @type {?} */ containerHeight = 0; if (typeof $(accContainerElement).height() !== 'undefined') { containerHeight = $(accContainerElement).height(); } containerHeight = containerHeight + (oldFakeHeight - fakeHeight); if (containerHeight < 0) { containerHeight = 0; } $(accContainerElement).css('height', containerHeight); } } } /** * @return {?} */ refreshContainerHeight() { if (!this.multipleExpand) { return; } if (this.elementRef !== null && typeof this.elementRef !== 'undefined') { let /** @type {?} */ accContainerSelector = this.ACCORDIAN_CONTAINER_SELECTOR; let /** @type {?} */ accContainerElement = $(this.elementRef.nativeElement).find(accContainerSelector); // reset height $(accContainerElement).css('height', ''); let /** @type {?} */ newContentHeight = 0; let /** @type {?} */ missingHeight = 0; let /** @type {?} */ accordionSelector = ".accordion-item"; $(this.elementRef.nativeElement).find(accordionSelector).each((index, element) => { let /** @type {?} */ headerHeight = $(element).find('.header').outerHeight(); let /** @type {?} */ bodyHeight = $(element).find('.body').outerHeight(); let /** @type {?} */ eleHeight = $(element).height(); if (!$(element).hasClass("fake")) { let /** @type {?} */ checkItem = null; if (this.items !== null && typeof this.items !== 'undefined') { checkItem = this.items[index]; } if (this.activeItems !== null && typeof this.activeItems !== 'undefined') { let /** @type {?} */ isActive = this.activeItems.indexOf(checkItem) >= 0; if (isActive) { newContentHeight += eleHeight; } else { newContentHeight += headerHeight; missingHeight += bodyHeight; } } } else { // is fake } }); $(accContainerElement).css('height', newContentHeight); } } /** * @param {?} index * @return {?} */ _getItemHeight(index) { if (index !== null && typeof index !== 'undefined' && index > -1) { if (this.items !== null && typeof this.items !== 'undefined' && index < this.items.length) { let /** @type {?} */ height = this.items[index].height; if (height !== null && typeof height !== 'undefined') { return this.items[index].height.toString() + "px"; } } } return ''; } /** * @return {?} */ _getPageComponentHandler() { return this.pageComponentHandler; } /** * @param {?} $event * @param {?} index * @return {?} */ onShowBodyBtnClick($event, index) { let /** @type {?} */ isActive = this.isActive(index); let /** @type {?} */ isEnable = this.isEnable(index); if (!isEnable) { if (isActive) { this.deactivate(index); } return; } if (isActive) { this.deactivate(index); } else { this.activate(index); } } /** * @param {?} index * @return {?} */ isShow(index) { let /** @type {?} */ active = this.isActive(index); let /** @type {?} */ enable = this.isEnable(index); return enable && active; } /** * @return {?} */ init() { if (this.inited && this.multipleExpand) { return; } if (this.delayTimer !== null && typeof this.delayTimer !== 'undefined') { clearTimeout(this.delayTimer); this.delayTimer = null; } this.delayTimer = setTimeout(() => { for (let /** @type {?} */ i = 0; i < this.items.length; i++) { let /** @type {?} */ idKey = i + ""; let /** @type {?} */ item = this.items[i]; if (!item.enable) { this.moveUpAccordionBelowId(idKey); } else { if (!item.active) { this.moveUpAccordionBelowId(idKey); } } } }, 1); this.inited = true; } /** * @return {?} */ reload() { if (this.itemComponents !== null && typeof this.itemComponents.length) { for (let /** @type {?} */ i = 0; i < this.itemComponents.length; i++) { let /** @type {?} */ component = this.itemComponents[i]; if (component === null || typeof component === 'undefined') { continue; } let /** @type {?} */ item = (i < this.items.length) ? this.items[i] : null; if (item === null || typeof item === 'undefined') { continue; } if (typeof component.setModel === 'function') { component.setModel(item.componentModel); } if (typeof component.setData === 'function') { component.setData(item.componentData); } } } } /** * @return {?} */ reRender() { this.refreshContainerHeight(); } /** * @param {?} index * @return {?} */ getAccordianComponent(index) { if (index > -1 && index < this.itemComponents.length) { return this.itemComponents[index]; } return null; } /** * @param {?} index * @param {?} item * @return {?} */ onAccordionActived(index, item) { let /** @type {?} */ idKey = index + ""; this.moveDownAccordionBelowId(idKey); if (this.activeItems.indexOf(item) < 0) { this.activeItems.push(item); } } /** * @param {?} index * @param {?} item * @return {?} */ onAccordionDeactived(index, item) { let /** @type {?} */ idKey = index + ""; this.moveUpAccordionBelowId(idKey); if (this.activeItems.indexOf(item) >= 0) { let /** @type {?} */ index = this.activeItems.indexOf(item); this.activeItems.splice(index, 1); } } /** * @param {?} index * @param {?} item * @return {?} */ onAccordionEnabled(index, item) { } /** * @param {?} index * @param {?} item * @return {?} */ onAccordionDisabled(index, item) { } /** * @param {?} dataParent * @return {?} */ setDataParent(dataParent) { // by pass to children component that was IHasData if (this.dataParent !== null && typeof this.dataParent !== 'undefined') { if (typeof this.dataParent.removeDataChild === 'function') { if (this.itemComponents !== null && typeof this.itemComponents !== 'undefined') { for (let /** @type {?} */ compo of this.itemComponents) { let /** @type {?} */ hasDataCompo = /** @type {?} */ (compo); if (typeof hasDataCompo !== 'undefined') { this.dataParent.removeDataChild(hasDataCompo); } } } } } this.dataParent = dataParent; if (this.dataParent !== null && typeof this.dataParent !== 'undefined') { if (typeof this.dataParent.addDataChild === 'function') { for (let /** @type {?} */ compo of this.itemComponents) { let /** @type {?} */ hasDataCompo = /** @type {?} */ (compo); if (typeof hasDataCompo !== 'undefined') { this.dataParent.addDataChild(hasDataCompo); } } } } } /** * @return {?} */ getDataParent() { return this.dataParent; } /** * @return {?} */ getItems() { return this.items; } } ComponentAccordion.TYPE_NAME = TYPE_NAME; ComponentAccordion.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `<div class="phx-component-accordion"> <div class="accordion-container"> <ng-template ngFor let-item [ngForOf]="getItems()" let-i="index"> <div class="accordion-item" id="{{i+''}}" [class.hideborder]="!isShow(i)"> <div class="header"> <div class="header-wrapper" [class.disable]="!isEnable(i)"> <div class="left"><h4>{{item.label}}</h4></div> <div class="right"> <div class="down-triangle" (click)="onShowBodyBtnClick($event, i)"></div> </div> </div> </div> <div class="body" [style.height]="_getItemHeight(i)"> <div class="body-wrapper" [class.show]="isShow(i)" [class.disable]="!isEnable(i)"> <phx-component-wrapper [type]="item.componentType" [data]="item.componentData" [handler]="_getPageComponentHandler()" [setting]="{index: i}" [model]="item.componentModel" [dataParent]="this"></phx-component-wrapper> </div> </div> </div> </ng-template> <div class="accordion-item fake"><!-- fake for height --></div> </div> </div> ` },] }, ]; /** @nocollapse */ ComponentAccordion.ctorParameters = () => [ { type: ElementRef, }, ]; ComponentAccordion.propDecorators = { "items": [{ type: Input },], "fixedHeight": [{ type: Input },], "dataParent": [{ type: Input },], "name": [{ type: Input },], "multipleExpand": [{ type: Input },], }; tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Array) ], ComponentAccordion.prototype, "items", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ComponentAccordion.prototype, "fixedHeight", void 0); tslib_1.__decorate([ I18N('components'), tslib_1.__metadata("design:type", Array) ], ComponentAccordion.prototype, "itemComponents", void 0); function ComponentAccordion_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ ComponentAccordion.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ ComponentAccordion.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ ComponentAccordion.propDecorators; /** @type {?} */ ComponentAccordion.TYPE_NAME; /** @type {?} */ ComponentAccordion.prototype.ACCORDIAN_CONTAINER_SELECTOR; /** @type {?} */ ComponentAccordion.prototype.items; /** @type {?} */ ComponentAccordion.prototype.fixedHeight; /** @type {?} */ ComponentAccordion.prototype.dataParent; /** @type {?} */ ComponentAccordion.prototype.name; /** @type {?} */ ComponentAccordion.prototype.multipleExpand; /** @type {?} */ ComponentAccordion.prototype.itemComponents; /** @type {?} */ ComponentAccordion.prototype.delayTimer; /** @type {?} */ ComponentAccordion.prototype.inited; /** @type {?} */ ComponentAccordion.prototype.activeItems; /** @type {?} */ ComponentAccordion.prototype.pageComponentHandler; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50QWNjb3JkaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9Db21wb25lbnRBY2NvcmRpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3hELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFJdkQsdUJBQU0sU0FBUyxHQUFXLHlCQUF5QixDQUFDO0FBNkJwRCxNQUFNLHlCQUEwQixTQUFRLGlCQUE4Qzs7OztJQTJCcEYsWUFBWSxVQUFzQjtRQUNoQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7NENBeEIyQixzQkFBc0I7UUEwQm5FLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDOztRQUV0QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUN4QyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO29CQUNqRSxxQkFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQy9CLEVBQUUsQ0FBQyxD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WUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21wb25lbnRBY2NvcmRpb25JdGVtTW9kZWwgfSBmcm9tICcuL21vZGVsL0NvbXBvbmVudEFjY29yZGlvbkl0ZW1Nb2RlbCc7XG5pbXBvcnQgeyBBYnN0cmFjdEFjY29yZGlvbiB9IGZyb20gJy4vQWJzdHJhY3RBY2NvcmRpb24nO1xuaW1wb3J0IHsgSUhhc0RhdGFQYXJlbnQgfSBmcm9tICcuL0lIYXNEYXRhUGFyZW50JztcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi9JSGFzRGF0YSc7XG5pbXBvcnQgeyBJMThOIH0gZnJvbSAnLi4vZGVjb3JhdG9yL0kxOE4uZGVjb3JhdG9yJztcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcblxuZGVjbGFyZSB2YXIgJDogYW55O1xuXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4LWNvbXBvbmVudC1hY2NvcmRpb25cIjtcblxuQENvbXBvbmVudCh7XG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInBoeC1jb21wb25lbnQtYWNjb3JkaW9uXCI+XG4gIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24tY29udGFpbmVyXCI+XG4gICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1pdGVtIFtuZ0Zvck9mXT1cImdldEl0ZW1zKClcIiBsZXQtaT1cImluZGV4XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWl0ZW1cIiBpZD1cInt7aSsnJ319XCIgW2NsYXNzLmhpZGVib3JkZXJdPVwiIWlzU2hvdyhpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci13cmFwcGVyXCIgW2NsYXNzLmRpc2FibGVdPVwiIWlzRW5hYmxlKGkpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPjxoND57e2l0ZW0ubGFiZWx9fTwvaDQ+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvd24tdHJpYW5nbGVcIiAoY2xpY2spPVwib25TaG93Qm9keUJ0bkNsaWNrKCRldmVudCwgaSlcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJvZHlcIiBbc3R5bGUuaGVpZ2h0XT1cIl9nZXRJdGVtSGVpZ2h0KGkpXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktd3JhcHBlclwiIFtjbGFzcy5zaG93XT1cImlzU2hvdyhpKVwiIFtjbGFzcy5kaXNhYmxlXT1cIiFpc0VuYWJsZShpKVwiPlxuICAgICAgICAgICAgICA8cGh4LWNvbXBvbmVudC13cmFwcGVyIFt0eXBlXT1cIml0ZW0uY29tcG9uZW50VHlwZVwiIFtkYXRhXT1cIml0ZW0uY29tcG9uZW50RGF0YVwiIFtoYW5kbGVyXT1cIl9nZXRQYWdlQ29tcG9uZW50SGFuZGxlcigpXCIgW3NldHRpbmddPVwie2luZGV4OiBpfVwiIFttb2RlbF09XCJpdGVtLmNvbXBvbmVudE1vZGVsXCIgW2RhdGFQYXJlbnRdPVwidGhpc1wiPjwvcGh4LWNvbXBvbmVudC13cmFwcGVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1pdGVtIGZha2VcIj48IS0tIGZha2UgZm9yIGhlaWdodCAtLT48L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbmBcbn0pXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50QWNjb3JkaW9uIGV4dGVuZHMgQWJzdHJhY3RBY2NvcmRpb248Q29tcG9uZW50QWNjb3JkaW9uSXRlbU1vZGVsPiBpbXBsZW1lbnRzIE9uSW5pdCwgSUhhc0RhdGFQYXJlbnQge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XG5cbiAgcHJpdmF0ZSBBQ0NPUkRJQU5fQ09OVEFJTkVSX1NFTEVDVE9SOiBzdHJpbmcgPSBcIi5hY2NvcmRpb24tY29udGFpbmVyXCI7XG5cbiAgQElucHV0KClcbiAgQEkxOE4oKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGl0ZW1zOiBDb21wb25lbnRBY2NvcmRpb25JdGVtTW9kZWxbXTtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBmaXhlZEhlaWdodDogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xuICBASW5wdXQoKVxuICBwcm90ZWN0ZWQgbmFtZTogc3RyaW5nO1xuICBASW5wdXQoKVxuICBwcm90ZWN0ZWQgbXVsdGlwbGVFeHBhbmQ6IGJvb2xlYW47XG5cbiAgQEkxOE4oJ2NvbXBvbmVudHMnKVxuICBwcml2YXRlIGl0ZW1Db21wb25lbnRzOiBhbnlbXTtcbiAgcHJpdmF0ZSBkZWxheVRpbWVyOiBhbnk7XG4gIHByaXZhdGUgaW5pdGVkOiBib29sZWFuO1xuICBwcml2YXRlIGFjdGl2ZUl0ZW1zOiBDb21wb25lbnRBY2NvcmRpb25JdGVtTW9kZWxbXTtcbiAgcHJpdmF0ZSBwYWdlQ29tcG9uZW50SGFuZGxlcjogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYpO1xuXG4gICAgdGhpcy5pbml0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLml0ZW1Db21wb25lbnRzID0gW107XG4gICAgdGhpcy5hY3RpdmVJdGVtcyA9IFtdO1xuICAgIC8vIGltcGxlIGZvciBjb21wb25lbnQgaGFuZGxlclxuICAgIHRoaXMucGFnZUNvbXBvbmVudEhhbmRsZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAodGhpcyAhPSBudWxsICYmIHR5cGVvZiB0aGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAoZGF0YS5zZXR0aW5nICE9PSBudWxsICYmIHR5cGVvZiBkYXRhLnNldHRpbmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgbGV0IGluZGV4ID0gZGF0YS5zZXR0aW5nLmluZGV4O1xuICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCB0aGlzLml0ZW1Db21wb25lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLml0ZW1Db21wb25lbnRzW2luZGV4XSA9IGRhdGEuaW5zdGFuY2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsZXQgY291bnQgPSB0aGlzLml0ZW1Db21wb25lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgd2hpbGUgKGNvdW50IDw9IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtQ29tcG9uZW50cy5wdXNoKGRhdGEuaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLml0ZW1Db21wb25lbnRzLnB1c2gobnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5pdGVtcyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5pdGVtcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA8IHRoaXMuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGxldCBpdGVtID0gdGhpcy5pdGVtc1tpbmRleF07XG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmluc3RhbmNlLnNldE1vZGVsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5pbnN0YW5jZS5zZXRNb2RlbChpdGVtLmNvbXBvbmVudE1vZGVsKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5pbnN0YW5jZS5zZXREYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5pbnN0YW5jZS5zZXREYXRhKGl0ZW0uY29tcG9uZW50RGF0YSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBieSBwYXNzIGNoaWxkXG4gICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFQYXJlbnQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZGF0YVBhcmVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGF0YVBhcmVudC5hZGREYXRhQ2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgIGxldCBoYXNEYXRhQ29tcG8gPSBkYXRhLmluc3RhbmNlIGFzIElIYXNEYXRhO1xuXG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGhhc0RhdGFDb21wbyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUGFyZW50LmFkZERhdGFDaGlsZChoYXNEYXRhQ29tcG8pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIGRlbGVnYXRlIGhhbmRsZXJcbiAgICAgICAgICAgICAgaWYgKGl0ZW0uY29tcG9uZW50SGFuZGxlciAhPT0gbnVsbCAmJiB0eXBlb2YgaXRlbS5jb21wb25lbnRIYW5kbGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGl0ZW0uY29tcG9uZW50SGFuZGxlci5jYWxsKG51bGwsIGRhdGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgdGhpcy5zZXREYXRhUGFyZW50KHRoaXMuZGF0YVBhcmVudCk7XG5cbiAgICAvLyBhZGRpbmcgYWxsIHRvIGFjdGl2ZSBiZWNhdXNlIGRlZmF1bHQgaXMgYWxsT3BlblxuICAgIGlmICh0aGlzLml0ZW1zICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLml0ZW1zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlSXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1vdmVVcEFjY29yZGlvbkJlbG93SWQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChpZCA9PT0gbnVsbCB8fCB0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWxlbWVudFJlZiAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5lbGVtZW50UmVmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGV0IGFjY29yZGlvblNlbGVjdG9yOiBzdHJpbmcgPSBcIi5hY2NvcmRpb24taXRlbVwiO1xuICAgICAgbGV0IHNlbGVjdG9yID0gXCIjXCIgKyBpZCArIGFjY29yZGlvblNlbGVjdG9yO1xuXG4gICAgICBsZXQgc2VsZWN0b3JFbGVtZW50ID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZChzZWxlY3Rvcik7XG4gICAgICBsZXQgaGVpZ2h0ID0gMDtcbiAgICAgIGlmICh0eXBlb2Ygc2VsZWN0b3JFbGVtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAodHlwZW9mICQoc2VsZWN0b3JFbGVtZW50KS5oZWlnaHQoKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBoZWlnaHQgPSAkKHNlbGVjdG9yRWxlbWVudCkuaGVpZ2h0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYm9keVNlbGVjdG9yID0gJChzZWxlY3RvckVsZW1lbnQpLmZpbmQoXCIuYm9keVwiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBib2R5U2VsZWN0b3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaGVpZ2h0ID0gJChib2R5U2VsZWN0b3IpLmhlaWdodCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5leHRFbGVtZW50ID0gJChzZWxlY3RvckVsZW1lbnQpLm5leHQoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBuZXh0RWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAkKG5leHRFbGVtZW50KS5jc3MoJ21hcmdpbi10b3AnLCAtaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgYWNjQ29udGFpbmVyU2VsZWN0b3I6IHN0cmluZyA9IHRoaXMuQUNDT1JESUFOX0NPTlRBSU5FUl9TRUxFQ1RPUjtcbiAgICAgIGxldCBhY2NDb250YWluZXJFbGVtZW50ID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZChhY2NDb250YWluZXJTZWxlY3Rvcik7XG4gICAgICBsZXQgY29udGFpbmVySGVpZ2h0ID0gMDtcbiAgICAgIGlmICh0eXBlb2YgYWNjQ29udGFpbmVyRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29udGFpbmVySGVpZ2h0ID0gMDtcbiAgICAgICAgaWYgKHR5cGVvZiAkKGFjY0NvbnRhaW5lckVsZW1lbnQpLmhlaWdodCgpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGNvbnRhaW5lckhlaWdodCA9ICQoYWNjQ29udGFpbmVyRWxlbWVudCkuaGVpZ2h0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGZha2VBY2NvcmRpb25TZWxlY3Rvcjogc3RyaW5nID0gXCIuZmFrZVwiO1xuICAgICAgbGV0IGZha2VBY2NFbGVtZW50ID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZChmYWtlQWNjb3JkaW9uU2VsZWN0b3IpO1xuICAgICAgbGV0IGZha2VIZWlnaHQgPSAwO1xuICAgICAgbGV0IG9sZEZha2VIZWlnaHQgPSAwO1xuICAgICAgaWYgKHR5cGVvZiBmYWtlQWNjRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAkKGZha2VBY2NFbGVtZW50KS5oZWlnaHQoKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBmYWtlSGVpZ2h0ID0gJChmYWtlQWNjRWxlbWVudCkuaGVpZ2h0KCk7XG4gICAgICAgICAgb2xkRmFrZUhlaWdodCA9ICQoZmFrZUFjY0VsZW1lbnQpLmhlaWdodCgpO1xuICAgICAgICB9XG4gICAgICAgIGZha2VIZWlnaHQgPSBmYWtlSGVpZ2h0ICsgaGVpZ2h0O1xuXG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZUV4cGFuZCkge1xuICAgICAgICAgIGZha2VIZWlnaHQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgJChmYWtlQWNjRWxlbWVudCkuY3NzKCdoZWlnaHQnLCBmYWtlSGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgLy8gc2V0IGhlaWdodCB0byBjb250YWluZXJcbiAgICAgIGlmICghdGhpcy5maXhlZEhlaWdodCAmJiB0eXBlb2YgYWNjQ29udGFpbmVyRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVySGVpZ2h0ICsgb2xkRmFrZUhlaWdodCAtIGZha2VIZWlnaHQ7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lckhlaWdodCA8IDApIHtcbiAgICAgICAgICBjb250YWluZXJIZWlnaHQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgJChhY2NDb250YWluZXJFbGVtZW50KS5jc3MoJ2hlaWdodCcsIGNvbnR