gamma-app-controller 2.0.24 → 3.0.1

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.
@@ -12,6 +12,7 @@ import * as i8 from "devextreme-angular/ui/tag-box";
12
12
  import * as i9 from "devextreme-angular/ui/text-box";
13
13
  import * as i10 from "@angular/forms";
14
14
  import * as i11 from "../../../shared/loader/loader.component";
15
+ import * as i12 from "../../../shared/advanced-component/gamma-heatmap/gamma-heatmap.component";
15
16
  export class HeatMapSupportComponent {
16
17
  constructor(toastrService, commonService, cdr, service) {
17
18
  this.toastrService = toastrService;
@@ -35,6 +36,7 @@ export class HeatMapSupportComponent {
35
36
  "visible": true,
36
37
  "dataField": "",
37
38
  "caption": "",
39
+ "displayFor": "",
38
40
  "enrichName": "",
39
41
  }
40
42
  ],
@@ -188,6 +190,7 @@ export class HeatMapSupportComponent {
188
190
  ]
189
191
  }
190
192
  ];
193
+ this.chartDataSource = {};
191
194
  this.getHeatMapConfigOutPut = new EventEmitter();
192
195
  }
193
196
  set chartconfigData(value) {
@@ -204,6 +207,7 @@ export class HeatMapSupportComponent {
204
207
  this.heatmap_content_config['kpiConfig'] = value.selectedWidgetConfig;
205
208
  this.heatmapChartConfig = value.selectedWidgetConfig.dataConfig;
206
209
  this.heatmapChartConfig.columns = value.selectedWidgetConfig.dataConfig.columns;
210
+ this.colorArray = value.selectedWidgetConfig.dataConfig.color;
207
211
  if (value.selectedWidgetConfig.viewProperties) {
208
212
  this.viewProperties = value.selectedWidgetConfig.viewProperties;
209
213
  if (value.selectedWidgetConfig.viewProperties.enableClickEvent) {
@@ -264,6 +268,29 @@ export class HeatMapSupportComponent {
264
268
  ];
265
269
  }
266
270
  }
271
+ addColumns() {
272
+ let obj = {
273
+ "dataField": "",
274
+ "caption": "",
275
+ "enrichName": "",
276
+ "displayFor": "",
277
+ "visible": true
278
+ };
279
+ this.heatmapChartConfig.columns.push(obj);
280
+ }
281
+ deleteColumns(i) {
282
+ this.heatmapChartConfig.columns.splice(i, 1);
283
+ }
284
+ moveItemForColumns(index, direction) {
285
+ if (index < 0 || index >= this.heatmapChartConfig.columns.length)
286
+ return;
287
+ const newPosition = direction === 'up' ? index - 1 : index + 1;
288
+ if (newPosition < 0 || newPosition >= this.heatmapChartConfig.columns.length)
289
+ return;
290
+ const itemToMove = this.heatmapChartConfig.columns[index];
291
+ this.heatmapChartConfig.columns.splice(index, 1);
292
+ this.heatmapChartConfig.columns.splice(newPosition, 0, itemToMove);
293
+ }
267
294
  getHeatmapData() {
268
295
  this.heatChartDataSource = {};
269
296
  this.isAdvanceFilter = false;
@@ -282,6 +309,9 @@ export class HeatMapSupportComponent {
282
309
  }
283
310
  this.isHeatMapLoader = false;
284
311
  this.isHeatMapClick = false;
312
+ this.chartDataSource = this.heatmap_content_config;
313
+ this.chartDataSource.kpiConfig['dataSource'] = this.dataSourseForHeatMap;
314
+ this.chartDataSource.kpiConfig['dataConfig'] = this.heatmapChartConfig;
285
315
  }
286
316
  else {
287
317
  this.isHeatMapClick = false;
@@ -543,14 +573,14 @@ export class HeatMapSupportComponent {
543
573
  }
544
574
  }
545
575
  HeatMapSupportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: HeatMapSupportComponent, deps: [{ token: i1.ToastrService }, { token: i2.CommonService }, { token: i0.ChangeDetectorRef }, { token: i3.ApplicationContentService }], target: i0.ɵɵFactoryTarget.Component });
