UNPKG

ontimize-web-ngx

Version:
358 lines 52.5 kB
import { __decorate, __metadata } from "tslib"; import { Directive, ElementRef, EventEmitter, Injector, NgZone, ViewChild } from '@angular/core'; import { BehaviorSubject, Observable, Subscription } from 'rxjs'; import { BooleanInputConverter } from '../../decorators/input-converter'; import { OErrorDialogManager } from '../../services/o-error-dialog-manager.service'; import { OntimizeService } from '../../services/ontimize/ontimize.service'; import { Codes } from '../../util/codes'; import { ServiceUtils } from '../../util/service.utils'; import { Util } from '../../util/util'; import { OContextMenuComponent } from '../contextmenu/o-context-menu.component'; import { OFormComponent } from '../form/o-form.component'; import { OFormDataComponent } from '../o-form-data-component.class'; import * as i0 from "@angular/core"; import * as i1 from "../form/o-form.component"; export const DEFAULT_INPUTS_O_FORM_SERVICE_COMPONENT = [ 'staticData: static-data', 'entity', 'service', 'columns', 'valueColumn: value-column', 'valueColumnType: value-column-type', 'parentKeys: parent-keys', 'visibleColumns: visible-columns', 'descriptionColumns: description-columns', 'separator', 'queryOnInit: query-on-init', 'queryOnBind: query-on-bind', 'queryOnEvent: query-on-event', 'queryMethod: query-method', 'serviceType: service-type', 'queryWithNullParentKeys: query-with-null-parent-keys', 'setValueOnValueChange: set-value-on-value-change', 'queryFallbackFunction: query-fallback-function', 'translate', 'sort' ]; export const DEFAULT_OUTPUTS_O_FORM_SERVICE_COMPONENT = [ 'onSetValueOnValueChange', 'onDataLoaded' ]; export class OFormServiceComponent extends OFormDataComponent { set oContextMenuRef(value) { this.oContextMenu = value; } constructor(form, elRef, injector) { super(form, elRef, injector); this.valueColumnType = Codes.TYPE_INT; this.separator = Codes.SPACE_SEPARATOR; this.queryOnInit = true; this.queryOnBind = false; this.queryMethod = Codes.QUERY_METHOD; this.queryWithNullParentKeys = false; this.translate = false; this.onSetValueOnValueChange = new EventEmitter(); this.onDataLoaded = new EventEmitter(); this.dataArray = []; this.colArray = []; this.visibleColArray = []; this.descriptionColArray = []; this.loading = false; this.cacheQueried = false; this._pKeysEquiv = {}; this._setValueOnValueChangeEquiv = {}; this.subscriptionDataLoad = new Subscription(); this.delayLoad = 250; this.loadingSubject = new BehaviorSubject(false); this.form = form; this.elRef = elRef; this.oErrorDialogManager = injector.get(OErrorDialogManager); } initialize() { super.initialize(); this.subscriptionDataLoad.add(this.onDataLoaded.subscribe(() => this.syncDataIndex(false))); this.cacheQueried = false; this.colArray = Util.parseArray(this.columns, true); this.visibleColArray = Util.parseArray(this.visibleColumns, true); if (Util.isArrayEmpty(this.visibleColArray)) { this.visibleColumns = this.columns; this.visibleColArray = this.colArray; } this.descriptionColArray = Util.parseArray(this.descriptionColumns); if (Util.isArrayEmpty(this.descriptionColArray)) { this.descriptionColArray = this.visibleColArray; } const pkArray = Util.parseArray(this.parentKeys); this._pKeysEquiv = Util.parseParentKeysEquivalences(pkArray); const setValueSetArray = Util.parseArray(this.setValueOnValueChange); this._setValueOnValueChangeEquiv = Util.parseParentKeysEquivalences(setValueSetArray); if (this.form && this.queryOnBind) { this._formDataSubcribe = this.form.onDataLoaded.subscribe(() => this.queryData()); } if (this.staticData) { this.queryOnBind = false; this.queryOnInit = false; this.setDataArray(this.staticData); } else { this.configureService(); } if (this.queryOnEvent !== undefined && this.queryOnEvent.subscribe !== undefined) { this.queryOnEventSubscription = this.queryOnEvent.subscribe((value) => { if (Util.isDefined(value) || this.queryWithNullParentKeys) { this.queryData(); } }); } if (typeof this.queryFallbackFunction !== 'function') { this.queryFallbackFunction = undefined; } } destroy() { super.destroy(); if (this._formDataSubcribe) { this._formDataSubcribe.unsubscribe(); } if (this.queryOnEventSubscription) { this.queryOnEventSubscription.unsubscribe(); } if (this.loaderSubscription) { this.loaderSubscription.unsubscribe(); } if (this.subscriptionDataLoad) { this.subscriptionDataLoad.unsubscribe(); } } emitOnValueChange(type, newValue, oldValue) { super.emitOnValueChange(type, newValue, oldValue); const record = this.getSelectedRecord(); this.onSetValueOnValueChange.emit(record); const setValueSetKeys = Object.keys(this._setValueOnValueChangeEquiv); if (setValueSetKeys.length) { const formComponents = this.form.getComponents(); setValueSetKeys.forEach(key => { const comp = formComponents[this._setValueOnValueChangeEquiv[key]]; if (Util.isDefined(comp)) { comp.setValue(Util.isDefined(record) ? record[key] : undefined); } }); } } configureService() { const configureServiceArgs = { injector: this.injector, baseService: OntimizeService, entity: this.entity, service: this.service, serviceType: this.serviceType }; this.dataService = Util.configureService(configureServiceArgs); } getAttributesValuesToQuery(columns) { const result = Util.isDefined(columns) ? columns : this.colArray; if (result.indexOf(this.valueColumn) === -1) { result.push(this.valueColumn); } return result; } queryData(filter) { if (!this.dataService || !(this.queryMethod in this.dataService) || !this.entity) { console.warn('Service not properly configured! aborting query'); return; } filter = Object.assign(filter || {}, ServiceUtils.getParentKeysFromForm(this._pKeysEquiv, this.form)); if (!ServiceUtils.filterContainsAllParentKeys(filter, this._pKeysEquiv) && !this.queryWithNullParentKeys) { this.setDataArray([]); } else { if (this.querySuscription) { this.querySuscription.unsubscribe(); } if (this.loaderSubscription) { this.loaderSubscription.unsubscribe(); } const queryCols = this.getAttributesValuesToQuery(); const sqlTypes = this.form ? this.form.getAttributesSQLTypes() : {}; this.loaderSubscription = this.load(); this.querySuscription = this.dataService[this.queryMethod](filter, queryCols, this.entity, sqlTypes) .subscribe((resp) => { if (resp.isSuccessful()) { this.cacheQueried = true; this.setDataArray(resp.data); } this.loadingSubject.next(false); this.loaderSubscription.unsubscribe(); }, err => { console.error(err); this.loadingSubject.next(false); this.loaderSubscription.unsubscribe(); if (Util.isDefined(this.queryFallbackFunction)) { this.queryFallbackFunction(err); } else { this.oErrorDialogManager.openErrorDialog(err); console.error(err); } }); } } getDataArray() { return this.dataArray; } setDataArray(data) { if (Util.isArray(data)) { this.dataArray = this.sortData(data); } else if (Util.isObject(data) && Object.keys(data).length > 0) { this.dataArray = [data]; } else { console.warn('Component has received not supported service data. Supported data are Array or not empty Object'); this.dataArray = []; } this.onDataLoaded.emit(this.dataArray); } syncDataIndex(queryIfNotFound = true) { this._currentIndex = undefined; if (Util.isDefined(this.value) && !this.isEmpty() && this.dataArray) { this.dataArray.forEach((item, index) => { if (this.value.value instanceof Array) { this._currentIndex = []; this.value.value.forEach((itemValue, indexValue) => { if (item[this.valueColumn] === itemValue) { this._currentIndex[this._currentIndex.length] = indexValue; } }); } else if (item[this.valueColumn] === this.value.value) { this._currentIndex = index; } if (item[this.valueColumn] === this.value.value) { this._currentIndex = index; } }); if (this._currentIndex === undefined) { if (queryIfNotFound && this.queryOnBind && this.dataArray && this.dataArray.length === 0 && !this.cacheQueried) { this.queryData(); } else if (!queryIfNotFound && this.dataArray && this.dataArray.length > 0) { console.warn('It was set the value ' + this.value.value + ' to the component ' + this.oattr + ' but this value does not exist in the data array and this value will be set to undefined'); this.setValue(void 0); } } } } parseByValueColumnType(val) { let value = val; if (this.valueColumnType === Codes.TYPE_INT) { const parsed = parseInt(value, 10); if (!isNaN(parsed)) { value = parsed; } } return value; } setValue(val, options) { const value = this.parseByValueColumnType(val); super.setValue(value, options); } setData(val) { const value = this.parseByValueColumnType(val); super.setData(value); } getSelectedRecord() { let result; const selectedValue = this.getValue(); if (Util.isDefined(selectedValue)) { result = this.getDataArray().find(item => item[this.valueColumn] === selectedValue); } return result; } load() { const zone = this.injector.get(NgZone); const loadObservable = new Observable(observer => { const timer = window.setTimeout(() => { observer.next(true); }, this.delayLoad); return () => { window.clearTimeout(timer); zone.run(() => { observer.next(false); this.loading = false; }); }; }); const subscription = loadObservable.subscribe(val => { zone.run(() => { this.loading = val; this.loadingSubject.next(val); }); }); return subscription; } onFormControlChange(value) { if (this.oldValue === value) { return; } super.onFormControlChange(value); } getOptionDescriptionValue(item = {}) { let descTxt = ''; if (this.descriptionColArray && this.descriptionColArray.length > 0) { this.descriptionColArray.forEach((col, index) => { let txt = item[col]; if (Util.isDefined(txt)) { if (this.translate && this.translateService) { txt = this.translateService.get(txt); } descTxt += txt; } if (index < this.descriptionColArray.length - 1) { descTxt += this.separator; } }); } return descTxt.trim(); } sortData(data) { if (!Util.isDefined(this.sort)) { return data; } const sortDirection = this.sort.toLowerCase(); if (sortDirection !== Codes.ASC_SORT && sortDirection !== Codes.DESC_SORT) { return data; } const sortedData = data.sort((a, b) => Util.compare(this.getOptionDescriptionValue(a), this.getOptionDescriptionValue(b))); if (sortDirection === Codes.DESC_SORT) { sortedData.reverse(); } return sortedData; } refresh() { this.queryData(); } } OFormServiceComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OFormServiceComponent, deps: [{ token: i1.OFormComponent }, { token: i0.ElementRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive }); OFormServiceComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: OFormServiceComponent, inputs: { staticData: ["static-data", "staticData"], entity: "entity", service: "service", columns: "columns", valueColumn: ["value-column", "valueColumn"], valueColumnType: ["value-column-type", "valueColumnType"], parentKeys: ["parent-keys", "parentKeys"], visibleColumns: ["visible-columns", "visibleColumns"], descriptionColumns: ["description-columns", "descriptionColumns"], separator: "separator", queryOnInit: ["query-on-init", "queryOnInit"], queryOnBind: ["query-on-bind", "queryOnBind"], queryOnEvent: ["query-on-event", "queryOnEvent"], queryMethod: ["query-method", "queryMethod"], serviceType: ["service-type", "serviceType"], queryWithNullParentKeys: ["query-with-null-parent-keys", "queryWithNullParentKeys"], setValueOnValueChange: ["set-value-on-value-change", "setValueOnValueChange"], queryFallbackFunction: ["query-fallback-function", "queryFallbackFunction"], translate: "translate", sort: "sort" }, outputs: { onSetValueOnValueChange: "onSetValueOnValueChange", onDataLoaded: "onDataLoaded" }, viewQueries: [{ propertyName: "oContextMenuRef", first: true, predicate: OContextMenuComponent, descendants: true }], usesInheritance: true, ngImport: i0 }); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OFormServiceComponent.prototype, "queryOnInit", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OFormServiceComponent.prototype, "queryOnBind", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OFormServiceComponent.prototype, "queryWithNullParentKeys", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OFormServiceComponent.prototype, "translate", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OFormServiceComponent, decorators: [{ type: Directive, args: [{ inputs: DEFAULT_INPUTS_O_FORM_SERVICE_COMPONENT, outputs: DEFAULT_OUTPUTS_O_FORM_SERVICE_COMPONENT }] }], ctorParameters: function () { return [{ type: i1.OFormComponent }, { type: i0.ElementRef }, { type: i0.Injector }]; }, propDecorators: { queryOnInit: [], queryOnBind: [], queryWithNullParentKeys: [], translate: [], oContextMenuRef: [{ type: ViewChild, args: [OContextMenuComponent] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1mb3JtLXNlcnZpY2UtY29tcG9uZW50LmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQvby1mb3JtLXNlcnZpY2UtY29tcG9uZW50LmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakcsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWpFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUczRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7OztBQUVwRSxNQUFNLENBQUMsTUFBTSx1Q0FBdUMsR0FBRztJQUVyRCx5QkFBeUI7SUFDekIsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsMkJBQTJCO0lBQzNCLG9DQUFvQztJQUNwQyx5QkFBeUI7SUFFekIsaUNBQWlDO0lBRWpDLHlDQUF5QztJ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RUFBRTtZQUNyQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDdEI7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQixDQUFDOzttSEE3V1UscUJBQXFCO3VHQUFyQixxQkFBcUIsb2tDQXdEckIscUJBQXFCO0FBM0NoQztJQUFDLHFCQUFxQixFQUFFOzswREFDYztBQUN0QztJQUFDLHFCQUFxQixFQUFFOzswREFDZTtBQUl2QztJQUFDLHFCQUFxQixFQUFFOztzRUFDaUI7QUFJekM7SUFBQyxxQkFBcUIsRUFBRTs7d0RBQ1U7NEZBMUJ2QixxQkFBcUI7a0JBSmpDLFNBQVM7bUJBQUM7b0JBQ1QsTUFBTSxFQUFFLHVDQUF1QztvQkFDL0MsT0FBTyxFQUFFLHdDQUF3QztpQkFDbEQ7cUpBZVcsV0FBVyxNQUVYLFdBQVcsTUFLckIsdUJBQXVCLE1BS2hCLFNBQVMsTUErQlosZUFBZTtzQkFEbEIsU0FBUzt1QkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIE5nWm9uZSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBCb29sZWFuSW5wdXRDb252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2lucHV0LWNvbnZlcnRlcic7XG5pbXBvcnQgeyBTZXJ2aWNlUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3NlcnZpY2UtcmVzcG9uc2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IE9FcnJvckRpYWxvZ01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vLWVycm9yLWRpYWxvZy1tYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgT250aW1pemVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb250aW1pemUvb250aW1pemUuc2VydmljZSc7XG5pbXBvcnQgeyBPQ29uZmlndXJlU2VydmljZUFyZ3MgfSBmcm9tICcuLi8uLi90eXBlcy9jb25maWd1cmUtc2VydmljZS1hcmdzLnR5cGUnO1xuaW1wb3J0IHsgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL2Zvcm0tdmFsdWUtb3B0aW9ucy50eXBlJztcbmltcG9ydCB7IENvZGVzIH0gZnJvbSAnLi4vLi4vdXRpbC9jb2Rlcyc7XG5pbXBvcnQgeyBTZXJ2aWNlVXRpbHMgfSBmcm9tICcuLi8uLi91dGlsL3NlcnZpY2UudXRpbHMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPQ29udGV4dE1lbnVDb21wb25lbnQgfSBmcm9tICcuLi9jb250ZXh0bWVudS9vLWNvbnRleHQtbWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgT0Zvcm1Db21wb25lbnQgfSBmcm9tICcuLi9mb3JtL28tZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgT0Zvcm1EYXRhQ29tcG9uZW50IH0gZnJvbSAnLi4vby1mb3JtLWRhdGEtY29tcG9uZW50LmNsYXNzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5QVVRTX09fRk9STV9TRVJWSUNFX0NPTVBPTkVOVCA9IFtcbiAgLy8gc3RhdGljLWRhdGEgW0FycmF5PGFueT5dIDogd2F5IHRvIHBvcHVsYXRlIHdpdGggc3RhdGljIGRhdGEuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAnc3RhdGljRGF0YTogc3RhdGljLWRhdGEnLFxuICAnZW50aXR5JyxcbiAgJ3NlcnZpY2UnLFxuICAnY29sdW1ucycsXG4gICd2YWx1ZUNvbHVtbjogdmFsdWUtY29sdW1uJyxcbiAgJ3ZhbHVlQ29sdW1uVHlwZTogdmFsdWUtY29sdW1uLXR5cGUnLFxuICAncGFyZW50S2V5czogcGFyZW50LWtleXMnLFxuICAvLyBWaXNpYmxlIGNvbHVtbnMgaW50byBzZWxlY3Rpb24gZGlhbG9nIGZyb20gcGFyYW1ldGVyICdjb2x1bW5zJy4gV2l0aCBlbXB0eSBwYXJhbWV0ZXIgYWxsIGNvbHVtbnMgYXJlIHZpc2libGUuXG4gICd2aXNpYmxlQ29sdW1uczogdmlzaWJsZS1jb2x1bW5zJyxcbiAgLy8gVmlzaWJsZSBjb2x1bW5zIGluIHRleHQgZmllbGQuIEJ5IGRlZmF1bHQsIGl0IGlzIHRoZSBwYXJhbWV0ZXIgdmFsdWUgb2YgdmlzaWJsZSBjb2x1bW5zLlxuICAnZGVzY3JpcHRpb25Db2x1bW5zOiBkZXNjcmlwdGlvbi1jb2x1bW5zJyxcblxuICAnc2VwYXJhdG9yJyxcblxuICAncXVlcnlPbkluaXQ6IHF1ZXJ5LW9uLWluaXQnLFxuICAncXVlcnlPbkJpbmQ6IHF1ZXJ5LW9uLWJpbmQnLFxuICAncXVlcnlPbkV2ZW50OiBxdWVyeS1vbi1ldmVudCcsXG5cbiAgLy8gcXVlcnktbWV0aG9kIFtzdHJpbmddOiBuYW1lIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZCB0byBwZXJmb3JtIHF1ZXJpZXMuIERlZmF1bHQ6IHF1ZXJ5LlxuICAncXVlcnlNZXRob2Q6IHF1ZXJ5LW1ldGhvZCcsXG5cbiAgJ3NlcnZpY2VUeXBlOiBzZXJ2aWNlLXR5cGUnLFxuXG4gIC8vIHF1ZXJ5LXdpdGgtbnVsbC1wYXJlbnQta2V5cyBbc3RyaW5nXVt5ZXN8bm98dHJ1ZXxmYWxzZV06IEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byB0cmlnZ2VyIHF1ZXJ5IG1ldGhvZCB3aGVuIHBhcmVudC1rZXlzIGZpbHRlciBpcyBudWxsLiBEZWZhdWx0OiBmYWxzZVxuICAncXVlcnlXaXRoTnVsbFBhcmVudEtleXM6IHF1ZXJ5LXdpdGgtbnVsbC1wYXJlbnQta2V5cycsXG5cbiAgLy8gc2V0LXZhbHVlLW9uLXZhbHVlLWNoYW5nZSBbc3RyaW5nXTogRm9ybSBjb21wb25lbnQgYXR0cmlidXRlcyB3aG9zZSB2YWx1ZSB3aWxsIGJlIHNldCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBjb21wb25lbnQgY2hhbmdlcyBkdWUgdG8gdXNlciBpbnRlcmFjdGlvbi4gU2VwYXJhdGVkIGJ5ICc7Jy4gQWNjZXB0ZWQgZm9ybWF0OiBhdHRyIHwgY29sdW1uTmFtZTphdHRyXG4gICdzZXRWYWx1ZU9uVmFsdWVDaGFuZ2U6IHNldC12YWx1ZS1vbi12YWx1ZS1jaGFuZ2UnLFxuXG4gIC8vIFtmdW5jdGlvbl06IGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gcXVlcnkgZXJyb3IuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAncXVlcnlGYWxsYmFja0Z1bmN0aW9uOiBxdWVyeS1mYWxsYmFjay1mdW5jdGlvbicsXG5cbiAgLy8gJ2luc2VydEZhbGxiYWNrRnVuY3Rpb246IGluc2VydC1mYWxsYmFjay1mdW5jdGlvbicsXG5cbiAgLy8gJ3VwZGF0ZUZhbGxiYWNrRnVuY3Rpb246IHVwZGF0ZS1mYWxsYmFjay1mdW5jdGlvbicsXG5cbiAgLy8gJ2RlbGV0ZUZhbGxiYWNrRnVuY3Rpb246IGRlbGV0ZS1mYWxsYmFjay1mdW5jdGlvbidcblxuICAndHJhbnNsYXRlJyxcblxuICAvLyBzb3J0IFtzdHJpbmddOiBzb3J0aW5nIEFTQyBvciBERVNDLiBEZWZhdWx0OiBubyB2YWx1ZVxuICAnc29ydCdcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX09VVFBVVFNfT19GT1JNX1NFUlZJQ0VfQ09NUE9ORU5UID0gW1xuICAnb25TZXRWYWx1ZU9uVmFsdWVDaGFuZ2UnLFxuICAnb25EYXRhTG9hZGVkJ1xuXTtcblxuQERpcmVjdGl2ZSh7XG4gIGlucHV0czogREVGQVVMVF9JTlBVVFNfT19GT1JNX1NFUlZJQ0VfQ09NUE9ORU5ULFxuICBvdXRwdXRzOiBERUZBVUxUX09VVFBVVFNfT19GT1JNX1NFUlZJQ0VfQ09NUE9ORU5UXG59KVxuZXhwb3J0IGNsYXNzIE9Gb3JtU2VydmljZUNvbXBvbmVudCBleHRlbmRzIE9Gb3JtRGF0YUNvbXBvbmVudCB7XG5cbiAgLyogSW5wdXRzICovXG4gIHByb3RlY3RlZCBzdGF0aWNEYXRhOiBBcnJheTxhbnk+O1xuICBwcm90ZWN0ZWQgZW50aXR5OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBzZXJ2aWNlOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBjb2x1bW5zOiBzdHJpbmc7XG4gIHB1YmxpYyB2YWx1ZUNvbHVtbjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgdmFsdWVDb2x1bW5UeXBlOiBzdHJpbmcgPSBDb2Rlcy5UWVBFX0lOVDtcbiAgcHJvdGVjdGVkIHBhcmVudEtleXM6IHN0cmluZztcbiAgcHJvdGVjdGVkIHZpc2libGVDb2x1bW5zOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBkZXNjcmlwdGlvbkNvbHVtbnM6IHN0cmluZztcbiAgcHVibGljIHNlcGFyYXRvcjogc3RyaW5nID0gQ29kZXMuU1BBQ0VfU0VQQVJBVE9SO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHJvdGVjdGVkIHF1ZXJ5T25Jbml0OiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHByb3RlY3RlZCBxdWVyeU9uQmluZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgcXVlcnlPbkV2ZW50OiBhbnk7XG4gIHByb3RlY3RlZCBxdWVyeU1ldGhvZDogc3RyaW5nID0gQ29kZXMuUVVFUllfTUVUSE9EO1xuICBwcm90ZWN0ZWQgc2VydmljZVR5cGU6IHN0cmluZztcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHF1ZXJ5V2l0aE51bGxQYXJlbnRLZXlzOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBzZXRWYWx1ZU9uVmFsdWVDaGFuZ2U6IHN0cmluZztcbiAgcHVibGljIHF1ZXJ5RmFsbGJhY2tGdW5jdGlvbjogKGVycm9yOiBhbnkpID0+IHZvaWQ7XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHB1YmxpYyB0cmFuc2xhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHNvcnQ6ICdBU0MnIHwgJ0RFU0MnO1xuXG4gIC8qIE91dHB1dHMgKi9cbiAgcHVibGljIG9uU2V0VmFsdWVPblZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8b2JqZWN0PiA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICBwdWJsaWMgb25EYXRhTG9hZGVkOiBFdmVudEVtaXR0ZXI8b2JqZWN0PiA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuXG4gIC8qIEludGVybmFsIHZhcmlhYmxlcyAqL1xuICBwdWJsaWMgZGF0YUFycmF5OiBhbnlbXSA9IFtdO1xuICBwcm90ZWN0ZWQgY29sQXJyYXk6IHN0cmluZ1tdID0gW107XG4gIHByb3RlY3RlZCB2aXNpYmxlQ29sQXJyYXk6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBkZXNjcmlwdGlvbkNvbEFycmF5OiBzdHJpbmdbXSA9IFtdO1xuICBwcm90ZWN0ZWQgZGF0YVNlcnZpY2U6IE9udGltaXplU2VydmljZTtcbiAgcHVibGljIGxvYWRlclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIHF1ZXJ5U3VzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIGNhY2hlUXVlcmllZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX3BLZXlzRXF1aXYgPSB7fTtcbiAgcHJvdGVjdGVkIF9zZXRWYWx1ZU9uVmFsdWVDaGFuZ2VFcXVpdiA9IHt9O1xuICBwcm90ZWN0ZWQgX2Zvcm1EYXRhU3ViY3JpYmU7XG4gIHByb3RlY3RlZCBfY3VycmVudEluZGV4O1xuICBwcm90ZWN0ZWQgb0Vycm9yRGlhbG9nTWFuYWdlcjogT0Vycm9yRGlhbG9nTWFuYWdlcjtcblxuICBwcm90ZWN0ZWQgcXVlcnlPbkV2ZW50U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBzdWJzY3JpcHRpb25EYXRhTG9hZDogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwdWJsaWMgZGVsYXlMb2FkID0gMjUwO1xuICBwdWJsaWMgbG9hZGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBwdWJsaWMgb0NvbnRleHRNZW51OiBPQ29udGV4dE1lbnVDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoT0NvbnRleHRNZW51Q29tcG9uZW50KVxuICBzZXQgb0NvbnRleHRNZW51UmVmKHZhbHVlOiBPQ29udGV4dE1lbnVDb21wb25lbnQpIHtcbiAgICB0aGlzLm9Db250ZXh0TWVudSA9IHZhbHVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZm9ybTogT0Zvcm1Db21wb25lbnQsXG4gICAgZWxSZWY6IEVsZW1lbnRSZWYsXG4gICAgaW5qZWN0b3I6IEluamVjdG9yXG4gICkge1xuICAgIHN1cGVyKGZvcm0sIGVsUmVmLCBpbmplY3Rvcik7XG4gICAgdGhpcy5mb3JtID0gZm9ybTtcbiAgICB0aGlzLmVsUmVmID0gZWxSZWY7XG4gICAgdGhpcy5vRXJyb3JEaWFsb2dNYW5hZ2VyID0gaW5qZWN0b3IuZ2V0KE9FcnJvckRpYWxvZ01hbmFnZXIpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbkRhdGFMb2FkLmFkZCh0aGlzLm9uRGF0YUxvYWRlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zeW5jRGF0YUluZGV4KGZhbHNlKSkpO1xuXG4gICAgdGhpcy5jYWNoZVF1ZXJpZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNvbEFycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMuY29sdW1ucywgdHJ1ZSk7XG5cbiAgICB0aGlzLnZpc2libGVDb2xBcnJheSA9IFV0aWwucGFyc2VBcnJheSh0aGlzLnZpc2libGVDb2x1bW5zLCB0cnVlKTtcbiAgICBpZiAoVXRpbC5pc0FycmF5RW1wdHkodGhpcy52aXNpYmxlQ29sQXJyYXkpKSB7XG4gICAgICAvLyBJdCBpcyBuZWNlc3NhcnkgdG8gYXNzaW5nIHZhbHVlIHRvIHZpc2libGVDb2x1bW5zIHRvIHByb3BhZ2F0ZSB0aGUgcGFyYW1ldGVyLlxuICAgICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucztcbiAgICAgIHRoaXMudmlzaWJsZUNvbEFycmF5ID0gdGhpcy5jb2xBcnJheTtcbiAgICB9XG5cbiAgICB0aGlzLmRlc2NyaXB0aW9uQ29sQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy5kZXNjcmlwdGlvbkNvbHVtbnMpO1xuICAgIGlmIChVdGlsLmlzQXJyYXlFbXB0eSh0aGlzLmRlc2NyaXB0aW9uQ29sQXJyYXkpKSB7XG4gICAgICB0aGlzLmRlc2NyaXB0aW9uQ29sQXJyYXkgPSB0aGlzLnZpc2libGVDb2xBcnJheTtcbiAgICB9XG5cbiAgICBjb25zdCBwa0FycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMucGFyZW50S2V5cyk7XG4gICAgdGhpcy5fcEtleXNFcXVpdiA9IFV0aWwucGFyc2VQYXJlbnRLZXlzRXF1aXZhbGVuY2VzKHBrQXJyYXkpO1xuXG4gICAgY29uc3Qgc2V0VmFsdWVTZXRBcnJheSA9IFV0aWwucGFyc2VBcnJheSh0aGlzLnNldFZhbHVlT25WYWx1ZUNoYW5nZSk7XG4gICAgdGhpcy5fc2V0VmFsdWVPblZhbHVlQ2hhbmdlRXF1aXYgPSBVdGlsLnBhcnNlUGFyZW50S2V5c0VxdWl2YWxlbmNlcyhzZXRWYWx1ZVNldEFycmF5KTtcblxuICAgIGlmICh0aGlzLmZvcm0gJiYgdGhpcy5xdWVyeU9uQmluZCkge1xuICAgICAgdGhpcy5fZm9ybURhdGFTdWJjcmliZSA9IHRoaXMuZm9ybS5vbkRhdGFMb2FkZWQuc3Vic2NyaWJlKCgpID0+IHRoaXMucXVlcnlEYXRhKCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRpY0RhdGEpIHtcbiAgICAgIHRoaXMucXVlcnlPbkJpbmQgPSBmYWxzZTtcbiAgICAgIHRoaXMucXVlcnlPbkluaXQgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2V0RGF0YUFycmF5KHRoaXMuc3RhdGljRGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlndXJlU2VydmljZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXJ5T25FdmVudCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucXVlcnlPbkV2ZW50LnN1YnNjcmliZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnF1ZXJ5T25FdmVudFN1YnNjcmlwdGlvbiA9IHRoaXMucXVlcnlPbkV2ZW50LnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKHZhbHVlKSB8fCB0aGlzLnF1ZXJ5V2l0aE51bGxQYXJlbnRLZXlzKSB7XG4gICAgICAgICAgdGhpcy5xdWVyeURhdGEoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLnF1ZXJ5RmFsbGJhY2tGdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5xdWVyeUZhbGxiYWNrRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuXG5cblxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgaWYgKHRoaXMuX2Zvcm1EYXRhU3ViY3JpYmUpIHtcbiAgICAgIHRoaXMuX2Zvcm1EYXRhU3ViY3JpYmUudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVlcnlPbkV2ZW50U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnF1ZXJ5T25FdmVudFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2FkZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbkRhdGFMb2FkKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbkRhdGFMb2FkLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRPblZhbHVlQ2hhbmdlKHR5cGUsIG5ld1ZhbHVlLCBvbGRWYWx1ZSkge1xuICAgIHN1cGVyLmVtaXRPblZhbHVlQ2hhbmdlKHR5cGUsIG5ld1ZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgLy8gU2V0IHZhbHVlIGZvciAnc2V0LXZhbHVlLW9uLXZhbHVlLWNoYW5nZScgY29tcG9uZW50c1xuICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuZ2V0U2VsZWN0ZWRSZWNvcmQoKTtcbiAgICB0aGlzLm9uU2V0VmFsdWVPblZhbHVlQ2hhbmdlLmVtaXQocmVjb3JkKTtcbiAgICBjb25zdCBzZXRWYWx1ZVNldEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLl9zZXRWYWx1ZU9uVmFsdWVDaGFuZ2VFcXVpdik7XG4gICAgaWYgKHNldFZhbHVlU2V0S2V5cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGZvcm1Db21wb25lbnRzID0gdGhpcy5mb3JtLmdldENvbXBvbmVudHMoKTtcbiAgICAgIHNldFZhbHVlU2V0S2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbXAgPSBmb3JtQ29tcG9uZW50c1t0aGlzLl9zZXRWYWx1ZU9uVmFsdWVDaGFuZ2VFcXVpdltrZXldXTtcbiAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbXApKSB7XG4gICAgICAgICAgY29tcC5zZXRWYWx1ZShVdGlsLmlzRGVmaW5lZChyZWNvcmQpID8gcmVjb3JkW2tleV0gOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiBVdGlsaXR5IG1ldGhvZHMgKi9cbiAgY29uZmlndXJlU2VydmljZSgpIHtcbiAgICBjb25zdCBjb25maWd1cmVTZXJ2aWNlQXJnczogT0NvbmZpZ3VyZVNlcnZpY2VBcmdzID0geyBpbmplY3RvcjogdGhpcy5pbmplY3RvciwgYmFzZVNlcnZpY2U6IE9udGltaXplU2VydmljZSwgZW50aXR5OiB0aGlzLmVudGl0eSwgc2VydmljZTogdGhpcy5zZXJ2aWNlLCBzZXJ2aWNlVHlwZTogdGhpcy5zZXJ2aWNlVHlwZSB9XG4gICAgdGhpcy5kYXRhU2VydmljZSA9IFV0aWwuY29uZmlndXJlU2VydmljZShjb25maWd1cmVTZXJ2aWNlQXJncyk7XG5cblxuICB9XG5cbiAgZ2V0QXR0cmlidXRlc1ZhbHVlc1RvUXVlcnkoY29sdW1ucz86IEFycmF5PGFueT4pIHtcbiAgICBjb25zdCByZXN1bHQgPSBVdGlsLmlzRGVmaW5lZChjb2x1bW5zKSA/IGNvbHVtbnMgOiB0aGlzLmNvbEFycmF5O1xuICAgIGlmIChyZXN1bHQuaW5kZXhPZih0aGlzLnZhbHVlQ29sdW1uKSA9PT0gLTEpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHRoaXMudmFsdWVDb2x1bW4pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcXVlcnlEYXRhKGZpbHRlcj86IGFueSkge1xuICAgIGlmICghdGhpcy5kYXRhU2VydmljZSB8fCAhKHRoaXMucXVlcnlNZXRob2QgaW4gdGhpcy5kYXRhU2VydmljZSkgfHwgIXRoaXMuZW50aXR5KSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NlcnZpY2Ugbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQhIGFib3J0aW5nIHF1ZXJ5Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZpbHRlciA9IE9iamVjdC5hc3NpZ24oZmlsdGVyIHx8IHt9LCBTZXJ2aWNlVXRpbHMuZ2V0UGFyZW50S2V5c0Zyb21Gb3JtKHRoaXMuX3BLZXlzRXF1aXYsIHRoaXMuZm9ybSkpO1xuICAgIGlmICghU2VydmljZVV0aWxzLmZpbHRlckNvbnRhaW5zQWxsUGFyZW50S2V5cyhmaWx0ZXIsIHRoaXMuX3BLZXlzRXF1aXYpICYmICF0aGlzLnF1ZXJ5V2l0aE51bGxQYXJlbnRLZXlzKSB7XG4gICAgICB0aGlzLnNldERhdGFBcnJheShbXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnF1ZXJ5U3VzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5xdWVyeVN1c2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5sb2FkZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnlDb2xzID0gdGhpcy5nZXRBdHRyaWJ1dGVzVmFsdWVzVG9RdWVyeSgpO1xuICAgICAgY29uc3Qgc3FsVHlwZXMgPSB0aGlzLmZvcm0gPyB0aGlzLmZvcm0uZ2V0QXR0cmlidXRlc1NRTFR5cGVzKCkgOiB7fTtcblxuICAgICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24gPSB0aGlzLmxvYWQoKTtcbiAgICAgIHRoaXMucXVlcnlTdXNjcmlwdGlvbiA9IHRoaXMuZGF0YVNlcnZpY2VbdGhpcy5xdWVyeU1ldGhvZF0oZmlsdGVyLCBxdWVyeUNvbHMsIHRoaXMuZW50aXR5LCBzcWxUeXBlcylcbiAgICAgICAgLnN1YnNjcmliZSgocmVzcDogU2VydmljZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3AuaXNTdWNjZXNzZnVsKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVRdWVyaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YUFycmF5KHJlc3AuZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnF1ZXJ5RmFsbGJhY2tGdW5jdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlGYWxsYmFja0Z1bmN0aW9uKGVycik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub0Vycm9yRGlhbG9nTWFuYWdlci5vcGVuRXJyb3JEaWFsb2coZXJyKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldERhdGFBcnJheSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YUFycmF5O1xuICB9XG5cbiAgc2V0RGF0YUFycmF5KGRhdGE6IGFueSk6IHZvaWQge1xuICAgIGlmIChVdGlsLmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHRoaXMuZGF0YUFycmF5ID0gdGhpcy5zb3J0RGF0YShkYXRhKTtcbiAgICB9IGVsc2UgaWYgKFV0aWwuaXNPYmplY3QoZGF0YSkgJiYgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kYXRhQXJyYXkgPSBbZGF0YV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignQ29tcG9uZW50IGhhcyByZWNlaXZlZCBub3Qgc3VwcG9ydGVkIHNlcnZpY2UgZGF0YS4gU3VwcG9ydGVkIGRhdGEgYXJlIEFycmF5IG9yIG5vdCBlbXB0eSBPYmplY3QnKTtcbiAgICAgIHRoaXMuZGF0YUFycmF5ID0gW107XG4gICAgfVxuICAgIHRoaXMub25EYXRhTG9hZGVkLmVtaXQodGhpcy5kYXRhQXJyYXkpO1xuICB9XG5cbiAgc3luY0RhdGFJbmRleChxdWVyeUlmTm90Rm91bmQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgdGhpcy5fY3VycmVudEluZGV4ID0gdW5kZWZpbmVkO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnZhbHVlKSAmJiAhdGhpcy5pc0VtcHR5KCkgJiYgdGhpcy5kYXRhQXJyYXkpIHtcbiAgICAgIHRoaXMuZGF0YUFycmF5LmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlLnZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50SW5kZXggPSBbXTtcbiAgICAgICAgICB0aGlzLnZhbHVlLnZhbHVlLmZvckVhY2goKGl0ZW1WYWx1ZSwgaW5kZXhWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW1bdGhpcy52YWx1ZUNvbHVtbl0gPT09IGl0ZW1WYWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW5kZXhbdGhpcy5fY3VycmVudEluZGV4Lmxlbmd0aF0gPSBpbmRleFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW1bdGhpcy52YWx1ZUNvbHVtbl0gPT09IHRoaXMudmFsdWUudmFsdWUpIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50SW5kZXggPSBpbmRleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbVt0aGlzLnZhbHVlQ29sdW1uXSA9PT0gdGhpcy52YWx1ZS52YWx1ZSkge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRJbmRleCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChxdWVyeUlmTm90Rm91bmQgJiZcbiAgICAgICAgICB0aGlzLnF1ZXJ5T25CaW5kICYmIHRoaXMuZGF0YUFycmF5ICYmIHRoaXMuZGF0YUFycmF5Lmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5jYWNoZVF1ZXJpZWQpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5RGF0YSgpO1xuICAgICAgICB9IGVsc2UgaWYgKCFxdWVyeUlmTm90Rm91bmQgJiYgdGhpcy5kYXRhQXJyYXkgJiYgdGhpcy5kYXRhQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignSXQgd2FzIHNldCB0aGUgdmFsdWUgJyArIHRoaXMudmFsdWUudmFsdWUgKyAnIHRvIHRoZSBjb21wb25lbnQgJyArIHRoaXMub2F0dHIgKyAnIGJ1dCB0aGlzIHZhbHVlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhIGFycmF5IGFuZCB0aGlzIHZhbHVlIHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZCcpO1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWUodm9pZCAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUJ5VmFsdWVDb2x1bW5UeXBlKHZhbDogYW55KSB7XG4gICAgbGV0IHZhbHVlID0gdmFsO1xuXG4gICAgaWYgKHRoaXMudmFsdWVDb2x1bW5UeXBlID09PSBDb2Rlcy5UWVBFX0lOVCkge1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICB2YWx1ZSA9IHBhcnNlZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgc2V0VmFsdWUodmFsOiBhbnksIG9wdGlvbnM/OiBGb3JtVmFsdWVPcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnBhcnNlQnlWYWx1ZUNvbHVtblR5cGUodmFsKTtcbiAgICBzdXBlci5zZXRWYWx1ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBzZXREYXRhKHZhbDogYW55KSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnBhcnNlQnlWYWx1ZUNvbHVtblR5cGUodmFsKTtcbiAgICBzdXBlci5zZXREYXRhKHZhbHVlKTtcbiAgfVxuXG4gIGdldFNlbGVjdGVkUmVjb3JkKCkge1xuICAgIGxldCByZXN1bHQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoc2VsZWN0ZWRWYWx1ZSkpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0RGF0YUFycmF5KCkuZmluZChpdGVtID0+IGl0ZW1bdGhpcy52YWx1ZUNvbHVtbl0gPT09IHNlbGVjdGVkVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgbG9hZCgpOiBhbnkge1xuICAgIGNvbnN0IHpvbmUgPSB0aGlzLmluamVjdG9yLmdldChOZ1pvbmUpO1xuICAgIGNvbnN0IGxvYWRPYnNlcnZ