verben-ticketing-ui 0.8.8 → 0.8.9

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.
@@ -32,6 +32,8 @@ var TicketPropertyName;
32
32
  TicketPropertyName["CurrentHandler"] = "Current Handler";
33
33
  TicketPropertyName["Priority"] = "Priority";
34
34
  TicketPropertyName["Status"] = "Status";
35
+ TicketPropertyName["CreatedBy"] = "Created By";
36
+ TicketPropertyName["UpdatedBy"] = "Updated By";
35
37
  })(TicketPropertyName || (TicketPropertyName = {}));
36
38
  var TicketPropertyMap;
37
39
  (function (TicketPropertyMap) {
@@ -42,6 +44,8 @@ var TicketPropertyMap;
42
44
  TicketPropertyMap["CurrentHandler"] = "CurrentHandler";
43
45
  TicketPropertyMap["Priority"] = "Priority";
44
46
  TicketPropertyMap["Status"] = "Status";
47
+ TicketPropertyMap["CreatedBy"] = "CreatedBy";
48
+ TicketPropertyMap["UpdatedBy"] = "UpdatedBy";
45
49
  })(TicketPropertyMap || (TicketPropertyMap = {}));
46
50
  export class TicketingComponent {
47
51
  utilService;
@@ -129,6 +133,16 @@ export class TicketingComponent {
129
133
  type: DataFilterType.String,
130
134
  checked: false,
131
135
  },
136
+ {
137
+ name: TicketPropertyName.CreatedBy,
138
+ type: DataFilterType.String,
139
+ checked: false,
140
+ },
141
+ {
142
+ name: TicketPropertyName.UpdatedBy,
143
+ type: DataFilterType.String,
144
+ checked: false,
145
+ },
132
146
  ];
133
147
  sortOptions = [
134
148
  {
@@ -166,6 +180,16 @@ export class TicketingComponent {
166
180
  type: DataFilterType.String,
167
181
  checked: false,
168
182
  },
183
+ {
184
+ name: TicketPropertyName.CreatedBy,
185
+ type: DataFilterType.String,
186
+ checked: false,
187
+ },
188
+ {
189
+ name: TicketPropertyName.UpdatedBy,
190
+ type: DataFilterType.String,
191
+ checked: false,
192
+ },
169
193
  ];
170
194
  currentSearchTerm = '';
171
195
  constructor(utilService, server, cdr, service, route, importService, envSvc) {
@@ -482,6 +506,12 @@ export class TicketingComponent {
482
506
  Sign: SearchPropertySign.LIKE,
483
507
  });
484
508
  });
509
+ searchPayload.push({
510
+ PropertyName: 'Code',
511
+ EntityValue: this.currentSearchTerm.trim(),
512
+ Operator: SearchOperator.Or,
513
+ Sign: SearchPropertySign.LIKE,
514
+ });
485
515
  }
486
516
  if (this.activeTenant) {
487
517
  payload.push({
@@ -897,11 +927,11 @@ export class TicketingComponent {
897
927
  }
898
928
  }
899
929
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TicketingComponent, deps: [{ token: i1.UtilService }, { token: i1.HttpWebRequestService }, { token: i0.ChangeDetectorRef }, { token: i2.TicketingService }, { token: i3.ActivatedRoute }, { token: i1.ImportService }, { token: i1.EnvironmentService }], target: i0.ɵɵFactoryTarget.Component });
900
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.14", type: TicketingComponent, selector: "app-ticketing", inputs: { permissionConfig: "permissionConfig", activeApp: "activeApp", activeTenant: "activeTenant", activeUser: "activeUser", overrideToken: "overrideToken", allowTicketClosing: "allowTicketClosing", detailPath: "detailPath", defaultCompany: "defaultCompany", baseUrl: "baseUrl" }, viewQueries: [{ propertyName: "columnTemplates", predicate: ColumnDirective, descendants: true, isSignal: true }, { propertyName: "dataView", first: true, predicate: ["vdv"], descendants: true }, { propertyName: "tableView", first: true, predicate: ["dt"], descendants: true }, { propertyName: "popUps", predicate: ["popup"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"h-full flex flex-col gap-4\">\n <div class=\"flex flex-col gap-4\">\n <!-- <app-tenant-selector\n (onAppSelected)=\"this.onAppSelected($event)\"\n (onTenantSelected)=\"onTenantSelected($event)\"\n (onAppsUpdated)=\"this.onAppListUpdated($event)\"\n (onTenantsUpdated)=\"this.onTenantListUpdated($event)\"\n ></app-tenant-selector> -->\n\n <div class=\"tickets-section flex flex-col gap-2\">\n <div class=\"ticket-table-container\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: !permissionConfig || permissionConfig.Actions['Export'],\n isSelect: true,\n isCreate: false,\n isToggle: false,\n isImport: !permissionConfig || permissionConfig.Actions['Import'],\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n (viewChange)=\"onViewChange($event)\"\n (onSearchChange)=\"handleSearch($event)\"\n [isTableView]=\"true\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n [dataKey]=\"'Id'\"\n class=\"form-table\"\n #dt\n [data]=\"tickets\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>\n {{ value | companyDate }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"updatedAt\">\n <ng-template #cell let-value>\n {{ value | companyDate }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"title\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.Title }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"row.Title\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"description\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.Description | ellipseWord }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input\n [(ngModel)]=\"row.Description\"\n ></verbena-input>\n </div>\n <!-- <div class=\"width-max\">\n <verbena-textarea [(ngModel)]=\"row.Description\">\n </verbena-textarea>\n </div> -->\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"currentHandler\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.CurrentHandler }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"lastHandler\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.LastHandler }}\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"priority\">\n <ng-template #cell let-row=\"row\" let-value>\n <div\n *ngIf=\"\n row.Priority && row.Priority\n | asyncLabel\n : 'TenantPriority'\n : 'Color'\n : ticketingAPI\n : overrideToken || undefined\n | async as color\n \"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center\"\n [style.backgroundColor]=\"color ? softenColor(color) : null\"\n >\n <span\n [style.backgroundColor]=\"color\"\n class=\"enum-dot\"\n ></span>\n <span>{{\n row.Priority\n | asyncLabel\n : \"TenantPriority\"\n : \"Name\"\n : ticketingAPI\n : overrideToken || undefined\n | async\n }}</span>\n </div>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"row.Priority\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"status\">\n <ng-template #cell let-row=\"row\" let-value>\n <div\n *ngIf=\"row.Status\"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center {{\n row.Status\n }}\"\n >\n <span class=\"enum-dot\"></span>\n <span>{{ row.Status }}</span>\n </div>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Select Status\"\n [options]=\"statusOptions\"\n [(ngModel)]=\"row.Status\"\n >\n </verben-drop-down>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"close\">\n <ng-template #cell let-row=\"row\" let-value>\n <verbena-button\n *ngIf=\"this.canClose(row)\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Close Ticket'\"\n [disable]=\"!this.canClose(row)\"\n (click)=\"toggleClosureDialogue(row)\"\n >\n </verbena-button>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <verben-pop-Up\n #popup\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n >\n <verben-svg\n class=\"cursor-pointer actions-icon\"\n dropdown-trigger\n icon=\"list\"\n ></verben-svg>\n <div class=\"pop-up-content flex flex-col\" dropdown-content>\n <div\n *ngIf=\"\n !permissionConfig ||\n permissionConfig.Actions['Create']\n \"\n (click)=\"editTicket(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n Edit\n </div>\n <div\n (click)=\"viewTicketDetails(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n View Details\n </div>\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template\n #cellEdit\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <div class=\"flex gap-2 items-center\">\n <verben-svg\n icon=\"tick\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"tableSaveTicket(value, toggleRowEdit)\"\n ></verben-svg>\n <verben-svg\n (click)=\"restoreCache(value); toggleRowEdit()\"\n icon=\"close-no-circle\"\n [width]=\"15\"\n [height]=\"15\"\n ></verben-svg>\n <!-- <verben-svg (click)=\"toggleRowEdit()\" icon=\"delete\" [width]=\"15\" [height]=\"15\"></verben-svg> -->\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (filtersApplied)=\"onFilterUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div import-content>\n <lib-data-import\n [previewColumns]=\"visibleColumnDef\"\n title=\"ticket\"\n (importEventData)=\"onComplete($event)\"\n [columnTemplates]=\"columnTemplates()\"\n >\n </lib-data-import>\n </div>\n <div export-content>\n <lib-data-xport\n [useImportKey]=\"true\"\n [columns]=\"visibleColumnDef\"\n [dataQueryFunction]=\"exportFiltersAndSorts\"\n [data]=\"tickets\"\n >\n </lib-data-xport>\n </div>\n <div children>\n <verbena-button\n width=\"100%\"\n [useIcon]=\"true\"\n [icon]=\"'add'\"\n class=\"verben-primary-button\"\n [text]=\"'Add New Ticket'\"\n (click)=\"addNewTicket()\"\n >\n </verbena-button>\n </div>\n </verben-data-view>\n </div>\n <div\n *ngIf=\"tickets.length > 0\"\n class=\"flex justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\">{{ tickets.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n </div>\n\n <div\n *ngIf=\"\n this.apps.length == 0 ||\n (this.activeApp && this.tenants.length == 0) ||\n (this.activeTenant && this.tickets.length == 0 && !isFilteredState())\n \"\n class=\"create-container flex-1 rounded-[20px] flex items-center justify-center\"\n ></div>\n</div>\n\n<!-- <app-add-app\n [isVisible]=\"showAppForm\"\n [selectedApp]=\"selectedApp\"\n (onClose)=\"onAppModalClose()\"\n (onSave)=\"onAppSave($event)\"\n></app-add-app>\n\n<app-add-tenant\n [isVisible]=\"showTenantForm\"\n [activeApp]=\"activeApp\"\n [selectedTenant]=\"selectedTenant\"\n (onClose)=\"onTenantModalClose()\"\n (onSave)=\"onTenantSave($event)\"\n></app-add-tenant> -->\n\n<app-add-ticket\n [isVisible]=\"showTicketForm\"\n [activeApp]=\"activeApp\"\n [activeUser]=\"activeUser\"\n [isDisabled]=\"isDisabled()\"\n [activeTenant]=\"activeTenant\"\n [selectedTicket]=\"selectedTicket\"\n (onClose)=\"onTicketModalClose()\"\n (onSave)=\"onTicketSave($event)\"\n [overrideToken]=\"overrideToken\"\n></app-add-ticket>\n\n<verben-dialogue\n [showCloseIcon]=\"false\"\n [dismissOutsideClick]=\"false\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'ticket-dialog'\"\n [disableFooter]=\"true\"\n (openModal)=\"onModalOpen($event)\"\n [isVisible]=\"showClosureDialogue\"\n [bodyTemplate]=\"bodyTemplate\"\n (closeModal)=\"onModalClose($event)\"\n>\n <ng-template #bodyTemplate>\n <div class=\"dialog-body p-[25px] flex flex-col gap-4\">\n <div class=\"dialog-header flex flex-col gap-1\">\n <div class=\"dialog-title font-bold text-xl\">Enter Reason</div>\n <div class=\"dialog-subtitle\">\n Please provide a reason for closing this ticket\n </div>\n </div>\n <!-- <verbena-textarea name=\"Test\" [(ngModel)]=\"test\" />\n <button (click)=\"logTest()\">Log</button> -->\n <div class=\"add-app-form main-form-container flex flex-col gap-2\">\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Reason</div>\n <verbena-input\n name=\"Reason\"\n placeHolder=\"Enter reason...\"\n [(ngModel)]=\"closureReason\"\n />\n </div>\n </div>\n <div class=\"dialog-button-container flex justify-end gap-2\">\n <verbena-button\n width=\"100%\"\n class=\"verben-secondary-button\"\n [text]=\"'Close'\"\n (click)=\"onModalClose($event)\"\n >\n </verbena-button>\n <verbena-button\n [disable]=\"this.closureReason.trim().length == 0\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Confirm'\"\n (click)=\"closeTicket()\"\n >\n </verbena-button>\n </div>\n </div>\n </ng-template>\n</verben-dialogue>\n", styles: [".app-card-container{overflow-x:auto;padding:5px}.app-card{border:1.5px solid #0000001a;flex:1 1 250px;aspect-ratio:9/5;max-width:250px;box-shadow:0 0 12px transparent}.app-card.active{border:1.5px solid #6f2290;box-shadow:0 0 12px #b48ef766}.tenants-container{overflow-x:auto}.tenant{border:1.5px solid #0000001a;min-width:max-content}.tenant.active{border:1.5px solid #6f2290}.create-container{border:1.5px solid #0000001a}.enum-val{padding:10px 15px;width:max-content}.enum-val .enum-dot{width:10px;height:10px;border-radius:9999px;background-color:gray}.enum-val.Disabled{background-color:#c7c7c7}.enum-val.Pending{background-color:#fcedc5}.enum-val.InProgress{background-color:#4440df33}.enum-val.Completed,.enum-val.Active{background-color:#71f3b870}.enum-val.Canceled,.enum-val.InActive{background-color:#fcc3c3}.enum-val.Pending .enum-dot{background-color:#be8800}.enum-val.InProgress .enum-dot{background-color:#4440df}.enum-val.Completed .enum-dot,.enum-val.Active .enum-dot{background-color:#0d875a}.enum-val.Canceled .enum-dot,.enum-val.InActive .enum-dot{background-color:#be0000}.pop-up-content{border-radius:4px;background-color:#fff;border:1px solid grey}.pop-up-value{padding:10px 20px}::ng-deep .ticket-dialog{max-width:60vw}.view-links{font-size:14px!important;color:#00f;font-weight:600;cursor:pointer}.view-links:hover{text-decoration:underline;text-underline-offset:3px}@media only screen and (max-width: 768px){::ng-deep .ticket-dialog{min-width:90vw!important;max-width:90vw!important}::ng-deep .toolbar{flex-direction:column;align-items:normal!important}::ng-deep .toolbar>div:nth-child(2){overflow-x:auto;align-items:normal!important}::ng-deep .toolbar>div:nth-child(2)>span{min-width:max-content}}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "dataKey", "formGroupConfig", "groupBy", "useVirtualScroll", "virtualScrollItemSize", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowRevert", "rowDelete", "selectionChange"] }, { kind: "directive", type: i6.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i6.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i6.VerbenPopUpComponent, selector: "verben-pop-Up", inputs: ["dropdownOpen", "dropdownWidth", "color", "customStyles", "popUpClass", "border", "borderRadius", "enableMouseLeave", "cdkPosition"], outputs: ["dropdownOpenChange", "close"] }, { kind: "component", type: i6.DataViewComponent, selector: "verben-data-view", inputs: ["buttonClass", "iconClass", "activeIconClass", "columnCustomClass", "filterCustomClass", "sortCustomClass", "extendCustomClass", "exportCustomClass", "selectCustomClass", "importCustomClass", "zIndex", "createCustomClass", "tableIcon", "cardIcon", "cardClass", "tableClass", "searchKey", "searchValue", "viewState", "searchTemplate", "importTemplate", "columnTemplate", "extendTemplate", "filterTemplate", "sortTemplate", "children", "exportTemplate", "createTemplate", "selectedColumnCount", "selectedSortCount", "selectedFilterTableCount", "inputWidth", "milliseconds", "showColumnChild", "showSortChild", "showFilterChild", "showImportChild", "showExportChild", "showExtendChild", "create", "showSelected", "isTableView"], outputs: ["viewChange", "stateChange", "onSearchChange"] }, { kind: "component", type: i6.VerbenaButtonComponent, selector: "verbena-button", inputs: ["text", "icon", "useIcon", "svgPosition", "iconPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "svgSize", "weight", "variant", "styleType", "svg", "svgWidth", "svgHeight", "iconColor", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.TableFilterComponent, selector: "verben-table-filter", inputs: ["filterOptions", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "maxFilterLength", "tooltip"], outputs: ["filtersApplied", "resetSortData"] }, { kind: "component", type: i6.VisibleColumnComponent, selector: "verben-visible-column", inputs: ["columns", "items", "enableDragAndDrop", "displayedColumns", "showMore", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "closeColumn"], outputs: ["columnsUpdated", "resetFilter"] }, { kind: "component", type: i6.SortTableComponent, selector: "verben-sort-table", inputs: ["enableDragAndDrop", "sortOptions", "resetText", "displayedOptions", "propertyText", "showMoreText", "sortButtonText", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "containerHeight"], outputs: ["selectedOptions", "resetSortData"] }, { kind: "component", type: i6.VerbenDialogueComponent, selector: "verben-dialogue", inputs: ["dialogueWidth", "headerTemplate", "bodyTemplate", "footerTemplate", "showCloseIcon", "dismissOutsideClick", "closeOnEscape", "isVisible", "size", "backdropColor", "customClass", "disableFooter", "margin", "padding", "borderRadius", "dialogueBgColor", "width", "closeIconClass", "boxShadow", "enableTransition", "modalData", "mode", "position", "drawerWidth"], outputs: ["openModal", "closeModal"] }, { kind: "component", type: i6.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: i6.DataImportComponent, selector: "lib-data-import", inputs: ["previewColumns", "formGroupConfig", "fields", "title", "columnTemplates", "parser", "previewData", "onImportComplete"], outputs: ["exportTemplateEvent", "importEvent", "importEventData", "rowSave"] }, { kind: "component", type: i6.DataXportComponent, selector: "lib-data-xport", inputs: ["data", "columns", "useImportKey", "dataFetchUrl", "dataQueryParameters", "dataQueryFunction"], outputs: ["exportDataEvent", "exportDataRangeEvent"] }, { kind: "component", type: i7.AddTicketComponent, selector: "app-add-ticket", inputs: ["overrideToken", "activeUser", "activeApp", "activeTenant", "selectedTicket", "isDisabled", "isVisible", "defaultCompany"], outputs: ["onOpen", "onClose", "onSave"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.AsyncLabelPipe, name: "asyncLabel" }, { kind: "pipe", type: i8.EllipseWordPipe, name: "ellipseWord" }, { kind: "pipe", type: i8.CompanyDatePipe, name: "companyDate" }] });
930
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.14", type: TicketingComponent, selector: "app-ticketing", inputs: { permissionConfig: "permissionConfig", activeApp: "activeApp", activeTenant: "activeTenant", activeUser: "activeUser", overrideToken: "overrideToken", allowTicketClosing: "allowTicketClosing", detailPath: "detailPath", defaultCompany: "defaultCompany", baseUrl: "baseUrl" }, viewQueries: [{ propertyName: "columnTemplates", predicate: ColumnDirective, descendants: true, isSignal: true }, { propertyName: "dataView", first: true, predicate: ["vdv"], descendants: true }, { propertyName: "tableView", first: true, predicate: ["dt"], descendants: true }, { propertyName: "popUps", predicate: ["popup"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"h-full flex flex-col gap-4\">\n <div class=\"flex flex-col gap-4\">\n <!-- <app-tenant-selector\n (onAppSelected)=\"this.onAppSelected($event)\"\n (onTenantSelected)=\"onTenantSelected($event)\"\n (onAppsUpdated)=\"this.onAppListUpdated($event)\"\n (onTenantsUpdated)=\"this.onTenantListUpdated($event)\"\n ></app-tenant-selector> -->\n\n <div class=\"tickets-section flex flex-col gap-2\">\n <div class=\"ticket-table-container\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: !permissionConfig || permissionConfig.Actions['Export'],\n isSelect: true,\n isCreate: false,\n isToggle: false,\n isImport: !permissionConfig || permissionConfig.Actions['Import'],\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n (viewChange)=\"onViewChange($event)\"\n (onSearchChange)=\"handleSearch($event)\"\n [isTableView]=\"true\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n [dataKey]=\"'Id'\"\n class=\"form-table\"\n #dt\n [data]=\"tickets\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>\n {{ value | companyDate }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"updatedAt\">\n <ng-template #cell let-value>\n {{ value | companyDate }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"title\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.Title }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"row.Title\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"description\">\n <ng-template #cell let-row=\"row\" let-value>\n <span\n [title]=\"\n row.Description?.length > 40 ? row.Description : null\n \"\n >\n {{ row.Description | ellipseWord }}\n </span>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input\n [(ngModel)]=\"row.Description\"\n ></verbena-input>\n </div>\n <!-- <div class=\"width-max\">\n <verbena-textarea [(ngModel)]=\"row.Description\">\n </verbena-textarea>\n </div> -->\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"currentHandler\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.CurrentHandler }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"lastHandler\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.LastHandler }}\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"priority\">\n <ng-template #cell let-row=\"row\" let-value>\n <div\n *ngIf=\"\n row.Priority && row.Priority\n | asyncLabel\n : 'TenantPriority'\n : 'Color'\n : ticketingAPI\n : overrideToken || undefined\n | async as color\n \"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center\"\n [style.backgroundColor]=\"color ? softenColor(color) : null\"\n >\n <span\n [style.backgroundColor]=\"color\"\n class=\"enum-dot\"\n ></span>\n <span>{{\n row.Priority\n | asyncLabel\n : \"TenantPriority\"\n : \"Name\"\n : ticketingAPI\n : overrideToken || undefined\n | async\n }}</span>\n </div>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"row.Priority\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"status\">\n <ng-template #cell let-row=\"row\" let-value>\n <div\n *ngIf=\"row.Status\"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center {{\n row.Status\n }}\"\n >\n <span class=\"enum-dot\"></span>\n <span>{{ row.Status }}</span>\n </div>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Select Status\"\n [options]=\"statusOptions\"\n [(ngModel)]=\"row.Status\"\n >\n </verben-drop-down>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"close\">\n <ng-template #cell let-row=\"row\" let-value>\n <verbena-button\n *ngIf=\"this.canClose(row)\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Close Ticket'\"\n [disable]=\"!this.canClose(row)\"\n (click)=\"toggleClosureDialogue(row)\"\n >\n </verbena-button>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <verben-pop-Up\n #popup\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n >\n <verben-svg\n class=\"cursor-pointer actions-icon\"\n dropdown-trigger\n icon=\"list\"\n ></verben-svg>\n <div class=\"pop-up-content flex flex-col\" dropdown-content>\n <div\n *ngIf=\"\n !permissionConfig ||\n permissionConfig.Actions['Create']\n \"\n (click)=\"editTicket(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n Edit\n </div>\n <div\n (click)=\"viewTicketDetails(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n View Details\n </div>\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template\n #cellEdit\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <div class=\"flex gap-2 items-center\">\n <verben-svg\n icon=\"tick\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"tableSaveTicket(value, toggleRowEdit)\"\n ></verben-svg>\n <verben-svg\n (click)=\"restoreCache(value); toggleRowEdit()\"\n icon=\"close-no-circle\"\n [width]=\"15\"\n [height]=\"15\"\n ></verben-svg>\n <!-- <verben-svg (click)=\"toggleRowEdit()\" icon=\"delete\" [width]=\"15\" [height]=\"15\"></verben-svg> -->\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (filtersApplied)=\"onFilterUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div import-content>\n <lib-data-import\n [previewColumns]=\"visibleColumnDef\"\n title=\"ticket\"\n (importEventData)=\"onComplete($event)\"\n [columnTemplates]=\"columnTemplates()\"\n >\n </lib-data-import>\n </div>\n <div export-content>\n <lib-data-xport\n [useImportKey]=\"true\"\n [columns]=\"visibleColumnDef\"\n [dataQueryFunction]=\"exportFiltersAndSorts\"\n [data]=\"tickets\"\n >\n </lib-data-xport>\n </div>\n <div children>\n <verbena-button\n width=\"100%\"\n [useIcon]=\"true\"\n [icon]=\"'add'\"\n class=\"verben-primary-button\"\n [text]=\"'Add New Ticket'\"\n (click)=\"addNewTicket()\"\n >\n </verbena-button>\n </div>\n </verben-data-view>\n </div>\n <div\n *ngIf=\"tickets.length > 0\"\n class=\"flex justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\">{{ tickets.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n </div>\n\n <div\n *ngIf=\"\n this.apps.length == 0 ||\n (this.activeApp && this.tenants.length == 0) ||\n (this.activeTenant && this.tickets.length == 0 && !isFilteredState())\n \"\n class=\"create-container flex-1 rounded-[20px] flex items-center justify-center\"\n ></div>\n</div>\n\n<!-- <app-add-app\n [isVisible]=\"showAppForm\"\n [selectedApp]=\"selectedApp\"\n (onClose)=\"onAppModalClose()\"\n (onSave)=\"onAppSave($event)\"\n></app-add-app>\n\n<app-add-tenant\n [isVisible]=\"showTenantForm\"\n [activeApp]=\"activeApp\"\n [selectedTenant]=\"selectedTenant\"\n (onClose)=\"onTenantModalClose()\"\n (onSave)=\"onTenantSave($event)\"\n></app-add-tenant> -->\n\n<app-add-ticket\n [isVisible]=\"showTicketForm\"\n [activeApp]=\"activeApp\"\n [activeUser]=\"activeUser\"\n [isDisabled]=\"isDisabled()\"\n [activeTenant]=\"activeTenant\"\n [selectedTicket]=\"selectedTicket\"\n (onClose)=\"onTicketModalClose()\"\n (onSave)=\"onTicketSave($event)\"\n [overrideToken]=\"overrideToken\"\n></app-add-ticket>\n\n<verben-dialogue\n [showCloseIcon]=\"false\"\n [dismissOutsideClick]=\"false\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'ticket-dialog'\"\n [disableFooter]=\"true\"\n (openModal)=\"onModalOpen($event)\"\n [isVisible]=\"showClosureDialogue\"\n [bodyTemplate]=\"bodyTemplate\"\n (closeModal)=\"onModalClose($event)\"\n>\n <ng-template #bodyTemplate>\n <div class=\"dialog-body p-[25px] flex flex-col gap-4\">\n <div class=\"dialog-header flex flex-col gap-1\">\n <div class=\"dialog-title font-bold text-xl\">Enter Reason</div>\n <div class=\"dialog-subtitle\">\n Please provide a reason for closing this ticket\n </div>\n </div>\n <!-- <verbena-textarea name=\"Test\" [(ngModel)]=\"test\" />\n <button (click)=\"logTest()\">Log</button> -->\n <div class=\"add-app-form main-form-container flex flex-col gap-2\">\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Reason</div>\n <verbena-input\n name=\"Reason\"\n placeHolder=\"Enter reason...\"\n [(ngModel)]=\"closureReason\"\n />\n </div>\n </div>\n <div class=\"dialog-button-container flex justify-end gap-2\">\n <verbena-button\n width=\"100%\"\n class=\"verben-secondary-button\"\n [text]=\"'Close'\"\n (click)=\"onModalClose($event)\"\n >\n </verbena-button>\n <verbena-button\n [disable]=\"this.closureReason.trim().length == 0\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Confirm'\"\n (click)=\"closeTicket()\"\n >\n </verbena-button>\n </div>\n </div>\n </ng-template>\n</verben-dialogue>\n", styles: [".app-card-container{overflow-x:auto;padding:5px}.app-card{border:1.5px solid #0000001a;flex:1 1 250px;aspect-ratio:9/5;max-width:250px;box-shadow:0 0 12px transparent}.app-card.active{border:1.5px solid #6f2290;box-shadow:0 0 12px #b48ef766}.tenants-container{overflow-x:auto}.tenant{border:1.5px solid #0000001a;min-width:max-content}.tenant.active{border:1.5px solid #6f2290}.create-container{border:1.5px solid #0000001a}.enum-val{padding:10px 15px;width:max-content}.enum-val .enum-dot{width:10px;height:10px;border-radius:9999px;background-color:gray}.enum-val.Disabled{background-color:#c7c7c7}.enum-val.Pending{background-color:#fcedc5}.enum-val.InProgress{background-color:#4440df33}.enum-val.Completed,.enum-val.Active{background-color:#71f3b870}.enum-val.Canceled,.enum-val.InActive{background-color:#fcc3c3}.enum-val.Pending .enum-dot{background-color:#be8800}.enum-val.InProgress .enum-dot{background-color:#4440df}.enum-val.Completed .enum-dot,.enum-val.Active .enum-dot{background-color:#0d875a}.enum-val.Canceled .enum-dot,.enum-val.InActive .enum-dot{background-color:#be0000}.pop-up-content{border-radius:4px;background-color:#fff;border:1px solid grey}.pop-up-value{padding:10px 20px}::ng-deep .ticket-dialog{max-width:60vw}.view-links{font-size:14px!important;color:#00f;font-weight:600;cursor:pointer}.view-links:hover{text-decoration:underline;text-underline-offset:3px}@media only screen and (max-width: 768px){::ng-deep .ticket-dialog{min-width:90vw!important;max-width:90vw!important}::ng-deep .toolbar{flex-direction:column;align-items:normal!important}::ng-deep .toolbar>div:nth-child(2){overflow-x:auto;align-items:normal!important}::ng-deep .toolbar>div:nth-child(2)>span{min-width:max-content}}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "dataKey", "formGroupConfig", "groupBy", "useVirtualScroll", "virtualScrollItemSize", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowRevert", "rowDelete", "selectionChange"] }, { kind: "directive", type: i6.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i6.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i6.VerbenPopUpComponent, selector: "verben-pop-Up", inputs: ["dropdownOpen", "dropdownWidth", "color", "customStyles", "popUpClass", "border", "borderRadius", "enableMouseLeave", "cdkPosition"], outputs: ["dropdownOpenChange", "close"] }, { kind: "component", type: i6.DataViewComponent, selector: "verben-data-view", inputs: ["buttonClass", "iconClass", "activeIconClass", "columnCustomClass", "filterCustomClass", "sortCustomClass", "extendCustomClass", "exportCustomClass", "selectCustomClass", "importCustomClass", "zIndex", "createCustomClass", "tableIcon", "cardIcon", "cardClass", "tableClass", "searchKey", "searchValue", "viewState", "searchTemplate", "importTemplate", "columnTemplate", "extendTemplate", "filterTemplate", "sortTemplate", "children", "exportTemplate", "createTemplate", "selectedColumnCount", "selectedSortCount", "selectedFilterTableCount", "inputWidth", "milliseconds", "showColumnChild", "showSortChild", "showFilterChild", "showImportChild", "showExportChild", "showExtendChild", "create", "showSelected", "isTableView"], outputs: ["viewChange", "stateChange", "onSearchChange"] }, { kind: "component", type: i6.VerbenaButtonComponent, selector: "verbena-button", inputs: ["text", "icon", "useIcon", "svgPosition", "iconPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "svgSize", "weight", "variant", "styleType", "svg", "svgWidth", "svgHeight", "iconColor", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.TableFilterComponent, selector: "verben-table-filter", inputs: ["filterOptions", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "maxFilterLength", "tooltip"], outputs: ["filtersApplied", "resetSortData"] }, { kind: "component", type: i6.VisibleColumnComponent, selector: "verben-visible-column", inputs: ["columns", "items", "enableDragAndDrop", "displayedColumns", "showMore", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "closeColumn"], outputs: ["columnsUpdated", "resetFilter"] }, { kind: "component", type: i6.SortTableComponent, selector: "verben-sort-table", inputs: ["enableDragAndDrop", "sortOptions", "resetText", "displayedOptions", "propertyText", "showMoreText", "sortButtonText", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "containerHeight"], outputs: ["selectedOptions", "resetSortData"] }, { kind: "component", type: i6.VerbenDialogueComponent, selector: "verben-dialogue", inputs: ["dialogueWidth", "headerTemplate", "bodyTemplate", "footerTemplate", "showCloseIcon", "dismissOutsideClick", "closeOnEscape", "isVisible", "size", "backdropColor", "customClass", "disableFooter", "margin", "padding", "borderRadius", "dialogueBgColor", "width", "closeIconClass", "boxShadow", "enableTransition", "modalData", "mode", "position", "drawerWidth"], outputs: ["openModal", "closeModal"] }, { kind: "component", type: i6.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: i6.DataImportComponent, selector: "lib-data-import", inputs: ["previewColumns", "formGroupConfig", "fields", "title", "columnTemplates", "parser", "previewData", "onImportComplete"], outputs: ["exportTemplateEvent", "importEvent", "importEventData", "rowSave"] }, { kind: "component", type: i6.DataXportComponent, selector: "lib-data-xport", inputs: ["data", "columns", "useImportKey", "dataFetchUrl", "dataQueryParameters", "dataQueryFunction"], outputs: ["exportDataEvent", "exportDataRangeEvent"] }, { kind: "component", type: i7.AddTicketComponent, selector: "app-add-ticket", inputs: ["overrideToken", "activeUser", "activeApp", "activeTenant", "selectedTicket", "isDisabled", "isVisible", "defaultCompany"], outputs: ["onOpen", "onClose", "onSave"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.AsyncLabelPipe, name: "asyncLabel" }, { kind: "pipe", type: i8.EllipseWordPipe, name: "ellipseWord" }, { kind: "pipe", type: i8.CompanyDatePipe, name: "companyDate" }] });
901
931
  }
902
932
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TicketingComponent, decorators: [{
903
933
  type: Component,
904
- args: [{ selector: 'app-ticketing', template: "<div class=\"h-full flex flex-col gap-4\">\n <div class=\"flex flex-col gap-4\">\n <!-- <app-tenant-selector\n (onAppSelected)=\"this.onAppSelected($event)\"\n (onTenantSelected)=\"onTenantSelected($event)\"\n (onAppsUpdated)=\"this.onAppListUpdated($event)\"\n (onTenantsUpdated)=\"this.onTenantListUpdated($event)\"\n ></app-tenant-selector> -->\n\n <div class=\"tickets-section flex flex-col gap-2\">\n <div class=\"ticket-table-container\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: !permissionConfig || permissionConfig.Actions['Export'],\n isSelect: true,\n isCreate: false,\n isToggle: false,\n isImport: !permissionConfig || permissionConfig.Actions['Import'],\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n (viewChange)=\"onViewChange($event)\"\n (onSearchChange)=\"handleSearch($event)\"\n [isTableView]=\"true\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n [dataKey]=\"'Id'\"\n class=\"form-table\"\n #dt\n [data]=\"tickets\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>\n {{ value | companyDate }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"updatedAt\">\n <ng-template #cell let-value>\n {{ value | companyDate }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"title\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.Title }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"row.Title\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"description\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.Description | ellipseWord }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input\n [(ngModel)]=\"row.Description\"\n ></verbena-input>\n </div>\n <!-- <div class=\"width-max\">\n <verbena-textarea [(ngModel)]=\"row.Description\">\n </verbena-textarea>\n </div> -->\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"currentHandler\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.CurrentHandler }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"lastHandler\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.LastHandler }}\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"priority\">\n <ng-template #cell let-row=\"row\" let-value>\n <div\n *ngIf=\"\n row.Priority && row.Priority\n | asyncLabel\n : 'TenantPriority'\n : 'Color'\n : ticketingAPI\n : overrideToken || undefined\n | async as color\n \"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center\"\n [style.backgroundColor]=\"color ? softenColor(color) : null\"\n >\n <span\n [style.backgroundColor]=\"color\"\n class=\"enum-dot\"\n ></span>\n <span>{{\n row.Priority\n | asyncLabel\n : \"TenantPriority\"\n : \"Name\"\n : ticketingAPI\n : overrideToken || undefined\n | async\n }}</span>\n </div>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"row.Priority\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"status\">\n <ng-template #cell let-row=\"row\" let-value>\n <div\n *ngIf=\"row.Status\"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center {{\n row.Status\n }}\"\n >\n <span class=\"enum-dot\"></span>\n <span>{{ row.Status }}</span>\n </div>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Select Status\"\n [options]=\"statusOptions\"\n [(ngModel)]=\"row.Status\"\n >\n </verben-drop-down>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"close\">\n <ng-template #cell let-row=\"row\" let-value>\n <verbena-button\n *ngIf=\"this.canClose(row)\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Close Ticket'\"\n [disable]=\"!this.canClose(row)\"\n (click)=\"toggleClosureDialogue(row)\"\n >\n </verbena-button>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <verben-pop-Up\n #popup\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n >\n <verben-svg\n class=\"cursor-pointer actions-icon\"\n dropdown-trigger\n icon=\"list\"\n ></verben-svg>\n <div class=\"pop-up-content flex flex-col\" dropdown-content>\n <div\n *ngIf=\"\n !permissionConfig ||\n permissionConfig.Actions['Create']\n \"\n (click)=\"editTicket(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n Edit\n </div>\n <div\n (click)=\"viewTicketDetails(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n View Details\n </div>\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template\n #cellEdit\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <div class=\"flex gap-2 items-center\">\n <verben-svg\n icon=\"tick\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"tableSaveTicket(value, toggleRowEdit)\"\n ></verben-svg>\n <verben-svg\n (click)=\"restoreCache(value); toggleRowEdit()\"\n icon=\"close-no-circle\"\n [width]=\"15\"\n [height]=\"15\"\n ></verben-svg>\n <!-- <verben-svg (click)=\"toggleRowEdit()\" icon=\"delete\" [width]=\"15\" [height]=\"15\"></verben-svg> -->\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (filtersApplied)=\"onFilterUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div import-content>\n <lib-data-import\n [previewColumns]=\"visibleColumnDef\"\n title=\"ticket\"\n (importEventData)=\"onComplete($event)\"\n [columnTemplates]=\"columnTemplates()\"\n >\n </lib-data-import>\n </div>\n <div export-content>\n <lib-data-xport\n [useImportKey]=\"true\"\n [columns]=\"visibleColumnDef\"\n [dataQueryFunction]=\"exportFiltersAndSorts\"\n [data]=\"tickets\"\n >\n </lib-data-xport>\n </div>\n <div children>\n <verbena-button\n width=\"100%\"\n [useIcon]=\"true\"\n [icon]=\"'add'\"\n class=\"verben-primary-button\"\n [text]=\"'Add New Ticket'\"\n (click)=\"addNewTicket()\"\n >\n </verbena-button>\n </div>\n </verben-data-view>\n </div>\n <div\n *ngIf=\"tickets.length > 0\"\n class=\"flex justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\">{{ tickets.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n </div>\n\n <div\n *ngIf=\"\n this.apps.length == 0 ||\n (this.activeApp && this.tenants.length == 0) ||\n (this.activeTenant && this.tickets.length == 0 && !isFilteredState())\n \"\n class=\"create-container flex-1 rounded-[20px] flex items-center justify-center\"\n ></div>\n</div>\n\n<!-- <app-add-app\n [isVisible]=\"showAppForm\"\n [selectedApp]=\"selectedApp\"\n (onClose)=\"onAppModalClose()\"\n (onSave)=\"onAppSave($event)\"\n></app-add-app>\n\n<app-add-tenant\n [isVisible]=\"showTenantForm\"\n [activeApp]=\"activeApp\"\n [selectedTenant]=\"selectedTenant\"\n (onClose)=\"onTenantModalClose()\"\n (onSave)=\"onTenantSave($event)\"\n></app-add-tenant> -->\n\n<app-add-ticket\n [isVisible]=\"showTicketForm\"\n [activeApp]=\"activeApp\"\n [activeUser]=\"activeUser\"\n [isDisabled]=\"isDisabled()\"\n [activeTenant]=\"activeTenant\"\n [selectedTicket]=\"selectedTicket\"\n (onClose)=\"onTicketModalClose()\"\n (onSave)=\"onTicketSave($event)\"\n [overrideToken]=\"overrideToken\"\n></app-add-ticket>\n\n<verben-dialogue\n [showCloseIcon]=\"false\"\n [dismissOutsideClick]=\"false\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'ticket-dialog'\"\n [disableFooter]=\"true\"\n (openModal)=\"onModalOpen($event)\"\n [isVisible]=\"showClosureDialogue\"\n [bodyTemplate]=\"bodyTemplate\"\n (closeModal)=\"onModalClose($event)\"\n>\n <ng-template #bodyTemplate>\n <div class=\"dialog-body p-[25px] flex flex-col gap-4\">\n <div class=\"dialog-header flex flex-col gap-1\">\n <div class=\"dialog-title font-bold text-xl\">Enter Reason</div>\n <div class=\"dialog-subtitle\">\n Please provide a reason for closing this ticket\n </div>\n </div>\n <!-- <verbena-textarea name=\"Test\" [(ngModel)]=\"test\" />\n <button (click)=\"logTest()\">Log</button> -->\n <div class=\"add-app-form main-form-container flex flex-col gap-2\">\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Reason</div>\n <verbena-input\n name=\"Reason\"\n placeHolder=\"Enter reason...\"\n [(ngModel)]=\"closureReason\"\n />\n </div>\n </div>\n <div class=\"dialog-button-container flex justify-end gap-2\">\n <verbena-button\n width=\"100%\"\n class=\"verben-secondary-button\"\n [text]=\"'Close'\"\n (click)=\"onModalClose($event)\"\n >\n </verbena-button>\n <verbena-button\n [disable]=\"this.closureReason.trim().length == 0\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Confirm'\"\n (click)=\"closeTicket()\"\n >\n </verbena-button>\n </div>\n </div>\n </ng-template>\n</verben-dialogue>\n", styles: [".app-card-container{overflow-x:auto;padding:5px}.app-card{border:1.5px solid #0000001a;flex:1 1 250px;aspect-ratio:9/5;max-width:250px;box-shadow:0 0 12px transparent}.app-card.active{border:1.5px solid #6f2290;box-shadow:0 0 12px #b48ef766}.tenants-container{overflow-x:auto}.tenant{border:1.5px solid #0000001a;min-width:max-content}.tenant.active{border:1.5px solid #6f2290}.create-container{border:1.5px solid #0000001a}.enum-val{padding:10px 15px;width:max-content}.enum-val .enum-dot{width:10px;height:10px;border-radius:9999px;background-color:gray}.enum-val.Disabled{background-color:#c7c7c7}.enum-val.Pending{background-color:#fcedc5}.enum-val.InProgress{background-color:#4440df33}.enum-val.Completed,.enum-val.Active{background-color:#71f3b870}.enum-val.Canceled,.enum-val.InActive{background-color:#fcc3c3}.enum-val.Pending .enum-dot{background-color:#be8800}.enum-val.InProgress .enum-dot{background-color:#4440df}.enum-val.Completed .enum-dot,.enum-val.Active .enum-dot{background-color:#0d875a}.enum-val.Canceled .enum-dot,.enum-val.InActive .enum-dot{background-color:#be0000}.pop-up-content{border-radius:4px;background-color:#fff;border:1px solid grey}.pop-up-value{padding:10px 20px}::ng-deep .ticket-dialog{max-width:60vw}.view-links{font-size:14px!important;color:#00f;font-weight:600;cursor:pointer}.view-links:hover{text-decoration:underline;text-underline-offset:3px}@media only screen and (max-width: 768px){::ng-deep .ticket-dialog{min-width:90vw!important;max-width:90vw!important}::ng-deep .toolbar{flex-direction:column;align-items:normal!important}::ng-deep .toolbar>div:nth-child(2){overflow-x:auto;align-items:normal!important}::ng-deep .toolbar>div:nth-child(2)>span{min-width:max-content}}\n"] }]
934
+ args: [{ selector: 'app-ticketing', template: "<div class=\"h-full flex flex-col gap-4\">\n <div class=\"flex flex-col gap-4\">\n <!-- <app-tenant-selector\n (onAppSelected)=\"this.onAppSelected($event)\"\n (onTenantSelected)=\"onTenantSelected($event)\"\n (onAppsUpdated)=\"this.onAppListUpdated($event)\"\n (onTenantsUpdated)=\"this.onTenantListUpdated($event)\"\n ></app-tenant-selector> -->\n\n <div class=\"tickets-section flex flex-col gap-2\">\n <div class=\"ticket-table-container\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: !permissionConfig || permissionConfig.Actions['Export'],\n isSelect: true,\n isCreate: false,\n isToggle: false,\n isImport: !permissionConfig || permissionConfig.Actions['Import'],\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n (viewChange)=\"onViewChange($event)\"\n (onSearchChange)=\"handleSearch($event)\"\n [isTableView]=\"true\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n [dataKey]=\"'Id'\"\n class=\"form-table\"\n #dt\n [data]=\"tickets\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>\n {{ value | companyDate }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"updatedAt\">\n <ng-template #cell let-value>\n {{ value | companyDate }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"title\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.Title }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"row.Title\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"description\">\n <ng-template #cell let-row=\"row\" let-value>\n <span\n [title]=\"\n row.Description?.length > 40 ? row.Description : null\n \"\n >\n {{ row.Description | ellipseWord }}\n </span>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input\n [(ngModel)]=\"row.Description\"\n ></verbena-input>\n </div>\n <!-- <div class=\"width-max\">\n <verbena-textarea [(ngModel)]=\"row.Description\">\n </verbena-textarea>\n </div> -->\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"currentHandler\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.CurrentHandler }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"lastHandler\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.LastHandler }}\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"priority\">\n <ng-template #cell let-row=\"row\" let-value>\n <div\n *ngIf=\"\n row.Priority && row.Priority\n | asyncLabel\n : 'TenantPriority'\n : 'Color'\n : ticketingAPI\n : overrideToken || undefined\n | async as color\n \"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center\"\n [style.backgroundColor]=\"color ? softenColor(color) : null\"\n >\n <span\n [style.backgroundColor]=\"color\"\n class=\"enum-dot\"\n ></span>\n <span>{{\n row.Priority\n | asyncLabel\n : \"TenantPriority\"\n : \"Name\"\n : ticketingAPI\n : overrideToken || undefined\n | async\n }}</span>\n </div>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"row.Priority\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"status\">\n <ng-template #cell let-row=\"row\" let-value>\n <div\n *ngIf=\"row.Status\"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center {{\n row.Status\n }}\"\n >\n <span class=\"enum-dot\"></span>\n <span>{{ row.Status }}</span>\n </div>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateData=\"updateData\"\n let-value\n >\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Select Status\"\n [options]=\"statusOptions\"\n [(ngModel)]=\"row.Status\"\n >\n </verben-drop-down>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"close\">\n <ng-template #cell let-row=\"row\" let-value>\n <verbena-button\n *ngIf=\"this.canClose(row)\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Close Ticket'\"\n [disable]=\"!this.canClose(row)\"\n (click)=\"toggleClosureDialogue(row)\"\n >\n </verbena-button>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <verben-pop-Up\n #popup\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n >\n <verben-svg\n class=\"cursor-pointer actions-icon\"\n dropdown-trigger\n icon=\"list\"\n ></verben-svg>\n <div class=\"pop-up-content flex flex-col\" dropdown-content>\n <div\n *ngIf=\"\n !permissionConfig ||\n permissionConfig.Actions['Create']\n \"\n (click)=\"editTicket(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n Edit\n </div>\n <div\n (click)=\"viewTicketDetails(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n View Details\n </div>\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template\n #cellEdit\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <div class=\"flex gap-2 items-center\">\n <verben-svg\n icon=\"tick\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"tableSaveTicket(value, toggleRowEdit)\"\n ></verben-svg>\n <verben-svg\n (click)=\"restoreCache(value); toggleRowEdit()\"\n icon=\"close-no-circle\"\n [width]=\"15\"\n [height]=\"15\"\n ></verben-svg>\n <!-- <verben-svg (click)=\"toggleRowEdit()\" icon=\"delete\" [width]=\"15\" [height]=\"15\"></verben-svg> -->\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (filtersApplied)=\"onFilterUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div import-content>\n <lib-data-import\n [previewColumns]=\"visibleColumnDef\"\n title=\"ticket\"\n (importEventData)=\"onComplete($event)\"\n [columnTemplates]=\"columnTemplates()\"\n >\n </lib-data-import>\n </div>\n <div export-content>\n <lib-data-xport\n [useImportKey]=\"true\"\n [columns]=\"visibleColumnDef\"\n [dataQueryFunction]=\"exportFiltersAndSorts\"\n [data]=\"tickets\"\n >\n </lib-data-xport>\n </div>\n <div children>\n <verbena-button\n width=\"100%\"\n [useIcon]=\"true\"\n [icon]=\"'add'\"\n class=\"verben-primary-button\"\n [text]=\"'Add New Ticket'\"\n (click)=\"addNewTicket()\"\n >\n </verbena-button>\n </div>\n </verben-data-view>\n </div>\n <div\n *ngIf=\"tickets.length > 0\"\n class=\"flex justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\">{{ tickets.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n </div>\n\n <div\n *ngIf=\"\n this.apps.length == 0 ||\n (this.activeApp && this.tenants.length == 0) ||\n (this.activeTenant && this.tickets.length == 0 && !isFilteredState())\n \"\n class=\"create-container flex-1 rounded-[20px] flex items-center justify-center\"\n ></div>\n</div>\n\n<!-- <app-add-app\n [isVisible]=\"showAppForm\"\n [selectedApp]=\"selectedApp\"\n (onClose)=\"onAppModalClose()\"\n (onSave)=\"onAppSave($event)\"\n></app-add-app>\n\n<app-add-tenant\n [isVisible]=\"showTenantForm\"\n [activeApp]=\"activeApp\"\n [selectedTenant]=\"selectedTenant\"\n (onClose)=\"onTenantModalClose()\"\n (onSave)=\"onTenantSave($event)\"\n></app-add-tenant> -->\n\n<app-add-ticket\n [isVisible]=\"showTicketForm\"\n [activeApp]=\"activeApp\"\n [activeUser]=\"activeUser\"\n [isDisabled]=\"isDisabled()\"\n [activeTenant]=\"activeTenant\"\n [selectedTicket]=\"selectedTicket\"\n (onClose)=\"onTicketModalClose()\"\n (onSave)=\"onTicketSave($event)\"\n [overrideToken]=\"overrideToken\"\n></app-add-ticket>\n\n<verben-dialogue\n [showCloseIcon]=\"false\"\n [dismissOutsideClick]=\"false\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'ticket-dialog'\"\n [disableFooter]=\"true\"\n (openModal)=\"onModalOpen($event)\"\n [isVisible]=\"showClosureDialogue\"\n [bodyTemplate]=\"bodyTemplate\"\n (closeModal)=\"onModalClose($event)\"\n>\n <ng-template #bodyTemplate>\n <div class=\"dialog-body p-[25px] flex flex-col gap-4\">\n <div class=\"dialog-header flex flex-col gap-1\">\n <div class=\"dialog-title font-bold text-xl\">Enter Reason</div>\n <div class=\"dialog-subtitle\">\n Please provide a reason for closing this ticket\n </div>\n </div>\n <!-- <verbena-textarea name=\"Test\" [(ngModel)]=\"test\" />\n <button (click)=\"logTest()\">Log</button> -->\n <div class=\"add-app-form main-form-container flex flex-col gap-2\">\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Reason</div>\n <verbena-input\n name=\"Reason\"\n placeHolder=\"Enter reason...\"\n [(ngModel)]=\"closureReason\"\n />\n </div>\n </div>\n <div class=\"dialog-button-container flex justify-end gap-2\">\n <verbena-button\n width=\"100%\"\n class=\"verben-secondary-button\"\n [text]=\"'Close'\"\n (click)=\"onModalClose($event)\"\n >\n </verbena-button>\n <verbena-button\n [disable]=\"this.closureReason.trim().length == 0\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Confirm'\"\n (click)=\"closeTicket()\"\n >\n </verbena-button>\n </div>\n </div>\n </ng-template>\n</verben-dialogue>\n", styles: [".app-card-container{overflow-x:auto;padding:5px}.app-card{border:1.5px solid #0000001a;flex:1 1 250px;aspect-ratio:9/5;max-width:250px;box-shadow:0 0 12px transparent}.app-card.active{border:1.5px solid #6f2290;box-shadow:0 0 12px #b48ef766}.tenants-container{overflow-x:auto}.tenant{border:1.5px solid #0000001a;min-width:max-content}.tenant.active{border:1.5px solid #6f2290}.create-container{border:1.5px solid #0000001a}.enum-val{padding:10px 15px;width:max-content}.enum-val .enum-dot{width:10px;height:10px;border-radius:9999px;background-color:gray}.enum-val.Disabled{background-color:#c7c7c7}.enum-val.Pending{background-color:#fcedc5}.enum-val.InProgress{background-color:#4440df33}.enum-val.Completed,.enum-val.Active{background-color:#71f3b870}.enum-val.Canceled,.enum-val.InActive{background-color:#fcc3c3}.enum-val.Pending .enum-dot{background-color:#be8800}.enum-val.InProgress .enum-dot{background-color:#4440df}.enum-val.Completed .enum-dot,.enum-val.Active .enum-dot{background-color:#0d875a}.enum-val.Canceled .enum-dot,.enum-val.InActive .enum-dot{background-color:#be0000}.pop-up-content{border-radius:4px;background-color:#fff;border:1px solid grey}.pop-up-value{padding:10px 20px}::ng-deep .ticket-dialog{max-width:60vw}.view-links{font-size:14px!important;color:#00f;font-weight:600;cursor:pointer}.view-links:hover{text-decoration:underline;text-underline-offset:3px}@media only screen and (max-width: 768px){::ng-deep .ticket-dialog{min-width:90vw!important;max-width:90vw!important}::ng-deep .toolbar{flex-direction:column;align-items:normal!important}::ng-deep .toolbar>div:nth-child(2){overflow-x:auto;align-items:normal!important}::ng-deep .toolbar>div:nth-child(2)>span{min-width:max-content}}\n"] }]
905
935
  }], ctorParameters: () => [{ type: i1.UtilService }, { type: i1.HttpWebRequestService }, { type: i0.ChangeDetectorRef }, { type: i2.TicketingService }, { type: i3.ActivatedRoute }, { type: i1.ImportService }, { type: i1.EnvironmentService }], propDecorators: { permissionConfig: [{
906
936
  type: Input
907
937
  }], activeApp: [{
@@ -930,4 +960,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
930
960
  type: ViewChildren,
931
961
  args: ['popup']
932
962
  }] } });