546
- HeatMapSupportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: HeatMapSupportComponent, selector: "app-heat-map", inputs: { chartconfigData: ["datasetmodal", "chartconfigData"] }, outputs: { getHeatMapConfigOutPut: "getHeatMapConfigOutPut" }, ngImport: i0, template: "<div class=\"m-2\">\n <div class=\"w-full m-2 border-r\">\n <ng-container *ngIf=\"!isJsonPreview\">\n <pre><code>{{jsaonDatasource | json}}</code></pre>\n </ng-container>\n <ng-container *ngIf=\"isJsonPreview\">\n <ng-container *ngIf=\"heatmapChartConfig.chartFormat == 'simple'\">\n <div class=\"mx-5 h-[60vh] overflow-x-auto\">\n <div class=\"inline-block\">\n <div class=\"flex flex-nowrap justify-center\">\n <div class=\"flex-shrink-0 w-64 max-w-[20%] h-10 flex items-center justify-center\"></div>\n <div *ngFor=\"let item of heatChartDataSource.argumentValue\"\n class=\"flex-shrink-0 min-w-22 max-w-[20%] h-8 text-sm flex items-center justify-center\">\n {{item}}\n </div>\n </div>\n </div>\n <ng-container *ngFor=\"let item of heatChartDataSource.dataSet\">\n <div class=\"flex flex-row\">\n <div class=\"h-8 flex text-sm items-center min-w-64 justify-end px-2 inline\">\n {{ item.datasource }}\n </div>\n <div class=\"inline-block\">\n <div class=\"flex flex-nowrap justify-start\">\n <ng-container *ngFor=\"let box of item.dataset\">\n <div class=\"flex-shrink-0 min-w-22 max-w-[20%] h-8 border-2 text-sm cursor-pointer flex items-center justify-center text-gray-800\"\n [ngStyle]=\"{ 'background-color': box.color }\"\n [attr.title]=\"'Record Date: ' + box[heatmapChartConfig.topArgument] + ', Value: ' + box[heatmapChartConfig.columns[0].dataField]\">\n {{ box[heatmapChartConfig.columns[0].dataField]}}\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"heatmapChartConfig.chartFormat == 'topx'\">\n <div class=\"mx-5 h-[60vh] overflow-x-auto\">\n <div class=\"flex flex-row\">\n <ng-container *ngFor=\"let header of heatChartDataSource.argumentValue\">\n <div class=\"min-w-32 text-sm font-medium text-center mb-2\">\n {{ header }}\n </div>\n </ng-container>\n </div>\n\n <!-- Heatmap Body (Top to Bottom Layout) -->\n <div *ngFor=\"let row of heatChartDataSource.dataSet\" class=\"flex flex-row\">\n <ng-container *ngFor=\"let cell of row\">\n <div *ngIf=\"cell.box\"\n class=\"h-8 border-2 text-sm cursor-pointer flex items-center justify-center text-gray-800 min-w-32\"\n [ngStyle]=\"{ 'background-color': cell.box.color }\"\n [attr.title]=\"'Record Date: ' + cell.heatmapChartConfig.topArgument + ', Value: ' + cell.box.heatmapChartConfig.columns[0].dataField\">\n {{ cell.box.heatmapChartConfig.leftArgument }} ({{ commonService.abbreviateNumber(cell.box.heatmapChartConfig.columns[0].dataField) }})\n </div>\n <div *ngIf=\"!cell.box\" class=\"h-8 min-w-32\"></div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n \n \n </ng-container>\n </div>\n <div class=\"w-full mx-2 border-r\">\n <div class=\"mb-4 border-b border-gray-200 dark:border-gray-700\">\n <ul class=\"flex flex-wrap -mb-px text-sm font-medium text-center\" role=\"tablist\">\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'basic',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'basic'\n }\" (click)=\"setActiveTab('basic')\" type=\"button\" role=\"tab\">\n Basic\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'columns',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'columns'\n }\" (click)=\"setActiveTab('columns')\" type=\"button\" role=\"tab\">\n Columns\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'properties',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'properties'\n }\" (click)=\"setActiveTab('properties')\" type=\"button\" role=\"tab\">\n Properties\n </button>\n </li>\n\n </ul>\n </div>\n\n <div id=\"default-styled-tab-content\">\n <div *ngIf=\"activeTab === 'basic'\">\n <div class=\"flex flex-col flex-auto min-w-0\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Title Config\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Title</div>\n <dx-select-box [(ngModel)]=\"heatmapChartConfig.chartFormat\" [items]=\"['simple','topx']\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Top Argument</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatmapChartConfig.topArgument\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Left Argument</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatmapChartConfig.leftArgument\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Color Usage</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['gradient','twoColor','singleColor',]\"\n [(ngModel)]=\"heatmapChartConfig.type\"\n (onValueChanged)=\"getColorBoxVisible($event)\"></dx-select-box>\n </div>\n\n <ng-container\n *ngIf=\"heatmapChartConfig.type == 'gradient' || heatmapChartConfig.type == 'twoColor'\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Color</div>\n <dx-color-box [(ngModel)]=\"firstColor\" [editAlphaChannel]=\"true\"></dx-color-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Color</div>\n <dx-color-box [(ngModel)]=\"secondColor\" [editAlphaChannel]=\"true\"></dx-color-box>\n </div>\n\n </ng-container>\n <ng-container *ngIf=\"heatmapChartConfig.type == 'singleColor'\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Color</div>\n <dx-color-box [(ngModel)]=\"singleColor\" [editAlphaChannel]=\"true\"></dx-color-box>\n </div>\n\n </ng-container>\n <div class=\"px-1 mb-1 w-full\" *ngIf=\"heatmapChartConfig.type !== ''\">\n <button class=\"{{commonService.btn_primary_md}} mt-6\" (click)=\"saveColors()\">Check\n View</button>\n </div>\n\n\n\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'columns'\">\n <div class=\"h-full overflow-x-auto\">\n <div class=\"flex flex-col flex-auto min-w-0\">\n\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 border-b flex flex-row\"\n *ngFor=\"let item of heatmapChartConfig.columns; let i = index;\">\n <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [value]=\"item.visible\" [(ngModel)]=\"item.visible\"\n text=\"Visiblity\"></dx-check-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"item.dataField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Caption</div>\n <dx-text-box [(ngModel)]=\"item.caption\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-full\">\n <div class=\"text-md mb-2\"> UI Function</div>\n <dx-select-box [items]=\"enrichNameList\" [(ngModel)]=\"item.enrichName\"\n [searchEnabled]=\"true\"></dx-select-box>\n </div>\n\n\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'properties'\">\n <div class=\"h-full overflow-x-auto\">\n <app-loader *ngIf=\"isLoader\"></app-loader>\n <ng-container *ngIf=\"!isLoader\">\n <div class=\"flex flex-row justify-between border-b py-3\">\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableClickEvent\"\n [(ngModel)]=\"viewProperties.enableClickEvent\"\n text=\"Enable Click Event\"></dx-check-box>\n </div>\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableRightClickEvent\"\n [(ngModel)]=\"viewProperties.enableRightClickEvent\"\n text=\"Enable Right Click\"></dx-check-box>\n </div>\n </div>\n <div class=\"w-full p-2\" *ngIf=\"viewProperties.enableClickEvent\">\n\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Event\n Type\n Option\n </div>\n <div class=\"w-full p-3 border-x border-b \">\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Event Type</div>\n </div>\n <div class=\"w-full\">\n <dx-select-box\n [items]=\"['drilldown','sameViewDrilldown','optionalDrillDown']\"\n (onValueChanged)=\"getSelectedEventType($event)\"\n [(ngModel)]=\"viewProperties.clickEventOptions.eventType\"></dx-select-box>\n </div>\n </div>\n <ng-container *ngIf=\"viewProperties.clickEventOptions.eventType == 'drilldown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"viewProperties.clickEventOptions.associatedViews\"\n valueExpr=\"viewId\" displayExpr=\"viewName\"\n [showSelectionControls]=\"true\" [searchEnabled]=\"true\"></dx-tag-box>\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"viewProperties.clickEventOptions.eventType == 'sameViewDrilldown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"viewProperties.clickEventOptions.associatedViews\"\n valueExpr=\"viewId\" displayExpr=\"viewName\"\n [showSelectionControls]=\"true\" [searchEnabled]=\"true\"></dx-tag-box>\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"viewProperties.clickEventOptions.eventType == 'optionalDrillDown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <ng-container\n *ngFor=\"let item of optionalDrilDownDataSource;let i = index;\">\n\n <div class=\"flex flex-row justify-between\">\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"item.viewId\" valueExpr=\"viewId\"\n displayExpr=\"viewName\" [showSelectionControls]=\"true\"\n [maxDisplayedTags]=\"2\"\n [searchEnabled]=\"true\"></dx-tag-box>\n\n </div>\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\"> Associated Params</div>\n <dx-text-box\n [(ngModel)]=\"item.filterCondition\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteAssociatedParams(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n <div class=\"flex flex-row justify-end mt-4\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addAssociatedParams()\">Add\n Params</button>\n </div>\n </div>\n </div>\n </ng-container>\n <button class=\"{{commonService.btn_light_md}} cursor-pointer mt-4\"\n (click)=\"resetViewProprstise()\">Reset All Event</button>\n </div>\n </div>\n\n </div>\n </ng-container>\n </div>\n </div>\n\n </div>\n\n\n </div>\n</div>\n\n\n<div class=\"flex flex-row border-t pl-3\">\n <div class=\"flex justify-start mx-1\">\n <button class=\"{{commonService.btn_warning_md}} cursor-pointer mt-2\" (click)=\"isJsonPreview = true\">\n Preview</button>\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer mt-2\" (click)=\"isJsonPreview = false\">Data\n Preview</button>\n </div>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"getSaveChartConfig()\">Submit</button>\n </div>\n</div>", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i6.DxColorBoxComponent, selector: "dx-color-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyButtonText", "applyValueMode", "buttons", "cancelButtonText", "deferRendering", "disabled", "dropDownButtonTemplate", "dropDownOptions", "editAlphaChannel", "elementAttr", "fieldTemplate", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "keyStep", "label", "labelMode", "name", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showDropDownButton", "stylingMode", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onChange", "onClosed", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyButtonTextChange", "applyValueModeChange", "buttonsChange", "cancelButtonTextChange", "deferRenderingChange", "disabledChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "editAlphaChannelChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "keyStepChange", "labelChange", "labelModeChange", "nameChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showDropDownButtonChange", "stylingModeChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i7.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i8.DxTagBoxComponent, selector: "dx-tag-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyValueMode", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hideSelectedItems", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxDisplayedTags", "maxFilterQueryLength", "maxLength", "minSearchLength", "multiline", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectAllMode", "selectAllText", "selectedItems", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showMultiTagOnly", "showSelectionControls", "stylingMode", "tabIndex", "tagTemplate", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCustomItemCreating", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onMultiTagPreparing", "onOpened", "onOptionChanged", "onSelectAllValueChanged", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyValueModeChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hideSelectedItemsChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxDisplayedTagsChange", "maxFilterQueryLengthChange", "maxLengthChange", "minSearchLengthChange", "multilineChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectAllModeChange", "selectAllTextChange", "selectedItemsChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showMultiTagOnlyChange", "showSelectionControlsChange", "stylingModeChange", "tabIndexChange", "tagTemplateChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i9.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i11.LoaderComponent, selector: "app-loader" }, { kind: "pipe", type: i4.JsonPipe, name: "json" }] });
576
+ HeatMapSupportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: HeatMapSupportComponent, selector: "app-heat-map", inputs: { chartconfigData: ["datasetmodal", "chartconfigData"] }, outputs: { getHeatMapConfigOutPut: "getHeatMapConfigOutPut" }, ngImport: i0, template: "<div class=\"m-2\">\n <div class=\"w-full m-2 border-r\">\n <ng-container *ngIf=\"!isJsonPreview\">\n <pre><code>{{jsaonDatasource | json}}</code></pre>\n </ng-container>\n <ng-container *ngIf=\"isJsonPreview\">\n <app-gamma-heatmap [chartDataSource]=\"heatmap_content_config\" ></app-gamma-heatmap> \n\n <!-- <ng-container *ngIf=\"heatmapChartConfig.chartFormat == 'simple'\">\n <div class=\"mx-5 h-[60vh] overflow-x-auto\">\n <div class=\"inline-block\">\n <div class=\"flex flex-nowrap justify-center\">\n <div class=\"flex-shrink-0 w-64 max-w-[20%] h-10 flex items-center justify-center\"></div>\n <div *ngFor=\"let item of heatChartDataSource.argumentValue\"\n class=\"flex-shrink-0 min-w-22 max-w-[20%] h-8 text-sm flex items-center justify-center\">\n {{item}}\n </div>\n </div>\n </div>\n <ng-container *ngFor=\"let item of heatChartDataSource.dataSet\">\n <div class=\"flex flex-row\">\n <div class=\"h-8 flex text-sm items-center min-w-64 justify-end px-2 inline\">\n {{ item.datasource }}\n </div>\n <div class=\"inline-block\">\n <div class=\"flex flex-nowrap justify-start\">\n <ng-container *ngFor=\"let box of item.dataset\">\n <div class=\"flex-shrink-0 min-w-22 max-w-[20%] h-8 border-2 text-sm cursor-pointer flex items-center justify-center text-gray-800\"\n [ngStyle]=\"{ 'background-color': box.color }\"\n [attr.title]=\"'Record Date: ' + box[heatmapChartConfig.topArgument] + ', Value: ' + box[heatmapChartConfig.columns[0].dataField]\">\n {{ box[heatmapChartConfig.columns[0].dataField]}}\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"heatmapChartConfig.chartFormat == 'topx'\">\n <div class=\"mx-5 h-[60vh] overflow-x-auto\">\n <div class=\"flex flex-row\">\n <ng-container *ngFor=\"let header of heatChartDataSource.argumentValue\">\n <div class=\"min-w-32 text-sm font-medium text-center mb-2\">\n {{ header }}\n </div>\n </ng-container>\n </div>\n\n <div *ngFor=\"let row of heatChartDataSource.dataSet\" class=\"flex flex-row\">\n <ng-container *ngFor=\"let cell of row\">\n <div *ngIf=\"cell.box\"\n class=\"h-8 border-2 text-sm cursor-pointer flex items-center justify-center text-gray-800 min-w-32\"\n [ngStyle]=\"{ 'background-color': cell.box.color }\"\n [attr.title]=\"'Record Date: ' + cell.heatmapChartConfig.topArgument + ', Value: ' + cell.box.heatmapChartConfig.columns[0].dataField\">\n {{ cell.box.heatmapChartConfig.leftArgument }} ({{\n commonService.abbreviateNumber(cell.box.heatmapChartConfig.columns[0].dataField) }})\n </div>\n <div *ngIf=\"!cell.box\" class=\"h-8 min-w-32\"></div>\n </ng-container>\n </div>\n </div>\n </ng-container> -->\n\n\n </ng-container>\n </div>\n <div class=\"w-full mx-2 border-r\">\n <div class=\"mb-4 border-b border-gray-200 dark:border-gray-700\">\n <ul class=\"flex flex-wrap -mb-px text-sm font-medium text-center\" role=\"tablist\">\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'basic',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'basic'\n }\" (click)=\"setActiveTab('basic')\" type=\"button\" role=\"tab\">\n Basic\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'columns',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'columns'\n }\" (click)=\"setActiveTab('columns')\" type=\"button\" role=\"tab\">\n Columns\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'properties',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'properties'\n }\" (click)=\"setActiveTab('properties')\" type=\"button\" role=\"tab\">\n Properties\n </button>\n </li>\n\n </ul>\n </div>\n\n <div id=\"default-styled-tab-content\">\n <div *ngIf=\"activeTab === 'basic'\">\n <div class=\"flex flex-col flex-auto min-w-0\">\n\n <div class=\"flex flex-col flex-auto min-w-0\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Title\n Config\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Title Filters</div>\n <dx-text-box [(ngModel)]=\"heatmapChartConfig.commonConfig.title\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Filter Data Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatmapChartConfig.commonConfig.dataField\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Key To Pass </div>\n <dx-tag-box [items]=\"configColume\"\n [(ngModel)]=\"heatmap_content_config.kpiConfig.keyToPass\"></dx-tag-box>\n </div>\n </div>\n </div>\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Chart Type</div>\n <dx-select-box [(ngModel)]=\"heatmapChartConfig.chartFormat\"\n [items]=\"['simple','topx']\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Top Argument</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatmapChartConfig.topArgument\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Left Argument</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatmapChartConfig.leftArgument\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Color Usage</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['gradient','twoColor','singleColor',]\"\n [(ngModel)]=\"heatmapChartConfig.type\"\n (onValueChanged)=\"getColorBoxVisible($event)\"></dx-select-box>\n </div>\n\n <ng-container\n *ngIf=\"heatmapChartConfig.type == 'gradient' || heatmapChartConfig.type == 'twoColor'\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Color</div>\n <dx-color-box [(ngModel)]=\"firstColor\" [editAlphaChannel]=\"true\"></dx-color-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Color</div>\n <dx-color-box [(ngModel)]=\"secondColor\" [editAlphaChannel]=\"true\"></dx-color-box>\n </div>\n\n </ng-container>\n <ng-container *ngIf=\"heatmapChartConfig.type == 'singleColor'\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Color</div>\n <dx-color-box [(ngModel)]=\"singleColor\" [editAlphaChannel]=\"true\"></dx-color-box>\n </div>\n\n </ng-container>\n <div class=\"px-1 mb-1 w-full\" *ngIf=\"heatmapChartConfig.type !== ''\">\n <button class=\"{{commonService.btn_primary_md}} mt-6\" (click)=\"saveColors()\">Save Color\n </button>\n </div>\n\n\n\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'columns'\">\n <div class=\"h-full overflow-x-auto\">\n <div class=\"flex flex-col flex-auto min-w-0\">\n\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 border-b flex flex-row\"\n *ngFor=\"let item of heatmapChartConfig.columns; let i = index;\">\n <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [value]=\"item.visible\" [(ngModel)]=\"item.visible\"\n text=\"Visiblity\"></dx-check-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"item.dataField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Caption</div>\n <dx-text-box [(ngModel)]=\"item.caption\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Display For</div>\n <dx-select-box [items]=\"['map', 'tooltip']\"\n [(ngModel)]=\"item.displayFor\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-full\">\n <div class=\"text-md mb-2\"> UI Function</div>\n <dx-select-box [items]=\"enrichNameList\" [(ngModel)]=\"item.enrichName\"\n [searchEnabled]=\"true\"></dx-select-box>\n </div>\n <div class=\"text-center mt-8 w-full\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== heatmapChartConfig.columns.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n\n </div>\n </div>\n </div>\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addColumns()\">Add\n Columns</button>\n </div>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'properties'\">\n <div class=\"h-full overflow-x-auto\">\n <app-loader *ngIf=\"isLoader\"></app-loader>\n <ng-container *ngIf=\"!isLoader\">\n <div class=\"flex flex-row justify-between border-b py-3\">\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableClickEvent\"\n [(ngModel)]=\"viewProperties.enableClickEvent\"\n text=\"Enable Click Event\"></dx-check-box>\n </div>\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableRightClickEvent\"\n [(ngModel)]=\"viewProperties.enableRightClickEvent\"\n text=\"Enable Right Click\"></dx-check-box>\n </div>\n </div>\n <div class=\"w-full p-2\" *ngIf=\"viewProperties.enableClickEvent\">\n\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Event\n Type\n Option\n </div>\n <div class=\"w-full p-3 border-x border-b \">\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Event Type</div>\n </div>\n <div class=\"w-full\">\n <dx-select-box\n [items]=\"['drilldown','sameViewDrilldown','optionalDrillDown']\"\n (onValueChanged)=\"getSelectedEventType($event)\"\n [(ngModel)]=\"viewProperties.clickEventOptions.eventType\"></dx-select-box>\n </div>\n </div>\n <ng-container *ngIf=\"viewProperties.clickEventOptions.eventType == 'drilldown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"viewProperties.clickEventOptions.associatedViews\"\n valueExpr=\"viewId\" displayExpr=\"viewName\"\n [showSelectionControls]=\"true\" [searchEnabled]=\"true\"></dx-tag-box>\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"viewProperties.clickEventOptions.eventType == 'sameViewDrilldown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"viewProperties.clickEventOptions.associatedViews\"\n valueExpr=\"viewId\" displayExpr=\"viewName\"\n [showSelectionControls]=\"true\" [searchEnabled]=\"true\"></dx-tag-box>\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"viewProperties.clickEventOptions.eventType == 'optionalDrillDown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <ng-container\n *ngFor=\"let item of optionalDrilDownDataSource;let i = index;\">\n\n <div class=\"flex flex-row justify-between\">\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"item.viewId\" valueExpr=\"viewId\"\n displayExpr=\"viewName\" [showSelectionControls]=\"true\"\n [maxDisplayedTags]=\"2\"\n [searchEnabled]=\"true\"></dx-tag-box>\n\n </div>\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\"> Associated Params</div>\n <dx-text-box\n [(ngModel)]=\"item.filterCondition\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteAssociatedParams(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n <div class=\"flex flex-row justify-end mt-4\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addAssociatedParams()\">Add\n Params</button>\n </div>\n </div>\n </div>\n </ng-container>\n <button class=\"{{commonService.btn_light_md}} cursor-pointer mt-4\"\n (click)=\"resetViewProprstise()\">Reset All Event</button>\n </div>\n </div>\n\n </div>\n </ng-container>\n </div>\n </div>\n\n </div>\n\n\n </div>\n</div>\n\n\n<div class=\"flex flex-row border-t pl-3\">\n <div class=\"flex justify-start mx-1\">\n <button class=\"{{commonService.btn_warning_md}} cursor-pointer mt-2\" (click)=\"isJsonPreview = true\">\n Preview</button>\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer mt-2\" (click)=\"isJsonPreview = false\">Data\n Preview</button>\n </div>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"getSaveChartConfig()\">Submit</button>\n </div>\n</div>", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i6.DxColorBoxComponent, selector: "dx-color-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyButtonText", "applyValueMode", "buttons", "cancelButtonText", "deferRendering", "disabled", "dropDownButtonTemplate", "dropDownOptions", "editAlphaChannel", "elementAttr", "fieldTemplate", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "keyStep", "label", "labelMode", "name", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showDropDownButton", "stylingMode", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onChange", "onClosed", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyButtonTextChange", "applyValueModeChange", "buttonsChange", "cancelButtonTextChange", "deferRenderingChange", "disabledChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "editAlphaChannelChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "keyStepChange", "labelChange", "labelModeChange", "nameChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showDropDownButtonChange", "stylingModeChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i7.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i8.DxTagBoxComponent, selector: "dx-tag-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyValueMode", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hideSelectedItems", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxDisplayedTags", "maxFilterQueryLength", "maxLength", "minSearchLength", "multiline", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectAllMode", "selectAllText", "selectedItems", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showMultiTagOnly", "showSelectionControls", "stylingMode", "tabIndex", "tagTemplate", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCustomItemCreating", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onMultiTagPreparing", "onOpened", "onOptionChanged", "onSelectAllValueChanged", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyValueModeChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hideSelectedItemsChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxDisplayedTagsChange", "maxFilterQueryLengthChange", "maxLengthChange", "minSearchLengthChange", "multilineChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectAllModeChange", "selectAllTextChange", "selectedItemsChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showMultiTagOnlyChange", "showSelectionControlsChange", "stylingModeChange", "tabIndexChange", "tagTemplateChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i9.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i11.LoaderComponent, selector: "app-loader" }, { kind: "component", type: i12.GammaHeatChartComponent, selector: "app-gamma-heatmap", inputs: ["rightClickEnable", "chartDataSource"], outputs: ["getTableConfigOutPut", "oRowClick", "onrightClickContextSelection"] }, { kind: "pipe", type: i4.JsonPipe, name: "json" }] });
547
577
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: HeatMapSupportComponent, decorators: [{
548
578
  type: Component,
549
- args: [{ selector: 'app-heat-map', template: "<div class=\"m-2\">\n <div class=\"w-full m-2 border-r\">\n <ng-container *ngIf=\"!isJsonPreview\">\n <pre><code>{{jsaonDatasource | json}}</code></pre>\n </ng-container>\n <ng-container *ngIf=\"isJsonPreview\">\n <ng-container *ngIf=\"heatmapChartConfig.chartFormat == 'simple'\">\n <div class=\"mx-5 h-[60vh] overflow-x-auto\">\n <div class=\"inline-block\">\n <div class=\"flex flex-nowrap justify-center\">\n <div class=\"flex-shrink-0 w-64 max-w-[20%] h-10 flex items-center justify-center\"></div>\n <div *ngFor=\"let item of heatChartDataSource.argumentValue\"\n class=\"flex-shrink-0 min-w-22 max-w-[20%] h-8 text-sm flex items-center justify-center\">\n {{item}}\n </div>\n </div>\n </div>\n <ng-container *ngFor=\"let item of heatChartDataSource.dataSet\">\n <div class=\"flex flex-row\">\n <div class=\"h-8 flex text-sm items-center min-w-64 justify-end px-2 inline\">\n {{ item.datasource }}\n </div>\n <div class=\"inline-block\">\n <div class=\"flex flex-nowrap justify-start\">\n <ng-container *ngFor=\"let box of item.dataset\">\n <div class=\"flex-shrink-0 min-w-22 max-w-[20%] h-8 border-2 text-sm cursor-pointer flex items-center justify-center text-gray-800\"\n [ngStyle]=\"{ 'background-color': box.color }\"\n [attr.title]=\"'Record Date: ' + box[heatmapChartConfig.topArgument] + ', Value: ' + box[heatmapChartConfig.columns[0].dataField]\">\n {{ box[heatmapChartConfig.columns[0].dataField]}}\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"heatmapChartConfig.chartFormat == 'topx'\">\n <div class=\"mx-5 h-[60vh] overflow-x-auto\">\n <div class=\"flex flex-row\">\n <ng-container *ngFor=\"let header of heatChartDataSource.argumentValue\">\n <div class=\"min-w-32 text-sm font-medium text-center mb-2\">\n {{ header }}\n </div>\n </ng-container>\n </div>\n\n <!-- Heatmap Body (Top to Bottom Layout) -->\n <div *ngFor=\"let row of heatChartDataSource.dataSet\" class=\"flex flex-row\">\n <ng-container *ngFor=\"let cell of row\">\n <div *ngIf=\"cell.box\"\n class=\"h-8 border-2 text-sm cursor-pointer flex items-center justify-center text-gray-800 min-w-32\"\n [ngStyle]=\"{ 'background-color': cell.box.color }\"\n [attr.title]=\"'Record Date: ' + cell.heatmapChartConfig.topArgument + ', Value: ' + cell.box.heatmapChartConfig.columns[0].dataField\">\n {{ cell.box.heatmapChartConfig.leftArgument }} ({{ commonService.abbreviateNumber(cell.box.heatmapChartConfig.columns[0].dataField) }})\n </div>\n <div *ngIf=\"!cell.box\" class=\"h-8 min-w-32\"></div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n \n \n </ng-container>\n </div>\n <div class=\"w-full mx-2 border-r\">\n <div class=\"mb-4 border-b border-gray-200 dark:border-gray-700\">\n <ul class=\"flex flex-wrap -mb-px text-sm font-medium text-center\" role=\"tablist\">\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'basic',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'basic'\n }\" (click)=\"setActiveTab('basic')\" type=\"button\" role=\"tab\">\n Basic\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'columns',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'columns'\n }\" (click)=\"setActiveTab('columns')\" type=\"button\" role=\"tab\">\n Columns\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'properties',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'properties'\n }\" (click)=\"setActiveTab('properties')\" type=\"button\" role=\"tab\">\n Properties\n </button>\n </li>\n\n </ul>\n </div>\n\n <div id=\"default-styled-tab-content\">\n <div *ngIf=\"activeTab === 'basic'\">\n <div class=\"flex flex-col flex-auto min-w-0\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Title Config\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Title</div>\n <dx-select-box [(ngModel)]=\"heatmapChartConfig.chartFormat\" [items]=\"['simple','topx']\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Top Argument</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatmapChartConfig.topArgument\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Left Argument</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatmapChartConfig.leftArgument\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Color Usage</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['gradient','twoColor','singleColor',]\"\n [(ngModel)]=\"heatmapChartConfig.type\"\n (onValueChanged)=\"getColorBoxVisible($event)\"></dx-select-box>\n </div>\n\n <ng-container\n *ngIf=\"heatmapChartConfig.type == 'gradient' || heatmapChartConfig.type == 'twoColor'\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Color</div>\n <dx-color-box [(ngModel)]=\"firstColor\" [editAlphaChannel]=\"true\"></dx-color-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Color</div>\n <dx-color-box [(ngModel)]=\"secondColor\" [editAlphaChannel]=\"true\"></dx-color-box>\n </div>\n\n </ng-container>\n <ng-container *ngIf=\"heatmapChartConfig.type == 'singleColor'\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Color</div>\n <dx-color-box [(ngModel)]=\"singleColor\" [editAlphaChannel]=\"true\"></dx-color-box>\n </div>\n\n </ng-container>\n <div class=\"px-1 mb-1 w-full\" *ngIf=\"heatmapChartConfig.type !== ''\">\n <button class=\"{{commonService.btn_primary_md}} mt-6\" (click)=\"saveColors()\">Check\n View</button>\n </div>\n\n\n\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'columns'\">\n <div class=\"h-full overflow-x-auto\">\n <div class=\"flex flex-col flex-auto min-w-0\">\n\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 border-b flex flex-row\"\n *ngFor=\"let item of heatmapChartConfig.columns; let i = index;\">\n <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [value]=\"item.visible\" [(ngModel)]=\"item.visible\"\n text=\"Visiblity\"></dx-check-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"item.dataField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Caption</div>\n <dx-text-box [(ngModel)]=\"item.caption\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-full\">\n <div class=\"text-md mb-2\"> UI Function</div>\n <dx-select-box [items]=\"enrichNameList\" [(ngModel)]=\"item.enrichName\"\n [searchEnabled]=\"true\"></dx-select-box>\n </div>\n\n\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'properties'\">\n <div class=\"h-full overflow-x-auto\">\n <app-loader *ngIf=\"isLoader\"></app-loader>\n <ng-container *ngIf=\"!isLoader\">\n <div class=\"flex flex-row justify-between border-b py-3\">\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableClickEvent\"\n [(ngModel)]=\"viewProperties.enableClickEvent\"\n text=\"Enable Click Event\"></dx-check-box>\n </div>\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableRightClickEvent\"\n [(ngModel)]=\"viewProperties.enableRightClickEvent\"\n text=\"Enable Right Click\"></dx-check-box>\n </div>\n </div>\n <div class=\"w-full p-2\" *ngIf=\"viewProperties.enableClickEvent\">\n\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Event\n Type\n Option\n </div>\n <div class=\"w-full p-3 border-x border-b \">\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Event Type</div>\n </div>\n <div class=\"w-full\">\n <dx-select-box\n [items]=\"['drilldown','sameViewDrilldown','optionalDrillDown']\"\n (onValueChanged)=\"getSelectedEventType($event)\"\n [(ngModel)]=\"viewProperties.clickEventOptions.eventType\"></dx-select-box>\n </div>\n </div>\n <ng-container *ngIf=\"viewProperties.clickEventOptions.eventType == 'drilldown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"viewProperties.clickEventOptions.associatedViews\"\n valueExpr=\"viewId\" displayExpr=\"viewName\"\n [showSelectionControls]=\"true\" [searchEnabled]=\"true\"></dx-tag-box>\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"viewProperties.clickEventOptions.eventType == 'sameViewDrilldown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"viewProperties.clickEventOptions.associatedViews\"\n valueExpr=\"viewId\" displayExpr=\"viewName\"\n [showSelectionControls]=\"true\" [searchEnabled]=\"true\"></dx-tag-box>\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"viewProperties.clickEventOptions.eventType == 'optionalDrillDown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <ng-container\n *ngFor=\"let item of optionalDrilDownDataSource;let i = index;\">\n\n <div class=\"flex flex-row justify-between\">\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"item.viewId\" valueExpr=\"viewId\"\n displayExpr=\"viewName\" [showSelectionControls]=\"true\"\n [maxDisplayedTags]=\"2\"\n [searchEnabled]=\"true\"></dx-tag-box>\n\n </div>\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\"> Associated Params</div>\n <dx-text-box\n [(ngModel)]=\"item.filterCondition\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteAssociatedParams(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n <div class=\"flex flex-row justify-end mt-4\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addAssociatedParams()\">Add\n Params</button>\n </div>\n </div>\n </div>\n </ng-container>\n <button class=\"{{commonService.btn_light_md}} cursor-pointer mt-4\"\n (click)=\"resetViewProprstise()\">Reset All Event</button>\n </div>\n </div>\n\n </div>\n </ng-container>\n </div>\n </div>\n\n </div>\n\n\n </div>\n</div>\n\n\n<div class=\"flex flex-row border-t pl-3\">\n <div class=\"flex justify-start mx-1\">\n <button class=\"{{commonService.btn_warning_md}} cursor-pointer mt-2\" (click)=\"isJsonPreview = true\">\n Preview</button>\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer mt-2\" (click)=\"isJsonPreview = false\">Data\n Preview</button>\n </div>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"getSaveChartConfig()\">Submit</button>\n </div>\n</div>" }]
579
+ args: [{ selector: 'app-heat-map', template: "<div class=\"m-2\">\n <div class=\"w-full m-2 border-r\">\n <ng-container *ngIf=\"!isJsonPreview\">\n <pre><code>{{jsaonDatasource | json}}</code></pre>\n </ng-container>\n <ng-container *ngIf=\"isJsonPreview\">\n <app-gamma-heatmap [chartDataSource]=\"heatmap_content_config\" ></app-gamma-heatmap> \n\n <!-- <ng-container *ngIf=\"heatmapChartConfig.chartFormat == 'simple'\">\n <div class=\"mx-5 h-[60vh] overflow-x-auto\">\n <div class=\"inline-block\">\n <div class=\"flex flex-nowrap justify-center\">\n <div class=\"flex-shrink-0 w-64 max-w-[20%] h-10 flex items-center justify-center\"></div>\n <div *ngFor=\"let item of heatChartDataSource.argumentValue\"\n class=\"flex-shrink-0 min-w-22 max-w-[20%] h-8 text-sm flex items-center justify-center\">\n {{item}}\n </div>\n </div>\n </div>\n <ng-container *ngFor=\"let item of heatChartDataSource.dataSet\">\n <div class=\"flex flex-row\">\n <div class=\"h-8 flex text-sm items-center min-w-64 justify-end px-2 inline\">\n {{ item.datasource }}\n </div>\n <div class=\"inline-block\">\n <div class=\"flex flex-nowrap justify-start\">\n <ng-container *ngFor=\"let box of item.dataset\">\n <div class=\"flex-shrink-0 min-w-22 max-w-[20%] h-8 border-2 text-sm cursor-pointer flex items-center justify-center text-gray-800\"\n [ngStyle]=\"{ 'background-color': box.color }\"\n [attr.title]=\"'Record Date: ' + box[heatmapChartConfig.topArgument] + ', Value: ' + box[heatmapChartConfig.columns[0].dataField]\">\n {{ box[heatmapChartConfig.columns[0].dataField]}}\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"heatmapChartConfig.chartFormat == 'topx'\">\n <div class=\"mx-5 h-[60vh] overflow-x-auto\">\n <div class=\"flex flex-row\">\n <ng-container *ngFor=\"let header of heatChartDataSource.argumentValue\">\n <div class=\"min-w-32 text-sm font-medium text-center mb-2\">\n {{ header }}\n </div>\n </ng-container>\n </div>\n\n <div *ngFor=\"let row of heatChartDataSource.dataSet\" class=\"flex flex-row\">\n <ng-container *ngFor=\"let cell of row\">\n <div *ngIf=\"cell.box\"\n class=\"h-8 border-2 text-sm cursor-pointer flex items-center justify-center text-gray-800 min-w-32\"\n [ngStyle]=\"{ 'background-color': cell.box.color }\"\n [attr.title]=\"'Record Date: ' + cell.heatmapChartConfig.topArgument + ', Value: ' + cell.box.heatmapChartConfig.columns[0].dataField\">\n {{ cell.box.heatmapChartConfig.leftArgument }} ({{\n commonService.abbreviateNumber(cell.box.heatmapChartConfig.columns[0].dataField) }})\n </div>\n <div *ngIf=\"!cell.box\" class=\"h-8 min-w-32\"></div>\n </ng-container>\n </div>\n </div>\n </ng-container> -->\n\n\n </ng-container>\n </div>\n <div class=\"w-full mx-2 border-r\">\n <div class=\"mb-4 border-b border-gray-200 dark:border-gray-700\">\n <ul class=\"flex flex-wrap -mb-px text-sm font-medium text-center\" role=\"tablist\">\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'basic',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'basic'\n }\" (click)=\"setActiveTab('basic')\" type=\"button\" role=\"tab\">\n Basic\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'columns',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'columns'\n }\" (click)=\"setActiveTab('columns')\" type=\"button\" role=\"tab\">\n Columns\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'properties',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'properties'\n }\" (click)=\"setActiveTab('properties')\" type=\"button\" role=\"tab\">\n Properties\n </button>\n </li>\n\n </ul>\n </div>\n\n <div id=\"default-styled-tab-content\">\n <div *ngIf=\"activeTab === 'basic'\">\n <div class=\"flex flex-col flex-auto min-w-0\">\n\n <div class=\"flex flex-col flex-auto min-w-0\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Title\n Config\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Title Filters</div>\n <dx-text-box [(ngModel)]=\"heatmapChartConfig.commonConfig.title\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Filter Data Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatmapChartConfig.commonConfig.dataField\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Key To Pass </div>\n <dx-tag-box [items]=\"configColume\"\n [(ngModel)]=\"heatmap_content_config.kpiConfig.keyToPass\"></dx-tag-box>\n </div>\n </div>\n </div>\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Chart Type</div>\n <dx-select-box [(ngModel)]=\"heatmapChartConfig.chartFormat\"\n [items]=\"['simple','topx']\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Top Argument</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatmapChartConfig.topArgument\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Left Argument</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatmapChartConfig.leftArgument\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Color Usage</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['gradient','twoColor','singleColor',]\"\n [(ngModel)]=\"heatmapChartConfig.type\"\n (onValueChanged)=\"getColorBoxVisible($event)\"></dx-select-box>\n </div>\n\n <ng-container\n *ngIf=\"heatmapChartConfig.type == 'gradient' || heatmapChartConfig.type == 'twoColor'\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Color</div>\n <dx-color-box [(ngModel)]=\"firstColor\" [editAlphaChannel]=\"true\"></dx-color-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Color</div>\n <dx-color-box [(ngModel)]=\"secondColor\" [editAlphaChannel]=\"true\"></dx-color-box>\n </div>\n\n </ng-container>\n <ng-container *ngIf=\"heatmapChartConfig.type == 'singleColor'\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Color</div>\n <dx-color-box [(ngModel)]=\"singleColor\" [editAlphaChannel]=\"true\"></dx-color-box>\n </div>\n\n </ng-container>\n <div class=\"px-1 mb-1 w-full\" *ngIf=\"heatmapChartConfig.type !== ''\">\n <button class=\"{{commonService.btn_primary_md}} mt-6\" (click)=\"saveColors()\">Save Color\n </button>\n </div>\n\n\n\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'columns'\">\n <div class=\"h-full overflow-x-auto\">\n <div class=\"flex flex-col flex-auto min-w-0\">\n\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 border-b flex flex-row\"\n *ngFor=\"let item of heatmapChartConfig.columns; let i = index;\">\n <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [value]=\"item.visible\" [(ngModel)]=\"item.visible\"\n text=\"Visiblity\"></dx-check-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"item.dataField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Caption</div>\n <dx-text-box [(ngModel)]=\"item.caption\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Display For</div>\n <dx-select-box [items]=\"['map', 'tooltip']\"\n [(ngModel)]=\"item.displayFor\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-full\">\n <div class=\"text-md mb-2\"> UI Function</div>\n <dx-select-box [items]=\"enrichNameList\" [(ngModel)]=\"item.enrichName\"\n [searchEnabled]=\"true\"></dx-select-box>\n </div>\n <div class=\"text-center mt-8 w-full\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== heatmapChartConfig.columns.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n\n </div>\n </div>\n </div>\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addColumns()\">Add\n Columns</button>\n </div>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'properties'\">\n <div class=\"h-full overflow-x-auto\">\n <app-loader *ngIf=\"isLoader\"></app-loader>\n <ng-container *ngIf=\"!isLoader\">\n <div class=\"flex flex-row justify-between border-b py-3\">\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableClickEvent\"\n [(ngModel)]=\"viewProperties.enableClickEvent\"\n text=\"Enable Click Event\"></dx-check-box>\n </div>\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableRightClickEvent\"\n [(ngModel)]=\"viewProperties.enableRightClickEvent\"\n text=\"Enable Right Click\"></dx-check-box>\n </div>\n </div>\n <div class=\"w-full p-2\" *ngIf=\"viewProperties.enableClickEvent\">\n\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Event\n Type\n Option\n </div>\n <div class=\"w-full p-3 border-x border-b \">\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Event Type</div>\n </div>\n <div class=\"w-full\">\n <dx-select-box\n [items]=\"['drilldown','sameViewDrilldown','optionalDrillDown']\"\n (onValueChanged)=\"getSelectedEventType($event)\"\n [(ngModel)]=\"viewProperties.clickEventOptions.eventType\"></dx-select-box>\n </div>\n </div>\n <ng-container *ngIf=\"viewProperties.clickEventOptions.eventType == 'drilldown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"viewProperties.clickEventOptions.associatedViews\"\n valueExpr=\"viewId\" displayExpr=\"viewName\"\n [showSelectionControls]=\"true\" [searchEnabled]=\"true\"></dx-tag-box>\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"viewProperties.clickEventOptions.eventType == 'sameViewDrilldown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"viewProperties.clickEventOptions.associatedViews\"\n valueExpr=\"viewId\" displayExpr=\"viewName\"\n [showSelectionControls]=\"true\" [searchEnabled]=\"true\"></dx-tag-box>\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"viewProperties.clickEventOptions.eventType == 'optionalDrillDown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <ng-container\n *ngFor=\"let item of optionalDrilDownDataSource;let i = index;\">\n\n <div class=\"flex flex-row justify-between\">\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"item.viewId\" valueExpr=\"viewId\"\n displayExpr=\"viewName\" [showSelectionControls]=\"true\"\n [maxDisplayedTags]=\"2\"\n [searchEnabled]=\"true\"></dx-tag-box>\n\n </div>\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\"> Associated Params</div>\n <dx-text-box\n [(ngModel)]=\"item.filterCondition\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteAssociatedParams(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n <div class=\"flex flex-row justify-end mt-4\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addAssociatedParams()\">Add\n Params</button>\n </div>\n </div>\n </div>\n </ng-container>\n <button class=\"{{commonService.btn_light_md}} cursor-pointer mt-4\"\n (click)=\"resetViewProprstise()\">Reset All Event</button>\n </div>\n </div>\n\n </div>\n </ng-container>\n </div>\n </div>\n\n </div>\n\n\n </div>\n</div>\n\n\n<div class=\"flex flex-row border-t pl-3\">\n <div class=\"flex justify-start mx-1\">\n <button class=\"{{commonService.btn_warning_md}} cursor-pointer mt-2\" (click)=\"isJsonPreview = true\">\n Preview</button>\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer mt-2\" (click)=\"isJsonPreview = false\">Data\n Preview</button>\n </div>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"getSaveChartConfig()\">Submit</button>\n </div>\n</div>" }]
550
580
  }], ctorParameters: function () { return [{ type: i1.ToastrService }, { type: i2.CommonService }, { type: i0.ChangeDetectorRef }, { type: i3.ApplicationContentService }]; }, propDecorators: { getHeatMapConfigOutPut: [{
551
581
  type: Output
552
582
  }], chartconfigData: [{
553
583
  type: Input,
554
584
  args: ['datasetmodal']
555
585
  }] } });
