@libs-ui/components-inputs-multi-language 0.2.80 → 0.2.82

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.
@@ -11,6 +11,7 @@ import { LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe } from './pipes/ge
11
11
  import { currenciesOptions, currenciesSupport, httpRequestDetail, langOptions, languageSupport, listConfigItem, validRequired } from './utils/multi-language';
12
12
  import { LibsUiComponentsInputsMultiLanguageGetItemPipe } from './pipes/get-item.pipe';
13
13
  import { LibsUiPipesEscapeHtmlPipe } from '@libs-ui/pipes-escape-html';
14
+ import { LibsUiComponentsInputsQuillComponent } from '@libs-ui/components-inputs-quill';
14
15
  import * as i0 from "@angular/core";
15
16
  import * as i1 from "@ngx-translate/core";
16
17
  export class LibsUiComponentsInputsMultiLanguageComponent {
@@ -24,7 +25,7 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
24
25
  listConfigItem = computed(() => listConfigItem(this.options()));
25
26
  httpRequestDetail = computed(() => httpRequestDetail(this.options()));
26
27
  inputFunctionControl = signal(new Map());
27
- // private quillFunctionControl: Array<IQuillFunctionControl>;
28
+ quillFunctionControl = signal([]);
28
29
  onDestroy = new Subject();
29
30
  /* INPUT */
30
31
  zIndex = input();
@@ -132,9 +133,9 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
132
133
  async handlerInputFunctionControl(event, key) {
133
134
  this.inputFunctionControl().set(key, event);
134
135
  }
135
- // protected async handlerFunctionControlEditor(event: IQuillFunctionControl) {
136
- // this.functionControlEditor.push(event);
137
- // }
136
+ async handlerQuillFunctionControl(event) {
137
+ this.quillFunctionControl.update(items => [...items, event]);
138
+ }
138
139
  async handlerSelectChange(event, keyOld) {
139
140
  if (!event || event.key === keyOld) {
140
141
  return;
@@ -225,11 +226,11 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
225
226
  valid = false;
226
227
  }
227
228
  }
228
- // for (const control of this.functionControlEditor.values()) {
229
- // if (!(await control.valid())) {
230
- // valid = false;
231
- // }
232
- // }
229
+ for (const control of this.quillFunctionControl()) {
230
+ if (!(await control.checkIsValid())) {
231
+ valid = false;
232
+ }
233
+ }
233
234
  if (this.singleLanguage()) {
234
235
  return valid;
235
236
  }
@@ -343,7 +344,7 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
343
344
  this.onDestroy.complete();
344
345
  }
