@provoly/dashboard 1.2.3 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/components/data-format/data-format.pipe.mjs +2 -2
- package/esm2022/widgets/widget-analytic/component/widget-analytic.component.mjs +3 -3
- package/esm2022/widgets/widget-map/component/widget-map.component.mjs +3 -3
- package/fesm2022/provoly-dashboard-components-data-format.mjs +1 -1
- package/fesm2022/provoly-dashboard-components-data-format.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs +2 -2
- package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-map.mjs +2 -2
- package/fesm2022/provoly-dashboard-widgets-widget-map.mjs.map +1 -1
- package/package.json +31 -31
- package/styles/components/_o-widget.scss +1 -1
- package/styles-theme/components-theme/_o-widget.theme.scss +4 -1
- package/widgets/widget-analytic/component/widget-analytic.component.d.ts +1 -1
|
@@ -24,9 +24,9 @@ const toLocaleString = (value) => {
|
|
|
24
24
|
case 'number':
|
|
25
25
|
return new Intl.NumberFormat().format(value);
|
|
26
26
|
case 'string':
|
|
27
|
-
return
|
|
27
|
+
return value;
|
|
28
28
|
default:
|
|
29
29
|
return value;
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1mb3JtYXQucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL2NvbXBvbmVudHMvZGF0YS1mb3JtYXQvZGF0YS1mb3JtYXQucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7QUFHcEQsTUFBTSxPQUFPLGNBQWM7SUFDekIsZ0JBQWUsQ0FBQztJQUVoQixTQUFTLENBQUMsS0FBVyxFQUFFLFFBQWtCLEVBQUUsTUFBZSxFQUFFLEdBQUcsSUFBVztRQUN4RSxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE1BQU0sR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxNQUFNLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7UUFDakMsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7OEdBYlUsY0FBYzs0R0FBZCxjQUFjOzsyRkFBZCxjQUFjO2tCQUQxQixJQUFJO21CQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRTs7QUFpQjVCLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBdUIsRUFBRSxFQUFFO0lBQ2pELFFBQVEsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNyQixLQUFLLFFBQVE7WUFDWCxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxLQUFLLFFBQVE7WUFDWCxPQUFPLEtBQUssQ0FBQztRQUNmO1lBQ0UsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQFBpcGUoeyBuYW1lOiAnZGF0YUZvcm1hdCcgfSlcbmV4cG9ydCBjbGFzcyBEYXRhRm9ybWF0UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgdHJhbnNmb3JtKHZhbHVlPzogYW55LCB0b0xvY2FsZT86IGJvb2xlYW4sIHN1ZmZpeD86IHN0cmluZywgLi4uYXJnczogYW55W10pOiBhbnkge1xuICAgIGxldCByZXN1bHQgPSB2YWx1ZTtcbiAgICBpZiAodG9Mb2NhbGUpIHtcbiAgICAgIHJlc3VsdCA9IHRvTG9jYWxlU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHN1ZmZpeCkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgJyAnICsgc3VmZml4O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY29uc3QgdG9Mb2NhbGVTdHJpbmcgPSAodmFsdWU/OiBzdHJpbmcgfCBudW1iZXIpID0+IHtcbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgpLmZvcm1hdCh2YWx1ZSk7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHZhbHVlO1xuICB9XG59O1xuIl19
|
|
@@ -174,10 +174,10 @@ export class WidgetAnalyticComponent extends DataWidgetComponent {
|
|
|
174
174
|
});
|
|
175
175
|
}
|
|
176
176
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: WidgetAnalyticComponent, deps: [{ token: i1.Store }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
177
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.3", type: WidgetAnalyticComponent, selector: "pry-widget-analytic", usesInheritance: true, ngImport: i0, template: "<pry-widget-analytic-css></pry-widget-analytic-css>\n<div class=\"o-widget o-widget__analytic\">\n <pry-widget-header\n *ngIf=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n #header\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n class=\"o-settings\"\n >\n <div class=\"o-settings__fields\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"primaryProp\">{{ '@pry.widget.analytic.primaryProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"change($event, 'primaryProp')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.primaryProp\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"primaryProp\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"secondaryProp\">{{ '@pry.widget.analytic.secondaryProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"change($event, 'secondaryProp')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.secondaryProp\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"secondaryProp\"\n [clearable]=\"true\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"verticalProp\">{{ '@pry.widget.analytic.verticalProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"change($event, 'verticalProp')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.verticalProp\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"verticalProp\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"valueProp\">{{ '@pry.widget.analytic.valueProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"change($event, 'valueProp')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.valueProp\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"valueProp\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"toggleColorConfig($event)\" [ngModel]=\"!!optionsCopy.colorConfig\">\n {{ '@pry.widget.analytic.colorConfig' | i18n }}\n </pry-checkbox>\n @if (optionsCopy.colorConfig) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"colorProp\">{{ '@pry.widget.analytic.colorProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeColorConfig($event, 'prop')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.colorConfig.prop\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"colorProp\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"colorProp\">{{ '@pry.widget.analytic.colors' | i18n }}</label>\n <div\n class=\"o-widget__analytic__color-picker-container u-display-flex -align-center\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n cdkDropListOrientation=\"horizontal\"\n >\n @for (color of optionsCopy.colorConfig.colors; track color; let i = $index) {\n <div class=\"o-widget__analytic__color-picker\" cdkDrag>\n <pry-color-picker\n [ngModel]=\"color\"\n (ngModelChange)=\"modifyColorScheme($event, i)\"\n ></pry-color-picker>\n <button (click)=\"removeColor(i)\" class=\"o-widget__analytic__color-picker-remove\">\n <pry-icon iconSvg=\"close\" [height]=\"15\" [width]=\"15\"></pry-icon>\n </button>\n <div *cdkDragPreview>\n <pry-color-picker [ngModel]=\"color\"></pry-color-picker>\n </div>\n </div>\n }\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only o-widget__analytic__color-picker-add\"\n (click)=\"modifyColorScheme()\"\n >\n <pry-icon iconSvg=\"add\" [height]=\"20\" [width]=\"20\"></pry-icon>\n </button>\n </div>\n </div>\n }\n </div>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"toggleFormat($event)\" [ngModel]=\"!!optionsCopy.format\">\n {{ '@pry.widget.analytic.format' | i18n }}\n </pry-checkbox>\n @if (optionsCopy.format) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"format\">{{ '@pry.widget.analytic.suffix' | i18n }}</label>\n <input\n type=\"text\"\n class=\"a-form-field\"\n id=\"format\"\n [ngModel]=\"optionsCopy.format.suffix\"\n (ngModelChange)=\"changeFormat($event)\"\n />\n </div>\n }\n </div>\n </div>\n </pry-settings>\n </pry-widget-header>\n <div class=\"o-widget__analytic__table\">\n <table [style.height.px]=\"height$ | async\">\n <thead>\n <tr class=\"primary-header\">\n <th></th>\n @for (primary of primaryProperty$ | async; track primary) {\n <th [colSpan]=\"(secondaryProperty$ | async)?.length ?? 1\">\n {{ primary }}\n </th>\n }\n </tr>\n @if (optionsCopy.secondaryProp) {\n <tr class=\"secondary-header\">\n <th></th>\n @for (primary of primaryProperty$ | async; track primary) {\n @for (secondary of secondaryProperty$ | async; track secondary) {\n <th>{{ secondary }}</th>\n }\n }\n </tr>\n }\n </thead>\n <tbody>\n @for (line of lines$ | async; track line.name) {\n <tr>\n <th>{{ line.name }}</th>\n @for (primary of primaryProperty$ | async; track primary) {\n @if (optionsCopy.secondaryProp) {\n @for (secondary of secondaryProperty$ | async; track secondary) {\n <td\n [ngStyle]=\"\n optionsCopy.colorConfig ? { 'background-color': (colorMap$ | async)?.[line.name]?.[primary] } : {}\n \"\n >\n {{ line.value[primary][secondary] | dataFormat: true : optionsCopy.format?.suffix\n </td>\n }\n } @else {\n <td\n [ngStyle]=\"\n optionsCopy.colorConfig ? { 'background-color': (colorMap$ | async)?.[line.name]?.[primary] } : {}\n \"\n >\n {{ line.value[primary] | dataFormat: true : optionsCopy.format?.suffix }}\n </td>\n }\n }\n </tr>\n }\n </tbody>\n <tfoot>\n @for (line of totals$ | async; track line.name) {\n <tr class=\"partial-total\">\n <th>{{ line.name }}</th>\n @for (primary of primaryProperty$ | async; track primary) {\n @for (secondary of secondaryProperty$ | async; track secondary) {\n <td>\n {{ line.value[primary][secondary] }}\n </td>\n }\n }\n </tr>\n }\n @for (line of grandTotals$ | async; track line.name) {\n <tr class=\"grand-total\">\n <th>{{ line.name }}</th>\n @for (primary of primaryProperty$ | async; track primary) {\n <td [colSpan]=\"(secondaryProperty$ | async)?.length ?? 1\">\n {{ line.value[primary] }}\n </td>\n }\n </tr>\n }\n </tfoot>\n </table>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.SettingsComponent, selector: "pry-settings", inputs: ["widgetIndex", "isDisable", "headerPresent", "open$", "header"], outputs: ["triggerClick", "saveTriggered", "changeTitle"] }, { kind: "component", type: i4.PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: ["manifest", "openData$", "additionalOptions", "headerOptions", "displayCount", "datasourceIds", "widgetIndex"], outputs: ["manifestModified"] }, { kind: "component", type: i4.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "isForm", "required", "name", "readonly", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked"] }, { kind: "component", type: i4.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i5.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle"] }, { kind: "component", type: i6.PryColorPickerComponent, selector: "pry-color-picker" }, { kind: "directive", type: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i7.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "component", type: i8.PryWidgetAnalyticCssComponent, selector: "pry-widget-analytic-css" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.I18nPipe, name: "i18n" }, { kind: "pipe", type: i9.DataFormatPipe, name: "dataFormat" }] }); }
|
|
177
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.3", type: WidgetAnalyticComponent, selector: "pry-widget-analytic", usesInheritance: true, ngImport: i0, template: "<pry-widget-analytic-css></pry-widget-analytic-css>\n<div class=\"o-widget o-widget__analytic\">\n <pry-widget-header\n *ngIf=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n #header\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n class=\"o-settings\"\n >\n <div class=\"o-settings__fields\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"primaryProp\">{{ '@pry.widget.analytic.primaryProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"change($event, 'primaryProp')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.primaryProp\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"primaryProp\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"secondaryProp\">{{ '@pry.widget.analytic.secondaryProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"change($event, 'secondaryProp')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.secondaryProp\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"secondaryProp\"\n [clearable]=\"true\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"verticalProp\">{{ '@pry.widget.analytic.verticalProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"change($event, 'verticalProp')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.verticalProp\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"verticalProp\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"valueProp\">{{ '@pry.widget.analytic.valueProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"change($event, 'valueProp')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.valueProp\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"valueProp\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"toggleColorConfig($event)\" [ngModel]=\"!!optionsCopy.colorConfig\">\n {{ '@pry.widget.analytic.colorConfig' | i18n }}\n </pry-checkbox>\n @if (optionsCopy.colorConfig) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"colorProp\">{{ '@pry.widget.analytic.colorProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeColorConfig($event, 'prop')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.colorConfig.prop\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"colorProp\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"colorProp\">{{ '@pry.widget.analytic.colors' | i18n }}</label>\n <div\n class=\"o-widget__analytic__color-picker-container u-display-flex -align-center\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n cdkDropListOrientation=\"horizontal\"\n >\n @for (color of optionsCopy.colorConfig.colors; track color; let i = $index) {\n <div class=\"o-widget__analytic__color-picker\" cdkDrag>\n <pry-color-picker\n [ngModel]=\"color\"\n (ngModelChange)=\"modifyColorScheme($event, i)\"\n ></pry-color-picker>\n <button (click)=\"removeColor(i)\" class=\"o-widget__analytic__color-picker-remove\">\n <pry-icon iconSvg=\"close\" [height]=\"15\" [width]=\"15\"></pry-icon>\n </button>\n <div *cdkDragPreview>\n <pry-color-picker [ngModel]=\"color\"></pry-color-picker>\n </div>\n </div>\n }\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only o-widget__analytic__color-picker-add\"\n (click)=\"modifyColorScheme()\"\n >\n <pry-icon iconSvg=\"add\" [height]=\"20\" [width]=\"20\"></pry-icon>\n </button>\n </div>\n </div>\n }\n </div>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"toggleFormat($event)\" [ngModel]=\"!!optionsCopy.format\">\n {{ '@pry.widget.analytic.format' | i18n }}\n </pry-checkbox>\n @if (optionsCopy.format) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"format\">{{ '@pry.widget.analytic.suffix' | i18n }}</label>\n <input\n type=\"text\"\n class=\"a-form-field\"\n id=\"format\"\n [ngModel]=\"optionsCopy.format.suffix\"\n (ngModelChange)=\"changeFormat($event)\"\n />\n </div>\n }\n </div>\n </div>\n </pry-settings>\n </pry-widget-header>\n <div class=\"o-widget__analytic__table\">\n <table [style.height.px]=\"height$ | async\">\n <thead>\n <tr class=\"primary-header\">\n <th></th>\n @for (primary of primaryProperty$ | async; track primary) {\n <th [colSpan]=\"(secondaryProperty$ | async)?.length ?? 1\">\n {{ primary }}\n </th>\n }\n </tr>\n @if (optionsCopy.secondaryProp) {\n <tr class=\"secondary-header\">\n <th></th>\n @for (primary of primaryProperty$ | async; track primary) {\n @for (secondary of secondaryProperty$ | async; track secondary) {\n <th>{{ secondary }}</th>\n }\n }\n </tr>\n }\n </thead>\n <tbody>\n @for (line of lines$ | async; track line.name) {\n <tr>\n <th>{{ line.name }}</th>\n @for (primary of primaryProperty$ | async; track primary) {\n @if (optionsCopy.secondaryProp) {\n @for (secondary of secondaryProperty$ | async; track secondary) {\n <td\n [ngStyle]=\"\n optionsCopy.colorConfig ? { 'background-color': (colorMap$ | async)?.[line.name]?.[primary] } : {}\n \"\n >\n {{ line.value[primary][secondary] | dataFormat: true : optionsCopy.format?.suffix }}\n </td>\n }\n } @else {\n <td\n [ngStyle]=\"\n optionsCopy.colorConfig ? { 'background-color': (colorMap$ | async)?.[line.name]?.[primary] } : {}\n \"\n >\n {{ line.value[primary] | dataFormat: true : optionsCopy.format?.suffix }}\n </td>\n }\n }\n </tr>\n }\n </tbody>\n <tfoot>\n @for (line of totals$ | async; track line.name) {\n <tr class=\"partial-total\">\n <th>{{ line.name }}</th>\n @for (primary of primaryProperty$ | async; track primary) {\n @for (secondary of secondaryProperty$ | async; track secondary) {\n <td>\n {{ line.value[primary][secondary] }}\n </td>\n }\n }\n </tr>\n }\n @for (line of grandTotals$ | async; track line.name) {\n <tr class=\"grand-total\">\n <th>{{ line.name }}</th>\n @for (primary of primaryProperty$ | async; track primary) {\n <td [colSpan]=\"(secondaryProperty$ | async)?.length ?? 1\">\n {{ line.value[primary] }}\n </td>\n }\n </tr>\n }\n </tfoot>\n </table>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.SettingsComponent, selector: "pry-settings", inputs: ["widgetIndex", "isDisable", "headerPresent", "open$", "header"], outputs: ["triggerClick", "saveTriggered", "changeTitle"] }, { kind: "component", type: i4.PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: ["manifest", "openData$", "additionalOptions", "headerOptions", "displayCount", "datasourceIds", "widgetIndex"], outputs: ["manifestModified"] }, { kind: "component", type: i4.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "isForm", "required", "name", "readonly", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked"] }, { kind: "component", type: i4.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i5.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle"] }, { kind: "component", type: i6.PryColorPickerComponent, selector: "pry-color-picker" }, { kind: "directive", type: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i7.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "component", type: i8.PryWidgetAnalyticCssComponent, selector: "pry-widget-analytic-css" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.I18nPipe, name: "i18n" }, { kind: "pipe", type: i9.DataFormatPipe, name: "dataFormat" }] }); }
|
|
178
178
|
}
|
|
179
179
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: WidgetAnalyticComponent, decorators: [{
|
|
180
180
|
type: Component,
|
|
181
|
-
args: [{ selector: 'pry-widget-analytic', template: "<pry-widget-analytic-css></pry-widget-analytic-css>\n<div class=\"o-widget o-widget__analytic\">\n <pry-widget-header\n *ngIf=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n #header\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n class=\"o-settings\"\n >\n <div class=\"o-settings__fields\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"primaryProp\">{{ '@pry.widget.analytic.primaryProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"change($event, 'primaryProp')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.primaryProp\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"primaryProp\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"secondaryProp\">{{ '@pry.widget.analytic.secondaryProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"change($event, 'secondaryProp')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.secondaryProp\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"secondaryProp\"\n [clearable]=\"true\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"verticalProp\">{{ '@pry.widget.analytic.verticalProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"change($event, 'verticalProp')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.verticalProp\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"verticalProp\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"valueProp\">{{ '@pry.widget.analytic.valueProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"change($event, 'valueProp')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.valueProp\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"valueProp\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"toggleColorConfig($event)\" [ngModel]=\"!!optionsCopy.colorConfig\">\n {{ '@pry.widget.analytic.colorConfig' | i18n }}\n </pry-checkbox>\n @if (optionsCopy.colorConfig) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"colorProp\">{{ '@pry.widget.analytic.colorProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeColorConfig($event, 'prop')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.colorConfig.prop\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"colorProp\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"colorProp\">{{ '@pry.widget.analytic.colors' | i18n }}</label>\n <div\n class=\"o-widget__analytic__color-picker-container u-display-flex -align-center\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n cdkDropListOrientation=\"horizontal\"\n >\n @for (color of optionsCopy.colorConfig.colors; track color; let i = $index) {\n <div class=\"o-widget__analytic__color-picker\" cdkDrag>\n <pry-color-picker\n [ngModel]=\"color\"\n (ngModelChange)=\"modifyColorScheme($event, i)\"\n ></pry-color-picker>\n <button (click)=\"removeColor(i)\" class=\"o-widget__analytic__color-picker-remove\">\n <pry-icon iconSvg=\"close\" [height]=\"15\" [width]=\"15\"></pry-icon>\n </button>\n <div *cdkDragPreview>\n <pry-color-picker [ngModel]=\"color\"></pry-color-picker>\n </div>\n </div>\n }\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only o-widget__analytic__color-picker-add\"\n (click)=\"modifyColorScheme()\"\n >\n <pry-icon iconSvg=\"add\" [height]=\"20\" [width]=\"20\"></pry-icon>\n </button>\n </div>\n </div>\n }\n </div>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"toggleFormat($event)\" [ngModel]=\"!!optionsCopy.format\">\n {{ '@pry.widget.analytic.format' | i18n }}\n </pry-checkbox>\n @if (optionsCopy.format) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"format\">{{ '@pry.widget.analytic.suffix' | i18n }}</label>\n <input\n type=\"text\"\n class=\"a-form-field\"\n id=\"format\"\n [ngModel]=\"optionsCopy.format.suffix\"\n (ngModelChange)=\"changeFormat($event)\"\n />\n </div>\n }\n </div>\n </div>\n </pry-settings>\n </pry-widget-header>\n <div class=\"o-widget__analytic__table\">\n <table [style.height.px]=\"height$ | async\">\n <thead>\n <tr class=\"primary-header\">\n <th></th>\n @for (primary of primaryProperty$ | async; track primary) {\n <th [colSpan]=\"(secondaryProperty$ | async)?.length ?? 1\">\n {{ primary }}\n </th>\n }\n </tr>\n @if (optionsCopy.secondaryProp) {\n <tr class=\"secondary-header\">\n <th></th>\n @for (primary of primaryProperty$ | async; track primary) {\n @for (secondary of secondaryProperty$ | async; track secondary) {\n <th>{{ secondary }}</th>\n }\n }\n </tr>\n }\n </thead>\n <tbody>\n @for (line of lines$ | async; track line.name) {\n <tr>\n <th>{{ line.name }}</th>\n @for (primary of primaryProperty$ | async; track primary) {\n @if (optionsCopy.secondaryProp) {\n @for (secondary of secondaryProperty$ | async; track secondary) {\n <td\n [ngStyle]=\"\n optionsCopy.colorConfig ? { 'background-color': (colorMap$ | async)?.[line.name]?.[primary] } : {}\n \"\n >\n {{ line.value[primary][secondary] | dataFormat: true : optionsCopy.format?.suffix\n </td>\n }\n } @else {\n <td\n [ngStyle]=\"\n optionsCopy.colorConfig ? { 'background-color': (colorMap$ | async)?.[line.name]?.[primary] } : {}\n \"\n >\n {{ line.value[primary] | dataFormat: true : optionsCopy.format?.suffix }}\n </td>\n }\n }\n </tr>\n }\n </tbody>\n <tfoot>\n @for (line of totals$ | async; track line.name) {\n <tr class=\"partial-total\">\n <th>{{ line.name }}</th>\n @for (primary of primaryProperty$ | async; track primary) {\n @for (secondary of secondaryProperty$ | async; track secondary) {\n <td>\n {{ line.value[primary][secondary] }}\n </td>\n }\n }\n </tr>\n }\n @for (line of grandTotals$ | async; track line.name) {\n <tr class=\"grand-total\">\n <th>{{ line.name }}</th>\n @for (primary of primaryProperty$ | async; track primary) {\n <td [colSpan]=\"(secondaryProperty$ | async)?.length ?? 1\">\n {{ line.value[primary] }}\n </td>\n }\n </tr>\n }\n </tfoot>\n </table>\n </div>\n</div>\n" }]
|
|
181
|
+
args: [{ selector: 'pry-widget-analytic', template: "<pry-widget-analytic-css></pry-widget-analytic-css>\n<div class=\"o-widget o-widget__analytic\">\n <pry-widget-header\n *ngIf=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n #header\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n class=\"o-settings\"\n >\n <div class=\"o-settings__fields\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"primaryProp\">{{ '@pry.widget.analytic.primaryProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"change($event, 'primaryProp')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.primaryProp\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"primaryProp\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"secondaryProp\">{{ '@pry.widget.analytic.secondaryProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"change($event, 'secondaryProp')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.secondaryProp\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"secondaryProp\"\n [clearable]=\"true\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"verticalProp\">{{ '@pry.widget.analytic.verticalProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"change($event, 'verticalProp')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.verticalProp\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"verticalProp\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"valueProp\">{{ '@pry.widget.analytic.valueProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"change($event, 'valueProp')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.valueProp\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"valueProp\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"toggleColorConfig($event)\" [ngModel]=\"!!optionsCopy.colorConfig\">\n {{ '@pry.widget.analytic.colorConfig' | i18n }}\n </pry-checkbox>\n @if (optionsCopy.colorConfig) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"colorProp\">{{ '@pry.widget.analytic.colorProp' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeColorConfig($event, 'prop')\"\n [items]=\"availableProperties$ | async\"\n [ngModel]=\"optionsCopy.colorConfig.prop\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"colorProp\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"colorProp\">{{ '@pry.widget.analytic.colors' | i18n }}</label>\n <div\n class=\"o-widget__analytic__color-picker-container u-display-flex -align-center\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n cdkDropListOrientation=\"horizontal\"\n >\n @for (color of optionsCopy.colorConfig.colors; track color; let i = $index) {\n <div class=\"o-widget__analytic__color-picker\" cdkDrag>\n <pry-color-picker\n [ngModel]=\"color\"\n (ngModelChange)=\"modifyColorScheme($event, i)\"\n ></pry-color-picker>\n <button (click)=\"removeColor(i)\" class=\"o-widget__analytic__color-picker-remove\">\n <pry-icon iconSvg=\"close\" [height]=\"15\" [width]=\"15\"></pry-icon>\n </button>\n <div *cdkDragPreview>\n <pry-color-picker [ngModel]=\"color\"></pry-color-picker>\n </div>\n </div>\n }\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only o-widget__analytic__color-picker-add\"\n (click)=\"modifyColorScheme()\"\n >\n <pry-icon iconSvg=\"add\" [height]=\"20\" [width]=\"20\"></pry-icon>\n </button>\n </div>\n </div>\n }\n </div>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"toggleFormat($event)\" [ngModel]=\"!!optionsCopy.format\">\n {{ '@pry.widget.analytic.format' | i18n }}\n </pry-checkbox>\n @if (optionsCopy.format) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"format\">{{ '@pry.widget.analytic.suffix' | i18n }}</label>\n <input\n type=\"text\"\n class=\"a-form-field\"\n id=\"format\"\n [ngModel]=\"optionsCopy.format.suffix\"\n (ngModelChange)=\"changeFormat($event)\"\n />\n </div>\n }\n </div>\n </div>\n </pry-settings>\n </pry-widget-header>\n <div class=\"o-widget__analytic__table\">\n <table [style.height.px]=\"height$ | async\">\n <thead>\n <tr class=\"primary-header\">\n <th></th>\n @for (primary of primaryProperty$ | async; track primary) {\n <th [colSpan]=\"(secondaryProperty$ | async)?.length ?? 1\">\n {{ primary }}\n </th>\n }\n </tr>\n @if (optionsCopy.secondaryProp) {\n <tr class=\"secondary-header\">\n <th></th>\n @for (primary of primaryProperty$ | async; track primary) {\n @for (secondary of secondaryProperty$ | async; track secondary) {\n <th>{{ secondary }}</th>\n }\n }\n </tr>\n }\n </thead>\n <tbody>\n @for (line of lines$ | async; track line.name) {\n <tr>\n <th>{{ line.name }}</th>\n @for (primary of primaryProperty$ | async; track primary) {\n @if (optionsCopy.secondaryProp) {\n @for (secondary of secondaryProperty$ | async; track secondary) {\n <td\n [ngStyle]=\"\n optionsCopy.colorConfig ? { 'background-color': (colorMap$ | async)?.[line.name]?.[primary] } : {}\n \"\n >\n {{ line.value[primary][secondary] | dataFormat: true : optionsCopy.format?.suffix }}\n </td>\n }\n } @else {\n <td\n [ngStyle]=\"\n optionsCopy.colorConfig ? { 'background-color': (colorMap$ | async)?.[line.name]?.[primary] } : {}\n \"\n >\n {{ line.value[primary] | dataFormat: true : optionsCopy.format?.suffix }}\n </td>\n }\n }\n </tr>\n }\n </tbody>\n <tfoot>\n @for (line of totals$ | async; track line.name) {\n <tr class=\"partial-total\">\n <th>{{ line.name }}</th>\n @for (primary of primaryProperty$ | async; track primary) {\n @for (secondary of secondaryProperty$ | async; track secondary) {\n <td>\n {{ line.value[primary][secondary] }}\n </td>\n }\n }\n </tr>\n }\n @for (line of grandTotals$ | async; track line.name) {\n <tr class=\"grand-total\">\n <th>{{ line.name }}</th>\n @for (primary of primaryProperty$ | async; track primary) {\n <td [colSpan]=\"(secondaryProperty$ | async)?.length ?? 1\">\n {{ line.value[primary] }}\n </td>\n }\n </tr>\n }\n </tfoot>\n </table>\n </div>\n</div>\n" }]
|
|
182
182
|
}], ctorParameters: () => [{ type: i1.Store }, { type: i0.ElementRef }] });
|
|
183
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWFuYWx5dGljLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL3dpZGdldHMvd2lkZ2V0LWFuYWx5dGljL2NvbXBvbmVudC93aWRnZXQtYW5hbHl0aWMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtYW5hbHl0aWMvY29tcG9uZW50L3dpZGdldC1hbmFseXRpYy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFLTCxjQUFjLEVBQ2QsbUJBQW1CLEVBR25CLG9CQUFvQixFQUNyQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFjLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVqRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBT3hDLE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxtQkFBbUI7SUFpQjlELE1BQU0sQ0FBQyxNQUFjLEVBQUUsSUFBb0U7UUFDekYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQXlCLEVBQUUsSUFBdUI7UUFDbEUsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDWixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVksQ0FBQyxJQUFJLEdBQUcsTUFBZ0IsQ0FBQztnQkFDdEQsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFZLENBQUMsTUFBTSxHQUFHLE1BQWtCLENBQUM7Z0JBQzFELE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsTUFBYyxFQUFFLElBQUksR0FBRyxRQUFRO1FBQzFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDM0MsQ0FBQztJQUVELFlBQVksS0FBaUIsRUFBRSxFQUFjO1FBQzNDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUF0Q25CLGdCQUFXLEdBQTBCLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBdUMzRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBMEIsQ0FBQyxDQUFDLENBQUM7UUFDMUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDeEUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDakYsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDMUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFDNUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQ2hGLENBQUM7UUFDRixJQUFJLENBQUMsa0JBQWtCLEdBQUcsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzVFLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQzlDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxhQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDdEYsQ0FBQztRQUNGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDM0UsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUNwRixDQUFDO1FBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDeEUsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUNwRixDQUFDO1FBQ0YsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM3RSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ3BGLENBQUM7UUFFRixJQUFJLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQztZQUMxQixJQUFJLENBQUMsUUFBUTtZQUNiLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxVQUFVO1NBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUNqRSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQ2pGLENBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDO1lBQzNCLElBQUksQ0FBQyxRQUFRO1lBQ2IsSUFBSSxDQUFDLGdCQUFnQjtZQUNyQixJQUFJLENBQUMsa0JBQWtCO1lBQ3ZCLElBQUksQ0FBQyxjQUFjO1lBQ25CLElBQUksQ0FBQyxVQUFVO1NBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUNqRSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQ2pGLENBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxRQUFRO1lBQ2IsSUFBSSxDQUFDLGdCQUFnQjtZQUNyQixJQUFJLENBQUMsbUJBQW1CO1lBQ3hCLElBQUksQ0FBQyxVQUFVO1NBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ2pELElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FDNUUsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUM7WUFDN0IsSUFBSSxDQUFDLFFBQVE7WUFDYixJQUFJLENBQUMsVUFBVTtZQUNmLElBQUksQ0FBQyxpQkFBaUI7WUFDdEIsSUFBSSxDQUFDLGdCQUFnQjtTQUN0QixDQUFDLENBQUMsSUFBSSxDQUNMLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQzVDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FDL0YsQ0FBQztRQUVGLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDOUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLE1BQU0sY0FBYyxHQUFHLGdCQUFnQjtpQkFDcEMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxDQUFDO2lCQUN6RCxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQVksQ0FBQztZQUNuQyxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLG1CQUFtQixDQUFDLElBQVUsRUFBRSxJQUFhLEVBQUUsZUFBd0I7UUFDN0UsT0FBTyxlQUFlLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBMEIsQ0FBQyxLQUFLLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbkgsQ0FBQztJQUVPLGNBQWMsQ0FDcEIsYUFBdUIsRUFDdkIsWUFBc0IsRUFDdEIsY0FBb0MsRUFDcEMsRUFBYSxFQUNiLE9BQThCLEVBQzlCLEtBQWM7UUFFZCxPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNwQyxNQUFNLEtBQUssR0FBRyxFQUFxRCxDQUFDO1lBQ3BFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDL0IsQ0FBQyxjQUFjLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO29CQUNwRCxNQUFNLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ2xFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDUCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDO3dCQUM1RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDO3dCQUNoRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDO3dCQUM5RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQ3RELENBQUM7b0JBQ0YsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQ25CLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDOzRCQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0NBQ3BCLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7NEJBQ3RCLENBQUM7NEJBQ0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFJLFlBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBMEIsQ0FBQyxLQUFLLENBQUM7d0JBQzFHLENBQUM7NkJBQU0sQ0FBQzs0QkFDTixLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUksWUFBYSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUEwQixFQUFFLEtBQUssQ0FBQzt3QkFDaEcsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxFQUFhLEVBQUUsUUFBZ0IsRUFBRSxLQUFjO1FBQ3ZFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQzthQUNuQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNiLEtBQUs7YUFDRixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNmLEtBQUssSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVU7WUFDakMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUEwQixDQUFDLEtBQXdCLENBQzVFO1lBQ0gsQ0FBQyxDQUFDLElBQUksQ0FDVDthQUNBLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQTBCLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUNqRjthQUNBLElBQUksRUFBRTthQUNOLElBQUksRUFBRSxDQUFDO1FBQ1YsT0FBTyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsY0FBYyxDQUFDLGFBQXVCLEVBQUUsWUFBc0IsRUFBRSxFQUFhLEVBQUUsT0FBOEI7UUFDM0csT0FBTyxPQUFPLENBQUMsV0FBVztZQUN4QixDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FDaEIsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7Z0JBQzlCLFFBQVE7Z0JBQ1IsTUFBTSxDQUFDLFdBQVcsQ0FDaEIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUMzQixNQUFNLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ2xFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDUCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDO3dCQUM1RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQ2pFLENBQUM7b0JBRUYsT0FBTzt3QkFDTCxPQUFPO3dCQUNQLFlBQVksSUFBSyxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQTBCLENBQUMsS0FBSyxLQUFLLENBQUM7NEJBQzlGLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FDdkIsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBWSxDQUFDLElBQUksQ0FBMEIsQ0FBQyxLQUFnQjtnQ0FDNUYsQ0FBQyxDQUNKOzRCQUNILENBQUMsQ0FBQyxTQUFTO3FCQUNkLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQ0g7YUFDRixDQUFDLENBQ0g7WUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1QsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQWU7UUFDL0IsSUFBSSxNQUFNLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDMUQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsTUFBZTtRQUMxQixJQUFJLE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDM0MsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztZQUN0QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxNQUFlLEVBQUUsS0FBYztRQUMvQyxNQUFNLElBQUksS0FBSyxLQUFLLFNBQVM7WUFDM0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUN4RCxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQUksQ0FBQyxLQUE0QjtRQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUN6QyxLQUFLLENBQUMsWUFBWSxFQUNsQixDQUFDLEVBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUN2RSxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1lBQ3pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixRQUFRLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUU7U0FDMUQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0E5UFUsdUJBQXVCO2tHQUF2Qix1QkFBdUIsa0ZDckJwQyx1a1JBb05BOzsyRkQvTGEsdUJBQXVCO2tCQUpuQyxTQUFTOytCQUNFLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQW5hbHl0aWNXaWRnZXRPcHRpb25zLFxuICBBdHRyaWJ1dGUsXG4gIEF0dHJpYnV0ZVNpbXBsZVZhbHVlLFxuICBDbGFzcyxcbiAgQ2xhc3NTZWxlY3RvcnMsXG4gIERhdGFXaWRnZXRDb21wb25lbnQsXG4gIEl0ZW0sXG4gIFJlc3VsdFNldCxcbiAgV0lER0VUX0hFQURFUl9IRUlHSFRcbn0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIG1hcCwgT2JzZXJ2YWJsZSwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENka0RyYWdEcm9wIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ByeS13aWRnZXQtYW5hbHl0aWMnLFxuICB0ZW1wbGF0ZVVybDogJy4vd2lkZ2V0LWFuYWx5dGljLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBXaWRnZXRBbmFseXRpY0NvbXBvbmVudCBleHRlbmRzIERhdGFXaWRnZXRDb21wb25lbnQge1xuICBvcHRpb25zQ29weTogQW5hbHl0aWNXaWRnZXRPcHRpb25zID0geyBwcmltYXJ5UHJvcDogJycsIHNlY29uZGFyeVByb3A6ICcnLCB2ZXJ0aWNhbFByb3A6ICcnLCB2YWx1ZVByb3A6ICcnIH07XG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPEFuYWx5dGljV2lkZ2V0T3B0aW9ucz47XG5cbiAgcHJpbWFyeVByb3BlcnR5JDogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG4gIHNlY29uZGFyeVByb3BlcnR5JDogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG4gIHZlcnRpY2FsUHJvcGVydHkkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcbiAgdG90YWxQcm9wZXJ0eSQ6IE9ic2VydmFibGU8c3RyaW5nW10+O1xuICBncmFuZFRvdGFsUHJvcGVydHkkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcbiAgbGluZXMkOiBPYnNlcnZhYmxlPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogeyBba2V5OiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgc3RyaW5nIH0gfVtdPjtcbiAgdG90YWxzJDogT2JzZXJ2YWJsZTx7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHsgW2tleTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB9IH1bXT47XG4gIGdyYW5kVG90YWxzJDogT2JzZXJ2YWJsZTx7IG5hbWU6IGFueTsgdmFsdWU6IHsgW3A6IHN0cmluZ106IGFueSB9IH1bXT47XG4gIGNvbG9yTWFwJDogT2JzZXJ2YWJsZTx7IFt2ZXJ0aWNhbDogc3RyaW5nXTogeyBbcHJpbWFyeTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gfT47XG4gIGhlaWdodCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgY2xhc3NlcyQ6IE9ic2VydmFibGU8Q2xhc3NbXT47XG4gIGF2YWlsYWJsZVByb3BlcnRpZXMkOiBPYnNlcnZhYmxlPEF0dHJpYnV0ZVtdPjtcblxuICBjaGFuZ2UoJGV2ZW50OiBzdHJpbmcsIHByb3A6ICdwcmltYXJ5UHJvcCcgfCAnc2Vjb25kYXJ5UHJvcCcgfCAndmFsdWVQcm9wJyB8ICd2ZXJ0aWNhbFByb3AnKSB7XG4gICAgdGhpcy5vcHRpb25zQ29weVtwcm9wXSA9ICRldmVudDtcbiAgfVxuXG4gIGNoYW5nZUNvbG9yQ29uZmlnKCRldmVudDogc3RyaW5nIHwgc3RyaW5nW10sIHByb3A6ICdwcm9wJyB8ICdjb2xvcnMnKSB7XG4gICAgc3dpdGNoIChwcm9wKSB7XG4gICAgICBjYXNlICdwcm9wJzoge1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LmNvbG9yQ29uZmlnIS5wcm9wID0gJGV2ZW50IGFzIHN0cmluZztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdjb2xvcnMnOiB7XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkuY29sb3JDb25maWchLmNvbG9ycyA9ICRldmVudCBhcyBzdHJpbmdbXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlRm9ybWF0KCRldmVudDogc3RyaW5nLCBwcm9wID0gJ3N1ZmZpeCcpIHtcbiAgICB0aGlzLm9wdGlvbnNDb3B5LmZvcm1hdCEuc3VmZml4ID0gJGV2ZW50O1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc3RvcmU6IFN0b3JlPGFueT4sIGVsOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoc3RvcmUsIGVsKTtcbiAgICB0aGlzLm9wdGlvbnMkID0gdGhpcy5tYW5pZmVzdCQucGlwZShtYXAoKG1hbmlmZXN0KSA9PiAobWFuaWZlc3Qub3B0aW9ucyA/PyB7fSkgYXMgQW5hbHl0aWNXaWRnZXRPcHRpb25zKSk7XG4gICAgdGhpcy5jbGFzc2VzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KENsYXNzU2VsZWN0b3JzLmNsYXNzZXMpO1xuICAgIHRoaXMuaGVpZ2h0JCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMud2lkZ2V0U2l6ZSQsIHRoaXMuZGlzcGxheUhlYWRlciRdKS5waXBlKFxuICAgICAgbWFwKChbc2l6ZSwgaGVhZGVyXSkgPT4gc2l6ZS5oZWlnaHQgLSAoaGVhZGVyID8gV0lER0VUX0hFQURFUl9IRUlHSFQudmFsdWUgOiAwKSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLm9wdGlvbnMkLnN1YnNjcmliZSgob3B0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvcHRpb25zKSk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5wcmltYXJ5UHJvcGVydHkkID0gY29tYmluZUxhdGVzdChbdGhpcy5vcHRpb25zJCwgdGhpcy5yZXN1bHRTZXQkXSkucGlwZShcbiAgICAgIGZpbHRlcigoW29wdGlvbnNdKSA9PiAhIW9wdGlvbnMucHJpbWFyeVByb3ApLFxuICAgICAgbWFwKChbb3B0aW9ucywgcnNdKSA9PiB0aGlzLmdldFByb3BlcnR5TGFiZWxzRm9yTGV2ZWwocnMsIG9wdGlvbnMucHJpbWFyeVByb3ApKVxuICAgICk7XG4gICAgdGhpcy5zZWNvbmRhcnlQcm9wZXJ0eSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm9wdGlvbnMkLCB0aGlzLnJlc3VsdFNldCRdKS5waXBlKFxuICAgICAgZmlsdGVyKChbb3B0aW9uc10pID0+ICEhb3B0aW9ucy5zZWNvbmRhcnlQcm9wKSxcbiAgICAgIG1hcCgoW29wdGlvbnMsIHJzXSkgPT4gdGhpcy5nZXRQcm9wZXJ0eUxhYmVsc0ZvckxldmVsKHJzLCBvcHRpb25zLnNlY29uZGFyeVByb3AhLCAxKSlcbiAgICApO1xuICAgIHRoaXMudmVydGljYWxQcm9wZXJ0eSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm9wdGlvbnMkLCB0aGlzLnJlc3VsdFNldCRdKS5waXBlKFxuICAgICAgZmlsdGVyKChbb3B0aW9uc10pID0+ICEhb3B0aW9ucy52ZXJ0aWNhbFByb3ApLFxuICAgICAgbWFwKChbb3B0aW9ucywgcnNdKSA9PiB0aGlzLmdldFByb3BlcnR5TGFiZWxzRm9yTGV2ZWwocnMsIG9wdGlvbnMudmVydGljYWxQcm9wLCAxKSlcbiAgICApO1xuICAgIHRoaXMudG90YWxQcm9wZXJ0eSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm9wdGlvbnMkLCB0aGlzLnJlc3VsdFNldCRdKS5waXBlKFxuICAgICAgbWFwKChbb3B0aW9ucywgcnNdKSA9PiB0aGlzLmdldFByb3BlcnR5TGFiZWxzRm9yTGV2ZWwocnMsIG9wdGlvbnMudmVydGljYWxQcm9wLCAyKSlcbiAgICApO1xuICAgIHRoaXMuZ3JhbmRUb3RhbFByb3BlcnR5JCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMub3B0aW9ucyQsIHRoaXMucmVzdWx0U2V0JF0pLnBpcGUoXG4gICAgICBtYXAoKFtvcHRpb25zLCByc10pID0+IHRoaXMuZ2V0UHJvcGVydHlMYWJlbHNGb3JMZXZlbChycywgb3B0aW9ucy52ZXJ0aWNhbFByb3AsIDMpKVxuICAgICk7XG5cbiAgICB0aGlzLmxpbmVzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5vcHRpb25zJCxcbiAgICAgIHRoaXMucHJpbWFyeVByb3BlcnR5JC5waXBlKHN0YXJ0V2l0aChbXSkpLFxuICAgICAgdGhpcy5zZWNvbmRhcnlQcm9wZXJ0eSQucGlwZShzdGFydFdpdGgodW5kZWZpbmVkKSksXG4gICAgICB0aGlzLnZlcnRpY2FsUHJvcGVydHkkLnBpcGUoc3RhcnRXaXRoKFtdKSksXG4gICAgICB0aGlzLnJlc3VsdFNldCRcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbb3B0aW9ucywgcHJpbWFyeVByb3BzLCBzZWNvbmRhcnlQcm9wcywgdmVydGljYWxQcm9wcywgcnNdKSA9PlxuICAgICAgICB0aGlzLmNyZWF0ZVZhbHVlTWFwKHZlcnRpY2FsUHJvcHMsIHByaW1hcnlQcm9wcywgc2Vjb25kYXJ5UHJvcHMsIHJzLCBvcHRpb25zLCAxKVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLnRvdGFscyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMub3B0aW9ucyQsXG4gICAgICB0aGlzLnByaW1hcnlQcm9wZXJ0eSQsXG4gICAgICB0aGlzLnNlY29uZGFyeVByb3BlcnR5JCxcbiAgICAgIHRoaXMudG90YWxQcm9wZXJ0eSQsXG4gICAgICB0aGlzLnJlc3VsdFNldCRcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbb3B0aW9ucywgcHJpbWFyeVByb3BzLCBzZWNvbmRhcnlQcm9wcywgdmVydGljYWxQcm9wcywgcnNdKSA9PlxuICAgICAgICB0aGlzLmNyZWF0ZVZhbHVlTWFwKHZlcnRpY2FsUHJvcHMsIHByaW1hcnlQcm9wcywgc2Vjb25kYXJ5UHJvcHMsIHJzLCBvcHRpb25zLCAyKVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLmdyYW5kVG90YWxzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5vcHRpb25zJCxcbiAgICAgIHRoaXMucHJpbWFyeVByb3BlcnR5JCxcbiAgICAgIHRoaXMuZ3JhbmRUb3RhbFByb3BlcnR5JCxcbiAgICAgIHRoaXMucmVzdWx0U2V0JFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtvcHRpb25zLCBwcmltYXJ5UHJvcHMsIHZlcnRpY2FsUHJvcHMsIHJzXSkgPT5cbiAgICAgICAgdGhpcy5jcmVhdGVWYWx1ZU1hcCh2ZXJ0aWNhbFByb3BzLCBwcmltYXJ5UHJvcHMsIHVuZGVmaW5lZCwgcnMsIG9wdGlvbnMsIDMpXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuY29sb3JNYXAkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLm9wdGlvbnMkLFxuICAgICAgdGhpcy5yZXN1bHRTZXQkLFxuICAgICAgdGhpcy52ZXJ0aWNhbFByb3BlcnR5JCxcbiAgICAgIHRoaXMucHJpbWFyeVByb3BlcnR5JFxuICAgIF0pLnBpcGUoXG4gICAgICBmaWx0ZXIoKFtvcHRpb25zXSkgPT4gISFvcHRpb25zLmNvbG9yQ29uZmlnKSxcbiAgICAgIG1hcCgoW29wdGlvbnMsIHJzLCB2ZXJ0aWNhbCwgcHJpbWFyeV0pID0+IHRoaXMuY3JlYXRlQ29sb3JNYXAodmVydGljYWwsIHByaW1hcnksIHJzLCBvcHRpb25zKSlcbiAgICApO1xuXG4gICAgdGhpcy5hdmFpbGFibGVQcm9wZXJ0aWVzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuY2xhc3NlcyQsIHRoaXMucmVzdWx0U2V0JF0pLnBpcGUoXG4gICAgICBtYXAoKFtjbGFzc2VzLCByc10pID0+IHtcbiAgICAgICAgY29uc3QgcHJlc2VudENsYXNzZXNJZCA9IE9iamVjdC5rZXlzKHJzLml0ZW1zKTtcbiAgICAgICAgY29uc3QgcHJlc2VudENsYXNzZXMgPSBwcmVzZW50Q2xhc3Nlc0lkXG4gICAgICAgICAgLm1hcCgoY2xhc3NJZCkgPT4gY2xhc3Nlcy5maW5kKChjbCkgPT4gY2wuaWQgPT09IGNsYXNzSWQpKVxuICAgICAgICAgIC5maWx0ZXIoKGNsKSA9PiAhIWNsKSBhcyBDbGFzc1tdO1xuICAgICAgICByZXR1cm4gcHJlc2VudENsYXNzZXMubWFwKChjbCkgPT4gY2wuYXR0cmlidXRlcykuZmxhdCgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaEF0dHJpYnV0ZVZhbHVlKGl0ZW06IEl0ZW0sIHByb3A/OiBzdHJpbmcsIGNvbXBhcmlzb25WYWx1ZT86IHN0cmluZykge1xuICAgIHJldHVybiBjb21wYXJpc29uVmFsdWUgJiYgcHJvcCA/IChpdGVtLmF0dHJpYnV0ZXNbcHJvcF0gYXMgQXR0cmlidXRlU2ltcGxlVmFsdWUpLnZhbHVlID09IGNvbXBhcmlzb25WYWx1ZSA6IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVZhbHVlTWFwKFxuICAgIHZlcnRpY2FsUHJvcHM6IHN0cmluZ1tdLFxuICAgIHByaW1hcnlQcm9wczogc3RyaW5nW10sXG4gICAgc2Vjb25kYXJ5UHJvcHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICAgIHJzOiBSZXN1bHRTZXQsXG4gICAgb3B0aW9uczogQW5hbHl0aWNXaWRnZXRPcHRpb25zLFxuICAgIGxldmVsPzogbnVtYmVyXG4gICkge1xuICAgIHJldHVybiB2ZXJ0aWNhbFByb3BzLm1hcCgodmVydGljYWwpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0ge30gYXMgeyBba2V5OiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgYW55IH07XG4gICAgICBwcmltYXJ5UHJvcHMuZm9yRWFjaCgocHJpbWFyeSkgPT4ge1xuICAgICAgICAoc2Vjb25kYXJ5UHJvcHMgPz8gW3VuZGVmaW5lZF0pLmZvckVhY2goKHNlY29uZGFyeSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nSXRlbSA9IChycy5pdGVtc1tPYmplY3Qua2V5cyhycy5pdGVtcylbMF1dID8/IFtdKS5maW5kKFxuICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgIHRoaXMubWF0Y2hBdHRyaWJ1dGVWYWx1ZShpdGVtLCBvcHRpb25zLnByaW1hcnlQcm9wLCBwcmltYXJ5KSAmJlxuICAgICAgICAgICAgICB0aGlzLm1hdGNoQXR0cmlidXRlVmFsdWUoaXRlbSwgb3B0aW9ucy5zZWNvbmRhcnlQcm9wLCBzZWNvbmRhcnkpICYmXG4gICAgICAgICAgICAgIHRoaXMubWF0Y2hBdHRyaWJ1dGVWYWx1ZShpdGVtLCBvcHRpb25zLnZlcnRpY2FsUHJvcCwgdmVydGljYWwpICYmXG4gICAgICAgICAgICAgIHRoaXMubWF0Y2hBdHRyaWJ1dGVWYWx1ZShpdGVtLCAnbGV2ZWwnLCBsZXZlbCArICcnKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCEhbWF0Y2hpbmdJdGVtKSB7XG4gICAgICAgICAgICBpZiAoISFzZWNvbmRhcnkpIHtcbiAgICAgICAgICAgICAgaWYgKCF2YWx1ZVtwcmltYXJ5XSkge1xuICAgICAgICAgICAgICAgIHZhbHVlW3ByaW1hcnldID0ge307XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFsdWVbcHJpbWFyeV1bc2Vjb25kYXJ5XSA9IChtYXRjaGluZ0l0ZW0hLmF0dHJpYnV0ZXNbb3B0aW9ucy52YWx1ZVByb3BdIGFzIEF0dHJpYnV0ZVNpbXBsZVZhbHVlKS52YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlW3ByaW1hcnldID0gKG1hdGNoaW5nSXRlbSEuYXR0cmlidXRlc1tvcHRpb25zLnZhbHVlUHJvcF0gYXMgQXR0cmlidXRlU2ltcGxlVmFsdWUpPy52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBuYW1lOiB2ZXJ0aWNhbCwgdmFsdWUgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFByb3BlcnR5TGFiZWxzRm9yTGV2ZWwocnM6IFJlc3VsdFNldCwgcHJvcGVydHk6IHN0cmluZywgbGV2ZWw/OiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKHJzLml0ZW1zKVxuICAgICAgLm1hcCgoaXRlbXMpID0+XG4gICAgICAgIGl0ZW1zXG4gICAgICAgICAgLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgICAgICAgIGxldmVsICYmICdsZXZlbCcgaW4gaXRlbS5hdHRyaWJ1dGVzXG4gICAgICAgICAgICAgID8gW2xldmVsLCAnJyArIGxldmVsXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgIChpdGVtLmF0dHJpYnV0ZXNbJ2xldmVsJ10gYXMgQXR0cmlidXRlU2ltcGxlVmFsdWUpLnZhbHVlIGFzIHN0cmluZyB8IG51bWJlclxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiB0cnVlXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IChpdGVtLmF0dHJpYnV0ZXNbcHJvcGVydHldIGFzIEF0dHJpYnV0ZVNpbXBsZVZhbHVlKS52YWx1ZSArICcnKVxuICAgICAgKVxuICAgICAgLmZsYXQoKVxuICAgICAgLmZsYXQoKTtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQodmFsdWVzKV07XG4gIH1cblxuICBjcmVhdGVDb2xvck1hcCh2ZXJ0aWNhbFByb3BzOiBzdHJpbmdbXSwgcHJpbWFyeVByb3BzOiBzdHJpbmdbXSwgcnM6IFJlc3VsdFNldCwgb3B0aW9uczogQW5hbHl0aWNXaWRnZXRPcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuY29sb3JDb25maWdcbiAgICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIHZlcnRpY2FsUHJvcHMubWFwKCh2ZXJ0aWNhbCkgPT4gW1xuICAgICAgICAgICAgdmVydGljYWwsXG4gICAgICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgIHByaW1hcnlQcm9wcy5tYXAoKHByaW1hcnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGluZ0l0ZW0gPSAocnMuaXRlbXNbT2JqZWN0LmtleXMocnMuaXRlbXMpWzBdXSA/PyBbXSkuZmluZChcbiAgICAgICAgICAgICAgICAgIChpdGVtKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoQXR0cmlidXRlVmFsdWUoaXRlbSwgb3B0aW9ucy5wcmltYXJ5UHJvcCwgcHJpbWFyeSkgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaEF0dHJpYnV0ZVZhbHVlKGl0ZW0sIG9wdGlvbnMudmVydGljYWxQcm9wLCB2ZXJ0aWNhbClcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgIHByaW1hcnksXG4gICAgICAgICAgICAgICAgICBtYXRjaGluZ0l0ZW0gJiYgKG1hdGNoaW5nSXRlbS5hdHRyaWJ1dGVzW29wdGlvbnMudmFsdWVQcm9wXSBhcyBBdHRyaWJ1dGVTaW1wbGVWYWx1ZSkudmFsdWUgIT09IDBcbiAgICAgICAgICAgICAgICAgICAgPyBvcHRpb25zLmNvbG9yQ29uZmlnPy5jb2xvcnNbXG4gICAgICAgICAgICAgICAgICAgICAgICAoKG1hdGNoaW5nSXRlbS5hdHRyaWJ1dGVzW29wdGlvbnMuY29sb3JDb25maWchLnByb3BdIGFzIEF0dHJpYnV0ZVNpbXBsZVZhbHVlKS52YWx1ZSBhcyBudW1iZXIpIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgOiAnI0ZGRkZGRidcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIF0pXG4gICAgICAgIClcbiAgICAgIDoge307XG4gIH1cblxuICB0b2dnbGVDb2xvckNvbmZpZygkZXZlbnQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoJGV2ZW50ICE9PSAhIXRoaXMub3B0aW9uc0NvcHkuY29sb3JDb25maWcpIHtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zQ29weS5jb2xvckNvbmZpZykge1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LmNvbG9yQ29uZmlnID0geyBwcm9wOiAnJywgY29sb3JzOiBbXSB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5jb2xvckNvbmZpZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0b2dnbGVGb3JtYXQoJGV2ZW50OiBib29sZWFuKSB7XG4gICAgaWYgKCRldmVudCAhPT0gISF0aGlzLm9wdGlvbnNDb3B5LmZvcm1hdCkge1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnNDb3B5LmZvcm1hdCkge1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LmZvcm1hdCA9IHsgc3VmZml4OiAnJyB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5mb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbW9kaWZ5Q29sb3JTY2hlbWUoJGV2ZW50Pzogc3RyaW5nLCBpbmRleD86IG51bWJlcikge1xuICAgICRldmVudCAmJiBpbmRleCAhPT0gdW5kZWZpbmVkXG4gICAgICA/ICh0aGlzLm9wdGlvbnNDb3B5LmNvbG9yQ29uZmlnIS5jb2xvcnNbaW5kZXhdID0gJGV2ZW50KVxuICAgICAgOiB0aGlzLm9wdGlvbnNDb3B5LmNvbG9yQ29uZmlnIS5jb2xvcnMucHVzaCgnI0ZGRkZGRicpO1xuICB9XG5cbiAgcmVtb3ZlQ29sb3IoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMub3B0aW9uc0NvcHkuY29sb3JDb25maWchLmNvbG9ycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XG4gICAgdGhpcy5vcHRpb25zQ29weS5jb2xvckNvbmZpZyEuY29sb3JzLnNwbGljZShcbiAgICAgIGV2ZW50LmN1cnJlbnRJbmRleCxcbiAgICAgIDAsXG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmNvbG9yQ29uZmlnIS5jb2xvcnMuc3BsaWNlKGV2ZW50LnByZXZpb3VzSW5kZXgsIDEpWzBdXG4gICAgKTtcbiAgfVxuXG4gIGVtaXRNYW5pZmVzdCgpIHtcbiAgICB0aGlzLm1hbmlmZXN0TW9kaWZpZWQuZW1pdCh7XG4gICAgICB3aWRnZXRJbmRleDogdGhpcy53aWRnZXRJbmRleCxcbiAgICAgIG1hbmlmZXN0OiB7IC4uLnRoaXMubWFuaWZlc3QsIG9wdGlvbnM6IHRoaXMub3B0aW9uc0NvcHkgfVxuICAgIH0pO1xuICB9XG59XG4iLCI8cHJ5LXdpZGdldC1hbmFseXRpYy1jc3M+PC9wcnktd2lkZ2V0LWFuYWx5dGljLWNzcz5cbjxkaXYgY2xhc3M9XCJvLXdpZGdldCBvLXdpZGdldF9fYW5hbHl0aWNcIj5cbiAgPHByeS13aWRnZXQtaGVhZGVyXG4gICAgKm5nSWY9XCJkaXNwbGF5SGVhZGVyJCB8IGFzeW5jXCJcbiAgICBbd2lkZ2V0SW5kZXhdPVwid2lkZ2V0SW5kZXhcIlxuICAgIFttYW5pZmVzdF09XCJtYW5pZmVzdFwiXG4gICAgKG1hbmlmZXN0TW9kaWZpZWQpPVwibWFuaWZlc3RNb2RpZmllZC5lbWl0KCRldmVudClcIlxuICAgICNoZWFkZXJcbiAgICBbaGVhZGVyT3B0aW9uc109XCIoZGlzcGxheUhlYWRlciQgfCBhc3luYykgPz8ge31cIlxuICAgIFtkYXRhc291cmNlSWRzXT1cIihkYXRhc291cmNlSWRzJCB8IGFzeW5jKSA/PyBbXVwiXG4gID5cbiAgICA8cHJ5LXNldHRpbmdzXG4gICAgICAoc2F2ZVRyaWdnZXJlZCk9XCJlbWl0TWFuaWZlc3QoKVwiXG4gICAgICAoY2hhbmdlVGl0bGUpPVwiY2hhbmdlV2lkZ2V0VGl0bGUoJGV2ZW50KVwiXG4gICAgICBbaGVhZGVyUHJlc2VudF09XCJkaXNwbGF5SGVhZGVyJCB8IGFzeW5jXCJcbiAgICAgIFt3aWRnZXRJbmRleF09XCJ3aWRnZXRJbmRleFwiXG4gICAgICBbaGVhZGVyXT1cImhlYWRlclwiXG4gICAgICBbb3BlbiRdPVwib3BlbiRcIlxuICAgICAgY2xhc3M9XCJvLXNldHRpbmdzXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiby1zZXR0aW5nc19fZmllbGRzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwicHJpbWFyeVByb3BcIj57eyAnQHByeS53aWRnZXQuYW5hbHl0aWMucHJpbWFyeVByb3AnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZSgkZXZlbnQsICdwcmltYXJ5UHJvcCcpXCJcbiAgICAgICAgICAgIFtpdGVtc109XCJhdmFpbGFibGVQcm9wZXJ0aWVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9wdGlvbnNDb3B5LnByaW1hcnlQcm9wXCJcbiAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgYmluZFZhbHVlPVwibmFtZVwiXG4gICAgICAgICAgICBpZD1cInByaW1hcnlQcm9wXCJcbiAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJzZWNvbmRhcnlQcm9wXCI+e3sgJ0Bwcnkud2lkZ2V0LmFuYWx5dGljLnNlY29uZGFyeVByb3AnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZSgkZXZlbnQsICdzZWNvbmRhcnlQcm9wJylcIlxuICAgICAgICAgICAgW2l0ZW1zXT1cImF2YWlsYWJsZVByb3BlcnRpZXMkIHwgYXN5bmNcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuc2Vjb25kYXJ5UHJvcFwiXG4gICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgIGJpbmRWYWx1ZT1cIm5hbWVcIlxuICAgICAgICAgICAgaWQ9XCJzZWNvbmRhcnlQcm9wXCJcbiAgICAgICAgICAgIFtjbGVhcmFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwidmVydGljYWxQcm9wXCI+e3sgJ0Bwcnkud2lkZ2V0LmFuYWx5dGljLnZlcnRpY2FsUHJvcCcgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlKCRldmVudCwgJ3ZlcnRpY2FsUHJvcCcpXCJcbiAgICAgICAgICAgIFtpdGVtc109XCJhdmFpbGFibGVQcm9wZXJ0aWVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9wdGlvbnNDb3B5LnZlcnRpY2FsUHJvcFwiXG4gICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgIGJpbmRWYWx1ZT1cIm5hbWVcIlxuICAgICAgICAgICAgaWQ9XCJ2ZXJ0aWNhbFByb3BcIlxuICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cInZhbHVlUHJvcFwiPnt7ICdAcHJ5LndpZGdldC5hbmFseXRpYy52YWx1ZVByb3AnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZSgkZXZlbnQsICd2YWx1ZVByb3AnKVwiXG4gICAgICAgICAgICBbaXRlbXNdPVwiYXZhaWxhYmxlUHJvcGVydGllcyQgfCBhc3luY1wiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb25zQ29weS52YWx1ZVByb3BcIlxuICAgICAgICAgICAgYmluZExhYmVsPVwibmFtZVwiXG4gICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgIGlkPVwidmFsdWVQcm9wXCJcbiAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgIDxwcnktY2hlY2tib3ggKG5nTW9kZWxDaGFuZ2UpPVwidG9nZ2xlQ29sb3JDb25maWcoJGV2ZW50KVwiIFtuZ01vZGVsXT1cIiEhb3B0aW9uc0NvcHkuY29sb3JDb25maWdcIj5cbiAgICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5hbmFseXRpYy5jb2xvckNvbmZpZycgfCBpMThuIH19XG4gICAgICAgICAgPC9wcnktY2hlY2tib3g+XG4gICAgICAgICAgQGlmIChvcHRpb25zQ29weS5jb2xvckNvbmZpZykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwiY29sb3JQcm9wXCI+e3sgJ0Bwcnkud2lkZ2V0LmFuYWx5dGljLmNvbG9yUHJvcCcgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VDb2xvckNvbmZpZygkZXZlbnQsICdwcm9wJylcIlxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJhdmFpbGFibGVQcm9wZXJ0aWVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb25zQ29weS5jb2xvckNvbmZpZy5wcm9wXCJcbiAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBpZD1cImNvbG9yUHJvcFwiXG4gICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImNvbG9yUHJvcFwiPnt7ICdAcHJ5LndpZGdldC5hbmFseXRpYy5jb2xvcnMnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm8td2lkZ2V0X19hbmFseXRpY19fY29sb3ItcGlja2VyLWNvbnRhaW5lciB1LWRpc3BsYXktZmxleCAtYWxpZ24tY2VudGVyXCJcbiAgICAgICAgICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBjZGtEcm9wTGlzdE9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBAZm9yIChjb2xvciBvZiBvcHRpb25zQ29weS5jb2xvckNvbmZpZy5jb2xvcnM7IHRyYWNrIGNvbG9yOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm8td2lkZ2V0X19hbmFseXRpY19fY29sb3ItcGlja2VyXCIgY2RrRHJhZz5cbiAgICAgICAgICAgICAgICAgICAgPHByeS1jb2xvci1waWNrZXJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwibW9kaWZ5Q29sb3JTY2hlbWUoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3ByeS1jb2xvci1waWNrZXI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInJlbW92ZUNvbG9yKGkpXCIgY2xhc3M9XCJvLXdpZGdldF9fYW5hbHl0aWNfX2NvbG9yLXBpY2tlci1yZW1vdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImNsb3NlXCIgW2hlaWdodF09XCIxNVwiIFt3aWR0aF09XCIxNVwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpjZGtEcmFnUHJldmlldz5cbiAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWNvbG9yLXBpY2tlciBbbmdNb2RlbF09XCJjb2xvclwiPjwvcHJ5LWNvbG9yLXBpY2tlcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHkgby13aWRnZXRfX2FuYWx5dGljX19jb2xvci1waWNrZXItYWRkXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb2RpZnlDb2xvclNjaGVtZSgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImFkZFwiIFtoZWlnaHRdPVwiMjBcIiBbd2lkdGhdPVwiMjBcIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICA8cHJ5LWNoZWNrYm94IChuZ01vZGVsQ2hhbmdlKT1cInRvZ2dsZUZvcm1hdCgkZXZlbnQpXCIgW25nTW9kZWxdPVwiISFvcHRpb25zQ29weS5mb3JtYXRcIj5cbiAgICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5hbmFseXRpYy5mb3JtYXQnIHwgaTE4biB9fVxuICAgICAgICAgIDwvcHJ5LWNoZWNrYm94PlxuICAgICAgICAgIEBpZiAob3B0aW9uc0NvcHkuZm9ybWF0KSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJmb3JtYXRcIj57eyAnQHByeS53aWRnZXQuYW5hbHl0aWMuc3VmZml4JyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgIGlkPVwiZm9ybWF0XCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb25zQ29weS5mb3JtYXQuc3VmZml4XCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VGb3JtYXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9wcnktc2V0dGluZ3M+XG4gIDwvcHJ5LXdpZGdldC1oZWFkZXI+XG4gIDxkaXYgY2xhc3M9XCJvLXdpZGdldF9fYW5hbHl0aWNfX3RhYmxlXCI+XG4gICAgPHRhYmxlIFtzdHlsZS5oZWlnaHQucHhdPVwiaGVpZ2h0JCB8IGFzeW5jXCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0ciBjbGFzcz1cInByaW1hcnktaGVhZGVyXCI+XG4gICAgICAgICAgPHRoPjwvdGg+XG4gICAgICAgICAgQGZvciAocHJpbWFyeSBvZiBwcmltYXJ5UHJvcGVydHkkIHwgYXN5bmM7IHRyYWNrIHByaW1hcnkpIHtcbiAgICAgICAgICAgIDx0aCBbY29sU3Bhbl09XCIoc2Vjb25kYXJ5UHJvcGVydHkkIHwgYXN5bmMpPy5sZW5ndGggPz8gMVwiPlxuICAgICAgICAgICAgICB7eyBwcmltYXJ5IH19XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90cj5cbiAgICAgICAgQGlmIChvcHRpb25zQ29weS5zZWNvbmRhcnlQcm9wKSB7XG4gICAgICAgICAgPHRyIGNsYXNzPVwic2Vjb25kYXJ5LWhlYWRlclwiPlxuICAgICAgICAgICAgPHRoPjwvdGg+XG4gICAgICAgICAgICBAZm9yIChwcmltYXJ5IG9mIHByaW1hcnlQcm9wZXJ0eSQgfCBhc3luYzsgdHJhY2sgcHJpbWFyeSkge1xuICAgICAgICAgICAgICBAZm9yIChzZWNvbmRhcnkgb2Ygc2Vjb25kYXJ5UHJvcGVydHkkIHwgYXN5bmM7IHRyYWNrIHNlY29uZGFyeSkge1xuICAgICAgICAgICAgICAgIDx0aD57eyBzZWNvbmRhcnkgfX08L3RoPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT5cbiAgICAgICAgQGZvciAobGluZSBvZiBsaW5lcyQgfCBhc3luYzsgdHJhY2sgbGluZS5uYW1lKSB7XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoPnt7IGxpbmUubmFtZSB9fTwvdGg+XG4gICAgICAgICAgICBAZm9yIChwcmltYXJ5IG9mIHByaW1hcnlQcm9wZXJ0eSQgfCBhc3luYzsgdHJhY2sgcHJpbWFyeSkge1xuICAgICAgICAgICAgICBAaWYgKG9wdGlvbnNDb3B5LnNlY29uZGFyeVByb3ApIHtcbiAgICAgICAgICAgICAgICBAZm9yIChzZWNvbmRhcnkgb2Ygc2Vjb25kYXJ5UHJvcGVydHkkIHwgYXN5bmM7IHRyYWNrIHNlY29uZGFyeSkge1xuICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNDb3B5LmNvbG9yQ29uZmlnID8geyAnYmFja2dyb3VuZC1jb2xvcic6IChjb2xvck1hcCQgfCBhc3luYyk/LltsaW5lLm5hbWVdPy5bcHJpbWFyeV0gfSA6IHt9XG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7IGxpbmUudmFsdWVbcHJpbWFyeV1bc2Vjb25kYXJ5XSB8IGRhdGFGb3JtYXQ6IHRydWUgOiBvcHRpb25zQ29weS5mb3JtYXQ/LnN1ZmZpeFxuICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNDb3B5LmNvbG9yQ29uZmlnID8geyAnYmFja2dyb3VuZC1jb2xvcic6IChjb2xvck1hcCQgfCBhc3luYyk/LltsaW5lLm5hbWVdPy5bcHJpbWFyeV0gfSA6IHt9XG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IGxpbmUudmFsdWVbcHJpbWFyeV0gfCBkYXRhRm9ybWF0OiB0cnVlIDogb3B0aW9uc0NvcHkuZm9ybWF0Py5zdWZmaXggfX1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuICAgICAgPC90Ym9keT5cbiAgICAgIDx0Zm9vdD5cbiAgICAgICAgQGZvciAobGluZSBvZiB0b3RhbHMkIHwgYXN5bmM7IHRyYWNrIGxpbmUubmFtZSkge1xuICAgICAgICAgIDx0ciBjbGFzcz1cInBhcnRpYWwtdG90YWxcIj5cbiAgICAgICAgICAgIDx0aD57eyBsaW5lLm5hbWUgfX08L3RoPlxuICAgICAgICAgICAgQGZvciAocHJpbWFyeSBvZiBwcmltYXJ5UHJvcGVydHkkIHwgYXN5bmM7IHRyYWNrIHByaW1hcnkpIHtcbiAgICAgICAgICAgICAgQGZvciAoc2Vjb25kYXJ5IG9mIHNlY29uZGFyeVByb3BlcnR5JCB8IGFzeW5jOyB0cmFjayBzZWNvbmRhcnkpIHtcbiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICB7eyBsaW5lLnZhbHVlW3ByaW1hcnldW3NlY29uZGFyeV0gfX1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuICAgICAgICBAZm9yIChsaW5lIG9mIGdyYW5kVG90YWxzJCB8IGFzeW5jOyB0cmFjayBsaW5lLm5hbWUpIHtcbiAgICAgICAgICA8dHIgY2xhc3M9XCJncmFuZC10b3RhbFwiPlxuICAgICAgICAgICAgPHRoPnt7IGxpbmUubmFtZSB9fTwvdGg+XG4gICAgICAgICAgICBAZm9yIChwcmltYXJ5IG9mIHByaW1hcnlQcm9wZXJ0eSQgfCBhc3luYzsgdHJhY2sgcHJpbWFyeSkge1xuICAgICAgICAgICAgICA8dGQgW2NvbFNwYW5dPVwiKHNlY29uZGFyeVByb3BlcnR5JCB8IGFzeW5jKT8ubGVuZ3RoID8/IDFcIj5cbiAgICAgICAgICAgICAgICB7eyBsaW5lLnZhbHVlW3ByaW1hcnldIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuICAgICAgPC90Zm9vdD5cbiAgICA8L3RhYmxlPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWFuYWx5dGljLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL3dpZGdldHMvd2lkZ2V0LWFuYWx5dGljL2NvbXBvbmVudC93aWRnZXQtYW5hbHl0aWMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtYW5hbHl0aWMvY29tcG9uZW50L3dpZGdldC1hbmFseXRpYy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFLTCxjQUFjLEVBQ2QsbUJBQW1CLEVBR25CLG9CQUFvQixFQUNyQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFjLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVqRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBT3hDLE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxtQkFBbUI7SUFpQjlELE1BQU0sQ0FBQyxNQUFjLEVBQUUsSUFBb0U7UUFDekYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQXlCLEVBQUUsSUFBdUI7UUFDbEUsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDWixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVksQ0FBQyxJQUFJLEdBQUcsTUFBZ0IsQ0FBQztnQkFDdEQsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLFdB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SyxLQUFLLFNBQVM7WUFDM0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUN4RCxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQUksQ0FBQyxLQUE0QjtRQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUN6QyxLQUFLLENBQUMsWUFBWSxFQUNsQixDQUFDLEVBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUN2RSxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1lBQ3pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixRQUFRLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUU7U0FDMUQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0E5UFUsdUJBQXVCO2tHQUF2Qix1QkFBdUIsa0ZDckJwQywwa1JBb05BOzsyRkQvTGEsdUJBQXVCO2tCQUpuQyxTQUFTOytCQUNFLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQW5hbHl0aWNXaWRnZXRPcHRpb25zLFxuICBBdHRyaWJ1dGUsXG4gIEF0dHJpYnV0ZVNpbXBsZVZhbHVlLFxuICBDbGFzcyxcbiAgQ2xhc3NTZWxlY3RvcnMsXG4gIERhdGFXaWRnZXRDb21wb25lbnQsXG4gIEl0ZW0sXG4gIFJlc3VsdFNldCxcbiAgV0lER0VUX0hFQURFUl9IRUlHSFRcbn0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIG1hcCwgT2JzZXJ2YWJsZSwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENka0RyYWdEcm9wIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ByeS13aWRnZXQtYW5hbHl0aWMnLFxuICB0ZW1wbGF0ZVVybDogJy4vd2lkZ2V0LWFuYWx5dGljLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBXaWRnZXRBbmFseXRpY0NvbXBvbmVudCBleHRlbmRzIERhdGFXaWRnZXRDb21wb25lbnQge1xuICBvcHRpb25zQ29weTogQW5hbHl0aWNXaWRnZXRPcHRpb25zID0geyBwcmltYXJ5UHJvcDogJycsIHNlY29uZGFyeVByb3A6ICcnLCB2ZXJ0aWNhbFByb3A6ICcnLCB2YWx1ZVByb3A6ICcnIH07XG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPEFuYWx5dGljV2lkZ2V0T3B0aW9ucz47XG5cbiAgcHJpbWFyeVByb3BlcnR5JDogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG4gIHNlY29uZGFyeVByb3BlcnR5JDogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG4gIHZlcnRpY2FsUHJvcGVydHkkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcbiAgdG90YWxQcm9wZXJ0eSQ6IE9ic2VydmFibGU8c3RyaW5nW10+O1xuICBncmFuZFRvdGFsUHJvcGVydHkkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcbiAgbGluZXMkOiBPYnNlcnZhYmxlPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogeyBba2V5OiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgYW55IH0gfVtdPjtcbiAgdG90YWxzJDogT2JzZXJ2YWJsZTx7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHsgW2tleTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB9IH1bXT47XG4gIGdyYW5kVG90YWxzJDogT2JzZXJ2YWJsZTx7IG5hbWU6IGFueTsgdmFsdWU6IHsgW3A6IHN0cmluZ106IGFueSB9IH1bXT47XG4gIGNvbG9yTWFwJDogT2JzZXJ2YWJsZTx7IFt2ZXJ0aWNhbDogc3RyaW5nXTogeyBbcHJpbWFyeTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gfT47XG4gIGhlaWdodCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgY2xhc3NlcyQ6IE9ic2VydmFibGU8Q2xhc3NbXT47XG4gIGF2YWlsYWJsZVByb3BlcnRpZXMkOiBPYnNlcnZhYmxlPEF0dHJpYnV0ZVtdPjtcblxuICBjaGFuZ2UoJGV2ZW50OiBzdHJpbmcsIHByb3A6ICdwcmltYXJ5UHJvcCcgfCAnc2Vjb25kYXJ5UHJvcCcgfCAndmFsdWVQcm9wJyB8ICd2ZXJ0aWNhbFByb3AnKSB7XG4gICAgdGhpcy5vcHRpb25zQ29weVtwcm9wXSA9ICRldmVudDtcbiAgfVxuXG4gIGNoYW5nZUNvbG9yQ29uZmlnKCRldmVudDogc3RyaW5nIHwgc3RyaW5nW10sIHByb3A6ICdwcm9wJyB8ICdjb2xvcnMnKSB7XG4gICAgc3dpdGNoIChwcm9wKSB7XG4gICAgICBjYXNlICdwcm9wJzoge1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LmNvbG9yQ29uZmlnIS5wcm9wID0gJGV2ZW50IGFzIHN0cmluZztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdjb2xvcnMnOiB7XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkuY29sb3JDb25maWchLmNvbG9ycyA9ICRldmVudCBhcyBzdHJpbmdbXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlRm9ybWF0KCRldmVudDogc3RyaW5nLCBwcm9wID0gJ3N1ZmZpeCcpIHtcbiAgICB0aGlzLm9wdGlvbnNDb3B5LmZvcm1hdCEuc3VmZml4ID0gJGV2ZW50O1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc3RvcmU6IFN0b3JlPGFueT4sIGVsOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoc3RvcmUsIGVsKTtcbiAgICB0aGlzLm9wdGlvbnMkID0gdGhpcy5tYW5pZmVzdCQucGlwZShtYXAoKG1hbmlmZXN0KSA9PiAobWFuaWZlc3Qub3B0aW9ucyA/PyB7fSkgYXMgQW5hbHl0aWNXaWRnZXRPcHRpb25zKSk7XG4gICAgdGhpcy5jbGFzc2VzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KENsYXNzU2VsZWN0b3JzLmNsYXNzZXMpO1xuICAgIHRoaXMuaGVpZ2h0JCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMud2lkZ2V0U2l6ZSQsIHRoaXMuZGlzcGxheUhlYWRlciRdKS5waXBlKFxuICAgICAgbWFwKChbc2l6ZSwgaGVhZGVyXSkgPT4gc2l6ZS5oZWlnaHQgLSAoaGVhZGVyID8gV0lER0VUX0hFQURFUl9IRUlHSFQudmFsdWUgOiAwKSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLm9wdGlvbnMkLnN1YnNjcmliZSgob3B0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvcHRpb25zKSk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5wcmltYXJ5UHJvcGVydHkkID0gY29tYmluZUxhdGVzdChbdGhpcy5vcHRpb25zJCwgdGhpcy5yZXN1bHRTZXQkXSkucGlwZShcbiAgICAgIGZpbHRlcigoW29wdGlvbnNdKSA9PiAhIW9wdGlvbnMucHJpbWFyeVByb3ApLFxuICAgICAgbWFwKChbb3B0aW9ucywgcnNdKSA9PiB0aGlzLmdldFByb3BlcnR5TGFiZWxzRm9yTGV2ZWwocnMsIG9wdGlvbnMucHJpbWFyeVByb3ApKVxuICAgICk7XG4gICAgdGhpcy5zZWNvbmRhcnlQcm9wZXJ0eSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm9wdGlvbnMkLCB0aGlzLnJlc3VsdFNldCRdKS5waXBlKFxuICAgICAgZmlsdGVyKChbb3B0aW9uc10pID0+ICEhb3B0aW9ucy5zZWNvbmRhcnlQcm9wKSxcbiAgICAgIG1hcCgoW29wdGlvbnMsIHJzXSkgPT4gdGhpcy5nZXRQcm9wZXJ0eUxhYmVsc0ZvckxldmVsKHJzLCBvcHRpb25zLnNlY29uZGFyeVByb3AhLCAxKSlcbiAgICApO1xuICAgIHRoaXMudmVydGljYWxQcm9wZXJ0eSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm9wdGlvbnMkLCB0aGlzLnJlc3VsdFNldCRdKS5waXBlKFxuICAgICAgZmlsdGVyKChbb3B0aW9uc10pID0+ICEhb3B0aW9ucy52ZXJ0aWNhbFByb3ApLFxuICAgICAgbWFwKChbb3B0aW9ucywgcnNdKSA9PiB0aGlzLmdldFByb3BlcnR5TGFiZWxzRm9yTGV2ZWwocnMsIG9wdGlvbnMudmVydGljYWxQcm9wLCAxKSlcbiAgICApO1xuICAgIHRoaXMudG90YWxQcm9wZXJ0eSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm9wdGlvbnMkLCB0aGlzLnJlc3VsdFNldCRdKS5waXBlKFxuICAgICAgbWFwKChbb3B0aW9ucywgcnNdKSA9PiB0aGlzLmdldFByb3BlcnR5TGFiZWxzRm9yTGV2ZWwocnMsIG9wdGlvbnMudmVydGljYWxQcm9wLCAyKSlcbiAgICApO1xuICAgIHRoaXMuZ3JhbmRUb3RhbFByb3BlcnR5JCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMub3B0aW9ucyQsIHRoaXMucmVzdWx0U2V0JF0pLnBpcGUoXG4gICAgICBtYXAoKFtvcHRpb25zLCByc10pID0+IHRoaXMuZ2V0UHJvcGVydHlMYWJlbHNGb3JMZXZlbChycywgb3B0aW9ucy52ZXJ0aWNhbFByb3AsIDMpKVxuICAgICk7XG5cbiAgICB0aGlzLmxpbmVzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5vcHRpb25zJCxcbiAgICAgIHRoaXMucHJpbWFyeVByb3BlcnR5JC5waXBlKHN0YXJ0V2l0aChbXSkpLFxuICAgICAgdGhpcy5zZWNvbmRhcnlQcm9wZXJ0eSQucGlwZShzdGFydFdpdGgodW5kZWZpbmVkKSksXG4gICAgICB0aGlzLnZlcnRpY2FsUHJvcGVydHkkLnBpcGUoc3RhcnRXaXRoKFtdKSksXG4gICAgICB0aGlzLnJlc3VsdFNldCRcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbb3B0aW9ucywgcHJpbWFyeVByb3BzLCBzZWNvbmRhcnlQcm9wcywgdmVydGljYWxQcm9wcywgcnNdKSA9PlxuICAgICAgICB0aGlzLmNyZWF0ZVZhbHVlTWFwKHZlcnRpY2FsUHJvcHMsIHByaW1hcnlQcm9wcywgc2Vjb25kYXJ5UHJvcHMsIHJzLCBvcHRpb25zLCAxKVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLnRvdGFscyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMub3B0aW9ucyQsXG4gICAgICB0aGlzLnByaW1hcnlQcm9wZXJ0eSQsXG4gICAgICB0aGlzLnNlY29uZGFyeVByb3BlcnR5JCxcbiAgICAgIHRoaXMudG90YWxQcm9wZXJ0eSQsXG4gICAgICB0aGlzLnJlc3VsdFNldCRcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbb3B0aW9ucywgcHJpbWFyeVByb3BzLCBzZWNvbmRhcnlQcm9wcywgdmVydGljYWxQcm9wcywgcnNdKSA9PlxuICAgICAgICB0aGlzLmNyZWF0ZVZhbHVlTWFwKHZlcnRpY2FsUHJvcHMsIHByaW1hcnlQcm9wcywgc2Vjb25kYXJ5UHJvcHMsIHJzLCBvcHRpb25zLCAyKVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLmdyYW5kVG90YWxzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5vcHRpb25zJCxcbiAgICAgIHRoaXMucHJpbWFyeVByb3BlcnR5JCxcbiAgICAgIHRoaXMuZ3JhbmRUb3RhbFByb3BlcnR5JCxcbiAgICAgIHRoaXMucmVzdWx0U2V0JFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtvcHRpb25zLCBwcmltYXJ5UHJvcHMsIHZlcnRpY2FsUHJvcHMsIHJzXSkgPT5cbiAgICAgICAgdGhpcy5jcmVhdGVWYWx1ZU1hcCh2ZXJ0aWNhbFByb3BzLCBwcmltYXJ5UHJvcHMsIHVuZGVmaW5lZCwgcnMsIG9wdGlvbnMsIDMpXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuY29sb3JNYXAkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLm9wdGlvbnMkLFxuICAgICAgdGhpcy5yZXN1bHRTZXQkLFxuICAgICAgdGhpcy52ZXJ0aWNhbFByb3BlcnR5JCxcbiAgICAgIHRoaXMucHJpbWFyeVByb3BlcnR5JFxuICAgIF0pLnBpcGUoXG4gICAgICBmaWx0ZXIoKFtvcHRpb25zXSkgPT4gISFvcHRpb25zLmNvbG9yQ29uZmlnKSxcbiAgICAgIG1hcCgoW29wdGlvbnMsIHJzLCB2ZXJ0aWNhbCwgcHJpbWFyeV0pID0+IHRoaXMuY3JlYXRlQ29sb3JNYXAodmVydGljYWwsIHByaW1hcnksIHJzLCBvcHRpb25zKSlcbiAgICApO1xuXG4gICAgdGhpcy5hdmFpbGFibGVQcm9wZXJ0aWVzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuY2xhc3NlcyQsIHRoaXMucmVzdWx0U2V0JF0pLnBpcGUoXG4gICAgICBtYXAoKFtjbGFzc2VzLCByc10pID0+IHtcbiAgICAgICAgY29uc3QgcHJlc2VudENsYXNzZXNJZCA9IE9iamVjdC5rZXlzKHJzLml0ZW1zKTtcbiAgICAgICAgY29uc3QgcHJlc2VudENsYXNzZXMgPSBwcmVzZW50Q2xhc3Nlc0lkXG4gICAgICAgICAgLm1hcCgoY2xhc3NJZCkgPT4gY2xhc3Nlcy5maW5kKChjbCkgPT4gY2wuaWQgPT09IGNsYXNzSWQpKVxuICAgICAgICAgIC5maWx0ZXIoKGNsKSA9PiAhIWNsKSBhcyBDbGFzc1tdO1xuICAgICAgICByZXR1cm4gcHJlc2VudENsYXNzZXMubWFwKChjbCkgPT4gY2wuYXR0cmlidXRlcykuZmxhdCgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaEF0dHJpYnV0ZVZhbHVlKGl0ZW06IEl0ZW0sIHByb3A/OiBzdHJpbmcsIGNvbXBhcmlzb25WYWx1ZT86IHN0cmluZykge1xuICAgIHJldHVybiBjb21wYXJpc29uVmFsdWUgJiYgcHJvcCA/IChpdGVtLmF0dHJpYnV0ZXNbcHJvcF0gYXMgQXR0cmlidXRlU2ltcGxlVmFsdWUpLnZhbHVlID09IGNvbXBhcmlzb25WYWx1ZSA6IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVZhbHVlTWFwKFxuICAgIHZlcnRpY2FsUHJvcHM6IHN0cmluZ1tdLFxuICAgIHByaW1hcnlQcm9wczogc3RyaW5nW10sXG4gICAgc2Vjb25kYXJ5UHJvcHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICAgIHJzOiBSZXN1bHRTZXQsXG4gICAgb3B0aW9uczogQW5hbHl0aWNXaWRnZXRPcHRpb25zLFxuICAgIGxldmVsPzogbnVtYmVyXG4gICkge1xuICAgIHJldHVybiB2ZXJ0aWNhbFByb3BzLm1hcCgodmVydGljYWwpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0ge30gYXMgeyBba2V5OiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgYW55IH07XG4gICAgICBwcmltYXJ5UHJvcHMuZm9yRWFjaCgocHJpbWFyeSkgPT4ge1xuICAgICAgICAoc2Vjb25kYXJ5UHJvcHMgPz8gW3VuZGVmaW5lZF0pLmZvckVhY2goKHNlY29uZGFyeSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nSXRlbSA9IChycy5pdGVtc1tPYmplY3Qua2V5cyhycy5pdGVtcylbMF1dID8/IFtdKS5maW5kKFxuICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgIHRoaXMubWF0Y2hBdHRyaWJ1dGVWYWx1ZShpdGVtLCBvcHRpb25zLnByaW1hcnlQcm9wLCBwcmltYXJ5KSAmJlxuICAgICAgICAgICAgICB0aGlzLm1hdGNoQXR0cmlidXRlVmFsdWUoaXRlbSwgb3B0aW9ucy5zZWNvbmRhcnlQcm9wLCBzZWNvbmRhcnkpICYmXG4gICAgICAgICAgICAgIHRoaXMubWF0Y2hBdHRyaWJ1dGVWYWx1ZShpdGVtLCBvcHRpb25zLnZlcnRpY2FsUHJvcCwgdmVydGljYWwpICYmXG4gICAgICAgICAgICAgIHRoaXMubWF0Y2hBdHRyaWJ1dGVWYWx1ZShpdGVtLCAnbGV2ZWwnLCBsZXZlbCArICcnKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCEhbWF0Y2hpbmdJdGVtKSB7XG4gICAgICAgICAgICBpZiAoISFzZWNvbmRhcnkpIHtcbiAgICAgICAgICAgICAgaWYgKCF2YWx1ZVtwcmltYXJ5XSkge1xuICAgICAgICAgICAgICAgIHZhbHVlW3ByaW1hcnldID0ge307XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFsdWVbcHJpbWFyeV1bc2Vjb25kYXJ5XSA9IChtYXRjaGluZ0l0ZW0hLmF0dHJpYnV0ZXNbb3B0aW9ucy52YWx1ZVByb3BdIGFzIEF0dHJpYnV0ZVNpbXBsZVZhbHVlKS52YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlW3ByaW1hcnldID0gKG1hdGNoaW5nSXRlbSEuYXR0cmlidXRlc1tvcHRpb25zLnZhbHVlUHJvcF0gYXMgQXR0cmlidXRlU2ltcGxlVmFsdWUpPy52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBuYW1lOiB2ZXJ0aWNhbCwgdmFsdWUgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFByb3BlcnR5TGFiZWxzRm9yTGV2ZWwocnM6IFJlc3VsdFNldCwgcHJvcGVydHk6IHN0cmluZywgbGV2ZWw/OiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKHJzLml0ZW1zKVxuICAgICAgLm1hcCgoaXRlbXMpID0+XG4gICAgICAgIGl0ZW1zXG4gICAgICAgICAgLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgICAgICAgIGxldmVsICYmICdsZXZlbCcgaW4gaXRlbS5hdHRyaWJ1dGVzXG4gICAgICAgICAgICAgID8gW2xldmVsLCAnJyArIGxldmVsXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgIChpdGVtLmF0dHJpYnV0ZXNbJ2xldmVsJ10gYXMgQXR0cmlidXRlU2ltcGxlVmFsdWUpLnZhbHVlIGFzIHN0cmluZyB8IG51bWJlclxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiB0cnVlXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IChpdGVtLmF0dHJpYnV0ZXNbcHJvcGVydHldIGFzIEF0dHJpYnV0ZVNpbXBsZVZhbHVlKS52YWx1ZSArICcnKVxuICAgICAgKVxuICAgICAgLmZsYXQoKVxuICAgICAgLmZsYXQoKTtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQodmFsdWVzKV07XG4gIH1cblxuICBjcmVhdGVDb2xvck1hcCh2ZXJ0aWNhbFByb3BzOiBzdHJpbmdbXSwgcHJpbWFyeVByb3BzOiBzdHJpbmdbXSwgcnM6IFJlc3VsdFNldCwgb3B0aW9uczogQW5hbHl0aWNXaWRnZXRPcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuY29sb3JDb25maWdcbiAgICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIHZlcnRpY2FsUHJvcHMubWFwKCh2ZXJ0aWNhbCkgPT4gW1xuICAgICAgICAgICAgdmVydGljYWwsXG4gICAgICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgIHByaW1hcnlQcm9wcy5tYXAoKHByaW1hcnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGluZ0l0ZW0gPSAocnMuaXRlbXNbT2JqZWN0LmtleXMocnMuaXRlbXMpWzBdXSA/PyBbXSkuZmluZChcbiAgICAgICAgICAgICAgICAgIChpdGVtKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoQXR0cmlidXRlVmFsdWUoaXRlbSwgb3B0aW9ucy5wcmltYXJ5UHJvcCwgcHJpbWFyeSkgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaEF0dHJpYnV0ZVZhbHVlKGl0ZW0sIG9wdGlvbnMudmVydGljYWxQcm9wLCB2ZXJ0aWNhbClcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgIHByaW1hcnksXG4gICAgICAgICAgICAgICAgICBtYXRjaGluZ0l0ZW0gJiYgKG1hdGNoaW5nSXRlbS5hdHRyaWJ1dGVzW29wdGlvbnMudmFsdWVQcm9wXSBhcyBBdHRyaWJ1dGVTaW1wbGVWYWx1ZSkudmFsdWUgIT09IDBcbiAgICAgICAgICAgICAgICAgICAgPyBvcHRpb25zLmNvbG9yQ29uZmlnPy5jb2xvcnNbXG4gICAgICAgICAgICAgICAgICAgICAgICAoKG1hdGNoaW5nSXRlbS5hdHRyaWJ1dGVzW29wdGlvbnMuY29sb3JDb25maWchLnByb3BdIGFzIEF0dHJpYnV0ZVNpbXBsZVZhbHVlKS52YWx1ZSBhcyBudW1iZXIpIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgOiAnI0ZGRkZGRidcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIF0pXG4gICAgICAgIClcbiAgICAgIDoge307XG4gIH1cblxuICB0b2dnbGVDb2xvckNvbmZpZygkZXZlbnQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoJGV2ZW50ICE9PSAhIXRoaXMub3B0aW9uc0NvcHkuY29sb3JDb25maWcpIHtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zQ29weS5jb2xvckNvbmZpZykge1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LmNvbG9yQ29uZmlnID0geyBwcm9wOiAnJywgY29sb3JzOiBbXSB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5jb2xvckNvbmZpZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0b2dnbGVGb3JtYXQoJGV2ZW50OiBib29sZWFuKSB7XG4gICAgaWYgKCRldmVudCAhPT0gISF0aGlzLm9wdGlvbnNDb3B5LmZvcm1hdCkge1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnNDb3B5LmZvcm1hdCkge1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LmZvcm1hdCA9IHsgc3VmZml4OiAnJyB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5mb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbW9kaWZ5Q29sb3JTY2hlbWUoJGV2ZW50Pzogc3RyaW5nLCBpbmRleD86IG51bWJlcikge1xuICAgICRldmVudCAmJiBpbmRleCAhPT0gdW5kZWZpbmVkXG4gICAgICA/ICh0aGlzLm9wdGlvbnNDb3B5LmNvbG9yQ29uZmlnIS5jb2xvcnNbaW5kZXhdID0gJGV2ZW50KVxuICAgICAgOiB0aGlzLm9wdGlvbnNDb3B5LmNvbG9yQ29uZmlnIS5jb2xvcnMucHVzaCgnI0ZGRkZGRicpO1xuICB9XG5cbiAgcmVtb3ZlQ29sb3IoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMub3B0aW9uc0NvcHkuY29sb3JDb25maWchLmNvbG9ycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XG4gICAgdGhpcy5vcHRpb25zQ29weS5jb2xvckNvbmZpZyEuY29sb3JzLnNwbGljZShcbiAgICAgIGV2ZW50LmN1cnJlbnRJbmRleCxcbiAgICAgIDAsXG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmNvbG9yQ29uZmlnIS5jb2xvcnMuc3BsaWNlKGV2ZW50LnByZXZpb3VzSW5kZXgsIDEpWzBdXG4gICAgKTtcbiAgfVxuXG4gIGVtaXRNYW5pZmVzdCgpIHtcbiAgICB0aGlzLm1hbmlmZXN0TW9kaWZpZWQuZW1pdCh7XG4gICAgICB3aWRnZXRJbmRleDogdGhpcy53aWRnZXRJbmRleCxcbiAgICAgIG1hbmlmZXN0OiB7IC4uLnRoaXMubWFuaWZlc3QsIG9wdGlvbnM6IHRoaXMub3B0aW9uc0NvcHkgfVxuICAgIH0pO1xuICB9XG59XG4iLCI8cHJ5LXdpZGdldC1hbmFseXRpYy1jc3M+PC9wcnktd2lkZ2V0LWFuYWx5dGljLWNzcz5cbjxkaXYgY2xhc3M9XCJvLXdpZGdldCBvLXdpZGdldF9fYW5hbHl0aWNcIj5cbiAgPHByeS13aWRnZXQtaGVhZGVyXG4gICAgKm5nSWY9XCJkaXNwbGF5SGVhZGVyJCB8IGFzeW5jXCJcbiAgICBbd2lkZ2V0SW5kZXhdPVwid2lkZ2V0SW5kZXhcIlxuICAgIFttYW5pZmVzdF09XCJtYW5pZmVzdFwiXG4gICAgKG1hbmlmZXN0TW9kaWZpZWQpPVwibWFuaWZlc3RNb2RpZmllZC5lbWl0KCRldmVudClcIlxuICAgICNoZWFkZXJcbiAgICBbaGVhZGVyT3B0aW9uc109XCIoZGlzcGxheUhlYWRlciQgfCBhc3luYykgPz8ge31cIlxuICAgIFtkYXRhc291cmNlSWRzXT1cIihkYXRhc291cmNlSWRzJCB8IGFzeW5jKSA/PyBbXVwiXG4gID5cbiAgICA8cHJ5LXNldHRpbmdzXG4gICAgICAoc2F2ZVRyaWdnZXJlZCk9XCJlbWl0TWFuaWZlc3QoKVwiXG4gICAgICAoY2hhbmdlVGl0bGUpPVwiY2hhbmdlV2lkZ2V0VGl0bGUoJGV2ZW50KVwiXG4gICAgICBbaGVhZGVyUHJlc2VudF09XCJkaXNwbGF5SGVhZGVyJCB8IGFzeW5jXCJcbiAgICAgIFt3aWRnZXRJbmRleF09XCJ3aWRnZXRJbmRleFwiXG4gICAgICBbaGVhZGVyXT1cImhlYWRlclwiXG4gICAgICBbb3BlbiRdPVwib3BlbiRcIlxuICAgICAgY2xhc3M9XCJvLXNldHRpbmdzXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiby1zZXR0aW5nc19fZmllbGRzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwicHJpbWFyeVByb3BcIj57eyAnQHByeS53aWRnZXQuYW5hbHl0aWMucHJpbWFyeVByb3AnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZSgkZXZlbnQsICdwcmltYXJ5UHJvcCcpXCJcbiAgICAgICAgICAgIFtpdGVtc109XCJhdmFpbGFibGVQcm9wZXJ0aWVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9wdGlvbnNDb3B5LnByaW1hcnlQcm9wXCJcbiAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgYmluZFZhbHVlPVwibmFtZVwiXG4gICAgICAgICAgICBpZD1cInByaW1hcnlQcm9wXCJcbiAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJzZWNvbmRhcnlQcm9wXCI+e3sgJ0Bwcnkud2lkZ2V0LmFuYWx5dGljLnNlY29uZGFyeVByb3AnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZSgkZXZlbnQsICdzZWNvbmRhcnlQcm9wJylcIlxuICAgICAgICAgICAgW2l0ZW1zXT1cImF2YWlsYWJsZVByb3BlcnRpZXMkIHwgYXN5bmNcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuc2Vjb25kYXJ5UHJvcFwiXG4gICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgIGJpbmRWYWx1ZT1cIm5hbWVcIlxuICAgICAgICAgICAgaWQ9XCJzZWNvbmRhcnlQcm9wXCJcbiAgICAgICAgICAgIFtjbGVhcmFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwidmVydGljYWxQcm9wXCI+e3sgJ0Bwcnkud2lkZ2V0LmFuYWx5dGljLnZlcnRpY2FsUHJvcCcgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlKCRldmVudCwgJ3ZlcnRpY2FsUHJvcCcpXCJcbiAgICAgICAgICAgIFtpdGVtc109XCJhdmFpbGFibGVQcm9wZXJ0aWVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9wdGlvbnNDb3B5LnZlcnRpY2FsUHJvcFwiXG4gICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgIGJpbmRWYWx1ZT1cIm5hbWVcIlxuICAgICAgICAgICAgaWQ9XCJ2ZXJ0aWNhbFByb3BcIlxuICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cInZhbHVlUHJvcFwiPnt7ICdAcHJ5LndpZGdldC5hbmFseXRpYy52YWx1ZVByb3AnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZSgkZXZlbnQsICd2YWx1ZVByb3AnKVwiXG4gICAgICAgICAgICBbaXRlbXNdPVwiYXZhaWxhYmxlUHJvcGVydGllcyQgfCBhc3luY1wiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb25zQ29weS52YWx1ZVByb3BcIlxuICAgICAgICAgICAgYmluZExhYmVsPVwibmFtZVwiXG4gICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgIGlkPVwidmFsdWVQcm9wXCJcbiAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgIDxwcnktY2hlY2tib3ggKG5nTW9kZWxDaGFuZ2UpPVwidG9nZ2xlQ29sb3JDb25maWcoJGV2ZW50KVwiIFtuZ01vZGVsXT1cIiEhb3B0aW9uc0NvcHkuY29sb3JDb25maWdcIj5cbiAgICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5hbmFseXRpYy5jb2xvckNvbmZpZycgfCBpMThuIH19XG4gICAgICAgICAgPC9wcnktY2hlY2tib3g+XG4gICAgICAgICAgQGlmIChvcHRpb25zQ29weS5jb2xvckNvbmZpZykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwiY29sb3JQcm9wXCI+e3sgJ0Bwcnkud2lkZ2V0LmFuYWx5dGljLmNvbG9yUHJvcCcgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VDb2xvckNvbmZpZygkZXZlbnQsICdwcm9wJylcIlxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJhdmFpbGFibGVQcm9wZXJ0aWVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb25zQ29weS5jb2xvckNvbmZpZy5wcm9wXCJcbiAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBpZD1cImNvbG9yUHJvcFwiXG4gICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImNvbG9yUHJvcFwiPnt7ICdAcHJ5LndpZGdldC5hbmFseXRpYy5jb2xvcnMnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm8td2lkZ2V0X19hbmFseXRpY19fY29sb3ItcGlja2VyLWNvbnRhaW5lciB1LWRpc3BsYXktZmxleCAtYWxpZ24tY2VudGVyXCJcbiAgICAgICAgICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBjZGtEcm9wTGlzdE9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBAZm9yIChjb2xvciBvZiBvcHRpb25zQ29weS5jb2xvckNvbmZpZy5jb2xvcnM7IHRyYWNrIGNvbG9yOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm8td2lkZ2V0X19hbmFseXRpY19fY29sb3ItcGlja2VyXCIgY2RrRHJhZz5cbiAgICAgICAgICAgICAgICAgICAgPHByeS1jb2xvci1waWNrZXJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwibW9kaWZ5Q29sb3JTY2hlbWUoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3ByeS1jb2xvci1waWNrZXI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInJlbW92ZUNvbG9yKGkpXCIgY2xhc3M9XCJvLXdpZGdldF9fYW5hbHl0aWNfX2NvbG9yLXBpY2tlci1yZW1vdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImNsb3NlXCIgW2hlaWdodF09XCIxNVwiIFt3aWR0aF09XCIxNVwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpjZGtEcmFnUHJldmlldz5cbiAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWNvbG9yLXBpY2tlciBbbmdNb2RlbF09XCJjb2xvclwiPjwvcHJ5LWNvbG9yLXBpY2tlcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHkgby13aWRnZXRfX2FuYWx5dGljX19jb2xvci1waWNrZXItYWRkXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb2RpZnlDb2xvclNjaGVtZSgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImFkZFwiIFtoZWlnaHRdPVwiMjBcIiBbd2lkdGhdPVwiMjBcIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICA8cHJ5LWNoZWNrYm94IChuZ01vZGVsQ2hhbmdlKT1cInRvZ2dsZUZvcm1hdCgkZXZlbnQpXCIgW25nTW9kZWxdPVwiISFvcHRpb25zQ29weS5mb3JtYXRcIj5cbiAgICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5hbmFseXRpYy5mb3JtYXQnIHwgaTE4biB9fVxuICAgICAgICAgIDwvcHJ5LWNoZWNrYm94PlxuICAgICAgICAgIEBpZiAob3B0aW9uc0NvcHkuZm9ybWF0KSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJmb3JtYXRcIj57eyAnQHByeS53aWRnZXQuYW5hbHl0aWMuc3VmZml4JyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgIGlkPVwiZm9ybWF0XCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb25zQ29weS5mb3JtYXQuc3VmZml4XCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VGb3JtYXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9wcnktc2V0dGluZ3M+XG4gIDwvcHJ5LXdpZGdldC1oZWFkZXI+XG4gIDxkaXYgY2xhc3M9XCJvLXdpZGdldF9fYW5hbHl0aWNfX3RhYmxlXCI+XG4gICAgPHRhYmxlIFtzdHlsZS5oZWlnaHQucHhdPVwiaGVpZ2h0JCB8IGFzeW5jXCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0ciBjbGFzcz1cInByaW1hcnktaGVhZGVyXCI+XG4gICAgICAgICAgPHRoPjwvdGg+XG4gICAgICAgICAgQGZvciAocHJpbWFyeSBvZiBwcmltYXJ5UHJvcGVydHkkIHwgYXN5bmM7IHRyYWNrIHByaW1hcnkpIHtcbiAgICAgICAgICAgIDx0aCBbY29sU3Bhbl09XCIoc2Vjb25kYXJ5UHJvcGVydHkkIHwgYXN5bmMpPy5sZW5ndGggPz8gMVwiPlxuICAgICAgICAgICAgICB7eyBwcmltYXJ5IH19XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90cj5cbiAgICAgICAgQGlmIChvcHRpb25zQ29weS5zZWNvbmRhcnlQcm9wKSB7XG4gICAgICAgICAgPHRyIGNsYXNzPVwic2Vjb25kYXJ5LWhlYWRlclwiPlxuICAgICAgICAgICAgPHRoPjwvdGg+XG4gICAgICAgICAgICBAZm9yIChwcmltYXJ5IG9mIHByaW1hcnlQcm9wZXJ0eSQgfCBhc3luYzsgdHJhY2sgcHJpbWFyeSkge1xuICAgICAgICAgICAgICBAZm9yIChzZWNvbmRhcnkgb2Ygc2Vjb25kYXJ5UHJvcGVydHkkIHwgYXN5bmM7IHRyYWNrIHNlY29uZGFyeSkge1xuICAgICAgICAgICAgICAgIDx0aD57eyBzZWNvbmRhcnkgfX08L3RoPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT5cbiAgICAgICAgQGZvciAobGluZSBvZiBsaW5lcyQgfCBhc3luYzsgdHJhY2sgbGluZS5uYW1lKSB7XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoPnt7IGxpbmUubmFtZSB9fTwvdGg+XG4gICAgICAgICAgICBAZm9yIChwcmltYXJ5IG9mIHByaW1hcnlQcm9wZXJ0eSQgfCBhc3luYzsgdHJhY2sgcHJpbWFyeSkge1xuICAgICAgICAgICAgICBAaWYgKG9wdGlvbnNDb3B5LnNlY29uZGFyeVByb3ApIHtcbiAgICAgICAgICAgICAgICBAZm9yIChzZWNvbmRhcnkgb2Ygc2Vjb25kYXJ5UHJvcGVydHkkIHwgYXN5bmM7IHRyYWNrIHNlY29uZGFyeSkge1xuICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNDb3B5LmNvbG9yQ29uZmlnID8geyAnYmFja2dyb3VuZC1jb2xvcic6IChjb2xvck1hcCQgfCBhc3luYyk/LltsaW5lLm5hbWVdPy5bcHJpbWFyeV0gfSA6IHt9XG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7IGxpbmUudmFsdWVbcHJpbWFyeV1bc2Vjb25kYXJ5XSB8IGRhdGFGb3JtYXQ6IHRydWUgOiBvcHRpb25zQ29weS5mb3JtYXQ/LnN1ZmZpeCB9fVxuICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNDb3B5LmNvbG9yQ29uZmlnID8geyAnYmFja2dyb3VuZC1jb2xvcic6IChjb2xvck1hcCQgfCBhc3luYyk/LltsaW5lLm5hbWVdPy5bcHJpbWFyeV0gfSA6IHt9XG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IGxpbmUudmFsdWVbcHJpbWFyeV0gfCBkYXRhRm9ybWF0OiB0cnVlIDogb3B0aW9uc0NvcHkuZm9ybWF0Py5zdWZmaXggfX1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuICAgICAgPC90Ym9keT5cbiAgICAgIDx0Zm9vdD5cbiAgICAgICAgQGZvciAobGluZSBvZiB0b3RhbHMkIHwgYXN5bmM7IHRyYWNrIGxpbmUubmFtZSkge1xuICAgICAgICAgIDx0ciBjbGFzcz1cInBhcnRpYWwtdG90YWxcIj5cbiAgICAgICAgICAgIDx0aD57eyBsaW5lLm5hbWUgfX08L3RoPlxuICAgICAgICAgICAgQGZvciAocHJpbWFyeSBvZiBwcmltYXJ5UHJvcGVydHkkIHwgYXN5bmM7IHRyYWNrIHByaW1hcnkpIHtcbiAgICAgICAgICAgICAgQGZvciAoc2Vjb25kYXJ5IG9mIHNlY29uZGFyeVByb3BlcnR5JCB8IGFzeW5jOyB0cmFjayBzZWNvbmRhcnkpIHtcbiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICB7eyBsaW5lLnZhbHVlW3ByaW1hcnldW3NlY29uZGFyeV0gfX1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuICAgICAgICBAZm9yIChsaW5lIG9mIGdyYW5kVG90YWxzJCB8IGFzeW5jOyB0cmFjayBsaW5lLm5hbWUpIHtcbiAgICAgICAgICA8dHIgY2xhc3M9XCJncmFuZC10b3RhbFwiPlxuICAgICAgICAgICAgPHRoPnt7IGxpbmUubmFtZSB9fTwvdGg+XG4gICAgICAgICAgICBAZm9yIChwcmltYXJ5IG9mIHByaW1hcnlQcm9wZXJ0eSQgfCBhc3luYzsgdHJhY2sgcHJpbWFyeSkge1xuICAgICAgICAgICAgICA8dGQgW2NvbFNwYW5dPVwiKHNlY29uZGFyeVByb3BlcnR5JCB8IGFzeW5jKT8ubGVuZ3RoID8/IDFcIj5cbiAgICAgICAgICAgICAgICB7eyBsaW5lLnZhbHVlW3ByaW1hcnldIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuICAgICAgPC90Zm9vdD5cbiAgICA8L3RhYmxlPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|