556
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhdC1tYXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL3N1cHBvcnQtY29tcG9uZW50cy9oZWF0LW1hcC9oZWF0LW1hcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvc3VwcG9ydC1jb21wb25lbnRzL2hlYXQtbWFwL2hlYXQtbWFwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSWxHLE9BQU8sTUFBTSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7Ozs7O0FBTTNDLE1BQU0sT0FBTyx1QkFBdUI7SUEwTGhDLFlBQ1ksYUFBNEIsRUFDN0IsYUFBNEIsRUFDM0IsR0FBc0IsRUFBVSxPQUFrQztRQUZsRSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM3QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQTJCO1FBeEw5RSxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNqQyxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUVoQyx3QkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDOUIsd0JBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQzlCLG1CQUFjLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxrQ0FBa0MsRUFBRSxlQUFlLENBQUMsQ0FBQTtRQUVuSSx1QkFBa0IsR0FBRztZQUNqQixhQUFhLEVBQUUsRUFBRTtZ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QUFDLGtCQUFrQixDQUFDO1FBQzlFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDbEUsQ0FBQzs7b0hBNW1CUSx1QkFBdUI7d0dBQXZCLHVCQUF1QixxTENWcEMscXZuQkF3VE07MkZEOVNPLHVCQUF1QjtrQkFKbkMsU0FBUzsrQkFDSSxjQUFjO3dNQXFNUCxzQkFBc0I7c0JBQXRDLE1BQU07Z0JBR0gsZUFBZTtzQkFEbEIsS0FBSzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gXCJuZ3gtdG9hc3RyXCI7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2FwcGxpY2F0aW9uLWNvbnRlbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCBtb21lbnQgZnJvbSAnLi8uLi8uLi9tb21lbnQtaGVscGVyJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtaGVhdC1tYXAnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9oZWF0LW1hcC5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIEhlYXRNYXBTdXBwb3J0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBpc0hlYXRNYXBMb2FkZXI6IGJvb2xlYW47XG5cblxuXG4gICAgaXNBZHZhbmNlRmlsdGVyOiBib29sZWFuID0gZmFsc2U7XG4gICAgaXNIZWF0TWFwQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGhlYXRDaGFydERhdGFTb3VyY2U6IGFueSA9IHt9O1xuICAgIGNoYXJ0RGF0YUZvclRvb2x0aXA6IGFueSA9IHt9O1xuICAgIGVucmljaE5hbWVMaXN0ID0gW1wiYWJicmV2aWF0ZU51bWJlclwiLCBcImdldENvbG9yQ29kZVNwYW5cIiwgXCJUaG91c2FuZFNlcGFyYXRvclwiLCBcIlRob3VzYW5kU2VwYXJhdG9yV2l0aFR3b0RlY2ltYWxzXCIsIFwiZm9ybWF0Qnl0ZXN2MlwiXVxuXG4gICAgaGVhdG1hcENoYXJ0Q29uZmlnID0ge1xuICAgICAgICBcImNoYXJ0Rm9ybWF0XCI6IFwiXCIsXG4gICAgICAgIFwidG9wQXJndW1lbnRcIjogXCJcIixcbiAgICAgICAgXCJsZWZ0QXJndW1lbnRcIjogXCJcIixcbiAgICAgICAgXCJjb2xvclwiOiBbXSxcbiAgICAgICAgXCJ0eXBlXCI6IFwiXCIsXG4gICAgICAgIFwiZm9ybWF0ZVwiOiBcIlwiLFxuICAgICAgICBcImNvbHVtbnNcIjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwidmlzaWJsZVwiOiB0cnVlLFxuICAgICAgICAgICAgICAgIFwiZGF0YUZpZWxkXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJjYXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJlbnJpY2hOYW1lXCI6IFwiXCIsXG4gICAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFwiY29tbW9uQ29uZmlnXCI6IHtcbiAgICAgICAgICAgIFwidGl0bGVcIjogXCJcIixcbiAgICAgICAgICAgIFwiZGF0YUZpZWxkXCI6IFwiXCIsXG4gICAgICAgICAgICBcImNoZWNrZWRLZXlcIjogXCJcIixcbiAgICAgICAgICAgIFwiaXNTZWFyY2hCb3hcIjogZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhlYXRtYXBfY29udGVudF9jb25maWcgPSB7XG4gICAgICAgIFwia3BpQ29uZmlnXCI6IHtcbiAgICAgICAgICAgIFwic2VydmljZUlkXCI6IFwiXCIsXG4gICAgICAgICAgICBcImFwaVwiOiBcIi9rcGkvdHJlbmRzL25ldHdvcmsvZ2V0LW1ldHJpYy1kYXRhXCIsXG4gICAgICAgICAgICBcImRpc3BsYXlUeXBlXCI6IFwidGFibGVcIixcbiAgICAgICAgICAgIFwiZm9ybWF0ZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJrZXlUb1Bhc3NcIjogW10sXG4gICAgICAgICAgICBcImNvbXBvbmVudE5hbWVcIjogXCJHYW1tYUhlYXRDaGFydENvbXBvbmVudFwiLFxuICAgICAgICAgICAgXCJkYXRhQ29uZmlnXCI6IHt9XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBpc0pzb25QcmV2aWV3OiBib29sZWFuXG4gICAgZGF0YVNvdXJzZUZvckhlYXRNYXA6IGFueSA9IFtdO1xuICAgIGNvbmZpZ0NvbHVtZTogYW55O1xuICAgIGpzYW9uRGF0YXNvdXJjZTogYW55O1xuICAgIHNlbGVjdGVkVmlld0NvbmZpZ3M6IGFueTtcblxuICAgIHZpZXdQcm9wZXJ0aWVzOiBhbnkgPSB7XG4gICAgICAgIGVuYWJsZUNsaWNrRXZlbnQ6IGZhbHNlLFxuICAgICAgICBlbmFibGVSaWdodENsaWNrRXZlbnQ6IHRydWUsXG4gICAgICAgIGNsaWNrRXZlbnRPcHRpb25zOiB7XG4gICAgICAgICAgICBhc3NvY2lhdGVkVmlld3M6IFtdLFxuICAgICAgICAgICAgZXZlbnRUeXBlOiBcIlwiXG4gICAgICAgIH1cbiAgICB9O1xuICAgIG9wdGlvbmFsRHJpbERvd25EYXRhU291cmNlOiBhbnkgPSBbXTtcbiAgICBzZWxlY3RlZFRhYmxlVmlld1R5cGU6IGFueTtcbiAgICBpc0xvYWRlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBhY3RpdmVUYWI6IHN0cmluZyA9ICdiYXNpYyc7XG4gICAgYWxsQ29uZmlndXJlZFZpZXdzOiBhbnkgPSBbXTtcbiAgICBjb2xvckFycmF5OiBhbnkgPSBbXTtcbiAgICBmaXJzdENvbG9yID0gXCJyZ2JhKDQ1LCAxMTAsIDE4LCAxKVwiO1xuICAgIHNlY29uZENvbG9yID0gXCJyZ2JhKDI1NSwgMjA0LCAwLCAxKVwiO1xuICAgIHNpbmdsZUNvbG9yID0gXCJyZ2JhKDI1NSwgMjA0LCAwLCAxKVwiO1xuXG4gICAgdGVzdF92b2ljZV9kYXRhID0gW3tcbiAgICAgICAgcmVjb3JkX2RhdGU6ICcyMDI1MDUyNycsXG4gICAgICAgIGRhdGFzZXQ6IFtcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnWUVNJywgdG90YWxfY2hhcmdlOiAxODQzNTcxNzYgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnRVJJJywgdG90YWxfY2hhcmdlOiAxMTUyNjI1MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnQkdEJywgdG90YWxfY2hhcmdlOiA4MzI4OTYxNCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdFVEgnLCB0b3RhbF9jaGFyZ2U6IDc5MDA0NTAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1BBSycsIHRvdGFsX2NoYXJnZTogNzY5OTI0NTQgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnU0ROJywgdG90YWxfY2hhcmdlOiA2MDQ4MDQwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdJTkQnLCB0b3RhbF9jaGFyZ2U6IDM4ODkyODU4IH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0VHWScsIHRvdGFsX2NoYXJnZTogMzc3Njk3NDQgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnTlBMJywgdG90YWxfY2hhcmdlOiAxNzIxNDAwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdBRkcnLCB0b3RhbF9jaGFyZ2U6IDcyNjgwMDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnVENEJywgdG90YWxfY2hhcmdlOiA1MzcyNTAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0lETicsIHRvdGFsX2NoYXJnZTogNDQyNTcwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdVR0EnLCB0b3RhbF9jaGFyZ2U6IDM5MzMzMDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnR0JSJywgdG90YWxfY2hhcmdlOiAzODQ4MjI1IH1cbiAgICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgICByZWNvcmRfZGF0ZTogJzIwMjUwNTMxJyxcbiAgICAgICAgZGF0YXNldDogW1xuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdZRU0nLCB0b3RhbF9jaGFyZ2U6IDIwODY5OTgyNyB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdFUkknLCB0b3RhbF9jaGFyZ2U6IDE0MzUwMTUwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdCR0QnLCB0b3RhbF9jaGFyZ2U6IDEwNjI5NjI5NCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdFVEgnLCB0b3RhbF9jaGFyZ2U6IDg2MDkzNTAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1BBSycsIHRvdGFsX2NoYXJnZTogNzc0Mjg0NjEgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnU0ROJywgdG90YWxfY2hhcmdlOiA2NTgxODU5OCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdJTkQnLCB0b3RhbF9jaGFyZ2U6IDM4NjM1MTc1IH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0VHWScsIHRvdGFsX2NoYXJnZTogMzc2NTg3MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnTlBMJywgdG90YWxfY2hhcmdlOiAxODc3MzIwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdBRkcnLCB0b3RhbF9jaGFyZ2U6IDgyMzI1MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnVENEJywgdG90YWxfY2hhcmdlOiA3MDA3NTAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0FSRScsIHRvdGFsX2NoYXJnZTogNDU5MzgwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdJRE4nLCB0b3RhbF9jaGFyZ2U6IDQxMTg4MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnUEhMJywgdG90YWxfY2hhcmdlOiA0MDUxNTAwIH1cbiAgICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgICByZWNvcmRfZGF0ZTogJzIwMjUwNTI4JyxcbiAgICAgICAgZGF0YXNldDogW1xuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdZRU0nLCB0b3RhbF9jaGFyZ2U6IDE5ODk0MzY2MSB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdFUkknLCB0b3RhbF9jaGFyZ2U6IDExODA2NTAwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdCR0QnLCB0b3RhbF9jaGFyZ2U6IDkwOTgwODI5IH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0VUSCcsIHRvdGFsX2NoYXJnZTogODAzNjc3MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnUEFLJywgdG90YWxfY2hhcmdlOiA3ODAxODk3MyB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdTRE4nLCB0b3RhbF9jaGFyZ2U6IDU2ODI2NTAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0lORCcsIHRvdGFsX2NoYXJnZTogMzc4NzE2MjUgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnRUdZJywgdG90YWxfY2hhcmdlOiAzMzM3NDgxNSB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdOUEwnLCB0b3RhbF9jaGFyZ2U6IDE2NzYzNDAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0FGRycsIHRvdGFsX2NoYXJnZTogNzkyNjAwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdUQ0QnLCB0b3RhbF9jaGFyZ2U6IDU2MDAwMDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnSUROJywgdG90YWxfY2hhcmdlOiA0NjAyNDAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0dCUicsIHRvdGFsX2NoYXJnZTogNDQ0MzYyNSB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdVR0EnLCB0b3RhbF9jaGFyZ2U6IDQzNzkyMDAgfVxuICAgICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHJlY29yZF9kYXRlOiAnMjAyNTA1MzAnLFxuICAgICAgICBkYXRhc2V0OiBbXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1lFTScsIHRvdGFsX2NoYXJnZTogMjMxMzc4ODUyIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0JHRCcsIHRvdGFsX2NoYXJnZTogMTUxNzg2MDE4IH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0VSSScsIHRvdGFsX2NoYXJnZTogMTQ2NzgyNTAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1BBSycsIHRvdGFsX2NoYXJnZTogODgwNTQ0NDUgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnRVRIJywgdG90YWxfY2hhcmdlOiA4MzYzNTUwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdTRE4nLCB0b3RhbF9jaGFyZ2U6IDYyMjU3MDAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0lORCcsIHRvdGFsX2NoYXJnZTogNDQzMTY1MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnRUdZJywgdG90YWxfY2hhcmdlOiAyOTg5NDM5MiB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdOUEwnLCB0b3RhbF9jaGFyZ2U6IDIzMzgzNTAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0FGRycsIHRvdGFsX2NoYXJnZTogODAyOTUwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdUQ0QnLCB0b3RhbF9jaGFyZ2U6IDczMjI1MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnR0JSJywgdG90YWxfY2hhcmdlOiA0MzM4NDUwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0lETicsIHRvdGFsX2NoYXJnZTogMzkwNDQwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdBUkUnLCB0b3RhbF9jaGFyZ2U6IDM4MzIxMDAgfVxuICAgICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHJlY29yZF9kYXRlOiAnMjAyNTA1MjknLFxuICAgICAgICBkYXRhc2V0OiBbXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1lFTScsIHRvdGFsX2NoYXJnZTogMjAwOTA2MzU3IH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0VSSScsIHRvdGFsX2NoYXJnZTogMTI2NzI1MDAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0JHRCcsIHRvdGFsX2NoYXJnZTogMTE1Mjg3NzIyIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0VUSCcsIHRvdGFsX2NoYXJnZTogODIwNjI0MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnUEFLJywgdG90YWxfY2hhcmdlOiA3NzI2MDYxMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdTRE4nLCB0b3RhbF9jaGFyZ2U6IDU0Mzk0ODEwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0lORCcsIHRvdGFsX2NoYXJnZTogMzg2NTQwMDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnRUdZJywgdG90YWxfY2hhcmdlOiAzNDUwMzM1MCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdOUEwnLCB0b3RhbF9jaGFyZ2U6IDE3Mjc3MTAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0FGRycsIHRvdGFsX2NoYXJnZTogNzc0NjUwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdUQ0QnLCB0b3RhbF9jaGFyZ2U6IDYxMDAwMDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnR0JSJywgdG90YWxfY2hhcmdlOiA0NzM2MTUwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0lETicsIHRvdGFsX2NoYXJnZTogNDY3ODkwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdLRU4nLCB0b3RhbF9jaGFyZ2U6IDQ0NTMwMDAgfVxuICAgICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHJlY29yZF9kYXRlOiAnMjAyNTA2MDEnLFxuICAgICAgICBkYXRhc2V0OiBbXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1lFTScsIHRvdGFsX2NoYXJnZTogMjE0Mjg3OTc4IH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0VSSScsIHRvdGFsX2NoYXJnZTogMTU0NDAyNTAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0JHRCcsIHRvdGFsX2NoYXJnZTogMTAwMjA0MDAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0VUSCcsIHRvdGFsX2NoYXJnZTogOTc0Nzk4MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnUEFLJywgdG90YWxfY2hhcmdlOiA3NTM5MTQ2MyB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdTRE4nLCB0b3RhbF9jaGFyZ2U6IDY1NjIyMjAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0lORCcsIHRvdGFsX2NoYXJnZTogMzgxMjQ0OTcgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnRUdZJywgdG90YWxfY2hhcmdlOiAzNTI3ODAyNSB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdOUEwnLCB0b3RhbF9jaGFyZ2U6IDIyNjY1MDAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0FGRycsIHRvdGFsX2NoYXJnZTogNjkyMDAwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdVR0EnLCB0b3RhbF9jaGFyZ2U6IDU2MjUxMDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnSUROJywgdG90YWxfY2hhcmdlOiA1MjU2OTAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1RDRCcsIHRvdGFsX2NoYXJnZTogNDk3MDAwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdHQlInLCB0b3RhbF9jaGFyZ2U6IDQ0MTAyNTAgfVxuICAgICAgICBdXG4gICAgfVxuICAgIF1cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSB0b2FzdHJTZXJ2aWNlOiBUb2FzdHJTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIHNlcnZpY2U6IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2VcbiAgICApIHtcblxuICAgIH1cblxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0SGVhdE1hcENvbmZpZ091dFB1dDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBASW5wdXQoJ2RhdGFzZXRtb2RhbCcpXG4gICAgc2V0IGNoYXJ0Y29uZmlnRGF0YSh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuanNhb25EYXRhc291cmNlID0gdmFsdWUuZGF0YVswXTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnQ29sdW1lID0gT2JqZWN0LmtleXModmFsdWUuZGF0YVswXSk7XG4gICAgICAgICAgICB0aGlzLmRhdGFTb3Vyc2VGb3JIZWF0TWFwID0gdmFsdWUuZGF0YTtcbiAgICAgICAgICAgIC8vIHRoaXMuZGF0YVNvdXJzZUZvckhlYXRNYXAgPSB0aGlzLnRlc3Rfdm9pY2VfZGF0YTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3Q29uZmlncyA9IHZhbHVlO1xuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFibGVWaWV3VHlwZSA9IHZhbHVlLnNlbGVjdGVkVmlld1R5cGU7XG4gICAgICAgICAgICBpZiAodmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYXRtYXBfY29udGVudF9jb25maWdbJ2twaUNvbmZpZyddID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWc7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWF0bWFwQ2hhcnRDb25maWcgPSB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy5kYXRhQ29uZmlnO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLmNvbHVtbnMgPSB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy5kYXRhQ29uZmlnLmNvbHVtbnM7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld1Byb3BlcnRpZXMgPSB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy52aWV3UHJvcGVydGllcztcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy52aWV3UHJvcGVydGllcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICBcImVuYWJsZUNsaWNrRXZlbnRcIjogdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcudmlld1Byb3BlcnRpZXMuZW5hYmxlQ2xpY2tFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgLy8gICBcImVuYWJsZVJpZ2h0Q2xpY2tFdmVudFwiOiB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy52aWV3UHJvcGVydGllcy5lbmFibGVSaWdodENsaWNrRXZlbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcudmlld1Byb3BlcnRpZXMuZW5hYmxlQ2xpY2tFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZSA9PSAnb3B0aW9uYWxEcmlsbERvd24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25hbERyaWxEb3duRGF0YVNvdXJjZSA9IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmFzc29jaWF0ZWRWaWV3cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdQcm9wZXJ0aWVzWydjbGlja0V2ZW50T3B0aW9ucyddID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImV2ZW50VHlwZVwiOiB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy52aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5ldmVudFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYXNzb2NpYXRlZFZpZXdzXCI6IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy52aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5ldmVudFR5cGUgPT0gJ2RyaWxsZG93bicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdQcm9wZXJ0aWVzWydjbGlja0V2ZW50T3B0aW9ucyddID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImV2ZW50VHlwZVwiOiB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy52aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5ldmVudFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYXNzb2NpYXRlZFZpZXdzXCI6IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmFzc29jaWF0ZWRWaWV3c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3UHJvcGVydGllc1snY2xpY2tFdmVudE9wdGlvbnMnXSA9IHt9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdQcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgICAgICAgICBlbmFibGVDbGlja0V2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlUmlnaHRDbGlja0V2ZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjbGlja0V2ZW50T3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZFZpZXdzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogXCJcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oZWF0bWFwQ2hhcnRDb25maWcuY29sdW1ucykge1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWF0bWFwQ2hhcnRDb25maWcuY29sdW1ucyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuY29uZmlnQ29sdW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMuc2VydmljZS5nZXRBcHBWaWV3Q29uZmlncygpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxDb25maWd1cmVkVmlld3MgPSBkYXRhO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0FsbCBWaWV3cycpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbmFsRHJpbERvd25EYXRhU291cmNlLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbmFsRHJpbERvd25EYXRhU291cmNlID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgJ3ZpZXdJZCc6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICdmaWx0ZXJDb25kaXRpb24nOiBcIlwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gICAgfVxuXG5cblxuICAgIGdldEhlYXRtYXBEYXRhKCkge1xuXG4gICAgICAgIHRoaXMuaGVhdENoYXJ0RGF0YVNvdXJjZSA9IHt9O1xuICAgICAgICB0aGlzLmlzQWR2YW5jZUZpbHRlciA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLmRhdGFTb3Vyc2VGb3JIZWF0TWFwICYmIHRoaXMuZGF0YVNvdXJzZUZvckhlYXRNYXAubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oZWF0bWFwQ2hhcnRDb25maWcuY2hhcnRGb3JtYXQgPT0gXCJ0b3B4XCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHJlc3VsdCwgdW5pcXVlRGF0ZXMgfSA9IHRoaXMuZ2VuZXJhdGVEYXRlV2lzZUNvbG9yQ29kZWREYXRhKHRoaXMuZGF0YVNvdXJzZUZvckhlYXRNYXApO1xuICAgICAgICAgICAgICAgIHVuaXF1ZURhdGVzLnNvcnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYXRDaGFydERhdGFTb3VyY2UuZGF0YVNldCA9IHRoaXMuZ2V0VHJhbnNwb3NlZEhlYXRtYXBEYXRhKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWF0Q2hhcnREYXRhU291cmNlW1wiYXJndW1lbnRWYWx1ZVwiXSA9IHVuaXF1ZURhdGVzO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5oZWF0bWFwQ2hhcnRDb25maWcuY2hhcnRGb3JtYXQgPT0gXCJzaW1wbGVcIikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHJlc3VsdCwgdW5pcXVlRGF0ZXMgfSA9IHRoaXMuZ2VuZXJhdGVEYXRhKHRoaXMuZGF0YVNvdXJzZUZvckhlYXRNYXApO1xuICAgICAgICAgICAgICAgIHVuaXF1ZURhdGVzLnNvcnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYXRDaGFydERhdGFTb3VyY2VbXCJkYXRhU2V0XCJdID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhdENoYXJ0RGF0YVNvdXJjZVtcImFyZ3VtZW50VmFsdWVcIl0gPSB1bmlxdWVEYXRlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pc0hlYXRNYXBMb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXNIZWF0TWFwQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNIZWF0TWFwQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5pbmZvKFwiTm8gRGF0YSBGb3VuZFwiKVxuICAgICAgICB9XG5cblxuXG4gICAgfVxuXG4gICAgZ2V0VHJhbnNwb3NlZEhlYXRtYXBEYXRhKGRhdGFTZXQ6IGFueVtdKTogYW55W10ge1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VkOiBhbnlbXSA9IFtdO1xuICAgICAgICBjb25zdCBtYXhCb3hlcyA9IE1hdGgubWF4KC4uLmRhdGFTZXQubWFwKGl0ZW0gPT4gaXRlbS5kYXRhc2V0Lmxlbmd0aCkpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4Qm94ZXM7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgcm93OiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkYXRhU2V0Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYm94ID0gZGF0YVNldFtqXS5kYXRhc2V0W2ldO1xuICAgICAgICAgICAgICAgIHJvdy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgYm94OiBib3ggfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgZGF0ZTogZGF0YVNldFtqXS5yZWNvcmRfZGF0ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhbnNwb3NlZC5wdXNoKHJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJhbnNwb3NlZDtcbiAgICB9XG5cbiAgICBnZW5lcmF0ZURhdGVXaXNlQ29sb3JDb2RlZERhdGEoZGF0YTogYW55W10pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSA9IFtdO1xuICAgICAgICBjb25zdCB1bmlxdWVEYXRlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgY29uc3QgYWxsRW50cmllczogYW55W10gPSBbXTtcblxuICAgICAgICBjb25zdCB0b3BBcmcgPSB0aGlzLmhlYXRtYXBDaGFydENvbmZpZy50b3BBcmd1bWVudDtcbiAgICAgICAgY29uc3QgbGVmdEFyZyA9IHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLmxlZnRBcmd1bWVudDtcbiAgICAgICAgY29uc3QgdmFsdWVGaWVsZCA9IHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLmNvbHVtbnNbMF0uZGF0YUZpZWxkO1xuXG4gICAgICAgIGRhdGEuZm9yRWFjaChlbnRyeSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gbW9tZW50KGVudHJ5LnJlY29yZF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICAgIHVuaXF1ZURhdGVzLmFkZChmb3JtYXR0ZWREYXRlKTtcblxuICAgICAgICAgICAgZW50cnkuZGF0YXNldC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGFsbEVudHJpZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIFt0b3BBcmddOiBmb3JtYXR0ZWREYXRlLFxuICAgICAgICAgICAgICAgICAgICBbbGVmdEFyZ106IGl0ZW1bYCR7bGVmdEFyZ31gXSxcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlRmllbGRdOiBpdGVtW2Ake3ZhbHVlRmllbGR9YF1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgY29sb3JlZERhdGE7XG4gICAgICAgIGlmICh0aGlzLmhlYXRtYXBDaGFydENvbmZpZy50eXBlID09PSAnZ3JhZGllbnQnKSB7XG4gICAgICAgICAgICBjb2xvcmVkRGF0YSA9IHRoaXMuZ2V0Rm9ybWF0ZURhdGFCeUNvbG9yQ29kZUZvckdyYWRpZW50KGFsbEVudHJpZXMsIHZhbHVlRmllbGQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLnR5cGUgPT09ICd0d29Db2xvcicpIHtcbiAgICAgICAgICAgIGNvbG9yZWREYXRhID0gdGhpcy5nZXRGb3JtYXRlRGF0YUJ5Q29sb3JDb2RlRm9yV2l0aFR3b0NvbG9yKGFsbEVudHJpZXMsIHZhbHVlRmllbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29sb3JlZERhdGEgPSB0aGlzLmdldEZvcm1hdGVEYXRhQnlDb2xvckNvZGVGb3JXaXRoU2luZ2xlQ29sb3IoYWxsRW50cmllcywgdmFsdWVGaWVsZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRlTWFwOiB7IFtkYXRlOiBzdHJpbmddOiBhbnlbXSB9ID0ge307XG5cbiAgICAgICAgY29sb3JlZERhdGEuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGU6IGFueSA9IGl0ZW1bdG9wQXJnXTtcblxuICAgICAgICAgICAgaWYgKCFkYXRlTWFwW2RhdGVdKSB7XG4gICAgICAgICAgICAgICAgZGF0ZU1hcFtkYXRlXSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRlTWFwW2RhdGVdLnB1c2goe1xuICAgICAgICAgICAgICAgIFtsZWZ0QXJnXTogaXRlbVtsZWZ0QXJnXSxcbiAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF06IGl0ZW1bdmFsdWVGaWVsZF0sXG4gICAgICAgICAgICAgICAgY29sb3I6IGl0ZW0uY29sb3IsXG4gICAgICAgICAgICAgICAgW3RvcEFyZ106IGRhdGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RlcCA0OiBCdWlsZCBmaW5hbCByZXN1bHRcbiAgICAgICAgZm9yIChjb25zdCBkYXRlIG9mIEFycmF5LmZyb20odW5pcXVlRGF0ZXMpLnNvcnQoKSBhcyBzdHJpbmdbXSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgIHJlY29yZF9kYXRlOiBkYXRlLFxuICAgICAgICAgICAgICAgIGRhdGFzZXQ6IGRhdGVNYXBbZGF0ZV0gfHwgW11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIHVuaXF1ZURhdGVzOiBBcnJheS5mcm9tKHVuaXF1ZURhdGVzKS5zb3J0KClcbiAgICAgICAgfTtcbiAgICB9XG5cblxuICAgIGdlbmVyYXRlRGF0YShkYXRhKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBjb25zdCB1bmlxdWVEYXRlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgY29uc3QgZGF0YVNvdXJjZU1hcCA9IHt9O1xuICAgICAgICBjb25zdCB0b3BBcmcgPSB0aGlzLmhlYXRtYXBDaGFydENvbmZpZy50b3BBcmd1bWVudDtcbiAgICAgICAgY29uc3QgbGVmdEFyZyA9IHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLmxlZnRBcmd1bWVudDtcblxuICAgICAgICBkYXRhLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCByb3dLZXkgPSBpdGVtW2xlZnRBcmddO1xuICAgICAgICAgICAgY29uc3QgY29sdW1uS2V5ID0gbW9tZW50KGl0ZW1bdG9wQXJnXSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG5cbiAgICAgICAgICAgIGlmICghZGF0YVNvdXJjZU1hcFtyb3dLZXldKSB7XG4gICAgICAgICAgICAgICAgZGF0YVNvdXJjZU1hcFtyb3dLZXldID0ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhc291cmNlOiByb3dLZXksXG4gICAgICAgICAgICAgICAgICAgIGRhdGFzZXQ6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0YVNvdXJjZU1hcFtyb3dLZXldLmRhdGFzZXQucHVzaCh7XG4gICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICBbdG9wQXJnXTogY29sdW1uS2V5XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdW5pcXVlRGF0ZXMuYWRkKGNvbHVtbktleSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHVuaXF1ZURhdGVzQXJyYXkgPSBBcnJheS5mcm9tKHVuaXF1ZURhdGVzKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhU291cmNlTWFwKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhc2V0ID0gZGF0YVNvdXJjZU1hcFtrZXldLmRhdGFzZXQ7XG4gICAgICAgICAgICBsZXQgZm9ybWF0dGVkRGF0YXNldDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLnR5cGUgPT0gXCJncmFkaWVudFwiKSB7XG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkRGF0YXNldCA9IHRoaXMuZ2V0Rm9ybWF0ZURhdGFCeUNvbG9yQ29kZUZvckdyYWRpZW50KGRhdGFzZXQsIHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLmNvbHVtbnNbMF0uZGF0YUZpZWxkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5oZWF0bWFwQ2hhcnRDb25maWcudHlwZSA9PSBcInR3b0NvbG9yXCIpIHtcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWREYXRhc2V0ID0gdGhpcy5nZXRGb3JtYXRlRGF0YUJ5Q29sb3JDb2RlRm9yV2l0aFR3b0NvbG9yKGRhdGFzZXQsIHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLmNvbHVtbnNbMF0uZGF0YUZpZWxkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkRGF0YXNldCA9IHRoaXMuZ2V0Rm9ybWF0ZURhdGFCeUNvbG9yQ29kZUZvcldpdGhTaW5nbGVDb2xvcihkYXRhc2V0LCB0aGlzLmhlYXRtYXBDaGFydENvbmZpZy5jb2x1bW5zWzBdLmRhdGFGaWVsZCk7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGF0ZVRvSXRlbU1hcCA9IHt9O1xuICAgICAgICAgICAgZm9ybWF0dGVkRGF0YXNldC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGRhdGVUb0l0ZW1NYXBbaXRlbVt0b3BBcmddXSA9IGl0ZW07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgY29tcGxldGVEYXRhc2V0ID0gdW5pcXVlRGF0ZXNBcnJheS5tYXAoKGRhdGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkYXRlVG9JdGVtTWFwW2RhdGVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRlVG9JdGVtTWFwW2RhdGVdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBbdG9wQXJnXTogZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2Z1NpemU6IFwiTm8gRGF0YVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUNvdW50OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVNpemU6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogXCJyZ2IoMjQyLCAxMTgsIDEwOSlcIlxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgZGF0YXNvdXJjZToga2V5LFxuICAgICAgICAgICAgICAgIGRhdGFzZXQ6IGNvbXBsZXRlRGF0YXNldFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVzdWx0OiByZXN1bHQsXG4gICAgICAgICAgICB1bmlxdWVEYXRlczogdW5pcXVlRGF0ZXNBcnJheVxuICAgICAgICB9O1xuICAgIH1cblxuXG5cbiAgICBnZXRGb3JtYXRlRGF0YUJ5Q29sb3JDb2RlRm9yR3JhZGllbnQoZmlsZWRhdGEsIGNvbHVtbikge1xuICAgICAgICBmaWxlZGF0YS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5hdmdTaXplID0gcGFyc2VGbG9hdChpdGVtW2NvbHVtbl0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBtYXhBdmdTaXplID0gTWF0aC5tYXgoLi4uZmlsZWRhdGEubWFwKGl0ZW0gPT4gaXRlbVtjb2x1bW5dKSk7XG4gICAgICAgIGNvbnN0IG1pbkF2Z1NpemUgPSBNYXRoLm1pbiguLi5maWxlZGF0YS5tYXAoaXRlbSA9PiBpdGVtW2NvbHVtbl0pKTtcblxuICAgICAgICBjb25zdCBbbWluQ29sb3JTdHIsIG1heENvbG9yU3RyXSA9IHRoaXMuY29sb3JBcnJheSB8fCBbXCJyZ2JhKDQ1LCAxMTAsIDE4LDEpXCIsIFwicmdiYSgyNTUsIDIwNCwgMCwxKVwiXTtcbiAgICAgICAgY29uc3QgbWluQ29sb3IgPSB0aGlzLnBhcnNlUkdCQShtaW5Db2xvclN0cik7XG4gICAgICAgIGNvbnN0IG1heENvbG9yID0gdGhpcy5wYXJzZVJHQkEobWF4Q29sb3JTdHIpO1xuXG4gICAgICAgIGZpbGVkYXRhLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNvbG9yID0gdGhpcy5jYWxjdWxhdGVDb2xvcihpdGVtW2NvbHVtbl0sIG1pbkF2Z1NpemUsIG1heEF2Z1NpemUsIG1pbkNvbG9yLCBtYXhDb2xvcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmaWxlZGF0YTtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0ZURhdGFCeUNvbG9yQ29kZUZvcldpdGhUd29Db2xvcihmaWxlZGF0YSwgY29sdW1uKSB7XG4gICAgICAgIGZpbGVkYXRhLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtW2NvbHVtbl0gPSBwYXJzZUZsb2F0KGl0ZW1bY29sdW1uXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IFttaW5Db2xvclN0ciwgbWF4Q29sb3JTdHJdID0gdGhpcy5jb2xvckFycmF5IHx8IFtcInJnYmEoNDUsIDExMCwgMTgsMSlcIiwgXCJyZ2JhKDI1NSwgMjA0LCAwLDEpXCJdO1xuICAgICAgICBjb25zdCBtaW5Db2xvciA9IHRoaXMucGFyc2VSR0JBKG1pbkNvbG9yU3RyKTtcbiAgICAgICAgY29uc3QgbWF4Q29sb3IgPSB0aGlzLnBhcnNlUkdCQShtYXhDb2xvclN0cik7XG5cbiAgICAgICAgZmlsZWRhdGEuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtW2NvbHVtbl0gPT0gMCkge1xuICAgICAgICAgICAgICAgIGl0ZW0uY29sb3IgPSBgcmdiKCR7bWluQ29sb3Iuam9pbignLCcpfSlgO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdGVtLmNvbG9yID0gYHJnYigke21heENvbG9yLmpvaW4oJywnKX0pYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmlsZWRhdGE7XG4gICAgfVxuICAgIGdldEZvcm1hdGVEYXRhQnlDb2xvckNvZGVGb3JXaXRoU2luZ2xlQ29sb3IoZmlsZWRhdGEsIGNvbHVtbikge1xuICAgICAgICBmaWxlZGF0YS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbVtjb2x1bW5dID0gcGFyc2VGbG9hdChpdGVtW2NvbHVtbl0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBbc2luZ2xlQ29sb3JdID0gdGhpcy5jb2xvckFycmF5IHx8IFtcInJnYmEoMjU1LCAyMDQsIDAsMSlcIl07XG4gICAgICAgIGNvbnN0IG1pbkNvbG9yID0gdGhpcy5wYXJzZVJHQkEoc2luZ2xlQ29sb3IpO1xuXG4gICAgICAgIGZpbGVkYXRhLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNvbG9yID0gYHJnYigke21pbkNvbG9yLmpvaW4oJywnKX0pYDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZpbGVkYXRhO1xuICAgIH1cblxuICAgIHBhcnNlUkdCQShjb2xvclN0cjogc3RyaW5nKTogbnVtYmVyW10ge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBjb2xvclN0ci5tYXRjaCgvW1xcZC5dKy9nKT8ubWFwKE51bWJlcikgfHwgW107XG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAzKSB2YWx1ZXMucHVzaCgxKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHZhbHVlc1swXSA/PyAwLFxuICAgICAgICAgICAgdmFsdWVzWzFdID8/IDAsXG4gICAgICAgICAgICB2YWx1ZXNbMl0gPz8gMCxcbiAgICAgICAgICAgIHZhbHVlc1szXSA/PyAxXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlQ29sb3IoYXZnU2l6ZSwgbWluQXZnU2l6ZSwgbWF4QXZnU2l6ZSwgbWluQ29sb3IsIG1heENvbG9yKSB7XG4gICAgICAgIGlmIChtaW5BdmdTaXplICE9IG1heEF2Z1NpemUpIHtcbiAgICAgICAgICAgIGxldCBncmFkaWVudCA9IChhdmdTaXplIC0gbWluQXZnU2l6ZSkgLyAobWF4QXZnU2l6ZSAtIG1pbkF2Z1NpemUpO1xuICAgICAgICAgICAgbGV0IGNvbG9yID0gbWluQ29sb3IubWFwKChjaGFubmVsLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGNoYW5uZWwgKyBncmFkaWVudCAqIChtYXhDb2xvcltpbmRleF0gLSBjaGFubmVsKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBgcmdiKCR7Y29sb3Iuam9pbignLCcpfSlgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGByZ2IoJHttaW5Db2xvci5qb2luKCcsJyl9KWBcbiAgICAgICAgfVxuXG4gICAgfVxuXG5cblxuICAgIHNldEFjdGl2ZVRhYih0YWI6IHN0cmluZykge1xuICAgICAgICB0aGlzLmFjdGl2ZVRhYiA9IHRhYjtcbiAgICB9XG5cblxuICAgIGdldFNlbGVjdGVkRXZlbnRUeXBlKGUpIHtcbiAgICAgICAgaWYgKGUuZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2UgPSBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZSA9PSAnZHJpbGxkb3duJykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnWyd2aWV3UHJvcGVydGllcyddWydhc3NvY2lhdGVkVmlld3MnXSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9XG5cblxuICAgIHJlc2V0Vmlld1Byb3Byc3Rpc2UoKSB7XG4gICAgICAgIHRoaXMudmlld1Byb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICBlbmFibGVDbGlja0V2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgIGVuYWJsZVJpZ2h0Q2xpY2tFdmVudDogdHJ1ZSxcbiAgICAgICAgICAgIGNsaWNrRXZlbnRPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgYXNzb2NpYXRlZFZpZXdzOiBbXSxcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6IFwiXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cblxuXG4gICAgZGVsZXRlQXNzb2NpYXRlZFBhcmFtcyhpbmRleCkge1xuICAgICAgICB0aGlzLm9wdGlvbmFsRHJpbERvd25EYXRhU291cmNlLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG5cbiAgICBhZGRBc3NvY2lhdGVkUGFyYW1zKCkge1xuICAgICAgICB0aGlzLm9wdGlvbmFsRHJpbERvd25EYXRhU291cmNlLnB1c2goe1xuICAgICAgICAgICAgJ3ZpZXdJZCc6IFwiXCIsXG4gICAgICAgICAgICAnZmlsdGVyQ29uZGl0aW9uJzogXCJcIlxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGdldENvbG9yQm94VmlzaWJsZShlKSB7XG4gICAgICAgIHRoaXMuY29sb3JBcnJheSA9IFtdO1xuICAgIH1cblxuICAgIHNhdmVDb2xvcnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmhlYXRtYXBDaGFydENvbmZpZy50eXBlID09ICdncmFkaWVudCcgfHwgdGhpcy5oZWF0bWFwQ2hhcnRDb25maWcudHlwZSA9PSAndHdvQ29sb3InKSB7XG4gICAgICAgICAgICB0aGlzLmNvbG9yQXJyYXkgPSBbdGhpcy5maXJzdENvbG9yLCB0aGlzLnNlY29uZENvbG9yXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhlYXRtYXBDaGFydENvbmZpZy50eXBlID09ICdzaW5nbGVDb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMuY29sb3JBcnJheSA9IFt0aGlzLnNpbmdsZUNvbG9yXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdldEhlYXRtYXBEYXRhKClcblxuXG4gICAgfVxuICAgIGdldFNhdmVDaGFydENvbmZpZygpIHtcbiAgICAgICAgaWYgKHRoaXMuY29sb3JBcnJheSAmJiB0aGlzLmNvbG9yQXJyYXkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oZWF0bWFwQ2hhcnRDb25maWcudHlwZSA9PSAnZ3JhZGllbnQnIHx8IHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLnR5cGUgPT0gJ3R3b0NvbG9yJykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLmNvbG9yID0gdGhpcy5jb2xvckFycmF5O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhlYXRtYXBDaGFydENvbmZpZy50eXBlID09ICdzaW5nbGVDb2xvcicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYXRtYXBDaGFydENvbmZpZy5jb2xvciA9IHRoaXMuY29sb3JBcnJheTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICAgICAgaWYgKHRoaXMudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlID09ICdvcHRpb25hbERyaWxsRG93bicpIHtcbiAgICAgICAgICAgIHRoaXMudmlld1Byb3BlcnRpZXNbJ2NsaWNrRXZlbnRPcHRpb25zJ11bJ2Fzc29jaWF0ZWRWaWV3cyddID0gdGhpcy5vcHRpb25hbERyaWxEb3duRGF0YVNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhlYXRtYXBfY29udGVudF9jb25maWcua3BpQ29uZmlnWyd2aWV3UHJvcGVydGllcyddID0gdGhpcy52aWV3UHJvcGVydGllcztcbiAgICAgICAgdGhpcy5oZWF0bWFwX2NvbnRlbnRfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddID0gdGhpcy5oZWF0bWFwQ2hhcnRDb25maWc7XG4gICAgICAgIHRoaXMuZ2V0SGVhdE1hcENvbmZpZ091dFB1dC5lbWl0KHRoaXMuaGVhdG1hcF9jb250ZW50X2NvbmZpZyk7XG4gICAgfVxufSIsIjxkaXYgY2xhc3M9XCJtLTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIG0tMiBib3JkZXItclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzSnNvblByZXZpZXdcIj5cbiAgICAgICAgICAgIDxwcmU+PGNvZGU+e3tqc2FvbkRhdGFzb3VyY2UgfCBqc29ufX08L2NvZGU+PC9wcmU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNKc29uUHJldmlld1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhlYXRtYXBDaGFydENvbmZpZy5jaGFydEZvcm1hdCA9PSAnc2ltcGxlJ1wiPlxuICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtNSBoLVs2MHZoXSBvdmVyZmxvdy14LWF1dG9cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5saW5lLWJsb2NrXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtbm93cmFwIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1zaHJpbmstMCB3LTY0IG1heC13LVsyMCVdIGgtMTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaGVhdENoYXJ0RGF0YVNvdXJjZS5hcmd1bWVudFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXgtc2hyaW5rLTAgbWluLXctMjIgbWF4LXctWzIwJV0gaC04IHRleHQtc20gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW19fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaGVhdENoYXJ0RGF0YVNvdXJjZS5kYXRhU2V0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC04IGZsZXggdGV4dC1zbSBpdGVtcy1jZW50ZXIgbWluLXctNjQganVzdGlmeS1lbmQgcHgtMiBpbmxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmRhdGFzb3VyY2UgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubGluZS1ibG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtbm93cmFwIGp1c3RpZnktc3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYm94IG9mIGl0ZW0uZGF0YXNldFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtc2hyaW5rLTAgbWluLXctMjIgbWF4LXctWzIwJV0gaC04IGJvcmRlci0yIHRleHQtc20gY3Vyc29yLXBvaW50ZXIgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1ncmF5LTgwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnYmFja2dyb3VuZC1jb2xvcic6IGJveC5jb2xvciB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCInUmVjb3JkIERhdGU6ICcgKyBib3hbaGVhdG1hcENoYXJ0Q29uZmlnLnRvcEFyZ3VtZW50XSArICcsIFZhbHVlOiAnICsgYm94W2hlYXRtYXBDaGFydENvbmZpZy5jb2x1bW5zWzBdLmRhdGFGaWVsZF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBib3hbaGVhdG1hcENoYXJ0Q29uZmlnLmNvbHVtbnNbMF0uZGF0YUZpZWxkXX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhlYXRtYXBDaGFydENvbmZpZy5jaGFydEZvcm1hdCA9PSAndG9weCdcIj5cbiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTUgaC1bNjB2aF0gb3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaGVhZGVyIG9mIGhlYXRDaGFydERhdGFTb3VyY2UuYXJndW1lbnRWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi13LTMyIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1jZW50ZXIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGhlYWRlciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBIZWF0bWFwIEJvZHkgKFRvcCB0byBCb3R0b20gTGF5b3V0KSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgaGVhdENoYXJ0RGF0YVNvdXJjZS5kYXRhU2V0XCIgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNlbGwgb2Ygcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2VsbC5ib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC04IGJvcmRlci0yIHRleHQtc20gY3Vyc29yLXBvaW50ZXIgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1ncmF5LTgwMCBtaW4tdy0zMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnYmFja2dyb3VuZC1jb2xvcic6IGNlbGwuYm94LmNvbG9yIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIidSZWNvcmQgRGF0ZTogJyArIGNlbGwuaGVhdG1hcENoYXJ0Q29uZmlnLnRvcEFyZ3VtZW50ICsgJywgVmFsdWU6ICcgKyBjZWxsLmJveC5oZWF0bWFwQ2hhcnRDb25maWcuY29sdW1uc1swXS5kYXRhRmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjZWxsLmJveC5oZWF0bWFwQ2hhcnRDb25maWcubGVmdEFyZ3VtZW50IH19ICh7eyBjb21tb25TZXJ2aWNlLmFiYnJldmlhdGVOdW1iZXIoY2VsbC5ib3guaGVhdG1hcENoYXJ0Q29uZmlnLmNvbHVtbnNbMF0uZGF0YUZpZWxkKSB9fSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjZWxsLmJveFwiIGNsYXNzPVwiaC04IG1pbi13LTMyXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgXG4gICAgICAgICAgIFxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIG14LTIgYm9yZGVyLXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTQgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwIGRhcms6Ym9yZGVyLWdyYXktNzAwXCI+XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCAtbWItcHggdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWNlbnRlclwiIHJvbGU9XCJ0YWJsaXN0XCI+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWUtMlwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlubGluZS1ibG9jayBwLTQgYm9yZGVyLWItMiByb3VuZGVkLXQtbGdcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtcHVycGxlLTYwMCBib3JkZXItcHVycGxlLTYwMCBkYXJrOnRleHQtcHVycGxlLTUwMCBkYXJrOmJvcmRlci1wdXJwbGUtNTAwJzogYWN0aXZlVGFiID09PSAnYmFzaWMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWdyYXktNTAwIGRhcms6dGV4dC1ncmF5LTQwMCBib3JkZXItdHJhbnNwYXJlbnQnOiBhY3RpdmVUYWIgIT09ICdiYXNpYydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAoY2xpY2spPVwic2V0QWN0aXZlVGFiKCdiYXNpYycpXCIgdHlwZT1cImJ1dHRvblwiIHJvbGU9XCJ0YWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWUtMlwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlubGluZS1ibG9jayBwLTQgYm9yZGVyLWItMiByb3VuZGVkLXQtbGdcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtcHVycGxlLTYwMCBib3JkZXItcHVycGxlLTYwMCBkYXJrOnRleHQtcHVycGxlLTUwMCBkYXJrOmJvcmRlci1wdXJwbGUtNTAwJzogYWN0aXZlVGFiID09PSAnY29sdW1ucycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheS01MDAgZGFyazp0ZXh0LWdyYXktNDAwIGJvcmRlci10cmFuc3BhcmVudCc6IGFjdGl2ZVRhYiAhPT0gJ2NvbHVtbnMnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgKGNsaWNrKT1cInNldEFjdGl2ZVRhYignY29sdW1ucycpXCIgdHlwZT1cImJ1dHRvblwiIHJvbGU9XCJ0YWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJtZS0yXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaW5saW5lLWJsb2NrIHAtNCBib3JkZXItYi0yIHJvdW5kZWQtdC1sZ1wiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1wdXJwbGUtNjAwIGJvcmRlci1wdXJwbGUtNjAwIGRhcms6dGV4dC1wdXJwbGUtNTAwIGRhcms6Ym9yZGVyLXB1cnBsZS01MDAnOiBhY3RpdmVUYWIgPT09ICdwcm9wZXJ0aWVzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5LTUwMCBkYXJrOnRleHQtZ3JheS00MDAgYm9yZGVyLXRyYW5zcGFyZW50JzogYWN0aXZlVGFiICE9PSAncHJvcGVydGllcydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAoY2xpY2spPVwic2V0QWN0aXZlVGFiKCdwcm9wZXJ0aWVzJylcIiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cInRhYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuXG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwiZGVmYXVsdC1zdHlsZWQtdGFiLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdiYXNpYydcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBweS0xIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBGaWx0ZXIgVGl0bGUgQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHQtMiBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteS0yIGZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBUaXRsZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbKG5nTW9kZWwpXT1cImhlYXRtYXBDaGFydENvbmZpZy5jaGFydEZvcm1hdFwiIFtpdGVtc109XCJbJ3NpbXBsZScsJ3RvcHgnXVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IFRvcCBBcmd1bWVudDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImhlYXRtYXBDaGFydENvbmZpZy50b3BBcmd1bWVudFwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IExlZnQgQXJndW1lbnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJjb25maWdDb2x1bWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJoZWF0bWFwQ2hhcnRDb25maWcubGVmdEFyZ3VtZW50XCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gQ29sb3IgVXNhZ2U8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJbJ2dyYWRpZW50JywndHdvQ29sb3InLCdzaW5nbGVDb2xvcicsXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImhlYXRtYXBDaGFydENvbmZpZy50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJnZXRDb2xvckJveFZpc2libGUoJGV2ZW50KVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJoZWF0bWFwQ2hhcnRDb25maWcudHlwZSA9PSAnZ3JhZGllbnQnIHx8IGhlYXRtYXBDaGFydENvbmZpZy50eXBlID09ICd0d29Db2xvcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gQ29sb3I8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jb2xvci1ib3ggWyhuZ01vZGVsKV09XCJmaXJzdENvbG9yXCIgW2VkaXRBbHBoYUNoYW5uZWxdPVwidHJ1ZVwiPjwvZHgtY29sb3ItYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gQ29sb3I8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jb2xvci1ib3ggWyhuZ01vZGVsKV09XCJzZWNvbmRDb2xvclwiIFtlZGl0QWxwaGFDaGFubmVsXT1cInRydWVcIj48L2R4LWNvbG9yLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhdG1hcENoYXJ0Q29uZmlnLnR5cGUgPT0gJ3NpbmdsZUNvbG9yJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBDb2xvcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNvbG9yLWJveCBbKG5nTW9kZWwpXT1cInNpbmdsZUNvbG9yXCIgW2VkaXRBbHBoYUNoYW5uZWxdPVwidHJ1ZVwiPjwvZHgtY29sb3ItYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy1mdWxsXCIgKm5nSWY9XCJoZWF0bWFwQ2hhcnRDb25maWcudHlwZSAhPT0gJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19IG10LTZcIiAoY2xpY2spPVwic2F2ZUNvbG9ycygpXCI+Q2hlY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXc8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ2NvbHVtbnMnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtZnVsbCBvdmVyZmxvdy14LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIG1pbi13LTBcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgYm9yZGVyLWIgZmxleCBmbGV4LXJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGhlYXRtYXBDaGFydENvbmZpZy5jb2x1bW5zOyBsZXQgaSA9IGluZGV4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIG10LTYgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IFt2YWx1ZV09XCJpdGVtLnZpc2libGVcIiBbKG5nTW9kZWwpXT1cIml0ZW0udmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIlZpc2libGl0eVwiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBWYWx1ZSBGaWVsZDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJjb25maWdDb2x1bWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5kYXRhRmllbGRcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBDYXB0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmNhcHRpb25cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gVUkgRnVuY3Rpb248L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJlbnJpY2hOYW1lTGlzdFwiIFsobmdNb2RlbCldPVwiaXRlbS5lbnJpY2hOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdwcm9wZXJ0aWVzJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLWZ1bGwgb3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtbG9hZGVyICpuZ0lmPVwiaXNMb2FkZXJcIj48L2FwcC1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBweS0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNoZWNrLWJveCBbdmFsdWVdPVwidmlld1Byb3BlcnRpZXMuZW5hYmxlQ2xpY2tFdmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZpZXdQcm9wZXJ0aWVzLmVuYWJsZUNsaWNrRXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIkVuYWJsZSBDbGljayBFdmVudFwiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggW3ZhbHVlXT1cInZpZXdQcm9wZXJ0aWVzLmVuYWJsZVJpZ2h0Q2xpY2tFdmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZpZXdQcm9wZXJ0aWVzLmVuYWJsZVJpZ2h0Q2xpY2tFdmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PVwiRW5hYmxlIFJpZ2h0IENsaWNrXCI+PC9keC1jaGVjay1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgcC0yXCIgKm5nSWY9XCJ2aWV3UHJvcGVydGllcy5lbmFibGVDbGlja0V2ZW50XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gbWluLXctMCBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHB5LTEgZm9udC1leHRyYWJvbGQgYm9yZGVyLWIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSBweC0yXCI+IEV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgcC0zIGJvcmRlci14IGJvcmRlci1iIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRXZlbnQgVHlwZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJbJ2RyaWxsZG93bicsJ3NhbWVWaWV3RHJpbGxkb3duJywnb3B0aW9uYWxEcmlsbERvd24nXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwiZ2V0U2VsZWN0ZWRFdmVudFR5cGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZSA9PSAnZHJpbGxkb3duJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlbiBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gQXNzb2NpYXRlZCBWaWV3czwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRhZy1ib3ggW2l0ZW1zXT1cImFsbENvbmZpZ3VyZWRWaWV3c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5hc3NvY2lhdGVkVmlld3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlRXhwcj1cInZpZXdJZFwiIGRpc3BsYXlFeHByPVwidmlld05hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93U2VsZWN0aW9uQ29udHJvbHNdPVwidHJ1ZVwiIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIj48L2R4LXRhZy1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ2aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5ldmVudFR5cGUgPT0gJ3NhbWVWaWV3RHJpbGxkb3duJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlbiBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gQXNzb2NpYXRlZCBWaWV3czwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRhZy1ib3ggW2l0ZW1zXT1cImFsbENvbmZpZ3VyZWRWaWV3c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5hc3NvY2lhdGVkVmlld3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlRXhwcj1cInZpZXdJZFwiIGRpc3BsYXlFeHByPVwidmlld05hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93U2VsZWN0aW9uQ29udHJvbHNdPVwidHJ1ZVwiIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIj48L2R4LXRhZy1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ2aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5ldmVudFR5cGUgPT0gJ29wdGlvbmFsRHJpbGxEb3duJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlbiBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBvcHRpb25hbERyaWxEb3duRGF0YVNvdXJjZTtsZXQgaSA9IGluZGV4O1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IEFzc29jaWF0ZWQgVmlld3M8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10YWctYm94IFtpdGVtc109XCJhbGxDb25maWd1cmVkVmlld3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS52aWV3SWRcIiB2YWx1ZUV4cHI9XCJ2aWV3SWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFeHByPVwidmlld05hbWVcIiBbc2hvd1NlbGVjdGlvbkNvbnRyb2xzXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhEaXNwbGF5ZWRUYWdzXT1cIjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIj48L2R4LXRhZy1ib3g+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IEFzc29jaWF0ZWQgUGFyYW1zPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uZmlsdGVyQ29uZGl0aW9uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IGN1cnNvci1wb2ludGVyIG10LThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVBc3NvY2lhdGVkUGFyYW1zKGkpXCI+PGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWVuZCBtdC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9zbX19IGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFzc29jaWF0ZWRQYXJhbXMoKVwiPkFkZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfbWR9fSBjdXJzb3ItcG9pbnRlciBtdC00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVzZXRWaWV3UHJvcHJzdGlzZSgpXCI+UmVzZXQgQWxsIEV2ZW50PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuXG4gICAgPC9kaXY+XG48L2Rpdj5cblxuXG48ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBib3JkZXItdCBwbC0zXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1zdGFydCBteC0xXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3dhcm5pbmdfbWR9fSBjdXJzb3ItcG9pbnRlciBtdC0yXCIgKGNsaWNrKT1cImlzSnNvblByZXZpZXcgPSB0cnVlXCI+XG4gICAgICAgICAgICBQcmV2aWV3PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfbWR9fSBjdXJzb3ItcG9pbnRlciBtdC0yXCIgKGNsaWNrKT1cImlzSnNvblByZXZpZXcgPSBmYWxzZVwiPkRhdGFcbiAgICAgICAgICAgIFByZXZpZXc8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBteC0xIGZsZXgtZ3Jvd1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtMlwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZ2V0U2F2ZUNoYXJ0Q29uZmlnKClcIj5TdWJtaXQ8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
586
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhdC1tYXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL3N1cHBvcnQtY29tcG9uZW50cy9oZWF0LW1hcC9oZWF0LW1hcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvc3VwcG9ydC1jb21wb25lbnRzL2hlYXQtbWFwL2hlYXQtbWFwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSWxHLE9BQU8sTUFBTSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7Ozs7OztBQU0zQyxNQUFNLE9BQU8sdUJBQXVCO0lBNkxoQyxZQUNZLGFBQTRCLEVBQzdCLGFBQTRCLEVBQzNCLEdBQXNCLEVBQVUsT0FBa0M7UUFGbEUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDN0Isa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDM0IsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUEyQjtRQTNMOUUsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFFaEMsd0JBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQzlCLHdCQUFtQixHQUFRLEVBQUUsQ0FBQztRQUM5QixtQkFBYyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsa0NBQWtDLEVBQUUsZUFBZSxDQUFDLENBQUE7UUFFbkksdUJBQWtCLEdBQUc7WUFDakIsYUFBYSxFQUFFLEVBQUU7WUFDakIsYUFBYSxFQUFFLEVBQUU7WUFDakIsY0FBYyxFQUFFLEVBQUU7WUFDbEIsT0FBTyxFQUFFLEVBQUU7WUFDWCxNQUFNLEVBQUUsRUFBRTtZQUNWLFNBQVMsRUFBRSxFQUFFO1lBQ2IsU0FBUyxFQUFFO2dCQUNQO29CQUNJLFNBQVMsRUFBRSxJQUFJO29CQUNmLFdBQVcsRUFBRSxFQUFFO29CQUNmLFNBQVMsRUFBRSxFQUFFO29CQUNiLFlBQVksRUFBRSxFQUFFO29CQUNoQixZQUFZLEVBQUUsRUFBRTtpQkFDbkI7YUFDSjtZQUNELGNBQWMsRUFBRTtnQkFDWixPQUFPLEVBQUUsRUFBRTtnQkFDWCxXQUFXLEVBQUUsRUFBRTtnQkFDZixZQUFZLEVBQUUsRUFBRTtnQkFDaEIsYUFBYSxFQUFFLEtBQUs7YUFDdkI7U0FDSixDQUFBO1FBRUQsMkJBQXNCLEdBQUc7WUFDckIsV0FBVyxFQUFFO2dCQUNULFdBQVcsRUFBRSxFQUFFO2dCQUNmLEtBQUssRUFBRSxxQ0FBcUM7Z0JBQzVDLGFBQWEsRUFBRSxPQUFPO2dCQUN0QixTQUFTLEVBQUUsRUFBRTtnQkFDYixXQUFXLEVBQUUsRUFBRTtnQkFDZixlQUFlLEVBQUUseUJBQXlCO2dCQUMxQyxZQUFZLEVBQUUsRUFBRTthQUNuQjtTQUNKLENBQUM7UUFFRix5QkFBb0IsR0FBUSxFQUFFLENBQUM7UUFLL0IsbUJBQWMsR0FBUTtZQUNsQixnQkFBZ0IsRUFBRSxLQUFLO1lBQ3ZCLHFCQUFxQixFQUFFLElBQUk7WUFDM0IsaUJBQWlCLEVBQUU7Z0JBQ2YsZUFBZSxFQUFFLEVBQUU7Z0JBQ25CLFNBQVMsRUFBRSxFQUFFO2FBQ2hCO1NBQ0osQ0FBQztRQUNGLCtCQUEwQixHQUFRLEVBQUUsQ0FBQztRQUVyQyxhQUFRLEdBQVksSUFBSSxDQUFDO1FBRXpCLGNBQVMsR0FBVyxPQUFPLENBQUM7UUFDNUIsdUJBQWtCLEdBQVEsRUFBRSxDQUFDO1FBQzdCLGVBQVUsR0FBUSxFQUFFLENBQUM7UUFDckIsZUFBVSxHQUFHLHNCQUFzQixDQUFDO1FBQ3BDLGdCQUFXLEdBQUcsc0JBQXNCLENBQUM7UUFDckMsZ0JBQVcsR0FBRyxzQkFBc0IsQ0FBQztRQUVyQyxvQkFBZSxHQUFHLENBQUM7Z0JBQ2YsV0FBVyxFQUFFLFVBQVU7Z0JBQ3ZCLE9BQU8sRUFBRTtvQkFDTCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRTtvQkFDbkQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUU7b0JBQ25ELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFO29CQUNsRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtvQkFDbEQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUU7b0JBQ2xELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFO29CQUNsRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtvQkFDbEQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUU7b0JBQ2xELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFO29CQUNsRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRTtvQkFDakQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUU7b0JBQ2pELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFO29CQUNqRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRTtvQkFDakQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUU7aUJBQ3BEO2FBQ0o7WUFDRDtnQkFDSSxXQUFXLEVBQUUsVUFBVTtnQkFDdkIsT0FBTyxFQUFFO29CQUNMLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFO29CQUNuRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRTtvQkFDbkQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUU7b0JBQ25ELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFO29CQUNsRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtvQkFDbEQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUU7b0JBQ2xELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFO29CQUNsRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtvQkFDbEQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUU7b0JBQ2xELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFO29CQUNqRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRTtvQkFDakQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUU7b0JBQ2pELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFO29CQUNqRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRTtpQkFDcEQ7YUFDSjtZQUNEO2dCQUNJLFdBQVcsRUFBRSxVQUFVO2dCQUN2QixPQUFPLEVBQUU7b0JBQ0wsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUU7b0JBQ25ELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFO29CQUNuRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtvQkFDbEQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUU7b0JBQ2xELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFO29CQUNsRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtvQkFDbEQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUU7b0JBQ2xELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFO29CQUNsRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtvQkFDbEQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUU7b0JBQ2pELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFO29CQUNqRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRTtvQkFDakQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUU7b0JBQ2pELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFO2lCQUNwRDthQUNKO1lBQ0Q7Z0JBQ0ksV0FBVyxFQUFFLFVBQVU7Z0JBQ3ZCLE9BQU8sRUFBRTtvQkFDTCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRTtvQkFDbkQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUU7b0JBQ25ELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFO29CQUNuRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtvQkFDbEQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUU7b0JBQ2xELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFO29CQUNsRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtvQkFDbEQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUU7b0JBQ2xELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFO29CQUNsRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRTtvQkFDakQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUU7b0JBQ2pELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFO29CQUNqRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRTtvQkFDakQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUU7aUJBQ3BEO2FBQ0o7WUFDRDtnQkFDSSxXQUFXLEVBQUUsVUFBVTtnQkFDdkIsT0FBTyxFQUFFO29CQUNMLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFO29CQUNuRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRTtvQkFDbkQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUU7b0JBQ25ELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFO29CQUNsRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtvQkFDbEQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUU7b0JBQ2xELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFO29CQUNsRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtvQkFDbEQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUU7b0JBQ2xELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFO29CQUNqRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRTtvQkFDakQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUU7b0JBQ2pELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFO29CQUNqRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRTtpQkFDcEQ7YUFDSjtZQUNEO2dCQUNJLFdBQVcsRUFBRSxVQUFVO2dCQUN2QixPQUFPLEVBQUU7b0JBQ0wsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUU7b0JBQ25ELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFO29CQUNuRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRTtvQkFDbkQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUU7b0JBQ2xELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFO29CQUNsRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtvQkFDbEQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUU7b0JBQ2xELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFO29CQUNsRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtvQkFDbEQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUU7b0JBQ2pELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFO29CQUNqRCxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRTtvQkFDakQsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUU7b0JBQ2pELEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFO2lCQUNwRDthQUNKO1NBQ0EsQ0FBQTtRQUVELG9CQUFlLEdBQVEsRUFBRSxDQUFDO1FBU1QsMkJBQXNCLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUFGaEYsQ0FBQztJQUlELElBQ0ksZUFBZSxDQUFDLEtBQUs7UUFDckIsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzNDLE9BQU87U0FDVjthQUFNO1lBQ0gsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFFdkMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztZQUVqQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1lBQ3BELElBQUksS0FBSyxDQUFDLG9CQUFvQixFQUFFO2dCQUM1QixJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDLG9CQUFvQixDQUFDO2dCQUN0RSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztnQkFDaEYsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztnQkFDOUQsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsY0FBYyxFQUFFO29CQUMzQyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUM7b0JBS2hFLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRTt3QkFDNUQsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsSUFBSSxtQkFBbUIsRUFBRTs0QkFDOUYsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDOzRCQUM5RyxJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLEdBQUc7Z0NBQ3ZDLFdBQVcsRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLFNBQVM7Z0NBQ2xGLGlCQUFpQixFQUFFLEVBQUU7NkJBQ3hCLENBQUE7eUJBQ0o7NkJBQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsSUFBSSxXQUFXLEVBQUU7NEJBQzdGLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsR0FBRztnQ0FDdkMsV0FBVyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsU0FBUztnQ0FDbEYsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlOzZCQUNqRyxDQUFBO3lCQUNKO3FCQUVKO3lCQUFNO3dCQUNILElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLENBQUE7cUJBQ2hEO2lCQUVKO2dCQUdELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDNUI7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRztvQkFDbEIsZ0JBQWdCLEVBQUUsS0FBSztvQkFDdkIscUJBQXFCLEVBQUUsSUFBSTtvQkFDM0IsaUJBQWlCLEVBQUU7d0JBQ2YsZUFBZSxFQUFFLEVBQUU7d0JBQ25CLFNBQVMsRUFBRSxFQUFFO3FCQUNoQjtpQkFDSixDQUFDO2dCQUNGLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRTtpQkFFcEM7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7b0JBRXJDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUNsQztnQkFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQzVCO1NBRUo7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUVKLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDdkMsSUFBSSxFQUFFLENBQUMsSUFBUyxFQUFFLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7Z0JBRS9CLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQzFCLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsMkRBQTJELEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDdEcsQ0FBQztTQUNKLENBQUMsQ0FBQTtRQUNGLElBQUksSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDN0MsSUFBSSxDQUFDLDBCQUEwQixHQUFHO2dCQUM5QjtvQkFDSSxRQUFRLEVBQUUsRUFBRTtvQkFDWixpQkFBaUIsRUFBRSxFQUFFO2lCQUN4QjthQUNKLENBQUE7U0FDSjtJQUNMLENBQUM7SUFHRCxVQUFVO1FBQ04sSUFBSSxHQUFHLEdBQUc7WUFDTixXQUFXLEVBQUUsRUFBRTtZQUNmLFNBQVMsRUFBRSxFQUFFO1lBQ2IsWUFBWSxFQUFFLEVBQUU7WUFDaEIsWUFBWSxFQUFFLEVBQUU7WUFDaEIsU0FBUyxFQUFFLElBQUk7U0FDbEIsQ0FBQTtRQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxhQUFhLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUNoRCxDQUFDO0lBSUgsa0JBQWtCLENBQUMsS0FBYSxFQUFFLFNBQXdCO1FBRXhELElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUN6RSxNQUFNLFdBQVcsR0FBRyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBRS9ELElBQUksV0FBVyxHQUFHLENBQUMsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUdyRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFJQyxjQUFjO1FBRVYsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUU3QixJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNyRSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLElBQUksTUFBTSxFQUFFO2dCQUMvQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDL0YsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDekUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxHQUFHLFdBQVcsQ0FBQzthQUMzRDtpQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsSUFBSSxRQUFRLENBQUMsRUFBRTtnQkFDMUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUM3RSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsR0FBRyxXQUFXLENBQUM7YUFDM0Q7WUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUM3QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUM1QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztZQUNuRCxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFDekUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1NBQzFFO2FBQU07WUFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtTQUMzQztJQUlMLENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxPQUFjO1FBQ25DLE1BQU0sVUFBVSxHQUFVLEVBQUUsQ0FBQztRQUM3QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUV2RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQy9CLE1BQU0sR0FBRyxHQUFVLEVBQUUsQ0FBQztZQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDckMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEMsR0FBRyxDQUFDLElBQUksQ0FBQztvQkFDTCxHQUFHLEVBQUUsR0FBRyxJQUFJLElBQUk7b0JBQ2hCLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVztpQkFDL0IsQ0FBQyxDQUFDO2FBQ047WUFDRCxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3hCO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVELDhCQUE4QixDQUFDLElBQVc7UUFDdEMsTUFBTSxNQUFNLEdBQVUsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDOUIsTUFBTSxVQUFVLEdBQVUsRUFBRSxDQUFDO1FBRTdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUM7UUFDbkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQztRQUNyRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVoRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3JFLFdBQVcsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFL0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3pCLFVBQVUsQ0FBQyxJQUFJLENBQUM7b0JBQ1osQ0FBQyxNQUFNLENBQUMsRUFBRSxhQUFhO29CQUN2QixDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDO29CQUM3QixDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDO2lCQUN0QyxDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxXQUFXLENBQUM7UUFDaEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTtZQUM3QyxXQUFXLEdBQUcsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUNuRjthQUFNLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7WUFDcEQsV0FBVyxHQUFHLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDdkY7YUFBTTtZQUNILFdBQVcsR0FBRyxJQUFJLENBQUMsMkNBQTJDLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQzFGO1FBRUQsTUFBTSxPQUFPLEdBQThCLEVBQUUsQ0FBQztRQUU5QyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxHQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUUvQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3RCO1lBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDZixDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ3hCLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDOUIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUk7YUFDakIsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7UUFHSCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxFQUFjLEVBQUU7WUFDM0QsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDUixXQUFXLEVBQUUsSUFBSTtnQkFDakIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO2FBQy9CLENBQUMsQ0FBQztTQUNOO1FBRUQsT0FBTztZQUNILE1BQU07WUFDTixXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLEVBQUU7U0FDOUMsQ0FBQztJQUNOLENBQUM7SUFHRCxZQUFZLENBQUMsSUFBSTtRQUNiLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNsQixNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzlCLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDO1FBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUM7UUFFckQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0IsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUU1RCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN4QixhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUc7b0JBQ3BCLFVBQVUsRUFBRSxNQUFNO29CQUNsQixPQUFPLEVBQUUsRUFBRTtpQkFDZCxDQUFDO2FBQ0w7WUFFRCxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDL0IsR0FBRyxJQUFJO2dCQUNQLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUzthQUN0QixDQUFDLENBQUM7WUFFSCxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWpELEtBQUssTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFO1lBQzdCLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDM0MsSUFBSSxnQkFBZ0IsQ0FBQztZQUVyQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLElBQUksVUFBVSxFQUFFO2dCQUM1QyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsb0NBQW9DLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDdkg7aUJBQU0sSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxJQUFJLFVBQVUsRUFBRTtnQkFDbkQsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQzNIO2lCQUFNO2dCQUNILGdCQUFnQixHQUFHLElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUU5SDtZQUVELE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN6QixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzVCLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDdkMsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDdkQsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3JCLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM5QjtxQkFBTTtvQkFDSCxPQUFPO3dCQUNILENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSTt3QkFDZCxPQUFPLEVBQUUsU0FBUzt3QkFDbEIsU0FBUyxFQUFFLENBQUM7d0JBQ1osUUFBUSxFQUFFLENBQUM7d0JBQ1gsS0FBSyxFQUFFLG9CQUFvQjtxQkFDOUIsQ0FBQztpQkFDTDtZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDUixVQUFVLEVBQUUsR0FBRztnQkFDZixPQUFPLEVBQUUsZUFBZTthQUMzQixDQUFDLENBQUM7U0FDTjtRQUVELE9BQU87WUFDSCxNQUFNLEVBQUUsTUFBTTtZQUNkLFdBQVcsRUFBRSxnQkFBZ0I7U0FDaEMsQ0FBQztJQUNOLENBQUM7SUFJRCxvQ0FBb0MsQ0FBQyxRQUFRLEVBQUUsTUFBTTtRQUNqRCxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVuRSxNQUFNLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JHLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU3QyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDL0YsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBQ0Qsd0NBQXdDLENBQUMsUUFBUSxFQUFFLE1BQU07UUFDckQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMscUJBQXFCLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUNyRyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFN0MsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNwQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7YUFDN0M7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQzthQUM3QztRQUVMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUNELDJDQUEyQyxDQUFDLFFBQVEsRUFBRSxNQUFNO1FBQ3hELFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNqRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTdDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDcEIsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxTQUFTLENBQUMsUUFBZ0I7UUFDdEIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxPQUFPO1lBQ0gsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDZCxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNkLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ2QsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDakIsQ0FBQztJQUNOLENBQUM7SUFFRCxjQUFjLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVE7UUFDOUQsSUFBSSxVQUFVLElBQUksVUFBVSxFQUFFO1lBQzFCLElBQUksUUFBUSxHQUFHLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1lBQ2xFLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3hDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsUUFBUSxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDeEUsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1NBQ3BDO2FBQU07WUFDSCxPQUFPLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFBO1NBQ3RDO0lBRUwsQ0FBQztJQUlELFlBQVksQ0FBQyxHQUFXO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO0lBQ3pCLENBQUM7SUFHRCxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQywwQkFBMEIsR0FBRyxFQUFFLENBQUM7WUFDckMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsSUFBSSxXQUFXLEVBQUU7Z0JBQ2hFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3JFO1NBQ0o7SUFFTCxDQUFDO0lBR0QsbUJBQW1CO1FBQ2YsSUFBSSxDQUFDLGNBQWMsR0FBRztZQUNsQixnQkFBZ0IsRUFBRSxLQUFLO1lBQ3ZCLHFCQUFxQixFQUFFLElBQUk7WUFDM0IsaUJBQWlCLEVBQUU7Z0JBQ2YsZUFBZSxFQUFFLEVBQUU7Z0JBQ25CLFNBQVMsRUFBRSxFQUFFO2FBQ2hCO1NBQ0osQ0FBQztJQUNOLENBQUM7SUFJRCxzQkFBc0IsQ0FBQyxLQUFLO1FBQ3hCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3BELENBQUM7SUFFRCxtQkFBbUI7UUFDZixJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDO1lBQ2pDLFFBQVEsRUFBRSxFQUFFO1lBQ1osaUJBQWlCLEVBQUUsRUFBRTtTQUN4QixDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsa0JBQWtCLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsVUFBVTtRQUNOLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxVQUFVLEVBQUU7WUFDMUYsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3pEO2FBQU0sSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxJQUFJLGFBQWEsRUFBRTtZQUN0RCxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3hDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO0lBR3pCLENBQUM7SUFDRCxrQkFBa0I7UUFDZCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2pELElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxVQUFVLEVBQUU7Z0JBQzFGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNuRDtpQkFBTSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLElBQUksYUFBYSxFQUFFO2dCQUN0RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7YUFDbkQ7U0FDSjtRQUdELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLElBQUksbUJBQW1CLEVBQUU7WUFDeEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDO1NBQ2pHO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDOUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDOUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNsRSxDQUFDOztvSEFucEJRLHVCQUF1Qjt3R0FBdkIsdUJBQXVCLHFMQ1ZwQywwcnVCQTBXTTsyRkRoV08sdUJBQXVCO2tCQUpuQyxTQUFTOytCQUNJLGNBQWM7d01Bd01QLHNCQUFzQjtzQkFBdEMsTUFBTTtnQkFHSCxlQUFlO3NCQURsQixLQUFLO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSBcIm5neC10b2FzdHJcIjtcbmltcG9ydCB7IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vYXBwbGljYXRpb24tY29udGVudC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IG1vbWVudCBmcm9tICcuLy4uLy4uL21vbWVudC1oZWxwZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1oZWF0LW1hcCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2hlYXQtbWFwLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgSGVhdE1hcFN1cHBvcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIGlzSGVhdE1hcExvYWRlcjogYm9vbGVhbjtcblxuXG5cbiAgICBpc0FkdmFuY2VGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBpc0hlYXRNYXBDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgaGVhdENoYXJ0RGF0YVNvdXJjZTogYW55ID0ge307XG4gICAgY2hhcnREYXRhRm9yVG9vbHRpcDogYW55ID0ge307XG4gICAgZW5yaWNoTmFtZUxpc3QgPSBbXCJhYmJyZXZpYXRlTnVtYmVyXCIsIFwiZ2V0Q29sb3JDb2RlU3BhblwiLCBcIlRob3VzYW5kU2VwYXJhdG9yXCIsIFwiVGhvdXNhbmRTZXBhcmF0b3JXaXRoVHdvRGVjaW1hbHNcIiwgXCJmb3JtYXRCeXRlc3YyXCJdXG5cbiAgICBoZWF0bWFwQ2hhcnRDb25maWcgPSB7XG4gICAgICAgIFwiY2hhcnRGb3JtYXRcIjogXCJcIixcbiAgICAgICAgXCJ0b3BBcmd1bWVudFwiOiBcIlwiLFxuICAgICAgICBcImxlZnRBcmd1bWVudFwiOiBcIlwiLFxuICAgICAgICBcImNvbG9yXCI6IFtdLFxuICAgICAgICBcInR5cGVcIjogXCJcIixcbiAgICAgICAgXCJmb3JtYXRlXCI6IFwiXCIsXG4gICAgICAgIFwiY29sdW1uc1wiOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJ2aXNpYmxlXCI6IHRydWUsXG4gICAgICAgICAgICAgICAgXCJkYXRhRmllbGRcIjogXCJcIixcbiAgICAgICAgICAgICAgICBcImNhcHRpb25cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcImRpc3BsYXlGb3JcIjogXCJcIixcbiAgICAgICAgICAgICAgICBcImVucmljaE5hbWVcIjogXCJcIixcbiAgICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgXCJjb21tb25Db25maWdcIjoge1xuICAgICAgICAgICAgXCJ0aXRsZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJkYXRhRmllbGRcIjogXCJcIixcbiAgICAgICAgICAgIFwiY2hlY2tlZEtleVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJpc1NlYXJjaEJveFwiOiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGVhdG1hcF9jb250ZW50X2NvbmZpZyA9IHtcbiAgICAgICAgXCJrcGlDb25maWdcIjoge1xuICAgICAgICAgICAgXCJzZXJ2aWNlSWRcIjogXCJcIixcbiAgICAgICAgICAgIFwiYXBpXCI6IFwiL2twaS90cmVuZHMvbmV0d29yay9nZXQtbWV0cmljLWRhdGFcIixcbiAgICAgICAgICAgIFwiZGlzcGxheVR5cGVcIjogXCJ0YWJsZVwiLFxuICAgICAgICAgICAgXCJmb3JtYXRlXCI6IFwiXCIsXG4gICAgICAgICAgICBcImtleVRvUGFzc1wiOiBbXSxcbiAgICAgICAgICAgIFwiY29tcG9uZW50TmFtZVwiOiBcIkdhbW1hSGVhdENoYXJ0Q29tcG9uZW50XCIsXG4gICAgICAgICAgICBcImRhdGFDb25maWdcIjoge31cbiAgICAgICAgfSxcbiAgICB9O1xuICAgIGlzSnNvblByZXZpZXc6IGJvb2xlYW5cbiAgICBkYXRhU291cnNlRm9ySGVhdE1hcDogYW55ID0gW107XG4gICAgY29uZmlnQ29sdW1lOiBhbnk7XG4gICAganNhb25EYXRhc291cmNlOiBhbnk7XG4gICAgc2VsZWN0ZWRWaWV3Q29uZmlnczogYW55O1xuXG4gICAgdmlld1Byb3BlcnRpZXM6IGFueSA9IHtcbiAgICAgICAgZW5hYmxlQ2xpY2tFdmVudDogZmFsc2UsXG4gICAgICAgIGVuYWJsZVJpZ2h0Q2xpY2tFdmVudDogdHJ1ZSxcbiAgICAgICAgY2xpY2tFdmVudE9wdGlvbnM6IHtcbiAgICAgICAgICAgIGFzc29jaWF0ZWRWaWV3czogW10sXG4gICAgICAgICAgICBldmVudFR5cGU6IFwiXCJcbiAgICAgICAgfVxuICAgIH07XG4gICAgb3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2U6IGFueSA9IFtdO1xuICAgIHNlbGVjdGVkVGFibGVWaWV3VHlwZTogYW55O1xuICAgIGlzTG9hZGVyOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIGFjdGl2ZVRhYjogc3RyaW5nID0gJ2Jhc2ljJztcbiAgICBhbGxDb25maWd1cmVkVmlld3M6IGFueSA9IFtdO1xuICAgIGNvbG9yQXJyYXk6IGFueSA9IFtdO1xuICAgIGZpcnN0Q29sb3IgPSBcInJnYmEoNDUsIDExMCwgMTgsIDEpXCI7XG4gICAgc2Vjb25kQ29sb3IgPSBcInJnYmEoMjU1LCAyMDQsIDAsIDEpXCI7XG4gICAgc2luZ2xlQ29sb3IgPSBcInJnYmEoMjU1LCAyMDQsIDAsIDEpXCI7XG5cbiAgICB0ZXN0X3ZvaWNlX2RhdGEgPSBbe1xuICAgICAgICByZWNvcmRfZGF0ZTogJzIwMjUwNTI3JyxcbiAgICAgICAgZGF0YXNldDogW1xuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdZRU0nLCB0b3RhbF9jaGFyZ2U6IDE4NDM1NzE3NiB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdFUkknLCB0b3RhbF9jaGFyZ2U6IDExNTI2MjUwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdCR0QnLCB0b3RhbF9jaGFyZ2U6IDgzMjg5NjE0IH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0VUSCcsIHRvdGFsX2NoYXJnZTogNzkwMDQ1MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnUEFLJywgdG90YWxfY2hhcmdlOiA3Njk5MjQ1NCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdTRE4nLCB0b3RhbF9jaGFyZ2U6IDYwNDgwNDAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0lORCcsIHRvdGFsX2NoYXJnZTogMzg4OTI4NTggfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnRUdZJywgdG90YWxfY2hhcmdlOiAzNzc2OTc0NCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdOUEwnLCB0b3RhbF9jaGFyZ2U6IDE3MjE0MDAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0FGRycsIHRvdGFsX2NoYXJnZTogNzI2ODAwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdUQ0QnLCB0b3RhbF9jaGFyZ2U6IDUzNzI1MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnSUROJywgdG90YWxfY2hhcmdlOiA0NDI1NzAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1VHQScsIHRvdGFsX2NoYXJnZTogMzkzMzMwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdHQlInLCB0b3RhbF9jaGFyZ2U6IDM4NDgyMjUgfVxuICAgICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHJlY29yZF9kYXRlOiAnMjAyNTA1MzEnLFxuICAgICAgICBkYXRhc2V0OiBbXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1lFTScsIHRvdGFsX2NoYXJnZTogMjA4Njk5ODI3IH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0VSSScsIHRvdGFsX2NoYXJnZTogMTQzNTAxNTAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0JHRCcsIHRvdGFsX2NoYXJnZTogMTA2Mjk2Mjk0IH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0VUSCcsIHRvdGFsX2NoYXJnZTogODYwOTM1MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnUEFLJywgdG90YWxfY2hhcmdlOiA3NzQyODQ2MSB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdTRE4nLCB0b3RhbF9jaGFyZ2U6IDY1ODE4NTk4IH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0lORCcsIHRvdGFsX2NoYXJnZTogMzg2MzUxNzUgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnRUdZJywgdG90YWxfY2hhcmdlOiAzNzY1ODcwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdOUEwnLCB0b3RhbF9jaGFyZ2U6IDE4NzczMjAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0FGRycsIHRvdGFsX2NoYXJnZTogODIzMjUwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdUQ0QnLCB0b3RhbF9jaGFyZ2U6IDcwMDc1MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnQVJFJywgdG90YWxfY2hhcmdlOiA0NTkzODAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0lETicsIHRvdGFsX2NoYXJnZTogNDExODgwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdQSEwnLCB0b3RhbF9jaGFyZ2U6IDQwNTE1MDAgfVxuICAgICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHJlY29yZF9kYXRlOiAnMjAyNTA1MjgnLFxuICAgICAgICBkYXRhc2V0OiBbXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1lFTScsIHRvdGFsX2NoYXJnZTogMTk4OTQzNjYxIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0VSSScsIHRvdGFsX2NoYXJnZTogMTE4MDY1MDAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0JHRCcsIHRvdGFsX2NoYXJnZTogOTA5ODA4MjkgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnRVRIJywgdG90YWxfY2hhcmdlOiA4MDM2NzcwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdQQUsnLCB0b3RhbF9jaGFyZ2U6IDc4MDE4OTczIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1NETicsIHRvdGFsX2NoYXJnZTogNTY4MjY1MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnSU5EJywgdG90YWxfY2hhcmdlOiAzNzg3MTYyNSB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdFR1knLCB0b3RhbF9jaGFyZ2U6IDMzMzc0ODE1IH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ05QTCcsIHRvdGFsX2NoYXJnZTogMTY3NjM0MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnQUZHJywgdG90YWxfY2hhcmdlOiA3OTI2MDAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1RDRCcsIHRvdGFsX2NoYXJnZTogNTYwMDAwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdJRE4nLCB0b3RhbF9jaGFyZ2U6IDQ2MDI0MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnR0JSJywgdG90YWxfY2hhcmdlOiA0NDQzNjI1IH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1VHQScsIHRvdGFsX2NoYXJnZTogNDM3OTIwMCB9XG4gICAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgcmVjb3JkX2RhdGU6ICcyMDI1MDUzMCcsXG4gICAgICAgIGRhdGFzZXQ6IFtcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnWUVNJywgdG90YWxfY2hhcmdlOiAyMzEzNzg4NTIgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnQkdEJywgdG90YWxfY2hhcmdlOiAxNTE3ODYwMTggfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnRVJJJywgdG90YWxfY2hhcmdlOiAxNDY3ODI1MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnUEFLJywgdG90YWxfY2hhcmdlOiA4ODA1NDQ0NSB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdFVEgnLCB0b3RhbF9jaGFyZ2U6IDgzNjM1NTAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1NETicsIHRvdGFsX2NoYXJnZTogNjIyNTcwMDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnSU5EJywgdG90YWxfY2hhcmdlOiA0NDMxNjUwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdFR1knLCB0b3RhbF9jaGFyZ2U6IDI5ODk0MzkyIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ05QTCcsIHRvdGFsX2NoYXJnZTogMjMzODM1MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnQUZHJywgdG90YWxfY2hhcmdlOiA4MDI5NTAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1RDRCcsIHRvdGFsX2NoYXJnZTogNzMyMjUwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdHQlInLCB0b3RhbF9jaGFyZ2U6IDQzMzg0NTAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnSUROJywgdG90YWxfY2hhcmdlOiAzOTA0NDAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0FSRScsIHRvdGFsX2NoYXJnZTogMzgzMjEwMCB9XG4gICAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgcmVjb3JkX2RhdGU6ICcyMDI1MDUyOScsXG4gICAgICAgIGRhdGFzZXQ6IFtcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnWUVNJywgdG90YWxfY2hhcmdlOiAyMDA5MDYzNTcgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnRVJJJywgdG90YWxfY2hhcmdlOiAxMjY3MjUwMDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnQkdEJywgdG90YWxfY2hhcmdlOiAxMTUyODc3MjIgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnRVRIJywgdG90YWxfY2hhcmdlOiA4MjA2MjQwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdQQUsnLCB0b3RhbF9jaGFyZ2U6IDc3MjYwNjEwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1NETicsIHRvdGFsX2NoYXJnZTogNTQzOTQ4MTAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnSU5EJywgdG90YWxfY2hhcmdlOiAzODY1NDAwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdFR1knLCB0b3RhbF9jaGFyZ2U6IDM0NTAzMzUwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ05QTCcsIHRvdGFsX2NoYXJnZTogMTcyNzcxMDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnQUZHJywgdG90YWxfY2hhcmdlOiA3NzQ2NTAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1RDRCcsIHRvdGFsX2NoYXJnZTogNjEwMDAwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdHQlInLCB0b3RhbF9jaGFyZ2U6IDQ3MzYxNTAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnSUROJywgdG90YWxfY2hhcmdlOiA0Njc4OTAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0tFTicsIHRvdGFsX2NoYXJnZTogNDQ1MzAwMCB9XG4gICAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgcmVjb3JkX2RhdGU6ICcyMDI1MDYwMScsXG4gICAgICAgIGRhdGFzZXQ6IFtcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnWUVNJywgdG90YWxfY2hhcmdlOiAyMTQyODc5NzggfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnRVJJJywgdG90YWxfY2hhcmdlOiAxNTQ0MDI1MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnQkdEJywgdG90YWxfY2hhcmdlOiAxMDAyMDQwMDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnRVRIJywgdG90YWxfY2hhcmdlOiA5NzQ3OTgwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdQQUsnLCB0b3RhbF9jaGFyZ2U6IDc1MzkxNDYzIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1NETicsIHRvdGFsX2NoYXJnZTogNjU2MjIyMDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnSU5EJywgdG90YWxfY2hhcmdlOiAzODEyNDQ5NyB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdFR1knLCB0b3RhbF9jaGFyZ2U6IDM1Mjc4MDI1IH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ05QTCcsIHRvdGFsX2NoYXJnZTogMjI2NjUwMDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnQUZHJywgdG90YWxfY2hhcmdlOiA2OTIwMDAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ1VHQScsIHRvdGFsX2NoYXJnZTogNTYyNTEwMCB9LFxuICAgICAgICAgICAgeyBvdGhlcl9wYXJ0eV9pc286ICdJRE4nLCB0b3RhbF9jaGFyZ2U6IDUyNTY5MDAgfSxcbiAgICAgICAgICAgIHsgb3RoZXJfcGFydHlfaXNvOiAnVENEJywgdG90YWxfY2hhcmdlOiA0OTcwMDAwIH0sXG4gICAgICAgICAgICB7IG90aGVyX3BhcnR5X2lzbzogJ0dCUicsIHRvdGFsX2NoYXJnZTogNDQxMDI1MCB9XG4gICAgICAgIF1cbiAgICB9XG4gICAgXVxuXG4gICAgY2hhcnREYXRhU291cmNlOiBhbnkgPSB7fTtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSB0b2FzdHJTZXJ2aWNlOiBUb2FzdHJTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIHNlcnZpY2U6IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2VcbiAgICApIHtcblxuICAgIH1cblxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0SGVhdE1hcENvbmZpZ091dFB1dDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBASW5wdXQoJ2RhdGFzZXRtb2RhbCcpXG4gICAgc2V0IGNoYXJ0Y29uZmlnRGF0YSh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuanNhb25EYXRhc291cmNlID0gdmFsdWUuZGF0YVswXTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnQ29sdW1lID0gT2JqZWN0LmtleXModmFsdWUuZGF0YVswXSk7XG4gICAgICAgICAgICB0aGlzLmRhdGFTb3Vyc2VGb3JIZWF0TWFwID0gdmFsdWUuZGF0YTtcbiAgICAgICAgICAgIC8vIHRoaXMuZGF0YVNvdXJzZUZvckhlYXRNYXAgPSB0aGlzLnRlc3Rfdm9pY2VfZGF0YTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3Q29uZmlncyA9IHZhbHVlO1xuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFibGVWaWV3VHlwZSA9IHZhbHVlLnNlbGVjdGVkVmlld1R5cGU7XG4gICAgICAgICAgICBpZiAodmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYXRtYXBfY29udGVudF9jb25maWdbJ2twaUNvbmZpZyddID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWc7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWF0bWFwQ2hhcnRDb25maWcgPSB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy5kYXRhQ29uZmlnO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLmNvbHVtbnMgPSB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy5kYXRhQ29uZmlnLmNvbHVtbnM7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2xvckFycmF5ID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcuZGF0YUNvbmZpZy5jb2xvcjtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcudmlld1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3UHJvcGVydGllcyA9IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnZpZXdQcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgIFwiZW5hYmxlQ2xpY2tFdmVudFwiOiB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy52aWV3UHJvcGVydGllcy5lbmFibGVDbGlja0V2ZW50LFxuICAgICAgICAgICAgICAgICAgICAvLyAgIFwiZW5hYmxlUmlnaHRDbGlja0V2ZW50XCI6IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzLmVuYWJsZVJpZ2h0Q2xpY2tFdmVudFxuICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy52aWV3UHJvcGVydGllcy5lbmFibGVDbGlja0V2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlID09ICdvcHRpb25hbERyaWxsRG93bicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbmFsRHJpbERvd25EYXRhU291cmNlID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuYXNzb2NpYXRlZFZpZXdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld1Byb3BlcnRpZXNbJ2NsaWNrRXZlbnRPcHRpb25zJ10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZXZlbnRUeXBlXCI6IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhc3NvY2lhdGVkVmlld3NcIjogW11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZSA9PSAnZHJpbGxkb3duJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld1Byb3BlcnRpZXNbJ2NsaWNrRXZlbnRPcHRpb25zJ10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZXZlbnRUeXBlXCI6IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhc3NvY2lhdGVkVmlld3NcIjogdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuYXNzb2NpYXRlZFZpZXdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdQcm9wZXJ0aWVzWydjbGlja0V2ZW50T3B0aW9ucyddID0ge31cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmlld1Byb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZUNsaWNrRXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBlbmFibGVSaWdodENsaWNrRXZlbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsaWNrRXZlbnRPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVkVmlld3M6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhlYXRtYXBDaGFydENvbmZpZy5jb2x1bW5zKSB7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYXRtYXBDaGFydENvbmZpZy5jb2x1bW5zID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5jb25maWdDb2x1bWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5zZXJ2aWNlLmdldEFwcFZpZXdDb25maWdzKCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFsbENvbmZpZ3VyZWRWaWV3cyA9IGRhdGE7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnQWxsIFZpZXdzJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2UubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2UgPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAndmlld0lkJzogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgJ2ZpbHRlckNvbmRpdGlvbic6IFwiXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIGFkZENvbHVtbnMoKSB7XG4gICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICBcImRhdGFGaWVsZFwiOiBcIlwiLFxuICAgICAgICAgICAgXCJjYXB0aW9uXCI6IFwiXCIsXG4gICAgICAgICAgICBcImVucmljaE5hbWVcIjogXCJcIixcbiAgICAgICAgICAgIFwiZGlzcGxheUZvclwiOiBcIlwiLFxuICAgICAgICAgICAgXCJ2aXNpYmxlXCI6IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLmNvbHVtbnMucHVzaChvYmopO1xuICAgIH1cblxuICAgIGRlbGV0ZUNvbHVtbnMoaSkge1xuICAgICAgICB0aGlzLmhlYXRtYXBDaGFydENvbmZpZy5jb2x1bW5zLnNwbGljZShpLCAxKVxuICAgIH1cblxuXG5cbiAgbW92ZUl0ZW1Gb3JDb2x1bW5zKGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogJ3VwJyB8ICdkb3duJyk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLmNvbHVtbnMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSBkaXJlY3Rpb24gPT09ICd1cCcgPyBpbmRleCAtIDEgOiBpbmRleCArIDE7XG4gICAgLy8gUHJldmVudCBtb3ZpbmcgYmV5b25kIGFycmF5IGJvdW5kc1xuICAgIGlmIChuZXdQb3NpdGlvbiA8IDAgfHwgbmV3UG9zaXRpb24gPj0gdGhpcy5oZWF0bWFwQ2hhcnRDb25maWcuY29sdW1ucy5sZW5ndGgpIHJldHVybjtcblxuICAgIC8vIE1vdmUgaXRlbVxuICAgIGNvbnN0IGl0ZW1Ub01vdmUgPSB0aGlzLmhlYXRtYXBDaGFydENvbmZpZy5jb2x1bW5zW2luZGV4XTtcbiAgICB0aGlzLmhlYXRtYXBDaGFydENvbmZpZy5jb2x1bW5zLnNwbGljZShpbmRleCwgMSk7IC8vIFJlbW92ZSBpdGVtIGZyb20gY3VycmVudCBwb3NpdGlvblxuICAgIHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLmNvbHVtbnMuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpdGVtVG9Nb3ZlKTsgLy8gSW5zZXJ0IGl0ZW0gaW4gbmV3IHBvc2l0aW9uXG4gIH1cblxuXG5cbiAgICBnZXRIZWF0bWFwRGF0YSgpIHtcblxuICAgICAgICB0aGlzLmhlYXRDaGFydERhdGFTb3VyY2UgPSB7fTtcbiAgICAgICAgdGhpcy5pc0FkdmFuY2VGaWx0ZXIgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5kYXRhU291cnNlRm9ySGVhdE1hcCAmJiB0aGlzLmRhdGFTb3Vyc2VGb3JIZWF0TWFwLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLmNoYXJ0Rm9ybWF0ID09IFwidG9weFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyByZXN1bHQsIHVuaXF1ZURhdGVzIH0gPSB0aGlzLmdlbmVyYXRlRGF0ZVdpc2VDb2xvckNvZGVkRGF0YSh0aGlzLmRhdGFTb3Vyc2VGb3JIZWF0TWFwKTtcbiAgICAgICAgICAgICAgICB1bmlxdWVEYXRlcy5zb3J0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWF0Q2hhcnREYXRhU291cmNlLmRhdGFTZXQgPSB0aGlzLmdldFRyYW5zcG9zZWRIZWF0bWFwRGF0YShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhdENoYXJ0RGF0YVNvdXJjZVtcImFyZ3VtZW50VmFsdWVcIl0gPSB1bmlxdWVEYXRlcztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLmNoYXJ0Rm9ybWF0ID09IFwic2ltcGxlXCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyByZXN1bHQsIHVuaXF1ZURhdGVzIH0gPSB0aGlzLmdlbmVyYXRlRGF0YSh0aGlzLmRhdGFTb3Vyc2VGb3JIZWF0TWFwKTtcbiAgICAgICAgICAgICAgICB1bmlxdWVEYXRlcy5zb3J0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWF0Q2hhcnREYXRhU291cmNlW1wiZGF0YVNldFwiXSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYXRDaGFydERhdGFTb3VyY2VbXCJhcmd1bWVudFZhbHVlXCJdID0gdW5pcXVlRGF0ZXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXNIZWF0TWFwTG9hZGVyID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzSGVhdE1hcENsaWNrID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNoYXJ0RGF0YVNvdXJjZSA9IHRoaXMuaGVhdG1hcF9jb250ZW50X2NvbmZpZztcbiAgICAgICAgICAgIHRoaXMuY2hhcnREYXRhU291cmNlLmtwaUNvbmZpZ1snZGF0YVNvdXJjZSddID0gdGhpcy5kYXRhU291cnNlRm9ySGVhdE1hcDtcbiAgICAgICAgICAgIHRoaXMuY2hhcnREYXRhU291cmNlLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddID0gdGhpcy5oZWF0bWFwQ2hhcnRDb25maWc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzSGVhdE1hcENsaWNrID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2UuaW5mbyhcIk5vIERhdGEgRm91bmRcIilcbiAgICAgICAgfVxuXG5cblxuICAgIH1cblxuICAgIGdldFRyYW5zcG9zZWRIZWF0bWFwRGF0YShkYXRhU2V0OiBhbnlbXSk6IGFueVtdIHtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlZDogYW55W10gPSBbXTtcbiAgICAgICAgY29uc3QgbWF4Qm94ZXMgPSBNYXRoLm1heCguLi5kYXRhU2V0Lm1hcChpdGVtID0+IGl0ZW0uZGF0YXNldC5sZW5ndGgpKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heEJveGVzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdzogYW55W10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGF0YVNldC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJveCA9IGRhdGFTZXRbal0uZGF0YXNldFtpXTtcbiAgICAgICAgICAgICAgICByb3cucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGJveDogYm94IHx8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGRhdGU6IGRhdGFTZXRbal0ucmVjb3JkX2RhdGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYW5zcG9zZWQucHVzaChyb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRyYW5zcG9zZWQ7XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVEYXRlV2lzZUNvbG9yQ29kZWREYXRhKGRhdGE6IGFueVtdKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gPSBbXTtcbiAgICAgICAgY29uc3QgdW5pcXVlRGF0ZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGNvbnN0IGFsbEVudHJpZXM6IGFueVtdID0gW107XG5cbiAgICAgICAgY29uc3QgdG9wQXJnID0gdGhpcy5oZWF0bWFwQ2hhcnRDb25maWcudG9wQXJndW1lbnQ7XG4gICAgICAgIGNvbnN0IGxlZnRBcmcgPSB0aGlzLmhlYXRtYXBDaGFydENvbmZpZy5sZWZ0QXJndW1lbnQ7XG4gICAgICAgIGNvbnN0IHZhbHVlRmllbGQgPSB0aGlzLmhlYXRtYXBDaGFydENvbmZpZy5jb2x1bW5zWzBdLmRhdGFGaWVsZDtcblxuICAgICAgICBkYXRhLmZvckVhY2goZW50cnkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IG1vbWVudChlbnRyeS5yZWNvcmRfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgICAgICAgICB1bmlxdWVEYXRlcy5hZGQoZm9ybWF0dGVkRGF0ZSk7XG5cbiAgICAgICAgICAgIGVudHJ5LmRhdGFzZXQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBhbGxFbnRyaWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBbdG9wQXJnXTogZm9ybWF0dGVkRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgW2xlZnRBcmddOiBpdGVtW2Ake2xlZnRBcmd9YF0sXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZUZpZWxkXTogaXRlbVtgJHt2YWx1ZUZpZWxkfWBdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IGNvbG9yZWREYXRhO1xuICAgICAgICBpZiAodGhpcy5oZWF0bWFwQ2hhcnRDb25maWcudHlwZSA9PT0gJ2dyYWRpZW50Jykge1xuICAgICAgICAgICAgY29sb3JlZERhdGEgPSB0aGlzLmdldEZvcm1hdGVEYXRhQnlDb2xvckNvZGVGb3JHcmFkaWVudChhbGxFbnRyaWVzLCB2YWx1ZUZpZWxkKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhlYXRtYXBDaGFydENvbmZpZy50eXBlID09PSAndHdvQ29sb3InKSB7XG4gICAgICAgICAgICBjb2xvcmVkRGF0YSA9IHRoaXMuZ2V0Rm9ybWF0ZURhdGFCeUNvbG9yQ29kZUZvcldpdGhUd29Db2xvcihhbGxFbnRyaWVzLCB2YWx1ZUZpZWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbG9yZWREYXRhID0gdGhpcy5nZXRGb3JtYXRlRGF0YUJ5Q29sb3JDb2RlRm9yV2l0aFNpbmdsZUNvbG9yKGFsbEVudHJpZXMsIHZhbHVlRmllbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0ZU1hcDogeyBbZGF0ZTogc3RyaW5nXTogYW55W10gfSA9IHt9O1xuXG4gICAgICAgIGNvbG9yZWREYXRhLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRlOiBhbnkgPSBpdGVtW3RvcEFyZ107XG5cbiAgICAgICAgICAgIGlmICghZGF0ZU1hcFtkYXRlXSkge1xuICAgICAgICAgICAgICAgIGRhdGVNYXBbZGF0ZV0gPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0ZU1hcFtkYXRlXS5wdXNoKHtcbiAgICAgICAgICAgICAgICBbbGVmdEFyZ106IGl0ZW1bbGVmdEFyZ10sXG4gICAgICAgICAgICAgICAgW3ZhbHVlRmllbGRdOiBpdGVtW3ZhbHVlRmllbGRdLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBpdGVtLmNvbG9yLFxuICAgICAgICAgICAgICAgIFt0b3BBcmddOiBkYXRlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0ZXAgNDogQnVpbGQgZmluYWwgcmVzdWx0XG4gICAgICAgIGZvciAoY29uc3QgZGF0ZSBvZiBBcnJheS5mcm9tKHVuaXF1ZURhdGVzKS5zb3J0KCkgYXMgc3RyaW5nW10pIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICByZWNvcmRfZGF0ZTogZGF0ZSxcbiAgICAgICAgICAgICAgICBkYXRhc2V0OiBkYXRlTWFwW2RhdGVdIHx8IFtdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICB1bmlxdWVEYXRlczogQXJyYXkuZnJvbSh1bmlxdWVEYXRlcykuc29ydCgpXG4gICAgICAgIH07XG4gICAgfVxuXG5cbiAgICBnZW5lcmF0ZURhdGEoZGF0YSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgY29uc3QgdW5pcXVlRGF0ZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGNvbnN0IGRhdGFTb3VyY2VNYXAgPSB7fTtcbiAgICAgICAgY29uc3QgdG9wQXJnID0gdGhpcy5oZWF0bWFwQ2hhcnRDb25maWcudG9wQXJndW1lbnQ7XG4gICAgICAgIGNvbnN0IGxlZnRBcmcgPSB0aGlzLmhlYXRtYXBDaGFydENvbmZpZy5sZWZ0QXJndW1lbnQ7XG5cbiAgICAgICAgZGF0YS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3Qgcm93S2V5ID0gaXRlbVtsZWZ0QXJnXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbktleSA9IG1vbWVudChpdGVtW3RvcEFyZ10pLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuXG4gICAgICAgICAgICBpZiAoIWRhdGFTb3VyY2VNYXBbcm93S2V5XSkge1xuICAgICAgICAgICAgICAgIGRhdGFTb3VyY2VNYXBbcm93S2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YXNvdXJjZTogcm93S2V5LFxuICAgICAgICAgICAgICAgICAgICBkYXRhc2V0OiBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGFTb3VyY2VNYXBbcm93S2V5XS5kYXRhc2V0LnB1c2goe1xuICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgW3RvcEFyZ106IGNvbHVtbktleVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHVuaXF1ZURhdGVzLmFkZChjb2x1bW5LZXkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB1bmlxdWVEYXRlc0FycmF5ID0gQXJyYXkuZnJvbSh1bmlxdWVEYXRlcyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YVNvdXJjZU1hcCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YXNldCA9IGRhdGFTb3VyY2VNYXBba2V5XS5kYXRhc2V0O1xuICAgICAgICAgICAgbGV0IGZvcm1hdHRlZERhdGFzZXQ7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhlYXRtYXBDaGFydENvbmZpZy50eXBlID09IFwiZ3JhZGllbnRcIikge1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZERhdGFzZXQgPSB0aGlzLmdldEZvcm1hdGVEYXRhQnlDb2xvckNvZGVGb3JHcmFkaWVudChkYXRhc2V0LCB0aGlzLmhlYXRtYXBDaGFydENvbmZpZy5jb2x1bW5zWzBdLmRhdGFGaWVsZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLnR5cGUgPT0gXCJ0d29Db2xvclwiKSB7XG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkRGF0YXNldCA9IHRoaXMuZ2V0Rm9ybWF0ZURhdGFCeUNvbG9yQ29kZUZvcldpdGhUd29Db2xvcihkYXRhc2V0LCB0aGlzLmhlYXRtYXBDaGFydENvbmZpZy5jb2x1bW5zWzBdLmRhdGFGaWVsZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZERhdGFzZXQgPSB0aGlzLmdldEZvcm1hdGVEYXRhQnlDb2xvckNvZGVGb3JXaXRoU2luZ2xlQ29sb3IoZGF0YXNldCwgdGhpcy5oZWF0bWFwQ2hhcnRDb25maWcuY29sdW1uc1swXS5kYXRhRmllbGQpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGVUb0l0ZW1NYXAgPSB7fTtcbiAgICAgICAgICAgIGZvcm1hdHRlZERhdGFzZXQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBkYXRlVG9JdGVtTWFwW2l0ZW1bdG9wQXJnXV0gPSBpdGVtO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlRGF0YXNldCA9IHVuaXF1ZURhdGVzQXJyYXkubWFwKChkYXRlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0ZVRvSXRlbU1hcFtkYXRlXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZVRvSXRlbU1hcFtkYXRlXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgW3RvcEFyZ106IGRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdmdTaXplOiBcIk5vIERhdGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVDb3VudDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTaXplOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwicmdiKDI0MiwgMTE4LCAxMDkpXCJcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgIGRhdGFzb3VyY2U6IGtleSxcbiAgICAgICAgICAgICAgICBkYXRhc2V0OiBjb21wbGV0ZURhdGFzZXRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0LFxuICAgICAgICAgICAgdW5pcXVlRGF0ZXM6IHVuaXF1ZURhdGVzQXJyYXlcbiAgICAgICAgfTtcbiAgICB9XG5cblxuXG4gICAgZ2V0Rm9ybWF0ZURhdGFCeUNvbG9yQ29kZUZvckdyYWRpZW50KGZpbGVkYXRhLCBjb2x1bW4pIHtcbiAgICAgICAgZmlsZWRhdGEuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uYXZnU2l6ZSA9IHBhcnNlRmxvYXQoaXRlbVtjb2x1bW5dKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbWF4QXZnU2l6ZSA9IE1hdGgubWF4KC4uLmZpbGVkYXRhLm1hcChpdGVtID0+IGl0ZW1bY29sdW1uXSkpO1xuICAgICAgICBjb25zdCBtaW5BdmdTaXplID0gTWF0aC5taW4oLi4uZmlsZWRhdGEubWFwKGl0ZW0gPT4gaXRlbVtjb2x1bW5dKSk7XG5cbiAgICAgICAgY29uc3QgW21pbkNvbG9yU3RyLCBtYXhDb2xvclN0cl0gPSB0aGlzLmNvbG9yQXJyYXkgfHwgW1wicmdiYSg0NSwgMTEwLCAxOCwxKVwiLCBcInJnYmEoMjU1LCAyMDQsIDAsMSlcIl07XG4gICAgICAgIGNvbnN0IG1pbkNvbG9yID0gdGhpcy5wYXJzZVJHQkEobWluQ29sb3JTdHIpO1xuICAgICAgICBjb25zdCBtYXhDb2xvciA9IHRoaXMucGFyc2VSR0JBKG1heENvbG9yU3RyKTtcblxuICAgICAgICBmaWxlZGF0YS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5jb2xvciA9IHRoaXMuY2FsY3VsYXRlQ29sb3IoaXRlbVtjb2x1bW5dLCBtaW5BdmdTaXplLCBtYXhBdmdTaXplLCBtaW5Db2xvciwgbWF4Q29sb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmlsZWRhdGE7XG4gICAgfVxuICAgIGdldEZvcm1hdGVEYXRhQnlDb2xvckNvZGVGb3JXaXRoVHdvQ29sb3IoZmlsZWRhdGEsIGNvbHVtbikge1xuICAgICAgICBmaWxlZGF0YS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbVtjb2x1bW5dID0gcGFyc2VGbG9hdChpdGVtW2NvbHVtbl0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBbbWluQ29sb3JTdHIsIG1heENvbG9yU3RyXSA9IHRoaXMuY29sb3JBcnJheSB8fCBbXCJyZ2JhKDQ1LCAxMTAsIDE4LDEpXCIsIFwicmdiYSgyNTUsIDIwNCwgMCwxKVwiXTtcbiAgICAgICAgY29uc3QgbWluQ29sb3IgPSB0aGlzLnBhcnNlUkdCQShtaW5Db2xvclN0cik7XG4gICAgICAgIGNvbnN0IG1heENvbG9yID0gdGhpcy5wYXJzZVJHQkEobWF4Q29sb3JTdHIpO1xuXG4gICAgICAgIGZpbGVkYXRhLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbVtjb2x1bW5dID09IDApIHtcbiAgICAgICAgICAgICAgICBpdGVtLmNvbG9yID0gYHJnYigke21pbkNvbG9yLmpvaW4oJywnKX0pYDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlbS5jb2xvciA9IGByZ2IoJHttYXhDb2xvci5qb2luKCcsJyl9KWA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZpbGVkYXRhO1xuICAgIH1cbiAgICBnZXRGb3JtYXRlRGF0YUJ5Q29sb3JDb2RlRm9yV2l0aFNpbmdsZUNvbG9yKGZpbGVkYXRhLCBjb2x1bW4pIHtcbiAgICAgICAgZmlsZWRhdGEuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW1bY29sdW1uXSA9IHBhcnNlRmxvYXQoaXRlbVtjb2x1bW5dKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgW3NpbmdsZUNvbG9yXSA9IHRoaXMuY29sb3JBcnJheSB8fCBbXCJyZ2JhKDI1NSwgMjA0LCAwLDEpXCJdO1xuICAgICAgICBjb25zdCBtaW5Db2xvciA9IHRoaXMucGFyc2VSR0JBKHNpbmdsZUNvbG9yKTtcblxuICAgICAgICBmaWxlZGF0YS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5jb2xvciA9IGByZ2IoJHttaW5Db2xvci5qb2luKCcsJyl9KWA7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmaWxlZGF0YTtcbiAgICB9XG5cbiAgICBwYXJzZVJHQkEoY29sb3JTdHI6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gY29sb3JTdHIubWF0Y2goL1tcXGQuXSsvZyk/Lm1hcChOdW1iZXIpIHx8IFtdO1xuICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMykgdmFsdWVzLnB1c2goMSk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB2YWx1ZXNbMF0gPz8gMCxcbiAgICAgICAgICAgIHZhbHVlc1sxXSA/PyAwLFxuICAgICAgICAgICAgdmFsdWVzWzJdID8/IDAsXG4gICAgICAgICAgICB2YWx1ZXNbM10gPz8gMVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZUNvbG9yKGF2Z1NpemUsIG1pbkF2Z1NpemUsIG1heEF2Z1NpemUsIG1pbkNvbG9yLCBtYXhDb2xvcikge1xuICAgICAgICBpZiAobWluQXZnU2l6ZSAhPSBtYXhBdmdTaXplKSB7XG4gICAgICAgICAgICBsZXQgZ3JhZGllbnQgPSAoYXZnU2l6ZSAtIG1pbkF2Z1NpemUpIC8gKG1heEF2Z1NpemUgLSBtaW5BdmdTaXplKTtcbiAgICAgICAgICAgIGxldCBjb2xvciA9IG1pbkNvbG9yLm1hcCgoY2hhbm5lbCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChjaGFubmVsICsgZ3JhZGllbnQgKiAobWF4Q29sb3JbaW5kZXhdIC0gY2hhbm5lbCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gYHJnYigke2NvbG9yLmpvaW4oJywnKX0pYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgcmdiKCR7bWluQ29sb3Iuam9pbignLCcpfSlgXG4gICAgICAgIH1cblxuICAgIH1cblxuXG5cbiAgICBzZXRBY3RpdmVUYWIodGFiOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVUYWIgPSB0YWI7XG4gICAgfVxuXG5cbiAgICBnZXRTZWxlY3RlZEV2ZW50VHlwZShlKSB7XG4gICAgICAgIGlmIChlLmV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbmFsRHJpbERvd25EYXRhU291cmNlID0gW107XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5ldmVudFR5cGUgPT0gJ2RyaWxsZG93bicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYXRtYXBDaGFydENvbmZpZ1sndmlld1Byb3BlcnRpZXMnXVsnYXNzb2NpYXRlZFZpZXdzJ10gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG5cbiAgICByZXNldFZpZXdQcm9wcnN0aXNlKCkge1xuICAgICAgICB0aGlzLnZpZXdQcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgZW5hYmxlQ2xpY2tFdmVudDogZmFsc2UsXG4gICAgICAgICAgICBlbmFibGVSaWdodENsaWNrRXZlbnQ6IHRydWUsXG4gICAgICAgICAgICBjbGlja0V2ZW50T3B0aW9uczoge1xuICAgICAgICAgICAgICAgIGFzc29jaWF0ZWRWaWV3czogW10sXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBcIlwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG5cblxuICAgIGRlbGV0ZUFzc29jaWF0ZWRQYXJhbXMoaW5kZXgpIHtcbiAgICAgICAgdGhpcy5vcHRpb25hbERyaWxEb3duRGF0YVNvdXJjZS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuXG4gICAgYWRkQXNzb2NpYXRlZFBhcmFtcygpIHtcbiAgICAgICAgdGhpcy5vcHRpb25hbERyaWxEb3duRGF0YVNvdXJjZS5wdXNoKHtcbiAgICAgICAgICAgICd2aWV3SWQnOiBcIlwiLFxuICAgICAgICAgICAgJ2ZpbHRlckNvbmRpdGlvbic6IFwiXCJcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBnZXRDb2xvckJveFZpc2libGUoZSkge1xuICAgICAgICB0aGlzLmNvbG9yQXJyYXkgPSBbXTtcbiAgICB9XG5cbiAgICBzYXZlQ29sb3JzKCkge1xuICAgICAgICBpZiAodGhpcy5oZWF0bWFwQ2hhcnRDb25maWcudHlwZSA9PSAnZ3JhZGllbnQnIHx8IHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLnR5cGUgPT0gJ3R3b0NvbG9yJykge1xuICAgICAgICAgICAgdGhpcy5jb2xvckFycmF5ID0gW3RoaXMuZmlyc3RDb2xvciwgdGhpcy5zZWNvbmRDb2xvcl07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5oZWF0bWFwQ2hhcnRDb25maWcudHlwZSA9PSAnc2luZ2xlQ29sb3InKSB7XG4gICAgICAgICAgICB0aGlzLmNvbG9yQXJyYXkgPSBbdGhpcy5zaW5nbGVDb2xvcl07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZXRIZWF0bWFwRGF0YSgpXG5cblxuICAgIH1cbiAgICBnZXRTYXZlQ2hhcnRDb25maWcoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbG9yQXJyYXkgJiYgdGhpcy5jb2xvckFycmF5Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnLnR5cGUgPT0gJ2dyYWRpZW50JyB8fCB0aGlzLmhlYXRtYXBDaGFydENvbmZpZy50eXBlID09ICd0d29Db2xvcicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYXRtYXBDaGFydENvbmZpZy5jb2xvciA9IHRoaXMuY29sb3JBcnJheTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5oZWF0bWFwQ2hhcnRDb25maWcudHlwZSA9PSAnc2luZ2xlQ29sb3InKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWF0bWFwQ2hhcnRDb25maWcuY29sb3IgPSB0aGlzLmNvbG9yQXJyYXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmICh0aGlzLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZSA9PSAnb3B0aW9uYWxEcmlsbERvd24nKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdQcm9wZXJ0aWVzWydjbGlja0V2ZW50T3B0aW9ucyddWydhc3NvY2lhdGVkVmlld3MnXSA9IHRoaXMub3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oZWF0bWFwX2NvbnRlbnRfY29uZmlnLmtwaUNvbmZpZ1sndmlld1Byb3BlcnRpZXMnXSA9IHRoaXMudmlld1Byb3BlcnRpZXM7XG4gICAgICAgIHRoaXMuaGVhdG1hcF9jb250ZW50X2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXSA9IHRoaXMuaGVhdG1hcENoYXJ0Q29uZmlnO1xuICAgICAgICB0aGlzLmdldEhlYXRNYXBDb25maWdPdXRQdXQuZW1pdCh0aGlzLmhlYXRtYXBfY29udGVudF9jb25maWcpO1xuICAgIH1cbn0iLCI8ZGl2IGNsYXNzPVwibS0yXCI+XG4gICAgPGRpdiBjbGFzcz1cInctZnVsbCBtLTIgYm9yZGVyLXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0pzb25QcmV2aWV3XCI+XG4gICAgICAgICAgICA8cHJlPjxjb2RlPnt7anNhb25EYXRhc291cmNlIHwganNvbn19PC9jb2RlPjwvcHJlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzSnNvblByZXZpZXdcIj5cbiAgICAgICAgICAgIDxhcHAtZ2FtbWEtaGVhdG1hcCBbY2hhcnREYXRhU291cmNlXT1cImhlYXRtYXBfY29udGVudF9jb25maWdcIiA+PC9hcHAtZ2FtbWEtaGVhdG1hcD4gIFxuXG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJoZWF0bWFwQ2hhcnRDb25maWcuY2hhcnRGb3JtYXQgPT0gJ3NpbXBsZSdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtNSBoLVs2MHZoXSBvdmVyZmxvdy14LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubGluZS1ibG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1ub3dyYXAganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1zaHJpbmstMCB3LTY0IG1heC13LVsyMCVdIGgtMTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGhlYXRDaGFydERhdGFTb3VyY2UuYXJndW1lbnRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleC1zaHJpbmstMCBtaW4tdy0yMiBtYXgtdy1bMjAlXSBoLTggdGV4dC1zbSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW19fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGhlYXRDaGFydERhdGFTb3VyY2UuZGF0YVNldFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC04IGZsZXggdGV4dC1zbSBpdGVtcy1jZW50ZXIgbWluLXctNjQganVzdGlmeS1lbmQgcHgtMiBpbmxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5kYXRhc291cmNlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubGluZS1ibG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LW5vd3JhcCBqdXN0aWZ5LXN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBib3ggb2YgaXRlbS5kYXRhc2V0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtc2hyaW5rLTAgbWluLXctMjIgbWF4LXctWzIwJV0gaC04IGJvcmRlci0yIHRleHQtc20gY3Vyc29yLXBvaW50ZXIgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1ncmF5LTgwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2JhY2tncm91bmQtY29sb3InOiBib3guY29sb3IgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIidSZWNvcmQgRGF0ZTogJyArIGJveFtoZWF0bWFwQ2hhcnRDb25maWcudG9wQXJndW1lbnRdICsgJywgVmFsdWU6ICcgKyBib3hbaGVhdG1hcENoYXJ0Q29uZmlnLmNvbHVtbnNbMF0uZGF0YUZpZWxkXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBib3hbaGVhdG1hcENoYXJ0Q29uZmlnLmNvbHVtbnNbMF0uZGF0YUZpZWxkXX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoZWF0bWFwQ2hhcnRDb25maWcuY2hhcnRGb3JtYXQgPT0gJ3RvcHgnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTUgaC1bNjB2aF0gb3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBoZWFkZXIgb2YgaGVhdENoYXJ0RGF0YVNvdXJjZS5hcmd1bWVudFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi13LTMyIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1jZW50ZXIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBoZWFkZXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgaGVhdENoYXJ0RGF0YVNvdXJjZS5kYXRhU2V0XCIgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjZWxsIG9mIHJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjZWxsLmJveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC04IGJvcmRlci0yIHRleHQtc20gY3Vyc29yLXBvaW50ZXIgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1ncmF5LTgwMCBtaW4tdy0zMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2JhY2tncm91bmQtY29sb3InOiBjZWxsLmJveC5jb2xvciB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiJ1JlY29yZCBEYXRlOiAnICsgY2VsbC5oZWF0bWFwQ2hhcnRDb25maWcudG9wQXJndW1lbnQgKyAnLCBWYWx1ZTogJyArIGNlbGwuYm94LmhlYXRtYXBDaGFydENvbmZpZy5jb2x1bW5zWzBdLmRhdGFGaWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjZWxsLmJveC5oZWF0bWFwQ2hhcnRDb25maWcubGVmdEFyZ3VtZW50IH19ICh7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25TZXJ2aWNlLmFiYnJldmlhdGVOdW1iZXIoY2VsbC5ib3guaGVhdG1hcENoYXJ0Q29uZmlnLmNvbHVtbnNbMF0uZGF0YUZpZWxkKSB9fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNlbGwuYm94XCIgY2xhc3M9XCJoLTggbWluLXctMzJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cblxuXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgbXgtMiBib3JkZXItclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItNCBib3JkZXItYiBib3JkZXItZ3JheS0yMDAgZGFyazpib3JkZXItZ3JheS03MDBcIj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cImZsZXggZmxleC13cmFwIC1tYi1weCB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtY2VudGVyXCIgcm9sZT1cInRhYmxpc3RcIj5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJtZS0yXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaW5saW5lLWJsb2NrIHAtNCBib3JkZXItYi0yIHJvdW5kZWQtdC1sZ1wiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1wdXJwbGUtNjAwIGJvcmRlci1wdXJwbGUtNjAwIGRhcms6dGV4dC1wdXJwbGUtNTAwIGRhcms6Ym9yZGVyLXB1cnBsZS01MDAnOiBhY3RpdmVUYWIgPT09ICdiYXNpYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheS01MDAgZGFyazp0ZXh0LWdyYXktNDAwIGJvcmRlci10cmFuc3BhcmVudCc6IGFjdGl2ZVRhYiAhPT0gJ2Jhc2ljJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIChjbGljayk9XCJzZXRBY3RpdmVUYWIoJ2Jhc2ljJylcIiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cInRhYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJtZS0yXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaW5saW5lLWJsb2NrIHAtNCBib3JkZXItYi0yIHJvdW5kZWQtdC1sZ1wiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1wdXJwbGUtNjAwIGJvcmRlci1wdXJwbGUtNjAwIGRhcms6dGV4dC1wdXJwbGUtNTAwIGRhcms6Ym9yZGVyLXB1cnBsZS01MDAnOiBhY3RpdmVUYWIgPT09ICdjb2x1bW5zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5LTUwMCBkYXJrOnRleHQtZ3JheS00MDAgYm9yZGVyLXRyYW5zcGFyZW50JzogYWN0aXZlVGFiICE9PSAnY29sdW1ucydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAoY2xpY2spPVwic2V0QWN0aXZlVGFiKCdjb2x1bW5zJylcIiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cInRhYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm1lLTJcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpbmxpbmUtYmxvY2sgcC00IGJvcmRlci1iLTIgcm91bmRlZC10LWxnXCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXB1cnBsZS02MDAgYm9yZGVyLXB1cnBsZS02MDAgZGFyazp0ZXh0LXB1cnBsZS01MDAgZGFyazpib3JkZXItcHVycGxlLTUwMCc6IGFjdGl2ZVRhYiA9PT0gJ3Byb3BlcnRpZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWdyYXktNTAwIGRhcms6dGV4dC1ncmF5LTQwMCBib3JkZXItdHJhbnNwYXJlbnQnOiBhY3RpdmVUYWIgIT09ICdwcm9wZXJ0aWVzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIChjbGljayk9XCJzZXRBY3RpdmVUYWIoJ3Byb3BlcnRpZXMnKVwiIHR5cGU9XCJidXR0b25cIiByb2xlPVwidGFiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbGk+XG5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJkZWZhdWx0LXN0eWxlZC10YWItY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ2Jhc2ljJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHB5LTEgZm9udC1leHRyYWJvbGQgYm9yZGVyLWIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSBweC0yXCI+IEZpbHRlciBUaXRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHQtMiBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXktMiBmbGV4IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBUaXRsZSBGaWx0ZXJzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJoZWF0bWFwQ2hhcnRDb25maWcuY29tbW9uQ29uZmlnLnRpdGxlXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IEZpbHRlciBEYXRhIEZpZWxkPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJoZWF0bWFwQ2hhcnRDb25maWcuY29tbW9uQ29uZmlnLmRhdGFGaWVsZFwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gS2V5IFRvIFBhc3MgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGFnLWJveCBbaXRlbXNdPVwiY29uZmlnQ29sdW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImhlYXRtYXBfY29udGVudF9jb25maWcua3BpQ29uZmlnLmtleVRvUGFzc1wiPjwvZHgtdGFnLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC0yIGJvcmRlci14IGJvcmRlci1iIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IENoYXJ0IFR5cGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggWyhuZ01vZGVsKV09XCJoZWF0bWFwQ2hhcnRDb25maWcuY2hhcnRGb3JtYXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cIlsnc2ltcGxlJywndG9weCddXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gVG9wIEFyZ3VtZW50PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwiY29uZmlnQ29sdW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaGVhdG1hcENoYXJ0Q29uZmlnLnRvcEFyZ3VtZW50XCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gTGVmdCBBcmd1bWVudDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImhlYXRtYXBDaGFydENvbmZpZy5sZWZ0QXJndW1lbnRcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBDb2xvciBVc2FnZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cIlsnZ3JhZGllbnQnLCd0d29Db2xvcicsJ3NpbmdsZUNvbG9yJyxdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaGVhdG1hcENoYXJ0Q29uZmlnLnR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImdldENvbG9yQm94VmlzaWJsZSgkZXZlbnQpXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImhlYXRtYXBDaGFydENvbmZpZy50eXBlID09ICdncmFkaWVudCcgfHwgaGVhdG1hcENoYXJ0Q29uZmlnLnR5cGUgPT0gJ3R3b0NvbG9yJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBDb2xvcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNvbG9yLWJveCBbKG5nTW9kZWwpXT1cImZpcnN0Q29sb3JcIiBbZWRpdEFscGhhQ2hhbm5lbF09XCJ0cnVlXCI+PC9keC1jb2xvci1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBDb2xvcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNvbG9yLWJveCBbKG5nTW9kZWwpXT1cInNlY29uZENvbG9yXCIgW2VkaXRBbHBoYUNoYW5uZWxdPVwidHJ1ZVwiPjwvZHgtY29sb3ItYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoZWF0bWFwQ2hhcnRDb25maWcudHlwZSA9PSAnc2luZ2xlQ29sb3InXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IENvbG9yPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY29sb3ItYm94IFsobmdNb2RlbCldPVwic2luZ2xlQ29sb3JcIiBbZWRpdEFscGhhQ2hhbm5lbF09XCJ0cnVlXCI+PC9keC1jb2xvci1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LWZ1bGxcIiAqbmdJZj1cImhlYXRtYXBDaGFydENvbmZpZy50eXBlICE9PSAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X21kfX0gbXQtNlwiIChjbGljayk9XCJzYXZlQ29sb3JzKClcIj5TYXZlIENvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ2NvbHVtbnMnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtZnVsbCBvdmVyZmxvdy14LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIG1pbi13LTBcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgYm9yZGVyLWIgZmxleCBmbGV4LXJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGhlYXRtYXBDaGFydENvbmZpZy5jb2x1bW5zOyBsZXQgaSA9IGluZGV4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIG10LTYgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IFt2YWx1ZV09XCJpdGVtLnZpc2libGVcIiBbKG5nTW9kZWwpXT1cIml0ZW0udmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIlZpc2libGl0eVwiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBWYWx1ZSBGaWVsZDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJjb25maWdDb2x1bWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5kYXRhRmllbGRcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBDYXB0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmNhcHRpb25cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5EaXNwbGF5IEZvcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsnbWFwJywgJ3Rvb2x0aXAnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLmRpc3BsYXlGb3JcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBVSSBGdW5jdGlvbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cImVucmljaE5hbWVMaXN0XCIgWyhuZ01vZGVsKV09XCJpdGVtLmVucmljaE5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgbXQtOCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSAwXCIgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yQ29sdW1ucyhpLCAndXAnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IGhlYXRtYXBDaGFydENvbmZpZy5jb2x1bW5zLmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvckNvbHVtbnMoaSwgJ2Rvd24nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctZG93blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVDb2x1bW5zKGkpXCI+PGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfc219fSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRDb2x1bW5zKClcIj5BZGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5zPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlVGFiID09PSAncHJvcGVydGllcydcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC1mdWxsIG92ZXJmbG93LXgtYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICA8YXBwLWxvYWRlciAqbmdJZj1cImlzTG9hZGVyXCI+PC9hcHAtbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgcHktM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggW3ZhbHVlXT1cInZpZXdQcm9wZXJ0aWVzLmVuYWJsZUNsaWNrRXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2aWV3UHJvcGVydGllcy5lbmFibGVDbGlja0V2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9XCJFbmFibGUgQ2xpY2sgRXZlbnRcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IFt2YWx1ZV09XCJ2aWV3UHJvcGVydGllcy5lbmFibGVSaWdodENsaWNrRXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2aWV3UHJvcGVydGllcy5lbmFibGVSaWdodENsaWNrRXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIkVuYWJsZSBSaWdodCBDbGlja1wiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHAtMlwiICpuZ0lmPVwidmlld1Byb3BlcnRpZXMuZW5hYmxlQ2xpY2tFdmVudFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIG1pbi13LTAgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBweS0xIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBFdmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHAtMyBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IEV2ZW50IFR5cGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiWydkcmlsbGRvd24nLCdzYW1lVmlld0RyaWxsZG93bicsJ29wdGlvbmFsRHJpbGxEb3duJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImdldFNlbGVjdGVkRXZlbnRUeXBlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5ldmVudFR5cGVcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5ldmVudFR5cGUgPT0gJ2RyaWxsZG93bidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IEFzc29jaWF0ZWQgVmlld3M8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10YWctYm94IFtpdGVtc109XCJhbGxDb25maWd1cmVkVmlld3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuYXNzb2NpYXRlZFZpZXdzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUV4cHI9XCJ2aWV3SWRcIiBkaXNwbGF5RXhwcj1cInZpZXdOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1NlbGVjdGlvbkNvbnRyb2xzXT1cInRydWVcIiBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCI+PC9keC10YWctYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlID09ICdzYW1lVmlld0RyaWxsZG93bidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IEFzc29jaWF0ZWQgVmlld3M8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10YWctYm94IFtpdGVtc109XCJhbGxDb25maWd1cmVkVmlld3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuYXNzb2NpYXRlZFZpZXdzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUV4cHI9XCJ2aWV3SWRcIiBkaXNwbGF5RXhwcj1cInZpZXdOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1NlbGVjdGlvbkNvbnRyb2xzXT1cInRydWVcIiBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCI+PC9keC10YWctYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlID09ICdvcHRpb25hbERyaWxsRG93bidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygb3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2U7bGV0IGkgPSBpbmRleDtcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBBc3NvY2lhdGVkIFZpZXdzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGFnLWJveCBbaXRlbXNdPVwiYWxsQ29uZmlndXJlZFZpZXdzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0udmlld0lkXCIgdmFsdWVFeHByPVwidmlld0lkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RXhwcj1cInZpZXdOYW1lXCIgW3Nob3dTZWxlY3Rpb25Db250cm9sc109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4RGlzcGxheWVkVGFnc109XCIyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCI+PC9keC10YWctYm94PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBBc3NvY2lhdGVkIFBhcmFtczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLmZpbHRlckNvbmRpdGlvblwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfc219fSBjdXJzb3ItcG9pbnRlciBtdC04XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlQXNzb2NpYXRlZFBhcmFtcyhpKVwiPjxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1lbmQgbXQtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfc219fSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRBc3NvY2lhdGVkUGFyYW1zKClcIj5BZGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0Vmlld1Byb3Byc3Rpc2UoKVwiPlJlc2V0IEFsbCBFdmVudDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG5cblxuICAgIDwvZGl2PlxuPC9kaXY+XG5cblxuPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgYm9yZGVyLXQgcGwtM1wiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktc3RhcnQgbXgtMVwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl93YXJuaW5nX21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtMlwiIChjbGljayk9XCJpc0pzb25QcmV2aWV3ID0gdHJ1ZVwiPlxuICAgICAgICAgICAgUHJldmlldzwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtMlwiIChjbGljayk9XCJpc0pzb25QcmV2aWV3ID0gZmFsc2VcIj5EYXRhXG4gICAgICAgICAgICBQcmV2aWV3PC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgbXgtMSBmbGV4LWdyb3dcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19IGN1cnNvci1wb2ludGVyIG10LTJcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImdldFNhdmVDaGFydENvbmZpZygpXCI+U3VibWl0PC9idXR0b24+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=