345
346
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsInputsMultiLanguageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
346
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsInputsMultiLanguageComponent, isStandalone: true, selector: "libs_ui-components-inputs-multi_language", inputs: { zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, viewType: { classPropertyName: "viewType", publicName: "viewType", isSignal: true, isRequired: false, transformFunction: null }, singleLanguage: { classPropertyName: "singleLanguage", publicName: "singleLanguage", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, ignoreAdd: { classPropertyName: "ignoreAdd", publicName: "ignoreAdd", isSignal: true, isRequired: false, transformFunction: null }, titleField: { classPropertyName: "titleField", publicName: "titleField", isSignal: true, isRequired: false, transformFunction: null }, keyHeader: { classPropertyName: "keyHeader", publicName: "keyHeader", isSignal: true, isRequired: false, transformFunction: null }, textArea: { classPropertyName: "textArea", publicName: "textArea", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, extendClass: { classPropertyName: "extendClass", publicName: "extendClass", isSignal: true, isRequired: false, transformFunction: null }, extendClassContent: { classPropertyName: "extendClassContent", publicName: "extendClassContent", isSignal: true, isRequired: false, transformFunction: null }, viewPosition: { classPropertyName: "viewPosition", publicName: "viewPosition", isSignal: true, isRequired: false, transformFunction: null }, ignoreRemove: { classPropertyName: "ignoreRemove", publicName: "ignoreRemove", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, countCharacters: { classPropertyName: "countCharacters", publicName: "countCharacters", isSignal: true, isRequired: false, transformFunction: null }, viewContent: { classPropertyName: "viewContent", publicName: "viewContent", isSignal: true, isRequired: false, transformFunction: null }, classIncludeKey: { classPropertyName: "classIncludeKey", publicName: "classIncludeKey", isSignal: true, isRequired: false, transformFunction: null }, classIncludeValue: { classPropertyName: "classIncludeValue", publicName: "classIncludeValue", isSignal: true, isRequired: false, transformFunction: null }, dataLanguage: { classPropertyName: "dataLanguage", publicName: "dataLanguage", isSignal: true, isRequired: false, transformFunction: null }, multiLine: { classPropertyName: "multiLine", publicName: "multiLine", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, acceptNegativeValue: { classPropertyName: "acceptNegativeValue", publicName: "acceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, valueUpDownNumber: { classPropertyName: "valueUpDownNumber", publicName: "valueUpDownNumber", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { data: "dataChange", ignoreAdd: "ignoreAddChange", extendClass: "extendClassChange", dataLanguage: "dataLanguageChange", outEventMultiLanguage: "outEventMultiLanguage", outChangeTypeLanguage: "outChangeTypeLanguage", outFunctionsControl: "outFunctionsControl", outChangeValueInput: "outChangeValueInput" }, ngImport: i0, template: "<div class=\"w-full\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m mb-[4px]\"> {{ titleField | translate }}</div>\n }\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div [class.mt-[4px]]=\"!$first\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[8px]]=\"countCharacters() && !$first\">\n <div class=\"flex {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe:key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div class=\"flex relative p-0 {{ extendClassContent() }}\"\n [class.w-[calc(100%-150px)]]=\"!textArea() && !singleLanguage() && viewPosition() === 'row'\"\n [class.w-full]=\"textArea() || singleLanguage() || viewPosition() === 'column'\">\n @for (item of data(); track item) {\n @if (item.type !== 'editor' && !item.isOneValue || (item.isOneValue && $first)) {\n <div class=\"relative {{ item.classIncludeInput }}\"\n [class.w-full]=\"singleLanguage() && !multiLine() || readonly() || $first\"\n [class.w-[calc(100%-28px)]]=\"textArea() || (!singleLanguage() && multiLine())\"\n [class.w-[calc(100%-40px)]]=\"!textArea() && !singleLanguage() && !multiLine() && !readonly()\"\n [class.w-[calc(100%-70px)]]=\"!textArea() && !singleLanguage() && multiLine()\"\n [class.mt-[8px]]=\"viewPosition() === 'column'\"\n [class.ml-[12px]]=\"!singleLanguage() && !textArea() && viewPosition() === 'row'\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe:dataLanguageChange; as itemMap) {\n <libs_ui-components-inputs-valid [dataType]=\"item.type === 'number' ? 'int' : (item.type === 'text' ? 'string' : (item.type === 'bigint' ? 'bigint' : 'float'))\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [labelConfig]=\"countCharacters() ? { classInclude: 'absolute -top-[20px]', required: true} : undefined\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"item.placeholder\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"($index === 0 && data().length <= 1) ? validRequiredDefault() : \n ($index === 0 && data().length > 1 && item.validRequiredLangDefault) ? item.validRequiredLangDefault : item.validRequired ? item.validRequired : (validRequired() || { isRequired: false })\"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength.length ? validMaxLength.length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"{length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: {number: validMinLength()?.length}}\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\"\n (outFunctionsControl)=\"handlerInputFunctionControl($event, key)\" />\n }\n </div>\n }\n @if (item.type === 'editor') {\n <div class=\"w-[calc(100%-28px)]\">\n <div class=\"h-[250px]\">\n <!-- <mo-libs-core_ui-components-quill [item]=\"item.keyBindData ? dataLanguageChange[item.keyBindData] : dataLanguageChange\"\n [fieldNameBind]=\"key\"\n [validRequired]=\"(i === 0 && configDatas.length <= 1) ? validRequiredLangDefault : validRequiredName\"\n [placeholder]=\"(item.placeholder || '' | translate)\"\n [readonly]=\"readonly\"\n (moFocus)=\"handlerInputChange()\"\n (moChange)=\"handlerInputChange()\"\n (moFunctionsControl)=\"handlerFunctionControlEditor($event)\">\n </mo-libs-core_ui-components-quill> -->\n </div>\n </div>\n }\n }\n @if (($index > 0 && data().length === 1) && !ignoreRemove() && !readonly()) {\n <div class=\"h-[32px] flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631'\n },\n rootColor: '#071631'\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{config: {content: 'i18n_delete', zIndex: 1205}}\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n </div>\n }\n </div>\n </div>\n @if ($index === 0 && !singleLanguage() && (options().length !== languageDisplay().length) && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [label]=\"'i18n_add_language'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classInclude]=\"'!px-0 mt-[8px]'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex\">\n @if (singleLanguage()) {\n <div class=\"flex\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe:options()\" />\n </div>\n }\n <div class=\"w-[calc(100%-100px)]\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.flex]=\"!singleLanguage || $first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"((dataLanguageChange()[key] || dataLanguageChange()[key] === 0) ? (dataLanguageChange()[key] + '') : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{zIndex: zIndex()}\" />\n </div>\n </div>\n }\n }\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button type=\"button-link-primary\"\n [classIconLeft]=\"'libs-ui-icon-add mr-[8px] text-[10px]'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [classInclude]=\"'!pb-0'\"\n [label]=\"'i18n_add_currency'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "hiddenContent", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { 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"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe, name: "LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe, name: "LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetItemPipe, name: "LibsUiComponentsInputsMultiLanguageGetItemPipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
347
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsInputsMultiLanguageComponent, isStandalone: true, selector: "libs_ui-components-inputs-multi_language", inputs: { zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, viewType: { classPropertyName: "viewType", publicName: "viewType", isSignal: true, isRequired: false, transformFunction: null }, singleLanguage: { classPropertyName: "singleLanguage", publicName: "singleLanguage", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, ignoreAdd: { classPropertyName: "ignoreAdd", publicName: "ignoreAdd", isSignal: true, isRequired: false, transformFunction: null }, titleField: { classPropertyName: "titleField", publicName: "titleField", isSignal: true, isRequired: false, transformFunction: null }, keyHeader: { classPropertyName: "keyHeader", publicName: "keyHeader", isSignal: true, isRequired: false, transformFunction: null }, textArea: { classPropertyName: "textArea", publicName: "textArea", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, extendClass: { classPropertyName: "extendClass", publicName: "extendClass", isSignal: true, isRequired: false, transformFunction: null }, extendClassContent: { classPropertyName: "extendClassContent", publicName: "extendClassContent", isSignal: true, isRequired: false, transformFunction: null }, viewPosition: { classPropertyName: "viewPosition", publicName: "viewPosition", isSignal: true, isRequired: false, transformFunction: null }, ignoreRemove: { classPropertyName: "ignoreRemove", publicName: "ignoreRemove", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, countCharacters: { classPropertyName: "countCharacters", publicName: "countCharacters", isSignal: true, isRequired: false, transformFunction: null }, viewContent: { classPropertyName: "viewContent", publicName: "viewContent", isSignal: true, isRequired: false, transformFunction: null }, classIncludeKey: { classPropertyName: "classIncludeKey", publicName: "classIncludeKey", isSignal: true, isRequired: false, transformFunction: null }, classIncludeValue: { classPropertyName: "classIncludeValue", publicName: "classIncludeValue", isSignal: true, isRequired: false, transformFunction: null }, dataLanguage: { classPropertyName: "dataLanguage", publicName: "dataLanguage", isSignal: true, isRequired: false, transformFunction: null }, multiLine: { classPropertyName: "multiLine", publicName: "multiLine", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, acceptNegativeValue: { classPropertyName: "acceptNegativeValue", publicName: "acceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, valueUpDownNumber: { classPropertyName: "valueUpDownNumber", publicName: "valueUpDownNumber", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { data: "dataChange", ignoreAdd: "ignoreAddChange", extendClass: "extendClassChange", dataLanguage: "dataLanguageChange", outEventMultiLanguage: "outEventMultiLanguage", outChangeTypeLanguage: "outChangeTypeLanguage", outFunctionsControl: "outFunctionsControl", outChangeValueInput: "outChangeValueInput" }, ngImport: i0, template: "<div class=\"w-full\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m mb-[4px]\"> {{ titleField | translate }}</div>\n }\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div [class.mt-[4px]]=\"!$first\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[8px]]=\"countCharacters() && !$first\">\n <div class=\"flex {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe:key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div class=\"flex relative p-0 {{ extendClassContent() }}\"\n [class.w-[calc(100%-150px)]]=\"!textArea() && !singleLanguage() && viewPosition() === 'row'\"\n [class.w-full]=\"textArea() || singleLanguage() || viewPosition() === 'column'\">\n @for (item of data(); track item) {\n @if (item.type !== 'editor' && !item.isOneValue || (item.isOneValue && $first)) {\n <div class=\"relative {{ item.classIncludeInput }}\"\n [class.w-full]=\"singleLanguage() && !multiLine() || readonly() || $first\"\n [class.w-[calc(100%-28px)]]=\"textArea() || (!singleLanguage() && multiLine())\"\n [class.w-[calc(100%-40px)]]=\"!textArea() && !singleLanguage() && !multiLine() && !readonly()\"\n [class.w-[calc(100%-70px)]]=\"!textArea() && !singleLanguage() && multiLine()\"\n [class.mt-[8px]]=\"viewPosition() === 'column'\"\n [class.ml-[12px]]=\"!singleLanguage() && !textArea() && viewPosition() === 'row'\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe:dataLanguageChange; as itemMap) {\n <libs_ui-components-inputs-valid [dataType]=\"item.type === 'number' ? 'int' : (item.type === 'text' ? 'string' : (item.type === 'bigint' ? 'bigint' : 'float'))\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [labelConfig]=\"countCharacters() ? { classInclude: 'absolute -top-[20px]', required: true} : undefined\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"(item.placeholder || '') | translate\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"($index === 0 && data().length <= 1) ? validRequiredDefault() : \n ($index === 0 && data().length > 1 && item.validRequiredLangDefault) ? item.validRequiredLangDefault : item.validRequired ? item.validRequired : (validRequired() || { isRequired: false })\"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength.length ? validMaxLength.length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"{length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: {number: validMinLength()?.length}}\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\"\n (outFunctionsControl)=\"handlerInputFunctionControl($event, key)\" />\n }\n </div>\n }\n @if (item.type === 'editor') {\n <div class=\"w-[calc(100%-28px)]\">\n <div class=\"h-[250px]\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe:dataLanguageChange; as itemMap) {\n <libs_ui-components-inputs-quill [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [validRequired]=\"($index === 0 && data().length <= 1) ? validRequiredDefault() : validRequired()\"\n [placeholder]=\"(item.placeholder || '') | translate\"\n [readonly]=\"readonly()\"\n (outFocus)=\"handlerInputChange()\"\n (outChange)=\"handlerInputChange()\"\n (outFunctionsControl)=\"handlerQuillFunctionControl($event)\" />\n }\n </div>\n </div>\n }\n }\n @if (($index > 0 && data().length === 1) && !ignoreRemove() && !readonly()) {\n <div class=\"h-[32px] flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631'\n },\n rootColor: '#071631'\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{config: {content: 'i18n_delete', zIndex: 1205}}\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n </div>\n }\n </div>\n </div>\n @if ($index === 0 && !singleLanguage() && (options().length !== languageDisplay().length) && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [label]=\"'i18n_add_language'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classInclude]=\"'!px-0 mt-[8px]'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex\">\n @if (singleLanguage()) {\n <div class=\"flex\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe:options()\" />\n </div>\n }\n <div class=\"w-[calc(100%-100px)]\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.flex]=\"!singleLanguage || $first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"((dataLanguageChange()[key] || dataLanguageChange()[key] === 0) ? (dataLanguageChange()[key] + '') : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{zIndex: zIndex()}\" />\n </div>\n </div>\n }\n }\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button type=\"button-link-primary\"\n [classIconLeft]=\"'libs-ui-icon-add mr-[8px] text-[10px]'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [classInclude]=\"'!pb-0'\"\n [label]=\"'i18n_add_currency'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "hiddenContent", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { 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"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe, name: "LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe, name: "LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetItemPipe, name: "LibsUiComponentsInputsMultiLanguageGetItemPipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }, { kind: "component", type: LibsUiComponentsInputsQuillComponent, selector: "libs_ui-components-inputs-quill", inputs: ["optionsToolbar", "showToolBar", "classIncludeToolbar", "placeholder", "label", "item", "fieldNameBind", "readonly", "showErrorLabel", "showErrorBorder", "onlyShowErrorBorderInContent", "classIncludeTemplate", "classInclude", "handlersExpand", "validRequired", "validMinLength", "validMaxLength", "onlyShowContent", "zIndex", "dataConfigMention", "heightAuto", "autoFocus", "autoFocusBottom", "templateToolBarPersonalize", "template", "uploadImageConfig"], outputs: ["itemChange", "outMessageError", "outBlur", "outFocus", "outChange", "outFunctionsControl", "outSelectionChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
347
348
  }
348
349
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsInputsMultiLanguageComponent, decorators: [{
349
350
  type: Component,
@@ -356,7 +357,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
356
357
  LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe,
357
358
  LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe,
358
359
  LibsUiComponentsInputsMultiLanguageGetItemPipe,
359
- LibsUiPipesEscapeHtmlPipe
360
- ], template: "<div class=\"w-full\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m mb-[4px]\"> {{ titleField | translate }}</div>\n }\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div [class.mt-[4px]]=\"!$first\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[8px]]=\"countCharacters() && !$first\">\n <div class=\"flex {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe:key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div class=\"flex relative p-0 {{ extendClassContent() }}\"\n [class.w-[calc(100%-150px)]]=\"!textArea() && !singleLanguage() && viewPosition() === 'row'\"\n [class.w-full]=\"textArea() || singleLanguage() || viewPosition() === 'column'\">\n @for (item of data(); track item) {\n @if (item.type !== 'editor' && !item.isOneValue || (item.isOneValue && $first)) {\n <div class=\"relative {{ item.classIncludeInput }}\"\n [class.w-full]=\"singleLanguage() && !multiLine() || readonly() || $first\"\n [class.w-[calc(100%-28px)]]=\"textArea() || (!singleLanguage() && multiLine())\"\n [class.w-[calc(100%-40px)]]=\"!textArea() && !singleLanguage() && !multiLine() && !readonly()\"\n [class.w-[calc(100%-70px)]]=\"!textArea() && !singleLanguage() && multiLine()\"\n [class.mt-[8px]]=\"viewPosition() === 'column'\"\n [class.ml-[12px]]=\"!singleLanguage() && !textArea() && viewPosition() === 'row'\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe:dataLanguageChange; as itemMap) {\n <libs_ui-components-inputs-valid [dataType]=\"item.type === 'number' ? 'int' : (item.type === 'text' ? 'string' : (item.type === 'bigint' ? 'bigint' : 'float'))\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [labelConfig]=\"countCharacters() ? { classInclude: 'absolute -top-[20px]', required: true} : undefined\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"item.placeholder\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"($index === 0 && data().length <= 1) ? validRequiredDefault() : \n ($index === 0 && data().length > 1 && item.validRequiredLangDefault) ? item.validRequiredLangDefault : item.validRequired ? item.validRequired : (validRequired() || { isRequired: false })\"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength.length ? validMaxLength.length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"{length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: {number: validMinLength()?.length}}\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\"\n (outFunctionsControl)=\"handlerInputFunctionControl($event, key)\" />\n }\n </div>\n }\n @if (item.type === 'editor') {\n <div class=\"w-[calc(100%-28px)]\">\n <div class=\"h-[250px]\">\n <!-- <mo-libs-core_ui-components-quill [item]=\"item.keyBindData ? dataLanguageChange[item.keyBindData] : dataLanguageChange\"\n [fieldNameBind]=\"key\"\n [validRequired]=\"(i === 0 && configDatas.length <= 1) ? validRequiredLangDefault : validRequiredName\"\n [placeholder]=\"(item.placeholder || '' | translate)\"\n [readonly]=\"readonly\"\n (moFocus)=\"handlerInputChange()\"\n (moChange)=\"handlerInputChange()\"\n (moFunctionsControl)=\"handlerFunctionControlEditor($event)\">\n </mo-libs-core_ui-components-quill> -->\n </div>\n </div>\n }\n }\n @if (($index > 0 && data().length === 1) && !ignoreRemove() && !readonly()) {\n <div class=\"h-[32px] flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631'\n },\n rootColor: '#071631'\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{config: {content: 'i18n_delete', zIndex: 1205}}\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n </div>\n }\n </div>\n </div>\n @if ($index === 0 && !singleLanguage() && (options().length !== languageDisplay().length) && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [label]=\"'i18n_add_language'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classInclude]=\"'!px-0 mt-[8px]'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex\">\n @if (singleLanguage()) {\n <div class=\"flex\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe:options()\" />\n </div>\n }\n <div class=\"w-[calc(100%-100px)]\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.flex]=\"!singleLanguage || $first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"((dataLanguageChange()[key] || dataLanguageChange()[key] === 0) ? (dataLanguageChange()[key] + '') : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{zIndex: zIndex()}\" />\n </div>\n </div>\n }\n }\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button type=\"button-link-primary\"\n [classIconLeft]=\"'libs-ui-icon-add mr-[8px] text-[10px]'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [classInclude]=\"'!pb-0'\"\n [label]=\"'i18n_add_currency'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n" }]
360
+ LibsUiPipesEscapeHtmlPipe,
361
+ LibsUiComponentsInputsQuillComponent
362
+ ], template: "<div class=\"w-full\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m mb-[4px]\"> {{ titleField | translate }}</div>\n }\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div [class.mt-[4px]]=\"!$first\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[8px]]=\"countCharacters() && !$first\">\n <div class=\"flex {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe:key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div class=\"flex relative p-0 {{ extendClassContent() }}\"\n [class.w-[calc(100%-150px)]]=\"!textArea() && !singleLanguage() && viewPosition() === 'row'\"\n [class.w-full]=\"textArea() || singleLanguage() || viewPosition() === 'column'\">\n @for (item of data(); track item) {\n @if (item.type !== 'editor' && !item.isOneValue || (item.isOneValue && $first)) {\n <div class=\"relative {{ item.classIncludeInput }}\"\n [class.w-full]=\"singleLanguage() && !multiLine() || readonly() || $first\"\n [class.w-[calc(100%-28px)]]=\"textArea() || (!singleLanguage() && multiLine())\"\n [class.w-[calc(100%-40px)]]=\"!textArea() && !singleLanguage() && !multiLine() && !readonly()\"\n [class.w-[calc(100%-70px)]]=\"!textArea() && !singleLanguage() && multiLine()\"\n [class.mt-[8px]]=\"viewPosition() === 'column'\"\n [class.ml-[12px]]=\"!singleLanguage() && !textArea() && viewPosition() === 'row'\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe:dataLanguageChange; as itemMap) {\n <libs_ui-components-inputs-valid [dataType]=\"item.type === 'number' ? 'int' : (item.type === 'text' ? 'string' : (item.type === 'bigint' ? 'bigint' : 'float'))\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [labelConfig]=\"countCharacters() ? { classInclude: 'absolute -top-[20px]', required: true} : undefined\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"(item.placeholder || '') | translate\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"($index === 0 && data().length <= 1) ? validRequiredDefault() : \n ($index === 0 && data().length > 1 && item.validRequiredLangDefault) ? item.validRequiredLangDefault : item.validRequired ? item.validRequired : (validRequired() || { isRequired: false })\"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength.length ? validMaxLength.length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"{length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: {number: validMinLength()?.length}}\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\"\n (outFunctionsControl)=\"handlerInputFunctionControl($event, key)\" />\n }\n </div>\n }\n @if (item.type === 'editor') {\n <div class=\"w-[calc(100%-28px)]\">\n <div class=\"h-[250px]\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe:dataLanguageChange; as itemMap) {\n <libs_ui-components-inputs-quill [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [validRequired]=\"($index === 0 && data().length <= 1) ? validRequiredDefault() : validRequired()\"\n [placeholder]=\"(item.placeholder || '') | translate\"\n [readonly]=\"readonly()\"\n (outFocus)=\"handlerInputChange()\"\n (outChange)=\"handlerInputChange()\"\n (outFunctionsControl)=\"handlerQuillFunctionControl($event)\" />\n }\n </div>\n </div>\n }\n }\n @if (($index > 0 && data().length === 1) && !ignoreRemove() && !readonly()) {\n <div class=\"h-[32px] flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631'\n },\n rootColor: '#071631'\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{config: {content: 'i18n_delete', zIndex: 1205}}\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n </div>\n }\n </div>\n </div>\n @if ($index === 0 && !singleLanguage() && (options().length !== languageDisplay().length) && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [label]=\"'i18n_add_language'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classInclude]=\"'!px-0 mt-[8px]'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex\">\n @if (singleLanguage()) {\n <div class=\"flex\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe:options()\" />\n </div>\n }\n <div class=\"w-[calc(100%-100px)]\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.flex]=\"!singleLanguage || $first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"((dataLanguageChange()[key] || dataLanguageChange()[key] === 0) ? (dataLanguageChange()[key] + '') : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{zIndex: zIndex()}\" />\n </div>\n </div>\n }\n }\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button type=\"button-link-primary\"\n [classIconLeft]=\"'libs-ui-icon-add mr-[8px] text-[10px]'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [classInclude]=\"'!pb-0'\"\n [label]=\"'i18n_add_currency'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n" }]
361
363
  }], ctorParameters: () => [] });
362
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pKLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBa0IsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRyxPQUFPLEVBQWlFLG9DQUFvQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkosT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVqRCxPQUFPLEVBQUUsc0RBQXNELEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RyxPQUFPLEVBQUUsb0RBQW9ELEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVB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WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRVMsS0FBSyxDQUFDLGtCQUFrQjtRQUNoQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7d0dBL1ZVLDRDQUE0Qzs0RkFBNUMsNENBQTRDLHVxSUNqQ3pELHk2UEEySUEsMkNEckhJLGVBQWUsNEZBQ2YsaUNBQWlDLG16REFDakMsb0NBQW9DLHF6REFDcEMsc0NBQXNDLGloQkFDdEMsZ0NBQWdDLGdlQUNoQyxvREFBb0Qsd0ZBQ3BELHNEQUFzRCwwRkFDdEQsOENBQThDLGtGQUM5Qyx5QkFBeUI7OzRGQUdoQiw0Q0FBNEM7a0JBbEJ4RCxTQUFTOytCQUVFLDBDQUEwQyxjQUV4QyxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7d0JBQ1AsZUFBZTt3QkFDZixpQ0FBaUM7d0JBQ2pDLG9DQUFvQzt3QkFDcEMsc0NBQXNDO3dCQUN0QyxnQ0FBZ0M7d0JBQ2hDLG9EQUFvRDt3QkFDcEQsc0RBQXNEO3dCQUN0RCw4Q0FBOEM7d0JBQzlDLHlCQUF5QjtxQkFDMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbnB1dCwgbW9kZWwsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSUlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2xFdmVudCwgSVZhbGlkTGVuZ3RoLCBJVmFsaWRSZXF1aXJlZCwgTGlic1VpQ29tcG9uZW50c0lucHV0c1ZhbGlkQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtdmFsaWQnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBnZXQsIGlzTmlsIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJQ3VycmVuY3lVbml0LCBJRGF0YUl0ZW0sIElEYXRhTXVsdGlMYW5ndWFnZSwgSUV2ZW50TXVsdGlMYW5ndWFnZSwgSUlucHV0TXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJT3B0aW9uLCBUWVBFX1ZJRVdfTVVMVElfTEFOR1VBR0UgfSBmcm9tICcuL2ludGVyZmFjZXMvbXVsdGktbGFuZ3VhZ2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlRGlzcGxheUxhbmd1YWdlUGlwZSB9IGZyb20gJy4vcGlwZXMvZGlzcGxheS1sYW5ndWFnZS5waXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0RGlzYWJsZUtleVBpcGUgfSBmcm9tICcuL3BpcGVzL2dldC1kaXNhYmxlLWtleS5waXBlJztcbmltcG9ydCB7IGN1cnJlbmNpZXNPcHRpb25zLCBjdXJyZW5jaWVzU3VwcG9ydCwgaHR0cFJlcXVlc3REZXRhaWwsIGxhbmdPcHRpb25zLCBsYW5ndWFnZVN1cHBvcnQsIGxpc3RDb25maWdJdGVtLCB2YWxpZFJlcXVpcmVkIH0gZnJvbSAnLi91dGlscy9tdWx0aS1sYW5ndWFnZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldEl0ZW1QaXBlIH0gZnJvbSAnLi9waXBlcy9nZXQtaXRlbS5waXBlJztcbmltcG9ydCB7IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1lc2NhcGUtaHRtbCc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtbXVsdGlfbGFuZ3VhZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c1ZhbGlkQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0RGlzYWJsZUtleVBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VEaXNwbGF5TGFuZ3VhZ2VQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0SXRlbVBpcGUsXG4gICAgTGlic1VpUGlwZXNFc2NhcGVIdG1sUGlwZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qIFBST1BFUlRZICovXG4gIHByb3RlY3RlZCBsYW5ndWFnZURpc3BsYXkgPSBzaWduYWw8QXJyYXk8c3RyaW5nPj4oW10pO1xuICBwcm90ZWN0ZWQgZGF0YUxhbmd1YWdlQ2hhbmdlID0gc2lnbmFsPElEYXRhTXVsdGlMYW5ndWFnZT4oe30pO1xuICBwcm90ZWN0ZWQgbGFuZ0RlZmF1bHQgPSBzaWduYWw8QXJyYXk8c3RyaW5nPj4obGFuZ3VhZ2VTdXBwb3J0KCkpO1xuICBwcm90ZWN0ZWQgY3VycmVuY3lVbml0cyA9IHNpZ25hbDxBcnJheTxJQ3VycmVuY3lVbml0Pj4oW10pO1xuICBwcm90ZWN0ZWQgb3B0aW9ucyA9IHNpZ25hbDxBcnJheTxJT3B0aW9uPj4obGFuZ09wdGlvbnMoKSk7XG4gIHByb3RlY3RlZCB2YWxpZFJlcXVpcmVkRGVmYXVsdCA9IHNpZ25hbDxJVmFsaWRSZXF1aXJlZD4odmFsaWRSZXF1aXJlZCgpKTtcbiAgcHJvdGVjdGVkIGxpc3RDb25maWdJdGVtID0gY29tcHV0ZWQoKCkgPT4gbGlzdENvbmZpZ0l0ZW0odGhpcy5vcHRpb25zKCkpKTtcbiAgcHJvdGVjdGVkIGh0dHBSZXF1ZXN0RGV0YWlsID0gY29tcHV0ZWQoKCkgPT4gaHR0cFJlcXVlc3REZXRhaWwodGhpcy5vcHRpb25zKCkpKTtcblxuICBwcml2YXRlIGlucHV0RnVuY3Rpb25Db250cm9sID0gc2lnbmFsPE1hcDxzdHJpbmcsIElJbnB1dFZhbGlkRnVuY3Rpb25Db250cm9sRXZlbnQ+PihuZXcgTWFwKCkpO1xuICAvLyBwcml2YXRlIHF1aWxsRnVuY3Rpb25Db250cm9sOiBBcnJheTxJUXVpbGxGdW5jdGlvbkNvbnRyb2w+O1xuICBwcml2YXRlIG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLyogSU5QVVQgKi9cbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSB2aWV3VHlwZSA9IGlucHV0PFRZUEVfVklFV19NVUxUSV9MQU5HVUFHRSwgVFlQRV9WSUVXX01VTFRJX0xBTkdVQUdFIHwgdW5kZWZpbmVkPigndGV4dCcsIHsgdHJhbnNmb3JtOiB2YWx1ZSA9PiB2YWx1ZSA/PyAndGV4dCcgfSk7XG4gIHJlYWRvbmx5IHNpbmdsZUxhbmd1YWdlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZGF0YSA9IG1vZGVsPEFycmF5PElEYXRhSXRlbT4+KFtdKTtcbiAgcmVhZG9ubHkgdmFsaWRSZXF1aXJlZCA9IGlucHV0PElWYWxpZFJlcXVpcmVkLCBJVmFsaWRSZXF1aXJlZCB8IHVuZGVmaW5lZD4odmFsaWRSZXF1aXJlZCgpLCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgPz8gdmFsaWRSZXF1aXJlZCgpIH0pXG4gIHJlYWRvbmx5IGlnbm9yZUFkZCA9IG1vZGVsPGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHRpdGxlRmllbGQgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGtleUhlYWRlciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgdGV4dEFyZWEgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZXh0ZW5kQ2xhc3MgPSBtb2RlbDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGV4dGVuZENsYXNzQ29udGVudCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgdmlld1Bvc2l0aW9uID0gaW5wdXQ8J3JvdycgfCAnY29sdW1uJz4oJ3JvdycpO1xuICByZWFkb25seSBpZ25vcmVSZW1vdmUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB2YWxpZE1heExlbmd0aCA9IGlucHV0PElWYWxpZExlbmd0aCwgSVZhbGlkTGVuZ3RoIHwgdW5kZWZpbmVkPih7IGxlbmd0aDogMCB9LCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgPz8geyBsZW5ndGg6IDAgfSB9KTtcbiAgcmVhZG9ubHkgdmFsaWRNaW5MZW5ndGggPSBpbnB1dDxJVmFsaWRMZW5ndGg+KCk7XG4gIHJlYWRvbmx5IGNvdW50Q2hhcmFjdGVycyA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHZpZXdDb250ZW50ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlS2V5ID0gaW5wdXQ8c3RyaW5nPignbGlicy11aS1mb250LWg0cicpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVWYWx1ZSA9IGlucHV0PHN0cmluZz4oJ2xpYnMtdWktZm9udC1oNHMnKTtcbiAgcmVhZG9ubHkgZGF0YUxhbmd1YWdlID0gbW9kZWw8SURhdGFNdWx0aUxhbmd1YWdlPih7fSk7XG4gIHJlYWRvbmx5IG11bHRpTGluZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHJlYWRvbmx5ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgYWNjZXB0TmVnYXRpdmVWYWx1ZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHZhbHVlVXBEb3duTnVtYmVyID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBtYXhWYWx1ZU51bWJlciA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgb25seUFjY2VwdE5lZ2F0aXZlVmFsdWUgPSBpbnB1dDxib29sZWFuPigpO1xuXG4gIC8qIE9VVFBVVCAqL1xuICByZWFkb25seSBvdXRFdmVudE11bHRpTGFuZ3VhZ2UgPSBvdXRwdXQ8SUV2ZW50TXVsdGlMYW5ndWFnZT4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlVHlwZUxhbmd1YWdlID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SUlucHV0TXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICByZWFkb25seSBvdXRDaGFuZ2VWYWx1ZUlucHV0ID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdUeXBlID0gdGhpcy52aWV3VHlwZSgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKHZpZXdUeXBlID09PSAnaW50ZWdlcicpIHtcbiAgICAgICAgICB0aGlzLmxhbmdEZWZhdWx0LnNldChjdXJyZW5jaWVzU3VwcG9ydCgpKTtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2V0KGN1cnJlbmNpZXNPcHRpb25zKCkpO1xuICAgICAgICAgIHRoaXMub3B0aW9ucygpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbmN5VW5pdHMoKS5wdXNoKHtcbiAgICAgICAgICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICAgICAgICAgIGlkOiBpdGVtLmtleSxcbiAgICAgICAgICAgICAgdHlwZTogaXRlbS5sYWJlbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jdXJyZW5jeVVuaXRzLnVwZGF0ZSh2YWx1ZSA9PiBbLi4udmFsdWVdKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGFMYW5ndWFnZSA9IHRoaXMuZGF0YUxhbmd1YWdlKCk7XG4gICAgICAgIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLnNldChjbG9uZURlZXAoZGF0YUxhbmd1YWdlKSk7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVEYXRhKCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNTZWxlY3RlZDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMoKS5maW5kKGl0ZW0gPT4gaXRlbS5rZXkgPT09IGtleSkpIHtcbiAgICAgICAgICAgIG9wdGlvbnNTZWxlY3RlZC5hZGQoa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5sYW5nRGVmYXVsdCgpLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMubGFuZ0RlZmF1bHQoKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNOaWwoZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXkpKSkge1xuICAgICAgICAgICAgICBvcHRpb25zU2VsZWN0ZWQuYWRkKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYW5ndWFnZURpc3BsYXkuc2V0KEFycmF5LmZyb20ob3B0aW9uc1NlbGVjdGVkKSk7XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3Qgc2luZ2xlTGFuZ3VhZ2UgPSB0aGlzLnNpbmdsZUxhbmd1YWdlKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLm91dENoYW5nZVR5cGVMYW5ndWFnZS5lbWl0KHRydWUpO1xuICAgICAgICBpZiAoIXNpbmdsZUxhbmd1YWdlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMubGFuZ0RlZmF1bHQoKVswXTtcbiAgICAgICAgdGhpcy5kYXRhTGFuZ3VhZ2UudXBkYXRlKHZhbHVlID0+ICh7IC4uLnZhbHVlLCBba2V5XTogZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXkpIH0pKTtcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCB2YWxpZFJlcXVpcmVkID0gdGhpcy52YWxpZFJlcXVpcmVkKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBpZiAoIXZhbGlkUmVxdWlyZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUodmFsdWUgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IHZhbGlkUmVxdWlyZWQuaXNSZXF1aXJlZCB9KSlcbiAgICAgICAgaWYgKCF2YWxpZFJlcXVpcmVkLmlzUmVxdWlyZWQpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KHtcbiAgICAgIGNoZWNrSXNWYWxpZDogdGhpcy52YWxpZGF0ZS5iaW5kKHRoaXMpLFxuICAgICAgZ2V0RGF0YTogdGhpcy5nZXREYXRhLmJpbmQodGhpcylcbiAgICB9KTtcbiAgICB0aGlzLmV4dGVuZENsYXNzLnVwZGF0ZSh2YWx1ZSA9PiBgJHt2YWx1ZSB8fCAnJ30gJHt0aGlzLnZpZXdQb3NpdGlvbigpID09PSAncm93JyA/ICdmbGV4LXJvdycgOiAnZmxleC1jb2wnfWApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJJbnB1dEZ1bmN0aW9uQ29udHJvbChldmVudDogSUlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2xFdmVudCwga2V5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sKCkuc2V0KGtleSwgZXZlbnQpO1xuICB9XG5cbiAgLy8gcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2xFZGl0b3IoZXZlbnQ6IElRdWlsbEZ1bmN0aW9uQ29udHJvbCkge1xuICAvLyAgIHRoaXMuZnVuY3Rpb25Db250cm9sRWRpdG9yLnB1c2goZXZlbnQpO1xuICAvLyB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJTZWxlY3RDaGFuZ2UoZXZlbnQ6IElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkLCBrZXlPbGQ6IHN0cmluZykge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQua2V5ID09PSBrZXlPbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYW5ndWFnZURpc3BsYXkudXBkYXRlKHZhbHVlID0+IHZhbHVlLm1hcChpdGVtID0+IGl0ZW0gPT09IGtleU9sZCA/IGV2ZW50LmtleSBhcyBzdHJpbmcgOiBpdGVtKSlcbiAgICBkZWxldGUgdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKVtrZXlPbGRdO1xuICAgIGRlbGV0ZSB0aGlzLmRhdGFMYW5ndWFnZSgpW2tleU9sZF07XG4gICAgdGhpcy5zZXREZWZhdWx0RGF0YShldmVudC5rZXkgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQWRkTGFuZ3VhZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgbGFuZyA9IHRoaXMub3B0aW9ucygpLmZpbmQoaXRlbSA9PiAhdGhpcy5sYW5ndWFnZURpc3BsYXkoKS5pbmNsdWRlcyhpdGVtLmtleSkpO1xuICAgIGlmICghbGFuZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxhbmd1YWdlRGlzcGxheS51cGRhdGUodmFsdWUgPT4gWy4uLnZhbHVlLCBsYW5nLmtleV0pO1xuICAgIHRoaXMuc2V0RGVmYXVsdERhdGEobGFuZy5rZXkpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMoKS5sZW5ndGggPT09IHRoaXMubGFuZ3VhZ2VEaXNwbGF5KCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLmlnbm9yZUFkZC5zZXQodHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMub3V0RXZlbnRNdWx0aUxhbmd1YWdlLmVtaXQoeyBhY3Rpb246ICdhZGQnLCBkYXRhOiB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJSZW1vdmVMYW5ndWFnZShldmVudDogRXZlbnQsIGtleTogc3RyaW5nKSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pZ25vcmVBZGQuc2V0KHRydWUpO1xuICAgIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLnVwZGF0ZSh2YWx1ZSA9PiB7XG4gICAgICBkZWxldGUgdmFsdWVba2V5XTtcbiAgICAgIHJldHVybiB7IC4uLnZhbHVlIH07XG4gICAgfSlcbiAgICB0aGlzLnZhbGlkYXRlSXNNdWx0aUtleSgpO1xuICAgIHRoaXMubGFuZ3VhZ2VEaXNwbGF5LnVwZGF0ZSh2YWx1ZSA9PiB2YWx1ZS5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSBrZXkpKTtcbiAgICB0aGlzLm91dEV2ZW50TXVsdGlMYW5ndWFnZS5lbWl0KHsgYWN0aW9uOiAncmVtb3ZlJywgZGF0YTogdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSB9KTtcbiAgICB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sKCkuZGVsZXRlKGtleSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldERhdGEoKSB7XG4gICAgaWYgKHRoaXMuc2luZ2xlTGFuZ3VhZ2UoKSkge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgICAgdGhpcy5kYXRhTGFuZ3VhZ2UudXBkYXRlKHZhbHVlID0+ICh7IC4uLnZhbHVlLCBba2V5XTogZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXkpIH0pKTtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFMYW5ndWFnZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhKCkubGVuZ3RoID4gMSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuZGF0YSgpKSB7XG4gICAgICAgIGNvbnN0IGxhbmcgPSB0aGlzLmxhbmdEZWZhdWx0KClbMF07XG4gICAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5QmluZERhdGE7XG4gICAgICAgIGNvbnN0IGRhdGFCeUtleSA9IGtleSA/IGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwga2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGtleSAmJiBkYXRhQnlLZXkgJiYgbGFuZyAmJiAhZ2V0KGRhdGFCeUtleSwgbGFuZykgJiYgIWdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwgbGFuZykpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVEYXRhKCkge1xuICAgIGNvbnN0IGxhbmcgPSB0aGlzLmxhbmdEZWZhdWx0KClbMF07XG4gICAgaWYgKHRoaXMuZGF0YSgpLmxlbmd0aCkge1xuICAgICAgdGhpcy5kYXRhKCkuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXlCaW5kRGF0YTtcbiAgICAgICAgaWYgKCFpbmRleCAmJiBpc05pbChnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGxhbmcpKSkge1xuICAgICAgICAgIHRoaXMuc2V0RGVmYXVsdERhdGEobGFuZyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgha2V5IHx8ICFpc05pbChnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGtleSkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLnVwZGF0ZSh2YWx1ZSA9PiAoeyAuLi52YWx1ZSwgW2tleV06IHsgW2xhbmddOiAnJyB9IH0pKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGF0YSgpLmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLmRhdGFMYW5ndWFnZSgpIHx8ICFPYmplY3Qua2V5cyh0aGlzLmRhdGFMYW5ndWFnZSgpKS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0RGF0YShsYW5nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YS5zZXQoW3tcbiAgICAgICAgdHlwZTogdGhpcy52aWV3VHlwZSgpLFxuICAgICAgICBwbGFjZWhvbGRlcjogdGhpcy5wbGFjZWhvbGRlcigpLFxuICAgICAgICBpc09uZVZhbHVlOiBmYWxzZSxcbiAgICAgICAga2V5QmluZERhdGE6ICcnXG4gICAgICB9XSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXREZWZhdWx0RGF0YShrZXk6IHN0cmluZykge1xuICAgIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLnVwZGF0ZSh2YWx1ZSA9PiAoeyAuLi52YWx1ZSwgW2tleV06ICcnIH0pKTtcbiAgICB0aGlzLmRhdGFMYW5ndWFnZS51cGRhdGUodmFsdWUgPT4gKHsgLi4udmFsdWUsIFtrZXldOiAnJyB9KSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlKCkge1xuICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuaW5wdXRGdW5jdGlvbkNvbnRyb2woKS52YWx1ZXMoKSkge1xuICAgICAgaWYgKCEoYXdhaXQgY29udHJvbC5jaGVja0lzVmFsaWQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuZnVuY3Rpb25Db250cm9sRWRpdG9yLnZhbHVlcygpKSB7XG4gICAgLy8gICBpZiAoIShhd2FpdCBjb250cm9sLnZhbGlkKCkpKSB7XG4gICAgLy8gICAgIHZhbGlkID0gZmFsc2U7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuICAgIGlmICh0aGlzLnNpbmdsZUxhbmd1YWdlKCkpIHtcbiAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YSgpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZURlZmF1bHQoKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUlzTXVsdGlLZXkoKTtcbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlRGVmYXVsdCgpIHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnZhbGlkUmVxdWlyZWQoKS5pc1JlcXVpcmVkKSB7XG4gICAgICB0aGlzLnZhbGlkUmVxdWlyZWREZWZhdWx0LnVwZGF0ZSh2YWx1ZSA9PiAoeyAuLi52YWx1ZSwgaXNSZXF1aXJlZDogdHJ1ZSB9KSk7XG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpKSkge1xuICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbGlkO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSkubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLnZhbGlkUmVxdWlyZWREZWZhdWx0LnVwZGF0ZSh2YWx1ZSA9PiAoeyAuLi52YWx1ZSwgaXNSZXF1aXJlZDogZmFsc2UgfSkpO1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSkpIHtcbiAgICAgIGlmIChrZXkgIT09ICdpZCcgJiYga2V5ICE9PSB0aGlzLmtleUhlYWRlcigpICYmIGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwga2V5KSAmJiBrZXkgIT09IHRoaXMubGFuZ0RlZmF1bHQoKVswXSkge1xuICAgICAgICB0aGlzLnZhbGlkUmVxdWlyZWREZWZhdWx0LnVwZGF0ZSh2YWx1ZSA9PiAoeyAuLi52YWx1ZSwgaXNSZXF1aXJlZDogdHJ1ZSB9KSk7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnZhbGlkUmVxdWlyZWREZWZhdWx0LnVwZGF0ZSh2YWx1ZSA9PiAoeyAuLi52YWx1ZSwgaXNSZXF1aXJlZDogZmFsc2UgfSkpO1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1ZhbGlkSW5wdXQoKSB7XG4gICAgbGV0IHZhbGlkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5pbnB1dEZ1bmN0aW9uQ29udHJvbCgpLnZhbHVlcygpKSB7XG4gICAgICBpZiAoIShhd2FpdCBjb250cm9sLmNoZWNrSXNWYWxpZCgpKSkge1xuICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlSXNNdWx0aUtleSgpIHtcbiAgICBpZiAodGhpcy5kYXRhKCkubGVuZ3RoID4gMSkge1xuICAgICAgaWYgKHRoaXMuZGF0YSgpWzBdLnZhbGlkUmVxdWlyZWQ/LmlzUmVxdWlyZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5kYXRhKCkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoIWl0ZW0ua2V5QmluZERhdGEpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmtleXMoZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBpdGVtLmtleUJpbmREYXRhKSkuZm9yRWFjaChhc3luYyAoa2V5QmluZCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkpKSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBpdGVtLmtleUJpbmREYXRhIHx8IGtleSA9PT0ga2V5QmluZCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGtleSkgJiYgdGhpcy5vcHRpb25zKCkuZmluZChpdGVtID0+IGl0ZW0ua2V5ID09PSBrZXkpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZGF0YSgpLmZvckVhY2goYXN5bmMgKGNvbmZpZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgY29uZmlnLnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdC5pc1JlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kYXRhKCkuZm9yRWFjaChhc3luYyAoY29uZmlnKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQuaXNSZXF1aXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmQgPSBnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGtleUJpbmQpO1xuICAgICAgICAgIGNvbnN0IGRhdGFMYW5ndWFnZUNoYW5nZUJ5S2V5QmluZERhdGEgPSBpdGVtLmtleUJpbmREYXRhID8gZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBpdGVtLmtleUJpbmREYXRhKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAoKCFkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmQgJiYgIWdldChkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmREYXRhLCBrZXlCaW5kKSkgfHwgKGRhdGFMYW5ndWFnZUNoYW5nZUJ5S2V5QmluZCAmJiBnZXQoZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kRGF0YSwga2V5QmluZCkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhRmlyc3QgPSB0aGlzLmRhdGEoKVswXTtcbiAgICAgICAgICAgIGlmIChkYXRhRmlyc3QgJiYgZGF0YUZpcnN0LnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdCkge1xuICAgICAgICAgICAgICBkYXRhRmlyc3QudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0LmlzUmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWdldChkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmREYXRhLCBrZXlCaW5kKSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YVNlY29uZCA9IHRoaXMuZGF0YSgpWzFdO1xuICAgICAgICAgICAgaWYgKGRhdGFTZWNvbmQgJiYgZGF0YVNlY29uZC52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgZGF0YVNlY29uZC52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQuaXNSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVySW5wdXRDaGFuZ2UoKSB7XG4gICAgdGhpcy5vdXRDaGFuZ2VWYWx1ZUlucHV0LmVtaXQoKTtcbiAgICB0aW1lcig1MDApLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHRoaXMudmFsaWRhdGUoKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gIEBpZiAodGl0bGVGaWVsZCgpOyBhcyB0aXRsZUZpZWxkKSB7XG4gICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oNm0gbWItWzRweF1cIj4ge3sgdGl0bGVGaWVsZCB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICB9XG4gIEBmb3IgKGtleSBvZiBsYW5ndWFnZURpc3BsYXkoKTsgdHJhY2sga2V5KSB7XG4gICAgQGlmICghdmlld0NvbnRlbnQoKSkge1xuICAgICAgPGRpdiBbY2xhc3MubXQtWzRweF1dPVwiISRmaXJzdFwiXG4gICAgICAgIFtjbGFzcy5oaWRkZW5dPVwic2luZ2xlTGFuZ3VhZ2UoKSAmJiAhJGZpcnN0XCJcbiAgICAgICAgW2NsYXNzLm10LVs4cHhdXT1cImNvdW50Q2hhcmFjdGVycygpICYmICEkZmlyc3RcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgge3sgZXh0ZW5kQ2xhc3MoKSB9fVwiPlxuICAgICAgICAgIEBpZiAoIXNpbmdsZUxhbmd1YWdlKCkpIHtcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24gW2xpc3RDb25maWddPVwibGlzdENvbmZpZ0l0ZW0oKVwiXG4gICAgICAgICAgICAgICAgW2h0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRdPVwiaHR0cFJlcXVlc3REZXRhaWwoKVwiXG4gICAgICAgICAgICAgICAgW2xpc3RLZXlzRGlzYWJsZV09XCJsYW5ndWFnZURpc3BsYXkoKSB8IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0RGlzYWJsZUtleVBpcGU6a2V5XCJcbiAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiJGluZGV4ID09PSAwIHx8IHJlYWRvbmx5KClcIlxuICAgICAgICAgICAgICAgIFtsaXN0S2V5U2VsZWN0ZWRdPVwia2V5XCJcbiAgICAgICAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIid3LVsxNTBweF0nXCJcbiAgICAgICAgICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RDaGFuZ2UoJGV2ZW50LCBrZXkpXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCByZWxhdGl2ZSBwLTAge3sgZXh0ZW5kQ2xhc3NDb250ZW50KCkgfX1cIlxuICAgICAgICAgICAgW2NsYXNzLnctW2NhbGMoMTAwJS0xNTBweCldXT1cIiF0ZXh0QXJlYSgpICYmICFzaW5nbGVMYW5ndWFnZSgpICYmIHZpZXdQb3NpdGlvbigpID09PSAncm93J1wiXG4gICAgICAgICAgICBbY2xhc3Mudy1mdWxsXT1cInRleHRBcmVhKCkgfHwgc2luZ2xlTGFuZ3VhZ2UoKSB8fCB2aWV3UG9zaXRpb24oKSA9PT0gJ2NvbHVtbidcIj5cbiAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZGF0YSgpOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgIEBpZiAoaXRlbS50eXBlICE9PSAnZWRpdG9yJyAmJiAhaXRlbS5pc09uZVZhbHVlIHx8IChpdGVtLmlzT25lVmFsdWUgJiYgJGZpcnN0KSkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSB7eyBpdGVtLmNsYXNzSW5jbHVkZUlucHV0IH19XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy53LWZ1bGxdPVwic2luZ2xlTGFuZ3VhZ2UoKSAmJiAhbXVsdGlMaW5lKCkgfHwgcmVhZG9ubHkoKSB8fCAkZmlyc3RcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnctW2NhbGMoMTAwJS0yOHB4KV1dPVwidGV4dEFyZWEoKSB8fCAoIXNpbmdsZUxhbmd1YWdlKCkgJiYgbXVsdGlMaW5lKCkpXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy53LVtjYWxjKDEwMCUtNDBweCldXT1cIiF0ZXh0QXJlYSgpICYmICFzaW5nbGVMYW5ndWFnZSgpICYmICFtdWx0aUxpbmUoKSAmJiAhcmVhZG9ubHkoKVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Mudy1bY2FsYygxMDAlLTcwcHgpXV09XCIhdGV4dEFyZWEoKSAmJiAhc2luZ2xlTGFuZ3VhZ2UoKSAmJiBtdWx0aUxpbmUoKVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MubXQtWzhweF1dPVwidmlld1Bvc2l0aW9uKCkgPT09ICdjb2x1bW4nXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5tbC1bMTJweF1dPVwiIXNpbmdsZUxhbmd1YWdlKCkgJiYgIXRleHRBcmVhKCkgJiYgdmlld1Bvc2l0aW9uKCkgPT09ICdyb3cnXCI+XG4gICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0ua2V5QmluZERhdGEgfCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldEl0ZW1QaXBlOmRhdGFMYW5ndWFnZUNoYW5nZTsgYXMgaXRlbU1hcCkge1xuICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy12YWxpZCBbZGF0YVR5cGVdPVwiaXRlbS50eXBlID09PSAnbnVtYmVyJyA/ICdpbnQnIDogKGl0ZW0udHlwZSA9PT0gJ3RleHQnID8gJ3N0cmluZycgOiAoaXRlbS50eXBlID09PSAnYmlnaW50JyA/ICdiaWdpbnQnIDogJ2Zsb2F0JykpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbKGl0ZW0pXT1cIml0ZW1NYXBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZE5hbWVCaW5kXT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsQ29uZmlnXT1cImNvdW50Q2hhcmFjdGVycygpID8geyBjbGFzc0luY2x1ZGU6ICdhYnNvbHV0ZSAtdG9wLVsyMHB4XScsIHJlcXVpcmVkOiB0cnVlfSA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RhZ0lucHV0XT1cInRleHRBcmVhKCkgPyAndGV4dGFyZWEnIDogJ2lucHV0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIml0ZW0ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZFJlcXVpcmVkXT1cIigkaW5kZXggPT09IDAgJiYgZGF0YSgpLmxlbmd0aCA8PSAxKSA/IHZhbGlkUmVxdWlyZWREZWZhdWx0KCkgOiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgkaW5kZXggPT09IDAgJiYgZGF0YSgpLmxlbmd0aCA+IDEgJiYgaXRlbS52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpID8gaXRlbS52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQgOiBpdGVtLnZhbGlkUmVxdWlyZWQgPyBpdGVtLnZhbGlkUmVxdWlyZWQgOiAodmFsaWRSZXF1aXJlZCgpIHx8IHsgaXNSZXF1aXJlZDogZmFsc2UgfSlcIlxuICAgICAgICAgICAgICAgICAgICAgIFt1bml0c1JpZ2h0XT1cImN1cnJlbmN5VW5pdHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2tleVNlbGVjdGVkVW5pdFJpZ2h0XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q291bnRdPVwiY291bnRDaGFyYWN0ZXJzKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFttYXhMZW5ndGhdPVwidmFsaWRNYXhMZW5ndGgubGVuZ3RoID8gdmFsaWRNYXhMZW5ndGgubGVuZ3RoIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZml4ZWRGbG9hdF09XCJpdGVtLnR5cGUgPT09ICdiaWdpbnQnID8gNCA6IDE0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRNaW5MZW5ndGhdPVwie2xlbmd0aDogdmFsaWRNaW5MZW5ndGgoKT8ubGVuZ3RoIHx8IC0xLCBtZXNzYWdlOiAnaTE4bl9taW5pbXVtX2xlbmd0aF9udW1iZXInLCBpbnRlcnBvbGF0ZVBhcmFtczoge251bWJlcjogdmFsaWRNaW5MZW5ndGgoKT8ubGVuZ3RofX1cIlxuICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHROZWdhdGl2ZVZhbHVlXT1cImFjY2VwdE5lZ2F0aXZlVmFsdWUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlVXBEb3duTnVtYmVyXT1cInZhbHVlVXBEb3duTnVtYmVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFttYXhWYWx1ZU51bWJlcl09XCJtYXhWYWx1ZU51bWJlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbb25seUFjY2VwdE5lZ2F0aXZlVmFsdWVdPVwib25seUFjY2VwdE5lZ2F0aXZlVmFsdWUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG91dFZhbHVlQ2hhbmdlKT1cImhhbmRsZXJJbnB1dENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVySW5wdXRGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCBrZXkpXCIgLz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKGl0ZW0udHlwZSA9PT0gJ2VkaXRvcicpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1bY2FsYygxMDAlLTI4cHgpXVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtWzI1MHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxtby1saWJzLWNvcmVfdWktY29tcG9uZW50cy1xdWlsbCBbaXRlbV09XCJpdGVtLmtleUJpbmREYXRhID8gZGF0YUxhbmd1YWdlQ2hhbmdlW2l0ZW0ua2V5QmluZERhdGFdIDogZGF0YUxhbmd1YWdlQ2hhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZmllbGROYW1lQmluZF09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZFJlcXVpcmVkXT1cIihpID09PSAwICYmIGNvbmZpZ0RhdGFzLmxlbmd0aCA8PSAxKSA/IHZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdCA6IHZhbGlkUmVxdWlyZWROYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiKGl0ZW0ucGxhY2Vob2xkZXIgfHwgJycgfCB0cmFuc2xhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgIChtb0ZvY3VzKT1cImhhbmRsZXJJbnB1dENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobW9DaGFuZ2UpPVwiaGFuZGxlcklucHV0Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgIChtb0Z1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbEVkaXRvcigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbW8tbGlicy1jb3JlX3VpLWNvbXBvbmVudHMtcXVpbGw+IC0tPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoKCRpbmRleCA+IDAgJiYgZGF0YSgpLmxlbmd0aCA9PT0gMSkgJiYgIWlnbm9yZVJlbW92ZSgpICYmICFyZWFkb25seSgpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLVszMnB4XSBmbGV4IGl0ZW1zLWNlbnRlciBtbC1bMTZweF1cIj5cbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cIididXR0b24tbGluay1jdXN0b20nXCJcbiAgICAgICAgICAgICAgICAgIFtidXR0b25DdXN0b21dPVwie1xuICAgICAgICAgICAgICAgICAgICBjb25maWdTdGVwQ29sb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIzA3MTYzMScsXG4gICAgICAgICAgICAgICAgICAgICAgdGV4dF9ob3ZlcjogJyNlZTJkNDEnLFxuICAgICAgICAgICAgICAgICAgICAgIHRleHRfYWN0aXZlOiAnI2VlMmQ0MScsXG4gICAgICAgICAgICAgICAgICAgICAgdGV4dF9kaXNhYmxlOiAnMDcxNjMxJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByb290Q29sb3I6ICcjMDcxNjMxJ1xuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwie2NvbmZpZzoge2NvbnRlbnQ6ICdpMThuX2RlbGV0ZScsIHpJbmRleDogMTIwNX19XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tcmVtb3ZlJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJ1wiXG4gICAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlclJlbW92ZUxhbmd1YWdlKCRldmVudCwga2V5KVwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmICgkaW5kZXggPT09IDAgJiYgIXNpbmdsZUxhbmd1YWdlKCkgJiYgKG9wdGlvbnMoKS5sZW5ndGggIT09IGxhbmd1YWdlRGlzcGxheSgpLmxlbmd0aCkgJiYgdmlld1R5cGUoKSAhPT0gJ2ludGVnZXInICYmICFyZWFkb25seSgpKSB7XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgW2xhYmVsXT1cIidpMThuX2FkZF9sYW5ndWFnZSdcIlxuICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1hZGQnXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFweC0wIG10LVs4cHhdJ1wiXG4gICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckFkZExhbmd1YWdlKCRldmVudClcIiAvPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmICh2aWV3Q29udGVudCgpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICBAaWYgKHNpbmdsZUxhbmd1YWdlKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiXG4gICAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cInNpbmdsZUxhbmd1YWdlKCkgJiYgISRmaXJzdFwiXG4gICAgICAgICAgICBbY2xhc3MubXQtWzRweF1dPVwiIXNpbmdsZUxhbmd1YWdlKCkgJiYgISRmaXJzdFwiPlxuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NJbmNsdWRlS2V5KClcIlxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImtleSB8IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlRGlzcGxheUxhbmd1YWdlUGlwZTpvcHRpb25zKClcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LVtjYWxjKDEwMCUtMTAwcHgpXVwiXG4gICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJzaW5nbGVMYW5ndWFnZSgpICYmICEkZmlyc3RcIlxuICAgICAgICAgIFtjbGFzcy5mbGV4XT1cIiFzaW5nbGVMYW5ndWFnZSB8fCAkZmlyc3RcIlxuICAgICAgICAgIFtjbGFzcy5tdC1bNHB4XV09XCIhc2luZ2xlTGFuZ3VhZ2UoKSAmJiAhJGZpcnN0XCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNsYXNzSW5jbHVkZVZhbHVlKClcIlxuICAgICAgICAgICAgW2lubmVySFRNTF09XCIoKGRhdGFMYW5ndWFnZUNoYW5nZSgpW2tleV0gfHwgZGF0YUxhbmd1YWdlQ2hhbmdlKClba2V5XSA9PT0gMCkgPyAoZGF0YUxhbmd1YWdlQ2hhbmdlKClba2V5XSArICcnKSA6ICcnKSB8IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGVcIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJ7ekluZGV4OiB6SW5kZXgoKX1cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuICBAaWYgKHZpZXdUeXBlKCkgPT09ICdpbnRlZ2VyJyAmJiAhdGhpcy5pZ25vcmVBZGQoKSAmJiAhcmVhZG9ubHkoKSkge1xuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gdHlwZT1cImJ1dHRvbi1saW5rLXByaW1hcnlcIlxuICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1hZGQgbXItWzhweF0gdGV4dC1bMTBweF0nXCJcbiAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWJzLXVpLWZvbnQtaDVyJ1wiXG4gICAgICBbY2xhc3NJbmNsdWRlXT1cIichcGItMCdcIlxuICAgICAgW2xhYmVsXT1cIidpMThuX2FkZF9jdXJyZW5jeSdcIlxuICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJBZGRMYW5ndWFnZSgkZXZlbnQpXCIgLz5cbiAgfVxuPC9kaXY+XG4iXX0=
364
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pKLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBa0IsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRyxPQUFPLEVBQWlFLG9DQUFvQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkosT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVqRCxPQUFPLEVBQUUsc0RBQXNELEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RyxPQUFPLEVBQUUsb0RBQW9ELEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVB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QUFNLFdBQ3RDO3dCQUNQLGVBQWU7d0JBQ2YsaUNBQWlDO3dCQUNqQyxvQ0FBb0M7d0JBQ3BDLHNDQUFzQzt3QkFDdEMsZ0NBQWdDO3dCQUNoQyxvREFBb0Q7d0JBQ3BELHNEQUFzRDt3QkFDdEQsOENBQThDO3dCQUM5Qyx5QkFBeUI7d0JBQ3pCLG9DQUFvQztxQkFDckMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbnB1dCwgbW9kZWwsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSUlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2xFdmVudCwgSVZhbGlkTGVuZ3RoLCBJVmFsaWRSZXF1aXJlZCwgTGlic1VpQ29tcG9uZW50c0lucHV0c1ZhbGlkQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtdmFsaWQnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBnZXQsIGlzTmlsIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJQ3VycmVuY3lVbml0LCBJRGF0YUl0ZW0sIElEYXRhTXVsdGlMYW5ndWFnZSwgSUV2ZW50TXVsdGlMYW5ndWFnZSwgSUlucHV0TXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJT3B0aW9uLCBUWVBFX1ZJRVdfTVVMVElfTEFOR1VBR0UgfSBmcm9tICcuL2ludGVyZmFjZXMvbXVsdGktbGFuZ3VhZ2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlRGlzcGxheUxhbmd1YWdlUGlwZSB9IGZyb20gJy4vcGlwZXMvZGlzcGxheS1sYW5ndWFnZS5waXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0RGlzYWJsZUtleVBpcGUgfSBmcm9tICcuL3BpcGVzL2dldC1kaXNhYmxlLWtleS5waXBlJztcbmltcG9ydCB7IGN1cnJlbmNpZXNPcHRpb25zLCBjdXJyZW5jaWVzU3VwcG9ydCwgaHR0cFJlcXVlc3REZXRhaWwsIGxhbmdPcHRpb25zLCBsYW5ndWFnZVN1cHBvcnQsIGxpc3RDb25maWdJdGVtLCB2YWxpZFJlcXVpcmVkIH0gZnJvbSAnLi91dGlscy9tdWx0aS1sYW5ndWFnZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldEl0ZW1QaXBlIH0gZnJvbSAnLi9waXBlcy9nZXQtaXRlbS5waXBlJztcbmltcG9ydCB7IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1lc2NhcGUtaHRtbCc7XG5pbXBvcnQgeyBJUXVpbGxGdW5jdGlvbkNvbnRyb2xFdmVudCwgTGlic1VpQ29tcG9uZW50c0lucHV0c1F1aWxsQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtcXVpbGwnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLW11bHRpX2xhbmd1YWdlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpLWxhbmd1YWdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNWYWxpZENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldERpc2FibGVLZXlQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlRGlzcGxheUxhbmd1YWdlUGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldEl0ZW1QaXBlLFxuICAgIExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c1F1aWxsQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgLyogUFJPUEVSVFkgKi9cbiAgcHJvdGVjdGVkIGxhbmd1YWdlRGlzcGxheSA9IHNpZ25hbDxBcnJheTxzdHJpbmc+PihbXSk7XG4gIHByb3RlY3RlZCBkYXRhTGFuZ3VhZ2VDaGFuZ2UgPSBzaWduYWw8SURhdGFNdWx0aUxhbmd1YWdlPih7fSk7XG4gIHByb3RlY3RlZCBsYW5nRGVmYXVsdCA9IHNpZ25hbDxBcnJheTxzdHJpbmc+PihsYW5ndWFnZVN1cHBvcnQoKSk7XG4gIHByb3RlY3RlZCBjdXJyZW5jeVVuaXRzID0gc2lnbmFsPEFycmF5PElDdXJyZW5jeVVuaXQ+PihbXSk7XG4gIHByb3RlY3RlZCBvcHRpb25zID0gc2lnbmFsPEFycmF5PElPcHRpb24+PihsYW5nT3B0aW9ucygpKTtcbiAgcHJvdGVjdGVkIHZhbGlkUmVxdWlyZWREZWZhdWx0ID0gc2lnbmFsPElWYWxpZFJlcXVpcmVkPih2YWxpZFJlcXVpcmVkKCkpO1xuICBwcm90ZWN0ZWQgbGlzdENvbmZpZ0l0ZW0gPSBjb21wdXRlZCgoKSA9PiBsaXN0Q29uZmlnSXRlbSh0aGlzLm9wdGlvbnMoKSkpO1xuICBwcm90ZWN0ZWQgaHR0cFJlcXVlc3REZXRhaWwgPSBjb21wdXRlZCgoKSA9PiBodHRwUmVxdWVzdERldGFpbCh0aGlzLm9wdGlvbnMoKSkpO1xuXG4gIHByaXZhdGUgaW5wdXRGdW5jdGlvbkNvbnRyb2wgPSBzaWduYWw8TWFwPHN0cmluZywgSUlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2xFdmVudD4+KG5ldyBNYXAoKSk7XG4gIHByaXZhdGUgcXVpbGxGdW5jdGlvbkNvbnRyb2wgPSBzaWduYWw8QXJyYXk8SVF1aWxsRnVuY3Rpb25Db250cm9sRXZlbnQ+PihbXSk7XG4gIHByaXZhdGUgb25EZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKiBJTlBVVCAqL1xuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IHZpZXdUeXBlID0gaW5wdXQ8VFlQRV9WSUVXX01VTFRJX0xBTkdVQUdFLCBUWVBFX1ZJRVdfTVVMVElfTEFOR1VBR0UgfCB1bmRlZmluZWQ+KCd0ZXh0JywgeyB0cmFuc2Zvcm06IHZhbHVlID0+IHZhbHVlID8/ICd0ZXh0JyB9KTtcbiAgcmVhZG9ubHkgc2luZ2xlTGFuZ3VhZ2UgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBkYXRhID0gbW9kZWw8QXJyYXk8SURhdGFJdGVtPj4oW10pO1xuICByZWFkb25seSB2YWxpZFJlcXVpcmVkID0gaW5wdXQ8SVZhbGlkUmVxdWlyZWQsIElWYWxpZFJlcXVpcmVkIHwgdW5kZWZpbmVkPih2YWxpZFJlcXVpcmVkKCksIHsgdHJhbnNmb3JtOiB2YWx1ZSA9PiB2YWx1ZSA/PyB2YWxpZFJlcXVpcmVkKCkgfSlcbiAgcmVhZG9ubHkgaWdub3JlQWRkID0gbW9kZWw8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdGl0bGVGaWVsZCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkga2V5SGVhZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSB0ZXh0QXJlYSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBleHRlbmRDbGFzcyA9IG1vZGVsPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZXh0ZW5kQ2xhc3NDb250ZW50ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSB2aWV3UG9zaXRpb24gPSBpbnB1dDwncm93JyB8ICdjb2x1bW4nPigncm93Jyk7XG4gIHJlYWRvbmx5IGlnbm9yZVJlbW92ZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHZhbGlkTWF4TGVuZ3RoID0gaW5wdXQ8SVZhbGlkTGVuZ3RoLCBJVmFsaWRMZW5ndGggfCB1bmRlZmluZWQ+KHsgbGVuZ3RoOiAwIH0sIHsgdHJhbnNmb3JtOiB2YWx1ZSA9PiB2YWx1ZSA/PyB7IGxlbmd0aDogMCB9IH0pO1xuICByZWFkb25seSB2YWxpZE1pbkxlbmd0aCA9IGlucHV0PElWYWxpZExlbmd0aD4oKTtcbiAgcmVhZG9ubHkgY291bnRDaGFyYWN0ZXJzID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdmlld0NvbnRlbnQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVLZXkgPSBpbnB1dDxzdHJpbmc+KCdsaWJzLXVpLWZvbnQtaDRyJyk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZVZhbHVlID0gaW5wdXQ8c3RyaW5nPignbGlicy11aS1mb250LWg0cycpO1xuICByZWFkb25seSBkYXRhTGFuZ3VhZ2UgPSBtb2RlbDxJRGF0YU11bHRpTGFuZ3VhZ2U+KHt9KTtcbiAgcmVhZG9ubHkgbXVsdGlMaW5lID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgcmVhZG9ubHkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBhY2NlcHROZWdhdGl2ZVZhbHVlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdmFsdWVVcERvd25OdW1iZXIgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG1heFZhbHVlTnVtYmVyID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBvbmx5QWNjZXB0TmVnYXRpdmVWYWx1ZSA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgLyogT1VUUFVUICovXG4gIHJlYWRvbmx5IG91dEV2ZW50TXVsdGlMYW5ndWFnZSA9IG91dHB1dDxJRXZlbnRNdWx0aUxhbmd1YWdlPigpO1xuICByZWFkb25seSBvdXRDaGFuZ2VUeXBlTGFuZ3VhZ2UgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJSW5wdXRNdWx0aUxhbmd1YWdlRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dENoYW5nZVZhbHVlSW5wdXQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3Qgdmlld1R5cGUgPSB0aGlzLnZpZXdUeXBlKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBpZiAodmlld1R5cGUgPT09ICdpbnRlZ2VyJykge1xuICAgICAgICAgIHRoaXMubGFuZ0RlZmF1bHQuc2V0KGN1cnJlbmNpZXNTdXBwb3J0KCkpO1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5zZXQoY3VycmVuY2llc09wdGlvbnMoKSk7XG4gICAgICAgICAgdGhpcy5vcHRpb25zKCkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVuY3lVbml0cygpLnB1c2goe1xuICAgICAgICAgICAgICBsYWJlbDogaXRlbS5sYWJlbCxcbiAgICAgICAgICAgICAgaWQ6IGl0ZW0ua2V5LFxuICAgICAgICAgICAgICB0eXBlOiBpdGVtLmxhYmVsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmN1cnJlbmN5VW5pdHMudXBkYXRlKHZhbHVlID0+IFsuLi52YWx1ZV0pO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YUxhbmd1YWdlID0gdGhpcy5kYXRhTGFuZ3VhZ2UoKTtcbiAgICAgICAgdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2Uuc2V0KGNsb25lRGVlcChkYXRhTGFuZ3VhZ2UpKTtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZURhdGEoKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc1NlbGVjdGVkOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucygpLmZpbmQoaXRlbSA9PiBpdGVtLmtleSA9PT0ga2V5KSkge1xuICAgICAgICAgICAgb3B0aW9uc1NlbGVjdGVkLmFkZChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmxhbmdEZWZhdWx0KCkubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5sYW5nRGVmYXVsdCgpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc05pbChnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGtleSkpKSB7XG4gICAgICAgICAgICAgIG9wdGlvbnNTZWxlY3RlZC5hZGQoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhbmd1YWdlRGlzcGxheS5zZXQoQXJyYXkuZnJvbShvcHRpb25zU2VsZWN0ZWQpKTtcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBzaW5nbGVMYW5ndWFnZSA9IHRoaXMuc2luZ2xlTGFuZ3VhZ2UoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMub3V0Q2hhbmdlVHlwZUxhbmd1YWdlLmVtaXQodHJ1ZSk7XG4gICAgICAgIGlmICghc2luZ2xlTGFuZ3VhZ2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgICAgICB0aGlzLmRhdGFMYW5ndWFnZS51cGRhdGUodmFsdWUgPT4gKHsgLi4udmFsdWUsIFtrZXldOiBnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGtleSkgfSkpO1xuICAgICAgfSlcbiAgICB9KVxuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkUmVxdWlyZWQgPSB0aGlzLnZhbGlkUmVxdWlyZWQoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmICghdmFsaWRSZXF1aXJlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkUmVxdWlyZWREZWZhdWx0LnVwZGF0ZSh2YWx1ZSA9PiAoeyAuLi52YWx1ZSwgaXNSZXF1aXJlZDogdmFsaWRSZXF1aXJlZC5pc1JlcXVpcmVkIH0pKVxuICAgICAgICBpZiAoIXZhbGlkUmVxdWlyZWQuaXNSZXF1aXJlZCkge1xuICAgICAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoe1xuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLnZhbGlkYXRlLmJpbmQodGhpcyksXG4gICAgICBnZXREYXRhOiB0aGlzLmdldERhdGEuYmluZCh0aGlzKVxuICAgIH0pO1xuICAgIHRoaXMuZXh0ZW5kQ2xhc3MudXBkYXRlKHZhbHVlID0+IGAke3ZhbHVlIHx8ICcnfSAke3RoaXMudmlld1Bvc2l0aW9uKCkgPT09ICdyb3cnID8gJ2ZsZXgtcm93JyA6ICdmbGV4LWNvbCd9YCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlcklucHV0RnVuY3Rpb25Db250cm9sKGV2ZW50OiBJSW5wdXRWYWxpZEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBrZXk6IHN0cmluZykge1xuICAgIHRoaXMuaW5wdXRGdW5jdGlvbkNvbnRyb2woKS5zZXQoa2V5LCBldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclF1aWxsRnVuY3Rpb25Db250cm9sKGV2ZW50OiBJUXVpbGxGdW5jdGlvbkNvbnRyb2xFdmVudCwpIHtcbiAgICB0aGlzLnF1aWxsRnVuY3Rpb25Db250cm9sLnVwZGF0ZShpdGVtcyA9PiBbLi4uaXRlbXMsIGV2ZW50XSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlbGVjdENoYW5nZShldmVudDogSUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQsIGtleU9sZDogc3RyaW5nKSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5rZXkgPT09IGtleU9sZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxhbmd1YWdlRGlzcGxheS51cGRhdGUodmFsdWUgPT4gdmFsdWUubWFwKGl0ZW0gPT4gaXRlbSA9PT0ga2V5T2xkID8gZXZlbnQua2V5IGFzIHN0cmluZyA6IGl0ZW0pKVxuICAgIGRlbGV0ZSB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpW2tleU9sZF07XG4gICAgZGVsZXRlIHRoaXMuZGF0YUxhbmd1YWdlKClba2V5T2xkXTtcbiAgICB0aGlzLnNldERlZmF1bHREYXRhKGV2ZW50LmtleSBhcyBzdHJpbmcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJBZGRMYW5ndWFnZShldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBsYW5nID0gdGhpcy5vcHRpb25zKCkuZmluZChpdGVtID0+ICF0aGlzLmxhbmd1YWdlRGlzcGxheSgpLmluY2x1ZGVzKGl0ZW0ua2V5KSk7XG4gICAgaWYgKCFsYW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubGFuZ3VhZ2VEaXNwbGF5LnVwZGF0ZSh2YWx1ZSA9PiBbLi4udmFsdWUsIGxhbmcua2V5XSk7XG4gICAgdGhpcy5zZXREZWZhdWx0RGF0YShsYW5nLmtleSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucygpLmxlbmd0aCA9PT0gdGhpcy5sYW5ndWFnZURpc3BsYXkoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaWdub3JlQWRkLnNldCh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5vdXRFdmVudE11bHRpTGFuZ3VhZ2UuZW1pdCh7IGFjdGlvbjogJ2FkZCcsIGRhdGE6IHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclJlbW92ZUxhbmd1YWdlKGV2ZW50OiBFdmVudCwga2V5OiBzdHJpbmcpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlnbm9yZUFkZC5zZXQodHJ1ZSk7XG4gICAgdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UudXBkYXRlKHZhbHVlID0+IHtcbiAgICAgIGRlbGV0ZSB2YWx1ZVtrZXldO1xuICAgICAgcmV0dXJuIHsgLi4udmFsdWUgfTtcbiAgICB9KVxuICAgIHRoaXMudmFsaWRhdGVJc011bHRpS2V5KCk7XG4gICAgdGhpcy5sYW5ndWFnZURpc3BsYXkudXBkYXRlKHZhbHVlID0+IHZhbHVlLmZpbHRlcihpdGVtID0+IGl0ZW0gIT09IGtleSkpO1xuICAgIHRoaXMub3V0RXZlbnRNdWx0aUxhbmd1YWdlLmVtaXQoeyBhY3Rpb246ICdyZW1vdmUnLCBkYXRhOiB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpIH0pO1xuICAgIHRoaXMuaW5wdXRGdW5jdGlvbkNvbnRyb2woKS5kZWxldGUoa2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0RGF0YSgpIHtcbiAgICBpZiAodGhpcy5zaW5nbGVMYW5ndWFnZSgpKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmxhbmdEZWZhdWx0KClbMF07XG4gICAgICB0aGlzLmRhdGFMYW5ndWFnZS51cGRhdGUodmFsdWUgPT4gKHsgLi4udmFsdWUsIFtrZXldOiBnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGtleSkgfSkpO1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YUxhbmd1YWdlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEoKS5sZW5ndGggPiAxKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5kYXRhKCkpIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IHRoaXMubGFuZ0RlZmF1bHQoKVswXTtcbiAgICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXlCaW5kRGF0YTtcbiAgICAgICAgY29uc3QgZGF0YUJ5S2V5ID0ga2V5ID8gZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXkpIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoa2V5ICYmIGRhdGFCeUtleSAmJiBsYW5nICYmICFnZXQoZGF0YUJ5S2V5LCBsYW5nKSAmJiAhZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBsYW5nKSkge1xuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZURhdGEoKSB7XG4gICAgY29uc3QgbGFuZyA9IHRoaXMubGFuZ0RlZmF1bHQoKVswXTtcbiAgICBpZiAodGhpcy5kYXRhKCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLmRhdGEoKS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBpdGVtLmtleUJpbmREYXRhO1xuICAgICAgICBpZiAoIWluZGV4ICYmIGlzTmlsKGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwgbGFuZykpKSB7XG4gICAgICAgICAgdGhpcy5zZXREZWZhdWx0RGF0YShsYW5nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFrZXkgfHwgIWlzTmlsKGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwga2V5KSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UudXBkYXRlKHZhbHVlID0+ICh7IC4uLnZhbHVlLCBba2V5XTogeyBbbGFuZ106ICcnIH0gfSkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5kYXRhKCkubGVuZ3RoKSB7XG4gICAgICBpZiAoIXRoaXMuZGF0YUxhbmd1YWdlKCkgfHwgIU9iamVjdC5rZXlzKHRoaXMuZGF0YUxhbmd1YWdlKCkpLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNldERlZmF1bHREYXRhKGxhbmcpO1xuICAgICAgfVxuICAgICAgdGhpcy5kYXRhLnNldChbe1xuICAgICAgICB0eXBlOiB0aGlzLnZpZXdUeXBlKCksXG4gICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnBsYWNlaG9sZGVyKCksXG4gICAgICAgIGlzT25lVmFsdWU6IGZhbHNlLFxuICAgICAgICBrZXlCaW5kRGF0YTogJydcbiAgICAgIH1dKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldERlZmF1bHREYXRhKGtleTogc3RyaW5nKSB7XG4gICAgdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UudXBkYXRlKHZhbHVlID0+ICh7IC4uLnZhbHVlLCBba2V5XTogJycgfSkpO1xuICAgIHRoaXMuZGF0YUxhbmd1YWdlLnVwZGF0ZSh2YWx1ZSA9PiAoeyAuLi52YWx1ZSwgW2tleV06ICcnIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGUoKSB7XG4gICAgbGV0IHZhbGlkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5pbnB1dEZ1bmN0aW9uQ29udHJvbCgpLnZhbHVlcygpKSB7XG4gICAgICBpZiAoIShhd2FpdCBjb250cm9sLmNoZWNrSXNWYWxpZCgpKSkge1xuICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5xdWlsbEZ1bmN0aW9uQ29udHJvbCgpKSB7XG4gICAgICBpZiAoIShhd2FpdCBjb250cm9sLmNoZWNrSXNWYWxpZCgpKSkge1xuICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zaW5nbGVMYW5ndWFnZSgpKSB7XG4gICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEoKS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVEZWZhdWx0KCk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVJc011bHRpS2V5KCk7XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZURlZmF1bHQoKSB7XG4gICAgbGV0IHZhbGlkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy52YWxpZFJlcXVpcmVkKCkuaXNSZXF1aXJlZCkge1xuICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUodmFsdWUgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IHRydWUgfSkpO1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUodmFsdWUgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IGZhbHNlIH0pKTtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkpKSB7XG4gICAgICBpZiAoa2V5ICE9PSAnaWQnICYmIGtleSAhPT0gdGhpcy5rZXlIZWFkZXIoKSAmJiBnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGtleSkgJiYga2V5ICE9PSB0aGlzLmxhbmdEZWZhdWx0KClbMF0pIHtcbiAgICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUodmFsdWUgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IHRydWUgfSkpO1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpKSkge1xuICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUodmFsdWUgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IGZhbHNlIH0pKTtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWxpZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tWYWxpZElucHV0KCkge1xuICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuaW5wdXRGdW5jdGlvbkNvbnRyb2woKS52YWx1ZXMoKSkge1xuICAgICAgaWYgKCEoYXdhaXQgY29udHJvbC5jaGVja0lzVmFsaWQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUlzTXVsdGlLZXkoKSB7XG4gICAgaWYgKHRoaXMuZGF0YSgpLmxlbmd0aCA+IDEpIHtcbiAgICAgIGlmICh0aGlzLmRhdGEoKVswXS52YWxpZFJlcXVpcmVkPy5pc1JlcXVpcmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YSgpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKCFpdGVtLmtleUJpbmREYXRhKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5rZXlzKGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwgaXRlbS5rZXlCaW5kRGF0YSkpLmZvckVhY2goYXN5bmMgKGtleUJpbmQpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpKSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gaXRlbS5rZXlCaW5kRGF0YSB8fCBrZXkgPT09IGtleUJpbmQpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXkpICYmIHRoaXMub3B0aW9ucygpLmZpbmQoaXRlbSA9PiBpdGVtLmtleSA9PT0ga2V5KSkge1xuICAgICAgICAgICAgICB0aGlzLmRhdGEoKS5mb3JFYWNoKGFzeW5jIChjb25maWcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbmZpZy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQuaXNSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGF0YSgpLmZvckVhY2goYXN5bmMgKGNvbmZpZykgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBjb25maWcudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0LmlzUmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kID0gZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXlCaW5kKTtcbiAgICAgICAgICBjb25zdCBkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmREYXRhID0gaXRlbS5rZXlCaW5kRGF0YSA/IGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwgaXRlbS5rZXlCaW5kRGF0YSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKCghZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kICYmICFnZXQoZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kRGF0YSwga2V5QmluZCkpIHx8IChkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmQgJiYgZ2V0KGRhdGFMYW5ndWFnZUNoYW5nZUJ5S2V5QmluZERhdGEsIGtleUJpbmQpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWRhdGFMYW5ndWFnZUNoYW5nZUJ5S2V5QmluZCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YUZpcnN0ID0gdGhpcy5kYXRhKClbMF07XG4gICAgICAgICAgICBpZiAoZGF0YUZpcnN0ICYmIGRhdGFGaXJzdC52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgZGF0YUZpcnN0LnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdC5pc1JlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFnZXQoZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kRGF0YSwga2V5QmluZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTZWNvbmQgPSB0aGlzLmRhdGEoKVsxXTtcbiAgICAgICAgICAgIGlmIChkYXRhU2Vjb25kICYmIGRhdGFTZWNvbmQudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0KSB7XG4gICAgICAgICAgICAgIGRhdGFTZWNvbmQudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0LmlzUmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlcklucHV0Q2hhbmdlKCkge1xuICAgIHRoaXMub3V0Q2hhbmdlVmFsdWVJbnB1dC5lbWl0KCk7XG4gICAgdGltZXIoNTAwKS5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnZhbGlkYXRlKCkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5vbkRlc3Ryb3kubmV4dCgpO1xuICAgIHRoaXMub25EZXN0cm95LmNvbXBsZXRlKCk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICBAaWYgKHRpdGxlRmllbGQoKTsgYXMgdGl0bGVGaWVsZCkge1xuICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDZtIG1iLVs0cHhdXCI+IHt7IHRpdGxlRmllbGQgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgfVxuICBAZm9yIChrZXkgb2YgbGFuZ3VhZ2VEaXNwbGF5KCk7IHRyYWNrIGtleSkge1xuICAgIEBpZiAoIXZpZXdDb250ZW50KCkpIHtcbiAgICAgIDxkaXYgW2NsYXNzLm10LVs0cHhdXT1cIiEkZmlyc3RcIlxuICAgICAgICBbY2xhc3MuaGlkZGVuXT1cInNpbmdsZUxhbmd1YWdlKCkgJiYgISRmaXJzdFwiXG4gICAgICAgIFtjbGFzcy5tdC1bOHB4XV09XCJjb3VudENoYXJhY3RlcnMoKSAmJiAhJGZpcnN0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHt7IGV4dGVuZENsYXNzKCkgfX1cIj5cbiAgICAgICAgICBAaWYgKCFzaW5nbGVMYW5ndWFnZSgpKSB7XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duIFtsaXN0Q29uZmlnXT1cImxpc3RDb25maWdJdGVtKClcIlxuICAgICAgICAgICAgICAgIFtodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkXT1cImh0dHBSZXF1ZXN0RGV0YWlsKClcIlxuICAgICAgICAgICAgICAgIFtsaXN0S2V5c0Rpc2FibGVdPVwibGFuZ3VhZ2VEaXNwbGF5KCkgfCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldERpc2FibGVLZXlQaXBlOmtleVwiXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIiRpbmRleCA9PT0gMCB8fCByZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICBbbGlzdEtleVNlbGVjdGVkXT1cImtleVwiXG4gICAgICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCIndy1bMTUwcHhdJ1wiXG4gICAgICAgICAgICAgICAgW2xpc3RIYXNCdXR0b25VblNlbGVjdE9wdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0Q2hhbmdlKCRldmVudCwga2V5KVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggcmVsYXRpdmUgcC0wIHt7IGV4dGVuZENsYXNzQ29udGVudCgpIH19XCJcbiAgICAgICAgICAgIFtjbGFzcy53LVtjYWxjKDEwMCUtMTUwcHgpXV09XCIhdGV4dEFyZWEoKSAmJiAhc2luZ2xlTGFuZ3VhZ2UoKSAmJiB2aWV3UG9zaXRpb24oKSA9PT0gJ3JvdydcIlxuICAgICAgICAgICAgW2NsYXNzLnctZnVsbF09XCJ0ZXh0QXJlYSgpIHx8IHNpbmdsZUxhbmd1YWdlKCkgfHwgdmlld1Bvc2l0aW9uKCkgPT09ICdjb2x1bW4nXCI+XG4gICAgICAgICAgICBAZm9yIChpdGVtIG9mIGRhdGEoKTsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgICBAaWYgKGl0ZW0udHlwZSAhPT0gJ2VkaXRvcicgJiYgIWl0ZW0uaXNPbmVWYWx1ZSB8fCAoaXRlbS5pc09uZVZhbHVlICYmICRmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUge3sgaXRlbS5jbGFzc0luY2x1ZGVJbnB1dCB9fVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Mudy1mdWxsXT1cInNpbmdsZUxhbmd1YWdlKCkgJiYgIW11bHRpTGluZSgpIHx8IHJlYWRvbmx5KCkgfHwgJGZpcnN0XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy53LVtjYWxjKDEwMCUtMjhweCldXT1cInRleHRBcmVhKCkgfHwgKCFzaW5nbGVMYW5ndWFnZSgpICYmIG11bHRpTGluZSgpKVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Mudy1bY2FsYygxMDAlLTQwcHgpXV09XCIhdGV4dEFyZWEoKSAmJiAhc2luZ2xlTGFuZ3VhZ2UoKSAmJiAhbXVsdGlMaW5lKCkgJiYgIXJlYWRvbmx5KClcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnctW2NhbGMoMTAwJS03MHB4KV1dPVwiIXRleHRBcmVhKCkgJiYgIXNpbmdsZUxhbmd1YWdlKCkgJiYgbXVsdGlMaW5lKClcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLm10LVs4cHhdXT1cInZpZXdQb3NpdGlvbigpID09PSAnY29sdW1uJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MubWwtWzEycHhdXT1cIiFzaW5nbGVMYW5ndWFnZSgpICYmICF0ZXh0QXJlYSgpICYmIHZpZXdQb3NpdGlvbigpID09PSAncm93J1wiPlxuICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmtleUJpbmREYXRhIHwgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXRJdGVtUGlwZTpkYXRhTGFuZ3VhZ2VDaGFuZ2U7IGFzIGl0ZW1NYXApIHtcbiAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtdmFsaWQgW2RhdGFUeXBlXT1cIml0ZW0udHlwZSA9PT0gJ251bWJlcicgPyAnaW50JyA6IChpdGVtLnR5cGUgPT09ICd0ZXh0JyA/ICdzdHJpbmcnIDogKGl0ZW0udHlwZSA9PT0gJ2JpZ2ludCcgPyAnYmlnaW50JyA6ICdmbG9hdCcpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgWyhpdGVtKV09XCJpdGVtTWFwXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZmllbGROYW1lQmluZF09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbENvbmZpZ109XCJjb3VudENoYXJhY3RlcnMoKSA/IHsgY2xhc3NJbmNsdWRlOiAnYWJzb2x1dGUgLXRvcC1bMjBweF0nLCByZXF1aXJlZDogdHJ1ZX0gOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0YWdJbnB1dF09XCJ0ZXh0QXJlYSgpID8gJ3RleHRhcmVhJyA6ICdpbnB1dCdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCIoaXRlbS5wbGFjZWhvbGRlciB8fCAnJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZFJlcXVpcmVkXT1cIigkaW5kZXggPT09IDAgJiYgZGF0YSgpLmxlbmd0aCA8PSAxKSA/IHZhbGlkUmVxdWlyZWREZWZhdWx0KCkgOiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgkaW5kZXggPT09IDAgJiYgZGF0YSgpLmxlbmd0aCA+IDEgJiYgaXRlbS52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpID8gaXRlbS52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQgOiBpdGVtLnZhbGlkUmVxdWlyZWQgPyBpdGVtLnZhbGlkUmVxdWlyZWQgOiAodmFsaWRSZXF1aXJlZCgpIHx8IHsgaXNSZXF1aXJlZDogZmFsc2UgfSlcIlxuICAgICAgICAgICAgICAgICAgICAgIFt1bml0c1JpZ2h0XT1cImN1cnJlbmN5VW5pdHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2tleVNlbGVjdGVkVW5pdFJpZ2h0XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q291bnRdPVwiY291bnRDaGFyYWN0ZXJzKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFttYXhMZW5ndGhdPVwidmFsaWRNYXhMZW5ndGgubGVuZ3RoID8gdmFsaWRNYXhMZW5ndGgubGVuZ3RoIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZml4ZWRGbG9hdF09XCJpdGVtLnR5cGUgPT09ICdiaWdpbnQnID8gNCA6IDE0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRNaW5MZW5ndGhdPVwie2xlbmd0aDogdmFsaWRNaW5MZW5ndGgoKT8ubGVuZ3RoIHx8IC0xLCBtZXNzYWdlOiAnaTE4bl9taW5pbXVtX2xlbmd0aF9udW1iZXInLCBpbnRlcnBvbGF0ZVBhcmFtczoge251bWJlcjogdmFsaWRNaW5MZW5ndGgoKT8ubGVuZ3RofX1cIlxuICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHROZWdhdGl2ZVZhbHVlXT1cImFjY2VwdE5lZ2F0aXZlVmFsdWUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlVXBEb3duTnVtYmVyXT1cInZhbHVlVXBEb3duTnVtYmVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFttYXhWYWx1ZU51bWJlcl09XCJtYXhWYWx1ZU51bWJlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbb25seUFjY2VwdE5lZ2F0aXZlVmFsdWVdPVwib25seUFjY2VwdE5lZ2F0aXZlVmFsdWUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG91dFZhbHVlQ2hhbmdlKT1cImhhbmRsZXJJbnB1dENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVySW5wdXRGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCBrZXkpXCIgLz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKGl0ZW0udHlwZSA9PT0gJ2VkaXRvcicpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1bY2FsYygxMDAlLTI4cHgpXVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtWzI1MHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0ua2V5QmluZERhdGEgfCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldEl0ZW1QaXBlOmRhdGFMYW5ndWFnZUNoYW5nZTsgYXMgaXRlbU1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXF1aWxsIFsoaXRlbSldPVwiaXRlbU1hcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGROYW1lQmluZF09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkUmVxdWlyZWRdPVwiKCRpbmRleCA9PT0gMCAmJiBkYXRhKCkubGVuZ3RoIDw9IDEpID8gdmFsaWRSZXF1aXJlZERlZmF1bHQoKSA6IHZhbGlkUmVxdWlyZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiKGl0ZW0ucGxhY2Vob2xkZXIgfHwgJycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRGb2N1cyk9XCJoYW5kbGVySW5wdXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJJbnB1dENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJRdWlsbEZ1bmN0aW9uQ29udHJvbCgkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoKCRpbmRleCA+IDAgJiYgZGF0YSgpLmxlbmd0aCA9PT0gMSkgJiYgIWlnbm9yZVJlbW92ZSgpICYmICFyZWFkb25seSgpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLVszMnB4XSBmbGV4IGl0ZW1zLWNlbnRlciBtbC1bMTZweF1cIj5cbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cIididXR0b24tbGluay1jdXN0b20nXCJcbiAgICAgICAgICAgICAgICAgIFtidXR0b25DdXN0b21dPVwie1xuICAgICAgICAgICAgICAgICAgICBjb25maWdTdGVwQ29sb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIzA3MTYzMScsXG4gICAgICAgICAgICAgICAgICAgICAgdGV4dF9ob3ZlcjogJyNlZTJkNDEnLFxuICAgICAgICAgICAgICAgICAgICAgIHRleHRfYWN0aXZlOiAnI2VlMmQ0MScsXG4gICAgICAgICAgICAgICAgICAgICAgdGV4dF9kaXNhYmxlOiAnMDcxNjMxJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByb290Q29sb3I6ICcjMDcxNjMxJ1xuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwie2NvbmZpZzoge2NvbnRlbnQ6ICdpMThuX2RlbGV0ZScsIHpJbmRleDogMTIwNX19XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tcmVtb3ZlJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJ1wiXG4gICAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlclJlbW92ZUxhbmd1YWdlKCRldmVudCwga2V5KVwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmICgkaW5kZXggPT09IDAgJiYgIXNpbmdsZUxhbmd1YWdlKCkgJiYgKG9wdGlvbnMoKS5sZW5ndGggIT09IGxhbmd1YWdlRGlzcGxheSgpLmxlbmd0aCkgJiYgdmlld1R5cGUoKSAhPT0gJ2ludGVnZXInICYmICFyZWFkb25seSgpKSB7XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgW2xhYmVsXT1cIidpMThuX2FkZF9sYW5ndWFnZSdcIlxuICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1hZGQnXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFweC0wIG10LVs4cHhdJ1wiXG4gICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckFkZExhbmd1YWdlKCRldmVudClcIiAvPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmICh2aWV3Q29udGVudCgpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICBAaWYgKHNpbmdsZUxhbmd1YWdlKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiXG4gICAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cInNpbmdsZUxhbmd1YWdlKCkgJiYgISRmaXJzdFwiXG4gICAgICAgICAgICBbY2xhc3MubXQtWzRweF1dPVwiIXNpbmdsZUxhbmd1YWdlKCkgJiYgISRmaXJzdFwiPlxuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NJbmNsdWRlS2V5KClcIlxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImtleSB8IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlRGlzcGxheUxhbmd1YWdlUGlwZTpvcHRpb25zKClcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LVtjYWxjKDEwMCUtMTAwcHgpXVwiXG4gICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJzaW5nbGVMYW5ndWFnZSgpICYmICEkZmlyc3RcIlxuICAgICAgICAgIFtjbGFzcy5mbGV4XT1cIiFzaW5nbGVMYW5ndWFnZSB8fCAkZmlyc3RcIlxuICAgICAgICAgIFtjbGFzcy5tdC1bNHB4XV09XCIhc2luZ2xlTGFuZ3VhZ2UoKSAmJiAhJGZpcnN0XCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNsYXNzSW5jbHVkZVZhbHVlKClcIlxuICAgICAgICAgICAgW2lubmVySFRNTF09XCIoKGRhdGFMYW5ndWFnZUNoYW5nZSgpW2tleV0gfHwgZGF0YUxhbmd1YWdlQ2hhbmdlKClba2V5XSA9PT0gMCkgPyAoZGF0YUxhbmd1YWdlQ2hhbmdlKClba2V5XSArICcnKSA6ICcnKSB8IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGVcIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJ7ekluZGV4OiB6SW5kZXgoKX1cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuICBAaWYgKHZpZXdUeXBlKCkgPT09ICdpbnRlZ2VyJyAmJiAhdGhpcy5pZ25vcmVBZGQoKSAmJiAhcmVhZG9ubHkoKSkge1xuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gdHlwZT1cImJ1dHRvbi1saW5rLXByaW1hcnlcIlxuICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1hZGQgbXItWzhweF0gdGV4dC1bMTBweF0nXCJcbiAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWJzLXVpLWZvbnQtaDVyJ1wiXG4gICAgICBbY2xhc3NJbmNsdWRlXT1cIichcGItMCdcIlxuICAgICAgW2xhYmVsXT1cIidpMThuX2FkZF9jdXJyZW5jeSdcIlxuICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJBZGRMYW5ndWFnZSgkZXZlbnQpXCIgLz5cbiAgfVxuPC9kaXY+XG4iXX0=