dbweb-common
Version:
用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上
650 lines • 48.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { EventEmitter, Injectable } from '@angular/core';
import { BehaviorSubject, forkJoin } from 'rxjs';
import { startWith, tap } from 'rxjs/operators';
import { map2WithLetter } from '../../services/eleview/mapletter';
import { ElementBackFace } from './back-face';
import { FillAt } from './bill-param';
import { ImportStyle } from './import-param';
/**
* @record
*/
function IElementData() { }
if (false) {
/** @type {?} */
IElementData.prototype.Tabs;
/** @type {?} */
IElementData.prototype.parent;
}
/**
* @record
*/
export function IProcess() { }
if (false) {
/** @type {?} */
IProcess.prototype.Name;
/** @type {?|undefined} */
IProcess.prototype.Icon;
/** @type {?|undefined} */
IProcess.prototype.Color;
/** @type {?|undefined} */
IProcess.prototype.ElementName;
/** @type {?} */
IProcess.prototype.BindRecord;
/** @type {?|undefined} */
IProcess.prototype.TransPath;
/** @type {?|undefined} */
IProcess.prototype.TransQuery;
/** @type {?|undefined} */
IProcess.prototype.WithSql;
/** @type {?|undefined} */
IProcess.prototype.Visable;
/** @type {?|undefined} */
IProcess.prototype.MoreStr;
}
var ElementDataRecordView = /** @class */ (function () {
function ElementDataRecordView(parent) {
this.parent = parent;
this.Tabs = ['取数SQL', '默认显示列', '处理列表', '标签', '条件模板'];
this.inited = new EventEmitter();
this.currentProcess = new BehaviorSubject(null);
}
Object.defineProperty(ElementDataRecordView.prototype, "Params", {
get: /**
* @return {?}
*/
function () {
return (/** @type {?} */ (this.parent.Params));
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
ElementDataRecordView.prototype.init = /**
* @return {?}
*/
function () {
var _this = this;
forkJoin([
this.parent.back.fetchDB(),
this.parent.back.fetchElementNames(),
this.parent.back.fetchTables(this.Params.DB)
]).subscribe((/**
* @param {?} v
* @return {?}
*/
function (v) {
_this.DBList = v[0];
_this.allElementNames = v[1];
_this.Tables = v[2];
_this.refreshProcesses();
if (_this.bindRecordProcesses && _this.bindRecordProcesses.length > 0) {
_this.currentProcess.next(_this.bindRecordProcesses[0]);
}
else if (_this.notBindRecordProcesses && _this.notBindRecordProcesses.length > 0) {
_this.currentProcess.next(_this.notBindRecordProcesses[0]);
}
if (_this.Params.ConditionalTemplates && _this.Params.ConditionalTemplates.length > 0) {
_this.currentConditionTemplate = _this.Params.ConditionalTemplates[0];
}
_this.checkSQL().subscribe();
_this.inited.emit();
}));
};
/**
* @return {?}
*/
ElementDataRecordView.prototype.refreshTables = /**
* @return {?}
*/
function () {
var _this = this;
this.parent.back.fetchTables(this.Params.DB).subscribe((/**
* @param {?} v
* @return {?}
*/
function (v) { return (_this.Tables = v); }));
};
/**
* @return {?}
*/
ElementDataRecordView.prototype.refreshProcesses = /**
* @return {?}
*/
function () {
this.bindRecordProcesses = (this.Params.Processes || []).filter((/**
* @param {?} v
* @return {?}
*/
function (v) { return v.BindRecord; }));
this.notBindRecordProcesses = (this.Params.Processes || []).filter((/**
* @param {?} v
* @return {?}
*/
function (v) { return !v.BindRecord; }));
};
// 将分开的处理列表合并成一个
// 将分开的处理列表合并成一个
/**
* @return {?}
*/
ElementDataRecordView.prototype.collectionProcesses =
// 将分开的处理列表合并成一个
/**
* @return {?}
*/
function () {
this.Params.Processes = tslib_1.__spread(this.bindRecordProcesses, this.notBindRecordProcesses);
};
/**
* @return {?}
*/
ElementDataRecordView.prototype.checkSQL = /**
* @return {?}
*/
function () {
var _this = this;
return this.parent.back
.checkSQL({
DB: this.Params.DB,
Table: this.Params.TableName,
ManualPage: this.Params.ManualPage,
SQL: this.Params.Sql
})
.pipe(tap((/**
* @param {?} v
* @return {?}
*/
function (v) {
_this.SQLCheckError = v.Error;
if (!_this.SQLCheckError) {
// 要把旧的类型复制过来
_this.Params.AllColumns = v.Columns.map((/**
* @param {?} col
* @return {?}
*/
function (col) {
/** @type {?} */
var t = col.Type;
if (_this.Params.AllColumns) {
/** @type {?} */
var oldCol = _this.Params.AllColumns.find((/**
* @param {?} fv
* @return {?}
*/
function (fv) { return fv.Name === col.Name; }));
if (oldCol) {
t = oldCol.Type;
}
}
return {
Name: col.Name,
Type: t
};
}));
_this.allColumnNames = _this.Params.AllColumns.map((/**
* @param {?} vv
* @return {?}
*/
function (vv) { return vv.Name; }));
_this.allColumnWithLetter = map2WithLetter(_this.allColumnNames);
// 删除不存在的列
if (_this.Params.Columns) {
_this.Params.Columns = _this.Params.Columns.filter((/**
* @param {?} col
* @return {?}
*/
function (col) {
return _this.allColumnNames.includes(col.Name);
}));
}
}
})));
};
return ElementDataRecordView;
}());
export { ElementDataRecordView };
if (false) {
/** @type {?} */
ElementDataRecordView.prototype.labelCategories;
/** @type {?} */
ElementDataRecordView.prototype.Tabs;
/** @type {?} */
ElementDataRecordView.prototype.DBList;
/** @type {?} */
ElementDataRecordView.prototype.Tables;
/** @type {?} */
ElementDataRecordView.prototype.allElementNames;
/** @type {?} */
ElementDataRecordView.prototype.SQLCheckError;
/** @type {?} */
ElementDataRecordView.prototype.allColumnNames;
/** @type {?} */
ElementDataRecordView.prototype.allColumnWithLetter;
/** @type {?} */
ElementDataRecordView.prototype.bindRecordProcesses;
/** @type {?} */
ElementDataRecordView.prototype.notBindRecordProcesses;
/** @type {?} */
ElementDataRecordView.prototype.inited;
/** @type {?} */
ElementDataRecordView.prototype.currentProcess;
/** @type {?} */
ElementDataRecordView.prototype.currentConditionTemplate;
/** @type {?} */
ElementDataRecordView.prototype.parent;
}
var ElementDataImport = /** @class */ (function () {
function ElementDataImport(parent) {
this.parent = parent;
this.Tabs = ['字段设置', '属性'];
}
Object.defineProperty(ElementDataImport.prototype, "Params", {
get: /**
* @return {?}
*/
function () {
return (/** @type {?} */ (this.parent.Params));
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
ElementDataImport.prototype.init = /**
* @return {?}
*/
function () {
var _this = this;
return forkJoin([this.parent.back.fetchDB(), this.parent.back.fetchTables(this.Params.DB)]).pipe(tap((/**
* @param {?} v
* @return {?}
*/
function (v) {
_this.DBList = v[0];
_this.Tables = v[1];
_this.syncTableColumn();
})));
};
// 根据表名,同步最新的字段清单
// 根据表名,同步最新的字段清单
/**
* @return {?}
*/
ElementDataImport.prototype.syncTableColumn =
// 根据表名,同步最新的字段清单
/**
* @return {?}
*/
function () {
var _this = this;
this.parent.back.fetchTableColumns(this.Params.Table).subscribe((/**
* @param {?} v
* @return {?}
*/
function (v) {
_this.Params.Fields = v.map((/**
* @param {?} one
* @return {?}
*/
function (one) {
/** @type {?} */
var found = _this.Params.Fields.find((/**
* @param {?} sv
* @return {?}
*/
function (sv) { return sv.Name === one; }));
if (found) {
return found;
}
return (/** @type {?} */ ({
Name: one,
Style: ImportStyle.Normal
}));
}));
}));
};
/**
* @return {?}
*/
ElementDataImport.prototype.refreshTables = /**
* @return {?}
*/
function () {
var _this = this;
this.parent.back.fetchTables(this.Params.DB).subscribe((/**
* @param {?} v
* @return {?}
*/
function (v) {
_this.Tables = v;
}));
};
return ElementDataImport;
}());
export { ElementDataImport };
if (false) {
/** @type {?} */
ElementDataImport.prototype.Tabs;
/** @type {?} */
ElementDataImport.prototype.DBList;
/** @type {?} */
ElementDataImport.prototype.Tables;
/** @type {?} */
ElementDataImport.prototype.parent;
}
var ElementDataUpdate = /** @class */ (function () {
function ElementDataUpdate(parent) {
this.parent = parent;
this.Tabs = ['设置'];
}
Object.defineProperty(ElementDataUpdate.prototype, "Params", {
get: /**
* @return {?}
*/
function () {
return (/** @type {?} */ (this.parent.Params));
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
ElementDataUpdate.prototype.isAllSelected = /**
* @return {?}
*/
function () {
return this.Params.Fields && this.Params.Fields.find((/**
* @param {?} v
* @return {?}
*/
function (v) { return !v.selected; })) === undefined;
};
/**
* @return {?}
*/
ElementDataUpdate.prototype.hasSelected = /**
* @return {?}
*/
function () {
return this.Params.Fields && this.Params.Fields.find((/**
* @param {?} v
* @return {?}
*/
function (v) { return v.selected; })) !== undefined;
};
/**
* @return {?}
*/
ElementDataUpdate.prototype.init = /**
* @return {?}
*/
function () {
var _this = this;
this.parent.back.fetchDB().subscribe((/**
* @param {?} v
* @return {?}
*/
function (v) { return (_this.DBList = v); }));
this.refreshTables();
};
/**
* @return {?}
*/
ElementDataUpdate.prototype.refreshTables = /**
* @return {?}
*/
function () {
var _this = this;
this.parent.back.fetchTables(this.Params.DB).subscribe((/**
* @param {?} v
* @return {?}
*/
function (v) { return (_this.Tables = v); }));
};
return ElementDataUpdate;
}());
export { ElementDataUpdate };
if (false) {
/** @type {?} */
ElementDataUpdate.prototype.Tabs;
/** @type {?} */
ElementDataUpdate.prototype.DBList;
/** @type {?} */
ElementDataUpdate.prototype.Tables;
/** @type {?} */
ElementDataUpdate.prototype.parent;
}
var ElementDataBill = /** @class */ (function () {
function ElementDataBill(parent) {
var _this = this;
this.parent = parent;
this.Tabs = ['设置'];
this.parent.init.subscribe((/**
* @return {?}
*/
function () {
_this.parent.bill.formGroup
.get('Controller')
.valueChanges.pipe(startWith(_this.parent.bill.formGroup.get('Controller').value))
.subscribe((/**
* @param {?} v
* @return {?}
*/
function (v) {
// 如果是单据,则需要修复填充列的设置
/** @type {?} */
var ctrl = _this.parent.Controllers.find((/**
* @param {?} c
* @return {?}
*/
function (c) { return c.Name === v; }));
if (ctrl && ctrl.Bill) {
_this.parent.back.fetchBillMainColumns(v).subscribe((/**
* @param {?} cols
* @return {?}
*/
function (cols) {
_this.MainColumns = cols;
_this.fixFieldSettings(cols.map((/**
* @param {?} c
* @return {?}
*/
function (c) { return c.Name; })));
_this.fixCloneSettings();
}));
}
}));
}));
}
Object.defineProperty(ElementDataBill.prototype, "Param", {
get: /**
* @return {?}
*/
function () {
return (/** @type {?} */ (this.parent.Params));
},
enumerable: true,
configurable: true
});
/**
* @param {?} cols
* @return {?}
*/
ElementDataBill.prototype.fixFieldSettings = /**
* @param {?} cols
* @return {?}
*/
function (cols) {
var _this = this;
this.Param.FieldSettings = cols.map((/**
* @param {?} col
* @return {?}
*/
function (col) {
/** @type {?} */
var foundField;
if (_this.Param && _this.Param.FieldSettings) {
foundField = _this.Param.FieldSettings.find((/**
* @param {?} fld
* @return {?}
*/
function (fld) { return fld.Name === col; }));
}
if (foundField) {
return foundField;
}
return (/** @type {?} */ ({
Name: col,
Fill: '',
FillAt: FillAt.SkipFill,
Visibility: ''
}));
}));
};
/**
* @return {?}
*/
ElementDataBill.prototype.fixCloneSettings = /**
* @return {?}
*/
function () {
/** @type {?} */
var old = tslib_1.__spread((this.Param.ClonePrimaryKeySettings || []));
if (this.Param.AllowClone) {
this.Param.ClonePrimaryKeySettings = this.MainColumns.filter((/**
* @param {?} v
* @return {?}
*/
function (v) { return v.PrimaryKey; })).map((/**
* @param {?} v
* @return {?}
*/
function (v) {
/** @type {?} */
var oldField = old.find((/**
* @param {?} o
* @return {?}
*/
function (o) { return o.Name === v.Name; }));
return (/** @type {?} */ ({
Name: v.Name,
Fill: oldField ? oldField.Fill : '{{.SRC}}',
Visibility: oldField ? oldField.Visibility : ''
}));
}));
console.log(this.Param.ClonePrimaryKeySettings);
}
else {
this.Param.ClonePrimaryKeySettings = null;
}
};
return ElementDataBill;
}());
export { ElementDataBill };
if (false) {
/** @type {?} */
ElementDataBill.prototype.Tabs;
/** @type {?} */
ElementDataBill.prototype.MainColumns;
/** @type {?} */
ElementDataBill.prototype.parent;
}
var ElementService = /** @class */ (function () {
function ElementService(back) {
this.back = back;
this.init = new EventEmitter();
this.BaseActive = true;
this.data = {
recordview: new ElementDataRecordView(this),
import: new ElementDataImport(this),
update: new ElementDataUpdate(this),
bill: new ElementDataBill(this)
};
}
/**
* @param {?} ele
* @return {?}
*/
ElementService.prototype.onInit = /**
* @param {?} ele
* @return {?}
*/
function (ele) {
var _this = this;
this.back.element = ele;
this.back.fetchElementInitData(this.bill.typeRecord.Name).subscribe((/**
* @param {?} v
* @return {?}
*/
function (v) {
_this.Controllers = v.Controllers;
_this.Categories = v.Categories;
_this.CategoriesEN = v.CategoriesEN;
if (v.CanSelectRoles) {
_this.Roles = v.CanSelectRoles.map((/**
* @param {?} sv
* @return {?}
*/
function (sv) { return ({
Name: sv,
OldChecked: v.Roles && v.Roles.find((/**
* @param {?} vv
* @return {?}
*/
function (vv) { return vv === sv; })) !== undefined,
Checked: false,
Modify: false
}); }));
_this.Roles.forEach((/**
* @param {?} role
* @return {?}
*/
function (role) { return (role.Checked = role.OldChecked); }));
}
_this.init.emit();
}));
};
ElementService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
ElementService.ctorParameters = function () { return [
{ type: ElementBackFace }
]; };
return ElementService;
}());
export { ElementService };
if (false) {
/** @type {?} */
ElementService.prototype.bill;
/** @type {?} */
ElementService.prototype.init;
/** @type {?} */
ElementService.prototype.Controllers;
/** @type {?} */
ElementService.prototype.Categories;
/** @type {?} */
ElementService.prototype.CategoriesEN;
/** @type {?} */
ElementService.prototype.BaseActive;
/** @type {?} */
ElementService.prototype.ActiveTab;
/** @type {?} */
ElementService.prototype.Roles;
/** @type {?} */
ElementService.prototype.Params;
/** @type {?} */
ElementService.prototype.data;
/** @type {?} */
ElementService.prototype.back;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGJ3ZWItY29tbW9uLyIsInNvdXJjZXMiOlsibGliL2VsZW1lbnQvc2VydmljZS9lbGVtZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVsRSxPQUFPLEVBQWMsZUFBZSxFQUFjLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBMkIsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9ELE9BQU8sRUFBNEIsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFJdkUsMkJBR0M7OztJQUZBLDRCQUFlOztJQUNmLDhCQUF1Qjs7Ozs7QUFFeEIsOEJBV0M7OztJQVZBLHdCQUFhOztJQUNiLHdCQUFjOztJQUNkLHlCQUFlOztJQUNmLCtCQUFxQjs7SUFDckIsOEJBQW9COztJQUNwQiw2QkFBcUI7O0lBQ3JCLDhCQUFvQjs7SUFDcEIsMkJBQWtCOztJQUNsQiwyQkFBaUI7O0lBQ2pCLDJCQUFpQjs7QUFHbEI7SUFrQkMsK0JBQW1CLE1BQXNCO1FBQXRCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBaEJ6QyxTQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFVaEQsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFJNUIsbUJBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBVyxJQUFJLENBQUMsQ0FBQztJQUVULENBQUM7SUFMN0Ms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RSxFQUFFO29CQUNSLFVBQVUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSTs7OztvQkFBQyxVQUFBLEVBQUUsSUFBSSxPQUFBLEVBQUUsS0FBSyxFQUFFLEVBQVQsQ0FBUyxFQUFDLEtBQUssU0FBUztvQkFDbEUsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsTUFBTSxFQUFFLEtBQUs7aUJBQ2IsQ0FBQyxFQUxzQyxDQUt0QyxFQUFDLENBQUM7Z0JBQ0osS0FBSSxDQUFDLEtBQUssQ0FBQyxPQUFPOzs7O2dCQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBaEMsQ0FBZ0MsRUFBQyxDQUFDO2FBQzdEO1lBQ0QsS0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixDQUFDLEVBQUMsQ0FBQztJQUNKLENBQUM7O2dCQXZDRCxVQUFVOzs7O2dCQWhQVSxlQUFlOztJQXdScEMscUJBQUM7Q0FBQSxBQXhDRCxJQXdDQztTQXZDWSxjQUFjOzs7SUFDMUIsOEJBQW9COztJQUNwQiw4QkFBMEI7O0lBQzFCLHFDQUEwQjs7SUFDMUIsb0NBQXFCOztJQUNyQixzQ0FBdUI7O0lBQ3ZCLG9DQUFrQjs7SUFDbEIsbUNBQWtCOztJQUNsQiwrQkFJSTs7SUFDSixnQ0FBWTs7SUFDWiw4QkFLRTs7SUFDVSw4QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRWxlbWVudFJvdXRlLCBQcmltYXJ5S2V5U2V0dGluZyB9IGZyb20gJ2Rid2ViLWNvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN0YXJ0V2l0aCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBCaWxsQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYmlsbC9iaWxsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1vZGVsRWxlbWVudENhdGVnb3J5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZWxldmlldy9lbGV2aWV3LWJhY2tmYWNlJztcclxuaW1wb3J0IHsgbWFwMldpdGhMZXR0ZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lbGV2aWV3L21hcGxldHRlcic7XHJcbmltcG9ydCB7IENvbHVtbnNXaXRoTGV0dGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZWxldmlldy90eXBlcy9tb2RlbCc7XHJcbmltcG9ydCB7IENvbnRyb2xsZXIsIEVsZW1lbnRCYWNrRmFjZSwgTWFpbkNvbHVtbiB9IGZyb20gJy4vYmFjay1mYWNlJztcclxuaW1wb3J0IHsgQmlsbFBhcmFtLCBGaWVsZFNldHRpbmcsIEZpbGxBdCB9IGZyb20gJy4vYmlsbC1wYXJhbSc7XHJcbmltcG9ydCB7IEltcG9ydFBhcmFtLCBJbXBvcnRGaWVsZCwgSW1wb3J0U3R5bGUgfSBmcm9tICcuL2ltcG9ydC1wYXJhbSc7XHJcbmltcG9ydCB7IENvbmRpdGlvbmFsVGVtcGxhdGUsIFJlY29yZFZpZXdQYXJhbSB9IGZyb20gJy4vcmVjb3Jkdmlldy1wYXJhbSc7XHJcbmltcG9ydCB7IFVwZGF0ZVBhcmFtIH0gZnJvbSAnLi91cGRhdGUucGFyYW0nO1xyXG5cclxuaW50ZXJmYWNlIElFbGVtZW50RGF0YSB7XHJcblx0VGFiczogc3RyaW5nW107XHJcblx0cGFyZW50OiBFbGVtZW50U2VydmljZTtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIElQcm9jZXNzIHtcclxuXHROYW1lOiBzdHJpbmc7XHJcblx0SWNvbj86IHN0cmluZzsgLy8gW25hbWVzcGFjZV06W25hbWVdIOeahOaWueW8j1xyXG5cdENvbG9yPzogc3RyaW5nOyAvLyDosIPoibLmnb/oibLlj7flkI3np7DvvIzpu5jorqTkuLrnqbpcclxuXHRFbGVtZW50TmFtZT86IHN0cmluZztcclxuXHRCaW5kUmVjb3JkOiBib29sZWFuOyAvLyDkvKDpgJLliLDkuIvkuIDkuKrlt6XkvZzlhYPntKDnmoTot6/lvoTkuIrvvIzkuIDoiKznlKjmnaXkvKDpgJLkuLvplK7vvIzlpoLmnpzkuLrnqbrliJnoh6rliqjkvKDpgJLooajnmoTkuLvplK5cclxuXHRUcmFuc1BhdGg/OiBzdHJpbmdbXTsgLy8g5Lyg6YCS5Yiw5LiL5LiA5Liq5bel5L2c5YWD57Sg55qE5Y+C5pWw77yM55So5qih5p2/5p2l5a6M5oiQLFxyXG5cdFRyYW5zUXVlcnk/OiBzdHJpbmc7IC8vIOS4gOiIrOaYr+eUqOadpeS8oOmAkuWIsOWPpuS4gOS4qlJlY29yZFZpZXfnmoTpmYTliqDmnaHku7blj4rmoIfpophcclxuXHRXaXRoU3FsPzogYm9vbGVhbjsgLy8g5piv5ZCm5Lyg6YCSc3FsXHJcblx0VmlzYWJsZT86IHN0cmluZzsgLy8g6Z2e56m655qE6K+d6K6h566X5Y+v6KeB5oCn77yM55SodGVtcGxhdGVy55qE6K+t5rOVXHJcblx0TW9yZVN0cj86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEVsZW1lbnREYXRhUmVjb3JkVmlldyBpbXBsZW1lbnRzIElFbGVtZW50RGF0YSB7XHJcblx0bGFiZWxDYXRlZ29yaWVzOiBNb2RlbEVsZW1lbnRDYXRlZ29yeVtdO1xyXG5cdFRhYnMgPSBbJ+WPluaVsFNRTCcsICfpu5jorqTmmL7npLrliJcnLCAn5aSE55CG5YiX6KGoJywgJ+agh+etvicsICfmnaHku7bmqKHmnb8nXTtcclxuXHREQkxpc3Q6IHN0cmluZ1tdO1xyXG5cdFRhYmxlczogc3RyaW5nW107XHJcblx0YWxsRWxlbWVudE5hbWVzOiBzdHJpbmdbXTtcclxuXHRTUUxDaGVja0Vycm9yOiBzdHJpbmc7XHJcblx0YWxsQ29sdW1uTmFtZXM6IHN0cmluZ1tdO1xyXG5cdGFsbENvbHVtbldpdGhMZXR0ZXI6IENvbHVtbnNXaXRoTGV0dGVyW107XHJcblx0Ly8g5LuOcGFyYW1zLnByb2Nlc3Nlc+S4rei9rOaNouiAjOadpVxyXG5cdGJpbmRSZWNvcmRQcm9jZXNzZXM6IElQcm9jZXNzW107XHJcblx0bm90QmluZFJlY29yZFByb2Nlc3NlczogSVByb2Nlc3NbXTtcclxuXHRpbml0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblx0Z2V0IFBhcmFtcygpIHtcclxuXHRcdHJldHVybiB0aGlzLnBhcmVudC5QYXJhbXMgYXMgUmVjb3JkVmlld1BhcmFtO1xyXG5cdH1cclxuXHRjdXJyZW50UHJvY2VzcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SVByb2Nlc3M+KG51bGwpO1xyXG5cdGN1cnJlbnRDb25kaXRpb25UZW1wbGF0ZTogQ29uZGl0aW9uYWxUZW1wbGF0ZTtcclxuXHRjb25zdHJ1Y3RvcihwdWJsaWMgcGFyZW50OiBFbGVtZW50U2VydmljZSkge31cclxuXHRpbml0KCkge1xyXG5cdFx0Zm9ya0pvaW4oW1xyXG5cdFx0XHR0aGlzLnBhcmVudC5iYWNrLmZldGNoREIoKSxcclxuXHRcdFx0dGhpcy5wYXJlbnQuYmFjay5mZXRjaEVsZW1lbnROYW1lcygpLFxyXG5cdFx0XHR0aGlzLnBhcmVudC5iYWNrLmZldGNoVGFibGVzKHRoaXMuUGFyYW1zLkRCKVxyXG5cdFx0XSkuc3Vic2NyaWJlKHYgPT4ge1xyXG5cdFx0XHR0aGlzLkRCTGlzdCA9IHZbMF07XHJcblx0XHRcdHRoaXMuYWxsRWxlbWVudE5hbWVzID0gdlsxXTtcclxuXHRcdFx0dGhpcy5UYWJsZXMgPSB2WzJdO1xyXG5cclxuXHRcdFx0dGhpcy5yZWZyZXNoUHJvY2Vzc2VzKCk7XHJcblx0XHRcdGlmICh0aGlzLmJpbmRSZWNvcmRQcm9jZXNzZXMgJiYgdGhpcy5iaW5kUmVjb3JkUHJvY2Vzc2VzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHR0aGlzLmN1cnJlbnRQcm9jZXNzLm5leHQodGhpcy5iaW5kUmVjb3JkUHJvY2Vzc2VzWzBdKTtcclxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLm5vdEJpbmRSZWNvcmRQcm9jZXNzZXMgJiYgdGhpcy5ub3RCaW5kUmVjb3JkUHJvY2Vzc2VzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHR0aGlzLmN1cnJlbnRQcm9jZXNzLm5leHQodGhpcy5ub3RCaW5kUmVjb3JkUHJvY2Vzc2VzWzBdKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy5QYXJhbXMuQ29uZGl0aW9uYWxUZW1wbGF0ZXMgJiYgdGhpcy5QYXJhbXMuQ29uZGl0aW9uYWxUZW1wbGF0ZXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdHRoaXMuY3VycmVudENvbmRpdGlvblRlbXBsYXRlID0gdGhpcy5QYXJhbXMuQ29uZGl0aW9uYWxUZW1wbGF0ZXNbMF07XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5jaGVja1NRTCgpLnN1YnNjcmliZSgpO1xyXG5cclxuXHRcdFx0dGhpcy5pbml0ZWQuZW1pdCgpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdHB1YmxpYyByZWZyZXNoVGFibGVzKCkge1xyXG5cdFx0dGhpcy5wYXJlbnQuYmFjay5mZXRjaFRhYmxlcyh0aGlzLlBhcmFtcy5EQikuc3Vic2NyaWJlKHYgPT4gKHRoaXMuVGFibGVzID0gdikpO1xyXG5cdH1cclxuXHRwdWJsaWMgcmVmcmVzaFByb2Nlc3NlcygpIHtcclxuXHRcdHRoaXMuYmluZFJlY29yZFByb2Nlc3NlcyA9ICh0aGlzLlBhcmFtcy5Qcm9jZXNzZXMgfHwgW10pLmZpbHRlcih2ID0+IHYuQmluZFJlY29yZCk7XHJcblx0XHR0aGlzLm5vdEJpbmRSZWNvcmRQcm9jZXNzZXMgPSAodGhpcy5QYXJhbXMuUHJvY2Vzc2VzIHx8IFtdKS5maWx0ZXIodiA9PiAhdi5CaW5kUmVjb3JkKTtcclxuXHR9XHJcblxyXG5cdC8vIOWwhuWIhuW8gOeahOWkhOeQhuWIl+ihqOWQiOW5tuaIkOS4gOS4qlxyXG5cdGNvbGxlY3Rpb25Qcm9jZXNzZXMoKSB7XHJcblx0XHR0aGlzLlBhcmFtcy5Qcm9jZXNzZXMgPSBbLi4udGhpcy5iaW5kUmVjb3JkUHJvY2Vzc2VzLCAuLi50aGlzLm5vdEJpbmRSZWNvcmRQcm9jZXNzZXNdO1xyXG5cdH1cclxuXHJcblx0Y2hlY2tTUUwoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuYmFja1xyXG5cdFx0XHQuY2hlY2tTUUwoe1xyXG5cdFx0XHRcdERCOiB0aGlzLlBhcmFtcy5EQixcclxuXHRcdFx0XHRUYWJsZTogdGhpcy5QYXJhbXMuVGFibGVOYW1lLFxyXG5cdFx0XHRcdE1hbnVhbFBhZ2U6IHRoaXMuUGFyYW1zLk1hbnVhbFBhZ2UsXHJcblx0XHRcdFx0U1FMOiB0aGlzLlBhcmFtcy5TcWxcclxuXHRcdFx0fSlcclxuXHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0dGFwKHYgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5TUUxDaGVja0Vycm9yID0gdi5FcnJvcjtcclxuXHRcdFx0XHRcdGlmICghdGhpcy5TUUxDaGVja0Vycm9yKSB7XHJcblx0XHRcdFx0XHRcdC8vIOimgeaKiuaXp+eahOexu+Wei+WkjeWItui/h+adpVxyXG5cdFx0XHRcdFx0XHR0aGlzLlBhcmFtcy5BbGxDb2x1bW5zID0gdi5Db2x1bW5zLm1hcChjb2wgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdGxldCB0ID0gY29sLlR5cGU7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuUGFyYW1zLkFsbENvbHVtbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9sZENvbCA9IHRoaXMuUGFyYW1zLkFsbENvbHVtbnMuZmluZChmdiA9PiBmdi5OYW1lID09PSBjb2wuTmFtZSk7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAob2xkQ29sKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHQgPSBvbGRDb2wuVHlwZTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0XHRcdE5hbWU6IGNvbC5OYW1lLFxyXG5cdFx0XHRcdFx0XHRcdFx0VHlwZTogdFxyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmFsbENvbHVtbk5hbWVzID0gdGhpcy5QYXJhbXMuQWxsQ29sdW1ucy5tYXAodnYgPT4gdnYuTmFtZSk7XHJcblx0XHRcdFx0XHRcdHRoaXMuYWxsQ29sdW1uV2l0aExldHRlciA9IG1hcDJXaXRoTGV0dGVyKHRoaXMuYWxsQ29sdW1uTmFtZXMpO1xyXG5cdFx0XHRcdFx0XHQvLyDliKDpmaTkuI3lrZjlnKjnmoTliJdcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuUGFyYW1zLkNvbHVtbnMpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLlBhcmFtcy5Db2x1bW5zID0gdGhpcy5QYXJhbXMuQ29sdW1ucy5maWx0ZXIoY29sID0+XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmFsbENvbHVtbk5hbWVzLmluY2x1ZGVzKGNvbC5OYW1lKVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KVxyXG5cdFx0XHQpO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEVsZW1lbnREYXRhSW1wb3J0IGltcGxlbWVudHMgSUVsZW1lbnREYXRhIHtcclxuXHRUYWJzOiBzdHJpbmdbXSA9IFsn5a2X5q616K6+572uJywgJ+WxnuaApyddO1xyXG5cdGNvbnN0cnVjdG9yKHB1YmxpYyBwYXJlbnQ6IEVsZW1lbnRTZXJ2aWNlKSB7fVxyXG5cdERCTGlzdDogc3RyaW5nW107XHJcblx0VGFibGVzOiBzdHJpbmdbXTtcclxuXHRnZXQgUGFyYW1zKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMucGFyZW50LlBhcmFtcyBhcyBJbXBvcnRQYXJhbTtcclxuXHR9XHJcblxyXG5cdGluaXQoKSB7XHJcblx0XHRyZXR1cm4gZm9ya0pvaW4oW3RoaXMucGFyZW50LmJhY2suZmV0Y2hEQigpLCB0aGlzLnBhcmVudC5iYWNrLmZldGNoVGFibGVzKHRoaXMuUGFyYW1zLkRCKV0pLnBpcGUoXHJcblx0XHRcdHRhcCh2ID0+IHtcclxuXHRcdFx0XHR0aGlzLkRCTGlzdCA9IHZbMF07XHJcblx0XHRcdFx0dGhpcy5UYWJsZXMgPSB2WzFdO1xyXG5cdFx0XHRcdHRoaXMuc3luY1RhYmxlQ29sdW1uKCk7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cdH1cclxuXHQvLyDmoLnmja7ooajlkI3vvIzlkIzmraXmnIDmlrDnmoTlrZfmrrXmuIXljZVcclxuXHRzeW5jVGFibGVDb2x1bW4oKSB7XHJcblx0XHR0aGlzLnBhcmVudC5iYWNrLmZldGNoVGFibGVDb2x1bW5zKHRoaXMuUGFyYW1zLlRhYmxlKS5zdWJzY3JpYmUodiA9PiB7XHJcblx0XHRcdHRoaXMuUGFyYW1zLkZpZWxkcyA9IHYubWFwKG9uZSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgZm91bmQgPSB0aGlzLlBhcmFtcy5GaWVsZHMuZmluZChzdiA9PiBzdi5OYW1lID09PSBvbmUpO1xyXG5cdFx0XHRcdGlmIChmb3VuZCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZvdW5kO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0TmFtZTogb25lLFxyXG5cdFx0XHRcdFx0U3R5bGU6IEltcG9ydFN0eWxlLk5vcm1hbFxyXG5cdFx0XHRcdH0gYXMgSW1wb3J0RmllbGQ7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdHJlZnJlc2hUYWJsZXMoKSB7XHJcblx0XHR0aGlzLnBhcmVudC5iYWNrLmZldGNoVGFibGVzKHRoaXMuUGFyYW1zLkRCKS5zdWJzY3JpYmUodiA9PiB7XHJcblx0XHRcdHRoaXMuVGFibGVzID0gdjtcclxuXHRcdH0pO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEVsZW1lbnREYXRhVXBkYXRlIGltcGxlbWVudHMgSUVsZW1lbnREYXRhIHtcclxuXHRUYWJzOiBzdHJpbmdbXSA9IFsn6K6+572uJ107XHJcblx0REJMaXN0OiBzdHJpbmdbXTtcclxuXHRUYWJsZXM6IHN0cmluZ1tdO1xyXG5cdGNvbnN0cnVjdG9yKHB1YmxpYyBwYXJlbnQ6IEVsZW1lbnRTZXJ2aWNlKSB7fVxyXG5cdGdldCBQYXJhbXMoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuUGFyYW1zIGFzIFVwZGF0ZVBhcmFtO1xyXG5cdH1cclxuXHRpc0FsbFNlbGVjdGVkKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuUGFyYW1zLkZpZWxkcyAmJiB0aGlzLlBhcmFtcy5GaWVsZHMuZmluZCh2ID0+ICF2LnNlbGVjdGVkKSA9PT0gdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRoYXNTZWxlY3RlZCgpIHtcclxuXHRcdHJldHVybiB0aGlzLlBhcmFtcy5GaWVsZHMgJiYgdGhpcy5QYXJhbXMuRmllbGRzLmZpbmQodiA9PiB2LnNlbGVjdGVkKSAhPT0gdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0aW5pdCgpIHtcclxuXHRcdHRoaXMucGFyZW50LmJhY2suZmV0Y2hEQigpLnN1YnNjcmliZSh2ID0+ICh0aGlzLkRCTGlzdCA9IHYpKTtcclxuXHRcdHRoaXMucmVmcmVzaFRhYmxlcygpO1xyXG5cdH1cclxuXHRyZWZyZXNoVGFibGVzKCkge1xyXG5cdFx0dGhpcy5wYXJlbnQuYmFjay5mZXRjaFRhYmxlcyh0aGlzLlBhcmFtcy5EQikuc3Vic2NyaWJlKHYgPT4gKHRoaXMuVGFibGVzID0gdikpO1xyXG5cdH1cclxufVxyXG5leHBvcnQgY2xhc3MgRWxlbWVudERhdGFCaWxsIGltcGxlbWVudHMgSUVsZW1lbnREYXRhIHtcclxuXHRUYWJzID0gWyforr7nva4nXTtcclxuXHRNYWluQ29sdW1uczogTWFpbkNvbHVtbltdO1xyXG5cdGdldCBQYXJhbSgpIHtcclxuXHRcdHJldHVybiB0aGlzLnBhcmVudC5QYXJhbXMgYXMgQmlsbFBhcmFtO1xyXG5cdH1cclxuXHRmaXhGaWVsZFNldHRpbmdzKGNvbHM6IHN0cmluZ1tdKSB7XHJcblx0XHR0aGlzLlBhcmFtLkZpZWxkU2V0dGluZ3MgPSBjb2xzLm1hcChjb2wgPT4ge1xyXG5cdFx0XHRsZXQgZm91bmRGaWVsZDogRmllbGRTZXR0aW5nO1xyXG5cdFx0XHRpZiAodGhpcy5QYXJhbSAmJiB0aGlzLlBhcmFtLkZpZWxkU2V0dGluZ3MpIHtcclxuXHRcdFx0XHRmb3VuZEZpZWxkID0gdGhpcy5QYXJhbS5GaWVsZFNldHRpbmdzLmZpbmQoZmxkID0+IGZsZC5OYW1lID09PSBjb2wpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChmb3VuZEZpZWxkKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZvdW5kRmllbGQ7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHROYW1lOiBjb2wsXHJcblx0XHRcdFx0RmlsbDogJycsXHJcblx0XHRcdFx0RmlsbEF0OiBGaWxsQXQuU2tpcEZpbGwsXHJcblx0XHRcdFx0VmlzaWJpbGl0eTogJydcclxuXHRcdFx0fSBhcyBGaWVsZFNldHRpbmc7XHJcblx0XHR9KTtcclxuXHR9XHJcblx0Zml4Q2xvbmVTZXR0aW5ncygpIHtcclxuXHRcdGNvbnN0IG9sZCA9IFsuLi4odGhpcy5QYXJhbS5DbG9uZVByaW1hcnlLZXlTZXR0aW5ncyB8fCBbXSldO1xyXG5cdFx0aWYgKHRoaXMuUGFyYW0uQWxsb3dDbG9uZSkge1xyXG5cdFx0XHR0aGlzLlBhcmFtLkNsb25lUHJpbWFyeUtleVNldHRpbmdzID0gdGhpcy5NYWluQ29sdW1ucy5maWx0ZXIodiA9PiB2LlByaW1hcnlLZXkpLm1hcCh2ID0+IHtcclxuXHRcdFx0XHRjb25zdCBvbGRGaWVsZCA9IG9sZC5maW5kKG8gPT4gby5OYW1lID09PSB2Lk5hbWUpO1xyXG5cdFx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0XHROYW1lOiB2Lk5hbWUsXHJcblx0XHRcdFx0XHRGaWxsOiBvbGRGaWVsZCA/IG9sZEZpZWxkLkZpbGwgOiAne3suU1JDfX0nLFxyXG5cdFx0XHRcdFx0VmlzaWJpbGl0eTogb2xkRmllbGQgPyBvbGRGaWVsZC5WaXNpYmlsaXR5IDogJydcclxuXHRcdFx0XHR9IGFzIFByaW1hcnlLZXlTZXR0aW5nO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0Y29uc29sZS5sb2codGhpcy5QYXJhbS5DbG9uZVByaW1hcnlLZXlTZXR0aW5ncyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLlBhcmFtLkNsb25lUHJpbWFyeUtleVNldHRpbmdzID0gbnVsbDtcclxuXHRcdH1cclxuXHR9XHJcblx0Y29uc3RydWN0b3IocHVibGljIHBhcmVudDogRWxlbWVudFNlcnZpY2UpIHtcclxuXHRcdHRoaXMucGFyZW50LmluaXQuc3Vic2NyaWJlKCgpID0+IHtcclxuXHRcdFx0dGhpcy5wYXJlbnQuYmlsbC5mb3JtR3JvdXBcclxuXHRcdFx0XHQuZ2V0KCdDb250cm9sbGVyJylcclxuXHRcdFx0XHQudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMucGFyZW50LmJpbGwuZm9ybUdyb3VwLmdldCgnQ29udHJvbGxlcicpLnZhbHVlKSlcclxuXHRcdFx0XHQuc3Vic2NyaWJlKHYgPT4ge1xyXG5cdFx0XHRcdFx0Ly8g5aaC5p6c5piv5Y2V5o2u77yM5YiZ6ZyA6KaB5L+u5aSN5aGr5YWF5YiX55qE6K6+572uXHJcblx0XHRcdFx0XHRjb25zdCBjdHJsID0gdGhpcy5wYXJlbnQuQ29udHJvbGxlcnMuZmluZChjID0+IGMuTmFtZSA9PT0gdik7XHJcblx0XHRcdFx0XHRpZiAoY3RybCAmJiBjdHJsLkJpbGwpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wYXJlbnQuYmFjay5mZXRjaEJpbGxNYWluQ29sdW1ucyh2KS5zdWJzY3JpYmUoY29scyA9PiB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5NYWluQ29sdW1ucyA9IGNvbHM7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5maXhGaWVsZFNldHRpbmdzKGNvbHMubWFwKGMgPT4gYy5OYW1lKSk7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5maXhDbG9uZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEVsZW1lbnRTZXJ2aWNlIHtcclxuXHRiaWxsOiBCaWxsQ29tcG9uZW50O1xyXG5cdGluaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblx0Q29udHJvbGxlcnM6IENvbnRyb2xsZXJbXTtcclxuXHRDYXRlZ29yaWVzOiBzdHJpbmdbXTtcclxuXHRDYXRlZ29yaWVzRU46IHN0cmluZ1tdO1xyXG5cdEJhc2VBY3RpdmUgPSB0cnVlO1xyXG5cdEFjdGl2ZVRhYjogc3RyaW5nO1xyXG5cdFJvbGVzOiB7XHJcblx0XHROYW1lOiBzdHJpbmc7XHJcblx0XHRDaGVja2VkOiBib29sZWFuO1xyXG5cdFx0T2xkQ2hlY2tlZDogYm9vbGVhbjtcclxuXHR9W107XHJcblx0UGFyYW1zOiBhbnk7XHJcblx0ZGF0YTogeyBba2V5OiBzdHJpbmddOiBJRWxlbWVudERhdGEgfSA9IHtcclxuXHRcdHJlY29yZHZpZXc6IG5ldyBFbGVtZW50RGF0YVJlY29yZFZpZXcodGhpcyksXHJcblx0XHRpbXBvcnQ6IG5ldyBFbGVtZW50RGF0YUltcG9ydCh0aGlzKSxcclxuXHRcdHVwZGF0ZTogbmV3IEVsZW1lbnREYXRhVXBkYXRlKHRoaXMpLFxyXG5cdFx0YmlsbDogbmV3IEVsZW1lbnREYXRhQmlsbCh0aGlzKVxyXG5cdH07XHJcblx0Y29uc3RydWN0b3IocHVibGljIGJhY2s6IEVsZW1lbnRCYWNrRmFjZSkge31cclxuXHRvbkluaXQoZWxlOiBFbGVtZW50Um91dGUpIHtcclxuXHRcdHRoaXMuYmFjay5lbGVtZW50ID0gZWxlO1xyXG5cdFx0dGhpcy5iYWNrLmZldGNoRWxlbWVudEluaXREYXRhKHRoaXMuYmlsbC50eXBlUmVjb3JkLk5hbWUpLnN1YnNjcmliZSh2ID0+IHtcclxuXHRcdFx0dGhpcy5Db250cm9sbGVycyA9IHYuQ29udHJvbGxlcnM7XHJcblx0XHRcdHRoaXMuQ2F0ZWdvcmllcyA9IHYuQ2F0ZWdvcmllcztcclxuXHRcdFx0dGhpcy5DYXRlZ29yaWVzRU4gPSB2LkNhdGVnb3JpZXNFTjtcclxuXHRcdFx0aWYgKHYuQ2FuU2VsZWN0Um9sZXMpIHtcclxuXHRcdFx0XHR0aGlzLlJvbGVzID0gdi5DYW5TZWxlY3RSb2xlcy5tYXAoc3YgPT4gKHtcclxuXHRcdFx0XHRcdE5hbWU6IHN2LFxyXG5cdFx0XHRcdFx0T2xkQ2hlY2tlZDogdi5Sb2xlcyAmJiB2LlJvbGVzLmZpbmQodnYgPT4gdnYgPT09IHN2KSAhPT0gdW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0Q2hlY2tlZDogZmFsc2UsXHJcblx0XHRcdFx0XHRNb2RpZnk6IGZhbHNlXHJcblx0XHRcdFx0fSkpO1xyXG5cdFx0XHRcdHRoaXMuUm9sZXMuZm9yRWFjaChyb2xlID0+IChyb2xlLkNoZWNrZWQgPSByb2xlLk9sZENoZWNrZWQpKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmluaXQuZW1pdCgpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcbiJdfQ==