mmhglobal-dynamicform 2.0.0-beta.55 → 2.0.0-beta.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,6 +3,11 @@
3
3
  This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.2.13.
4
4
 
5
5
  ## Changelog
6
+ `2.56beta`<br/>
7
+ [ztexteditor] add custom image upload function. (ToolBarUploadImageMethod: 'default' | 'explorer')
8
+ [ztree] Enhancement for node selection. Refer to #1977 for detail.
9
+ [zselect] Fix bug on lazy loading functions not triggered upon searching
10
+
6
11
  `2.55beta`<br/>
7
12
  [zudf] - enhancement for zudf, now will have basic validation; zudf group scope zmodel auto update.<br/>
8
13
 
@@ -263,24 +263,40 @@ export class ZselectmultipleComponent extends InputFieldBase {
263
263
  }
264
264
  }
265
265
  }
266
+ handleLazyLoadFilter(value, justOneTime) {
267
+ debugger;
268
+ if (this.debounceSub) {
269
+ this.debounceSub.unsubscribe();
270
+ }
271
+ this.debounceSub = of([]).pipe(delay(500)).subscribe(() => {
272
+ this.isLoading = true;
273
+ this.onSearch({ component: null, text: value });
274
+ if (this.group) {
275
+ if (this.group.afterLoadzDataOptions) {
276
+ this.group.afterLoadzDataOptions(this.group);
277
+ }
278
+ }
279
+ });
280
+ }
266
281
  handleFilter(value, justOneTime) {
267
282
  if (this.debounceSub) {
268
283
  this.debounceSub.unsubscribe();
269
284
  }
270
285
  // skip filtering if have inifinitescroll?
271
- if (!this.data.HasInfiniteScroll) {
272
- this.debounceSub = of([])
273
- .pipe(tap(() => (this.isLoading = true)), delay(500))
274
- .subscribe(() => {
275
- this.onSearch({ component: null, text: value });
276
- if (this.group) {
277
- if (this.group.afterLoadzDataOptions) {
278
- this.group.afterLoadzDataOptions(this.group);
279
- }
286
+ // To resolve bug #1979
287
+ // if (!this.data.HasInfiniteScroll) {
288
+ this.debounceSub = of([])
289
+ .pipe(tap(() => (this.isLoading = true)), delay(500))
290
+ .subscribe(() => {
291
+ this.onSearch({ component: null, text: value });
292
+ if (this.group) {
293
+ if (this.group.afterLoadzDataOptions) {
294
+ this.group.afterLoadzDataOptions(this.group);
280
295
  }
281
- this.isLoading = false;
282
- });
283
- }
296
+ }
297
+ this.isLoading = false;
298
+ });
299
+ // }
284
300
  // if (this.loadInfiniteDataSub) {
285
301
  // this.loadInfiniteDataSub.unsubscribe();
286
302
  // }
@@ -439,12 +455,12 @@ export class ZselectmultipleComponent extends InputFieldBase {
439
455
  }
440
456
  }
441
457
  ZselectmultipleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ZselectmultipleComponent, deps: [{ token: i1.ResourceApiService }, { token: i1.WebApiService }, { token: i1.CacheService }, { token: i2.ZComponentService }], target: i0.ɵɵFactoryTarget.Component });