933
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0aW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL3RpY2tldGluZy90aWNrZXRpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL2NvbXBvbmVudHMvdGlja2V0aW5nL3RpY2tldGluZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUNULEtBQUssRUFJTCxNQUFNLEVBRU4sU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEdBRWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFLMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBTWxFLHNGQUFzRjtBQUN0RiwrRkFBK0Y7QUFDL0YsNERBQTREO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFFTCxlQUFlLEVBQ2YsY0FBYyxHQUtmLE1BQU0sY0FBYyxDQUFDO0FBS3RCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM3RSxPQUFPLEVB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QVk7c0JBQXBCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUlHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQVNZLFFBQVE7c0JBQXpCLFNBQVM7dUJBQUMsS0FBSztnQkFDQyxTQUFTO3NCQUF6QixTQUFTO3VCQUFDLElBQUk7Z0JBQ1EsTUFBTTtzQkFBNUIsWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgUXVlcnlMaXN0LFxuICBzaWduYWwsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxuICB2aWV3Q2hpbGRyZW4sXG4gIFdyaXRhYmxlU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERFRkFVTFRfUEFHRV9TSVpFIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbiwgS2V5VmFsdWVQYXJhbSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBQYWdlZFJlc3VsdCB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgVGlja2V0IH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBUaWNrZXRTdGF0dXMgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7XG4gIFV0aWxTZXJ2aWNlLFxuICBFbnZpcm9ubWVudFNlcnZpY2UsXG59IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBIdHRwV2ViUmVxdWVzdFNlcnZpY2UgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvc2VydmljZXMnO1xuLy8gaW1wb3J0IHsgQWRkQXBwQ29tcG9uZW50IH0gZnJvbSAnQGFwcC9zaGFyZWQvY29tcG9uZW50cy9hZGQtYXBwL2FkZC1hcHAuY29tcG9uZW50Jztcbi8vIGltcG9ydCB7IEFkZFRlbmFudENvbXBvbmVudCB9IGZyb20gJ0BhcHAvc2hhcmVkL2NvbXBvbmVudHMvYWRkLXRlbmFudC9hZGQtdGVuYW50LmNvbXBvbmVudCc7XG4vLyBpbXBvcnQgeyBTaGFyZWRNb2R1bGUgfSBmcm9tICdAYXBwL3NoYXJlZC9zaGFyZWQubW9kdWxlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgQ29sdW1uRGVmaW5pdGlvbixcbiAgQ29sdW1uRGlyZWN0aXZlLFxuICBEYXRhRmlsdGVyVHlwZSxcbiAgRGF0YVRhYmxlQ29tcG9uZW50LFxuICBEYXRhVmlld0NvbXBvbmVudCxcbiAgSURhdGFGaWx0ZXIsXG4gIFZlcmJlblBvcFVwQ29tcG9uZW50LFxufSBmcm9tICd2ZXJiZW4tbmctdWknO1xuaW1wb3J0IHsgVGlja2V0aW5nU2VydmljZSB9IGZyb20gJy4vdGlja2V0aW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgSW1wb3J0U2VydmljZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uQ29uZmlnIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBPYmplY3RTdGF0ZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgU2VhcmNoUHJvcGVydHlWYWx1ZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgU2VhcmNoT3BlcmF0b3IgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IEZpbHRlclR5cGVzIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBTZWFyY2hQcm9wZXJ0eVNpZ24gfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBTb3J0RGlyZWN0aW9uIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBiYXNlU3R5bGUgfSBmcm9tICcuL2Jhc2UtdGFibGUtc3R5bGUnO1xuXG5lbnVtIFRpY2tldFByb3BlcnR5TmFtZSB7XG4gIENyZWF0ZWRBdCA9ICdDcmVhdGVkIEF0JyxcbiAgVXBkYXRlZEF0ID0gJ1VwZGF0ZWQgQXQnLFxuICBUaXRsZSA9ICdUaXRsZScsXG4gIERlc2NyaXB0aW9uID0gJ0Rlc2NyaXB0aW9uJyxcbiAgQ3VycmVudEhhbmRsZXIgPSAnQ3VycmVudCBIYW5kbGVyJyxcbiAgUHJpb3JpdHkgPSAnUHJpb3JpdHknLFxuICBTdGF0dXMgPSAnU3RhdHVzJyxcbn1cblxuZW51bSBUaWNrZXRQcm9wZXJ0eU1hcCB7XG4gIENyZWF0ZWRBdCA9ICdDcmVhdGVkQXQnLFxuICBVcGRhdGVkQXQgPSAnVXBkYXRlZEF0JyxcbiAgVGl0bGUgPSAnVGl0bGUnLFxuICBEZXNjcmlwdGlvbiA9ICdEZXNjcmlwdGlvbicsXG4gIEN1cnJlbnRIYW5kbGVyID0gJ0N1cnJlbnRIYW5kbGVyJyxcbiAgUHJpb3JpdHkgPSAnUHJpb3JpdHknLFxuICBTdGF0dXMgPSAnU3RhdHVzJyxcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXRpY2tldGluZycsXG4gIHRlbXBsYXRlVXJsOiAnLi90aWNrZXRpbmcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vdGlja2V0aW5nLmNvbXBvbmVudC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBUaWNrZXRpbmdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHBlcm1pc3Npb25Db25maWc6IFBlcm1pc3Npb25Db25maWcgfCBudWxsID0gbnVsbDtcblxuICBzdHlsZXMgPSBiYXNlU3R5bGU7XG4gIC8vIHNob3dBcHBGb3JtOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIHNob3dUZW5hbnRGb3JtOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dUaWNrZXRGb3JtOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIHNlbGVjdGVkQXBwOiBBcHBsaWNhdGlvbiB8IG51bGwgPSBudWxsO1xuICAvLyBzZWxlY3RlZFRlbmFudDogVGVuYW50IHwgbnVsbCA9IG51bGw7XG4gIHNlbGVjdGVkVGlja2V0OiBUaWNrZXQgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgYWN0aXZlQXBwOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgYWN0aXZlVGVuYW50OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgYWN0aXZlVXNlcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG92ZXJyaWRlVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBhbGxvd1RpY2tldENsb3Npbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYWN0aXZlVGlja2V0OiBUaWNrZXQgfCBudWxsID0gbnVsbDtcbiAgYXBwczogQXBwbGljYXRpb25bXSA9IFtdO1xuICBASW5wdXQoKSBkZXRhaWxQYXRoOiBzdHJpbmcgPSAnJztcbiAgdGVuYW50czogVGVuYW50W10gPSBbXTtcbiAgdGlja2V0czogVGlja2V0W10gPSBbXTtcbiAgdGlja2V0aW5nQVBJOiBzdHJpbmcgPSBgYDtcbiAgQElucHV0KCkgZGVmYXVsdENvbXBhbnk6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBiYXNlVXJsOiBzdHJpbmcgPSBgYDtcbiAgY2xvc3VyZVRpY2tldDogVGlja2V0IHwgbnVsbCA9IG51bGw7XG4gIGNsb3N1cmVSZWFzb246IHN0cmluZyA9ICcnO1xuICBzaG93Q2xvc3VyZURpYWxvZ3VlOiBib29sZWFuID0gZmFsc2U7XG4gIHBlbmRpbmdSZWY6IFRpY2tldFN0YXR1cyA9IFRpY2tldFN0YXR1cy5QZW5kaW5nO1xuICB2aXNpYmxlQ29sdW1uRGVmOiBDb2x1bW5EZWZpbml0aW9uPGFueT5bXSA9IFtdO1xuICBleHBvcnRDb2x1bW5EZWY6IENvbHVtbkRlZmluaXRpb248YW55PltdID0gW107XG4gIGltcG9ydGVkRGF0YTogV3JpdGFibGVTaWduYWw8YW55W10+ID0gc2lnbmFsKFtdKTtcbiAgY29sdW1uVGVtcGxhdGVzID0gdmlld0NoaWxkcmVuPENvbHVtbkRpcmVjdGl2ZT4oQ29sdW1uRGlyZWN0aXZlKTtcbiAgQFZpZXdDaGlsZCgndmR2JykgZGF0YVZpZXchOiBEYXRhVmlld0NvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgnZHQnKSB0YWJsZVZpZXchOiBEYXRhVGFibGVDb21wb25lbnQ8VGlja2V0PjtcbiAgQFZpZXdDaGlsZHJlbigncG9wdXAnKSBwb3BVcHMhOiBRdWVyeUxpc3Q8VmVyYmVuUG9wVXBDb21wb25lbnQ+O1xuICBwYWdlU2l6ZTogbnVtYmVyID0gREVGQVVMVF9QQUdFX1NJWkU7XG4gIHNlYXJjaERlYm91bmNlVGltZTogbnVtYmVyID0gNTAwO1xuICBwYWdlU3RhdGU6IFBhZ2VkUmVzdWx0PFRpY2tldD4gfCBudWxsID0gbnVsbDtcbiAgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIG9wZW5Ecm9wZG93bklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgY3VycmVudEZpbHRlcnM6IElEYXRhRmlsdGVyW10gPSBbXTtcbiAgY3VycmVudFNvcnRzOiBJRGF0YUZpbHRlcltdID0gW107XG4gIHNlYXJjaFRlcm0kID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBzdGF0dXNPcHRpb25zOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKFRpY2tldFN0YXR1cyk7XG4gIHZpc2libGVDb2x1bW5zOiBJRGF0YUZpbHRlcltdID0gW107XG4gIGZpbHRlckFycmF5OiBJRGF0YUZpbHRlcltdID0gW1xuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5DcmVhdGVkQXQsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5EYXRlLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuVXBkYXRlZEF0LFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuRGF0ZSxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLlRpdGxlLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuRGVzY3JpcHRpb24sXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5DdXJyZW50SGFuZGxlcixcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLlByaW9yaXR5LFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuU3RhdHVzLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgXTtcblxuICBzb3J0T3B0aW9uczogSURhdGFGaWx0ZXJbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuQ3JlYXRlZEF0LFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuRGF0ZSxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLlVwZGF0ZWRBdCxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkRhdGUsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5UaXRsZSxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLkRlc2NyaXB0aW9uLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuQ3VycmVudEhhbmRsZXIsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5Qcmlvcml0eSxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLlN0YXR1cyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gIF07XG5cbiAgcHJpdmF0ZSBjdXJyZW50U2VhcmNoVGVybTogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB1dGlsU2VydmljZTogVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZXJ2ZXI6IEh0dHBXZWJSZXF1ZXN0U2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHVibGljIHNlcnZpY2U6IFRpY2tldGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBpbXBvcnRTZXJ2aWNlOiBJbXBvcnRTZXJ2aWNlPFRpY2tldD4sXG4gICAgcHJpdmF0ZSBlbnZTdmM6IEVudmlyb25tZW50U2VydmljZSxcbiAgKSB7XG4gICAgc2VydmljZS5pbml0U2VydmljZSh0aGlzLm92ZXJyaWRlVG9rZW4pO1xuICAgIGltcG9ydFNlcnZpY2UuaW5pdFNlcnZpY2UodGhpcy5vdmVycmlkZVRva2VuKTtcbiAgfVxuXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY2hhbmdlc1snb3ZlcnJpZGVUb2tlbiddKSB7XG4gICAgICB0aGlzLnNlcnZpY2UuaW5pdFNlcnZpY2UodGhpcy5vdmVycmlkZVRva2VuKTtcbiAgICAgIHRoaXMuaW1wb3J0U2VydmljZS5pbml0U2VydmljZSh0aGlzLm92ZXJyaWRlVG9rZW4pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbkRlZiA9IHRoaXMuc2VydmljZS50aWNrZXRDb2x1bW5zLmZpbHRlcihcbiAgICAgICh4KSA9PiB4LmlkICE9ICdhY3Rpb25zJyB8fCB0aGlzLnBlcm1pc3Npb25Db25maWc/LkFjdGlvbnNbJ0NyZWF0ZSddLFxuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmFsbG93VGlja2V0Q2xvc2luZyAmJlxuICAgICAgdGhpcy5wZXJtaXNzaW9uQ29uZmlnICYmXG4gICAgICB0aGlzLnBlcm1pc3Npb25Db25maWcuQWN0aW9uc1snQ2xvc2VUaWNrZXQnXVxuICAgICkge1xuICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBNYXRoLm1heCh0aGlzLnZpc2libGVDb2x1bW5EZWYubGVuZ3RoIC0gMSwgMCk7XG5cbiAgICAgIHRoaXMudmlzaWJsZUNvbHVtbkRlZi5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIHtcbiAgICAgICAgaWQ6ICdjbG9zZScsXG4gICAgICAgIGhlYWRlcjogJycsXG4gICAgICAgIGNhbkV4cG9ydDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5leHBvcnRDb2x1bW5EZWYgPSB0aGlzLnNlcnZpY2UudGlja2V0Q29sdW1ucy5maWx0ZXIoXG4gICAgICAoeCkgPT5cbiAgICAgICAgKHguaWQgIT0gJ2FjdGlvbnMnIHx8IHRoaXMucGVybWlzc2lvbkNvbmZpZz8uQWN0aW9uc1snQ3JlYXRlJ10pICYmXG4gICAgICAgIHguaWQgIT0gJ2Rlc2NyaXB0aW9uJyxcbiAgICApO1xuICAgIC8vICBjb25zb2xlLmxvZyh7IFN0YXRlOiB0aGlzLnBlcm1pc3Npb25Db25maWcgfSk7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMuc2VydmljZS50aWNrZXRDb2x1bW5zXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoeCkgPT4geC5pZCAhPSAnYWN0aW9ucycgfHwgdGhpcy5wZXJtaXNzaW9uQ29uZmlnPy5BY3Rpb25zWydDcmVhdGUnXSxcbiAgICAgIClcbiAgICAgIC5tYXAoKGNvbCkgPT4gKHtcbiAgICAgICAgY2hlY2tlZDogdHJ1ZSxcbiAgICAgICAgbmFtZTogdHlwZW9mIGNvbC5oZWFkZXIgPT09ICdzdHJpbmcnID8gY29sLmhlYWRlciA6IGNvbC5pZCxcbiAgICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuQm9vbCxcbiAgICAgIH0pKTtcbiAgICB0aGlzLnRpY2tldGluZ0FQSSA9IGAke3RoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSX0vVGlja2V0YDtcblxuICAgIGlmICh0aGlzLmFjdGl2ZVRlbmFudCkge1xuICAgICAgY29uc3Qgdmlld0FsbDogYm9vbGVhbiA9XG4gICAgICAgIHRoaXMucGVybWlzc2lvbkNvbmZpZz8uQWN0aW9uc1snVmlld0FsbFRpY2tldHMnXSB8fCBmYWxzZTtcblxuICAgICAgY29uc3QgdGlja2V0cyA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXRUaWNrZXRzRm9yVGVuYW50KFxuICAgICAgICB0aGlzLmFjdGl2ZVRlbmFudCxcbiAgICAgICAgdmlld0FsbCxcbiAgICAgICAgdGhpcy5hY3RpdmVVc2VyIHx8ICcnLFxuICAgICAgKTtcbiAgICAgIGlmICh0aWNrZXRzKSB7XG4gICAgICAgIHRoaXMucGFnZVN0YXRlID0gdGlja2V0cztcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRpY2tldHMuUmVzdWx0O1xuICAgICAgICB0aGlzLnRpY2tldHMgPSByZXN1bHRzLm1hcCgoeCkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi54LFxuICAgICAgICAgICAgSWQ6IHguQ29kZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlYXJjaFRlcm0kXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5zZWFyY2hEZWJvdW5jZVRpbWUpKSAvLyBBZGp1c3QgZGVib3VuY2UgdGltZSBoZXJlIChpbiBtcylcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKHNlYXJjaFRlcm0pID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VhcmNoVGVybSA9IHNlYXJjaFRlcm07XG4gICAgICAgIHRoaXMudXBkYXRlRmlsdGVyc0FuZFNvcnRzKHRydWUpO1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBsb2FkTW9yZSgpIHtcbiAgICBpZiAoIXRoaXMucGFnZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubG9hZE1vcmVGaWx0ZXJzQW5kU29ydHMoKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYWdlU3RhdGUgPSByZXMgYXMgUGFnZWRSZXN1bHQ8VGlja2V0PjtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzIGFzIFBhZ2VkUmVzdWx0PFRpY2tldD4pLlJlc3VsdDtcbiAgICAgIGNvbnN0IG1hcHBlZERhdGE6IFRpY2tldFtdID0gcmVzdWx0Lm1hcCgoeCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLngsXG4gICAgICAgICAgSWQ6IHguQ29kZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy50aWNrZXRzID0gdGhpcy50aWNrZXRzLmNvbmNhdChtYXBwZWREYXRhKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB0YWJsZVNhdmVUaWNrZXQoZm9ybTogVGlja2V0LCBjYWxsQmFjazogKCkgPT4gYW55KSB7XG4gICAgaWYgKGZvcm0uRGVzY3JpcHRpb24udHJpbSgpLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dJbmZvKCdEZXNjcmlwdGlvbiBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9ybS5EYXRhU3RhdGUgPVxuICAgICAgZm9ybS5EYXRhU3RhdGUgPT0gT2JqZWN0U3RhdGUuTmV3ID8gT2JqZWN0U3RhdGUuTmV3IDogT2JqZWN0U3RhdGUuQ2hhbmdlZDtcbiAgICBmb3JtLklkID0gJyc7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgIGBUaWNrZXQvU2F2ZVRpY2tldGAsXG4gICAgICBbZm9ybV0sXG4gICAgICB0aGlzLm92ZXJyaWRlVG9rZW4gfHwgdW5kZWZpbmVkLFxuICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJLFxuICAgICk7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ1RpY2tldCBzYXZlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlcyBhcyBUaWNrZXRbXTtcbiAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgcmVzdWx0SXRlbSA9IHJlc3VsdFswXTtcbiAgICAgICAgY29uc3QgaXRlbUluZGV4ID0gdGhpcy50aWNrZXRzLmZpbmRJbmRleCgoeCkgPT4geCA9PSBmb3JtKTtcbiAgICAgICAgaWYgKGl0ZW1JbmRleCA+IC0xKSB7XG4gICAgICAgICAgdGhpcy50aWNrZXRzW2l0ZW1JbmRleF0uQ29kZSA9IHJlc3VsdEl0ZW0uQ29kZTtcbiAgICAgICAgICB0aGlzLnRpY2tldHNbaXRlbUluZGV4XS5JZCA9IHJlc3VsdEl0ZW0uQ29kZTtcbiAgICAgICAgICB0aGlzLnRpY2tldHNbaXRlbUluZGV4XS5EYXRhU3RhdGUgPSByZXN1bHRJdGVtLkRhdGFTdGF0ZTtcbiAgICAgICAgICB0aGlzLnRpY2tldHNbaXRlbUluZGV4XS5UZW5hbnRJZCA9IHJlc3VsdEl0ZW0uVGVuYW50SWQ7XG4gICAgICAgICAgdGhpcy50aWNrZXRzW2l0ZW1JbmRleF0uU2VydmljZU5hbWUgPSByZXN1bHRJdGVtLlNlcnZpY2VOYW1lO1xuICAgICAgICAgIHRoaXMudGlja2V0cyA9IHRoaXMudGlja2V0cy5tYXAoKHgpID0+IHgpO1xuICAgICAgICAgIHRoaXMuY2FjaGVJdGVtKHRoaXMudGlja2V0c1tpdGVtSW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsQmFjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVRhYmxlKCkge1xuICAgIHRoaXMudGlja2V0cyA9IHRoaXMudGlja2V0cy5tYXAoKHgpID0+IHgpO1xuICB9XG5cbiAgY2xvc2VQb3BVcCgpIHtcbiAgICB0aGlzLm9wZW5Ecm9wZG93bklkID0gbnVsbDtcbiAgICB0aGlzLnBvcFVwcy5mb3JFYWNoKChwb3BVcCkgPT4ge1xuICAgICAgaWYgKHBvcFVwLmRyb3Bkb3duT3Blbikge1xuICAgICAgICBwb3BVcC50b2dnbGVEcm9wZG93bigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25WaWV3Q2hhbmdlKGlzR3JpZFZpZXc6IGJvb2xlYW4pOiB2b2lkIHt9XG5cbiAgc2hvd1RhYmxlVmlldzogYm9vbGVhbiA9IHRydWU7XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0ZWRSb3dzOiBUaWNrZXRbXSkge31cblxuICBvbkNvbHVtbnNVcGRhdGVkKHVwZGF0ZWRDb2x1bW5zOiBJRGF0YUZpbHRlcltdKSB7XG4gICAgY29uc3QgdXBkYXRlZENvbHVtbkRlZjogQ29sdW1uRGVmaW5pdGlvbjxUaWNrZXQ+W10gPSBbXTtcbiAgICB1cGRhdGVkQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nQ29sID0gdGhpcy5zZXJ2aWNlLnRpY2tldENvbHVtbnMuZmluZChcbiAgICAgICAgKGNvbHVtbikgPT4gY29sdW1uLmhlYWRlciA9PT0gY29sLm5hbWUgfHwgY29sdW1uLmlkID09PSBjb2wubmFtZSxcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hpbmdDb2wpIHtcbiAgICAgICAgdXBkYXRlZENvbHVtbkRlZi5wdXNoKG1hdGNoaW5nQ29sKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudmlzaWJsZUNvbHVtbkRlZiA9IFsuLi51cGRhdGVkQ29sdW1uRGVmXTtcbiAgfVxuXG4gIGV4cG9ydEZpbHRlcnNBbmRTb3J0cyA9IGFzeW5jIChwYWdlU3RhdGU6IHtcbiAgICBza2lwOiBudW1iZXI7XG4gICAgbGltaXQ6IG51bWJlcjtcbiAgfSkgPT4ge1xuICAgIHZhciBwYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSB0aGlzLmN1cnJlbnRGaWx0ZXJzLm1hcCgoeCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOlxuICAgICAgICAgIFRpY2tldFByb3BlcnR5TWFwW1xuICAgICAgICAgICAgeC5uYW1lLnNwbGl0KCcgJykuam9pbignJykgYXMga2V5b2YgdHlwZW9mIFRpY2tldFByb3BlcnR5TWFwXG4gICAgICAgICAgXSxcbiAgICAgICAgRW50aXR5VmFsdWU6IHgudmFsdWUsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246XG4gICAgICAgICAgeC5jb25kaXRpb24gJiYgT2JqZWN0LmtleXMoRmlsdGVyVHlwZXMpLmluY2x1ZGVzKHguY29uZGl0aW9uKVxuICAgICAgICAgICAgPyAoRmlsdGVyVHlwZXNbXG4gICAgICAgICAgICAgICAgeC5jb25kaXRpb24gYXMga2V5b2YgdHlwZW9mIEZpbHRlclR5cGVzXG4gICAgICAgICAgICAgIF0gYXMgdW5rbm93biBhcyBTZWFyY2hQcm9wZXJ0eVNpZ24pXG4gICAgICAgICAgICA6IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgICAgVHlwZTpcbiAgICAgICAgICB4Lm5hbWUgPT0gVGlja2V0UHJvcGVydHlOYW1lLkNyZWF0ZWRBdCB8fFxuICAgICAgICAgIHgubmFtZSA9PSBUaWNrZXRQcm9wZXJ0eU5hbWUuVXBkYXRlZEF0XG4gICAgICAgICAgICA/IFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlLkRhdGVcbiAgICAgICAgICAgIDogU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuU3RyaW5nLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICAvLyBwYXlsb2FkLnB1c2goe1xuICAgIC8vICAgUHJvcGVydHlOYW1lOiAnQVBJS2V5JyxcbiAgICAvLyAgIEVudGl0eVZhbHVlOiB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5BUElLZXksXG4gICAgLy8gICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgIC8vICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vIH0pO1xuICAgIGZvciAobGV0IHNvcnQgb2YgdGhpcy5jdXJyZW50U29ydHMpIHtcbiAgICAgIHBheWxvYWQucHVzaCh7XG4gICAgICAgIFByb3BlcnR5TmFtZTpcbiAgICAgICAgICBUaWNrZXRQcm9wZXJ0eU1hcFtcbiAgICAgICAgICAgIHNvcnQubmFtZS5zcGxpdCgnICcpLmpvaW4oJycpIGFzIGtleW9mIHR5cGVvZiBUaWNrZXRQcm9wZXJ0eU1hcFxuICAgICAgICAgIF0sXG4gICAgICAgIEVudGl0eVZhbHVlOiAnJyxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBTb3J0OlxuICAgICAgICAgIHNvcnQudmFsdWUudG9Mb3dlckNhc2UoKSA9PSBTb3J0RGlyZWN0aW9uLkFzYy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICA/IFNvcnREaXJlY3Rpb24uQXNjXG4gICAgICAgICAgICA6IHNvcnQudmFsdWUudG9Mb3dlckNhc2UoKSA9PSBTb3J0RGlyZWN0aW9uLkRlc2MudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICA/IFNvcnREaXJlY3Rpb24uRGVzY1xuICAgICAgICAgICAgICA6IFNvcnREaXJlY3Rpb24uTm9uZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IFtdO1xuXG4gICAgLy8gaWYgKHRoaXMuYWN0aXZlQXBwKSB7XG4gICAgLy8gICBwYXlsb2FkLnB1c2goe1xuICAgIC8vICAgICBQcm9wZXJ0eU5hbWU6ICdBcHAnLFxuICAgIC8vICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVBcHAuQ29kZSxcbiAgICAvLyAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAvLyAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vICAgfSk7XG4gICAgLy8gICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgIC8vICAgICBQcm9wZXJ0eU5hbWU6ICdBcHAnLFxuICAgIC8vICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVBcHAuQ29kZSxcbiAgICAvLyAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAvLyAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vICAgfSk7XG4gICAgLy8gfVxuXG4gICAgY29uc3Qgc2VhcmNoVGVybUV4aXN0cyA9IHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoc2VhcmNoVGVybUV4aXN0cykge1xuICAgICAgT2JqZWN0LnZhbHVlcyhUaWNrZXRQcm9wZXJ0eU1hcCkuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgc2VhcmNoUGF5bG9hZC5wdXNoKHtcbiAgICAgICAgICBQcm9wZXJ0eU5hbWU6IHByb3BlcnR5LFxuICAgICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKSxcbiAgICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuT3IsXG4gICAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkxJS0UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlVGVuYW50KSB7XG4gICAgICBwYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUZW5hbnRJZCcsXG4gICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZVRlbmFudCxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSk7XG4gICAgICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUZW5hbnRJZCcsXG4gICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZVRlbmFudCxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgdmlld0FsbDogYm9vbGVhbiA9XG4gICAgICB0aGlzLnBlcm1pc3Npb25Db25maWc/LkFjdGlvbnNbJ1ZpZXdBbGxUaWNrZXRzJ10gfHwgZmFsc2U7XG5cbiAgICBpZiAoIXZpZXdBbGwpIHtcbiAgICAgIHBheWxvYWQucHVzaCh7XG4gICAgICAgIFByb3BlcnR5TmFtZTogJ1RhZycsXG4gICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZVVzZXIgfHwgJycsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgIH0pO1xuICAgICAgc2VhcmNoUGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnVGFnJyxcbiAgICAgICAgRW50aXR5VmFsdWU6IHRoaXMuYWN0aXZlVXNlciB8fCAnJyxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gc2VhcmNoVGVybUV4aXN0c1xuICAgICAgPyBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgICAgIGBUaWNrZXQvU2VhcmNoVGlja2V0LyR7cGFnZVN0YXRlLnNraXB9LyR7cGFnZVN0YXRlLmxpbWl0fWAsXG4gICAgICAgICAgc2VhcmNoUGF5bG9hZCxcbiAgICAgICAgICB0aGlzLm92ZXJyaWRlVG9rZW4gfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICAgICAgKVxuICAgICAgOiBwYXlsb2FkLmxlbmd0aCA9PSAwXG4gICAgICAgID8gYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0KFxuICAgICAgICAgICAgYFRpY2tldC9HZXRUaWNrZXQvJHtwYWdlU3RhdGUuc2tpcH0vJHtwYWdlU3RhdGUubGltaXR9YCxcbiAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVUb2tlbiB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAgICAgKVxuICAgICAgICA6IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgICAgICBgVGlja2V0L1NlYXJjaFRpY2tldC8ke3BhZ2VTdGF0ZS5za2lwfS8ke3BhZ2VTdGF0ZS5saW1pdH1gLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVUb2tlbiB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAgICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXMgYXMgUGFnZWRSZXN1bHQ8VGlja2V0PikuUmVzdWx0O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH07XG4gIGFzeW5jIHVwZGF0ZUZpbHRlcnNBbmRTb3J0cyhpc1NlYXJjaDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKCFpc1NlYXJjaCkge1xuICAgICAgdGhpcy5kYXRhVmlldy5vbkNsZWFyU2VhcmNoKCk7XG4gICAgICB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtID0gJyc7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICBjb25zdCBjbGlja0V2ZW50ID0gbmV3IE1vdXNlRXZlbnQoJ2NsaWNrJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICAgICAgICB2aWV3OiB3aW5kb3csXG4gICAgICB9KTtcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY2xpY2tFdmVudCk7XG4gICAgfVxuICAgIHZhciBwYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSB0aGlzLmN1cnJlbnRGaWx0ZXJzLm1hcCgoeCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOlxuICAgICAgICAgIFRpY2tldFByb3BlcnR5TWFwW1xuICAgICAgICAgICAgeC5uYW1lLnNwbGl0KCcgJykuam9pbignJykgYXMga2V5b2YgdHlwZW9mIFRpY2tldFByb3BlcnR5TWFwXG4gICAgICAgICAgXSxcbiAgICAgICAgRW50aXR5VmFsdWU6IHgudmFsdWUsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246XG4gICAgICAgICAgeC5jb25kaXRpb24gJiYgT2JqZWN0LmtleXMoRmlsdGVyVHlwZXMpLmluY2x1ZGVzKHguY29uZGl0aW9uKVxuICAgICAgICAgICAgPyAoRmlsdGVyVHlwZXNbXG4gICAgICAgICAgICAgICAgeC5jb25kaXRpb24gYXMga2V5b2YgdHlwZW9mIEZpbHRlclR5cGVzXG4gICAgICAgICAgICAgIF0gYXMgdW5rbm93biBhcyBTZWFyY2hQcm9wZXJ0eVNpZ24pXG4gICAgICAgICAgICA6IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgICAgVHlwZTpcbiAgICAgICAgICB4Lm5hbWUgPT0gVGlja2V0UHJvcGVydHlOYW1lLkNyZWF0ZWRBdCB8fFxuICAgICAgICAgIHgubmFtZSA9PSBUaWNrZXRQcm9wZXJ0eU5hbWUuVXBkYXRlZEF0XG4gICAgICAgICAgICA/IFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlLkRhdGVcbiAgICAgICAgICAgIDogU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuU3RyaW5nLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICAvLyBwYXlsb2FkLnB1c2goe1xuICAgIC8vICAgUHJvcGVydHlOYW1lOiAnQVBJS2V5JyxcbiAgICAvLyAgIEVudGl0eVZhbHVlOiB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5BUElLZXksXG4gICAgLy8gICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgIC8vICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vIH0pO1xuICAgIGZvciAobGV0IHNvcnQgb2YgdGhpcy5jdXJyZW50U29ydHMpIHtcbiAgICAgIHBheWxvYWQucHVzaCh7XG4gICAgICAgIFByb3BlcnR5TmFtZTpcbiAgICAgICAgICBUaWNrZXRQcm9wZXJ0eU1hcFtcbiAgICAgICAgICAgIHNvcnQubmFtZS5zcGxpdCgnICcpLmpvaW4oJycpIGFzIGtleW9mIHR5cGVvZiBUaWNrZXRQcm9wZXJ0eU1hcFxuICAgICAgICAgIF0sXG4gICAgICAgIEVudGl0eVZhbHVlOiAnJyxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBTb3J0OlxuICAgICAgICAgIHNvcnQudmFsdWUudG9Mb3dlckNhc2UoKSA9PSBTb3J0RGlyZWN0aW9uLkFzYy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICA/IFNvcnREaXJlY3Rpb24uQXNjXG4gICAgICAgICAgICA6IHNvcnQudmFsdWUudG9Mb3dlckNhc2UoKSA9PSBTb3J0RGlyZWN0aW9uLkRlc2MudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICA/IFNvcnREaXJlY3Rpb24uRGVzY1xuICAgICAgICAgICAgICA6IFNvcnREaXJlY3Rpb24uTm9uZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBzZWFyY2hQYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSBbXTtcblxuICAgIC8vIGlmICh0aGlzLmFjdGl2ZUFwcCkge1xuICAgIC8vICAgcGF5bG9hZC5wdXNoKHtcbiAgICAvLyAgICAgUHJvcGVydHlOYW1lOiAnQXBwJyxcbiAgICAvLyAgICAgRW50aXR5VmFsdWU6IHRoaXMuYWN0aXZlQXBwLkNvZGUsXG4gICAgLy8gICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgLy8gICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAvLyAgIH0pO1xuICAgIC8vICAgc2VhcmNoUGF5bG9hZC5wdXNoKHtcbiAgICAvLyAgICAgUHJvcGVydHlOYW1lOiAnQXBwJyxcbiAgICAvLyAgICAgRW50aXR5VmFsdWU6IHRoaXMuYWN0aXZlQXBwLkNvZGUsXG4gICAgLy8gICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgLy8gICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAvLyAgIH0pO1xuICAgIC8vIH1cblxuICAgIGNvbnN0IHNlYXJjaFRlcm1FeGlzdHMgPSB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKS5sZW5ndGggPiAwO1xuXG4gICAgaWYgKHNlYXJjaFRlcm1FeGlzdHMpIHtcbiAgICAgIE9iamVjdC52YWx1ZXMoVGlja2V0UHJvcGVydHlNYXApLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG4gICAgICAgIHNlYXJjaFBheWxvYWQucHVzaCh7XG4gICAgICAgICAgUHJvcGVydHlOYW1lOiBwcm9wZXJ0eSxcbiAgICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5jdXJyZW50U2VhcmNoVGVybS50cmltKCksXG4gICAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLk9yLFxuICAgICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5MSUtFLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFjdGl2ZVRlbmFudCkge1xuICAgICAgcGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnVGVuYW50SWQnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVUZW5hbnQsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgIH0pO1xuICAgICAgc2VhcmNoUGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnVGVuYW50SWQnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVUZW5hbnQsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZXdBbGw6IGJvb2xlYW4gPVxuICAgICAgdGhpcy5wZXJtaXNzaW9uQ29uZmlnPy5BY3Rpb25zWydWaWV3QWxsVGlja2V0cyddIHx8IGZhbHNlO1xuXG4gICAgaWYgKCF2aWV3QWxsKSB7XG4gICAgICBwYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUYWcnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVVc2VyIHx8ICcnLFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICB9KTtcbiAgICAgIHNlYXJjaFBheWxvYWQucHVzaCh7XG4gICAgICAgIFByb3BlcnR5TmFtZTogJ1RhZycsXG4gICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZVVzZXIgfHwgJycsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IHNlYXJjaFRlcm1FeGlzdHNcbiAgICAgID8gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgICAgICBgVGlja2V0L1NlYXJjaFRpY2tldC8wLyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICAgIHNlYXJjaFBheWxvYWQsXG4gICAgICAgICAgdGhpcy5vdmVycmlkZVRva2VuIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAgIClcbiAgICAgIDogcGF5bG9hZC5sZW5ndGggPT0gMFxuICAgICAgICA/IGF3YWl0IHRoaXMuc2VydmVyLmdldChcbiAgICAgICAgICAgIGBUaWNrZXQvR2V0VGlja2V0LzAvJHt0aGlzLnBhZ2VTaXplfWAsXG4gICAgICAgICAgICB0aGlzLm92ZXJyaWRlVG9rZW4gfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJLFxuICAgICAgICAgIClcbiAgICAgICAgOiBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgICAgICAgYFRpY2tldC9TZWFyY2hUaWNrZXQvMC8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgICB0aGlzLm92ZXJyaWRlVG9rZW4gfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJLFxuICAgICAgICAgICk7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJzID0gW107XG4gICAgICB0aGlzLmN1cnJlbnRTb3J0cyA9IFtdO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYWdlU3RhdGUgPSByZXMgYXMgUGFnZWRSZXN1bHQ8VGlja2V0PjtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzIGFzIFBhZ2VkUmVzdWx0PFRpY2tldD4pLlJlc3VsdDtcbiAgICAgIHRoaXMudGlja2V0cyA9IHJlc3VsdC5tYXAoKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi54LFxuICAgICAgICAgIElkOiB4LkNvZGUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgbG9hZE1vcmVGaWx0ZXJzQW5kU29ydHMoKTogUHJvbWlzZTxQYWdlZFJlc3VsdDxUaWNrZXQ+IHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLnBhZ2VTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSB0aGlzLmN1cnJlbnRGaWx0ZXJzLm1hcCgoeCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOlxuICAgICAgICAgIFRpY2tldFByb3BlcnR5TWFwW1xuICAgICAgICAgICAgeC5uYW1lLnNwbGl0KCcgJykuam9pbignJykgYXMga2V5b2YgdHlwZW9mIFRpY2tldFByb3BlcnR5TWFwXG4gICAgICAgICAgXSxcbiAgICAgICAgRW50aXR5VmFsdWU6IHgudmFsdWUsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246XG4gICAgICAgICAgeC5jb25kaXRpb24gJiYgT2JqZWN0LmtleXMoRmlsdGVyVHlwZXMpLmluY2x1ZGVzKHguY29uZGl0aW9uKVxuICAgICAgICAgICAgPyAoRmlsdGVyVHlwZXNbXG4gICAgICAgICAgICAgICAgeC5jb25kaXRpb24gYXMga2V5b2YgdHlwZW9mIEZpbHRlclR5cGVzXG4gICAgICAgICAgICAgIF0gYXMgdW5rbm93biBhcyBTZWFyY2hQcm9wZXJ0eVNpZ24pXG4gICAgICAgICAgICA6IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgICAgVHlwZTpcbiAgICAgICAgICB4Lm5hbWUgPT0gVGlja2V0UHJvcGVydHlOYW1lLkNyZWF0ZWRBdCB8fFxuICAgICAgICAgIHgubmFtZSA9PSBUaWNrZXRQcm9wZXJ0eU5hbWUuVXBkYXRlZEF0XG4gICAgICAgICAgICA/IFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlLkRhdGVcbiAgICAgICAgICAgIDogU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuU3RyaW5nLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBmb3IgKGxldCBzb3J0IG9mIHRoaXMuY3VycmVudFNvcnRzKSB7XG4gICAgICBwYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6XG4gICAgICAgICAgVGlja2V0UHJvcGVydHlNYXBbXG4gICAgICAgICAgICBzb3J0Lm5hbWUuc3BsaXQoJyAnKS5qb2luKCcnKSBhcyBrZXlvZiB0eXBlb2YgVGlja2V0UHJvcGVydHlNYXBcbiAgICAgICAgICBdLFxuICAgICAgICBFbnRpdHlWYWx1ZTogJycsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgICAgU29ydDpcbiAgICAgICAgICBzb3J0LnZhbHVlLnRvTG93ZXJDYXNlKCkgPT0gU29ydERpcmVjdGlvbi5Bc2MudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgPyBTb3J0RGlyZWN0aW9uLkFzY1xuICAgICAgICAgICAgOiBzb3J0LnZhbHVlLnRvTG93ZXJDYXNlKCkgPT0gU29ydERpcmVjdGlvbi5EZXNjLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgPyBTb3J0RGlyZWN0aW9uLkRlc2NcbiAgICAgICAgICAgICAgOiBTb3J0RGlyZWN0aW9uLk5vbmUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoUGF5bG9hZDogU2VhcmNoUHJvcGVydHlWYWx1ZVtdID0gW107XG5cbiAgICAvLyBpZiAodGhpcy5hY3RpdmVBcHApIHtcbiAgICAvLyAgIHBheWxvYWQucHVzaCh7XG4gICAgLy8gICAgIFByb3BlcnR5TmFtZTogJ0FwcCcsXG4gICAgLy8gICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZUFwcC5Db2RlLFxuICAgIC8vICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgIC8vICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHNlYXJjaFBheWxvYWQucHVzaCh7XG4gICAgLy8gICAgIFByb3BlcnR5TmFtZTogJ0FwcCcsXG4gICAgLy8gICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZUFwcC5Db2RlLFxuICAgIC8vICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgIC8vICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgLy8gICB9KTtcbiAgICAvLyB9XG5cbiAgICBjb25zdCBzZWFyY2hUZXJtRXhpc3RzID0gdGhpcy5jdXJyZW50U2VhcmNoVGVybS50cmltKCkubGVuZ3RoID4gMDtcblxuICAgIGlmIChzZWFyY2hUZXJtRXhpc3RzKSB7XG4gICAgICBPYmplY3QudmFsdWVzKFRpY2tldFByb3BlcnR5TWFwKS5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xuICAgICAgICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgICAgICAgIFByb3BlcnR5TmFtZTogcHJvcGVydHksXG4gICAgICAgICAgRW50aXR5VmFsdWU6IHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLFxuICAgICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5PcixcbiAgICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uTElLRSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3RpdmVUZW5hbnQpIHtcbiAgICAgIHBheWxvYWQucHVzaCh7XG4gICAgICAgIFByb3BlcnR5TmFtZTogJ1RlbmFudElkJyxcbiAgICAgICAgRW50aXR5VmFsdWU6IHRoaXMuYWN0aXZlVGVuYW50LFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICB9KTtcbiAgICAgIHNlYXJjaFBheWxvYWQucHVzaCh7XG4gICAgICAgIFByb3BlcnR5TmFtZTogJ1RlbmFudElkJyxcbiAgICAgICAgRW50aXR5VmFsdWU6IHRoaXMuYWN0aXZlVGVuYW50LFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3QWxsOiBib29sZWFuID1cbiAgICAgIHRoaXMucGVybWlzc2lvbkNvbmZpZz8uQWN0aW9uc1snVmlld0FsbFRpY2tldHMnXSB8fCBmYWxzZTtcblxuICAgIGlmICghdmlld0FsbCkge1xuICAgICAgcGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnVGFnJyxcbiAgICAgICAgRW50aXR5VmFsdWU6IHRoaXMuYWN0aXZlVXNlciB8fCAnJyxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSk7XG4gICAgICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUYWcnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVVc2VyIHx8ICcnLFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcbiAgICBjb25zdCByZXMgPSBzZWFyY2hUZXJtRXhpc3RzXG4gICAgICA/IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgICAgYFRpY2tldC9TZWFyY2hUaWNrZXQvMC8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgICAgICBzZWFyY2hQYXlsb2FkLFxuICAgICAgICAgIHRoaXMub3ZlcnJpZGVUb2tlbiB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJLFxuICAgICAgICApXG4gICAgICA6IHBheWxvYWQubGVuZ3RoID09IDBcbiAgICAgICAgPyBhd2FpdCB0aGlzLnNlcnZlci5nZXQoXG4gICAgICAgICAgICBgVGlja2V0L0dldFRpY2tldC8ke3RoaXMucGFnZVN0YXRlLlNraXB9LyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICAgICAgdGhpcy5vdmVycmlkZVRva2VuIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICAgICAgICApXG4gICAgICAgIDogYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgICAgICAgIGBUaWNrZXQvU2VhcmNoVGlja2V0LyR7dGhpcy5wYWdlU3RhdGUuU2tpcH0vJHt0aGlzLnBhZ2VTaXplfWAsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgdGhpcy5vdmVycmlkZVRva2VuIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICAgICAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlc3VsdCA9IHJlcyBhcyBQYWdlZFJlc3VsdDxUaWNrZXQ+O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICBvbkZpbHRlclVwZGF0ZWQodXBkYXRlZEZpbHRlcnM6IElEYXRhRmlsdGVyW10gfCBzdHJpbmcpIHtcbiAgICAvLyBFbnN1cmUgdXBkYXRlZEZpbHRlcnMgaXMgYW4gYXJyYXlcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh1cGRhdGVkRmlsdGVycykpIHtcbiAgICAgIHRoaXMuY3VycmVudEZpbHRlcnMgPSB1cGRhdGVkRmlsdGVycztcbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyc0FuZFNvcnRzKCk7XG4gICAgfVxuICB9XG4gIG9uU29ydFVwZGF0ZWQodXBkYXRlZFNvcnRzOiBJRGF0YUZpbHRlcltdKSB7XG4gICAgdGhpcy5jdXJyZW50U29ydHMgPSB1cGRhdGVkU29ydHM7XG4gICAgdGhpcy51cGRhdGVGaWx0ZXJzQW5kU29ydHMoKTtcbiAgfVxuXG4gIGhhbmRsZVNlYXJjaChldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9KSB7XG4gICAgdGhpcy5zZWFyY2hUZXJtJC5uZXh0KGV2ZW50LnZhbHVlKTtcbiAgfVxuXG4gIGhhbmRsZUV4cG9ydChleHBvcnRlZERhdGE6IFBhcnRpYWw8YW55PltdKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ0V4cG9ydGVkIGRhdGE6JywgZXhwb3J0ZWREYXRhKTtcbiAgICB0aGlzLmRvd25sb2FkQ1NWKGV4cG9ydGVkRGF0YSk7XG4gIH1cblxuICBpc0ZpbHRlcmVkU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDAgfHwgdGhpcy5jdXJyZW50RmlsdGVycy5sZW5ndGggPiAwXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZG93bmxvYWRDU1YoZGF0YTogUGFydGlhbDxhbnk+W10pIHtcbiAgICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmtleXMoZGF0YVswXSk7XG4gICAgY29uc3QgY3N2Q29udGVudCA9IFtcbiAgICAgIGhlYWRlcnMuam9pbignLCcpLFxuICAgICAgLi4uZGF0YS5tYXAoKHJvdykgPT4gaGVhZGVycy5tYXAoKGhlYWRlcikgPT4gcm93W2hlYWRlcl0pLmpvaW4oJywnKSksXG4gICAgXS5qb2luKCdcXG4nKTtcblxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbY3N2Q29udGVudF0sIHsgdHlwZTogJ3RleHQvY3N2O2NoYXJzZXQ9dXRmLTg7JyB9KTtcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGlmIChsaW5rLmRvd25sb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIHVybCk7XG4gICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCAnZXhwb3J0LmNzdicpO1xuICAgICAgbGluay5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuICAgICAgbGluay5jbGljaygpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcbiAgICB9XG4gIH1cblxuICAvLyBnZXQgZGVmYXVsdENvbXBhbnkoKTogc3RyaW5nIHtcbiAgLy8gICBjb25zdCBjaGVjayA9IHRoaXMuc3RvcmUuZ2V0KEFwcEtleS5VU0VSKTtcbiAgLy8gICBpZiAoIWNoZWNrKSB7XG4gIC8vICAgICByZXR1cm4gJyc7XG4gIC8vICAgfVxuICAvLyAgIGNvbnN0IHVzZXI6IFVzZXIgPSAodGhpcy5zdG9yZS5nZXQoQXBwS2V5LlVTRVIpIGFzIHsgVXNlcjogVXNlciB9KS5Vc2VyO1xuICAvLyAgIHJldHVybiB1c2VyLkRlZmF1bHRDb21wYW55IHx8ICcnO1xuICAvLyB9XG5cbiAgb25Db21wbGV0ZShldmVudDogYW55W10pIHtcbiAgICB2YXIgZGVmYXVsdEl0ZW06IFRpY2tldCA9IHtcbiAgICAgIFRpdGxlOiAnJyxcbiAgICAgIERlc2NyaXB0aW9uOiAnJyxcbiAgICAgIEFwcDogdGhpcy5hY3RpdmVBcHAgPyB0aGlzLmFjdGl2ZUFwcCA6ICcnLFxuICAgICAgU3RhdHVzOiBUaWNrZXRTdGF0dXMuUGVuZGluZyxcbiAgICAgIENvbXBhbnk6IHRoaXMuZGVmYXVsdENvbXBhbnksXG4gICAgICBNZXNzYWdlczogW10sXG4gICAgICBGaWxlRGF0YTogW10sXG4gICAgICBGaWxlVXJsczogW10sXG4gICAgICBJZDogdGhpcy50aWNrZXRzLmxlbmd0aC50b1N0cmluZygpLFxuICAgICAgaWQ6ICcnLFxuICAgICAgQ29kZTogJycsXG4gICAgICBUZW5hbnRJZDogdGhpcy5hY3RpdmVUZW5hbnQgPyB0aGlzLmFjdGl2ZVRlbmFudCA6ICcnLFxuICAgICAgU2VydmljZU5hbWU6ICcnLFxuICAgICAgQ3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgVXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICBUYWc6IHRoaXMuYWN0aXZlVXNlciB8fCB1bmRlZmluZWQsXG4gICAgfTtcbiAgICB0aGlzLmltcG9ydFNlcnZpY2Uub25Db21wbGV0ZShcbiAgICAgIGV2ZW50LFxuICAgICAgZGVmYXVsdEl0ZW0sXG4gICAgICAnVGlja2V0L1NhdmVUaWNrZXQnLFxuICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJLFxuICAgICAgJ1RpY2tldCcsXG4gICAgICAoaXRlbXM6IFRpY2tldFtdKSA9PiB7XG4gICAgICAgIHRoaXMudGlja2V0cyA9IHRoaXMudGlja2V0cy5jb25jYXQoaXRlbXMpO1xuICAgICAgfSxcbiAgICAgIHRoaXMucGFnZVN0YXRlLFxuICAgICk7XG4gIH1cblxuICB0YWJsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFRpY2tldD4oKTtcblxuICBjYWNoZUl0ZW0oaXRlbTogVGlja2V0KSB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBpdGVtLklkO1xuICAgIHRoaXMudGFibGVDYWNoZS5zZXQoY2FjaGVLZXksIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaXRlbSkpKTtcbiAgfVxuXG4gIHJlc3RvcmVDYWNoZShpdGVtOiBUaWNrZXQpIHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGl0ZW0uSWQ7XG4gICAgY29uc3QgaXRlbUNhY2hlID0gdGhpcy50YWJsZUNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgaWYgKGl0ZW1DYWNoZSkge1xuICAgICAgaXRlbS5EZXNjcmlwdGlvbiA9IGl0ZW1DYWNoZS5EZXNjcmlwdGlvbjtcbiAgICAgIGl0ZW0uUHJpb3JpdHkgPSBpdGVtQ2FjaGUuUHJpb3JpdHk7XG4gICAgICBpdGVtLlN0YXR1cyA9IGl0ZW1DYWNoZS5TdGF0dXM7XG4gICAgfVxuICAgIHRoaXMudGFibGVDYWNoZS5kZWxldGUoY2FjaGVLZXkpO1xuICB9XG5cbiAgLy8gb25BcHBTZWxlY3RlZChhcHA6IEFwcGxpY2F0aW9uIHwgbnVsbCkge1xuICAvLyAgIHRoaXMuYWN0aXZlQXBwID0gYXBwO1xuICAvLyAgIC8vIGlmIChhcHApIHtcbiAgLy8gICAvLyAgIGNvbnN0IHRlbmFudHMgPSBhd2FpdCB0aGlzLnNlcnZpY2UuZ2V0VGVuYW50c0J5QXBwKGFwcC5Db2RlKTtcbiAgLy8gICAvLyAgIGlmICh0ZW5hbnRzKSB7XG4gIC8vICAgLy8gICAgIHRoaXMudGVuYW50cyA9IHRlbmFudHM7XG4gIC8vICAgLy8gICB9XG4gIC8vICAgLy8gfVxuICAvLyB9XG5cbiAgb25BcHBMaXN0VXBkYXRlZChhcHBzOiBBcHBsaWNhdGlvbltdKSB7XG4gICAgdGhpcy5hcHBzID0gYXBwcztcbiAgfVxuXG4gIG9uVGVuYW50TGlzdFVwZGF0ZWQodGVuYW50czogVGVuYW50W10pIHtcbiAgICB0aGlzLnRlbmFudHMgPSB0ZW5hbnRzO1xuICB9XG5cbiAgZ2V0TG9nb1VybCh1cmw6IHN0cmluZykge1xuICAgIHJldHVybiBgJHt0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5BdXRoZW50aWNhdGlvbkFQSX0vJHt1cmx9YDtcbiAgfVxuXG4gIGFkZE5ld1RpY2tldCgpIHtcbiAgICB0aGlzLnNlbGVjdGVkVGlja2V0ID0gbnVsbDtcbiAgICB0aGlzLnNob3dUaWNrZXRGb3JtID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIGVkaXRBcHAoYXBwOiBBcHBsaWNhdGlvbikge1xuICAvLyAgIHRoaXMuc2VsZWN0ZWRBcHAgPSBhcHA7XG4gIC8vICAgdGhpcy5zaG93QXBwRm9ybSA9IHRydWU7XG4gIC8vIH1cblxuICAvLyBlZGl0VGVuYW50KHRlbmFudDogVGVuYW50KSB7XG4gIC8vICAgdGhpcy5zZWxlY3RlZFRlbmFudCA9IHRlbmFudDtcbiAgLy8gICB0aGlzLnNob3dUZW5hbnRGb3JtID0gdHJ1ZTtcbiAgLy8gfVxuXG4gIGVkaXRUaWNrZXQodGlja2V0OiBUaWNrZXQpIHtcbiAgICB0aGlzLnNlbGVjdGVkVGlja2V0ID0gdGlja2V0O1xuICAgIHRoaXMuc2hvd1RpY2tldEZvcm0gPSB0cnVlO1xuICB9XG5cbiAgLy8gb25BcHBNb2RhbENsb3NlKCkge1xuICAvLyAgIHRoaXMuc2hvd0FwcEZvcm0gPSBmYWxzZTtcbiAgLy8gICB0aGlzLnNlbGVjdGVkQXBwID0gbnVsbDtcbiAgLy8gfVxuXG4gIC8vIG9uVGVuYW50TW9kYWxDbG9zZSgpIHtcbiAgLy8gICB0aGlzLnNob3dUZW5hbnRGb3JtID0gZmFsc2U7XG4gIC8vICAgdGhpcy5zZWxlY3RlZFRlbmFudCA9IG51bGw7XG4gIC8vIH1cblxuICBvblRpY2tldE1vZGFsQ2xvc2UoKSB7XG4gICAgdGhpcy5zaG93VGlja2V0Rm9ybSA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWRUaWNrZXQgPSBudWxsO1xuICB9XG5cbiAgLy8gb25BcHBTYXZlKGFwcDogQXBwbGljYXRpb24pIHtcbiAgLy8gICBjb25zdCBpZHggPSB0aGlzLmFwcHMuZmluZEluZGV4KCh4KSA9PiB4LkNvZGUgPT0gYXBwLkNvZGUpO1xuXG4gIC8vICAgaWYgKGFwcC5Db2RlLnRyaW0oKS5sZW5ndGggPiAwICYmIGlkeCA+IC0xKSB7XG4gIC8vICAgICB0aGlzLmFwcHNbaWR4XS5OYW1lID0gYXBwLk5hbWU7XG4gIC8vICAgICB0aGlzLmFwcHNbaWR4XS5EZXNjcmlwdGlvbiA9IGFwcC5EZXNjcmlwdGlvbjtcbiAgLy8gICAgIHRoaXMuYXBwc1tpZHhdLkRhdGFTdGF0ZSA9IGFwcC5EYXRhU3RhdGU7XG4gIC8vICAgfSBlbHNlIHtcbiAgLy8gICAgIHRoaXMuYXBwcy5wdXNoKGFwcCk7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgLy8gb25UZW5hbnRTYXZlKHRlbmFudDogVGVuYW50KSB7XG4gIC8vICAgY29uc3QgaWR4ID0gdGhpcy50ZW5hbnRzLmZpbmRJbmRleCgoeCkgPT4geC5Db2RlID09IHRlbmFudC5Db2RlKTtcblxuICAvLyAgIGlmICh0ZW5hbnQuQ29kZS50cmltKCkubGVuZ3RoID4gMCAmJiBpZHggPiAtMSkge1xuICAvLyAgICAgdGhpcy50ZW5hbnRzW2lkeF0uTmFtZSA9IHRlbmFudC5OYW1lO1xuICAvLyAgICAgdGhpcy50ZW5hbnRzW2lkeF0uRGVzY3JpcHRpb24gPSB0ZW5hbnQuRGVzY3JpcHRpb247XG4gIC8vICAgICB0aGlzLnRlbmFudHNbaWR4XS5EYXRhU3RhdGUgPSB0ZW5hbnQuRGF0YVN0YXRlO1xuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICB0aGlzLnRlbmFudHMucHVzaCh0ZW5hbnQpO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIG9uVGlja2V0U2F2ZSh0aWNrZXQ6IFRpY2tldCkge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMudGlja2V0cy5maW5kSW5kZXgoKHgpID0+IHguQ29kZSA9PSB0aWNrZXQuQ29kZSk7XG5cbiAgICAvLyBjb25zb2xlLmxvZyh7IFRpY2tldHM6IHRoaXMudGlja2V0cywgVGlja2V0OiB0aWNrZXQsIGlkeDogaWR4IH0pO1xuICAgIGlmICh0aWNrZXQuQ29kZS50cmltKCkubGVuZ3RoID4gMCAmJiBpZHggPiAtMSkge1xuICAgICAgdGhpcy50aWNrZXRzW2lkeF0uVGl0bGUgPSB0aWNrZXQuVGl0bGU7XG4gICAgICB0aGlzLnRpY2tldHNbaWR4XS5EZXNjcmlwdGlvbiA9IHRpY2tldC5EZXNjcmlwdGlvbjtcbiAgICAgIC8vICAgdGhpcy50aWNrZXRzW2lkeF0uQ3VycmVudEhhbmRsZXIgPSB0aWNrZXQuQ3VycmVudEhhbmRsZXI7XG4gICAgICB0aGlzLnRpY2tldHNbaWR4XS5Qcmlvcml0eSA9IHRpY2tldC5Qcmlvcml0eTtcbiAgICAgIHRoaXMudGlja2V0c1tpZHhdLlN0YXR1cyA9IHRpY2tldC5TdGF0dXM7XG4gICAgICB0aGlzLnRpY2tldHNbaWR4XS5GaWxlVXJscyA9IHRpY2tldC5GaWxlVXJscztcbiAgICAgIHRoaXMudGlja2V0c1tpZHhdLkRhdGFTdGF0ZSA9IHRpY2tldC5EYXRhU3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGlja2V0cy51bnNoaWZ0KHRpY2tldCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgfVxuXG4gIHZpZXdUaWNrZXREZXRhaWxzKHRpY2tldDogVGlja2V0KSB7XG4gICAgdGhpcy51dGlsU2VydmljZS5nb1RvUGFnZShgJHt0aGlzLmRldGFpbFBhdGh9YCwgdGlja2V0LkNvZGUpO1xuICB9XG5cbiAgY3NzQ29sb3JUb0hleChjb2xvcjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgY3R4ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCgnMmQnKTtcblxuICAgIGlmICghY3R4KSByZXR1cm4gbnVsbDtcblxuICAgIGN0eC5maWxsU3R5bGUgPSAnIzAwMCc7IC8vIHNldCBhIGtub3duIGNvbG9yXG4gICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yOyAvLyBhc3NpZ24gYW55IENTUy12YWxpZCBjb2xvclxuXG4gICAgY29uc3QgY29tcHV0ZWQgPSBjdHguZmlsbFN0eWxlO1xuICAgIC8vIElmIHRoZSBicm93c2VyIGRvZXMgTk9UIHVuZGVyc3RhbmQgdGhlIHZhbHVlLCBpdCB3b27igJl0IGNoYW5nZSBmcm9tICcjMDAwJ1xuICAgIGlmIChcbiAgICAgIGNvbXB1dGVkLnRvTG93ZXJDYXNlKCkgPT09ICcjMDAwMDAwJyAmJlxuICAgICAgY29sb3IudG9Mb3dlckNhc2UoKSAhPT0gJ2JsYWNrJ1xuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7IC8vIGludmFsaWQgY29sb3IgbmFtZSBvciB1bnN1cHBvcnRlZCB2YWx1ZVxuICAgIH1cblxuICAgIHJldHVybiBjb21wdXRlZC50b1VwcGVyQ2FzZSgpOyAvLyByZXR1cm5zIGhleCBsaWtlICMxRTkwRkZcbiAgfVxuICBzb2Z0ZW5Db2xvcihoZXg6IHN0cmluZywgbGlnaHRlblBlcmNlbnQgPSA1NSwgYWxwaGFQZXJjZW50ID0gNTUpOiBzdHJpbmcge1xuICAgIC8vIFJlbW92ZSAjXG4gICAgaWYgKCFoZXguc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICBjb25zdCBjb252ZXJ0ZWQgPSB0aGlzLmNzc0NvbG9yVG9IZXgoaGV4KTtcbiAgICAgIGlmIChjb252ZXJ0ZWQpIHtcbiAgICAgICAgaGV4ID0gY29udmVydGVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGhleCA9IGhleC5yZXBsYWNlKC9eIy8sICcnKTtcbiAgICBpZiAoaGV4Lmxlbmd0aCA9PT0gMykge1xuICAgICAgLy8gQ29udmVydCBzaG9ydGhhbmQgKCNhYmMg4oaSICNhYWJiY2MpXG4gICAgICBoZXggPSBoZXhcbiAgICAgICAgLnNwbGl0KCcnKVxuICAgICAgICAubWFwKCh4KSA9PiB4ICsgeClcbiAgICAgICAgLmpvaW4oJycpO1xuICAgIH1cblxuICAgIGNvbnN0IG51bSA9IHBhcnNlSW50KGhleCwgMTYpO1xuICAgIGxldCByID0gKG51bSA+PiAxNikgJiAweGZmO1xuICAgIGxldCBnID0gKG51bSA+PiA4KSAmIDB4ZmY7XG4gICAgbGV0IGIgPSBudW0gJiAweGZmO1xuXG4gICAgLy8gTGlnaHRlbiB0b3dhcmQgd2hpdGUgYnkgdGhlIGdpdmVuIHBlcmNlbnRhZ2VcbiAgICByID0gTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHIgKyAoMjU1IC0gcikgKiAobGlnaHRlblBlcmNlbnQgLyAxMDApKSk7XG4gICAgZyA9IE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZChnICsgKDI1NSAtIGcpICogKGxpZ2h0ZW5QZXJjZW50IC8gMTAwKSkpO1xuICAgIGIgPSBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoYiArICgyNTUgLSBiKSAqIChsaWdodGVuUGVyY2VudCAvIDEwMCkpKTtcblxuICAgIC8vIENvbnZlcnQgYWxwaGEgcGVyY2VudCB0byAyLWRpZ2l0IGhleFxuICAgIGNvbnN0IGFscGhhID0gTWF0aC5yb3VuZCgoYWxwaGFQZXJjZW50IC8gMTAwKSAqIDI1NSk7XG4gICAgY29uc3QgYUhleCA9IGFscGhhLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpLnRvVXBwZXJDYXNlKCk7XG5cbiAgICByZXR1cm4gYCMke3IudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykudG9VcHBlckNhc2UoKX0ke2dcbiAgICAgIC50b1N0cmluZygxNilcbiAgICAgIC5wYWRTdGFydCgyLCAnMCcpXG4gICAgICAudG9VcHBlckNhc2UoKX0ke2IudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykudG9VcHBlckNhc2UoKX0ke2FIZXh9YDtcbiAgfVxuXG4gIGlzRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVGlja2V0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUaWNrZXQuU3RhdHVzICE9IHRoaXMucGVuZGluZ1JlZjtcbiAgfVxuXG4gIHRvZ2dsZUNsb3N1cmVEaWFsb2d1ZShpdGVtOiBUaWNrZXQpIHtcbiAgICB0aGlzLmNsb3N1cmVUaWNrZXQgPSBpdGVtO1xuICAgIHRoaXMuc2hvd0Nsb3N1cmVEaWFsb2d1ZSA9ICF0aGlzLnNob3dDbG9zdXJlRGlhbG9ndWU7XG4gIH1cblxuICBvbk1vZGFsT3BlbihldmVudDogYW55KSB7fVxuXG4gIG9uTW9kYWxDbG9zZShldmVudDogYW55KSB7XG4gICAgdGhpcy5jbG9zdXJlUmVhc29uID0gJyc7XG4gICAgdGhpcy5jbG9zdXJlVGlja2V0ID0gbnVsbDtcbiAgICB0aGlzLnNob3dDbG9zdXJlRGlhbG9ndWUgPSBmYWxzZTtcbiAgfVxuXG4gIGNhbkNsb3NlKGl0ZW06IFRpY2tldCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpdGVtLlN0YXR1cyA9PSBUaWNrZXRTdGF0dXMuUGVuZGluZztcbiAgfVxuXG4gIGFzeW5jIGNsb3NlVGlja2V0KCkge1xuICAgIGlmICghdGhpcy5jbG9zdXJlVGlja2V0IHx8ICF0aGlzLmNhbkNsb3NlKHRoaXMuY2xvc3VyZVRpY2tldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jbG9zdXJlUmVhc29uLnRyaW0oKS5sZW5ndGggPT0gMCkge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93SW5mbygnUmVhc29uIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQ6IEtleVZhbHVlUGFyYW0gPSB7XG4gICAgICBLZXk6IHRoaXMuY2xvc3VyZVRpY2tldC5Db2RlLFxuICAgICAgVmFsdWU6IHRoaXMuYWN0aXZlVXNlciB8fCAnJyxcbiAgICAgIE90aGVyOiB0aGlzLmNsb3N1cmVSZWFzb24sXG4gICAgfTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmljZS5jbG9zZVRpY2tldChwYXlsb2FkKTtcbiAgICBpZiAocmVzKSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dTdWNjZXNzKCdUaWNrZXQgY2xvc2VkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgdGhpcy5jbG9zdXJlVGlja2V0LlN0YXR1cyA9IHJlcy5TdGF0dXM7XG4gICAgICB0aGlzLmNsb3N1cmVUaWNrZXQuTGFzdEhhbmRsZXIgPSByZXMuTGFzdEhhbmRsZXI7XG4gICAgICB0aGlzLmNsb3N1cmVUaWNrZXQuRXhlY3V0aW9uVGltZSA9IHJlcy5FeGVjdXRpb25UaW1lO1xuICAgICAgdGhpcy51cGRhdGVUYWJsZSgpO1xuICAgICAgdGhpcy5vbk1vZGFsQ2xvc2UoJycpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImgtZnVsbCBmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgPCEtLSA8YXBwLXRlbmFudC1zZWxlY3RvclxuICAgICAgKG9uQXBwU2VsZWN0ZWQpPVwidGhpcy5vbkFwcFNlbGVjdGVkKCRldmVudClcIlxuICAgICAgKG9uVGVuYW50U2VsZWN0ZWQpPVwib25UZW5hbnRTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgIChvbkFwcHNVcGRhdGVkKT1cInRoaXMub25BcHBMaXN0VXBkYXRlZCgkZXZlbnQpXCJcbiAgICAgIChvblRlbmFudHNVcGRhdGVkKT1cInRoaXMub25UZW5hbnRMaXN0VXBkYXRlZCgkZXZlbnQpXCJcbiAgICA+PC9hcHAtdGVuYW50LXNlbGVjdG9yPiAtLT5cblxuICAgIDxkaXYgY2xhc3M9XCJ0aWNrZXRzLXNlY3Rpb24gZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cInRpY2tldC10YWJsZS1jb250YWluZXJcIj5cbiAgICAgICAgPHZlcmJlbi1kYXRhLXZpZXdcbiAgICAgICAgICAjdmR2XG4gICAgICAgICAgW3ZpZXdTdGF0ZV09XCJ7XG4gICAgICAgICAgICBpc1NlYXJjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzQ29sdW1uOiB0cnVlLFxuICAgICAgICAgICAgaXNGaWx0ZXI6IHRydWUsXG4gICAgICAgICAgICBpc1NvcnQ6IHRydWUsXG4gICAgICAgICAgICBpc0V4cG9ydDogIXBlcm1pc3Npb25Db25maWcgfHwgcGVybWlzc2lvbkNvbmZpZy5BY3Rpb25zWydFeHBvcnQnXSxcbiAgICAgICAgICAgIGlzU2VsZWN0OiB0cnVlLFxuICAgICAgICAgICAgaXNDcmVhdGU6IGZhbHNlLFxuICAgICAgICAgICAgaXNUb2dnbGU6IGZhbHNlLFxuICAgICAgICAgICAgaXNJbXBvcnQ6ICFwZXJtaXNzaW9uQ29uZmlnIHx8IHBlcm1pc3Npb25Db25maWcuQWN0aW9uc1snSW1wb3J0J10sXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgW2J1dHRvbkNsYXNzXT1cIidteS1jdXN0b20tYnV0dG9uLWNsYXNzJ1wiXG4gICAgICAgICAgW2ljb25DbGFzc109XCInbXktaWNvbi1jbGFzcydcIlxuICAgICAgICAgIFthY3RpdmVJY29uQ2xhc3NdPVwiJ215LWFjdGl2ZS1pY29uLWNsYXNzJ1wiXG4gICAgICAgICAgW3NlbGVjdGVkQ29sdW1uQ291bnRdPVwiMFwiXG4gICAgICAgICAgW3NlbGVjdGVkU29ydENvdW50XT1cIjBcIlxuICAgICAgICAgIFtzZWxlY3RlZEZpbHRlclRhYmxlQ291bnRdPVwiMFwiXG4gICAgICAgICAgKHZpZXdDaGFuZ2UpPVwib25WaWV3Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIChvblNlYXJjaENoYW5nZSk9XCJoYW5kbGVTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgW2lzVGFibGVWaWV3XT1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIiB0YWJsZS1jb250ZW50PlxuICAgICAgICAgICAgPGxpYi1kYXRhLXRhYmxlXG4gICAgICAgICAgICAgIFtkYXRhS2V5XT1cIidJZCdcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tdGFibGVcIlxuICAgICAgICAgICAgICAjZHRcbiAgICAgICAgICAgICAgW2RhdGFdPVwidGlja2V0c1wiXG4gICAgICAgICAgICAgIFtjb2x1bW5zXT1cInZpc2libGVDb2x1bW5EZWZcIlxuICAgICAgICAgICAgICBbc3R5bGVDb25maWddPVwic3R5bGVzXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJzZWxlY3RcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICNjZWxsXG4gICAgICAgICAgICAgICAgICBsZXQtaXNTZWxlY3RlZD1cImlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgbGV0LXRvZ2dsZVJvd1NlbGVjdGlvbj1cInRvZ2dsZVJvd1NlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVJvd1NlbGVjdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICNoZWFkZXJcbiAgICAgICAgICAgICAgICAgIGxldC1hbGxSb3dzU2VsZWN0ZWQ9XCJhbGxSb3dzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgbGV0LXNvbWVSb3dzU2VsZWN0ZWQ9XCJzb21lUm93c1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgIGxldC10b2dnbGVBbGxSb3dzPVwidG9nZ2xlQWxsUm93c1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImFsbFJvd3NTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic29tZVJvd3NTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVBbGxSb3dzKClcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJjcmVhdGVkQXRcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAge3sgdmFsdWUgfCBjb21wYW55RGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cInVwZGF0ZWRBdFwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgICB7eyB2YWx1ZSB8IGNvbXBhbnlEYXRlIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgIHt7IHJvdy5UaXRsZSB9fVxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAjY2VsbEVkaXRcbiAgICAgICAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgbGV0LXVwZGF0ZURhdGE9XCJ1cGRhdGVEYXRhXCJcbiAgICAgICAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3aWR0aC1tYXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHZlcmJlbmEtaW5wdXQgWyhuZ01vZGVsKV09XCJyb3cuVGl0bGVcIj48L3ZlcmJlbmEtaW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJkZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAge3sgcm93LkRlc2NyaXB0aW9uIHwgZWxsaXBzZVdvcmQgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgICAgICAgIGxldC11cGRhdGVEYXRhPVwidXBkYXRlRGF0YVwiXG4gICAgICAgICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2lkdGgtbWF4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cuRGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICA+PC92ZXJiZW5hLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJ3aWR0aC1tYXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHZlcmJlbmEtdGV4dGFyZWEgWyhuZ01vZGVsKV09XCJyb3cuRGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPC92ZXJiZW5hLXRleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImN1cnJlbnRIYW5kbGVyXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgICB7eyByb3cuQ3VycmVudEhhbmRsZXIgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJsYXN0SGFuZGxlclwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAge3sgcm93Lkxhc3RIYW5kbGVyIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJwcmlvcml0eVwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIHJvdy5Qcmlvcml0eSAmJiByb3cuUHJpb3JpdHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNMYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdUZW5hbnRQcmlvcml0eSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnQ29sb3InXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogdGlja2V0aW5nQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogb3ZlcnJpZGVUb2tlbiB8fCB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmMgYXMgY29sb3JcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlbnVtLXZhbCByb3VuZGVkLVs4cHhdIGZsZXggZ2FwLTIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJjb2xvciA/IHNvZnRlbkNvbG9yKGNvbG9yKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZW51bS1kb3RcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgICAgICAgIHJvdy5Qcmlvcml0eVxuICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY0xhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJUZW5hbnRQcmlvcml0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aWNrZXRpbmdBUElcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvdmVycmlkZVRva2VuIHx8IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAjY2VsbEVkaXRcbiAgICAgICAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgbGV0LXVwZGF0ZURhdGE9XCJ1cGRhdGVEYXRhXCJcbiAgICAgICAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3aWR0aC1tYXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHZlcmJlbmEtaW5wdXQgWyhuZ01vZGVsKV09XCJyb3cuUHJpb3JpdHlcIj48L3ZlcmJlbmEtaW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cInN0YXR1c1wiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJvdy5TdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVudW0tdmFsIHJvdW5kZWQtWzhweF0gZmxleCBnYXAtMiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIge3tcbiAgICAgICAgICAgICAgICAgICAgICByb3cuU3RhdHVzXG4gICAgICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbnVtLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcm93LlN0YXR1cyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAjY2VsbEVkaXRcbiAgICAgICAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgbGV0LXVwZGF0ZURhdGE9XCJ1cGRhdGVEYXRhXCJcbiAgICAgICAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDx2ZXJiZW4tZHJvcC1kb3duXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFN0YXR1c1wiXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInN0YXR1c09wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy5TdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPC92ZXJiZW4tZHJvcC1kb3duPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwiY2xvc2VcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRoaXMuY2FuQ2xvc2Uocm93KVwiXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidmVyYmVuLXByaW1hcnktYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiJ0Nsb3NlIFRpY2tldCdcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCIhdGhpcy5jYW5DbG9zZShyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNsb3N1cmVEaWFsb2d1ZShyb3cpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDwvdmVyYmVuYS1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJhY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAjY2VsbFxuICAgICAgICAgICAgICAgICAgbGV0LWlzRWRpdGluZz1cImlzRWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgICBsZXQtdG9nZ2xlUm93RWRpdD1cInRvZ2dsZVJvd0VkaXRcIlxuICAgICAgICAgICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8dmVyYmVuLXBvcC1VcFxuICAgICAgICAgICAgICAgICAgICAjcG9wdXBcbiAgICAgICAgICAgICAgICAgICAgW2N1c3RvbVN0eWxlc109XCJ7ICd6LWluZGV4JzogJzk5JyB9XCJcbiAgICAgICAgICAgICAgICAgICAgW2VuYWJsZU1vdXNlTGVhdmVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8dmVyYmVuLXN2Z1xuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgYWN0aW9ucy1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi10cmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImxpc3RcIlxuICAgICAgICAgICAgICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wLXVwLWNvbnRlbnQgZmxleCBmbGV4LWNvbFwiIGRyb3Bkb3duLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXBlcm1pc3Npb25Db25maWcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbkNvbmZpZy5BY3Rpb25zWydDcmVhdGUnXVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0VGlja2V0KHZhbHVlKTsgY2xvc2VQb3BVcCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicG9wLXVwLXZhbHVlIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInZpZXdUaWNrZXREZXRhaWxzKHZhbHVlKTsgY2xvc2VQb3BVcCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicG9wLXVwLXZhbHVlIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBWaWV3IERldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L3ZlcmJlbi1wb3AtVXA+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICNjZWxsRWRpdFxuICAgICAgICAgICAgICAgICAgbGV0LWlzRWRpdGluZz1cImlzRWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgICBsZXQtdG9nZ2xlUm93RWRpdD1cInRvZ2dsZVJvd0VkaXRcIlxuICAgICAgICAgICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMiBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgICAgICAgICBpY29uPVwidGlja1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidGFibGVTYXZlVGlja2V0KHZhbHVlLCB0b2dnbGVSb3dFZGl0KVwiXG4gICAgICAgICAgICAgICAgICAgID48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc3RvcmVDYWNoZSh2YWx1ZSk7IHRvZ2dsZVJvd0VkaXQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImNsb3NlLW5vLWNpcmNsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8dmVyYmVuLXN2ZyAoY2xpY2spPVwidG9nZ2xlUm93RWRpdCgpXCIgaWNvbj1cImRlbGV0ZVwiIFt3aWR0aF09XCIxNVwiIFtoZWlnaHRdPVwiMTVcIj48L3ZlcmJlbi1zdmc+IC0tPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2xpYi1kYXRhLXRhYmxlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY29sdW1uLWNvbnRlbnQ+XG4gICAgICAgICAgICA8dmVyYmVuLXZpc2libGUtY29sdW1uXG4gICAgICAgICAgICAgIChjb2x1bW5zVXBkYXRlZCk9XCJvbkNvbHVtbnNVcGRhdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICBbYm9yZGVyXT1cIicxcHggc29saWQgcmdiYSgyMTIsIDE2MCwgNywgMSknXCJcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzPVwiMTBweFwiXG4gICAgICAgICAgICAgIGJveFNoYWRvdz1cIjJweCAycHggMnB4IDBweCBzaWx2ZXJcIlxuICAgICAgICAgICAgICBiZ0NvbG9yPVwid2hpdGVcIlxuICAgICAgICAgICAgICB3aWR0aD1cIjQwMHB4XCJcbiAgICAgICAgICAgICAgdGV4dENvbG9yPVwiYmxhY2tcIlxuICAgICAgICAgICAgICBwZD1cIjFyZW1cIlxuICAgICAgICAgICAgICBwcmltYXJ5Q29sb3I9XCIjRkZFNjgxXCJcbiAgICAgICAgICAgICAgc2Vjb25kYXJ5Q29sb3I9XCIjMzQ3OUU5XCJcbiAgICAgICAgICAgICAgW2NvbHVtbnNdPVwidmlzaWJsZUNvbHVtbnNcIlxuICAgICAgICAgICAgICBbZGlzcGxheWVkQ29sdW1uc109XCI1XCJcbiAgICAgICAgICAgID48L3ZlcmJlbi12aXNpYmxlLWNvbHVtbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGZpbHRlci1jb250ZW50PlxuICAgICAgICAgICAgPHZlcmJlbi10YWJsZS1maWx0ZXJcbiAgICAgICAgICAgICAgKGZpbHRlcnNBcHBsaWVkKT1cIm9uRmlsdGVyVXBkYXRlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2JvcmRlcl09XCInMXB4IHNvbGlkIHJnYmEoMjEyLCAxNjAsIDcsIDEpJ1wiXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1cz1cIjEwcHhcIlxuICAgICAgICAgICAgICBib3hTaGFkb3c9XCIycHggMnB4IDJweCAwcHggc2lsdmVyXCJcbiAgICAgICAgICAgICAgYmdDb2xvcj1cIndoaXRlXCJcbiAgICAgICAgICAgICAgd2lkdGg9XCI0MjBweFwiXG4gICAgICAgICAgICAgIHRleHRDb2xvcj1cImJsYWNrXCJcbiAgICAgICAgICAgICAgcGQ9XCIxcmVtXCJcbiAgICAgICAgICAgICAgcHJpbWFyeUNvbG9yPVwiI0ZGRTY4MVwiXG4gICAgICAgICAgICAgIHNlY29uZGFyeUNvbG9yPVwiIzM0NzlFOVwiXG4gICAgICAgICAgICAgIHRlcnRpYXJ5Q29sb3I9XCIjNDA0MDQwXCJcbiAgICAgICAgICAgICAgW2ZpbHRlck9wdGlvbnNdPVwiZmlsdGVyQXJyYXlcIlxuICAgICAgICAgICAgICBbbWF4RmlsdGVyTGVuZ3RoXT1cIjNcIlxuICAgICAgICAgICAgPjwvdmVyYmVuLXRhYmxlLWZpbHRlcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHNvcnQtY29udGVudD5cbiAgICAgICAgICAgIDx2ZXJiZW4tc29ydC10YWJsZVxuICAgICAgICAgICAgICAoc2VsZWN0ZWRPcHRpb25zKT1cIm9uU29ydFVwZGF0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtib3JkZXJdPVwiJzFweCBzb2xpZCByZ2JhKDIxMiwgMTYwLCA3LCAxKSdcIlxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM9XCIxMHB4XCJcbiAgICAgICAgICAgICAgYm94U2hhZG93PVwiMnB4IDJweCAycHggMHB4IHNpbHZlclwiXG4gICAgICAgICAgICAgIGJnQ29sb3I9XCJ3aGl0ZVwiXG4gICAgICAgICAgICAgIHdpZHRoPVwiNDAwcHhcIlxuICAgICAgICAgICAgICB0ZXh0Q29sb3I9XCJibGFja1wiXG4gICAgICAgICAgICAgIHBkPVwiMXJlbVwiXG4gICAgICAgICAgICAgIHByaW1hcnlDb2xvcj1cIiNGRkU2ODFcIlxuICAgICAgICAgICAgICBzZWNvbmRhcnlDb2xvcj1cIiMzNDc5RTlcIlxuICAgICAgICAgICAgICB0ZXJ0aWFyeUNvbG9yPVwiIzQwNDA0MFwiXG4gICAgICAgICAgICAgIFtlbmFibGVEcmFnQW5kRHJvcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3NvcnRPcHRpb25zXT1cInNvcnRPcHRpb25zXCJcbiAgICAgICAgICAgID48L3ZlcmJlbi1zb3J0LXRhYmxlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgaW1wb3J0LWNvbnRlbnQ+XG4gICAgICAgICAgICA8bGliLWRhdGEtaW1wb3J0XG4gICAgICAgICAgICAgIFtwcmV2aWV3Q29sdW1uc109XCJ2aXNpYmxlQ29sdW1uRGVmXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ0aWNrZXRcIlxuICAgICAgICAgICAgICAoaW1wb3J0RXZlbnREYXRhKT1cIm9uQ29tcGxldGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtjb2x1bW5UZW1wbGF0ZXNdPVwiY29sdW1uVGVtcGxhdGVzKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9saWItZGF0YS1pbXBvcnQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBleHBvcnQtY29udGVudD5cbiAgICAgICAgICAgIDxsaWItZGF0YS14cG9ydFxuICAgICAgICAgICAgICBbdXNlSW1wb3J0S2V5XT1cInRydWVcIlxuICAgICAgICAgICAgICBbY29sdW1uc109XCJ2aXNpYmxlQ29sdW1uRGVmXCJcbiAgICAgICAgICAgICAgW2RhdGFRdWVyeUZ1bmN0aW9uXT1cImV4cG9ydEZpbHRlcnNBbmRTb3J0c1wiXG4gICAgICAgICAgICAgIFtkYXRhXT1cInRpY2tldHNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9saWItZGF0YS14cG9ydD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNoaWxkcmVuPlxuICAgICAgICAgICAgPHZlcmJlbmEtYnV0dG9uXG4gICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgIFt1c2VJY29uXT1cInRydWVcIlxuICAgICAgICAgICAgICBbaWNvbl09XCInYWRkJ1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwidmVyYmVuLXByaW1hcnktYnV0dG9uXCJcbiAgICAgICAgICAgICAgW3RleHRdPVwiJ0FkZCBOZXcgVGlja2V0J1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGROZXdUaWNrZXQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3ZlcmJlbi1kYXRhLXZpZXc+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ0aWNrZXRzLmxlbmd0aCA+IDBcIlxuICAgICAgICBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgaXRlbXMtY2VudGVyIGdhcC01XCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWdpbmF0b3ItdGV4dFwiPnt7IHRpY2tldHMubGVuZ3RoIH19IHJlY29yZHMgbG9hZGVkPC9zcGFuPlxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJsb2FkTW9yZSgpXCIgY2xhc3M9XCJsb2FkLW1vcmUgdmlldy1saW5rc1wiPlxuICAgICAgICAgIExvYWQgbW9yZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgKm5nSWY9XCJcbiAgICAgIHRoaXMuYXBwcy5sZW5ndGggPT0gMCB8fFxuICAgICAgKHRoaXMuYWN0aXZlQXBwICYmIHRoaXMudGVuYW50cy5sZW5ndGggPT0gMCkgfHxcbiAgICAgICh0aGlzLmFjdGl2ZVRlbmFudCAmJiB0aGlzLnRpY2tldHMubGVuZ3RoID09IDAgJiYgIWlzRmlsdGVyZWRTdGF0ZSgpKVxuICAgIFwiXG4gICAgY2xhc3M9XCJjcmVhdGUtY29udGFpbmVyIGZsZXgtMSByb3VuZGVkLVsyMHB4XSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gID48L2Rpdj5cbjwvZGl2PlxuXG48IS0tIDxhcHAtYWRkLWFwcFxuICBbaXNWaXNpYmxlXT1cInNob3dBcHBGb3JtXCJcbiAgW3NlbGVjdGVkQXBwXT1cInNlbGVjdGVkQXBwXCJcbiAgKG9uQ2xvc2UpPVwib25BcHBNb2RhbENsb3NlKClcIlxuICAob25TYXZlKT1cIm9uQXBwU2F2ZSgkZXZlbnQpXCJcbj48L2FwcC1hZGQtYXBwPlxuXG48YXBwLWFkZC10ZW5hbnRcbiAgW2lzVmlzaWJsZV09XCJzaG93VGVuYW50Rm9ybVwiXG4gIFthY3RpdmVBcHBdPVwiYWN0aXZlQXBwXCJcbiAgW3NlbGVjdGVkVGVuYW50XT1cInNlbGVjdGVkVGVuYW50XCJcbiAgKG9uQ2xvc2UpPVwib25UZW5hbnRNb2RhbENsb3NlKClcIlxuICAob25TYXZlKT1cIm9uVGVuYW50U2F2ZSgkZXZlbnQpXCJcbj48L2FwcC1hZGQtdGVuYW50PiAtLT5cblxuPGFwcC1hZGQtdGlja2V0XG4gIFtpc1Zpc2libGVdPVwic2hvd1RpY2tldEZvcm1cIlxuICBbYWN0aXZlQXBwXT1cImFjdGl2ZUFwcFwiXG4gIFthY3RpdmVVc2VyXT1cImFjdGl2ZVVzZXJcIlxuICBbaXNEaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIlxuICBbYWN0aXZlVGVuYW50XT1cImFjdGl2ZVRlbmFudFwiXG4gIFtzZWxlY3RlZFRpY2tldF09XCJzZWxlY3RlZFRpY2tldFwiXG4gIChvbkNsb3NlKT1cIm9uVGlja2V0TW9kYWxDbG9zZSgpXCJcbiAgKG9uU2F2ZSk9XCJvblRpY2tldFNhdmUoJGV2ZW50KVwiXG4gIFtvdmVycmlkZVRva2VuXT1cIm92ZXJyaWRlVG9rZW5cIlxuPjwvYXBwLWFkZC10aWNrZXQ+XG5cbjx2ZXJiZW4tZGlhbG9ndWVcbiAgW3Nob3dDbG9zZUljb25dPVwiZmFsc2VcIlxuICBbZGlzbWlzc091dHNpZGVDbGlja109XCJmYWxzZVwiXG4gIFtjbG9zZU9uRXNjYXBlXT1cInRydWVcIlxuICBbc2l6ZV09XCInbWVkaXVtJ1wiXG4gIFttb2RlXT1cIidkaWFsb2d1ZSdcIlxuICBbY3VzdG9tQ2xhc3NdPVwiJ3RpY2tldC1kaWFsb2cnXCJcbiAgW2Rpc2FibGVGb290ZXJdPVwidHJ1ZVwiXG4gIChvcGVuTW9kYWwpPVwib25Nb2RhbE9wZW4oJGV2ZW50KVwiXG4gIFtpc1Zpc2libGVdPVwic2hvd0Nsb3N1cmVEaWFsb2d1ZVwiXG4gIFtib2R5VGVtcGxhdGVdPVwiYm9keVRlbXBsYXRlXCJcbiAgKGNsb3NlTW9kYWwpPVwib25Nb2RhbENsb3NlKCRldmVudClcIlxuPlxuICA8bmctdGVtcGxhdGUgI2JvZHlUZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWJvZHkgcC1bMjVweF0gZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy1oZWFkZXIgZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlIGZvbnQtYm9sZCB0ZXh0LXhsXCI+RW50ZXIgUmVhc29uPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctc3VidGl0bGVcIj5cbiAgICAgICAgICBQbGVhc2UgcHJvdmlkZSBhIHJlYXNvbiBmb3IgY2xvc2luZyB0aGlzIHRpY2tldFxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSA8dmVyYmVuYS10ZXh0YXJlYSBuYW1lPVwiVGVzdFwiIFsobmdNb2RlbCldPVwidGVzdFwiIC8+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJsb2dUZXN0KClcIj5Mb2c8L2J1dHRvbj4gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWRkLWFwcC1mb3JtIG1haW4tZm9ybS1jb250YWluZXIgZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbnB1dC1jb250YWluZXIgZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW1lZGl1bVwiPlJlYXNvbjwvZGl2PlxuICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICBuYW1lPVwiUmVhc29uXCJcbiAgICAgICAgICAgIHBsYWNlSG9sZGVyPVwiRW50ZXIgcmVhc29uLi4uXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2xvc3VyZVJlYXNvblwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBmbGV4IGp1c3RpZnktZW5kIGdhcC0yXCI+XG4gICAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgY2xhc3M9XCJ2ZXJiZW4tc2Vjb25kYXJ5LWJ1dHRvblwiXG4gICAgICAgICAgW3RleHRdPVwiJ0Nsb3NlJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uTW9kYWxDbG9zZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgICBbZGlzYWJsZV09XCJ0aGlzLmNsb3N1cmVSZWFzb24udHJpbSgpLmxlbmd0aCA9PSAwXCJcbiAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgIGNsYXNzPVwidmVyYmVuLXByaW1hcnktYnV0dG9uXCJcbiAgICAgICAgICBbdGV4dF09XCInQ29uZmlybSdcIlxuICAgICAgICAgIChjbGljayk9XCJjbG9zZVRpY2tldCgpXCJcbiAgICAgICAgPlxuICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L3ZlcmJlbi1kaWFsb2d1ZT5cbiJdfQ==
963
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0aW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL3RpY2tldGluZy90aWNrZXRpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL2NvbXBvbmVudHMvdGlja2V0aW5nL3RpY2tldGluZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUNULEtBQUssRUFJTCxNQUFNLEVBRU4sU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEdBRWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFLMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBTWxFLHNGQUFzRjtBQUN0RiwrRkFBK0Y7QUFDL0YsNERBQTREO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFFTCxlQUFlLEVBQ2YsY0FBYyxHQUtmLE1BQU0sY0FBYyxDQUFDO0FBS3RCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM3RSxPQUFPLEVB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WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBRdWVyeUxpc3QsXG4gIHNpZ25hbCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIHZpZXdDaGlsZHJlbixcbiAgV3JpdGFibGVTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgREVGQVVMVF9QQUdFX1NJWkUgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvY29uc3RhbnRzJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uLCBLZXlWYWx1ZVBhcmFtIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFBhZ2VkUmVzdWx0IH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBUaWNrZXQgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFRpY2tldFN0YXR1cyB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHtcbiAgVXRpbFNlcnZpY2UsXG4gIEVudmlyb25tZW50U2VydmljZSxcbn0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL3NlcnZpY2VzJztcbmltcG9ydCB7IEh0dHBXZWJSZXF1ZXN0U2VydmljZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG4vLyBpbXBvcnQgeyBBZGRBcHBDb21wb25lbnQgfSBmcm9tICdAYXBwL3NoYXJlZC9jb21wb25lbnRzL2FkZC1hcHAvYWRkLWFwcC5jb21wb25lbnQnO1xuLy8gaW1wb3J0IHsgQWRkVGVuYW50Q29tcG9uZW50IH0gZnJvbSAnQGFwcC9zaGFyZWQvY29tcG9uZW50cy9hZGQtdGVuYW50L2FkZC10ZW5hbnQuY29tcG9uZW50Jztcbi8vIGltcG9ydCB7IFNoYXJlZE1vZHVsZSB9IGZyb20gJ0BhcHAvc2hhcmVkL3NoYXJlZC5tb2R1bGUnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBDb2x1bW5EZWZpbml0aW9uLFxuICBDb2x1bW5EaXJlY3RpdmUsXG4gIERhdGFGaWx0ZXJUeXBlLFxuICBEYXRhVGFibGVDb21wb25lbnQsXG4gIERhdGFWaWV3Q29tcG9uZW50LFxuICBJRGF0YUZpbHRlcixcbiAgVmVyYmVuUG9wVXBDb21wb25lbnQsXG59IGZyb20gJ3ZlcmJlbi1uZy11aSc7XG5pbXBvcnQgeyBUaWNrZXRpbmdTZXJ2aWNlIH0gZnJvbSAnLi90aWNrZXRpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBJbXBvcnRTZXJ2aWNlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL3NlcnZpY2VzJztcbmltcG9ydCB7IFBlcm1pc3Npb25Db25maWcgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IEVycm9yUmVzcG9uc2UgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IE9iamVjdFN0YXRlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBTZWFyY2hQcm9wZXJ0eVZhbHVlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBTZWFyY2hPcGVyYXRvciB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgRmlsdGVyVHlwZXMgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFNlYXJjaFByb3BlcnR5U2lnbiB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFNvcnREaXJlY3Rpb24gfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IGJhc2VTdHlsZSB9IGZyb20gJy4vYmFzZS10YWJsZS1zdHlsZSc7XG5cbmVudW0gVGlja2V0UHJvcGVydHlOYW1lIHtcbiAgQ3JlYXRlZEF0ID0gJ0NyZWF0ZWQgQXQnLFxuICBVcGRhdGVkQXQgPSAnVXBkYXRlZCBBdCcsXG4gIFRpdGxlID0gJ1RpdGxlJyxcbiAgRGVzY3JpcHRpb24gPSAnRGVzY3JpcHRpb24nLFxuICBDdXJyZW50SGFuZGxlciA9ICdDdXJyZW50IEhhbmRsZXInLFxuICBQcmlvcml0eSA9ICdQcmlvcml0eScsXG4gIFN0YXR1cyA9ICdTdGF0dXMnLFxuICBDcmVhdGVkQnkgPSAnQ3JlYXRlZCBCeScsXG4gIFVwZGF0ZWRCeSA9ICdVcGRhdGVkIEJ5Jyxcbn1cblxuZW51bSBUaWNrZXRQcm9wZXJ0eU1hcCB7XG4gIENyZWF0ZWRBdCA9ICdDcmVhdGVkQXQnLFxuICBVcGRhdGVkQXQgPSAnVXBkYXRlZEF0JyxcbiAgVGl0bGUgPSAnVGl0bGUnLFxuICBEZXNjcmlwdGlvbiA9ICdEZXNjcmlwdGlvbicsXG4gIEN1cnJlbnRIYW5kbGVyID0gJ0N1cnJlbnRIYW5kbGVyJyxcbiAgUHJpb3JpdHkgPSAnUHJpb3JpdHknLFxuICBTdGF0dXMgPSAnU3RhdHVzJyxcbiAgQ3JlYXRlZEJ5ID0gJ0NyZWF0ZWRCeScsXG4gIFVwZGF0ZWRCeSA9ICdVcGRhdGVkQnknLFxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdGlja2V0aW5nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RpY2tldGluZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi90aWNrZXRpbmcuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFRpY2tldGluZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgcGVybWlzc2lvbkNvbmZpZzogUGVybWlzc2lvbkNvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIHN0eWxlcyA9IGJhc2VTdHlsZTtcbiAgLy8gc2hvd0FwcEZvcm06IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gc2hvd1RlbmFudEZvcm06IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd1RpY2tldEZvcm06IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gc2VsZWN0ZWRBcHA6IEFwcGxpY2F0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8vIHNlbGVjdGVkVGVuYW50OiBUZW5hbnQgfCBudWxsID0gbnVsbDtcbiAgc2VsZWN0ZWRUaWNrZXQ6IFRpY2tldCB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBhY3RpdmVBcHA6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBhY3RpdmVUZW5hbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBhY3RpdmVVc2VyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgb3ZlcnJpZGVUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGFsbG93VGlja2V0Q2xvc2luZzogYm9vbGVhbiA9IGZhbHNlO1xuICBhY3RpdmVUaWNrZXQ6IFRpY2tldCB8IG51bGwgPSBudWxsO1xuICBhcHBzOiBBcHBsaWNhdGlvbltdID0gW107XG4gIEBJbnB1dCgpIGRldGFpbFBhdGg6IHN0cmluZyA9ICcnO1xuICB0ZW5hbnRzOiBUZW5hbnRbXSA9IFtdO1xuICB0aWNrZXRzOiBUaWNrZXRbXSA9IFtdO1xuICB0aWNrZXRpbmdBUEk6IHN0cmluZyA9IGBgO1xuICBASW5wdXQoKSBkZWZhdWx0Q29tcGFueTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGJhc2VVcmw6IHN0cmluZyA9IGBgO1xuICBjbG9zdXJlVGlja2V0OiBUaWNrZXQgfCBudWxsID0gbnVsbDtcbiAgY2xvc3VyZVJlYXNvbjogc3RyaW5nID0gJyc7XG4gIHNob3dDbG9zdXJlRGlhbG9ndWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcGVuZGluZ1JlZjogVGlja2V0U3RhdHVzID0gVGlja2V0U3RhdHVzLlBlbmRpbmc7XG4gIHZpc2libGVDb2x1bW5EZWY6IENvbHVtbkRlZmluaXRpb248YW55PltdID0gW107XG4gIGV4cG9ydENvbHVtbkRlZjogQ29sdW1uRGVmaW5pdGlvbjxhbnk+W10gPSBbXTtcbiAgaW1wb3J0ZWREYXRhOiBXcml0YWJsZVNpZ25hbDxhbnlbXT4gPSBzaWduYWwoW10pO1xuICBjb2x1bW5UZW1wbGF0ZXMgPSB2aWV3Q2hpbGRyZW48Q29sdW1uRGlyZWN0aXZlPihDb2x1bW5EaXJlY3RpdmUpO1xuICBAVmlld0NoaWxkKCd2ZHYnKSBkYXRhVmlldyE6IERhdGFWaWV3Q29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdkdCcpIHRhYmxlVmlldyE6IERhdGFUYWJsZUNvbXBvbmVudDxUaWNrZXQ+O1xuICBAVmlld0NoaWxkcmVuKCdwb3B1cCcpIHBvcFVwcyE6IFF1ZXJ5TGlzdDxWZXJiZW5Qb3BVcENvbXBvbmVudD47XG4gIHBhZ2VTaXplOiBudW1iZXIgPSBERUZBVUxUX1BBR0VfU0laRTtcbiAgc2VhcmNoRGVib3VuY2VUaW1lOiBudW1iZXIgPSA1MDA7XG4gIHBhZ2VTdGF0ZTogUGFnZWRSZXN1bHQ8VGlja2V0PiB8IG51bGwgPSBudWxsO1xuICBpc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgb3BlbkRyb3Bkb3duSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBjdXJyZW50RmlsdGVyczogSURhdGFGaWx0ZXJbXSA9IFtdO1xuICBjdXJyZW50U29ydHM6IElEYXRhRmlsdGVyW10gPSBbXTtcbiAgc2VhcmNoVGVybSQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHN0YXR1c09wdGlvbnM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMoVGlja2V0U3RhdHVzKTtcbiAgdmlzaWJsZUNvbHVtbnM6IElEYXRhRmlsdGVyW10gPSBbXTtcbiAgZmlsdGVyQXJyYXk6IElEYXRhRmlsdGVyW10gPSBbXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLkNyZWF0ZWRBdCxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkRhdGUsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5VcGRhdGVkQXQsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5EYXRlLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuVGl0bGUsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5EZXNjcmlwdGlvbixcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLkN1cnJlbnRIYW5kbGVyLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuUHJpb3JpdHksXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5TdGF0dXMsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5DcmVhdGVkQnksXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5VcGRhdGVkQnksXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICBdO1xuXG4gIHNvcnRPcHRpb25zOiBJRGF0YUZpbHRlcltdID0gW1xuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5DcmVhdGVkQXQsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5EYXRlLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuVXBkYXRlZEF0LFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuRGF0ZSxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLlRpdGxlLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuRGVzY3JpcHRpb24sXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFRpY2tldFByb3BlcnR5TmFtZS5DdXJyZW50SGFuZGxlcixcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogVGlja2V0UHJvcGVydHlOYW1lLlByaW9yaXR5LFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuU3RhdHVzLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuQ3JlYXRlZEJ5LFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBUaWNrZXRQcm9wZXJ0eU5hbWUuVXBkYXRlZEJ5LFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgXTtcblxuICBwcml2YXRlIGN1cnJlbnRTZWFyY2hUZXJtOiBzdHJpbmcgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHV0aWxTZXJ2aWNlOiBVdGlsU2VydmljZSxcbiAgICBwcml2YXRlIHNlcnZlcjogSHR0cFdlYlJlcXVlc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwdWJsaWMgc2VydmljZTogVGlja2V0aW5nU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGltcG9ydFNlcnZpY2U6IEltcG9ydFNlcnZpY2U8VGlja2V0PixcbiAgICBwcml2YXRlIGVudlN2YzogRW52aXJvbm1lbnRTZXJ2aWNlLFxuICApIHtcbiAgICBzZXJ2aWNlLmluaXRTZXJ2aWNlKHRoaXMub3ZlcnJpZGVUb2tlbik7XG4gICAgaW1wb3J0U2VydmljZS5pbml0U2VydmljZSh0aGlzLm92ZXJyaWRlVG9rZW4pO1xuICB9XG5cbiAgYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChjaGFuZ2VzWydvdmVycmlkZVRva2VuJ10pIHtcbiAgICAgIHRoaXMuc2VydmljZS5pbml0U2VydmljZSh0aGlzLm92ZXJyaWRlVG9rZW4pO1xuICAgICAgdGhpcy5pbXBvcnRTZXJ2aWNlLmluaXRTZXJ2aWNlKHRoaXMub3ZlcnJpZGVUb2tlbik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1uRGVmID0gdGhpcy5zZXJ2aWNlLnRpY2tldENvbHVtbnMuZmlsdGVyKFxuICAgICAgKHgpID0+IHguaWQgIT0gJ2FjdGlvbnMnIHx8IHRoaXMucGVybWlzc2lvbkNvbmZpZz8uQWN0aW9uc1snQ3JlYXRlJ10sXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuYWxsb3dUaWNrZXRDbG9zaW5nICYmXG4gICAgICB0aGlzLnBlcm1pc3Npb25Db25maWcgJiZcbiAgICAgIHRoaXMucGVybWlzc2lvbkNvbmZpZy5BY3Rpb25zWydDbG9zZVRpY2tldCddXG4gICAgKSB7XG4gICAgICBjb25zdCBpbnNlcnRJbmRleCA9IE1hdGgubWF4KHRoaXMudmlzaWJsZUNvbHVtbkRlZi5sZW5ndGggLSAxLCAwKTtcblxuICAgICAgdGhpcy52aXNpYmxlQ29sdW1uRGVmLnNwbGljZShpbnNlcnRJbmRleCwgMCwge1xuICAgICAgICBpZDogJ2Nsb3NlJyxcbiAgICAgICAgaGVhZGVyOiAnJyxcbiAgICAgICAgY2FuRXhwb3J0OiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmV4cG9ydENvbHVtbkRlZiA9IHRoaXMuc2VydmljZS50aWNrZXRDb2x1bW5zLmZpbHRlcihcbiAgICAgICh4KSA9PlxuICAgICAgICAoeC5pZCAhPSAnYWN0aW9ucycgfHwgdGhpcy5wZXJtaXNzaW9uQ29uZmlnPy5BY3Rpb25zWydDcmVhdGUnXSkgJiZcbiAgICAgICAgeC5pZCAhPSAnZGVzY3JpcHRpb24nLFxuICAgICk7XG4gICAgLy8gIGNvbnNvbGUubG9nKHsgU3RhdGU6IHRoaXMucGVybWlzc2lvbkNvbmZpZyB9KTtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy5zZXJ2aWNlLnRpY2tldENvbHVtbnNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgICh4KSA9PiB4LmlkICE9ICdhY3Rpb25zJyB8fCB0aGlzLnBlcm1pc3Npb25Db25maWc/LkFjdGlvbnNbJ0NyZWF0ZSddLFxuICAgICAgKVxuICAgICAgLm1hcCgoY29sKSA9PiAoe1xuICAgICAgICBjaGVja2VkOiB0cnVlLFxuICAgICAgICBuYW1lOiB0eXBlb2YgY29sLmhlYWRlciA9PT0gJ3N0cmluZycgPyBjb2wuaGVhZGVyIDogY29sLmlkLFxuICAgICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5Cb29sLFxuICAgICAgfSkpO1xuICAgIHRoaXMudGlja2V0aW5nQVBJID0gYCR7dGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJfS9UaWNrZXRgO1xuXG4gICAgaWYgKHRoaXMuYWN0aXZlVGVuYW50KSB7XG4gICAgICBjb25zdCB2aWV3QWxsOiBib29sZWFuID1cbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uQ29uZmlnPy5BY3Rpb25zWydWaWV3QWxsVGlja2V0cyddIHx8IGZhbHNlO1xuXG4gICAgICBjb25zdCB0aWNrZXRzID0gYXdhaXQgdGhpcy5zZXJ2aWNlLmdldFRpY2tldHNGb3JUZW5hbnQoXG4gICAgICAgIHRoaXMuYWN0aXZlVGVuYW50LFxuICAgICAgICB2aWV3QWxsLFxuICAgICAgICB0aGlzLmFjdGl2ZVVzZXIgfHwgJycsXG4gICAgICApO1xuICAgICAgaWYgKHRpY2tldHMpIHtcbiAgICAgICAgdGhpcy5wYWdlU3RhdGUgPSB0aWNrZXRzO1xuICAgICAgICBjb25zdCByZXN1bHRzID0gdGlja2V0cy5SZXN1bHQ7XG4gICAgICAgIHRoaXMudGlja2V0cyA9IHJlc3VsdHMubWFwKCh4KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLngsXG4gICAgICAgICAgICBJZDogeC5Db2RlLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VhcmNoVGVybSRcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLnNlYXJjaERlYm91bmNlVGltZSkpIC8vIEFkanVzdCBkZWJvdW5jZSB0aW1lIGhlcmUgKGluIG1zKVxuICAgICAgLnN1YnNjcmliZShhc3luYyAoc2VhcmNoVGVybSkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtID0gc2VhcmNoVGVybTtcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJzQW5kU29ydHModHJ1ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGxvYWRNb3JlKCkge1xuICAgIGlmICghdGhpcy5wYWdlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5sb2FkTW9yZUZpbHRlcnNBbmRTb3J0cygpO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhZ2VTdGF0ZSA9IHJlcyBhcyBQYWdlZFJlc3VsdDxUaWNrZXQ+O1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXMgYXMgUGFnZWRSZXN1bHQ8VGlja2V0PikuUmVzdWx0O1xuICAgICAgY29uc3QgbWFwcGVkRGF0YTogVGlja2V0W10gPSByZXN1bHQubWFwKCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ueCxcbiAgICAgICAgICBJZDogeC5Db2RlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICB0aGlzLnRpY2tldHMgPSB0aGlzLnRpY2tldHMuY29uY2F0KG1hcHBlZERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHRhYmxlU2F2ZVRpY2tldChmb3JtOiBUaWNrZXQsIGNhbGxCYWNrOiAoKSA9PiBhbnkpIHtcbiAgICBpZiAoZm9ybS5EZXNjcmlwdGlvbi50cmltKCkubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0luZm8oJ0Rlc2NyaXB0aW9uIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3JtLkRhdGFTdGF0ZSA9XG4gICAgICBmb3JtLkRhdGFTdGF0ZSA9PSBPYmplY3RTdGF0ZS5OZXcgPyBPYmplY3RTdGF0ZS5OZXcgOiBPYmplY3RTdGF0ZS5DaGFuZ2VkO1xuICAgIGZvcm0uSWQgPSAnJztcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgYFRpY2tldC9TYXZlVGlja2V0YCxcbiAgICAgIFtmb3JtXSxcbiAgICAgIHRoaXMub3ZlcnJpZGVUb2tlbiB8fCB1bmRlZmluZWQsXG4gICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93U3VjY2VzcygnVGlja2V0IHNhdmVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzIGFzIFRpY2tldFtdO1xuICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciByZXN1bHRJdGVtID0gcmVzdWx0WzBdO1xuICAgICAgICBjb25zdCBpdGVtSW5kZXggPSB0aGlzLnRpY2tldHMuZmluZEluZGV4KCh4KSA9PiB4ID09IGZvcm0pO1xuICAgICAgICBpZiAoaXRlbUluZGV4ID4gLTEpIHtcbiAgICAgICAgICB0aGlzLnRpY2tldHNbaXRlbUluZGV4XS5Db2RlID0gcmVzdWx0SXRlbS5Db2RlO1xuICAgICAgICAgIHRoaXMudGlja2V0c1tpdGVtSW5kZXhdLklkID0gcmVzdWx0SXRlbS5Db2RlO1xuICAgICAgICAgIHRoaXMudGlja2V0c1tpdGVtSW5kZXhdLkRhdGFTdGF0ZSA9IHJlc3VsdEl0ZW0uRGF0YVN0YXRlO1xuICAgICAgICAgIHRoaXMudGlja2V0c1tpdGVtSW5kZXhdLlRlbmFudElkID0gcmVzdWx0SXRlbS5UZW5hbnRJZDtcbiAgICAgICAgICB0aGlzLnRpY2tldHNbaXRlbUluZGV4XS5TZXJ2aWNlTmFtZSA9IHJlc3VsdEl0ZW0uU2VydmljZU5hbWU7XG4gICAgICAgICAgdGhpcy50aWNrZXRzID0gdGhpcy50aWNrZXRzLm1hcCgoeCkgPT4geCk7XG4gICAgICAgICAgdGhpcy5jYWNoZUl0ZW0odGhpcy50aWNrZXRzW2l0ZW1JbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxCYWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVGFibGUoKSB7XG4gICAgdGhpcy50aWNrZXRzID0gdGhpcy50aWNrZXRzLm1hcCgoeCkgPT4geCk7XG4gIH1cblxuICBjbG9zZVBvcFVwKCkge1xuICAgIHRoaXMub3BlbkRyb3Bkb3duSWQgPSBudWxsO1xuICAgIHRoaXMucG9wVXBzLmZvckVhY2goKHBvcFVwKSA9PiB7XG4gICAgICBpZiAocG9wVXAuZHJvcGRvd25PcGVuKSB7XG4gICAgICAgIHBvcFVwLnRvZ2dsZURyb3Bkb3duKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblZpZXdDaGFuZ2UoaXNHcmlkVmlldzogYm9vbGVhbik6IHZvaWQge31cblxuICBzaG93VGFibGVWaWV3OiBib29sZWFuID0gdHJ1ZTtcblxuICBvblNlbGVjdGlvbkNoYW5nZShzZWxlY3RlZFJvd3M6IFRpY2tldFtdKSB7fVxuXG4gIG9uQ29sdW1uc1VwZGF0ZWQodXBkYXRlZENvbHVtbnM6IElEYXRhRmlsdGVyW10pIHtcbiAgICBjb25zdCB1cGRhdGVkQ29sdW1uRGVmOiBDb2x1bW5EZWZpbml0aW9uPFRpY2tldD5bXSA9IFtdO1xuICAgIHVwZGF0ZWRDb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hpbmdDb2wgPSB0aGlzLnNlcnZpY2UudGlja2V0Q29sdW1ucy5maW5kKFxuICAgICAgICAoY29sdW1uKSA9PiBjb2x1bW4uaGVhZGVyID09PSBjb2wubmFtZSB8fCBjb2x1bW4uaWQgPT09IGNvbC5uYW1lLFxuICAgICAgKTtcbiAgICAgIGlmIChtYXRjaGluZ0NvbCkge1xuICAgICAgICB1cGRhdGVkQ29sdW1uRGVmLnB1c2gobWF0Y2hpbmdDb2wpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy52aXNpYmxlQ29sdW1uRGVmID0gWy4uLnVwZGF0ZWRDb2x1bW5EZWZdO1xuICB9XG5cbiAgZXhwb3J0RmlsdGVyc0FuZFNvcnRzID0gYXN5bmMgKHBhZ2VTdGF0ZToge1xuICAgIHNraXA6IG51bWJlcjtcbiAgICBsaW1pdDogbnVtYmVyO1xuICB9KSA9PiB7XG4gICAgdmFyIHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IHRoaXMuY3VycmVudEZpbHRlcnMubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6XG4gICAgICAgICAgVGlja2V0UHJvcGVydHlNYXBbXG4gICAgICAgICAgICB4Lm5hbWUuc3BsaXQoJyAnKS5qb2luKCcnKSBhcyBrZXlvZiB0eXBlb2YgVGlja2V0UHJvcGVydHlNYXBcbiAgICAgICAgICBdLFxuICAgICAgICBFbnRpdHlWYWx1ZTogeC52YWx1ZSxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjpcbiAgICAgICAgICB4LmNvbmRpdGlvbiAmJiBPYmplY3Qua2V5cyhGaWx0ZXJUeXBlcykuaW5jbHVkZXMoeC5jb25kaXRpb24pXG4gICAgICAgICAgICA/IChGaWx0ZXJUeXBlc1tcbiAgICAgICAgICAgICAgICB4LmNvbmRpdGlvbiBhcyBrZXlvZiB0eXBlb2YgRmlsdGVyVHlwZXNcbiAgICAgICAgICAgICAgXSBhcyB1bmtub3duIGFzIFNlYXJjaFByb3BlcnR5U2lnbilcbiAgICAgICAgICAgIDogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBUeXBlOlxuICAgICAgICAgIHgubmFtZSA9PSBUaWNrZXRQcm9wZXJ0eU5hbWUuQ3JlYXRlZEF0IHx8XG4gICAgICAgICAgeC5uYW1lID09IFRpY2tldFByb3BlcnR5TmFtZS5VcGRhdGVkQXRcbiAgICAgICAgICAgID8gU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuRGF0ZVxuICAgICAgICAgICAgOiBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZS5TdHJpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIC8vIHBheWxvYWQucHVzaCh7XG4gICAgLy8gICBQcm9wZXJ0eU5hbWU6ICdBUElLZXknLFxuICAgIC8vICAgRW50aXR5VmFsdWU6IHRoaXMuZW52U3ZjLmVudmlyb25tZW50LkFQSUtleSxcbiAgICAvLyAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgLy8gICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgLy8gfSk7XG4gICAgZm9yIChsZXQgc29ydCBvZiB0aGlzLmN1cnJlbnRTb3J0cykge1xuICAgICAgcGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOlxuICAgICAgICAgIFRpY2tldFByb3BlcnR5TWFwW1xuICAgICAgICAgICAgc29ydC5uYW1lLnNwbGl0KCcgJykuam9pbignJykgYXMga2V5b2YgdHlwZW9mIFRpY2tldFByb3BlcnR5TWFwXG4gICAgICAgICAgXSxcbiAgICAgICAgRW50aXR5VmFsdWU6ICcnLFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICAgIFNvcnQ6XG4gICAgICAgICAgc29ydC52YWx1ZS50b0xvd2VyQ2FzZSgpID09IFNvcnREaXJlY3Rpb24uQXNjLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgID8gU29ydERpcmVjdGlvbi5Bc2NcbiAgICAgICAgICAgIDogc29ydC52YWx1ZS50b0xvd2VyQ2FzZSgpID09IFNvcnREaXJlY3Rpb24uRGVzYy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgID8gU29ydERpcmVjdGlvbi5EZXNjXG4gICAgICAgICAgICAgIDogU29ydERpcmVjdGlvbi5Ob25lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoUGF5bG9hZDogU2VhcmNoUHJvcGVydHlWYWx1ZVtdID0gW107XG5cbiAgICAvLyBpZiAodGhpcy5hY3RpdmVBcHApIHtcbiAgICAvLyAgIHBheWxvYWQucHVzaCh7XG4gICAgLy8gICAgIFByb3BlcnR5TmFtZTogJ0FwcCcsXG4gICAgLy8gICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZUFwcC5Db2RlLFxuICAgIC8vICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgIC8vICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHNlYXJjaFBheWxvYWQucHVzaCh7XG4gICAgLy8gICAgIFByb3BlcnR5TmFtZTogJ0FwcCcsXG4gICAgLy8gICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZUFwcC5Db2RlLFxuICAgIC8vICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgIC8vICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgLy8gICB9KTtcbiAgICAvLyB9XG5cbiAgICBjb25zdCBzZWFyY2hUZXJtRXhpc3RzID0gdGhpcy5jdXJyZW50U2VhcmNoVGVybS50cmltKCkubGVuZ3RoID4gMDtcblxuICAgIGlmIChzZWFyY2hUZXJtRXhpc3RzKSB7XG4gICAgICBPYmplY3QudmFsdWVzKFRpY2tldFByb3BlcnR5TWFwKS5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xuICAgICAgICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgICAgICAgIFByb3BlcnR5TmFtZTogcHJvcGVydHksXG4gICAgICAgICAgRW50aXR5VmFsdWU6IHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLFxuICAgICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5PcixcbiAgICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uTElLRSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3RpdmVUZW5hbnQpIHtcbiAgICAgIHBheWxvYWQucHVzaCh7XG4gICAgICAgIFByb3BlcnR5TmFtZTogJ1RlbmFudElkJyxcbiAgICAgICAgRW50aXR5VmFsdWU6IHRoaXMuYWN0aXZlVGVuYW50LFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICB9KTtcbiAgICAgIHNlYXJjaFBheWxvYWQucHVzaCh7XG4gICAgICAgIFByb3BlcnR5TmFtZTogJ1RlbmFudElkJyxcbiAgICAgICAgRW50aXR5VmFsdWU6IHRoaXMuYWN0aXZlVGVuYW50LFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3QWxsOiBib29sZWFuID1cbiAgICAgIHRoaXMucGVybWlzc2lvbkNvbmZpZz8uQWN0aW9uc1snVmlld0FsbFRpY2tldHMnXSB8fCBmYWxzZTtcblxuICAgIGlmICghdmlld0FsbCkge1xuICAgICAgcGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnVGFnJyxcbiAgICAgICAgRW50aXR5VmFsdWU6IHRoaXMuYWN0aXZlVXNlciB8fCAnJyxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSk7XG4gICAgICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUYWcnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVVc2VyIHx8ICcnLFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcbiAgICBjb25zdCByZXMgPSBzZWFyY2hUZXJtRXhpc3RzXG4gICAgICA/IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgICAgYFRpY2tldC9TZWFyY2hUaWNrZXQvJHtwYWdlU3RhdGUuc2tpcH0vJHtwYWdlU3RhdGUubGltaXR9YCxcbiAgICAgICAgICBzZWFyY2hQYXlsb2FkLFxuICAgICAgICAgIHRoaXMub3ZlcnJpZGVUb2tlbiB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJLFxuICAgICAgICApXG4gICAgICA6IHBheWxvYWQubGVuZ3RoID09IDBcbiAgICAgICAgPyBhd2FpdCB0aGlzLnNlcnZlci5nZXQoXG4gICAgICAgICAgICBgVGlja2V0L0dldFRpY2tldC8ke3BhZ2VTdGF0ZS5za2lwfS8ke3BhZ2VTdGF0ZS5saW1pdH1gLFxuICAgICAgICAgICAgdGhpcy5vdmVycmlkZVRva2VuIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICAgICAgICApXG4gICAgICAgIDogYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgICAgICAgIGBUaWNrZXQvU2VhcmNoVGlja2V0LyR7cGFnZVN0YXRlLnNraXB9LyR7cGFnZVN0YXRlLmxpbWl0fWAsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgdGhpcy5vdmVycmlkZVRva2VuIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICAgICAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxUaWNrZXQ+KS5SZXN1bHQ7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfTtcbiAgYXN5bmMgdXBkYXRlRmlsdGVyc0FuZFNvcnRzKGlzU2VhcmNoOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAoIWlzU2VhcmNoKSB7XG4gICAgICB0aGlzLmRhdGFWaWV3Lm9uQ2xlYXJTZWFyY2goKTtcbiAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRlcm0gPSAnJztcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIGNvbnN0IGNsaWNrRXZlbnQgPSBuZXcgTW91c2VFdmVudCgnY2xpY2snLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgIHZpZXc6IHdpbmRvdyxcbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjbGlja0V2ZW50KTtcbiAgICB9XG4gICAgdmFyIHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IHRoaXMuY3VycmVudEZpbHRlcnMubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6XG4gICAgICAgICAgVGlja2V0UHJvcGVydHlNYXBbXG4gICAgICAgICAgICB4Lm5hbWUuc3BsaXQoJyAnKS5qb2luKCcnKSBhcyBrZXlvZiB0eXBlb2YgVGlja2V0UHJvcGVydHlNYXBcbiAgICAgICAgICBdLFxuICAgICAgICBFbnRpdHlWYWx1ZTogeC52YWx1ZSxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjpcbiAgICAgICAgICB4LmNvbmRpdGlvbiAmJiBPYmplY3Qua2V5cyhGaWx0ZXJUeXBlcykuaW5jbHVkZXMoeC5jb25kaXRpb24pXG4gICAgICAgICAgICA/IChGaWx0ZXJUeXBlc1tcbiAgICAgICAgICAgICAgICB4LmNvbmRpdGlvbiBhcyBrZXlvZiB0eXBlb2YgRmlsdGVyVHlwZXNcbiAgICAgICAgICAgICAgXSBhcyB1bmtub3duIGFzIFNlYXJjaFByb3BlcnR5U2lnbilcbiAgICAgICAgICAgIDogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBUeXBlOlxuICAgICAgICAgIHgubmFtZSA9PSBUaWNrZXRQcm9wZXJ0eU5hbWUuQ3JlYXRlZEF0IHx8XG4gICAgICAgICAgeC5uYW1lID09IFRpY2tldFByb3BlcnR5TmFtZS5VcGRhdGVkQXRcbiAgICAgICAgICAgID8gU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuRGF0ZVxuICAgICAgICAgICAgOiBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZS5TdHJpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIC8vIHBheWxvYWQucHVzaCh7XG4gICAgLy8gICBQcm9wZXJ0eU5hbWU6ICdBUElLZXknLFxuICAgIC8vICAgRW50aXR5VmFsdWU6IHRoaXMuZW52U3ZjLmVudmlyb25tZW50LkFQSUtleSxcbiAgICAvLyAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgLy8gICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgLy8gfSk7XG4gICAgZm9yIChsZXQgc29ydCBvZiB0aGlzLmN1cnJlbnRTb3J0cykge1xuICAgICAgcGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOlxuICAgICAgICAgIFRpY2tldFByb3BlcnR5TWFwW1xuICAgICAgICAgICAgc29ydC5uYW1lLnNwbGl0KCcgJykuam9pbignJykgYXMga2V5b2YgdHlwZW9mIFRpY2tldFByb3BlcnR5TWFwXG4gICAgICAgICAgXSxcbiAgICAgICAgRW50aXR5VmFsdWU6ICcnLFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICAgIFNvcnQ6XG4gICAgICAgICAgc29ydC52YWx1ZS50b0xvd2VyQ2FzZSgpID09IFNvcnREaXJlY3Rpb24uQXNjLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgID8gU29ydERpcmVjdGlvbi5Bc2NcbiAgICAgICAgICAgIDogc29ydC52YWx1ZS50b0xvd2VyQ2FzZSgpID09IFNvcnREaXJlY3Rpb24uRGVzYy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgID8gU29ydERpcmVjdGlvbi5EZXNjXG4gICAgICAgICAgICAgIDogU29ydERpcmVjdGlvbi5Ob25lLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaFBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IFtdO1xuXG4gICAgLy8gaWYgKHRoaXMuYWN0aXZlQXBwKSB7XG4gICAgLy8gICBwYXlsb2FkLnB1c2goe1xuICAgIC8vICAgICBQcm9wZXJ0eU5hbWU6ICdBcHAnLFxuICAgIC8vICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVBcHAuQ29kZSxcbiAgICAvLyAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAvLyAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vICAgfSk7XG4gICAgLy8gICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgIC8vICAgICBQcm9wZXJ0eU5hbWU6ICdBcHAnLFxuICAgIC8vICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVBcHAuQ29kZSxcbiAgICAvLyAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAvLyAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgIC8vICAgfSk7XG4gICAgLy8gfVxuXG4gICAgY29uc3Qgc2VhcmNoVGVybUV4aXN0cyA9IHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoc2VhcmNoVGVybUV4aXN0cykge1xuICAgICAgT2JqZWN0LnZhbHVlcyhUaWNrZXRQcm9wZXJ0eU1hcCkuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgc2VhcmNoUGF5bG9hZC5wdXNoKHtcbiAgICAgICAgICBQcm9wZXJ0eU5hbWU6IHByb3BlcnR5LFxuICAgICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKSxcbiAgICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuT3IsXG4gICAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkxJS0UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdDb2RlJyxcbiAgICAgICAgRW50aXR5VmFsdWU6IHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuT3IsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5MSUtFLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlVGVuYW50KSB7XG4gICAgICBwYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUZW5hbnRJZCcsXG4gICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZVRlbmFudCxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSk7XG4gICAgICBzZWFyY2hQYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUZW5hbnRJZCcsXG4gICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZVRlbmFudCxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgdmlld0FsbDogYm9vbGVhbiA9XG4gICAgICB0aGlzLnBlcm1pc3Npb25Db25maWc/LkFjdGlvbnNbJ1ZpZXdBbGxUaWNrZXRzJ10gfHwgZmFsc2U7XG5cbiAgICBpZiAoIXZpZXdBbGwpIHtcbiAgICAgIHBheWxvYWQucHVzaCh7XG4gICAgICAgIFByb3BlcnR5TmFtZTogJ1RhZycsXG4gICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZVVzZXIgfHwgJycsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgIH0pO1xuICAgICAgc2VhcmNoUGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnVGFnJyxcbiAgICAgICAgRW50aXR5VmFsdWU6IHRoaXMuYWN0aXZlVXNlciB8fCAnJyxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gc2VhcmNoVGVybUV4aXN0c1xuICAgICAgPyBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgICAgIGBUaWNrZXQvU2VhcmNoVGlja2V0LzAvJHt0aGlzLnBhZ2VTaXplfWAsXG4gICAgICAgICAgc2VhcmNoUGF5bG9hZCxcbiAgICAgICAgICB0aGlzLm92ZXJyaWRlVG9rZW4gfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICAgICAgKVxuICAgICAgOiBwYXlsb2FkLmxlbmd0aCA9PSAwXG4gICAgICAgID8gYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0KFxuICAgICAgICAgICAgYFRpY2tldC9HZXRUaWNrZXQvMC8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVUb2tlbiB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAgICAgKVxuICAgICAgICA6IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgICAgICBgVGlja2V0L1NlYXJjaFRpY2tldC8wLyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVUb2tlbiB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAgICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHRoaXMuY3VycmVudEZpbHRlcnMgPSBbXTtcbiAgICAgIHRoaXMuY3VycmVudFNvcnRzID0gW107XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhZ2VTdGF0ZSA9IHJlcyBhcyBQYWdlZFJlc3VsdDxUaWNrZXQ+O1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXMgYXMgUGFnZWRSZXN1bHQ8VGlja2V0PikuUmVzdWx0O1xuICAgICAgdGhpcy50aWNrZXRzID0gcmVzdWx0Lm1hcCgoeCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLngsXG4gICAgICAgICAgSWQ6IHguQ29kZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBhc3luYyBsb2FkTW9yZUZpbHRlcnNBbmRTb3J0cygpOiBQcm9taXNlPFBhZ2VkUmVzdWx0PFRpY2tldD4gfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXRoaXMucGFnZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IHRoaXMuY3VycmVudEZpbHRlcnMubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6XG4gICAgICAgICAgVGlja2V0UHJvcGVydHlNYXBbXG4gICAgICAgICAgICB4Lm5hbWUuc3BsaXQoJyAnKS5qb2luKCcnKSBhcyBrZXlvZiB0eXBlb2YgVGlja2V0UHJvcGVydHlNYXBcbiAgICAgICAgICBdLFxuICAgICAgICBFbnRpdHlWYWx1ZTogeC52YWx1ZSxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjpcbiAgICAgICAgICB4LmNvbmRpdGlvbiAmJiBPYmplY3Qua2V5cyhGaWx0ZXJUeXBlcykuaW5jbHVkZXMoeC5jb25kaXRpb24pXG4gICAgICAgICAgICA/IChGaWx0ZXJUeXBlc1tcbiAgICAgICAgICAgICAgICB4LmNvbmRpdGlvbiBhcyBrZXlvZiB0eXBlb2YgRmlsdGVyVHlwZXNcbiAgICAgICAgICAgICAgXSBhcyB1bmtub3duIGFzIFNlYXJjaFByb3BlcnR5U2lnbilcbiAgICAgICAgICAgIDogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBUeXBlOlxuICAgICAgICAgIHgubmFtZSA9PSBUaWNrZXRQcm9wZXJ0eU5hbWUuQ3JlYXRlZEF0IHx8XG4gICAgICAgICAgeC5uYW1lID09IFRpY2tldFByb3BlcnR5TmFtZS5VcGRhdGVkQXRcbiAgICAgICAgICAgID8gU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuRGF0ZVxuICAgICAgICAgICAgOiBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZS5TdHJpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGZvciAobGV0IHNvcnQgb2YgdGhpcy5jdXJyZW50U29ydHMpIHtcbiAgICAgIHBheWxvYWQucHVzaCh7XG4gICAgICAgIFByb3BlcnR5TmFtZTpcbiAgICAgICAgICBUaWNrZXRQcm9wZXJ0eU1hcFtcbiAgICAgICAgICAgIHNvcnQubmFtZS5zcGxpdCgnICcpLmpvaW4oJycpIGFzIGtleW9mIHR5cGVvZiBUaWNrZXRQcm9wZXJ0eU1hcFxuICAgICAgICAgIF0sXG4gICAgICAgIEVudGl0eVZhbHVlOiAnJyxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBTb3J0OlxuICAgICAgICAgIHNvcnQudmFsdWUudG9Mb3dlckNhc2UoKSA9PSBTb3J0RGlyZWN0aW9uLkFzYy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICA/IFNvcnREaXJlY3Rpb24uQXNjXG4gICAgICAgICAgICA6IHNvcnQudmFsdWUudG9Mb3dlckNhc2UoKSA9PSBTb3J0RGlyZWN0aW9uLkRlc2MudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICA/IFNvcnREaXJlY3Rpb24uRGVzY1xuICAgICAgICAgICAgICA6IFNvcnREaXJlY3Rpb24uTm9uZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBzZWFyY2hQYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSBbXTtcblxuICAgIC8vIGlmICh0aGlzLmFjdGl2ZUFwcCkge1xuICAgIC8vICAgcGF5bG9hZC5wdXNoKHtcbiAgICAvLyAgICAgUHJvcGVydHlOYW1lOiAnQXBwJyxcbiAgICAvLyAgICAgRW50aXR5VmFsdWU6IHRoaXMuYWN0aXZlQXBwLkNvZGUsXG4gICAgLy8gICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgLy8gICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAvLyAgIH0pO1xuICAgIC8vICAgc2VhcmNoUGF5bG9hZC5wdXNoKHtcbiAgICAvLyAgICAgUHJvcGVydHlOYW1lOiAnQXBwJyxcbiAgICAvLyAgICAgRW50aXR5VmFsdWU6IHRoaXMuYWN0aXZlQXBwLkNvZGUsXG4gICAgLy8gICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgLy8gICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAvLyAgIH0pO1xuICAgIC8vIH1cblxuICAgIGNvbnN0IHNlYXJjaFRlcm1FeGlzdHMgPSB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKS5sZW5ndGggPiAwO1xuXG4gICAgaWYgKHNlYXJjaFRlcm1FeGlzdHMpIHtcbiAgICAgIE9iamVjdC52YWx1ZXMoVGlja2V0UHJvcGVydHlNYXApLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG4gICAgICAgIHNlYXJjaFBheWxvYWQucHVzaCh7XG4gICAgICAgICAgUHJvcGVydHlOYW1lOiBwcm9wZXJ0eSxcbiAgICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5jdXJyZW50U2VhcmNoVGVybS50cmltKCksXG4gICAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLk9yLFxuICAgICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5MSUtFLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFjdGl2ZVRlbmFudCkge1xuICAgICAgcGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnVGVuYW50SWQnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVUZW5hbnQsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgIH0pO1xuICAgICAgc2VhcmNoUGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnVGVuYW50SWQnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVUZW5hbnQsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZXdBbGw6IGJvb2xlYW4gPVxuICAgICAgdGhpcy5wZXJtaXNzaW9uQ29uZmlnPy5BY3Rpb25zWydWaWV3QWxsVGlja2V0cyddIHx8IGZhbHNlO1xuXG4gICAgaWYgKCF2aWV3QWxsKSB7XG4gICAgICBwYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUYWcnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hY3RpdmVVc2VyIHx8ICcnLFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICB9KTtcbiAgICAgIHNlYXJjaFBheWxvYWQucHVzaCh7XG4gICAgICAgIFByb3BlcnR5TmFtZTogJ1RhZycsXG4gICAgICAgIEVudGl0eVZhbHVlOiB0aGlzLmFjdGl2ZVVzZXIgfHwgJycsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IHNlYXJjaFRlcm1FeGlzdHNcbiAgICAgID8gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgICAgICBgVGlja2V0L1NlYXJjaFRpY2tldC8wLyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICAgIHNlYXJjaFBheWxvYWQsXG4gICAgICAgICAgdGhpcy5vdmVycmlkZVRva2VuIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAgIClcbiAgICAgIDogcGF5bG9hZC5sZW5ndGggPT0gMFxuICAgICAgICA/IGF3YWl0IHRoaXMuc2VydmVyLmdldChcbiAgICAgICAgICAgIGBUaWNrZXQvR2V0VGlja2V0LyR7dGhpcy5wYWdlU3RhdGUuU2tpcH0vJHt0aGlzLnBhZ2VTaXplfWAsXG4gICAgICAgICAgICB0aGlzLm92ZXJyaWRlVG9rZW4gfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJLFxuICAgICAgICAgIClcbiAgICAgICAgOiBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgICAgICAgYFRpY2tldC9TZWFyY2hUaWNrZXQvJHt0aGlzLnBhZ2VTdGF0ZS5Ta2lwfS8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgICB0aGlzLm92ZXJyaWRlVG9rZW4gfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJLFxuICAgICAgICAgICk7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmVzdWx0ID0gcmVzIGFzIFBhZ2VkUmVzdWx0PFRpY2tldD47XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIG9uRmlsdGVyVXBkYXRlZCh1cGRhdGVkRmlsdGVyczogSURhdGFGaWx0ZXJbXSB8IHN0cmluZykge1xuICAgIC8vIEVuc3VyZSB1cGRhdGVkRmlsdGVycyBpcyBhbiBhcnJheVxuICAgIGlmIChBcnJheS5pc0FycmF5KHVwZGF0ZWRGaWx0ZXJzKSkge1xuICAgICAgdGhpcy5jdXJyZW50RmlsdGVycyA9IHVwZGF0ZWRGaWx0ZXJzO1xuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJzQW5kU29ydHMoKTtcbiAgICB9XG4gIH1cbiAgb25Tb3J0VXBkYXRlZCh1cGRhdGVkU29ydHM6IElEYXRhRmlsdGVyW10pIHtcbiAgICB0aGlzLmN1cnJlbnRTb3J0cyA9IHVwZGF0ZWRTb3J0cztcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcnNBbmRTb3J0cygpO1xuICB9XG5cbiAgaGFuZGxlU2VhcmNoKGV2ZW50OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnNlYXJjaFRlcm0kLm5leHQoZXZlbnQudmFsdWUpO1xuICB9XG5cbiAgaGFuZGxlRXhwb3J0KGV4cG9ydGVkRGF0YTogUGFydGlhbDxhbnk+W10pIHtcbiAgICAvLyBjb25zb2xlLmxvZygnRXhwb3J0ZWQgZGF0YTonLCBleHBvcnRlZERhdGEpO1xuICAgIHRoaXMuZG93bmxvYWRDU1YoZXhwb3J0ZWREYXRhKTtcbiAgfVxuXG4gIGlzRmlsdGVyZWRTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jdXJyZW50U2VhcmNoVGVybS50cmltKCkubGVuZ3RoID4gMCB8fCB0aGlzLmN1cnJlbnRGaWx0ZXJzLmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBkb3dubG9hZENTVihkYXRhOiBQYXJ0aWFsPGFueT5bXSkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBPYmplY3Qua2V5cyhkYXRhWzBdKTtcbiAgICBjb25zdCBjc3ZDb250ZW50ID0gW1xuICAgICAgaGVhZGVycy5qb2luKCcsJyksXG4gICAgICAuLi5kYXRhLm1hcCgocm93KSA9PiBoZWFkZXJzLm1hcCgoaGVhZGVyKSA9PiByb3dbaGVhZGVyXSkuam9pbignLCcpKSxcbiAgICBdLmpvaW4oJ1xcbicpO1xuXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjc3ZDb250ZW50XSwgeyB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtODsnIH0pO1xuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgaWYgKGxpbmsuZG93bmxvYWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgdXJsKTtcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsICdleHBvcnQuY3N2Jyk7XG4gICAgICBsaW5rLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xuICAgIH1cbiAgfVxuXG4gIC8vIGdldCBkZWZhdWx0Q29tcGFueSgpOiBzdHJpbmcge1xuICAvLyAgIGNvbnN0IGNoZWNrID0gdGhpcy5zdG9yZS5nZXQoQXBwS2V5LlVTRVIpO1xuICAvLyAgIGlmICghY2hlY2spIHtcbiAgLy8gICAgIHJldHVybiAnJztcbiAgLy8gICB9XG4gIC8vICAgY29uc3QgdXNlcjogVXNlciA9ICh0aGlzLnN0b3JlLmdldChBcHBLZXkuVVNFUikgYXMgeyBVc2VyOiBVc2VyIH0pLlVzZXI7XG4gIC8vICAgcmV0dXJuIHVzZXIuRGVmYXVsdENvbXBhbnkgfHwgJyc7XG4gIC8vIH1cblxuICBvbkNvbXBsZXRlKGV2ZW50OiBhbnlbXSkge1xuICAgIHZhciBkZWZhdWx0SXRlbTogVGlja2V0ID0ge1xuICAgICAgVGl0bGU6ICcnLFxuICAgICAgRGVzY3JpcHRpb246ICcnLFxuICAgICAgQXBwOiB0aGlzLmFjdGl2ZUFwcCA/IHRoaXMuYWN0aXZlQXBwIDogJycsXG4gICAgICBTdGF0dXM6IFRpY2tldFN0YXR1cy5QZW5kaW5nLFxuICAgICAgQ29tcGFueTogdGhpcy5kZWZhdWx0Q29tcGFueSxcbiAgICAgIE1lc3NhZ2VzOiBbXSxcbiAgICAgIEZpbGVEYXRhOiBbXSxcbiAgICAgIEZpbGVVcmxzOiBbXSxcbiAgICAgIElkOiB0aGlzLnRpY2tldHMubGVuZ3RoLnRvU3RyaW5nKCksXG4gICAgICBpZDogJycsXG4gICAgICBDb2RlOiAnJyxcbiAgICAgIFRlbmFudElkOiB0aGlzLmFjdGl2ZVRlbmFudCA/IHRoaXMuYWN0aXZlVGVuYW50IDogJycsXG4gICAgICBTZXJ2aWNlTmFtZTogJycsXG4gICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLk5ldyxcbiAgICAgIFRhZzogdGhpcy5hY3RpdmVVc2VyIHx8IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIHRoaXMuaW1wb3J0U2VydmljZS5vbkNvbXBsZXRlKFxuICAgICAgZXZlbnQsXG4gICAgICBkZWZhdWx0SXRlbSxcbiAgICAgICdUaWNrZXQvU2F2ZVRpY2tldCcsXG4gICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgICAnVGlja2V0JyxcbiAgICAgIChpdGVtczogVGlja2V0W10pID0+IHtcbiAgICAgICAgdGhpcy50aWNrZXRzID0gdGhpcy50aWNrZXRzLmNvbmNhdChpdGVtcyk7XG4gICAgICB9LFxuICAgICAgdGhpcy5wYWdlU3RhdGUsXG4gICAgKTtcbiAgfVxuXG4gIHRhYmxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgVGlja2V0PigpO1xuXG4gIGNhY2hlSXRlbShpdGVtOiBUaWNrZXQpIHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGl0ZW0uSWQ7XG4gICAgdGhpcy50YWJsZUNhY2hlLnNldChjYWNoZUtleSwgSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpdGVtKSkpO1xuICB9XG5cbiAgcmVzdG9yZUNhY2hlKGl0ZW06IFRpY2tldCkge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gaXRlbS5JZDtcbiAgICBjb25zdCBpdGVtQ2FjaGUgPSB0aGlzLnRhYmxlQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoaXRlbUNhY2hlKSB7XG4gICAgICBpdGVtLkRlc2NyaXB0aW9uID0gaXRlbUNhY2hlLkRlc2NyaXB0aW9uO1xuICAgICAgaXRlbS5Qcmlvcml0eSA9IGl0ZW1DYWNoZS5Qcmlvcml0eTtcbiAgICAgIGl0ZW0uU3RhdHVzID0gaXRlbUNhY2hlLlN0YXR1cztcbiAgICB9XG4gICAgdGhpcy50YWJsZUNhY2hlLmRlbGV0ZShjYWNoZUtleSk7XG4gIH1cblxuICAvLyBvbkFwcFNlbGVjdGVkKGFwcDogQXBwbGljYXRpb24gfCBudWxsKSB7XG4gIC8vICAgdGhpcy5hY3RpdmVBcHAgPSBhcHA7XG4gIC8vICAgLy8gaWYgKGFwcCkge1xuICAvLyAgIC8vICAgY29uc3QgdGVuYW50cyA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXRUZW5hbnRzQnlBcHAoYXBwLkNvZGUpO1xuICAvLyAgIC8vICAgaWYgKHRlbmFudHMpIHtcbiAgLy8gICAvLyAgICAgdGhpcy50ZW5hbnRzID0gdGVuYW50cztcbiAgLy8gICAvLyAgIH1cbiAgLy8gICAvLyB9XG4gIC8vIH1cblxuICBvbkFwcExpc3RVcGRhdGVkKGFwcHM6IEFwcGxpY2F0aW9uW10pIHtcbiAgICB0aGlzLmFwcHMgPSBhcHBzO1xuICB9XG5cbiAgb25UZW5hbnRMaXN0VXBkYXRlZCh0ZW5hbnRzOiBUZW5hbnRbXSkge1xuICAgIHRoaXMudGVuYW50cyA9IHRlbmFudHM7XG4gIH1cblxuICBnZXRMb2dvVXJsKHVybDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZW52U3ZjLmVudmlyb25tZW50LkF1dGhlbnRpY2F0aW9uQVBJfS8ke3VybH1gO1xuICB9XG5cbiAgYWRkTmV3VGlja2V0KCkge1xuICAgIHRoaXMuc2VsZWN0ZWRUaWNrZXQgPSBudWxsO1xuICAgIHRoaXMuc2hvd1RpY2tldEZvcm0gPSB0cnVlO1xuICB9XG5cbiAgLy8gZWRpdEFwcChhcHA6IEFwcGxpY2F0aW9uKSB7XG4gIC8vICAgdGhpcy5zZWxlY3RlZEFwcCA9IGFwcDtcbiAgLy8gICB0aGlzLnNob3dBcHBGb3JtID0gdHJ1ZTtcbiAgLy8gfVxuXG4gIC8vIGVkaXRUZW5hbnQodGVuYW50OiBUZW5hbnQpIHtcbiAgLy8gICB0aGlzLnNlbGVjdGVkVGVuYW50ID0gdGVuYW50O1xuICAvLyAgIHRoaXMuc2hvd1RlbmFudEZvcm0gPSB0cnVlO1xuICAvLyB9XG5cbiAgZWRpdFRpY2tldCh0aWNrZXQ6IFRpY2tldCkge1xuICAgIHRoaXMuc2VsZWN0ZWRUaWNrZXQgPSB0aWNrZXQ7XG4gICAgdGhpcy5zaG93VGlja2V0Rm9ybSA9IHRydWU7XG4gIH1cblxuICAvLyBvbkFwcE1vZGFsQ2xvc2UoKSB7XG4gIC8vICAgdGhpcy5zaG93QXBwRm9ybSA9IGZhbHNlO1xuICAvLyAgIHRoaXMuc2VsZWN0ZWRBcHAgPSBudWxsO1xuICAvLyB9XG5cbiAgLy8gb25UZW5hbnRNb2RhbENsb3NlKCkge1xuICAvLyAgIHRoaXMuc2hvd1RlbmFudEZvcm0gPSBmYWxzZTtcbiAgLy8gICB0aGlzLnNlbGVjdGVkVGVuYW50ID0gbnVsbDtcbiAgLy8gfVxuXG4gIG9uVGlja2V0TW9kYWxDbG9zZSgpIHtcbiAgICB0aGlzLnNob3dUaWNrZXRGb3JtID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3RlZFRpY2tldCA9IG51bGw7XG4gIH1cblxuICAvLyBvbkFwcFNhdmUoYXBwOiBBcHBsaWNhdGlvbikge1xuICAvLyAgIGNvbnN0IGlkeCA9IHRoaXMuYXBwcy5maW5kSW5kZXgoKHgpID0+IHguQ29kZSA9PSBhcHAuQ29kZSk7XG5cbiAgLy8gICBpZiAoYXBwLkNvZGUudHJpbSgpLmxlbmd0aCA+IDAgJiYgaWR4ID4gLTEpIHtcbiAgLy8gICAgIHRoaXMuYXBwc1tpZHhdLk5hbWUgPSBhcHAuTmFtZTtcbiAgLy8gICAgIHRoaXMuYXBwc1tpZHhdLkRlc2NyaXB0aW9uID0gYXBwLkRlc2NyaXB0aW9uO1xuICAvLyAgICAgdGhpcy5hcHBzW2lkeF0uRGF0YVN0YXRlID0gYXBwLkRhdGFTdGF0ZTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgdGhpcy5hcHBzLnB1c2goYXBwKTtcbiAgLy8gICB9XG4gIC8vIH1cblxuICAvLyBvblRlbmFudFNhdmUodGVuYW50OiBUZW5hbnQpIHtcbiAgLy8gICBjb25zdCBpZHggPSB0aGlzLnRlbmFudHMuZmluZEluZGV4KCh4KSA9PiB4LkNvZGUgPT0gdGVuYW50LkNvZGUpO1xuXG4gIC8vICAgaWYgKHRlbmFudC5Db2RlLnRyaW0oKS5sZW5ndGggPiAwICYmIGlkeCA+IC0xKSB7XG4gIC8vICAgICB0aGlzLnRlbmFudHNbaWR4XS5OYW1lID0gdGVuYW50Lk5hbWU7XG4gIC8vICAgICB0aGlzLnRlbmFudHNbaWR4XS5EZXNjcmlwdGlvbiA9IHRlbmFudC5EZXNjcmlwdGlvbjtcbiAgLy8gICAgIHRoaXMudGVuYW50c1tpZHhdLkRhdGFTdGF0ZSA9IHRlbmFudC5EYXRhU3RhdGU7XG4gIC8vICAgfSBlbHNlIHtcbiAgLy8gICAgIHRoaXMudGVuYW50cy5wdXNoKHRlbmFudCk7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgb25UaWNrZXRTYXZlKHRpY2tldDogVGlja2V0KSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy50aWNrZXRzLmZpbmRJbmRleCgoeCkgPT4geC5Db2RlID09IHRpY2tldC5Db2RlKTtcblxuICAgIC8vIGNvbnNvbGUubG9nKHsgVGlja2V0czogdGhpcy50aWNrZXRzLCBUaWNrZXQ6IHRpY2tldCwgaWR4OiBpZHggfSk7XG4gICAgaWYgKHRpY2tldC5Db2RlLnRyaW0oKS5sZW5ndGggPiAwICYmIGlkeCA+IC0xKSB7XG4gICAgICB0aGlzLnRpY2tldHNbaWR4XS5UaXRsZSA9IHRpY2tldC5UaXRsZTtcbiAgICAgIHRoaXMudGlja2V0c1tpZHhdLkRlc2NyaXB0aW9uID0gdGlja2V0LkRlc2NyaXB0aW9uO1xuICAgICAgLy8gICB0aGlzLnRpY2tldHNbaWR4XS5DdXJyZW50SGFuZGxlciA9IHRpY2tldC5DdXJyZW50SGFuZGxlcjtcbiAgICAgIHRoaXMudGlja2V0c1tpZHhdLlByaW9yaXR5ID0gdGlja2V0LlByaW9yaXR5O1xuICAgICAgdGhpcy50aWNrZXRzW2lkeF0uU3RhdHVzID0gdGlja2V0LlN0YXR1cztcbiAgICAgIHRoaXMudGlja2V0c1tpZHhdLkZpbGVVcmxzID0gdGlja2V0LkZpbGVVcmxzO1xuICAgICAgdGhpcy50aWNrZXRzW2lkeF0uRGF0YVN0YXRlID0gdGlja2V0LkRhdGFTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50aWNrZXRzLnVuc2hpZnQodGlja2V0KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVUYWJsZSgpO1xuICB9XG5cbiAgdmlld1RpY2tldERldGFpbHModGlja2V0OiBUaWNrZXQpIHtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLmdvVG9QYWdlKGAke3RoaXMuZGV0YWlsUGF0aH1gLCB0aWNrZXQuQ29kZSk7XG4gIH1cblxuICBjc3NDb2xvclRvSGV4KGNvbG9yOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBjdHggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgaWYgKCFjdHgpIHJldHVybiBudWxsO1xuXG4gICAgY3R4LmZpbGxTdHlsZSA9ICcjMDAwJzsgLy8gc2V0IGEga25vd24gY29sb3JcbiAgICBjdHguZmlsbFN0eWxlID0gY29sb3I7IC8vIGFzc2lnbiBhbnkgQ1NTLXZhbGlkIGNvbG9yXG5cbiAgICBjb25zdCBjb21wdXRlZCA9IGN0eC5maWxsU3R5bGU7XG4gICAgLy8gSWYgdGhlIGJyb3dzZXIgZG9lcyBOT1QgdW5kZXJzdGFuZCB0aGUgdmFsdWUsIGl0IHdvbuKAmXQgY2hhbmdlIGZyb20gJyMwMDAnXG4gICAgaWYgKFxuICAgICAgY29tcHV0ZWQudG9Mb3dlckNhc2UoKSA9PT0gJyMwMDAwMDAnICYmXG4gICAgICBjb2xvci50b0xvd2VyQ2FzZSgpICE9PSAnYmxhY2snXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBjb2xvciBuYW1lIG9yIHVuc3VwcG9ydGVkIHZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXB1dGVkLnRvVXBwZXJDYXNlKCk7IC8vIHJldHVybnMgaGV4IGxpa2UgIzFFOTBGRlxuICB9XG4gIHNvZnRlbkNvbG9yKGhleDogc3RyaW5nLCBsaWdodGVuUGVyY2VudCA9IDU1LCBhbHBoYVBlcmNlbnQgPSA1NSk6IHN0cmluZyB7XG4gICAgLy8gUmVtb3ZlICNcbiAgICBpZiAoIWhleC5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgIGNvbnN0IGNvbnZlcnRlZCA9IHRoaXMuY3NzQ29sb3JUb0hleChoZXgpO1xuICAgICAgaWYgKGNvbnZlcnRlZCkge1xuICAgICAgICBoZXggPSBjb252ZXJ0ZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaGV4ID0gaGV4LnJlcGxhY2UoL14jLywgJycpO1xuICAgIGlmIChoZXgubGVuZ3RoID09PSAzKSB7XG4gICAgICAvLyBDb252ZXJ0IHNob3J0aGFuZCAoI2FiYyDihpIgI2FhYmJjYylcbiAgICAgIGhleCA9IGhleFxuICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgIC5tYXAoKHgpID0+IHggKyB4KVxuICAgICAgICAuam9pbignJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbnVtID0gcGFyc2VJbnQoaGV4LCAxNik7XG4gICAgbGV0IHIgPSAobnVtID4+IDE2KSAmIDB4ZmY7XG4gICAgbGV0IGcgPSAobnVtID4+IDgpICYgMHhmZjtcbiAgICBsZXQgYiA9IG51bSAmIDB4ZmY7XG5cbiAgICAvLyBMaWdodGVuIHRvd2FyZCB3aGl0ZSBieSB0aGUgZ2l2ZW4gcGVyY2VudGFnZVxuICAgIHIgPSBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQociArICgyNTUgLSByKSAqIChsaWdodGVuUGVyY2VudCAvIDEwMCkpKTtcbiAgICBnID0gTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKGcgKyAoMjU1IC0gZykgKiAobGlnaHRlblBlcmNlbnQgLyAxMDApKSk7XG4gICAgYiA9IE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZChiICsgKDI1NSAtIGIpICogKGxpZ2h0ZW5QZXJjZW50IC8gMTAwKSkpO1xuXG4gICAgLy8gQ29udmVydCBhbHBoYSBwZXJjZW50IHRvIDItZGlnaXQgaGV4XG4gICAgY29uc3QgYWxwaGEgPSBNYXRoLnJvdW5kKChhbHBoYVBlcmNlbnQgLyAxMDApICogMjU1KTtcbiAgICBjb25zdCBhSGV4ID0gYWxwaGEudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykudG9VcHBlckNhc2UoKTtcblxuICAgIHJldHVybiBgIyR7ci50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKS50b1VwcGVyQ2FzZSgpfSR7Z1xuICAgICAgLnRvU3RyaW5nKDE2KVxuICAgICAgLnBhZFN0YXJ0KDIsICcwJylcbiAgICAgIC50b1VwcGVyQ2FzZSgpfSR7Yi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKS50b1VwcGVyQ2FzZSgpfSR7YUhleH1gO1xuICB9XG5cbiAgaXNEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUaWNrZXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRpY2tldC5TdGF0dXMgIT0gdGhpcy5wZW5kaW5nUmVmO1xuICB9XG5cbiAgdG9nZ2xlQ2xvc3VyZURpYWxvZ3VlKGl0ZW06IFRpY2tldCkge1xuICAgIHRoaXMuY2xvc3VyZVRpY2tldCA9IGl0ZW07XG4gICAgdGhpcy5zaG93Q2xvc3VyZURpYWxvZ3VlID0gIXRoaXMuc2hvd0Nsb3N1cmVEaWFsb2d1ZTtcbiAgfVxuXG4gIG9uTW9kYWxPcGVuKGV2ZW50OiBhbnkpIHt9XG5cbiAgb25Nb2RhbENsb3NlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmNsb3N1cmVSZWFzb24gPSAnJztcbiAgICB0aGlzLmNsb3N1cmVUaWNrZXQgPSBudWxsO1xuICAgIHRoaXMuc2hvd0Nsb3N1cmVEaWFsb2d1ZSA9IGZhbHNlO1xuICB9XG5cbiAgY2FuQ2xvc2UoaXRlbTogVGlja2V0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGl0ZW0uU3RhdHVzID09IFRpY2tldFN0YXR1cy5QZW5kaW5nO1xuICB9XG5cbiAgYXN5bmMgY2xvc2VUaWNrZXQoKSB7XG4gICAgaWYgKCF0aGlzLmNsb3N1cmVUaWNrZXQgfHwgIXRoaXMuY2FuQ2xvc2UodGhpcy5jbG9zdXJlVGlja2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNsb3N1cmVSZWFzb24udHJpbSgpLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dJbmZvKCdSZWFzb24gY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZDogS2V5VmFsdWVQYXJhbSA9IHtcbiAgICAgIEtleTogdGhpcy5jbG9zdXJlVGlja2V0LkNvZGUsXG4gICAgICBWYWx1ZTogdGhpcy5hY3RpdmVVc2VyIHx8ICcnLFxuICAgICAgT3RoZXI6IHRoaXMuY2xvc3VyZVJlYXNvbixcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2aWNlLmNsb3NlVGlja2V0KHBheWxvYWQpO1xuICAgIGlmIChyZXMpIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ1RpY2tldCBjbG9zZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICB0aGlzLmNsb3N1cmVUaWNrZXQuU3RhdHVzID0gcmVzLlN0YXR1cztcbiAgICAgIHRoaXMuY2xvc3VyZVRpY2tldC5MYXN0SGFuZGxlciA9IHJlcy5MYXN0SGFuZGxlcjtcbiAgICAgIHRoaXMuY2xvc3VyZVRpY2tldC5FeGVjdXRpb25UaW1lID0gcmVzLkV4ZWN1dGlvblRpbWU7XG4gICAgICB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gICAgICB0aGlzLm9uTW9kYWxDbG9zZSgnJyk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiaC1mdWxsIGZsZXggZmxleC1jb2wgZ2FwLTRcIj5cbiAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIj5cbiAgICA8IS0tIDxhcHAtdGVuYW50LXNlbGVjdG9yXG4gICAgICAob25BcHBTZWxlY3RlZCk9XCJ0aGlzLm9uQXBwU2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAob25UZW5hbnRTZWxlY3RlZCk9XCJvblRlbmFudFNlbGVjdGVkKCRldmVudClcIlxuICAgICAgKG9uQXBwc1VwZGF0ZWQpPVwidGhpcy5vbkFwcExpc3RVcGRhdGVkKCRldmVudClcIlxuICAgICAgKG9uVGVuYW50c1VwZGF0ZWQpPVwidGhpcy5vblRlbmFudExpc3RVcGRhdGVkKCRldmVudClcIlxuICAgID48L2FwcC10ZW5hbnQtc2VsZWN0b3I+IC0tPlxuXG4gICAgPGRpdiBjbGFzcz1cInRpY2tldHMtc2VjdGlvbiBmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidGlja2V0LXRhYmxlLWNvbnRhaW5lclwiPlxuICAgICAgICA8dmVyYmVuLWRhdGEtdmlld1xuICAgICAgICAgICN2ZHZcbiAgICAgICAgICBbdmlld1N0YXRlXT1cIntcbiAgICAgICAgICAgIGlzU2VhcmNoOiB0cnVlLFxuICAgICAgICAgICAgaXNDb2x1bW46IHRydWUsXG4gICAgICAgICAgICBpc0ZpbHRlcjogdHJ1ZSxcbiAgICAgICAgICAgIGlzU29ydDogdHJ1ZSxcbiAgICAgICAgICAgIGlzRXhwb3J0OiAhcGVybWlzc2lvbkNvbmZpZyB8fCBwZXJtaXNzaW9uQ29uZmlnLkFjdGlvbnNbJ0V4cG9ydCddLFxuICAgICAgICAgICAgaXNTZWxlY3Q6IHRydWUsXG4gICAgICAgICAgICBpc0NyZWF0ZTogZmFsc2UsXG4gICAgICAgICAgICBpc1RvZ2dsZTogZmFsc2UsXG4gICAgICAgICAgICBpc0ltcG9ydDogIXBlcm1pc3Npb25Db25maWcgfHwgcGVybWlzc2lvbkNvbmZpZy5BY3Rpb25zWydJbXBvcnQnXSxcbiAgICAgICAgICB9XCJcbiAgICAgICAgICBbYnV0dG9uQ2xhc3NdPVwiJ215LWN1c3RvbS1idXR0b24tY2xhc3MnXCJcbiAgICAgICAgICBbaWNvbkNsYXNzXT1cIidteS1pY29uLWNsYXNzJ1wiXG4gICAgICAgICAgW2FjdGl2ZUljb25DbGFzc109XCInbXktYWN0aXZlLWljb24tY2xhc3MnXCJcbiAgICAgICAgICBbc2VsZWN0ZWRDb2x1bW5Db3VudF09XCIwXCJcbiAgICAgICAgICBbc2VsZWN0ZWRTb3J0Q291bnRdPVwiMFwiXG4gICAgICAgICAgW3NlbGVjdGVkRmlsdGVyVGFibGVDb3VudF09XCIwXCJcbiAgICAgICAgICAodmlld0NoYW5nZSk9XCJvblZpZXdDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgKG9uU2VhcmNoQ2hhbmdlKT1cImhhbmRsZVNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICBbaXNUYWJsZVZpZXddPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiIHRhYmxlLWNvbnRlbnQ+XG4gICAgICAgICAgICA8bGliLWRhdGEtdGFibGVcbiAgICAgICAgICAgICAgW2RhdGFLZXldPVwiJ0lkJ1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS10YWJsZVwiXG4gICAgICAgICAgICAgICNkdFxuICAgICAgICAgICAgICBbZGF0YV09XCJ0aWNrZXRzXCJcbiAgICAgICAgICAgICAgW2NvbHVtbnNdPVwidmlzaWJsZUNvbHVtbkRlZlwiXG4gICAgICAgICAgICAgIFtzdHlsZUNvbmZpZ109XCJzdHlsZXNcIlxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cInNlbGVjdFwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgI2NlbGxcbiAgICAgICAgICAgICAgICAgIGxldC1pc1NlbGVjdGVkPVwiaXNTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICBsZXQtdG9nZ2xlUm93U2VsZWN0aW9uPVwidG9nZ2xlUm93U2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlUm93U2VsZWN0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgI2hlYWRlclxuICAgICAgICAgICAgICAgICAgbGV0LWFsbFJvd3NTZWxlY3RlZD1cImFsbFJvd3NTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICBsZXQtc29tZVJvd3NTZWxlY3RlZD1cInNvbWVSb3dzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgbGV0LXRvZ2dsZUFsbFJvd3M9XCJ0b2dnbGVBbGxSb3dzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWxsUm93c1NlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzb21lUm93c1NlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUFsbFJvd3MoKVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImNyZWF0ZWRBdFwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgICB7eyB2YWx1ZSB8IGNvbXBhbnlEYXRlIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwidXBkYXRlZEF0XCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgIHt7IHZhbHVlIHwgY29tcGFueURhdGUgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAge3sgcm93LlRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICNjZWxsRWRpdFxuICAgICAgICAgICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgICAgICAgICBsZXQtdXBkYXRlRGF0YT1cInVwZGF0ZURhdGFcIlxuICAgICAgICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndpZHRoLW1heFwiPlxuICAgICAgICAgICAgICAgICAgICA8dmVyYmVuYS1pbnB1dCBbKG5nTW9kZWwpXT1cInJvdy5UaXRsZVwiPjwvdmVyYmVuYS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgcm93LkRlc2NyaXB0aW9uPy5sZW5ndGggPiA0MCA/IHJvdy5EZXNjcmlwdGlvbiA6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgcm93LkRlc2NyaXB0aW9uIHwgZWxsaXBzZVdvcmQgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgICAgICAgIGxldC11cGRhdGVEYXRhPVwidXBkYXRlRGF0YVwiXG4gICAgICAgICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2lkdGgtbWF4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cuRGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICA+PC92ZXJiZW5hLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJ3aWR0aC1tYXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHZlcmJlbmEtdGV4dGFyZWEgWyhuZ01vZGVsKV09XCJyb3cuRGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPC92ZXJiZW5hLXRleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImN1cnJlbnRIYW5kbGVyXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgICB7eyByb3cuQ3VycmVudEhhbmRsZXIgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJsYXN0SGFuZGxlclwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAge3sgcm93Lkxhc3RIYW5kbGVyIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJwcmlvcml0eVwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIHJvdy5Qcmlvcml0eSAmJiByb3cuUHJpb3JpdHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNMYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdUZW5hbnRQcmlvcml0eSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnQ29sb3InXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogdGlja2V0aW5nQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogb3ZlcnJpZGVUb2tlbiB8fCB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmMgYXMgY29sb3JcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlbnVtLXZhbCByb3VuZGVkLVs4cHhdIGZsZXggZ2FwLTIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJjb2xvciA/IHNvZnRlbkNvbG9yKGNvbG9yKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZW51bS1kb3RcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgICAgICAgIHJvdy5Qcmlvcml0eVxuICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY0xhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJUZW5hbnRQcmlvcml0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aWNrZXRpbmdBUElcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvdmVycmlkZVRva2VuIHx8IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAjY2VsbEVkaXRcbiAgICAgICAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgbGV0LXVwZGF0ZURhdGE9XCJ1cGRhdGVEYXRhXCJcbiAgICAgICAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3aWR0aC1tYXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHZlcmJlbmEtaW5wdXQgWyhuZ01vZGVsKV09XCJyb3cuUHJpb3JpdHlcIj48L3ZlcmJlbmEtaW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cInN0YXR1c1wiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJvdy5TdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVudW0tdmFsIHJvdW5kZWQtWzhweF0gZmxleCBnYXAtMiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIge3tcbiAgICAgICAgICAgICAgICAgICAgICByb3cuU3RhdHVzXG4gICAgICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbnVtLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcm93LlN0YXR1cyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAjY2VsbEVkaXRcbiAgICAgICAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgbGV0LXVwZGF0ZURhdGE9XCJ1cGRhdGVEYXRhXCJcbiAgICAgICAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDx2ZXJiZW4tZHJvcC1kb3duXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFN0YXR1c1wiXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInN0YXR1c09wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy5TdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPC92ZXJiZW4tZHJvcC1kb3duPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwiY2xvc2VcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRoaXMuY2FuQ2xvc2Uocm93KVwiXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidmVyYmVuLXByaW1hcnktYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiJ0Nsb3NlIFRpY2tldCdcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCIhdGhpcy5jYW5DbG9zZShyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNsb3N1cmVEaWFsb2d1ZShyb3cpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDwvdmVyYmVuYS1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJhY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAjY2VsbFxuICAgICAgICAgICAgICAgICAgbGV0LWlzRWRpdGluZz1cImlzRWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgICBsZXQtdG9nZ2xlUm93RWRpdD1cInRvZ2dsZVJvd0VkaXRcIlxuICAgICAgICAgICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8dmVyYmVuLXBvcC1VcFxuICAgICAgICAgICAgICAgICAgICAjcG9wdXBcbiAgICAgICAgICAgICAgICAgICAgW2N1c3RvbVN0eWxlc109XCJ7ICd6LWluZGV4JzogJzk5JyB9XCJcbiAgICAgICAgICAgICAgICAgICAgW2VuYWJsZU1vdXNlTGVhdmVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8dmVyYmVuLXN2Z1xuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgYWN0aW9ucy1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi10cmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImxpc3RcIlxuICAgICAgICAgICAgICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wLXVwLWNvbnRlbnQgZmxleCBmbGV4LWNvbFwiIGRyb3Bkb3duLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXBlcm1pc3Npb25Db25maWcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbkNvbmZpZy5BY3Rpb25zWydDcmVhdGUnXVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0VGlja2V0KHZhbHVlKTsgY2xvc2VQb3BVcCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicG9wLXVwLXZhbHVlIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInZpZXdUaWNrZXREZXRhaWxzKHZhbHVlKTsgY2xvc2VQb3BVcCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicG9wLXVwLXZhbHVlIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBWaWV3IERldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L3ZlcmJlbi1wb3AtVXA+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICNjZWxsRWRpdFxuICAgICAgICAgICAgICAgICAgbGV0LWlzRWRpdGluZz1cImlzRWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgICBsZXQtdG9nZ2xlUm93RWRpdD1cInRvZ2dsZVJvd0VkaXRcIlxuICAgICAgICAgICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMiBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgICAgICAgICBpY29uPVwidGlja1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidGFibGVTYXZlVGlja2V0KHZhbHVlLCB0b2dnbGVSb3dFZGl0KVwiXG4gICAgICAgICAgICAgICAgICAgID48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc3RvcmVDYWNoZSh2YWx1ZSk7IHRvZ2dsZVJvd0VkaXQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImNsb3NlLW5vLWNpcmNsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8dmVyYmVuLXN2ZyAoY2xpY2spPVwidG9nZ2xlUm93RWRpdCgpXCIgaWNvbj1cImRlbGV0ZVwiIFt3aWR0aF09XCIxNVwiIFtoZWlnaHRdPVwiMTVcIj48L3ZlcmJlbi1zdmc+IC0tPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2xpYi1kYXRhLXRhYmxlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY29sdW1uLWNvbnRlbnQ+XG4gICAgICAgICAgICA8dmVyYmVuLXZpc2libGUtY29sdW1uXG4gICAgICAgICAgICAgIChjb2x1bW5zVXBkYXRlZCk9XCJvbkNvbHVtbnNVcGRhdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICBbYm9yZGVyXT1cIicxcHggc29saWQgcmdiYSgyMTIsIDE2MCwgNywgMSknXCJcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzPVwiMTBweFwiXG4gICAgICAgICAgICAgIGJveFNoYWRvdz1cIjJweCAycHggMnB4IDBweCBzaWx2ZXJcIlxuICAgICAgICAgICAgICBiZ0NvbG9yPVwid2hpdGVcIlxuICAgICAgICAgICAgICB3aWR0aD1cIjQwMHB4XCJcbiAgICAgICAgICAgICAgdGV4dENvbG9yPVwiYmxhY2tcIlxuICAgICAgICAgICAgICBwZD1cIjFyZW1cIlxuICAgICAgICAgICAgICBwcmltYXJ5Q29sb3I9XCIjRkZFNjgxXCJcbiAgICAgICAgICAgICAgc2Vjb25kYXJ5Q29sb3I9XCIjMzQ3OUU5XCJcbiAgICAgICAgICAgICAgW2NvbHVtbnNdPVwidmlzaWJsZUNvbHVtbnNcIlxuICAgICAgICAgICAgICBbZGlzcGxheWVkQ29sdW1uc109XCI1XCJcbiAgICAgICAgICAgID48L3ZlcmJlbi12aXNpYmxlLWNvbHVtbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGZpbHRlci1jb250ZW50PlxuICAgICAgICAgICAgPHZlcmJlbi10YWJsZS1maWx0ZXJcbiAgICAgICAgICAgICAgKGZpbHRlcnNBcHBsaWVkKT1cIm9uRmlsdGVyVXBkYXRlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2JvcmRlcl09XCInMXB4IHNvbGlkIHJnYmEoMjEyLCAxNjAsIDcsIDEpJ1wiXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1cz1cIjEwcHhcIlxuICAgICAgICAgICAgICBib3hTaGFkb3c9XCIycHggMnB4IDJweCAwcHggc2lsdmVyXCJcbiAgICAgICAgICAgICAgYmdDb2xvcj1cIndoaXRlXCJcbiAgICAgICAgICAgICAgd2lkdGg9XCI0MjBweFwiXG4gICAgICAgICAgICAgIHRleHRDb2xvcj1cImJsYWNrXCJcbiAgICAgICAgICAgICAgcGQ9XCIxcmVtXCJcbiAgICAgICAgICAgICAgcHJpbWFyeUNvbG9yPVwiI0ZGRTY4MVwiXG4gICAgICAgICAgICAgIHNlY29uZGFyeUNvbG9yPVwiIzM0NzlFOVwiXG4gICAgICAgICAgICAgIHRlcnRpYXJ5Q29sb3I9XCIjNDA0MDQwXCJcbiAgICAgICAgICAgICAgW2ZpbHRlck9wdGlvbnNdPVwiZmlsdGVyQXJyYXlcIlxuICAgICAgICAgICAgICBbbWF4RmlsdGVyTGVuZ3RoXT1cIjNcIlxuICAgICAgICAgICAgPjwvdmVyYmVuLXRhYmxlLWZpbHRlcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHNvcnQtY29udGVudD5cbiAgICAgICAgICAgIDx2ZXJiZW4tc29ydC10YWJsZVxuICAgICAgICAgICAgICAoc2VsZWN0ZWRPcHRpb25zKT1cIm9uU29ydFVwZGF0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtib3JkZXJdPVwiJzFweCBzb2xpZCByZ2JhKDIxMiwgMTYwLCA3LCAxKSdcIlxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM9XCIxMHB4XCJcbiAgICAgICAgICAgICAgYm94U2hhZG93PVwiMnB4IDJweCAycHggMHB4IHNpbHZlclwiXG4gICAgICAgICAgICAgIGJnQ29sb3I9XCJ3aGl0ZVwiXG4gICAgICAgICAgICAgIHdpZHRoPVwiNDAwcHhcIlxuICAgICAgICAgICAgICB0ZXh0Q29sb3I9XCJibGFja1wiXG4gICAgICAgICAgICAgIHBkPVwiMXJlbVwiXG4gICAgICAgICAgICAgIHByaW1hcnlDb2xvcj1cIiNGRkU2ODFcIlxuICAgICAgICAgICAgICBzZWNvbmRhcnlDb2xvcj1cIiMzNDc5RTlcIlxuICAgICAgICAgICAgICB0ZXJ0aWFyeUNvbG9yPVwiIzQwNDA0MFwiXG4gICAgICAgICAgICAgIFtlbmFibGVEcmFnQW5kRHJvcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3NvcnRPcHRpb25zXT1cInNvcnRPcHRpb25zXCJcbiAgICAgICAgICAgID48L3ZlcmJlbi1zb3J0LXRhYmxlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgaW1wb3J0LWNvbnRlbnQ+XG4gICAgICAgICAgICA8bGliLWRhdGEtaW1wb3J0XG4gICAgICAgICAgICAgIFtwcmV2aWV3Q29sdW1uc109XCJ2aXNpYmxlQ29sdW1uRGVmXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ0aWNrZXRcIlxuICAgICAgICAgICAgICAoaW1wb3J0RXZlbnREYXRhKT1cIm9uQ29tcGxldGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtjb2x1bW5UZW1wbGF0ZXNdPVwiY29sdW1uVGVtcGxhdGVzKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9saWItZGF0YS1pbXBvcnQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBleHBvcnQtY29udGVudD5cbiAgICAgICAgICAgIDxsaWItZGF0YS14cG9ydFxuICAgICAgICAgICAgICBbdXNlSW1wb3J0S2V5XT1cInRydWVcIlxuICAgICAgICAgICAgICBbY29sdW1uc109XCJ2aXNpYmxlQ29sdW1uRGVmXCJcbiAgICAgICAgICAgICAgW2RhdGFRdWVyeUZ1bmN0aW9uXT1cImV4cG9ydEZpbHRlcnNBbmRTb3J0c1wiXG4gICAgICAgICAgICAgIFtkYXRhXT1cInRpY2tldHNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9saWItZGF0YS14cG9ydD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNoaWxkcmVuPlxuICAgICAgICAgICAgPHZlcmJlbmEtYnV0dG9uXG4gICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgIFt1c2VJY29uXT1cInRydWVcIlxuICAgICAgICAgICAgICBbaWNvbl09XCInYWRkJ1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwidmVyYmVuLXByaW1hcnktYnV0dG9uXCJcbiAgICAgICAgICAgICAgW3RleHRdPVwiJ0FkZCBOZXcgVGlja2V0J1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGROZXdUaWNrZXQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3ZlcmJlbi1kYXRhLXZpZXc+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ0aWNrZXRzLmxlbmd0aCA+IDBcIlxuICAgICAgICBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgaXRlbXMtY2VudGVyIGdhcC01XCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWdpbmF0b3ItdGV4dFwiPnt7IHRpY2tldHMubGVuZ3RoIH19IHJlY29yZHMgbG9hZGVkPC9zcGFuPlxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJsb2FkTW9yZSgpXCIgY2xhc3M9XCJsb2FkLW1vcmUgdmlldy1saW5rc1wiPlxuICAgICAgICAgIExvYWQgbW9yZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgKm5nSWY9XCJcbiAgICAgIHRoaXMuYXBwcy5sZW5ndGggPT0gMCB8fFxuICAgICAgKHRoaXMuYWN0aXZlQXBwICYmIHRoaXMudGVuYW50cy5sZW5ndGggPT0gMCkgfHxcbiAgICAgICh0aGlzLmFjdGl2ZVRlbmFudCAmJiB0aGlzLnRpY2tldHMubGVuZ3RoID09IDAgJiYgIWlzRmlsdGVyZWRTdGF0ZSgpKVxuICAgIFwiXG4gICAgY2xhc3M9XCJjcmVhdGUtY29udGFpbmVyIGZsZXgtMSByb3VuZGVkLVsyMHB4XSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gID48L2Rpdj5cbjwvZGl2PlxuXG48IS0tIDxhcHAtYWRkLWFwcFxuICBbaXNWaXNpYmxlXT1cInNob3dBcHBGb3JtXCJcbiAgW3NlbGVjdGVkQXBwXT1cInNlbGVjdGVkQXBwXCJcbiAgKG9uQ2xvc2UpPVwib25BcHBNb2RhbENsb3NlKClcIlxuICAob25TYXZlKT1cIm9uQXBwU2F2ZSgkZXZlbnQpXCJcbj48L2FwcC1hZGQtYXBwPlxuXG48YXBwLWFkZC10ZW5hbnRcbiAgW2lzVmlzaWJsZV09XCJzaG93VGVuYW50Rm9ybVwiXG4gIFthY3RpdmVBcHBdPVwiYWN0aXZlQXBwXCJcbiAgW3NlbGVjdGVkVGVuYW50XT1cInNlbGVjdGVkVGVuYW50XCJcbiAgKG9uQ2xvc2UpPVwib25UZW5hbnRNb2RhbENsb3NlKClcIlxuICAob25TYXZlKT1cIm9uVGVuYW50U2F2ZSgkZXZlbnQpXCJcbj48L2FwcC1hZGQtdGVuYW50PiAtLT5cblxuPGFwcC1hZGQtdGlja2V0XG4gIFtpc1Zpc2libGVdPVwic2hvd1RpY2tldEZvcm1cIlxuICBbYWN0aXZlQXBwXT1cImFjdGl2ZUFwcFwiXG4gIFthY3RpdmVVc2VyXT1cImFjdGl2ZVVzZXJcIlxuICBbaXNEaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIlxuICBbYWN0aXZlVGVuYW50XT1cImFjdGl2ZVRlbmFudFwiXG4gIFtzZWxlY3RlZFRpY2tldF09XCJzZWxlY3RlZFRpY2tldFwiXG4gIChvbkNsb3NlKT1cIm9uVGlja2V0TW9kYWxDbG9zZSgpXCJcbiAgKG9uU2F2ZSk9XCJvblRpY2tldFNhdmUoJGV2ZW50KVwiXG4gIFtvdmVycmlkZVRva2VuXT1cIm92ZXJyaWRlVG9rZW5cIlxuPjwvYXBwLWFkZC10aWNrZXQ+XG5cbjx2ZXJiZW4tZGlhbG9ndWVcbiAgW3Nob3dDbG9zZUljb25dPVwiZmFsc2VcIlxuICBbZGlzbWlzc091dHNpZGVDbGlja109XCJmYWxzZVwiXG4gIFtjbG9zZU9uRXNjYXBlXT1cInRydWVcIlxuICBbc2l6ZV09XCInbWVkaXVtJ1wiXG4gIFttb2RlXT1cIidkaWFsb2d1ZSdcIlxuICBbY3VzdG9tQ2xhc3NdPVwiJ3RpY2tldC1kaWFsb2cnXCJcbiAgW2Rpc2FibGVGb290ZXJdPVwidHJ1ZVwiXG4gIChvcGVuTW9kYWwpPVwib25Nb2RhbE9wZW4oJGV2ZW50KVwiXG4gIFtpc1Zpc2libGVdPVwic2hvd0Nsb3N1cmVEaWFsb2d1ZVwiXG4gIFtib2R5VGVtcGxhdGVdPVwiYm9keVRlbXBsYXRlXCJcbiAgKGNsb3NlTW9kYWwpPVwib25Nb2RhbENsb3NlKCRldmVudClcIlxuPlxuICA8bmctdGVtcGxhdGUgI2JvZHlUZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWJvZHkgcC1bMjVweF0gZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy1oZWFkZXIgZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlIGZvbnQtYm9sZCB0ZXh0LXhsXCI+RW50ZXIgUmVhc29uPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctc3VidGl0bGVcIj5cbiAgICAgICAgICBQbGVhc2UgcHJvdmlkZSBhIHJlYXNvbiBmb3IgY2xvc2luZyB0aGlzIHRpY2tldFxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSA8dmVyYmVuYS10ZXh0YXJlYSBuYW1lPVwiVGVzdFwiIFsobmdNb2RlbCldPVwidGVzdFwiIC8+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJsb2dUZXN0KClcIj5Mb2c8L2J1dHRvbj4gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWRkLWFwcC1mb3JtIG1haW4tZm9ybS1jb250YWluZXIgZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbnB1dC1jb250YWluZXIgZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW1lZGl1bVwiPlJlYXNvbjwvZGl2PlxuICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICBuYW1lPVwiUmVhc29uXCJcbiAgICAgICAgICAgIHBsYWNlSG9sZGVyPVwiRW50ZXIgcmVhc29uLi4uXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2xvc3VyZVJlYXNvblwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBmbGV4IGp1c3RpZnktZW5kIGdhcC0yXCI+XG4gICAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgY2xhc3M9XCJ2ZXJiZW4tc2Vjb25kYXJ5LWJ1dHRvblwiXG4gICAgICAgICAgW3RleHRdPVwiJ0Nsb3NlJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uTW9kYWxDbG9zZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgICBbZGlzYWJsZV09XCJ0aGlzLmNsb3N1cmVSZWFzb24udHJpbSgpLmxlbmd0aCA9PSAwXCJcbiAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgIGNsYXNzPVwidmVyYmVuLXByaW1hcnktYnV0dG9uXCJcbiAgICAgICAgICBbdGV4dF09XCInQ29uZmlybSdcIlxuICAgICAgICAgIChjbGljayk9XCJjbG9zZVRpY2tldCgpXCJcbiAgICAgICAgPlxuICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L3ZlcmJlbi1kaWFsb2d1ZT5cbiJdfQ==