@libs-ui/components-list 0.2.256 → 0.2.258
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/defines/list.define.d.ts +1 -1
- package/esm2022/templates/checkbox/checkbox.component.mjs +3 -3
- package/esm2022/templates/group/group.component.mjs +3 -3
- package/esm2022/templates/group/item/item.component.mjs +3 -3
- package/esm2022/templates/tag/tag.component.mjs +3 -3
- package/fesm2022/libs-ui-components-list.mjs +8 -8
- package/fesm2022/libs-ui-components-list.mjs.map +1 -1
- package/list.component.d.ts +1 -1
- package/package.json +23 -23
- package/templates/templates.component.abstract.d.ts +1 -1
|
@@ -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 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 });
|
|
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 constHtmlHeightViewPort = heightViewPort() ? heightViewPort()+'px':'100%';\n @let constHtmlDisable = loading() || disable() || false;\n <div class=\"libs-ui-list-group overflow-[hidden]\"\n [style.height]=\"constHtmlHeightViewPort\">\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 [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]=\"constHtmlDisable\"\n (outClick)=\"handlerCheckedOrUnCheckedAll(true)\" />\n <div class=\"text-[#999999]\">|</div>\n <libs_ui-components-buttons-button [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]=\"constHtmlDisable\"\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]=\"constHtmlDisable\"\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 constHtmlPadding = 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]=\"constHtmlPadding\"\n [style.paddingRight.px]=\"constHtmlPadding\"\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 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"] }]
|
|
778
|
+
], template: "@if (configTemplateGroup(); as configTemplateGroup) {\n @let constHtmlHeightViewPort = heightViewPort() ? heightViewPort()+'px':'100%';\n @let constHtmlDisable = loading() || disable() || false;\n <div class=\"libs-ui-list-group overflow-[hidden]\"\n [style.height]=\"constHtmlHeightViewPort\">\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 [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]=\"constHtmlDisable\"\n (outClick)=\"handlerCheckedOrUnCheckedAll(true)\" />\n <div class=\"text-[#999999]\">|</div>\n <libs_ui-components-buttons-button [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]=\"constHtmlDisable\"\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]=\"constHtmlDisable\"\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 constHtmlPadding = 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]=\"constHtmlPadding\"\n [style.paddingRight.px]=\"constHtmlPadding\"\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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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+PjtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZmlsdGVySXRlbXNEaXNwbGF5KHRoaXMuY29udmVydERhdGFCeUdyb3VwSW5JdGVtKGl0ZW1Hcm91cD8uKCkgfHwgW10sIGl0ZW1NYXApKTtcblxuICAgICAgICBjaGlsZHJlbj8uc2V0KGRhdGEpO1xuICAgICAgICBpZiAoY3VycmVudFtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy4oKSkge1xuICAgICAgICAgIGN1cnJlbnRbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXS51cGRhdGUoKGl0ZW1GaWVsZHM6IEFycmF5PGFueT4pID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbUZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1GaWVsZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtRmllbGRzWzBdLmlzRmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgbGFzdEluZGV4ID0gaXRlbUZpZWxkcz8ubGVuZ3RoIC0gMTtcblxuICAgICAgICAgICAgaWYgKGxhc3RJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgIGl0ZW1GaWVsZHNbbGFzdEluZGV4XS5pc0xhc3QgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaXRlbUZpZWxkcztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LmJvbnVzUGFkZGluZ0xlZnQgPSAwO1xuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRCb251c1BhZGRpbmdMZWZ0SXRlbSkge1xuICAgICAgICAgIGN1cnJlbnQuYm9udXNQYWRkaW5nTGVmdCA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Qm9udXNQYWRkaW5nTGVmdEl0ZW0oY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Q2xhc3NJbmNsdWRlSXRlbU5vRGF0YSkge1xuICAgICAgICAgIGN1cnJlbnQuY2xhc3NJbmNsdWRlSXRlbU5vRGF0YSA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Q2xhc3NJbmNsdWRlSXRlbU5vRGF0YShjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LmF2YXRhckNvbmZpZyA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0QXZhdGFyQ29uZmlnICYmIGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0QXZhdGFyQ29uZmlnKGN1cnJlbnQpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5tdWx0aUtleVNlbGVjdGVkKCkgJiYgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/Lmxlbmd0aCAmJiB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8uc29tZShrZXkgPT4ga2V5ID09PSBpdGVtTWFwKClbdGhpcy5maWVsZEtleSgpXSkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZCh0cnVlLCBpdGVtTWFwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmJ1aWxkVmFsdWVCeUNvbmZpZyhpdGVtTWFwKTtcblxuICAgICAgcmV0dXJuIGl0ZW1NYXA7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LnNlYXJjaEFsbExldmVsICYmIHRoaXMua2V5U2VhcmNoKCkpIHtcbiAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4gaXRlbSgpLmhhc0Rpc3BsYXlcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZygpPy5zb3J0Py4oaXRlbXMpO1xuICAgIHRoaXMuaXRlbXMuc2V0KGl0ZW1zKTtcbiAgICB0aGlzLm11bHRpS2V5U2VsZWN0ZWQuc2V0KFtdKVxuICAgIGNvbnN0IGNhbGxCYWNrQ2FsY3VsYXRvckhlaWdodFN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICB0aGlzLmNhbGN1bGF0b3JIZWlnaEl0ZW1TdWNjZXNzLnNldCh0cnVlKTtcblxuICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZXhwYW5kRmlyc3RJdGVtICYmIHRoaXMuaXRlbXMoKVswXSkge1xuICAgICAgICB0aGlzLmV4cGFuZEFsbEl0ZW1zSW5Hcm91cCh0aGlzLml0ZW1zKClbMF0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldEhlaWdodFZpZXdQb3J0KCk7XG4gICAgICBpZiAodGhpcy5maXJzdEl0ZW1TZWxlY3RlZCAmJiB0aGlzLmZpcnN0SXRlbVNlbGVjdGVkKCkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZCh0cnVlLCB0aGlzLmZpcnN0SXRlbVNlbGVjdGVkLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZmlyc3RJdGVtU2VsZWN0ZWQuc2V0KHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBjaGVja0xvYWRJdGVtID0gKHByZVN0YXRlSGFzU2Nyb2xsOiBib29sZWFuLCBjdXJyZW50SGFzU2Nyb2xsOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAodGhpcy5rZXlzSGlkZGVuSXRlbSgpPy5sZW5ndGggJiYgcHJlU3RhdGVIYXNTY3JvbGwgJiYgIWN1cnJlbnRIYXNTY3JvbGwgJiYgKHRoaXMuaXNTZWFyY2hPbmxpbmUoKSkpIHtcbiAgICAgICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICAgIHRoaXMucmVmcmVzaFZpZXcoY2FsbEJhY2tDYWxjdWxhdG9ySGVpZ2h0U3VjY2VzcywgY2hlY2tMb2FkSXRlbSk7XG4gICAgICB0aGlzLm91dExvYWRJdGVtc0NvbXBsZXRlLmVtaXQoeyBpdGVtczogdGhpcy5pdGVtcygpIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoVmlldyhjYWxsQmFja0NhbGN1bGF0b3JIZWlnaHRTdWNjZXNzPzogKCkgPT4gdm9pZCwgY2hlY2tMb2FkSXRlbT86IChwcmVTdGF0ZUhhc1Njcm9sbDogYm9vbGVhbiwgY3VycmVudEhhc1Njcm9sbDogYm9vbGVhbikgPT4gdm9pZCkge1xuICAgIHRoaXMuc2V0SGVpZ2h0Vmlld1BvcnQoY2FsbEJhY2tDYWxjdWxhdG9ySGVpZ2h0U3VjY2Vzcyk7XG4gICAgdGhpcy5jaGVja1ZpZXdQb3J0U2Nyb2xsKGNoZWNrTG9hZEl0ZW0pO1xuICB9XG5cbiAgcHJpdmF0ZSBleHBhbmRBbGxJdGVtc0luR3JvdXAoaXRlbTogYW55KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLmV4cGFuZCA9IHRydWU7XG4gICAgY29uc3QgaXRlbXM6IEFycmF5PGFueT4gPSBpdGVtW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc107XG5cbiAgICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXRlbXMuZm9yRWFjaChpdGVtR3JvdXAgPT4gdGhpcy5leHBhbmRBbGxJdGVtc0luR3JvdXAoaXRlbUdyb3VwKSk7XG4gIH1cblxuXG4gIHByaXZhdGUgY29udmVydERhdGFCeUdyb3VwSW5JdGVtKGl0ZW1zOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+PiwgcGFyZW50SXRlbTogV3JpdGFibGVTaWduYWw8YW55Pikge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgaXRlbXNNYXAgPSBpdGVtcy5tYXAoaXRlbSA9PiB7XG4gICAgICBpZiAoaXNOaWwoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pIHx8IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSAnJykge1xuICAgICAgICBpdGVtKClbdGhpcy5maWVsZEtleSgpXSA9IGAke3RoaXMuUEFUVEVSTl9GQUtFX0lEfSR7dXVpZCgpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtTWFwID0gY2xvbmVEZWVwKGl0ZW0pIGFzIFdyaXRhYmxlU2lnbmFsPGFueT47XG5cbiAgICAgIGl0ZW1NYXAudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LnJlZiA9IGl0ZW07XG4gICAgICAgIGN1cnJlbnQucGFyZW50SXRlbSA9IHBhcmVudEl0ZW07XG4gICAgICAgIGN1cnJlbnRbdGhpcy5maWVsZEtleSgpXSA9IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldO1xuXG4gICAgICAgIGN1cnJlbnQubWF4TGV2ZWxHcm91cCA9IHBhcmVudEl0ZW0oKS5tYXhMZXZlbEdyb3VwO1xuICAgICAgICBjdXJyZW50LmxldmVsID0gcGFyZW50SXRlbSgpLmxldmVsICsgMTtcbiAgICAgICAgY3VycmVudC5hcnJheUxldmVsID0gcmFuZ2UoMiwgY3VycmVudC5sZXZlbCArIDEpO1xuICAgICAgICBpZiAoKGN1cnJlbnQubGV2ZWwgPT09IGN1cnJlbnQubWF4TGV2ZWxHcm91cCB8fCAhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGVja2JveEl0ZW0pICYmICFTdHJpbmcoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pPy5pbmNsdWRlcyh0aGlzLlBBVFRFUk5fRkFLRV9JRCkpIHtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbS51cGRhdGUoY3VycmVudCA9PiBjdXJyZW50KyspO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudC5leHBhbmQgPSB0aGlzLmtleVNlYXJjaCgpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICBpZiAoIXRoaXMua2V5U2VhcmNoKCkgJiYgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRFeHBhbmRJdGVtKSB7XG4gICAgICAgICAgY3VycmVudC5leHBhbmQgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEV4cGFuZEl0ZW0oY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudC5kaXNwbGF5QWxsQ2hpbGQgPSBwYXJlbnRJdGVtKCkuZGlzcGxheUFsbENoaWxkO1xuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRQb3BvdmVySXRlbSkge1xuICAgICAgICAgIGN1cnJlbnQuZGF0YVBvcG92ZXIgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldFBvcG92ZXJJdGVtKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldEljb25JbWFnZUNsYXNzKSB7XG4gICAgICAgICAgY3VycmVudC5pY29uSW1hZ2VDbGFzcyA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0SWNvbkltYWdlQ2xhc3MoY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGV4dCA9IGRlbGV0ZVVuaWNvZGUodGhpcy5idWlsZFZhbHVlQnlDb25maWcoaXNTaWduYWwoY3VycmVudCkgPyBjdXJyZW50IGFzIFdyaXRhYmxlU2lnbmFsPGFueT4gOiBzaWduYWwoY3VycmVudCkpLnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgICAgICBjb25zdCBrZXlTZWFyY2ggPSBkZWxldGVVbmljb2RlKGVzY2FwZUh0bWwoKHRoaXMua2V5U2VhcmNoKCkgfHwgJycpLnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgpKSk7XG4gICAgICAgIGNvbnN0IHRleHRFc2NhcGUgPSBlc2NhcGVIdG1sKHRleHQpO1xuICAgICAgICBpZiAoKCF0aGlzLmtleXNIaWRkZW5JdGVtKCk/LnNvbWUoa2V5ID0+IGtleSA9PT0gY3VycmVudFt0aGlzLmZpZWxkS2V5KCldKSkgJiYgKChwYXJlbnRJdGVtKCkuZGlzcGxheUFsbENoaWxkIHx8ICFrZXlTZWFyY2gpIHx8ICgoY29uZmlnVGVtcGxhdGVHcm91cC5zZWFyY2hBbGxMZXZlbCB8fCAhY3VycmVudFt0aGlzLmZpZWxkS2V5KCldLmluY2x1ZGVzKHRoaXMuUEFUVEVSTl9GQUtFX0lEKSkgJiYgKHRleHQuaW5jbHVkZXMoa2V5U2VhcmNoKSB8fCB0ZXh0RXNjYXBlLmluY2x1ZGVzKGtleVNlYXJjaCkpKSkpIHtcbiAgICAgICAgICBjdXJyZW50LmRpc3BsYXlBbGxDaGlsZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zZXREaXNwbGF5SXRlbShjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtR3JvdXAgPSBjdXJyZW50W2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuICAgICAgICBpZiAoaXRlbUdyb3VwPy4oKSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZpbHRlckl0ZW1zRGlzcGxheSh0aGlzLmNvbnZlcnREYXRhQnlHcm91cEluSXRlbShpdGVtR3JvdXA/LigpLCBzaWduYWwoY3VycmVudCkpKTtcbiAgICAgICAgICBpdGVtR3JvdXAuc2V0KGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnRbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCkpIHtcbiAgICAgICAgICBjdXJyZW50W2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10udXBkYXRlKChpdGVtRmllbGRzOiBBcnJheTxhbnk+KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWl0ZW1GaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtRmllbGRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbUZpZWxkc1swXS5pc0ZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IGl0ZW1GaWVsZHM/Lmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICBpdGVtRmllbGRzW2xhc3RJbmRleF0uaXNMYXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1GaWVsZHM7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudC5ib251c1BhZGRpbmdMZWZ0ID0gMDtcbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Qm9udXNQYWRkaW5nTGVmdEl0ZW0pIHtcbiAgICAgICAgICBjdXJyZW50LmJvbnVzUGFkZGluZ0xlZnQgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEJvbnVzUGFkZGluZ0xlZnRJdGVtKGN1cnJlbnQsIHBhcmVudEl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldENsYXNzSW5jbHVkZUl0ZW1Ob0RhdGEpIHtcbiAgICAgICAgICBjdXJyZW50LmNsYXNzSW5jbHVkZUl0ZW1Ob0RhdGEgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldENsYXNzSW5jbHVkZUl0ZW1Ob0RhdGEoY3VycmVudCwgcGFyZW50SXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0TGlua0ltYWdlRXJyb3IpIHtcbiAgICAgICAgICBjdXJyZW50LmxpbmtJbWFnZUVycm9yID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvcihjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRDbGFzc0luY2x1ZGVJdGVtQ29udGVudCkge1xuICAgICAgICAgIGN1cnJlbnQuY2xhc3NJbmNsdWRlID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRDbGFzc0luY2x1ZGVJdGVtQ29udGVudChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LmF2YXRhckNvbmZpZyA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0QXZhdGFyQ29uZmlnICYmIGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0QXZhdGFyQ29uZmlnKGN1cnJlbnQpO1xuICAgICAgICBpZiAodGhpcy5tdWx0aUtleVNlbGVjdGVkKCkgJiYgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/Lmxlbmd0aCAmJiB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8uc29tZShrZXkgPT4ga2V5ID09PSBjdXJyZW50W3RoaXMuZmllbGRLZXkoKV0pKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZCh0cnVlLCBzaWduYWwoY3VycmVudCksIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZWxlY3RGaXJzdEl0ZW0oKSAmJiBjdXJyZW50LmxldmVsID09PSBjdXJyZW50Lm1heExldmVsR3JvdXApIHtcbiAgICAgICAgICB0aGlzLmZpcnN0SXRlbVNlbGVjdGVkLnNldChjdXJyZW50KTtcbiAgICAgICAgICB0aGlzLnNlbGVjdEZpcnN0SXRlbS5zZXQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGl0ZW1NYXA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXRlbXNNYXA7XG4gIH1cblxuICBwcml2YXRlIHNldERpc3BsYXlJdGVtKGl0ZW06IGFueSkge1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLmhhc0Rpc3BsYXkgPSB0cnVlO1xuXG4gICAgaWYgKGl0ZW0ucGFyZW50SXRlbSkge1xuICAgICAgdGhpcy5zZXREaXNwbGF5SXRlbShpdGVtLnBhcmVudEl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVySXRlbXNEaXNwbGF5KGl0ZW1zOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pik6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+IHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zRGlzcGxheSA9IGl0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0oKS5oYXNEaXNwbGF5KTtcblxuICAgIGl0ZW1zRGlzcGxheS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgaXRlbUdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc107XG4gICAgICBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uc2V0KHRoaXMuZmlsdGVySXRlbXNEaXNwbGF5KGl0ZW1Hcm91cD8uKCkgfHwgW10pKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpdGVtc0Rpc3BsYXk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TGVuZ3RoSXRlbSgpOiBudW1iZXIge1xuICAgIGNvbnN0IGRhdGEgPSB7IGxlbmd0aDogdGhpcy5pdGVtcygpLmxlbmd0aCB9O1xuXG4gICAgaWYgKGRhdGEubGVuZ3RoID4gdGhpcy5tYXhJdGVtU2hvdygpKSB7XG4gICAgICByZXR1cm4gZGF0YS5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuZ2V0TGVuZ3RoQWxsR3JvdXAodGhpcy5pdGVtcygpLCBkYXRhKTtcblxuICAgIHJldHVybiBkYXRhLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGVuZ3RoQWxsR3JvdXAoaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+LCBkYXRhOiB7IGxlbmd0aDogbnVtYmVyIH0pIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgIWl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgaWYgKCFpdGVtKCkuZXhwYW5kKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZ3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG5cbiAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkYXRhLmxlbmd0aCArPSAoZ3JvdXA/LigpPy5sZW5ndGggfHwgMCk7XG4gICAgICBpZiAoKCFncm91cD8uKCkgfHwgIWdyb3VwPy4oKS5sZW5ndGgpICYmIGl0ZW0oKS5sZXZlbCA9PT0gMSAmJiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5hdXRvQ291bnRXaGVuR3JvdXBFbXB0eUl0ZW1MZXZlbDEpKSB7XG4gICAgICAgIGRhdGEubGVuZ3RoICs9IDE7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLmxlbmd0aCA+IHRoaXMubWF4SXRlbVNob3coKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmdldExlbmd0aEFsbEdyb3VwKGdyb3VwKCksIGRhdGEpO1xuICAgICAgaWYgKGRhdGEubGVuZ3RoID4gdGhpcy5tYXhJdGVtU2hvdygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0SGVpZ2h0R3JvdXBIYXNMaW5lKCkge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwPy5pZ25vcmVHcm91cExpbmUgfHwgIXRoaXMuaXRlbXMoKT8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgbGV0IGNvdW50ID0gMDtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKCkpIHtcbiAgICAgIGlmIChsZW5ndGggPj0gdGhpcy5tYXhJdGVtU2hvdygpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY291bnQgKz0gMTtcbiAgICAgIGxlbmd0aCArPSAxO1xuICAgICAgY29uc3QgZ3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG4gICAgICBjb25zdCBkYXRhID0geyBsZW5ndGg6IGl0ZW0oKS5leHBhbmQgPyBncm91cCgpPy5sZW5ndGggfHwgMCA6IDAgfTtcblxuICAgICAgdGhpcy5nZXRMZW5ndGhBbGxHcm91cChncm91cCgpLCBkYXRhKTtcbiAgICAgIGxlbmd0aCArPSBkYXRhLmxlbmd0aDtcbiAgICB9XG4gICAgY29uc3QgbWFyZ2luVG9wSGFzTGluZSA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAubWFyZ2luVG9wSGFzTGluZSB8fCA0O1xuICAgIGNvbnN0IGhlaWdodCA9IGNvdW50ID09PSAxID8gbWFyZ2luVG9wSGFzTGluZSA6IChjb3VudCAtIDEpICogKG1hcmdpblRvcEhhc0xpbmUgKiAzICsgMSk7XG5cbiAgICByZXR1cm4gaGVpZ2h0O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkVmFsdWVCeUNvbmZpZyhpdGVtOiBXcml0YWJsZVNpZ25hbDxhbnk+KTogc3RyaW5nIHtcbiAgICBjb25zdCBsYWJlbFNlYXJjaCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRMYWJlbFNlYXJjaD8uKGl0ZW0oKSk7XG5cbiAgICBpZiAoaXRlbSgpLmlzUm9vdCkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRMYWJlbEdyb3VwKSB7XG4gICAgICAgIGl0ZW0oKS5maWVsZExhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldExhYmVsR3JvdXAoaXRlbSgpKSB8fCAnICcpO1xuXG4gICAgICAgIHJldHVybiBsYWJlbFNlYXJjaCA/PyBpdGVtKCkuZmllbGRMYWJlbDtcbiAgICAgIH1cbiAgICAgIGl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LmZpZWxkTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChjdXJyZW50LmxhYmVsIHx8IGN1cnJlbnQubmFtZSB8fCAnICcpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBpdGVtKCkuZmllbGRMYWJlbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRMYWJlbEl0ZW0pIHtcbiAgICAgIGl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LmZpZWxkTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0TGFiZWxJdGVtKGN1cnJlbnQpIHx8ICcgJyk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGxhYmVsU2VhcmNoID8/IGl0ZW0oKS5maWVsZExhYmVsO1xuICAgIH1cbiAgICBpdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQuZmllbGRMYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGN1cnJlbnQubGFiZWwgfHwgY3VycmVudC5uYW1lIHx8ICcgJyk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhYmVsU2VhcmNoID8/IGl0ZW0oKS5maWVsZExhYmVsO1xuICB9XG59XG4iLCJAaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAoKTsgYXMgY29uZmlnVGVtcGxhdGVHcm91cCkge1xuICBAbGV0IHZhckh0bWxIZWlnaHRWaWV3UG9ydCA9IGhlaWdodFZpZXdQb3J0KCkgPyBoZWlnaHRWaWV3UG9ydCgpKydweCc6JzEwMCUnO1xuICBAbGV0IHZhckh0bWxEaXNhYmxlID0gbG9hZGluZygpIHx8IGRpc2FibGUoKSB8fCBmYWxzZTtcbiAgPGRpdiBjbGFzcz1cImxpYnMtdWktbGlzdC1ncm91cCBvdmVyZmxvdy1baGlkZGVuXVwiXG4gICAgW3N0eWxlLmhlaWdodF09XCJ2YXJIdG1sSGVpZ2h0Vmlld1BvcnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1mdWxsIHJlbGF0aXZlIG1pbi1oLVsyOHB4XVwiPlxuICAgICAgQGlmIChpdGVtcygpLmxlbmd0aCAmJiBjb25maWdUZW1wbGF0ZUdyb3VwLmNvbmZpZ0J1dHRvblNlbGVjdEFuZFVuZFNlbGVjdEl0ZW0/LigpOyBhcyBjb25maWdCdXR0b25TZWxlY3RJdGVtKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBbY2xhc3NdPVwiJ2ZsZXggaXRlbXMtY2VudGVyIGJnLVsjZmZmZmZmXSAnKyhjb25maWdCdXR0b25TZWxlY3RJdGVtLmNsYXNzSW5jbHVkZSA/PyAnbGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWwnKVwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgIFt0eXBlXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uQ2hlY2tBbGw/LnR5cGUgPz8gJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvbkNoZWNrQWxsPy5sYWJlbCA/PyAnaTE4bl9zZWxlY3RfYWxsX3NlYXJjaGVkX3Jlc3VsdHMnXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25DaGVja0FsbD8uY2xhc3NJbmNsdWRlIHx8ICdwci1bOHB4XSdcIlxuICAgICAgICAgICAgW2NsYXNzTGFiZWxdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25DaGVja0FsbD8uY2xhc3NMYWJlbCB8fCAnbGlicy11aS1mb250LWg2cidcIlxuICAgICAgICAgICAgW2Rpc2FibGVdPVwidmFySHRtbERpc2FibGVcIlxuICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDaGVja2VkT3JVbkNoZWNrZWRBbGwodHJ1ZSlcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LVsjOTk5OTk5XVwiPnw8L2Rpdj5cbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICBbdHlwZV09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvblVuY2hlY2tBbGw/LnR5cGUgPz8gJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvblVuY2hlY2tBbGw/LmxhYmVsID8/ICdpMThuX3Vuc2VsZWN0X2FsbF9zZWFyY2hlZF9yZXN1bHRzJ1wiXG4gICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uVW5jaGVja0FsbD8uY2xhc3NJbmNsdWRlIHx8ICdwbC1bOHB4XSdcIlxuICAgICAgICAgICAgW2NsYXNzTGFiZWxdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25VbmNoZWNrQWxsPy5jbGFzc0xhYmVsIHx8ICdsaWJzLXVpLWZvbnQtaDZzJ1wiXG4gICAgICAgICAgICBbZGlzYWJsZV09XCJ2YXJIdG1sRGlzYWJsZVwiXG4gICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNoZWNrZWRPclVuQ2hlY2tlZEFsbChmYWxzZSlcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoaXRlbXMoKS5sZW5ndGggJiYgY29uZmlnVGVtcGxhdGVHcm91cC5jb25maWdDaGVja2JveENoZWNrQWxsPy4oKTsgYXMgY29uZmlnQ2hlY2tCb3gpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIFtjbGFzc109XCInZmxleCBsaWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbCAnKyhjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzSW5jbHVkZUhhc0NvbmZpZ0NoZWNrQm94QWxsID8/ICcgYmctWyNmZmZmZmZdJylcIj5cbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZSBbbGFiZWxdPVwiY29uZmlnQ2hlY2tCb3gubGFiZWwgPz8gJ2kxOG5fYWxsJ1wiXG4gICAgICAgICAgICBbY2xhc3NMYWJlbEluY2x1ZGVdPVwiY29uZmlnQ2hlY2tCb3guY2xhc3NMYWJlbEluY2x1ZGUgfHwgJydcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwidG90YWxJdGVtQ2hlY2tlZCgpID49IHRvdGFsSXRlbSgpICYmIHRvdGFsSXRlbSgpID4gMFwiXG4gICAgICAgICAgICBbZGlzYWJsZV09XCJ2YXJIdG1sRGlzYWJsZVwiXG4gICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIpPSdoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpJ1xuICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hlY2tlZE9yVW5DaGVja2VkQWxsKCRldmVudC5jaGVja2VkKVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChpdGVtcygpICYmIGl0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsIHJlbGF0aXZlIGZsZXhcIj5cbiAgICAgICAgICA8ZGl2IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgICAgICBjbGFzcz1cInctZnVsbCBoLWZ1bGwgYWJzb2x1dGUgdG9wLTAgbGVmdC0wIHt7IGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlR3JvdXAgPyBjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzSW5jbHVkZUdyb3VwIDogJycgfX1cIj5cbiAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXMoKTsgdHJhY2sgaXRlbSgpW2ZpZWxkS2V5KCldOyBsZXQgZmlyc3QgPSAkZmlyc3Q7IGxldCBsYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICAgICAgPGRpdiAjaXRlbVJlZlxuICAgICAgICAgICAgICAgIFtzdHlsZS5tYXJnaW5Ub3AucHhdPVwiIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlR3JvdXBMaW5lID8gY29uZmlnVGVtcGxhdGVHcm91cC5tYXJnaW5Ub3BIYXNMaW5lIHx8IDQgOiAwXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgcmVsYXRpdmUgXCI+XG4gICAgICAgICAgICAgICAgQGxldCB2YXJIdG1sUGFkZGluZyA9IGxldmVsKCkqKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSA/IDggOiAxNik7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHB5LVs2cHhdIFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MubGlicy11aS1iZy1saXN0LWhvdmVyXT1cIiFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNsaWNrTGFiZWxHcm91cFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MubGlicy11aS1iZy1saXN0LWhvdmVyLWFjdGl2ZV09XCIhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDbGlja0xhYmVsR3JvdXBcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLiFjdXJzb3ItcG9pbnRlcl09XCIhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDbGlja0xhYmVsR3JvdXAgICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoZWNrYm94R3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtKVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUucGFkZGluZ0xlZnQucHhdPVwidmFySHRtbFBhZGRpbmdcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmdSaWdodC5weF09XCJ2YXJIdG1sUGFkZGluZ1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pID8gaGFuZGxlclRvZ2dsZUV4cGFuZCgkZXZlbnQsaXRlbSkgOiB1bmRlZmluZWRcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAnbGVmdCcgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgYmVmb3JlOiF0ZXh0LVsxNnB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnJvdGF0ZS05MF09XCJpdGVtKCkuZXhwYW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlclRvZ2dsZUV4cGFuZCgkZXZlbnQsaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudy1mdWxsXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlICYmICghY29uZmlnVGVtcGxhdGVHcm91cC5zZWFyY2hBbGxMZXZlbCB8fCAhIWl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy4oKT8ubGVuZ3RoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy53LVtjYWxjKDEwMCUtMTZweCldXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZVwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1JhZGlvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGUgW2F2YXRhckNvbmZpZ109XCJpdGVtKCkuYXZhdGFyQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5tbC1bOHB4XV09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lnbm9yZUNoZWNrYm94XT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlSXRlbSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudy1hdXRvXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudy1mdWxsXT1cIiFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCAmJiAhKChjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC53aWR0aExhYmVsU3ViMjRXaGVuTm90VHJlZVZpZXcpICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1heC13LVtjYWxjKDEwMCUtMjRweCldXT1cIihjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC53aWR0aExhYmVsU3ViMjRXaGVuTm90VHJlZVZpZXcpICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiaXRlbSgpLmZpZWxkTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiaXRlbSgpLmRhdGFQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhMYWJlbF09XCJjb25maWdUZW1wbGF0ZUdyb3VwLnpJbmRleExhYmVsID8/IHpJbmRleCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhQ29tcG9uZW50T3V0bGV0XT1cIih1bmRlZmluZWQgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0RGF0YUNvbXBvbmVudE91dGxldEdyb3VwOml0ZW0oKTpmaWVsZEtleSgpOnt2YWx1ZUlzRW1wdHk6e2l0ZW06aXRlbSgpfX0pIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudE91dGxldF09XCIoMCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6Y29uZmlnVGVtcGxhdGVHcm91cC5nZXRDb21wb25lbnRPdXRsZXRHcm91cDppdGVtKCk6ZmllbGRLZXkoKTp7dmFsdWVJczA6MH0pIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xpbmtJbWFnZV09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmdldEltYWdlID8gKCgnYXZhdGFyJyB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6KGl0ZW0oKS5zcGVjaWZpY19sb2FkSW1nRXJyb3IgJiYgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvciA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0TGlua0ltYWdlRXJyb3IgOiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEltYWdlKTppdGVtKCkpIHwgYXN5bmMpIDogaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRBdmF0YXJJdGVtIHx8ICcnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW1nVHlwZUljb25dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pbWdUeXBlSWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NMYWJlbEluY2x1ZGVdPVwiKGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NMYWJlbEl0ZW0gPyBjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzTGFiZWxJdGVtIDogKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSA/ICcgbGlicy11aS1mb250LWg2ciAnOicgbGlicy11aS1mb250LWg2cyAnKSkgKyAoKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlVGV4dFVwcGVyY2FzZUxhYmVsR3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlKSA/ICcnOicgdGV4dC11cHBlcmNhc2UgJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IChpdGVtKClbZmllbGRLZXkoKV0gfCBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlOmtleXNEaXNhYmxlSXRlbSgpOmtleXNEaXNhYmxlSXRlbSgpPy5sZW5ndGgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIml0ZW0oKVtmaWVsZEtleSgpXSB8IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGU6a2V5c0NoZWNrZWQoKTprZXlzQ2hlY2tlZCgpLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3RpbGxPdGhlck9wdGlvbnNdPVwiaXRlbSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZTprZXlzU3RpbGxPdGhlck9wdGlvbnMoKTprZXlzU3RpbGxPdGhlck9wdGlvbnMoKS5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQ2hlY2tlZCgkZXZlbnQuY2hlY2tlZCxpdGVtLCB0cnVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIpPSdoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKG91dENsaWNrTGFiZWwpPVwiaGFuZGxlclRvZ2dsZUV4cGFuZCgnY2xpY2tMYWJlbCcsaXRlbSxjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoZWNrYm94R3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3UmFkaW8pIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXJhZGlvLXNpbmdsZVxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1sLVs4cHhdXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXZhdGFyQ29uZmlnXT1cIml0ZW0oKS5hdmF0YXJDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lnbm9yZVJhZGlvXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlUmFkaW9Hcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlSXRlbSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudy1hdXRvXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudy1mdWxsXT1cIiFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCAmJiAhKChjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC53aWR0aExhYmVsU3ViMjRXaGVuTm90VHJlZVZpZXcpICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1heC13LVtjYWxjKDEwMCUtMjRweCldXT1cIihjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC53aWR0aExhYmVsU3ViMjRXaGVuTm90VHJlZVZpZXcpICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiaXRlbSgpLmZpZWxkTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiaXRlbSgpLmRhdGFQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhQ29tcG9uZW50T3V0bGV0XT1cIih1bmRlZmluZWQgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0RGF0YUNvbXBvbmVudE91dGxldEdyb3VwOml0ZW0oKTpmaWVsZEtleSgpOnt2YWx1ZUlzRW1wdHk6e2l0ZW06aXRlbSgpfX0pIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudE91dGxldF09XCIoMCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6Y29uZmlnVGVtcGxhdGVHcm91cC5nZXRDb21wb25lbnRPdXRsZXRHcm91cDppdGVtKCk6ZmllbGRLZXkoKTp7dmFsdWVJczA6MH0pIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleExhYmVsXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuekluZGV4TGFiZWwgPz8gekluZGV4KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2ltZ1R5cGVJY29uXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaW1nVHlwZUljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xpbmtJbWFnZV09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmdldEltYWdlID8gKCgnYXZhdGFyJyB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6KGl0ZW0oKS5zcGVjaWZpY19sb2FkSW1nRXJyb3IgJiYgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvciA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0TGlua0ltYWdlRXJyb3IgOiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEltYWdlKTppdGVtKCkpIHwgYXN5bmMpIDogaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRBdmF0YXJJdGVtIHx8ICcnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NMYWJlbEluY2x1ZGVdPVwiKGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NMYWJlbEl0ZW0gPyBjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzTGFiZWxJdGVtIDogJ2xpYnMtdWktZm9udC1oNnMgJykgKyAoY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVUZXh0VXBwZXJjYXNlTGFiZWxHcm91cCA/ICcnOicgdXBwZXJjYXNlJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IChjb25maWdUZW1wbGF0ZUdyb3VwLmRpc2FibGVJdGVtTm90TGFzdExldmVsICYmICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0gfHwgKGl0ZW0oKVtmaWVsZEtleSgpXSB8IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGU6a2V5c0Rpc2FibGVJdGVtKCk6a2V5c0Rpc2FibGVJdGVtKCk/Lmxlbmd0aClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJpdGVtKClbZmllbGRLZXkoKV0gfCBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlOmtleXNDaGVja2VkKCk6a2V5c0NoZWNrZWQoKS5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQ2hlY2tlZCgkZXZlbnQuYWN0aXZlLGl0ZW0sIHRydWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlUG9wb3Zlcik9J2hhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKCRldmVudCknXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2xpY2tMYWJlbCk9XCJoYW5kbGVyVG9nZ2xlRXhwYW5kKCdjbGlja0xhYmVsJyxpdGVtLGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlUmFkaW9Hcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbSgpLmJ1dHRvbkluR3JvdXA7IGFzIGJ1dHRvbkluR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cImJ1dHRvbkluR3JvdXAudHlwZSB8fCAnYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImJ1dHRvbkluR3JvdXAubGFiZWwgfHwgJyAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIihidXR0b25Jbkdyb3VwLmNsYXNzSWNvbkxlZnQgfHwgJycpKycgZmxleCBtci1bOHB4XSAhdGV4dC1bOHB4XSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJidXR0b25Jbkdyb3VwLmNsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NMYWJlbF09XCJidXR0b25Jbkdyb3VwLmNsYXNzTGFiZWwgfHwgJ2xpYnMtdWktZm9udC1oNXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImJ1dHRvbkluR3JvdXAuZGlzYWJsZSB8fCBkaXNhYmxlKCkgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGlja0J1dHRvbkdyb3VwKGJ1dHRvbkluR3JvdXAsaXRlbSgpKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlICYmICghY29uZmlnVGVtcGxhdGVHcm91cC5zZWFyY2hBbGxMZXZlbCB8fCAhIWl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy4oKT8ubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyIGxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IGJlZm9yZTohdGV4dC1bMTZweF1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy4hbWwtWzhweF1dPVwiaXRlbSgpLmRhdGFQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mucm90YXRlLTkwXT1cIml0ZW0oKS5leHBhbmRcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyVG9nZ2xlRXhwYW5kKCRldmVudCxpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2k+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgQGlmIChpdGVtKCkuZXhwYW5kICYmIGNhbGN1bGF0b3JIZWlnaEl0ZW1TdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGlzdC10ZW1wbGF0ZXNfZ3JvdXAtaXRlbSBba2V5U2VhcmNoXT1cImtleVNlYXJjaCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cIml0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdKClcIlxuICAgICAgICAgICAgICAgICAgICBbcGFyZW50SXRlbV09XCJpdGVtKClcIlxuICAgICAgICAgICAgICAgICAgICBbZmllbGRLZXldPVwiZmllbGRLZXkoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtrZXlzQ2hlY2tlZF09XCJrZXlzQ2hlY2tlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2tleXNEaXNhYmxlSXRlbV09XCJrZXlzRGlzYWJsZUl0ZW0oKSB8fCBbXVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWdUZW1wbGF0ZUdyb3VwXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImNvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgW2tleXNTdGlsbE90aGVyT3B0aW9uc109XCJrZXlzU3RpbGxPdGhlck9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ2VWaWV3KT1cImhhbmRsZXJDaGFuZ2VWaWV3KClcIlxuICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIpPSdoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpJ1xuICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VJdGVtQ2hlY2tlZCgkZXZlbnQuaXRlbSlcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKCFsYXN0ICYmICFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUdyb3VwTGluZSAmJiBjYWxjdWxhdG9ySGVpZ2hJdGVtU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1saXN0LWdyb3VwLWxpbmVcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luVG9wLnB4XT1cIiFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUdyb3VwTGluZSA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAubWFyZ2luVG9wSGFzTGluZSB8fCA0IDogMFwiPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKCFpdGVtcygpIHx8ICFpdGVtcygpLmxlbmd0aCkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVyIHRleHQtWyNjMWMxYzFdIHJlbGF0aXZlIHt7IGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlTm9kYXRhP2NvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlTm9kYXRhOicnIH19XCJcbiAgICAgICAgICBbc3R5bGUubWFyZ2luTGVmdC5weF09XCIwIHwgTGlic1VpQ29tcG9uZW50c0xpc3RHcm91cENhbGN1bGF0b3JNYXJnaW5MZWZ0SXRlbVBpcGU6MjooY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnKTpjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVKc29uOiEoY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGVja2JveEl0ZW0gfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVSYWRpb0l0ZW0gfHwgY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtKTp0cnVlXCJcbiAgICAgICAgICBbY2xhc3MucHktWzhweF1dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEF2YXRhckl0ZW1cIlxuICAgICAgICAgIFtjbGFzcy5weS1bNHB4XV09XCIhY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEF2YXRhckl0ZW1cIj5cbiAgICAgICAgICBAaWYgKCFrZXlTZWFyY2goKSAmJiAhbG9hZGluZygpKSB7XG4gICAgICAgICAgICA8ZGl2Pnt7IChjb25maWcoKT8udGV4dE5vRGF0YSA/PyAnaTE4bl9ub19kYXRhX3lldCcpIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoa2V5U2VhcmNoKCkgJiYgIWxvYWRpbmcoKSkge1xuICAgICAgICAgICAgPGRpdj57eyAoY29uZmlnKCk/LnRleHRTZWFyY2hOb0RhdGEgPz8naTE4bl9ub19yZXN1bHQnKSB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXNwaW5uZXIgW3NpemVdPVwiJ21lZGl1bSdcIiAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbn1cbiJdfQ==
|
|
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+PjtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZmlsdGVySXRlbXNEaXNwbGF5KHRoaXMuY29udmVydERhdGFCeUdyb3VwSW5JdGVtKGl0ZW1Hcm91cD8uKCkgfHwgW10sIGl0ZW1NYXApKTtcblxuICAgICAgICBjaGlsZHJlbj8uc2V0KGRhdGEpO1xuICAgICAgICBpZiAoY3VycmVudFtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy4oKSkge1xuICAgICAgICAgIGN1cnJlbnRbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXS51cGRhdGUoKGl0ZW1GaWVsZHM6IEFycmF5PGFueT4pID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbUZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1GaWVsZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtRmllbGRzWzBdLmlzRmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgbGFzdEluZGV4ID0gaXRlbUZpZWxkcz8ubGVuZ3RoIC0gMTtcblxuICAgICAgICAgICAgaWYgKGxhc3RJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgIGl0ZW1GaWVsZHNbbGFzdEluZGV4XS5pc0xhc3QgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaXRlbUZpZWxkcztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LmJvbnVzUGFkZGluZ0xlZnQgPSAwO1xuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRCb251c1BhZGRpbmdMZWZ0SXRlbSkge1xuICAgICAgICAgIGN1cnJlbnQuYm9udXNQYWRkaW5nTGVmdCA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Qm9udXNQYWRkaW5nTGVmdEl0ZW0oY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Q2xhc3NJbmNsdWRlSXRlbU5vRGF0YSkge1xuICAgICAgICAgIGN1cnJlbnQuY2xhc3NJbmNsdWRlSXRlbU5vRGF0YSA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Q2xhc3NJbmNsdWRlSXRlbU5vRGF0YShjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LmF2YXRhckNvbmZpZyA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0QXZhdGFyQ29uZmlnICYmIGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0QXZhdGFyQ29uZmlnKGN1cnJlbnQpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5tdWx0aUtleVNlbGVjdGVkKCkgJiYgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/Lmxlbmd0aCAmJiB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8uc29tZShrZXkgPT4ga2V5ID09PSBpdGVtTWFwKClbdGhpcy5maWVsZEtleSgpXSkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZCh0cnVlLCBpdGVtTWFwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmJ1aWxkVmFsdWVCeUNvbmZpZyhpdGVtTWFwKTtcblxuICAgICAgcmV0dXJuIGl0ZW1NYXA7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LnNlYXJjaEFsbExldmVsICYmIHRoaXMua2V5U2VhcmNoKCkpIHtcbiAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4gaXRlbSgpLmhhc0Rpc3BsYXlcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZygpPy5zb3J0Py4oaXRlbXMpO1xuICAgIHRoaXMuaXRlbXMuc2V0KGl0ZW1zKTtcbiAgICB0aGlzLm11bHRpS2V5U2VsZWN0ZWQuc2V0KFtdKVxuICAgIGNvbnN0IGNhbGxCYWNrQ2FsY3VsYXRvckhlaWdodFN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICB0aGlzLmNhbGN1bGF0b3JIZWlnaEl0ZW1TdWNjZXNzLnNldCh0cnVlKTtcblxuICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZXhwYW5kRmlyc3RJdGVtICYmIHRoaXMuaXRlbXMoKVswXSkge1xuICAgICAgICB0aGlzLmV4cGFuZEFsbEl0ZW1zSW5Hcm91cCh0aGlzLml0ZW1zKClbMF0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldEhlaWdodFZpZXdQb3J0KCk7XG4gICAgICBpZiAodGhpcy5maXJzdEl0ZW1TZWxlY3RlZCAmJiB0aGlzLmZpcnN0SXRlbVNlbGVjdGVkKCkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZCh0cnVlLCB0aGlzLmZpcnN0SXRlbVNlbGVjdGVkLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZmlyc3RJdGVtU2VsZWN0ZWQuc2V0KHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBjaGVja0xvYWRJdGVtID0gKHByZVN0YXRlSGFzU2Nyb2xsOiBib29sZWFuLCBjdXJyZW50SGFzU2Nyb2xsOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAodGhpcy5rZXlzSGlkZGVuSXRlbSgpPy5sZW5ndGggJiYgcHJlU3RhdGVIYXNTY3JvbGwgJiYgIWN1cnJlbnRIYXNTY3JvbGwgJiYgKHRoaXMuaXNTZWFyY2hPbmxpbmUoKSkpIHtcbiAgICAgICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICAgIHRoaXMucmVmcmVzaFZpZXcoY2FsbEJhY2tDYWxjdWxhdG9ySGVpZ2h0U3VjY2VzcywgY2hlY2tMb2FkSXRlbSk7XG4gICAgICB0aGlzLm91dExvYWRJdGVtc0NvbXBsZXRlLmVtaXQoeyBpdGVtczogdGhpcy5pdGVtcygpIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoVmlldyhjYWxsQmFja0NhbGN1bGF0b3JIZWlnaHRTdWNjZXNzPzogKCkgPT4gdm9pZCwgY2hlY2tMb2FkSXRlbT86IChwcmVTdGF0ZUhhc1Njcm9sbDogYm9vbGVhbiwgY3VycmVudEhhc1Njcm9sbDogYm9vbGVhbikgPT4gdm9pZCkge1xuICAgIHRoaXMuc2V0SGVpZ2h0Vmlld1BvcnQoY2FsbEJhY2tDYWxjdWxhdG9ySGVpZ2h0U3VjY2Vzcyk7XG4gICAgdGhpcy5jaGVja1ZpZXdQb3J0U2Nyb2xsKGNoZWNrTG9hZEl0ZW0pO1xuICB9XG5cbiAgcHJpdmF0ZSBleHBhbmRBbGxJdGVtc0luR3JvdXAoaXRlbTogYW55KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLmV4cGFuZCA9IHRydWU7XG4gICAgY29uc3QgaXRlbXM6IEFycmF5PGFueT4gPSBpdGVtW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc107XG5cbiAgICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXRlbXMuZm9yRWFjaChpdGVtR3JvdXAgPT4gdGhpcy5leHBhbmRBbGxJdGVtc0luR3JvdXAoaXRlbUdyb3VwKSk7XG4gIH1cblxuXG4gIHByaXZhdGUgY29udmVydERhdGFCeUdyb3VwSW5JdGVtKGl0ZW1zOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+PiwgcGFyZW50SXRlbTogV3JpdGFibGVTaWduYWw8YW55Pikge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgaXRlbXNNYXAgPSBpdGVtcy5tYXAoaXRlbSA9PiB7XG4gICAgICBpZiAoaXNOaWwoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pIHx8IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSAnJykge1xuICAgICAgICBpdGVtKClbdGhpcy5maWVsZEtleSgpXSA9IGAke3RoaXMuUEFUVEVSTl9GQUtFX0lEfSR7dXVpZCgpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtTWFwID0gY2xvbmVEZWVwKGl0ZW0pIGFzIFdyaXRhYmxlU2lnbmFsPGFueT47XG5cbiAgICAgIGl0ZW1NYXAudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LnJlZiA9IGl0ZW07XG4gICAgICAgIGN1cnJlbnQucGFyZW50SXRlbSA9IHBhcmVudEl0ZW07XG4gICAgICAgIGN1cnJlbnRbdGhpcy5maWVsZEtleSgpXSA9IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldO1xuXG4gICAgICAgIGN1cnJlbnQubWF4TGV2ZWxHcm91cCA9IHBhcmVudEl0ZW0oKS5tYXhMZXZlbEdyb3VwO1xuICAgICAgICBjdXJyZW50LmxldmVsID0gcGFyZW50SXRlbSgpLmxldmVsICsgMTtcbiAgICAgICAgY3VycmVudC5hcnJheUxldmVsID0gcmFuZ2UoMiwgY3VycmVudC5sZXZlbCArIDEpO1xuICAgICAgICBpZiAoKGN1cnJlbnQubGV2ZWwgPT09IGN1cnJlbnQubWF4TGV2ZWxHcm91cCB8fCAhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGVja2JveEl0ZW0pICYmICFTdHJpbmcoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pPy5pbmNsdWRlcyh0aGlzLlBBVFRFUk5fRkFLRV9JRCkpIHtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbS51cGRhdGUoY3VycmVudCA9PiBjdXJyZW50KyspO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudC5leHBhbmQgPSB0aGlzLmtleVNlYXJjaCgpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICBpZiAoIXRoaXMua2V5U2VhcmNoKCkgJiYgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRFeHBhbmRJdGVtKSB7XG4gICAgICAgICAgY3VycmVudC5leHBhbmQgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEV4cGFuZEl0ZW0oY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudC5kaXNwbGF5QWxsQ2hpbGQgPSBwYXJlbnRJdGVtKCkuZGlzcGxheUFsbENoaWxkO1xuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRQb3BvdmVySXRlbSkge1xuICAgICAgICAgIGN1cnJlbnQuZGF0YVBvcG92ZXIgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldFBvcG92ZXJJdGVtKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldEljb25JbWFnZUNsYXNzKSB7XG4gICAgICAgICAgY3VycmVudC5pY29uSW1hZ2VDbGFzcyA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0SWNvbkltYWdlQ2xhc3MoY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGV4dCA9IGRlbGV0ZVVuaWNvZGUodGhpcy5idWlsZFZhbHVlQnlDb25maWcoaXNTaWduYWwoY3VycmVudCkgPyBjdXJyZW50IGFzIFdyaXRhYmxlU2lnbmFsPGFueT4gOiBzaWduYWwoY3VycmVudCkpLnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgICAgICBjb25zdCBrZXlTZWFyY2ggPSBkZWxldGVVbmljb2RlKGVzY2FwZUh0bWwoKHRoaXMua2V5U2VhcmNoKCkgfHwgJycpLnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgpKSk7XG4gICAgICAgIGNvbnN0IHRleHRFc2NhcGUgPSBlc2NhcGVIdG1sKHRleHQpO1xuICAgICAgICBpZiAoKCF0aGlzLmtleXNIaWRkZW5JdGVtKCk/LnNvbWUoa2V5ID0+IGtleSA9PT0gY3VycmVudFt0aGlzLmZpZWxkS2V5KCldKSkgJiYgKChwYXJlbnRJdGVtKCkuZGlzcGxheUFsbENoaWxkIHx8ICFrZXlTZWFyY2gpIHx8ICgoY29uZmlnVGVtcGxhdGVHcm91cC5zZWFyY2hBbGxMZXZlbCB8fCAhY3VycmVudFt0aGlzLmZpZWxkS2V5KCldLmluY2x1ZGVzKHRoaXMuUEFUVEVSTl9GQUtFX0lEKSkgJiYgKHRleHQuaW5jbHVkZXMoa2V5U2VhcmNoKSB8fCB0ZXh0RXNjYXBlLmluY2x1ZGVzKGtleVNlYXJjaCkpKSkpIHtcbiAgICAgICAgICBjdXJyZW50LmRpc3BsYXlBbGxDaGlsZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zZXREaXNwbGF5SXRlbShjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtR3JvdXAgPSBjdXJyZW50W2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuICAgICAgICBpZiAoaXRlbUdyb3VwPy4oKSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZpbHRlckl0ZW1zRGlzcGxheSh0aGlzLmNvbnZlcnREYXRhQnlHcm91cEluSXRlbShpdGVtR3JvdXA/LigpLCBzaWduYWwoY3VycmVudCkpKTtcbiAgICAgICAgICBpdGVtR3JvdXAuc2V0KGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnRbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCkpIHtcbiAgICAgICAgICBjdXJyZW50W2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10udXBkYXRlKChpdGVtRmllbGRzOiBBcnJheTxhbnk+KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWl0ZW1GaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtRmllbGRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbUZpZWxkc1swXS5pc0ZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IGl0ZW1GaWVsZHM/Lmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICBpdGVtRmllbGRzW2xhc3RJbmRleF0uaXNMYXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1GaWVsZHM7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudC5ib251c1BhZGRpbmdMZWZ0ID0gMDtcbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Qm9udXNQYWRkaW5nTGVmdEl0ZW0pIHtcbiAgICAgICAgICBjdXJyZW50LmJvbnVzUGFkZGluZ0xlZnQgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEJvbnVzUGFkZGluZ0xlZnRJdGVtKGN1cnJlbnQsIHBhcmVudEl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldENsYXNzSW5jbHVkZUl0ZW1Ob0RhdGEpIHtcbiAgICAgICAgICBjdXJyZW50LmNsYXNzSW5jbHVkZUl0ZW1Ob0RhdGEgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldENsYXNzSW5jbHVkZUl0ZW1Ob0RhdGEoY3VycmVudCwgcGFyZW50SXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0TGlua0ltYWdlRXJyb3IpIHtcbiAgICAgICAgICBjdXJyZW50LmxpbmtJbWFnZUVycm9yID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvcihjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRDbGFzc0luY2x1ZGVJdGVtQ29udGVudCkge1xuICAgICAgICAgIGN1cnJlbnQuY2xhc3NJbmNsdWRlID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRDbGFzc0luY2x1ZGVJdGVtQ29udGVudChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LmF2YXRhckNvbmZpZyA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0QXZhdGFyQ29uZmlnICYmIGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0QXZhdGFyQ29uZmlnKGN1cnJlbnQpO1xuICAgICAgICBpZiAodGhpcy5tdWx0aUtleVNlbGVjdGVkKCkgJiYgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/Lmxlbmd0aCAmJiB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8uc29tZShrZXkgPT4ga2V5ID09PSBjdXJyZW50W3RoaXMuZmllbGRLZXkoKV0pKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZCh0cnVlLCBzaWduYWwoY3VycmVudCksIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZWxlY3RGaXJzdEl0ZW0oKSAmJiBjdXJyZW50LmxldmVsID09PSBjdXJyZW50Lm1heExldmVsR3JvdXApIHtcbiAgICAgICAgICB0aGlzLmZpcnN0SXRlbVNlbGVjdGVkLnNldChjdXJyZW50KTtcbiAgICAgICAgICB0aGlzLnNlbGVjdEZpcnN0SXRlbS5zZXQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGl0ZW1NYXA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXRlbXNNYXA7XG4gIH1cblxuICBwcml2YXRlIHNldERpc3BsYXlJdGVtKGl0ZW06IGFueSkge1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLmhhc0Rpc3BsYXkgPSB0cnVlO1xuXG4gICAgaWYgKGl0ZW0ucGFyZW50SXRlbSkge1xuICAgICAgdGhpcy5zZXREaXNwbGF5SXRlbShpdGVtLnBhcmVudEl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVySXRlbXNEaXNwbGF5KGl0ZW1zOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pik6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+IHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zRGlzcGxheSA9IGl0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0oKS5oYXNEaXNwbGF5KTtcblxuICAgIGl0ZW1zRGlzcGxheS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgaXRlbUdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc107XG4gICAgICBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uc2V0KHRoaXMuZmlsdGVySXRlbXNEaXNwbGF5KGl0ZW1Hcm91cD8uKCkgfHwgW10pKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpdGVtc0Rpc3BsYXk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TGVuZ3RoSXRlbSgpOiBudW1iZXIge1xuICAgIGNvbnN0IGRhdGEgPSB7IGxlbmd0aDogdGhpcy5pdGVtcygpLmxlbmd0aCB9O1xuXG4gICAgaWYgKGRhdGEubGVuZ3RoID4gdGhpcy5tYXhJdGVtU2hvdygpKSB7XG4gICAgICByZXR1cm4gZGF0YS5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuZ2V0TGVuZ3RoQWxsR3JvdXAodGhpcy5pdGVtcygpLCBkYXRhKTtcblxuICAgIHJldHVybiBkYXRhLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGVuZ3RoQWxsR3JvdXAoaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+LCBkYXRhOiB7IGxlbmd0aDogbnVtYmVyIH0pIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgIWl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgaWYgKCFpdGVtKCkuZXhwYW5kKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZ3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG5cbiAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkYXRhLmxlbmd0aCArPSAoZ3JvdXA/LigpPy5sZW5ndGggfHwgMCk7XG4gICAgICBpZiAoKCFncm91cD8uKCkgfHwgIWdyb3VwPy4oKS5sZW5ndGgpICYmIGl0ZW0oKS5sZXZlbCA9PT0gMSAmJiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5hdXRvQ291bnRXaGVuR3JvdXBFbXB0eUl0ZW1MZXZlbDEpKSB7XG4gICAgICAgIGRhdGEubGVuZ3RoICs9IDE7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLmxlbmd0aCA+IHRoaXMubWF4SXRlbVNob3coKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmdldExlbmd0aEFsbEdyb3VwKGdyb3VwKCksIGRhdGEpO1xuICAgICAgaWYgKGRhdGEubGVuZ3RoID4gdGhpcy5tYXhJdGVtU2hvdygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0SGVpZ2h0R3JvdXBIYXNMaW5lKCkge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwPy5pZ25vcmVHcm91cExpbmUgfHwgIXRoaXMuaXRlbXMoKT8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgbGV0IGNvdW50ID0gMDtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKCkpIHtcbiAgICAgIGlmIChsZW5ndGggPj0gdGhpcy5tYXhJdGVtU2hvdygpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY291bnQgKz0gMTtcbiAgICAgIGxlbmd0aCArPSAxO1xuICAgICAgY29uc3QgZ3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG4gICAgICBjb25zdCBkYXRhID0geyBsZW5ndGg6IGl0ZW0oKS5leHBhbmQgPyBncm91cCgpPy5sZW5ndGggfHwgMCA6IDAgfTtcblxuICAgICAgdGhpcy5nZXRMZW5ndGhBbGxHcm91cChncm91cCgpLCBkYXRhKTtcbiAgICAgIGxlbmd0aCArPSBkYXRhLmxlbmd0aDtcbiAgICB9XG4gICAgY29uc3QgbWFyZ2luVG9wSGFzTGluZSA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAubWFyZ2luVG9wSGFzTGluZSB8fCA0O1xuICAgIGNvbnN0IGhlaWdodCA9IGNvdW50ID09PSAxID8gbWFyZ2luVG9wSGFzTGluZSA6IChjb3VudCAtIDEpICogKG1hcmdpblRvcEhhc0xpbmUgKiAzICsgMSk7XG5cbiAgICByZXR1cm4gaGVpZ2h0O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkVmFsdWVCeUNvbmZpZyhpdGVtOiBXcml0YWJsZVNpZ25hbDxhbnk+KTogc3RyaW5nIHtcbiAgICBjb25zdCBsYWJlbFNlYXJjaCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRMYWJlbFNlYXJjaD8uKGl0ZW0oKSk7XG5cbiAgICBpZiAoaXRlbSgpLmlzUm9vdCkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRMYWJlbEdyb3VwKSB7XG4gICAgICAgIGl0ZW0oKS5maWVsZExhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldExhYmVsR3JvdXAoaXRlbSgpKSB8fCAnICcpO1xuXG4gICAgICAgIHJldHVybiBsYWJlbFNlYXJjaCA/PyBpdGVtKCkuZmllbGRMYWJlbDtcbiAgICAgIH1cbiAgICAgIGl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LmZpZWxkTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChjdXJyZW50LmxhYmVsIHx8IGN1cnJlbnQubmFtZSB8fCAnICcpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBpdGVtKCkuZmllbGRMYWJlbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRMYWJlbEl0ZW0pIHtcbiAgICAgIGl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LmZpZWxkTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0TGFiZWxJdGVtKGN1cnJlbnQpIHx8ICcgJyk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGxhYmVsU2VhcmNoID8/IGl0ZW0oKS5maWVsZExhYmVsO1xuICAgIH1cbiAgICBpdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQuZmllbGRMYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGN1cnJlbnQubGFiZWwgfHwgY3VycmVudC5uYW1lIHx8ICcgJyk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhYmVsU2VhcmNoID8/IGl0ZW0oKS5maWVsZExhYmVsO1xuICB9XG59XG4iLCJAaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAoKTsgYXMgY29uZmlnVGVtcGxhdGVHcm91cCkge1xuICBAbGV0IGNvbnN0SHRtbEhlaWdodFZpZXdQb3J0ID0gaGVpZ2h0Vmlld1BvcnQoKSA/IGhlaWdodFZpZXdQb3J0KCkrJ3B4JzonMTAwJSc7XG4gIEBsZXQgY29uc3RIdG1sRGlzYWJsZSA9IGxvYWRpbmcoKSB8fCBkaXNhYmxlKCkgfHwgZmFsc2U7XG4gIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWxpc3QtZ3JvdXAgb3ZlcmZsb3ctW2hpZGRlbl1cIlxuICAgIFtzdHlsZS5oZWlnaHRdPVwiY29uc3RIdG1sSGVpZ2h0Vmlld1BvcnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1mdWxsIHJlbGF0aXZlIG1pbi1oLVsyOHB4XVwiPlxuICAgICAgQGlmIChpdGVtcygpLmxlbmd0aCAmJiBjb25maWdUZW1wbGF0ZUdyb3VwLmNvbmZpZ0J1dHRvblNlbGVjdEFuZFVuZFNlbGVjdEl0ZW0/LigpOyBhcyBjb25maWdCdXR0b25TZWxlY3RJdGVtKSB7XG4gICAgPGRpdlxuICAgICAgW2NsYXNzXT1cIidmbGV4IGl0ZW1zLWNlbnRlciBiZy1bI2ZmZmZmZl0gJysoY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5jbGFzc0luY2x1ZGUgPz8gJ2xpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsJylcIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gW3R5cGVdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25DaGVja0FsbD8udHlwZSA/PyAnYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICBbbGFiZWxdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25DaGVja0FsbD8ubGFiZWwgPz8gJ2kxOG5fc2VsZWN0X2FsbF9zZWFyY2hlZF9yZXN1bHRzJ1wiXG4gICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25DaGVja0FsbD8uY2xhc3NJbmNsdWRlIHx8ICdwci1bOHB4XSdcIlxuICAgICAgICBbY2xhc3NMYWJlbF09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvbkNoZWNrQWxsPy5jbGFzc0xhYmVsIHx8ICdsaWJzLXVpLWZvbnQtaDZyJ1wiXG4gICAgICAgIFtkaXNhYmxlXT1cImNvbnN0SHRtbERpc2FibGVcIlxuICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNoZWNrZWRPclVuQ2hlY2tlZEFsbCh0cnVlKVwiIC8+XG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dC1bIzk5OTk5OV1cIj58PC9kaXY+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uVW5jaGVja0FsbD8udHlwZSA/PyAnYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICBbbGFiZWxdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25VbmNoZWNrQWxsPy5sYWJlbCA/PyAnaTE4bl91bnNlbGVjdF9hbGxfc2VhcmNoZWRfcmVzdWx0cydcIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uVW5jaGVja0FsbD8uY2xhc3NJbmNsdWRlIHx8ICdwbC1bOHB4XSdcIlxuICAgICAgICBbY2xhc3NMYWJlbF09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvblVuY2hlY2tBbGw/LmNsYXNzTGFiZWwgfHwgJ2xpYnMtdWktZm9udC1oNnMnXCJcbiAgICAgICAgW2Rpc2FibGVdPVwiY29uc3RIdG1sRGlzYWJsZVwiXG4gICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2hlY2tlZE9yVW5DaGVja2VkQWxsKGZhbHNlKVwiIC8+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChpdGVtcygpLmxlbmd0aCAmJiBjb25maWdUZW1wbGF0ZUdyb3VwLmNvbmZpZ0NoZWNrYm94Q2hlY2tBbGw/LigpOyBhcyBjb25maWdDaGVja0JveCkge1xuICAgIDxkaXZcbiAgICAgIFtjbGFzc109XCInZmxleCBsaWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbCAnKyhjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzSW5jbHVkZUhhc0NvbmZpZ0NoZWNrQm94QWxsID8/ICcgYmctWyNmZmZmZmZdJylcIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlIFtsYWJlbF09XCJjb25maWdDaGVja0JveC5sYWJlbCA/PyAnaTE4bl9hbGwnXCJcbiAgICAgICAgW2NsYXNzTGFiZWxJbmNsdWRlXT1cImNvbmZpZ0NoZWNrQm94LmNsYXNzTGFiZWxJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgW2NoZWNrZWRdPVwidG90YWxJdGVtQ2hlY2tlZCgpID49IHRvdGFsSXRlbSgpICYmIHRvdGFsSXRlbSgpID4gMFwiXG4gICAgICAgIFtkaXNhYmxlXT1cImNvbnN0SHRtbERpc2FibGVcIlxuICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIpPSdoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpJ1xuICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGVja2VkT3JVbkNoZWNrZWRBbGwoJGV2ZW50LmNoZWNrZWQpXCIgLz5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKGl0ZW1zKCkgJiYgaXRlbXMoKS5sZW5ndGgpIHtcbiAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGgtZnVsbCByZWxhdGl2ZSBmbGV4XCI+XG4gICAgICA8ZGl2IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgIGNsYXNzPVwidy1mdWxsIGgtZnVsbCBhYnNvbHV0ZSB0b3AtMCBsZWZ0LTAge3sgY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0luY2x1ZGVHcm91cCA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlR3JvdXAgOiAnJyB9fVwiPlxuICAgICAgICBAZm9yIChpdGVtIG9mIGl0ZW1zKCk7IHRyYWNrIGl0ZW0oKVtmaWVsZEtleSgpXTsgbGV0IGZpcnN0ID0gJGZpcnN0OyBsZXQgbGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgPGRpdiAjaXRlbVJlZlxuICAgICAgICAgICAgW3N0eWxlLm1hcmdpblRvcC5weF09XCIhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVHcm91cExpbmUgPyBjb25maWdUZW1wbGF0ZUdyb3VwLm1hcmdpblRvcEhhc0xpbmUgfHwgNCA6IDBcIlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHJlbGF0aXZlIFwiPlxuICAgICAgICAgICAgQGxldCBjb25zdEh0bWxQYWRkaW5nID0gbGV2ZWwoKSooY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlID8gOCA6IDE2KTtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHktWzZweF0gXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJnLWxpc3QtaG92ZXJdPVwiIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2xpY2tMYWJlbEdyb3VwXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJnLWxpc3QtaG92ZXItYWN0aXZlXT1cIiFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNsaWNrTGFiZWxHcm91cFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuIWN1cnNvci1wb2ludGVyXT1cIiFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNsaWNrTGFiZWxHcm91cCAgJiYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nTGVmdC5weF09XCJjb25zdEh0bWxQYWRkaW5nXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nUmlnaHQucHhdPVwiY29uc3RIdG1sUGFkZGluZ1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pID8gaGFuZGxlclRvZ2dsZUV4cGFuZCgkZXZlbnQsaXRlbSkgOiB1bmRlZmluZWRcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAnbGVmdCcgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlKSB7XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgYmVmb3JlOiF0ZXh0LVsxNnB4XVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnJvdGF0ZS05MF09XCJpdGVtKCkuZXhwYW5kXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlclRvZ2dsZUV4cGFuZCgkZXZlbnQsaXRlbSlcIj5cbiAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgICBbY2xhc3Mudy1mdWxsXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlICYmICghY29uZmlnVGVtcGxhdGVHcm91cC5zZWFyY2hBbGxMZXZlbCB8fCAhIWl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy4oKT8ubGVuZ3RoKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy53LVtjYWxjKDEwMCUtMTZweCldXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZVwiPlxuICAgICAgICAgICAgICBAaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1JhZGlvKSB7XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGUgW2F2YXRhckNvbmZpZ109XCJpdGVtKCkuYXZhdGFyQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5tbC1bOHB4XV09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVcIlxuICAgICAgICAgICAgICAgICAgW2lnbm9yZUNoZWNrYm94XT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlSXRlbSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Mudy1hdXRvXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Mudy1mdWxsXT1cIiFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCAmJiAhKChjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC53aWR0aExhYmVsU3ViMjRXaGVuTm90VHJlZVZpZXcpICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKSlcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLm1heC13LVtjYWxjKDEwMCUtMjRweCldXT1cIihjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC53aWR0aExhYmVsU3ViMjRXaGVuTm90VHJlZVZpZXcpICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKVwiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiaXRlbSgpLmZpZWxkTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiaXRlbSgpLmRhdGFQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAgIFt6SW5kZXhMYWJlbF09XCJjb25maWdUZW1wbGF0ZUdyb3VwLnpJbmRleExhYmVsID8/IHpJbmRleCgpXCJcbiAgICAgICAgICAgICAgICAgIFtkYXRhQ29tcG9uZW50T3V0bGV0XT1cIih1bmRlZmluZWQgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0RGF0YUNvbXBvbmVudE91dGxldEdyb3VwOml0ZW0oKTpmaWVsZEtleSgpOnt2YWx1ZUlzRW1wdHk6e2l0ZW06aXRlbSgpfX0pIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudE91dGxldF09XCIoMCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6Y29uZmlnVGVtcGxhdGVHcm91cC5nZXRDb21wb25lbnRPdXRsZXRHcm91cDppdGVtKCk6ZmllbGRLZXkoKTp7dmFsdWVJczA6MH0pIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgW2xpbmtJbWFnZV09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmdldEltYWdlID8gKCgnYXZhdGFyJyB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6KGl0ZW0oKS5zcGVjaWZpY19sb2FkSW1nRXJyb3IgJiYgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvciA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0TGlua0ltYWdlRXJyb3IgOiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEltYWdlKTppdGVtKCkpIHwgYXN5bmMpIDogaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRBdmF0YXJJdGVtIHx8ICcnXVwiXG4gICAgICAgICAgICAgICAgICBbaW1nVHlwZUljb25dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pbWdUeXBlSWNvblwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NMYWJlbEluY2x1ZGVdPVwiKGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NMYWJlbEl0ZW0gPyBjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzTGFiZWxJdGVtIDogKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSA/ICcgbGlicy11aS1mb250LWg2ciAnOicgbGlicy11aS1mb250LWg2cyAnKSkgKyAoKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlVGV4dFVwcGVyY2FzZUxhYmVsR3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlKSA/ICcnOicgdGV4dC11cHBlcmNhc2UgJylcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IChpdGVtKClbZmllbGRLZXkoKV0gfCBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlOmtleXNEaXNhYmxlSXRlbSgpOmtleXNEaXNhYmxlSXRlbSgpPy5sZW5ndGgpXCJcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIml0ZW0oKVtmaWVsZEtleSgpXSB8IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGU6a2V5c0NoZWNrZWQoKTprZXlzQ2hlY2tlZCgpLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICBbc3RpbGxPdGhlck9wdGlvbnNdPVwiaXRlbSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZTprZXlzU3RpbGxPdGhlck9wdGlvbnMoKTprZXlzU3RpbGxPdGhlck9wdGlvbnMoKS5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQ2hlY2tlZCgkZXZlbnQuY2hlY2tlZCxpdGVtLCB0cnVlKVwiXG4gICAgICAgICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIpPSdoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpJ1xuICAgICAgICAgICAgICAgICAgKG91dENsaWNrTGFiZWwpPVwiaGFuZGxlclRvZ2dsZUV4cGFuZCgnY2xpY2tMYWJlbCcsaXRlbSxjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoZWNrYm94R3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtKVwiIC8+XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3UmFkaW8pIHtcbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXJhZGlvLXNpbmdsZVxuICAgICAgICAgICAgICAgICAgW2NsYXNzLm1sLVs4cHhdXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZVwiXG4gICAgICAgICAgICAgICAgICBbYXZhdGFyQ29uZmlnXT1cIml0ZW0oKS5hdmF0YXJDb25maWdcIlxuICAgICAgICAgICAgICAgICAgW2lnbm9yZVJhZGlvXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlUmFkaW9Hcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlSXRlbSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Mudy1hdXRvXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Mudy1mdWxsXT1cIiFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCAmJiAhKChjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC53aWR0aExhYmVsU3ViMjRXaGVuTm90VHJlZVZpZXcpICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKSlcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLm1heC13LVtjYWxjKDEwMCUtMjRweCldXT1cIihjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC53aWR0aExhYmVsU3ViMjRXaGVuTm90VHJlZVZpZXcpICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKVwiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiaXRlbSgpLmZpZWxkTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiaXRlbSgpLmRhdGFQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAgIFtkYXRhQ29tcG9uZW50T3V0bGV0XT1cIih1bmRlZmluZWQgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0RGF0YUNvbXBvbmVudE91dGxldEdyb3VwOml0ZW0oKTpmaWVsZEtleSgpOnt2YWx1ZUlzRW1wdHk6e2l0ZW06aXRlbSgpfX0pIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudE91dGxldF09XCIoMCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6Y29uZmlnVGVtcGxhdGVHcm91cC5nZXRDb21wb25lbnRPdXRsZXRHcm91cDppdGVtKCk6ZmllbGRLZXkoKTp7dmFsdWVJczA6MH0pIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgW3pJbmRleExhYmVsXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuekluZGV4TGFiZWwgPz8gekluZGV4KClcIlxuICAgICAgICAgICAgICAgICAgW2ltZ1R5cGVJY29uXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaW1nVHlwZUljb25cIlxuICAgICAgICAgICAgICAgICAgW2xpbmtJbWFnZV09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmdldEltYWdlID8gKCgnYXZhdGFyJyB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6KGl0ZW0oKS5zcGVjaWZpY19sb2FkSW1nRXJyb3IgJiYgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvciA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0TGlua0ltYWdlRXJyb3IgOiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEltYWdlKTppdGVtKCkpIHwgYXN5bmMpIDogaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRBdmF0YXJJdGVtIHx8ICcnXVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NMYWJlbEluY2x1ZGVdPVwiKGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NMYWJlbEl0ZW0gPyBjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzTGFiZWxJdGVtIDogJ2xpYnMtdWktZm9udC1oNnMgJykgKyAoY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVUZXh0VXBwZXJjYXNlTGFiZWxHcm91cCA/ICcnOicgdXBwZXJjYXNlJylcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IChjb25maWdUZW1wbGF0ZUdyb3VwLmRpc2FibGVJdGVtTm90TGFzdExldmVsICYmICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0gfHwgKGl0ZW0oKVtmaWVsZEtleSgpXSB8IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGU6a2V5c0Rpc2FibGVJdGVtKCk6a2V5c0Rpc2FibGVJdGVtKCk/Lmxlbmd0aClcIlxuICAgICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJpdGVtKClbZmllbGRLZXkoKV0gfCBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlOmtleXNDaGVja2VkKCk6a2V5c0NoZWNrZWQoKS5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQ2hlY2tlZCgkZXZlbnQuYWN0aXZlLGl0ZW0sIHRydWUpXCJcbiAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlUG9wb3Zlcik9J2hhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKCRldmVudCknXG4gICAgICAgICAgICAgICAgICAob3V0Q2xpY2tMYWJlbCk9XCJoYW5kbGVyVG9nZ2xlRXhwYW5kKCdjbGlja0xhYmVsJyxpdGVtLGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlUmFkaW9Hcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pXCIgLz5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIEBpZiAoaXRlbSgpLmJ1dHRvbkluR3JvdXA7IGFzIGJ1dHRvbkluR3JvdXApIHtcbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cImJ1dHRvbkluR3JvdXAudHlwZSB8fCAnYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImJ1dHRvbkluR3JvdXAubGFiZWwgfHwgJyAnXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIihidXR0b25Jbkdyb3VwLmNsYXNzSWNvbkxlZnQgfHwgJycpKycgZmxleCBtci1bOHB4XSAhdGV4dC1bOHB4XSdcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJidXR0b25Jbkdyb3VwLmNsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NMYWJlbF09XCJidXR0b25Jbkdyb3VwLmNsYXNzTGFiZWwgfHwgJ2xpYnMtdWktZm9udC1oNXInXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImJ1dHRvbkluR3JvdXAuZGlzYWJsZSB8fCBkaXNhYmxlKCkgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGlja0J1dHRvbkdyb3VwKGJ1dHRvbkluR3JvdXAsaXRlbSgpKVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlICYmICghY29uZmlnVGVtcGxhdGVHcm91cC5zZWFyY2hBbGxMZXZlbCB8fCAhIWl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy4oKT8ubGVuZ3RoKSkge1xuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyIGxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IGJlZm9yZTohdGV4dC1bMTZweF1cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy4hbWwtWzhweF1dPVwiaXRlbSgpLmRhdGFQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Mucm90YXRlLTkwXT1cIml0ZW0oKS5leHBhbmRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyVG9nZ2xlRXhwYW5kKCRldmVudCxpdGVtKVwiPlxuICAgICAgICAgICAgICA8L2k+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmIChpdGVtKCkuZXhwYW5kICYmIGNhbGN1bGF0b3JIZWlnaEl0ZW1TdWNjZXNzKCkpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGlzdC10ZW1wbGF0ZXNfZ3JvdXAtaXRlbSBba2V5U2VhcmNoXT1cImtleVNlYXJjaCgpXCJcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cIml0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdKClcIlxuICAgICAgICAgICAgICBbcGFyZW50SXRlbV09XCJpdGVtKClcIlxuICAgICAgICAgICAgICBbZmllbGRLZXldPVwiZmllbGRLZXkoKVwiXG4gICAgICAgICAgICAgIFtrZXlzQ2hlY2tlZF09XCJrZXlzQ2hlY2tlZCgpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgW2tleXNEaXNhYmxlSXRlbV09XCJrZXlzRGlzYWJsZUl0ZW0oKSB8fCBbXVwiXG4gICAgICAgICAgICAgIFtjb25maWdUZW1wbGF0ZUdyb3VwXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXBcIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImNvbmZpZygpXCJcbiAgICAgICAgICAgICAgW2tleXNTdGlsbE90aGVyT3B0aW9uc109XCJrZXlzU3RpbGxPdGhlck9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgIChvdXRDaGFuZ2VWaWV3KT1cImhhbmRsZXJDaGFuZ2VWaWV3KClcIlxuICAgICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIpPSdoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpJ1xuICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VJdGVtQ2hlY2tlZCgkZXZlbnQuaXRlbSlcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKCFsYXN0ICYmICFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUdyb3VwTGluZSAmJiBjYWxjdWxhdG9ySGVpZ2hJdGVtU3VjY2VzcygpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1saXN0LWdyb3VwLWxpbmVcIlxuICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luVG9wLnB4XT1cIiFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUdyb3VwTGluZSA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAubWFyZ2luVG9wSGFzTGluZSB8fCA0IDogMFwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAoIWl0ZW1zKCkgfHwgIWl0ZW1zKCkubGVuZ3RoKSB7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVyIHRleHQtWyNjMWMxYzFdIHJlbGF0aXZlIHt7IGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlTm9kYXRhP2NvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlTm9kYXRhOicnIH19XCJcbiAgICAgIFtzdHlsZS5tYXJnaW5MZWZ0LnB4XT1cIjAgfCBMaWJzVWlDb21wb25lbnRzTGlzdEdyb3VwQ2FsY3VsYXRvck1hcmdpbkxlZnRJdGVtUGlwZToyOihjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAnbGVmdCcpOmNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZUpzb246IShjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoZWNrYm94SXRlbSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZVJhZGlvSXRlbSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pOnRydWVcIlxuICAgICAgW2NsYXNzLnB5LVs4cHhdXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRBdmF0YXJJdGVtXCJcbiAgICAgIFtjbGFzcy5weS1bNHB4XV09XCIhY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEF2YXRhckl0ZW1cIj5cbiAgICAgIEBpZiAoIWtleVNlYXJjaCgpICYmICFsb2FkaW5nKCkpIHtcbiAgICAgICAgPGRpdj57eyAoY29uZmlnKCk/LnRleHROb0RhdGEgPz8gJ2kxOG5fbm9fZGF0YV95ZXQnKSB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChrZXlTZWFyY2goKSAmJiAhbG9hZGluZygpKSB7XG4gICAgICAgIDxkaXY+e3sgKGNvbmZpZygpPy50ZXh0U2VhcmNoTm9EYXRhID8/J2kxOG5fbm9fcmVzdWx0JykgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKGxvYWRpbmcoKSkge1xuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtc3Bpbm5lciBbc2l6ZV09XCInbWVkaXVtJ1wiIC8+XG4gIH1cbiAgPC9kaXY+XG4gIDwvZGl2PlxufVxuIl19
|