442
- ZselectmultipleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: ZselectmultipleComponent, selector: "app-zselectmultiple", viewQueries: [{ propertyName: "selectComponent", first: true, predicate: ["selectComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div [formGroup]=\"form\" class=\"zselectmultiple-container e1tag-style\" [style]=\"componentProperties.style.style\">\r\n <ionic-selectable *ngIf=\"isMobileScreen()\" #selectComponent item-content searchFailText=\"Nothing found :(\"\r\n headerColor=\"primary\" clearButtonText=\"Clear\" [(ngModel)]=\"group.zModel[data.Value]\" [id]=\"data.Value\"\r\n [items]=\"getItemsData()\" [itemValueField]=\"itemValueField\" [itemTextField]=\"itemTextField\"\r\n [canAddItem]=\"!!data.OnAddItem\" [canClear]=\"true\" [placeholder]=\"data.PlaceHolder\"\r\n [canSearch]=\"!data['disable-search']\" [shouldFocusSearchbar]=\"!data['disable-search']\"\r\n [hasInfiniteScroll]=\"!!data.HasInfiniteScroll\" [isMultiple]=\"data.Multiple\"\r\n [isEnabled]=\"!(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [shouldStoreItemValue]=\"true\" (onSearch)=\"onSearch($event)\" (onInfiniteScroll)=\"getInfiniteData($event)\"\r\n (onAddItem)=\"onAddItem($event)\" (onChange)=\"onChange_mobile($event)\" [style]=\"componentProperties.style.style1\" class=\"e1tag-style1\">\r\n\r\n <ng-template ionicSelectableItemIconTemplate let-item=\"item\" let-isItemSelected=\"isItemSelected\">\r\n <fa-icon slot=\"start\" class=\"isItemSelected e1tag-style2\" size=\"sm\" [icon]=\"['far', isItemSelected ? 'check-circle': 'circle']\"\r\n [styles]=\"{'color': isItemSelected ? 'dodgerBlue' : 'lightGray'}\" [style]=\"componentProperties.style.style2\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableCloseButtonTemplate>\r\n <!-- <ion-icon name=\"close-circle\"></ion-icon> -->\r\n <fa-icon [icon]=\"'times-circle'\" size=\"md\" [style]=\"componentProperties.style.style3\" class=\"e1tag-style3\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableTitleTemplate>\r\n <span class=e1tag-style4 [style]=\"componentProperties.style.style4\">{{data.Label}}</span>\r\n <ion-text *ngIf=\"getIsRequiredValue()\" color=\"danger\">*</ion-text>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableItemTemplate let-item=\"item\">\r\n <span class=\"e1tag-style5\" [style]=\"componentProperties.style.style5\">{{ getItemTemplate(item, data, group, itemValueField, itemTextField) }}</span>\r\n </ng-template>\r\n </ionic-selectable>\r\n <kendo-combobox *ngIf=\"!isMobileScreen() && !data.Multiple\"\r\n class=\"input-field e1tag-style1\"\r\n #comboboxComponent\r\n [data]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [kendoDropDownFilter]=\"filterSettings\"\r\n [suggest]=\"true\"\r\n [filterable]=\"true\"\r\n [openOnFocus]=\"disableOpenOnFocus(comboboxComponent)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n [loading]=\"isLoading\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n [virtual]=\"data.IsEnableVirtualization == true ? virtual : null\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n [style]=\"componentProperties.style.style1\">\r\n <ng-template kendoComboBoxItemTemplate let-dataItem>\r\n <span class=\"e1tag-style5\" [class.zselect-virtualization]=\"data.IsEnableVirtualization\" [style]=\"componentProperties.style.style5\">{{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}</span>\r\n <!-- <span class=\"template\">{{ dataItem.value }}</span> {{ dataItem.text }} -->\r\n </ng-template>\r\n </kendo-combobox>\r\n <kendo-multiselect *ngIf=\"!isMobileScreen() && data.Multiple && !data.EnableCheckbox\"\r\n class=\"input-field e1tag-style1\"\r\n [data]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [filterable]=\"true\"\r\n [checkboxes]=\"data.EnableCheckbox\"\r\n [loading]=\"isLoading\"\r\n [autoClose]=\"autoClose\"\r\n [kendoDropDownFilter]=\"filterSettings\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n [style]=\"componentProperties.style.style1\">\r\n <ng-template kendoMultiSelectItemTemplate let-dataItem>\r\n <span class=\"e1tag-style5\" [style]=\"componentProperties.style.style5\">{{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}</span>\r\n </ng-template>\r\n </kendo-multiselect>\r\n\r\n <kendo-multiselecttree *ngIf=\"!isMobileScreen() && data.Multiple && data.EnableCheckbox\"\r\n class=\"input-field e1tag-style1\"\r\n kendoMultiSelectTreeExpandable\r\n [placeholder]=\"data.PlaceHolder\"\r\n [kendoMultiSelectTreeHierarchyBinding]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n childrenField=\"Value\"\r\n [hasChildren]=\"hasChildren\"\r\n [textField]=\"itemTextField\"\r\n [valueField]=\"itemValueField\"\r\n [valuePrimitive]=\"true\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n [dataItems]=\"data.Value\"\r\n [loading]=\"isLoading\"\r\n [autoClose]=\"autoClose\"\r\n [expandOnFilter]=\"filterExpandSettings\"\r\n [filterable]=\"true\"\r\n (filterChange)=\"handleMultiSelectTreeFilter($event)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n [style]=\"componentProperties.style.style1\">\r\n <ng-template kendoMultiSelectTreeNoDataTemplate>\r\n <h4>\r\n <span class=\"k-icon k-i-warning\"></span><br /><br />\r\n No record found.\r\n </h4>\r\n </ng-template>\r\n </kendo-multiselecttree>\r\n</div>\r\n", styles: [":host ::ng-deep kendo-combobox.k-multiselect,:host ::ng-deep kendo-multiselect.k-multiselect{height:auto}:host ::ng-deep kendo-combobox .k-searchbar,:host ::ng-deep kendo-multiselect .k-searchbar{margin:auto}:host ::ng-deep kendo-combobox .k-searchbar+.k-icon,:host ::ng-deep kendo-multiselect .k-searchbar+.k-icon{margin:auto}:host ::ng-deep kendo-combobox .kendo-combobox-item-template,:host ::ng-deep kendo-multiselect .kendo-combobox-item-template{height:var(--input-field-height)!important}:host ::ng-deep kendo-combobox.disabled>.k-dropdown-wrap,:host ::ng-deep kendo-multiselect.disabled>.k-dropdown-wrap{background:transparent}:host ::ng-deep kendo-combobox:focus-within,:host ::ng-deep kendo-multiselect:focus-within{box-shadow:0 0 3px 1px var(--ion-color-primary)}fa-icon.isItemSelected{display:inline-block;width:1em;height:1em;contain:strict;fill:currentcolor;box-sizing:content-box!important;font-size:20px;margin-top:10px;margin-bottom:14px;margin-right:unset;margin-inline-end:20px}.gridInlineEdit{--background: transparent}.item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}.divselectmultiple{justify-content:space-between;width:99%;color:#000}.zselect-virtualization{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}\n"], components: [{ type: i3.IonicSelectableComponent, selector: "ionic-selectable", inputs: ["items", "modalCssClass", "modalEnterAnimation", "modalLeaveAnimation", "isConfirmButtonEnabled", "itemValueField", "itemTextField", "groupValueField", "groupTextField", "canSearch", "hasInfiniteScroll", "hasVirtualScroll", "virtualScrollApproxItemHeight", "searchPlaceholder", "placeholder", "searchFailText", "clearButtonText", "addButtonText", "confirmButtonText", "closeButtonText", "shouldFocusSearchbar", "headerColor", "groupColor", "closeButtonSlot", "itemIconSlot", "searchDebounce", "disabledItems", "shouldStoreItemValue", "canSaveItem", "canDeleteItem", "virtualScrollHeaderFn", "isEnabled", "shouldBackdropClose", "hasConfirmButton", "isOnSearchEnabled", "canClear", "isMultiple", "canAddItem"], outputs: ["itemsChange", "onChange", "onSearch", "onSearchFail", "onSearchSuccess", "onInfiniteScroll", "onOpen", "onClose", "onSelect", "onClear", "onSaveItem", "onDeleteItem", "onAddItem"] }, { type: i4.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i5.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { type: i6.ComboBoxComponent, selector: "kendo-combobox", inputs: ["focusableId", "allowCustom", "data", "value", "textField", "valueField", "valuePrimitive", "valueNormalizer", "placeholder", "popupSettings", "listHeight", "iconClass", "loading", "suggest", "clearButton", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode"], outputs: ["valueChange", "selectionChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoComboBox"] }, { type: i6.MultiSelectComponent, selector: "kendo-multiselect", inputs: ["focusableId", "autoClose", "loading", "data", "value", "valueField", "textField", "tabindex", "tabIndex", "size", "rounded", "fillMode", "placeholder", "disabled", "itemDisabled", "checkboxes", "readonly", "filterable", "virtual", "popupSettings", "listHeight", "valuePrimitive", "clearButton", "tagMapper", "allowCustom", "valueNormalizer"], outputs: ["filterChange", "valueChange", "open", "opened", "close", "closed", "focus", "blur", "removeTag"], exportAs: ["kendoMultiSelect"] }, { type: i6.MultiSelectTreeComponent, selector: "kendo-multiselecttree", inputs: ["tabindex", "size", "rounded", "fillMode", "popupSettings", "checkableSettings", "data", "value", "dataItems", "textField", "valueField", "valueDepth", "loading", "placeholder", "listHeight", "disabled", "readonly", "valuePrimitive", "loadOnDemand", "focusableId", "clearButton", "filterable", "checkAll", "hasChildren", "fetchChildren", "isNodeExpanded", "isNodeVisible", "itemDisabled", "tagMapper"], outputs: ["focus", "blur", "open", "opened", "close", "closed", "nodeExpand", "nodeCollapse", "valueChange", "removeTag", "filterChange"], exportAs: ["kendoMultiSelectTree"] }], directives: [{ type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3.IonicSelectableItemIconTemplateDirective, selector: "[ionicSelectableItemIconTemplate]" }, { type: i3.IonicSelectableCloseButtonTemplateDirective, selector: "[ionicSelectableCloseButtonTemplate]" }, { type: i3.IonicSelectableTitleTemplateDirective, selector: "[ionicSelectableTitleTemplate]" }, { type: i3.IonicSelectableItemTemplateDirective, selector: "[ionicSelectableItemTemplate]" }, { type: i9.OpenOnFocusDirective, selector: "kendo-combobox[openOnFocus]", inputs: ["openOnFocus"] }, { type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i6.FilterDirective, selector: "[kendoDropDownFilter]", inputs: ["data", "kendoDropDownFilter", "filterable"] }, { type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i6.ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { type: i6.DropDownTreesExpandDirective, selector: "[kendoDropDownTreeExpandable], [kendoMultiSelectTreeExpandable]", inputs: ["isNodeExpanded"] }, { type: i6.MultiSelectTreeHierarchyBindingDirective, selector: "[kendoMultiSelectTreeHierarchyBinding]", inputs: ["kendoMultiSelectTreeHierarchyBinding"] }, { type: i6.NoDataTemplateDirective, selector: "[kendoDropDownListNoDataTemplate],[kendoDropDownTreeNoDataTemplate],[kendoComboBoxNoDataTemplate],[kendoMultiColumnComboBoxNoDataTemplate],[kendoAutoCompleteNoDataTemplate],[kendoMultiSelectNoDataTemplate],[kendoMultiSelectTreeNoDataTemplate]" }], pipes: { "async": i8.AsyncPipe, "zselectTranslationParser": i11.ZSelectTranslationParser } });
458
+ ZselectmultipleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: ZselectmultipleComponent, selector: "app-zselectmultiple", viewQueries: [{ propertyName: "selectComponent", first: true, predicate: ["selectComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div [formGroup]=\"form\" class=\"zselectmultiple-container e1tag-style\" [style]=\"componentProperties.style.style\">\r\n <ionic-selectable *ngIf=\"isMobileScreen()\" #selectComponent item-content searchFailText=\"Nothing found :(\"\r\n headerColor=\"primary\" clearButtonText=\"Clear\" [(ngModel)]=\"group.zModel[data.Value]\" [id]=\"data.Value\"\r\n [items]=\"getItemsData()\" [itemValueField]=\"itemValueField\" [itemTextField]=\"itemTextField\"\r\n [canAddItem]=\"!!data.OnAddItem\" [canClear]=\"true\" [placeholder]=\"data.PlaceHolder\"\r\n [canSearch]=\"!data['disable-search']\" [shouldFocusSearchbar]=\"!data['disable-search']\"\r\n [hasInfiniteScroll]=\"!!data.HasInfiniteScroll\" [isMultiple]=\"data.Multiple\"\r\n [isEnabled]=\"!(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [shouldStoreItemValue]=\"true\" (onSearch)=\"onSearch($event)\" (onInfiniteScroll)=\"getInfiniteData($event)\"\r\n (onAddItem)=\"onAddItem($event)\" (onChange)=\"onChange_mobile($event)\" [style]=\"componentProperties.style.style1\" class=\"e1tag-style1\">\r\n\r\n <ng-template ionicSelectableItemIconTemplate let-item=\"item\" let-isItemSelected=\"isItemSelected\">\r\n <fa-icon slot=\"start\" class=\"isItemSelected e1tag-style2\" size=\"sm\" [icon]=\"['far', isItemSelected ? 'check-circle': 'circle']\"\r\n [styles]=\"{'color': isItemSelected ? 'dodgerBlue' : 'lightGray'}\" [style]=\"componentProperties.style.style2\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableCloseButtonTemplate>\r\n <!-- <ion-icon name=\"close-circle\"></ion-icon> -->\r\n <fa-icon [icon]=\"'times-circle'\" size=\"md\" [style]=\"componentProperties.style.style3\" class=\"e1tag-style3\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableTitleTemplate>\r\n <span class=e1tag-style4 [style]=\"componentProperties.style.style4\">{{data.Label}}</span>\r\n <ion-text *ngIf=\"getIsRequiredValue()\" color=\"danger\">*</ion-text>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableItemTemplate let-item=\"item\">\r\n <span class=\"e1tag-style5\" [style]=\"componentProperties.style.style5\">{{ getItemTemplate(item, data, group, itemValueField, itemTextField) }}</span>\r\n </ng-template>\r\n </ionic-selectable>\r\n <kendo-combobox *ngIf=\"!isMobileScreen() && !data.Multiple\"\r\n class=\"input-field e1tag-style1\"\r\n #comboboxComponent\r\n [data]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [kendoDropDownFilter]=\"filterSettings\"\r\n [suggest]=\"true\"\r\n [filterable]=\"true\"\r\n [openOnFocus]=\"disableOpenOnFocus(comboboxComponent)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n [loading]=\"isLoading\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n [virtual]=\"data.IsEnableVirtualization == true ? virtual : null\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n [style]=\"componentProperties.style.style1\">\r\n <ng-template kendoComboBoxItemTemplate let-dataItem>\r\n <span class=\"e1tag-style5\" [class.zselect-virtualization]=\"data.IsEnableVirtualization\" [style]=\"componentProperties.style.style5\">{{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}</span>\r\n <!-- <span class=\"template\">{{ dataItem.value }}</span> {{ dataItem.text }} -->\r\n </ng-template>\r\n </kendo-combobox>\r\n <kendo-multiselect *ngIf=\"!isMobileScreen() && data.Multiple && !data.EnableCheckbox\"\r\n class=\"input-field e1tag-style1\"\r\n [data]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [filterable]=\"true\"\r\n [checkboxes]=\"data.EnableCheckbox\"\r\n [loading]=\"isLoading\"\r\n [autoClose]=\"autoClose\"\r\n [kendoDropDownFilter]=\"filterSettings\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n [style]=\"componentProperties.style.style1\">\r\n <ng-template kendoMultiSelectItemTemplate let-dataItem>\r\n <span class=\"e1tag-style5\" [style]=\"componentProperties.style.style5\">{{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}</span>\r\n </ng-template>\r\n </kendo-multiselect>\r\n <kendo-multiselecttree *ngIf=\"!isMobileScreen() && data.Multiple && data.EnableCheckbox\"\r\n class=\"input-field e1tag-style1\"\r\n kendoMultiSelectTreeExpandable\r\n [placeholder]=\"data.PlaceHolder\"\r\n [kendoMultiSelectTreeHierarchyBinding]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n childrenField=\"Value\"\r\n [hasChildren]=\"hasChildren\"\r\n [textField]=\"itemTextField\"\r\n [valueField]=\"itemValueField\"\r\n [valuePrimitive]=\"true\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n [dataItems]=\"data.Value\"\r\n [loading]=\"isLoading\"\r\n [autoClose]=\"autoClose\"\r\n [expandOnFilter]=\"filterExpandSettings\"\r\n [filterable]=\"true\"\r\n (filterChange)=\"handleMultiSelectTreeFilter($event)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n [style]=\"componentProperties.style.style1\">\r\n <ng-template kendoMultiSelectTreeNoDataTemplate>\r\n <h4>\r\n <span class=\"k-icon k-i-warning\"></span><br /><br />\r\n No record found.\r\n </h4>\r\n </ng-template>\r\n </kendo-multiselecttree>\r\n</div>\r\n", styles: [":host ::ng-deep kendo-combobox.k-multiselect,:host ::ng-deep kendo-multiselect.k-multiselect{height:auto}:host ::ng-deep kendo-combobox .k-searchbar,:host ::ng-deep kendo-multiselect .k-searchbar{margin:auto}:host ::ng-deep kendo-combobox .k-searchbar+.k-icon,:host ::ng-deep kendo-multiselect .k-searchbar+.k-icon{margin:auto}:host ::ng-deep kendo-combobox .kendo-combobox-item-template,:host ::ng-deep kendo-multiselect .kendo-combobox-item-template{height:var(--input-field-height)!important}:host ::ng-deep kendo-combobox.disabled>.k-dropdown-wrap,:host ::ng-deep kendo-multiselect.disabled>.k-dropdown-wrap{background:transparent}:host ::ng-deep kendo-combobox:focus-within,:host ::ng-deep kendo-multiselect:focus-within{box-shadow:0 0 3px 1px var(--ion-color-primary)}fa-icon.isItemSelected{display:inline-block;width:1em;height:1em;contain:strict;fill:currentcolor;box-sizing:content-box!important;font-size:20px;margin-top:10px;margin-bottom:14px;margin-right:unset;margin-inline-end:20px}.gridInlineEdit{--background: transparent}.item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}.divselectmultiple{justify-content:space-between;width:99%;color:#000}.zselect-virtualization{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}\n"], components: [{ type: i3.IonicSelectableComponent, selector: "ionic-selectable", inputs: ["items", "modalCssClass", "modalEnterAnimation", "modalLeaveAnimation", "isConfirmButtonEnabled", "itemValueField", "itemTextField", "groupValueField", "groupTextField", "canSearch", "hasInfiniteScroll", "hasVirtualScroll", "virtualScrollApproxItemHeight", "searchPlaceholder", "placeholder", "searchFailText", "clearButtonText", "addButtonText", "confirmButtonText", "closeButtonText", "shouldFocusSearchbar", "headerColor", "groupColor", "closeButtonSlot", "itemIconSlot", "searchDebounce", "disabledItems", "shouldStoreItemValue", "canSaveItem", "canDeleteItem", "virtualScrollHeaderFn", "isEnabled", "shouldBackdropClose", "hasConfirmButton", "isOnSearchEnabled", "canClear", "isMultiple", "canAddItem"], outputs: ["itemsChange", "onChange", "onSearch", "onSearchFail", "onSearchSuccess", "onInfiniteScroll", "onOpen", "onClose", "onSelect", "onClear", "onSaveItem", "onDeleteItem", "onAddItem"] }, { type: i4.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i5.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { type: i6.ComboBoxComponent, selector: "kendo-combobox", inputs: ["focusableId", "allowCustom", "data", "value", "textField", "valueField", "valuePrimitive", "valueNormalizer", "placeholder", "popupSettings", "listHeight", "iconClass", "loading", "suggest", "clearButton", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode"], outputs: ["valueChange", "selectionChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoComboBox"] }, { type: i6.MultiSelectComponent, selector: "kendo-multiselect", inputs: ["focusableId", "autoClose", "loading", "data", "value", "valueField", "textField", "tabindex", "tabIndex", "size", "rounded", "fillMode", "placeholder", "disabled", "itemDisabled", "checkboxes", "readonly", "filterable", "virtual", "popupSettings", "listHeight", "valuePrimitive", "clearButton", "tagMapper", "allowCustom", "valueNormalizer"], outputs: ["filterChange", "valueChange", "open", "opened", "close", "closed", "focus", "blur", "removeTag"], exportAs: ["kendoMultiSelect"] }, { type: i6.MultiSelectTreeComponent, selector: "kendo-multiselecttree", inputs: ["tabindex", "size", "rounded", "fillMode", "popupSettings", "checkableSettings", "data", "value", "dataItems", "textField", "valueField", "valueDepth", "loading", "placeholder", "listHeight", "disabled", "readonly", "valuePrimitive", "loadOnDemand", "focusableId", "clearButton", "filterable", "checkAll", "hasChildren", "fetchChildren", "isNodeExpanded", "isNodeVisible", "itemDisabled", "tagMapper"], outputs: ["focus", "blur", "open", "opened", "close", "closed", "nodeExpand", "nodeCollapse", "valueChange", "removeTag", "filterChange"], exportAs: ["kendoMultiSelectTree"] }], directives: [{ type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3.IonicSelectableItemIconTemplateDirective, selector: "[ionicSelectableItemIconTemplate]" }, { type: i3.IonicSelectableCloseButtonTemplateDirective, selector: "[ionicSelectableCloseButtonTemplate]" }, { type: i3.IonicSelectableTitleTemplateDirective, selector: "[ionicSelectableTitleTemplate]" }, { type: i3.IonicSelectableItemTemplateDirective, selector: "[ionicSelectableItemTemplate]" }, { type: i9.OpenOnFocusDirective, selector: "kendo-combobox[openOnFocus]", inputs: ["openOnFocus"] }, { type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i6.FilterDirective, selector: "[kendoDropDownFilter]", inputs: ["data", "kendoDropDownFilter", "filterable"] }, { type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i6.ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { type: i6.DropDownTreesExpandDirective, selector: "[kendoDropDownTreeExpandable], [kendoMultiSelectTreeExpandable]", inputs: ["isNodeExpanded"] }, { type: i6.MultiSelectTreeHierarchyBindingDirective, selector: "[kendoMultiSelectTreeHierarchyBinding]", inputs: ["kendoMultiSelectTreeHierarchyBinding"] }, { type: i6.NoDataTemplateDirective, selector: "[kendoDropDownListNoDataTemplate],[kendoDropDownTreeNoDataTemplate],[kendoComboBoxNoDataTemplate],[kendoMultiColumnComboBoxNoDataTemplate],[kendoAutoCompleteNoDataTemplate],[kendoMultiSelectNoDataTemplate],[kendoMultiSelectTreeNoDataTemplate]" }], pipes: { "async": i8.AsyncPipe, "zselectTranslationParser": i11.ZSelectTranslationParser } });
443
459
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ZselectmultipleComponent, decorators: [{
444
460
  type: Component,
445
- args: [{ selector: "app-zselectmultiple", template: "<div [formGroup]=\"form\" class=\"zselectmultiple-container e1tag-style\" [style]=\"componentProperties.style.style\">\r\n <ionic-selectable *ngIf=\"isMobileScreen()\" #selectComponent item-content searchFailText=\"Nothing found :(\"\r\n headerColor=\"primary\" clearButtonText=\"Clear\" [(ngModel)]=\"group.zModel[data.Value]\" [id]=\"data.Value\"\r\n [items]=\"getItemsData()\" [itemValueField]=\"itemValueField\" [itemTextField]=\"itemTextField\"\r\n [canAddItem]=\"!!data.OnAddItem\" [canClear]=\"true\" [placeholder]=\"data.PlaceHolder\"\r\n [canSearch]=\"!data['disable-search']\" [shouldFocusSearchbar]=\"!data['disable-search']\"\r\n [hasInfiniteScroll]=\"!!data.HasInfiniteScroll\" [isMultiple]=\"data.Multiple\"\r\n [isEnabled]=\"!(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [shouldStoreItemValue]=\"true\" (onSearch)=\"onSearch($event)\" (onInfiniteScroll)=\"getInfiniteData($event)\"\r\n (onAddItem)=\"onAddItem($event)\" (onChange)=\"onChange_mobile($event)\" [style]=\"componentProperties.style.style1\" class=\"e1tag-style1\">\r\n\r\n <ng-template ionicSelectableItemIconTemplate let-item=\"item\" let-isItemSelected=\"isItemSelected\">\r\n <fa-icon slot=\"start\" class=\"isItemSelected e1tag-style2\" size=\"sm\" [icon]=\"['far', isItemSelected ? 'check-circle': 'circle']\"\r\n [styles]=\"{'color': isItemSelected ? 'dodgerBlue' : 'lightGray'}\" [style]=\"componentProperties.style.style2\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableCloseButtonTemplate>\r\n <!-- <ion-icon name=\"close-circle\"></ion-icon> -->\r\n <fa-icon [icon]=\"'times-circle'\" size=\"md\" [style]=\"componentProperties.style.style3\" class=\"e1tag-style3\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableTitleTemplate>\r\n <span class=e1tag-style4 [style]=\"componentProperties.style.style4\">{{data.Label}}</span>\r\n <ion-text *ngIf=\"getIsRequiredValue()\" color=\"danger\">*</ion-text>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableItemTemplate let-item=\"item\">\r\n <span class=\"e1tag-style5\" [style]=\"componentProperties.style.style5\">{{ getItemTemplate(item, data, group, itemValueField, itemTextField) }}</span>\r\n </ng-template>\r\n </ionic-selectable>\r\n <kendo-combobox *ngIf=\"!isMobileScreen() && !data.Multiple\"\r\n class=\"input-field e1tag-style1\"\r\n #comboboxComponent\r\n [data]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [kendoDropDownFilter]=\"filterSettings\"\r\n [suggest]=\"true\"\r\n [filterable]=\"true\"\r\n [openOnFocus]=\"disableOpenOnFocus(comboboxComponent)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n [loading]=\"isLoading\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n [virtual]=\"data.IsEnableVirtualization == true ? virtual : null\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n [style]=\"componentProperties.style.style1\">\r\n <ng-template kendoComboBoxItemTemplate let-dataItem>\r\n <span class=\"e1tag-style5\" [class.zselect-virtualization]=\"data.IsEnableVirtualization\" [style]=\"componentProperties.style.style5\">{{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}</span>\r\n <!-- <span class=\"template\">{{ dataItem.value }}</span> {{ dataItem.text }} -->\r\n </ng-template>\r\n </kendo-combobox>\r\n <kendo-multiselect *ngIf=\"!isMobileScreen() && data.Multiple && !data.EnableCheckbox\"\r\n class=\"input-field e1tag-style1\"\r\n [data]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [filterable]=\"true\"\r\n [checkboxes]=\"data.EnableCheckbox\"\r\n [loading]=\"isLoading\"\r\n [autoClose]=\"autoClose\"\r\n [kendoDropDownFilter]=\"filterSettings\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n [style]=\"componentProperties.style.style1\">\r\n <ng-template kendoMultiSelectItemTemplate let-dataItem>\r\n <span class=\"e1tag-style5\" [style]=\"componentProperties.style.style5\">{{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}</span>\r\n </ng-template>\r\n </kendo-multiselect>\r\n\r\n <kendo-multiselecttree *ngIf=\"!isMobileScreen() && data.Multiple && data.EnableCheckbox\"\r\n class=\"input-field e1tag-style1\"\r\n kendoMultiSelectTreeExpandable\r\n [placeholder]=\"data.PlaceHolder\"\r\n [kendoMultiSelectTreeHierarchyBinding]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n childrenField=\"Value\"\r\n [hasChildren]=\"hasChildren\"\r\n [textField]=\"itemTextField\"\r\n [valueField]=\"itemValueField\"\r\n [valuePrimitive]=\"true\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n [dataItems]=\"data.Value\"\r\n [loading]=\"isLoading\"\r\n [autoClose]=\"autoClose\"\r\n [expandOnFilter]=\"filterExpandSettings\"\r\n [filterable]=\"true\"\r\n (filterChange)=\"handleMultiSelectTreeFilter($event)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n [style]=\"componentProperties.style.style1\">\r\n <ng-template kendoMultiSelectTreeNoDataTemplate>\r\n <h4>\r\n <span class=\"k-icon k-i-warning\"></span><br /><br />\r\n No record found.\r\n </h4>\r\n </ng-template>\r\n </kendo-multiselecttree>\r\n</div>\r\n", styles: [":host ::ng-deep kendo-combobox.k-multiselect,:host ::ng-deep kendo-multiselect.k-multiselect{height:auto}:host ::ng-deep kendo-combobox .k-searchbar,:host ::ng-deep kendo-multiselect .k-searchbar{margin:auto}:host ::ng-deep kendo-combobox .k-searchbar+.k-icon,:host ::ng-deep kendo-multiselect .k-searchbar+.k-icon{margin:auto}:host ::ng-deep kendo-combobox .kendo-combobox-item-template,:host ::ng-deep kendo-multiselect .kendo-combobox-item-template{height:var(--input-field-height)!important}:host ::ng-deep kendo-combobox.disabled>.k-dropdown-wrap,:host ::ng-deep kendo-multiselect.disabled>.k-dropdown-wrap{background:transparent}:host ::ng-deep kendo-combobox:focus-within,:host ::ng-deep kendo-multiselect:focus-within{box-shadow:0 0 3px 1px var(--ion-color-primary)}fa-icon.isItemSelected{display:inline-block;width:1em;height:1em;contain:strict;fill:currentcolor;box-sizing:content-box!important;font-size:20px;margin-top:10px;margin-bottom:14px;margin-right:unset;margin-inline-end:20px}.gridInlineEdit{--background: transparent}.item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}.divselectmultiple{justify-content:space-between;width:99%;color:#000}.zselect-virtualization{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}\n"] }]
461
+ args: [{ selector: "app-zselectmultiple", template: "<div [formGroup]=\"form\" class=\"zselectmultiple-container e1tag-style\" [style]=\"componentProperties.style.style\">\r\n <ionic-selectable *ngIf=\"isMobileScreen()\" #selectComponent item-content searchFailText=\"Nothing found :(\"\r\n headerColor=\"primary\" clearButtonText=\"Clear\" [(ngModel)]=\"group.zModel[data.Value]\" [id]=\"data.Value\"\r\n [items]=\"getItemsData()\" [itemValueField]=\"itemValueField\" [itemTextField]=\"itemTextField\"\r\n [canAddItem]=\"!!data.OnAddItem\" [canClear]=\"true\" [placeholder]=\"data.PlaceHolder\"\r\n [canSearch]=\"!data['disable-search']\" [shouldFocusSearchbar]=\"!data['disable-search']\"\r\n [hasInfiniteScroll]=\"!!data.HasInfiniteScroll\" [isMultiple]=\"data.Multiple\"\r\n [isEnabled]=\"!(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [shouldStoreItemValue]=\"true\" (onSearch)=\"onSearch($event)\" (onInfiniteScroll)=\"getInfiniteData($event)\"\r\n (onAddItem)=\"onAddItem($event)\" (onChange)=\"onChange_mobile($event)\" [style]=\"componentProperties.style.style1\" class=\"e1tag-style1\">\r\n\r\n <ng-template ionicSelectableItemIconTemplate let-item=\"item\" let-isItemSelected=\"isItemSelected\">\r\n <fa-icon slot=\"start\" class=\"isItemSelected e1tag-style2\" size=\"sm\" [icon]=\"['far', isItemSelected ? 'check-circle': 'circle']\"\r\n [styles]=\"{'color': isItemSelected ? 'dodgerBlue' : 'lightGray'}\" [style]=\"componentProperties.style.style2\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableCloseButtonTemplate>\r\n <!-- <ion-icon name=\"close-circle\"></ion-icon> -->\r\n <fa-icon [icon]=\"'times-circle'\" size=\"md\" [style]=\"componentProperties.style.style3\" class=\"e1tag-style3\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableTitleTemplate>\r\n <span class=e1tag-style4 [style]=\"componentProperties.style.style4\">{{data.Label}}</span>\r\n <ion-text *ngIf=\"getIsRequiredValue()\" color=\"danger\">*</ion-text>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableItemTemplate let-item=\"item\">\r\n <span class=\"e1tag-style5\" [style]=\"componentProperties.style.style5\">{{ getItemTemplate(item, data, group, itemValueField, itemTextField) }}</span>\r\n </ng-template>\r\n </ionic-selectable>\r\n <kendo-combobox *ngIf=\"!isMobileScreen() && !data.Multiple\"\r\n class=\"input-field e1tag-style1\"\r\n #comboboxComponent\r\n [data]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [kendoDropDownFilter]=\"filterSettings\"\r\n [suggest]=\"true\"\r\n [filterable]=\"true\"\r\n [openOnFocus]=\"disableOpenOnFocus(comboboxComponent)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n [loading]=\"isLoading\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n [virtual]=\"data.IsEnableVirtualization == true ? virtual : null\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n [style]=\"componentProperties.style.style1\">\r\n <ng-template kendoComboBoxItemTemplate let-dataItem>\r\n <span class=\"e1tag-style5\" [class.zselect-virtualization]=\"data.IsEnableVirtualization\" [style]=\"componentProperties.style.style5\">{{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}</span>\r\n <!-- <span class=\"template\">{{ dataItem.value }}</span> {{ dataItem.text }} -->\r\n </ng-template>\r\n </kendo-combobox>\r\n <kendo-multiselect *ngIf=\"!isMobileScreen() && data.Multiple && !data.EnableCheckbox\"\r\n class=\"input-field e1tag-style1\"\r\n [data]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [filterable]=\"true\"\r\n [checkboxes]=\"data.EnableCheckbox\"\r\n [loading]=\"isLoading\"\r\n [autoClose]=\"autoClose\"\r\n [kendoDropDownFilter]=\"filterSettings\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n [style]=\"componentProperties.style.style1\">\r\n <ng-template kendoMultiSelectItemTemplate let-dataItem>\r\n <span class=\"e1tag-style5\" [style]=\"componentProperties.style.style5\">{{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}</span>\r\n </ng-template>\r\n </kendo-multiselect>\r\n <kendo-multiselecttree *ngIf=\"!isMobileScreen() && data.Multiple && data.EnableCheckbox\"\r\n class=\"input-field e1tag-style1\"\r\n kendoMultiSelectTreeExpandable\r\n [placeholder]=\"data.PlaceHolder\"\r\n [kendoMultiSelectTreeHierarchyBinding]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n childrenField=\"Value\"\r\n [hasChildren]=\"hasChildren\"\r\n [textField]=\"itemTextField\"\r\n [valueField]=\"itemValueField\"\r\n [valuePrimitive]=\"true\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n [dataItems]=\"data.Value\"\r\n [loading]=\"isLoading\"\r\n [autoClose]=\"autoClose\"\r\n [expandOnFilter]=\"filterExpandSettings\"\r\n [filterable]=\"true\"\r\n (filterChange)=\"handleMultiSelectTreeFilter($event)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n [style]=\"componentProperties.style.style1\">\r\n <ng-template kendoMultiSelectTreeNoDataTemplate>\r\n <h4>\r\n <span class=\"k-icon k-i-warning\"></span><br /><br />\r\n No record found.\r\n </h4>\r\n </ng-template>\r\n </kendo-multiselecttree>\r\n</div>\r\n", styles: [":host ::ng-deep kendo-combobox.k-multiselect,:host ::ng-deep kendo-multiselect.k-multiselect{height:auto}:host ::ng-deep kendo-combobox .k-searchbar,:host ::ng-deep kendo-multiselect .k-searchbar{margin:auto}:host ::ng-deep kendo-combobox .k-searchbar+.k-icon,:host ::ng-deep kendo-multiselect .k-searchbar+.k-icon{margin:auto}:host ::ng-deep kendo-combobox .kendo-combobox-item-template,:host ::ng-deep kendo-multiselect .kendo-combobox-item-template{height:var(--input-field-height)!important}:host ::ng-deep kendo-combobox.disabled>.k-dropdown-wrap,:host ::ng-deep kendo-multiselect.disabled>.k-dropdown-wrap{background:transparent}:host ::ng-deep kendo-combobox:focus-within,:host ::ng-deep kendo-multiselect:focus-within{box-shadow:0 0 3px 1px var(--ion-color-primary)}fa-icon.isItemSelected{display:inline-block;width:1em;height:1em;contain:strict;fill:currentcolor;box-sizing:content-box!important;font-size:20px;margin-top:10px;margin-bottom:14px;margin-right:unset;margin-inline-end:20px}.gridInlineEdit{--background: transparent}.item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}.divselectmultiple{justify-content:space-between;width:99%;color:#000}.zselect-virtualization{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}\n"] }]
446
462
  }], ctorParameters: function () { return [{ type: i1.ResourceApiService }, { type: i1.WebApiService }, { type: i1.CacheService }, { type: i2.ZComponentService }]; }, propDecorators: { selectComponent: [{
447
463
  type: ViewChild,
448
464
  args: ["selectComponent"]
449
465
  }] } });
450
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienNlbGVjdG11bHRpcGxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21taGdsb2JhbC1keW5hbWljZm9ybS9zcmMvbGliL3pzZWxlY3RtdWx0aXBsZS96c2VsZWN0bXVsdGlwbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenNlbGVjdG11bHRpcGxlL3pzZWxlY3RtdWx0aXBsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFLeEUsOEJBQThCO0FBQzlCLE9BQU8sRUFBNEIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUMsMkNBQTJDO0FBQzNDLE9BQU8sRUFFTyxnQkFBZ0IsRUFDRyxvQkFBb0IsRUFBd0IsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFVeEUsTUFBTSxPQUFPLHdCQUF5QixTQUFRLGNBQWM7SUFnQzFELFlBQ1Usa0JBQXNDLEVBQ3RDLGFBQTRCLEVBQzVCLFlBQTBCLEVBQ2xDLFdBQThCO1FBQzVCLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUpaLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUEvQnBDLFVBQUssR0FBZSxFQUFFLENBQUM7UUFFdkIsa0JBQWEsR0FBZSxFQUFFLENBQUM7UUFDL0IsdUJBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQzFCLDhCQUE4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RSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7O3NIQXhmVSx3QkFBd0I7MEdBQXhCLHdCQUF3QixzTUMxQnJDLGdpUUFxSEE7NEZEM0ZhLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDRSxxQkFBcUI7Z01BS0QsZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBPbkRlc3Ryb3kgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuaW1wb3J0IHsgSW9uaWNTZWxlY3RhYmxlQ29tcG9uZW50IH0gZnJvbSBcImlvbmljLXNlbGVjdGFibGVcIjtcclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIE9ic2VydmFibGUsIG9mIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgdGFwLCBkZWxheSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQge1xyXG4gIFJlc291cmNlQXBpU2VydmljZSwgV2ViQXBpU2VydmljZSwgQ2FjaGVTZXJ2aWNlLCBDbGlja2FibGVJY29ucyxcclxuICBaQ29tcG9uZW50LCBaQ29tcG9uZW50SGVscGVyLCBaQ29tcG9uZW50T3V0cHV0RXZlbnQsXHJcbiAgWlNlbGVjdE11bHRpcGxlVGVtcGxhdGVQYXJhbXMsIFpTZWxlY3RQb3N0QXBpUGFyYW1zLCB6U2VsZWN0TXVsdGlwbGVQYXJhbXN9IGZyb20gXCJtbWhnbG9iYWwtemNvcmVcIjtcclxuaW1wb3J0IHsgSW5wdXRGaWVsZEJhc2UgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9pbnB1dGZpZWxkYmFzZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEZpbHRlckV4cGFuZFNldHRpbmdzIH0gZnJvbSBcIkBwcm9ncmVzcy9rZW5kby1hbmd1bGFyLXRyZWV2aWV3XCI7XHJcbmltcG9ydCB7IERyb3BEb3duRmlsdGVyU2V0dGluZ3MgfSBmcm9tIFwiQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZHJvcGRvd25zXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtenNlbGVjdG11bHRpcGxlXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi96c2VsZWN0bXVsdGlwbGUuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4venNlbGVjdG11bHRpcGxlLmNvbXBvbmVudC5zY3NzXCJdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBac2VsZWN0bXVsdGlwbGVDb21wb25lbnQgZXh0ZW5kcyBJbnB1dEZpZWxkQmFzZSBpbXBsZW1lbnRzIFpDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKFwic2VsZWN0Q29tcG9uZW50XCIpIHNlbGVjdENvbXBvbmVudDogSW9uaWNTZWxlY3RhYmxlQ29tcG9uZW50O1xyXG5cclxuICBpY29uTGlzdDogQ2xpY2thYmxlSWNvbnNbXTtcclxuICBpdGVtczogQXJyYXk8YW55PiA9IFtdO1xyXG4gIG1vZGVsekRhdGE6IEFycmF5PGFueT47XHJcbiAgaW5maW5pdGV6RGF0YTogQXJyYXk8YW55PiA9IFtdO1xyXG4gIGluZmluaXRlU2VhcmNoVGV4dCA9IG51bGw7XHJcbiAgLy8gc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgdG9nZ2xlU2VsZWN0YWJsZSA9IHRydWU7XHJcbiAgaXRlbVZhbHVlRmllbGQ6IHN0cmluZyA9IG51bGw7XHJcbiAgaXRlbVRleHRGaWVsZDogc3RyaW5nID0gbnVsbDtcclxuICBpdGVtRGF0YUZpZWxkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGl0ZW1UZW1wbGF0ZSA9IFwie3tpdGVtW2l0ZW1UZXh0RmllbGRdfX1cIjtcclxuICBpbmZpbml0ZVNjcm9sbFBhZ2VObyA9IDA7XHJcbiAgaXNMb2FkaW5nID0gdHJ1ZTtcclxuICBwcml2YXRlIGRlYm91bmNlU3ViOiBTdWJzY3JpcHRpb247XHJcbiAgYWxsb3dDdXN0b21WYWx1ZSA9IGZhbHNlO1xyXG4gIGF1dG9DbG9zZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIHBhcnNlZEl0ZW1zRGF0YTogYW55W107XHJcbiAgZGF0YUluZm86IHt9ID0ge1xyXG4gICAgXCJpdGVtc1Jlc291cmNlVVJMXCI6IFwiXCIsXHJcbiAgICBcIm9wdGlvbkZpbHRlcnNcIjogXCJcIixcclxuICAgIFwidG90YWxDb3VudFwiOiAwXHJcbiAgfTtcclxuXHJcbiAgLy8gcHJpdmF0ZSBsb2FkSW5maW5pdGVEYXRhU3ViOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBwdWJsaWMgZmlsdGVyU2V0dGluZ3M6IERyb3BEb3duRmlsdGVyU2V0dGluZ3MgPSB7XHJcbiAgICBjYXNlU2Vuc2l0aXZlOiBmYWxzZSxcclxuICAgIG9wZXJhdG9yOiBcImNvbnRhaW5zXCIsXHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlc291cmNlQXBpU2VydmljZTogUmVzb3VyY2VBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB3ZWJBcGlTZXJ2aWNlOiBXZWJBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjYWNoZVNlcnZpY2U6IENhY2hlU2VydmljZSxcclxuICAgIGNvbXBTZXJ2aWNlOiBaQ29tcG9uZW50U2VydmljZVxyXG4gICkgeyBzdXBlcihjb21wU2VydmljZSkgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIC8vIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xyXG4gICAgLy8gICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgLy8gfVxyXG4gICAgaWYgKHRoaXMuZGVib3VuY2VTdWIpIHtcclxuICAgICAgdGhpcy5kZWJvdW5jZVN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHZpcnR1YWw6IGFueSA9IHtcclxuICAgIGl0ZW1IZWlnaHQ6IDI4LFxyXG4gICAgcGFnZVNpemU6IDE1XHJcbiAgfTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICBzdXBlci5zZXR1cElubmVyRmllbGQoKTtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0U2VsZWN0TXVsdGlwbGVUZXh0VmFsdWUodGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMsIHRoaXMpO1xyXG5cclxuICAgIC8vIFtEcm9wZG93bmxpc3QgTXVsdGlwbGVdIC0gYXV0byBjbG9zZSBtZW51IHdoZW4gbG9zZSBmb2N1cy5cclxuICAgIGlmICh0aGlzLmRhdGEuQXV0b0Nsb3NlID09PSBmYWxzZSkgdGhpcy5hdXRvQ2xvc2UgPSB0aGlzLmRhdGEuQXV0b0Nsb3NlO1xyXG5cclxuICAgIC8vIEhhbmRsZSBDbGlja2FibGUgSWNvbnNcclxuICAgIHRoaXMuaWNvbkxpc3QgPSB0aGlzLmRhdGEuQ2xpY2thYmxlSWNvbnM7XHJcbiAgICBpZiAodGhpcy5pY29uTGlzdCkge1xyXG4gICAgICBpZiAodGhpcy5pY29uTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5pY29uTGlzdC5mb3JFYWNoKChpOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChpLlRvb2x0aXAgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpLlRvb2x0aXAgPSBcIlwiO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaS5Ub29sdGlwID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIGkuVG9vbHRpcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBEZWZhdWx0IHBvc2l0aW9uIHRvcC4gcmlnaHQgfCBib3R0b20gfCB0b3AgfCBsZWZ0XHJcbiAgICAgICAgICBpZiAoaS5Qb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGkuUG9zaXRpb24gPSBcInRvcFwiO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmFsbG93Q3VzdG9tVmFsdWUgPSB0aGlzLmRhdGEuQWxsb3dDdXN0b21WYWx1ZSB8fCBmYWxzZTsgLy8gQWxsb3cgZW50ZXIgdGV4dCBpbiBkcm9wZG93bmJveFxyXG4gICAgY29uc3QgZmllbGRWYWx1ZSA9IHRoaXMuZGF0YS5WYWx1ZTtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XHJcbiAgICBjb25zdCB6TW9kZWwgPSB0aGlzLmdyb3VwLnpNb2RlbDtcclxuXHJcbiAgICAvKlxyXG4gICAgICogNCBTdHlsZXMgb2YgZGVjbGFyZSB0aGUgY29tcG9uZW5077+9cyBvcHRpb24gbGlzdCBkYXRhIHNvdXJjZS5cclxuICAgICAqIFN0eWxlICMxIC0gRmllbGQuU2VsZWN0T3B0aW9ucyBkZWZpbmVkIGFzIGFuIGFycmF5IG9mIG9iamVjdCB0aGF0IGNvbnRhaW4gdGV4dCBhbmQgdmFsdWUuXHJcbiAgICAgKiBTdHlsZSAjMiAtIEZpZWxkLlNlbGVjdE9wdGlvbnMgZGVmaW5lZCBhcyBhIHBoYXNlIGxpa2Ug77+9aXRlbS5JZCBhcyBpdGVtLk5hbWUgZm9yIGl0ZW0gaW4gZ3JvdXAuekRhdGEuUHJvamVjdE9wdGlvbnPvv70uXHJcbiAgICAgKiBTdHlsZSAjMyAtIEZpZWxkLk9wdGlvblJlc291cmNlVVJMIGRlZmluZWQgdGhlIG5hbWUgb2YgcmVzb3VyY2Ugc2VydmVyIGFwaS5cclxuICAgICAqIFN0eWxlICM0IC0gRmllbGQuSW5maW5pdGVTY3JvbGwkIGRlZmluZWQgdGhlIG1ldGhvZCBuYW1lIGFzIO+/vWdyb3VwLmdldE1vcmVEYXRhQXNTY3JvbGzvv70uXHJcbiAgICAgKi9cclxuXHJcbiAgICBpZiAoZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCAmJiBkYXRhLkluZmluaXRlU2Nyb2xsJCkge1xyXG4gICAgICAvLyB3aGVuIGluZmluaXRpZSBzY3JvbGxcclxuICAgICAgbGV0IHJlY29yZElkID0gbnVsbDtcclxuICAgICAgaWYgKHpNb2RlbCAmJiB6TW9kZWxbZmllbGRWYWx1ZV0pIHtcclxuICAgICAgICAvLyBnZXQgek1vZGVsIFZhbHVlXHJcbiAgICAgICAgcmVjb3JkSWQgPSB6TW9kZWxbZmllbGRWYWx1ZV0udG9TdHJpbmcoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGdldHpEYXRhRm9yek1vZGVsJDogT2JzZXJ2YWJsZTxhbnk+ID0gWkNvbXBvbmVudEhlbHBlci5nZXRJbmZpbml0ZURhdGEobnVsbCwgJycsIHRoaXMsIHJlY29yZElkKTtcclxuICAgICAgaWYgKGdldHpEYXRhRm9yek1vZGVsJCkge1xyXG4gICAgICAgIGdldHpEYXRhRm9yek1vZGVsJC5zdWJzY3JpYmUoKHpkYXRhKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhLk5hbWUsICcgLSBpbml0aWFsIHpEYXRhIGxvYWQ6ICcsIHpkYXRhKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5ncm91cCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICB0aGlzLmdyb3VwLmFmdGVyTG9hZHpEYXRhT3B0aW9ucyh0aGlzLmdyb3VwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFaQ29tcG9uZW50SGVscGVyLmlzTW9iaWxlU2NyZWVuKCkpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZUZpbHRlcihudWxsLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIFN0eWxlICMxLCAjMiwgIzNcclxuICAgICAgY29uc3QgaXNSZXF1aXJlZCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCBkYXRhLklzUmVxdWlyZWQpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGF0YS5PcHRpb25SZXNvdXJjZVVSTCkge1xyXG4gICAgICAgIHRoaXMubGF6eUxvYWREYXRhT3B0aW9ucygpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgb3B0aW9uRGF0YSA9IHJlcy5kYXRhU2V0ID8gcmVzLmRhdGFTZXQgOiByZXM7XHJcblxyXG4gICAgICAgICAgaWYgKG9wdGlvbkRhdGEgJiYgb3B0aW9uRGF0YS5sZW5ndGggPT09IDEgJiYgIXRoaXMuZGF0YS5EaXNhYmxlQXV0b0ZpcnN0U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0b1NlbGVjdEZpcnN0T3B0aW9uKGlzUmVxdWlyZWQsIG9wdGlvbkRhdGFbMF0sIGZpZWxkVmFsdWUsIHpNb2RlbC5JZCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnModGhpcy5ncm91cCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zKSAmJiB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucykge1xyXG4gICAgICAgICAgLy9za2lwIGV2YWwgaWYgc2VsZWN0b3B0aW9ucyBpcyBleGlzdFxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG9wdGlvbkRhdGEgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgdGhpcy5pdGVtRGF0YUZpZWxkKTtcclxuICAgICAgICAgIC8vIGFwcGVuZCBkYXRhIHZpYSB0aW1lb3V0IGFmdGVyIGRhdGEgaXMgbG9hZGVkLlxyXG4gICAgICAgICAgaWYgKG9wdGlvbkRhdGEgJiYgb3B0aW9uRGF0YS5sZW5ndGggPT09IDEgJiYgIXRoaXMuZGF0YS5EaXNhYmxlQXV0b0ZpcnN0U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoaXNDb21wb25lbnQgPSB0aGlzO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICB0aGlzQ29tcG9uZW50LmF1dG9TZWxlY3RGaXJzdE9wdGlvbihpc1JlcXVpcmVkLCBvcHRpb25EYXRhWzBdLCBmaWVsZFZhbHVlLCB0aGlzQ29tcG9uZW50Lmdyb3VwLnpNb2RlbC5JZCk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnModGhpcy5ncm91cCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBBdXRvIHNlbGVjdCBmaXJzdCBvcHRpb24gKGlmIHJlcXVpcmVkICYgb25seSAxIG9wdGlvbilcclxuICBwcml2YXRlIGF1dG9TZWxlY3RGaXJzdE9wdGlvbihyZXF1aXJlZDogYm9vbGVhbiwgZGF0YTogYW55LCB6TW9kZWxQcm9wZXJ0eU5hbWU6IHN0cmluZywgaWQ6IGFueSkge1xyXG4gICAgaWYgKFpDb21wb25lbnRIZWxwZXIuaXNOdWxsVW5kZWZpbmVkRW1wdHkoaWQpICYmIHJlcXVpcmVkKSB7XHJcbiAgICAgIHZhciBvcHRpb25JZCA9IGRhdGEuSWQ7XHJcbiAgICAgIGlmICh0aGlzLmRhdGEuTXVsdGlwbGUpIHtcclxuICAgICAgICBvcHRpb25JZCA9IFtvcHRpb25JZF07XHJcbiAgICAgIH1cclxuICAgICAgWkNvbXBvbmVudEhlbHBlci5zZXRNb2RlbFZhbHVlKHpNb2RlbFByb3BlcnR5TmFtZSwgb3B0aW9uSWQsIHRoaXMuZ3JvdXApO1xyXG5cclxuICAgICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IFwib25DaGFuZ2VcIixcclxuICAgICAgICB0YXJnZXQ6IHRoaXMuZGF0YS5PbkNoYW5nZSxcclxuICAgICAgICBldmVudCxcclxuICAgICAgICBkYXRhOiB7IFsndmFsdWUnXTogb3B0aW9uSWQsIGZpZWxkOiB0aGlzLmRhdGEgfVxyXG4gICAgICB9IGFzIFpDb21wb25lbnRPdXRwdXRFdmVudCk7XHJcblxyXG4gICAgICB0aGlzLmZvcm0ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFN0eWxlICMzXHJcbiAgbGF6eUxvYWREYXRhT3B0aW9ucygpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgcmVzb3VyY2VVcmwgPSB0aGlzLnJlc291cmNlQXBpU2VydmljZS5nZXRVUkwoXHJcbiAgICAgIHRoaXMuZGF0YS5PcHRpb25SZXNvdXJjZVVSTFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBmaWx0ZXJQYXJhbSA9IG5ldyBaU2VsZWN0UG9zdEFwaVBhcmFtcygpO1xyXG4gICAgZmlsdGVyUGFyYW0uc29ydHMgPSB0aGlzLmRhdGEuT3B0aW9uU29ydDtcclxuICAgIGZpbHRlclBhcmFtLmNvbHVtbnMgPSB0aGlzLmRhdGEuT3B0aW9uQ29sdW1ucztcclxuICAgIGZpbHRlclBhcmFtLmZpbHRlcnMgPSB0aGlzLmRhdGEuT3B0aW9uRmlsdGVyO1xyXG5cclxuICAgIHJldHVybiBaQ29tcG9uZW50SGVscGVyLmdldERhdGFPcHRpb25zKFxyXG4gICAgICB0aGlzLmRhdGEuT3B0aW9uTmFtZSxcclxuICAgICAgZmlsdGVyUGFyYW0sXHJcbiAgICAgIHRoaXMuZ3JvdXAsXHJcbiAgICAgIHJlc291cmNlVXJsLFxyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZSxcclxuICAgICAgdGhpcy53ZWJBcGlTZXJ2aWNlLFxyXG4gICAgICB0aGlzLmRhdGFbJ0Rpc2FibGVDYWNoZSddXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gU3R5bGUgIzQsIHVzZWQgaW4gaW9uaWMtc2VsZWN0YWJsZVxyXG4gIGdldEluZmluaXRlRGF0YShldmVudDoge1xyXG4gICAgY29tcG9uZW50OiBJb25pY1NlbGVjdGFibGVDb21wb25lbnQ7XHJcbiAgICB0ZXh0OiBzdHJpbmc7XHJcbiAgfSkge1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5nZXRJbmZpbml0ZURhdGEoZXZlbnQuY29tcG9uZW50LCBldmVudC50ZXh0LCB0aGlzKTtcclxuICB9XHJcblxyXG4gIGdldEl0ZW1zRGF0YSgpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuSGFzSW5maW5pdGVTY3JvbGwpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5maW5pdGV6RGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvcHRpb25OYW1lID0gdGhpcy5kYXRhLk9wdGlvbk5hbWUgfHwgdGhpcy5pdGVtRGF0YUZpZWxkIHx8ICdncm91cC56RGF0YS4nICsgdGhpcy5kYXRhLk5hbWU7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucykgJiYgIXRoaXMuZ3JvdXAuekRhdGFbb3B0aW9uTmFtZS5zbGljZSgxMildKSB7XHJcbiAgICAgIC8vIHJldHVybiBzZWxlY3Rpb25PcHRpb25zO1xyXG4gICAgICAvLyByZXR1cm4gdGhpcy5kYXRhLlNlbGVjdE9wdGlvbnM7XHJcbiAgICAgIHRoaXMuZ3JvdXAuekRhdGFbb3B0aW9uTmFtZS5zbGljZSgxMildID0gdGhpcy5kYXRhLlNlbGVjdE9wdGlvbnM7XHJcbiAgICAgIHRoaXMuaXRlbURhdGFGaWVsZCA9IG9wdGlvbk5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9wdGlvbk5hbWUuc3RhcnRzV2l0aCgnekRhdGEuJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ3JvdXAuekRhdGFbb3B0aW9uTmFtZS5zbGljZSg2KV0gfHwgW107XHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9uTmFtZS5zdGFydHNXaXRoKCdncm91cC56RGF0YS4nKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5ncm91cC56RGF0YVtvcHRpb25OYW1lLnNsaWNlKDEyKV0gfHwgW107XHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9uTmFtZS5zdGFydHNXaXRoKCdncm91cC4nKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5ncm91cFtvcHRpb25OYW1lLnNsaWNlKDYpXSB8fCBbXTtcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25OYW1lKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwW29wdGlvbk5hbWVdIHx8IFtdO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS53YXJuKHRoaXMuZGF0YS5OYW1lLCAnIC0gSW52YWxpZCBzZXR0aW5nIGZvciBPcHRpb25OYW1lOiAnLCBvcHRpb25OYW1lKTtcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoKGV2ZW50OiB7IGNvbXBvbmVudDogSW9uaWNTZWxlY3RhYmxlQ29tcG9uZW50OyB0ZXh0OiBzdHJpbmcgfSkge1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJBdCB6c2VsZWN0bXVsdGlwbGUuY29tcG9uZW50IChvblNlYXJjaCk6IFwiLCBldmVudCk7XHJcbiAgICAvLyBldmVudC5jb21wb25lbnQgaXMgZm9yIG1vYmlsZSBvbmx5XHJcbiAgICBjb25zdCBjb21wb25lbnQgPSBldmVudC5jb21wb25lbnQ7XHJcbiAgICBpZiAoY29tcG9uZW50KSB7XHJcbiAgICAgIGNvbXBvbmVudC5zdGFydFNlYXJjaCgpO1xyXG4gICAgICBjb21wb25lbnQuZW5hYmxlSW5maW5pdGVTY3JvbGwoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRhLkhhc0luZmluaXRlU2Nyb2xsKSB7XHJcbiAgICAgIC8vIElmIHNlYXJjaCB0ZXh0LCByZXNldCBwYWdlIHRvIDAuIEdldCBpbmZpbml0ZSBkYXRhXHJcbiAgICAgIGlmIChldmVudC50ZXh0ICE9PSBudWxsICYmIGV2ZW50LnRleHQgIT09IHRoaXMuaW5maW5pdGVTZWFyY2hUZXh0KSB7XHJcbiAgICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbFBhZ2VObyA9IDA7XHJcbiAgICAgICAgdGhpcy5tb2RlbHpEYXRhID0gW107XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5nZXRJbmZpbml0ZURhdGEoZXZlbnQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIFJlc2V0IHNjcm9sbCBwYWdlLCBlbXB0eSBpdGVtc1xyXG4gICAgICB0aGlzLmluZmluaXRlU2Nyb2xsUGFnZU5vID0gMDtcclxuICAgICAgaWYgKGNvbXBvbmVudCkge1xyXG4gICAgICAgIGNvbXBvbmVudC5pdGVtcyA9IFtdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBGaWx0ZXIgekRhdGEgYW5kIHB1c2ggdG8gaXRlbXNcclxuICAgICAgY29uc3QgcGFyYW1zOiB6U2VsZWN0TXVsdGlwbGVQYXJhbXMgPSB7XHJcbiAgICAgICAgcmVmZXJJZDogbnVsbCxcclxuICAgICAgICBwYWdlTm86IDAsXHJcbiAgICAgICAgcGFnZVNpemU6IDIwLFxyXG4gICAgICAgIHNvcnRDb2x1bW5OYW1lOiBcIlwiLFxyXG4gICAgICAgIHNvcnRPcmRlcjogXCJcIixcclxuICAgICAgICBzb3J0Q29sdW1uTmFtZXM6IFtdLFxyXG4gICAgICAgIHNvcnRPcmRlcnM6IFtdLFxyXG4gICAgICAgIGZpbHRlclBhcmFtczogW10sXHJcbiAgICAgICAgcGFyYW1ldGVyczogXCJcIlxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3Qgc2VhcmNoRmllbGRzID0gdGhpcy5kYXRhLlNlYXJjaEZpZWxkcyA/IHRoaXMuZGF0YS5TZWFyY2hGaWVsZHMgOiB0aGlzLml0ZW1UZXh0RmllbGQ7XHJcbiAgICAgIGNvbnN0IGZpbHRlcml0ZW1zID0gWkNvbXBvbmVudEhlbHBlci5maWx0ZXJTZWFyY2hJdGVtcyhcclxuICAgICAgICB0aGlzLmdldEl0ZW1zRGF0YSgpLFxyXG4gICAgICAgIGV2ZW50LnRleHQsXHJcbiAgICAgICAgc2VhcmNoRmllbGRzLFxyXG4gICAgICAgIHBhcmFtcy5wYWdlTm8sXHJcbiAgICAgICAgcGFyYW1zLnBhZ2VTaXplXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChjb21wb25lbnQpIHtcclxuICAgICAgICBjb25zdCBpdGVtcyA9IGNvbXBvbmVudC5pdGVtcy5jb25jYXQoZmlsdGVyaXRlbXMpO1xyXG4gICAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgICAgIGNvbXBvbmVudC5lbmRJbmZpbml0ZVNjcm9sbCgpO1xyXG4gICAgICAgIGNvbXBvbmVudC5lbmRTZWFyY2goKTtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVGaWx0ZXIodmFsdWU6IGFueSwganVzdE9uZVRpbWU/OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5kZWJvdW5jZVN1Yikge1xyXG4gICAgICB0aGlzLmRlYm91bmNlU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2tpcCBmaWx0ZXJpbmcgaWYgaGF2ZSBpbmlmaW5pdGVzY3JvbGw/XHJcbiAgICBpZiAoIXRoaXMuZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCkge1xyXG4gICAgICB0aGlzLmRlYm91bmNlU3ViID0gb2YoW10pXHJcbiAgICAgICAgLnBpcGUodGFwKCgpID0+ICh0aGlzLmlzTG9hZGluZyA9IHRydWUpKSwgZGVsYXkoNTAwKSlcclxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMub25TZWFyY2goeyBjb21wb25lbnQ6IG51bGwsIHRleHQ6IHZhbHVlIH0pO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwLmFmdGVyTG9hZHpEYXRhT3B0aW9ucykge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKHRoaXMuZ3JvdXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgKHRoaXMubG9hZEluZmluaXRlRGF0YVN1Yikge1xyXG4gICAgLy8gICB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIC8vIH1cclxuICAgIC8vIHRoaXMubG9hZEluZmluaXRlRGF0YVN1YiA9IG5ldyBTdWJqZWN0KGZhbHNlKTtcclxuICAgIC8vIHRoaXMuaGFuZGxlRmlsdGVyKG51bGwpO1xyXG4gICAgLy8gaW50ZXJ2YWwoMjAwMCkucGlwZSh0YWtlVW50aWwodGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgIC8vICAgdGhpcy5vblNlYXJjaCh7IGNvbXBvbmVudDogbnVsbCwgdGV4dDogdmFsdWUgfSk7XHJcbiAgICAvLyAgIGlmIChqdXN0T25lVGltZSkge1xyXG4gICAgLy8gICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVPcGVuKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCkge1xyXG4gICAgICB0aGlzLmhhbmRsZUZpbHRlcihudWxsKTtcclxuICAgICAgLy8gICAvLyBpZiAodGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViKSB7XHJcbiAgICAgIC8vICAgLy8gICB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgLy8gICAvLyB9XHJcbiAgICAgIC8vICAgLy8gdGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViID0gbmV3IFN1YmplY3QoKTtcclxuICAgICAgLy8gICAvLyAvLyB0aGlzLmhhbmRsZUZpbHRlcihudWxsKTtcclxuICAgICAgLy8gICAvLyBpbnRlcnZhbCgzMDAwKS5waXBlKHRha2VVbnRpbCh0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAvLyAgIC8vIHRoaXMuaGFuZGxlRmlsdGVyKG51bGwpO1xyXG4gICAgICAvLyAgIC8vIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2xvc2UoKSB7XHJcbiAgICAvLyBpZiAodGhpcy5kYXRhLkhhc0luZmluaXRlU2Nyb2xsKSB7XHJcbiAgICAvLyAgIGlmICh0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIpIHtcclxuICAgIC8vICAgICB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIubmV4dCh0cnVlKTtcclxuICAgIC8vICAgICAvLyB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIuY29tcGxldGUoKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlQmx1cigpIHtcclxuICAgIC8vIHRoaXMuaGFuZGxlQ2xvc2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJdGVtVGVtcGxhdGUoXHJcbiAgICBpdGVtOiBhbnksXHJcbiAgICBkYXRhOiBhbnksXHJcbiAgICBncm91cDogYW55LFxyXG4gICAgaXRlbVZhbHVlRmllbGQ6IHN0cmluZyxcclxuICAgIGl0ZW1UZXh0RmllbGQ6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgLy8gVG9ETzogaXRlbVZhbHVlRmllbGQgYW5kIGl0ZW1UZXh0RmllbGRcclxuICAgIGlmICh0aGlzLmRhdGEuSXRlbVRlbXBsYXRlKSB7XHJcbiAgICAgIGNvbnN0IGdldFRlbXBsYXRlRnVuYyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuSXRlbVRlbXBsYXRlKTtcclxuXHJcbiAgICAgIHJldHVybiBnZXRUZW1wbGF0ZUZ1bmMoe1xyXG4gICAgICAgIGl0ZW0sXHJcbiAgICAgICAgZGF0YSxcclxuICAgICAgICBncm91cCxcclxuICAgICAgICBpdGVtVmFsdWVGaWVsZCxcclxuICAgICAgICBpdGVtVGV4dEZpZWxkXHJcbiAgICAgIH0gYXMgWlNlbGVjdE11bHRpcGxlVGVtcGxhdGVQYXJhbXMpO1xyXG4gICAgfSBlbHNlIGlmIChpdGVtVGV4dEZpZWxkKSB7XHJcbiAgICAgIHJldHVybiBpdGVtW2l0ZW1UZXh0RmllbGRdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gcmV0dXJuIGl0ZW1baXRlbVRleHRGaWVsZF07XHJcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGl0ZW0pLmpvaW4oXCIsIFwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQWRkSXRlbShldmVudDogYW55KSB7XHJcbiAgICBjb25zdCBmID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIHRoaXMuZGF0YS5PbkFkZEl0ZW0pO1xyXG4gICAgaWYgKHR5cGVvZiBmID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IGNhbGxGdW5jID0gZi5iaW5kKHRoaXMuZ3JvdXAuY3RybFNjb3BlKTtcclxuICAgICAgcmV0dXJuIGNhbGxGdW5jKCk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgZGVjbGFyYXRpb24gb2YgT25BZGRJdGVtOiAnLCBmKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIC8vIENvbXBvbmVudCBiYXNpYyBmdW5jdGlvblxyXG4gIGNsZWFyRGF0YSgpIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0TW9kZWxWYWx1ZSh0aGlzLmRhdGEuVmFsdWUsIFwiXCIsIHRoaXMuZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJJdGVtcygpIHtcclxuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LmNsZWFyKCk7XHJcbiAgICB0aGlzLnNlbGVjdENvbXBvbmVudC5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgY29uZmlybUl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQuY29uZmlybSgpO1xyXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQudG9nZ2xlSXRlbXModGhpcy50b2dnbGVTZWxlY3RhYmxlKTtcclxuICAgIHRoaXMudG9nZ2xlU2VsZWN0YWJsZSA9ICF0aGlzLnRvZ2dsZVNlbGVjdGFibGU7XHJcblxyXG4gICAgLy8gQ29uZmlybSBpdGVtcyBhbmQgY2xvc2UgU2VsZWN0IHBhZ2VcclxuICAgIC8vIHdpdGhvdXQgaGF2aW5nIHRoZSB1c2VyIHRvIGNsaWNrIENvbmZpcm0gYnV0dG9uLlxyXG4gICAgLy8gdGhpcy5jb25maXJtKCk7XHJcbiAgfVxyXG5cclxuICAvLyBEaXNhYmxlIE9wZW4gT24gRm9jdXNcclxuICBkaXNhYmxlT3Blbk9uRm9jdXMoY29tYm9ib3hDb21wb25lbnQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5EaXNhYmxlT3Blbk9uRm9jdXMpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIGNvbWJvYm94Q29tcG9uZW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gT25DaGFuZ2VcclxuICBwdWJsaWMgb25DaGFuZ2VfZGVza3RvcChldmVudDogYW55KSB7XHJcbiAgICBzdXBlci5vbkNoYW5nZShudWxsLCBldmVudClcclxuICAgIHRoaXMuaGFuZGxlSW5maW5pdGVTY3JvbGxPbkNoYW5nZShldmVudCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DaGFuZ2VfbW9iaWxlKGV2ZW50OiB7IGNvbXBvbmVudDogSW9uaWNTZWxlY3RhYmxlQ29tcG9uZW50OyB2YWx1ZTogYW55IH0pIHtcclxuICAgIHN1cGVyLm9uQ2hhbmdlKGV2ZW50KVxyXG4gICAgY29uc3QgZmMgPSB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy5kYXRhLlZhbHVlXTtcclxuICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHN1cGVyLmdldElzUmVxdWlyZWRWYWx1ZSgpICYmIChldmVudC52YWx1ZSA9PT0gbnVsbCB8fCBldmVudC52YWx1ZS5sZW5ndGggPT09IDApXHJcbiAgICApIHtcclxuICAgICAgZmMuc2V0RXJyb3JzKHsgcmVxdWlyZWQ6IHRydWUgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmYy5zZXRFcnJvcnMobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oYW5kbGVJbmZpbml0ZVNjcm9sbE9uQ2hhbmdlKGV2ZW50LnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlSW5maW5pdGVTY3JvbGxPbkNoYW5nZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLkhhc0luZmluaXRlU2Nyb2xsICYmICEhdGhpcy5kYXRhLkluZmluaXRlU2Nyb2xsJCkge1xyXG4gICAgICBjb25zdCB0ZXh0RmllbGQgPSB0aGlzLml0ZW1UZXh0RmllbGQudG9TdHJpbmcoKTtcclxuICAgICAgY29uc3QgdmFsdWVGaWVsZCA9IHRoaXMuaXRlbVZhbHVlRmllbGQudG9TdHJpbmcoKTtcclxuICAgICAgbGV0IHpkYXRhTW9kZWwgPSBbXTtcclxuICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgemRhdGFNb2RlbCA9IHRoaXMuaW5maW5pdGV6RGF0YS5maWx0ZXIoeCA9PiB4W3ZhbHVlRmllbGRdID09PSB2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5tb2RlbHpEYXRhID0gemRhdGFNb2RlbC5zbGljZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLml0ZW1EYXRhRmllbGQuc3RhcnRzV2l0aCgnZ3JvdXAuekRhdGEuJykpIHtcclxuICAgICAgICB0aGlzLmdyb3VwLnpEYXRhW3RoaXMuaXRlbURhdGFGaWVsZC5zbGljZSgxMildID0gemRhdGFNb2RlbDtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLml0ZW1EYXRhRmllbGQuc3RhcnRzV2l0aCgnZ3JvdXAuJykpIHtcclxuICAgICAgICB0aGlzLmdyb3VwW3RoaXMuaXRlbURhdGFGaWVsZC5zbGljZSg2KV0gPSB6ZGF0YU1vZGVsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBNdWx0aSBTZWxlY3Rpb24gVHJlZVxyXG4gIHB1YmxpYyBnZXQgZmlsdGVyRXhwYW5kU2V0dGluZ3MoKTogRmlsdGVyRXhwYW5kU2V0dGluZ3Mge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZXhwYW5kTWF0Y2hlczogdHJ1ZSxcclxuICAgICAgZXhwYW5kZWRPbkNsZWFyOiBcImluaXRpYWxcIlxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhc0NoaWxkcmVuID0gKGRhdGFpdGVtOiBhbnkpOiBib29sZWFuID0+ICEhZGF0YWl0ZW1bJ2l0ZW1zJ107XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVNdWx0aVNlbGVjdFRyZWVGaWx0ZXIodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5wYXJzZWRJdGVtc0RhdGEgPSB0aGlzLm9uTXVsdGlTZWxlY3RUcmVlU2VhcmNoKHRoaXMuZ2V0SXRlbXNEYXRhKCksIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk11bHRpU2VsZWN0VHJlZVNlYXJjaChpdGVtczogYW55W10sIHNlYXJjaGVkVGV4dDogc3RyaW5nKTogYW55W10ge1xyXG4gICAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmNvbnRhaW5zKGl0ZW1bdGhpcy5pdGVtVGV4dEZpZWxkXSwgc2VhcmNoZWRUZXh0KSkge1xyXG4gICAgICAgIGFjYy5wdXNoKGl0ZW0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGl0ZW1bJ2l0ZW1zJ10gJiYgaXRlbVsnaXRlbXMnXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSB0aGlzLm9uTXVsdGlTZWxlY3RUcmVlU2VhcmNoKGl0ZW1bJ2l0ZW1zJ10sIHNlYXJjaGVkVGV4dCk7XHJcblxyXG4gICAgICAgIGlmIChuZXdJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBfaXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0pO1xyXG4gICAgICAgICAgX2l0ZW1bJ2l0ZW1zJ10gPSBuZXdJdGVtcztcclxuXHJcbiAgICAgICAgICBhY2MucHVzaChfaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gYWNjO1xyXG4gICAgfSwgW10pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvbnRhaW5zKHRleHQ6IHN0cmluZywgc2VhcmNoZWRUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoKHNlYXJjaGVkVGV4dCB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cInpzZWxlY3RtdWx0aXBsZS1jb250YWluZXIgZTF0YWctc3R5bGVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZVwiPlxyXG4gIDxpb25pYy1zZWxlY3RhYmxlICpuZ0lmPVwiaXNNb2JpbGVTY3JlZW4oKVwiICNzZWxlY3RDb21wb25lbnQgaXRlbS1jb250ZW50IHNlYXJjaEZhaWxUZXh0PVwiTm90aGluZyBmb3VuZCA6KFwiXHJcbiAgICBoZWFkZXJDb2xvcj1cInByaW1hcnlcIiBjbGVhckJ1dHRvblRleHQ9XCJDbGVhclwiIFsobmdNb2RlbCldPVwiZ3JvdXAuek1vZGVsW2RhdGEuVmFsdWVdXCIgW2lkXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgW2l0ZW1zXT1cImdldEl0ZW1zRGF0YSgpXCIgW2l0ZW1WYWx1ZUZpZWxkXT1cIml0ZW1WYWx1ZUZpZWxkXCIgW2l0ZW1UZXh0RmllbGRdPVwiaXRlbVRleHRGaWVsZFwiXHJcbiAgICBbY2FuQWRkSXRlbV09XCIhIWRhdGEuT25BZGRJdGVtXCIgW2NhbkNsZWFyXT1cInRydWVcIiBbcGxhY2Vob2xkZXJdPVwiZGF0YS5QbGFjZUhvbGRlclwiXHJcbiAgICBbY2FuU2VhcmNoXT1cIiFkYXRhWydkaXNhYmxlLXNlYXJjaCddXCIgW3Nob3VsZEZvY3VzU2VhcmNoYmFyXT1cIiFkYXRhWydkaXNhYmxlLXNlYXJjaCddXCJcclxuICAgIFtoYXNJbmZpbml0ZVNjcm9sbF09XCIhIWRhdGEuSGFzSW5maW5pdGVTY3JvbGxcIiBbaXNNdWx0aXBsZV09XCJkYXRhLk11bHRpcGxlXCJcclxuICAgIFtpc0VuYWJsZWRdPVwiISghIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICBbc2hvdWxkU3RvcmVJdGVtVmFsdWVdPVwidHJ1ZVwiIChvblNlYXJjaCk9XCJvblNlYXJjaCgkZXZlbnQpXCIgKG9uSW5maW5pdGVTY3JvbGwpPVwiZ2V0SW5maW5pdGVEYXRhKCRldmVudClcIlxyXG4gICAgKG9uQWRkSXRlbSk9XCJvbkFkZEl0ZW0oJGV2ZW50KVwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZV9tb2JpbGUoJGV2ZW50KVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMVwiIGNsYXNzPVwiZTF0YWctc3R5bGUxXCI+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIGlvbmljU2VsZWN0YWJsZUl0ZW1JY29uVGVtcGxhdGUgbGV0LWl0ZW09XCJpdGVtXCIgbGV0LWlzSXRlbVNlbGVjdGVkPVwiaXNJdGVtU2VsZWN0ZWRcIj5cclxuICAgICAgPGZhLWljb24gc2xvdD1cInN0YXJ0XCIgY2xhc3M9XCJpc0l0ZW1TZWxlY3RlZCBlMXRhZy1zdHlsZTJcIiBzaXplPVwic21cIiBbaWNvbl09XCJbJ2ZhcicsIGlzSXRlbVNlbGVjdGVkID8gJ2NoZWNrLWNpcmNsZSc6ICdjaXJjbGUnXVwiXHJcbiAgICAgICAgW3N0eWxlc109XCJ7J2NvbG9yJzogaXNJdGVtU2VsZWN0ZWQgPyAnZG9kZ2VyQmx1ZScgOiAnbGlnaHRHcmF5J31cIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTJcIj48L2ZhLWljb24+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBpb25pY1NlbGVjdGFibGVDbG9zZUJ1dHRvblRlbXBsYXRlPlxyXG4gICAgICA8IS0tIDxpb24taWNvbiBuYW1lPVwiY2xvc2UtY2lyY2xlXCI+PC9pb24taWNvbj4gLS0+XHJcbiAgICAgIDxmYS1pY29uIFtpY29uXT1cIid0aW1lcy1jaXJjbGUnXCIgc2l6ZT1cIm1kXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUzXCIgY2xhc3M9XCJlMXRhZy1zdHlsZTNcIj48L2ZhLWljb24+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBpb25pY1NlbGVjdGFibGVUaXRsZVRlbXBsYXRlPlxyXG4gICAgICA8c3BhbiBjbGFzcz1lMXRhZy1zdHlsZTQgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU0XCI+e3tkYXRhLkxhYmVsfX08L3NwYW4+XHJcbiAgICAgIDxpb24tdGV4dCAqbmdJZj1cImdldElzUmVxdWlyZWRWYWx1ZSgpXCIgY29sb3I9XCJkYW5nZXJcIj4qPC9pb24tdGV4dD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIGlvbmljU2VsZWN0YWJsZUl0ZW1UZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJlMXRhZy1zdHlsZTVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTVcIj57eyBnZXRJdGVtVGVtcGxhdGUoaXRlbSwgZGF0YSwgZ3JvdXAsIGl0ZW1WYWx1ZUZpZWxkLCBpdGVtVGV4dEZpZWxkKSB9fTwvc3Bhbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9pb25pYy1zZWxlY3RhYmxlPlxyXG4gIDxrZW5kby1jb21ib2JveCAqbmdJZj1cIiFpc01vYmlsZVNjcmVlbigpICYmICFkYXRhLk11bHRpcGxlXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1maWVsZCBlMXRhZy1zdHlsZTFcIlxyXG4gICAgICAgICAgICAgICAgICAjY29tYm9ib3hDb21wb25lbnRcclxuICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiZ2V0SXRlbXNEYXRhKCkgfCB6c2VsZWN0VHJhbnNsYXRpb25QYXJzZXIgOiBpdGVtVGV4dEZpZWxkIDogZGF0YSA6IGdyb3VwIHwgYXN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF09XCJpdGVtVmFsdWVGaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgIFt0ZXh0RmllbGRdPVwiaXRlbVRleHRGaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZGF0YS5WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZVByaW1pdGl2ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImRhdGEuUGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICBbYWxsb3dDdXN0b21dPVwiYWxsb3dDdXN0b21WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtrZW5kb0Ryb3BEb3duRmlsdGVyXT1cImZpbHRlclNldHRpbmdzXCJcclxuICAgICAgICAgICAgICAgICAgW3N1Z2dlc3RdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtmaWx0ZXJhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBbb3Blbk9uRm9jdXNdPVwiZGlzYWJsZU9wZW5PbkZvY3VzKGNvbWJvYm94Q29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJyA6ICghIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KX1cIlxyXG4gICAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJpc0xvYWRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2VfZGVza3RvcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKGZpbHRlckNoYW5nZSk9XCJoYW5kbGVGaWx0ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIFt2aXJ0dWFsXT1cImRhdGEuSXNFbmFibGVWaXJ0dWFsaXphdGlvbiA9PSB0cnVlID8gdmlydHVhbCA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAob3Blbik9XCJoYW5kbGVPcGVuKClcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xvc2UpPVwiaGFuZGxlQ2xvc2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgIChibHVyKT1cImhhbmRsZUJsdXIoKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMVwiPlxyXG4gICAgPG5nLXRlbXBsYXRlIGtlbmRvQ29tYm9Cb3hJdGVtVGVtcGxhdGUgbGV0LWRhdGFJdGVtPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImUxdGFnLXN0eWxlNVwiIFtjbGFzcy56c2VsZWN0LXZpcnR1YWxpemF0aW9uXT1cImRhdGEuSXNFbmFibGVWaXJ0dWFsaXphdGlvblwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlNVwiPnt7IGdldEl0ZW1UZW1wbGF0ZShkYXRhSXRlbSwgZGF0YSwgZ3JvdXAsIGl0ZW1WYWx1ZUZpZWxkLCBpdGVtVGV4dEZpZWxkKSB9fTwvc3Bhbj5cclxuICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cInRlbXBsYXRlXCI+e3sgZGF0YUl0ZW0udmFsdWUgfX08L3NwYW4+IHt7IGRhdGFJdGVtLnRleHQgfX0gLS0+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwva2VuZG8tY29tYm9ib3g+XHJcbiAgPGtlbmRvLW11bHRpc2VsZWN0ICpuZ0lmPVwiIWlzTW9iaWxlU2NyZWVuKCkgJiYgZGF0YS5NdWx0aXBsZSAmJiAhZGF0YS5FbmFibGVDaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1maWVsZCBlMXRhZy1zdHlsZTFcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImdldEl0ZW1zRGF0YSgpIHwgenNlbGVjdFRyYW5zbGF0aW9uUGFyc2VyIDogaXRlbVRleHRGaWVsZCA6IGRhdGEgOiBncm91cCB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF09XCJpdGVtVmFsdWVGaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RleHRGaWVsZF09XCJpdGVtVGV4dEZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZVByaW1pdGl2ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGF0YS5QbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2FsbG93Q3VzdG9tXT1cImFsbG93Q3VzdG9tVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2JveGVzXT1cImRhdGEuRW5hYmxlQ2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImlzTG9hZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F1dG9DbG9zZV09XCJhdXRvQ2xvc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtrZW5kb0Ryb3BEb3duRmlsdGVyXT1cImZpbHRlclNldHRpbmdzXCJcclxuICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJyA6ICghIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZV9kZXNrdG9wKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChmaWx0ZXJDaGFuZ2UpPVwiaGFuZGxlRmlsdGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChvcGVuKT1cImhhbmRsZU9wZW4oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsb3NlKT1cImhhbmRsZUNsb3NlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cImhhbmRsZUJsdXIoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxXCI+XHJcbiAgICA8bmctdGVtcGxhdGUga2VuZG9NdWx0aVNlbGVjdEl0ZW1UZW1wbGF0ZSBsZXQtZGF0YUl0ZW0+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZTF0YWctc3R5bGU1XCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU1XCI+e3sgZ2V0SXRlbVRlbXBsYXRlKGRhdGFJdGVtLCBkYXRhLCBncm91cCwgaXRlbVZhbHVlRmllbGQsIGl0ZW1UZXh0RmllbGQpIH19PC9zcGFuPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2tlbmRvLW11bHRpc2VsZWN0PlxyXG5cclxuICA8a2VuZG8tbXVsdGlzZWxlY3R0cmVlICpuZ0lmPVwiIWlzTW9iaWxlU2NyZWVuKCkgJiYgZGF0YS5NdWx0aXBsZSAmJiBkYXRhLkVuYWJsZUNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWZpZWxkIGUxdGFnLXN0eWxlMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAga2VuZG9NdWx0aVNlbGVjdFRyZWVFeHBhbmRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImRhdGEuUGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtrZW5kb011bHRpU2VsZWN0VHJlZUhpZXJhcmNoeUJpbmRpbmddPVwiZ2V0SXRlbXNEYXRhKCkgfCB6c2VsZWN0VHJhbnNsYXRpb25QYXJzZXIgOiBpdGVtVGV4dEZpZWxkIDogZGF0YSA6IGdyb3VwIHwgYXN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuRmllbGQ9XCJWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2hhc0NoaWxkcmVuXT1cImhhc0NoaWxkcmVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEZpZWxkXT1cIml0ZW1UZXh0RmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZUZpZWxkXT1cIml0ZW1WYWx1ZUZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVQcmltaXRpdmVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uQ2hhbmdlX2Rlc2t0b3AoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFJdGVtc109XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJpc0xvYWRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvQ2xvc2VdPVwiYXV0b0Nsb3NlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZXhwYW5kT25GaWx0ZXJdPVwiZmlsdGVyRXhwYW5kU2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChmaWx0ZXJDaGFuZ2UpPVwiaGFuZGxlTXVsdGlTZWxlY3RUcmVlRmlsdGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQnIDogKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZW4pPVwiaGFuZGxlT3BlbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2UpPVwiaGFuZGxlQ2xvc2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiaGFuZGxlQmx1cigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTFcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9NdWx0aVNlbGVjdFRyZWVOb0RhdGFUZW1wbGF0ZT5cclxuICAgICAgICAgIDxoND5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWljb24gay1pLXdhcm5pbmdcIj48L3NwYW4+PGJyIC8+PGJyIC8+XHJcbiAgICAgICAgICAgIE5vIHJlY29yZCBmb3VuZC5cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9rZW5kby1tdWx0aXNlbGVjdHRyZWU+XHJcbjwvZGl2PlxyXG4iXX0=
466
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienNlbGVjdG11bHRpcGxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21taGdsb2JhbC1keW5hbWljZm9ybS9zcmMvbGliL3pzZWxlY3RtdWx0aXBsZS96c2VsZWN0bXVsdGlwbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenNlbGVjdG11bHRpcGxlL3pzZWxlY3RtdWx0aXBsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFLeEUsOEJBQThCO0FBQzlCLE9BQU8sRUFBNEIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUMsMkNBQTJDO0FBQzNDLE9BQU8sRUFFTyxnQkFBZ0IsRUFDRyxvQkFBb0IsRUFBd0IsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFVeEUsTUFBTSxPQUFPLHdCQUF5QixTQUFRLGNBQWM7SUFnQzFELFlBQ1Usa0JBQXNDLEVBQ3RDLGFBQTRCLEVBQzVCLFlBQTBCLEVBQ2xDLFdBQThCO1FBQzVCLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUpaLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUEvQnBDLFVBQUssR0FBZSxFQUFFLENBQUM7UUFFdkIsa0JBQWEsR0FBZSxFQUFFLENBQUM7UUFDL0IsdUJBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQzFCLDhCQUE4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QUFJLENBQUMsQ0FBQzthQUNoQjtpQkFDSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDbEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFFM0UsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDdkIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3RDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUM7b0JBRTFCLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2pCO2FBQ0Y7WUFFRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNULENBQUM7SUFFTSxRQUFRLENBQUMsSUFBWSxFQUFFLFlBQW9CO1FBQ2hELE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7O3NIQTVnQlUsd0JBQXdCOzBHQUF4Qix3QkFBd0Isc01DMUJyQyxzb1FBb0hBOzRGRDFGYSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UscUJBQXFCO2dNQUtELGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgT25EZXN0cm95IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcbmltcG9ydCB7IElvbmljU2VsZWN0YWJsZUNvbXBvbmVudCB9IGZyb20gXCJpb25pYy1zZWxlY3RhYmxlXCI7XHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IHRhcCwgZGVsYXkgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHtcclxuICBSZXNvdXJjZUFwaVNlcnZpY2UsIFdlYkFwaVNlcnZpY2UsIENhY2hlU2VydmljZSwgQ2xpY2thYmxlSWNvbnMsXHJcbiAgWkNvbXBvbmVudCwgWkNvbXBvbmVudEhlbHBlciwgWkNvbXBvbmVudE91dHB1dEV2ZW50LFxyXG4gIFpTZWxlY3RNdWx0aXBsZVRlbXBsYXRlUGFyYW1zLCBaU2VsZWN0UG9zdEFwaVBhcmFtcywgelNlbGVjdE11bHRpcGxlUGFyYW1zfSBmcm9tIFwibW1oZ2xvYmFsLXpjb3JlXCI7XHJcbmltcG9ydCB7IElucHV0RmllbGRCYXNlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvaW5wdXRmaWVsZGJhc2UuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IFpDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL3pjb21wb25lbnQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBGaWx0ZXJFeHBhbmRTZXR0aW5ncyB9IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci10cmVldmlld1wiO1xyXG5pbXBvcnQgeyBEcm9wRG93bkZpbHRlclNldHRpbmdzIH0gZnJvbSBcIkBwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWRyb3Bkb3duc1wiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiYXBwLXpzZWxlY3RtdWx0aXBsZVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4venNlbGVjdG11bHRpcGxlLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL3pzZWxlY3RtdWx0aXBsZS5jb21wb25lbnQuc2Nzc1wiXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgWnNlbGVjdG11bHRpcGxlQ29tcG9uZW50IGV4dGVuZHMgSW5wdXRGaWVsZEJhc2UgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQFZpZXdDaGlsZChcInNlbGVjdENvbXBvbmVudFwiKSBzZWxlY3RDb21wb25lbnQ6IElvbmljU2VsZWN0YWJsZUNvbXBvbmVudDtcclxuXHJcbiAgaWNvbkxpc3Q6IENsaWNrYWJsZUljb25zW107XHJcbiAgaXRlbXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBtb2RlbHpEYXRhOiBBcnJheTxhbnk+O1xyXG4gIGluZmluaXRlekRhdGE6IEFycmF5PGFueT4gPSBbXTtcclxuICBpbmZpbml0ZVNlYXJjaFRleHQgPSBudWxsO1xyXG4gIC8vIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIHRvZ2dsZVNlbGVjdGFibGUgPSB0cnVlO1xyXG4gIGl0ZW1WYWx1ZUZpZWxkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGl0ZW1UZXh0RmllbGQ6IHN0cmluZyA9IG51bGw7XHJcbiAgaXRlbURhdGFGaWVsZDogc3RyaW5nID0gbnVsbDtcclxuICBpdGVtVGVtcGxhdGUgPSBcInt7aXRlbVtpdGVtVGV4dEZpZWxkXX19XCI7XHJcbiAgaW5maW5pdGVTY3JvbGxQYWdlTm8gPSAwO1xyXG4gIGlzTG9hZGluZyA9IHRydWU7XHJcbiAgcHJpdmF0ZSBkZWJvdW5jZVN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIGFsbG93Q3VzdG9tVmFsdWUgPSBmYWxzZTtcclxuICBhdXRvQ2xvc2U6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBwYXJzZWRJdGVtc0RhdGE6IGFueVtdO1xyXG4gIGRhdGFJbmZvOiB7fSA9IHtcclxuICAgIFwiaXRlbXNSZXNvdXJjZVVSTFwiOiBcIlwiLFxyXG4gICAgXCJvcHRpb25GaWx0ZXJzXCI6IFwiXCIsXHJcbiAgICBcInRvdGFsQ291bnRcIjogMFxyXG4gIH07XHJcblxyXG4gIC8vIHByaXZhdGUgbG9hZEluZmluaXRlRGF0YVN1YjogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgcHVibGljIGZpbHRlclNldHRpbmdzOiBEcm9wRG93bkZpbHRlclNldHRpbmdzID0ge1xyXG4gICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsXHJcbiAgICBvcGVyYXRvcjogXCJjb250YWluc1wiLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZXNvdXJjZUFwaVNlcnZpY2U6IFJlc291cmNlQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgd2ViQXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOiBDYWNoZVNlcnZpY2UsXHJcbiAgICBjb21wU2VydmljZTogWkNvbXBvbmVudFNlcnZpY2VcclxuICApIHsgc3VwZXIoY29tcFNlcnZpY2UpIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAvLyBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgIC8vICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIC8vIH1cclxuICAgIGlmICh0aGlzLmRlYm91bmNlU3ViKSB7XHJcbiAgICAgIHRoaXMuZGVib3VuY2VTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB2aXJ0dWFsOiBhbnkgPSB7XHJcbiAgICBpdGVtSGVpZ2h0OiAyOCxcclxuICAgIHBhZ2VTaXplOiAxNVxyXG4gIH07XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgc3VwZXIuc2V0dXBJbm5lckZpZWxkKCk7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldFNlbGVjdE11bHRpcGxlVGV4dFZhbHVlKHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zLCB0aGlzKTtcclxuXHJcbiAgICAvLyBbRHJvcGRvd25saXN0IE11bHRpcGxlXSAtIGF1dG8gY2xvc2UgbWVudSB3aGVuIGxvc2UgZm9jdXMuXHJcbiAgICBpZiAodGhpcy5kYXRhLkF1dG9DbG9zZSA9PT0gZmFsc2UpIHRoaXMuYXV0b0Nsb3NlID0gdGhpcy5kYXRhLkF1dG9DbG9zZTtcclxuXHJcbiAgICAvLyBIYW5kbGUgQ2xpY2thYmxlIEljb25zXHJcbiAgICB0aGlzLmljb25MaXN0ID0gdGhpcy5kYXRhLkNsaWNrYWJsZUljb25zO1xyXG4gICAgaWYgKHRoaXMuaWNvbkxpc3QpIHtcclxuICAgICAgaWYgKHRoaXMuaWNvbkxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuaWNvbkxpc3QuZm9yRWFjaCgoaTogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoaS5Ub29sdGlwID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaS5Ub29sdGlwID0gXCJcIjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGkuVG9vbHRpcCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCBpLlRvb2x0aXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gRGVmYXVsdCBwb3NpdGlvbiB0b3AuIHJpZ2h0IHwgYm90dG9tIHwgdG9wIHwgbGVmdFxyXG4gICAgICAgICAgaWYgKGkuUG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpLlBvc2l0aW9uID0gXCJ0b3BcIjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5hbGxvd0N1c3RvbVZhbHVlID0gdGhpcy5kYXRhLkFsbG93Q3VzdG9tVmFsdWUgfHwgZmFsc2U7IC8vIEFsbG93IGVudGVyIHRleHQgaW4gZHJvcGRvd25ib3hcclxuICAgIGNvbnN0IGZpZWxkVmFsdWUgPSB0aGlzLmRhdGEuVmFsdWU7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xyXG4gICAgY29uc3Qgek1vZGVsID0gdGhpcy5ncm91cC56TW9kZWw7XHJcblxyXG4gICAgLypcclxuICAgICAqIDQgU3R5bGVzIG9mIGRlY2xhcmUgdGhlIGNvbXBvbmVudO+/vXMgb3B0aW9uIGxpc3QgZGF0YSBzb3VyY2UuXHJcbiAgICAgKiBTdHlsZSAjMSAtIEZpZWxkLlNlbGVjdE9wdGlvbnMgZGVmaW5lZCBhcyBhbiBhcnJheSBvZiBvYmplY3QgdGhhdCBjb250YWluIHRleHQgYW5kIHZhbHVlLlxyXG4gICAgICogU3R5bGUgIzIgLSBGaWVsZC5TZWxlY3RPcHRpb25zIGRlZmluZWQgYXMgYSBwaGFzZSBsaWtlIO+/vWl0ZW0uSWQgYXMgaXRlbS5OYW1lIGZvciBpdGVtIGluIGdyb3VwLnpEYXRhLlByb2plY3RPcHRpb25z77+9LlxyXG4gICAgICogU3R5bGUgIzMgLSBGaWVsZC5PcHRpb25SZXNvdXJjZVVSTCBkZWZpbmVkIHRoZSBuYW1lIG9mIHJlc291cmNlIHNlcnZlciBhcGkuXHJcbiAgICAgKiBTdHlsZSAjNCAtIEZpZWxkLkluZmluaXRlU2Nyb2xsJCBkZWZpbmVkIHRoZSBtZXRob2QgbmFtZSBhcyDvv71ncm91cC5nZXRNb3JlRGF0YUFzU2Nyb2xs77+9LlxyXG4gICAgICovXHJcblxyXG4gICAgaWYgKGRhdGEuSGFzSW5maW5pdGVTY3JvbGwgJiYgZGF0YS5JbmZpbml0ZVNjcm9sbCQpIHtcclxuICAgICAgLy8gd2hlbiBpbmZpbml0aWUgc2Nyb2xsXHJcbiAgICAgIGxldCByZWNvcmRJZCA9IG51bGw7XHJcbiAgICAgIGlmICh6TW9kZWwgJiYgek1vZGVsW2ZpZWxkVmFsdWVdKSB7XHJcbiAgICAgICAgLy8gZ2V0IHpNb2RlbCBWYWx1ZVxyXG4gICAgICAgIHJlY29yZElkID0gek1vZGVsW2ZpZWxkVmFsdWVdLnRvU3RyaW5nKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBnZXR6RGF0YUZvcnpNb2RlbCQ6IE9ic2VydmFibGU8YW55PiA9IFpDb21wb25lbnRIZWxwZXIuZ2V0SW5maW5pdGVEYXRhKG51bGwsICcnLCB0aGlzLCByZWNvcmRJZCk7XHJcbiAgICAgIGlmIChnZXR6RGF0YUZvcnpNb2RlbCQpIHtcclxuICAgICAgICBnZXR6RGF0YUZvcnpNb2RlbCQuc3Vic2NyaWJlKCh6ZGF0YSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coZGF0YS5OYW1lLCAnIC0gaW5pdGlhbCB6RGF0YSBsb2FkOiAnLCB6ZGF0YSk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnModGhpcy5ncm91cCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghWkNvbXBvbmVudEhlbHBlci5pc01vYmlsZVNjcmVlbigpKSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVGaWx0ZXIobnVsbCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBTdHlsZSAjMSwgIzIsICMzXHJcbiAgICAgIGNvbnN0IGlzUmVxdWlyZWQgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgZGF0YS5Jc1JlcXVpcmVkKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRhdGEuT3B0aW9uUmVzb3VyY2VVUkwpIHtcclxuICAgICAgICB0aGlzLmxhenlMb2FkRGF0YU9wdGlvbnMoKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgIGNvbnN0IG9wdGlvbkRhdGEgPSByZXMuZGF0YVNldCA/IHJlcy5kYXRhU2V0IDogcmVzO1xyXG5cclxuICAgICAgICAgIGlmIChvcHRpb25EYXRhICYmIG9wdGlvbkRhdGEubGVuZ3RoID09PSAxICYmICF0aGlzLmRhdGEuRGlzYWJsZUF1dG9GaXJzdFNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmF1dG9TZWxlY3RGaXJzdE9wdGlvbihpc1JlcXVpcmVkLCBvcHRpb25EYXRhWzBdLCBmaWVsZFZhbHVlLCB6TW9kZWwuSWQpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwLmFmdGVyTG9hZHpEYXRhT3B0aW9ucykge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKHRoaXMuZ3JvdXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucykgJiYgdGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMpIHtcclxuICAgICAgICAgIC8vc2tpcCBldmFsIGlmIHNlbGVjdG9wdGlvbnMgaXMgZXhpc3RcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBvcHRpb25EYXRhID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIHRoaXMuaXRlbURhdGFGaWVsZCk7XHJcbiAgICAgICAgICAvLyBhcHBlbmQgZGF0YSB2aWEgdGltZW91dCBhZnRlciBkYXRhIGlzIGxvYWRlZC5cclxuICAgICAgICAgIGlmIChvcHRpb25EYXRhICYmIG9wdGlvbkRhdGEubGVuZ3RoID09PSAxICYmICF0aGlzLmRhdGEuRGlzYWJsZUF1dG9GaXJzdFNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICBjb25zdCB0aGlzQ29tcG9uZW50ID0gdGhpcztcclxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgdGhpc0NvbXBvbmVudC5hdXRvU2VsZWN0Rmlyc3RPcHRpb24oaXNSZXF1aXJlZCwgb3B0aW9uRGF0YVswXSwgZmllbGRWYWx1ZSwgdGhpc0NvbXBvbmVudC5ncm91cC56TW9kZWwuSWQpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAodGhpcy5ncm91cCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKHRoaXMuZ3JvdXApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQXV0byBzZWxlY3QgZmlyc3Qgb3B0aW9uIChpZiByZXF1aXJlZCAmIG9ubHkgMSBvcHRpb24pXHJcbiAgcHJpdmF0ZSBhdXRvU2VsZWN0Rmlyc3RPcHRpb24ocmVxdWlyZWQ6IGJvb2xlYW4sIGRhdGE6IGFueSwgek1vZGVsUHJvcGVydHlOYW1lOiBzdHJpbmcsIGlkOiBhbnkpIHtcclxuICAgIGlmIChaQ29tcG9uZW50SGVscGVyLmlzTnVsbFVuZGVmaW5lZEVtcHR5KGlkKSAmJiByZXF1aXJlZCkge1xyXG4gICAgICB2YXIgb3B0aW9uSWQgPSBkYXRhLklkO1xyXG4gICAgICBpZiAodGhpcy5kYXRhLk11bHRpcGxlKSB7XHJcbiAgICAgICAgb3B0aW9uSWQgPSBbb3B0aW9uSWRdO1xyXG4gICAgICB9XHJcbiAgICAgIFpDb21wb25lbnRIZWxwZXIuc2V0TW9kZWxWYWx1ZSh6TW9kZWxQcm9wZXJ0eU5hbWUsIG9wdGlvbklkLCB0aGlzLmdyb3VwKTtcclxuXHJcbiAgICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgICB0eXBlOiBcIm9uQ2hhbmdlXCIsXHJcbiAgICAgICAgdGFyZ2V0OiB0aGlzLmRhdGEuT25DaGFuZ2UsXHJcbiAgICAgICAgZXZlbnQsXHJcbiAgICAgICAgZGF0YTogeyBbJ3ZhbHVlJ106IG9wdGlvbklkLCBmaWVsZDogdGhpcy5kYXRhIH1cclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG5cclxuICAgICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBTdHlsZSAjM1xyXG4gIGxhenlMb2FkRGF0YU9wdGlvbnMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IHJlc291cmNlVXJsID0gdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UuZ2V0VVJMKFxyXG4gICAgICB0aGlzLmRhdGEuT3B0aW9uUmVzb3VyY2VVUkxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgZmlsdGVyUGFyYW0gPSBuZXcgWlNlbGVjdFBvc3RBcGlQYXJhbXMoKTtcclxuICAgIGZpbHRlclBhcmFtLnNvcnRzID0gdGhpcy5kYXRhLk9wdGlvblNvcnQ7XHJcbiAgICBmaWx0ZXJQYXJhbS5jb2x1bW5zID0gdGhpcy5kYXRhLk9wdGlvbkNvbHVtbnM7XHJcbiAgICBmaWx0ZXJQYXJhbS5maWx0ZXJzID0gdGhpcy5kYXRhLk9wdGlvbkZpbHRlcjtcclxuXHJcbiAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5nZXREYXRhT3B0aW9ucyhcclxuICAgICAgdGhpcy5kYXRhLk9wdGlvbk5hbWUsXHJcbiAgICAgIGZpbHRlclBhcmFtLFxyXG4gICAgICB0aGlzLmdyb3VwLFxyXG4gICAgICByZXNvdXJjZVVybCxcclxuICAgICAgdGhpcy5jYWNoZVNlcnZpY2UsXHJcbiAgICAgIHRoaXMud2ViQXBpU2VydmljZSxcclxuICAgICAgdGhpcy5kYXRhWydEaXNhYmxlQ2FjaGUnXVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIFN0eWxlICM0LCB1c2VkIGluIGlvbmljLXNlbGVjdGFibGVcclxuICBnZXRJbmZpbml0ZURhdGEoZXZlbnQ6IHtcclxuICAgIGNvbXBvbmVudDogSW9uaWNTZWxlY3RhYmxlQ29tcG9uZW50O1xyXG4gICAgdGV4dDogc3RyaW5nO1xyXG4gIH0pIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuZ2V0SW5maW5pdGVEYXRhKGV2ZW50LmNvbXBvbmVudCwgZXZlbnQudGV4dCwgdGhpcyk7XHJcbiAgfVxyXG5cclxuICBnZXRJdGVtc0RhdGEoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLkhhc0luZmluaXRlU2Nyb2xsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluZmluaXRlekRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb3B0aW9uTmFtZSA9IHRoaXMuZGF0YS5PcHRpb25OYW1lIHx8IHRoaXMuaXRlbURhdGFGaWVsZCB8fCAnZ3JvdXAuekRhdGEuJyArIHRoaXMuZGF0YS5OYW1lO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMpICYmICF0aGlzLmdyb3VwLnpEYXRhW29wdGlvbk5hbWUuc2xpY2UoMTIpXSkge1xyXG4gICAgICAvLyByZXR1cm4gc2VsZWN0aW9uT3B0aW9ucztcclxuICAgICAgLy8gcmV0dXJuIHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zO1xyXG4gICAgICB0aGlzLmdyb3VwLnpEYXRhW29wdGlvbk5hbWUuc2xpY2UoMTIpXSA9IHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zO1xyXG4gICAgICB0aGlzLml0ZW1EYXRhRmllbGQgPSBvcHRpb25OYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcHRpb25OYW1lLnN0YXJ0c1dpdGgoJ3pEYXRhLicpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwLnpEYXRhW29wdGlvbk5hbWUuc2xpY2UoNildIHx8IFtdO1xyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbk5hbWUuc3RhcnRzV2l0aCgnZ3JvdXAuekRhdGEuJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ3JvdXAuekRhdGFbb3B0aW9uTmFtZS5zbGljZSgxMildIHx8IFtdO1xyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbk5hbWUuc3RhcnRzV2l0aCgnZ3JvdXAuJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBbb3B0aW9uTmFtZS5zbGljZSg2KV0gfHwgW107XHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9uTmFtZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5ncm91cFtvcHRpb25OYW1lXSB8fCBbXTtcclxuICAgIH1cclxuICAgIGNvbnNvbGUud2Fybih0aGlzLmRhdGEuTmFtZSwgJyAtIEludmFsaWQgc2V0dGluZyBmb3IgT3B0aW9uTmFtZTogJywgb3B0aW9uTmFtZSk7XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaChldmVudDogeyBjb21wb25lbnQ6IElvbmljU2VsZWN0YWJsZUNvbXBvbmVudDsgdGV4dDogc3RyaW5nIH0pIHtcclxuICAgIC8vIGNvbnNvbGUubG9nKFwiQXQgenNlbGVjdG11bHRpcGxlLmNvbXBvbmVudCAob25TZWFyY2gpOiBcIiwgZXZlbnQpO1xyXG4gICAgLy8gZXZlbnQuY29tcG9uZW50IGlzIGZvciBtb2JpbGUgb25seVxyXG4gICAgY29uc3QgY29tcG9uZW50ID0gZXZlbnQuY29tcG9uZW50O1xyXG4gICAgaWYgKGNvbXBvbmVudCkge1xyXG4gICAgICBjb21wb25lbnQuc3RhcnRTZWFyY2goKTtcclxuICAgICAgY29tcG9uZW50LmVuYWJsZUluZmluaXRlU2Nyb2xsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCkge1xyXG4gICAgICAvLyBJZiBzZWFyY2ggdGV4dCwgcmVzZXQgcGFnZSB0byAwLiBHZXQgaW5maW5pdGUgZGF0YVxyXG4gICAgICBpZiAoZXZlbnQudGV4dCAhPT0gbnVsbCAmJiBldmVudC50ZXh0ICE9PSB0aGlzLmluZmluaXRlU2VhcmNoVGV4dCkge1xyXG4gICAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGxQYWdlTm8gPSAwO1xyXG4gICAgICAgIHRoaXMubW9kZWx6RGF0YSA9IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ2V0SW5maW5pdGVEYXRhKGV2ZW50KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBSZXNldCBzY3JvbGwgcGFnZSwgZW1wdHkgaXRlbXNcclxuICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbFBhZ2VObyA9IDA7XHJcbiAgICAgIGlmIChjb21wb25lbnQpIHtcclxuICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBbXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gRmlsdGVyIHpEYXRhIGFuZCBwdXNoIHRvIGl0ZW1zXHJcbiAgICAgIGNvbnN0IHBhcmFtczogelNlbGVjdE11bHRpcGxlUGFyYW1zID0ge1xyXG4gICAgICAgIHJlZmVySWQ6IG51bGwsXHJcbiAgICAgICAgcGFnZU5vOiAwLFxyXG4gICAgICAgIHBhZ2VTaXplOiAyMCxcclxuICAgICAgICBzb3J0Q29sdW1uTmFtZTogXCJcIixcclxuICAgICAgICBzb3J0T3JkZXI6IFwiXCIsXHJcbiAgICAgICAgc29ydENvbHVtbk5hbWVzOiBbXSxcclxuICAgICAgICBzb3J0T3JkZXJzOiBbXSxcclxuICAgICAgICBmaWx0ZXJQYXJhbXM6IFtdLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFwiXCJcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHNlYXJjaEZpZWxkcyA9IHRoaXMuZGF0YS5TZWFyY2hGaWVsZHMgPyB0aGlzLmRhdGEuU2VhcmNoRmllbGRzIDogdGhpcy5pdGVtVGV4dEZpZWxkO1xyXG4gICAgICBjb25zdCBmaWx0ZXJpdGVtcyA9IFpDb21wb25lbnRIZWxwZXIuZmlsdGVyU2VhcmNoSXRlbXMoXHJcbiAgICAgICAgdGhpcy5nZXRJdGVtc0RhdGEoKSxcclxuICAgICAgICBldmVudC50ZXh0LFxyXG4gICAgICAgIHNlYXJjaEZpZWxkcyxcclxuICAgICAgICBwYXJhbXMucGFnZU5vLFxyXG4gICAgICAgIHBhcmFtcy5wYWdlU2l6ZVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoY29tcG9uZW50KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSBjb21wb25lbnQuaXRlbXMuY29uY2F0KGZpbHRlcml0ZW1zKTtcclxuICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcclxuICAgICAgICBjb21wb25lbnQuZW5kSW5maW5pdGVTY3JvbGwoKTtcclxuICAgICAgICBjb21wb25lbnQuZW5kU2VhcmNoKCk7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlTGF6eUxvYWRGaWx0ZXIodmFsdWU6IGFueSwganVzdE9uZVRpbWU/OiBib29sZWFuKSB7XHJcbiAgICBkZWJ1Z2dlcjtcclxuICAgIGlmICh0aGlzLmRlYm91bmNlU3ViKSB7XHJcbiAgICAgIHRoaXMuZGVib3VuY2VTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRlYm91bmNlU3ViID0gb2YoW10pLnBpcGUoZGVsYXkoNTAwKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICB0aGlzLm9uU2VhcmNoKHsgY29tcG9uZW50OiBudWxsLCB0ZXh0OiB2YWx1ZSB9KTtcclxuICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgICBpZiAodGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnMpIHtcclxuICAgICAgICAgIHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKHRoaXMuZ3JvdXApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUZpbHRlcih2YWx1ZTogYW55LCBqdXN0T25lVGltZT86IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLmRlYm91bmNlU3ViKSB7XHJcbiAgICAgIHRoaXMuZGVib3VuY2VTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBza2lwIGZpbHRlcmluZyBpZiBoYXZlIGluaWZpbml0ZXNjcm9sbD9cclxuICAgIC8vIFRvIHJlc29sdmUgYnVnICMxOTc5XHJcbiAgICAvLyBpZiAoIXRoaXMuZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCkge1xyXG4gICAgdGhpcy5kZWJvdW5jZVN1YiA9IG9mKFtdKVxyXG4gICAgICAucGlwZSh0YXAoKCkgPT4gKHRoaXMuaXNMb2FkaW5nID0gdHJ1ZSkpLCBkZWxheSg1MDApKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLm9uU2VhcmNoKHsgY29tcG9uZW50OiBudWxsLCB0ZXh0OiB2YWx1ZSB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgICAgIGlmICh0aGlzLmdyb3VwLmFmdGVyTG9hZHpEYXRhT3B0aW9ucykge1xyXG4gICAgICAgICAgICB0aGlzLmdyb3VwLmFmdGVyTG9hZHpEYXRhT3B0aW9ucyh0aGlzLmdyb3VwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLy8gaWYgKHRoaXMubG9hZEluZmluaXRlRGF0YVN1Yikge1xyXG4gICAgLy8gICB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIC8vIH1cclxuICAgIC8vIHRoaXMubG9hZEluZmluaXRlRGF0YVN1YiA9IG5ldyBTdWJqZWN0KGZhbHNlKTtcclxuICAgIC8vIHRoaXMuaGFuZGxlRmlsdGVyKG51bGwpO1xyXG4gICAgLy8gaW50ZXJ2YWwoMjAwMCkucGlwZSh0YWtlVW50aWwodGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgIC8vICAgdGhpcy5vblNlYXJjaCh7IGNvbXBvbmVudDogbnVsbCwgdGV4dDogdmFsdWUgfSk7XHJcbiAgICAvLyAgIGlmIChqdXN0T25lVGltZSkge1xyXG4gICAgLy8gICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVPcGVuKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCkge1xyXG4gICAgICB0aGlzLmhhbmRsZUZpbHRlcihudWxsKTtcclxuICAgICAgLy8gICAvLyBpZiAodGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViKSB7XHJcbiAgICAgIC8vICAgLy8gICB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgLy8gICAvLyB9XHJcbiAgICAgIC8vICAgLy8gdGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViID0gbmV3IFN1YmplY3QoKTtcclxuICAgICAgLy8gICAvLyAvLyB0aGlzLmhhbmRsZUZpbHRlcihudWxsKTtcclxuICAgICAgLy8gICAvLyBpbnRlcnZhbCgzMDAwKS5waXBlKHRha2VVbnRpbCh0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAvLyAgIC8vIHRoaXMuaGFuZGxlRmlsdGVyKG51bGwpO1xyXG4gICAgICAvLyAgIC8vIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2xvc2UoKSB7XHJcbiAgICAvLyBpZiAodGhpcy5kYXRhLkhhc0luZmluaXRlU2Nyb2xsKSB7XHJcbiAgICAvLyAgIGlmICh0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIpIHtcclxuICAgIC8vICAgICB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIubmV4dCh0cnVlKTtcclxuICAgIC8vICAgICAvLyB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIuY29tcGxldGUoKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlQmx1cigpIHtcclxuICAgIC8vIHRoaXMuaGFuZGxlQ2xvc2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJdGVtVGVtcGxhdGUoXHJcbiAgICBpdGVtOiBhbnksXHJcbiAgICBkYXRhOiBhbnksXHJcbiAgICBncm91cDogYW55LFxyXG4gICAgaXRlbVZhbHVlRmllbGQ6IHN0cmluZyxcclxuICAgIGl0ZW1UZXh0RmllbGQ6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgLy8gVG9ETzogaXRlbVZhbHVlRmllbGQgYW5kIGl0ZW1UZXh0RmllbGRcclxuICAgIGlmICh0aGlzLmRhdGEuSXRlbVRlbXBsYXRlKSB7XHJcbiAgICAgIGNvbnN0IGdldFRlbXBsYXRlRnVuYyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuSXRlbVRlbXBsYXRlKTtcclxuXHJcbiAgICAgIHJldHVybiBnZXRUZW1wbGF0ZUZ1bmMoe1xyXG4gICAgICAgIGl0ZW0sXHJcbiAgICAgICAgZGF0YSxcclxuICAgICAgICBncm91cCxcclxuICAgICAgICBpdGVtVmFsdWVGaWVsZCxcclxuICAgICAgICBpdGVtVGV4dEZpZWxkXHJcbiAgICAgIH0gYXMgWlNlbGVjdE11bHRpcGxlVGVtcGxhdGVQYXJhbXMpO1xyXG4gICAgfSBlbHNlIGlmIChpdGVtVGV4dEZpZWxkKSB7XHJcbiAgICAgIHJldHVybiBpdGVtW2l0ZW1UZXh0RmllbGRdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gcmV0dXJuIGl0ZW1baXRlbVRleHRGaWVsZF07XHJcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGl0ZW0pLmpvaW4oXCIsIFwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQWRkSXRlbShldmVudDogYW55KSB7XHJcbiAgICBjb25zdCBmID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIHRoaXMuZGF0YS5PbkFkZEl0ZW0pO1xyXG4gICAgaWYgKHR5cGVvZiBmID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IGNhbGxGdW5jID0gZi5iaW5kKHRoaXMuZ3JvdXAuY3RybFNjb3BlKTtcclxuICAgICAgcmV0dXJuIGNhbGxGdW5jKCk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgZGVjbGFyYXRpb24gb2YgT25BZGRJdGVtOiAnLCBmKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIC8vIENvbXBvbmVudCBiYXNpYyBmdW5jdGlvblxyXG4gIGNsZWFyRGF0YSgpIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0TW9kZWxWYWx1ZSh0aGlzLmRhdGEuVmFsdWUsIFwiXCIsIHRoaXMuZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJJdGVtcygpIHtcclxuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LmNsZWFyKCk7XHJcbiAgICB0aGlzLnNlbGVjdENvbXBvbmVudC5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgY29uZmlybUl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQuY29uZmlybSgpO1xyXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQudG9nZ2xlSXRlbXModGhpcy50b2dnbGVTZWxlY3RhYmxlKTtcclxuICAgIHRoaXMudG9nZ2xlU2VsZWN0YWJsZSA9ICF0aGlzLnRvZ2dsZVNlbGVjdGFibGU7XHJcblxyXG4gICAgLy8gQ29uZmlybSBpdGVtcyBhbmQgY2xvc2UgU2VsZWN0IHBhZ2VcclxuICAgIC8vIHdpdGhvdXQgaGF2aW5nIHRoZSB1c2VyIHRvIGNsaWNrIENvbmZpcm0gYnV0dG9uLlxyXG4gICAgLy8gdGhpcy5jb25maXJtKCk7XHJcbiAgfVxyXG5cclxuICAvLyBEaXNhYmxlIE9wZW4gT24gRm9jdXNcclxuICBkaXNhYmxlT3Blbk9uRm9jdXMoY29tYm9ib3hDb21wb25lbnQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5EaXNhYmxlT3Blbk9uRm9jdXMpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIGNvbWJvYm94Q29tcG9uZW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gT25DaGFuZ2VcclxuICBwdWJsaWMgb25DaGFuZ2VfZGVza3RvcChldmVudDogYW55KSB7XHJcbiAgICBzdXBlci5vbkNoYW5nZShudWxsLCBldmVudClcclxuICAgIHRoaXMuaGFuZGxlSW5maW5pdGVTY3JvbGxPbkNoYW5nZShldmVudCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DaGFuZ2VfbW9iaWxlKGV2ZW50OiB7IGNvbXBvbmVudDogSW9uaWNTZWxlY3RhYmxlQ29tcG9uZW50OyB2YWx1ZTogYW55IH0pIHtcclxuICAgIHN1cGVyLm9uQ2hhbmdlKGV2ZW50KVxyXG4gICAgY29uc3QgZmMgPSB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy5kYXRhLlZhbHVlXTtcclxuICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHN1cGVyLmdldElzUmVxdWlyZWRWYWx1ZSgpICYmIChldmVudC52YWx1ZSA9PT0gbnVsbCB8fCBldmVudC52YWx1ZS5sZW5ndGggPT09IDApXHJcbiAgICApIHtcclxuICAgICAgZmMuc2V0RXJyb3JzKHsgcmVxdWlyZWQ6IHRydWUgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmYy5zZXRFcnJvcnMobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oYW5kbGVJbmZpbml0ZVNjcm9sbE9uQ2hhbmdlKGV2ZW50LnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlSW5maW5pdGVTY3JvbGxPbkNoYW5nZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLkhhc0luZmluaXRlU2Nyb2xsICYmICEhdGhpcy5kYXRhLkluZmluaXRlU2Nyb2xsJCkge1xyXG4gICAgICBjb25zdCB0ZXh0RmllbGQgPSB0aGlzLml0ZW1UZXh0RmllbGQudG9TdHJpbmcoKTtcclxuICAgICAgY29uc3QgdmFsdWVGaWVsZCA9IHRoaXMuaXRlbVZhbHVlRmllbGQudG9TdHJpbmcoKTtcclxuICAgICAgbGV0IHpkYXRhTW9kZWwgPSBbXTtcclxuICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgemRhdGFNb2RlbCA9IHRoaXMuaW5maW5pdGV6RGF0YS5maWx0ZXIoeCA9PiB4W3ZhbHVlRmllbGRdID09PSB2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5tb2RlbHpEYXRhID0gemRhdGFNb2RlbC5zbGljZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLml0ZW1EYXRhRmllbGQuc3RhcnRzV2l0aCgnZ3JvdXAuekRhdGEuJykpIHtcclxuICAgICAgICB0aGlzLmdyb3VwLnpEYXRhW3RoaXMuaXRlbURhdGFGaWVsZC5zbGljZSgxMildID0gemRhdGFNb2RlbDtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLml0ZW1EYXRhRmllbGQuc3RhcnRzV2l0aCgnZ3JvdXAuJykpIHtcclxuICAgICAgICB0aGlzLmdyb3VwW3RoaXMuaXRlbURhdGFGaWVsZC5zbGljZSg2KV0gPSB6ZGF0YU1vZGVsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBNdWx0aSBTZWxlY3Rpb24gVHJlZVxyXG4gIHB1YmxpYyBnZXQgZmlsdGVyRXhwYW5kU2V0dGluZ3MoKTogRmlsdGVyRXhwYW5kU2V0dGluZ3Mge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZXhwYW5kTWF0Y2hlczogdHJ1ZSxcclxuICAgICAgZXhwYW5kZWRPbkNsZWFyOiBcImluaXRpYWxcIlxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhc0NoaWxkcmVuID0gKGRhdGFpdGVtOiBhbnkpOiBib29sZWFuID0+ICEhZGF0YWl0ZW1bJ2l0ZW1zJ107XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVNdWx0aVNlbGVjdFRyZWVGaWx0ZXIodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5wYXJzZWRJdGVtc0RhdGEgPSB0aGlzLm9uTXVsdGlTZWxlY3RUcmVlU2VhcmNoKHRoaXMuZ2V0SXRlbXNEYXRhKCksIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk11bHRpU2VsZWN0VHJlZVNlYXJjaChpdGVtczogYW55W10sIHNlYXJjaGVkVGV4dDogc3RyaW5nKTogYW55W10ge1xyXG4gICAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmNvbnRhaW5zKGl0ZW1bdGhpcy5pdGVtVGV4dEZpZWxkXSwgc2VhcmNoZWRUZXh0KSkge1xyXG4gICAgICAgIGFjYy5wdXNoKGl0ZW0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGl0ZW1bJ2l0ZW1zJ10gJiYgaXRlbVsnaXRlbXMnXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSB0aGlzLm9uTXVsdGlTZWxlY3RUcmVlU2VhcmNoKGl0ZW1bJ2l0ZW1zJ10sIHNlYXJjaGVkVGV4dCk7XHJcblxyXG4gICAgICAgIGlmIChuZXdJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBfaXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0pO1xyXG4gICAgICAgICAgX2l0ZW1bJ2l0ZW1zJ10gPSBuZXdJdGVtcztcclxuXHJcbiAgICAgICAgICBhY2MucHVzaChfaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gYWNjO1xyXG4gICAgfSwgW10pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvbnRhaW5zKHRleHQ6IHN0cmluZywgc2VhcmNoZWRUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoKHNlYXJjaGVkVGV4dCB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cInpzZWxlY3RtdWx0aXBsZS1jb250YWluZXIgZTF0YWctc3R5bGVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZVwiPlxyXG4gIDxpb25pYy1zZWxlY3RhYmxlICpuZ0lmPVwiaXNNb2JpbGVTY3JlZW4oKVwiICNzZWxlY3RDb21wb25lbnQgaXRlbS1jb250ZW50IHNlYXJjaEZhaWxUZXh0PVwiTm90aGluZyBmb3VuZCA6KFwiXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyQ29sb3I9XCJwcmltYXJ5XCIgY2xlYXJCdXR0b25UZXh0PVwiQ2xlYXJcIiBbKG5nTW9kZWwpXT1cImdyb3VwLnpNb2RlbFtkYXRhLlZhbHVlXVwiIFtpZF09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiZ2V0SXRlbXNEYXRhKClcIiBbaXRlbVZhbHVlRmllbGRdPVwiaXRlbVZhbHVlRmllbGRcIiBbaXRlbVRleHRGaWVsZF09XCJpdGVtVGV4dEZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2FuQWRkSXRlbV09XCIhIWRhdGEuT25BZGRJdGVtXCIgW2NhbkNsZWFyXT1cInRydWVcIiBbcGxhY2Vob2xkZXJdPVwiZGF0YS5QbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NhblNlYXJjaF09XCIhZGF0YVsnZGlzYWJsZS1zZWFyY2gnXVwiIFtzaG91bGRGb2N1c1NlYXJjaGJhcl09XCIhZGF0YVsnZGlzYWJsZS1zZWFyY2gnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2hhc0luZmluaXRlU2Nyb2xsXT1cIiEhZGF0YS5IYXNJbmZpbml0ZVNjcm9sbFwiIFtpc011bHRpcGxlXT1cImRhdGEuTXVsdGlwbGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpc0VuYWJsZWRdPVwiISghIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3VsZFN0b3JlSXRlbVZhbHVlXT1cInRydWVcIiAob25TZWFyY2gpPVwib25TZWFyY2goJGV2ZW50KVwiIChvbkluZmluaXRlU2Nyb2xsKT1cImdldEluZmluaXRlRGF0YSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAob25BZGRJdGVtKT1cIm9uQWRkSXRlbSgkZXZlbnQpXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlX21vYmlsZSgkZXZlbnQpXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxXCIgY2xhc3M9XCJlMXRhZy1zdHlsZTFcIj5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgaW9uaWNTZWxlY3RhYmxlSXRlbUljb25UZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtaXNJdGVtU2VsZWN0ZWQ9XCJpc0l0ZW1TZWxlY3RlZFwiPlxyXG4gICAgICA8ZmEtaWNvbiBzbG90PVwic3RhcnRcIiBjbGFzcz1cImlzSXRlbVNlbGVjdGVkIGUxdGFnLXN0eWxlMlwiIHNpemU9XCJzbVwiIFtpY29uXT1cIlsnZmFyJywgaXNJdGVtU2VsZWN0ZWQgPyAnY2hlY2stY2lyY2xlJzogJ2NpcmNsZSddXCJcclxuICAgICAgICAgICAgICAgW3N0eWxlc109XCJ7J2NvbG9yJzogaXNJdGVtU2VsZWN0ZWQgPyAnZG9kZ2VyQmx1ZScgOiAnbGlnaHRHcmF5J31cIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTJcIj48L2ZhLWljb24+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBpb25pY1NlbGVjdGFibGVDbG9zZUJ1dHRvblRlbXBsYXRlPlxyXG4gICAgICA8IS0tIDxpb24taWNvbiBuYW1lPVwiY2xvc2UtY2lyY2xlXCI+PC9pb24taWNvbj4gLS0+XHJcbiAgICAgIDxmYS1pY29uIFtpY29uXT1cIid0aW1lcy1jaXJjbGUnXCIgc2l6ZT1cIm1kXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUzXCIgY2xhc3M9XCJlMXRhZy1zdHlsZTNcIj48L2ZhLWljb24+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBpb25pY1NlbGVjdGFibGVUaXRsZVRlbXBsYXRlPlxyXG4gICAgICA8c3BhbiBjbGFzcz1lMXRhZy1zdHlsZTQgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU0XCI+e3tkYXRhLkxhYmVsfX08L3NwYW4+XHJcbiAgICAgIDxpb24tdGV4dCAqbmdJZj1cImdldElzUmVxdWlyZWRWYWx1ZSgpXCIgY29sb3I9XCJkYW5nZXJcIj4qPC9pb24tdGV4dD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIGlvbmljU2VsZWN0YWJsZUl0ZW1UZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJlMXRhZy1zdHlsZTVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTVcIj57eyBnZXRJdGVtVGVtcGxhdGUoaXRlbSwgZGF0YSwgZ3JvdXAsIGl0ZW1WYWx1ZUZpZWxkLCBpdGVtVGV4dEZpZWxkKSB9fTwvc3Bhbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9pb25pYy1zZWxlY3RhYmxlPlxyXG4gIDxrZW5kby1jb21ib2JveCAqbmdJZj1cIiFpc01vYmlsZVNjcmVlbigpICYmICFkYXRhLk11bHRpcGxlXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1maWVsZCBlMXRhZy1zdHlsZTFcIlxyXG4gICAgICAgICAgICAgICAgICAjY29tYm9ib3hDb21wb25lbnRcclxuICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiZ2V0SXRlbXNEYXRhKCkgfCB6c2VsZWN0VHJhbnNsYXRpb25QYXJzZXIgOiBpdGVtVGV4dEZpZWxkIDogZGF0YSA6IGdyb3VwIHwgYXN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF09XCJpdGVtVmFsdWVGaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgIFt0ZXh0RmllbGRdPVwiaXRlbVRleHRGaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZGF0YS5WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZVByaW1pdGl2ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImRhdGEuUGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICBbYWxsb3dDdXN0b21dPVwiYWxsb3dDdXN0b21WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtrZW5kb0Ryb3BEb3duRmlsdGVyXT1cImZpbHRlclNldHRpbmdzXCJcclxuICAgICAgICAgICAgICAgICAgW3N1Z2dlc3RdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtmaWx0ZXJhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBbb3Blbk9uRm9jdXNdPVwiZGlzYWJsZU9wZW5PbkZvY3VzKGNvbWJvYm94Q29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJyA6ICghIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KX1cIlxyXG4gICAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJpc0xvYWRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2VfZGVza3RvcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKGZpbHRlckNoYW5nZSk9XCJoYW5kbGVGaWx0ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIFt2aXJ0dWFsXT1cImRhdGEuSXNFbmFibGVWaXJ0dWFsaXphdGlvbiA9PSB0cnVlID8gdmlydHVhbCA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAob3Blbik9XCJoYW5kbGVPcGVuKClcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xvc2UpPVwiaGFuZGxlQ2xvc2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgIChibHVyKT1cImhhbmRsZUJsdXIoKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMVwiPlxyXG4gICAgPG5nLXRlbXBsYXRlIGtlbmRvQ29tYm9Cb3hJdGVtVGVtcGxhdGUgbGV0LWRhdGFJdGVtPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImUxdGFnLXN0eWxlNVwiIFtjbGFzcy56c2VsZWN0LXZpcnR1YWxpemF0aW9uXT1cImRhdGEuSXNFbmFibGVWaXJ0dWFsaXphdGlvblwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlNVwiPnt7IGdldEl0ZW1UZW1wbGF0ZShkYXRhSXRlbSwgZGF0YSwgZ3JvdXAsIGl0ZW1WYWx1ZUZpZWxkLCBpdGVtVGV4dEZpZWxkKSB9fTwvc3Bhbj5cclxuICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cInRlbXBsYXRlXCI+e3sgZGF0YUl0ZW0udmFsdWUgfX08L3NwYW4+IHt7IGRhdGFJdGVtLnRleHQgfX0gLS0+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwva2VuZG8tY29tYm9ib3g+XHJcbiAgPGtlbmRvLW11bHRpc2VsZWN0ICpuZ0lmPVwiIWlzTW9iaWxlU2NyZWVuKCkgJiYgZGF0YS5NdWx0aXBsZSAmJiAhZGF0YS5FbmFibGVDaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZmllbGQgZTF0YWctc3R5bGUxXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiZ2V0SXRlbXNEYXRhKCkgfCB6c2VsZWN0VHJhbnNsYXRpb25QYXJzZXIgOiBpdGVtVGV4dEZpZWxkIDogZGF0YSA6IGdyb3VwIHwgYXN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF09XCJpdGVtVmFsdWVGaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFt0ZXh0RmllbGRdPVwiaXRlbVRleHRGaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZGF0YS5WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVByaW1pdGl2ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImRhdGEuUGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbYWxsb3dDdXN0b21dPVwiYWxsb3dDdXN0b21WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbY2hlY2tib3hlc109XCJkYXRhLkVuYWJsZUNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2F1dG9DbG9zZV09XCJhdXRvQ2xvc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICBba2VuZG9Ecm9wRG93bkZpbHRlcl09XCJmaWx0ZXJTZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJyA6ICghIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2VfZGVza3RvcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgKGZpbHRlckNoYW5nZSk9XCJoYW5kbGVGaWx0ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChvcGVuKT1cImhhbmRsZU9wZW4oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChjbG9zZSk9XCJoYW5kbGVDbG9zZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiaGFuZGxlQmx1cigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxXCI+XHJcbiAgICA8bmctdGVtcGxhdGUga2VuZG9NdWx0aVNlbGVjdEl0ZW1UZW1wbGF0ZSBsZXQtZGF0YUl0ZW0+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZTF0YWctc3R5bGU1XCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU1XCI+e3sgZ2V0SXRlbVRlbXBsYXRlKGRhdGFJdGVtLCBkYXRhLCBncm91cCwgaXRlbVZhbHVlRmllbGQsIGl0ZW1UZXh0RmllbGQpIH19PC9zcGFuPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2tlbmRvLW11bHRpc2VsZWN0PlxyXG4gIDxrZW5kby1tdWx0aXNlbGVjdHRyZWUgKm5nSWY9XCIhaXNNb2JpbGVTY3JlZW4oKSAmJiBkYXRhLk11bHRpcGxlICYmIGRhdGEuRW5hYmxlQ2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1maWVsZCBlMXRhZy1zdHlsZTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAga2VuZG9NdWx0aVNlbGVjdFRyZWVFeHBhbmRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGF0YS5QbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBba2VuZG9NdWx0aVNlbGVjdFRyZWVIaWVyYXJjaHlCaW5kaW5nXT1cImdldEl0ZW1zRGF0YSgpIHwgenNlbGVjdFRyYW5zbGF0aW9uUGFyc2VyIDogaXRlbVRleHRGaWVsZCA6IGRhdGEgOiBncm91cCB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuRmllbGQ9XCJWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaGFzQ2hpbGRyZW5dPVwiaGFzQ2hpbGRyZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGaWVsZF09XCJpdGVtVGV4dEZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZUZpZWxkXT1cIml0ZW1WYWx1ZUZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVByaW1pdGl2ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZV9kZXNrdG9wKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFJdGVtc109XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImlzTG9hZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Nsb3NlXT1cImF1dG9DbG9zZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZXhwYW5kT25GaWx0ZXJdPVwiZmlsdGVyRXhwYW5kU2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcmFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsdGVyQ2hhbmdlKT1cImhhbmRsZU11bHRpU2VsZWN0VHJlZUZpbHRlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlZCcgOiAoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSl9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuKT1cImhhbmRsZU9wZW4oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2UpPVwiaGFuZGxlQ2xvc2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJoYW5kbGVCbHVyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxXCI+XHJcbiAgICA8bmctdGVtcGxhdGUga2VuZG9NdWx0aVNlbGVjdFRyZWVOb0RhdGFUZW1wbGF0ZT5cclxuICAgICAgPGg0PlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS13YXJuaW5nXCI+PC9zcGFuPjxiciAvPjxiciAvPlxyXG4gICAgICAgIE5vIHJlY29yZCBmb3VuZC5cclxuICAgICAgPC9oND5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9rZW5kby1tdWx0aXNlbGVjdHRyZWU+XHJcbjwvZGl2PlxyXG4iXX0=