@libs-ui/components-inputs-valid 0.2.356-4 → 0.2.356-40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -73,7 +73,7 @@ export class YourComponent {}
73
73
  | `autoAddZeroLessThan10InTypeInt` | `boolean` | `undefined` | Tự động thêm số 0 nếu giá trị < 10 (cho kiểu int). |
74
74
  | `autoRemoveEmoji` | `boolean` | `undefined` | Tự động loại bỏ emoji khi nhập. |
75
75
  | `backgroundNone` | `boolean` | `undefined` | Loại bỏ màu nền input. |
76
- | `borderError` | `boolean` | `undefined` | Hiển thị viền đỏ khi lỗi. |
76
+ | `borderError` | `boolean` | `undefined` | Luôn hiển thị border đỏ bất kể trạng thái lỗi. |
77
77
  | `classContainerBottomInput` | `string` | `undefined` | Class CSS cho vùng dưới input. |
78
78
  | `classContainerInput` | `string` | `undefined` | Class CSS cho container bao quanh input. |
79
79
  | `classInclude` | `string` | `undefined` | Class CSS tổng thể cho component. |
@@ -96,11 +96,12 @@ export class YourComponent {}
96
96
  | `ignoreBlockInputMaxValue` | `boolean` | `undefined` | Không chặn nhập khi giá trị vượt quá max value. |
97
97
  | `ignoreContentLeft` | `boolean` | `undefined` | Ẩn nội dung bên trái (label/units). |
98
98
  | `ignoreContentRight` | `boolean` | `undefined` | Ẩn nội dung bên phải (units). |
99
- | `ignoreShowError` | `boolean` | `undefined` | Không hiển thị thông báo lỗi. |
99
+ | `ignoreShowError` | `boolean` | `undefined` | ⚠️ `@deprecated` Sử dụng `ignoreShowMessageError` thay thế. |
100
+ | `ignoreShowMessageError` | `boolean` | `undefined` | Ẩn message lỗi nhưng vẫn hiển thị border đỏ khi có lỗi. |
100
101
  | `ignoreStopPropagationEvent` | `boolean` | `undefined` | Ngăn chặn event propagation. |
101
102
  | `ignoreUnitRightClassReadOnly` | `boolean` | `undefined` | Không thêm class readonly cho unit bên phải. |
102
103
  | `ignoreWidthInput100` | `boolean` | `undefined` | Không set width 100% cho input. |
103
- | `isBaselineStyle` | `boolean` | `undefined` | Căn chỉnh baseline cho các phần tử. |
104
+ | `isBaselineStyle` | `boolean` | `undefined` | Căn align-items-baseline dùng khi cần căn input thẳng hàng với các phần tử khác dù có validate. |
104
105
  | `item` | `Record<string, any>` | `{}` | Đối tượng chứa dữ liệu cần bind (model). |
105
106
  | `keepPlaceholderOnly` | `boolean` | `undefined` | Chỉ hiển thị placeholder. |
106
107
  | `keySelectedUnitLeft` | `any` | `undefined` | Key của unit bên trái đang được chọn. |
@@ -115,11 +116,11 @@ export class YourComponent {}
115
116
  | `modeInput` | `TYPE_MODE_INPUT` | `undefined` | Chế độ nhập (password, text...). |
116
117
  | `noBorder` | `boolean` | `undefined` | Ẩn viền input. |
117
118
  | `onlyAcceptNegativeValue` | `boolean` | `undefined` | Chỉ chấp nhận số âm. |
118
- | `paddingRightCustomSpecific` | `number` | `undefined` | Padding phải tùy chỉnh. |
119
+ | `paddingRightCustomSpecific` | `number` | `undefined` | Custom padding-right khi count không tự tính được (#52185). |
119
120
  | `placeholder` | `string` | `undefined` | Placeholder cho input. |
120
121
  | `popoverContentIconLeft` | `string` | `undefined` | Nội dung popover cho icon trái. |
121
122
  | `popoverContentIconRight` | `string` | `undefined` | Nội dung popover cho icon phải. |
122
- | `positionMessageErrorStartInput` | `boolean` | `undefined` | Hiển thị lỗi bắt đầu từ vị trí input. |
123
+ | `positionMessageErrorStartInput` | `boolean` | `undefined` | Hiển thị message lỗi bắt đầu từ vị trí ô input thay vì từ template trái. |
123
124
  | `readonly` | `boolean` | `undefined` | Chế độ chỉ đọc. |
124
125
  | `resetAutoCompletePassword` | `boolean` | `undefined` | Reset autocomplete password. |
125
126
  | `resize` | `TYPE_INPUT_RESIZE_MODE` | `undefined` | Chế độ resize cho textarea. |
@@ -52,7 +52,14 @@ export class LibsUiComponentsInputsValidComponent {
52
52
  defaultHeight = input();
53
53
  maxHeightTextArea = input();
54
54
  minHeightTextArea = input();
55
+ /**
56
+ * @deprecated Không sử dụng input này. Sử dụng {@link ignoreShowMessageError} thay thế
57
+ * nếu vẫn muốn hiển thị border đỏ nhưng không show message lỗi.
58
+ */
55
59
  ignoreShowError = input();
60
+ /** Ẩn message lỗi nhưng vẫn hiển thị border đỏ khi có lỗi */
61
+ ignoreShowMessageError = input();
62
+ /** Luôn hiển thị border đỏ bất kể trạng thái lỗi */
56
63
  borderError = input();
57
64
  iconLeftClass = input();
58
65
  popoverContentIconLeft = input();
@@ -80,8 +87,10 @@ export class LibsUiComponentsInputsValidComponent {
80
87
  minValueNumber = input();
81
88
  ignoreContentLeft = input();
82
89
  ignoreContentRight = input();
83
- isBaselineStyle = input(); // align-items-baseline dùng khi căn input thẳng hàng với tất cả các phần khác dù có validate hay bất cứ 1 cái gì
84
- valuePatternShowError = input(false, { transform: (value) => value ?? false }); // mặc định khi test pattern trả về giá trị bằng false sẽ báo lỗi
90
+ /** Căn align-items-baseline dùng khi cần căn input thẳng hàng với các phần tử khác dù có validate */
91
+ isBaselineStyle = input();
92
+ /** Mặc định khi test pattern trả về giá trị bằng false sẽ báo lỗi */
93
+ valuePatternShowError = input(false, { transform: (value) => value ?? false });
85
94
  validPattern = input();
86
95
  validRequired = input();
87
96
  validMinLength = input();
@@ -90,7 +99,8 @@ export class LibsUiComponentsInputsValidComponent {
90
99
  validMaxLength = input();
91
100
  functionValid = input();
92
101
  maxLength = input();
93
- positionMessageErrorStartInput = input(); // khi có template left và right mà muốn mesage error xuất hiện bắt đầu từ ô input thay vì bắt đầu từ template trái
102
+ /** Hiển thị message lỗi bắt đầu từ vị trí ô input thay vì từ template trái */
103
+ positionMessageErrorStartInput = input();
94
104
  classInclude = input();
95
105
  resize = input();
96
106
  templateLeftBottomInput = input();
@@ -101,7 +111,8 @@ export class LibsUiComponentsInputsValidComponent {
101
111
  classMessageErrorInclude = input();
102
112
  ignoreStopPropagationEvent = input();
103
113
  ignoreUnitRightClassReadOnly = input();
104
- paddingRightCustomSpecific = input(); // fix paddingRight count ko auto tính #52185
114
+ /** Custom padding-right khi count không tự tính được (#52185) */
115
+ paddingRightCustomSpecific = input();
105
116
  focusTimeOut = input();
106
117
  debounceTimeValidate = input(0, { transform: (value) => value ?? 0 });
107
118
  // #region OUTPUT
@@ -156,7 +167,7 @@ export class LibsUiComponentsInputsValidComponent {
156
167
  };
157
168
  }
158
169
  async currentStateIsValid() {
159
- return this.singleError().message ? false : true;
170
+ return !this.singleError().message;
160
171
  }
161
172
  getElementValue() {
162
173
  return this.functionControlInput?.getElementValue();
@@ -205,7 +216,7 @@ export class LibsUiComponentsInputsValidComponent {
205
216
  this.singleError.set({ message: this.validMinLength()?.message || ERROR_MESSAGE_MIN_LENGTH, interpolateParams: this.validMinLength()?.interpolateParams || {} });
206
217
  return;
207
218
  }
208
- if (typeof value === 'string' && this.validPattern() && this.validPattern()?.length && value && value.trim()) {
219
+ if (typeof value === 'string' && this.validPattern()?.length && value?.trim()) {
209
220
  for (const valid of this.validPattern() || []) {
210
221
  if (!valid.pattern) {
211
222
  continue;
@@ -262,7 +273,7 @@ export class LibsUiComponentsInputsValidComponent {
262
273
  return;
263
274
  }
264
275
  const result = this.functionValid()?.(value);
265
- if (result && result.then) {
276
+ if (result?.then) {
266
277
  this.singleError.set(await result);
267
278
  return;
268
279
  }
@@ -274,7 +285,7 @@ export class LibsUiComponentsInputsValidComponent {
274
285
  }
275
286
  clearTimeout(this.timerValueChange());
276
287
  await this.validate(get(this.item, this.fieldNameBind()));
277
- return this.singleError().message ? false : true;
288
+ return !this.singleError().message;
278
289
  }
279
290
  async setMessageError(message) {
280
291
  this.singleError.update((obj) => ({ ...obj, message }));
@@ -300,10 +311,10 @@ export class LibsUiComponentsInputsValidComponent {
300
311
  clearTimeout(this.timerValueChange());
301
312
  }
302
313
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsValidComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
303
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsValidComponent, isStandalone: true, selector: "libs_ui-components-inputs-valid", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, emitEmptyInDataTypeNumber: { classPropertyName: "emitEmptyInDataTypeNumber", publicName: "emitEmptyInDataTypeNumber", isSignal: true, isRequired: false, transformFunction: null }, ignoreBlockInputMaxValue: { classPropertyName: "ignoreBlockInputMaxValue", publicName: "ignoreBlockInputMaxValue", isSignal: true, isRequired: false, transformFunction: null }, fieldNameBind: { classPropertyName: "fieldNameBind", publicName: "fieldNameBind", isSignal: true, isRequired: true, transformFunction: null }, showCount: { classPropertyName: "showCount", publicName: "showCount", isSignal: true, isRequired: false, transformFunction: null }, typeComponentSelectItem: { classPropertyName: "typeComponentSelectItem", publicName: "typeComponentSelectItem", isSignal: true, isRequired: false, transformFunction: null }, valueComponentSelectItem: { classPropertyName: "valueComponentSelectItem", publicName: "valueComponentSelectItem", isSignal: true, isRequired: false, transformFunction: null }, disableComponentSelectItem: { classPropertyName: "disableComponentSelectItem", publicName: "disableComponentSelectItem", isSignal: true, isRequired: false, transformFunction: null }, tagInput: { classPropertyName: "tagInput", publicName: "tagInput", isSignal: true, isRequired: false, transformFunction: null }, dataType: { classPropertyName: "dataType", publicName: "dataType", isSignal: true, isRequired: false, transformFunction: null }, typeInput: { classPropertyName: "typeInput", publicName: "typeInput", isSignal: true, isRequired: false, transformFunction: null }, modeInput: { classPropertyName: "modeInput", publicName: "modeInput", isSignal: true, isRequired: false, transformFunction: null }, resetAutoCompletePassword: { classPropertyName: "resetAutoCompletePassword", publicName: "resetAutoCompletePassword", isSignal: true, isRequired: false, transformFunction: null }, textAreaEnterNotNewLine: { classPropertyName: "textAreaEnterNotNewLine", publicName: "textAreaEnterNotNewLine", isSignal: true, isRequired: false, transformFunction: null }, fixedFloat: { classPropertyName: "fixedFloat", publicName: "fixedFloat", 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 }, ignoreWidthInput100: { classPropertyName: "ignoreWidthInput100", publicName: "ignoreWidthInput100", isSignal: true, isRequired: false, transformFunction: null }, classIncludeInput: { classPropertyName: "classIncludeInput", publicName: "classIncludeInput", isSignal: true, isRequired: false, transformFunction: null }, classContainerInput: { classPropertyName: "classContainerInput", publicName: "classContainerInput", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, noBorder: { classPropertyName: "noBorder", publicName: "noBorder", isSignal: true, isRequired: false, transformFunction: null }, backgroundNone: { classPropertyName: "backgroundNone", publicName: "backgroundNone", isSignal: true, isRequired: false, transformFunction: null }, useColorModeExist: { classPropertyName: "useColorModeExist", publicName: "useColorModeExist", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, keepPlaceholderOnly: { classPropertyName: "keepPlaceholderOnly", publicName: "keepPlaceholderOnly", isSignal: true, isRequired: false, transformFunction: null }, classContainerBottomInput: { classPropertyName: "classContainerBottomInput", publicName: "classContainerBottomInput", isSignal: true, isRequired: false, transformFunction: null }, autoRemoveEmoji: { classPropertyName: "autoRemoveEmoji", publicName: "autoRemoveEmoji", isSignal: true, isRequired: false, transformFunction: null }, defaultHeight: { classPropertyName: "defaultHeight", publicName: "defaultHeight", isSignal: true, isRequired: false, transformFunction: null }, maxHeightTextArea: { classPropertyName: "maxHeightTextArea", publicName: "maxHeightTextArea", isSignal: true, isRequired: false, transformFunction: null }, minHeightTextArea: { classPropertyName: "minHeightTextArea", publicName: "minHeightTextArea", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowError: { classPropertyName: "ignoreShowError", publicName: "ignoreShowError", isSignal: true, isRequired: false, transformFunction: null }, borderError: { classPropertyName: "borderError", publicName: "borderError", isSignal: true, isRequired: false, transformFunction: null }, iconLeftClass: { classPropertyName: "iconLeftClass", publicName: "iconLeftClass", isSignal: true, isRequired: false, transformFunction: null }, popoverContentIconLeft: { classPropertyName: "popoverContentIconLeft", publicName: "popoverContentIconLeft", isSignal: true, isRequired: false, transformFunction: null }, iconRightClass: { classPropertyName: "iconRightClass", publicName: "iconRightClass", isSignal: true, isRequired: false, transformFunction: null }, popoverContentIconRight: { classPropertyName: "popoverContentIconRight", publicName: "popoverContentIconRight", isSignal: true, isRequired: false, transformFunction: null }, zIndexPopoverContent: { classPropertyName: "zIndexPopoverContent", publicName: "zIndexPopoverContent", isSignal: true, isRequired: false, transformFunction: null }, unitsLeft: { classPropertyName: "unitsLeft", publicName: "unitsLeft", isSignal: true, isRequired: false, transformFunction: null }, configUnitLeft: { classPropertyName: "configUnitLeft", publicName: "configUnitLeft", isSignal: true, isRequired: false, transformFunction: null }, keySelectedUnitLeft: { classPropertyName: "keySelectedUnitLeft", publicName: "keySelectedUnitLeft", isSignal: true, isRequired: false, transformFunction: null }, unitsRight: { classPropertyName: "unitsRight", publicName: "unitsRight", isSignal: true, isRequired: false, transformFunction: null }, configUnitRight: { classPropertyName: "configUnitRight", publicName: "configUnitRight", isSignal: true, isRequired: false, transformFunction: null }, keySelectedUnitRight: { classPropertyName: "keySelectedUnitRight", publicName: "keySelectedUnitRight", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, minValueNumber: { classPropertyName: "minValueNumber", publicName: "minValueNumber", isSignal: true, isRequired: false, transformFunction: null }, ignoreContentLeft: { classPropertyName: "ignoreContentLeft", publicName: "ignoreContentLeft", isSignal: true, isRequired: false, transformFunction: null }, ignoreContentRight: { classPropertyName: "ignoreContentRight", publicName: "ignoreContentRight", isSignal: true, isRequired: false, transformFunction: null }, isBaselineStyle: { classPropertyName: "isBaselineStyle", publicName: "isBaselineStyle", isSignal: true, isRequired: false, transformFunction: null }, valuePatternShowError: { classPropertyName: "valuePatternShowError", publicName: "valuePatternShowError", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, validMinValue: { classPropertyName: "validMinValue", publicName: "validMinValue", isSignal: true, isRequired: false, transformFunction: null }, validMaxValue: { classPropertyName: "validMaxValue", publicName: "validMaxValue", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, functionValid: { classPropertyName: "functionValid", publicName: "functionValid", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, positionMessageErrorStartInput: { classPropertyName: "positionMessageErrorStartInput", publicName: "positionMessageErrorStartInput", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, resize: { classPropertyName: "resize", publicName: "resize", isSignal: true, isRequired: false, transformFunction: null }, templateLeftBottomInput: { classPropertyName: "templateLeftBottomInput", publicName: "templateLeftBottomInput", isSignal: true, isRequired: false, transformFunction: null }, templateRightBottomInput: { classPropertyName: "templateRightBottomInput", publicName: "templateRightBottomInput", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, autoAddZeroLessThan10InTypeInt: { classPropertyName: "autoAddZeroLessThan10InTypeInt", publicName: "autoAddZeroLessThan10InTypeInt", isSignal: true, isRequired: false, transformFunction: null }, maxLengthNumberCount: { classPropertyName: "maxLengthNumberCount", publicName: "maxLengthNumberCount", isSignal: true, isRequired: false, transformFunction: null }, classMessageErrorInclude: { classPropertyName: "classMessageErrorInclude", publicName: "classMessageErrorInclude", isSignal: true, isRequired: false, transformFunction: null }, ignoreStopPropagationEvent: { classPropertyName: "ignoreStopPropagationEvent", publicName: "ignoreStopPropagationEvent", isSignal: true, isRequired: false, transformFunction: null }, ignoreUnitRightClassReadOnly: { classPropertyName: "ignoreUnitRightClassReadOnly", publicName: "ignoreUnitRightClassReadOnly", isSignal: true, isRequired: false, transformFunction: null }, paddingRightCustomSpecific: { classPropertyName: "paddingRightCustomSpecific", publicName: "paddingRightCustomSpecific", isSignal: true, isRequired: false, transformFunction: null }, focusTimeOut: { classPropertyName: "focusTimeOut", publicName: "focusTimeOut", isSignal: true, isRequired: false, transformFunction: null }, debounceTimeValidate: { classPropertyName: "debounceTimeValidate", publicName: "debounceTimeValidate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { item: "itemChange", outValueChange: "outValueChange", outSelect: "outSelect", outIconLeft: "outIconLeft", outIconRight: "outIconRight", outClickButtonLabel: "outClickButtonLabel", outSwitchEventLabel: "outSwitchEventLabel", outLabelRightClick: "outLabelRightClick", outEnterInputEvent: "outEnterInputEvent", outHeightAreaChange: "outHeightAreaChange", outFunctionsControl: "outFunctionsControl", outFocusAndBlur: "outFocusAndBlur", outChangeValueByButtonUpDown: "outChangeValueByButtonUpDown" }, viewQueries: [{ propertyName: "elementLeftRef", first: true, predicate: ["elementLeftRef"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (fieldNameBind() && item(); as item) {\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"disable() || labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsRight]=\"disable() || labelConfig.disableButtonsRight\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"disable() || labelConfig.toggleDisable\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"value()?.length\"\n (outClickButton)=\"handlerClickButtonLabel($event)\"\n (outSwitchEvent)=\"handlerSwitchLabel($event)\"\n (outLabelRightClick)=\"handlerEventLabelRightLabel()\" />\n }\n <div\n [class]=\"'libs-ui-input-valid w-full ' + (classInclude() ?? '')\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @if (!ignoreContentLeft()) {\n <div\n #elementLeftRef\n class=\"libs-ui-input-valid-left\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @if (typeComponentSelectItem(); as typeComponentSelectItem) {\n <div class=\"mr-[8px]\">\n @if (typeComponentSelectItem === 'checkbox') {\n <libs_ui-components-checkbox-single\n [checked]=\"valueComponentSelectItem() || false\"\n [disable]=\"disable() || disableComponentSelectItem() || false\"\n (outChange)=\"handlerSelect($event.checked)\" />\n }\n @if (typeComponentSelectItem === 'radio') {\n <libs_ui-components-radio-single\n [active]=\"valueComponentSelectItem() || false\"\n [disable]=\"disable() || disableComponentSelectItem() || false\"\n (outChange)=\"handlerSelect($event.active)\" />\n }\n </div>\n }\n\n <ng-content select=\".libs-ui-input-valid-left-content-custom\" />\n @for (unit of unitsLeft(); track unit) {\n <div\n class=\"libs-ui-input-valid-unit libs-ui-input-valid-unit-left !rounded-tr-none !rounded-br-none libs-ui-font-h5r {{ configUnitLeft().classInclude || '' }}\"\n [class.!flex]=\"unit[configUnitLeft().fieldKey] === keySelectedUnitLeft()\"\n [class.libs-ui-readonly]=\"readonly() || false\"\n [class.libs-ui-disable]=\"disable() || false\">\n @let constHtmlLabel = unit[configUnitLeft().fieldLabel || 'label'] || ' ';\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{ maxWidth: 250, direction: 'bottom', zIndex: zIndexPopoverContent() }\"\n [innerHtml]=\"constHtmlLabel | translate\" />\n </div>\n }\n </div>\n }\n @if (calledEffect() === true) {\n <libs_ui-components-inputs-input\n [tagInput]=\"tagInput()\"\n [dataType]=\"dataType() || 'string'\"\n [typeInput]=\"typeInput()\"\n [modeInput]=\"modeInput()\"\n [class.w-full]=\"!ignoreWidthInput100()\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [textAreaEnterNotNewLine]=\"textAreaEnterNotNewLine() || false\"\n [classInclude]=\"(classIncludeInput() || '') + (unitsLeft() && unitsLeft()?.length ? ' !rounded-tl-none !rounded-bl-none' : '') + (unitsRight()?.length ? ' !rounded-tr-none !rounded-br-none' : '')\"\n [maxValueNumber]=\"maxValueNumber()\"\n [minValueNumber]=\"minValueNumber()\"\n [fixedFloat]=\"fixedFloat() ?? 1\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxLength]=\"maxLength()\"\n [showCount]=\"showCount()\"\n [readonly]=\"readonly()\"\n [disable]=\"disable()\"\n [autoAddZeroLessThan10InTypeInt]=\"autoAddZeroLessThan10InTypeInt()\"\n [noBorder]=\"noBorder()\"\n [backgroundNone]=\"backgroundNone()\"\n [useColorModeExist]=\"useColorModeExist()\"\n [placeholder]=\"placeholder() || ''\"\n [keepPlaceholderOnly]=\"keepPlaceholderOnly()\"\n [autoRemoveEmoji]=\"autoRemoveEmoji()\"\n [defaultHeight]=\"defaultHeight()\"\n [maxHeightTextArea]=\"maxHeightTextArea() || 250\"\n [minHeightTextArea]=\"minHeightTextArea()\"\n [borderError]=\"borderError() || (!!singleError().message && !ignoreShowError())\"\n [iconLeftClass]=\"iconLeftClass()\"\n [popoverContentIconLeft]=\"popoverContentIconLeft()\"\n [popoverContentIconRight]=\"popoverContentIconRight()\"\n [iconRightClass]=\"iconRightClass()\"\n [zIndexPopoverContent]=\"zIndexPopoverContent()\"\n [emitEmptyInDataTypeNumber]=\"emitEmptyInDataTypeNumber()\"\n [ignoreBlockInputMaxValue]=\"!!ignoreBlockInputMaxValue() ? ignoreBlockInputMaxValue() : validMaxValue()?.message ? true : false\"\n [(value)]=\"value\"\n [classContainerInput]=\"classContainerInput()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n [resize]=\"resize()\"\n [classContainerBottomInput]=\"classContainerBottomInput()\"\n [templateLeftBottomInput]=\"templateLeftBottomInput()\"\n [templateRightBottomInput]=\"templateRightBottomInput()\"\n [maxLengthNumberCount]=\"maxLengthNumberCount()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [focusTimeOut]=\"focusTimeOut()\"\n (valueChange)=\"handlerValueChange($event)\"\n (outEnterEvent)=\"handlerEnterInput($event)\"\n (outIconLeft)=\"handlerEventIconLeft($event)\"\n (outIconRight)=\"handlerEventIconRight($event)\"\n (outHeightAreaChange)=\"handlerHeightAreaChange($event)\"\n (outFunctionsControl)=\"handlerControlFunctionInput($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlur($event)\"\n (outChangeValueByButtonUpDown)=\"handlerChangeValueByButtonUpDown()\" />\n }\n @if (!ignoreContentRight()) {\n <div\n class=\"libs-ui-input-valid-right\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @for (unit of unitsRight(); track unit) {\n <div\n class=\"libs-ui-input-valid-unit libs-ui-input-valid-unit-right !rounded-tl-none !rounded-bl-none libs-ui-font-h5r {{ configUnitRight().classInclude || 'libs-ui-border-general' }}\"\n [class.!flex]=\"unit[configUnitRight().fieldKey] === keySelectedUnitRight()\"\n [class.libs-ui-readonly]=\"!ignoreUnitRightClassReadOnly() && (readonly() || false)\">\n @let constHtmlLabel = unit[configUnitRight().fieldLabel || 'label'] || ' ';\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{ maxWidth: 250, direction: 'bottom', zIndex: zIndexPopoverContent() }\"\n [innerHtml]=\"constHtmlLabel | translate\" />\n </div>\n }\n <ng-content select=\".libs-ui-input-valid-right-content-custom\"></ng-content>\n </div>\n }\n </div>\n @if (!!singleError().message && !ignoreShowError()) {\n <div class=\"libs-ui-input-valid-error {{ classMessageErrorInclude() || '' }}\">\n @let constHtmlMessage = singleError().message || ' ';\n <span\n class=\"libs-ui-message-error libs-ui-font-h7r libs-ui-text-error\"\n [style.marginLeft.px]=\"rectLeft()?.width\"\n [innerHtml]=\"constHtmlMessage | translate: singleError().interpolateParams\"></span>\n </div>\n }\n}\n", styles: [":host{display:flex;flex-direction:column;width:100%}:host .libs-ui-input-valid{position:relative;display:flex;align-items:center}:host .libs-ui-input-valid .libs-ui-input-valid-unit{height:32px;max-width:200px;overflow:hidden;text-align:center;border-radius:4px;background-color:#e6e7ea;display:none;align-items:center;padding:0 8px;border:1px solid #e6e7ea}:host .libs-ui-input-valid .libs-ui-input-valid-unit .libs-ui-input-unit-left{border-bottom-left-radius:0;border-top-left-radius:0;border-left:none}:host .libs-ui-input-valid .libs-ui-input-valid-unit .libs-ui-input-unit-right{border-bottom-right-radius:0;border-top-right-radius:0;border-right:none}:host .libs-ui-input-valid .libs-ui-input-valid-left{display:flex;align-items:center;justify-content:flex-start}:host .libs-ui-input-valid .libs-ui-input-valid-right{display:flex;align-items:center;justify-content:flex-end}:host .libs-ui-input-valid-error{display:flex;align-items:center;margin-top:8px}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsInputComponent, selector: "libs_ui-components-inputs-input", inputs: ["tagInput", "dataType", "typeInput", "modeInput", "tabInsertContentTagInput", "textAreaEnterNotNewLine", "emitEmptyInDataTypeNumber", "keepZeroInTypeInt", "autoAddZeroLessThan10InTypeInt", "ignoreBlockInputMaxValue", "maxValueNumber", "minValueNumber", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "classInclude", "maxLength", "readonly", "disable", "noBorder", "backgroundNone", "borderError", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "value", "autoRemoveEmoji", "defaultHeight", "minHeightTextArea", "maxHeightTextArea", "focusTimeOut", "selectAllTimeOut", "blurTimeOut", "zIndexPopoverContent", "classContainerInput", "showCount", "ignoreStopPropagationEvent", "resize", "templateLeftBottomInput", "templateRightBottomInput", "classContainerBottomInput", "ignoreWidthInput100", "iframeTextareaCustomStyle", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "resetAutoCompletePassword", "acceptOnlyClickIcon", "setIconRightColorSameColorDisableReadOnly", "onlyAcceptNegativeValue", "maxLengthNumberCount", "focusInput"], outputs: ["maxValueNumberChange", "minValueNumberChange", "fixedFloatChange", "acceptNegativeValueChange", "maxLengthChange", "valueChange", "maxLengthNumberCountChange", "outHeightAreaChange", "outChange", "outFocusAndBlurEvent", "outEnterEvent", "outInputEvent", "outIconLeft", "outIconRight", "outFunctionsControl", "outFilesDrop", "outFileDrop", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }, { kind: "component", type: LibsUiComponentsCheckboxSingleComponent, selector: "libs_ui-components-checkbox-single", inputs: ["key", "checked", "label", "classLabelInclude", "ignoreShowPopoverLabel", "typeLabelPopover", "popover", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "classInclude", "clickExactly", "disable", "disableLabel", "ignoreCheckbox", "zIndexLabel", "stillOtherOptions", "error", "showBorderError", "description", "iconImageClass", "classIconInclude", "modeBorder", "dataComponentOutlet", "componentOutlet"], outputs: ["checkedChange", "linkImageChange", "outChange", "outEventPopover", "outClickLabel", "outChangStageFlagMousePopover"] }, { kind: "component", type: LibsUiComponentsRadioSingleComponent, selector: "libs_ui-components-radio-single", inputs: ["key", "active", "classInclude", "label", "labelInterpolateParams", "ignorePopoverLabel", "classLabelInclude", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "popover", "disable", "disableLabel", "clickExactly", "typeRadio", "ignoreRadio", "zIndexLabel", "classIncludeIcon", "dataComponentOutlet", "componentOutlet"], outputs: ["activeChange", "outClickLabel", "outChange", "outChangStageFlagMousePopover"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
314
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsValidComponent, isStandalone: true, selector: "libs_ui-components-inputs-valid", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, emitEmptyInDataTypeNumber: { classPropertyName: "emitEmptyInDataTypeNumber", publicName: "emitEmptyInDataTypeNumber", isSignal: true, isRequired: false, transformFunction: null }, ignoreBlockInputMaxValue: { classPropertyName: "ignoreBlockInputMaxValue", publicName: "ignoreBlockInputMaxValue", isSignal: true, isRequired: false, transformFunction: null }, fieldNameBind: { classPropertyName: "fieldNameBind", publicName: "fieldNameBind", isSignal: true, isRequired: true, transformFunction: null }, showCount: { classPropertyName: "showCount", publicName: "showCount", isSignal: true, isRequired: false, transformFunction: null }, typeComponentSelectItem: { classPropertyName: "typeComponentSelectItem", publicName: "typeComponentSelectItem", isSignal: true, isRequired: false, transformFunction: null }, valueComponentSelectItem: { classPropertyName: "valueComponentSelectItem", publicName: "valueComponentSelectItem", isSignal: true, isRequired: false, transformFunction: null }, disableComponentSelectItem: { classPropertyName: "disableComponentSelectItem", publicName: "disableComponentSelectItem", isSignal: true, isRequired: false, transformFunction: null }, tagInput: { classPropertyName: "tagInput", publicName: "tagInput", isSignal: true, isRequired: false, transformFunction: null }, dataType: { classPropertyName: "dataType", publicName: "dataType", isSignal: true, isRequired: false, transformFunction: null }, typeInput: { classPropertyName: "typeInput", publicName: "typeInput", isSignal: true, isRequired: false, transformFunction: null }, modeInput: { classPropertyName: "modeInput", publicName: "modeInput", isSignal: true, isRequired: false, transformFunction: null }, resetAutoCompletePassword: { classPropertyName: "resetAutoCompletePassword", publicName: "resetAutoCompletePassword", isSignal: true, isRequired: false, transformFunction: null }, textAreaEnterNotNewLine: { classPropertyName: "textAreaEnterNotNewLine", publicName: "textAreaEnterNotNewLine", isSignal: true, isRequired: false, transformFunction: null }, fixedFloat: { classPropertyName: "fixedFloat", publicName: "fixedFloat", 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 }, ignoreWidthInput100: { classPropertyName: "ignoreWidthInput100", publicName: "ignoreWidthInput100", isSignal: true, isRequired: false, transformFunction: null }, classIncludeInput: { classPropertyName: "classIncludeInput", publicName: "classIncludeInput", isSignal: true, isRequired: false, transformFunction: null }, classContainerInput: { classPropertyName: "classContainerInput", publicName: "classContainerInput", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, noBorder: { classPropertyName: "noBorder", publicName: "noBorder", isSignal: true, isRequired: false, transformFunction: null }, backgroundNone: { classPropertyName: "backgroundNone", publicName: "backgroundNone", isSignal: true, isRequired: false, transformFunction: null }, useColorModeExist: { classPropertyName: "useColorModeExist", publicName: "useColorModeExist", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, keepPlaceholderOnly: { classPropertyName: "keepPlaceholderOnly", publicName: "keepPlaceholderOnly", isSignal: true, isRequired: false, transformFunction: null }, classContainerBottomInput: { classPropertyName: "classContainerBottomInput", publicName: "classContainerBottomInput", isSignal: true, isRequired: false, transformFunction: null }, autoRemoveEmoji: { classPropertyName: "autoRemoveEmoji", publicName: "autoRemoveEmoji", isSignal: true, isRequired: false, transformFunction: null }, defaultHeight: { classPropertyName: "defaultHeight", publicName: "defaultHeight", isSignal: true, isRequired: false, transformFunction: null }, maxHeightTextArea: { classPropertyName: "maxHeightTextArea", publicName: "maxHeightTextArea", isSignal: true, isRequired: false, transformFunction: null }, minHeightTextArea: { classPropertyName: "minHeightTextArea", publicName: "minHeightTextArea", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowError: { classPropertyName: "ignoreShowError", publicName: "ignoreShowError", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowMessageError: { classPropertyName: "ignoreShowMessageError", publicName: "ignoreShowMessageError", isSignal: true, isRequired: false, transformFunction: null }, borderError: { classPropertyName: "borderError", publicName: "borderError", isSignal: true, isRequired: false, transformFunction: null }, iconLeftClass: { classPropertyName: "iconLeftClass", publicName: "iconLeftClass", isSignal: true, isRequired: false, transformFunction: null }, popoverContentIconLeft: { classPropertyName: "popoverContentIconLeft", publicName: "popoverContentIconLeft", isSignal: true, isRequired: false, transformFunction: null }, iconRightClass: { classPropertyName: "iconRightClass", publicName: "iconRightClass", isSignal: true, isRequired: false, transformFunction: null }, popoverContentIconRight: { classPropertyName: "popoverContentIconRight", publicName: "popoverContentIconRight", isSignal: true, isRequired: false, transformFunction: null }, zIndexPopoverContent: { classPropertyName: "zIndexPopoverContent", publicName: "zIndexPopoverContent", isSignal: true, isRequired: false, transformFunction: null }, unitsLeft: { classPropertyName: "unitsLeft", publicName: "unitsLeft", isSignal: true, isRequired: false, transformFunction: null }, configUnitLeft: { classPropertyName: "configUnitLeft", publicName: "configUnitLeft", isSignal: true, isRequired: false, transformFunction: null }, keySelectedUnitLeft: { classPropertyName: "keySelectedUnitLeft", publicName: "keySelectedUnitLeft", isSignal: true, isRequired: false, transformFunction: null }, unitsRight: { classPropertyName: "unitsRight", publicName: "unitsRight", isSignal: true, isRequired: false, transformFunction: null }, configUnitRight: { classPropertyName: "configUnitRight", publicName: "configUnitRight", isSignal: true, isRequired: false, transformFunction: null }, keySelectedUnitRight: { classPropertyName: "keySelectedUnitRight", publicName: "keySelectedUnitRight", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, minValueNumber: { classPropertyName: "minValueNumber", publicName: "minValueNumber", isSignal: true, isRequired: false, transformFunction: null }, ignoreContentLeft: { classPropertyName: "ignoreContentLeft", publicName: "ignoreContentLeft", isSignal: true, isRequired: false, transformFunction: null }, ignoreContentRight: { classPropertyName: "ignoreContentRight", publicName: "ignoreContentRight", isSignal: true, isRequired: false, transformFunction: null }, isBaselineStyle: { classPropertyName: "isBaselineStyle", publicName: "isBaselineStyle", isSignal: true, isRequired: false, transformFunction: null }, valuePatternShowError: { classPropertyName: "valuePatternShowError", publicName: "valuePatternShowError", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, validMinValue: { classPropertyName: "validMinValue", publicName: "validMinValue", isSignal: true, isRequired: false, transformFunction: null }, validMaxValue: { classPropertyName: "validMaxValue", publicName: "validMaxValue", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, functionValid: { classPropertyName: "functionValid", publicName: "functionValid", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, positionMessageErrorStartInput: { classPropertyName: "positionMessageErrorStartInput", publicName: "positionMessageErrorStartInput", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, resize: { classPropertyName: "resize", publicName: "resize", isSignal: true, isRequired: false, transformFunction: null }, templateLeftBottomInput: { classPropertyName: "templateLeftBottomInput", publicName: "templateLeftBottomInput", isSignal: true, isRequired: false, transformFunction: null }, templateRightBottomInput: { classPropertyName: "templateRightBottomInput", publicName: "templateRightBottomInput", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, autoAddZeroLessThan10InTypeInt: { classPropertyName: "autoAddZeroLessThan10InTypeInt", publicName: "autoAddZeroLessThan10InTypeInt", isSignal: true, isRequired: false, transformFunction: null }, maxLengthNumberCount: { classPropertyName: "maxLengthNumberCount", publicName: "maxLengthNumberCount", isSignal: true, isRequired: false, transformFunction: null }, classMessageErrorInclude: { classPropertyName: "classMessageErrorInclude", publicName: "classMessageErrorInclude", isSignal: true, isRequired: false, transformFunction: null }, ignoreStopPropagationEvent: { classPropertyName: "ignoreStopPropagationEvent", publicName: "ignoreStopPropagationEvent", isSignal: true, isRequired: false, transformFunction: null }, ignoreUnitRightClassReadOnly: { classPropertyName: "ignoreUnitRightClassReadOnly", publicName: "ignoreUnitRightClassReadOnly", isSignal: true, isRequired: false, transformFunction: null }, paddingRightCustomSpecific: { classPropertyName: "paddingRightCustomSpecific", publicName: "paddingRightCustomSpecific", isSignal: true, isRequired: false, transformFunction: null }, focusTimeOut: { classPropertyName: "focusTimeOut", publicName: "focusTimeOut", isSignal: true, isRequired: false, transformFunction: null }, debounceTimeValidate: { classPropertyName: "debounceTimeValidate", publicName: "debounceTimeValidate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { item: "itemChange", outValueChange: "outValueChange", outSelect: "outSelect", outIconLeft: "outIconLeft", outIconRight: "outIconRight", outClickButtonLabel: "outClickButtonLabel", outSwitchEventLabel: "outSwitchEventLabel", outLabelRightClick: "outLabelRightClick", outEnterInputEvent: "outEnterInputEvent", outHeightAreaChange: "outHeightAreaChange", outFunctionsControl: "outFunctionsControl", outFocusAndBlur: "outFocusAndBlur", outChangeValueByButtonUpDown: "outChangeValueByButtonUpDown" }, viewQueries: [{ propertyName: "elementLeftRef", first: true, predicate: ["elementLeftRef"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (fieldNameBind() && item(); as item) {\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"disable() || labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsRight]=\"disable() || labelConfig.disableButtonsRight\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"disable() || labelConfig.toggleDisable\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"value()?.length\"\n (outClickButton)=\"handlerClickButtonLabel($event)\"\n (outSwitchEvent)=\"handlerSwitchLabel($event)\"\n (outLabelRightClick)=\"handlerEventLabelRightLabel()\" />\n }\n <div\n [class]=\"'libs-ui-input-valid w-full ' + (classInclude() ?? '')\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @if (!ignoreContentLeft()) {\n <div\n #elementLeftRef\n class=\"libs-ui-input-valid-left\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @if (typeComponentSelectItem(); as typeComponentSelectItem) {\n <div class=\"mr-[8px]\">\n @if (typeComponentSelectItem === 'checkbox') {\n <libs_ui-components-checkbox-single\n [checked]=\"valueComponentSelectItem() || false\"\n [disable]=\"disable() || disableComponentSelectItem() || false\"\n (outChange)=\"handlerSelect($event.checked)\" />\n }\n @if (typeComponentSelectItem === 'radio') {\n <libs_ui-components-radio-single\n [active]=\"valueComponentSelectItem() || false\"\n [disable]=\"disable() || disableComponentSelectItem() || false\"\n (outChange)=\"handlerSelect($event.active)\" />\n }\n </div>\n }\n\n <ng-content select=\".libs-ui-input-valid-left-content-custom\" />\n @for (unit of unitsLeft(); track unit) {\n <div\n class=\"libs-ui-input-valid-unit libs-ui-input-valid-unit-left !rounded-tr-none !rounded-br-none libs-ui-font-h5r {{ configUnitLeft().classInclude || '' }}\"\n [class.!flex]=\"unit[configUnitLeft().fieldKey] === keySelectedUnitLeft()\"\n [class.libs-ui-readonly]=\"readonly() || false\"\n [class.libs-ui-disable]=\"disable() || false\">\n @let constHtmlLabel = unit[configUnitLeft().fieldLabel || 'label'] || ' ';\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{ maxWidth: 250, direction: 'bottom', zIndex: zIndexPopoverContent() }\"\n [innerHtml]=\"constHtmlLabel | translate\" />\n </div>\n }\n </div>\n }\n @if (calledEffect() === true) {\n <libs_ui-components-inputs-input\n [tagInput]=\"tagInput()\"\n [dataType]=\"dataType() || 'string'\"\n [typeInput]=\"typeInput()\"\n [modeInput]=\"modeInput()\"\n [class.w-full]=\"!ignoreWidthInput100()\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [textAreaEnterNotNewLine]=\"textAreaEnterNotNewLine() || false\"\n [classInclude]=\"(classIncludeInput() || '') + (unitsLeft() && unitsLeft()?.length ? ' !rounded-tl-none !rounded-bl-none' : '') + (unitsRight()?.length ? ' !rounded-tr-none !rounded-br-none' : '')\"\n [maxValueNumber]=\"maxValueNumber()\"\n [minValueNumber]=\"minValueNumber()\"\n [fixedFloat]=\"fixedFloat() ?? 1\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxLength]=\"maxLength()\"\n [showCount]=\"showCount()\"\n [readonly]=\"readonly()\"\n [disable]=\"disable()\"\n [autoAddZeroLessThan10InTypeInt]=\"autoAddZeroLessThan10InTypeInt()\"\n [noBorder]=\"noBorder()\"\n [backgroundNone]=\"backgroundNone()\"\n [useColorModeExist]=\"useColorModeExist()\"\n [placeholder]=\"placeholder() || ''\"\n [keepPlaceholderOnly]=\"keepPlaceholderOnly()\"\n [autoRemoveEmoji]=\"autoRemoveEmoji()\"\n [defaultHeight]=\"defaultHeight()\"\n [maxHeightTextArea]=\"maxHeightTextArea() || 250\"\n [minHeightTextArea]=\"minHeightTextArea()\"\n [borderError]=\"borderError() || (!!singleError().message && !ignoreShowError())\"\n [iconLeftClass]=\"iconLeftClass()\"\n [popoverContentIconLeft]=\"popoverContentIconLeft()\"\n [popoverContentIconRight]=\"popoverContentIconRight()\"\n [iconRightClass]=\"iconRightClass()\"\n [zIndexPopoverContent]=\"zIndexPopoverContent()\"\n [emitEmptyInDataTypeNumber]=\"emitEmptyInDataTypeNumber()\"\n [ignoreBlockInputMaxValue]=\"!!ignoreBlockInputMaxValue() ? ignoreBlockInputMaxValue() : validMaxValue()?.message ? true : false\"\n [(value)]=\"value\"\n [classContainerInput]=\"classContainerInput()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n [resize]=\"resize()\"\n [classContainerBottomInput]=\"classContainerBottomInput()\"\n [templateLeftBottomInput]=\"templateLeftBottomInput()\"\n [templateRightBottomInput]=\"templateRightBottomInput()\"\n [maxLengthNumberCount]=\"maxLengthNumberCount()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [focusTimeOut]=\"focusTimeOut()\"\n (valueChange)=\"handlerValueChange($event)\"\n (outEnterEvent)=\"handlerEnterInput($event)\"\n (outIconLeft)=\"handlerEventIconLeft($event)\"\n (outIconRight)=\"handlerEventIconRight($event)\"\n (outHeightAreaChange)=\"handlerHeightAreaChange($event)\"\n (outFunctionsControl)=\"handlerControlFunctionInput($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlur($event)\"\n (outChangeValueByButtonUpDown)=\"handlerChangeValueByButtonUpDown()\" />\n }\n @if (!ignoreContentRight()) {\n <div\n class=\"libs-ui-input-valid-right\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @for (unit of unitsRight(); track unit) {\n <div\n class=\"libs-ui-input-valid-unit libs-ui-input-valid-unit-right !rounded-tl-none !rounded-bl-none libs-ui-font-h5r {{ configUnitRight().classInclude || 'libs-ui-border-general' }}\"\n [class.!flex]=\"unit[configUnitRight().fieldKey] === keySelectedUnitRight()\"\n [class.libs-ui-readonly]=\"!ignoreUnitRightClassReadOnly() && (readonly() || false)\">\n @let constHtmlLabel = unit[configUnitRight().fieldLabel || 'label'] || ' ';\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{ maxWidth: 250, direction: 'bottom', zIndex: zIndexPopoverContent() }\"\n [innerHtml]=\"constHtmlLabel | translate\" />\n </div>\n }\n <ng-content select=\".libs-ui-input-valid-right-content-custom\"></ng-content>\n </div>\n }\n </div>\n @if (!!singleError().message && !ignoreShowError() && !ignoreShowMessageError()) {\n <div class=\"libs-ui-input-valid-error {{ classMessageErrorInclude() || '' }}\">\n @let constHtmlMessage = singleError().message || ' ';\n <span\n class=\"libs-ui-message-error libs-ui-font-h7r libs-ui-text-error\"\n [style.marginLeft.px]=\"rectLeft()?.width\"\n [innerHtml]=\"constHtmlMessage | translate: singleError().interpolateParams\"></span>\n </div>\n }\n}\n", styles: [":host{display:flex;flex-direction:column;width:100%}:host .libs-ui-input-valid{position:relative;display:flex;align-items:center}:host .libs-ui-input-valid .libs-ui-input-valid-unit{height:32px;max-width:200px;overflow:hidden;text-align:center;border-radius:4px;background-color:#e6e7ea;display:none;align-items:center;padding:0 8px;border:1px solid #e6e7ea}:host .libs-ui-input-valid .libs-ui-input-valid-unit .libs-ui-input-unit-left{border-bottom-left-radius:0;border-top-left-radius:0;border-left:none}:host .libs-ui-input-valid .libs-ui-input-valid-unit .libs-ui-input-unit-right{border-bottom-right-radius:0;border-top-right-radius:0;border-right:none}:host .libs-ui-input-valid .libs-ui-input-valid-left{display:flex;align-items:center;justify-content:flex-start}:host .libs-ui-input-valid .libs-ui-input-valid-right{display:flex;align-items:center;justify-content:flex-end}:host .libs-ui-input-valid-error{display:flex;align-items:center;margin-top:8px}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsInputComponent, selector: "libs_ui-components-inputs-input", inputs: ["tagInput", "dataType", "typeInput", "modeInput", "tabInsertContentTagInput", "textAreaEnterNotNewLine", "emitEmptyInDataTypeNumber", "keepZeroInTypeInt", "autoAddZeroLessThan10InTypeInt", "ignoreBlockInputMaxValue", "maxValueNumber", "minValueNumber", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "classInclude", "maxLength", "readonly", "disable", "noBorder", "backgroundNone", "borderError", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "value", "autoRemoveEmoji", "defaultHeight", "minHeightTextArea", "maxHeightTextArea", "focusTimeOut", "selectAllTimeOut", "blurTimeOut", "zIndexPopoverContent", "classContainerInput", "showCount", "ignoreStopPropagationEvent", "resize", "templateLeftBottomInput", "templateRightBottomInput", "classContainerBottomInput", "ignoreWidthInput100", "iframeTextareaCustomStyle", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "resetAutoCompletePassword", "acceptOnlyClickIcon", "setIconRightColorSameColorDisableReadOnly", "onlyAcceptNegativeValue", "maxLengthNumberCount", "focusInput"], outputs: ["maxValueNumberChange", "minValueNumberChange", "fixedFloatChange", "acceptNegativeValueChange", "maxLengthChange", "valueChange", "maxLengthNumberCountChange", "outHeightAreaChange", "outChange", "outFocusAndBlurEvent", "outEnterEvent", "outInputEvent", "outIconLeft", "outIconRight", "outFunctionsControl", "outFilesDrop", "outFileDrop", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }, { kind: "component", type: LibsUiComponentsCheckboxSingleComponent, selector: "libs_ui-components-checkbox-single", inputs: ["key", "checked", "label", "classLabelInclude", "ignoreShowPopoverLabel", "typeLabelPopover", "popover", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "classInclude", "clickExactly", "disable", "disableLabel", "ignoreCheckbox", "zIndexLabel", "stillOtherOptions", "error", "showBorderError", "description", "iconImageClass", "classIconInclude", "modeBorder", "dataComponentOutlet", "componentOutlet"], outputs: ["checkedChange", "linkImageChange", "outChange", "outEventPopover", "outClickLabel", "outChangStageFlagMousePopover"] }, { kind: "component", type: LibsUiComponentsRadioSingleComponent, selector: "libs_ui-components-radio-single", inputs: ["key", "active", "classInclude", "label", "labelInterpolateParams", "ignorePopoverLabel", "classLabelInclude", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "popover", "disable", "disableLabel", "clickExactly", "typeRadio", "ignoreRadio", "zIndexLabel", "classIncludeIcon", "dataComponentOutlet", "componentOutlet"], outputs: ["activeChange", "outClickLabel", "outChange", "outChangStageFlagMousePopover"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
304
315
  }
305
316
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsValidComponent, decorators: [{
306
317
  type: Component,
307
- args: [{ selector: 'libs_ui-components-inputs-valid', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsInputsInputComponent, LibsUiComponentsLabelComponent, LibsUiComponentsCheckboxSingleComponent, LibsUiComponentsRadioSingleComponent, LibsUiComponentsPopoverComponent], template: "@if (fieldNameBind() && item(); as item) {\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"disable() || labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsRight]=\"disable() || labelConfig.disableButtonsRight\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"disable() || labelConfig.toggleDisable\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"value()?.length\"\n (outClickButton)=\"handlerClickButtonLabel($event)\"\n (outSwitchEvent)=\"handlerSwitchLabel($event)\"\n (outLabelRightClick)=\"handlerEventLabelRightLabel()\" />\n }\n <div\n [class]=\"'libs-ui-input-valid w-full ' + (classInclude() ?? '')\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @if (!ignoreContentLeft()) {\n <div\n #elementLeftRef\n class=\"libs-ui-input-valid-left\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @if (typeComponentSelectItem(); as typeComponentSelectItem) {\n <div class=\"mr-[8px]\">\n @if (typeComponentSelectItem === 'checkbox') {\n <libs_ui-components-checkbox-single\n [checked]=\"valueComponentSelectItem() || false\"\n [disable]=\"disable() || disableComponentSelectItem() || false\"\n (outChange)=\"handlerSelect($event.checked)\" />\n }\n @if (typeComponentSelectItem === 'radio') {\n <libs_ui-components-radio-single\n [active]=\"valueComponentSelectItem() || false\"\n [disable]=\"disable() || disableComponentSelectItem() || false\"\n (outChange)=\"handlerSelect($event.active)\" />\n }\n </div>\n }\n\n <ng-content select=\".libs-ui-input-valid-left-content-custom\" />\n @for (unit of unitsLeft(); track unit) {\n <div\n class=\"libs-ui-input-valid-unit libs-ui-input-valid-unit-left !rounded-tr-none !rounded-br-none libs-ui-font-h5r {{ configUnitLeft().classInclude || '' }}\"\n [class.!flex]=\"unit[configUnitLeft().fieldKey] === keySelectedUnitLeft()\"\n [class.libs-ui-readonly]=\"readonly() || false\"\n [class.libs-ui-disable]=\"disable() || false\">\n @let constHtmlLabel = unit[configUnitLeft().fieldLabel || 'label'] || ' ';\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{ maxWidth: 250, direction: 'bottom', zIndex: zIndexPopoverContent() }\"\n [innerHtml]=\"constHtmlLabel | translate\" />\n </div>\n }\n </div>\n }\n @if (calledEffect() === true) {\n <libs_ui-components-inputs-input\n [tagInput]=\"tagInput()\"\n [dataType]=\"dataType() || 'string'\"\n [typeInput]=\"typeInput()\"\n [modeInput]=\"modeInput()\"\n [class.w-full]=\"!ignoreWidthInput100()\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [textAreaEnterNotNewLine]=\"textAreaEnterNotNewLine() || false\"\n [classInclude]=\"(classIncludeInput() || '') + (unitsLeft() && unitsLeft()?.length ? ' !rounded-tl-none !rounded-bl-none' : '') + (unitsRight()?.length ? ' !rounded-tr-none !rounded-br-none' : '')\"\n [maxValueNumber]=\"maxValueNumber()\"\n [minValueNumber]=\"minValueNumber()\"\n [fixedFloat]=\"fixedFloat() ?? 1\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxLength]=\"maxLength()\"\n [showCount]=\"showCount()\"\n [readonly]=\"readonly()\"\n [disable]=\"disable()\"\n [autoAddZeroLessThan10InTypeInt]=\"autoAddZeroLessThan10InTypeInt()\"\n [noBorder]=\"noBorder()\"\n [backgroundNone]=\"backgroundNone()\"\n [useColorModeExist]=\"useColorModeExist()\"\n [placeholder]=\"placeholder() || ''\"\n [keepPlaceholderOnly]=\"keepPlaceholderOnly()\"\n [autoRemoveEmoji]=\"autoRemoveEmoji()\"\n [defaultHeight]=\"defaultHeight()\"\n [maxHeightTextArea]=\"maxHeightTextArea() || 250\"\n [minHeightTextArea]=\"minHeightTextArea()\"\n [borderError]=\"borderError() || (!!singleError().message && !ignoreShowError())\"\n [iconLeftClass]=\"iconLeftClass()\"\n [popoverContentIconLeft]=\"popoverContentIconLeft()\"\n [popoverContentIconRight]=\"popoverContentIconRight()\"\n [iconRightClass]=\"iconRightClass()\"\n [zIndexPopoverContent]=\"zIndexPopoverContent()\"\n [emitEmptyInDataTypeNumber]=\"emitEmptyInDataTypeNumber()\"\n [ignoreBlockInputMaxValue]=\"!!ignoreBlockInputMaxValue() ? ignoreBlockInputMaxValue() : validMaxValue()?.message ? true : false\"\n [(value)]=\"value\"\n [classContainerInput]=\"classContainerInput()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n [resize]=\"resize()\"\n [classContainerBottomInput]=\"classContainerBottomInput()\"\n [templateLeftBottomInput]=\"templateLeftBottomInput()\"\n [templateRightBottomInput]=\"templateRightBottomInput()\"\n [maxLengthNumberCount]=\"maxLengthNumberCount()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [focusTimeOut]=\"focusTimeOut()\"\n (valueChange)=\"handlerValueChange($event)\"\n (outEnterEvent)=\"handlerEnterInput($event)\"\n (outIconLeft)=\"handlerEventIconLeft($event)\"\n (outIconRight)=\"handlerEventIconRight($event)\"\n (outHeightAreaChange)=\"handlerHeightAreaChange($event)\"\n (outFunctionsControl)=\"handlerControlFunctionInput($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlur($event)\"\n (outChangeValueByButtonUpDown)=\"handlerChangeValueByButtonUpDown()\" />\n }\n @if (!ignoreContentRight()) {\n <div\n class=\"libs-ui-input-valid-right\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @for (unit of unitsRight(); track unit) {\n <div\n class=\"libs-ui-input-valid-unit libs-ui-input-valid-unit-right !rounded-tl-none !rounded-bl-none libs-ui-font-h5r {{ configUnitRight().classInclude || 'libs-ui-border-general' }}\"\n [class.!flex]=\"unit[configUnitRight().fieldKey] === keySelectedUnitRight()\"\n [class.libs-ui-readonly]=\"!ignoreUnitRightClassReadOnly() && (readonly() || false)\">\n @let constHtmlLabel = unit[configUnitRight().fieldLabel || 'label'] || ' ';\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{ maxWidth: 250, direction: 'bottom', zIndex: zIndexPopoverContent() }\"\n [innerHtml]=\"constHtmlLabel | translate\" />\n </div>\n }\n <ng-content select=\".libs-ui-input-valid-right-content-custom\"></ng-content>\n </div>\n }\n </div>\n @if (!!singleError().message && !ignoreShowError()) {\n <div class=\"libs-ui-input-valid-error {{ classMessageErrorInclude() || '' }}\">\n @let constHtmlMessage = singleError().message || ' ';\n <span\n class=\"libs-ui-message-error libs-ui-font-h7r libs-ui-text-error\"\n [style.marginLeft.px]=\"rectLeft()?.width\"\n [innerHtml]=\"constHtmlMessage | translate: singleError().interpolateParams\"></span>\n </div>\n }\n}\n", styles: [":host{display:flex;flex-direction:column;width:100%}:host .libs-ui-input-valid{position:relative;display:flex;align-items:center}:host .libs-ui-input-valid .libs-ui-input-valid-unit{height:32px;max-width:200px;overflow:hidden;text-align:center;border-radius:4px;background-color:#e6e7ea;display:none;align-items:center;padding:0 8px;border:1px solid #e6e7ea}:host .libs-ui-input-valid .libs-ui-input-valid-unit .libs-ui-input-unit-left{border-bottom-left-radius:0;border-top-left-radius:0;border-left:none}:host .libs-ui-input-valid .libs-ui-input-valid-unit .libs-ui-input-unit-right{border-bottom-right-radius:0;border-top-right-radius:0;border-right:none}:host .libs-ui-input-valid .libs-ui-input-valid-left{display:flex;align-items:center;justify-content:flex-start}:host .libs-ui-input-valid .libs-ui-input-valid-right{display:flex;align-items:center;justify-content:flex-end}:host .libs-ui-input-valid-error{display:flex;align-items:center;margin-top:8px}\n"] }]
318
+ args: [{ selector: 'libs_ui-components-inputs-valid', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsInputsInputComponent, LibsUiComponentsLabelComponent, LibsUiComponentsCheckboxSingleComponent, LibsUiComponentsRadioSingleComponent, LibsUiComponentsPopoverComponent], template: "@if (fieldNameBind() && item(); as item) {\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"disable() || labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsRight]=\"disable() || labelConfig.disableButtonsRight\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"disable() || labelConfig.toggleDisable\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"value()?.length\"\n (outClickButton)=\"handlerClickButtonLabel($event)\"\n (outSwitchEvent)=\"handlerSwitchLabel($event)\"\n (outLabelRightClick)=\"handlerEventLabelRightLabel()\" />\n }\n <div\n [class]=\"'libs-ui-input-valid w-full ' + (classInclude() ?? '')\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @if (!ignoreContentLeft()) {\n <div\n #elementLeftRef\n class=\"libs-ui-input-valid-left\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @if (typeComponentSelectItem(); as typeComponentSelectItem) {\n <div class=\"mr-[8px]\">\n @if (typeComponentSelectItem === 'checkbox') {\n <libs_ui-components-checkbox-single\n [checked]=\"valueComponentSelectItem() || false\"\n [disable]=\"disable() || disableComponentSelectItem() || false\"\n (outChange)=\"handlerSelect($event.checked)\" />\n }\n @if (typeComponentSelectItem === 'radio') {\n <libs_ui-components-radio-single\n [active]=\"valueComponentSelectItem() || false\"\n [disable]=\"disable() || disableComponentSelectItem() || false\"\n (outChange)=\"handlerSelect($event.active)\" />\n }\n </div>\n }\n\n <ng-content select=\".libs-ui-input-valid-left-content-custom\" />\n @for (unit of unitsLeft(); track unit) {\n <div\n class=\"libs-ui-input-valid-unit libs-ui-input-valid-unit-left !rounded-tr-none !rounded-br-none libs-ui-font-h5r {{ configUnitLeft().classInclude || '' }}\"\n [class.!flex]=\"unit[configUnitLeft().fieldKey] === keySelectedUnitLeft()\"\n [class.libs-ui-readonly]=\"readonly() || false\"\n [class.libs-ui-disable]=\"disable() || false\">\n @let constHtmlLabel = unit[configUnitLeft().fieldLabel || 'label'] || ' ';\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{ maxWidth: 250, direction: 'bottom', zIndex: zIndexPopoverContent() }\"\n [innerHtml]=\"constHtmlLabel | translate\" />\n </div>\n }\n </div>\n }\n @if (calledEffect() === true) {\n <libs_ui-components-inputs-input\n [tagInput]=\"tagInput()\"\n [dataType]=\"dataType() || 'string'\"\n [typeInput]=\"typeInput()\"\n [modeInput]=\"modeInput()\"\n [class.w-full]=\"!ignoreWidthInput100()\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [textAreaEnterNotNewLine]=\"textAreaEnterNotNewLine() || false\"\n [classInclude]=\"(classIncludeInput() || '') + (unitsLeft() && unitsLeft()?.length ? ' !rounded-tl-none !rounded-bl-none' : '') + (unitsRight()?.length ? ' !rounded-tr-none !rounded-br-none' : '')\"\n [maxValueNumber]=\"maxValueNumber()\"\n [minValueNumber]=\"minValueNumber()\"\n [fixedFloat]=\"fixedFloat() ?? 1\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxLength]=\"maxLength()\"\n [showCount]=\"showCount()\"\n [readonly]=\"readonly()\"\n [disable]=\"disable()\"\n [autoAddZeroLessThan10InTypeInt]=\"autoAddZeroLessThan10InTypeInt()\"\n [noBorder]=\"noBorder()\"\n [backgroundNone]=\"backgroundNone()\"\n [useColorModeExist]=\"useColorModeExist()\"\n [placeholder]=\"placeholder() || ''\"\n [keepPlaceholderOnly]=\"keepPlaceholderOnly()\"\n [autoRemoveEmoji]=\"autoRemoveEmoji()\"\n [defaultHeight]=\"defaultHeight()\"\n [maxHeightTextArea]=\"maxHeightTextArea() || 250\"\n [minHeightTextArea]=\"minHeightTextArea()\"\n [borderError]=\"borderError() || (!!singleError().message && !ignoreShowError())\"\n [iconLeftClass]=\"iconLeftClass()\"\n [popoverContentIconLeft]=\"popoverContentIconLeft()\"\n [popoverContentIconRight]=\"popoverContentIconRight()\"\n [iconRightClass]=\"iconRightClass()\"\n [zIndexPopoverContent]=\"zIndexPopoverContent()\"\n [emitEmptyInDataTypeNumber]=\"emitEmptyInDataTypeNumber()\"\n [ignoreBlockInputMaxValue]=\"!!ignoreBlockInputMaxValue() ? ignoreBlockInputMaxValue() : validMaxValue()?.message ? true : false\"\n [(value)]=\"value\"\n [classContainerInput]=\"classContainerInput()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n [resize]=\"resize()\"\n [classContainerBottomInput]=\"classContainerBottomInput()\"\n [templateLeftBottomInput]=\"templateLeftBottomInput()\"\n [templateRightBottomInput]=\"templateRightBottomInput()\"\n [maxLengthNumberCount]=\"maxLengthNumberCount()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [focusTimeOut]=\"focusTimeOut()\"\n (valueChange)=\"handlerValueChange($event)\"\n (outEnterEvent)=\"handlerEnterInput($event)\"\n (outIconLeft)=\"handlerEventIconLeft($event)\"\n (outIconRight)=\"handlerEventIconRight($event)\"\n (outHeightAreaChange)=\"handlerHeightAreaChange($event)\"\n (outFunctionsControl)=\"handlerControlFunctionInput($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlur($event)\"\n (outChangeValueByButtonUpDown)=\"handlerChangeValueByButtonUpDown()\" />\n }\n @if (!ignoreContentRight()) {\n <div\n class=\"libs-ui-input-valid-right\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @for (unit of unitsRight(); track unit) {\n <div\n class=\"libs-ui-input-valid-unit libs-ui-input-valid-unit-right !rounded-tl-none !rounded-bl-none libs-ui-font-h5r {{ configUnitRight().classInclude || 'libs-ui-border-general' }}\"\n [class.!flex]=\"unit[configUnitRight().fieldKey] === keySelectedUnitRight()\"\n [class.libs-ui-readonly]=\"!ignoreUnitRightClassReadOnly() && (readonly() || false)\">\n @let constHtmlLabel = unit[configUnitRight().fieldLabel || 'label'] || ' ';\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{ maxWidth: 250, direction: 'bottom', zIndex: zIndexPopoverContent() }\"\n [innerHtml]=\"constHtmlLabel | translate\" />\n </div>\n }\n <ng-content select=\".libs-ui-input-valid-right-content-custom\"></ng-content>\n </div>\n }\n </div>\n @if (!!singleError().message && !ignoreShowError() && !ignoreShowMessageError()) {\n <div class=\"libs-ui-input-valid-error {{ classMessageErrorInclude() || '' }}\">\n @let constHtmlMessage = singleError().message || ' ';\n <span\n class=\"libs-ui-message-error libs-ui-font-h7r libs-ui-text-error\"\n [style.marginLeft.px]=\"rectLeft()?.width\"\n [innerHtml]=\"constHtmlMessage | translate: singleError().interpolateParams\"></span>\n </div>\n }\n}\n", styles: [":host{display:flex;flex-direction:column;width:100%}:host .libs-ui-input-valid{position:relative;display:flex;align-items:center}:host .libs-ui-input-valid .libs-ui-input-valid-unit{height:32px;max-width:200px;overflow:hidden;text-align:center;border-radius:4px;background-color:#e6e7ea;display:none;align-items:center;padding:0 8px;border:1px solid #e6e7ea}:host .libs-ui-input-valid .libs-ui-input-valid-unit .libs-ui-input-unit-left{border-bottom-left-radius:0;border-top-left-radius:0;border-left:none}:host .libs-ui-input-valid .libs-ui-input-valid-unit .libs-ui-input-unit-right{border-bottom-right-radius:0;border-top-right-radius:0;border-right:none}:host .libs-ui-input-valid .libs-ui-input-valid-left{display:flex;align-items:center;justify-content:flex-start}:host .libs-ui-input-valid .libs-ui-input-valid-right{display:flex;align-items:center;justify-content:flex-end}:host .libs-ui-input-valid-error{display:flex;align-items:center;margin-top:8px}\n"] }]
308
319
  }], ctorParameters: () => [] });
309
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy92YWxpZC9zcmMvdmFsaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy92YWxpZC9zcmMvdmFsaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQThDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzSyxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RixPQUFPLEVBQWtELG9DQUFvQyxFQUE2RixNQUFNLGtDQUFrQyxDQUFDO0FBQ25PLE9BQU8sRUFBVSw4QkFBOEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBR3hGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSx3QkFBd0IsRUFBRSx1QkFBdUIsRUFBRSx3QkFBd0IsRUFBRSx1QkFBdUIsRUFBRSwwQkFBMEIsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hPLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBWXRELE1BQU0sT0FBTyxvQ0FBb0M7SUFDL0MsbUJBQW1CO0lBQ1QsS0FBSyxHQUFHLE1BQU0sQ0FBTSxJQUFJLENBQUMsQ0FBQztJQUMxQixXQUFXLEdBQUcsTUFBTSxDQUFvQixFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUM5RixRQUFRLEdBQUcsTUFBTSxDQUFrQyxTQUFTLENBQUMsQ0FBQztJQUM5RCxZQUFZLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLEtBQUssR0FBRyxNQUFNLENBQVMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsZ0JBQWdCLEdBQUcsTUFBTSxDQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLG9CQUFvQixDQUF5QztJQUVyRSxnQkFBZ0I7SUFDUCxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBc0IsRUFBRSxDQUFDLENBQUM7SUFDL0MsV0FBVyxHQUFHLEtBQUssRUFBVSxDQUFDO0lBQzlCLHlCQUF5QixHQUFHLEtBQUssRUFBVyxDQUFDO0lBQzdDLHdCQUF3QixHQUFHLEtBQUssRUFBVyxDQUFDO0lBQzVDLGFBQWEsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFVLENBQUM7SUFDekMsU0FBUyxHQUFHLEtBQUssRUFBVyxDQUFDO0lBRTdCLHVCQUF1QixHQUFHLEtBQUssRUFBb0MsQ0FBQztJQUNwRSx3QkFBd0IsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUM1QywwQkFBMEIsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUU5QyxRQUFRLEdBQUcsS0FBSyxFQUFrQixDQUFDO0lBQ25DLFFBQVEsR0FBRyxLQUFLLEVBQXdCLENBQUM7SUFDekMsU0FBUyxHQUFHLEtBQUssRUFBYyxDQUFDO0lBQ2hDLFNBQVMsR0FBRyxLQUFLLEVBQW1CLENBQUM7SUFDckMseUJBQXlCLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDN0MsdUJBQXVCLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDM0MsVUFBVSxHQUFHLEtBQUssRUFBVSxDQUFDO0lBQzdCLG1CQUFtQixHQUFHLEtBQUssRUFBVyxDQUFDO0lBQ3ZDLGlCQUFpQixHQUFHLEtBQUssRUFBc0IsQ0FBQztJQUNoRCxtQkFBbUIsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUN2QyxpQkFBaUIsR0FBRyxLQUFLLEVBQVUsQ0FBQztJQUNwQyxtQkFBbUIsR0FBRyxLQUFLLEVBQVUsQ0FBQztJQUN0QyxRQUFRLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDNUIsT0FBTyxHQUFHLEtBQUssRUFBVyxDQUFDO0lBQzNCLFFBQVEsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUM1QixjQUFjLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDbEMsaUJBQWlCLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDckMsV0FBVyxHQUFHLEtBQUssRUFBVSxDQUFDO0lBQzlCLG1CQUFtQixHQUFHLEtBQUssRUFBVyxDQUFDO0lBRXZDLHlCQUF5QixHQUFHLEtBQUssRUFBVSxDQUFDO0lBQzVDLGVBQWUsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUNuQyxhQUFhLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDaEMsaUJBQWlCLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDcEMsaUJBQWlCLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDcEMsZUFBZSxHQUFHLEtBQUssRUFBVyxDQUFDO0lBQ25DLFdBQVcsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUUvQixhQUFhLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDaEMsc0JBQXNCLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDekMsY0FBYyxHQUFHLEtBQUssRUFBVSxDQUFDO0lBQ2pDLHVCQUF1QixHQUFHLEtBQUssRUFBVSxDQUFDO0lBQzFDLG9CQUFvQixHQUFHLEtBQUssRUFBVSxDQUFDO0lBRXZDLFNBQVMsR0FBRyxLQUFLLEVBQWMsQ0FBQztJQUNoQyxjQUFjLEdBQUcsS0FBSyxDQUF3QjtRQUNyRCxRQUFRLEVBQUUsSUFBSTtRQUNkLFVBQVUsRUFBRSxPQUFPO0tBQ3BCLENBQUMsQ0FBQztJQUNNLG1CQUFtQixHQUFHLEtBQUssRUFBTyxDQUFDO0lBRW5DLFVBQVUsR0FBRyxLQUFLLEVBQWMsQ0FBQztJQUNqQyxlQUFlLEdBQUcsS0FBSyxDQUM5QjtRQUNFLFFBQVEsRUFBRSxJQUFJO1FBQ2QsVUFBVSxFQUFFLE9BQU87S0FDcEIsRUFDRDtRQUNFLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ25CLEtBQUssSUFBSTtZQUNQLFFBQVEsRUFBRSxJQUFJO1lBQ2QsVUFBVSxFQUFFLE9BQU87U0FDcEI7S0FDSixDQUNGLENBQUM7SUFDTyxvQkFBb0IsR0FBRyxLQUFLLEVBQU8sQ0FBQztJQUVwQyxjQUFjLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDakMsY0FBYyxHQUFHLEtBQUssRUFBVSxDQUFDO0lBRWpDLGlCQUFpQixHQUFHLEtBQUssRUFBVyxDQUFDO0lBQ3JDLGtCQUFrQixHQUFHLEtBQUssRUFBVyxDQUFDO0lBQ3RDLGVBQWUsR0FBRyxLQUFLLEVBQVcsQ0FBQyxDQUFDLGlIQUFpSDtJQUVySixxQkFBcUIsR0FBRyxLQUFLLENBQStCLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxpRUFBaUU7SUFDL0ssWUFBWSxHQUFHLEtBQUssRUFBd0IsQ0FBQztJQUM3QyxhQUFhLEdBQUcsS0FBSyxFQUFrQixDQUFDO0lBQ3hDLGNBQWMsR0FBRyxLQUFLLEVBQWdCLENBQUM7SUFDdkMsYUFBYSxHQUFHLEtBQUssRUFBcUIsQ0FBQztJQUMzQyxhQUFhLEdBQUcsS0FBSyxFQUFxQixDQUFDO0lBQzNDLGNBQWMsR0FBRyxLQUFLLEVBQXFCLENBQUM7SUFDNUMsYUFBYSxHQUFHLEtBQUssRUFBNkIsQ0FBQztJQUNuRCxTQUFTLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDNUIsOEJBQThCLEdBQUcsS0FBSyxFQUFXLENBQUMsQ0FBQyxvSEFBb0g7SUFDdkssWUFBWSxHQUFHLEtBQUssRUFBVSxDQUFDO0lBQy9CLE1BQU0sR0FBRyxLQUFLLEVBQTBCLENBQUM7SUFDekMsdUJBQXVCLEdBQUcsS0FBSyxFQUFrQyxDQUFDO0lBQ2xFLHdCQUF3QixHQUFHLEtBQUssRUFBa0MsQ0FBQztJQUNuRSx1QkFBdUIsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUMzQyw4QkFBOEIsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUNsRCxvQkFBb0IsR0FBRyxLQUFLLEVBQVUsQ0FBQztJQUN2Qyx3QkFBd0IsR0FBRyxLQUFLLEVBQVUsQ0FBQztJQUMzQywwQkFBMEIsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUM5Qyw0QkFBNEIsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUNoRCwwQkFBMEIsR0FBRyxLQUFLLEVBQVUsQ0FBQyxDQUFDLDZDQUE2QztJQUMzRixZQUFZLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDL0Isb0JBQW9CLEdBQUcsS0FBSyxDQUE2QixDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRTNHLGlCQUFpQjtJQUNSLGNBQWMsR0FBRyxNQUFNLEVBQU8sQ0FBQztJQUMvQixTQUFTLEdBQUcsTUFBTSxFQUFXLENBQUM7SUFDOUIsV0FBVyxHQUFHLE1BQU0sRUFBVSxDQUFDO0lBQy9CLFlBQVksR0FBRyxNQUFNLEVBQVUsQ0FBQztJQUNoQyxtQkFBbUIsR0FBRyxNQUFNLEVBQVcsQ0FBQztJQUN4QyxtQkFBbUIsR0FBRyxNQUFNLEVBQWdCLENBQUM7SUFDN0Msa0JBQWtCLEdBQUcsTUFBTSxFQUFXLENBQUM7SUFDdkMsa0JBQWtCLEdBQUcsTUFBTSxFQUFVLENBQUM7SUFDdEMsbUJBQW1CLEdBQUcsTUFBTSxFQUF5QixDQUFDO0lBQ3RELG1CQUFtQixHQUFHLE1BQU0sRUFBbUMsQ0FBQztJQUNoRSxlQUFlLEdBQUcsTUFBTSxFQUFzQixDQUFDO0lBQy9DLDRCQUE0QixHQUFHLE1BQU0sRUFBUSxDQUFDO0lBRXZELGdCQUFnQjtJQUNQLGNBQWMsR0FBRyxTQUFTLENBQWEsZ0JBQWdCLENBQUMsQ0FBQztJQUVsRTtRQUNFLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsWUFBWSxLQUFLLElBQUksQ0FBQyxRQUFRLFlBQVksR0FBRyxJQUFJLFFBQVEsWUFBWSxPQUFPLENBQUMsSUFBSSxRQUFRLFlBQVksR0FBRyxJQUFJLFFBQVEsWUFBWSxPQUFPLEVBQUUsQ0FBQztnQkFDak0sT0FBTztZQUNULENBQUM7WUFDRCxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDdEMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDYixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixDQUFDLENBQUMsQ0FBQztZQUNILG1CQUFtQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxlQUFlO0lBQ2YsSUFBVyxnQkFBZ0I7UUFDekIsT0FBTztZQUNMLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDMUMsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNoRCxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUU7WUFDekQsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFO1lBQzNELGFBQWEsRUFBRSxLQUFLLEVBQUUsSUFBcUIsRUFBRSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQztZQUNwRyxVQUFVLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLEVBQUU7WUFDckUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDeEQsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNoRCwyQkFBMkIsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSwyQkFBMkIsQ0FBQyxLQUFLLENBQUM7WUFDakgsZ0JBQWdCLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBRTtTQUNsRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUI7UUFDL0IsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNuRCxDQUFDO0lBRU8sZUFBZTtRQUNyQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRVMsYUFBYSxDQUFDLEtBQWM7UUFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUNTLGtCQUFrQixDQUFDLEtBQXNCO1FBQ2pELEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTlDLDRIQUE0SDtRQUM1SCxZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUN2QixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxDQUFDLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FDaEMsQ0FBQztJQUNKLENBQUM7SUFFUyxvQkFBb0IsQ0FBQyxTQUFpQjtRQUM5QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRVMscUJBQXFCLENBQUMsU0FBaUI7UUFDL0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVTLHVCQUF1QixDQUFDLE1BQWU7UUFDL0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRVMsa0JBQWtCLENBQUMsV0FBeUI7UUFDcEQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRVMsMkJBQTJCO1FBQ25DLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVTLGlCQUFpQixDQUFDLENBQVM7UUFDbkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRVMsdUJBQXVCLENBQUMsS0FBNEI7UUFDNUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFzQjtRQUMzQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxVQUFVLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5SixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsT0FBTyxJQUFJLHlCQUF5QixFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxpQkFBaUIsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRWhLLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZILElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxPQUFPLElBQUksd0JBQXdCLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLGlCQUFpQixJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFakssT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDN0csS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ25CLFNBQVM7Z0JBQ1gsQ0FBQztnQkFDRCxNQUFNLE9BQU8sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFOUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUNsQixTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ3RELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRXhFLElBQUksSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQ3RILElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksMEJBQTBCLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ2pJLE9BQU87Z0JBQ1QsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLFFBQVEsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUNqSyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsT0FBTyxJQUFJLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxpQkFBaUIsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUwsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsS0FBSyxRQUFRLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDL00sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLE9BQU8sSUFBSSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsaUJBQWlCLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVMLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlELE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0UsTUFBTSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQzVELFlBQVksSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0IsQ0FBQztZQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztZQUV2RixJQUFJLFlBQVksR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztvQkFDbkIsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxPQUFPLElBQUksdUJBQXVCO29CQUNqRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsaUJBQWlCLElBQUksRUFBRSxLQUFLLEVBQUUsd0JBQXdCLENBQUMsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7aUJBQzFKLENBQUMsQ0FBQztnQkFDSCxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksWUFBWSxHQUFHLFdBQVcsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztvQkFDbkIsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxPQUFPLElBQUksdUJBQXVCO29CQUNqRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsaUJBQWlCLElBQUksRUFBRSxLQUFLLEVBQUUsd0JBQXdCLENBQUMsR0FBRyxXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7aUJBQ3pKLENBQUMsQ0FBQztnQkFDSCxPQUFPO1lBQ1QsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoSCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsT0FBTyxJQUFJLHdCQUF3QixFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxpQkFBaUIsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFM0wsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7WUFDMUIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBUSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVsRCxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsQ0FBQztZQUVuQyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWTtRQUN4QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTFELE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbkQsQ0FBQztJQUVPLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBZTtRQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRVMsMkJBQTJCLENBQUMsS0FBaUM7UUFDckUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztJQUNwQyxDQUFDO0lBRVMsbUJBQW1CLENBQUMsS0FBeUI7UUFDckQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsOEJBQThCLEVBQUUsRUFBRSxDQUFDO1lBQzlELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUNaLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7WUFDbEYsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRVMsZ0NBQWdDO1FBQ3hDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsV0FBVztRQUNULFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMzQixZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDO3dHQTVWVSxvQ0FBb0M7NEZBQXBDLG9DQUFvQyw4NFhDdkJqRCxtd1FBK0pBLDQvQkQxSVksZUFBZSw0RkFBRSxvQ0FBb0Msd2hEQUFFLDhCQUE4Qiw0cUJBQUUsdUNBQXVDLDBwQkFBRSxvQ0FBb0MsMmhCQUFFLGdDQUFnQzs7NEZBRXJNLG9DQUFvQztrQkFUaEQsU0FBUzsrQkFFRSxpQ0FBaUMsY0FHL0IsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsZUFBZSxFQUFFLG9DQUFvQyxFQUFFLDhCQUE4QixFQUFFLHVDQUF1QyxFQUFFLG9DQUFvQyxFQUFFLGdDQUFnQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgT25EZXN0cm95LCBPbkluaXQsIFRlbXBsYXRlUmVmLCBlZmZlY3QsIGlucHV0LCBtb2RlbCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJQnV0dG9uIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQ2hlY2tib3hTaW5nbGVDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZSc7XG5pbXBvcnQgeyBJRm9jdXNBbmRCbHVyRXZlbnQsIElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBMaWJzVWlDb21wb25lbnRzSW5wdXRzSW5wdXRDb21wb25lbnQsIFRZUEVfREFUQV9UWVBFX0lOUFVULCBUWVBFX0lOUFVULCBUWVBFX0lOUFVUX1JFU0laRV9NT0RFLCBUWVBFX01PREVfSU5QVVQsIFRZUEVfVEFHX0lOUFVUIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtaW5wdXQnO1xuaW1wb3J0IHsgSUxhYmVsLCBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxhYmVsJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNSYWRpb1NpbmdsZUNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcmFkaW8tc2luZ2xlJztcbmltcG9ydCB7IElTd2l0Y2hFdmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc3dpdGNoJztcbmltcG9ydCB7IElCb3VuZGluZ0NsaWVudFJlY3QsIElFdmVudCwgSU1lc3NhZ2VUcmFuc2xhdGUsIFRZUEVfVEVNUExBVEVfUkVGIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElELCBFUlJPUl9NRVNTQUdFX01BWF9MRU5HVEgsIEVSUk9SX01FU1NBR0VfTUFYX1ZBTElELCBFUlJPUl9NRVNTQUdFX01JTl9MRU5HVEgsIEVSUk9SX01FU1NBR0VfTUlOX1ZBTElELCBFUlJPUl9NRVNTQUdFX1BBVFRFTl9WQUxJRCwgZ2V0LCBpc05pbCwgc2V0LCB2aWV3RGF0YU51bWJlckJ5TGFuZ3VhZ2UgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IElJbnB1dFZhbGlkRnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tICcuL2ludGVyZmFjZXMvZnVuY3Rpb24tY29udHJvbC1ldmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUlucHV0VmFsaWRVbml0Q29uZmlnLCBJVmFsaWRMZW5ndGgsIElWYWxpZFBhdHRlcm4sIElWYWxpZFJlcXVpcmVkLCBUWVBFX0ZVTkNUSU9OX0lOUFVUX1ZBTElEIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3ZhbGlkLmludGVyZmFjZSc7XG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXZhbGlkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZhbGlkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdmFsaWQuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtUcmFuc2xhdGVNb2R1bGUsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNJbnB1dENvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzQ2hlY2tib3hTaW5nbGVDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNSYWRpb1NpbmdsZUNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJvdGVjdGVkIHZhbHVlID0gc2lnbmFsPGFueT4obnVsbCk7XG4gIHByb3RlY3RlZCBzaW5nbGVFcnJvciA9IHNpZ25hbDxJTWVzc2FnZVRyYW5zbGF0ZT4oeyBtZXNzYWdlOiB1bmRlZmluZWQsIGludGVycG9sYXRlUGFyYW1zOiB1bmRlZmluZWQgfSk7XG4gIHByb3RlY3RlZCByZWN0TGVmdCA9IHNpZ25hbDxJQm91bmRpbmdDbGllbnRSZWN0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgY2FsbGVkRWZmZWN0ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSB0aW1lciA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcml2YXRlIHRpbWVyVmFsdWVDaGFuZ2UgPSBzaWduYWw8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSBmdW5jdGlvbkNvbnRyb2xJbnB1dDogSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQ7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICByZWFkb25seSBpdGVtID0gbW9kZWwucmVxdWlyZWQ8UmVjb3JkPHN0cmluZywgYW55Pj4oe30pO1xuICByZWFkb25seSBsYWJlbENvbmZpZyA9IGlucHV0PElMYWJlbD4oKTtcbiAgcmVhZG9ubHkgZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUJsb2NrSW5wdXRNYXhWYWx1ZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGZpZWxkTmFtZUJpbmQgPSBpbnB1dC5yZXF1aXJlZDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IHNob3dDb3VudCA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgcmVhZG9ubHkgdHlwZUNvbXBvbmVudFNlbGVjdEl0ZW0gPSBpbnB1dDwncmFkaW8nIHwgJ2NoZWNrYm94JyB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgdmFsdWVDb21wb25lbnRTZWxlY3RJdGVtID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZGlzYWJsZUNvbXBvbmVudFNlbGVjdEl0ZW0gPSBpbnB1dDxib29sZWFuPigpO1xuXG4gIHJlYWRvbmx5IHRhZ0lucHV0ID0gaW5wdXQ8VFlQRV9UQUdfSU5QVVQ+KCk7XG4gIHJlYWRvbmx5IGRhdGFUeXBlID0gaW5wdXQ8VFlQRV9EQVRBX1RZUEVfSU5QVVQ+KCk7XG4gIHJlYWRvbmx5IHR5cGVJbnB1dCA9IGlucHV0PFRZUEVfSU5QVVQ+KCk7XG4gIHJlYWRvbmx5IG1vZGVJbnB1dCA9IGlucHV0PFRZUEVfTU9ERV9JTlBVVD4oKTtcbiAgcmVhZG9ubHkgcmVzZXRBdXRvQ29tcGxldGVQYXNzd29yZCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHRleHRBcmVhRW50ZXJOb3ROZXdMaW5lID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZml4ZWRGbG9hdCA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgYWNjZXB0TmVnYXRpdmVWYWx1ZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHZhbHVlVXBEb3duTnVtYmVyID0gaW5wdXQ8bnVtYmVyIHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBpZ25vcmVXaWR0aElucHV0MTAwID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlSW5wdXQgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGNsYXNzQ29udGFpbmVySW5wdXQgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IHJlYWRvbmx5ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZGlzYWJsZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG5vQm9yZGVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgYmFja2dyb3VuZE5vbmUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB1c2VDb2xvck1vZGVFeGlzdCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBrZWVwUGxhY2Vob2xkZXJPbmx5ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICByZWFkb25seSBjbGFzc0NvbnRhaW5lckJvdHRvbUlucHV0ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBhdXRvUmVtb3ZlRW1vamkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBkZWZhdWx0SGVpZ2h0ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBtYXhIZWlnaHRUZXh0QXJlYSA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgbWluSGVpZ2h0VGV4dEFyZWEgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZVNob3dFcnJvciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGJvcmRlckVycm9yID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICByZWFkb25seSBpY29uTGVmdENsYXNzID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBwb3BvdmVyQ29udGVudEljb25MZWZ0ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpY29uUmlnaHRDbGFzcyA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgcG9wb3ZlckNvbnRlbnRJY29uUmlnaHQgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IHpJbmRleFBvcG92ZXJDb250ZW50ID0gaW5wdXQ8bnVtYmVyPigpO1xuXG4gIHJlYWRvbmx5IHVuaXRzTGVmdCA9IGlucHV0PEFycmF5PGFueT4+KCk7XG4gIHJlYWRvbmx5IGNvbmZpZ1VuaXRMZWZ0ID0gaW5wdXQ8SUlucHV0VmFsaWRVbml0Q29uZmlnPih7XG4gICAgZmllbGRLZXk6ICdpZCcsXG4gICAgZmllbGRMYWJlbDogJ2xhYmVsJyxcbiAgfSk7XG4gIHJlYWRvbmx5IGtleVNlbGVjdGVkVW5pdExlZnQgPSBpbnB1dDxhbnk+KCk7XG5cbiAgcmVhZG9ubHkgdW5pdHNSaWdodCA9IGlucHV0PEFycmF5PGFueT4+KCk7XG4gIHJlYWRvbmx5IGNvbmZpZ1VuaXRSaWdodCA9IGlucHV0PElJbnB1dFZhbGlkVW5pdENvbmZpZywgSUlucHV0VmFsaWRVbml0Q29uZmlnIHwgdW5kZWZpbmVkPihcbiAgICB7XG4gICAgICBmaWVsZEtleTogJ2lkJyxcbiAgICAgIGZpZWxkTGFiZWw6ICdsYWJlbCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB0cmFuc2Zvcm06ICh2YWx1ZSkgPT5cbiAgICAgICAgdmFsdWUgPz8ge1xuICAgICAgICAgIGZpZWxkS2V5OiAnaWQnLFxuICAgICAgICAgIGZpZWxkTGFiZWw6ICdsYWJlbCcsXG4gICAgICAgIH0sXG4gICAgfVxuICApO1xuICByZWFkb25seSBrZXlTZWxlY3RlZFVuaXRSaWdodCA9IGlucHV0PGFueT4oKTtcblxuICByZWFkb25seSBtYXhWYWx1ZU51bWJlciA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgbWluVmFsdWVOdW1iZXIgPSBpbnB1dDxudW1iZXI+KCk7XG5cbiAgcmVhZG9ubHkgaWdub3JlQ29udGVudExlZnQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVDb250ZW50UmlnaHQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpc0Jhc2VsaW5lU3R5bGUgPSBpbnB1dDxib29sZWFuPigpOyAvLyBhbGlnbi1pdGVtcy1iYXNlbGluZSBkw7luZyBraGkgY8SDbiBpbnB1dCB0aOG6s25nIGjDoG5nIHbhu5tpIHThuqV0IGPhuqMgY8OhYyBwaOG6p24ga2jDoWMgZMO5IGPDsyB2YWxpZGF0ZSBoYXkgYuG6pXQgY+G7qSAxIGPDoWkgZ8OsXG5cbiAgcmVhZG9ubHkgdmFsdWVQYXR0ZXJuU2hvd0Vycm9yID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IGZhbHNlIH0pOyAvLyBt4bq3YyDEkeG7i25oIGtoaSB0ZXN0IHBhdHRlcm4gdHLhuqMgduG7gSBnacOhIHRy4buLIGLhurFuZyBmYWxzZSBz4bq9IGLDoW8gbOG7l2lcbiAgcmVhZG9ubHkgdmFsaWRQYXR0ZXJuID0gaW5wdXQ8QXJyYXk8SVZhbGlkUGF0dGVybj4+KCk7XG4gIHJlYWRvbmx5IHZhbGlkUmVxdWlyZWQgPSBpbnB1dDxJVmFsaWRSZXF1aXJlZD4oKTtcbiAgcmVhZG9ubHkgdmFsaWRNaW5MZW5ndGggPSBpbnB1dDxJVmFsaWRMZW5ndGg+KCk7XG4gIHJlYWRvbmx5IHZhbGlkTWluVmFsdWUgPSBpbnB1dDxJTWVzc2FnZVRyYW5zbGF0ZT4oKTtcbiAgcmVhZG9ubHkgdmFsaWRNYXhWYWx1ZSA9IGlucHV0PElNZXNzYWdlVHJhbnNsYXRlPigpO1xuICByZWFkb25seSB2YWxpZE1heExlbmd0aCA9IGlucHV0PElNZXNzYWdlVHJhbnNsYXRlPigpO1xuICByZWFkb25seSBmdW5jdGlvblZhbGlkID0gaW5wdXQ8VFlQRV9GVU5DVElPTl9JTlBVVF9WQUxJRD4oKTtcbiAgcmVhZG9ubHkgbWF4TGVuZ3RoID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBwb3NpdGlvbk1lc3NhZ2VFcnJvclN0YXJ0SW5wdXQgPSBpbnB1dDxib29sZWFuPigpOyAvLyBraGkgY8OzIHRlbXBsYXRlIGxlZnQgdsOgIHJpZ2h0IG3DoCBtdeG7kW4gbWVzYWdlIGVycm9yIHh14bqldCBoaeG7h24gYuG6r3QgxJHhuqd1IHThu6sgw7QgaW5wdXQgdGhheSB2w6wgYuG6r3QgxJHhuqd1IHThu6sgdGVtcGxhdGUgIHRyw6FpXG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgcmVzaXplID0gaW5wdXQ8VFlQRV9JTlBVVF9SRVNJWkVfTU9ERT4oKTtcbiAgcmVhZG9ubHkgdGVtcGxhdGVMZWZ0Qm90dG9tSW5wdXQgPSBpbnB1dDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4+KCk7XG4gIHJlYWRvbmx5IHRlbXBsYXRlUmlnaHRCb3R0b21JbnB1dCA9IGlucHV0PFRlbXBsYXRlUmVmPFRZUEVfVEVNUExBVEVfUkVGPj4oKTtcbiAgcmVhZG9ubHkgb25seUFjY2VwdE5lZ2F0aXZlVmFsdWUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBhdXRvQWRkWmVyb0xlc3NUaGFuMTBJblR5cGVJbnQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBtYXhMZW5ndGhOdW1iZXJDb3VudCA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NNZXNzYWdlRXJyb3JJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZVVuaXRSaWdodENsYXNzUmVhZE9ubHkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBwYWRkaW5nUmlnaHRDdXN0b21TcGVjaWZpYyA9IGlucHV0PG51bWJlcj4oKTsgLy8gZml4IHBhZGRpbmdSaWdodCBjb3VudCBrbyBhdXRvIHTDrW5oICM1MjE4NVxuICByZWFkb25seSBmb2N1c1RpbWVPdXQgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGRlYm91bmNlVGltZVZhbGlkYXRlID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDAsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IDAgfSk7XG5cbiAgLy8gI3JlZ2lvbiBPVVRQVVRcbiAgcmVhZG9ubHkgb3V0VmFsdWVDaGFuZ2UgPSBvdXRwdXQ8YW55PigpO1xuICByZWFkb25seSBvdXRTZWxlY3QgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0SWNvbkxlZnQgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBvdXRJY29uUmlnaHQgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBvdXRDbGlja0J1dHRvbkxhYmVsID0gb3V0cHV0PElCdXR0b24+KCk7XG4gIHJlYWRvbmx5IG91dFN3aXRjaEV2ZW50TGFiZWwgPSBvdXRwdXQ8SVN3aXRjaEV2ZW50PigpO1xuICByZWFkb25seSBvdXRMYWJlbFJpZ2h0Q2xpY2sgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0RW50ZXJJbnB1dEV2ZW50ID0gb3V0cHV0PElFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0SGVpZ2h0QXJlYUNoYW5nZSA9IG91dHB1dDx7IGlzQ2hhbmdlOiBib29sZWFuIH0+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SUlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0Rm9jdXNBbmRCbHVyID0gb3V0cHV0PElGb2N1c0FuZEJsdXJFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlVmFsdWVCeUJ1dHRvblVwRG93biA9IG91dHB1dDx2b2lkPigpO1xuXG4gIC8qIFZJRVcgQ0hJTEQgKi9cbiAgcmVhZG9ubHkgZWxlbWVudExlZnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2VsZW1lbnRMZWZ0UmVmJyk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFJdGVtID0gZ2V0KHRoaXMuaXRlbSgpLCAnJyk7XG4gICAgICBpZiAoIWRhdGFJdGVtIHx8IHR5cGVvZiBkYXRhSXRlbSAhPT0gJ29iamVjdCcgfHwgZGF0YUl0ZW0gaW5zdGFuY2VvZiBBcnJheSB8fCAoZGF0YUl0ZW0gaW5zdGFuY2VvZiBNYXAgJiYgZGF0YUl0ZW0gaW5zdGFuY2VvZiBXZWFrTWFwKSB8fCBkYXRhSXRlbSBpbnN0YW5jZW9mIFNldCB8fCBkYXRhSXRlbSBpbnN0YW5jZW9mIFdlYWtTZXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQoZ2V0KHRoaXMuaXRlbSgpLCB0aGlzLmZpZWxkTmFtZUJpbmQoKSkpO1xuICAgICAgICB0aGlzLmdldFJlY3RMZWZ0KCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGVmZmVjdENsZWFyVXBFZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5jYWxsZWRFZmZlY3Quc2V0KHRydWUpO1xuICAgICAgfSk7XG4gICAgICBlZmZlY3RDbGVhclVwRWZmZWN0LmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KHRoaXMuRnVuY3Rpb25zQ29udHJvbCk7XG4gIH1cblxuICAvKiBGVU5DVElPTlMgKi9cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElJbnB1dFZhbGlkRnVuY3Rpb25Db250cm9sRXZlbnQge1xuICAgIHJldHVybiB7XG4gICAgICBjaGVja0lzVmFsaWQ6IHRoaXMuY2hlY2tJc1ZhbGlkLmJpbmQodGhpcyksXG4gICAgICBzZXRNZXNzYWdlRXJyb3I6IHRoaXMuc2V0TWVzc2FnZUVycm9yLmJpbmQodGhpcyksXG4gICAgICBibHVyOiBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmZ1bmN0aW9uQ29udHJvbElucHV0Py5ibHVyKCksXG4gICAgICBmb2N1czogYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5mdW5jdGlvbkNvbnRyb2xJbnB1dD8uZm9jdXMoKSxcbiAgICAgIGluc2VydENvbnRlbnQ6IGFzeW5jIChkYXRhOiBzdHJpbmcgfCBudW1iZXIpID0+IGF3YWl0IHRoaXMuZnVuY3Rpb25Db250cm9sSW5wdXQ/Lmluc2VydENvbnRlbnQoZGF0YSksXG4gICAgICByZXNldFZhbHVlOiBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmZ1bmN0aW9uQ29udHJvbElucHV0Py5yZXNldFZhbHVlKCksXG4gICAgICBjdXJyZW50U3RhdGVJc1ZhbGlkOiB0aGlzLmN1cnJlbnRTdGF0ZUlzVmFsaWQuYmluZCh0aGlzKSxcbiAgICAgIGdldEVsZW1lbnRWYWx1ZTogdGhpcy5nZXRFbGVtZW50VmFsdWUuYmluZCh0aGlzKSxcbiAgICAgIGNoZWNrQW5kRGlzYWJsZVVwRG93bkJ1dHRvbjogYXN5bmMgKHZhbHVlKSA9PiBhd2FpdCB0aGlzLmZ1bmN0aW9uQ29udHJvbElucHV0Py5jaGVja0FuZERpc2FibGVVcERvd25CdXR0b24odmFsdWUpLFxuICAgICAgc2VsZWN0QWxsQ29udGVudDogYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5mdW5jdGlvbkNvbnRyb2xJbnB1dD8uc2VsZWN0QWxsQ29udGVudCgpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGN1cnJlbnRTdGF0ZUlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2luZ2xlRXJyb3IoKS5tZXNzYWdlID8gZmFsc2UgOiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbGVtZW50VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25Db250cm9sSW5wdXQ/LmdldEVsZW1lbnRWYWx1ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3QodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm91dFNlbGVjdC5lbWl0KHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFuZGxlclZhbHVlQ2hhbmdlKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICBzZXQodGhpcy5pdGVtKCksIHRoaXMuZmllbGROYW1lQmluZCgpLCB2YWx1ZSk7XG5cbiAgICAvLyBTdXBwb3J0IHRyxrDhu51uZyBo4bujcCBjYWxsIEFQSSBob+G6t2MgdmFsaWRhdGUgY+G6p24geOG7rSBsw70gY2hlY2sgdOG7kW4gbmhp4buBdSB0aOG7nWkgZ2lhbiB0aMOsIGPhuqduIGRlYm91bmQgdGltZSDEkeG7gyB0csOhbmggY2FsbCBsacOqbiB04bulY1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyVmFsdWVDaGFuZ2UoKSk7XG4gICAgdGhpcy50aW1lclZhbHVlQ2hhbmdlLnNldChcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnZhbGlkYXRlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5vdXRWYWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgIH0sIHRoaXMuZGVib3VuY2VUaW1lVmFsaWRhdGUoKSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJFdmVudEljb25MZWZ0KGV2ZW50TmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vdXRJY29uTGVmdC5lbWl0KGV2ZW50TmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckV2ZW50SWNvblJpZ2h0KGV2ZW50TmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vdXRJY29uUmlnaHQuZW1pdChldmVudE5hbWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0J1dHRvbkxhYmVsKGJ1dHRvbjogSUJ1dHRvbikge1xuICAgIHRoaXMub3V0Q2xpY2tCdXR0b25MYWJlbC5lbWl0KGJ1dHRvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclN3aXRjaExhYmVsKHRvZ2dsZUV2ZW50OiBJU3dpdGNoRXZlbnQpIHtcbiAgICB0aGlzLm91dFN3aXRjaEV2ZW50TGFiZWwuZW1pdCh0b2dnbGVFdmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckV2ZW50TGFiZWxSaWdodExhYmVsKCkge1xuICAgIHRoaXMub3V0TGFiZWxSaWdodENsaWNrLmVtaXQodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckVudGVySW5wdXQoZTogSUV2ZW50KSB7XG4gICAgdGhpcy5vdXRFbnRlcklucHV0RXZlbnQuZW1pdChlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVySGVpZ2h0QXJlYUNoYW5nZShldmVudDogeyBpc0NoYW5nZTogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy5vdXRIZWlnaHRBcmVhQ2hhbmdlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgdGhpcy5nZXRSZWN0TGVmdCgpO1xuICAgIHRoaXMuc2luZ2xlRXJyb3IudXBkYXRlKChvYmopID0+ICh7IC4uLm9iaiwgbWVzc2FnZTogdW5kZWZpbmVkIH0pKTtcbiAgICBpZiAodGhpcy52YWxpZFJlcXVpcmVkKCkgJiYgdGhpcy52YWxpZFJlcXVpcmVkKCk/LmlzUmVxdWlyZWQgJiYgKCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICF2YWx1ZS50cmltKCkpIHx8ICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICYmIGlzTmlsKHZhbHVlKSkpKSB7XG4gICAgICB0aGlzLnNpbmdsZUVycm9yLnNldCh7IG1lc3NhZ2U6IHRoaXMudmFsaWRSZXF1aXJlZCgpPy5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQsIGludGVycG9sYXRlUGFyYW1zOiB0aGlzLnZhbGlkUmVxdWlyZWQoKT8uaW50ZXJwb2xhdGVQYXJhbXMgfHwge30gfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdGhpcy52YWxpZE1pbkxlbmd0aCgpPy5tZXNzYWdlICYmICh0aGlzLnZhbGlkTWluTGVuZ3RoKCk/Lmxlbmd0aCB8fCAwKSA+IHZhbHVlLmxlbmd0aCkge1xuICAgICAgdGhpcy5zaW5nbGVFcnJvci5zZXQoeyBtZXNzYWdlOiB0aGlzLnZhbGlkTWluTGVuZ3RoKCk/Lm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9NSU5fTEVOR1RILCBpbnRlcnBvbGF0ZVBhcmFtczogdGhpcy52YWxpZE1pbkxlbmd0aCgpPy5pbnRlcnBvbGF0ZVBhcmFtcyB8fCB7fSB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB0aGlzLnZhbGlkUGF0dGVybigpICYmIHRoaXMudmFsaWRQYXR0ZXJuKCk/Lmxlbmd0aCAmJiB2YWx1ZSAmJiB2YWx1ZS50cmltKCkpIHtcbiAgICAgIGZvciAoY29uc3QgdmFsaWQgb2YgdGhpcy52YWxpZFBhdHRlcm4oKSB8fCBbXSkge1xuICAgICAgICBpZiAoIXZhbGlkLnBhdHRlcm4pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXR0ZXJuID0gYCR7dmFsaWQucGF0dGVybn1gO1xuICAgICAgICBjb25zdCBpbmRleE9mU2xhc2ggPSBwYXR0ZXJuLmxhc3RJbmRleE9mKCcvJyk7XG5cbiAgICAgICAgaWYgKCFpbmRleE9mU2xhc2gpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXR0ZXJuU3RyID0gcGF0dGVybi5zdWJzdHJpbmcoMSwgaW5kZXhPZlNsYXNoKTtcbiAgICAgICAgY29uc3QgcGF0dGVybkZsYWcgPSBwYXR0ZXJuLnN1YnN0cmluZyhpbmRleE9mU2xhc2ggKyAxLCBwYXR0ZXJuLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKG5ldyBSZWdFeHAocGF0dGVyblN0ciwgcGF0dGVybkZsYWcpLnRlc3QodmFsdWUpID09PSAodmFsaWQudmFsdWVQYXR0ZXJuU2hvd0Vycm9yID8/IHRoaXMudmFsdWVQYXR0ZXJuU2hvd0Vycm9yKCkpKSB7XG4gICAgICAgICAgdGhpcy5zaW5nbGVFcnJvci5zZXQoeyBtZXNzYWdlOiB2YWxpZC5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfUEFUVEVOX1ZBTElELCBpbnRlcnBvbGF0ZVBhcmFtczogdmFsaWQuaW50ZXJwb2xhdGVQYXJhbXMgfHwge30gfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnZhbGlkTWluVmFsdWUoKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHR5cGVvZiB0aGlzLm1pblZhbHVlTnVtYmVyKCkgPT09ICdudW1iZXInICYmIHZhbHVlIDwgKHRoaXMubWluVmFsdWVOdW1iZXIoKSA/PyBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUikpIHtcbiAgICAgIHRoaXMuc2luZ2xlRXJyb3Iuc2V0KHsgbWVzc2FnZTogdGhpcy52YWxpZE1pblZhbHVlKCk/Lm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9NSU5fVkFMSUQsIGludGVycG9sYXRlUGFyYW1zOiB0aGlzLnZhbGlkTWluVmFsdWUoKT8uaW50ZXJwb2xhdGVQYXJhbXMgfHwgeyB2YWx1ZTogdGhpcy5taW5WYWx1ZU51bWJlcigpIH0gfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCh0aGlzLmlnbm9yZUJsb2NrSW5wdXRNYXhWYWx1ZSgpIHx8IHRoaXMudmFsaWRNYXhWYWx1ZSgpPy5tZXNzYWdlKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHR5cGVvZiB0aGlzLm1heFZhbHVlTnVtYmVyKCkgPT09ICdudW1iZXInICYmIHZhbHVlID4gKHRoaXMubWF4VmFsdWVOdW1iZXIoKSA/PyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikpIHtcbiAgICAgIHRoaXMuc2luZ2xlRXJyb3Iuc2V0KHsgbWVzc2FnZTogdGhpcy52YWxpZE1heFZhbHVlKCk/Lm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9NQVhfVkFMSUQsIGludGVycG9sYXRlUGFyYW1zOiB0aGlzLnZhbGlkTWF4VmFsdWUoKT8uaW50ZXJwb2xhdGVQYXJhbXMgfHwgeyB2YWx1ZTogdGhpcy5tYXhWYWx1ZU51bWJlcigpIH0gfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0YVR5cGUoKSA9PT0gJ2JpZ2ludCcgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgbWF4TWluVmFsdWUgPSAoQmlnSW50KDkyMikgKiBCaWdJbnQoMTApICoqIEJpZ0ludCgxOCkpIC8gQmlnSW50KDEwMCk7XG4gICAgICBjb25zdCBbaW50LCBkZWNpbWFsXSA9IHZhbHVlLnNwbGl0KCcuJyk7XG4gICAgICBsZXQgdmFsdWVEaXZpZGVkID0gQmlnSW50KDEpO1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IChkZWNpbWFsPy5sZW5ndGggfHwgMCk7IGluZGV4KyspIHtcbiAgICAgICAgdmFsdWVEaXZpZGVkICo9IEJpZ0ludCgxMCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlQ29tcGFyZSA9IEJpZ0ludChgJHtpbnR9JHtkZWNpbWFsIHx8ICcnfWApICogKEJpZ0ludCgxMDAwMCkgLyB2YWx1ZURpdmlkZWQpO1xuXG4gICAgICBpZiAodmFsdWVDb21wYXJlIDwgLW1heE1pblZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2luZ2xlRXJyb3Iuc2V0KHtcbiAgICAgICAgICBtZXNzYWdlOiB0aGlzLnZhbGlkTWluVmFsdWUoKT8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX01JTl9WQUxJRCxcbiAgICAgICAgICBpbnRlcnBvbGF0ZVBhcmFtczogdGhpcy52YWxpZE1pblZhbHVlKCk/LmludGVycG9sYXRlUGFyYW1zIHx8IHsgdmFsdWU6IHZpZXdEYXRhTnVtYmVyQnlMYW5ndWFnZShgLSR7bWF4TWluVmFsdWUgLyBCaWdJbnQoMTAwMDApfWAsIHRydWUsIDQsIHRydWUsIHRydWUpIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZUNvbXBhcmUgPiBtYXhNaW5WYWx1ZSkge1xuICAgICAgICB0aGlzLnNpbmdsZUVycm9yLnNldCh7XG4gICAgICAgICAgbWVzc2FnZTogdGhpcy52YWxpZE1heFZhbHVlKCk/Lm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9NQVhfVkFMSUQsXG4gICAgICAgICAgaW50ZXJwb2xhdGVQYXJhbXM6IHRoaXMudmFsaWRNYXhWYWx1ZSgpPy5pbnRlcnBvbGF0ZVBhcmFtcyB8fCB7IHZhbHVlOiB2aWV3RGF0YU51bWJlckJ5TGFuZ3VhZ2UoYCR7bWF4TWluVmFsdWUgLyBCaWdJbnQoMTAwMDApfWAsIHRydWUsIDQsIHRydWUsIHRydWUpIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWF4TGVuZ3RoICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgKHRoaXMubWF4TGVuZ3RoKCkgfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIDwgdmFsdWUubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNpbmdsZUVycm9yLnNldCh7IG1lc3NhZ2U6IHRoaXMudmFsaWRNYXhMZW5ndGgoKT8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX01BWF9MRU5HVEgsIGludGVycG9sYXRlUGFyYW1zOiB0aGlzLnZhbGlkTWF4TGVuZ3RoKCk/LmludGVycG9sYXRlUGFyYW1zIHx8IHsgbnVtYmVyOiB0aGlzLm1heExlbmd0aCgpIH0gfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZnVuY3Rpb25WYWxpZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSB0aGlzLmZ1bmN0aW9uVmFsaWQoKT8uKHZhbHVlKTtcblxuICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LnRoZW4pIHtcbiAgICAgIHRoaXMuc2luZ2xlRXJyb3Iuc2V0KGF3YWl0IHJlc3VsdCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zaW5nbGVFcnJvci5zZXQocmVzdWx0KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tJc1ZhbGlkKCkge1xuICAgIGlmICh0aGlzLml0ZW0oKSAmJiAodGhpcy5yZWFkb25seSgpIHx8IHRoaXMuZGlzYWJsZSgpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyVmFsdWVDaGFuZ2UoKSk7XG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZShnZXQodGhpcy5pdGVtLCB0aGlzLmZpZWxkTmFtZUJpbmQoKSkpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2luZ2xlRXJyb3IoKS5tZXNzYWdlID8gZmFsc2UgOiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRNZXNzYWdlRXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zaW5nbGVFcnJvci51cGRhdGUoKG9iaikgPT4gKHsgLi4ub2JqLCBtZXNzYWdlIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ29udHJvbEZ1bmN0aW9uSW5wdXQoZXZlbnQ6IElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xJbnB1dCA9IGV2ZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGb2N1c0FuZEJsdXIoZXZlbnQ6IElGb2N1c0FuZEJsdXJFdmVudCkge1xuICAgIHRoaXMub3V0Rm9jdXNBbmRCbHVyLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZWN0TGVmdCgpIHtcbiAgICBpZiAoIXRoaXMucmVjdExlZnQoKSB8fCB0aGlzLnBvc2l0aW9uTWVzc2FnZUVycm9yU3RhcnRJbnB1dCgpKSB7XG4gICAgICB0aGlzLnRpbWVyLnNldChcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZWN0TGVmdC5zZXQodGhpcy5lbGVtZW50TGVmdFJlZigpPy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VWYWx1ZUJ5QnV0dG9uVXBEb3duKCkge1xuICAgIHRoaXMub3V0Q2hhbmdlVmFsdWVCeUJ1dHRvblVwRG93bi5lbWl0KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcigpKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lclZhbHVlQ2hhbmdlKCkpO1xuICB9XG59XG4iLCJAaWYgKGZpZWxkTmFtZUJpbmQoKSAmJiBpdGVtKCk7IGFzIGl0ZW0pIHtcbiAgQGlmIChsYWJlbENvbmZpZygpOyBhcyBsYWJlbENvbmZpZykge1xuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGFiZWxcbiAgICAgIFtjbGFzc0luY2x1ZGVdPVwibGFiZWxDb25maWcuY2xhc3NJbmNsdWRlXCJcbiAgICAgIFtsYWJlbExlZnRdPVwibGFiZWxDb25maWcubGFiZWxMZWZ0XCJcbiAgICAgIFtsYWJlbExlZnRDbGFzc109XCJsYWJlbENvbmZpZy5sYWJlbExlZnRDbGFzc1wiXG4gICAgICBbcmVxdWlyZWRdPVwibGFiZWxDb25maWcucmVxdWlyZWRcIlxuICAgICAgW2Rlc2NyaXB0aW9uXT1cImxhYmVsQ29uZmlnLmRlc2NyaXB0aW9uXCJcbiAgICAgIFtkZXNjcmlwdGlvbkNsYXNzXT1cImxhYmVsQ29uZmlnLmRlc2NyaXB0aW9uQ2xhc3NcIlxuICAgICAgW2xhYmVsUmlnaHRdPVwibGFiZWxDb25maWcubGFiZWxSaWdodFwiXG4gICAgICBbbGFiZWxSaWdodENsYXNzXT1cImxhYmVsQ29uZmlnLmxhYmVsUmlnaHRDbGFzc1wiXG4gICAgICBbb25seVNob3dDb3VudF09XCJsYWJlbENvbmZpZy5vbmx5U2hvd0NvdW50XCJcbiAgICAgIFtidXR0b25zTGVmdF09XCJsYWJlbENvbmZpZy5idXR0b25zTGVmdFwiXG4gICAgICBbZGlzYWJsZUJ1dHRvbnNMZWZ0XT1cImRpc2FibGUoKSB8fCBsYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc0xlZnRcIlxuICAgICAgW2J1dHRvbnNSaWdodF09XCJsYWJlbENvbmZpZy5idXR0b25zUmlnaHRcIlxuICAgICAgW2Rpc2FibGVCdXR0b25zUmlnaHRdPVwiZGlzYWJsZSgpIHx8IGxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zUmlnaHRcIlxuICAgICAgW2hhc1RvZ2dsZV09XCJsYWJlbENvbmZpZy5oYXNUb2dnbGVcIlxuICAgICAgW3RvZ2dsZUFjdGl2ZV09XCJsYWJlbENvbmZpZy50b2dnbGVBY3RpdmVcIlxuICAgICAgW3RvZ2dsZURpc2FibGVdPVwiZGlzYWJsZSgpIHx8IGxhYmVsQ29uZmlnLnRvZ2dsZURpc2FibGVcIlxuICAgICAgW3BvcG92ZXJdPVwibGFiZWxDb25maWcucG9wb3ZlclwiXG4gICAgICBbaWNvblBvcG92ZXJDbGFzc109XCJsYWJlbENvbmZpZy5pY29uUG9wb3ZlckNsYXNzXCJcbiAgICAgIFtvbmx5U2hvd0NvdW50XT1cImxhYmVsQ29uZmlnLm9ubHlTaG93Q291bnRcIlxuICAgICAgW2xpbWl0TGVuZ3RoXT1cImxhYmVsQ29uZmlnLmxpbWl0TGVuZ3RoXCJcbiAgICAgIFtidXR0b25zRGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uXCJcbiAgICAgIFtkaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uXT1cImxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zRGVzY3JpcHRpb24gfHwgZGlzYWJsZSgpXCJcbiAgICAgIFtidXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc109XCJsYWJlbENvbmZpZy5idXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc1wiXG4gICAgICBbY291bnRdPVwidmFsdWUoKT8ubGVuZ3RoXCJcbiAgICAgIChvdXRDbGlja0J1dHRvbik9XCJoYW5kbGVyQ2xpY2tCdXR0b25MYWJlbCgkZXZlbnQpXCJcbiAgICAgIChvdXRTd2l0Y2hFdmVudCk9XCJoYW5kbGVyU3dpdGNoTGFiZWwoJGV2ZW50KVwiXG4gICAgICAob3V0TGFiZWxSaWdodENsaWNrKT1cImhhbmRsZXJFdmVudExhYmVsUmlnaHRMYWJlbCgpXCIgLz5cbiAgfVxuICA8ZGl2XG4gICAgW2NsYXNzXT1cIidsaWJzLXVpLWlucHV0LXZhbGlkIHctZnVsbCAnICsgKGNsYXNzSW5jbHVkZSgpID8/ICcnKVwiXG4gICAgW2NsYXNzLml0ZW1zLWJhc2VsaW5lXT1cImlzQmFzZWxpbmVTdHlsZSgpXCI+XG4gICAgQGlmICghaWdub3JlQ29udGVudExlZnQoKSkge1xuICAgICAgPGRpdlxuICAgICAgICAjZWxlbWVudExlZnRSZWZcbiAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWlucHV0LXZhbGlkLWxlZnRcIlxuICAgICAgICBbY2xhc3MuaXRlbXMtYmFzZWxpbmVdPVwiaXNCYXNlbGluZVN0eWxlKClcIj5cbiAgICAgICAgQGlmICh0eXBlQ29tcG9uZW50U2VsZWN0SXRlbSgpOyBhcyB0eXBlQ29tcG9uZW50U2VsZWN0SXRlbSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1bOHB4XVwiPlxuICAgICAgICAgICAgQGlmICh0eXBlQ29tcG9uZW50U2VsZWN0SXRlbSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZVxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInZhbHVlQ29tcG9uZW50U2VsZWN0SXRlbSgpIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKCkgfHwgZGlzYWJsZUNvbXBvbmVudFNlbGVjdEl0ZW0oKSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyU2VsZWN0KCRldmVudC5jaGVja2VkKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKHR5cGVDb21wb25lbnRTZWxlY3RJdGVtID09PSAncmFkaW8nKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcmFkaW8tc2luZ2xlXG4gICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJ2YWx1ZUNvbXBvbmVudFNlbGVjdEl0ZW0oKSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IGRpc2FibGVDb21wb25lbnRTZWxlY3RJdGVtKCkgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlclNlbGVjdCgkZXZlbnQuYWN0aXZlKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCIubGlicy11aS1pbnB1dC12YWxpZC1sZWZ0LWNvbnRlbnQtY3VzdG9tXCIgLz5cbiAgICAgICAgQGZvciAodW5pdCBvZiB1bml0c0xlZnQoKTsgdHJhY2sgdW5pdCkge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1pbnB1dC12YWxpZC11bml0IGxpYnMtdWktaW5wdXQtdmFsaWQtdW5pdC1sZWZ0ICFyb3VuZGVkLXRyLW5vbmUgIXJvdW5kZWQtYnItbm9uZSBsaWJzLXVpLWZvbnQtaDVyIHt7IGNvbmZpZ1VuaXRMZWZ0KCkuY2xhc3NJbmNsdWRlIHx8ICcnIH19XCJcbiAgICAgICAgICAgIFtjbGFzcy4hZmxleF09XCJ1bml0W2NvbmZpZ1VuaXRMZWZ0KCkuZmllbGRLZXldID09PSBrZXlTZWxlY3RlZFVuaXRMZWZ0KClcIlxuICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktcmVhZG9ubHldPVwicmVhZG9ubHkoKSB8fCBmYWxzZVwiXG4gICAgICAgICAgICBbY2xhc3MubGlicy11aS1kaXNhYmxlXT1cImRpc2FibGUoKSB8fCBmYWxzZVwiPlxuICAgICAgICAgICAgQGxldCBjb25zdEh0bWxMYWJlbCA9IHVuaXRbY29uZmlnVW5pdExlZnQoKS5maWVsZExhYmVsIHx8ICdsYWJlbCddIHx8ICcgJztcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIFtjb25maWddPVwieyBtYXhXaWR0aDogMjUwLCBkaXJlY3Rpb246ICdib3R0b20nLCB6SW5kZXg6IHpJbmRleFBvcG92ZXJDb250ZW50KCkgfVwiXG4gICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uc3RIdG1sTGFiZWwgfCB0cmFuc2xhdGVcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmIChjYWxsZWRFZmZlY3QoKSA9PT0gdHJ1ZSkge1xuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtaW5wdXRcbiAgICAgICAgW3RhZ0lucHV0XT1cInRhZ0lucHV0KClcIlxuICAgICAgICBbZGF0YVR5cGVdPVwiZGF0YVR5cGUoKSB8fCAnc3RyaW5nJ1wiXG4gICAgICAgIFt0eXBlSW5wdXRdPVwidHlwZUlucHV0KClcIlxuICAgICAgICBbbW9kZUlucHV0XT1cIm1vZGVJbnB1dCgpXCJcbiAgICAgICAgW2NsYXNzLnctZnVsbF09XCIhaWdub3JlV2lkdGhJbnB1dDEwMCgpXCJcbiAgICAgICAgW2lnbm9yZVdpZHRoSW5wdXQxMDBdPVwiaWdub3JlV2lkdGhJbnB1dDEwMCgpXCJcbiAgICAgICAgW3RleHRBcmVhRW50ZXJOb3ROZXdMaW5lXT1cInRleHRBcmVhRW50ZXJOb3ROZXdMaW5lKCkgfHwgZmFsc2VcIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIihjbGFzc0luY2x1ZGVJbnB1dCgpIHx8ICcnKSArICh1bml0c0xlZnQoKSAmJiB1bml0c0xlZnQoKT8ubGVuZ3RoID8gJyAhcm91bmRlZC10bC1ub25lICFyb3VuZGVkLWJsLW5vbmUnIDogJycpICsgKHVuaXRzUmlnaHQoKT8ubGVuZ3RoID8gJyAhcm91bmRlZC10ci1ub25lICFyb3VuZGVkLWJyLW5vbmUnIDogJycpXCJcbiAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIm1heFZhbHVlTnVtYmVyKClcIlxuICAgICAgICBbbWluVmFsdWVOdW1iZXJdPVwibWluVmFsdWVOdW1iZXIoKVwiXG4gICAgICAgIFtmaXhlZEZsb2F0XT1cImZpeGVkRmxvYXQoKSA/PyAxXCJcbiAgICAgICAgW2FjY2VwdE5lZ2F0aXZlVmFsdWVdPVwiYWNjZXB0TmVnYXRpdmVWYWx1ZSgpXCJcbiAgICAgICAgW29ubHlBY2NlcHROZWdhdGl2ZVZhbHVlXT1cIm9ubHlBY2NlcHROZWdhdGl2ZVZhbHVlKClcIlxuICAgICAgICBbdmFsdWVVcERvd25OdW1iZXJdPVwidmFsdWVVcERvd25OdW1iZXIoKVwiXG4gICAgICAgIFttYXhMZW5ndGhdPVwibWF4TGVuZ3RoKClcIlxuICAgICAgICBbc2hvd0NvdW50XT1cInNob3dDb3VudCgpXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKClcIlxuICAgICAgICBbYXV0b0FkZFplcm9MZXNzVGhhbjEwSW5UeXBlSW50XT1cImF1dG9BZGRaZXJvTGVzc1RoYW4xMEluVHlwZUludCgpXCJcbiAgICAgICAgW25vQm9yZGVyXT1cIm5vQm9yZGVyKClcIlxuICAgICAgICBbYmFja2dyb3VuZE5vbmVdPVwiYmFja2dyb3VuZE5vbmUoKVwiXG4gICAgICAgIFt1c2VDb2xvck1vZGVFeGlzdF09XCJ1c2VDb2xvck1vZGVFeGlzdCgpXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyKCkgfHwgJydcIlxuICAgICAgICBba2VlcFBsYWNlaG9sZGVyT25seV09XCJrZWVwUGxhY2Vob2xkZXJPbmx5KClcIlxuICAgICAgICBbYXV0b1JlbW92ZUVtb2ppXT1cImF1dG9SZW1vdmVFbW9qaSgpXCJcbiAgICAgICAgW2RlZmF1bHRIZWlnaHRdPVwiZGVmYXVsdEhlaWdodCgpXCJcbiAgICAgICAgW21heEhlaWdodFRleHRBcmVhXT1cIm1heEhlaWdodFRleHRBcmVhKCkgfHwgMjUwXCJcbiAgICAgICAgW21pbkhlaWdodFRleHRBcmVhXT1cIm1pbkhlaWdodFRleHRBcmVhKClcIlxuICAgICAgICBbYm9yZGVyRXJyb3JdPVwiYm9yZGVyRXJyb3IoKSB8fCAoISFzaW5nbGVFcnJvcigpLm1lc3NhZ2UgJiYgIWlnbm9yZVNob3dFcnJvcigpKVwiXG4gICAgICAgIFtpY29uTGVmdENsYXNzXT1cImljb25MZWZ0Q2xhc3MoKVwiXG4gICAgICAgIFtwb3BvdmVyQ29udGVudEljb25MZWZ0XT1cInBvcG92ZXJDb250ZW50SWNvbkxlZnQoKVwiXG4gICAgICAgIFtwb3BvdmVyQ29udGVudEljb25SaWdodF09XCJwb3BvdmVyQ29udGVudEljb25SaWdodCgpXCJcbiAgICAgICAgW2ljb25SaWdodENsYXNzXT1cImljb25SaWdodENsYXNzKClcIlxuICAgICAgICBbekluZGV4UG9wb3ZlckNvbnRlbnRdPVwiekluZGV4UG9wb3ZlckNvbnRlbnQoKVwiXG4gICAgICAgIFtlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyXT1cImVtaXRFbXB0eUluRGF0YVR5cGVOdW1iZXIoKVwiXG4gICAgICAgIFtpZ25vcmVCbG9ja0lucHV0TWF4VmFsdWVdPVwiISFpZ25vcmVCbG9ja0lucHV0TWF4VmFsdWUoKSA/IGlnbm9yZUJsb2NrSW5wdXRNYXhWYWx1ZSgpIDogdmFsaWRNYXhWYWx1ZSgpPy5tZXNzYWdlID8gdHJ1ZSA6IGZhbHNlXCJcbiAgICAgICAgWyh2YWx1ZSldPVwidmFsdWVcIlxuICAgICAgICBbY2xhc3NDb250YWluZXJJbnB1dF09XCJjbGFzc0NvbnRhaW5lcklucHV0KClcIlxuICAgICAgICBbcmVzZXRBdXRvQ29tcGxldGVQYXNzd29yZF09XCJyZXNldEF1dG9Db21wbGV0ZVBhc3N3b3JkKClcIlxuICAgICAgICBbcmVzaXplXT1cInJlc2l6ZSgpXCJcbiAgICAgICAgW2NsYXNzQ29udGFpbmVyQm90dG9tSW5wdXRdPVwiY2xhc3NDb250YWluZXJCb3R0b21JbnB1dCgpXCJcbiAgICAgICAgW3RlbXBsYXRlTGVmdEJvdHRvbUlucHV0XT1cInRlbXBsYXRlTGVmdEJvdHRvbUlucHV0KClcIlxuICAgICAgICBbdGVtcGxhdGVSaWdodEJvdHRvbUlucHV0XT1cInRlbXBsYXRlUmlnaHRCb3R0b21JbnB1dCgpXCJcbiAgICAgICAgW21heExlbmd0aE51bWJlckNvdW50XT1cIm1heExlbmd0aE51bWJlckNvdW50KClcIlxuICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwiaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnQoKVwiXG4gICAgICAgIFtmb2N1c1RpbWVPdXRdPVwiZm9jdXNUaW1lT3V0KClcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlclZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAob3V0RW50ZXJFdmVudCk9XCJoYW5kbGVyRW50ZXJJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgKG91dEljb25MZWZ0KT1cImhhbmRsZXJFdmVudEljb25MZWZ0KCRldmVudClcIlxuICAgICAgICAob3V0SWNvblJpZ2h0KT1cImhhbmRsZXJFdmVudEljb25SaWdodCgkZXZlbnQpXCJcbiAgICAgICAgKG91dEhlaWdodEFyZWFDaGFuZ2UpPVwiaGFuZGxlckhlaWdodEFyZWFDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJDb250cm9sRnVuY3Rpb25JbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgKG91dEZvY3VzQW5kQmx1ckV2ZW50KT1cImhhbmRsZXJGb2N1c0FuZEJsdXIoJGV2ZW50KVwiXG4gICAgICAgIChvdXRDaGFuZ2VWYWx1ZUJ5QnV0dG9uVXBEb3duKT1cImhhbmRsZXJDaGFuZ2VWYWx1ZUJ5QnV0dG9uVXBEb3duKClcIiAvPlxuICAgIH1cbiAgICBAaWYgKCFpZ25vcmVDb250ZW50UmlnaHQoKSkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImxpYnMtdWktaW5wdXQtdmFsaWQtcmlnaHRcIlxuICAgICAgICBbY2xhc3MuaXRlbXMtYmFzZWxpbmVdPVwiaXNCYXNlbGluZVN0eWxlKClcIj5cbiAgICAgICAgQGZvciAodW5pdCBvZiB1bml0c1JpZ2h0KCk7IHRyYWNrIHVuaXQpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktaW5wdXQtdmFsaWQtdW5pdCBsaWJzLXVpLWlucHV0LXZhbGlkLXVuaXQtcmlnaHQgIXJvdW5kZWQtdGwtbm9uZSAhcm91bmRlZC1ibC1ub25lIGxpYnMtdWktZm9udC1oNXIge3sgY29uZmlnVW5pdFJpZ2h0KCkuY2xhc3NJbmNsdWRlIHx8ICdsaWJzLXVpLWJvcmRlci1nZW5lcmFsJyB9fVwiXG4gICAgICAgICAgICBbY2xhc3MuIWZsZXhdPVwidW5pdFtjb25maWdVbml0UmlnaHQoKS5maWVsZEtleV0gPT09IGtleVNlbGVjdGVkVW5pdFJpZ2h0KClcIlxuICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktcmVhZG9ubHldPVwiIWlnbm9yZVVuaXRSaWdodENsYXNzUmVhZE9ubHkoKSAmJiAocmVhZG9ubHkoKSB8fCBmYWxzZSlcIj5cbiAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sTGFiZWwgPSB1bml0W2NvbmZpZ1VuaXRSaWdodCgpLmZpZWxkTGFiZWwgfHwgJ2xhYmVsJ10gfHwgJyAnO1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJ7IG1heFdpZHRoOiAyNTAsIGRpcmVjdGlvbjogJ2JvdHRvbScsIHpJbmRleDogekluZGV4UG9wb3ZlckNvbnRlbnQoKSB9XCJcbiAgICAgICAgICAgICAgW2lubmVySHRtbF09XCJjb25zdEh0bWxMYWJlbCB8IHRyYW5zbGF0ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiLmxpYnMtdWktaW5wdXQtdmFsaWQtcmlnaHQtY29udGVudC1jdXN0b21cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKCEhc2luZ2xlRXJyb3IoKS5tZXNzYWdlICYmICFpZ25vcmVTaG93RXJyb3IoKSkge1xuICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWlucHV0LXZhbGlkLWVycm9yIHt7IGNsYXNzTWVzc2FnZUVycm9ySW5jbHVkZSgpIHx8ICcnIH19XCI+XG4gICAgICBAbGV0IGNvbnN0SHRtbE1lc3NhZ2UgPSBzaW5nbGVFcnJvcigpLm1lc3NhZ2UgfHwgJyAnO1xuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJsaWJzLXVpLW1lc3NhZ2UtZXJyb3IgbGlicy11aS1mb250LWg3ciBsaWJzLXVpLXRleHQtZXJyb3JcIlxuICAgICAgICBbc3R5bGUubWFyZ2luTGVmdC5weF09XCJyZWN0TGVmdCgpPy53aWR0aFwiXG4gICAgICAgIFtpbm5lckh0bWxdPVwiY29uc3RIdG1sTWVzc2FnZSB8IHRyYW5zbGF0ZTogc2luZ2xlRXJyb3IoKS5pbnRlcnBvbGF0ZVBhcmFtc1wiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgfVxufVxuIl19
320
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy92YWxpZC9zcmMvdmFsaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy92YWxpZC9zcmMvdmFsaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQThDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzSyxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RixPQUFPLEVBQWtELG9DQUFvQyxFQUE2RixNQUFNLGtDQUFrQyxDQUFDO0FBQ25PLE9BQU8sRUFBVSw4QkFBOEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBR3hGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSx3QkFBd0IsRUFBRSx1QkFBdUIsRUFBRSx3QkFBd0IsRUFBRSx1QkFBdUIsRUFBRSwwQkFBMEIsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hPLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBWXRELE1BQU0sT0FBTyxvQ0FBb0M7SUFDL0MsbUJBQW1CO0lBQ1QsS0FBSyxHQUFHLE1BQU0sQ0FBTSxJQUFJLENBQUMsQ0FBQztJQUMxQixXQUFXLEdBQUcsTUFBTSxDQUFv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OEIsRUFBRSxFQUFFLENBQUM7WUFDOUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQ1osVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztZQUNsRixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFUyxnQ0FBZ0M7UUFDeEMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRCxXQUFXO1FBQ1QsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7d0dBdldVLG9DQUFvQzs0RkFBcEMsb0NBQW9DLHlqWUN2QmpELGd5UUErSkEsNC9CRDFJWSxlQUFlLDRGQUFFLG9DQUFvQyx3aERBQUUsOEJBQThCLDRxQkFBRSx1Q0FBdUMsMHBCQUFFLG9DQUFvQywyaEJBQUUsZ0NBQWdDOzs0RkFFck0sb0NBQW9DO2tCQVRoRCxTQUFTOytCQUVFLGlDQUFpQyxjQUcvQixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxlQUFlLEVBQUUsb0NBQW9DLEVBQUUsOEJBQThCLEVBQUUsdUNBQXVDLEVBQUUsb0NBQW9DLEVBQUUsZ0NBQWdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCwgVGVtcGxhdGVSZWYsIGVmZmVjdCwgaW5wdXQsIG1vZGVsLCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElCdXR0b24gfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNDaGVja2JveFNpbmdsZUNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlJztcbmltcG9ydCB7IElGb2N1c0FuZEJsdXJFdmVudCwgSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNJbnB1dENvbXBvbmVudCwgVFlQRV9EQVRBX1RZUEVfSU5QVVQsIFRZUEVfSU5QVVQsIFRZUEVfSU5QVVRfUkVTSVpFX01PREUsIFRZUEVfTU9ERV9JTlBVVCwgVFlQRV9UQUdfSU5QVVQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1pbnB1dCc7XG5pbXBvcnQgeyBJTGFiZWwsIExpYnNVaUNvbXBvbmVudHNMYWJlbENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGFiZWwnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1JhZGlvU2luZ2xlQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1yYWRpby1zaW5nbGUnO1xuaW1wb3J0IHsgSVN3aXRjaEV2ZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zd2l0Y2gnO1xuaW1wb3J0IHsgSUJvdW5kaW5nQ2xpZW50UmVjdCwgSUV2ZW50LCBJTWVzc2FnZVRyYW5zbGF0ZSwgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQsIEVSUk9SX01FU1NBR0VfTUFYX0xFTkdUSCwgRVJST1JfTUVTU0FHRV9NQVhfVkFMSUQsIEVSUk9SX01FU1NBR0VfTUlOX0xFTkdUSCwgRVJST1JfTUVTU0FHRV9NSU5fVkFMSUQsIEVSUk9SX01FU1NBR0VfUEFUVEVOX1ZBTElELCBnZXQsIGlzTmlsLCBzZXQsIHZpZXdEYXRhTnVtYmVyQnlMYW5ndWFnZSB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSUlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2xFdmVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9mdW5jdGlvbi1jb250cm9sLWV2ZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBJSW5wdXRWYWxpZFVuaXRDb25maWcsIElWYWxpZExlbmd0aCwgSVZhbGlkUGF0dGVybiwgSVZhbGlkUmVxdWlyZWQsIFRZUEVfRlVOQ1RJT05fSU5QVVRfVkFMSUQgfSBmcm9tICcuL2ludGVyZmFjZXMvdmFsaWQuaW50ZXJmYWNlJztcbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtdmFsaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdmFsaWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi92YWxpZC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgTGlic1VpQ29tcG9uZW50c0lucHV0c0lucHV0Q29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNDaGVja2JveFNpbmdsZUNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c1JhZGlvU2luZ2xlQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNJbnB1dHNWYWxpZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLy8gI3JlZ2lvbiBQUk9QRVJUWVxuICBwcm90ZWN0ZWQgdmFsdWUgPSBzaWduYWw8YW55PihudWxsKTtcbiAgcHJvdGVjdGVkIHNpbmdsZUVycm9yID0gc2lnbmFsPElNZXNzYWdlVHJhbnNsYXRlPih7IG1lc3NhZ2U6IHVuZGVmaW5lZCwgaW50ZXJwb2xhdGVQYXJhbXM6IHVuZGVmaW5lZCB9KTtcbiAgcHJvdGVjdGVkIHJlY3RMZWZ0ID0gc2lnbmFsPElCb3VuZGluZ0NsaWVudFJlY3QgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBjYWxsZWRFZmZlY3QgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRpbWVyID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGltZXJWYWx1ZUNoYW5nZSA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcml2YXRlIGZ1bmN0aW9uQ29udHJvbElucHV0OiBJSW5wdXRGdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZDtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IGl0ZW0gPSBtb2RlbC5yZXF1aXJlZDxSZWNvcmQ8c3RyaW5nLCBhbnk+Pih7fSk7XG4gIHJlYWRvbmx5IGxhYmVsQ29uZmlnID0gaW5wdXQ8SUxhYmVsPigpO1xuICByZWFkb25seSBlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQmxvY2tJbnB1dE1heFZhbHVlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZmllbGROYW1lQmluZCA9IGlucHV0LnJlcXVpcmVkPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgc2hvd0NvdW50ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICByZWFkb25seSB0eXBlQ29tcG9uZW50U2VsZWN0SXRlbSA9IGlucHV0PCdyYWRpbycgfCAnY2hlY2tib3gnIHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSB2YWx1ZUNvbXBvbmVudFNlbGVjdEl0ZW0gPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBkaXNhYmxlQ29tcG9uZW50U2VsZWN0SXRlbSA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgcmVhZG9ubHkgdGFnSW5wdXQgPSBpbnB1dDxUWVBFX1RBR19JTlBVVD4oKTtcbiAgcmVhZG9ubHkgZGF0YVR5cGUgPSBpbnB1dDxUWVBFX0RBVEFfVFlQRV9JTlBVVD4oKTtcbiAgcmVhZG9ubHkgdHlwZUlucHV0ID0gaW5wdXQ8VFlQRV9JTlBVVD4oKTtcbiAgcmVhZG9ubHkgbW9kZUlucHV0ID0gaW5wdXQ8VFlQRV9NT0RFX0lOUFVUPigpO1xuICByZWFkb25seSByZXNldEF1dG9Db21wbGV0ZVBhc3N3b3JkID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdGV4dEFyZWFFbnRlck5vdE5ld0xpbmUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBmaXhlZEZsb2F0ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBhY2NlcHROZWdhdGl2ZVZhbHVlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdmFsdWVVcERvd25OdW1iZXIgPSBpbnB1dDxudW1iZXIgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZVdpZHRoSW5wdXQxMDAgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVJbnB1dCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgY2xhc3NDb250YWluZXJJbnB1dCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgcmVhZG9ubHkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBkaXNhYmxlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbm9Cb3JkZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBiYWNrZ3JvdW5kTm9uZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHVzZUNvbG9yTW9kZUV4aXN0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGtlZXBQbGFjZWhvbGRlck9ubHkgPSBpbnB1dDxib29sZWFuPigpO1xuXG4gIHJlYWRvbmx5IGNsYXNzQ29udGFpbmVyQm90dG9tSW5wdXQgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGF1dG9SZW1vdmVFbW9qaSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGRlZmF1bHRIZWlnaHQgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG1heEhlaWdodFRleHRBcmVhID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBtaW5IZWlnaHRUZXh0QXJlYSA9IGlucHV0PG51bWJlcj4oKTtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIEtow7RuZyBz4butIGThu6VuZyBpbnB1dCBuw6B5LiBT4butIGThu6VuZyB7QGxpbmsgaWdub3JlU2hvd01lc3NhZ2VFcnJvcn0gdGhheSB0aOG6v1xuICAgKiBu4bq/dSB24bqrbiBtdeG7kW4gaGnhu4NuIHRo4buLIGJvcmRlciDEkeG7jyBuaMawbmcga2jDtG5nIHNob3cgbWVzc2FnZSBs4buXaS5cbiAgICovXG4gIHJlYWRvbmx5IGlnbm9yZVNob3dFcnJvciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIC8qKiDhuqhuIG1lc3NhZ2UgbOG7l2kgbmjGsG5nIHbhuqtuIGhp4buDbiB0aOG7iyBib3JkZXIgxJHhu48ga2hpIGPDsyBs4buXaSAqL1xuICByZWFkb25seSBpZ25vcmVTaG93TWVzc2FnZUVycm9yID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgLyoqIEx1w7RuIGhp4buDbiB0aOG7iyBib3JkZXIgxJHhu48gYuG6pXQga+G7gyB0cuG6oW5nIHRow6FpIGzhu5dpICovXG4gIHJlYWRvbmx5IGJvcmRlckVycm9yID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICByZWFkb25seSBpY29uTGVmdENsYXNzID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBwb3BvdmVyQ29udGVudEljb25MZWZ0ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpY29uUmlnaHRDbGFzcyA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgcG9wb3ZlckNvbnRlbnRJY29uUmlnaHQgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IHpJbmRleFBvcG92ZXJDb250ZW50ID0gaW5wdXQ8bnVtYmVyPigpO1xuXG4gIHJlYWRvbmx5IHVuaXRzTGVmdCA9IGlucHV0PEFycmF5PGFueT4+KCk7XG4gIHJlYWRvbmx5IGNvbmZpZ1VuaXRMZWZ0ID0gaW5wdXQ8SUlucHV0VmFsaWRVbml0Q29uZmlnPih7XG4gICAgZmllbGRLZXk6ICdpZCcsXG4gICAgZmllbGRMYWJlbDogJ2xhYmVsJyxcbiAgfSk7XG4gIHJlYWRvbmx5IGtleVNlbGVjdGVkVW5pdExlZnQgPSBpbnB1dDxhbnk+KCk7XG5cbiAgcmVhZG9ubHkgdW5pdHNSaWdodCA9IGlucHV0PEFycmF5PGFueT4+KCk7XG4gIHJlYWRvbmx5IGNvbmZpZ1VuaXRSaWdodCA9IGlucHV0PElJbnB1dFZhbGlkVW5pdENvbmZpZywgSUlucHV0VmFsaWRVbml0Q29uZmlnIHwgdW5kZWZpbmVkPihcbiAgICB7XG4gICAgICBmaWVsZEtleTogJ2lkJyxcbiAgICAgIGZpZWxkTGFiZWw6ICdsYWJlbCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB0cmFuc2Zvcm06ICh2YWx1ZSkgPT5cbiAgICAgICAgdmFsdWUgPz8ge1xuICAgICAgICAgIGZpZWxkS2V5OiAnaWQnLFxuICAgICAgICAgIGZpZWxkTGFiZWw6ICdsYWJlbCcsXG4gICAgICAgIH0sXG4gICAgfVxuICApO1xuICByZWFkb25seSBrZXlTZWxlY3RlZFVuaXRSaWdodCA9IGlucHV0PGFueT4oKTtcblxuICByZWFkb25seSBtYXhWYWx1ZU51bWJlciA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgbWluVmFsdWVOdW1iZXIgPSBpbnB1dDxudW1iZXI+KCk7XG5cbiAgcmVhZG9ubHkgaWdub3JlQ29udGVudExlZnQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVDb250ZW50UmlnaHQgPSBpbnB1dDxib29sZWFuPigpO1xuICAvKiogQ8SDbiBhbGlnbi1pdGVtcy1iYXNlbGluZSDigJQgZMO5bmcga2hpIGPhuqduIGPEg24gaW5wdXQgdGjhurNuZyBow6BuZyB24bubaSBjw6FjIHBo4bqnbiB04butIGtow6FjIGTDuSBjw7MgdmFsaWRhdGUgKi9cbiAgcmVhZG9ubHkgaXNCYXNlbGluZVN0eWxlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvKiogTeG6t2MgxJHhu4tuaCBraGkgdGVzdCBwYXR0ZXJuIHRy4bqjIHbhu4EgZ2nDoSB0cuG7iyBi4bqxbmcgZmFsc2Ugc+G6vSBiw6FvIGzhu5dpICovXG4gIHJlYWRvbmx5IHZhbHVlUGF0dGVyblNob3dFcnJvciA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgdmFsaWRQYXR0ZXJuID0gaW5wdXQ8QXJyYXk8SVZhbGlkUGF0dGVybj4+KCk7XG4gIHJlYWRvbmx5IHZhbGlkUmVxdWlyZWQgPSBpbnB1dDxJVmFsaWRSZXF1aXJlZD4oKTtcbiAgcmVhZG9ubHkgdmFsaWRNaW5MZW5ndGggPSBpbnB1dDxJVmFsaWRMZW5ndGg+KCk7XG4gIHJlYWRvbmx5IHZhbGlkTWluVmFsdWUgPSBpbnB1dDxJTWVzc2FnZVRyYW5zbGF0ZT4oKTtcbiAgcmVhZG9ubHkgdmFsaWRNYXhWYWx1ZSA9IGlucHV0PElNZXNzYWdlVHJhbnNsYXRlPigpO1xuICByZWFkb25seSB2YWxpZE1heExlbmd0aCA9IGlucHV0PElNZXNzYWdlVHJhbnNsYXRlPigpO1xuICByZWFkb25seSBmdW5jdGlvblZhbGlkID0gaW5wdXQ8VFlQRV9GVU5DVElPTl9JTlBVVF9WQUxJRD4oKTtcbiAgcmVhZG9ubHkgbWF4TGVuZ3RoID0gaW5wdXQ8bnVtYmVyPigpO1xuICAvKiogSGnhu4NuIHRo4buLIG1lc3NhZ2UgbOG7l2kgYuG6r3QgxJHhuqd1IHThu6sgduG7iyB0csOtIMO0IGlucHV0IHRoYXkgdsOsIHThu6sgdGVtcGxhdGUgdHLDoWkgKi9cbiAgcmVhZG9ubHkgcG9zaXRpb25NZXNzYWdlRXJyb3JTdGFydElucHV0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSByZXNpemUgPSBpbnB1dDxUWVBFX0lOUFVUX1JFU0laRV9NT0RFPigpO1xuICByZWFkb25seSB0ZW1wbGF0ZUxlZnRCb3R0b21JbnB1dCA9IGlucHV0PFRlbXBsYXRlUmVmPFRZUEVfVEVNUExBVEVfUkVGPj4oKTtcbiAgcmVhZG9ubHkgdGVtcGxhdGVSaWdodEJvdHRvbUlucHV0ID0gaW5wdXQ8VGVtcGxhdGVSZWY8VFlQRV9URU1QTEFURV9SRUY+PigpO1xuICByZWFkb25seSBvbmx5QWNjZXB0TmVnYXRpdmVWYWx1ZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGF1dG9BZGRaZXJvTGVzc1RoYW4xMEluVHlwZUludCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG1heExlbmd0aE51bWJlckNvdW50ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBjbGFzc01lc3NhZ2VFcnJvckluY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaWdub3JlVW5pdFJpZ2h0Q2xhc3NSZWFkT25seSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIC8qKiBDdXN0b20gcGFkZGluZy1yaWdodCBraGkgY291bnQga2jDtG5nIHThu7EgdMOtbmggxJHGsOG7o2MgKCM1MjE4NSkgKi9cbiAgcmVhZG9ubHkgcGFkZGluZ1JpZ2h0Q3VzdG9tU3BlY2lmaWMgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGZvY3VzVGltZU91dCA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgZGVib3VuY2VUaW1lVmFsaWRhdGUgPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMCwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gMCB9KTtcblxuICAvLyAjcmVnaW9uIE9VVFBVVFxuICByZWFkb25seSBvdXRWYWx1ZUNoYW5nZSA9IG91dHB1dDxhbnk+KCk7XG4gIHJlYWRvbmx5IG91dFNlbGVjdCA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRJY29uTGVmdCA9IG91dHB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IG91dEljb25SaWdodCA9IG91dHB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IG91dENsaWNrQnV0dG9uTGFiZWwgPSBvdXRwdXQ8SUJ1dHRvbj4oKTtcbiAgcmVhZG9ubHkgb3V0U3dpdGNoRXZlbnRMYWJlbCA9IG91dHB1dDxJU3dpdGNoRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dExhYmVsUmlnaHRDbGljayA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRFbnRlcklucHV0RXZlbnQgPSBvdXRwdXQ8SUV2ZW50PigpO1xuICByZWFkb25seSBvdXRIZWlnaHRBcmVhQ2hhbmdlID0gb3V0cHV0PHsgaXNDaGFuZ2U6IGJvb2xlYW4gfT4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJSW5wdXRWYWxpZEZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICByZWFkb25seSBvdXRGb2N1c0FuZEJsdXIgPSBvdXRwdXQ8SUZvY3VzQW5kQmx1ckV2ZW50PigpO1xuICByZWFkb25seSBvdXRDaGFuZ2VWYWx1ZUJ5QnV0dG9uVXBEb3duID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgLyogVklFVyBDSElMRCAqL1xuICByZWFkb25seSBlbGVtZW50TGVmdFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZWxlbWVudExlZnRSZWYnKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YUl0ZW0gPSBnZXQodGhpcy5pdGVtKCksICcnKTtcbiAgICAgIGlmICghZGF0YUl0ZW0gfHwgdHlwZW9mIGRhdGFJdGVtICE9PSAnb2JqZWN0JyB8fCBkYXRhSXRlbSBpbnN0YW5jZW9mIEFycmF5IHx8IChkYXRhSXRlbSBpbnN0YW5jZW9mIE1hcCAmJiBkYXRhSXRlbSBpbnN0YW5jZW9mIFdlYWtNYXApIHx8IGRhdGFJdGVtIGluc3RhbmNlb2YgU2V0IHx8IGRhdGFJdGVtIGluc3RhbmNlb2YgV2Vha1NldCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLnZhbHVlLnNldChnZXQodGhpcy5pdGVtKCksIHRoaXMuZmllbGROYW1lQmluZCgpKSk7XG4gICAgICAgIHRoaXMuZ2V0UmVjdExlZnQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZWZmZWN0Q2xlYXJVcEVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNhbGxlZEVmZmVjdC5zZXQodHJ1ZSk7XG4gICAgICB9KTtcbiAgICAgIGVmZmVjdENsZWFyVXBFZmZlY3QuZGVzdHJveSgpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQodGhpcy5GdW5jdGlvbnNDb250cm9sKTtcbiAgfVxuXG4gIC8qIEZVTkNUSU9OUyAqL1xuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSUlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2xFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoZWNrSXNWYWxpZDogdGhpcy5jaGVja0lzVmFsaWQuYmluZCh0aGlzKSxcbiAgICAgIHNldE1lc3NhZ2VFcnJvcjogdGhpcy5zZXRNZXNzYWdlRXJyb3IuYmluZCh0aGlzKSxcbiAgICAgIGJsdXI6IGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZnVuY3Rpb25Db250cm9sSW5wdXQ/LmJsdXIoKSxcbiAgICAgIGZvY3VzOiBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmZ1bmN0aW9uQ29udHJvbElucHV0Py5mb2N1cygpLFxuICAgICAgaW5zZXJ0Q29udGVudDogYXN5bmMgKGRhdGE6IHN0cmluZyB8IG51bWJlcikgPT4gYXdhaXQgdGhpcy5mdW5jdGlvbkNvbnRyb2xJbnB1dD8uaW5zZXJ0Q29udGVudChkYXRhKSxcbiAgICAgIHJlc2V0VmFsdWU6IGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZnVuY3Rpb25Db250cm9sSW5wdXQ/LnJlc2V0VmFsdWUoKSxcbiAgICAgIGN1cnJlbnRTdGF0ZUlzVmFsaWQ6IHRoaXMuY3VycmVudFN0YXRlSXNWYWxpZC5iaW5kKHRoaXMpLFxuICAgICAgZ2V0RWxlbWVudFZhbHVlOiB0aGlzLmdldEVsZW1lbnRWYWx1ZS5iaW5kKHRoaXMpLFxuICAgICAgY2hlY2tBbmREaXNhYmxlVXBEb3duQnV0dG9uOiBhc3luYyAodmFsdWUpID0+IGF3YWl0IHRoaXMuZnVuY3Rpb25Db250cm9sSW5wdXQ/LmNoZWNrQW5kRGlzYWJsZVVwRG93bkJ1dHRvbih2YWx1ZSksXG4gICAgICBzZWxlY3RBbGxDb250ZW50OiBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmZ1bmN0aW9uQ29udHJvbElucHV0Py5zZWxlY3RBbGxDb250ZW50KCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3VycmVudFN0YXRlSXNWYWxpZCgpIHtcbiAgICByZXR1cm4gIXRoaXMuc2luZ2xlRXJyb3IoKS5tZXNzYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbGVtZW50VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25Db250cm9sSW5wdXQ/LmdldEVsZW1lbnRWYWx1ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3QodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm91dFNlbGVjdC5lbWl0KHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFuZGxlclZhbHVlQ2hhbmdlKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICBzZXQodGhpcy5pdGVtKCksIHRoaXMuZmllbGROYW1lQmluZCgpLCB2YWx1ZSk7XG5cbiAgICAvLyBTdXBwb3J0IHRyxrDhu51uZyBo4bujcCBjYWxsIEFQSSBob+G6t2MgdmFsaWRhdGUgY+G6p24geOG7rSBsw70gY2hlY2sgdOG7kW4gbmhp4buBdSB0aOG7nWkgZ2lhbiB0aMOsIGPhuqduIGRlYm91bmQgdGltZSDEkeG7gyB0csOhbmggY2FsbCBsacOqbiB04bulY1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyVmFsdWVDaGFuZ2UoKSk7XG4gICAgdGhpcy50aW1lclZhbHVlQ2hhbmdlLnNldChcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnZhbGlkYXRlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5vdXRWYWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgIH0sIHRoaXMuZGVib3VuY2VUaW1lVmFsaWRhdGUoKSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJFdmVudEljb25MZWZ0KGV2ZW50TmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vdXRJY29uTGVmdC5lbWl0KGV2ZW50TmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckV2ZW50SWNvblJpZ2h0KGV2ZW50TmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vdXRJY29uUmlnaHQuZW1pdChldmVudE5hbWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0J1dHRvbkxhYmVsKGJ1dHRvbjogSUJ1dHRvbikge1xuICAgIHRoaXMub3V0Q2xpY2tCdXR0b25MYWJlbC5lbWl0KGJ1dHRvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclN3aXRjaExhYmVsKHRvZ2dsZUV2ZW50OiBJU3dpdGNoRXZlbnQpIHtcbiAgICB0aGlzLm91dFN3aXRjaEV2ZW50TGFiZWwuZW1pdCh0b2dnbGVFdmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckV2ZW50TGFiZWxSaWdodExhYmVsKCkge1xuICAgIHRoaXMub3V0TGFiZWxSaWdodENsaWNrLmVtaXQodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckVudGVySW5wdXQoZTogSUV2ZW50KSB7XG4gICAgdGhpcy5vdXRFbnRlcklucHV0RXZlbnQuZW1pdChlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVySGVpZ2h0QXJlYUNoYW5nZShldmVudDogeyBpc0NoYW5nZTogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy5vdXRIZWlnaHRBcmVhQ2hhbmdlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgdGhpcy5nZXRSZWN0TGVmdCgpO1xuICAgIHRoaXMuc2luZ2xlRXJyb3IudXBkYXRlKChvYmopID0+ICh7IC4uLm9iaiwgbWVzc2FnZTogdW5kZWZpbmVkIH0pKTtcbiAgICBpZiAodGhpcy52YWxpZFJlcXVpcmVkKCkgJiYgdGhpcy52YWxpZFJlcXVpcmVkKCk/LmlzUmVxdWlyZWQgJiYgKCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICF2YWx1ZS50cmltKCkpIHx8ICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICYmIGlzTmlsKHZhbHVlKSkpKSB7XG4gICAgICB0aGlzLnNpbmdsZUVycm9yLnNldCh7IG1lc3NhZ2U6IHRoaXMudmFsaWRSZXF1aXJlZCgpPy5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQsIGludGVycG9sYXRlUGFyYW1zOiB0aGlzLnZhbGlkUmVxdWlyZWQoKT8uaW50ZXJwb2xhdGVQYXJhbXMgfHwge30gfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdGhpcy52YWxpZE1pbkxlbmd0aCgpPy5tZXNzYWdlICYmICh0aGlzLnZhbGlkTWluTGVuZ3RoKCk/Lmxlbmd0aCB8fCAwKSA+IHZhbHVlLmxlbmd0aCkge1xuICAgICAgdGhpcy5zaW5nbGVFcnJvci5zZXQoeyBtZXNzYWdlOiB0aGlzLnZhbGlkTWluTGVuZ3RoKCk/Lm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9NSU5fTEVOR1RILCBpbnRlcnBvbGF0ZVBhcmFtczogdGhpcy52YWxpZE1pbkxlbmd0aCgpPy5pbnRlcnBvbGF0ZVBhcmFtcyB8fCB7fSB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB0aGlzLnZhbGlkUGF0dGVybigpPy5sZW5ndGggJiYgdmFsdWU/LnRyaW0oKSkge1xuICAgICAgZm9yIChjb25zdCB2YWxpZCBvZiB0aGlzLnZhbGlkUGF0dGVybigpIHx8IFtdKSB7XG4gICAgICAgIGlmICghdmFsaWQucGF0dGVybikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBgJHt2YWxpZC5wYXR0ZXJufWA7XG4gICAgICAgIGNvbnN0IGluZGV4T2ZTbGFzaCA9IHBhdHRlcm4ubGFzdEluZGV4T2YoJy8nKTtcblxuICAgICAgICBpZiAoIWluZGV4T2ZTbGFzaCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhdHRlcm5TdHIgPSBwYXR0ZXJuLnN1YnN0cmluZygxLCBpbmRleE9mU2xhc2gpO1xuICAgICAgICBjb25zdCBwYXR0ZXJuRmxhZyA9IHBhdHRlcm4uc3Vic3RyaW5nKGluZGV4T2ZTbGFzaCArIDEsIHBhdHRlcm4ubGVuZ3RoKTtcblxuICAgICAgICBpZiAobmV3IFJlZ0V4cChwYXR0ZXJuU3RyLCBwYXR0ZXJuRmxhZykudGVzdCh2YWx1ZSkgPT09ICh2YWxpZC52YWx1ZVBhdHRlcm5TaG93RXJyb3IgPz8gdGhpcy52YWx1ZVBhdHRlcm5TaG93RXJyb3IoKSkpIHtcbiAgICAgICAgICB0aGlzLnNpbmdsZUVycm9yLnNldCh7IG1lc3NhZ2U6IHZhbGlkLm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9QQVRURU5fVkFMSUQsIGludGVycG9sYXRlUGFyYW1zOiB2YWxpZC5pbnRlcnBvbGF0ZVBhcmFtcyB8fCB7fSB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMudmFsaWRNaW5WYWx1ZSgpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHRoaXMubWluVmFsdWVOdW1iZXIoKSA9PT0gJ251bWJlcicgJiYgdmFsdWUgPCAodGhpcy5taW5WYWx1ZU51bWJlcigpID8/IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKSkge1xuICAgICAgdGhpcy5zaW5nbGVFcnJvci5zZXQoeyBtZXNzYWdlOiB0aGlzLnZhbGlkTWluVmFsdWUoKT8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX01JTl9WQUxJRCwgaW50ZXJwb2xhdGVQYXJhbXM6IHRoaXMudmFsaWRNaW5WYWx1ZSgpPy5pbnRlcnBvbGF0ZVBhcmFtcyB8fCB7IHZhbHVlOiB0aGlzLm1pblZhbHVlTnVtYmVyKCkgfSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoKHRoaXMuaWdub3JlQmxvY2tJbnB1dE1heFZhbHVlKCkgfHwgdGhpcy52YWxpZE1heFZhbHVlKCk/Lm1lc3NhZ2UpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHRoaXMubWF4VmFsdWVOdW1iZXIoKSA9PT0gJ251bWJlcicgJiYgdmFsdWUgPiAodGhpcy5tYXhWYWx1ZU51bWJlcigpID8/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSkge1xuICAgICAgdGhpcy5zaW5nbGVFcnJvci5zZXQoeyBtZXNzYWdlOiB0aGlzLnZhbGlkTWF4VmFsdWUoKT8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX01BWF9WQUxJRCwgaW50ZXJwb2xhdGVQYXJhbXM6IHRoaXMudmFsaWRNYXhWYWx1ZSgpPy5pbnRlcnBvbGF0ZVBhcmFtcyB8fCB7IHZhbHVlOiB0aGlzLm1heFZhbHVlTnVtYmVyKCkgfSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhVHlwZSgpID09PSAnYmlnaW50JyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBtYXhNaW5WYWx1ZSA9IChCaWdJbnQoOTIyKSAqIEJpZ0ludCgxMCkgKiogQmlnSW50KDE4KSkgLyBCaWdJbnQoMTAwKTtcbiAgICAgIGNvbnN0IFtpbnQsIGRlY2ltYWxdID0gdmFsdWUuc3BsaXQoJy4nKTtcbiAgICAgIGxldCB2YWx1ZURpdmlkZWQgPSBCaWdJbnQoMSk7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgKGRlY2ltYWw/Lmxlbmd0aCB8fCAwKTsgaW5kZXgrKykge1xuICAgICAgICB2YWx1ZURpdmlkZWQgKj0gQmlnSW50KDEwKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWVDb21wYXJlID0gQmlnSW50KGAke2ludH0ke2RlY2ltYWwgfHwgJyd9YCkgKiAoQmlnSW50KDEwMDAwKSAvIHZhbHVlRGl2aWRlZCk7XG5cbiAgICAgIGlmICh2YWx1ZUNvbXBhcmUgPCAtbWF4TWluVmFsdWUpIHtcbiAgICAgICAgdGhpcy5zaW5nbGVFcnJvci5zZXQoe1xuICAgICAgICAgIG1lc3NhZ2U6IHRoaXMudmFsaWRNaW5WYWx1ZSgpPy5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfTUlOX1ZBTElELFxuICAgICAgICAgIGludGVycG9sYXRlUGFyYW1zOiB0aGlzLnZhbGlkTWluVmFsdWUoKT8uaW50ZXJwb2xhdGVQYXJhbXMgfHwgeyB2YWx1ZTogdmlld0RhdGFOdW1iZXJCeUxhbmd1YWdlKGAtJHttYXhNaW5WYWx1ZSAvIEJpZ0ludCgxMDAwMCl9YCwgdHJ1ZSwgNCwgdHJ1ZSwgdHJ1ZSkgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlQ29tcGFyZSA+IG1heE1pblZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2luZ2xlRXJyb3Iuc2V0KHtcbiAgICAgICAgICBtZXNzYWdlOiB0aGlzLnZhbGlkTWF4VmFsdWUoKT8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX01BWF9WQUxJRCxcbiAgICAgICAgICBpbnRlcnBvbGF0ZVBhcmFtczogdGhpcy52YWxpZE1heFZhbHVlKCk/LmludGVycG9sYXRlUGFyYW1zIHx8IHsgdmFsdWU6IHZpZXdEYXRhTnVtYmVyQnlMYW5ndWFnZShgJHttYXhNaW5WYWx1ZSAvIEJpZ0ludCgxMDAwMCl9YCwgdHJ1ZSwgNCwgdHJ1ZSwgdHJ1ZSkgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXhMZW5ndGggJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAodGhpcy5tYXhMZW5ndGgoKSB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikgPCB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2luZ2xlRXJyb3Iuc2V0KHsgbWVzc2FnZTogdGhpcy52YWxpZE1heExlbmd0aCgpPy5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfTUFYX0xFTkdUSCwgaW50ZXJwb2xhdGVQYXJhbXM6IHRoaXMudmFsaWRNYXhMZW5ndGgoKT8uaW50ZXJwb2xhdGVQYXJhbXMgfHwgeyBudW1iZXI6IHRoaXMubWF4TGVuZ3RoKCkgfSB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5mdW5jdGlvblZhbGlkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQ6IGFueSA9IHRoaXMuZnVuY3Rpb25WYWxpZCgpPy4odmFsdWUpO1xuXG4gICAgaWYgKHJlc3VsdD8udGhlbikge1xuICAgICAgdGhpcy5zaW5nbGVFcnJvci5zZXQoYXdhaXQgcmVzdWx0KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNpbmdsZUVycm9yLnNldChyZXN1bHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0lzVmFsaWQoKSB7XG4gICAgaWYgKHRoaXMuaXRlbSgpICYmICh0aGlzLnJlYWRvbmx5KCkgfHwgdGhpcy5kaXNhYmxlKCkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXJWYWx1ZUNoYW5nZSgpKTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlKGdldCh0aGlzLml0ZW0sIHRoaXMuZmllbGROYW1lQmluZCgpKSk7XG5cbiAgICByZXR1cm4gIXRoaXMuc2luZ2xlRXJyb3IoKS5tZXNzYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRNZXNzYWdlRXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zaW5nbGVFcnJvci51cGRhdGUoKG9iaikgPT4gKHsgLi4ub2JqLCBtZXNzYWdlIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ29udHJvbEZ1bmN0aW9uSW5wdXQoZXZlbnQ6IElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xJbnB1dCA9IGV2ZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGb2N1c0FuZEJsdXIoZXZlbnQ6IElGb2N1c0FuZEJsdXJFdmVudCkge1xuICAgIHRoaXMub3V0Rm9jdXNBbmRCbHVyLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZWN0TGVmdCgpIHtcbiAgICBpZiAoIXRoaXMucmVjdExlZnQoKSB8fCB0aGlzLnBvc2l0aW9uTWVzc2FnZUVycm9yU3RhcnRJbnB1dCgpKSB7XG4gICAgICB0aGlzLnRpbWVyLnNldChcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZWN0TGVmdC5zZXQodGhpcy5lbGVtZW50TGVmdFJlZigpPy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VWYWx1ZUJ5QnV0dG9uVXBEb3duKCkge1xuICAgIHRoaXMub3V0Q2hhbmdlVmFsdWVCeUJ1dHRvblVwRG93bi5lbWl0KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcigpKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lclZhbHVlQ2hhbmdlKCkpO1xuICB9XG59XG4iLCJAaWYgKGZpZWxkTmFtZUJpbmQoKSAmJiBpdGVtKCk7IGFzIGl0ZW0pIHtcbiAgQGlmIChsYWJlbENvbmZpZygpOyBhcyBsYWJlbENvbmZpZykge1xuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGFiZWxcbiAgICAgIFtjbGFzc0luY2x1ZGVdPVwibGFiZWxDb25maWcuY2xhc3NJbmNsdWRlXCJcbiAgICAgIFtsYWJlbExlZnRdPVwibGFiZWxDb25maWcubGFiZWxMZWZ0XCJcbiAgICAgIFtsYWJlbExlZnRDbGFzc109XCJsYWJlbENvbmZpZy5sYWJlbExlZnRDbGFzc1wiXG4gICAgICBbcmVxdWlyZWRdPVwibGFiZWxDb25maWcucmVxdWlyZWRcIlxuICAgICAgW2Rlc2NyaXB0aW9uXT1cImxhYmVsQ29uZmlnLmRlc2NyaXB0aW9uXCJcbiAgICAgIFtkZXNjcmlwdGlvbkNsYXNzXT1cImxhYmVsQ29uZmlnLmRlc2NyaXB0aW9uQ2xhc3NcIlxuICAgICAgW2xhYmVsUmlnaHRdPVwibGFiZWxDb25maWcubGFiZWxSaWdodFwiXG4gICAgICBbbGFiZWxSaWdodENsYXNzXT1cImxhYmVsQ29uZmlnLmxhYmVsUmlnaHRDbGFzc1wiXG4gICAgICBbb25seVNob3dDb3VudF09XCJsYWJlbENvbmZpZy5vbmx5U2hvd0NvdW50XCJcbiAgICAgIFtidXR0b25zTGVmdF09XCJsYWJlbENvbmZpZy5idXR0b25zTGVmdFwiXG4gICAgICBbZGlzYWJsZUJ1dHRvbnNMZWZ0XT1cImRpc2FibGUoKSB8fCBsYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc0xlZnRcIlxuICAgICAgW2J1dHRvbnNSaWdodF09XCJsYWJlbENvbmZpZy5idXR0b25zUmlnaHRcIlxuICAgICAgW2Rpc2FibGVCdXR0b25zUmlnaHRdPVwiZGlzYWJsZSgpIHx8IGxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zUmlnaHRcIlxuICAgICAgW2hhc1RvZ2dsZV09XCJsYWJlbENvbmZpZy5oYXNUb2dnbGVcIlxuICAgICAgW3RvZ2dsZUFjdGl2ZV09XCJsYWJlbENvbmZpZy50b2dnbGVBY3RpdmVcIlxuICAgICAgW3RvZ2dsZURpc2FibGVdPVwiZGlzYWJsZSgpIHx8IGxhYmVsQ29uZmlnLnRvZ2dsZURpc2FibGVcIlxuICAgICAgW3BvcG92ZXJdPVwibGFiZWxDb25maWcucG9wb3ZlclwiXG4gICAgICBbaWNvblBvcG92ZXJDbGFzc109XCJsYWJlbENvbmZpZy5pY29uUG9wb3ZlckNsYXNzXCJcbiAgICAgIFtvbmx5U2hvd0NvdW50XT1cImxhYmVsQ29uZmlnLm9ubHlTaG93Q291bnRcIlxuICAgICAgW2xpbWl0TGVuZ3RoXT1cImxhYmVsQ29uZmlnLmxpbWl0TGVuZ3RoXCJcbiAgICAgIFtidXR0b25zRGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uXCJcbiAgICAgIFtkaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uXT1cImxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zRGVzY3JpcHRpb24gfHwgZGlzYWJsZSgpXCJcbiAgICAgIFtidXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc109XCJsYWJlbENvbmZpZy5idXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc1wiXG4gICAgICBbY291bnRdPVwidmFsdWUoKT8ubGVuZ3RoXCJcbiAgICAgIChvdXRDbGlja0J1dHRvbik9XCJoYW5kbGVyQ2xpY2tCdXR0b25MYWJlbCgkZXZlbnQpXCJcbiAgICAgIChvdXRTd2l0Y2hFdmVudCk9XCJoYW5kbGVyU3dpdGNoTGFiZWwoJGV2ZW50KVwiXG4gICAgICAob3V0TGFiZWxSaWdodENsaWNrKT1cImhhbmRsZXJFdmVudExhYmVsUmlnaHRMYWJlbCgpXCIgLz5cbiAgfVxuICA8ZGl2XG4gICAgW2NsYXNzXT1cIidsaWJzLXVpLWlucHV0LXZhbGlkIHctZnVsbCAnICsgKGNsYXNzSW5jbHVkZSgpID8/ICcnKVwiXG4gICAgW2NsYXNzLml0ZW1zLWJhc2VsaW5lXT1cImlzQmFzZWxpbmVTdHlsZSgpXCI+XG4gICAgQGlmICghaWdub3JlQ29udGVudExlZnQoKSkge1xuICAgICAgPGRpdlxuICAgICAgICAjZWxlbWVudExlZnRSZWZcbiAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWlucHV0LXZhbGlkLWxlZnRcIlxuICAgICAgICBbY2xhc3MuaXRlbXMtYmFzZWxpbmVdPVwiaXNCYXNlbGluZVN0eWxlKClcIj5cbiAgICAgICAgQGlmICh0eXBlQ29tcG9uZW50U2VsZWN0SXRlbSgpOyBhcyB0eXBlQ29tcG9uZW50U2VsZWN0SXRlbSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1bOHB4XVwiPlxuICAgICAgICAgICAgQGlmICh0eXBlQ29tcG9uZW50U2VsZWN0SXRlbSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZVxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInZhbHVlQ29tcG9uZW50U2VsZWN0SXRlbSgpIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKCkgfHwgZGlzYWJsZUNvbXBvbmVudFNlbGVjdEl0ZW0oKSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyU2VsZWN0KCRldmVudC5jaGVja2VkKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKHR5cGVDb21wb25lbnRTZWxlY3RJdGVtID09PSAncmFkaW8nKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcmFkaW8tc2luZ2xlXG4gICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJ2YWx1ZUNvbXBvbmVudFNlbGVjdEl0ZW0oKSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IGRpc2FibGVDb21wb25lbnRTZWxlY3RJdGVtKCkgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlclNlbGVjdCgkZXZlbnQuYWN0aXZlKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCIubGlicy11aS1pbnB1dC12YWxpZC1sZWZ0LWNvbnRlbnQtY3VzdG9tXCIgLz5cbiAgICAgICAgQGZvciAodW5pdCBvZiB1bml0c0xlZnQoKTsgdHJhY2sgdW5pdCkge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1pbnB1dC12YWxpZC11bml0IGxpYnMtdWktaW5wdXQtdmFsaWQtdW5pdC1sZWZ0ICFyb3VuZGVkLXRyLW5vbmUgIXJvdW5kZWQtYnItbm9uZSBsaWJzLXVpLWZvbnQtaDVyIHt7IGNvbmZpZ1VuaXRMZWZ0KCkuY2xhc3NJbmNsdWRlIHx8ICcnIH19XCJcbiAgICAgICAgICAgIFtjbGFzcy4hZmxleF09XCJ1bml0W2NvbmZpZ1VuaXRMZWZ0KCkuZmllbGRLZXldID09PSBrZXlTZWxlY3RlZFVuaXRMZWZ0KClcIlxuICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktcmVhZG9ubHldPVwicmVhZG9ubHkoKSB8fCBmYWxzZVwiXG4gICAgICAgICAgICBbY2xhc3MubGlicy11aS1kaXNhYmxlXT1cImRpc2FibGUoKSB8fCBmYWxzZVwiPlxuICAgICAgICAgICAgQGxldCBjb25zdEh0bWxMYWJlbCA9IHVuaXRbY29uZmlnVW5pdExlZnQoKS5maWVsZExhYmVsIHx8ICdsYWJlbCddIHx8ICcgJztcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIFtjb25maWddPVwieyBtYXhXaWR0aDogMjUwLCBkaXJlY3Rpb246ICdib3R0b20nLCB6SW5kZXg6IHpJbmRleFBvcG92ZXJDb250ZW50KCkgfVwiXG4gICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uc3RIdG1sTGFiZWwgfCB0cmFuc2xhdGVcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmIChjYWxsZWRFZmZlY3QoKSA9PT0gdHJ1ZSkge1xuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtaW5wdXRcbiAgICAgICAgW3RhZ0lucHV0XT1cInRhZ0lucHV0KClcIlxuICAgICAgICBbZGF0YVR5cGVdPVwiZGF0YVR5cGUoKSB8fCAnc3RyaW5nJ1wiXG4gICAgICAgIFt0eXBlSW5wdXRdPVwidHlwZUlucHV0KClcIlxuICAgICAgICBbbW9kZUlucHV0XT1cIm1vZGVJbnB1dCgpXCJcbiAgICAgICAgW2NsYXNzLnctZnVsbF09XCIhaWdub3JlV2lkdGhJbnB1dDEwMCgpXCJcbiAgICAgICAgW2lnbm9yZVdpZHRoSW5wdXQxMDBdPVwiaWdub3JlV2lkdGhJbnB1dDEwMCgpXCJcbiAgICAgICAgW3RleHRBcmVhRW50ZXJOb3ROZXdMaW5lXT1cInRleHRBcmVhRW50ZXJOb3ROZXdMaW5lKCkgfHwgZmFsc2VcIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIihjbGFzc0luY2x1ZGVJbnB1dCgpIHx8ICcnKSArICh1bml0c0xlZnQoKSAmJiB1bml0c0xlZnQoKT8ubGVuZ3RoID8gJyAhcm91bmRlZC10bC1ub25lICFyb3VuZGVkLWJsLW5vbmUnIDogJycpICsgKHVuaXRzUmlnaHQoKT8ubGVuZ3RoID8gJyAhcm91bmRlZC10ci1ub25lICFyb3VuZGVkLWJyLW5vbmUnIDogJycpXCJcbiAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIm1heFZhbHVlTnVtYmVyKClcIlxuICAgICAgICBbbWluVmFsdWVOdW1iZXJdPVwibWluVmFsdWVOdW1iZXIoKVwiXG4gICAgICAgIFtmaXhlZEZsb2F0XT1cImZpeGVkRmxvYXQoKSA/PyAxXCJcbiAgICAgICAgW2FjY2VwdE5lZ2F0aXZlVmFsdWVdPVwiYWNjZXB0TmVnYXRpdmVWYWx1ZSgpXCJcbiAgICAgICAgW29ubHlBY2NlcHROZWdhdGl2ZVZhbHVlXT1cIm9ubHlBY2NlcHROZWdhdGl2ZVZhbHVlKClcIlxuICAgICAgICBbdmFsdWVVcERvd25OdW1iZXJdPVwidmFsdWVVcERvd25OdW1iZXIoKVwiXG4gICAgICAgIFttYXhMZW5ndGhdPVwibWF4TGVuZ3RoKClcIlxuICAgICAgICBbc2hvd0NvdW50XT1cInNob3dDb3VudCgpXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKClcIlxuICAgICAgICBbYXV0b0FkZFplcm9MZXNzVGhhbjEwSW5UeXBlSW50XT1cImF1dG9BZGRaZXJvTGVzc1RoYW4xMEluVHlwZUludCgpXCJcbiAgICAgICAgW25vQm9yZGVyXT1cIm5vQm9yZGVyKClcIlxuICAgICAgICBbYmFja2dyb3VuZE5vbmVdPVwiYmFja2dyb3VuZE5vbmUoKVwiXG4gICAgICAgIFt1c2VDb2xvck1vZGVFeGlzdF09XCJ1c2VDb2xvck1vZGVFeGlzdCgpXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyKCkgfHwgJydcIlxuICAgICAgICBba2VlcFBsYWNlaG9sZGVyT25seV09XCJrZWVwUGxhY2Vob2xkZXJPbmx5KClcIlxuICAgICAgICBbYXV0b1JlbW92ZUVtb2ppXT1cImF1dG9SZW1vdmVFbW9qaSgpXCJcbiAgICAgICAgW2RlZmF1bHRIZWlnaHRdPVwiZGVmYXVsdEhlaWdodCgpXCJcbiAgICAgICAgW21heEhlaWdodFRleHRBcmVhXT1cIm1heEhlaWdodFRleHRBcmVhKCkgfHwgMjUwXCJcbiAgICAgICAgW21pbkhlaWdodFRleHRBcmVhXT1cIm1pbkhlaWdodFRleHRBcmVhKClcIlxuICAgICAgICBbYm9yZGVyRXJyb3JdPVwiYm9yZGVyRXJyb3IoKSB8fCAoISFzaW5nbGVFcnJvcigpLm1lc3NhZ2UgJiYgIWlnbm9yZVNob3dFcnJvcigpKVwiXG4gICAgICAgIFtpY29uTGVmdENsYXNzXT1cImljb25MZWZ0Q2xhc3MoKVwiXG4gICAgICAgIFtwb3BvdmVyQ29udGVudEljb25MZWZ0XT1cInBvcG92ZXJDb250ZW50SWNvbkxlZnQoKVwiXG4gICAgICAgIFtwb3BvdmVyQ29udGVudEljb25SaWdodF09XCJwb3BvdmVyQ29udGVudEljb25SaWdodCgpXCJcbiAgICAgICAgW2ljb25SaWdodENsYXNzXT1cImljb25SaWdodENsYXNzKClcIlxuICAgICAgICBbekluZGV4UG9wb3ZlckNvbnRlbnRdPVwiekluZGV4UG9wb3ZlckNvbnRlbnQoKVwiXG4gICAgICAgIFtlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyXT1cImVtaXRFbXB0eUluRGF0YVR5cGVOdW1iZXIoKVwiXG4gICAgICAgIFtpZ25vcmVCbG9ja0lucHV0TWF4VmFsdWVdPVwiISFpZ25vcmVCbG9ja0lucHV0TWF4VmFsdWUoKSA/IGlnbm9yZUJsb2NrSW5wdXRNYXhWYWx1ZSgpIDogdmFsaWRNYXhWYWx1ZSgpPy5tZXNzYWdlID8gdHJ1ZSA6IGZhbHNlXCJcbiAgICAgICAgWyh2YWx1ZSldPVwidmFsdWVcIlxuICAgICAgICBbY2xhc3NDb250YWluZXJJbnB1dF09XCJjbGFzc0NvbnRhaW5lcklucHV0KClcIlxuICAgICAgICBbcmVzZXRBdXRvQ29tcGxldGVQYXNzd29yZF09XCJyZXNldEF1dG9Db21wbGV0ZVBhc3N3b3JkKClcIlxuICAgICAgICBbcmVzaXplXT1cInJlc2l6ZSgpXCJcbiAgICAgICAgW2NsYXNzQ29udGFpbmVyQm90dG9tSW5wdXRdPVwiY2xhc3NDb250YWluZXJCb3R0b21JbnB1dCgpXCJcbiAgICAgICAgW3RlbXBsYXRlTGVmdEJvdHRvbUlucHV0XT1cInRlbXBsYXRlTGVmdEJvdHRvbUlucHV0KClcIlxuICAgICAgICBbdGVtcGxhdGVSaWdodEJvdHRvbUlucHV0XT1cInRlbXBsYXRlUmlnaHRCb3R0b21JbnB1dCgpXCJcbiAgICAgICAgW21heExlbmd0aE51bWJlckNvdW50XT1cIm1heExlbmd0aE51bWJlckNvdW50KClcIlxuICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwiaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnQoKVwiXG4gICAgICAgIFtmb2N1c1RpbWVPdXRdPVwiZm9jdXNUaW1lT3V0KClcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlclZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAob3V0RW50ZXJFdmVudCk9XCJoYW5kbGVyRW50ZXJJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgKG91dEljb25MZWZ0KT1cImhhbmRsZXJFdmVudEljb25MZWZ0KCRldmVudClcIlxuICAgICAgICAob3V0SWNvblJpZ2h0KT1cImhhbmRsZXJFdmVudEljb25SaWdodCgkZXZlbnQpXCJcbiAgICAgICAgKG91dEhlaWdodEFyZWFDaGFuZ2UpPVwiaGFuZGxlckhlaWdodEFyZWFDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJDb250cm9sRnVuY3Rpb25JbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgKG91dEZvY3VzQW5kQmx1ckV2ZW50KT1cImhhbmRsZXJGb2N1c0FuZEJsdXIoJGV2ZW50KVwiXG4gICAgICAgIChvdXRDaGFuZ2VWYWx1ZUJ5QnV0dG9uVXBEb3duKT1cImhhbmRsZXJDaGFuZ2VWYWx1ZUJ5QnV0dG9uVXBEb3duKClcIiAvPlxuICAgIH1cbiAgICBAaWYgKCFpZ25vcmVDb250ZW50UmlnaHQoKSkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImxpYnMtdWktaW5wdXQtdmFsaWQtcmlnaHRcIlxuICAgICAgICBbY2xhc3MuaXRlbXMtYmFzZWxpbmVdPVwiaXNCYXNlbGluZVN0eWxlKClcIj5cbiAgICAgICAgQGZvciAodW5pdCBvZiB1bml0c1JpZ2h0KCk7IHRyYWNrIHVuaXQpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktaW5wdXQtdmFsaWQtdW5pdCBsaWJzLXVpLWlucHV0LXZhbGlkLXVuaXQtcmlnaHQgIXJvdW5kZWQtdGwtbm9uZSAhcm91bmRlZC1ibC1ub25lIGxpYnMtdWktZm9udC1oNXIge3sgY29uZmlnVW5pdFJpZ2h0KCkuY2xhc3NJbmNsdWRlIHx8ICdsaWJzLXVpLWJvcmRlci1nZW5lcmFsJyB9fVwiXG4gICAgICAgICAgICBbY2xhc3MuIWZsZXhdPVwidW5pdFtjb25maWdVbml0UmlnaHQoKS5maWVsZEtleV0gPT09IGtleVNlbGVjdGVkVW5pdFJpZ2h0KClcIlxuICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktcmVhZG9ubHldPVwiIWlnbm9yZVVuaXRSaWdodENsYXNzUmVhZE9ubHkoKSAmJiAocmVhZG9ubHkoKSB8fCBmYWxzZSlcIj5cbiAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sTGFiZWwgPSB1bml0W2NvbmZpZ1VuaXRSaWdodCgpLmZpZWxkTGFiZWwgfHwgJ2xhYmVsJ10gfHwgJyAnO1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJ7IG1heFdpZHRoOiAyNTAsIGRpcmVjdGlvbjogJ2JvdHRvbScsIHpJbmRleDogekluZGV4UG9wb3ZlckNvbnRlbnQoKSB9XCJcbiAgICAgICAgICAgICAgW2lubmVySHRtbF09XCJjb25zdEh0bWxMYWJlbCB8IHRyYW5zbGF0ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiLmxpYnMtdWktaW5wdXQtdmFsaWQtcmlnaHQtY29udGVudC1jdXN0b21cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKCEhc2luZ2xlRXJyb3IoKS5tZXNzYWdlICYmICFpZ25vcmVTaG93RXJyb3IoKSAmJiAhaWdub3JlU2hvd01lc3NhZ2VFcnJvcigpKSB7XG4gICAgPGRpdiBjbGFzcz1cImxpYnMtdWktaW5wdXQtdmFsaWQtZXJyb3Ige3sgY2xhc3NNZXNzYWdlRXJyb3JJbmNsdWRlKCkgfHwgJycgfX1cIj5cbiAgICAgIEBsZXQgY29uc3RIdG1sTWVzc2FnZSA9IHNpbmdsZUVycm9yKCkubWVzc2FnZSB8fCAnICc7XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImxpYnMtdWktbWVzc2FnZS1lcnJvciBsaWJzLXVpLWZvbnQtaDdyIGxpYnMtdWktdGV4dC1lcnJvclwiXG4gICAgICAgIFtzdHlsZS5tYXJnaW5MZWZ0LnB4XT1cInJlY3RMZWZ0KCk/LndpZHRoXCJcbiAgICAgICAgW2lubmVySHRtbF09XCJjb25zdEh0bWxNZXNzYWdlIHwgdHJhbnNsYXRlOiBzaW5nbGVFcnJvcigpLmludGVycG9sYXRlUGFyYW1zXCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuICB9XG59XG4iXX0=