mmhglobal-dynamicform 2.9.2 → 2.9.3
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 +4 -1
- package/esm2020/lib/components/containerfieldbase.component.mjs +14 -1
- package/esm2020/lib/ksplitter/ksplitter.component.mjs +25 -0
- package/esm2020/lib/mmhglobal-dynamicform.module.mjs +15 -5
- package/esm2020/lib/services/main.service.mjs +6 -14
- package/esm2020/lib/sfquerybuilder/sfquerybuilder.component.mjs +1 -1
- package/esm2020/lib/uiheader/uiheader.component.mjs +22 -6
- package/esm2020/lib/zdiv/zdiv.component.mjs +3 -3
- package/esm2020/lib/zform/zform.component.mjs +2 -2
- package/esm2020/lib/zloop/zloop.component.mjs +117 -0
- package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +26 -4
- package/esm2020/lib/ztree/ztree.component.mjs +3 -3
- package/esm2020/lib/ztreelist/ztreelist.component.mjs +4 -3
- package/esm2020/public-api.mjs +3 -1
- package/fesm2015/mmhglobal-dynamicform.mjs +206 -33
- package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
- package/fesm2020/mmhglobal-dynamicform.mjs +206 -33
- package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
- package/lib/components/containerfieldbase.component.d.ts +2 -0
- package/lib/ksplitter/ksplitter.component.d.ts +11 -0
- package/lib/mmhglobal-dynamicform.module.d.ts +38 -36
- package/lib/services/main.service.d.ts +0 -1
- package/lib/uiheader/uiheader.component.d.ts +4 -2
- package/lib/zloop/zloop.component.d.ts +23 -0
- package/lib/zselectmultiple/zselectmultiple.component.d.ts +5 -2
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
|
@@ -5,7 +5,7 @@ import { of } from "rxjs";
|
|
|
5
5
|
import { tap, delay } from "rxjs/operators";
|
|
6
6
|
/********** Component & Service **********/
|
|
7
7
|
import { InputFieldBase } from "../components/inputfieldbase.component";
|
|
8
|
-
import { ZComponentHelper, ZSelectPostApiParams } from "mmhglobal-zcore";
|
|
8
|
+
import { ZComponentHelper, ZSelectPostApiParams, InternalComponentType_DropDown } from "mmhglobal-zcore";
|
|
9
9
|
import * as i0 from "@angular/core";
|
|
10
10
|
import * as i1 from "../services/zcomponent.service";
|
|
11
11
|
import * as i2 from "mmhglobal-zcore";
|
|
@@ -57,6 +57,7 @@ export class ZselectmultipleComponent extends InputFieldBase {
|
|
|
57
57
|
}
|
|
58
58
|
ngOnInit() {
|
|
59
59
|
this.isLoading = true;
|
|
60
|
+
this.setComponentToUse();
|
|
60
61
|
super.setupInnerField();
|
|
61
62
|
ZComponentHelper.setSelectMultipleTextValue(this.data.SelectOptions, this);
|
|
62
63
|
// [Dropdownlist Multiple] - auto close menu when lose focus.
|
|
@@ -481,17 +482,38 @@ export class ZselectmultipleComponent extends InputFieldBase {
|
|
|
481
482
|
this.multiselecttree.focus();
|
|
482
483
|
return true;
|
|
483
484
|
}
|
|
485
|
+
if (this.dropdownlistComponent) {
|
|
486
|
+
this.dropdownlistComponent.focus();
|
|
487
|
+
return true;
|
|
488
|
+
}
|
|
484
489
|
return false;
|
|
485
490
|
}
|
|
491
|
+
setComponentToUse() {
|
|
492
|
+
if (this.data.InternalComponentType && Object.values(InternalComponentType_DropDown).includes(this.data.InternalComponentType)) {
|
|
493
|
+
this.componentType = this.data.InternalComponentType;
|
|
494
|
+
}
|
|
495
|
+
else if (!this.data.Multiple) {
|
|
496
|
+
this.componentType = InternalComponentType_DropDown.combobox;
|
|
497
|
+
}
|
|
498
|
+
else if (this.data.Multiple && !this.data.EnableCheckbox) {
|
|
499
|
+
this.componentType = InternalComponentType_DropDown.multiselect;
|
|
500
|
+
}
|
|
501
|
+
else if (this.data.Multiple && this.data.EnableCheckbox) {
|
|
502
|
+
this.componentType = InternalComponentType_DropDown.multiselecttree;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
486
505
|
}
|
|
487
506
|
ZselectmultipleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ZselectmultipleComponent, deps: [{ token: i1.ZComponentService }, { token: i2.ResourceApiService }, { token: i2.WebApiService }, { token: i2.CacheService }, { token: i2.FieldService }], target: i0.ɵɵFactoryTarget.Component });
|
|
488
|
-
ZselectmultipleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ZselectmultipleComponent, selector: "app-zselectmultiple", viewQueries: [{ propertyName: "comboboxComponent", first: true, predicate: ["comboboxComponent"], descendants: true }, { propertyName: "multiselect", first: true, predicate: ["multiselect"], descendants: true }, { propertyName: "multiselecttree", first: true, predicate: ["multiselecttree"], descendants: true }, { 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 #multiselect\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 #multiselecttree\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 } });
|
|
507
|
+
ZselectmultipleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ZselectmultipleComponent, selector: "app-zselectmultiple", viewQueries: [{ propertyName: "comboboxComponent", first: true, predicate: ["comboboxComponent"], descendants: true }, { propertyName: "dropdownlistComponent", first: true, predicate: ["dropdownlistComponent"], descendants: true }, { propertyName: "multiselect", first: true, predicate: ["multiselect"], descendants: true }, { propertyName: "multiselecttree", first: true, predicate: ["multiselecttree"], descendants: true }, { 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() && componentType == 'combobox'\"\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]=\"data.Filterable == false ? false : true\"\r\n [openOnFocus]=\"disableOpenOnFocus(comboboxComponent)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"data.Class\"\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 [clearButton]=\"data.ClearButton == false ? false : true\">\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() && componentType == 'multiselect'\"\r\n class=\"input-field e1tag-style1\"\r\n #multiselect\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]=\"data.Filterable == false ? false : 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 [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"data.Class\"\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 [clearButton]=\"data.ClearButton == false ? false : true\">\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() && componentType == 'multiselecttree'\"\r\n class=\"input-field e1tag-style1\"\r\n #multiselecttree\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]=\"data.Filterable == false ? false : true\"\r\n (filterChange)=\"handleMultiSelectTreeFilter($event)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"data.Class\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n [style]=\"componentProperties.style.style1\"\r\n [clearButton]=\"data.ClearButton == false ? false : true\">\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 <kendo-dropdownlist *ngIf=\"!isMobileScreen() && componentType == 'dropdownlist'\"\r\n class=\"input-field e1tag-style1\"\r\n #dropdownlistComponent\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]=\"data.Filterable == false ? false : true\"\r\n [openOnFocus]=\"disableOpenOnFocus(comboboxComponent)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"data.Class\"\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 [clearButton]=\"data.ClearButton == false ? false : true\">\r\n <ng-template kendoDropDownListItemTemplate 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-dropdownlist>\r\n</div>\r\n", styles: [":host ::ng-deep kendo-combobox.k-multiselect,:host ::ng-deep kendo-dropdownlist.k-multiselect,:host ::ng-deep kendo-multiselect.k-multiselect{height:auto}:host ::ng-deep kendo-combobox .k-searchbar,:host ::ng-deep kendo-dropdownlist .k-searchbar,:host ::ng-deep kendo-multiselect .k-searchbar{margin:auto}:host ::ng-deep kendo-combobox .k-searchbar+.k-icon,:host ::ng-deep kendo-dropdownlist .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-dropdownlist .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-dropdownlist.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-dropdownlist:focus-within,:host ::ng-deep kendo-multiselect:focus-within{box-shadow:0 0 3px 1px var(--ion-color-primary)}:host ::ng-deep kendo-combobox.no-border,:host ::ng-deep kendo-dropdownlist.no-border,:host ::ng-deep kendo-multiselect.no-border{box-shadow:none!important;border:none!important}:host ::ng-deep kendo-combobox.no-border>.k-input-button,:host ::ng-deep kendo-dropdownlist.no-border>.k-input-button,:host ::ng-deep kendo-multiselect.no-border>.k-input-button{background:none;border:none}:host ::ng-deep kendo-combobox.no-background,:host ::ng-deep kendo-dropdownlist.no-background,:host ::ng-deep kendo-multiselect.no-background{background:none}:host ::ng-deep kendo-combobox.right-align>kendo-searchbar>input,:host ::ng-deep kendo-dropdownlist.right-align>kendo-searchbar>input,:host ::ng-deep kendo-multiselect.right-align>kendo-searchbar>input{text-align:right}:host ::ng-deep kendo-combobox.right-align>.k-input-inner,:host ::ng-deep kendo-dropdownlist.right-align>.k-input-inner,:host ::ng-deep kendo-multiselect.right-align>.k-input-inner{text-align:right}:host ::ng-deep kendo-dropdownlist{background:white}:host ::ng-deep kendo-dropdownlist>span.k-input-inner>.k-input-value-text{width:0px}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"] }, { type: i6.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["iconClass", "loading", "data", "value", "textField", "valueField", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }], 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 } });
|
|
489
508
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ZselectmultipleComponent, decorators: [{
|
|
490
509
|
type: Component,
|
|
491
|
-
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 #multiselect\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 #multiselecttree\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"] }]
|
|
510
|
+
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() && componentType == 'combobox'\"\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]=\"data.Filterable == false ? false : true\"\r\n [openOnFocus]=\"disableOpenOnFocus(comboboxComponent)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"data.Class\"\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 [clearButton]=\"data.ClearButton == false ? false : true\">\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() && componentType == 'multiselect'\"\r\n class=\"input-field e1tag-style1\"\r\n #multiselect\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]=\"data.Filterable == false ? false : 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 [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"data.Class\"\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 [clearButton]=\"data.ClearButton == false ? false : true\">\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() && componentType == 'multiselecttree'\"\r\n class=\"input-field e1tag-style1\"\r\n #multiselecttree\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]=\"data.Filterable == false ? false : true\"\r\n (filterChange)=\"handleMultiSelectTreeFilter($event)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"data.Class\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n [style]=\"componentProperties.style.style1\"\r\n [clearButton]=\"data.ClearButton == false ? false : true\">\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 <kendo-dropdownlist *ngIf=\"!isMobileScreen() && componentType == 'dropdownlist'\"\r\n class=\"input-field e1tag-style1\"\r\n #dropdownlistComponent\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]=\"data.Filterable == false ? false : true\"\r\n [openOnFocus]=\"disableOpenOnFocus(comboboxComponent)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"data.Class\"\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 [clearButton]=\"data.ClearButton == false ? false : true\">\r\n <ng-template kendoDropDownListItemTemplate 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-dropdownlist>\r\n</div>\r\n", styles: [":host ::ng-deep kendo-combobox.k-multiselect,:host ::ng-deep kendo-dropdownlist.k-multiselect,:host ::ng-deep kendo-multiselect.k-multiselect{height:auto}:host ::ng-deep kendo-combobox .k-searchbar,:host ::ng-deep kendo-dropdownlist .k-searchbar,:host ::ng-deep kendo-multiselect .k-searchbar{margin:auto}:host ::ng-deep kendo-combobox .k-searchbar+.k-icon,:host ::ng-deep kendo-dropdownlist .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-dropdownlist .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-dropdownlist.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-dropdownlist:focus-within,:host ::ng-deep kendo-multiselect:focus-within{box-shadow:0 0 3px 1px var(--ion-color-primary)}:host ::ng-deep kendo-combobox.no-border,:host ::ng-deep kendo-dropdownlist.no-border,:host ::ng-deep kendo-multiselect.no-border{box-shadow:none!important;border:none!important}:host ::ng-deep kendo-combobox.no-border>.k-input-button,:host ::ng-deep kendo-dropdownlist.no-border>.k-input-button,:host ::ng-deep kendo-multiselect.no-border>.k-input-button{background:none;border:none}:host ::ng-deep kendo-combobox.no-background,:host ::ng-deep kendo-dropdownlist.no-background,:host ::ng-deep kendo-multiselect.no-background{background:none}:host ::ng-deep kendo-combobox.right-align>kendo-searchbar>input,:host ::ng-deep kendo-dropdownlist.right-align>kendo-searchbar>input,:host ::ng-deep kendo-multiselect.right-align>kendo-searchbar>input{text-align:right}:host ::ng-deep kendo-combobox.right-align>.k-input-inner,:host ::ng-deep kendo-dropdownlist.right-align>.k-input-inner,:host ::ng-deep kendo-multiselect.right-align>.k-input-inner{text-align:right}:host ::ng-deep kendo-dropdownlist{background:white}:host ::ng-deep kendo-dropdownlist>span.k-input-inner>.k-input-value-text{width:0px}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"] }]
|
|
492
511
|
}], ctorParameters: function () { return [{ type: i1.ZComponentService }, { type: i2.ResourceApiService }, { type: i2.WebApiService }, { type: i2.CacheService }, { type: i2.FieldService }]; }, propDecorators: { comboboxComponent: [{
|
|
493
512
|
type: ViewChild,
|
|
494
513
|
args: ["comboboxComponent"]
|
|
514
|
+
}], dropdownlistComponent: [{
|
|
515
|
+
type: ViewChild,
|
|
516
|
+
args: ["dropdownlistComponent"]
|
|
495
517
|
}], multiselect: [{
|
|
496
518
|
type: ViewChild,
|
|
497
519
|
args: ["multiselect"]
|
|
@@ -502,4 +524,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
502
524
|
type: ViewChild,
|
|
503
525
|
args: ["selectComponent"]
|
|
504
526
|
}] } });
|
|
505
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienNlbGVjdG11bHRpcGxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21taGdsb2JhbC1keW5hbWljZm9ybS9zcmMvbGliL3pzZWxlY3RtdWx0aXBsZS96c2VsZWN0bXVsdGlwbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenNlbGVjdG11bHRpcGxlL3pzZWxlY3RtdWx0aXBsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFLeEUsOEJBQThCO0FBQzlCLE9BQU8sRUFBNEIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJNUMsMkNBQTJDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV4RSxPQUFPLEVBRU8sZ0JBQWdCLEVBQ0csb0JBQW9CLEVBQ3BELE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFTekIsTUFBTSxPQUFPLHdCQUF5QixTQUFRLGNBQWM7SUFtQzFELFlBQ1MsZ0JBQW1DLEVBQ2xDLGtCQUFzQyxFQUN0QyxhQUE0QixFQUM1QixZQUEwQixFQUMxQixZQUEwQjtRQUVsQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQU5oQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQW1CO1FBQ2xDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFqQ3BDLFVBQUssR0FBZSxF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XG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBPbkRlc3Ryb3kgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuaW1wb3J0IHsgSW9uaWNTZWxlY3RhYmxlQ29tcG9uZW50IH0gZnJvbSBcImlvbmljLXNlbGVjdGFibGVcIjtcclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIE9ic2VydmFibGUsIG9mIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgdGFwLCBkZWxheSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBGaWx0ZXJFeHBhbmRTZXR0aW5ncyB9IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci10cmVldmlld1wiO1xyXG5pbXBvcnQgeyBDb21ib0JveENvbXBvbmVudCwgRHJvcERvd25GaWx0ZXJTZXR0aW5ncywgTXVsdGlTZWxlY3RDb21wb25lbnQsIE11bHRpU2VsZWN0VHJlZUNvbXBvbmVudCB9IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1kcm9wZG93bnNcIjtcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHsgSW5wdXRGaWVsZEJhc2UgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9pbnB1dGZpZWxkYmFzZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7XHJcbiAgUmVzb3VyY2VBcGlTZXJ2aWNlLCBXZWJBcGlTZXJ2aWNlLCBDYWNoZVNlcnZpY2UsIEZpZWxkU2VydmljZSwgXHJcbiAgWkNvbXBvbmVudCwgWkNvbXBvbmVudEhlbHBlciwgWkNvbXBvbmVudE91dHB1dEV2ZW50LCBDbGlja2FibGVJY29ucyxcclxuICBaU2VsZWN0TXVsdGlwbGVUZW1wbGF0ZVBhcmFtcywgWlNlbGVjdFBvc3RBcGlQYXJhbXMsIHpTZWxlY3RNdWx0aXBsZVBhcmFtc1xyXG59IGZyb20gXCJtbWhnbG9iYWwtemNvcmVcIjtcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtenNlbGVjdG11bHRpcGxlXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi96c2VsZWN0bXVsdGlwbGUuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4venNlbGVjdG11bHRpcGxlLmNvbXBvbmVudC5zY3NzXCJdXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgWnNlbGVjdG11bHRpcGxlQ29tcG9uZW50IGV4dGVuZHMgSW5wdXRGaWVsZEJhc2UgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQFZpZXdDaGlsZChcImNvbWJvYm94Q29tcG9uZW50XCIpIGNvbWJvYm94Q29tcG9uZW50OiBDb21ib0JveENvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKFwibXVsdGlzZWxlY3RcIikgbXVsdGlzZWxlY3Q6IE11bHRpU2VsZWN0Q29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoXCJtdWx0aXNlbGVjdHRyZWVcIikgbXVsdGlzZWxlY3R0cmVlOiBNdWx0aVNlbGVjdFRyZWVDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcInNlbGVjdENvbXBvbmVudFwiKSBzZWxlY3RDb21wb25lbnQ6IElvbmljU2VsZWN0YWJsZUNvbXBvbmVudDtcclxuXHJcbiAgaWNvbkxpc3Q6IENsaWNrYWJsZUljb25zW107XHJcbiAgaXRlbXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBtb2RlbHpEYXRhOiBBcnJheTxhbnk+O1xyXG4gIGluZmluaXRlekRhdGE6IEFycmF5PGFueT4gPSBbXTtcclxuICBpbmZpbml0ZVNlYXJjaFRleHQgPSBudWxsO1xyXG4gIC8vIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIHRvZ2dsZVNlbGVjdGFibGUgPSB0cnVlO1xyXG4gIGl0ZW1WYWx1ZUZpZWxkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGl0ZW1UZXh0RmllbGQ6IHN0cmluZyA9IG51bGw7XHJcbiAgaXRlbURhdGFGaWVsZDogc3RyaW5nID0gbnVsbDtcclxuICBpdGVtVGVtcGxhdGUgPSBcInt7aXRlbVtpdGVtVGV4dEZpZWxkXX19XCI7XHJcbiAgaW5maW5pdGVTY3JvbGxQYWdlTm8gPSAwO1xyXG4gIGlzTG9hZGluZyA9IHRydWU7XHJcbiAgYWxsb3dDdXN0b21WYWx1ZSA9IGZhbHNlO1xyXG4gIGF1dG9DbG9zZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIHBhcnNlZEl0ZW1zRGF0YTogYW55W107XHJcbiAgZGF0YUluZm86IHt9ID0ge1xyXG4gICAgXCJpdGVtc1Jlc291cmNlVVJMXCI6IFwiXCIsXHJcbiAgICBcIm9wdGlvbkZpbHRlcnNcIjogXCJcIixcclxuICAgIFwidG90YWxDb3VudFwiOiAwXHJcbiAgfTtcclxuICBwcml2YXRlIGRlYm91bmNlU3ViOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIC8vIHByaXZhdGUgbG9hZEluZmluaXRlRGF0YVN1YjogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgcHVibGljIGZpbHRlclNldHRpbmdzOiBEcm9wRG93bkZpbHRlclNldHRpbmdzID0ge1xyXG4gICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsXHJcbiAgICBvcGVyYXRvcjogXCJjb250YWluc1wiLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGNvbXBvbmVudFNlcnZpY2U6IFpDb21wb25lbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZXNvdXJjZUFwaVNlcnZpY2U6IFJlc291cmNlQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgd2ViQXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOiBDYWNoZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZpZWxkU2VydmljZTogRmllbGRTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihjb21wb25lbnRTZXJ2aWNlKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHZpcnR1YWw6IGFueSA9IHtcclxuICAgIGl0ZW1IZWlnaHQ6IDI4LFxyXG4gICAgcGFnZVNpemU6IDE1XHJcbiAgfTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICBzdXBlci5zZXR1cElubmVyRmllbGQoKTtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0U2VsZWN0TXVsdGlwbGVUZXh0VmFsdWUodGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMsIHRoaXMpO1xyXG5cclxuICAgIC8vIFtEcm9wZG93bmxpc3QgTXVsdGlwbGVdIC0gYXV0byBjbG9zZSBtZW51IHdoZW4gbG9zZSBmb2N1cy5cclxuICAgIGlmICh0aGlzLmRhdGEuQXV0b0Nsb3NlID09PSBmYWxzZSkgdGhpcy5hdXRvQ2xvc2UgPSB0aGlzLmRhdGEuQXV0b0Nsb3NlO1xyXG5cclxuICAgIC8vIEhhbmRsZSBDbGlja2FibGUgSWNvbnNcclxuICAgIHRoaXMuaWNvbkxpc3QgPSB0aGlzLmRhdGEuQ2xpY2thYmxlSWNvbnM7XHJcbiAgICBpZiAodGhpcy5pY29uTGlzdCkge1xyXG4gICAgICBpZiAodGhpcy5pY29uTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5pY29uTGlzdC5mb3JFYWNoKChpOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChpLlRvb2x0aXAgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpLlRvb2x0aXAgPSBcIlwiO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaS5Ub29sdGlwID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIGkuVG9vbHRpcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBEZWZhdWx0IHBvc2l0aW9uIHRvcC4gcmlnaHQgfCBib3R0b20gfCB0b3AgfCBsZWZ0XHJcbiAgICAgICAgICBpZiAoaS5Qb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGkuUG9zaXRpb24gPSBcInRvcFwiO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmFsbG93Q3VzdG9tVmFsdWUgPSB0aGlzLmRhdGEuQWxsb3dDdXN0b21WYWx1ZSB8fCBmYWxzZTsgLy8gQWxsb3cgZW50ZXIgdGV4dCBpbiBkcm9wZG93bmJveFxyXG4gICAgY29uc3QgZmllbGRWYWx1ZSA9IHRoaXMuZGF0YS5WYWx1ZTtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XHJcbiAgICBjb25zdCB6TW9kZWwgPSB0aGlzLmdyb3VwLnpNb2RlbDtcclxuXHJcbiAgICAvKlxyXG4gICAgICogNCBTdHlsZXMgb2YgZGVjbGFyZSB0aGUgY29tcG9uZW5077+9cyBvcHRpb24gbGlzdCBkYXRhIHNvdXJjZS5cclxuICAgICAqIFN0eWxlICMxIC0gRmllbGQuU2VsZWN0T3B0aW9ucyBkZWZpbmVkIGFzIGFuIGFycmF5IG9mIG9iamVjdCB0aGF0IGNvbnRhaW4gdGV4dCBhbmQgdmFsdWUuXHJcbiAgICAgKiBTdHlsZSAjMiAtIEZpZWxkLlNlbGVjdE9wdGlvbnMgZGVmaW5lZCBhcyBhIHBoYXNlIGxpa2Ug77+9aXRlbS5JZCBhcyBpdGVtLk5hbWUgZm9yIGl0ZW0gaW4gZ3JvdXAuekRhdGEuUHJvamVjdE9wdGlvbnPvv70uXHJcbiAgICAgKiBTdHlsZSAjMyAtIEZpZWxkLk9wdGlvblJlc291cmNlVVJMIGRlZmluZWQgdGhlIG5hbWUgb2YgcmVzb3VyY2Ugc2VydmVyIGFwaS5cclxuICAgICAqIFN0eWxlICM0IC0gRmllbGQuSW5maW5pdGVTY3JvbGwkIGRlZmluZWQgdGhlIG1ldGhvZCBuYW1lIGFzIO+/vWdyb3VwLmdldE1vcmVEYXRhQXNTY3JvbGzvv70uXHJcbiAgICAgKi9cclxuXHJcbiAgICBpZiAoZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCAmJiBkYXRhLkluZmluaXRlU2Nyb2xsJCkge1xyXG4gICAgICAvLyB3aGVuIGluZmluaXRpZSBzY3JvbGxcclxuICAgICAgbGV0IHJlY29yZElkID0gbnVsbDtcclxuICAgICAgaWYgKHpNb2RlbCAmJiB6TW9kZWxbZmllbGRWYWx1ZV0pIHtcclxuICAgICAgICAvLyBnZXQgek1vZGVsIFZhbHVlXHJcbiAgICAgICAgcmVjb3JkSWQgPSB6TW9kZWxbZmllbGRWYWx1ZV0udG9TdHJpbmcoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGdldHpEYXRhRm9yek1vZGVsJDogT2JzZXJ2YWJsZTxhbnk+ID0gWkNvbXBvbmVudEhlbHBlci5nZXRJbmZpbml0ZURhdGEobnVsbCwgJycsIHRoaXMsIHJlY29yZElkKTtcclxuICAgICAgaWYgKGdldHpEYXRhRm9yek1vZGVsJCkge1xyXG4gICAgICAgIGdldHpEYXRhRm9yek1vZGVsJC5zdWJzY3JpYmUoKHpkYXRhKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhLk5hbWUsICcgLSBpbml0aWFsIHpEYXRhIGxvYWQ6ICcsIHpkYXRhKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5ncm91cCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICB0aGlzLmdyb3VwLmFmdGVyTG9hZHpEYXRhT3B0aW9ucyh0aGlzLmdyb3VwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFaQ29tcG9uZW50SGVscGVyLmlzTW9iaWxlU2NyZWVuKCkpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZUZpbHRlcihudWxsLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIFN0eWxlICMxLCAjMiwgIzNcclxuICAgICAgY29uc3QgaXNSZXF1aXJlZCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCBkYXRhLklzUmVxdWlyZWQpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGF0YS5PcHRpb25SZXNvdXJjZVVSTCkge1xyXG4gICAgICAgIHRoaXMubGF6eUxvYWREYXRhT3B0aW9ucygpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgb3B0aW9uRGF0YSA9IHJlcy5kYXRhU2V0ID8gcmVzLmRhdGFTZXQgOiByZXM7XHJcblxyXG4gICAgICAgICAgaWYgKG9wdGlvbkRhdGEgJiYgb3B0aW9uRGF0YS5sZW5ndGggPT09IDEgJiYgIXRoaXMuZGF0YS5EaXNhYmxlQXV0b0ZpcnN0U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0b1NlbGVjdEZpcnN0T3B0aW9uKGlzUmVxdWlyZWQsIG9wdGlvbkRhdGFbMF0sIGZpZWxkVmFsdWUsIHpNb2RlbC5JZCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnModGhpcy5ncm91cCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zKSAmJiB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucykge1xyXG4gICAgICAgICAgLy9za2lwIGV2YWwgaWYgc2VsZWN0b3B0aW9ucyBpcyBleGlzdFxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG9wdGlvbkRhdGEgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgdGhpcy5pdGVtRGF0YUZpZWxkKTtcclxuICAgICAgICAgIC8vIGFwcGVuZCBkYXRhIHZpYSB0aW1lb3V0IGFmdGVyIGRhdGEgaXMgbG9hZGVkLlxyXG4gICAgICAgICAgaWYgKG9wdGlvbkRhdGEgJiYgb3B0aW9uRGF0YS5sZW5ndGggPT09IDEgJiYgIXRoaXMuZGF0YS5EaXNhYmxlQXV0b0ZpcnN0U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoaXNDb21wb25lbnQgPSB0aGlzO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICB0aGlzQ29tcG9uZW50LmF1dG9TZWxlY3RGaXJzdE9wdGlvbihpc1JlcXVpcmVkLCBvcHRpb25EYXRhWzBdLCBmaWVsZFZhbHVlLCB0aGlzQ29tcG9uZW50Lmdyb3VwLnpNb2RlbC5JZCk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnModGhpcy5ncm91cCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBzdXBlci5mb2N1c09uRGVmYXVsdCh0aGlzLmZvY3VzLmJpbmQodGhpcykpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLmRlY3JlbWVudENvbXBvbmVudENvdW50ZXJGb3JGaWVsZCh0aGlzLmRhdGEpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAvLyBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgIC8vICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIC8vIH1cclxuICAgIGlmICh0aGlzLmRlYm91bmNlU3ViKSB7XHJcbiAgICAgIHRoaXMuZGVib3VuY2VTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEF1dG8gc2VsZWN0IGZpcnN0IG9wdGlvbiAoaWYgcmVxdWlyZWQgJiBvbmx5IDEgb3B0aW9uKVxyXG4gIHByaXZhdGUgYXV0b1NlbGVjdEZpcnN0T3B0aW9uKHJlcXVpcmVkOiBib29sZWFuLCBkYXRhOiBhbnksIHpNb2RlbFByb3BlcnR5TmFtZTogc3RyaW5nLCBpZDogYW55KSB7XHJcbiAgICBpZiAoWkNvbXBvbmVudEhlbHBlci5pc051bGxVbmRlZmluZWRFbXB0eShpZCkgJiYgcmVxdWlyZWQpIHtcclxuICAgICAgdmFyIG9wdGlvbklkID0gZGF0YS5JZDtcclxuICAgICAgaWYgKHRoaXMuZGF0YS5NdWx0aXBsZSkge1xyXG4gICAgICAgIG9wdGlvbklkID0gW29wdGlvbklkXTtcclxuICAgICAgfVxyXG4gICAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUoek1vZGVsUHJvcGVydHlOYW1lLCBvcHRpb25JZCwgdGhpcy5ncm91cCk7XHJcblxyXG4gICAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgICAgdHlwZTogXCJvbkNoYW5nZVwiLFxyXG4gICAgICAgIHRhcmdldDogdGhpcy5kYXRhLk9uQ2hhbmdlLFxyXG4gICAgICAgIGV2ZW50LFxyXG4gICAgICAgIGRhdGE6IHsgWyd2YWx1ZSddOiBvcHRpb25JZCwgZmllbGQ6IHRoaXMuZGF0YSB9XHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gU3R5bGUgIzNcclxuICBsYXp5TG9hZERhdGFPcHRpb25zKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCByZXNvdXJjZVVybCA9IHRoaXMucmVzb3VyY2VBcGlTZXJ2aWNlLmdldFVSTChcclxuICAgICAgdGhpcy5kYXRhLk9wdGlvblJlc291cmNlVVJMXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlclBhcmFtID0gbmV3IFpTZWxlY3RQb3N0QXBpUGFyYW1zKCk7XHJcbiAgICBmaWx0ZXJQYXJhbS5zb3J0cyA9IHRoaXMuZGF0YS5PcHRpb25Tb3J0O1xyXG4gICAgZmlsdGVyUGFyYW0uY29sdW1ucyA9IHRoaXMuZGF0YS5PcHRpb25Db2x1bW5zO1xyXG4gICAgZmlsdGVyUGFyYW0uZmlsdGVycyA9IHRoaXMuZGF0YS5PcHRpb25GaWx0ZXI7XHJcblxyXG4gICAgcmV0dXJuIFpDb21wb25lbnRIZWxwZXIuZ2V0RGF0YU9wdGlvbnMoXHJcbiAgICAgIHRoaXMuZGF0YS5PcHRpb25OYW1lLFxyXG4gICAgICBmaWx0ZXJQYXJhbSxcclxuICAgICAgdGhpcy5ncm91cCxcclxuICAgICAgcmVzb3VyY2VVcmwsXHJcbiAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLFxyXG4gICAgICB0aGlzLndlYkFwaVNlcnZpY2UsXHJcbiAgICAgIHRoaXMuZGF0YVsnRGlzYWJsZUNhY2hlJ11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBTdHlsZSAjNCwgdXNlZCBpbiBpb25pYy1zZWxlY3RhYmxlXHJcbiAgZ2V0SW5maW5pdGVEYXRhKGV2ZW50OiB7XHJcbiAgICBjb21wb25lbnQ6IElvbmljU2VsZWN0YWJsZUNvbXBvbmVudDtcclxuICAgIHRleHQ6IHN0cmluZztcclxuICB9KSB7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLmdldEluZmluaXRlRGF0YShldmVudC5jb21wb25lbnQsIGV2ZW50LnRleHQsIHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbXNEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbmZpbml0ZXpEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG9wdGlvbk5hbWUgPSB0aGlzLmRhdGEuT3B0aW9uTmFtZSB8fCB0aGlzLml0ZW1EYXRhRmllbGQgfHwgJ2dyb3VwLnpEYXRhLicgKyB0aGlzLmRhdGEuTmFtZTtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zKSAmJiAhdGhpcy5ncm91cC56RGF0YVtvcHRpb25OYW1lLnNsaWNlKDEyKV0pIHtcclxuICAgICAgLy8gcmV0dXJuIHNlbGVjdGlvbk9wdGlvbnM7XHJcbiAgICAgIC8vIHJldHVybiB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucztcclxuICAgICAgdGhpcy5ncm91cC56RGF0YVtvcHRpb25OYW1lLnNsaWNlKDEyKV0gPSB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucztcclxuICAgICAgdGhpcy5pdGVtRGF0YUZpZWxkID0gb3B0aW9uTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0aW9uTmFtZS5zdGFydHNXaXRoKCd6RGF0YS4nKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5ncm91cC56RGF0YVtvcHRpb25OYW1lLnNsaWNlKDYpXSB8fCBbXTtcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25OYW1lLnN0YXJ0c1dpdGgoJ2dyb3VwLnpEYXRhLicpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwLnpEYXRhW29wdGlvbk5hbWUuc2xpY2UoMTIpXSB8fCBbXTtcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25OYW1lLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwW29wdGlvbk5hbWUuc2xpY2UoNildIHx8IFtdO1xyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbk5hbWUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBbb3B0aW9uTmFtZV0gfHwgW107XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLndhcm4odGhpcy5kYXRhLk5hbWUsICcgLSBJbnZhbGlkIHNldHRpbmcgZm9yIE9wdGlvbk5hbWU6ICcsIG9wdGlvbk5hbWUpO1xyXG4gIH1cclxuXHJcbiAgb25TZWFyY2goZXZlbnQ6IHsgY29tcG9uZW50OiBJb25pY1NlbGVjdGFibGVDb21wb25lbnQ7IHRleHQ6IHN0cmluZyB9KSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcIkF0IHpzZWxlY3RtdWx0aXBsZS5jb21wb25lbnQgKG9uU2VhcmNoKTogXCIsIGV2ZW50KTtcclxuICAgIC8vIGV2ZW50LmNvbXBvbmVudCBpcyBmb3IgbW9iaWxlIG9ubHlcclxuICAgIGNvbnN0IGNvbXBvbmVudCA9IGV2ZW50LmNvbXBvbmVudDtcclxuICAgIGlmIChjb21wb25lbnQpIHtcclxuICAgICAgY29tcG9uZW50LnN0YXJ0U2VhcmNoKCk7XHJcbiAgICAgIGNvbXBvbmVudC5lbmFibGVJbmZpbml0ZVNjcm9sbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRhdGEuSGFzSW5maW5pdGVTY3JvbGwpIHtcclxuICAgICAgLy8gSWYgc2VhcmNoIHRleHQsIHJlc2V0IHBhZ2UgdG8gMC4gR2V0IGluZmluaXRlIGRhdGFcclxuICAgICAgaWYgKGV2ZW50LnRleHQgIT09IG51bGwgJiYgZXZlbnQudGV4dCAhPT0gdGhpcy5pbmZpbml0ZVNlYXJjaFRleHQpIHtcclxuICAgICAgICB0aGlzLmluZmluaXRlU2Nyb2xsUGFnZU5vID0gMDtcclxuICAgICAgICB0aGlzLm1vZGVsekRhdGEgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdldEluZmluaXRlRGF0YShldmVudCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gUmVzZXQgc2Nyb2xsIHBhZ2UsIGVtcHR5IGl0ZW1zXHJcbiAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGxQYWdlTm8gPSAwO1xyXG4gICAgICBpZiAoY29tcG9uZW50KSB7XHJcbiAgICAgICAgY29tcG9uZW50Lml0ZW1zID0gW107XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEZpbHRlciB6RGF0YSBhbmQgcHVzaCB0byBpdGVtc1xyXG4gICAgICBjb25zdCBwYXJhbXM6IHpTZWxlY3RNdWx0aXBsZVBhcmFtcyA9IHtcclxuICAgICAgICByZWZlcklkOiBudWxsLFxyXG4gICAgICAgIHBhZ2VObzogMCxcclxuICAgICAgICBwYWdlU2l6ZTogMjAsXHJcbiAgICAgICAgc29ydENvbHVtbk5hbWU6IFwiXCIsXHJcbiAgICAgICAgc29ydE9yZGVyOiBcIlwiLFxyXG4gICAgICAgIHNvcnRDb2x1bW5OYW1lczogW10sXHJcbiAgICAgICAgc29ydE9yZGVyczogW10sXHJcbiAgICAgICAgZmlsdGVyUGFyYW1zOiBbXSxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBcIlwiXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCBzZWFyY2hGaWVsZHMgPSB0aGlzLmRhdGEuU2VhcmNoRmllbGRzID8gdGhpcy5kYXRhLlNlYXJjaEZpZWxkcyA6IHRoaXMuaXRlbVRleHRGaWVsZDtcclxuICAgICAgY29uc3QgZmlsdGVyaXRlbXMgPSBaQ29tcG9uZW50SGVscGVyLmZpbHRlclNlYXJjaEl0ZW1zKFxyXG4gICAgICAgIHRoaXMuZ2V0SXRlbXNEYXRhKCksXHJcbiAgICAgICAgZXZlbnQudGV4dCxcclxuICAgICAgICBzZWFyY2hGaWVsZHMsXHJcbiAgICAgICAgcGFyYW1zLnBhZ2VObyxcclxuICAgICAgICBwYXJhbXMucGFnZVNpemVcclxuICAgICAgKTtcclxuICAgICAgaWYgKGNvbXBvbmVudCkge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gY29tcG9uZW50Lml0ZW1zLmNvbmNhdChmaWx0ZXJpdGVtcyk7XHJcbiAgICAgICAgY29tcG9uZW50Lml0ZW1zID0gaXRlbXM7XHJcbiAgICAgICAgY29tcG9uZW50LmVuZEluZmluaXRlU2Nyb2xsKCk7XHJcbiAgICAgICAgY29tcG9uZW50LmVuZFNlYXJjaCgpO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUxhenlMb2FkRmlsdGVyKHZhbHVlOiBhbnksIGp1c3RPbmVUaW1lPzogYm9vbGVhbikge1xyXG4gICAgZGVidWdnZXI7XHJcbiAgICBpZiAodGhpcy5kZWJvdW5jZVN1Yikge1xyXG4gICAgICB0aGlzLmRlYm91bmNlU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kZWJvdW5jZVN1YiA9IG9mKFtdKS5waXBlKGRlbGF5KDUwMCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5vblNlYXJjaCh7IGNvbXBvbmVudDogbnVsbCwgdGV4dDogdmFsdWUgfSk7XHJcbiAgICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKSB7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwLmFmdGVyTG9hZHpEYXRhT3B0aW9ucyh0aGlzLmdyb3VwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVGaWx0ZXIodmFsdWU6IGFueSwganVzdE9uZVRpbWU/OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5kZWJvdW5jZVN1Yikge1xyXG4gICAgICB0aGlzLmRlYm91bmNlU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2tpcCBmaWx0ZXJpbmcgaWYgaGF2ZSBpbmlmaW5pdGVzY3JvbGw/XHJcbiAgICAvLyBUbyByZXNvbHZlIGJ1ZyAjMTk3OVxyXG4gICAgLy8gaWYgKCF0aGlzLmRhdGEuSGFzSW5maW5pdGVTY3JvbGwpIHtcclxuICAgIHRoaXMuZGVib3VuY2VTdWIgPSBvZihbXSlcclxuICAgICAgLnBpcGUodGFwKCgpID0+ICh0aGlzLmlzTG9hZGluZyA9IHRydWUpKSwgZGVsYXkoNTAwKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vblNlYXJjaCh7IGNvbXBvbmVudDogbnVsbCwgdGV4dDogdmFsdWUgfSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnModGhpcy5ncm91cCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLy8gaWYgKHRoaXMubG9hZEluZmluaXRlRGF0YVN1Yikge1xyXG4gICAgLy8gICB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIC8vIH1cclxuICAgIC8vIHRoaXMubG9hZEluZmluaXRlRGF0YVN1YiA9IG5ldyBTdWJqZWN0KGZhbHNlKTtcclxuICAgIC8vIHRoaXMuaGFuZGxlRmlsdGVyKG51bGwpO1xyXG4gICAgLy8gaW50ZXJ2YWwoMjAwMCkucGlwZSh0YWtlVW50aWwodGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgIC8vICAgdGhpcy5vblNlYXJjaCh7IGNvbXBvbmVudDogbnVsbCwgdGV4dDogdmFsdWUgfSk7XHJcbiAgICAvLyAgIGlmIChqdXN0T25lVGltZSkge1xyXG4gICAgLy8gICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVPcGVuKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCkge1xyXG4gICAgICB0aGlzLmhhbmRsZUZpbHRlcihudWxsKTtcclxuICAgICAgLy8gICAvLyBpZiAodGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViKSB7XHJcbiAgICAgIC8vICAgLy8gICB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgLy8gICAvLyB9XHJcbiAgICAgIC8vICAgLy8gdGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViID0gbmV3IFN1YmplY3QoKTtcclxuICAgICAgLy8gICAvLyAvLyB0aGlzLmhhbmRsZUZpbHRlcihudWxsKTtcclxuICAgICAgLy8gICAvLyBpbnRlcnZhbCgzMDAwKS5waXBlKHRha2VVbnRpbCh0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAvLyAgIC8vIHRoaXMuaGFuZGxlRmlsdGVyKG51bGwpO1xyXG4gICAgICAvLyAgIC8vIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2xvc2UoKSB7XHJcbiAgICAvLyBpZiAodGhpcy5kYXRhLkhhc0luZmluaXRlU2Nyb2xsKSB7XHJcbiAgICAvLyAgIGlmICh0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIpIHtcclxuICAgIC8vICAgICB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIubmV4dCh0cnVlKTtcclxuICAgIC8vICAgICAvLyB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIuY29tcGxldGUoKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlQmx1cigpIHtcclxuICAgIC8vIHRoaXMuaGFuZGxlQ2xvc2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJdGVtVGVtcGxhdGUoXHJcbiAgICBpdGVtOiBhbnksXHJcbiAgICBkYXRhOiBhbnksXHJcbiAgICBncm91cDogYW55LFxyXG4gICAgaXRlbVZhbHVlRmllbGQ6IHN0cmluZyxcclxuICAgIGl0ZW1UZXh0RmllbGQ6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgLy8gVG9ETzogaXRlbVZhbHVlRmllbGQgYW5kIGl0ZW1UZXh0RmllbGRcclxuICAgIGlmICh0aGlzLmRhdGEuSXRlbVRlbXBsYXRlKSB7XHJcbiAgICAgIGNvbnN0IGdldFRlbXBsYXRlRnVuYyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuSXRlbVRlbXBsYXRlKTtcclxuXHJcbiAgICAgIHJldHVybiBnZXRUZW1wbGF0ZUZ1bmMoe1xyXG4gICAgICAgIGl0ZW0sXHJcbiAgICAgICAgZGF0YSxcclxuICAgICAgICBncm91cCxcclxuICAgICAgICBpdGVtVmFsdWVGaWVsZCxcclxuICAgICAgICBpdGVtVGV4dEZpZWxkXHJcbiAgICAgIH0gYXMgWlNlbGVjdE11bHRpcGxlVGVtcGxhdGVQYXJhbXMpO1xyXG4gICAgfSBlbHNlIGlmIChpdGVtVGV4dEZpZWxkKSB7XHJcbiAgICAgIHJldHVybiBpdGVtW2l0ZW1UZXh0RmllbGRdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gcmV0dXJuIGl0ZW1baXRlbVRleHRGaWVsZF07XHJcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGl0ZW0pLmpvaW4oXCIsIFwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQWRkSXRlbShldmVudDogYW55KSB7XHJcbiAgICBjb25zdCBmID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIHRoaXMuZGF0YS5PbkFkZEl0ZW0pO1xyXG4gICAgaWYgKHR5cGVvZiBmID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IGNhbGxGdW5jID0gZi5iaW5kKHRoaXMuZ3JvdXAuY3RybFNjb3BlKTtcclxuICAgICAgcmV0dXJuIGNhbGxGdW5jKCk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgZGVjbGFyYXRpb24gb2YgT25BZGRJdGVtOiAnLCBmKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIC8vIENvbXBvbmVudCBiYXNpYyBmdW5jdGlvblxyXG4gIGNsZWFyRGF0YSgpIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0TW9kZWxWYWx1ZSh0aGlzLmRhdGEuVmFsdWUsIFwiXCIsIHRoaXMuZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJJdGVtcygpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdENvbXBvbmVudCkge1xyXG4gICAgICB0aGlzLnNlbGVjdENvbXBvbmVudC5jbGVhcigpO1xyXG4gICAgICB0aGlzLnNlbGVjdENvbXBvbmVudC5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uZmlybUl0ZW1zKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0Q29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LmNvbmZpcm0oKTtcclxuICAgICAgdGhpcy5zZWxlY3RDb21wb25lbnQuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZUl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQudG9nZ2xlSXRlbXModGhpcy50b2dnbGVTZWxlY3RhYmxlKTtcclxuICAgIHRoaXMudG9nZ2xlU2VsZWN0YWJsZSA9ICF0aGlzLnRvZ2dsZVNlbGVjdGFibGU7XHJcblxyXG4gICAgLy8gQ29uZmlybSBpdGVtcyBhbmQgY2xvc2UgU2VsZWN0IHBhZ2VcclxuICAgIC8vIHdpdGhvdXQgaGF2aW5nIHRoZSB1c2VyIHRvIGNsaWNrIENvbmZpcm0gYnV0dG9uLlxyXG4gICAgLy8gdGhpcy5jb25maXJtKCk7XHJcbiAgfVxyXG5cclxuICAvLyBEaXNhYmxlIE9wZW4gT24gRm9jdXNcclxuICBkaXNhYmxlT3Blbk9uRm9jdXMoY29tYm9ib3hDb21wb25lbnQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5EaXNhYmxlT3Blbk9uRm9jdXMpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIGNvbWJvYm94Q29tcG9uZW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gT25DaGFuZ2VcclxuICBwdWJsaWMgb25DaGFuZ2VfZGVza3RvcChldmVudDogYW55KSB7XHJcbiAgICBzdXBlci5vbkNoYW5nZShudWxsLCBldmVudClcclxuICAgIHRoaXMuaGFuZGxlSW5maW5pdGVTY3JvbGxPbkNoYW5nZShldmVudCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DaGFuZ2VfbW9iaWxlKGV2ZW50OiB7IGNvbXBvbmVudDogSW9uaWNTZWxlY3RhYmxlQ29tcG9uZW50OyB2YWx1ZTogYW55IH0pIHtcclxuICAgIHN1cGVyLm9uQ2hhbmdlKGV2ZW50KVxyXG4gICAgY29uc3QgZmMgPSB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy5kYXRhLlZhbHVlXTtcclxuICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHN1cGVyLmdldElzUmVxdWlyZWRWYWx1ZSgpICYmIChldmVudC52YWx1ZSA9PT0gbnVsbCB8fCBldmVudC52YWx1ZS5sZW5ndGggPT09IDApXHJcbiAgICApIHtcclxuICAgICAgZmMuc2V0RXJyb3JzKHsgcmVxdWlyZWQ6IHRydWUgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmYy5zZXRFcnJvcnMobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oYW5kbGVJbmZpbml0ZVNjcm9sbE9uQ2hhbmdlKGV2ZW50LnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlSW5maW5pdGVTY3JvbGxPbkNoYW5nZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLkhhc0luZmluaXRlU2Nyb2xsICYmICEhdGhpcy5kYXRhLkluZmluaXRlU2Nyb2xsJCkge1xyXG4gICAgICBjb25zdCB0ZXh0RmllbGQgPSB0aGlzLml0ZW1UZXh0RmllbGQudG9TdHJpbmcoKTtcclxuICAgICAgY29uc3QgdmFsdWVGaWVsZCA9IHRoaXMuaXRlbVZhbHVlRmllbGQudG9TdHJpbmcoKTtcclxuICAgICAgbGV0IHpkYXRhTW9kZWwgPSBbXTtcclxuICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgemRhdGFNb2RlbCA9IHRoaXMuaW5maW5pdGV6RGF0YS5maWx0ZXIoeCA9PiB4W3ZhbHVlRmllbGRdID09PSB2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5tb2RlbHpEYXRhID0gemRhdGFNb2RlbC5zbGljZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLml0ZW1EYXRhRmllbGQuc3RhcnRzV2l0aCgnZ3JvdXAuekRhdGEuJykpIHtcclxuICAgICAgICB0aGlzLmdyb3VwLnpEYXRhW3RoaXMuaXRlbURhdGFGaWVsZC5zbGljZSgxMildID0gemRhdGFNb2RlbDtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLml0ZW1EYXRhRmllbGQuc3RhcnRzV2l0aCgnZ3JvdXAuJykpIHtcclxuICAgICAgICB0aGlzLmdyb3VwW3RoaXMuaXRlbURhdGFGaWVsZC5zbGljZSg2KV0gPSB6ZGF0YU1vZGVsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBNdWx0aSBTZWxlY3Rpb24gVHJlZVxyXG4gIHB1YmxpYyBnZXQgZmlsdGVyRXhwYW5kU2V0dGluZ3MoKTogRmlsdGVyRXhwYW5kU2V0dGluZ3Mge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZXhwYW5kTWF0Y2hlczogdHJ1ZSxcclxuICAgICAgZXhwYW5kZWRPbkNsZWFyOiBcImluaXRpYWxcIlxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhc0NoaWxkcmVuID0gKGRhdGFpdGVtOiBhbnkpOiBib29sZWFuID0+ICEhZGF0YWl0ZW1bJ2l0ZW1zJ107XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVNdWx0aVNlbGVjdFRyZWVGaWx0ZXIodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5wYXJzZWRJdGVtc0RhdGEgPSB0aGlzLm9uTXVsdGlTZWxlY3RUcmVlU2VhcmNoKHRoaXMuZ2V0SXRlbXNEYXRhKCksIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk11bHRpU2VsZWN0VHJlZVNlYXJjaChpdGVtczogYW55W10sIHNlYXJjaGVkVGV4dDogc3RyaW5nKTogYW55W10ge1xyXG4gICAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmNvbnRhaW5zKGl0ZW1bdGhpcy5pdGVtVGV4dEZpZWxkXSwgc2VhcmNoZWRUZXh0KSkge1xyXG4gICAgICAgIGFjYy5wdXNoKGl0ZW0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGl0ZW1bJ2l0ZW1zJ10gJiYgaXRlbVsnaXRlbXMnXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSB0aGlzLm9uTXVsdGlTZWxlY3RUcmVlU2VhcmNoKGl0ZW1bJ2l0ZW1zJ10sIHNlYXJjaGVkVGV4dCk7XHJcblxyXG4gICAgICAgIGlmIChuZXdJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBfaXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0pO1xyXG4gICAgICAgICAgX2l0ZW1bJ2l0ZW1zJ10gPSBuZXdJdGVtcztcclxuXHJcbiAgICAgICAgICBhY2MucHVzaChfaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gYWNjO1xyXG4gICAgfSwgW10pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvbnRhaW5zKHRleHQ6IHN0cmluZywgc2VhcmNoZWRUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoKHNlYXJjaGVkVGV4dCB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTZWxlY3RPcHRpb24odmFsdWU6IGFueSkge1xyXG4gICAgY29uc3Qgb3B0aW9uTmFtZSA9IHRoaXMuZGF0YS5PcHRpb25OYW1lIHx8IHRoaXMuaXRlbURhdGFGaWVsZDtcclxuICAgIHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zID0gT2JqZWN0LmFzc2lnbihbXSwgdmFsdWUpO1xyXG4gICAgdGhpcy5ncm91cC56RGF0YVtvcHRpb25OYW1lLnNsaWNlKDEyKV0gPSB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb2N1cygpIHtcclxuICAgIGlmICh0aGlzLmNvbWJvYm94Q29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMuY29tYm9ib3hDb21wb25lbnQuZm9jdXMoKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tdWx0aXNlbGVjdCkge1xyXG4gICAgICB0aGlzLm11bHRpc2VsZWN0LmZvY3VzKCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubXVsdGlzZWxlY3R0cmVlKSB7XHJcbiAgICAgIHRoaXMubXVsdGlzZWxlY3R0cmVlLmZvY3VzKCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwienNlbGVjdG11bHRpcGxlLWNvbnRhaW5lciBlMXRhZy1zdHlsZVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlXCI+XHJcbiAgPGlvbmljLXNlbGVjdGFibGUgKm5nSWY9XCJpc01vYmlsZVNjcmVlbigpXCIgI3NlbGVjdENvbXBvbmVudCBpdGVtLWNvbnRlbnQgc2VhcmNoRmFpbFRleHQ9XCJOb3RoaW5nIGZvdW5kIDooXCJcclxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJDb2xvcj1cInByaW1hcnlcIiBjbGVhckJ1dHRvblRleHQ9XCJDbGVhclwiIFsobmdNb2RlbCldPVwiZ3JvdXAuek1vZGVsW2RhdGEuVmFsdWVdXCIgW2lkXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJnZXRJdGVtc0RhdGEoKVwiIFtpdGVtVmFsdWVGaWVsZF09XCJpdGVtVmFsdWVGaWVsZFwiIFtpdGVtVGV4dEZpZWxkXT1cIml0ZW1UZXh0RmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjYW5BZGRJdGVtXT1cIiEhZGF0YS5PbkFkZEl0ZW1cIiBbY2FuQ2xlYXJdPVwidHJ1ZVwiIFtwbGFjZWhvbGRlcl09XCJkYXRhLlBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2FuU2VhcmNoXT1cIiFkYXRhWydkaXNhYmxlLXNlYXJjaCddXCIgW3Nob3VsZEZvY3VzU2VhcmNoYmFyXT1cIiFkYXRhWydkaXNhYmxlLXNlYXJjaCddXCJcclxuICAgICAgICAgICAgICAgICAgICBbaGFzSW5maW5pdGVTY3JvbGxdPVwiISFkYXRhLkhhc0luZmluaXRlU2Nyb2xsXCIgW2lzTXVsdGlwbGVdPVwiZGF0YS5NdWx0aXBsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2lzRW5hYmxlZF09XCIhKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvdWxkU3RvcmVJdGVtVmFsdWVdPVwidHJ1ZVwiIChvblNlYXJjaCk9XCJvblNlYXJjaCgkZXZlbnQpXCIgKG9uSW5maW5pdGVTY3JvbGwpPVwiZ2V0SW5maW5pdGVEYXRhKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChvbkFkZEl0ZW0pPVwib25BZGRJdGVtKCRldmVudClcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VfbW9iaWxlKCRldmVudClcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTFcIiBjbGFzcz1cImUxdGFnLXN0eWxlMVwiPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBpb25pY1NlbGVjdGFibGVJdGVtSWNvblRlbXBsYXRlIGxldC1pdGVtPVwiaXRlbVwiIGxldC1pc0l0ZW1TZWxlY3RlZD1cImlzSXRlbVNlbGVjdGVkXCI+XHJcbiAgICAgIDxmYS1pY29uIHNsb3Q9XCJzdGFydFwiIGNsYXNzPVwiaXNJdGVtU2VsZWN0ZWQgZTF0YWctc3R5bGUyXCIgc2l6ZT1cInNtXCIgW2ljb25dPVwiWydmYXInLCBpc0l0ZW1TZWxlY3RlZCA/ICdjaGVjay1jaXJjbGUnOiAnY2lyY2xlJ11cIlxyXG4gICAgICAgICAgICAgICBbc3R5bGVzXT1cInsnY29sb3InOiBpc0l0ZW1TZWxlY3RlZCA/ICdkb2RnZXJCbHVlJyA6ICdsaWdodEdyYXknfVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMlwiPjwvZmEtaWNvbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIGlvbmljU2VsZWN0YWJsZUNsb3NlQnV0dG9uVGVtcGxhdGU+XHJcbiAgICAgIDwhLS0gPGlvbi1pY29uIG5hbWU9XCJjbG9zZS1jaXJjbGVcIj48L2lvbi1pY29uPiAtLT5cclxuICAgICAgPGZhLWljb24gW2ljb25dPVwiJ3RpbWVzLWNpcmNsZSdcIiBzaXplPVwibWRcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTNcIiBjbGFzcz1cImUxdGFnLXN0eWxlM1wiPjwvZmEtaWNvbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIGlvbmljU2VsZWN0YWJsZVRpdGxlVGVtcGxhdGU+XHJcbiAgICAgIDxzcGFuIGNsYXNzPWUxdGFnLXN0eWxlNCBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTRcIj57e2RhdGEuTGFiZWx9fTwvc3Bhbj5cclxuICAgICAgPGlvbi10ZXh0ICpuZ0lmPVwiZ2V0SXNSZXF1aXJlZFZhbHVlKClcIiBjb2xvcj1cImRhbmdlclwiPio8L2lvbi10ZXh0PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgaW9uaWNTZWxlY3RhYmxlSXRlbVRlbXBsYXRlIGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImUxdGFnLXN0eWxlNVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlNVwiPnt7IGdldEl0ZW1UZW1wbGF0ZShpdGVtLCBkYXRhLCBncm91cCwgaXRlbVZhbHVlRmllbGQsIGl0ZW1UZXh0RmllbGQpIH19PC9zcGFuPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2lvbmljLXNlbGVjdGFibGU+XHJcbiAgPGtlbmRvLWNvbWJvYm94ICpuZ0lmPVwiIWlzTW9iaWxlU2NyZWVuKCkgJiYgIWRhdGEuTXVsdGlwbGVcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWZpZWxkIGUxdGFnLXN0eWxlMVwiXHJcbiAgICAgICAgICAgICAgICAgICNjb21ib2JveENvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICBbZGF0YV09XCJnZXRJdGVtc0RhdGEoKSB8IHpzZWxlY3RUcmFuc2xhdGlvblBhcnNlciA6IGl0ZW1UZXh0RmllbGQgOiBkYXRhIDogZ3JvdXAgfCBhc3luY1wiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZUZpZWxkXT1cIml0ZW1WYWx1ZUZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgW3RleHRGaWVsZF09XCJpdGVtVGV4dEZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbHVlUHJpbWl0aXZlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGF0YS5QbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgIFthbGxvd0N1c3RvbV09XCJhbGxvd0N1c3RvbVZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgW2tlbmRvRHJvcERvd25GaWx0ZXJdPVwiZmlsdGVyU2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgICBbc3VnZ2VzdF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgW2ZpbHRlcmFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtvcGVuT25Gb2N1c109XCJkaXNhYmxlT3Blbk9uRm9jdXMoY29tYm9ib3hDb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQnIDogKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpfVwiXHJcbiAgICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImlzTG9hZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZV9kZXNrdG9wKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAoZmlsdGVyQ2hhbmdlKT1cImhhbmRsZUZpbHRlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgW3ZpcnR1YWxdPVwiZGF0YS5Jc0VuYWJsZVZpcnR1YWxpemF0aW9uID09IHRydWUgPyB2aXJ0dWFsIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgIChvcGVuKT1cImhhbmRsZU9wZW4oKVwiXHJcbiAgICAgICAgICAgICAgICAgIChjbG9zZSk9XCJoYW5kbGVDbG9zZSgpXCJcclxuICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiaGFuZGxlQmx1cigpXCJcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxXCI+XHJcbiAgICA8bmctdGVtcGxhdGUga2VuZG9Db21ib0JveEl0ZW1UZW1wbGF0ZSBsZXQtZGF0YUl0ZW0+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZTF0YWctc3R5bGU1XCIgW2NsYXNzLnpzZWxlY3QtdmlydHVhbGl6YXRpb25dPVwiZGF0YS5Jc0VuYWJsZVZpcnR1YWxpemF0aW9uXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU1XCI+e3sgZ2V0SXRlbVRlbXBsYXRlKGRhdGFJdGVtLCBkYXRhLCBncm91cCwgaXRlbVZhbHVlRmllbGQsIGl0ZW1UZXh0RmllbGQpIH19PC9zcGFuPlxyXG4gICAgICA8IS0tIDxzcGFuIGNsYXNzPVwidGVtcGxhdGVcIj57eyBkYXRhSXRlbS52YWx1ZSB9fTwvc3Bhbj4ge3sgZGF0YUl0ZW0udGV4dCB9fSAtLT5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9rZW5kby1jb21ib2JveD5cclxuICA8a2VuZG8tbXVsdGlzZWxlY3QgKm5nSWY9XCIhaXNNb2JpbGVTY3JlZW4oKSAmJiBkYXRhLk11bHRpcGxlICYmICFkYXRhLkVuYWJsZUNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1maWVsZCBlMXRhZy1zdHlsZTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAjbXVsdGlzZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiZ2V0SXRlbXNEYXRhKCkgfCB6c2VsZWN0VHJhbnNsYXRpb25QYXJzZXIgOiBpdGVtVGV4dEZpZWxkIDogZGF0YSA6IGdyb3VwIHwgYXN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF09XCJpdGVtVmFsdWVGaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFt0ZXh0RmllbGRdPVwiaXRlbVRleHRGaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZGF0YS5WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVByaW1pdGl2ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImRhdGEuUGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbYWxsb3dDdXN0b21dPVwiYWxsb3dDdXN0b21WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbY2hlY2tib3hlc109XCJkYXRhLkVuYWJsZUNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2F1dG9DbG9zZV09XCJhdXRvQ2xvc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICBba2VuZG9Ecm9wRG93bkZpbHRlcl09XCJmaWx0ZXJTZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJyA6ICghIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2VfZGVza3RvcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgKGZpbHRlckNoYW5nZSk9XCJoYW5kbGVGaWx0ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChvcGVuKT1cImhhbmRsZU9wZW4oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChjbG9zZSk9XCJoYW5kbGVDbG9zZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiaGFuZGxlQmx1cigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxXCI+XHJcbiAgICA8bmctdGVtcGxhdGUga2VuZG9NdWx0aVNlbGVjdEl0ZW1UZW1wbGF0ZSBsZXQtZGF0YUl0ZW0+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZTF0YWctc3R5bGU1XCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU1XCI+e3sgZ2V0SXRlbVRlbXBsYXRlKGRhdGFJdGVtLCBkYXRhLCBncm91cCwgaXRlbVZhbHVlRmllbGQsIGl0ZW1UZXh0RmllbGQpIH19PC9zcGFuPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2tlbmRvLW11bHRpc2VsZWN0PlxyXG4gIDxrZW5kby1tdWx0aXNlbGVjdHRyZWUgKm5nSWY9XCIhaXNNb2JpbGVTY3JlZW4oKSAmJiBkYXRhLk11bHRpcGxlICYmIGRhdGEuRW5hYmxlQ2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1maWVsZCBlMXRhZy1zdHlsZTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgI211bHRpc2VsZWN0dHJlZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAga2VuZG9NdWx0aVNlbGVjdFRyZWVFeHBhbmRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGF0YS5QbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBba2VuZG9NdWx0aVNlbGVjdFRyZWVIaWVyYXJjaHlCaW5kaW5nXT1cImdldEl0ZW1zRGF0YSgpIHwgenNlbGVjdFRyYW5zbGF0aW9uUGFyc2VyIDogaXRlbVRleHRGaWVsZCA6IGRhdGEgOiBncm91cCB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuRmllbGQ9XCJWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaGFzQ2hpbGRyZW5dPVwiaGFzQ2hpbGRyZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGaWVsZF09XCJpdGVtVGV4dEZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZUZpZWxkXT1cIml0ZW1WYWx1ZUZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVByaW1pdGl2ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZV9kZXNrdG9wKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFJdGVtc109XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImlzTG9hZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Nsb3NlXT1cImF1dG9DbG9zZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZXhwYW5kT25GaWx0ZXJdPVwiZmlsdGVyRXhwYW5kU2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcmFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsdGVyQ2hhbmdlKT1cImhhbmRsZU11bHRpU2VsZWN0VHJlZUZpbHRlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlZCcgOiAoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSl9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuKT1cImhhbmRsZU9wZW4oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2UpPVwiaGFuZGxlQ2xvc2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJoYW5kbGVCbHVyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxXCI+XHJcbiAgICA8bmctdGVtcGxhdGUga2VuZG9NdWx0aVNlbGVjdFRyZWVOb0RhdGFUZW1wbGF0ZT5cclxuICAgICAgPGg0PlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS13YXJuaW5nXCI+PC9zcGFuPjxiciAvPjxiciAvPlxyXG4gICAgICAgIE5vIHJlY29yZCBmb3VuZC5cclxuICAgICAgPC9oND5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9rZW5kby1tdWx0aXNlbGVjdHRyZWU+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
527
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienNlbGVjdG11bHRpcGxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21taGdsb2JhbC1keW5hbWljZm9ybS9zcmMvbGliL3pzZWxlY3RtdWx0aXBsZS96c2VsZWN0bXVsdGlwbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenNlbGVjdG11bHRpcGxlL3pzZWxlY3RtdWx0aXBsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFLeEUsOEJBQThCO0FBQzlCLE9BQU8sRUFBNEIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJNUMsMkNBQTJDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV4RSxPQUFPLEVBRU8sZ0JBQWdCLEVBQ0csb0JBQW9CLEVBQXlCLDhCQUE4QixFQUMzRyxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBU3pCLE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxjQUFjO0lBcUMxRCxZQUNTLGdCQUFtQyxFQUNsQyxrQkFBc0MsRUFDdEMsYUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIsWUFBMEI7UUFFbEMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFOaEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFtQjtRQUNsQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBakNw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QUFFO1lBQ3JJLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBNEIsQ0FBQztTQUM3RDthQUNJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLDhCQUE4QixDQUFDLFFBQVEsQ0FBQztTQUM5RDthQUNJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN4RCxJQUFJLENBQUMsYUFBYSxHQUFHLDhCQUE4QixDQUFDLFdBQVcsQ0FBQztTQUNqRTthQUNJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdkQsSUFBSSxDQUFDLGFBQWEsR0FBRyw4QkFBOEIsQ0FBQyxlQUFlLENBQUM7U0FDckU7SUFDSCxDQUFDOztxSEF2a0JVLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLGttQkM1QnJDLGcyVkEySkE7MkZEL0hhLHdCQUF3QjtrQkFOcEMsU0FBUzsrQkFDRSxxQkFBcUI7Mk5BTUMsaUJBQWlCO3NCQUFoRCxTQUFTO3VCQUFDLG1CQUFtQjtnQkFDTSxxQkFBcUI7c0JBQXhELFNBQVM7dUJBQUMsdUJBQXVCO2dCQUNSLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYTtnQkFDTSxlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFDRSxlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgT25EZXN0cm95IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcbmltcG9ydCB7IElvbmljU2VsZWN0YWJsZUNvbXBvbmVudCB9IGZyb20gXCJpb25pYy1zZWxlY3RhYmxlXCI7XHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IHRhcCwgZGVsYXkgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgRmlsdGVyRXhwYW5kU2V0dGluZ3MgfSBmcm9tIFwiQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItdHJlZXZpZXdcIjtcclxuaW1wb3J0IHsgQ29tYm9Cb3hDb21wb25lbnQsIERyb3BEb3duRmlsdGVyU2V0dGluZ3MsIERyb3BEb3duTGlzdENvbXBvbmVudCwgTXVsdGlTZWxlY3RDb21wb25lbnQsIE11bHRpU2VsZWN0VHJlZUNvbXBvbmVudCB9IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1kcm9wZG93bnNcIjtcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHsgSW5wdXRGaWVsZEJhc2UgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9pbnB1dGZpZWxkYmFzZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7XHJcbiAgUmVzb3VyY2VBcGlTZXJ2aWNlLCBXZWJBcGlTZXJ2aWNlLCBDYWNoZVNlcnZpY2UsIEZpZWxkU2VydmljZSxcclxuICBaQ29tcG9uZW50LCBaQ29tcG9uZW50SGVscGVyLCBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIENsaWNrYWJsZUljb25zLFxyXG4gIFpTZWxlY3RNdWx0aXBsZVRlbXBsYXRlUGFyYW1zLCBaU2VsZWN0UG9zdEFwaVBhcmFtcywgelNlbGVjdE11bHRpcGxlUGFyYW1zLCBJbnRlcm5hbENvbXBvbmVudFR5cGVfRHJvcERvd25cclxufSBmcm9tIFwibW1oZ2xvYmFsLXpjb3JlXCI7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiYXBwLXpzZWxlY3RtdWx0aXBsZVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4venNlbGVjdG11bHRpcGxlLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL3pzZWxlY3RtdWx0aXBsZS5jb21wb25lbnQuc2Nzc1wiXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFpzZWxlY3RtdWx0aXBsZUNvbXBvbmVudCBleHRlbmRzIElucHV0RmllbGRCYXNlIGltcGxlbWVudHMgWkNvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoXCJjb21ib2JveENvbXBvbmVudFwiKSBjb21ib2JveENvbXBvbmVudDogQ29tYm9Cb3hDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcImRyb3Bkb3dubGlzdENvbXBvbmVudFwiKSBkcm9wZG93bmxpc3RDb21wb25lbnQ6IERyb3BEb3duTGlzdENvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKFwibXVsdGlzZWxlY3RcIikgbXVsdGlzZWxlY3Q6IE11bHRpU2VsZWN0Q29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoXCJtdWx0aXNlbGVjdHRyZWVcIikgbXVsdGlzZWxlY3R0cmVlOiBNdWx0aVNlbGVjdFRyZWVDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcInNlbGVjdENvbXBvbmVudFwiKSBzZWxlY3RDb21wb25lbnQ6IElvbmljU2VsZWN0YWJsZUNvbXBvbmVudDtcclxuXHJcbiAgcHVibGljIGNvbXBvbmVudFR5cGUgOiBJbnRlcm5hbENvbXBvbmVudFR5cGVfRHJvcERvd247XHJcbiAgaWNvbkxpc3Q6IENsaWNrYWJsZUljb25zW107XHJcbiAgaXRlbXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBtb2RlbHpEYXRhOiBBcnJheTxhbnk+O1xyXG4gIGluZmluaXRlekRhdGE6IEFycmF5PGFueT4gPSBbXTtcclxuICBpbmZpbml0ZVNlYXJjaFRleHQgPSBudWxsO1xyXG4gIC8vIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIHRvZ2dsZVNlbGVjdGFibGUgPSB0cnVlO1xyXG4gIGl0ZW1WYWx1ZUZpZWxkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGl0ZW1UZXh0RmllbGQ6IHN0cmluZyA9IG51bGw7XHJcbiAgaXRlbURhdGFGaWVsZDogc3RyaW5nID0gbnVsbDtcclxuICBpdGVtVGVtcGxhdGUgPSBcInt7aXRlbVtpdGVtVGV4dEZpZWxkXX19XCI7XHJcbiAgaW5maW5pdGVTY3JvbGxQYWdlTm8gPSAwO1xyXG4gIGlzTG9hZGluZyA9IHRydWU7XHJcbiAgYWxsb3dDdXN0b21WYWx1ZSA9IGZhbHNlO1xyXG4gIGF1dG9DbG9zZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIHBhcnNlZEl0ZW1zRGF0YTogYW55W107XHJcbiAgZGF0YUluZm86IHt9ID0ge1xyXG4gICAgXCJpdGVtc1Jlc291cmNlVVJMXCI6IFwiXCIsXHJcbiAgICBcIm9wdGlvbkZpbHRlcnNcIjogXCJcIixcclxuICAgIFwidG90YWxDb3VudFwiOiAwXHJcbiAgfTtcclxuICBwcml2YXRlIGRlYm91bmNlU3ViOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIC8vIHByaXZhdGUgbG9hZEluZmluaXRlRGF0YVN1YjogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgcHVibGljIGZpbHRlclNldHRpbmdzOiBEcm9wRG93bkZpbHRlclNldHRpbmdzID0ge1xyXG4gICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsXHJcbiAgICBvcGVyYXRvcjogXCJjb250YWluc1wiLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGNvbXBvbmVudFNlcnZpY2U6IFpDb21wb25lbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZXNvdXJjZUFwaVNlcnZpY2U6IFJlc291cmNlQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgd2ViQXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOiBDYWNoZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZpZWxkU2VydmljZTogRmllbGRTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihjb21wb25lbnRTZXJ2aWNlKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHZpcnR1YWw6IGFueSA9IHtcclxuICAgIGl0ZW1IZWlnaHQ6IDI4LFxyXG4gICAgcGFnZVNpemU6IDE1XHJcbiAgfTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnNldENvbXBvbmVudFRvVXNlKCk7XHJcbiAgICBzdXBlci5zZXR1cElubmVyRmllbGQoKTtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0U2VsZWN0TXVsdGlwbGVUZXh0VmFsdWUodGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMsIHRoaXMpO1xyXG5cclxuICAgIC8vIFtEcm9wZG93bmxpc3QgTXVsdGlwbGVdIC0gYXV0byBjbG9zZSBtZW51IHdoZW4gbG9zZSBmb2N1cy5cclxuICAgIGlmICh0aGlzLmRhdGEuQXV0b0Nsb3NlID09PSBmYWxzZSkgdGhpcy5hdXRvQ2xvc2UgPSB0aGlzLmRhdGEuQXV0b0Nsb3NlO1xyXG5cclxuICAgIC8vIEhhbmRsZSBDbGlja2FibGUgSWNvbnNcclxuICAgIHRoaXMuaWNvbkxpc3QgPSB0aGlzLmRhdGEuQ2xpY2thYmxlSWNvbnM7XHJcbiAgICBpZiAodGhpcy5pY29uTGlzdCkge1xyXG4gICAgICBpZiAodGhpcy5pY29uTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5pY29uTGlzdC5mb3JFYWNoKChpOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChpLlRvb2x0aXAgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpLlRvb2x0aXAgPSBcIlwiO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaS5Ub29sdGlwID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIGkuVG9vbHRpcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBEZWZhdWx0IHBvc2l0aW9uIHRvcC4gcmlnaHQgfCBib3R0b20gfCB0b3AgfCBsZWZ0XHJcbiAgICAgICAgICBpZiAoaS5Qb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGkuUG9zaXRpb24gPSBcInRvcFwiO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmFsbG93Q3VzdG9tVmFsdWUgPSB0aGlzLmRhdGEuQWxsb3dDdXN0b21WYWx1ZSB8fCBmYWxzZTsgLy8gQWxsb3cgZW50ZXIgdGV4dCBpbiBkcm9wZG93bmJveFxyXG4gICAgY29uc3QgZmllbGRWYWx1ZSA9IHRoaXMuZGF0YS5WYWx1ZTtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XHJcbiAgICBjb25zdCB6TW9kZWwgPSB0aGlzLmdyb3VwLnpNb2RlbDtcclxuXHJcbiAgICAvKlxyXG4gICAgICogNCBTdHlsZXMgb2YgZGVjbGFyZSB0aGUgY29tcG9uZW5077+9cyBvcHRpb24gbGlzdCBkYXRhIHNvdXJjZS5cclxuICAgICAqIFN0eWxlICMxIC0gRmllbGQuU2VsZWN0T3B0aW9ucyBkZWZpbmVkIGFzIGFuIGFycmF5IG9mIG9iamVjdCB0aGF0IGNvbnRhaW4gdGV4dCBhbmQgdmFsdWUuXHJcbiAgICAgKiBTdHlsZSAjMiAtIEZpZWxkLlNlbGVjdE9wdGlvbnMgZGVmaW5lZCBhcyBhIHBoYXNlIGxpa2Ug77+9aXRlbS5JZCBhcyBpdGVtLk5hbWUgZm9yIGl0ZW0gaW4gZ3JvdXAuekRhdGEuUHJvamVjdE9wdGlvbnPvv70uXHJcbiAgICAgKiBTdHlsZSAjMyAtIEZpZWxkLk9wdGlvblJlc291cmNlVVJMIGRlZmluZWQgdGhlIG5hbWUgb2YgcmVzb3VyY2Ugc2VydmVyIGFwaS5cclxuICAgICAqIFN0eWxlICM0IC0gRmllbGQuSW5maW5pdGVTY3JvbGwkIGRlZmluZWQgdGhlIG1ldGhvZCBuYW1lIGFzIO+/vWdyb3VwLmdldE1vcmVEYXRhQXNTY3JvbGzvv70uXHJcbiAgICAgKi9cclxuXHJcbiAgICBpZiAoZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCAmJiBkYXRhLkluZmluaXRlU2Nyb2xsJCkge1xyXG4gICAgICAvLyB3aGVuIGluZmluaXRpZSBzY3JvbGxcclxuICAgICAgbGV0IHJlY29yZElkID0gbnVsbDtcclxuICAgICAgaWYgKHpNb2RlbCAmJiB6TW9kZWxbZmllbGRWYWx1ZV0pIHtcclxuICAgICAgICAvLyBnZXQgek1vZGVsIFZhbHVlXHJcbiAgICAgICAgcmVjb3JkSWQgPSB6TW9kZWxbZmllbGRWYWx1ZV0udG9TdHJpbmcoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGdldHpEYXRhRm9yek1vZGVsJDogT2JzZXJ2YWJsZTxhbnk+ID0gWkNvbXBvbmVudEhlbHBlci5nZXRJbmZpbml0ZURhdGEobnVsbCwgJycsIHRoaXMsIHJlY29yZElkKTtcclxuICAgICAgaWYgKGdldHpEYXRhRm9yek1vZGVsJCkge1xyXG4gICAgICAgIGdldHpEYXRhRm9yek1vZGVsJC5zdWJzY3JpYmUoKHpkYXRhKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhLk5hbWUsICcgLSBpbml0aWFsIHpEYXRhIGxvYWQ6ICcsIHpkYXRhKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5ncm91cCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICB0aGlzLmdyb3VwLmFmdGVyTG9hZHpEYXRhT3B0aW9ucyh0aGlzLmdyb3VwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFaQ29tcG9uZW50SGVscGVyLmlzTW9iaWxlU2NyZWVuKCkpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZUZpbHRlcihudWxsLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIFN0eWxlICMxLCAjMiwgIzNcclxuICAgICAgY29uc3QgaXNSZXF1aXJlZCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCBkYXRhLklzUmVxdWlyZWQpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGF0YS5PcHRpb25SZXNvdXJjZVVSTCkge1xyXG4gICAgICAgIHRoaXMubGF6eUxvYWREYXRhT3B0aW9ucygpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgb3B0aW9uRGF0YSA9IHJlcy5kYXRhU2V0ID8gcmVzLmRhdGFTZXQgOiByZXM7XHJcblxyXG4gICAgICAgICAgaWYgKG9wdGlvbkRhdGEgJiYgb3B0aW9uRGF0YS5sZW5ndGggPT09IDEgJiYgIXRoaXMuZGF0YS5EaXNhYmxlQXV0b0ZpcnN0U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0b1NlbGVjdEZpcnN0T3B0aW9uKGlzUmVxdWlyZWQsIG9wdGlvbkRhdGFbMF0sIGZpZWxkVmFsdWUsIHpNb2RlbC5JZCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnModGhpcy5ncm91cCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zKSAmJiB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucykge1xyXG4gICAgICAgICAgLy9za2lwIGV2YWwgaWYgc2VsZWN0b3B0aW9ucyBpcyBleGlzdFxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG9wdGlvbkRhdGEgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgdGhpcy5pdGVtRGF0YUZpZWxkKTtcclxuICAgICAgICAgIC8vIGFwcGVuZCBkYXRhIHZpYSB0aW1lb3V0IGFmdGVyIGRhdGEgaXMgbG9hZGVkLlxyXG4gICAgICAgICAgaWYgKG9wdGlvbkRhdGEgJiYgb3B0aW9uRGF0YS5sZW5ndGggPT09IDEgJiYgIXRoaXMuZGF0YS5EaXNhYmxlQXV0b0ZpcnN0U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoaXNDb21wb25lbnQgPSB0aGlzO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICB0aGlzQ29tcG9uZW50LmF1dG9TZWxlY3RGaXJzdE9wdGlvbihpc1JlcXVpcmVkLCBvcHRpb25EYXRhWzBdLCBmaWVsZFZhbHVlLCB0aGlzQ29tcG9uZW50Lmdyb3VwLnpNb2RlbC5JZCk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnModGhpcy5ncm91cCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBzdXBlci5mb2N1c09uRGVmYXVsdCh0aGlzLmZvY3VzLmJpbmQodGhpcykpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLmRlY3JlbWVudENvbXBvbmVudENvdW50ZXJGb3JGaWVsZCh0aGlzLmRhdGEpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAvLyBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgIC8vICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIC8vIH1cclxuICAgIGlmICh0aGlzLmRlYm91bmNlU3ViKSB7XHJcbiAgICAgIHRoaXMuZGVib3VuY2VTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEF1dG8gc2VsZWN0IGZpcnN0IG9wdGlvbiAoaWYgcmVxdWlyZWQgJiBvbmx5IDEgb3B0aW9uKVxyXG4gIHByaXZhdGUgYXV0b1NlbGVjdEZpcnN0T3B0aW9uKHJlcXVpcmVkOiBib29sZWFuLCBkYXRhOiBhbnksIHpNb2RlbFByb3BlcnR5TmFtZTogc3RyaW5nLCBpZDogYW55KSB7XHJcbiAgICBpZiAoWkNvbXBvbmVudEhlbHBlci5pc051bGxVbmRlZmluZWRFbXB0eShpZCkgJiYgcmVxdWlyZWQpIHtcclxuICAgICAgdmFyIG9wdGlvbklkID0gZGF0YS5JZDtcclxuICAgICAgaWYgKHRoaXMuZGF0YS5NdWx0aXBsZSkge1xyXG4gICAgICAgIG9wdGlvbklkID0gW29wdGlvbklkXTtcclxuICAgICAgfVxyXG4gICAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUoek1vZGVsUHJvcGVydHlOYW1lLCBvcHRpb25JZCwgdGhpcy5ncm91cCk7XHJcblxyXG4gICAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgICAgdHlwZTogXCJvbkNoYW5nZVwiLFxyXG4gICAgICAgIHRhcmdldDogdGhpcy5kYXRhLk9uQ2hhbmdlLFxyXG4gICAgICAgIGV2ZW50LFxyXG4gICAgICAgIGRhdGE6IHsgWyd2YWx1ZSddOiBvcHRpb25JZCwgZmllbGQ6IHRoaXMuZGF0YSB9XHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gU3R5bGUgIzNcclxuICBsYXp5TG9hZERhdGFPcHRpb25zKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCByZXNvdXJjZVVybCA9IHRoaXMucmVzb3VyY2VBcGlTZXJ2aWNlLmdldFVSTChcclxuICAgICAgdGhpcy5kYXRhLk9wdGlvblJlc291cmNlVVJMXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlclBhcmFtID0gbmV3IFpTZWxlY3RQb3N0QXBpUGFyYW1zKCk7XHJcbiAgICBmaWx0ZXJQYXJhbS5zb3J0cyA9IHRoaXMuZGF0YS5PcHRpb25Tb3J0O1xyXG4gICAgZmlsdGVyUGFyYW0uY29sdW1ucyA9IHRoaXMuZGF0YS5PcHRpb25Db2x1bW5zO1xyXG4gICAgZmlsdGVyUGFyYW0uZmlsdGVycyA9IHRoaXMuZGF0YS5PcHRpb25GaWx0ZXI7XHJcblxyXG4gICAgcmV0dXJuIFpDb21wb25lbnRIZWxwZXIuZ2V0RGF0YU9wdGlvbnMoXHJcbiAgICAgIHRoaXMuZGF0YS5PcHRpb25OYW1lLFxyXG4gICAgICBmaWx0ZXJQYXJhbSxcclxuICAgICAgdGhpcy5ncm91cCxcclxuICAgICAgcmVzb3VyY2VVcmwsXHJcbiAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLFxyXG4gICAgICB0aGlzLndlYkFwaVNlcnZpY2UsXHJcbiAgICAgIHRoaXMuZGF0YVsnRGlzYWJsZUNhY2hlJ11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBTdHlsZSAjNCwgdXNlZCBpbiBpb25pYy1zZWxlY3RhYmxlXHJcbiAgZ2V0SW5maW5pdGVEYXRhKGV2ZW50OiB7XHJcbiAgICBjb21wb25lbnQ6IElvbmljU2VsZWN0YWJsZUNvbXBvbmVudDtcclxuICAgIHRleHQ6IHN0cmluZztcclxuICB9KSB7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLmdldEluZmluaXRlRGF0YShldmVudC5jb21wb25lbnQsIGV2ZW50LnRleHQsIHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbXNEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbmZpbml0ZXpEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG9wdGlvbk5hbWUgPSB0aGlzLmRhdGEuT3B0aW9uTmFtZSB8fCB0aGlzLml0ZW1EYXRhRmllbGQgfHwgJ2dyb3VwLnpEYXRhLicgKyB0aGlzLmRhdGEuTmFtZTtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zKSAmJiAhdGhpcy5ncm91cC56RGF0YVtvcHRpb25OYW1lLnNsaWNlKDEyKV0pIHtcclxuICAgICAgLy8gcmV0dXJuIHNlbGVjdGlvbk9wdGlvbnM7XHJcbiAgICAgIC8vIHJldHVybiB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucztcclxuICAgICAgdGhpcy5ncm91cC56RGF0YVtvcHRpb25OYW1lLnNsaWNlKDEyKV0gPSB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucztcclxuICAgICAgdGhpcy5pdGVtRGF0YUZpZWxkID0gb3B0aW9uTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0aW9uTmFtZS5zdGFydHNXaXRoKCd6RGF0YS4nKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5ncm91cC56RGF0YVtvcHRpb25OYW1lLnNsaWNlKDYpXSB8fCBbXTtcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25OYW1lLnN0YXJ0c1dpdGgoJ2dyb3VwLnpEYXRhLicpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwLnpEYXRhW29wdGlvbk5hbWUuc2xpY2UoMTIpXSB8fCBbXTtcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25OYW1lLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwW29wdGlvbk5hbWUuc2xpY2UoNildIHx8IFtdO1xyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbk5hbWUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBbb3B0aW9uTmFtZV0gfHwgW107XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLndhcm4odGhpcy5kYXRhLk5hbWUsICcgLSBJbnZhbGlkIHNldHRpbmcgZm9yIE9wdGlvbk5hbWU6ICcsIG9wdGlvbk5hbWUpO1xyXG4gIH1cclxuXHJcbiAgb25TZWFyY2goZXZlbnQ6IHsgY29tcG9uZW50OiBJb25pY1NlbGVjdGFibGVDb21wb25lbnQ7IHRleHQ6IHN0cmluZyB9KSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcIkF0IHpzZWxlY3RtdWx0aXBsZS5jb21wb25lbnQgKG9uU2VhcmNoKTogXCIsIGV2ZW50KTtcclxuICAgIC8vIGV2ZW50LmNvbXBvbmVudCBpcyBmb3IgbW9iaWxlIG9ubHlcclxuICAgIGNvbnN0IGNvbXBvbmVudCA9IGV2ZW50LmNvbXBvbmVudDtcclxuICAgIGlmIChjb21wb25lbnQpIHtcclxuICAgICAgY29tcG9uZW50LnN0YXJ0U2VhcmNoKCk7XHJcbiAgICAgIGNvbXBvbmVudC5lbmFibGVJbmZpbml0ZVNjcm9sbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRhdGEuSGFzSW5maW5pdGVTY3JvbGwpIHtcclxuICAgICAgLy8gSWYgc2VhcmNoIHRleHQsIHJlc2V0IHBhZ2UgdG8gMC4gR2V0IGluZmluaXRlIGRhdGFcclxuICAgICAgaWYgKGV2ZW50LnRleHQgIT09IG51bGwgJiYgZXZlbnQudGV4dCAhPT0gdGhpcy5pbmZpbml0ZVNlYXJjaFRleHQpIHtcclxuICAgICAgICB0aGlzLmluZmluaXRlU2Nyb2xsUGFnZU5vID0gMDtcclxuICAgICAgICB0aGlzLm1vZGVsekRhdGEgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdldEluZmluaXRlRGF0YShldmVudCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gUmVzZXQgc2Nyb2xsIHBhZ2UsIGVtcHR5IGl0ZW1zXHJcbiAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGxQYWdlTm8gPSAwO1xyXG4gICAgICBpZiAoY29tcG9uZW50KSB7XHJcbiAgICAgICAgY29tcG9uZW50Lml0ZW1zID0gW107XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEZpbHRlciB6RGF0YSBhbmQgcHVzaCB0byBpdGVtc1xyXG4gICAgICBjb25zdCBwYXJhbXM6IHpTZWxlY3RNdWx0aXBsZVBhcmFtcyA9IHtcclxuICAgICAgICByZWZlcklkOiBudWxsLFxyXG4gICAgICAgIHBhZ2VObzogMCxcclxuICAgICAgICBwYWdlU2l6ZTogMjAsXHJcbiAgICAgICAgc29ydENvbHVtbk5hbWU6IFwiXCIsXHJcbiAgICAgICAgc29ydE9yZGVyOiBcIlwiLFxyXG4gICAgICAgIHNvcnRDb2x1bW5OYW1lczogW10sXHJcbiAgICAgICAgc29ydE9yZGVyczogW10sXHJcbiAgICAgICAgZmlsdGVyUGFyYW1zOiBbXSxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBcIlwiXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCBzZWFyY2hGaWVsZHMgPSB0aGlzLmRhdGEuU2VhcmNoRmllbGRzID8gdGhpcy5kYXRhLlNlYXJjaEZpZWxkcyA6IHRoaXMuaXRlbVRleHRGaWVsZDtcclxuICAgICAgY29uc3QgZmlsdGVyaXRlbXMgPSBaQ29tcG9uZW50SGVscGVyLmZpbHRlclNlYXJjaEl0ZW1zKFxyXG4gICAgICAgIHRoaXMuZ2V0SXRlbXNEYXRhKCksXHJcbiAgICAgICAgZXZlbnQudGV4dCxcclxuICAgICAgICBzZWFyY2hGaWVsZHMsXHJcbiAgICAgICAgcGFyYW1zLnBhZ2VObyxcclxuICAgICAgICBwYXJhbXMucGFnZVNpemVcclxuICAgICAgKTtcclxuICAgICAgaWYgKGNvbXBvbmVudCkge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gY29tcG9uZW50Lml0ZW1zLmNvbmNhdChmaWx0ZXJpdGVtcyk7XHJcbiAgICAgICAgY29tcG9uZW50Lml0ZW1zID0gaXRlbXM7XHJcbiAgICAgICAgY29tcG9uZW50LmVuZEluZmluaXRlU2Nyb2xsKCk7XHJcbiAgICAgICAgY29tcG9uZW50LmVuZFNlYXJjaCgpO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUxhenlMb2FkRmlsdGVyKHZhbHVlOiBhbnksIGp1c3RPbmVUaW1lPzogYm9vbGVhbikge1xyXG4gICAgZGVidWdnZXI7XHJcbiAgICBpZiAodGhpcy5kZWJvdW5jZVN1Yikge1xyXG4gICAgICB0aGlzLmRlYm91bmNlU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kZWJvdW5jZVN1YiA9IG9mKFtdKS5waXBlKGRlbGF5KDUwMCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5vblNlYXJjaCh7IGNvbXBvbmVudDogbnVsbCwgdGV4dDogdmFsdWUgfSk7XHJcbiAgICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKSB7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwLmFmdGVyTG9hZHpEYXRhT3B0aW9ucyh0aGlzLmdyb3VwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVGaWx0ZXIodmFsdWU6IGFueSwganVzdE9uZVRpbWU/OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5kZWJvdW5jZVN1Yikge1xyXG4gICAgICB0aGlzLmRlYm91bmNlU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2tpcCBmaWx0ZXJpbmcgaWYgaGF2ZSBpbmlmaW5pdGVzY3JvbGw/XHJcbiAgICAvLyBUbyByZXNvbHZlIGJ1ZyAjMTk3OVxyXG4gICAgLy8gaWYgKCF0aGlzLmRhdGEuSGFzSW5maW5pdGVTY3JvbGwpIHtcclxuICAgIHRoaXMuZGVib3VuY2VTdWIgPSBvZihbXSlcclxuICAgICAgLnBpcGUodGFwKCgpID0+ICh0aGlzLmlzTG9hZGluZyA9IHRydWUpKSwgZGVsYXkoNTAwKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vblNlYXJjaCh7IGNvbXBvbmVudDogbnVsbCwgdGV4dDogdmFsdWUgfSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnModGhpcy5ncm91cCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLy8gaWYgKHRoaXMubG9hZEluZmluaXRlRGF0YVN1Yikge1xyXG4gICAgLy8gICB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIC8vIH1cclxuICAgIC8vIHRoaXMubG9hZEluZmluaXRlRGF0YVN1YiA9IG5ldyBTdWJqZWN0KGZhbHNlKTtcclxuICAgIC8vIHRoaXMuaGFuZGxlRmlsdGVyKG51bGwpO1xyXG4gICAgLy8gaW50ZXJ2YWwoMjAwMCkucGlwZSh0YWtlVW50aWwodGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgIC8vICAgdGhpcy5vblNlYXJjaCh7IGNvbXBvbmVudDogbnVsbCwgdGV4dDogdmFsdWUgfSk7XHJcbiAgICAvLyAgIGlmIChqdXN0T25lVGltZSkge1xyXG4gICAgLy8gICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVPcGVuKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCkge1xyXG4gICAgICB0aGlzLmhhbmRsZUZpbHRlcihudWxsKTtcclxuICAgICAgLy8gICAvLyBpZiAodGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViKSB7XHJcbiAgICAgIC8vICAgLy8gICB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgLy8gICAvLyB9XHJcbiAgICAgIC8vICAgLy8gdGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViID0gbmV3IFN1YmplY3QoKTtcclxuICAgICAgLy8gICAvLyAvLyB0aGlzLmhhbmRsZUZpbHRlcihudWxsKTtcclxuICAgICAgLy8gICAvLyBpbnRlcnZhbCgzMDAwKS5waXBlKHRha2VVbnRpbCh0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAvLyAgIC8vIHRoaXMuaGFuZGxlRmlsdGVyKG51bGwpO1xyXG4gICAgICAvLyAgIC8vIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2xvc2UoKSB7XHJcbiAgICAvLyBpZiAodGhpcy5kYXRhLkhhc0luZmluaXRlU2Nyb2xsKSB7XHJcbiAgICAvLyAgIGlmICh0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIpIHtcclxuICAgIC8vICAgICB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIubmV4dCh0cnVlKTtcclxuICAgIC8vICAgICAvLyB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIuY29tcGxldGUoKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlQmx1cigpIHtcclxuICAgIC8vIHRoaXMuaGFuZGxlQ2xvc2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJdGVtVGVtcGxhdGUoXHJcbiAgICBpdGVtOiBhbnksXHJcbiAgICBkYXRhOiBhbnksXHJcbiAgICBncm91cDogYW55LFxyXG4gICAgaXRlbVZhbHVlRmllbGQ6IHN0cmluZyxcclxuICAgIGl0ZW1UZXh0RmllbGQ6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgLy8gVG9ETzogaXRlbVZhbHVlRmllbGQgYW5kIGl0ZW1UZXh0RmllbGRcclxuICAgIGlmICh0aGlzLmRhdGEuSXRlbVRlbXBsYXRlKSB7XHJcbiAgICAgIGNvbnN0IGdldFRlbXBsYXRlRnVuYyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuSXRlbVRlbXBsYXRlKTtcclxuXHJcbiAgICAgIHJldHVybiBnZXRUZW1wbGF0ZUZ1bmMoe1xyXG4gICAgICAgIGl0ZW0sXHJcbiAgICAgICAgZGF0YSxcclxuICAgICAgICBncm91cCxcclxuICAgICAgICBpdGVtVmFsdWVGaWVsZCxcclxuICAgICAgICBpdGVtVGV4dEZpZWxkXHJcbiAgICAgIH0gYXMgWlNlbGVjdE11bHRpcGxlVGVtcGxhdGVQYXJhbXMpO1xyXG4gICAgfSBlbHNlIGlmIChpdGVtVGV4dEZpZWxkKSB7XHJcbiAgICAgIHJldHVybiBpdGVtW2l0ZW1UZXh0RmllbGRdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gcmV0dXJuIGl0ZW1baXRlbVRleHRGaWVsZF07XHJcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGl0ZW0pLmpvaW4oXCIsIFwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQWRkSXRlbShldmVudDogYW55KSB7XHJcbiAgICBjb25zdCBmID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIHRoaXMuZGF0YS5PbkFkZEl0ZW0pO1xyXG4gICAgaWYgKHR5cGVvZiBmID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IGNhbGxGdW5jID0gZi5iaW5kKHRoaXMuZ3JvdXAuY3RybFNjb3BlKTtcclxuICAgICAgcmV0dXJuIGNhbGxGdW5jKCk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgZGVjbGFyYXRpb24gb2YgT25BZGRJdGVtOiAnLCBmKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIC8vIENvbXBvbmVudCBiYXNpYyBmdW5jdGlvblxyXG4gIGNsZWFyRGF0YSgpIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0TW9kZWxWYWx1ZSh0aGlzLmRhdGEuVmFsdWUsIFwiXCIsIHRoaXMuZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJJdGVtcygpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdENvbXBvbmVudCkge1xyXG4gICAgICB0aGlzLnNlbGVjdENvbXBvbmVudC5jbGVhcigpO1xyXG4gICAgICB0aGlzLnNlbGVjdENvbXBvbmVudC5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uZmlybUl0ZW1zKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0Q29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LmNvbmZpcm0oKTtcclxuICAgICAgdGhpcy5zZWxlY3RDb21wb25lbnQuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZUl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQudG9nZ2xlSXRlbXModGhpcy50b2dnbGVTZWxlY3RhYmxlKTtcclxuICAgIHRoaXMudG9nZ2xlU2VsZWN0YWJsZSA9ICF0aGlzLnRvZ2dsZVNlbGVjdGFibGU7XHJcblxyXG4gICAgLy8gQ29uZmlybSBpdGVtcyBhbmQgY2xvc2UgU2VsZWN0IHBhZ2VcclxuICAgIC8vIHdpdGhvdXQgaGF2aW5nIHRoZSB1c2VyIHRvIGNsaWNrIENvbmZpcm0gYnV0dG9uLlxyXG4gICAgLy8gdGhpcy5jb25maXJtKCk7XHJcbiAgfVxyXG5cclxuICAvLyBEaXNhYmxlIE9wZW4gT24gRm9jdXNcclxuICBkaXNhYmxlT3Blbk9uRm9jdXMoY29tYm9ib3hDb21wb25lbnQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5EaXNhYmxlT3Blbk9uRm9jdXMpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIGNvbWJvYm94Q29tcG9uZW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gT25DaGFuZ2VcclxuICBwdWJsaWMgb25DaGFuZ2VfZGVza3RvcChldmVudDogYW55KSB7XHJcbiAgICBzdXBlci5vbkNoYW5nZShudWxsLCBldmVudClcclxuICAgIHRoaXMuaGFuZGxlSW5maW5pdGVTY3JvbGxPbkNoYW5nZShldmVudCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DaGFuZ2VfbW9iaWxlKGV2ZW50OiB7IGNvbXBvbmVudDogSW9uaWNTZWxlY3RhYmxlQ29tcG9uZW50OyB2YWx1ZTogYW55IH0pIHtcclxuICAgIHN1cGVyLm9uQ2hhbmdlKGV2ZW50KVxyXG4gICAgY29uc3QgZmMgPSB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy5kYXRhLlZhbHVlXTtcclxuICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHN1cGVyLmdldElzUmVxdWlyZWRWYWx1ZSgpICYmIChldmVudC52YWx1ZSA9PT0gbnVsbCB8fCBldmVudC52YWx1ZS5sZW5ndGggPT09IDApXHJcbiAgICApIHtcclxuICAgICAgZmMuc2V0RXJyb3JzKHsgcmVxdWlyZWQ6IHRydWUgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmYy5zZXRFcnJvcnMobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oYW5kbGVJbmZpbml0ZVNjcm9sbE9uQ2hhbmdlKGV2ZW50LnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlSW5maW5pdGVTY3JvbGxPbkNoYW5nZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLkhhc0luZmluaXRlU2Nyb2xsICYmICEhdGhpcy5kYXRhLkluZmluaXRlU2Nyb2xsJCkge1xyXG4gICAgICBjb25zdCB0ZXh0RmllbGQgPSB0aGlzLml0ZW1UZXh0RmllbGQudG9TdHJpbmcoKTtcclxuICAgICAgY29uc3QgdmFsdWVGaWVsZCA9IHRoaXMuaXRlbVZhbHVlRmllbGQudG9TdHJpbmcoKTtcclxuICAgICAgbGV0IHpkYXRhTW9kZWwgPSBbXTtcclxuICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgemRhdGFNb2RlbCA9IHRoaXMuaW5maW5pdGV6RGF0YS5maWx0ZXIoeCA9PiB4W3ZhbHVlRmllbGRdID09PSB2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5tb2RlbHpEYXRhID0gemRhdGFNb2RlbC5zbGljZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLml0ZW1EYXRhRmllbGQuc3RhcnRzV2l0aCgnZ3JvdXAuekRhdGEuJykpIHtcclxuICAgICAgICB0aGlzLmdyb3VwLnpEYXRhW3RoaXMuaXRlbURhdGFGaWVsZC5zbGljZSgxMildID0gemRhdGFNb2RlbDtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLml0ZW1EYXRhRmllbGQuc3RhcnRzV2l0aCgnZ3JvdXAuJykpIHtcclxuICAgICAgICB0aGlzLmdyb3VwW3RoaXMuaXRlbURhdGFGaWVsZC5zbGljZSg2KV0gPSB6ZGF0YU1vZGVsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBNdWx0aSBTZWxlY3Rpb24gVHJlZVxyXG4gIHB1YmxpYyBnZXQgZmlsdGVyRXhwYW5kU2V0dGluZ3MoKTogRmlsdGVyRXhwYW5kU2V0dGluZ3Mge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZXhwYW5kTWF0Y2hlczogdHJ1ZSxcclxuICAgICAgZXhwYW5kZWRPbkNsZWFyOiBcImluaXRpYWxcIlxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhc0NoaWxkcmVuID0gKGRhdGFpdGVtOiBhbnkpOiBib29sZWFuID0+ICEhZGF0YWl0ZW1bJ2l0ZW1zJ107XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVNdWx0aVNlbGVjdFRyZWVGaWx0ZXIodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5wYXJzZWRJdGVtc0RhdGEgPSB0aGlzLm9uTXVsdGlTZWxlY3RUcmVlU2VhcmNoKHRoaXMuZ2V0SXRlbXNEYXRhKCksIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk11bHRpU2VsZWN0VHJlZVNlYXJjaChpdGVtczogYW55W10sIHNlYXJjaGVkVGV4dDogc3RyaW5nKTogYW55W10ge1xyXG4gICAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmNvbnRhaW5zKGl0ZW1bdGhpcy5pdGVtVGV4dEZpZWxkXSwgc2VhcmNoZWRUZXh0KSkge1xyXG4gICAgICAgIGFjYy5wdXNoKGl0ZW0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGl0ZW1bJ2l0ZW1zJ10gJiYgaXRlbVsnaXRlbXMnXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSB0aGlzLm9uTXVsdGlTZWxlY3RUcmVlU2VhcmNoKGl0ZW1bJ2l0ZW1zJ10sIHNlYXJjaGVkVGV4dCk7XHJcblxyXG4gICAgICAgIGlmIChuZXdJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBfaXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0pO1xyXG4gICAgICAgICAgX2l0ZW1bJ2l0ZW1zJ10gPSBuZXdJdGVtcztcclxuXHJcbiAgICAgICAgICBhY2MucHVzaChfaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gYWNjO1xyXG4gICAgfSwgW10pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvbnRhaW5zKHRleHQ6IHN0cmluZywgc2VhcmNoZWRUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoKHNlYXJjaGVkVGV4dCB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTZWxlY3RPcHRpb24odmFsdWU6IGFueSkge1xyXG4gICAgY29uc3Qgb3B0aW9uTmFtZSA9IHRoaXMuZGF0YS5PcHRpb25OYW1lIHx8IHRoaXMuaXRlbURhdGFGaWVsZDtcclxuICAgIHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zID0gT2JqZWN0LmFzc2lnbihbXSwgdmFsdWUpO1xyXG4gICAgdGhpcy5ncm91cC56RGF0YVtvcHRpb25OYW1lLnNsaWNlKDEyKV0gPSB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb2N1cygpIHtcclxuICAgIGlmICh0aGlzLmNvbWJvYm94Q29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMuY29tYm9ib3hDb21wb25lbnQuZm9jdXMoKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tdWx0aXNlbGVjdCkge1xyXG4gICAgICB0aGlzLm11bHRpc2VsZWN0LmZvY3VzKCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubXVsdGlzZWxlY3R0cmVlKSB7XHJcbiAgICAgIHRoaXMubXVsdGlzZWxlY3R0cmVlLmZvY3VzKCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZHJvcGRvd25saXN0Q29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMuZHJvcGRvd25saXN0Q29tcG9uZW50LmZvY3VzKCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRDb21wb25lbnRUb1VzZSgpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuSW50ZXJuYWxDb21wb25lbnRUeXBlICYmIE9iamVjdC52YWx1ZXMoSW50ZXJuYWxDb21wb25lbnRUeXBlX0Ryb3BEb3duKS5pbmNsdWRlcyh0aGlzLmRhdGEuSW50ZXJuYWxDb21wb25lbnRUeXBlIGFzIGFueSkpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRUeXBlID0gdGhpcy5kYXRhLkludGVybmFsQ29tcG9uZW50VHlwZSBhcyBhbnk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghdGhpcy5kYXRhLk11bHRpcGxlKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50VHlwZSA9IEludGVybmFsQ29tcG9uZW50VHlwZV9Ecm9wRG93bi5jb21ib2JveDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuZGF0YS5NdWx0aXBsZSAmJiAhdGhpcy5kYXRhLkVuYWJsZUNoZWNrYm94KSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50VHlwZSA9IEludGVybmFsQ29tcG9uZW50VHlwZV9Ecm9wRG93bi5tdWx0aXNlbGVjdDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuZGF0YS5NdWx0aXBsZSAmJiB0aGlzLmRhdGEuRW5hYmxlQ2hlY2tib3gpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRUeXBlID0gSW50ZXJuYWxDb21wb25lbnRUeXBlX0Ryb3BEb3duLm11bHRpc2VsZWN0dHJlZTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cInpzZWxlY3RtdWx0aXBsZS1jb250YWluZXIgZTF0YWctc3R5bGVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZVwiPlxyXG4gIDxpb25pYy1zZWxlY3RhYmxlICpuZ0lmPVwiaXNNb2JpbGVTY3JlZW4oKVwiICNzZWxlY3RDb21wb25lbnQgaXRlbS1jb250ZW50IHNlYXJjaEZhaWxUZXh0PVwiTm90aGluZyBmb3VuZCA6KFwiXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyQ29sb3I9XCJwcmltYXJ5XCIgY2xlYXJCdXR0b25UZXh0PVwiQ2xlYXJcIiBbKG5nTW9kZWwpXT1cImdyb3VwLnpNb2RlbFtkYXRhLlZhbHVlXVwiIFtpZF09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiZ2V0SXRlbXNEYXRhKClcIiBbaXRlbVZhbHVlRmllbGRdPVwiaXRlbVZhbHVlRmllbGRcIiBbaXRlbVRleHRGaWVsZF09XCJpdGVtVGV4dEZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2FuQWRkSXRlbV09XCIhIWRhdGEuT25BZGRJdGVtXCIgW2NhbkNsZWFyXT1cInRydWVcIiBbcGxhY2Vob2xkZXJdPVwiZGF0YS5QbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NhblNlYXJjaF09XCIhZGF0YVsnZGlzYWJsZS1zZWFyY2gnXVwiIFtzaG91bGRGb2N1c1NlYXJjaGJhcl09XCIhZGF0YVsnZGlzYWJsZS1zZWFyY2gnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2hhc0luZmluaXRlU2Nyb2xsXT1cIiEhZGF0YS5IYXNJbmZpbml0ZVNjcm9sbFwiIFtpc011bHRpcGxlXT1cImRhdGEuTXVsdGlwbGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpc0VuYWJsZWRdPVwiISghIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3VsZFN0b3JlSXRlbVZhbHVlXT1cInRydWVcIiAob25TZWFyY2gpPVwib25TZWFyY2goJGV2ZW50KVwiIChvbkluZmluaXRlU2Nyb2xsKT1cImdldEluZmluaXRlRGF0YSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAob25BZGRJdGVtKT1cIm9uQWRkSXRlbSgkZXZlbnQpXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlX21vYmlsZSgkZXZlbnQpXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxXCIgY2xhc3M9XCJlMXRhZy1zdHlsZTFcIj5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgaW9uaWNTZWxlY3RhYmxlSXRlbUljb25UZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtaXNJdGVtU2VsZWN0ZWQ9XCJpc0l0ZW1TZWxlY3RlZFwiPlxyXG4gICAgICA8ZmEtaWNvbiBzbG90PVwic3RhcnRcIiBjbGFzcz1cImlzSXRlbVNlbGVjdGVkIGUxdGFnLXN0eWxlMlwiIHNpemU9XCJzbVwiIFtpY29uXT1cIlsnZmFyJywgaXNJdGVtU2VsZWN0ZWQgPyAnY2hlY2stY2lyY2xlJzogJ2NpcmNsZSddXCJcclxuICAgICAgICAgICAgICAgW3N0eWxlc109XCJ7J2NvbG9yJzogaXNJdGVtU2VsZWN0ZWQgPyAnZG9kZ2VyQmx1ZScgOiAnbGlnaHRHcmF5J31cIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTJcIj48L2ZhLWljb24+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBpb25pY1NlbGVjdGFibGVDbG9zZUJ1dHRvblRlbXBsYXRlPlxyXG4gICAgICA8IS0tIDxpb24taWNvbiBuYW1lPVwiY2xvc2UtY2lyY2xlXCI+PC9pb24taWNvbj4gLS0+XHJcbiAgICAgIDxmYS1pY29uIFtpY29uXT1cIid0aW1lcy1jaXJjbGUnXCIgc2l6ZT1cIm1kXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUzXCIgY2xhc3M9XCJlMXRhZy1zdHlsZTNcIj48L2ZhLWljb24+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBpb25pY1NlbGVjdGFibGVUaXRsZVRlbXBsYXRlPlxyXG4gICAgICA8c3BhbiBjbGFzcz1lMXRhZy1zdHlsZTQgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU0XCI+e3tkYXRhLkxhYmVsfX08L3NwYW4+XHJcbiAgICAgIDxpb24tdGV4dCAqbmdJZj1cImdldElzUmVxdWlyZWRWYWx1ZSgpXCIgY29sb3I9XCJkYW5nZXJcIj4qPC9pb24tdGV4dD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIGlvbmljU2VsZWN0YWJsZUl0ZW1UZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJlMXRhZy1zdHlsZTVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTVcIj57eyBnZXRJdGVtVGVtcGxhdGUoaXRlbSwgZGF0YSwgZ3JvdXAsIGl0ZW1WYWx1ZUZpZWxkLCBpdGVtVGV4dEZpZWxkKSB9fTwvc3Bhbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9pb25pYy1zZWxlY3RhYmxlPlxyXG4gIDxrZW5kby1jb21ib2JveCAqbmdJZj1cIiFpc01vYmlsZVNjcmVlbigpICYmIGNvbXBvbmVudFR5cGUgPT0gJ2NvbWJvYm94J1wiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZmllbGQgZTF0YWctc3R5bGUxXCJcclxuICAgICAgICAgICAgICAgICAgI2NvbWJvYm94Q29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImdldEl0ZW1zRGF0YSgpIHwgenNlbGVjdFRyYW5zbGF0aW9uUGFyc2VyIDogaXRlbVRleHRGaWVsZCA6IGRhdGEgOiBncm91cCB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbHVlRmllbGRdPVwiaXRlbVZhbHVlRmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICBbdGV4dEZpZWxkXT1cIml0ZW1UZXh0RmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVQcmltaXRpdmVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkYXRhLlBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgW2FsbG93Q3VzdG9tXT1cImFsbG93Q3VzdG9tVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICBba2VuZG9Ecm9wRG93bkZpbHRlcl09XCJmaWx0ZXJTZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAgIFtzdWdnZXN0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBbZmlsdGVyYWJsZV09XCJkYXRhLkZpbHRlcmFibGUgPT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBbb3Blbk9uRm9jdXNdPVwiZGlzYWJsZU9wZW5PbkZvY3VzKGNvbWJvYm94Q29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZGF0YS5DbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImlzTG9hZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZV9kZXNrdG9wKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAoZmlsdGVyQ2hhbmdlKT1cImhhbmRsZUZpbHRlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgW3ZpcnR1YWxdPVwiZGF0YS5Jc0VuYWJsZVZpcnR1YWxpemF0aW9uID09IHRydWUgPyB2aXJ0dWFsIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgIChvcGVuKT1cImhhbmRsZU9wZW4oKVwiXHJcbiAgICAgICAgICAgICAgICAgIChjbG9zZSk9XCJoYW5kbGVDbG9zZSgpXCJcclxuICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiaGFuZGxlQmx1cigpXCJcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxXCJcclxuICAgICAgICAgICAgICAgICAgW2NsZWFyQnV0dG9uXT1cImRhdGEuQ2xlYXJCdXR0b24gPT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0NvbWJvQm94SXRlbVRlbXBsYXRlIGxldC1kYXRhSXRlbT5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJlMXRhZy1zdHlsZTVcIiBbY2xhc3MuenNlbGVjdC12aXJ0dWFsaXphdGlvbl09XCJkYXRhLklzRW5hYmxlVmlydHVhbGl6YXRpb25cIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTVcIj57eyBnZXRJdGVtVGVtcGxhdGUoZGF0YUl0ZW0sIGRhdGEsIGdyb3VwLCBpdGVtVmFsdWVGaWVsZCwgaXRlbVRleHRGaWVsZCkgfX08L3NwYW4+XHJcbiAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJ0ZW1wbGF0ZVwiPnt7IGRhdGFJdGVtLnZhbHVlIH19PC9zcGFuPiB7eyBkYXRhSXRlbS50ZXh0IH19IC0tPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2tlbmRvLWNvbWJvYm94PlxyXG4gIDxrZW5kby1tdWx0aXNlbGVjdCAqbmdJZj1cIiFpc01vYmlsZVNjcmVlbigpICYmIGNvbXBvbmVudFR5cGUgPT0gJ211bHRpc2VsZWN0J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZmllbGQgZTF0YWctc3R5bGUxXCJcclxuICAgICAgICAgICAgICAgICAgICAgI211bHRpc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImdldEl0ZW1zRGF0YSgpIHwgenNlbGVjdFRyYW5zbGF0aW9uUGFyc2VyIDogaXRlbVRleHRGaWVsZCA6IGRhdGEgOiBncm91cCB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlRmllbGRdPVwiaXRlbVZhbHVlRmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbdGV4dEZpZWxkXT1cIml0ZW1UZXh0RmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbdmFsdWVQcmltaXRpdmVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkYXRhLlBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2FsbG93Q3VzdG9tXT1cImFsbG93Q3VzdG9tVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbZmlsdGVyYWJsZV09XCJkYXRhLkZpbHRlcmFibGUgPT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbY2hlY2tib3hlc109XCJkYXRhLkVuYWJsZUNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2F1dG9DbG9zZV09XCJhdXRvQ2xvc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICBba2VuZG9Ecm9wRG93bkZpbHRlcl09XCJmaWx0ZXJTZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZGF0YS5DbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZV9kZXNrdG9wKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAoZmlsdGVyQ2hhbmdlKT1cImhhbmRsZUZpbHRlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgKG9wZW4pPVwiaGFuZGxlT3BlbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgKGNsb3NlKT1cImhhbmRsZUNsb3NlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJoYW5kbGVCbHVyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbY2xlYXJCdXR0b25dPVwiZGF0YS5DbGVhckJ1dHRvbiA9PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZVwiPlxyXG4gICAgPG5nLXRlbXBsYXRlIGtlbmRvTXVsdGlTZWxlY3RJdGVtVGVtcGxhdGUgbGV0LWRhdGFJdGVtPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImUxdGFnLXN0eWxlNVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlNVwiPnt7IGdldEl0ZW1UZW1wbGF0ZShkYXRhSXRlbSwgZGF0YSwgZ3JvdXAsIGl0ZW1WYWx1ZUZpZWxkLCBpdGVtVGV4dEZpZWxkKSB9fTwvc3Bhbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9rZW5kby1tdWx0aXNlbGVjdD5cclxuICA8a2VuZG8tbXVsdGlzZWxlY3R0cmVlICpuZ0lmPVwiIWlzTW9iaWxlU2NyZWVuKCkgICYmIGNvbXBvbmVudFR5cGUgPT0gJ211bHRpc2VsZWN0dHJlZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1maWVsZCBlMXRhZy1zdHlsZTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgI211bHRpc2VsZWN0dHJlZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAga2VuZG9NdWx0aVNlbGVjdFRyZWVFeHBhbmRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGF0YS5QbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBba2VuZG9NdWx0aVNlbGVjdFRyZWVIaWVyYXJjaHlCaW5kaW5nXT1cImdldEl0ZW1zRGF0YSgpIHwgenNlbGVjdFRyYW5zbGF0aW9uUGFyc2VyIDogaXRlbVRleHRGaWVsZCA6IGRhdGEgOiBncm91cCB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuRmllbGQ9XCJWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaGFzQ2hpbGRyZW5dPVwiaGFzQ2hpbGRyZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGaWVsZF09XCJpdGVtVGV4dEZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZUZpZWxkXT1cIml0ZW1WYWx1ZUZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVByaW1pdGl2ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZV9kZXNrdG9wKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFJdGVtc109XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImlzTG9hZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Nsb3NlXT1cImF1dG9DbG9zZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZXhwYW5kT25GaWx0ZXJdPVwiZmlsdGVyRXhwYW5kU2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcmFibGVdPVwiZGF0YS5GaWx0ZXJhYmxlID09IGZhbHNlID8gZmFsc2UgOiB0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIChmaWx0ZXJDaGFuZ2UpPVwiaGFuZGxlTXVsdGlTZWxlY3RUcmVlRmlsdGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImRhdGEuQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKG9wZW4pPVwiaGFuZGxlT3BlbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIChjbG9zZSk9XCJoYW5kbGVDbG9zZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cImhhbmRsZUJsdXIoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2NsZWFyQnV0dG9uXT1cImRhdGEuQ2xlYXJCdXR0b24gPT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBrZW5kb011bHRpU2VsZWN0VHJlZU5vRGF0YVRlbXBsYXRlPlxyXG4gICAgICA8aDQ+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWljb24gay1pLXdhcm5pbmdcIj48L3NwYW4+PGJyIC8+PGJyIC8+XHJcbiAgICAgICAgTm8gcmVjb3JkIGZvdW5kLlxyXG4gICAgICA8L2g0PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2tlbmRvLW11bHRpc2VsZWN0dHJlZT5cclxuICA8a2VuZG8tZHJvcGRvd25saXN0ICAqbmdJZj1cIiFpc01vYmlsZVNjcmVlbigpICAmJiBjb21wb25lbnRUeXBlID09ICdkcm9wZG93bmxpc3QnXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1maWVsZCBlMXRhZy1zdHlsZTFcIlxyXG4gICAgICAgICAgICAgICAgICAjZHJvcGRvd25saXN0Q29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImdldEl0ZW1zRGF0YSgpIHwgenNlbGVjdFRyYW5zbGF0aW9uUGFyc2VyIDogaXRlbVRleHRGaWVsZCA6IGRhdGEgOiBncm91cCB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbHVlRmllbGRdPVwiaXRlbVZhbHVlRmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICBbdGV4dEZpZWxkXT1cIml0ZW1UZXh0RmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVQcmltaXRpdmVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkYXRhLlBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgW2FsbG93Q3VzdG9tXT1cImFsbG93Q3VzdG9tVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICBba2VuZG9Ecm9wRG93bkZpbHRlcl09XCJmaWx0ZXJTZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAgIFtzdWdnZXN0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBbZmlsdGVyYWJsZV09XCJkYXRhLkZpbHRlcmFibGUgPT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBbb3Blbk9uRm9jdXNdPVwiZGlzYWJsZU9wZW5PbkZvY3VzKGNvbWJvYm94Q29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZGF0YS5DbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImlzTG9hZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZV9kZXNrdG9wKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAoZmlsdGVyQ2hhbmdlKT1cImhhbmRsZUZpbHRlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgW3ZpcnR1YWxdPVwiZGF0YS5Jc0VuYWJsZVZpcnR1YWxpemF0aW9uID09IHRydWUgPyB2aXJ0dWFsIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgIChvcGVuKT1cImhhbmRsZU9wZW4oKVwiXHJcbiAgICAgICAgICAgICAgICAgIChjbG9zZSk9XCJoYW5kbGVDbG9zZSgpXCJcclxuICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiaGFuZGxlQmx1cigpXCJcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxXCJcclxuICAgICAgICAgICAgICAgICAgW2NsZWFyQnV0dG9uXT1cImRhdGEuQ2xlYXJCdXR0b24gPT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0Ryb3BEb3duTGlzdEl0ZW1UZW1wbGF0ZSBsZXQtZGF0YUl0ZW0+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZTF0YWctc3R5bGU1XCIgW2NsYXNzLnpzZWxlY3QtdmlydHVhbGl6YXRpb25dPVwiZGF0YS5Jc0VuYWJsZVZpcnR1YWxpemF0aW9uXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU1XCI+e3sgZ2V0SXRlbVRlbXBsYXRlKGRhdGFJdGVtLCBkYXRhLCBncm91cCwgaXRlbVZhbHVlRmllbGQsIGl0ZW1UZXh0RmllbGQpIH19PC9zcGFuPlxyXG4gICAgICA8IS0tIDxzcGFuIGNsYXNzPVwidGVtcGxhdGVcIj57eyBkYXRhSXRlbS52YWx1ZSB9fTwvc3Bhbj4ge3sgZGF0YUl0ZW0udGV4dCB9fSAtLT5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9rZW5kby1kcm9wZG93bmxpc3Q+XHJcbjwvZGl2PlxyXG4iXX0=
|