@libs-ui/components-list 0.2.252 → 0.2.254
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.
|
@@ -233,7 +233,7 @@ export class LibsUiComponentsListGroupComponent extends LibsUiComponentsListTemp
|
|
|
233
233
|
});
|
|
234
234
|
this.recursivelyCheckedParentByTree(item().parentItem);
|
|
235
235
|
if (!configTemplateGroup.ignoreChooseParentThenAutoChooseChildren && !isCheckedByDefaultKey) {
|
|
236
|
-
this.setCheckCheckedItemsChild(itemsOfGroup());
|
|
236
|
+
this.setCheckCheckedItemsChild(itemsOfGroup?.() || []);
|
|
237
237
|
}
|
|
238
238
|
this.setKeysCheckedByMappingChecked(isClickManual, item);
|
|
239
239
|
return;
|
|
@@ -494,7 +494,7 @@ export class LibsUiComponentsListGroupComponent extends LibsUiComponentsListTemp
|
|
|
494
494
|
const itemGroup = item()[configTemplateGroup.fieldGetItems];
|
|
495
495
|
itemMap.update(current => {
|
|
496
496
|
const children = current[configTemplateGroup.fieldGetItems];
|
|
497
|
-
const data = this.filterItemsDisplay(this.convertDataByGroupInItem(itemGroup(), itemMap));
|
|
497
|
+
const data = this.filterItemsDisplay(this.convertDataByGroupInItem(itemGroup?.() || [], itemMap));
|
|
498
498
|
children.set(data);
|
|
499
499
|
if (current[configTemplateGroup.fieldGetItems]?.()) {
|
|
500
500
|
current[configTemplateGroup.fieldGetItems].update((itemFields) => {
|
|
@@ -673,7 +673,7 @@ export class LibsUiComponentsListGroupComponent extends LibsUiComponentsListTemp
|
|
|
673
673
|
const itemsDisplay = items.filter(item => item().hasDisplay);
|
|
674
674
|
itemsDisplay.forEach(item => {
|
|
675
675
|
const itemGroup = item()[configTemplateGroup.fieldGetItems];
|
|
676
|
-
item()[configTemplateGroup.fieldGetItems]?.set(this.filterItemsDisplay(itemGroup()));
|
|
676
|
+
item()[configTemplateGroup.fieldGetItems]?.set(this.filterItemsDisplay(itemGroup?.() || []));
|
|
677
677
|
});
|
|
678
678
|
return itemsDisplay;
|
|
679
679
|
}
|
|
@@ -760,7 +760,7 @@ export class LibsUiComponentsListGroupComponent extends LibsUiComponentsListTemp
|
|
|
760
760
|
return labelSearch ?? item().fieldLabel;
|
|
761
761
|
}
|
|
762
762
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsListGroupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
763
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsListGroupComponent, isStandalone: true, selector: "libs_ui-components-list-templates_group", usesInheritance: true, ngImport: i0, template: "@if (configTemplateGroup(); as configTemplateGroup) {\n @let varHtmlHeightViewPort = heightViewPort() ? heightViewPort()+'px':'100%';\n @let varHtmlDisable = loading() || disable() || false;\n <div class=\"libs-ui-list-group overflow-[hidden]\"\n [style.height]=\"varHtmlHeightViewPort\">\n <div class=\"flex flex-col w-full h-full relative min-h-[28px]\">\n @if (items().length && configTemplateGroup.configButtonSelectAndUndSelectItem?.(); as configButtonSelectItem) {\n <div\n [class]=\"'flex items-center bg-[#ffffff] '+(configButtonSelectItem.classInclude ?? 'libs-ui-border-bottom-general')\">\n <libs_ui-components-buttons-button\n [type]=\"configButtonSelectItem.buttonCheckAll?.type ?? 'button-link-primary'\"\n [label]=\"configButtonSelectItem.buttonCheckAll?.label ?? 'i18n_select_all_searched_results'\"\n [classInclude]=\"configButtonSelectItem.buttonCheckAll?.classInclude || 'pr-[8px]'\"\n [classLabel]=\"configButtonSelectItem.buttonCheckAll?.classLabel || 'libs-ui-font-h6r'\"\n [disable]=\"varHtmlDisable\"\n (outClick)=\"handlerCheckedOrUnCheckedAll(true)\" />\n <div class=\"text-[#999999]\">|</div>\n <libs_ui-components-buttons-button\n [type]=\"configButtonSelectItem.buttonUncheckAll?.type ?? 'button-link-primary'\"\n [label]=\"configButtonSelectItem.buttonUncheckAll?.label ?? 'i18n_unselect_all_searched_results'\"\n [classInclude]=\"configButtonSelectItem.buttonUncheckAll?.classInclude || 'pl-[8px]'\"\n [classLabel]=\"configButtonSelectItem.buttonUncheckAll?.classLabel || 'libs-ui-font-h6s'\"\n [disable]=\"varHtmlDisable\"\n (outClick)=\"handlerCheckedOrUnCheckedAll(false)\" />\n </div>\n }\n @if (items().length && configTemplateGroup.configCheckboxCheckAll?.(); as configCheckBox) {\n <div\n [class]=\"'flex libs-ui-border-bottom-general '+(configTemplateGroup.classIncludeHasConfigCheckBoxAll ?? ' bg-[#ffffff]')\">\n <libs_ui-components-checkbox-single [label]=\"configCheckBox.label ?? 'i18n_all'\"\n [classLabelInclude]=\"configCheckBox.classLabelInclude || ''\"\n [checked]=\"totalItemChecked() >= totalItem() && totalItem() > 0\"\n [disable]=\"varHtmlDisable\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outChange)=\"handlerCheckedOrUnCheckedAll($event.checked)\" />\n </div>\n }\n @if (items() && items().length) {\n <div class=\"w-full h-full relative flex\">\n <div LibsUiComponentsScrollOverlayDirective\n class=\"w-full h-full absolute top-0 left-0 {{ configTemplateGroup.classIncludeGroup ? configTemplateGroup.classIncludeGroup : '' }}\">\n @for (item of items(); track item()[fieldKey()]; let first = $first; let last = $last) {\n <div #itemRef\n [style.marginTop.px]=\"!configTemplateGroup.ignoreGroupLine ? configTemplateGroup.marginTopHasLine || 4 : 0\"\n class=\"flex flex-col relative \">\n @let varHtmlPadding = level()*(configTemplateGroup.isViewTree ? 8 : 16);\n <div class=\"flex items-center py-[6px] \"\n [class.libs-ui-bg-list-hover]=\"!configTemplateGroup.ignoreClickLabelGroup\"\n [class.libs-ui-bg-list-hover-active]=\"!configTemplateGroup.ignoreClickLabelGroup\"\n [class.!cursor-pointer]=\"!configTemplateGroup.ignoreClickLabelGroup && (configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem)\"\n [style.paddingLeft.px]=\"varHtmlPadding\"\n [style.paddingRight.px]=\"varHtmlPadding\"\n (click)=\"(configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem) ? handlerToggleExpand($event,item) : undefined\">\n @if (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree) {\n <i class=\"cursor-pointer libs-ui-icon-chevron-right\"\n [class.rotate-90]=\"item().expand\"\n (click)=\"handlerToggleExpand($event,item)\">\n </i>\n }\n <div class=\"flex\"\n [class.w-full]=\"configTemplateGroup.iconExpand === 'right' && !configTemplateGroup.isViewTree && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)\"\n [class.w-[calc(100%-16px)]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\">\n @if (!configTemplateGroup.isViewRadio) {\n <libs_ui-components-checkbox-single [avatarConfig]=\"item().avatarConfig\"\n [class.ml-[8px]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\"\n [ignoreCheckbox]=\"configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem\"\n [class]=\"configTemplateGroup.classIncludeItem || ''\"\n [class.w-auto]=\"configTemplateGroup.isViewTree\"\n [class.w-full]=\"!item()[configTemplateGroup.fieldGetItems]?.()?.length && !((configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)))\"\n [class.max-w-[calc(100%-24px)]]=\"(configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length))\"\n [label]=\"item().fieldLabel\"\n [popover]=\"item().dataPopover\"\n [zIndexLabel]=\"configTemplateGroup.zIndexLabel ?? zIndex()\"\n [dataComponentOutlet]=\"(undefined | LibsUiPipesCallFunctionInTemplatePipe:configTemplateGroup.getDataComponentOutletGroup:item():fieldKey():{valueIsEmpty:{item:item()}}) | async\"\n [componentOutlet]=\"(0 | LibsUiPipesCallFunctionInTemplatePipe:configTemplateGroup.getComponentOutletGroup:item():fieldKey():{valueIs0:0}) | async\"\n [linkImage]=\"configTemplateGroup.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateGroup.getLinkImageError ? configTemplateGroup.getLinkImageError : configTemplateGroup.getImage):item()) | async) : item()[configTemplateGroup.fieldGetAvatarItem || '']\"\n [imgTypeIcon]=\"configTemplateGroup.imgTypeIcon\"\n [classLabelInclude]=\"(configTemplateGroup.classLabelItem ? configTemplateGroup.classLabelItem : (configTemplateGroup.isViewTree ? ' libs-ui-font-h6r ':' libs-ui-font-h6s ')) + ((configTemplateGroup.ignoreTextUppercaseLabelGroup || configTemplateGroup.isViewTree) ? '':' text-uppercase ')\"\n [disable]=\"disable() || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length)\"\n [checked]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysChecked():keysChecked().length\"\n [stillOtherOptions]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysStillOtherOptions():keysStillOtherOptions().length\"\n (outChange)=\"handlerChangeChecked($event.checked,item, true)\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outClickLabel)=\"handlerToggleExpand('clickLabel',item,configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem)\" />\n }\n\n @if (configTemplateGroup.isViewRadio) {\n <libs_ui-components-radio-single\n [class.ml-[8px]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\"\n [avatarConfig]=\"item().avatarConfig\"\n [ignoreRadio]=\"configTemplateGroup.ignoreRadioGroup || configTemplateGroup.singleSelectItem\"\n [class]=\"configTemplateGroup.classIncludeItem || ''\"\n [class.w-auto]=\"configTemplateGroup.isViewTree\"\n [class.w-full]=\"!item()[configTemplateGroup.fieldGetItems]?.()?.length && !((configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)))\"\n [class.max-w-[calc(100%-24px)]]=\"(configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length))\"\n [label]=\"item().fieldLabel\"\n [popover]=\"item().dataPopover\"\n [dataComponentOutlet]=\"(undefined | LibsUiPipesCallFunctionInTemplatePipe:configTemplateGroup.getDataComponentOutletGroup:item():fieldKey():{valueIsEmpty:{item:item()}}) | async\"\n [componentOutlet]=\"(0 | LibsUiPipesCallFunctionInTemplatePipe:configTemplateGroup.getComponentOutletGroup:item():fieldKey():{valueIs0:0}) | async\"\n [zIndexLabel]=\"configTemplateGroup.zIndexLabel ?? zIndex()\"\n [imgTypeIcon]=\"configTemplateGroup.imgTypeIcon\"\n [linkImage]=\"configTemplateGroup.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateGroup.getLinkImageError ? configTemplateGroup.getLinkImageError : configTemplateGroup.getImage):item()) | async) : item()[configTemplateGroup.fieldGetAvatarItem || '']\"\n [classLabelInclude]=\"(configTemplateGroup.classLabelItem ? configTemplateGroup.classLabelItem : 'libs-ui-font-h6s ') + (configTemplateGroup.ignoreTextUppercaseLabelGroup ? '':' uppercase')\"\n [disable]=\"disable() || (configTemplateGroup.disableItemNotLastLevel && !!item()[configTemplateGroup.fieldGetItems]?.()?.length) || configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length)\"\n [active]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysChecked():keysChecked().length\"\n (outChange)=\"handlerChangeChecked($event.active,item, true)\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outClickLabel)=\"handlerToggleExpand('clickLabel',item,configTemplateGroup.ignoreRadioGroup || configTemplateGroup.singleSelectItem)\" />\n }\n\n @if (item().buttonInGroup; as buttonInGroup) {\n <libs_ui-components-buttons-button [type]=\"buttonInGroup.type || 'button-link-primary'\"\n [label]=\"buttonInGroup.label || ' '\"\n [classIconLeft]=\"(buttonInGroup.classIconLeft || '')+' flex mr-[8px] !text-[8px]'\"\n [classInclude]=\"buttonInGroup.classInclude\"\n [classLabel]=\"buttonInGroup.classLabel || 'libs-ui-font-h5r'\"\n [disable]=\"buttonInGroup.disable || disable() || false\"\n (outClick)=\"handlerClickButtonGroup(buttonInGroup,item())\" />\n }\n </div>\n\n @if (configTemplateGroup.iconExpand === 'right' && !configTemplateGroup.isViewTree && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)) {\n <i class=\"flex items-center cursor-pointer libs-ui-icon-chevron-right\"\n [class.!ml-[8px]]=\"item().dataPopover\"\n [class.rotate-90]=\"item().expand\"\n (click)=\"handlerToggleExpand($event,item)\">\n </i>\n }\n </div>\n @if (item().expand && calculatorHeighItemSuccess()) {\n <libs_ui-components-list-templates_group-item [keySearch]=\"keySearch()\"\n [items]=\"item()[configTemplateGroup.fieldGetItems]()\"\n [parentItem]=\"item()\"\n [fieldKey]=\"fieldKey()\"\n [keysChecked]=\"keysChecked()\"\n [disable]=\"disable()\"\n [keysDisableItem]=\"keysDisableItem() || []\"\n [configTemplateGroup]=\"configTemplateGroup\"\n [config]=\"config()\"\n [keysStillOtherOptions]=\"keysStillOtherOptions()\"\n (outChangeView)=\"handlerChangeView()\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outChange)=\"handlerChangeItemChecked($event.item)\" />\n }\n @if (!last && !configTemplateGroup.ignoreGroupLine && calculatorHeighItemSuccess()) {\n <div class=\"libs-ui-list-group-line\"\n [style.marginTop.px]=\"!configTemplateGroup.ignoreGroupLine ? configTemplateGroup.marginTopHasLine || 4 : 0\">\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n @if (!items() || !items().length) {\n <div\n class=\"libs-ui-font-h5r text-[#c1c1c1] relative {{ configTemplateGroup.classIncludeNodata?configTemplateGroup.classIncludeNodata:'' }}\"\n [style.marginLeft.px]=\"0 | LibsUiComponentsListGroupCalculatorMarginLeftItemPipe:2:(configTemplateGroup.isViewTree || configTemplateGroup.iconExpand === 'left'):configTemplateGroup.isViewTreeJson:!(configTemplateGroup.ignoreCheckboxItem || configTemplateGroup.ignoreRadioItem || configTemplateGroup.singleSelectItem):true\"\n [class.py-[8px]]=\"configTemplateGroup.fieldGetAvatarItem\"\n [class.py-[4px]]=\"!configTemplateGroup.fieldGetAvatarItem\">\n @if (!keySearch() && !loading()) {\n <div>{{ (config()?.textNoData ?? 'i18n_no_data_yet') | translate }}</div>\n }\n @if (keySearch() && !loading()) {\n <div>{{ (config()?.textSearchNoData ??'i18n_no_result') | translate }}</div>\n }\n </div>\n }\n @if (loading()) {\n <libs_ui-components-spinner [size]=\"'medium'\" />\n }\n </div>\n </div>\n}\n", styles: [".libs-ui-list-group{display:flex;flex-direction:column;width:100%}.libs-ui-list-group .libs-ui-list-group-line{width:100%;height:1px;background-color:#e6e7ea}.libs-ui-list-group [class*=libs-ui-icon-chevron]:before{color:#6a7383}\n"], dependencies: [{ kind: "ngmodule", type: VirtualScrollerModule }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsCheckboxSingleComponent, selector: "libs_ui-components-checkbox-single", inputs: ["key", "checked", "label", "classLabelInclude", "ignoreShowPopoverLabel", "typeLabelPopover", "popover", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "classInclude", "clickExactly", "disable", "disableLabel", "ignoreCheckbox", "zIndexLabel", "stillOtherOptions", "error", "showBorderError", "description", "iconImageClass", "classIconInclude", "modeBorder", "dataComponentOutlet", "componentOutlet"], outputs: ["checkedChange", "linkImageChange", "outChange", "outEventPopover", "outClickLabel", "outChangStageFlagMousePopover"] }, { kind: "component", type: LibsUiComponentsRadioSingleComponent, selector: "libs_ui-components-radio-single", inputs: ["key", "active", "classInclude", "label", "labelInterpolateParams", "ignorePopoverLabel", "classLabelInclude", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "popover", "disable", "disableLabel", "clickExactly", "typeRadio", "ignoreRadio", "zIndexLabel", "classIncludeIcon", "dataComponentOutlet", "componentOutlet"], outputs: ["activeChange", "outClickLabel", "outChange", "outChangStageFlagMousePopover"] }, { kind: "component", type: LibsUiComponentsSpinnerComponent, selector: "libs_ui-components-spinner", inputs: ["type", "size"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "pipe", type: LibsUiCheckSelectedByKeyPipe, name: "LibsUiCheckSelectedByKeyPipe" }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiComponentsListGroupCalculatorMarginLeftItemPipe, name: "LibsUiComponentsListGroupCalculatorMarginLeftItemPipe" }, { kind: "component", type: LibsUiComponentsListGroupItemComponent, selector: "libs_ui-components-list-templates_group-item", inputs: ["items", "configTemplateGroup", "keySearch", "fieldKey", "keysChecked", "keysDisableItem", "parentItem", "disable", "disableLabel", "config", "keysStillOtherOptions"], outputs: ["outChangeView", "outChange", "outChangStageFlagMousePopover"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
763
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsListGroupComponent, isStandalone: true, selector: "libs_ui-components-list-templates_group", usesInheritance: true, ngImport: i0, template: "@if (configTemplateGroup(); as configTemplateGroup) {\n @let varHtmlHeightViewPort = heightViewPort() ? heightViewPort()+'px':'100%';\n @let varHtmlDisable = loading() || disable() || false;\n <div class=\"libs-ui-list-group overflow-[hidden]\"\n [style.height]=\"varHtmlHeightViewPort\">\n <div class=\"flex flex-col w-full h-full relative min-h-[28px]\">\n @if (items().length && configTemplateGroup.configButtonSelectAndUndSelectItem?.(); as configButtonSelectItem) {\n <div\n [class]=\"'flex items-center bg-[#ffffff] '+(configButtonSelectItem.classInclude ?? 'libs-ui-border-bottom-general')\">\n <libs_ui-components-buttons-button\n [type]=\"configButtonSelectItem.buttonCheckAll?.type ?? 'button-link-primary'\"\n [label]=\"configButtonSelectItem.buttonCheckAll?.label ?? 'i18n_select_all_searched_results'\"\n [classInclude]=\"configButtonSelectItem.buttonCheckAll?.classInclude || 'pr-[8px]'\"\n [classLabel]=\"configButtonSelectItem.buttonCheckAll?.classLabel || 'libs-ui-font-h6r'\"\n [disable]=\"varHtmlDisable\"\n (outClick)=\"handlerCheckedOrUnCheckedAll(true)\" />\n <div class=\"text-[#999999]\">|</div>\n <libs_ui-components-buttons-button\n [type]=\"configButtonSelectItem.buttonUncheckAll?.type ?? 'button-link-primary'\"\n [label]=\"configButtonSelectItem.buttonUncheckAll?.label ?? 'i18n_unselect_all_searched_results'\"\n [classInclude]=\"configButtonSelectItem.buttonUncheckAll?.classInclude || 'pl-[8px]'\"\n [classLabel]=\"configButtonSelectItem.buttonUncheckAll?.classLabel || 'libs-ui-font-h6s'\"\n [disable]=\"varHtmlDisable\"\n (outClick)=\"handlerCheckedOrUnCheckedAll(false)\" />\n </div>\n }\n @if (items().length && configTemplateGroup.configCheckboxCheckAll?.(); as configCheckBox) {\n <div\n [class]=\"'flex libs-ui-border-bottom-general '+(configTemplateGroup.classIncludeHasConfigCheckBoxAll ?? ' bg-[#ffffff]')\">\n <libs_ui-components-checkbox-single [label]=\"configCheckBox.label ?? 'i18n_all'\"\n [classLabelInclude]=\"configCheckBox.classLabelInclude || ''\"\n [checked]=\"totalItemChecked() >= totalItem() && totalItem() > 0\"\n [disable]=\"varHtmlDisable\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outChange)=\"handlerCheckedOrUnCheckedAll($event.checked)\" />\n </div>\n }\n @if (items() && items().length) {\n <div class=\"w-full h-full relative flex\">\n <div LibsUiComponentsScrollOverlayDirective\n class=\"w-full h-full absolute top-0 left-0 {{ configTemplateGroup.classIncludeGroup ? configTemplateGroup.classIncludeGroup : '' }}\">\n @for (item of items(); track item()[fieldKey()]; let first = $first; let last = $last) {\n <div #itemRef\n [style.marginTop.px]=\"!configTemplateGroup.ignoreGroupLine ? configTemplateGroup.marginTopHasLine || 4 : 0\"\n class=\"flex flex-col relative \">\n @let varHtmlPadding = level()*(configTemplateGroup.isViewTree ? 8 : 16);\n <div class=\"flex items-center py-[6px] \"\n [class.libs-ui-bg-list-hover]=\"!configTemplateGroup.ignoreClickLabelGroup\"\n [class.libs-ui-bg-list-hover-active]=\"!configTemplateGroup.ignoreClickLabelGroup\"\n [class.!cursor-pointer]=\"!configTemplateGroup.ignoreClickLabelGroup && (configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem)\"\n [style.paddingLeft.px]=\"varHtmlPadding\"\n [style.paddingRight.px]=\"varHtmlPadding\"\n (click)=\"(configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem) ? handlerToggleExpand($event,item) : undefined\">\n @if (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree) {\n <i class=\"cursor-pointer libs-ui-icon-chevron-right before:!text-[16px]\"\n [class.rotate-90]=\"item().expand\"\n (click)=\"handlerToggleExpand($event,item)\">\n </i>\n }\n <div class=\"flex\"\n [class.w-full]=\"configTemplateGroup.iconExpand === 'right' && !configTemplateGroup.isViewTree && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)\"\n [class.w-[calc(100%-16px)]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\">\n @if (!configTemplateGroup.isViewRadio) {\n <libs_ui-components-checkbox-single [avatarConfig]=\"item().avatarConfig\"\n [class.ml-[8px]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\"\n [ignoreCheckbox]=\"configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem\"\n [class]=\"configTemplateGroup.classIncludeItem || ''\"\n [class.w-auto]=\"configTemplateGroup.isViewTree\"\n [class.w-full]=\"!item()[configTemplateGroup.fieldGetItems]?.()?.length && !((configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)))\"\n [class.max-w-[calc(100%-24px)]]=\"(configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length))\"\n [label]=\"item().fieldLabel\"\n [popover]=\"item().dataPopover\"\n [zIndexLabel]=\"configTemplateGroup.zIndexLabel ?? zIndex()\"\n [dataComponentOutlet]=\"(undefined | LibsUiPipesCallFunctionInTemplatePipe:configTemplateGroup.getDataComponentOutletGroup:item():fieldKey():{valueIsEmpty:{item:item()}}) | async\"\n [componentOutlet]=\"(0 | LibsUiPipesCallFunctionInTemplatePipe:configTemplateGroup.getComponentOutletGroup:item():fieldKey():{valueIs0:0}) | async\"\n [linkImage]=\"configTemplateGroup.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateGroup.getLinkImageError ? configTemplateGroup.getLinkImageError : configTemplateGroup.getImage):item()) | async) : item()[configTemplateGroup.fieldGetAvatarItem || '']\"\n [imgTypeIcon]=\"configTemplateGroup.imgTypeIcon\"\n [classLabelInclude]=\"(configTemplateGroup.classLabelItem ? configTemplateGroup.classLabelItem : (configTemplateGroup.isViewTree ? ' libs-ui-font-h6r ':' libs-ui-font-h6s ')) + ((configTemplateGroup.ignoreTextUppercaseLabelGroup || configTemplateGroup.isViewTree) ? '':' text-uppercase ')\"\n [disable]=\"disable() || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length)\"\n [checked]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysChecked():keysChecked().length\"\n [stillOtherOptions]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysStillOtherOptions():keysStillOtherOptions().length\"\n (outChange)=\"handlerChangeChecked($event.checked,item, true)\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outClickLabel)=\"handlerToggleExpand('clickLabel',item,configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem)\" />\n }\n\n @if (configTemplateGroup.isViewRadio) {\n <libs_ui-components-radio-single\n [class.ml-[8px]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\"\n [avatarConfig]=\"item().avatarConfig\"\n [ignoreRadio]=\"configTemplateGroup.ignoreRadioGroup || configTemplateGroup.singleSelectItem\"\n [class]=\"configTemplateGroup.classIncludeItem || ''\"\n [class.w-auto]=\"configTemplateGroup.isViewTree\"\n [class.w-full]=\"!item()[configTemplateGroup.fieldGetItems]?.()?.length && !((configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)))\"\n [class.max-w-[calc(100%-24px)]]=\"(configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length))\"\n [label]=\"item().fieldLabel\"\n [popover]=\"item().dataPopover\"\n [dataComponentOutlet]=\"(undefined | LibsUiPipesCallFunctionInTemplatePipe:configTemplateGroup.getDataComponentOutletGroup:item():fieldKey():{valueIsEmpty:{item:item()}}) | async\"\n [componentOutlet]=\"(0 | LibsUiPipesCallFunctionInTemplatePipe:configTemplateGroup.getComponentOutletGroup:item():fieldKey():{valueIs0:0}) | async\"\n [zIndexLabel]=\"configTemplateGroup.zIndexLabel ?? zIndex()\"\n [imgTypeIcon]=\"configTemplateGroup.imgTypeIcon\"\n [linkImage]=\"configTemplateGroup.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateGroup.getLinkImageError ? configTemplateGroup.getLinkImageError : configTemplateGroup.getImage):item()) | async) : item()[configTemplateGroup.fieldGetAvatarItem || '']\"\n [classLabelInclude]=\"(configTemplateGroup.classLabelItem ? configTemplateGroup.classLabelItem : 'libs-ui-font-h6s ') + (configTemplateGroup.ignoreTextUppercaseLabelGroup ? '':' uppercase')\"\n [disable]=\"disable() || (configTemplateGroup.disableItemNotLastLevel && !!item()[configTemplateGroup.fieldGetItems]?.()?.length) || configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length)\"\n [active]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysChecked():keysChecked().length\"\n (outChange)=\"handlerChangeChecked($event.active,item, true)\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outClickLabel)=\"handlerToggleExpand('clickLabel',item,configTemplateGroup.ignoreRadioGroup || configTemplateGroup.singleSelectItem)\" />\n }\n\n @if (item().buttonInGroup; as buttonInGroup) {\n <libs_ui-components-buttons-button [type]=\"buttonInGroup.type || 'button-link-primary'\"\n [label]=\"buttonInGroup.label || ' '\"\n [classIconLeft]=\"(buttonInGroup.classIconLeft || '')+' flex mr-[8px] !text-[8px]'\"\n [classInclude]=\"buttonInGroup.classInclude\"\n [classLabel]=\"buttonInGroup.classLabel || 'libs-ui-font-h5r'\"\n [disable]=\"buttonInGroup.disable || disable() || false\"\n (outClick)=\"handlerClickButtonGroup(buttonInGroup,item())\" />\n }\n </div>\n\n @if (configTemplateGroup.iconExpand === 'right' && !configTemplateGroup.isViewTree && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)) {\n <i class=\"flex items-center cursor-pointer libs-ui-icon-chevron-right before:!text-[16px]\"\n [class.!ml-[8px]]=\"item().dataPopover\"\n [class.rotate-90]=\"item().expand\"\n (click)=\"handlerToggleExpand($event,item)\">\n </i>\n }\n </div>\n @if (item().expand && calculatorHeighItemSuccess()) {\n <libs_ui-components-list-templates_group-item [keySearch]=\"keySearch()\"\n [items]=\"item()[configTemplateGroup.fieldGetItems]()\"\n [parentItem]=\"item()\"\n [fieldKey]=\"fieldKey()\"\n [keysChecked]=\"keysChecked()\"\n [disable]=\"disable()\"\n [keysDisableItem]=\"keysDisableItem() || []\"\n [configTemplateGroup]=\"configTemplateGroup\"\n [config]=\"config()\"\n [keysStillOtherOptions]=\"keysStillOtherOptions()\"\n (outChangeView)=\"handlerChangeView()\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outChange)=\"handlerChangeItemChecked($event.item)\" />\n }\n @if (!last && !configTemplateGroup.ignoreGroupLine && calculatorHeighItemSuccess()) {\n <div class=\"libs-ui-list-group-line\"\n [style.marginTop.px]=\"!configTemplateGroup.ignoreGroupLine ? configTemplateGroup.marginTopHasLine || 4 : 0\">\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n @if (!items() || !items().length) {\n <div\n class=\"libs-ui-font-h5r text-[#c1c1c1] relative {{ configTemplateGroup.classIncludeNodata?configTemplateGroup.classIncludeNodata:'' }}\"\n [style.marginLeft.px]=\"0 | LibsUiComponentsListGroupCalculatorMarginLeftItemPipe:2:(configTemplateGroup.isViewTree || configTemplateGroup.iconExpand === 'left'):configTemplateGroup.isViewTreeJson:!(configTemplateGroup.ignoreCheckboxItem || configTemplateGroup.ignoreRadioItem || configTemplateGroup.singleSelectItem):true\"\n [class.py-[8px]]=\"configTemplateGroup.fieldGetAvatarItem\"\n [class.py-[4px]]=\"!configTemplateGroup.fieldGetAvatarItem\">\n @if (!keySearch() && !loading()) {\n <div>{{ (config()?.textNoData ?? 'i18n_no_data_yet') | translate }}</div>\n }\n @if (keySearch() && !loading()) {\n <div>{{ (config()?.textSearchNoData ??'i18n_no_result') | translate }}</div>\n }\n </div>\n }\n @if (loading()) {\n <libs_ui-components-spinner [size]=\"'medium'\" />\n }\n </div>\n </div>\n}\n", styles: [".libs-ui-list-group{display:flex;flex-direction:column;width:100%}.libs-ui-list-group .libs-ui-list-group-line{width:100%;height:1px;background-color:#e6e7ea}.libs-ui-list-group [class*=libs-ui-icon-chevron]:before{color:#6a7383}\n"], dependencies: [{ kind: "ngmodule", type: VirtualScrollerModule }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsCheckboxSingleComponent, selector: "libs_ui-components-checkbox-single", inputs: ["key", "checked", "label", "classLabelInclude", "ignoreShowPopoverLabel", "typeLabelPopover", "popover", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "classInclude", "clickExactly", "disable", "disableLabel", "ignoreCheckbox", "zIndexLabel", "stillOtherOptions", "error", "showBorderError", "description", "iconImageClass", "classIconInclude", "modeBorder", "dataComponentOutlet", "componentOutlet"], outputs: ["checkedChange", "linkImageChange", "outChange", "outEventPopover", "outClickLabel", "outChangStageFlagMousePopover"] }, { kind: "component", type: LibsUiComponentsRadioSingleComponent, selector: "libs_ui-components-radio-single", inputs: ["key", "active", "classInclude", "label", "labelInterpolateParams", "ignorePopoverLabel", "classLabelInclude", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "popover", "disable", "disableLabel", "clickExactly", "typeRadio", "ignoreRadio", "zIndexLabel", "classIncludeIcon", "dataComponentOutlet", "componentOutlet"], outputs: ["activeChange", "outClickLabel", "outChange", "outChangStageFlagMousePopover"] }, { kind: "component", type: LibsUiComponentsSpinnerComponent, selector: "libs_ui-components-spinner", inputs: ["type", "size"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "pipe", type: LibsUiCheckSelectedByKeyPipe, name: "LibsUiCheckSelectedByKeyPipe" }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiComponentsListGroupCalculatorMarginLeftItemPipe, name: "LibsUiComponentsListGroupCalculatorMarginLeftItemPipe" }, { kind: "component", type: LibsUiComponentsListGroupItemComponent, selector: "libs_ui-components-list-templates_group-item", inputs: ["items", "configTemplateGroup", "keySearch", "fieldKey", "keysChecked", "keysDisableItem", "parentItem", "disable", "disableLabel", "config", "keysStillOtherOptions"], outputs: ["outChangeView", "outChange", "outChangStageFlagMousePopover"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
764
764
|
}
|
|
765
765
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsListGroupComponent, decorators: [{
|
|
766
766
|
type: Component,
|
|
@@ -775,6 +775,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
775
775
|
LibsUiPipesCallFunctionInTemplatePipe,
|
|
776
776
|
LibsUiComponentsListGroupCalculatorMarginLeftItemPipe,
|
|
777
777
|
LibsUiComponentsListGroupItemComponent
|
|
778
|
-
], template: "@if (configTemplateGroup(); as configTemplateGroup) {\n @let varHtmlHeightViewPort = heightViewPort() ? heightViewPort()+'px':'100%';\n @let varHtmlDisable = loading() || disable() || false;\n <div class=\"libs-ui-list-group overflow-[hidden]\"\n [style.height]=\"varHtmlHeightViewPort\">\n <div class=\"flex flex-col w-full h-full relative min-h-[28px]\">\n @if (items().length && configTemplateGroup.configButtonSelectAndUndSelectItem?.(); as configButtonSelectItem) {\n <div\n [class]=\"'flex items-center bg-[#ffffff] '+(configButtonSelectItem.classInclude ?? 'libs-ui-border-bottom-general')\">\n <libs_ui-components-buttons-button\n [type]=\"configButtonSelectItem.buttonCheckAll?.type ?? 'button-link-primary'\"\n [label]=\"configButtonSelectItem.buttonCheckAll?.label ?? 'i18n_select_all_searched_results'\"\n [classInclude]=\"configButtonSelectItem.buttonCheckAll?.classInclude || 'pr-[8px]'\"\n [classLabel]=\"configButtonSelectItem.buttonCheckAll?.classLabel || 'libs-ui-font-h6r'\"\n [disable]=\"varHtmlDisable\"\n (outClick)=\"handlerCheckedOrUnCheckedAll(true)\" />\n <div class=\"text-[#999999]\">|</div>\n <libs_ui-components-buttons-button\n [type]=\"configButtonSelectItem.buttonUncheckAll?.type ?? 'button-link-primary'\"\n [label]=\"configButtonSelectItem.buttonUncheckAll?.label ?? 'i18n_unselect_all_searched_results'\"\n [classInclude]=\"configButtonSelectItem.buttonUncheckAll?.classInclude || 'pl-[8px]'\"\n [classLabel]=\"configButtonSelectItem.buttonUncheckAll?.classLabel || 'libs-ui-font-h6s'\"\n [disable]=\"varHtmlDisable\"\n (outClick)=\"handlerCheckedOrUnCheckedAll(false)\" />\n </div>\n }\n @if (items().length && configTemplateGroup.configCheckboxCheckAll?.(); as configCheckBox) {\n <div\n [class]=\"'flex libs-ui-border-bottom-general '+(configTemplateGroup.classIncludeHasConfigCheckBoxAll ?? ' bg-[#ffffff]')\">\n <libs_ui-components-checkbox-single [label]=\"configCheckBox.label ?? 'i18n_all'\"\n [classLabelInclude]=\"configCheckBox.classLabelInclude || ''\"\n [checked]=\"totalItemChecked() >= totalItem() && totalItem() > 0\"\n [disable]=\"varHtmlDisable\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outChange)=\"handlerCheckedOrUnCheckedAll($event.checked)\" />\n </div>\n }\n @if (items() && items().length) {\n <div class=\"w-full h-full relative flex\">\n <div LibsUiComponentsScrollOverlayDirective\n class=\"w-full h-full absolute top-0 left-0 {{ configTemplateGroup.classIncludeGroup ? configTemplateGroup.classIncludeGroup : '' }}\">\n @for (item of items(); track item()[fieldKey()]; let first = $first; let last = $last) {\n <div #itemRef\n [style.marginTop.px]=\"!configTemplateGroup.ignoreGroupLine ? configTemplateGroup.marginTopHasLine || 4 : 0\"\n class=\"flex flex-col relative \">\n @let varHtmlPadding = level()*(configTemplateGroup.isViewTree ? 8 : 16);\n <div class=\"flex items-center py-[6px] \"\n [class.libs-ui-bg-list-hover]=\"!configTemplateGroup.ignoreClickLabelGroup\"\n [class.libs-ui-bg-list-hover-active]=\"!configTemplateGroup.ignoreClickLabelGroup\"\n [class.!cursor-pointer]=\"!configTemplateGroup.ignoreClickLabelGroup && (configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem)\"\n [style.paddingLeft.px]=\"varHtmlPadding\"\n [style.paddingRight.px]=\"varHtmlPadding\"\n (click)=\"(configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem) ? handlerToggleExpand($event,item) : undefined\">\n @if (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree) {\n <i class=\"cursor-pointer libs-ui-icon-chevron-right\"\n [class.rotate-90]=\"item().expand\"\n (click)=\"handlerToggleExpand($event,item)\">\n </i>\n }\n <div class=\"flex\"\n [class.w-full]=\"configTemplateGroup.iconExpand === 'right' && !configTemplateGroup.isViewTree && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)\"\n [class.w-[calc(100%-16px)]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\">\n @if (!configTemplateGroup.isViewRadio) {\n <libs_ui-components-checkbox-single [avatarConfig]=\"item().avatarConfig\"\n [class.ml-[8px]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\"\n [ignoreCheckbox]=\"configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem\"\n [class]=\"configTemplateGroup.classIncludeItem || ''\"\n [class.w-auto]=\"configTemplateGroup.isViewTree\"\n [class.w-full]=\"!item()[configTemplateGroup.fieldGetItems]?.()?.length && !((configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)))\"\n [class.max-w-[calc(100%-24px)]]=\"(configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length))\"\n [label]=\"item().fieldLabel\"\n [popover]=\"item().dataPopover\"\n [zIndexLabel]=\"configTemplateGroup.zIndexLabel ?? zIndex()\"\n [dataComponentOutlet]=\"(undefined | LibsUiPipesCallFunctionInTemplatePipe:configTemplateGroup.getDataComponentOutletGroup:item():fieldKey():{valueIsEmpty:{item:item()}}) | async\"\n [componentOutlet]=\"(0 | LibsUiPipesCallFunctionInTemplatePipe:configTemplateGroup.getComponentOutletGroup:item():fieldKey():{valueIs0:0}) | async\"\n [linkImage]=\"configTemplateGroup.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateGroup.getLinkImageError ? configTemplateGroup.getLinkImageError : configTemplateGroup.getImage):item()) | async) : item()[configTemplateGroup.fieldGetAvatarItem || '']\"\n [imgTypeIcon]=\"configTemplateGroup.imgTypeIcon\"\n [classLabelInclude]=\"(configTemplateGroup.classLabelItem ? configTemplateGroup.classLabelItem : (configTemplateGroup.isViewTree ? ' libs-ui-font-h6r ':' libs-ui-font-h6s ')) + ((configTemplateGroup.ignoreTextUppercaseLabelGroup || configTemplateGroup.isViewTree) ? '':' text-uppercase ')\"\n [disable]=\"disable() || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length)\"\n [checked]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysChecked():keysChecked().length\"\n [stillOtherOptions]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysStillOtherOptions():keysStillOtherOptions().length\"\n (outChange)=\"handlerChangeChecked($event.checked,item, true)\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outClickLabel)=\"handlerToggleExpand('clickLabel',item,configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem)\" />\n }\n\n @if (configTemplateGroup.isViewRadio) {\n <libs_ui-components-radio-single\n [class.ml-[8px]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\"\n [avatarConfig]=\"item().avatarConfig\"\n [ignoreRadio]=\"configTemplateGroup.ignoreRadioGroup || configTemplateGroup.singleSelectItem\"\n [class]=\"configTemplateGroup.classIncludeItem || ''\"\n [class.w-auto]=\"configTemplateGroup.isViewTree\"\n [class.w-full]=\"!item()[configTemplateGroup.fieldGetItems]?.()?.length && !((configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)))\"\n [class.max-w-[calc(100%-24px)]]=\"(configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length))\"\n [label]=\"item().fieldLabel\"\n [popover]=\"item().dataPopover\"\n [dataComponentOutlet]=\"(undefined | LibsUiPipesCallFunctionInTemplatePipe:configTemplateGroup.getDataComponentOutletGroup:item():fieldKey():{valueIsEmpty:{item:item()}}) | async\"\n [componentOutlet]=\"(0 | LibsUiPipesCallFunctionInTemplatePipe:configTemplateGroup.getComponentOutletGroup:item():fieldKey():{valueIs0:0}) | async\"\n [zIndexLabel]=\"configTemplateGroup.zIndexLabel ?? zIndex()\"\n [imgTypeIcon]=\"configTemplateGroup.imgTypeIcon\"\n [linkImage]=\"configTemplateGroup.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateGroup.getLinkImageError ? configTemplateGroup.getLinkImageError : configTemplateGroup.getImage):item()) | async) : item()[configTemplateGroup.fieldGetAvatarItem || '']\"\n [classLabelInclude]=\"(configTemplateGroup.classLabelItem ? configTemplateGroup.classLabelItem : 'libs-ui-font-h6s ') + (configTemplateGroup.ignoreTextUppercaseLabelGroup ? '':' uppercase')\"\n [disable]=\"disable() || (configTemplateGroup.disableItemNotLastLevel && !!item()[configTemplateGroup.fieldGetItems]?.()?.length) || configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length)\"\n [active]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysChecked():keysChecked().length\"\n (outChange)=\"handlerChangeChecked($event.active,item, true)\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outClickLabel)=\"handlerToggleExpand('clickLabel',item,configTemplateGroup.ignoreRadioGroup || configTemplateGroup.singleSelectItem)\" />\n }\n\n @if (item().buttonInGroup; as buttonInGroup) {\n <libs_ui-components-buttons-button [type]=\"buttonInGroup.type || 'button-link-primary'\"\n [label]=\"buttonInGroup.label || ' '\"\n [classIconLeft]=\"(buttonInGroup.classIconLeft || '')+' flex mr-[8px] !text-[8px]'\"\n [classInclude]=\"buttonInGroup.classInclude\"\n [classLabel]=\"buttonInGroup.classLabel || 'libs-ui-font-h5r'\"\n [disable]=\"buttonInGroup.disable || disable() || false\"\n (outClick)=\"handlerClickButtonGroup(buttonInGroup,item())\" />\n }\n </div>\n\n @if (configTemplateGroup.iconExpand === 'right' && !configTemplateGroup.isViewTree && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)) {\n <i class=\"flex items-center cursor-pointer libs-ui-icon-chevron-right\"\n [class.!ml-[8px]]=\"item().dataPopover\"\n [class.rotate-90]=\"item().expand\"\n (click)=\"handlerToggleExpand($event,item)\">\n </i>\n }\n </div>\n @if (item().expand && calculatorHeighItemSuccess()) {\n <libs_ui-components-list-templates_group-item [keySearch]=\"keySearch()\"\n [items]=\"item()[configTemplateGroup.fieldGetItems]()\"\n [parentItem]=\"item()\"\n [fieldKey]=\"fieldKey()\"\n [keysChecked]=\"keysChecked()\"\n [disable]=\"disable()\"\n [keysDisableItem]=\"keysDisableItem() || []\"\n [configTemplateGroup]=\"configTemplateGroup\"\n [config]=\"config()\"\n [keysStillOtherOptions]=\"keysStillOtherOptions()\"\n (outChangeView)=\"handlerChangeView()\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outChange)=\"handlerChangeItemChecked($event.item)\" />\n }\n @if (!last && !configTemplateGroup.ignoreGroupLine && calculatorHeighItemSuccess()) {\n <div class=\"libs-ui-list-group-line\"\n [style.marginTop.px]=\"!configTemplateGroup.ignoreGroupLine ? configTemplateGroup.marginTopHasLine || 4 : 0\">\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n @if (!items() || !items().length) {\n <div\n class=\"libs-ui-font-h5r text-[#c1c1c1] relative {{ configTemplateGroup.classIncludeNodata?configTemplateGroup.classIncludeNodata:'' }}\"\n [style.marginLeft.px]=\"0 | LibsUiComponentsListGroupCalculatorMarginLeftItemPipe:2:(configTemplateGroup.isViewTree || configTemplateGroup.iconExpand === 'left'):configTemplateGroup.isViewTreeJson:!(configTemplateGroup.ignoreCheckboxItem || configTemplateGroup.ignoreRadioItem || configTemplateGroup.singleSelectItem):true\"\n [class.py-[8px]]=\"configTemplateGroup.fieldGetAvatarItem\"\n [class.py-[4px]]=\"!configTemplateGroup.fieldGetAvatarItem\">\n @if (!keySearch() && !loading()) {\n <div>{{ (config()?.textNoData ?? 'i18n_no_data_yet') | translate }}</div>\n }\n @if (keySearch() && !loading()) {\n <div>{{ (config()?.textSearchNoData ??'i18n_no_result') | translate }}</div>\n }\n </div>\n }\n @if (loading()) {\n <libs_ui-components-spinner [size]=\"'medium'\" />\n }\n </div>\n </div>\n}\n", styles: [".libs-ui-list-group{display:flex;flex-direction:column;width:100%}.libs-ui-list-group .libs-ui-list-group-line{width:100%;height:1px;background-color:#e6e7ea}.libs-ui-list-group [class*=libs-ui-icon-chevron]:before{color:#6a7383}\n"] }]
|
|
778
|
+
], template: "@if (configTemplateGroup(); as configTemplateGroup) {\n @let varHtmlHeightViewPort = heightViewPort() ? heightViewPort()+'px':'100%';\n @let varHtmlDisable = loading() || disable() || false;\n <div class=\"libs-ui-list-group overflow-[hidden]\"\n [style.height]=\"varHtmlHeightViewPort\">\n <div class=\"flex flex-col w-full h-full relative min-h-[28px]\">\n @if (items().length && configTemplateGroup.configButtonSelectAndUndSelectItem?.(); as configButtonSelectItem) {\n <div\n [class]=\"'flex items-center bg-[#ffffff] '+(configButtonSelectItem.classInclude ?? 'libs-ui-border-bottom-general')\">\n <libs_ui-components-buttons-button\n [type]=\"configButtonSelectItem.buttonCheckAll?.type ?? 'button-link-primary'\"\n [label]=\"configButtonSelectItem.buttonCheckAll?.label ?? 'i18n_select_all_searched_results'\"\n [classInclude]=\"configButtonSelectItem.buttonCheckAll?.classInclude || 'pr-[8px]'\"\n [classLabel]=\"configButtonSelectItem.buttonCheckAll?.classLabel || 'libs-ui-font-h6r'\"\n [disable]=\"varHtmlDisable\"\n (outClick)=\"handlerCheckedOrUnCheckedAll(true)\" />\n <div class=\"text-[#999999]\">|</div>\n <libs_ui-components-buttons-button\n [type]=\"configButtonSelectItem.buttonUncheckAll?.type ?? 'button-link-primary'\"\n [label]=\"configButtonSelectItem.buttonUncheckAll?.label ?? 'i18n_unselect_all_searched_results'\"\n [classInclude]=\"configButtonSelectItem.buttonUncheckAll?.classInclude || 'pl-[8px]'\"\n [classLabel]=\"configButtonSelectItem.buttonUncheckAll?.classLabel || 'libs-ui-font-h6s'\"\n [disable]=\"varHtmlDisable\"\n (outClick)=\"handlerCheckedOrUnCheckedAll(false)\" />\n </div>\n }\n @if (items().length && configTemplateGroup.configCheckboxCheckAll?.(); as configCheckBox) {\n <div\n [class]=\"'flex libs-ui-border-bottom-general '+(configTemplateGroup.classIncludeHasConfigCheckBoxAll ?? ' bg-[#ffffff]')\">\n <libs_ui-components-checkbox-single [label]=\"configCheckBox.label ?? 'i18n_all'\"\n [classLabelInclude]=\"configCheckBox.classLabelInclude || ''\"\n [checked]=\"totalItemChecked() >= totalItem() && totalItem() > 0\"\n [disable]=\"varHtmlDisable\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outChange)=\"handlerCheckedOrUnCheckedAll($event.checked)\" />\n </div>\n }\n @if (items() && items().length) {\n <div class=\"w-full h-full relative flex\">\n <div LibsUiComponentsScrollOverlayDirective\n class=\"w-full h-full absolute top-0 left-0 {{ configTemplateGroup.classIncludeGroup ? configTemplateGroup.classIncludeGroup : '' }}\">\n @for (item of items(); track item()[fieldKey()]; let first = $first; let last = $last) {\n <div #itemRef\n [style.marginTop.px]=\"!configTemplateGroup.ignoreGroupLine ? configTemplateGroup.marginTopHasLine || 4 : 0\"\n class=\"flex flex-col relative \">\n @let varHtmlPadding = level()*(configTemplateGroup.isViewTree ? 8 : 16);\n <div class=\"flex items-center py-[6px] \"\n [class.libs-ui-bg-list-hover]=\"!configTemplateGroup.ignoreClickLabelGroup\"\n [class.libs-ui-bg-list-hover-active]=\"!configTemplateGroup.ignoreClickLabelGroup\"\n [class.!cursor-pointer]=\"!configTemplateGroup.ignoreClickLabelGroup && (configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem)\"\n [style.paddingLeft.px]=\"varHtmlPadding\"\n [style.paddingRight.px]=\"varHtmlPadding\"\n (click)=\"(configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem) ? handlerToggleExpand($event,item) : undefined\">\n @if (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree) {\n <i class=\"cursor-pointer libs-ui-icon-chevron-right before:!text-[16px]\"\n [class.rotate-90]=\"item().expand\"\n (click)=\"handlerToggleExpand($event,item)\">\n </i>\n }\n <div class=\"flex\"\n [class.w-full]=\"configTemplateGroup.iconExpand === 'right' && !configTemplateGroup.isViewTree && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)\"\n [class.w-[calc(100%-16px)]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\">\n @if (!configTemplateGroup.isViewRadio) {\n <libs_ui-components-checkbox-single [avatarConfig]=\"item().avatarConfig\"\n [class.ml-[8px]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\"\n [ignoreCheckbox]=\"configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem\"\n [class]=\"configTemplateGroup.classIncludeItem || ''\"\n [class.w-auto]=\"configTemplateGroup.isViewTree\"\n [class.w-full]=\"!item()[configTemplateGroup.fieldGetItems]?.()?.length && !((configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)))\"\n [class.max-w-[calc(100%-24px)]]=\"(configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length))\"\n [label]=\"item().fieldLabel\"\n [popover]=\"item().dataPopover\"\n [zIndexLabel]=\"configTemplateGroup.zIndexLabel ?? zIndex()\"\n [dataComponentOutlet]=\"(undefined | LibsUiPipesCallFunctionInTemplatePipe:configTemplateGroup.getDataComponentOutletGroup:item():fieldKey():{valueIsEmpty:{item:item()}}) | async\"\n [componentOutlet]=\"(0 | LibsUiPipesCallFunctionInTemplatePipe:configTemplateGroup.getComponentOutletGroup:item():fieldKey():{valueIs0:0}) | async\"\n [linkImage]=\"configTemplateGroup.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateGroup.getLinkImageError ? configTemplateGroup.getLinkImageError : configTemplateGroup.getImage):item()) | async) : item()[configTemplateGroup.fieldGetAvatarItem || '']\"\n [imgTypeIcon]=\"configTemplateGroup.imgTypeIcon\"\n [classLabelInclude]=\"(configTemplateGroup.classLabelItem ? configTemplateGroup.classLabelItem : (configTemplateGroup.isViewTree ? ' libs-ui-font-h6r ':' libs-ui-font-h6s ')) + ((configTemplateGroup.ignoreTextUppercaseLabelGroup || configTemplateGroup.isViewTree) ? '':' text-uppercase ')\"\n [disable]=\"disable() || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length)\"\n [checked]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysChecked():keysChecked().length\"\n [stillOtherOptions]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysStillOtherOptions():keysStillOtherOptions().length\"\n (outChange)=\"handlerChangeChecked($event.checked,item, true)\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outClickLabel)=\"handlerToggleExpand('clickLabel',item,configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem)\" />\n }\n\n @if (configTemplateGroup.isViewRadio) {\n <libs_ui-components-radio-single\n [class.ml-[8px]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\"\n [avatarConfig]=\"item().avatarConfig\"\n [ignoreRadio]=\"configTemplateGroup.ignoreRadioGroup || configTemplateGroup.singleSelectItem\"\n [class]=\"configTemplateGroup.classIncludeItem || ''\"\n [class.w-auto]=\"configTemplateGroup.isViewTree\"\n [class.w-full]=\"!item()[configTemplateGroup.fieldGetItems]?.()?.length && !((configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)))\"\n [class.max-w-[calc(100%-24px)]]=\"(configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length))\"\n [label]=\"item().fieldLabel\"\n [popover]=\"item().dataPopover\"\n [dataComponentOutlet]=\"(undefined | LibsUiPipesCallFunctionInTemplatePipe:configTemplateGroup.getDataComponentOutletGroup:item():fieldKey():{valueIsEmpty:{item:item()}}) | async\"\n [componentOutlet]=\"(0 | LibsUiPipesCallFunctionInTemplatePipe:configTemplateGroup.getComponentOutletGroup:item():fieldKey():{valueIs0:0}) | async\"\n [zIndexLabel]=\"configTemplateGroup.zIndexLabel ?? zIndex()\"\n [imgTypeIcon]=\"configTemplateGroup.imgTypeIcon\"\n [linkImage]=\"configTemplateGroup.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateGroup.getLinkImageError ? configTemplateGroup.getLinkImageError : configTemplateGroup.getImage):item()) | async) : item()[configTemplateGroup.fieldGetAvatarItem || '']\"\n [classLabelInclude]=\"(configTemplateGroup.classLabelItem ? configTemplateGroup.classLabelItem : 'libs-ui-font-h6s ') + (configTemplateGroup.ignoreTextUppercaseLabelGroup ? '':' uppercase')\"\n [disable]=\"disable() || (configTemplateGroup.disableItemNotLastLevel && !!item()[configTemplateGroup.fieldGetItems]?.()?.length) || configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length)\"\n [active]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysChecked():keysChecked().length\"\n (outChange)=\"handlerChangeChecked($event.active,item, true)\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outClickLabel)=\"handlerToggleExpand('clickLabel',item,configTemplateGroup.ignoreRadioGroup || configTemplateGroup.singleSelectItem)\" />\n }\n\n @if (item().buttonInGroup; as buttonInGroup) {\n <libs_ui-components-buttons-button [type]=\"buttonInGroup.type || 'button-link-primary'\"\n [label]=\"buttonInGroup.label || ' '\"\n [classIconLeft]=\"(buttonInGroup.classIconLeft || '')+' flex mr-[8px] !text-[8px]'\"\n [classInclude]=\"buttonInGroup.classInclude\"\n [classLabel]=\"buttonInGroup.classLabel || 'libs-ui-font-h5r'\"\n [disable]=\"buttonInGroup.disable || disable() || false\"\n (outClick)=\"handlerClickButtonGroup(buttonInGroup,item())\" />\n }\n </div>\n\n @if (configTemplateGroup.iconExpand === 'right' && !configTemplateGroup.isViewTree && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)) {\n <i class=\"flex items-center cursor-pointer libs-ui-icon-chevron-right before:!text-[16px]\"\n [class.!ml-[8px]]=\"item().dataPopover\"\n [class.rotate-90]=\"item().expand\"\n (click)=\"handlerToggleExpand($event,item)\">\n </i>\n }\n </div>\n @if (item().expand && calculatorHeighItemSuccess()) {\n <libs_ui-components-list-templates_group-item [keySearch]=\"keySearch()\"\n [items]=\"item()[configTemplateGroup.fieldGetItems]()\"\n [parentItem]=\"item()\"\n [fieldKey]=\"fieldKey()\"\n [keysChecked]=\"keysChecked()\"\n [disable]=\"disable()\"\n [keysDisableItem]=\"keysDisableItem() || []\"\n [configTemplateGroup]=\"configTemplateGroup\"\n [config]=\"config()\"\n [keysStillOtherOptions]=\"keysStillOtherOptions()\"\n (outChangeView)=\"handlerChangeView()\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outChange)=\"handlerChangeItemChecked($event.item)\" />\n }\n @if (!last && !configTemplateGroup.ignoreGroupLine && calculatorHeighItemSuccess()) {\n <div class=\"libs-ui-list-group-line\"\n [style.marginTop.px]=\"!configTemplateGroup.ignoreGroupLine ? configTemplateGroup.marginTopHasLine || 4 : 0\">\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n @if (!items() || !items().length) {\n <div\n class=\"libs-ui-font-h5r text-[#c1c1c1] relative {{ configTemplateGroup.classIncludeNodata?configTemplateGroup.classIncludeNodata:'' }}\"\n [style.marginLeft.px]=\"0 | LibsUiComponentsListGroupCalculatorMarginLeftItemPipe:2:(configTemplateGroup.isViewTree || configTemplateGroup.iconExpand === 'left'):configTemplateGroup.isViewTreeJson:!(configTemplateGroup.ignoreCheckboxItem || configTemplateGroup.ignoreRadioItem || configTemplateGroup.singleSelectItem):true\"\n [class.py-[8px]]=\"configTemplateGroup.fieldGetAvatarItem\"\n [class.py-[4px]]=\"!configTemplateGroup.fieldGetAvatarItem\">\n @if (!keySearch() && !loading()) {\n <div>{{ (config()?.textNoData ?? 'i18n_no_data_yet') | translate }}</div>\n }\n @if (keySearch() && !loading()) {\n <div>{{ (config()?.textSearchNoData ??'i18n_no_result') | translate }}</div>\n }\n </div>\n }\n @if (loading()) {\n <libs_ui-components-spinner [size]=\"'medium'\" />\n }\n </div>\n </div>\n}\n", styles: [".libs-ui-list-group{display:flex;flex-direction:column;width:100%}.libs-ui-list-group .libs-ui-list-group-line{width:100%;height:1px;background-color:#e6e7ea}.libs-ui-list-group [class*=libs-ui-icon-chevron]:before{color:#6a7383}\n"] }]
|
|
779
779
|
}] });
|
|
780
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2xpc3Qvc3JjL3RlbXBsYXRlcy9ncm91cC9ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvdGVtcGxhdGVzL2dyb3VwL2dyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQVUsTUFBTSxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUM3RyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RSxPQUFPLEVBQVcsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRyxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RixPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN4RixPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNqRyxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVB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akJBQ3RDLHVDQUF1QywwcEJBQ3ZDLG9DQUFvQywyaEJBQ3BDLGdDQUFnQyxpR0FDaEMsc0NBQXNDLHdTQUN0Qyw0QkFBNEIsZ0VBQzVCLHFDQUFxQyx5RUFDckMscURBQXFELDhGQUNyRCxzQ0FBc0M7OzRGQUc3QixrQ0FBa0M7a0JBcEI5QyxTQUFTOytCQUVFLHlDQUF5QyxjQUd2QyxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7d0JBQ1AscUJBQXFCLEVBQUUsU0FBUyxFQUFFLGVBQWU7d0JBQ2pELHNDQUFzQzt3QkFDdEMsdUNBQXVDO3dCQUN2QyxvQ0FBb0M7d0JBQ3BDLGdDQUFnQzt3QkFDaEMsc0NBQXNDO3dCQUN0Qyw0QkFBNEI7d0JBQzVCLHFDQUFxQzt3QkFDckMscURBQXFEO3dCQUNyRCxzQ0FBc0M7cUJBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQXN5bmNQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGlzU2lnbmFsLCBPbkluaXQsIHNpZ25hbCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZpcnR1YWxTY3JvbGxlck1vZHVsZSB9IGZyb20gJ0BpaGFyYmVjay9uZ3gtdmlydHVhbC1zY3JvbGxlcic7XG5pbXBvcnQgeyBJQnV0dG9uLCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1JhZGlvU2luZ2xlQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1yYWRpby1zaW5nbGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNjcm9sbC1vdmVybGF5JztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zcGlubmVyJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlJztcbmltcG9ydCB7IGNsb25lRGVlcCwgZGVsZXRlVW5pY29kZSwgZXNjYXBlSHRtbCwgaXNFbXB0eSwgaXNOaWwsIHV1aWQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IHJhbmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJTGlzdENvbmZpZ0l0ZW1Hcm91cCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY29uZmlnLWl0ZW0uaW50ZXJmYWNlJztcbmltcG9ydCB7IElMaXN0RGF0YUVtaXRLZXksIElMaXN0RGF0YUVtaXRNdWx0aUtleSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZGF0YS1lbWl0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvY2hlY2stc2VsZWN0ZWQtYnkta2V5LnBpcGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xpc3RUZW1wbGF0ZXNDb21wb25lbnRBYnN0cmFjdCB9IGZyb20gJy4uL3RlbXBsYXRlcy5jb21wb25lbnQuYWJzdHJhY3QnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xpc3RHcm91cEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2l0ZW0vaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xpc3RHcm91cENhbGN1bGF0b3JNYXJnaW5MZWZ0SXRlbVBpcGUgfSBmcm9tICcuL3BpcGVzL2NhbGN1bGF0b3ItbWFyZ2luLWxlZnQtaXRlbS5waXBlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtbGlzdC10ZW1wbGF0ZXNfZ3JvdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ncm91cC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIFZpcnR1YWxTY3JvbGxlck1vZHVsZSwgQXN5bmNQaXBlLCBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNSYWRpb1NpbmdsZUNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSxcbiAgICBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlLFxuICAgIExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0xpc3RHcm91cENhbGN1bGF0b3JNYXJnaW5MZWZ0SXRlbVBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0xpc3RHcm91cEl0ZW1Db21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzTGlzdEdyb3VwQ29tcG9uZW50IGV4dGVuZHMgTGlic1VpQ29tcG9uZW50c0xpc3RUZW1wbGF0ZXNDb21wb25lbnRBYnN0cmFjdCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJvdGVjdGVkIGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtR3JvdXAgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBsZXZlbCA9IHNpZ25hbDxudW1iZXI+KDEpO1xuICBwcm90ZWN0ZWQga2V5c0NoZWNrZWQgPSBzaWduYWw8QXJyYXk8c3RyaW5nPj4oW10pO1xuICBwcm90ZWN0ZWQga2V5c1N0aWxsT3RoZXJPcHRpb25zID0gc2lnbmFsPEFycmF5PHN0cmluZz4+KFtdKTtcbiAgcHJvdGVjdGVkIHRvdGFsSXRlbSA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcm90ZWN0ZWQgdG90YWxJdGVtQ2hlY2tlZCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcm90ZWN0ZWQgY2FsY3VsYXRvckhlaWdoSXRlbVN1Y2Nlc3MgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQga2V5RmV0Y2ggPSBzaWduYWw8c3RyaW5nPignJyk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBQQVRURVJOX0ZBS0VfSUQgPSAnZmFrZS1pZC0nO1xuICBwcml2YXRlIG1hcHBpbmdJdGVtc0NoZWNrZWQgPSBzaWduYWw8TWFwPHN0cmluZywgYW55Pj4obmV3IE1hcCgpKTtcbiAgcHJpdmF0ZSBzZWxlY3RGaXJzdEl0ZW0gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIGZpcnN0SXRlbVNlbGVjdGVkID0gc2lnbmFsPGFueT4odW5kZWZpbmVkKTtcblxuICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKCk/LmNvbmZpZ1RlbXBsYXRlR3JvdXA/LigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwLnNldCh0aGlzLmNvbmZpZygpPy5jb25maWdUZW1wbGF0ZUdyb3VwPy4oKSk7XG4gICAgdGhpcy50aW1lSW50ZXJ2YWxJbnRlcnZhbFNldEhlaWdodFZpZXdQb3J0LnNldCh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8udGltZUludGVydmFsQ2FsY3VsYXRvckhlaWdodCA/PyAwKTtcbiAgICB0aGlzLmZpZWxkS2V5LnNldCh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZmllbGRLZXkgPz8gdGhpcy5maWVsZEtleURlZmF1bHQoKSk7XG4gICAgdGhpcy5zZWxlY3RGaXJzdEl0ZW0uc2V0KGZhbHNlKTtcbiAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/Lm9ubHlTZWxlY3RGaXJzdEl0ZW0gfHwgKCF0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8ubGVuZ3RoICYmIHRoaXMuY29uZmlnKCk/LmF1dG9TZWxlY3RGaXJzdEl0ZW0pKSB7XG4gICAgICB0aGlzLnNlbGVjdEZpcnN0SXRlbS5zZXQodHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZSgpO1xuXG5cbiAgICB0aGlzLm9uVXBkYXRlTXVsdGlLZXlTZWxlY3RlZEdyb3VwKCk/LnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5zdG9yZSgpIHx8ICF0aGlzLnN0b3JlKCkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5c0NoZWNrZWQuc2V0KFtdKTtcblxuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuY2xlYXIoKTtcbiAgICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RvcmUoKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXNFbXB0eShpdGVtKClbdGhpcy5maWVsZEtleSgpXSkpIHtcbiAgICAgICAgICBpdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnRbdGhpcy5maWVsZEtleSgpXSA9IGAke3RoaXMuUEFUVEVSTl9GQUtFX0lEfSR7dXVpZCgpfWA7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1Hcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgICAgY29uc3QgaXRlbU1hcCA9IGNsb25lRGVlcChpdGVtKSBhcyBXcml0YWJsZVNpZ25hbDxhbnk+O1xuXG4gICAgICAgIGl0ZW1NYXAudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQucmVmID0gaXRlbTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGl0ZW1Hcm91cCkge1xuICAgICAgICAgIHRoaXMuY2hlY2tlZEdyb3VwSXRlbXMoaXRlbUdyb3VwKCksIGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKSAmJiB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8ubGVuZ3RoICYmIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5maW5kKGtleSA9PiBrZXkgPT09IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKSkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlckNoYW5nZUNoZWNrZWQodHJ1ZSwgaXRlbU1hcCwgZmFsc2UsICFjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMubXVsdGlLZXlTZWxlY3RlZC5zZXQoW10pO1xuXG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoZWNrZWRPclVuQ2hlY2tlZEFsbChjaGVja2VkOiBib29sZWFuKSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghY2hlY2tlZCkge1xuICAgICAgdGhpcy5pdGVtcygpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmRlbGV0ZShpdGVtKClbdGhpcy5maWVsZEtleSgpXSk7XG4gICAgICAgIGNvbnN0IGl0ZW1zT2ZHcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcblxuICAgICAgICBpZiAoaXRlbXNPZkdyb3VwICYmIGl0ZW1zT2ZHcm91cCgpICYmIGl0ZW1zT2ZHcm91cCgpLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXNPZkdyb3VwKCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGZhbHNlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXRlbXMoKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuc2V0KGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldLCBpdGVtKCkpO1xuICAgICAgY29uc3QgaXRlbXNPZkdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuXG4gICAgICBpZiAoaXRlbXNPZkdyb3VwICYmIGl0ZW1zT2ZHcm91cCgpICYmIGl0ZW1zT2ZHcm91cCgpLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNldENoZWNrQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXNPZkdyb3VwKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja2VkR3JvdXBJdGVtcyhpdGVtcz86IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+LCBwYXJlbnQ/OiBXcml0YWJsZVNpZ25hbDxhbnk+KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAoaXNOaWwoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pIHx8IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSAnJykge1xuICAgICAgICBpdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50W3RoaXMuZmllbGRLZXkoKV0gPSBgJHt0aGlzLlBBVFRFUk5fRkFLRV9JRH0ke3V1aWQoKX1gO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW1Hcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgIGNvbnN0IGl0ZW1NYXAgPSBjbG9uZURlZXAoaXRlbSkgYXMgV3JpdGFibGVTaWduYWw8YW55PjtcblxuICAgICAgaXRlbU1hcC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQucmVmID0gaXRlbTtcbiAgICAgICAgY3VycmVudC5wYXJlbnRJdGVtID0gcGFyZW50O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAoaXRlbUdyb3VwKSB7XG4gICAgICAgIHRoaXMuY2hlY2tlZEdyb3VwSXRlbXMoaXRlbUdyb3VwKCksIGl0ZW0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpICYmIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5sZW5ndGggJiYgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/LmZpbmQoa2V5ID0+IGtleSA9PT0gaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlckNoYW5nZUNoZWNrZWQodHJ1ZSwgaXRlbU1hcCwgZmFsc2UsICFjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZChmYWxzZSwgaXRlbU1hcCwgZmFsc2UsICFjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0J1dHRvbkdyb3VwKGJ1dHRvbkluR3JvdXA6IElCdXR0b24sIGl0ZW06IGFueSkge1xuICAgIGJ1dHRvbkluR3JvdXAuYWN0aW9uPy4oaXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclRvZ2dsZUV4cGFuZChlOiB1bmtub3duLCBpdGVtOiBXcml0YWJsZVNpZ25hbDxhbnk+LCBhY2NlcHRFdmVudCA9IHRydWUpIHtcbiAgICBpZiAoIWFjY2VwdEV2ZW50IHx8IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5pZ25vcmVDbGlja0xhYmVsR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgaXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50LmV4cGFuZCA9ICFjdXJyZW50LmV4cGFuZDtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy5yZWZyZXNoVmlldygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VWaWV3KCkge1xuICAgIHRoaXMucmVmcmVzaFZpZXcoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlSXRlbUNoZWNrZWQoaXRlbTogYW55KSB7XG4gICAgY29uc3QgY2hlY2tlZCA9ICF0aGlzLmtleXNDaGVja2VkKCkuc29tZShrZXkgPT4gaXRlbVt0aGlzLmZpZWxkS2V5KCldID09PSBrZXkpO1xuXG4gICAgaWYgKCFjaGVja2VkICYmIHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5pc1ZpZXdSYWRpbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZXJDaGFuZ2VDaGVja2VkKGNoZWNrZWQsIHNpZ25hbChpdGVtKSwgZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VDaGVja2VkKGNoZWNrZWQ6IGJvb2xlYW4sIGl0ZW06IFdyaXRhYmxlU2lnbmFsPGFueT4sIGlzQ2xpY2tNYW51YWw6IGJvb2xlYW4sIGlzQ2hlY2tlZEJ5RGVmYXVsdEtleT86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVKc29uICYmIGl0ZW0oKS5sZXZlbCAhPT0gaXRlbSgpLm1heExldmVsR3JvdXAgJiYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlZkl0ZW0gPSAoaXRlbSgpLnJlZiB8fCBpdGVtKSBhcyBXcml0YWJsZVNpZ25hbDxhbnk+O1xuXG4gICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSkge1xuICAgICAgY2hlY2tlZCA9IHRydWU7XG4gICAgICBjb25zdCBtYXBwaW5nSXRlbXNDaGVja2VkVGVtcCA9IGNsb25lRGVlcCh0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQpIGFzIFdyaXRhYmxlU2lnbmFsPE1hcDxzdHJpbmcsIGFueT4+O1xuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGl0ZW1DaGVja10gb2YgbWFwcGluZ0l0ZW1zQ2hlY2tlZFRlbXAoKSkge1xuICAgICAgICBjb25zdCBpdGVtQnlLZXkgPSB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5nZXQoa2V5KTtcblxuICAgICAgICBpdGVtQnlLZXkuaXNDaGVja01hbnVhbCA9IGZhbHNlO1xuICAgICAgICBkZWxldGUgaXRlbUJ5S2V5LnJlZi5pc0NoZWNrTWFudWFsO1xuICAgICAgICBpZiAoIWl0ZW1DaGVjay5yZWYuaXNDaGVja2VkQnlEZWZhdWx0S2V5KSB7XG4gICAgICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZGVsZXRlKGtleSk7XG4gICAgICAgICAgdGhpcy5vdXRVblNlbGVjdE11bHRpS2V5LmVtaXQoW2tleV0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWlzQ2hlY2tlZEJ5RGVmYXVsdEtleSkge1xuICAgICAgICBpdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LmlzQ2hlY2tNYW51YWwgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICByZWZJdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LmlzQ2hlY2tNYW51YWwgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpdGVtc09mR3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG4gICAgLy8gYuG7jyBjaOG7jW4gdOG6pXQgY+G6oyBjw6FjIGl0ZW0gxJHhu4MgdGjhu7FjIGhp4buHbiBjaGVjayBs4bqhaVxuICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVKc29uIHx8IChjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW1CeVRyZWUgJiYgIWlzQ2hlY2tlZEJ5RGVmYXVsdEtleSAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5ub3RDaGFuZ2VTdGF0ZUl0ZW1DaGVja090aGVyKSkge1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS52YWx1ZXMoKSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgZGVsZXRlIGl0ZW0uaXNDaGVja01hbnVhbDtcbiAgICAgICAgcmVmSXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgZGVsZXRlIGN1cnJlbnQuaXNDaGVja01hbnVhbDtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLm91dFVuU2VsZWN0TXVsdGlLZXkuZW1pdCh0aGlzLmtleXNDaGVja2VkKCkpO1xuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuY2xlYXIoKTtcbiAgICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGlzQ2xpY2tNYW51YWwsIGl0ZW0pO1xuICAgIH1cblxuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICB0aGlzLmV4cGFuZEFsbEl0ZW1zSW5Hcm91cChpdGVtKTtcbiAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLnNldChpdGVtKClbdGhpcy5maWVsZEtleSgpXSwgaXRlbSgpKTtcbiAgICAgIGlmIChpc0NoZWNrZWRCeURlZmF1bHRLZXkpIHtcbiAgICAgICAgcmVmSXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5pc0NoZWNrZWRCeURlZmF1bHRLZXkgPSBpc0NoZWNrZWRCeURlZmF1bHRLZXk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5pc0NoZWNrZWRCeURlZmF1bHRLZXkgPSByZWZJdGVtKCkuaXNDaGVja2VkQnlEZWZhdWx0S2V5O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5jaG9vc2VDaGlsZFRoZW5BdXRvQ2hvb3NlUGFyZW50KSB7IC8vIGNo4buJIGNo4buNbiBjw6FjIGNoYSB0csOqbiBjw7luZyB0cmVlLCBrbyBxdWFuIHTDom0gbm9kZSBjaGEgY8OzIGPDoWMgY29uIMSRw6MgxJFjIHTDrWNoIGjhur90IGNoxrBhXG4gICAgICAgIGl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuaXNDaGVja01hbnVhbCA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlZkl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuaXNDaGVja01hbnVhbCA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVjdXJzaXZlbHlDaGVja2VkUGFyZW50QnlUcmVlKGl0ZW0oKS5wYXJlbnRJdGVtKTtcblxuICAgICAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hvb3NlUGFyZW50VGhlbkF1dG9DaG9vc2VDaGlsZHJlbiAmJiAhaXNDaGVja2VkQnlEZWZhdWx0S2V5KSB7XG4gICAgICAgICAgdGhpcy5zZXRDaGVja0NoZWNrZWRJdGVtc0NoaWxkKGl0ZW1zT2ZHcm91cCgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEtleXNDaGVja2VkQnlNYXBwaW5nQ2hlY2tlZChpc0NsaWNrTWFudWFsLCBpdGVtKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaG9vc2VQYXJlbnRUaGVuQXV0b0Nob29zZUNoaWxkcmVuKSB7IC8vIGzhu7FhIGNo4buNbiBub2RlIGNoYSBz4bq9IGLhu48gcXVhIHZp4buHYyBjaOG7jW4gdOG6pXQgY+G6oyBub2RlIGNvblxuICAgICAgICB0aGlzLnNldEtleXNDaGVja2VkQnlNYXBwaW5nQ2hlY2tlZChpc0NsaWNrTWFudWFsLCBpdGVtKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXRlbXNPZkdyb3VwICYmIGl0ZW1zT2ZHcm91cCgpICYmIGl0ZW1zT2ZHcm91cCgpLmxlbmd0aCAmJiAhaXNDaGVja2VkQnlEZWZhdWx0S2V5ICYmICFjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVKc29uKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zQ2hhbmdlID0gY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGFuZ2VDaGlsZHJlbkRpc2FibGVXaGVuQ2hhbmdlUGFyZW50ID9cbiAgICAgICAgICBpdGVtc09mR3JvdXAoKS5maWx0ZXIoKGl0ZW06IGFueSkgPT4gIXRoaXMua2V5c0Rpc2FibGVJdGVtKCk/LmZpbmQoa2V5ID0+IGtleSA9PT0gaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pKSA6IGl0ZW1zT2ZHcm91cCgpO1xuXG4gICAgICAgIHRoaXMuc2V0Q2hlY2tDaGVja2VkSXRlbXNDaGlsZChpdGVtc0NoYW5nZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAubm90Q2hhbmdlU3RhdGVJdGVtQ2hlY2tPdGhlciAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlSnNvbikge1xuICAgICAgICB0aGlzLnNldENoZWNrQ2hlY2tlZEl0ZW1zUGFyZW50KGl0ZW0oKS5wYXJlbnRJdGVtKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGlzQ2xpY2tNYW51YWwsIGl0ZW0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgY3VycmVudC5pc0NoZWNrTWFudWFsID0gZmFsc2U7XG5cbiAgICAgIGlmIChpc0NoZWNrZWRCeURlZmF1bHRLZXkpIHtcbiAgICAgICAgY3VycmVudC5pc0NoZWNrZWRCeURlZmF1bHRLZXkgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgcmVmSXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50LmlzQ2hlY2tNYW51YWwgPSBmYWxzZTtcblxuICAgICAgaWYgKGlzQ2hlY2tlZEJ5RGVmYXVsdEtleSkge1xuICAgICAgICBjdXJyZW50LmlzQ2hlY2tlZEJ5RGVmYXVsdEtleSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5kZWxldGUoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pO1xuICAgIHRoaXMua2V5c0NoZWNrZWQuc2V0KEFycmF5LmZyb20odGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkua2V5cygpKSk7XG5cbiAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5ub3RDaGFuZ2VTdGF0ZUl0ZW1DaGVja090aGVyKSB7XG4gICAgICB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5kZWxldGUoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pO1xuICAgICAgdGhpcy5vdXRVblNlbGVjdE11bHRpS2V5LmVtaXQoIWlzRW1wdHkoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pID8gW2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldXSA6IFtdKTtcbiAgICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGlzQ2xpY2tNYW51YWwsIGl0ZW0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZVVuc2VsZWN0Q2hpbGRyZW5SZW1vdmVTZWxlY3RQYXJlbnQpIHtcbiAgICAgIHRoaXMucmVjdXJzaXZlbHlDaGVja2VkUGFyZW50QnlUcmVlKGl0ZW0oKS5wYXJlbnRJdGVtKTtcbiAgICB9XG5cbiAgICAvLyBu4bq/dSBrbyBwaOG6o2kgdHLGsOG7nW5nIGjGoXAgY+G7p2EgYmFuayB2w6AgZGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gdGjDrCBi4buPIGNoYSBz4bq9IGLhu48gY29uXG4gICAgaWYgKGl0ZW1zT2ZHcm91cCAmJiBpdGVtc09mR3JvdXAoKSAmJiBpdGVtc09mR3JvdXAoKS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGl0ZW1zQ2hhbmdlID0gY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGFuZ2VDaGlsZHJlbkRpc2FibGVXaGVuQ2hhbmdlUGFyZW50ID9cbiAgICAgICAgaXRlbXNPZkdyb3VwKCkuZmlsdGVyKChpdGVtKSA9PiAhdGhpcy5rZXlzRGlzYWJsZUl0ZW0oKT8uZmluZChrZXkgPT4ga2V5ID09PSBpdGVtKClbdGhpcy5maWVsZEtleSgpXSkpIDogaXRlbXNPZkdyb3VwKCk7XG5cbiAgICAgIHRoaXMucmVtb3ZlQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXNDaGFuZ2UpO1xuICAgIH1cbiAgICBpZiAoaXRlbSgpLnBhcmVudEl0ZW0gJiYgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlVW5zZWxlY3RDaGlsZHJlblJlbW92ZVNlbGVjdFBhcmVudCkge1xuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZGVsZXRlKGl0ZW0oKS5wYXJlbnRJdGVtW3RoaXMuZmllbGRLZXkoKV0pO1xuICAgIH1cbiAgICB0aGlzLnNldEtleXNDaGVja2VkQnlNYXBwaW5nQ2hlY2tlZChpc0NsaWNrTWFudWFsLCBpdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SXRlbXNPZkdyb3VwKGl0ZW06IFdyaXRhYmxlU2lnbmFsPGFueT4sIHN0b3JlczogV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFzdG9yZXMgfHwgIXN0b3Jlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHN0b3JlcygpKSB7XG4gICAgICBpZiAoZ3JvdXAoKVt0aGlzLmZpZWxkS2V5KCldID09PSBpdGVtKClbdGhpcy5maWVsZEtleSgpXSkge1xuICAgICAgICByZXR1cm4gZ3JvdXAoKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0SXRlbXNPZkdyb3VwKGl0ZW0sIGdyb3VwKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSkgYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHByaXZhdGUgc2V0S2V5c1N0aWxsT3RoZXJPcHRpb25zKGl0ZW0/OiBXcml0YWJsZVNpZ25hbDxhbnk+KSB7XG4gICAgaWYgKCFpdGVtPy4oKSkge1xuICAgICAgdGhpcy5rZXlzU3RpbGxPdGhlck9wdGlvbnMuc2V0KFtdKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrZXlzQ2hlY2tlZCA9IEFycmF5LmZyb20odGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkua2V5cygpKTtcbiAgICBjb25zdCBpdGVtUGFyZW50ID0gaXRlbSgpLnBhcmVudEl0ZW0gYXMgV3JpdGFibGVTaWduYWw8YW55PjtcbiAgICBjb25zdCBpbmRleEl0ZW0gPSB0aGlzLmtleXNTdGlsbE90aGVyT3B0aW9ucygpLmZpbmRJbmRleChrZXkgPT4ga2V5ID09PSBpdGVtKClbdGhpcy5maWVsZEtleSgpXSk7XG5cbiAgICBpZiAoaW5kZXhJdGVtID49IDApIHtcbiAgICAgIHRoaXMua2V5c1N0aWxsT3RoZXJPcHRpb25zLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5zcGxpY2UoaW5kZXhJdGVtLCAxKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghaXRlbVBhcmVudCB8fCAhaXRlbVBhcmVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zT2ZHcm91cFBhcmVudCA9IHRoaXMuZ2V0SXRlbXNPZkdyb3VwKGl0ZW1QYXJlbnQsIHRoaXMuc3RvcmUpO1xuXG4gICAgaWYgKCFpdGVtc09mR3JvdXBQYXJlbnQgfHwgIWl0ZW1zT2ZHcm91cFBhcmVudCgpIHx8ICFpdGVtc09mR3JvdXBQYXJlbnQoKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5kZXhQYXJlbnQgPSB0aGlzLmtleXNTdGlsbE90aGVyT3B0aW9ucygpLmZpbmRJbmRleChrZXkgPT4ga2V5ID09PSBpdGVtUGFyZW50KClbdGhpcy5maWVsZEtleSgpXSk7XG5cbiAgICBpZiAoaXRlbXNPZkdyb3VwUGFyZW50KCkuZXZlcnkoKGVsZW1lbnQpID0+IGtleXNDaGVja2VkLmluY2x1ZGVzKGVsZW1lbnQoKVt0aGlzLmZpZWxkS2V5KCldKSkgJiYgaW5kZXhQYXJlbnQgPj0gMCkge1xuICAgICAgdGhpcy5rZXlzU3RpbGxPdGhlck9wdGlvbnMudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LnNwbGljZShpbmRleEl0ZW0sIDEpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGl0ZW1zT2ZHcm91cFBhcmVudCgpLnNvbWUoZWxlbWVudCA9PiBrZXlzQ2hlY2tlZC5pbmNsdWRlcyhlbGVtZW50KClbdGhpcy5maWVsZEtleSgpXSkpICYmIGluZGV4UGFyZW50IDwgMCkge1xuICAgICAgdGhpcy5rZXlzU3RpbGxPdGhlck9wdGlvbnMudXBkYXRlKGN1cnJlbnQgPT4gWy4uLmN1cnJlbnQsIGl0ZW1QYXJlbnQoKVt0aGlzLmZpZWxkS2V5KCldXSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluZGV4UGFyZW50ID49IDApIHtcbiAgICAgIHRoaXMua2V5c1N0aWxsT3RoZXJPcHRpb25zLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5zcGxpY2UoaW5kZXhJdGVtLCAxKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGlzQ2xpY2tNYW51YWw6IGJvb2xlYW4sIGl0ZW0/OiBXcml0YWJsZVNpZ25hbDxhbnk+KSB7XG4gICAgdGhpcy5rZXlzQ2hlY2tlZC5zZXQoQXJyYXkuZnJvbSh0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5rZXlzKCkpKTtcbiAgICB0aGlzLmVtaXRNdWx0aUtleUNoZWNrZWQoaXNDbGlja01hbnVhbCk7XG4gICAgdGhpcy5zZXRLZXlzU3RpbGxPdGhlck9wdGlvbnMoaXRlbSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRNdWx0aUtleUNoZWNrZWQoaXNDbGlja01hbnVhbCA9IHRydWUpIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGF0YU11bHRpS2V5Q2hlY2tlZDogSUxpc3REYXRhRW1pdE11bHRpS2V5ID0geyBrZXlzOiBuZXcgQXJyYXk8YW55PigpLCBtYXBLZXlzOiBuZXcgQXJyYXk8SUxpc3REYXRhRW1pdEtleT4oKSwgaXNDbGlja01hbnVhbCB9O1xuXG4gICAgaWYgKChjb25maWdUZW1wbGF0ZUdyb3VwLmVtaXRBbGxJdGVtQ2hlY2tlZCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmNob29zZUNoaWxkVGhlbkF1dG9DaG9vc2VQYXJlbnQpICYmICFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUVtaXRBbGxJdGVtQ2hlY2tlZFdoZW5DaG9vc2VDaGlsZFRoZW5BdXRvQ2hvb3NlUGFyZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGl0ZW1dIG9mIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpKSB7XG4gICAgICAgIGRhdGFNdWx0aUtleUNoZWNrZWQua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIGRhdGFNdWx0aUtleUNoZWNrZWQubWFwS2V5cy5wdXNoKHsga2V5LCBpdGVtOiAoaXRlbS5yZWY/LigpIHx8IGl0ZW0pLCBpc0NsaWNrTWFudWFsIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5vdXRTZWxlY3RNdWx0aUtleS5lbWl0KGRhdGFNdWx0aUtleUNoZWNrZWQpO1xuICAgICAgdGhpcy50b3RhbEl0ZW1DaGVja2VkLnNldChkYXRhTXVsdGlLZXlDaGVja2VkLmtleXMubGVuZ3RoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleSwgaXRlbV0gb2YgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkpIHtcbiAgICAgIGlmIChpdGVtW3RoaXMuZmllbGRLZXkoKV0gJiYgIVN0cmluZyhpdGVtW3RoaXMuZmllbGRLZXkoKV0pLmluY2x1ZGVzKHRoaXMuUEFUVEVSTl9GQUtFX0lEKSAmJiAoIWl0ZW1bY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8ubGVuZ3RoIHx8ICFpdGVtW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10oKS5zb21lKChpdGVtR3JvdXA6IFdyaXRhYmxlU2lnbmFsPGFueT4pID0+IHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmdldChpdGVtR3JvdXAoKVt0aGlzLmZpZWxkS2V5KCldKSkpKSB7XG4gICAgICAgIGRhdGFNdWx0aUtleUNoZWNrZWQua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIGRhdGFNdWx0aUtleUNoZWNrZWQubWFwS2V5cy5wdXNoKHsga2V5LCBpdGVtOiAoaXRlbS5yZWY/LigpIHx8IGl0ZW0pLCBpc0NsaWNrTWFudWFsIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm91dFNlbGVjdE11bHRpS2V5LmVtaXQoZGF0YU11bHRpS2V5Q2hlY2tlZCk7XG4gICAgdGhpcy50b3RhbEl0ZW1DaGVja2VkLnNldChkYXRhTXVsdGlLZXlDaGVja2VkLmtleXMubGVuZ3RoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjdXJzaXZlbHlDaGVja2VkUGFyZW50QnlUcmVlKGl0ZW06IGFueSkge1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5zZXQoaXRlbVt0aGlzLmZpZWxkS2V5KCldLCBpdGVtKCkpO1xuICAgIHRoaXMucmVjdXJzaXZlbHlDaGVja2VkUGFyZW50QnlUcmVlKGl0ZW0ucGFyZW50SXRlbSk7XG4gIH1cblxuICBwcml2YXRlIHNldENoZWNrQ2hlY2tlZEl0ZW1zUGFyZW50KGl0ZW06IFdyaXRhYmxlU2lnbmFsPGFueT4pIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgIWl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXRlbXNPZkdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuXG4gICAgaWYgKCFpdGVtc09mR3JvdXAoKSB8fCAhaXRlbXNPZkdyb3VwKCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbUdyb3VwIG9mIGl0ZW1zT2ZHcm91cCgpKSB7XG4gICAgICBpZiAoIXRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmhhcyhpdGVtR3JvdXAoKVt0aGlzLmZpZWxkS2V5KCldKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLnNldChpdGVtKClbdGhpcy5maWVsZEtleSgpXSwgaXRlbSgpKTtcbiAgICBpZiAoaXRlbSgpLnBhcmVudEl0ZW0pIHtcbiAgICAgIHRoaXMuc2V0Q2hlY2tDaGVja2VkSXRlbXNQYXJlbnQoaXRlbSgpLnBhcmVudEl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2hlY2tDaGVja2VkSXRlbXNDaGlsZChpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4pIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLnNldChpdGVtKClbdGhpcy5maWVsZEtleSgpXSwgaXRlbSgpKTtcbiAgICAgIGNvbnN0IGl0ZW1zT2ZHcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcblxuICAgICAgaWYgKGl0ZW1zT2ZHcm91cCAmJiBpdGVtc09mR3JvdXAoKSAmJiBpdGVtc09mR3JvdXAoKS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXRDaGVja0NoZWNrZWRJdGVtc0NoaWxkKGl0ZW1zT2ZHcm91cCgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5pc0NoZWNrTWFudWFsID0gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmRlbGV0ZShpdGVtKClbdGhpcy5maWVsZEtleSgpXSk7XG4gICAgICB0aGlzLm91dFVuU2VsZWN0TXVsdGlLZXkuZW1pdChbaXRlbSgpW3RoaXMuZmllbGRLZXkoKV1dKTtcblxuICAgICAgY29uc3QgaXRlbXNPZkdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuXG4gICAgICBpZiAoaXRlbXNPZkdyb3VwICYmIGl0ZW1zT2ZHcm91cCgpICYmIGl0ZW1zT2ZHcm91cCgpLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnJlbW92ZUNoZWNrZWRJdGVtc0NoaWxkKGl0ZW1zT2ZHcm91cCgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzU2VhcmNoKCkge1xuICAgIHRoaXMucHJvY2Vzc0RhdGEoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzRGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLnRvdGFsSXRlbS5zZXQoMCk7XG5cbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgaXRlbXMgPSB0aGlzLnN0b3JlKCkubWFwKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXNOaWwoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pIHx8IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSAnJykge1xuICAgICAgICBpdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50W3RoaXMuZmllbGRLZXkoKV0gPSBgJHt0aGlzLlBBVFRFUk5fRkFLRV9JRH0ke3V1aWQoKX1gO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW1NYXAgPSBjbG9uZURlZXAoaXRlbSkgYXMgV3JpdGFibGVTaWduYWw8YW55PjtcbiAgICAgIGl0ZW1NYXAudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LnJlZiA9IGl0ZW07XG4gICAgICAgIGN1cnJlbnQuaXNSb290ID0gdHJ1ZTtcbiAgICAgICAgY3VycmVudC5leHBhbmQgPSB0aGlzLmtleVNlYXJjaCgpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICBjdXJyZW50Lm1heExldmVsR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0TWF4TGV2ZWxHcm91cChpdGVtKCkpO1xuICAgICAgICBjdXJyZW50LmxldmVsID0gdGhpcy5sZXZlbCgpO1xuICAgICAgICBjdXJyZW50LnRleHREZXNjcmlwdGlvbkdyb3VwV2hlbk5vRGF0YSA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXREZXNjcmlwdGlvbkdyb3VwV2hlbk5vRGF0YT8uKGl0ZW0oKSk7XG4gICAgICAgIGN1cnJlbnQuaWNvbkVtcHR5RGF0YUluR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0SWNvbkVtcHR5RGF0YUluR3JvdXA/LihpdGVtKCkpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAoKGl0ZW1NYXAoKS5sZXZlbCA9PT0gaXRlbU1hcCgpLm1heExldmVsR3JvdXAgfHwgIXRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5pZ25vcmVDaGVja2JveEdyb3VwKSAmJiAhU3RyaW5nKGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKT8uaW5jbHVkZXModGhpcy5QQVRURVJOX0ZBS0VfSUQpKSB7XG4gICAgICAgIHRoaXMudG90YWxJdGVtLnVwZGF0ZShjdXJyZW50ID0+IGN1cnJlbnQrKyk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMua2V5U2VhcmNoKCkgJiYgdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldEV4cGFuZEdyb3VwKSB7XG4gICAgICAgIGl0ZW1NYXAudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuZXhwYW5kID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldEV4cGFuZEdyb3VwPy4oaXRlbSk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldFBvcG92ZXJHcm91cCkge1xuICAgICAgICBpdGVtTWFwLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LmRhdGFQb3BvdmVyID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldFBvcG92ZXJHcm91cD8uKGl0ZW0pO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRCdXR0b25Hcm91cCkge1xuICAgICAgICBpdGVtTWFwLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LmJ1dHRvbkluR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0QnV0dG9uR3JvdXA/LihpdGVtKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRleHQgPSBkZWxldGVVbmljb2RlKHRoaXMuYnVpbGRWYWx1ZUJ5Q29uZmlnKGl0ZW1NYXApKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgdGV4dEVzY2FwZSA9IGVzY2FwZUh0bWwodGV4dCk7XG4gICAgICBjb25zdCBrZXlTZWFyY2ggPSBkZWxldGVVbmljb2RlKGVzY2FwZUh0bWwoKHRoaXMua2V5U2VhcmNoKCkgfHwgJycpLnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgpKSk7XG5cbiAgICAgIGl0ZW1NYXAudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LmRpc3BsYXlBbGxDaGlsZCA9IGZhbHNlO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAoIWtleVNlYXJjaCB8fCAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LnNlYXJjaEFsbExldmVsICYmICh0ZXh0LmluY2x1ZGVzKGtleVNlYXJjaCkgfHwgdGV4dEVzY2FwZS5pbmNsdWRlcyhrZXlTZWFyY2gpKSkpIHtcbiAgICAgICAgaXRlbU1hcC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5kaXNwbGF5QWxsQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgIGN1cnJlbnQuaGFzRGlzcGxheSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtR3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG5cbiAgICAgIGl0ZW1NYXAudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGN1cnJlbnRbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZpbHRlckl0ZW1zRGlzcGxheSh0aGlzLmNvbnZlcnREYXRhQnlHcm91cEluSXRlbShpdGVtR3JvdXAoKSwgaXRlbU1hcCkpO1xuXG4gICAgICAgIGNoaWxkcmVuLnNldChkYXRhKTtcbiAgICAgICAgaWYgKGN1cnJlbnRbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCkpIHtcbiAgICAgICAgICBjdXJyZW50W2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10udXBkYXRlKChpdGVtRmllbGRzOiBBcnJheTxhbnk+KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWl0ZW1GaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtRmllbGRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbUZpZWxkc1swXS5pc0ZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IGl0ZW1GaWVsZHM/Lmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICBpdGVtRmllbGRzW2xhc3RJbmRleF0uaXNMYXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1GaWVsZHM7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudC5ib251c1BhZGRpbmdMZWZ0ID0gMDtcbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Qm9udXNQYWRkaW5nTGVmdEl0ZW0pIHtcbiAgICAgICAgICBjdXJyZW50LmJvbnVzUGFkZGluZ0xlZnQgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEJvbnVzUGFkZGluZ0xlZnRJdGVtKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldENsYXNzSW5jbHVkZUl0ZW1Ob0RhdGEpIHtcbiAgICAgICAgICBjdXJyZW50LmNsYXNzSW5jbHVkZUl0ZW1Ob0RhdGEgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldENsYXNzSW5jbHVkZUl0ZW1Ob0RhdGEoY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudC5hdmF0YXJDb25maWcgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEF2YXRhckNvbmZpZyAmJiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEF2YXRhckNvbmZpZyhjdXJyZW50KTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpICYmIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5sZW5ndGggJiYgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/LnNvbWUoa2V5ID0+IGtleSA9PT0gaXRlbU1hcCgpW3RoaXMuZmllbGRLZXkoKV0pKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlckNoYW5nZUNoZWNrZWQodHJ1ZSwgaXRlbU1hcCwgZmFsc2UsIHRydWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5idWlsZFZhbHVlQnlDb25maWcoaXRlbU1hcCk7XG5cbiAgICAgIHJldHVybiBpdGVtTWFwO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5zZWFyY2hBbGxMZXZlbCAmJiB0aGlzLmtleVNlYXJjaCgpKSB7XG4gICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0oKS5oYXNEaXNwbGF5XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jb25maWcoKT8uc29ydD8uKGl0ZW1zKTtcbiAgICB0aGlzLml0ZW1zLnNldChpdGVtcyk7XG4gICAgdGhpcy5tdWx0aUtleVNlbGVjdGVkLnNldChbXSlcbiAgICBjb25zdCBjYWxsQmFja0NhbGN1bGF0b3JIZWlnaHRTdWNjZXNzID0gKCkgPT4ge1xuICAgICAgdGhpcy5jYWxjdWxhdG9ySGVpZ2hJdGVtU3VjY2Vzcy5zZXQodHJ1ZSk7XG5cbiAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmV4cGFuZEZpcnN0SXRlbSAmJiB0aGlzLml0ZW1zKClbMF0pIHtcbiAgICAgICAgdGhpcy5leHBhbmRBbGxJdGVtc0luR3JvdXAodGhpcy5pdGVtcygpWzBdKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRIZWlnaHRWaWV3UG9ydCgpO1xuICAgICAgaWYgKHRoaXMuZmlyc3RJdGVtU2VsZWN0ZWQgJiYgdGhpcy5maXJzdEl0ZW1TZWxlY3RlZCgpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlckNoYW5nZUNoZWNrZWQodHJ1ZSwgdGhpcy5maXJzdEl0ZW1TZWxlY3RlZCwgZmFsc2UpO1xuICAgICAgICB0aGlzLmZpcnN0SXRlbVNlbGVjdGVkLnNldCh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgY2hlY2tMb2FkSXRlbSA9IChwcmVTdGF0ZUhhc1Njcm9sbDogYm9vbGVhbiwgY3VycmVudEhhc1Njcm9sbDogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKHRoaXMua2V5c0hpZGRlbkl0ZW0oKT8ubGVuZ3RoICYmIHByZVN0YXRlSGFzU2Nyb2xsICYmICFjdXJyZW50SGFzU2Nyb2xsICYmICh0aGlzLmlzU2VhcmNoT25saW5lKCkpKSB7XG4gICAgICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZShmYWxzZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgICB0aGlzLnJlZnJlc2hWaWV3KGNhbGxCYWNrQ2FsY3VsYXRvckhlaWdodFN1Y2Nlc3MsIGNoZWNrTG9hZEl0ZW0pO1xuICAgICAgdGhpcy5vdXRMb2FkSXRlbXNDb21wbGV0ZS5lbWl0KHsgaXRlbXM6IHRoaXMuaXRlbXMoKSB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaFZpZXcoY2FsbEJhY2tDYWxjdWxhdG9ySGVpZ2h0U3VjY2Vzcz86ICgpID0+IHZvaWQsIGNoZWNrTG9hZEl0ZW0/OiAocHJlU3RhdGVIYXNTY3JvbGw6IGJvb2xlYW4sIGN1cnJlbnRIYXNTY3JvbGw6IGJvb2xlYW4pID0+IHZvaWQpIHtcbiAgICB0aGlzLnNldEhlaWdodFZpZXdQb3J0KGNhbGxCYWNrQ2FsY3VsYXRvckhlaWdodFN1Y2Nlc3MpO1xuICAgIHRoaXMuY2hlY2tWaWV3UG9ydFNjcm9sbChjaGVja0xvYWRJdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwYW5kQWxsSXRlbXNJbkdyb3VwKGl0ZW06IGFueSkge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgIWl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXRlbS5leHBhbmQgPSB0cnVlO1xuICAgIGNvbnN0IGl0ZW1zOiBBcnJheTxhbnk+ID0gaXRlbVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdO1xuXG4gICAgaWYgKCFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW1zLmZvckVhY2goaXRlbUdyb3VwID0+IHRoaXMuZXhwYW5kQWxsSXRlbXNJbkdyb3VwKGl0ZW1Hcm91cCkpO1xuICB9XG5cblxuICBwcml2YXRlIGNvbnZlcnREYXRhQnlHcm91cEluSXRlbShpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4sIHBhcmVudEl0ZW06IFdyaXRhYmxlU2lnbmFsPGFueT4pIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zTWFwID0gaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgaWYgKGlzTmlsKGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKSB8fCBpdGVtKClbdGhpcy5maWVsZEtleSgpXSA9PT0gJycpIHtcbiAgICAgICAgaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0gPSBgJHt0aGlzLlBBVFRFUk5fRkFLRV9JRH0ke3V1aWQoKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbU1hcCA9IGNsb25lRGVlcChpdGVtKSBhcyBXcml0YWJsZVNpZ25hbDxhbnk+O1xuXG4gICAgICBpdGVtTWFwLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5yZWYgPSBpdGVtO1xuICAgICAgICBjdXJyZW50LnBhcmVudEl0ZW0gPSBwYXJlbnRJdGVtO1xuICAgICAgICBjdXJyZW50W3RoaXMuZmllbGRLZXkoKV0gPSBpdGVtKClbdGhpcy5maWVsZEtleSgpXTtcblxuICAgICAgICBjdXJyZW50Lm1heExldmVsR3JvdXAgPSBwYXJlbnRJdGVtKCkubWF4TGV2ZWxHcm91cDtcbiAgICAgICAgY3VycmVudC5sZXZlbCA9IHBhcmVudEl0ZW0oKS5sZXZlbCArIDE7XG4gICAgICAgIGN1cnJlbnQuYXJyYXlMZXZlbCA9IHJhbmdlKDIsIGN1cnJlbnQubGV2ZWwgKyAxKTtcbiAgICAgICAgaWYgKChjdXJyZW50LmxldmVsID09PSBjdXJyZW50Lm1heExldmVsR3JvdXAgfHwgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hJdGVtKSAmJiAhU3RyaW5nKGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKT8uaW5jbHVkZXModGhpcy5QQVRURVJOX0ZBS0VfSUQpKSB7XG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW0udXBkYXRlKGN1cnJlbnQgPT4gY3VycmVudCsrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnQuZXhwYW5kID0gdGhpcy5rZXlTZWFyY2goKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgaWYgKCF0aGlzLmtleVNlYXJjaCgpICYmIGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0RXhwYW5kSXRlbSkge1xuICAgICAgICAgIGN1cnJlbnQuZXhwYW5kID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRFeHBhbmRJdGVtKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQuZGlzcGxheUFsbENoaWxkID0gcGFyZW50SXRlbSgpLmRpc3BsYXlBbGxDaGlsZDtcbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0UG9wb3Zlckl0ZW0pIHtcbiAgICAgICAgICBjdXJyZW50LmRhdGFQb3BvdmVyID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRQb3BvdmVySXRlbShjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRJY29uSW1hZ2VDbGFzcykge1xuICAgICAgICAgIGN1cnJlbnQuaWNvbkltYWdlQ2xhc3MgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEljb25JbWFnZUNsYXNzKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRleHQgPSBkZWxldGVVbmljb2RlKHRoaXMuYnVpbGRWYWx1ZUJ5Q29uZmlnKGlzU2lnbmFsKGN1cnJlbnQpID8gY3VycmVudCBhcyBXcml0YWJsZVNpZ25hbDxhbnk+IDogc2lnbmFsKGN1cnJlbnQpKS50b0xvY2FsZUxvd2VyQ2FzZSgpKTtcbiAgICAgICAgY29uc3Qga2V5U2VhcmNoID0gZGVsZXRlVW5pY29kZShlc2NhcGVIdG1sKCh0aGlzLmtleVNlYXJjaCgpIHx8ICcnKS50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoKSkpO1xuICAgICAgICBjb25zdCB0ZXh0RXNjYXBlID0gZXNjYXBlSHRtbCh0ZXh0KTtcbiAgICAgICAgaWYgKCghdGhpcy5rZXlzSGlkZGVuSXRlbSgpPy5zb21lKGtleSA9PiBrZXkgPT09IGN1cnJlbnRbdGhpcy5maWVsZEtleSgpXSkpICYmICgocGFyZW50SXRlbSgpLmRpc3BsYXlBbGxDaGlsZCB8fCAha2V5U2VhcmNoKSB8fCAoKGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgIWN1cnJlbnRbdGhpcy5maWVsZEtleSgpXS5pbmNsdWRlcyh0aGlzLlBBVFRFUk5fRkFLRV9JRCkpICYmICh0ZXh0LmluY2x1ZGVzKGtleVNlYXJjaCkgfHwgdGV4dEVzY2FwZS5pbmNsdWRlcyhrZXlTZWFyY2gpKSkpKSB7XG4gICAgICAgICAgY3VycmVudC5kaXNwbGF5QWxsQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc2V0RGlzcGxheUl0ZW0oY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbUdyb3VwID0gY3VycmVudFtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgICAgaWYgKGl0ZW1Hcm91cD8uKCkpIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5maWx0ZXJJdGVtc0Rpc3BsYXkodGhpcy5jb252ZXJ0RGF0YUJ5R3JvdXBJbkl0ZW0oaXRlbUdyb3VwPy4oKSwgc2lnbmFsKGN1cnJlbnQpKSk7XG4gICAgICAgICAgaXRlbUdyb3VwLnNldChkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50W2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpKSB7XG4gICAgICAgICAgY3VycmVudFtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdLnVwZGF0ZSgoaXRlbUZpZWxkczogQXJyYXk8YW55PikgPT4ge1xuICAgICAgICAgICAgaWYgKCFpdGVtRmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gaXRlbUZpZWxkcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW1GaWVsZHNbMF0uaXNGaXJzdCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBpdGVtRmllbGRzPy5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgICBpZiAobGFzdEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgaXRlbUZpZWxkc1tsYXN0SW5kZXhdLmlzTGFzdCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBpdGVtRmllbGRzO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQuYm9udXNQYWRkaW5nTGVmdCA9IDA7XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldEJvbnVzUGFkZGluZ0xlZnRJdGVtKSB7XG4gICAgICAgICAgY3VycmVudC5ib251c1BhZGRpbmdMZWZ0ID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRCb251c1BhZGRpbmdMZWZ0SXRlbShjdXJyZW50LCBwYXJlbnRJdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRDbGFzc0luY2x1ZGVJdGVtTm9EYXRhKSB7XG4gICAgICAgICAgY3VycmVudC5jbGFzc0luY2x1ZGVJdGVtTm9EYXRhID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRDbGFzc0luY2x1ZGVJdGVtTm9EYXRhKGN1cnJlbnQsIHBhcmVudEl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldExpbmtJbWFnZUVycm9yKSB7XG4gICAgICAgICAgY3VycmVudC5saW5rSW1hZ2VFcnJvciA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0TGlua0ltYWdlRXJyb3IoY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Q2xhc3NJbmNsdWRlSXRlbUNvbnRlbnQpIHtcbiAgICAgICAgICBjdXJyZW50LmNsYXNzSW5jbHVkZSA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Q2xhc3NJbmNsdWRlSXRlbUNvbnRlbnQoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudC5hdmF0YXJDb25maWcgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEF2YXRhckNvbmZpZyAmJiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEF2YXRhckNvbmZpZyhjdXJyZW50KTtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpICYmIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5sZW5ndGggJiYgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/LnNvbWUoa2V5ID0+IGtleSA9PT0gY3VycmVudFt0aGlzLmZpZWxkS2V5KCldKSkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlckNoYW5nZUNoZWNrZWQodHJ1ZSwgc2lnbmFsKGN1cnJlbnQpLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0Rmlyc3RJdGVtKCkgJiYgY3VycmVudC5sZXZlbCA9PT0gY3VycmVudC5tYXhMZXZlbEdyb3VwKSB7XG4gICAgICAgICAgdGhpcy5maXJzdEl0ZW1TZWxlY3RlZC5zZXQoY3VycmVudCk7XG4gICAgICAgICAgdGhpcy5zZWxlY3RGaXJzdEl0ZW0uc2V0KGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBpdGVtTWFwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGl0ZW1zTWFwO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREaXNwbGF5SXRlbShpdGVtOiBhbnkpIHtcbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXRlbS5oYXNEaXNwbGF5ID0gdHJ1ZTtcblxuICAgIGlmIChpdGVtLnBhcmVudEl0ZW0pIHtcbiAgICAgIHRoaXMuc2V0RGlzcGxheUl0ZW0oaXRlbS5wYXJlbnRJdGVtKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckl0ZW1zRGlzcGxheShpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4pOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+PiB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBpdGVtc0Rpc3BsYXkgPSBpdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtKCkuaGFzRGlzcGxheSk7XG5cbiAgICBpdGVtc0Rpc3BsYXkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1Hcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdO1xuICAgICAgaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LnNldCh0aGlzLmZpbHRlckl0ZW1zRGlzcGxheShpdGVtR3JvdXAoKSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGl0ZW1zRGlzcGxheTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRMZW5ndGhJdGVtKCk6IG51bWJlciB7XG4gICAgY29uc3QgZGF0YSA9IHsgbGVuZ3RoOiB0aGlzLml0ZW1zKCkubGVuZ3RoIH07XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPiB0aGlzLm1heEl0ZW1TaG93KCkpIHtcbiAgICAgIHJldHVybiBkYXRhLmxlbmd0aDtcbiAgICB9XG4gICAgdGhpcy5nZXRMZW5ndGhBbGxHcm91cCh0aGlzLml0ZW1zKCksIGRhdGEpO1xuXG4gICAgcmV0dXJuIGRhdGEubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMZW5ndGhBbGxHcm91cChpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4sIGRhdGE6IHsgbGVuZ3RoOiBudW1iZXIgfSkge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBpZiAoIWl0ZW0oKS5leHBhbmQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBncm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcblxuICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRhdGEubGVuZ3RoICs9IChncm91cD8uKCk/Lmxlbmd0aCB8fCAwKTtcbiAgICAgIGlmICgoIWdyb3VwPy4oKSB8fCAhZ3JvdXA/LigpLmxlbmd0aCkgJiYgaXRlbSgpLmxldmVsID09PSAxICYmICghY29uZmlnVGVtcGxhdGVHcm91cC5zZWFyY2hBbGxMZXZlbCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmF1dG9Db3VudFdoZW5Hcm91cEVtcHR5SXRlbUxldmVsMSkpIHtcbiAgICAgICAgZGF0YS5sZW5ndGggKz0gMTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEubGVuZ3RoID4gdGhpcy5tYXhJdGVtU2hvdygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0TGVuZ3RoQWxsR3JvdXAoZ3JvdXAoKSwgZGF0YSk7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiB0aGlzLm1heEl0ZW1TaG93KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRIZWlnaHRHcm91cEhhc0xpbmUoKSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXA/Lmlnbm9yZUdyb3VwTGluZSB8fCAhdGhpcy5pdGVtcygpPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICBsZXQgY291bnQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXMoKSkge1xuICAgICAgaWYgKGxlbmd0aCA+PSB0aGlzLm1heEl0ZW1TaG93KCkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb3VudCArPSAxO1xuICAgICAgbGVuZ3RoICs9IDE7XG4gICAgICBjb25zdCBncm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgIGNvbnN0IGRhdGEgPSB7IGxlbmd0aDogaXRlbSgpLmV4cGFuZCA/IGdyb3VwKCk/Lmxlbmd0aCB8fCAwIDogMCB9O1xuXG4gICAgICB0aGlzLmdldExlbmd0aEFsbEdyb3VwKGdyb3VwKCksIGRhdGEpO1xuICAgICAgbGVuZ3RoICs9IGRhdGEubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBtYXJnaW5Ub3BIYXNMaW5lID0gY29uZmlnVGVtcGxhdGVHcm91cC5tYXJnaW5Ub3BIYXNMaW5lIHx8IDQ7XG4gICAgY29uc3QgaGVpZ2h0ID0gY291bnQgPT09IDEgPyBtYXJnaW5Ub3BIYXNMaW5lIDogKGNvdW50IC0gMSkgKiAobWFyZ2luVG9wSGFzTGluZSAqIDMgKyAxKTtcblxuICAgIHJldHVybiBoZWlnaHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGRWYWx1ZUJ5Q29uZmlnKGl0ZW06IFdyaXRhYmxlU2lnbmFsPGFueT4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhYmVsU2VhcmNoID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldExhYmVsU2VhcmNoPy4oaXRlbSgpKTtcblxuICAgIGlmIChpdGVtKCkuaXNSb290KSB7XG4gICAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldExhYmVsR3JvdXApIHtcbiAgICAgICAgaXRlbSgpLmZpZWxkTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0TGFiZWxHcm91cChpdGVtKCkpIHx8ICcgJyk7XG5cbiAgICAgICAgcmV0dXJuIGxhYmVsU2VhcmNoID8/IGl0ZW0oKS5maWVsZExhYmVsO1xuICAgICAgfVxuICAgICAgaXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQuZmllbGRMYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGN1cnJlbnQubGFiZWwgfHwgY3VycmVudC5uYW1lIHx8ICcgJyk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGl0ZW0oKS5maWVsZExhYmVsO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldExhYmVsSXRlbSkge1xuICAgICAgaXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQuZmllbGRMYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRMYWJlbEl0ZW0oY3VycmVudCkgfHwgJyAnKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbGFiZWxTZWFyY2ggPz8gaXRlbSgpLmZpZWxkTGFiZWw7XG4gICAgfVxuICAgIGl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgY3VycmVudC5maWVsZExhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoY3VycmVudC5sYWJlbCB8fCBjdXJyZW50Lm5hbWUgfHwgJyAnKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGFiZWxTZWFyY2ggPz8gaXRlbSgpLmZpZWxkTGFiZWw7XG4gIH1cbn1cbiIsIkBpZiAoY29uZmlnVGVtcGxhdGVHcm91cCgpOyBhcyBjb25maWdUZW1wbGF0ZUdyb3VwKSB7XG4gIEBsZXQgdmFySHRtbEhlaWdodFZpZXdQb3J0ID0gaGVpZ2h0Vmlld1BvcnQoKSA/IGhlaWdodFZpZXdQb3J0KCkrJ3B4JzonMTAwJSc7XG4gIEBsZXQgdmFySHRtbERpc2FibGUgPSBsb2FkaW5nKCkgfHwgZGlzYWJsZSgpIHx8IGZhbHNlO1xuICA8ZGl2IGNsYXNzPVwibGlicy11aS1saXN0LWdyb3VwIG92ZXJmbG93LVtoaWRkZW5dXCJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cInZhckh0bWxIZWlnaHRWaWV3UG9ydFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGwgcmVsYXRpdmUgbWluLWgtWzI4cHhdXCI+XG4gICAgICBAaWYgKGl0ZW1zKCkubGVuZ3RoICYmIGNvbmZpZ1RlbXBsYXRlR3JvdXAuY29uZmlnQnV0dG9uU2VsZWN0QW5kVW5kU2VsZWN0SXRlbT8uKCk7IGFzIGNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0pIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIFtjbGFzc109XCInZmxleCBpdGVtcy1jZW50ZXIgYmctWyNmZmZmZmZdICcrKGNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uY2xhc3NJbmNsdWRlID8/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbCcpXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgW3R5cGVdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25DaGVja0FsbD8udHlwZSA/PyAnYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uQ2hlY2tBbGw/LmxhYmVsID8/ICdpMThuX3NlbGVjdF9hbGxfc2VhcmNoZWRfcmVzdWx0cydcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvbkNoZWNrQWxsPy5jbGFzc0luY2x1ZGUgfHwgJ3ByLVs4cHhdJ1wiXG4gICAgICAgICAgICBbY2xhc3NMYWJlbF09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvbkNoZWNrQWxsPy5jbGFzc0xhYmVsIHx8ICdsaWJzLXVpLWZvbnQtaDZyJ1wiXG4gICAgICAgICAgICBbZGlzYWJsZV09XCJ2YXJIdG1sRGlzYWJsZVwiXG4gICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNoZWNrZWRPclVuQ2hlY2tlZEFsbCh0cnVlKVwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtWyM5OTk5OTldXCI+fDwvZGl2PlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgIFt0eXBlXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uVW5jaGVja0FsbD8udHlwZSA/PyAnYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uVW5jaGVja0FsbD8ubGFiZWwgPz8gJ2kxOG5fdW5zZWxlY3RfYWxsX3NlYXJjaGVkX3Jlc3VsdHMnXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25VbmNoZWNrQWxsPy5jbGFzc0luY2x1ZGUgfHwgJ3BsLVs4cHhdJ1wiXG4gICAgICAgICAgICBbY2xhc3NMYWJlbF09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvblVuY2hlY2tBbGw/LmNsYXNzTGFiZWwgfHwgJ2xpYnMtdWktZm9udC1oNnMnXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cInZhckh0bWxEaXNhYmxlXCJcbiAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2hlY2tlZE9yVW5DaGVja2VkQWxsKGZhbHNlKVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChpdGVtcygpLmxlbmd0aCAmJiBjb25maWdUZW1wbGF0ZUdyb3VwLmNvbmZpZ0NoZWNrYm94Q2hlY2tBbGw/LigpOyBhcyBjb25maWdDaGVja0JveCkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgW2NsYXNzXT1cIidmbGV4IGxpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsICcrKGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlSGFzQ29uZmlnQ2hlY2tCb3hBbGwgPz8gJyBiZy1bI2ZmZmZmZl0nKVwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlIFtsYWJlbF09XCJjb25maWdDaGVja0JveC5sYWJlbCA/PyAnaTE4bl9hbGwnXCJcbiAgICAgICAgICAgIFtjbGFzc0xhYmVsSW5jbHVkZV09XCJjb25maWdDaGVja0JveC5jbGFzc0xhYmVsSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJ0b3RhbEl0ZW1DaGVja2VkKCkgPj0gdG90YWxJdGVtKCkgJiYgdG90YWxJdGVtKCkgPiAwXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cInZhckh0bWxEaXNhYmxlXCJcbiAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlUG9wb3Zlcik9J2hhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKCRldmVudCknXG4gICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGVja2VkT3JVbkNoZWNrZWRBbGwoJGV2ZW50LmNoZWNrZWQpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGl0ZW1zKCkgJiYgaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBoLWZ1bGwgcmVsYXRpdmUgZmxleFwiPlxuICAgICAgICAgIDxkaXYgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVcbiAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIGgtZnVsbCBhYnNvbHV0ZSB0b3AtMCBsZWZ0LTAge3sgY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0luY2x1ZGVHcm91cCA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlR3JvdXAgOiAnJyB9fVwiPlxuICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBpdGVtcygpOyB0cmFjayBpdGVtKClbZmllbGRLZXkoKV07IGxldCBmaXJzdCA9ICRmaXJzdDsgbGV0IGxhc3QgPSAkbGFzdCkge1xuICAgICAgICAgICAgICA8ZGl2ICNpdGVtUmVmXG4gICAgICAgICAgICAgICAgW3N0eWxlLm1hcmdpblRvcC5weF09XCIhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVHcm91cExpbmUgPyBjb25maWdUZW1wbGF0ZUdyb3VwLm1hcmdpblRvcEhhc0xpbmUgfHwgNCA6IDBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCByZWxhdGl2ZSBcIj5cbiAgICAgICAgICAgICAgICBAbGV0IHZhckh0bWxQYWRkaW5nID0gbGV2ZWwoKSooY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlID8gOCA6IDE2KTtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHktWzZweF0gXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJnLWxpc3QtaG92ZXJdPVwiIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2xpY2tMYWJlbEdyb3VwXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJnLWxpc3QtaG92ZXItYWN0aXZlXT1cIiFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNsaWNrTGFiZWxHcm91cFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuIWN1cnNvci1wb2ludGVyXT1cIiFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNsaWNrTGFiZWxHcm91cCAgJiYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nTGVmdC5weF09XCJ2YXJIdG1sUGFkZGluZ1wiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUucGFkZGluZ1JpZ2h0LnB4XT1cInZhckh0bWxQYWRkaW5nXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCIoY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGVja2JveEdyb3VwIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSkgPyBoYW5kbGVyVG9nZ2xlRXhwYW5kKCRldmVudCxpdGVtKSA6IHVuZGVmaW5lZFwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnJvdGF0ZS05MF09XCJpdGVtKCkuZXhwYW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlclRvZ2dsZUV4cGFuZCgkZXZlbnQsaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudy1mdWxsXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlICYmICghY29uZmlnVGVtcGxhdGVHcm91cC5zZWFyY2hBbGxMZXZlbCB8fCAhIWl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy4oKT8ubGVuZ3RoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy53LVtjYWxjKDEwMCUtMTZweCldXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZVwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1JhZGlvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGUgW2F2YXRhckNvbmZpZ109XCJpdGVtKCkuYXZhdGFyQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5tbC1bOHB4XV09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lnbm9yZUNoZWNrYm94XT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlSXRlbSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudy1hdXRvXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudy1mdWxsXT1cIiFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCAmJiAhKChjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC53aWR0aExhYmVsU3ViMjRXaGVuTm90VHJlZVZpZXcpICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1heC13LVtjYWxjKDEwMCUtMjRweCldXT1cIihjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC53aWR0aExhYmVsU3ViMjRXaGVuTm90VHJlZVZpZXcpICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiaXRlbSgpLmZpZWxkTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiaXRlbSgpLmRhdGFQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhMYWJlbF09XCJjb25maWdUZW1wbGF0ZUdyb3VwLnpJbmRleExhYmVsID8/IHpJbmRleCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhQ29tcG9uZW50T3V0bGV0XT1cIih1bmRlZmluZWQgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0RGF0YUNvbXBvbmVudE91dGxldEdyb3VwOml0ZW0oKTpmaWVsZEtleSgpOnt2YWx1ZUlzRW1wdHk6e2l0ZW06aXRlbSgpfX0pIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudE91dGxldF09XCIoMCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6Y29uZmlnVGVtcGxhdGVHcm91cC5nZXRDb21wb25lbnRPdXRsZXRHcm91cDppdGVtKCk6ZmllbGRLZXkoKTp7dmFsdWVJczA6MH0pIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xpbmtJbWFnZV09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmdldEltYWdlID8gKCgnYXZhdGFyJyB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6KGl0ZW0oKS5zcGVjaWZpY19sb2FkSW1nRXJyb3IgJiYgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvciA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0TGlua0ltYWdlRXJyb3IgOiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEltYWdlKTppdGVtKCkpIHwgYXN5bmMpIDogaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRBdmF0YXJJdGVtIHx8ICcnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW1nVHlwZUljb25dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pbWdUeXBlSWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NMYWJlbEluY2x1ZGVdPVwiKGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NMYWJlbEl0ZW0gPyBjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzTGFiZWxJdGVtIDogKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSA/ICcgbGlicy11aS1mb250LWg2ciAnOicgbGlicy11aS1mb250LWg2cyAnKSkgKyAoKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlVGV4dFVwcGVyY2FzZUxhYmVsR3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlKSA/ICcnOicgdGV4dC11cHBlcmNhc2UgJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IChpdGVtKClbZmllbGRLZXkoKV0gfCBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlOmtleXNEaXNhYmxlSXRlbSgpOmtleXNEaXNhYmxlSXRlbSgpPy5sZW5ndGgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIml0ZW0oKVtmaWVsZEtleSgpXSB8IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGU6a2V5c0NoZWNrZWQoKTprZXlzQ2hlY2tlZCgpLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3RpbGxPdGhlck9wdGlvbnNdPVwiaXRlbSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZTprZXlzU3RpbGxPdGhlck9wdGlvbnMoKTprZXlzU3RpbGxPdGhlck9wdGlvbnMoKS5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQ2hlY2tlZCgkZXZlbnQuY2hlY2tlZCxpdGVtLCB0cnVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIpPSdoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKG91dENsaWNrTGFiZWwpPVwiaGFuZGxlclRvZ2dsZUV4cGFuZCgnY2xpY2tMYWJlbCcsaXRlbSxjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoZWNrYm94R3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3UmFkaW8pIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXJhZGlvLXNpbmdsZVxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1sLVs4cHhdXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXZhdGFyQ29uZmlnXT1cIml0ZW0oKS5hdmF0YXJDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lnbm9yZVJhZGlvXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlUmFkaW9Hcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlSXRlbSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudy1hdXRvXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudy1mdWxsXT1cIiFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCAmJiAhKChjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC53aWR0aExhYmVsU3ViMjRXaGVuTm90VHJlZVZpZXcpICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1heC13LVtjYWxjKDEwMCUtMjRweCldXT1cIihjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC53aWR0aExhYmVsU3ViMjRXaGVuTm90VHJlZVZpZXcpICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiaXRlbSgpLmZpZWxkTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiaXRlbSgpLmRhdGFQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhQ29tcG9uZW50T3V0bGV0XT1cIih1bmRlZmluZWQgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0RGF0YUNvbXBvbmVudE91dGxldEdyb3VwOml0ZW0oKTpmaWVsZEtleSgpOnt2YWx1ZUlzRW1wdHk6e2l0ZW06aXRlbSgpfX0pIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudE91dGxldF09XCIoMCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6Y29uZmlnVGVtcGxhdGVHcm91cC5nZXRDb21wb25lbnRPdXRsZXRHcm91cDppdGVtKCk6ZmllbGRLZXkoKTp7dmFsdWVJczA6MH0pIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleExhYmVsXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuekluZGV4TGFiZWwgPz8gekluZGV4KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2ltZ1R5cGVJY29uXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaW1nVHlwZUljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xpbmtJbWFnZV09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmdldEltYWdlID8gKCgnYXZhdGFyJyB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6KGl0ZW0oKS5zcGVjaWZpY19sb2FkSW1nRXJyb3IgJiYgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvciA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0TGlua0ltYWdlRXJyb3IgOiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEltYWdlKTppdGVtKCkpIHwgYXN5bmMpIDogaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRBdmF0YXJJdGVtIHx8ICcnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NMYWJlbEluY2x1ZGVdPVwiKGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NMYWJlbEl0ZW0gPyBjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzTGFiZWxJdGVtIDogJ2xpYnMtdWktZm9udC1oNnMgJykgKyAoY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVUZXh0VXBwZXJjYXNlTGFiZWxHcm91cCA/ICcnOicgdXBwZXJjYXNlJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IChjb25maWdUZW1wbGF0ZUdyb3VwLmRpc2FibGVJdGVtTm90TGFzdExldmVsICYmICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0gfHwgKGl0ZW0oKVtmaWVsZEtleSgpXSB8IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGU6a2V5c0Rpc2FibGVJdGVtKCk6a2V5c0Rpc2FibGVJdGVtKCk/Lmxlbmd0aClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJpdGVtKClbZmllbGRLZXkoKV0gfCBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlOmtleXNDaGVja2VkKCk6a2V5c0NoZWNrZWQoKS5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQ2hlY2tlZCgkZXZlbnQuYWN0aXZlLGl0ZW0sIHRydWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlUG9wb3Zlcik9J2hhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKCRldmVudCknXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2xpY2tMYWJlbCk9XCJoYW5kbGVyVG9nZ2xlRXhwYW5kKCdjbGlja0xhYmVsJyxpdGVtLGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlUmFkaW9Hcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbSgpLmJ1dHRvbkluR3JvdXA7IGFzIGJ1dHRvbkluR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cImJ1dHRvbkluR3JvdXAudHlwZSB8fCAnYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImJ1dHRvbkluR3JvdXAubGFiZWwgfHwgJyAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIihidXR0b25Jbkdyb3VwLmNsYXNzSWNvbkxlZnQgfHwgJycpKycgZmxleCBtci1bOHB4XSAhdGV4dC1bOHB4XSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJidXR0b25Jbkdyb3VwLmNsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NMYWJlbF09XCJidXR0b25Jbkdyb3VwLmNsYXNzTGFiZWwgfHwgJ2xpYnMtdWktZm9udC1oNXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImJ1dHRvbkluR3JvdXAuZGlzYWJsZSB8fCBkaXNhYmxlKCkgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGlja0J1dHRvbkdyb3VwKGJ1dHRvbkluR3JvdXAsaXRlbSgpKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlICYmICghY29uZmlnVGVtcGxhdGVHcm91cC5zZWFyY2hBbGxMZXZlbCB8fCAhIWl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy4oKT8ubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyIGxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuIW1sLVs4cHhdXT1cIml0ZW0oKS5kYXRhUG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnJvdGF0ZS05MF09XCJpdGVtKCkuZXhwYW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlclRvZ2dsZUV4cGFuZCgkZXZlbnQsaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIEBpZiAoaXRlbSgpLmV4cGFuZCAmJiBjYWxjdWxhdG9ySGVpZ2hJdGVtU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWxpc3QtdGVtcGxhdGVzX2dyb3VwLWl0ZW0gW2tleVNlYXJjaF09XCJrZXlTZWFyY2goKVwiXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW3BhcmVudEl0ZW1dPVwiaXRlbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZpZWxkS2V5XT1cImZpZWxkS2V5KClcIlxuICAgICAgICAgICAgICAgICAgICBba2V5c0NoZWNrZWRdPVwia2V5c0NoZWNrZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtrZXlzRGlzYWJsZUl0ZW1dPVwia2V5c0Rpc2FibGVJdGVtKCkgfHwgW11cIlxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnVGVtcGxhdGVHcm91cF09XCJjb25maWdUZW1wbGF0ZUdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJjb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtrZXlzU3RpbGxPdGhlck9wdGlvbnNdPVwia2V5c1N0aWxsT3RoZXJPcHRpb25zKClcIlxuICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlVmlldyk9XCJoYW5kbGVyQ2hhbmdlVmlldygpXCJcbiAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyKT0naGFuZGxlckNoYW5nU3RhZ2VGbGFnTW91c2UoJGV2ZW50KSdcbiAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlSXRlbUNoZWNrZWQoJGV2ZW50Lml0ZW0pXCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmICghbGFzdCAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVHcm91cExpbmUgJiYgY2FsY3VsYXRvckhlaWdoSXRlbVN1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktbGlzdC1ncm91cC1saW5lXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1hcmdpblRvcC5weF09XCIhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVHcm91cExpbmUgPyBjb25maWdUZW1wbGF0ZUdyb3VwLm1hcmdpblRvcEhhc0xpbmUgfHwgNCA6IDBcIj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmICghaXRlbXMoKSB8fCAhaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwibGlicy11aS1mb250LWg1ciB0ZXh0LVsjYzFjMWMxXSByZWxhdGl2ZSB7eyBjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzSW5jbHVkZU5vZGF0YT9jb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzSW5jbHVkZU5vZGF0YTonJyB9fVwiXG4gICAgICAgICAgW3N0eWxlLm1hcmdpbkxlZnQucHhdPVwiMCB8IExpYnNVaUNvbXBvbmVudHNMaXN0R3JvdXBDYWxjdWxhdG9yTWFyZ2luTGVmdEl0ZW1QaXBlOjI6KGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0Jyk6Y29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlSnNvbjohKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hJdGVtIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlUmFkaW9JdGVtIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSk6dHJ1ZVwiXG4gICAgICAgICAgW2NsYXNzLnB5LVs4cHhdXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRBdmF0YXJJdGVtXCJcbiAgICAgICAgICBbY2xhc3MucHktWzRweF1dPVwiIWNvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRBdmF0YXJJdGVtXCI+XG4gICAgICAgICAgQGlmICgha2V5U2VhcmNoKCkgJiYgIWxvYWRpbmcoKSkge1xuICAgICAgICAgICAgPGRpdj57eyAoY29uZmlnKCk/LnRleHROb0RhdGEgPz8gJ2kxOG5fbm9fZGF0YV95ZXQnKSB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGtleVNlYXJjaCgpICYmICFsb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIDxkaXY+e3sgKGNvbmZpZygpPy50ZXh0U2VhcmNoTm9EYXRhID8/J2kxOG5fbm9fcmVzdWx0JykgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChsb2FkaW5nKCkpIHtcbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zcGlubmVyIFtzaXplXT1cIidtZWRpdW0nXCIgLz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG59XG4iXX0=
|
|
780
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2xpc3Qvc3JjL3RlbXBsYXRlcy9ncm91cC9ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvdGVtcGxhdGVzL2dyb3VwL2dyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQVUsTUFBTSxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUM3RyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RSxPQUFPLEVBQVcsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRyxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RixPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN4RixPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNqRyxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVB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LHFCQUFxQiwwQkFBRSxTQUFTLDZDQUFFLGVBQWUsNEZBQ2pELHNDQUFzQyxzakJBQ3RDLHVDQUF1QywwcEJBQ3ZDLG9DQUFvQywyaEJBQ3BDLGdDQUFnQyxpR0FDaEMsc0NBQXNDLHdTQUN0Qyw0QkFBNEIsZ0VBQzVCLHFDQUFxQyx5RUFDckMscURBQXFELDhGQUNyRCxzQ0FBc0M7OzRGQUc3QixrQ0FBa0M7a0JBcEI5QyxTQUFTOytCQUVFLHlDQUF5QyxjQUd2QyxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7d0JBQ1AscUJBQXFCLEVBQUUsU0FBUyxFQUFFLGVBQWU7d0JBQ2pELHNDQUFzQzt3QkFDdEMsdUNBQXVDO3dCQUN2QyxvQ0FBb0M7d0JBQ3BDLGdDQUFnQzt3QkFDaEMsc0NBQXNDO3dCQUN0Qyw0QkFBNEI7d0JBQzVCLHFDQUFxQzt3QkFDckMscURBQXFEO3dCQUNyRCxzQ0FBc0M7cUJBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQXN5bmNQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGlzU2lnbmFsLCBPbkluaXQsIHNpZ25hbCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZpcnR1YWxTY3JvbGxlck1vZHVsZSB9IGZyb20gJ0BpaGFyYmVjay9uZ3gtdmlydHVhbC1zY3JvbGxlcic7XG5pbXBvcnQgeyBJQnV0dG9uLCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1JhZGlvU2luZ2xlQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1yYWRpby1zaW5nbGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNjcm9sbC1vdmVybGF5JztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zcGlubmVyJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlJztcbmltcG9ydCB7IGNsb25lRGVlcCwgZGVsZXRlVW5pY29kZSwgZXNjYXBlSHRtbCwgaXNFbXB0eSwgaXNOaWwsIHV1aWQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IHJhbmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJTGlzdENvbmZpZ0l0ZW1Hcm91cCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY29uZmlnLWl0ZW0uaW50ZXJmYWNlJztcbmltcG9ydCB7IElMaXN0RGF0YUVtaXRLZXksIElMaXN0RGF0YUVtaXRNdWx0aUtleSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZGF0YS1lbWl0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvY2hlY2stc2VsZWN0ZWQtYnkta2V5LnBpcGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xpc3RUZW1wbGF0ZXNDb21wb25lbnRBYnN0cmFjdCB9IGZyb20gJy4uL3RlbXBsYXRlcy5jb21wb25lbnQuYWJzdHJhY3QnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xpc3RHcm91cEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2l0ZW0vaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xpc3RHcm91cENhbGN1bGF0b3JNYXJnaW5MZWZ0SXRlbVBpcGUgfSBmcm9tICcuL3BpcGVzL2NhbGN1bGF0b3ItbWFyZ2luLWxlZnQtaXRlbS5waXBlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtbGlzdC10ZW1wbGF0ZXNfZ3JvdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ncm91cC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIFZpcnR1YWxTY3JvbGxlck1vZHVsZSwgQXN5bmNQaXBlLCBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNSYWRpb1NpbmdsZUNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSxcbiAgICBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlLFxuICAgIExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0xpc3RHcm91cENhbGN1bGF0b3JNYXJnaW5MZWZ0SXRlbVBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0xpc3RHcm91cEl0ZW1Db21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzTGlzdEdyb3VwQ29tcG9uZW50IGV4dGVuZHMgTGlic1VpQ29tcG9uZW50c0xpc3RUZW1wbGF0ZXNDb21wb25lbnRBYnN0cmFjdCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJvdGVjdGVkIGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtR3JvdXAgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBsZXZlbCA9IHNpZ25hbDxudW1iZXI+KDEpO1xuICBwcm90ZWN0ZWQga2V5c0NoZWNrZWQgPSBzaWduYWw8QXJyYXk8c3RyaW5nPj4oW10pO1xuICBwcm90ZWN0ZWQga2V5c1N0aWxsT3RoZXJPcHRpb25zID0gc2lnbmFsPEFycmF5PHN0cmluZz4+KFtdKTtcbiAgcHJvdGVjdGVkIHRvdGFsSXRlbSA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcm90ZWN0ZWQgdG90YWxJdGVtQ2hlY2tlZCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcm90ZWN0ZWQgY2FsY3VsYXRvckhlaWdoSXRlbVN1Y2Nlc3MgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQga2V5RmV0Y2ggPSBzaWduYWw8c3RyaW5nPignJyk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBQQVRURVJOX0ZBS0VfSUQgPSAnZmFrZS1pZC0nO1xuICBwcml2YXRlIG1hcHBpbmdJdGVtc0NoZWNrZWQgPSBzaWduYWw8TWFwPHN0cmluZywgYW55Pj4obmV3IE1hcCgpKTtcbiAgcHJpdmF0ZSBzZWxlY3RGaXJzdEl0ZW0gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIGZpcnN0SXRlbVNlbGVjdGVkID0gc2lnbmFsPGFueT4odW5kZWZpbmVkKTtcblxuICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKCk/LmNvbmZpZ1RlbXBsYXRlR3JvdXA/LigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwLnNldCh0aGlzLmNvbmZpZygpPy5jb25maWdUZW1wbGF0ZUdyb3VwPy4oKSk7XG4gICAgdGhpcy50aW1lSW50ZXJ2YWxJbnRlcnZhbFNldEhlaWdodFZpZXdQb3J0LnNldCh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8udGltZUludGVydmFsQ2FsY3VsYXRvckhlaWdodCA/PyAwKTtcbiAgICB0aGlzLmZpZWxkS2V5LnNldCh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZmllbGRLZXkgPz8gdGhpcy5maWVsZEtleURlZmF1bHQoKSk7XG4gICAgdGhpcy5zZWxlY3RGaXJzdEl0ZW0uc2V0KGZhbHNlKTtcbiAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/Lm9ubHlTZWxlY3RGaXJzdEl0ZW0gfHwgKCF0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8ubGVuZ3RoICYmIHRoaXMuY29uZmlnKCk/LmF1dG9TZWxlY3RGaXJzdEl0ZW0pKSB7XG4gICAgICB0aGlzLnNlbGVjdEZpcnN0SXRlbS5zZXQodHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZSgpO1xuXG5cbiAgICB0aGlzLm9uVXBkYXRlTXVsdGlLZXlTZWxlY3RlZEdyb3VwKCk/LnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5zdG9yZSgpIHx8ICF0aGlzLnN0b3JlKCkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5c0NoZWNrZWQuc2V0KFtdKTtcblxuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuY2xlYXIoKTtcbiAgICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RvcmUoKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXNFbXB0eShpdGVtKClbdGhpcy5maWVsZEtleSgpXSkpIHtcbiAgICAgICAgICBpdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnRbdGhpcy5maWVsZEtleSgpXSA9IGAke3RoaXMuUEFUVEVSTl9GQUtFX0lEfSR7dXVpZCgpfWA7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1Hcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgICAgY29uc3QgaXRlbU1hcCA9IGNsb25lRGVlcChpdGVtKSBhcyBXcml0YWJsZVNpZ25hbDxhbnk+O1xuXG4gICAgICAgIGl0ZW1NYXAudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQucmVmID0gaXRlbTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGl0ZW1Hcm91cCkge1xuICAgICAgICAgIHRoaXMuY2hlY2tlZEdyb3VwSXRlbXMoaXRlbUdyb3VwKCksIGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKSAmJiB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8ubGVuZ3RoICYmIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5maW5kKGtleSA9PiBrZXkgPT09IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKSkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlckNoYW5nZUNoZWNrZWQodHJ1ZSwgaXRlbU1hcCwgZmFsc2UsICFjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMubXVsdGlLZXlTZWxlY3RlZC5zZXQoW10pO1xuXG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoZWNrZWRPclVuQ2hlY2tlZEFsbChjaGVja2VkOiBib29sZWFuKSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghY2hlY2tlZCkge1xuICAgICAgdGhpcy5pdGVtcygpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmRlbGV0ZShpdGVtKClbdGhpcy5maWVsZEtleSgpXSk7XG4gICAgICAgIGNvbnN0IGl0ZW1zT2ZHcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcblxuICAgICAgICBpZiAoaXRlbXNPZkdyb3VwICYmIGl0ZW1zT2ZHcm91cCgpICYmIGl0ZW1zT2ZHcm91cCgpLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXNPZkdyb3VwKCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGZhbHNlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXRlbXMoKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuc2V0KGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldLCBpdGVtKCkpO1xuICAgICAgY29uc3QgaXRlbXNPZkdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuXG4gICAgICBpZiAoaXRlbXNPZkdyb3VwICYmIGl0ZW1zT2ZHcm91cCgpICYmIGl0ZW1zT2ZHcm91cCgpLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNldENoZWNrQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXNPZkdyb3VwKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja2VkR3JvdXBJdGVtcyhpdGVtcz86IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+LCBwYXJlbnQ/OiBXcml0YWJsZVNpZ25hbDxhbnk+KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAoaXNOaWwoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pIHx8IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSAnJykge1xuICAgICAgICBpdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50W3RoaXMuZmllbGRLZXkoKV0gPSBgJHt0aGlzLlBBVFRFUk5fRkFLRV9JRH0ke3V1aWQoKX1gO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW1Hcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgIGNvbnN0IGl0ZW1NYXAgPSBjbG9uZURlZXAoaXRlbSkgYXMgV3JpdGFibGVTaWduYWw8YW55PjtcblxuICAgICAgaXRlbU1hcC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQucmVmID0gaXRlbTtcbiAgICAgICAgY3VycmVudC5wYXJlbnRJdGVtID0gcGFyZW50O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAoaXRlbUdyb3VwKSB7XG4gICAgICAgIHRoaXMuY2hlY2tlZEdyb3VwSXRlbXMoaXRlbUdyb3VwKCksIGl0ZW0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpICYmIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5sZW5ndGggJiYgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/LmZpbmQoa2V5ID0+IGtleSA9PT0gaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlckNoYW5nZUNoZWNrZWQodHJ1ZSwgaXRlbU1hcCwgZmFsc2UsICFjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZChmYWxzZSwgaXRlbU1hcCwgZmFsc2UsICFjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0J1dHRvbkdyb3VwKGJ1dHRvbkluR3JvdXA6IElCdXR0b24sIGl0ZW06IGFueSkge1xuICAgIGJ1dHRvbkluR3JvdXAuYWN0aW9uPy4oaXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclRvZ2dsZUV4cGFuZChlOiB1bmtub3duLCBpdGVtOiBXcml0YWJsZVNpZ25hbDxhbnk+LCBhY2NlcHRFdmVudCA9IHRydWUpIHtcbiAgICBpZiAoIWFjY2VwdEV2ZW50IHx8IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5pZ25vcmVDbGlja0xhYmVsR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgaXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50LmV4cGFuZCA9ICFjdXJyZW50LmV4cGFuZDtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy5yZWZyZXNoVmlldygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VWaWV3KCkge1xuICAgIHRoaXMucmVmcmVzaFZpZXcoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlSXRlbUNoZWNrZWQoaXRlbTogYW55KSB7XG4gICAgY29uc3QgY2hlY2tlZCA9ICF0aGlzLmtleXNDaGVja2VkKCkuc29tZShrZXkgPT4gaXRlbVt0aGlzLmZpZWxkS2V5KCldID09PSBrZXkpO1xuXG4gICAgaWYgKCFjaGVja2VkICYmIHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5pc1ZpZXdSYWRpbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZXJDaGFuZ2VDaGVja2VkKGNoZWNrZWQsIHNpZ25hbChpdGVtKSwgZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VDaGVja2VkKGNoZWNrZWQ6IGJvb2xlYW4sIGl0ZW06IFdyaXRhYmxlU2lnbmFsPGFueT4sIGlzQ2xpY2tNYW51YWw6IGJvb2xlYW4sIGlzQ2hlY2tlZEJ5RGVmYXVsdEtleT86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVKc29uICYmIGl0ZW0oKS5sZXZlbCAhPT0gaXRlbSgpLm1heExldmVsR3JvdXAgJiYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlZkl0ZW0gPSAoaXRlbSgpLnJlZiB8fCBpdGVtKSBhcyBXcml0YWJsZVNpZ25hbDxhbnk+O1xuXG4gICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSkge1xuICAgICAgY2hlY2tlZCA9IHRydWU7XG4gICAgICBjb25zdCBtYXBwaW5nSXRlbXNDaGVja2VkVGVtcCA9IGNsb25lRGVlcCh0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQpIGFzIFdyaXRhYmxlU2lnbmFsPE1hcDxzdHJpbmcsIGFueT4+O1xuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGl0ZW1DaGVja10gb2YgbWFwcGluZ0l0ZW1zQ2hlY2tlZFRlbXAoKSkge1xuICAgICAgICBjb25zdCBpdGVtQnlLZXkgPSB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5nZXQoa2V5KTtcblxuICAgICAgICBpdGVtQnlLZXkuaXNDaGVja01hbnVhbCA9IGZhbHNlO1xuICAgICAgICBkZWxldGUgaXRlbUJ5S2V5LnJlZi5pc0NoZWNrTWFudWFsO1xuICAgICAgICBpZiAoIWl0ZW1DaGVjay5yZWYuaXNDaGVja2VkQnlEZWZhdWx0S2V5KSB7XG4gICAgICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZGVsZXRlKGtleSk7XG4gICAgICAgICAgdGhpcy5vdXRVblNlbGVjdE11bHRpS2V5LmVtaXQoW2tleV0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWlzQ2hlY2tlZEJ5RGVmYXVsdEtleSkge1xuICAgICAgICBpdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LmlzQ2hlY2tNYW51YWwgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICByZWZJdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LmlzQ2hlY2tNYW51YWwgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpdGVtc09mR3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG4gICAgLy8gYuG7jyBjaOG7jW4gdOG6pXQgY+G6oyBjw6FjIGl0ZW0gxJHhu4MgdGjhu7FjIGhp4buHbiBjaGVjayBs4bqhaVxuICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVKc29uIHx8IChjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW1CeVRyZWUgJiYgIWlzQ2hlY2tlZEJ5RGVmYXVsdEtleSAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5ub3RDaGFuZ2VTdGF0ZUl0ZW1DaGVja090aGVyKSkge1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS52YWx1ZXMoKSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgZGVsZXRlIGl0ZW0uaXNDaGVja01hbnVhbDtcbiAgICAgICAgcmVmSXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgZGVsZXRlIGN1cnJlbnQuaXNDaGVja01hbnVhbDtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLm91dFVuU2VsZWN0TXVsdGlLZXkuZW1pdCh0aGlzLmtleXNDaGVja2VkKCkpO1xuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuY2xlYXIoKTtcbiAgICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGlzQ2xpY2tNYW51YWwsIGl0ZW0pO1xuICAgIH1cblxuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICB0aGlzLmV4cGFuZEFsbEl0ZW1zSW5Hcm91cChpdGVtKTtcbiAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLnNldChpdGVtKClbdGhpcy5maWVsZEtleSgpXSwgaXRlbSgpKTtcbiAgICAgIGlmIChpc0NoZWNrZWRCeURlZmF1bHRLZXkpIHtcbiAgICAgICAgcmVmSXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5pc0NoZWNrZWRCeURlZmF1bHRLZXkgPSBpc0NoZWNrZWRCeURlZmF1bHRLZXk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5pc0NoZWNrZWRCeURlZmF1bHRLZXkgPSByZWZJdGVtKCkuaXNDaGVja2VkQnlEZWZhdWx0S2V5O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5jaG9vc2VDaGlsZFRoZW5BdXRvQ2hvb3NlUGFyZW50KSB7IC8vIGNo4buJIGNo4buNbiBjw6FjIGNoYSB0csOqbiBjw7luZyB0cmVlLCBrbyBxdWFuIHTDom0gbm9kZSBjaGEgY8OzIGPDoWMgY29uIMSRw6MgxJFjIHTDrWNoIGjhur90IGNoxrBhXG4gICAgICAgIGl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuaXNDaGVja01hbnVhbCA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlZkl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuaXNDaGVja01hbnVhbCA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVjdXJzaXZlbHlDaGVja2VkUGFyZW50QnlUcmVlKGl0ZW0oKS5wYXJlbnRJdGVtKTtcblxuICAgICAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hvb3NlUGFyZW50VGhlbkF1dG9DaG9vc2VDaGlsZHJlbiAmJiAhaXNDaGVja2VkQnlEZWZhdWx0S2V5KSB7XG4gICAgICAgICAgdGhpcy5zZXRDaGVja0NoZWNrZWRJdGVtc0NoaWxkKGl0ZW1zT2ZHcm91cD8uKCkgfHwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGlzQ2xpY2tNYW51YWwsIGl0ZW0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNob29zZVBhcmVudFRoZW5BdXRvQ2hvb3NlQ2hpbGRyZW4pIHsgLy8gbOG7sWEgY2jhu41uIG5vZGUgY2hhIHPhur0gYuG7jyBxdWEgdmnhu4djIGNo4buNbiB04bqldCBj4bqjIG5vZGUgY29uXG4gICAgICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGlzQ2xpY2tNYW51YWwsIGl0ZW0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtc09mR3JvdXAgJiYgaXRlbXNPZkdyb3VwKCkgJiYgaXRlbXNPZkdyb3VwKCkubGVuZ3RoICYmICFpc0NoZWNrZWRCeURlZmF1bHRLZXkgJiYgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZUpzb24pIHtcbiAgICAgICAgY29uc3QgaXRlbXNDaGFuZ2UgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoYW5nZUNoaWxkcmVuRGlzYWJsZVdoZW5DaGFuZ2VQYXJlbnQgP1xuICAgICAgICAgIGl0ZW1zT2ZHcm91cCgpLmZpbHRlcigoaXRlbTogYW55KSA9PiAhdGhpcy5rZXlzRGlzYWJsZUl0ZW0oKT8uZmluZChrZXkgPT4ga2V5ID09PSBpdGVtKClbdGhpcy5maWVsZEtleSgpXSkpIDogaXRlbXNPZkdyb3VwKCk7XG5cbiAgICAgICAgdGhpcy5zZXRDaGVja0NoZWNrZWRJdGVtc0NoaWxkKGl0ZW1zQ2hhbmdlKTtcbiAgICAgIH1cbiAgICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cC5ub3RDaGFuZ2VTdGF0ZUl0ZW1DaGVja090aGVyICYmICFjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVKc29uKSB7XG4gICAgICAgIHRoaXMuc2V0Q2hlY2tDaGVja2VkSXRlbXNQYXJlbnQoaXRlbSgpLnBhcmVudEl0ZW0pO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRLZXlzQ2hlY2tlZEJ5TWFwcGluZ0NoZWNrZWQoaXNDbGlja01hbnVhbCwgaXRlbSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50LmlzQ2hlY2tNYW51YWwgPSBmYWxzZTtcblxuICAgICAgaWYgKGlzQ2hlY2tlZEJ5RGVmYXVsdEtleSkge1xuICAgICAgICBjdXJyZW50LmlzQ2hlY2tlZEJ5RGVmYXVsdEtleSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICByZWZJdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQuaXNDaGVja01hbnVhbCA9IGZhbHNlO1xuXG4gICAgICBpZiAoaXNDaGVja2VkQnlEZWZhdWx0S2V5KSB7XG4gICAgICAgIGN1cnJlbnQuaXNDaGVja2VkQnlEZWZhdWx0S2V5ID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmRlbGV0ZShpdGVtKClbdGhpcy5maWVsZEtleSgpXSk7XG4gICAgdGhpcy5rZXlzQ2hlY2tlZC5zZXQoQXJyYXkuZnJvbSh0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5rZXlzKCkpKTtcblxuICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLm5vdENoYW5nZVN0YXRlSXRlbUNoZWNrT3RoZXIpIHtcbiAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmRlbGV0ZShpdGVtKClbdGhpcy5maWVsZEtleSgpXSk7XG4gICAgICB0aGlzLm91dFVuU2VsZWN0TXVsdGlLZXkuZW1pdCghaXNFbXB0eShpdGVtKClbdGhpcy5maWVsZEtleSgpXSkgPyBbaXRlbSgpW3RoaXMuZmllbGRLZXkoKV1dIDogW10pO1xuICAgICAgdGhpcy5zZXRLZXlzQ2hlY2tlZEJ5TWFwcGluZ0NoZWNrZWQoaXNDbGlja01hbnVhbCwgaXRlbSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlVW5zZWxlY3RDaGlsZHJlblJlbW92ZVNlbGVjdFBhcmVudCkge1xuICAgICAgdGhpcy5yZWN1cnNpdmVseUNoZWNrZWRQYXJlbnRCeVRyZWUoaXRlbSgpLnBhcmVudEl0ZW0pO1xuICAgIH1cblxuICAgIC8vIG7hur91IGtvIHBo4bqjaSB0csaw4budbmcgaMahcCBj4bunYSBiYW5rIHbDoCBkYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSB0aMOsIGLhu48gY2hhIHPhur0gYuG7jyBjb25cbiAgICBpZiAoaXRlbXNPZkdyb3VwICYmIGl0ZW1zT2ZHcm91cCgpICYmIGl0ZW1zT2ZHcm91cCgpLmxlbmd0aCkge1xuICAgICAgY29uc3QgaXRlbXNDaGFuZ2UgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoYW5nZUNoaWxkcmVuRGlzYWJsZVdoZW5DaGFuZ2VQYXJlbnQgP1xuICAgICAgICBpdGVtc09mR3JvdXAoKS5maWx0ZXIoKGl0ZW0pID0+ICF0aGlzLmtleXNEaXNhYmxlSXRlbSgpPy5maW5kKGtleSA9PiBrZXkgPT09IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKSkgOiBpdGVtc09mR3JvdXAoKTtcblxuICAgICAgdGhpcy5yZW1vdmVDaGVja2VkSXRlbXNDaGlsZChpdGVtc0NoYW5nZSk7XG4gICAgfVxuICAgIGlmIChpdGVtKCkucGFyZW50SXRlbSAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVVbnNlbGVjdENoaWxkcmVuUmVtb3ZlU2VsZWN0UGFyZW50KSB7XG4gICAgICB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5kZWxldGUoaXRlbSgpLnBhcmVudEl0ZW1bdGhpcy5maWVsZEtleSgpXSk7XG4gICAgfVxuICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGlzQ2xpY2tNYW51YWwsIGl0ZW0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJdGVtc09mR3JvdXAoaXRlbTogV3JpdGFibGVTaWduYWw8YW55Piwgc3RvcmVzOiBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj4pIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgIXN0b3JlcyB8fCAhc3RvcmVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2Ygc3RvcmVzKCkpIHtcbiAgICAgIGlmIChncm91cCgpW3RoaXMuZmllbGRLZXkoKV0gPT09IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKSB7XG4gICAgICAgIHJldHVybiBncm91cCgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXRJdGVtc09mR3JvdXAoaXRlbSwgZ3JvdXAoKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdKSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRLZXlzU3RpbGxPdGhlck9wdGlvbnMoaXRlbT86IFdyaXRhYmxlU2lnbmFsPGFueT4pIHtcbiAgICBpZiAoIWl0ZW0/LigpKSB7XG4gICAgICB0aGlzLmtleXNTdGlsbE90aGVyT3B0aW9ucy5zZXQoW10pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGtleXNDaGVja2VkID0gQXJyYXkuZnJvbSh0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5rZXlzKCkpO1xuICAgIGNvbnN0IGl0ZW1QYXJlbnQgPSBpdGVtKCkucGFyZW50SXRlbSBhcyBXcml0YWJsZVNpZ25hbDxhbnk+O1xuICAgIGNvbnN0IGluZGV4SXRlbSA9IHRoaXMua2V5c1N0aWxsT3RoZXJPcHRpb25zKCkuZmluZEluZGV4KGtleSA9PiBrZXkgPT09IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKTtcblxuICAgIGlmIChpbmRleEl0ZW0gPj0gMCkge1xuICAgICAgdGhpcy5rZXlzU3RpbGxPdGhlck9wdGlvbnMudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LnNwbGljZShpbmRleEl0ZW0sIDEpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFpdGVtUGFyZW50IHx8ICFpdGVtUGFyZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXRlbXNPZkdyb3VwUGFyZW50ID0gdGhpcy5nZXRJdGVtc09mR3JvdXAoaXRlbVBhcmVudCwgdGhpcy5zdG9yZSk7XG5cbiAgICBpZiAoIWl0ZW1zT2ZHcm91cFBhcmVudCB8fCAhaXRlbXNPZkdyb3VwUGFyZW50KCkgfHwgIWl0ZW1zT2ZHcm91cFBhcmVudCgpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleFBhcmVudCA9IHRoaXMua2V5c1N0aWxsT3RoZXJPcHRpb25zKCkuZmluZEluZGV4KGtleSA9PiBrZXkgPT09IGl0ZW1QYXJlbnQoKVt0aGlzLmZpZWxkS2V5KCldKTtcblxuICAgIGlmIChpdGVtc09mR3JvdXBQYXJlbnQoKS5ldmVyeSgoZWxlbWVudCkgPT4ga2V5c0NoZWNrZWQuaW5jbHVkZXMoZWxlbWVudCgpW3RoaXMuZmllbGRLZXkoKV0pKSAmJiBpbmRleFBhcmVudCA+PSAwKSB7XG4gICAgICB0aGlzLmtleXNTdGlsbE90aGVyT3B0aW9ucy51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQuc3BsaWNlKGluZGV4SXRlbSwgMSk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXRlbXNPZkdyb3VwUGFyZW50KCkuc29tZShlbGVtZW50ID0+IGtleXNDaGVja2VkLmluY2x1ZGVzKGVsZW1lbnQoKVt0aGlzLmZpZWxkS2V5KCldKSkgJiYgaW5kZXhQYXJlbnQgPCAwKSB7XG4gICAgICB0aGlzLmtleXNTdGlsbE90aGVyT3B0aW9ucy51cGRhdGUoY3VycmVudCA9PiBbLi4uY3VycmVudCwgaXRlbVBhcmVudCgpW3RoaXMuZmllbGRLZXkoKV1dKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5kZXhQYXJlbnQgPj0gMCkge1xuICAgICAgdGhpcy5rZXlzU3RpbGxPdGhlck9wdGlvbnMudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LnNwbGljZShpbmRleEl0ZW0sIDEpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRLZXlzQ2hlY2tlZEJ5TWFwcGluZ0NoZWNrZWQoaXNDbGlja01hbnVhbDogYm9vbGVhbiwgaXRlbT86IFdyaXRhYmxlU2lnbmFsPGFueT4pIHtcbiAgICB0aGlzLmtleXNDaGVja2VkLnNldChBcnJheS5mcm9tKHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmtleXMoKSkpO1xuICAgIHRoaXMuZW1pdE11bHRpS2V5Q2hlY2tlZChpc0NsaWNrTWFudWFsKTtcbiAgICB0aGlzLnNldEtleXNTdGlsbE90aGVyT3B0aW9ucyhpdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdE11bHRpS2V5Q2hlY2tlZChpc0NsaWNrTWFudWFsID0gdHJ1ZSkge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkYXRhTXVsdGlLZXlDaGVja2VkOiBJTGlzdERhdGFFbWl0TXVsdGlLZXkgPSB7IGtleXM6IG5ldyBBcnJheTxhbnk+KCksIG1hcEtleXM6IG5ldyBBcnJheTxJTGlzdERhdGFFbWl0S2V5PigpLCBpc0NsaWNrTWFudWFsIH07XG5cbiAgICBpZiAoKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZW1pdEFsbEl0ZW1DaGVja2VkIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2hvb3NlQ2hpbGRUaGVuQXV0b0Nob29zZVBhcmVudCkgJiYgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlRW1pdEFsbEl0ZW1DaGVja2VkV2hlbkNob29zZUNoaWxkVGhlbkF1dG9DaG9vc2VQYXJlbnQpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgaXRlbV0gb2YgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkpIHtcbiAgICAgICAgZGF0YU11bHRpS2V5Q2hlY2tlZC5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgZGF0YU11bHRpS2V5Q2hlY2tlZC5tYXBLZXlzLnB1c2goeyBrZXksIGl0ZW06IChpdGVtLnJlZj8uKCkgfHwgaXRlbSksIGlzQ2xpY2tNYW51YWwgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLm91dFNlbGVjdE11bHRpS2V5LmVtaXQoZGF0YU11bHRpS2V5Q2hlY2tlZCk7XG4gICAgICB0aGlzLnRvdGFsSXRlbUNoZWNrZWQuc2V0KGRhdGFNdWx0aUtleUNoZWNrZWQua2V5cy5sZW5ndGgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5LCBpdGVtXSBvZiB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKSkge1xuICAgICAgaWYgKGl0ZW1bdGhpcy5maWVsZEtleSgpXSAmJiAhU3RyaW5nKGl0ZW1bdGhpcy5maWVsZEtleSgpXSkuaW5jbHVkZXModGhpcy5QQVRURVJOX0ZBS0VfSUQpICYmICghaXRlbVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy5sZW5ndGggfHwgIWl0ZW1bY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSgpLnNvbWUoKGl0ZW1Hcm91cDogV3JpdGFibGVTaWduYWw8YW55PikgPT4gdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZ2V0KGl0ZW1Hcm91cCgpW3RoaXMuZmllbGRLZXkoKV0pKSkpIHtcbiAgICAgICAgZGF0YU11bHRpS2V5Q2hlY2tlZC5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgZGF0YU11bHRpS2V5Q2hlY2tlZC5tYXBLZXlzLnB1c2goeyBrZXksIGl0ZW06IChpdGVtLnJlZj8uKCkgfHwgaXRlbSksIGlzQ2xpY2tNYW51YWwgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub3V0U2VsZWN0TXVsdGlLZXkuZW1pdChkYXRhTXVsdGlLZXlDaGVja2VkKTtcbiAgICB0aGlzLnRvdGFsSXRlbUNoZWNrZWQuc2V0KGRhdGFNdWx0aUtleUNoZWNrZWQua2V5cy5sZW5ndGgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWN1cnNpdmVseUNoZWNrZWRQYXJlbnRCeVRyZWUoaXRlbTogYW55KSB7XG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLnNldChpdGVtW3RoaXMuZmllbGRLZXkoKV0sIGl0ZW0oKSk7XG4gICAgdGhpcy5yZWN1cnNpdmVseUNoZWNrZWRQYXJlbnRCeVRyZWUoaXRlbS5wYXJlbnRJdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2hlY2tDaGVja2VkSXRlbXNQYXJlbnQoaXRlbTogV3JpdGFibGVTaWduYWw8YW55Pikge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtc09mR3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG5cbiAgICBpZiAoIWl0ZW1zT2ZHcm91cCgpIHx8ICFpdGVtc09mR3JvdXAoKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtR3JvdXAgb2YgaXRlbXNPZkdyb3VwKCkpIHtcbiAgICAgIGlmICghdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuaGFzKGl0ZW1Hcm91cCgpW3RoaXMuZmllbGRLZXkoKV0pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuc2V0KGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldLCBpdGVtKCkpO1xuICAgIGlmIChpdGVtKCkucGFyZW50SXRlbSkge1xuICAgICAgdGhpcy5zZXRDaGVja0NoZWNrZWRJdGVtc1BhcmVudChpdGVtKCkucGFyZW50SXRlbSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaGVja0NoZWNrZWRJdGVtc0NoaWxkKGl0ZW1zOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pikge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuc2V0KGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldLCBpdGVtKCkpO1xuICAgICAgY29uc3QgaXRlbXNPZkdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuXG4gICAgICBpZiAoaXRlbXNPZkdyb3VwICYmIGl0ZW1zT2ZHcm91cCgpICYmIGl0ZW1zT2ZHcm91cCgpLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNldENoZWNrQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXNPZkdyb3VwKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVDaGVja2VkSXRlbXNDaGlsZChpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4pIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LmlzQ2hlY2tNYW51YWwgPSBmYWxzZTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZGVsZXRlKGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKTtcbiAgICAgIHRoaXMub3V0VW5TZWxlY3RNdWx0aUtleS5lbWl0KFtpdGVtKClbdGhpcy5maWVsZEtleSgpXV0pO1xuXG4gICAgICBjb25zdCBpdGVtc09mR3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG5cbiAgICAgIGlmIChpdGVtc09mR3JvdXAgJiYgaXRlbXNPZkdyb3VwKCkgJiYgaXRlbXNPZkdyb3VwKCkubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXNPZkdyb3VwKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NTZWFyY2goKSB7XG4gICAgdGhpcy5wcm9jZXNzRGF0YSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NEYXRhKCk6IHZvaWQge1xuICAgIHRoaXMudG90YWxJdGVtLnNldCgwKTtcblxuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBpdGVtcyA9IHRoaXMuc3RvcmUoKS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpc05pbChpdGVtKClbdGhpcy5maWVsZEtleSgpXSkgfHwgaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0gPT09ICcnKSB7XG4gICAgICAgIGl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnRbdGhpcy5maWVsZEtleSgpXSA9IGAke3RoaXMuUEFUVEVSTl9GQUtFX0lEfSR7dXVpZCgpfWA7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbU1hcCA9IGNsb25lRGVlcChpdGVtKSBhcyBXcml0YWJsZVNpZ25hbDxhbnk+O1xuICAgICAgaXRlbU1hcC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQucmVmID0gaXRlbTtcbiAgICAgICAgY3VycmVudC5pc1Jvb3QgPSB0cnVlO1xuICAgICAgICBjdXJyZW50LmV4cGFuZCA9IHRoaXMua2V5U2VhcmNoKCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIGN1cnJlbnQubWF4TGV2ZWxHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRNYXhMZXZlbEdyb3VwKGl0ZW0oKSk7XG4gICAgICAgIGN1cnJlbnQubGV2ZWwgPSB0aGlzLmxldmVsKCk7XG4gICAgICAgIGN1cnJlbnQudGV4dERlc2NyaXB0aW9uR3JvdXBXaGVuTm9EYXRhID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldERlc2NyaXB0aW9uR3JvdXBXaGVuTm9EYXRhPy4oaXRlbSgpKTtcbiAgICAgICAgY3VycmVudC5pY29uRW1wdHlEYXRhSW5Hcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRJY29uRW1wdHlEYXRhSW5Hcm91cD8uKGl0ZW0oKSk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIGlmICgoaXRlbU1hcCgpLmxldmVsID09PSBpdGVtTWFwKCkubWF4TGV2ZWxHcm91cCB8fCAhdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/Lmlnbm9yZUNoZWNrYm94R3JvdXApICYmICFTdHJpbmcoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pPy5pbmNsdWRlcyh0aGlzLlBBVFRFUk5fRkFLRV9JRCkpIHtcbiAgICAgICAgdGhpcy50b3RhbEl0ZW0udXBkYXRlKGN1cnJlbnQgPT4gY3VycmVudCsrKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5rZXlTZWFyY2goKSAmJiB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0RXhwYW5kR3JvdXApIHtcbiAgICAgICAgaXRlbU1hcC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5leHBhbmQgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0RXhwYW5kR3JvdXA/LihpdGVtKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0UG9wb3Zlckdyb3VwKSB7XG4gICAgICAgIGl0ZW1NYXAudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuZGF0YVBvcG92ZXIgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0UG9wb3Zlckdyb3VwPy4oaXRlbSk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldEJ1dHRvbkdyb3VwKSB7XG4gICAgICAgIGl0ZW1NYXAudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuYnV0dG9uSW5Hcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRCdXR0b25Hcm91cD8uKGl0ZW0pO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdGV4dCA9IGRlbGV0ZVVuaWNvZGUodGhpcy5idWlsZFZhbHVlQnlDb25maWcoaXRlbU1hcCkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB0ZXh0RXNjYXBlID0gZXNjYXBlSHRtbCh0ZXh0KTtcbiAgICAgIGNvbnN0IGtleVNlYXJjaCA9IGRlbGV0ZVVuaWNvZGUoZXNjYXBlSHRtbCgodGhpcy5rZXlTZWFyY2goKSB8fCAnJykudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCkpKTtcblxuICAgICAgaXRlbU1hcC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQuZGlzcGxheUFsbENoaWxkID0gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIGlmICgha2V5U2VhcmNoIHx8ICh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uc2VhcmNoQWxsTGV2ZWwgJiYgKHRleHQuaW5jbHVkZXMoa2V5U2VhcmNoKSB8fCB0ZXh0RXNjYXBlLmluY2x1ZGVzKGtleVNlYXJjaCkpKSkge1xuICAgICAgICBpdGVtTWFwLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LmRpc3BsYXlBbGxDaGlsZCA9IHRydWU7XG4gICAgICAgICAgY3VycmVudC5oYXNEaXNwbGF5ID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW1Hcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcblxuICAgICAgaXRlbU1hcC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY3VycmVudFtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZmlsdGVySXRlbXNEaXNwbGF5KHRoaXMuY29udmVydERhdGFCeUdyb3VwSW5JdGVtKGl0ZW1Hcm91cD8uKCkgfHwgW10sIGl0ZW1NYXApKTtcblxuICAgICAgICBjaGlsZHJlbi5zZXQoZGF0YSk7XG4gICAgICAgIGlmIChjdXJyZW50W2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpKSB7XG4gICAgICAgICAgY3VycmVudFtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdLnVwZGF0ZSgoaXRlbUZpZWxkczogQXJyYXk8YW55PikgPT4ge1xuICAgICAgICAgICAgaWYgKCFpdGVtRmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gaXRlbUZpZWxkcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW1GaWVsZHNbMF0uaXNGaXJzdCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBpdGVtRmllbGRzPy5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgICBpZiAobGFzdEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgaXRlbUZpZWxkc1tsYXN0SW5kZXhdLmlzTGFzdCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBpdGVtRmllbGRzO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQuYm9udXNQYWRkaW5nTGVmdCA9IDA7XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldEJvbnVzUGFkZGluZ0xlZnRJdGVtKSB7XG4gICAgICAgICAgY3VycmVudC5ib251c1BhZGRpbmdMZWZ0ID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRCb251c1BhZGRpbmdMZWZ0SXRlbShjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRDbGFzc0luY2x1ZGVJdGVtTm9EYXRhKSB7XG4gICAgICAgICAgY3VycmVudC5jbGFzc0luY2x1ZGVJdGVtTm9EYXRhID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRDbGFzc0luY2x1ZGVJdGVtTm9EYXRhKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQuYXZhdGFyQ29uZmlnID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRBdmF0YXJDb25maWcgJiYgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRBdmF0YXJDb25maWcoY3VycmVudCk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKSAmJiB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8ubGVuZ3RoICYmIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5zb21lKGtleSA9PiBrZXkgPT09IGl0ZW1NYXAoKVt0aGlzLmZpZWxkS2V5KCldKSkge1xuICAgICAgICB0aGlzLmhhbmRsZXJDaGFuZ2VDaGVja2VkKHRydWUsIGl0ZW1NYXAsIGZhbHNlLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYnVpbGRWYWx1ZUJ5Q29uZmlnKGl0ZW1NYXApO1xuXG4gICAgICByZXR1cm4gaXRlbU1hcDtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uc2VhcmNoQWxsTGV2ZWwgJiYgdGhpcy5rZXlTZWFyY2goKSkge1xuICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtKCkuaGFzRGlzcGxheVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnKCk/LnNvcnQ/LihpdGVtcyk7XG4gICAgdGhpcy5pdGVtcy5zZXQoaXRlbXMpO1xuICAgIHRoaXMubXVsdGlLZXlTZWxlY3RlZC5zZXQoW10pXG4gICAgY29uc3QgY2FsbEJhY2tDYWxjdWxhdG9ySGVpZ2h0U3VjY2VzcyA9ICgpID0+IHtcbiAgICAgIHRoaXMuY2FsY3VsYXRvckhlaWdoSXRlbVN1Y2Nlc3Muc2V0KHRydWUpO1xuXG4gICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5leHBhbmRGaXJzdEl0ZW0gJiYgdGhpcy5pdGVtcygpWzBdKSB7XG4gICAgICAgIHRoaXMuZXhwYW5kQWxsSXRlbXNJbkdyb3VwKHRoaXMuaXRlbXMoKVswXSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0SGVpZ2h0Vmlld1BvcnQoKTtcbiAgICAgIGlmICh0aGlzLmZpcnN0SXRlbVNlbGVjdGVkICYmIHRoaXMuZmlyc3RJdGVtU2VsZWN0ZWQoKSkge1xuICAgICAgICB0aGlzLmhhbmRsZXJDaGFuZ2VDaGVja2VkKHRydWUsIHRoaXMuZmlyc3RJdGVtU2VsZWN0ZWQsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5maXJzdEl0ZW1TZWxlY3RlZC5zZXQodW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGNoZWNrTG9hZEl0ZW0gPSAocHJlU3RhdGVIYXNTY3JvbGw6IGJvb2xlYW4sIGN1cnJlbnRIYXNTY3JvbGw6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICh0aGlzLmtleXNIaWRkZW5JdGVtKCk/Lmxlbmd0aCAmJiBwcmVTdGF0ZUhhc1Njcm9sbCAmJiAhY3VycmVudEhhc1Njcm9sbCAmJiAodGhpcy5pc1NlYXJjaE9ubGluZSgpKSkge1xuICAgICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UoZmFsc2UpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICAgICAgdGhpcy5yZWZyZXNoVmlldyhjYWxsQmFja0NhbGN1bGF0b3JIZWlnaHRTdWNjZXNzLCBjaGVja0xvYWRJdGVtKTtcbiAgICAgIHRoaXMub3V0TG9hZEl0ZW1zQ29tcGxldGUuZW1pdCh7IGl0ZW1zOiB0aGlzLml0ZW1zKCkgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hWaWV3KGNhbGxCYWNrQ2FsY3VsYXRvckhlaWdodFN1Y2Nlc3M/OiAoKSA9PiB2b2lkLCBjaGVja0xvYWRJdGVtPzogKHByZVN0YXRlSGFzU2Nyb2xsOiBib29sZWFuLCBjdXJyZW50SGFzU2Nyb2xsOiBib29sZWFuKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5zZXRIZWlnaHRWaWV3UG9ydChjYWxsQmFja0NhbGN1bGF0b3JIZWlnaHRTdWNjZXNzKTtcbiAgICB0aGlzLmNoZWNrVmlld1BvcnRTY3JvbGwoY2hlY2tMb2FkSXRlbSk7XG4gIH1cblxuICBwcml2YXRlIGV4cGFuZEFsbEl0ZW1zSW5Hcm91cChpdGVtOiBhbnkpIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW0uZXhwYW5kID0gdHJ1ZTtcbiAgICBjb25zdCBpdGVtczogQXJyYXk8YW55PiA9IGl0ZW1bY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXTtcblxuICAgIGlmICghaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtcy5mb3JFYWNoKGl0ZW1Hcm91cCA9PiB0aGlzLmV4cGFuZEFsbEl0ZW1zSW5Hcm91cChpdGVtR3JvdXApKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGF0YUJ5R3JvdXBJbkl0ZW0oaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+LCBwYXJlbnRJdGVtOiBXcml0YWJsZVNpZ25hbDxhbnk+KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBpdGVtc01hcCA9IGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgIGlmIChpc05pbChpdGVtKClbdGhpcy5maWVsZEtleSgpXSkgfHwgaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0gPT09ICcnKSB7XG4gICAgICAgIGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID0gYCR7dGhpcy5QQVRURVJOX0ZBS0VfSUR9JHt1dWlkKCl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW1NYXAgPSBjbG9uZURlZXAoaXRlbSkgYXMgV3JpdGFibGVTaWduYWw8YW55PjtcblxuICAgICAgaXRlbU1hcC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQucmVmID0gaXRlbTtcbiAgICAgICAgY3VycmVudC5wYXJlbnRJdGVtID0gcGFyZW50SXRlbTtcbiAgICAgICAgY3VycmVudFt0aGlzLmZpZWxkS2V5KCldID0gaXRlbSgpW3RoaXMuZmllbGRLZXkoKV07XG5cbiAgICAgICAgY3VycmVudC5tYXhMZXZlbEdyb3VwID0gcGFyZW50SXRlbSgpLm1heExldmVsR3JvdXA7XG4gICAgICAgIGN1cnJlbnQubGV2ZWwgPSBwYXJlbnRJdGVtKCkubGV2ZWwgKyAxO1xuICAgICAgICBjdXJyZW50LmFycmF5TGV2ZWwgPSByYW5nZSgyLCBjdXJyZW50LmxldmVsICsgMSk7XG4gICAgICAgIGlmICgoY3VycmVudC5sZXZlbCA9PT0gY3VycmVudC5tYXhMZXZlbEdyb3VwIHx8ICFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoZWNrYm94SXRlbSkgJiYgIVN0cmluZyhpdGVtKClbdGhpcy5maWVsZEtleSgpXSk/LmluY2x1ZGVzKHRoaXMuUEFUVEVSTl9GQUtFX0lEKSkge1xuICAgICAgICAgIHRoaXMudG90YWxJdGVtLnVwZGF0ZShjdXJyZW50ID0+IGN1cnJlbnQrKyk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50LmV4cGFuZCA9IHRoaXMua2V5U2VhcmNoKCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIGlmICghdGhpcy5rZXlTZWFyY2goKSAmJiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEV4cGFuZEl0ZW0pIHtcbiAgICAgICAgICBjdXJyZW50LmV4cGFuZCA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0RXhwYW5kSXRlbShjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LmRpc3BsYXlBbGxDaGlsZCA9IHBhcmVudEl0ZW0oKS5kaXNwbGF5QWxsQ2hpbGQ7XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldFBvcG92ZXJJdGVtKSB7XG4gICAgICAgICAgY3VycmVudC5kYXRhUG9wb3ZlciA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0UG9wb3Zlckl0ZW0oY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0SWNvbkltYWdlQ2xhc3MpIHtcbiAgICAgICAgICBjdXJyZW50Lmljb25JbWFnZUNsYXNzID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRJY29uSW1hZ2VDbGFzcyhjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXh0ID0gZGVsZXRlVW5pY29kZSh0aGlzLmJ1aWxkVmFsdWVCeUNvbmZpZyhpc1NpZ25hbChjdXJyZW50KSA/IGN1cnJlbnQgYXMgV3JpdGFibGVTaWduYWw8YW55PiA6IHNpZ25hbChjdXJyZW50KSkudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgICAgIGNvbnN0IGtleVNlYXJjaCA9IGRlbGV0ZVVuaWNvZGUoZXNjYXBlSHRtbCgodGhpcy5rZXlTZWFyY2goKSB8fCAnJykudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCkpKTtcbiAgICAgICAgY29uc3QgdGV4dEVzY2FwZSA9IGVzY2FwZUh0bWwodGV4dCk7XG4gICAgICAgIGlmICgoIXRoaXMua2V5c0hpZGRlbkl0ZW0oKT8uc29tZShrZXkgPT4ga2V5ID09PSBjdXJyZW50W3RoaXMuZmllbGRLZXkoKV0pKSAmJiAoKHBhcmVudEl0ZW0oKS5kaXNwbGF5QWxsQ2hpbGQgfHwgIWtleVNlYXJjaCkgfHwgKChjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICFjdXJyZW50W3RoaXMuZmllbGRLZXkoKV0uaW5jbHVkZXModGhpcy5QQVRURVJOX0ZBS0VfSUQpKSAmJiAodGV4dC5pbmNsdWRlcyhrZXlTZWFyY2gpIHx8IHRleHRFc2NhcGUuaW5jbHVkZXMoa2V5U2VhcmNoKSkpKSkge1xuICAgICAgICAgIGN1cnJlbnQuZGlzcGxheUFsbENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnNldERpc3BsYXlJdGVtKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1Hcm91cCA9IGN1cnJlbnRbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG4gICAgICAgIGlmIChpdGVtR3JvdXA/LigpKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZmlsdGVySXRlbXNEaXNwbGF5KHRoaXMuY29udmVydERhdGFCeUdyb3VwSW5JdGVtKGl0ZW1Hcm91cD8uKCksIHNpZ25hbChjdXJyZW50KSkpO1xuICAgICAgICAgIGl0ZW1Hcm91cC5zZXQoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudFtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy4oKSkge1xuICAgICAgICAgIGN1cnJlbnRbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXS51cGRhdGUoKGl0ZW1GaWVsZHM6IEFycmF5PGFueT4pID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbUZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1GaWVsZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtRmllbGRzWzBdLmlzRmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgbGFzdEluZGV4ID0gaXRlbUZpZWxkcz8ubGVuZ3RoIC0gMTtcblxuICAgICAgICAgICAgaWYgKGxhc3RJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgIGl0ZW1GaWVsZHNbbGFzdEluZGV4XS5pc0xhc3QgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaXRlbUZpZWxkcztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LmJvbnVzUGFkZGluZ0xlZnQgPSAwO1xuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRCb251c1BhZGRpbmdMZWZ0SXRlbSkge1xuICAgICAgICAgIGN1cnJlbnQuYm9udXNQYWRkaW5nTGVmdCA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Qm9udXNQYWRkaW5nTGVmdEl0ZW0oY3VycmVudCwgcGFyZW50SXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Q2xhc3NJbmNsdWRlSXRlbU5vRGF0YSkge1xuICAgICAgICAgIGN1cnJlbnQuY2xhc3NJbmNsdWRlSXRlbU5vRGF0YSA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Q2xhc3NJbmNsdWRlSXRlbU5vRGF0YShjdXJyZW50LCBwYXJlbnRJdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvcikge1xuICAgICAgICAgIGN1cnJlbnQubGlua0ltYWdlRXJyb3IgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldExpbmtJbWFnZUVycm9yKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldENsYXNzSW5jbHVkZUl0ZW1Db250ZW50KSB7XG4gICAgICAgICAgY3VycmVudC5jbGFzc0luY2x1ZGUgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldENsYXNzSW5jbHVkZUl0ZW1Db250ZW50KGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQuYXZhdGFyQ29uZmlnID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRBdmF0YXJDb25maWcgJiYgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRBdmF0YXJDb25maWcoY3VycmVudCk7XG4gICAgICAgIGlmICh0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKSAmJiB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8ubGVuZ3RoICYmIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5zb21lKGtleSA9PiBrZXkgPT09IGN1cnJlbnRbdGhpcy5maWVsZEtleSgpXSkpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZXJDaGFuZ2VDaGVja2VkKHRydWUsIHNpZ25hbChjdXJyZW50KSwgZmFsc2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdEZpcnN0SXRlbSgpICYmIGN1cnJlbnQubGV2ZWwgPT09IGN1cnJlbnQubWF4TGV2ZWxHcm91cCkge1xuICAgICAgICAgIHRoaXMuZmlyc3RJdGVtU2VsZWN0ZWQuc2V0KGN1cnJlbnQpO1xuICAgICAgICAgIHRoaXMuc2VsZWN0Rmlyc3RJdGVtLnNldChmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gaXRlbU1hcDtcbiAgICB9KTtcblxuICAgIHJldHVybiBpdGVtc01hcDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RGlzcGxheUl0ZW0oaXRlbTogYW55KSB7XG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW0uaGFzRGlzcGxheSA9IHRydWU7XG5cbiAgICBpZiAoaXRlbS5wYXJlbnRJdGVtKSB7XG4gICAgICB0aGlzLnNldERpc3BsYXlJdGVtKGl0ZW0ucGFyZW50SXRlbSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJJdGVtc0Rpc3BsYXkoaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+KTogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4ge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgaXRlbXNEaXNwbGF5ID0gaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbSgpLmhhc0Rpc3BsYXkpO1xuXG4gICAgaXRlbXNEaXNwbGF5LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBjb25zdCBpdGVtR3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXTtcbiAgICAgIGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy5zZXQodGhpcy5maWx0ZXJJdGVtc0Rpc3BsYXkoaXRlbUdyb3VwPy4oKSB8fCBbXSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGl0ZW1zRGlzcGxheTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRMZW5ndGhJdGVtKCk6IG51bWJlciB7XG4gICAgY29uc3QgZGF0YSA9IHsgbGVuZ3RoOiB0aGlzLml0ZW1zKCkubGVuZ3RoIH07XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPiB0aGlzLm1heEl0ZW1TaG93KCkpIHtcbiAgICAgIHJldHVybiBkYXRhLmxlbmd0aDtcbiAgICB9XG4gICAgdGhpcy5nZXRMZW5ndGhBbGxHcm91cCh0aGlzLml0ZW1zKCksIGRhdGEpO1xuXG4gICAgcmV0dXJuIGRhdGEubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMZW5ndGhBbGxHcm91cChpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4sIGRhdGE6IHsgbGVuZ3RoOiBudW1iZXIgfSkge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBpZiAoIWl0ZW0oKS5leHBhbmQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBncm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcblxuICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRhdGEubGVuZ3RoICs9IChncm91cD8uKCk/Lmxlbmd0aCB8fCAwKTtcbiAgICAgIGlmICgoIWdyb3VwPy4oKSB8fCAhZ3JvdXA/LigpLmxlbmd0aCkgJiYgaXRlbSgpLmxldmVsID09PSAxICYmICghY29uZmlnVGVtcGxhdGVHcm91cC5zZWFyY2hBbGxMZXZlbCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmF1dG9Db3VudFdoZW5Hcm91cEVtcHR5SXRlbUxldmVsMSkpIHtcbiAgICAgICAgZGF0YS5sZW5ndGggKz0gMTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEubGVuZ3RoID4gdGhpcy5tYXhJdGVtU2hvdygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0TGVuZ3RoQWxsR3JvdXAoZ3JvdXAoKSwgZGF0YSk7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiB0aGlzLm1heEl0ZW1TaG93KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRIZWlnaHRHcm91cEhhc0xpbmUoKSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXA/Lmlnbm9yZUdyb3VwTGluZSB8fCAhdGhpcy5pdGVtcygpPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICBsZXQgY291bnQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXMoKSkge1xuICAgICAgaWYgKGxlbmd0aCA+PSB0aGlzLm1heEl0ZW1TaG93KCkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb3VudCArPSAxO1xuICAgICAgbGVuZ3RoICs9IDE7XG4gICAgICBjb25zdCBncm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgIGNvbnN0IGRhdGEgPSB7IGxlbmd0aDogaXRlbSgpLmV4cGFuZCA/IGdyb3VwKCk/Lmxlbmd0aCB8fCAwIDogMCB9O1xuXG4gICAgICB0aGlzLmdldExlbmd0aEFsbEdyb3VwKGdyb3VwKCksIGRhdGEpO1xuICAgICAgbGVuZ3RoICs9IGRhdGEubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBtYXJnaW5Ub3BIYXNMaW5lID0gY29uZmlnVGVtcGxhdGVHcm91cC5tYXJnaW5Ub3BIYXNMaW5lIHx8IDQ7XG4gICAgY29uc3QgaGVpZ2h0ID0gY291bnQgPT09IDEgPyBtYXJnaW5Ub3BIYXNMaW5lIDogKGNvdW50IC0gMSkgKiAobWFyZ2luVG9wSGFzTGluZSAqIDMgKyAxKTtcblxuICAgIHJldHVybiBoZWlnaHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGRWYWx1ZUJ5Q29uZmlnKGl0ZW06IFdyaXRhYmxlU2lnbmFsPGFueT4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhYmVsU2VhcmNoID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldExhYmVsU2VhcmNoPy4oaXRlbSgpKTtcblxuICAgIGlmIChpdGVtKCkuaXNSb290KSB7XG4gICAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldExhYmVsR3JvdXApIHtcbiAgICAgICAgaXRlbSgpLmZpZWxkTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0TGFiZWxHcm91cChpdGVtKCkpIHx8ICcgJyk7XG5cbiAgICAgICAgcmV0dXJuIGxhYmVsU2VhcmNoID8/IGl0ZW0oKS5maWVsZExhYmVsO1xuICAgICAgfVxuICAgICAgaXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQuZmllbGRMYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGN1cnJlbnQubGFiZWwgfHwgY3VycmVudC5uYW1lIHx8ICcgJyk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGl0ZW0oKS5maWVsZExhYmVsO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldExhYmVsSXRlbSkge1xuICAgICAgaXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQuZmllbGRMYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRMYWJlbEl0ZW0oY3VycmVudCkgfHwgJyAnKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbGFiZWxTZWFyY2ggPz8gaXRlbSgpLmZpZWxkTGFiZWw7XG4gICAgfVxuICAgIGl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgY3VycmVudC5maWVsZExhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoY3VycmVudC5sYWJlbCB8fCBjdXJyZW50Lm5hbWUgfHwgJyAnKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGFiZWxTZWFyY2ggPz8gaXRlbSgpLmZpZWxkTGFiZWw7XG4gIH1cbn1cbiIsIkBpZiAoY29uZmlnVGVtcGxhdGVHcm91cCgpOyBhcyBjb25maWdUZW1wbGF0ZUdyb3VwKSB7XG4gIEBsZXQgdmFySHRtbEhlaWdodFZpZXdQb3J0ID0gaGVpZ2h0Vmlld1BvcnQoKSA/IGhlaWdodFZpZXdQb3J0KCkrJ3B4JzonMTAwJSc7XG4gIEBsZXQgdmFySHRtbERpc2FibGUgPSBsb2FkaW5nKCkgfHwgZGlzYWJsZSgpIHx8IGZhbHNlO1xuICA8ZGl2IGNsYXNzPVwibGlicy11aS1saXN0LWdyb3VwIG92ZXJmbG93LVtoaWRkZW5dXCJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cInZhckh0bWxIZWlnaHRWaWV3UG9ydFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGwgcmVsYXRpdmUgbWluLWgtWzI4cHhdXCI+XG4gICAgICBAaWYgKGl0ZW1zKCkubGVuZ3RoICYmIGNvbmZpZ1RlbXBsYXRlR3JvdXAuY29uZmlnQnV0dG9uU2VsZWN0QW5kVW5kU2VsZWN0SXRlbT8uKCk7IGFzIGNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0pIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIFtjbGFzc109XCInZmxleCBpdGVtcy1jZW50ZXIgYmctWyNmZmZmZmZdICcrKGNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uY2xhc3NJbmNsdWRlID8/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbCcpXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgW3R5cGVdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25DaGVja0FsbD8udHlwZSA/PyAnYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uQ2hlY2tBbGw/LmxhYmVsID8/ICdpMThuX3NlbGVjdF9hbGxfc2VhcmNoZWRfcmVzdWx0cydcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvbkNoZWNrQWxsPy5jbGFzc0luY2x1ZGUgfHwgJ3ByLVs4cHhdJ1wiXG4gICAgICAgICAgICBbY2xhc3NMYWJlbF09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvbkNoZWNrQWxsPy5jbGFzc0xhYmVsIHx8ICdsaWJzLXVpLWZvbnQtaDZyJ1wiXG4gICAgICAgICAgICBbZGlzYWJsZV09XCJ2YXJIdG1sRGlzYWJsZVwiXG4gICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNoZWNrZWRPclVuQ2hlY2tlZEFsbCh0cnVlKVwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtWyM5OTk5OTldXCI+fDwvZGl2PlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgIFt0eXBlXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uVW5jaGVja0FsbD8udHlwZSA/PyAnYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uVW5jaGVja0FsbD8ubGFiZWwgPz8gJ2kxOG5fdW5zZWxlY3RfYWxsX3NlYXJjaGVkX3Jlc3VsdHMnXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25VbmNoZWNrQWxsPy5jbGFzc0luY2x1ZGUgfHwgJ3BsLVs4cHhdJ1wiXG4gICAgICAgICAgICBbY2xhc3NMYWJlbF09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvblVuY2hlY2tBbGw/LmNsYXNzTGFiZWwgfHwgJ2xpYnMtdWktZm9udC1oNnMnXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cInZhckh0bWxEaXNhYmxlXCJcbiAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2hlY2tlZE9yVW5DaGVja2VkQWxsKGZhbHNlKVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChpdGVtcygpLmxlbmd0aCAmJiBjb25maWdUZW1wbGF0ZUdyb3VwLmNvbmZpZ0NoZWNrYm94Q2hlY2tBbGw/LigpOyBhcyBjb25maWdDaGVja0JveCkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgW2NsYXNzXT1cIidmbGV4IGxpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsICcrKGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlSGFzQ29uZmlnQ2hlY2tCb3hBbGwgPz8gJyBiZy1bI2ZmZmZmZl0nKVwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlIFtsYWJlbF09XCJjb25maWdDaGVja0JveC5sYWJlbCA/PyAnaTE4bl9hbGwnXCJcbiAgICAgICAgICAgIFtjbGFzc0xhYmVsSW5jbHVkZV09XCJjb25maWdDaGVja0JveC5jbGFzc0xhYmVsSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJ0b3RhbEl0ZW1DaGVja2VkKCkgPj0gdG90YWxJdGVtKCkgJiYgdG90YWxJdGVtKCkgPiAwXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cInZhckh0bWxEaXNhYmxlXCJcbiAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlUG9wb3Zlcik9J2hhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKCRldmVudCknXG4gICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGVja2VkT3JVbkNoZWNrZWRBbGwoJGV2ZW50LmNoZWNrZWQpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGl0ZW1zKCkgJiYgaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBoLWZ1bGwgcmVsYXRpdmUgZmxleFwiPlxuICAgICAgICAgIDxkaXYgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVcbiAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIGgtZnVsbCBhYnNvbHV0ZSB0b3AtMCBsZWZ0LTAge3sgY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0luY2x1ZGVHcm91cCA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlR3JvdXAgOiAnJyB9fVwiPlxuICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBpdGVtcygpOyB0cmFjayBpdGVtKClbZmllbGRLZXkoKV07IGxldCBmaXJzdCA9ICRmaXJzdDsgbGV0IGxhc3QgPSAkbGFzdCkge1xuICAgICAgICAgICAgICA8ZGl2ICNpdGVtUmVmXG4gICAgICAgICAgICAgICAgW3N0eWxlLm1hcmdpblRvcC5weF09XCIhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVHcm91cExpbmUgPyBjb25maWdUZW1wbGF0ZUdyb3VwLm1hcmdpblRvcEhhc0xpbmUgfHwgNCA6IDBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCByZWxhdGl2ZSBcIj5cbiAgICAgICAgICAgICAgICBAbGV0IHZhckh0bWxQYWRkaW5nID0gbGV2ZWwoKSooY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlID8gOCA6IDE2KTtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHktWzZweF0gXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJnLWxpc3QtaG92ZXJdPVwiIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2xpY2tMYWJlbEdyb3VwXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJnLWxpc3QtaG92ZXItYWN0aXZlXT1cIiFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNsaWNrTGFiZWxHcm91cFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuIWN1cnNvci1wb2ludGVyXT1cIiFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNsaWNrTGFiZWxHcm91cCAgJiYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nTGVmdC5weF09XCJ2YXJIdG1sUGFkZGluZ1wiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUucGFkZGluZ1JpZ2h0LnB4XT1cInZhckh0bWxQYWRkaW5nXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCIoY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGVja2JveEdyb3VwIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSkgPyBoYW5kbGVyVG9nZ2xlRXhwYW5kKCRldmVudCxpdGVtKSA6IHVuZGVmaW5lZFwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCBiZWZvcmU6IXRleHQtWzE2cHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mucm90YXRlLTkwXT1cIml0ZW0oKS5leHBhbmRcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyVG9nZ2xlRXhwYW5kKCRldmVudCxpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2k+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy53LWZ1bGxdPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAncmlnaHQnICYmICFjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnctW2NhbGMoMTAwJS0xNnB4KV1dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAnbGVmdCcgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlXCI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3UmFkaW8pIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZSBbYXZhdGFyQ29uZmlnXT1cIml0ZW0oKS5hdmF0YXJDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1sLVs4cHhdXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWdub3JlQ2hlY2tib3hdPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGVja2JveEdyb3VwIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0luY2x1ZGVJdGVtIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy53LWF1dG9dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy53LWZ1bGxdPVwiIWl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy4oKT8ubGVuZ3RoICYmICEoKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLndpZHRoTGFiZWxTdWIyNFdoZW5Ob3RUcmVlVmlldykgJiYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgISFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCkpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWF4LXctW2NhbGMoMTAwJS0yNHB4KV1dPVwiKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLndpZHRoTGFiZWxTdWIyNFdoZW5Ob3RUcmVlVmlldykgJiYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgISFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJpdGVtKCkuZmllbGRMYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJpdGVtKCkuZGF0YVBvcG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleExhYmVsXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuekluZGV4TGFiZWwgPz8gekluZGV4KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFDb21wb25lbnRPdXRsZXRdPVwiKHVuZGVmaW5lZCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6Y29uZmlnVGVtcGxhdGVHcm91cC5nZXREYXRhQ29tcG9uZW50T3V0bGV0R3JvdXA6aXRlbSgpOmZpZWxkS2V5KCk6e3ZhbHVlSXNFbXB0eTp7aXRlbTppdGVtKCl9fSkgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50T3V0bGV0XT1cIigwIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpjb25maWdUZW1wbGF0ZUdyb3VwLmdldENvbXBvbmVudE91dGxldEdyb3VwOml0ZW0oKTpmaWVsZEtleSgpOnt2YWx1ZUlzMDowfSkgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGlua0ltYWdlXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0SW1hZ2UgPyAoKCdhdmF0YXInIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTooaXRlbSgpLnNwZWNpZmljX2xvYWRJbWdFcnJvciAmJiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldExpbmtJbWFnZUVycm9yID8gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvciA6IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0SW1hZ2UpOml0ZW0oKSkgfCBhc3luYykgOiBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEF2YXRhckl0ZW0gfHwgJyddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbWdUeXBlSWNvbl09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmltZ1R5cGVJY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0xhYmVsSW5jbHVkZV09XCIoY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0xhYmVsSXRlbSA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NMYWJlbEl0ZW0gOiAoY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlID8gJyBsaWJzLXVpLWZvbnQtaDZyICc6JyBsaWJzLXVpLWZvbnQtaDZzICcpKSArICgoY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVUZXh0VXBwZXJjYXNlTGFiZWxHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUpID8gJyc6JyB0ZXh0LXVwcGVyY2FzZSAnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKCkgfHwgKGl0ZW0oKVtmaWVsZEtleSgpXSB8IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGU6a2V5c0Rpc2FibGVJdGVtKCk6a2V5c0Rpc2FibGVJdGVtKCk/Lmxlbmd0aClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXRlbSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZTprZXlzQ2hlY2tlZCgpOmtleXNDaGVja2VkKCkubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdGlsbE90aGVyT3B0aW9uc109XCJpdGVtKClbZmllbGRLZXkoKV0gfCBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlOmtleXNTdGlsbE90aGVyT3B0aW9ucygpOmtleXNTdGlsbE90aGVyT3B0aW9ucygpLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VDaGVja2VkKCRldmVudC5jaGVja2VkLGl0ZW0sIHRydWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlUG9wb3Zlcik9J2hhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKCRldmVudCknXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2xpY2tMYWJlbCk9XCJoYW5kbGVyVG9nZ2xlRXhwYW5kKCdjbGlja0xhYmVsJyxpdGVtLGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIEBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdSYWRpbykge1xuICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcmFkaW8tc2luZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWwtWzhweF1dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAnbGVmdCcgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdmF0YXJDb25maWddPVwiaXRlbSgpLmF2YXRhckNvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWdub3JlUmFkaW9dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVSYWRpb0dyb3VwIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0luY2x1ZGVJdGVtIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy53LWF1dG9dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy53LWZ1bGxdPVwiIWl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy4oKT8ubGVuZ3RoICYmICEoKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLndpZHRoTGFiZWxTdWIyNFdoZW5Ob3RUcmVlVmlldykgJiYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgISFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCkpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWF4LXctW2NhbGMoMTAwJS0yNHB4KV1dPVwiKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLndpZHRoTGFiZWxTdWIyNFdoZW5Ob3RUcmVlVmlldykgJiYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgISFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJpdGVtKCkuZmllbGRMYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJpdGVtKCkuZGF0YVBvcG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFDb21wb25lbnRPdXRsZXRdPVwiKHVuZGVmaW5lZCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6Y29uZmlnVGVtcGxhdGVHcm91cC5nZXREYXRhQ29tcG9uZW50T3V0bGV0R3JvdXA6aXRlbSgpOmZpZWxkS2V5KCk6e3ZhbHVlSXNFbXB0eTp7aXRlbTppdGVtKCl9fSkgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50T3V0bGV0XT1cIigwIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpjb25maWdUZW1wbGF0ZUdyb3VwLmdldENvbXBvbmVudE91dGxldEdyb3VwOml0ZW0oKTpmaWVsZEtleSgpOnt2YWx1ZUlzMDowfSkgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbekluZGV4TGFiZWxdPVwiY29uZmlnVGVtcGxhdGVHcm91cC56SW5kZXhMYWJlbCA/PyB6SW5kZXgoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW1nVHlwZUljb25dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pbWdUeXBlSWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGlua0ltYWdlXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0SW1hZ2UgPyAoKCdhdmF0YXInIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTooaXRlbSgpLnNwZWNpZmljX2xvYWRJbWdFcnJvciAmJiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldExpbmtJbWFnZUVycm9yID8gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvciA6IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0SW1hZ2UpOml0ZW0oKSkgfCBhc3luYykgOiBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEF2YXRhckl0ZW0gfHwgJyddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0xhYmVsSW5jbHVkZV09XCIoY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0xhYmVsSXRlbSA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NMYWJlbEl0ZW0gOiAnbGlicy11aS1mb250LWg2cyAnKSArIChjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZVRleHRVcHBlcmNhc2VMYWJlbEdyb3VwID8gJyc6JyB1cHBlcmNhc2UnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKCkgfHwgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZGlzYWJsZUl0ZW1Ob3RMYXN0TGV2ZWwgJiYgISFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCkgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGVja2JveEdyb3VwIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSB8fCAoaXRlbSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZTprZXlzRGlzYWJsZUl0ZW0oKTprZXlzRGlzYWJsZUl0ZW0oKT8ubGVuZ3RoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aXZlXT1cIml0ZW0oKVtmaWVsZEtleSgpXSB8IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGU6a2V5c0NoZWNrZWQoKTprZXlzQ2hlY2tlZCgpLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VDaGVja2VkKCRldmVudC5hY3RpdmUsaXRlbSwgdHJ1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyKT0naGFuZGxlckNoYW5nU3RhZ2VGbGFnTW91c2UoJGV2ZW50KSdcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDbGlja0xhYmVsKT1cImhhbmRsZXJUb2dnbGVFeHBhbmQoJ2NsaWNrTGFiZWwnLGl0ZW0sY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVSYWRpb0dyb3VwIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtKCkuYnV0dG9uSW5Hcm91cDsgYXMgYnV0dG9uSW5Hcm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gW3R5cGVdPVwiYnV0dG9uSW5Hcm91cC50eXBlIHx8ICdidXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiYnV0dG9uSW5Hcm91cC5sYWJlbCB8fCAnICdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiKGJ1dHRvbkluR3JvdXAuY2xhc3NJY29uTGVmdCB8fCAnJykrJyBmbGV4IG1yLVs4cHhdICF0ZXh0LVs4cHhdJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImJ1dHRvbkluR3JvdXAuY2xhc3NJbmNsdWRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cImJ1dHRvbkluR3JvdXAuY2xhc3NMYWJlbCB8fCAnbGlicy11aS1mb250LWg1cidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiYnV0dG9uSW5Hcm91cC5kaXNhYmxlIHx8IGRpc2FibGUoKSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrQnV0dG9uR3JvdXAoYnV0dG9uSW5Hcm91cCxpdGVtKCkpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIEBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAncmlnaHQnICYmICFjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgY3Vyc29yLXBvaW50ZXIgbGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgYmVmb3JlOiF0ZXh0LVsxNnB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLiFtbC1bOHB4XV09XCJpdGVtKCkuZGF0YVBvcG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5yb3RhdGUtOTBdPVwiaXRlbSgpLmV4cGFuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJUb2dnbGVFeHBhbmQoJGV2ZW50LGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICBAaWYgKGl0ZW0oKS5leHBhbmQgJiYgY2FsY3VsYXRvckhlaWdoSXRlbVN1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1saXN0LXRlbXBsYXRlc19ncm91cC1pdGVtIFtrZXlTZWFyY2hdPVwia2V5U2VhcmNoKClcIlxuICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10oKVwiXG4gICAgICAgICAgICAgICAgICAgIFtwYXJlbnRJdGVtXT1cIml0ZW0oKVwiXG4gICAgICAgICAgICAgICAgICAgIFtmaWVsZEtleV09XCJmaWVsZEtleSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2tleXNDaGVja2VkXT1cImtleXNDaGVja2VkKClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKClcIlxuICAgICAgICAgICAgICAgICAgICBba2V5c0Rpc2FibGVJdGVtXT1cImtleXNEaXNhYmxlSXRlbSgpIHx8IFtdXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ1RlbXBsYXRlR3JvdXBdPVwiY29uZmlnVGVtcGxhdGVHcm91cFwiXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiY29uZmlnKClcIlxuICAgICAgICAgICAgICAgICAgICBba2V5c1N0aWxsT3RoZXJPcHRpb25zXT1cImtleXNTdGlsbE90aGVyT3B0aW9ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nZVZpZXcpPVwiaGFuZGxlckNoYW5nZVZpZXcoKVwiXG4gICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlUG9wb3Zlcik9J2hhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKCRldmVudCknXG4gICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZUl0ZW1DaGVja2VkKCRldmVudC5pdGVtKVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoIWxhc3QgJiYgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlR3JvdXBMaW5lICYmIGNhbGN1bGF0b3JIZWlnaEl0ZW1TdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWxpc3QtZ3JvdXAtbGluZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5tYXJnaW5Ub3AucHhdPVwiIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlR3JvdXBMaW5lID8gY29uZmlnVGVtcGxhdGVHcm91cC5tYXJnaW5Ub3BIYXNMaW5lIHx8IDQgOiAwXCI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoIWl0ZW1zKCkgfHwgIWl0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImxpYnMtdWktZm9udC1oNXIgdGV4dC1bI2MxYzFjMV0gcmVsYXRpdmUge3sgY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0luY2x1ZGVOb2RhdGE/Y29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0luY2x1ZGVOb2RhdGE6JycgfX1cIlxuICAgICAgICAgIFtzdHlsZS5tYXJnaW5MZWZ0LnB4XT1cIjAgfCBMaWJzVWlDb21wb25lbnRzTGlzdEdyb3VwQ2FsY3VsYXRvck1hcmdpbkxlZnRJdGVtUGlwZToyOihjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAnbGVmdCcpOmNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZUpzb246IShjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoZWNrYm94SXRlbSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZVJhZGlvSXRlbSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pOnRydWVcIlxuICAgICAgICAgIFtjbGFzcy5weS1bOHB4XV09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0QXZhdGFySXRlbVwiXG4gICAgICAgICAgW2NsYXNzLnB5LVs0cHhdXT1cIiFjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0QXZhdGFySXRlbVwiPlxuICAgICAgICAgIEBpZiAoIWtleVNlYXJjaCgpICYmICFsb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIDxkaXY+e3sgKGNvbmZpZygpPy50ZXh0Tm9EYXRhID8/ICdpMThuX25vX2RhdGFfeWV0JykgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChrZXlTZWFyY2goKSAmJiAhbG9hZGluZygpKSB7XG4gICAgICAgICAgICA8ZGl2Pnt7IChjb25maWcoKT8udGV4dFNlYXJjaE5vRGF0YSA/PydpMThuX25vX3Jlc3VsdCcpIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtc3Bpbm5lciBbc2l6ZV09XCInbWVkaXVtJ1wiIC8+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxufVxuIl19
|