ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
358 lines • 52.5 kB
JavaScript
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