fn-input 0.0.8 → 0.0.10

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.
@@ -892,6 +892,16 @@ export class FNInput {
892
892
  }
893
893
  });
894
894
  }
895
+ prefixClick(e) {
896
+ if (this.field.prefix?.onClick) {
897
+ this.field.prefix.onClick(e);
898
+ }
899
+ }
900
+ suffixClick(e) {
901
+ if (this.field.suffix?.onClick) {
902
+ this.field.suffix.onClick(e);
903
+ }
904
+ }
895
905
  /**
896
906
  * Set up visibility condition listener
897
907
  * Watches the dependent field and shows/hides this field based on conditions
@@ -1030,13 +1040,24 @@ export class FNInput {
1030
1040
  loadIconToContainer(container, name, variant, sizeName, color, disabled) {
1031
1041
  const size = this.sizeMap[sizeName];
1032
1042
  // 1. Check if raw SVG string is provided
1033
- if (name.trim().startsWith('<svg')) {
1034
- this.renderSvgToContainer(container, name, color, size, 'custom', disabled);
1043
+ const trimmedName = name.trim();
1044
+ if (trimmedName.startsWith('<svg')) {
1045
+ this.renderSvgToContainer(container, trimmedName, color, size, 'custom', disabled);
1046
+ return;
1047
+ }
1048
+ // 1b. Check if it's just raw SVG inner content (like `<path ...>`)
1049
+ if (trimmedName.startsWith('<path') ||
1050
+ trimmedName.startsWith('<g') ||
1051
+ trimmedName.startsWith('<circle') ||
1052
+ trimmedName.startsWith('<rect') ||
1053
+ trimmedName.startsWith('<polygon')) {
1054
+ const wrappedSvg = `<svg viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg">${trimmedName}</svg>`;
1055
+ this.renderSvgToContainer(container, wrappedSvg, color, size, 'custom', disabled);
1035
1056
  return;
1036
1057
  }
1037
1058
  // 2. Check built-in icons registry
1038
1059
  // Strip possible --size suffix if it was passed by mistake from old logic
1039
- const baseName = name.split('--')[0].trim();
1060
+ const baseName = trimmedName.split('--')[0].trim();
1040
1061
  if (CORE_ICONS[baseName]) {
1041
1062
  this.renderSvgToContainer(container, CORE_ICONS[baseName], color, size, baseName, disabled);
1042
1063
  return;
@@ -1139,11 +1160,11 @@ export class FNInput {
1139
1160
  return !!(this.control?.valid && this.control?.touched);
1140
1161
  }
1141
1162
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FNInput, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1142
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FNInput, isStandalone: true, selector: "fn-input", inputs: { field: "field", helperHandle: "helperHandle", toastService: "toastService", currencyMeta: "currencyMeta", defaultLocale: "defaultLocale", form: "form" }, outputs: { valueChange: "valueChange", fieldBlur: "fieldBlur" }, viewQueries: [{ propertyName: "textareaElement", first: true, predicate: ["fnTextarea"], descendants: true }, { propertyName: "iconContainers", predicate: ["iconContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (field.name && isVisible() && !field.hidden) {\r\n <div class=\"fn-input-container\">\r\n @if (field.type! !== 'hidden') {\r\n <label\r\n [for]=\"uniqueId\"\r\n class=\"fn-label\"\r\n [ngStyle]=\"{\r\n color: field.color || '#03182b',\r\n 'font-size': field.labelSize || '',\r\n }\"\r\n >\r\n {{ getTranslatedLabel(field.label) }}\r\n @if (!field.required && !field.hideOptional) {\r\n <span>&nbsp;(Optional)</span>\r\n }\r\n </label>\r\n }\r\n\r\n <ng-container>\r\n @switch (field.type) {\r\n <!-- Textarea Field -->\r\n @case ('textarea') {\r\n <textarea\r\n #fnTextarea\r\n style=\"resize: none\"\r\n [name]=\"field.name\"\r\n [id]=\"uniqueId\"\r\n [required]=\"field.required || false\"\r\n [placeholder]=\"field.placeholder || '' | translate\"\r\n [disabled]=\"field.disabled || false\"\r\n [rows]=\"field.rows || 1\"\r\n [readonly]=\"field.readOnly || false\"\r\n [formControl]=\"control\"\r\n (input)=\"handleTextArea($event)\"\r\n (blur)=\"handleBlur($event)\"\r\n class=\"fn-input-field\"\r\n [ngClass]=\"{\r\n disabled: control.disabled || field.readOnly,\r\n error: control.touched && control.errors,\r\n success: field['hasSuccessBorder'] && control.valid && !control.errors,\r\n }\"\r\n [ngStyle]=\"{\r\n color: field.valueColor || 'inherit',\r\n 'font-size': field.valueSize || '',\r\n }\"\r\n (focus)=\"onFocus()\"\r\n ></textarea>\r\n }\r\n\r\n <!-- Password Field -->\r\n @case ('password') {\r\n <div class=\"relative w-full\">\r\n @if (field.prefix?.icon) {\r\n <div class=\"absolute left-0 top-1/2 -translate-y-1/2 pl-3 flex items-center\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.prefix!.icon\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"medium\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n </div>\r\n }\r\n <input\r\n [type]=\"showPassword ? 'text' : 'password'\"\r\n [id]=\"uniqueId\"\r\n [required]=\"field.required || false\"\r\n [disabled]=\"field.disabled || false\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"field.placeholder || '' | translate\"\r\n [readonly]=\"field.readOnly || false\"\r\n (input)=\"isAlphanumeric ? handleAlphanumericInput($event) : handleInput($event)\"\r\n (focus)=\"onPasswordFocus()\"\r\n (blur)=\"handlePasswordBlur($event)\"\r\n class=\"fn-input-field overflow-hidden text-ellipsis\"\r\n [ngClass]=\"{\r\n disabled: control.disabled || field.readOnly,\r\n error: control.touched && control.errors,\r\n success: field['hasSuccessBorder'] && control.valid,\r\n 'pl-10': field.prefix?.icon,\r\n 'pr-12':\r\n (field.toggleMask && !field.isCopyText) ||\r\n (!field.toggleMask && field.isCopyText),\r\n 'pr-24': field.toggleMask && field.isCopyText && !field.hasGenerateKey,\r\n 'pr-32': field.toggleMask && field.isCopyText && field.hasGenerateKey,\r\n }\"\r\n [ngStyle]=\"{\r\n color: field.valueColor || 'inherit',\r\n 'font-size': field.valueSize || '',\r\n }\"\r\n />\r\n\r\n <div class=\"absolute right-0 top-1/2 -translate-y-1/2 flex items-center pr-3 gap-2\">\r\n @if (field.toggleMask && !field.isCopyText) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"togglePasswordVisibility()\"\r\n (keydown)=\"togglePasswordVisibility()\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"showPassword ? 'eye-open' : 'eye-close'\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"large\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n } @else if (field.isCopyText && !field.toggleMask) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"copyText($event)\"\r\n (keydown)=\"copyText($event)\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"two-square\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n @if (field.hasGenerateKey) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n (keydown)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"round-arrow-top-left\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"large\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n }\r\n } @else if (field.toggleMask && field.isCopyText) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"togglePasswordVisibility()\"\r\n (keydown)=\"togglePasswordVisibility()\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"showPassword ? 'eye-open' : 'eye-close'\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"large\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"copyText($event)\"\r\n (keydown)=\"copyText($event)\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"two-square\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n @if (field.hasGenerateKey) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n (keydown)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n [ngClass]=\"{ 'opacity-50 cursor-not-allowed': !control.value }\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"round-arrow-top-left\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n }\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (field.feedback && isPasswordFocused) {\r\n <div class=\"mt-2 space-y-1\">\r\n <div class=\"flex items-center justify-between text-xs\">\r\n <span class=\"font-medium\" [ngClass]=\"strengthClass\">\r\n {{ passwordStrengthLabel | translate }}\r\n </span>\r\n <div class=\"flex items-center gap-1\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"\r\n passwordStrengthPercent > 50 ? 'check-circle' : 'info-circle'\r\n \"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"extrasmall\"\r\n [attr.data-icon-color]=\"\r\n passwordStrengthPercent <= 25\r\n ? '#ef3e42'\r\n : passwordStrengthPercent <= 75\r\n ? '#ff9f00'\r\n : '#6cc24a'\r\n \"\r\n ></div>\r\n </div>\r\n </div>\r\n <div class=\"h-1.5 w-full bg-[#eef0f2] rounded-full overflow-hidden\">\r\n <div\r\n class=\"h-full transition-all duration-300 rounded-full\"\r\n [ngClass]=\"{\r\n 'bg-[#ef3e42]': passwordStrengthPercent <= 25,\r\n 'bg-[#ff9f00]': passwordStrengthPercent > 25 && passwordStrengthPercent <= 75,\r\n 'bg-[#6cc24a]': passwordStrengthPercent > 75,\r\n }\"\r\n [style.width.%]=\"passwordStrengthPercent\"\r\n ></div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Number Field -->\r\n @case ('number') {\r\n <div class=\"relative w-full\">\r\n @if (field.prefix?.icon) {\r\n <div class=\"absolute left-0 top-1/2 -translate-y-1/2 pl-3 flex items-center\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.prefix!.icon\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"medium\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n </div>\r\n }\r\n <input\r\n [type]=\"field.type === 'number' && field.isCurrency ? 'text' : 'number'\"\r\n [name]=\"field.name\"\r\n [id]=\"uniqueId\"\r\n [required]=\"field.required || false\"\r\n [placeholder]=\"field.placeholder || '' | translate\"\r\n [disabled]=\"isDisabled || false\"\r\n [readOnly]=\"field.readOnly || false\"\r\n [formControl]=\"control\"\r\n [min]=\"field.type === 'number' && !field.isCurrency ? 0 : null\"\r\n [max]=\"field.type === 'number' && !field.isCurrency ? field.max : null\"\r\n [step]=\"field.type === 'number' && !field.isCurrency ? field.step || 1 : null\"\r\n (input)=\"handleNumberInput($event, field.minFractionDigits || 2)\"\r\n (paste)=\"handleNumberPaste($event, field.minFractionDigits || 2)\"\r\n (blur)=\"handleBlur($event, field.minFractionDigits || 2)\"\r\n (keydown)=\"handleNumberKeydown($event, field.isCurrency || false)\"\r\n class=\"fn-input-field\"\r\n [ngClass]=\"{\r\n disabled: control.disabled || field.readOnly,\r\n error: control.touched && control.errors,\r\n success: field['hasSuccessBorder'] && control.valid && !control.errors,\r\n 'pl-10': field.prefix?.icon,\r\n 'text-[24px] font-bold': field.isCurrency,\r\n }\"\r\n [ngStyle]=\"{\r\n color: field.valueColor || 'inherit',\r\n 'font-size': field.valueSize || '',\r\n }\"\r\n (focus)=\"onFocus()\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Default Input Field (text, email, etc.) -->\r\n @default {\r\n <div class=\"relative z-0\">\r\n @if (field.prefix?.icon) {\r\n <div class=\"absolute left-0 top-1/2 -translate-y-1/2 pl-3 flex items-center\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.prefix!.icon\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"medium\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n </div>\r\n }\r\n <input\r\n [type]=\"field.type\"\r\n [name]=\"field.name\"\r\n [id]=\"uniqueId\"\r\n [required]=\"field.required || false\"\r\n [placeholder]=\"field.placeholder || '' | translate\"\r\n [disabled]=\"field.disabled || false\"\r\n [readOnly]=\"field.readOnly || false\"\r\n [formControl]=\"control\"\r\n (input)=\"\r\n isEmailField\r\n ? handleEmailInput($event)\r\n : field.type === 'text' && isAlphanumeric\r\n ? handleAlphanumericInput($event)\r\n : handleInput($event)\r\n \"\r\n (blur)=\"handleBlur($event)\"\r\n class=\"fn-input-field\"\r\n [ngClass]=\"{\r\n disabled: control.disabled || field.readOnly,\r\n error: control.touched && control.errors,\r\n success: field['hasSuccessBorder'] && control.valid && !control.errors,\r\n 'pl-10': field.prefix?.icon,\r\n 'pr-10': (field.icon || field.suffix?.icon) && !field.isCopyText,\r\n 'pr-20':\r\n field.isCopyText && !field.hasGenerateKey && !(field.icon || field.suffix?.icon),\r\n 'pr-30':\r\n field.isCopyText && field.hasGenerateKey && !(field.icon || field.suffix?.icon),\r\n 'pr-32':\r\n field.isCopyText && field.hasGenerateKey && (field.icon || field.suffix?.icon),\r\n }\"\r\n [ngStyle]=\"{\r\n color: field.valueColor || 'inherit',\r\n 'font-size': field.valueSize || '',\r\n }\"\r\n (focus)=\"onFocus()\"\r\n />\r\n\r\n <div class=\"absolute right-0 top-1/2 -translate-y-1/2 flex items-center pr-3 gap-2\">\r\n @if (field.isCopyText) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"copyText($event)\"\r\n (keydown)=\"copyText($event)\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"two-square\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n @if (field.hasGenerateKey) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n (keydown)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"round-arrow-top-left\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n }\r\n }\r\n\r\n @if (field.icon || field.suffix?.icon) {\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.suffix?.icon || field.icon!.name\"\r\n [attr.data-icon-variant]=\"field.icon?.variant || 'Line'\"\r\n [attr.data-icon-size]=\"field.icon ? getIconSizeName(field.icon.size) : 'medium'\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n </ng-container>\r\n\r\n @if (showFormFieldMessage(control, helperText)) {\r\n <div class=\"fn-field-message-container\">\r\n <span\r\n class=\"fn-field-message-text\"\r\n [ngClass]=\"{\r\n error: isError,\r\n success: isSuccess,\r\n }\"\r\n >\r\n {{ getFieldMessage() | translate }}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Integrated Toast Notifications -->\r\n <div class=\"toast-container\">\r\n @for (toast of toasts(); track toast.id) {\r\n <div class=\"toast toast-{{ toast.type }}\" [class.toast-enter]=\"toast.isVisible\">\r\n <span class=\"toast-icon\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"getToastIconName(toast)\"\r\n data-icon-variant=\"Colour\"\r\n data-icon-size=\"medium\"\r\n [attr.data-icon-color]=\"\r\n toast.type === 'success'\r\n ? '#6cc24a'\r\n : toast.type === 'warn'\r\n ? '#ff9f00'\r\n : toast.type === 'error'\r\n ? '#ef3e42'\r\n : '#03182b'\r\n \"\r\n ></div>\r\n </span>\r\n <div class=\"toast-content\">\r\n <span class=\"toast-message\">\r\n {{ getTranslatedMessage(toast.message) | translate }}\r\n </span>\r\n </div>\r\n <button class=\"toast-close\" (click)=\"removeToast(toast.id)\" aria-label=\"Close\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"cross\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"medium\"\r\n data-icon-color=\"#ffffff\"\r\n ></div>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n}\r\n", styles: [".fn-input-container{display:flex;flex-direction:column;width:100%}.fn-label{font-family:Outfit,sans-serif;font-weight:500;margin-bottom:8px;display:flex;align-items:center}.fn-label span{color:#c4cdd2;font-size:14px;font-weight:400}.fn-input-field{width:100%;height:48px;padding:0 16px;background-color:#f7f8f9;border-bottom:1.5px solid #c4cdd2;font-family:Outfit,sans-serif;font-size:16px;color:#03182b;transition:all .2s ease;border-radius:4px 4px 0 0}.fn-input-field::placeholder{color:#c4cdd2}.fn-input-field:focus{outline:none;background-color:#fff;border-bottom-color:#03182b}.fn-input-field.error{border-bottom-color:#ef3e42}.fn-input-field.success{border-bottom-color:#6cc24a}.fn-input-field.disabled{background-color:#eef0f2;color:#c4cdd2;cursor:not-allowed}.fn-input-field.pl-10{padding-left:40px!important}.fn-input-field.pr-10{padding-right:40px!important}.fn-input-field.pr-12{padding-right:44px!important}.fn-input-field.pr-20{padding-right:72px!important}.fn-input-field.pr-24{padding-right:88px!important}.fn-input-field.pr-30{padding-right:104px!important}.fn-input-field.pr-32{padding-right:120px!important}.fn-field-message-container{margin-top:4px}.fn-field-message-text{font-family:Outfit,sans-serif;font-size:12px;color:#c4cdd2}.fn-field-message-text.error{color:#ef3e42}.fn-field-message-text.success{color:#6cc24a}.icon-container{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px}.relative{position:relative}.absolute{position:absolute}.right-0{right:0}.left-0{left:0}.top-1\\/2{top:50%}.-translate-y-1\\/2{transform:translateY(-50%)}.flex{display:flex}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.pr-3{padding-right:.75rem}.pl-3{padding-left:.75rem}.mt-2{margin-top:.5rem}.space-y-1>:not([hidden])~:not([hidden]){margin-top:.25rem}.text-xs{font-size:.75rem}.font-medium{font-weight:500}.h-1\\.5{height:.375rem}.w-full{width:100%}.bg-\\[\\#eef0f2\\]{background-color:#eef0f2}.rounded-full{border-radius:9999px}.overflow-hidden{overflow:hidden}.transition-all{transition-property:all}.duration-300{transition-duration:.3s}.cursor-pointer{cursor:pointer}.opacity-50{opacity:.5}.cursor-not-allowed{cursor:not-allowed}.text-ellipsis{text-overflow:ellipsis}.toast-container{position:fixed;top:24px;left:50%;transform:translate(-50%);z-index:9999;width:100%;max-width:336px;display:flex;flex-direction:column;gap:8px;pointer-events:none}.toast{display:flex;align-items:center;background:#25333f;border-radius:8px;padding:12px;width:336px;max-width:100%;opacity:0;transform:translateY(-20px);transition:all .3s cubic-bezier(.4,0,.2,1);pointer-events:auto}.toast.toast-enter{opacity:1;transform:translateY(0)}.toast.toast-success{border-left:4px solid #6cc24a}.toast.toast-warn{border-left:4px solid #ff9f00}.toast.toast-error{border-left:4px solid #ef3e42}.toast.toast-info{border-left:4px solid #3b82f6}.toast .toast-icon{width:24px;height:24px;display:flex;align-items:center;justify-content:center;margin-right:8px;flex-shrink:0}.toast .toast-content{flex:1;min-width:0}.toast .toast-message{font-size:14px;line-height:20px;color:#fff;display:block}.toast .toast-close{background:none;border:none;font-size:20px;color:#fff;opacity:.7;cursor:pointer;padding:0;margin-left:8px;width:24px;height:24px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:opacity .2s;pointer-events:auto}.toast .toast-close:hover{opacity:1}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1163
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FNInput, isStandalone: true, selector: "fn-input", inputs: { field: "field", helperHandle: "helperHandle", toastService: "toastService", currencyMeta: "currencyMeta", defaultLocale: "defaultLocale", form: "form" }, outputs: { valueChange: "valueChange", fieldBlur: "fieldBlur" }, viewQueries: [{ propertyName: "textareaElement", first: true, predicate: ["fnTextarea"], descendants: true }, { propertyName: "iconContainers", predicate: ["iconContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (field.name && isVisible() && !field.hidden) {\r\n <div class=\"fn-input-container\">\r\n @if (field.type! !== 'hidden') {\r\n <label\r\n [for]=\"uniqueId\"\r\n class=\"fn-label\"\r\n [ngStyle]=\"{\r\n color: field.color || '#03182b',\r\n 'font-size': field.labelSize || '',\r\n }\"\r\n >\r\n {{ getTranslatedLabel(field.label) }}\r\n @if (!field.required && !field.hideOptional) {\r\n <span>&nbsp;(Optional)</span>\r\n }\r\n </label>\r\n }\r\n\r\n <ng-container>\r\n @switch (field.type) {\r\n <!-- Textarea Field -->\r\n @case ('textarea') {\r\n <textarea\r\n #fnTextarea\r\n style=\"resize: none\"\r\n [name]=\"field.name\"\r\n [id]=\"uniqueId\"\r\n [required]=\"field.required || false\"\r\n [placeholder]=\"field.placeholder || '' | translate\"\r\n [disabled]=\"field.disabled || false\"\r\n [rows]=\"field.rows || 1\"\r\n [readonly]=\"field.readOnly || false\"\r\n [formControl]=\"control\"\r\n (input)=\"handleTextArea($event)\"\r\n (blur)=\"handleBlur($event)\"\r\n class=\"fn-input-field\"\r\n [ngClass]=\"{\r\n disabled: control.disabled || field.readOnly,\r\n error: control.touched && control.errors,\r\n success: field['hasSuccessBorder'] && control.valid && !control.errors,\r\n }\"\r\n [ngStyle]=\"{\r\n color: field.valueColor || 'inherit',\r\n 'font-size': field.valueSize || '',\r\n }\"\r\n (focus)=\"onFocus()\"\r\n ></textarea>\r\n }\r\n\r\n <!-- Password Field -->\r\n @case ('password') {\r\n <div class=\"relative w-full\">\r\n @if (field.prefix?.icon || field.prefix?.text) {\r\n <div\r\n class=\"absolute left-0 top-1/2 -translate-y-1/2 pl-3 flex items-center gap-2\"\r\n style=\"z-index: 1\"\r\n >\r\n @if (field.prefix?.icon) {\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.prefix!.icon\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"medium\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n }\r\n @if (field.prefix?.text) {\r\n <span\r\n class=\"text-sm font-medium whitespace-nowrap\"\r\n [ngStyle]=\"{ color: control.disabled ? '#c4cdd2' : '#03182b' }\"\r\n (click)=\"prefixClick($event)\"\r\n (keydown.enter)=\"prefixClick($event)\"\r\n [attr.tabindex]=\"field.prefix?.onClick ? 0 : null\"\r\n [class.cursor-pointer]=\"!!field.prefix?.onClick\"\r\n >{{ field.prefix!.text }}</span\r\n >\r\n }\r\n </div>\r\n }\r\n <input\r\n [type]=\"showPassword ? 'text' : 'password'\"\r\n [id]=\"uniqueId\"\r\n [required]=\"field.required || false\"\r\n [disabled]=\"field.disabled || false\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"field.placeholder || '' | translate\"\r\n [readonly]=\"field.readOnly || false\"\r\n (input)=\"isAlphanumeric ? handleAlphanumericInput($event) : handleInput($event)\"\r\n (focus)=\"onPasswordFocus()\"\r\n (blur)=\"handlePasswordBlur($event)\"\r\n class=\"fn-input-field overflow-hidden text-ellipsis\"\r\n [ngClass]=\"{\r\n disabled: control.disabled || field.readOnly,\r\n error: control.touched && control.errors,\r\n success: field['hasSuccessBorder'] && control.valid,\r\n 'pl-10': field.prefix?.icon && !field.prefix?.text,\r\n 'has-prefix-text': !!field.prefix?.text,\r\n 'pr-12':\r\n (field.toggleMask && !field.isCopyText) ||\r\n (!field.toggleMask && field.isCopyText),\r\n 'pr-24': field.toggleMask && field.isCopyText && !field.hasGenerateKey,\r\n 'pr-32': field.toggleMask && field.isCopyText && field.hasGenerateKey,\r\n }\"\r\n [ngStyle]=\"{\r\n color: field.valueColor || 'inherit',\r\n 'font-size': field.valueSize || '',\r\n }\"\r\n />\r\n\r\n <div class=\"absolute right-0 top-1/2 -translate-y-1/2 flex items-center pr-3 gap-2\">\r\n @if (field.toggleMask && !field.isCopyText) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"togglePasswordVisibility()\"\r\n (keydown)=\"togglePasswordVisibility()\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"showPassword ? 'eye-open' : 'eye-close'\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"large\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n } @else if (field.isCopyText && !field.toggleMask) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"copyText($event)\"\r\n (keydown)=\"copyText($event)\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"two-square\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n @if (field.hasGenerateKey) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n (keydown)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"round-arrow-top-left\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"large\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n }\r\n } @else if (field.toggleMask && field.isCopyText) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"togglePasswordVisibility()\"\r\n (keydown)=\"togglePasswordVisibility()\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"showPassword ? 'eye-open' : 'eye-close'\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"large\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"copyText($event)\"\r\n (keydown)=\"copyText($event)\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"two-square\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n @if (field.hasGenerateKey) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n (keydown)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n [ngClass]=\"{ 'opacity-50 cursor-not-allowed': !control.value }\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"round-arrow-top-left\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n }\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (field.feedback && isPasswordFocused) {\r\n <div class=\"mt-2 space-y-1\">\r\n <div class=\"flex items-center justify-between text-xs\">\r\n <span class=\"font-medium\" [ngClass]=\"strengthClass\">\r\n {{ passwordStrengthLabel | translate }}\r\n </span>\r\n <div class=\"flex items-center gap-1\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"\r\n passwordStrengthPercent > 50 ? 'check-circle' : 'info-circle'\r\n \"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"extrasmall\"\r\n [attr.data-icon-color]=\"\r\n passwordStrengthPercent <= 25\r\n ? '#ef3e42'\r\n : passwordStrengthPercent <= 75\r\n ? '#ff9f00'\r\n : '#6cc24a'\r\n \"\r\n ></div>\r\n </div>\r\n </div>\r\n <div class=\"h-1.5 w-full bg-[#eef0f2] rounded-full overflow-hidden\">\r\n <div\r\n class=\"h-full transition-all duration-300 rounded-full\"\r\n [ngClass]=\"{\r\n 'bg-[#ef3e42]': passwordStrengthPercent <= 25,\r\n 'bg-[#ff9f00]': passwordStrengthPercent > 25 && passwordStrengthPercent <= 75,\r\n 'bg-[#6cc24a]': passwordStrengthPercent > 75,\r\n }\"\r\n [style.width.%]=\"passwordStrengthPercent\"\r\n ></div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Number Field -->\r\n @case ('number') {\r\n <div class=\"relative w-full\">\r\n @if (field.prefix?.icon || field.prefix?.text) {\r\n <div\r\n class=\"absolute left-0 top-1/2 -translate-y-1/2 pl-3 flex items-center gap-2\"\r\n style=\"z-index: 1\"\r\n >\r\n @if (field.prefix?.icon) {\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.prefix!.icon\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"medium\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n }\r\n @if (field.prefix?.text) {\r\n <span\r\n class=\"text-sm font-medium whitespace-nowrap\"\r\n [ngStyle]=\"{ color: control.disabled ? '#c4cdd2' : '#03182b' }\"\r\n (click)=\"prefixClick($event)\"\r\n (keydown.enter)=\"prefixClick($event)\"\r\n [attr.tabindex]=\"field.prefix?.onClick ? 0 : null\"\r\n [class.cursor-pointer]=\"!!field.prefix?.onClick\"\r\n >{{ field.prefix!.text }}</span\r\n >\r\n }\r\n </div>\r\n }\r\n <input\r\n [type]=\"field.type === 'number' && field.isCurrency ? 'text' : 'number'\"\r\n [name]=\"field.name\"\r\n [id]=\"uniqueId\"\r\n [required]=\"field.required || false\"\r\n [placeholder]=\"field.placeholder || '' | translate\"\r\n [disabled]=\"isDisabled || false\"\r\n [readOnly]=\"field.readOnly || false\"\r\n [formControl]=\"control\"\r\n [min]=\"field.type === 'number' && !field.isCurrency ? 0 : null\"\r\n [max]=\"field.type === 'number' && !field.isCurrency ? field.max : null\"\r\n [step]=\"field.type === 'number' && !field.isCurrency ? field.step || 1 : null\"\r\n (input)=\"handleNumberInput($event, field.minFractionDigits || 2)\"\r\n (paste)=\"handleNumberPaste($event, field.minFractionDigits || 2)\"\r\n (blur)=\"handleBlur($event, field.minFractionDigits || 2)\"\r\n (keydown)=\"handleNumberKeydown($event, field.isCurrency || false)\"\r\n class=\"fn-input-field\"\r\n [ngClass]=\"{\r\n disabled: control.disabled || field.readOnly,\r\n error: control.touched && control.errors,\r\n success: field['hasSuccessBorder'] && control.valid && !control.errors,\r\n 'pl-10': field.prefix?.icon && !field.prefix?.text,\r\n 'has-prefix-text': !!field.prefix?.text,\r\n 'pr-10': field.suffix?.icon && !field.suffix?.text,\r\n 'has-suffix-text': !!field.suffix?.text,\r\n 'text-[24px] font-bold': field.isCurrency,\r\n }\"\r\n [ngStyle]=\"{\r\n color: field.valueColor || 'inherit',\r\n 'font-size': field.valueSize || '',\r\n }\"\r\n (focus)=\"onFocus()\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Default Input Field (text, email, etc.) -->\r\n @default {\r\n <div class=\"relative z-0\">\r\n @if (field.prefix?.icon || field.prefix?.text) {\r\n <div\r\n class=\"absolute left-0 top-1/2 -translate-y-1/2 pl-3 flex items-center gap-2\"\r\n style=\"z-index: 1\"\r\n >\r\n @if (field.prefix?.icon) {\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.prefix!.icon\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"medium\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n }\r\n @if (field.prefix?.text) {\r\n <span\r\n class=\"text-sm font-medium whitespace-nowrap\"\r\n [ngStyle]=\"{ color: control.disabled ? '#c4cdd2' : '#03182b' }\"\r\n (click)=\"prefixClick($event)\"\r\n (keydown.enter)=\"prefixClick($event)\"\r\n [attr.tabindex]=\"field.prefix?.onClick ? 0 : null\"\r\n [class.cursor-pointer]=\"!!field.prefix?.onClick\"\r\n >{{ field.prefix!.text }}</span\r\n >\r\n }\r\n </div>\r\n }\r\n <input\r\n [type]=\"field.type\"\r\n [name]=\"field.name\"\r\n [id]=\"uniqueId\"\r\n [required]=\"field.required || false\"\r\n [placeholder]=\"field.placeholder || '' | translate\"\r\n [disabled]=\"field.disabled || false\"\r\n [readOnly]=\"field.readOnly || false\"\r\n [formControl]=\"control\"\r\n (input)=\"\r\n isEmailField\r\n ? handleEmailInput($event)\r\n : field.type === 'text' && isAlphanumeric\r\n ? handleAlphanumericInput($event)\r\n : handleInput($event)\r\n \"\r\n (blur)=\"handleBlur($event)\"\r\n class=\"fn-input-field\"\r\n [ngClass]=\"{\r\n disabled: control.disabled || field.readOnly,\r\n error: control.touched && control.errors,\r\n success: field['hasSuccessBorder'] && control.valid && !control.errors,\r\n 'pl-10': field.prefix?.icon && !field.prefix?.text,\r\n 'has-prefix-text': !!field.prefix?.text,\r\n 'pr-10':\r\n (field.icon || field.suffix?.icon) && !field.isCopyText && !field.suffix?.text,\r\n 'has-suffix-text': !!field.suffix?.text,\r\n 'pr-20':\r\n field.isCopyText && !field.hasGenerateKey && !(field.icon || field.suffix?.icon),\r\n 'pr-30':\r\n field.isCopyText && field.hasGenerateKey && !(field.icon || field.suffix?.icon),\r\n 'pr-32':\r\n field.isCopyText && field.hasGenerateKey && (field.icon || field.suffix?.icon),\r\n }\"\r\n [ngStyle]=\"{\r\n color: field.valueColor || 'inherit',\r\n 'font-size': field.valueSize || '',\r\n }\"\r\n (focus)=\"onFocus()\"\r\n />\r\n\r\n <div class=\"absolute right-0 top-1/2 -translate-y-1/2 flex items-center pr-3 gap-2\">\r\n @if (field.isCopyText) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"copyText($event)\"\r\n (keydown)=\"copyText($event)\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"two-square\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n @if (field.hasGenerateKey) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n (keydown)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"round-arrow-top-left\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n }\r\n }\r\n\r\n @if (field.icon || field.suffix?.icon || field.suffix?.text) {\r\n @if (field.suffix?.text) {\r\n <span\r\n class=\"text-sm font-medium whitespace-nowrap\"\r\n [ngStyle]=\"{ color: control.disabled ? '#c4cdd2' : '#03182b' }\"\r\n (click)=\"suffixClick($event)\"\r\n (keydown.enter)=\"suffixClick($event)\"\r\n [attr.tabindex]=\"field.suffix?.onClick ? 0 : null\"\r\n [class.cursor-pointer]=\"!!field.suffix?.onClick\"\r\n >{{ field.suffix!.text }}</span\r\n >\r\n }\r\n @if (field.icon || field.suffix?.icon) {\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.suffix?.icon || field.icon!.name\"\r\n [attr.data-icon-variant]=\"field.icon?.variant || 'Line'\"\r\n [attr.data-icon-size]=\"field.icon ? getIconSizeName(field.icon.size) : 'medium'\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n </ng-container>\r\n\r\n @if (showFormFieldMessage(control, helperText)) {\r\n <div class=\"fn-field-message-container\">\r\n <span\r\n class=\"fn-field-message-text\"\r\n [ngClass]=\"{\r\n error: isError,\r\n success: isSuccess,\r\n }\"\r\n >\r\n {{ getFieldMessage() | translate }}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Integrated Toast Notifications -->\r\n <div class=\"toast-container\">\r\n @for (toast of toasts(); track toast.id) {\r\n <div class=\"toast toast-{{ toast.type }}\" [class.toast-enter]=\"toast.isVisible\">\r\n <span class=\"toast-icon\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"getToastIconName(toast)\"\r\n data-icon-variant=\"Colour\"\r\n data-icon-size=\"medium\"\r\n [attr.data-icon-color]=\"\r\n toast.type === 'success'\r\n ? '#6cc24a'\r\n : toast.type === 'warn'\r\n ? '#ff9f00'\r\n : toast.type === 'error'\r\n ? '#ef3e42'\r\n : '#03182b'\r\n \"\r\n ></div>\r\n </span>\r\n <div class=\"toast-content\">\r\n <span class=\"toast-message\">\r\n {{ getTranslatedMessage(toast.message) | translate }}\r\n </span>\r\n </div>\r\n <button class=\"toast-close\" (click)=\"removeToast(toast.id)\" aria-label=\"Close\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"cross\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"medium\"\r\n data-icon-color=\"#ffffff\"\r\n ></div>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n}\r\n", styles: [".fn-input-container{display:flex;flex-direction:column;width:100%}.fn-label{font-family:Outfit,sans-serif;font-weight:500;margin-bottom:8px;display:flex;align-items:center}.fn-label span{color:#c4cdd2;font-size:14px;font-weight:400}.fn-input-field{width:100%;height:48px;padding:0 16px;background-color:#f7f8f9;border-bottom:1.5px solid #c4cdd2;font-family:Outfit,sans-serif;font-size:16px;color:#03182b;transition:all .2s ease;border-radius:4px 4px 0 0}.fn-input-field::placeholder{color:#c4cdd2}.fn-input-field:focus{outline:none;background-color:#fff;border-bottom-color:#03182b}.fn-input-field.error{border-bottom-color:#ef3e42}.fn-input-field.success{border-bottom-color:#6cc24a}.fn-input-field.disabled{background-color:#eef0f2;color:#c4cdd2;cursor:not-allowed}.fn-input-field.pl-10{padding-left:40px!important}.fn-input-field.has-prefix-text{padding-left:100px!important}.fn-input-field.pr-10{padding-right:40px!important}.fn-input-field.has-suffix-text{padding-right:120px!important}.fn-input-field.pr-12{padding-right:44px!important}.fn-input-field.pr-20{padding-right:72px!important}.fn-input-field.pr-24{padding-right:88px!important}.fn-input-field.pr-30{padding-right:104px!important}.fn-input-field.pr-32{padding-right:120px!important}.fn-field-message-container{margin-top:4px}.fn-field-message-text{font-family:Outfit,sans-serif;font-size:12px;color:#c4cdd2}.fn-field-message-text.error{color:#ef3e42}.fn-field-message-text.success{color:#6cc24a}.icon-container{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px}.relative{position:relative}.absolute{position:absolute}.right-0{right:0}.left-0{left:0}.top-1\\/2{top:50%}.-translate-y-1\\/2{transform:translateY(-50%)}.flex{display:flex}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.pr-3{padding-right:.75rem}.pl-3{padding-left:.75rem}.mt-2{margin-top:.5rem}.space-y-1>:not([hidden])~:not([hidden]){margin-top:.25rem}.text-xs{font-size:.75rem}.font-medium{font-weight:500}.h-1\\.5{height:.375rem}.w-full{width:100%}.bg-\\[\\#eef0f2\\]{background-color:#eef0f2}.rounded-full{border-radius:9999px}.overflow-hidden{overflow:hidden}.transition-all{transition-property:all}.duration-300{transition-duration:.3s}.cursor-pointer{cursor:pointer}.opacity-50{opacity:.5}.cursor-not-allowed{cursor:not-allowed}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.toast-container{position:fixed;top:24px;left:50%;transform:translate(-50%);z-index:9999;width:100%;max-width:336px;display:flex;flex-direction:column;gap:8px;pointer-events:none}.toast{display:flex;align-items:center;background:#25333f;border-radius:8px;padding:12px;width:336px;max-width:100%;opacity:0;transform:translateY(-20px);transition:all .3s cubic-bezier(.4,0,.2,1);pointer-events:auto}.toast.toast-enter{opacity:1;transform:translateY(0)}.toast.toast-success{border-left:4px solid #6cc24a}.toast.toast-warn{border-left:4px solid #ff9f00}.toast.toast-error{border-left:4px solid #ef3e42}.toast.toast-info{border-left:4px solid #3b82f6}.toast .toast-icon{width:24px;height:24px;display:flex;align-items:center;justify-content:center;margin-right:8px;flex-shrink:0}.toast .toast-content{flex:1;min-width:0}.toast .toast-message{font-size:14px;line-height:20px;color:#fff;display:block}.toast .toast-close{background:none;border:none;font-size:20px;color:#fff;opacity:.7;cursor:pointer;padding:0;margin-left:8px;width:24px;height:24px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:opacity .2s;pointer-events:auto}.toast .toast-close:hover{opacity:1}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1143
1164
  }
1144
1165
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FNInput, decorators: [{
1145
1166
  type: Component,
1146
- args: [{ selector: 'fn-input', standalone: true, imports: [FormsModule, CommonModule, ReactiveFormsModule, TranslateModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (field.name && isVisible() && !field.hidden) {\r\n <div class=\"fn-input-container\">\r\n @if (field.type! !== 'hidden') {\r\n <label\r\n [for]=\"uniqueId\"\r\n class=\"fn-label\"\r\n [ngStyle]=\"{\r\n color: field.color || '#03182b',\r\n 'font-size': field.labelSize || '',\r\n }\"\r\n >\r\n {{ getTranslatedLabel(field.label) }}\r\n @if (!field.required && !field.hideOptional) {\r\n <span>&nbsp;(Optional)</span>\r\n }\r\n </label>\r\n }\r\n\r\n <ng-container>\r\n @switch (field.type) {\r\n <!-- Textarea Field -->\r\n @case ('textarea') {\r\n <textarea\r\n #fnTextarea\r\n style=\"resize: none\"\r\n [name]=\"field.name\"\r\n [id]=\"uniqueId\"\r\n [required]=\"field.required || false\"\r\n [placeholder]=\"field.placeholder || '' | translate\"\r\n [disabled]=\"field.disabled || false\"\r\n [rows]=\"field.rows || 1\"\r\n [readonly]=\"field.readOnly || false\"\r\n [formControl]=\"control\"\r\n (input)=\"handleTextArea($event)\"\r\n (blur)=\"handleBlur($event)\"\r\n class=\"fn-input-field\"\r\n [ngClass]=\"{\r\n disabled: control.disabled || field.readOnly,\r\n error: control.touched && control.errors,\r\n success: field['hasSuccessBorder'] && control.valid && !control.errors,\r\n }\"\r\n [ngStyle]=\"{\r\n color: field.valueColor || 'inherit',\r\n 'font-size': field.valueSize || '',\r\n }\"\r\n (focus)=\"onFocus()\"\r\n ></textarea>\r\n }\r\n\r\n <!-- Password Field -->\r\n @case ('password') {\r\n <div class=\"relative w-full\">\r\n @if (field.prefix?.icon) {\r\n <div class=\"absolute left-0 top-1/2 -translate-y-1/2 pl-3 flex items-center\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.prefix!.icon\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"medium\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n </div>\r\n }\r\n <input\r\n [type]=\"showPassword ? 'text' : 'password'\"\r\n [id]=\"uniqueId\"\r\n [required]=\"field.required || false\"\r\n [disabled]=\"field.disabled || false\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"field.placeholder || '' | translate\"\r\n [readonly]=\"field.readOnly || false\"\r\n (input)=\"isAlphanumeric ? handleAlphanumericInput($event) : handleInput($event)\"\r\n (focus)=\"onPasswordFocus()\"\r\n (blur)=\"handlePasswordBlur($event)\"\r\n class=\"fn-input-field overflow-hidden text-ellipsis\"\r\n [ngClass]=\"{\r\n disabled: control.disabled || field.readOnly,\r\n error: control.touched && control.errors,\r\n success: field['hasSuccessBorder'] && control.valid,\r\n 'pl-10': field.prefix?.icon,\r\n 'pr-12':\r\n (field.toggleMask && !field.isCopyText) ||\r\n (!field.toggleMask && field.isCopyText),\r\n 'pr-24': field.toggleMask && field.isCopyText && !field.hasGenerateKey,\r\n 'pr-32': field.toggleMask && field.isCopyText && field.hasGenerateKey,\r\n }\"\r\n [ngStyle]=\"{\r\n color: field.valueColor || 'inherit',\r\n 'font-size': field.valueSize || '',\r\n }\"\r\n />\r\n\r\n <div class=\"absolute right-0 top-1/2 -translate-y-1/2 flex items-center pr-3 gap-2\">\r\n @if (field.toggleMask && !field.isCopyText) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"togglePasswordVisibility()\"\r\n (keydown)=\"togglePasswordVisibility()\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"showPassword ? 'eye-open' : 'eye-close'\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"large\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n } @else if (field.isCopyText && !field.toggleMask) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"copyText($event)\"\r\n (keydown)=\"copyText($event)\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"two-square\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n @if (field.hasGenerateKey) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n (keydown)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"round-arrow-top-left\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"large\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n }\r\n } @else if (field.toggleMask && field.isCopyText) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"togglePasswordVisibility()\"\r\n (keydown)=\"togglePasswordVisibility()\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"showPassword ? 'eye-open' : 'eye-close'\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"large\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"copyText($event)\"\r\n (keydown)=\"copyText($event)\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"two-square\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n @if (field.hasGenerateKey) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n (keydown)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n [ngClass]=\"{ 'opacity-50 cursor-not-allowed': !control.value }\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"round-arrow-top-left\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n }\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (field.feedback && isPasswordFocused) {\r\n <div class=\"mt-2 space-y-1\">\r\n <div class=\"flex items-center justify-between text-xs\">\r\n <span class=\"font-medium\" [ngClass]=\"strengthClass\">\r\n {{ passwordStrengthLabel | translate }}\r\n </span>\r\n <div class=\"flex items-center gap-1\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"\r\n passwordStrengthPercent > 50 ? 'check-circle' : 'info-circle'\r\n \"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"extrasmall\"\r\n [attr.data-icon-color]=\"\r\n passwordStrengthPercent <= 25\r\n ? '#ef3e42'\r\n : passwordStrengthPercent <= 75\r\n ? '#ff9f00'\r\n : '#6cc24a'\r\n \"\r\n ></div>\r\n </div>\r\n </div>\r\n <div class=\"h-1.5 w-full bg-[#eef0f2] rounded-full overflow-hidden\">\r\n <div\r\n class=\"h-full transition-all duration-300 rounded-full\"\r\n [ngClass]=\"{\r\n 'bg-[#ef3e42]': passwordStrengthPercent <= 25,\r\n 'bg-[#ff9f00]': passwordStrengthPercent > 25 && passwordStrengthPercent <= 75,\r\n 'bg-[#6cc24a]': passwordStrengthPercent > 75,\r\n }\"\r\n [style.width.%]=\"passwordStrengthPercent\"\r\n ></div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Number Field -->\r\n @case ('number') {\r\n <div class=\"relative w-full\">\r\n @if (field.prefix?.icon) {\r\n <div class=\"absolute left-0 top-1/2 -translate-y-1/2 pl-3 flex items-center\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.prefix!.icon\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"medium\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n </div>\r\n }\r\n <input\r\n [type]=\"field.type === 'number' && field.isCurrency ? 'text' : 'number'\"\r\n [name]=\"field.name\"\r\n [id]=\"uniqueId\"\r\n [required]=\"field.required || false\"\r\n [placeholder]=\"field.placeholder || '' | translate\"\r\n [disabled]=\"isDisabled || false\"\r\n [readOnly]=\"field.readOnly || false\"\r\n [formControl]=\"control\"\r\n [min]=\"field.type === 'number' && !field.isCurrency ? 0 : null\"\r\n [max]=\"field.type === 'number' && !field.isCurrency ? field.max : null\"\r\n [step]=\"field.type === 'number' && !field.isCurrency ? field.step || 1 : null\"\r\n (input)=\"handleNumberInput($event, field.minFractionDigits || 2)\"\r\n (paste)=\"handleNumberPaste($event, field.minFractionDigits || 2)\"\r\n (blur)=\"handleBlur($event, field.minFractionDigits || 2)\"\r\n (keydown)=\"handleNumberKeydown($event, field.isCurrency || false)\"\r\n class=\"fn-input-field\"\r\n [ngClass]=\"{\r\n disabled: control.disabled || field.readOnly,\r\n error: control.touched && control.errors,\r\n success: field['hasSuccessBorder'] && control.valid && !control.errors,\r\n 'pl-10': field.prefix?.icon,\r\n 'text-[24px] font-bold': field.isCurrency,\r\n }\"\r\n [ngStyle]=\"{\r\n color: field.valueColor || 'inherit',\r\n 'font-size': field.valueSize || '',\r\n }\"\r\n (focus)=\"onFocus()\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Default Input Field (text, email, etc.) -->\r\n @default {\r\n <div class=\"relative z-0\">\r\n @if (field.prefix?.icon) {\r\n <div class=\"absolute left-0 top-1/2 -translate-y-1/2 pl-3 flex items-center\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.prefix!.icon\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"medium\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n </div>\r\n }\r\n <input\r\n [type]=\"field.type\"\r\n [name]=\"field.name\"\r\n [id]=\"uniqueId\"\r\n [required]=\"field.required || false\"\r\n [placeholder]=\"field.placeholder || '' | translate\"\r\n [disabled]=\"field.disabled || false\"\r\n [readOnly]=\"field.readOnly || false\"\r\n [formControl]=\"control\"\r\n (input)=\"\r\n isEmailField\r\n ? handleEmailInput($event)\r\n : field.type === 'text' && isAlphanumeric\r\n ? handleAlphanumericInput($event)\r\n : handleInput($event)\r\n \"\r\n (blur)=\"handleBlur($event)\"\r\n class=\"fn-input-field\"\r\n [ngClass]=\"{\r\n disabled: control.disabled || field.readOnly,\r\n error: control.touched && control.errors,\r\n success: field['hasSuccessBorder'] && control.valid && !control.errors,\r\n 'pl-10': field.prefix?.icon,\r\n 'pr-10': (field.icon || field.suffix?.icon) && !field.isCopyText,\r\n 'pr-20':\r\n field.isCopyText && !field.hasGenerateKey && !(field.icon || field.suffix?.icon),\r\n 'pr-30':\r\n field.isCopyText && field.hasGenerateKey && !(field.icon || field.suffix?.icon),\r\n 'pr-32':\r\n field.isCopyText && field.hasGenerateKey && (field.icon || field.suffix?.icon),\r\n }\"\r\n [ngStyle]=\"{\r\n color: field.valueColor || 'inherit',\r\n 'font-size': field.valueSize || '',\r\n }\"\r\n (focus)=\"onFocus()\"\r\n />\r\n\r\n <div class=\"absolute right-0 top-1/2 -translate-y-1/2 flex items-center pr-3 gap-2\">\r\n @if (field.isCopyText) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"copyText($event)\"\r\n (keydown)=\"copyText($event)\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"two-square\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n @if (field.hasGenerateKey) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n (keydown)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"round-arrow-top-left\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n }\r\n }\r\n\r\n @if (field.icon || field.suffix?.icon) {\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.suffix?.icon || field.icon!.name\"\r\n [attr.data-icon-variant]=\"field.icon?.variant || 'Line'\"\r\n [attr.data-icon-size]=\"field.icon ? getIconSizeName(field.icon.size) : 'medium'\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n </ng-container>\r\n\r\n @if (showFormFieldMessage(control, helperText)) {\r\n <div class=\"fn-field-message-container\">\r\n <span\r\n class=\"fn-field-message-text\"\r\n [ngClass]=\"{\r\n error: isError,\r\n success: isSuccess,\r\n }\"\r\n >\r\n {{ getFieldMessage() | translate }}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Integrated Toast Notifications -->\r\n <div class=\"toast-container\">\r\n @for (toast of toasts(); track toast.id) {\r\n <div class=\"toast toast-{{ toast.type }}\" [class.toast-enter]=\"toast.isVisible\">\r\n <span class=\"toast-icon\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"getToastIconName(toast)\"\r\n data-icon-variant=\"Colour\"\r\n data-icon-size=\"medium\"\r\n [attr.data-icon-color]=\"\r\n toast.type === 'success'\r\n ? '#6cc24a'\r\n : toast.type === 'warn'\r\n ? '#ff9f00'\r\n : toast.type === 'error'\r\n ? '#ef3e42'\r\n : '#03182b'\r\n \"\r\n ></div>\r\n </span>\r\n <div class=\"toast-content\">\r\n <span class=\"toast-message\">\r\n {{ getTranslatedMessage(toast.message) | translate }}\r\n </span>\r\n </div>\r\n <button class=\"toast-close\" (click)=\"removeToast(toast.id)\" aria-label=\"Close\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"cross\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"medium\"\r\n data-icon-color=\"#ffffff\"\r\n ></div>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n}\r\n", styles: [".fn-input-container{display:flex;flex-direction:column;width:100%}.fn-label{font-family:Outfit,sans-serif;font-weight:500;margin-bottom:8px;display:flex;align-items:center}.fn-label span{color:#c4cdd2;font-size:14px;font-weight:400}.fn-input-field{width:100%;height:48px;padding:0 16px;background-color:#f7f8f9;border-bottom:1.5px solid #c4cdd2;font-family:Outfit,sans-serif;font-size:16px;color:#03182b;transition:all .2s ease;border-radius:4px 4px 0 0}.fn-input-field::placeholder{color:#c4cdd2}.fn-input-field:focus{outline:none;background-color:#fff;border-bottom-color:#03182b}.fn-input-field.error{border-bottom-color:#ef3e42}.fn-input-field.success{border-bottom-color:#6cc24a}.fn-input-field.disabled{background-color:#eef0f2;color:#c4cdd2;cursor:not-allowed}.fn-input-field.pl-10{padding-left:40px!important}.fn-input-field.pr-10{padding-right:40px!important}.fn-input-field.pr-12{padding-right:44px!important}.fn-input-field.pr-20{padding-right:72px!important}.fn-input-field.pr-24{padding-right:88px!important}.fn-input-field.pr-30{padding-right:104px!important}.fn-input-field.pr-32{padding-right:120px!important}.fn-field-message-container{margin-top:4px}.fn-field-message-text{font-family:Outfit,sans-serif;font-size:12px;color:#c4cdd2}.fn-field-message-text.error{color:#ef3e42}.fn-field-message-text.success{color:#6cc24a}.icon-container{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px}.relative{position:relative}.absolute{position:absolute}.right-0{right:0}.left-0{left:0}.top-1\\/2{top:50%}.-translate-y-1\\/2{transform:translateY(-50%)}.flex{display:flex}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.pr-3{padding-right:.75rem}.pl-3{padding-left:.75rem}.mt-2{margin-top:.5rem}.space-y-1>:not([hidden])~:not([hidden]){margin-top:.25rem}.text-xs{font-size:.75rem}.font-medium{font-weight:500}.h-1\\.5{height:.375rem}.w-full{width:100%}.bg-\\[\\#eef0f2\\]{background-color:#eef0f2}.rounded-full{border-radius:9999px}.overflow-hidden{overflow:hidden}.transition-all{transition-property:all}.duration-300{transition-duration:.3s}.cursor-pointer{cursor:pointer}.opacity-50{opacity:.5}.cursor-not-allowed{cursor:not-allowed}.text-ellipsis{text-overflow:ellipsis}.toast-container{position:fixed;top:24px;left:50%;transform:translate(-50%);z-index:9999;width:100%;max-width:336px;display:flex;flex-direction:column;gap:8px;pointer-events:none}.toast{display:flex;align-items:center;background:#25333f;border-radius:8px;padding:12px;width:336px;max-width:100%;opacity:0;transform:translateY(-20px);transition:all .3s cubic-bezier(.4,0,.2,1);pointer-events:auto}.toast.toast-enter{opacity:1;transform:translateY(0)}.toast.toast-success{border-left:4px solid #6cc24a}.toast.toast-warn{border-left:4px solid #ff9f00}.toast.toast-error{border-left:4px solid #ef3e42}.toast.toast-info{border-left:4px solid #3b82f6}.toast .toast-icon{width:24px;height:24px;display:flex;align-items:center;justify-content:center;margin-right:8px;flex-shrink:0}.toast .toast-content{flex:1;min-width:0}.toast .toast-message{font-size:14px;line-height:20px;color:#fff;display:block}.toast .toast-close{background:none;border:none;font-size:20px;color:#fff;opacity:.7;cursor:pointer;padding:0;margin-left:8px;width:24px;height:24px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:opacity .2s;pointer-events:auto}.toast .toast-close:hover{opacity:1}\n"] }]
1167
+ args: [{ selector: 'fn-input', standalone: true, imports: [FormsModule, CommonModule, ReactiveFormsModule, TranslateModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (field.name && isVisible() && !field.hidden) {\r\n <div class=\"fn-input-container\">\r\n @if (field.type! !== 'hidden') {\r\n <label\r\n [for]=\"uniqueId\"\r\n class=\"fn-label\"\r\n [ngStyle]=\"{\r\n color: field.color || '#03182b',\r\n 'font-size': field.labelSize || '',\r\n }\"\r\n >\r\n {{ getTranslatedLabel(field.label) }}\r\n @if (!field.required && !field.hideOptional) {\r\n <span>&nbsp;(Optional)</span>\r\n }\r\n </label>\r\n }\r\n\r\n <ng-container>\r\n @switch (field.type) {\r\n <!-- Textarea Field -->\r\n @case ('textarea') {\r\n <textarea\r\n #fnTextarea\r\n style=\"resize: none\"\r\n [name]=\"field.name\"\r\n [id]=\"uniqueId\"\r\n [required]=\"field.required || false\"\r\n [placeholder]=\"field.placeholder || '' | translate\"\r\n [disabled]=\"field.disabled || false\"\r\n [rows]=\"field.rows || 1\"\r\n [readonly]=\"field.readOnly || false\"\r\n [formControl]=\"control\"\r\n (input)=\"handleTextArea($event)\"\r\n (blur)=\"handleBlur($event)\"\r\n class=\"fn-input-field\"\r\n [ngClass]=\"{\r\n disabled: control.disabled || field.readOnly,\r\n error: control.touched && control.errors,\r\n success: field['hasSuccessBorder'] && control.valid && !control.errors,\r\n }\"\r\n [ngStyle]=\"{\r\n color: field.valueColor || 'inherit',\r\n 'font-size': field.valueSize || '',\r\n }\"\r\n (focus)=\"onFocus()\"\r\n ></textarea>\r\n }\r\n\r\n <!-- Password Field -->\r\n @case ('password') {\r\n <div class=\"relative w-full\">\r\n @if (field.prefix?.icon || field.prefix?.text) {\r\n <div\r\n class=\"absolute left-0 top-1/2 -translate-y-1/2 pl-3 flex items-center gap-2\"\r\n style=\"z-index: 1\"\r\n >\r\n @if (field.prefix?.icon) {\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.prefix!.icon\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"medium\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n }\r\n @if (field.prefix?.text) {\r\n <span\r\n class=\"text-sm font-medium whitespace-nowrap\"\r\n [ngStyle]=\"{ color: control.disabled ? '#c4cdd2' : '#03182b' }\"\r\n (click)=\"prefixClick($event)\"\r\n (keydown.enter)=\"prefixClick($event)\"\r\n [attr.tabindex]=\"field.prefix?.onClick ? 0 : null\"\r\n [class.cursor-pointer]=\"!!field.prefix?.onClick\"\r\n >{{ field.prefix!.text }}</span\r\n >\r\n }\r\n </div>\r\n }\r\n <input\r\n [type]=\"showPassword ? 'text' : 'password'\"\r\n [id]=\"uniqueId\"\r\n [required]=\"field.required || false\"\r\n [disabled]=\"field.disabled || false\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"field.placeholder || '' | translate\"\r\n [readonly]=\"field.readOnly || false\"\r\n (input)=\"isAlphanumeric ? handleAlphanumericInput($event) : handleInput($event)\"\r\n (focus)=\"onPasswordFocus()\"\r\n (blur)=\"handlePasswordBlur($event)\"\r\n class=\"fn-input-field overflow-hidden text-ellipsis\"\r\n [ngClass]=\"{\r\n disabled: control.disabled || field.readOnly,\r\n error: control.touched && control.errors,\r\n success: field['hasSuccessBorder'] && control.valid,\r\n 'pl-10': field.prefix?.icon && !field.prefix?.text,\r\n 'has-prefix-text': !!field.prefix?.text,\r\n 'pr-12':\r\n (field.toggleMask && !field.isCopyText) ||\r\n (!field.toggleMask && field.isCopyText),\r\n 'pr-24': field.toggleMask && field.isCopyText && !field.hasGenerateKey,\r\n 'pr-32': field.toggleMask && field.isCopyText && field.hasGenerateKey,\r\n }\"\r\n [ngStyle]=\"{\r\n color: field.valueColor || 'inherit',\r\n 'font-size': field.valueSize || '',\r\n }\"\r\n />\r\n\r\n <div class=\"absolute right-0 top-1/2 -translate-y-1/2 flex items-center pr-3 gap-2\">\r\n @if (field.toggleMask && !field.isCopyText) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"togglePasswordVisibility()\"\r\n (keydown)=\"togglePasswordVisibility()\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"showPassword ? 'eye-open' : 'eye-close'\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"large\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n } @else if (field.isCopyText && !field.toggleMask) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"copyText($event)\"\r\n (keydown)=\"copyText($event)\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"two-square\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n @if (field.hasGenerateKey) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n (keydown)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"round-arrow-top-left\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"large\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n }\r\n } @else if (field.toggleMask && field.isCopyText) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"togglePasswordVisibility()\"\r\n (keydown)=\"togglePasswordVisibility()\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"showPassword ? 'eye-open' : 'eye-close'\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"large\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"copyText($event)\"\r\n (keydown)=\"copyText($event)\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"two-square\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n @if (field.hasGenerateKey) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n (keydown)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n [ngClass]=\"{ 'opacity-50 cursor-not-allowed': !control.value }\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"round-arrow-top-left\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n }\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (field.feedback && isPasswordFocused) {\r\n <div class=\"mt-2 space-y-1\">\r\n <div class=\"flex items-center justify-between text-xs\">\r\n <span class=\"font-medium\" [ngClass]=\"strengthClass\">\r\n {{ passwordStrengthLabel | translate }}\r\n </span>\r\n <div class=\"flex items-center gap-1\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"\r\n passwordStrengthPercent > 50 ? 'check-circle' : 'info-circle'\r\n \"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"extrasmall\"\r\n [attr.data-icon-color]=\"\r\n passwordStrengthPercent <= 25\r\n ? '#ef3e42'\r\n : passwordStrengthPercent <= 75\r\n ? '#ff9f00'\r\n : '#6cc24a'\r\n \"\r\n ></div>\r\n </div>\r\n </div>\r\n <div class=\"h-1.5 w-full bg-[#eef0f2] rounded-full overflow-hidden\">\r\n <div\r\n class=\"h-full transition-all duration-300 rounded-full\"\r\n [ngClass]=\"{\r\n 'bg-[#ef3e42]': passwordStrengthPercent <= 25,\r\n 'bg-[#ff9f00]': passwordStrengthPercent > 25 && passwordStrengthPercent <= 75,\r\n 'bg-[#6cc24a]': passwordStrengthPercent > 75,\r\n }\"\r\n [style.width.%]=\"passwordStrengthPercent\"\r\n ></div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Number Field -->\r\n @case ('number') {\r\n <div class=\"relative w-full\">\r\n @if (field.prefix?.icon || field.prefix?.text) {\r\n <div\r\n class=\"absolute left-0 top-1/2 -translate-y-1/2 pl-3 flex items-center gap-2\"\r\n style=\"z-index: 1\"\r\n >\r\n @if (field.prefix?.icon) {\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.prefix!.icon\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"medium\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n }\r\n @if (field.prefix?.text) {\r\n <span\r\n class=\"text-sm font-medium whitespace-nowrap\"\r\n [ngStyle]=\"{ color: control.disabled ? '#c4cdd2' : '#03182b' }\"\r\n (click)=\"prefixClick($event)\"\r\n (keydown.enter)=\"prefixClick($event)\"\r\n [attr.tabindex]=\"field.prefix?.onClick ? 0 : null\"\r\n [class.cursor-pointer]=\"!!field.prefix?.onClick\"\r\n >{{ field.prefix!.text }}</span\r\n >\r\n }\r\n </div>\r\n }\r\n <input\r\n [type]=\"field.type === 'number' && field.isCurrency ? 'text' : 'number'\"\r\n [name]=\"field.name\"\r\n [id]=\"uniqueId\"\r\n [required]=\"field.required || false\"\r\n [placeholder]=\"field.placeholder || '' | translate\"\r\n [disabled]=\"isDisabled || false\"\r\n [readOnly]=\"field.readOnly || false\"\r\n [formControl]=\"control\"\r\n [min]=\"field.type === 'number' && !field.isCurrency ? 0 : null\"\r\n [max]=\"field.type === 'number' && !field.isCurrency ? field.max : null\"\r\n [step]=\"field.type === 'number' && !field.isCurrency ? field.step || 1 : null\"\r\n (input)=\"handleNumberInput($event, field.minFractionDigits || 2)\"\r\n (paste)=\"handleNumberPaste($event, field.minFractionDigits || 2)\"\r\n (blur)=\"handleBlur($event, field.minFractionDigits || 2)\"\r\n (keydown)=\"handleNumberKeydown($event, field.isCurrency || false)\"\r\n class=\"fn-input-field\"\r\n [ngClass]=\"{\r\n disabled: control.disabled || field.readOnly,\r\n error: control.touched && control.errors,\r\n success: field['hasSuccessBorder'] && control.valid && !control.errors,\r\n 'pl-10': field.prefix?.icon && !field.prefix?.text,\r\n 'has-prefix-text': !!field.prefix?.text,\r\n 'pr-10': field.suffix?.icon && !field.suffix?.text,\r\n 'has-suffix-text': !!field.suffix?.text,\r\n 'text-[24px] font-bold': field.isCurrency,\r\n }\"\r\n [ngStyle]=\"{\r\n color: field.valueColor || 'inherit',\r\n 'font-size': field.valueSize || '',\r\n }\"\r\n (focus)=\"onFocus()\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Default Input Field (text, email, etc.) -->\r\n @default {\r\n <div class=\"relative z-0\">\r\n @if (field.prefix?.icon || field.prefix?.text) {\r\n <div\r\n class=\"absolute left-0 top-1/2 -translate-y-1/2 pl-3 flex items-center gap-2\"\r\n style=\"z-index: 1\"\r\n >\r\n @if (field.prefix?.icon) {\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.prefix!.icon\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"medium\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n }\r\n @if (field.prefix?.text) {\r\n <span\r\n class=\"text-sm font-medium whitespace-nowrap\"\r\n [ngStyle]=\"{ color: control.disabled ? '#c4cdd2' : '#03182b' }\"\r\n (click)=\"prefixClick($event)\"\r\n (keydown.enter)=\"prefixClick($event)\"\r\n [attr.tabindex]=\"field.prefix?.onClick ? 0 : null\"\r\n [class.cursor-pointer]=\"!!field.prefix?.onClick\"\r\n >{{ field.prefix!.text }}</span\r\n >\r\n }\r\n </div>\r\n }\r\n <input\r\n [type]=\"field.type\"\r\n [name]=\"field.name\"\r\n [id]=\"uniqueId\"\r\n [required]=\"field.required || false\"\r\n [placeholder]=\"field.placeholder || '' | translate\"\r\n [disabled]=\"field.disabled || false\"\r\n [readOnly]=\"field.readOnly || false\"\r\n [formControl]=\"control\"\r\n (input)=\"\r\n isEmailField\r\n ? handleEmailInput($event)\r\n : field.type === 'text' && isAlphanumeric\r\n ? handleAlphanumericInput($event)\r\n : handleInput($event)\r\n \"\r\n (blur)=\"handleBlur($event)\"\r\n class=\"fn-input-field\"\r\n [ngClass]=\"{\r\n disabled: control.disabled || field.readOnly,\r\n error: control.touched && control.errors,\r\n success: field['hasSuccessBorder'] && control.valid && !control.errors,\r\n 'pl-10': field.prefix?.icon && !field.prefix?.text,\r\n 'has-prefix-text': !!field.prefix?.text,\r\n 'pr-10':\r\n (field.icon || field.suffix?.icon) && !field.isCopyText && !field.suffix?.text,\r\n 'has-suffix-text': !!field.suffix?.text,\r\n 'pr-20':\r\n field.isCopyText && !field.hasGenerateKey && !(field.icon || field.suffix?.icon),\r\n 'pr-30':\r\n field.isCopyText && field.hasGenerateKey && !(field.icon || field.suffix?.icon),\r\n 'pr-32':\r\n field.isCopyText && field.hasGenerateKey && (field.icon || field.suffix?.icon),\r\n }\"\r\n [ngStyle]=\"{\r\n color: field.valueColor || 'inherit',\r\n 'font-size': field.valueSize || '',\r\n }\"\r\n (focus)=\"onFocus()\"\r\n />\r\n\r\n <div class=\"absolute right-0 top-1/2 -translate-y-1/2 flex items-center pr-3 gap-2\">\r\n @if (field.isCopyText) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"copyText($event)\"\r\n (keydown)=\"copyText($event)\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"two-square\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n @if (field.hasGenerateKey) {\r\n <span\r\n class=\"cursor-pointer\"\r\n (click)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n (keydown)=\"field.onGenerateKey && field.onGenerateKey()\"\r\n >\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"round-arrow-top-left\"\r\n data-icon-color=\"#03182b\"\r\n ></div>\r\n </span>\r\n }\r\n }\r\n\r\n @if (field.icon || field.suffix?.icon || field.suffix?.text) {\r\n @if (field.suffix?.text) {\r\n <span\r\n class=\"text-sm font-medium whitespace-nowrap\"\r\n [ngStyle]=\"{ color: control.disabled ? '#c4cdd2' : '#03182b' }\"\r\n (click)=\"suffixClick($event)\"\r\n (keydown.enter)=\"suffixClick($event)\"\r\n [attr.tabindex]=\"field.suffix?.onClick ? 0 : null\"\r\n [class.cursor-pointer]=\"!!field.suffix?.onClick\"\r\n >{{ field.suffix!.text }}</span\r\n >\r\n }\r\n @if (field.icon || field.suffix?.icon) {\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.suffix?.icon || field.icon!.name\"\r\n [attr.data-icon-variant]=\"field.icon?.variant || 'Line'\"\r\n [attr.data-icon-size]=\"field.icon ? getIconSizeName(field.icon.size) : 'medium'\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n </ng-container>\r\n\r\n @if (showFormFieldMessage(control, helperText)) {\r\n <div class=\"fn-field-message-container\">\r\n <span\r\n class=\"fn-field-message-text\"\r\n [ngClass]=\"{\r\n error: isError,\r\n success: isSuccess,\r\n }\"\r\n >\r\n {{ getFieldMessage() | translate }}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Integrated Toast Notifications -->\r\n <div class=\"toast-container\">\r\n @for (toast of toasts(); track toast.id) {\r\n <div class=\"toast toast-{{ toast.type }}\" [class.toast-enter]=\"toast.isVisible\">\r\n <span class=\"toast-icon\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"getToastIconName(toast)\"\r\n data-icon-variant=\"Colour\"\r\n data-icon-size=\"medium\"\r\n [attr.data-icon-color]=\"\r\n toast.type === 'success'\r\n ? '#6cc24a'\r\n : toast.type === 'warn'\r\n ? '#ff9f00'\r\n : toast.type === 'error'\r\n ? '#ef3e42'\r\n : '#03182b'\r\n \"\r\n ></div>\r\n </span>\r\n <div class=\"toast-content\">\r\n <span class=\"toast-message\">\r\n {{ getTranslatedMessage(toast.message) | translate }}\r\n </span>\r\n </div>\r\n <button class=\"toast-close\" (click)=\"removeToast(toast.id)\" aria-label=\"Close\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n data-icon-name=\"cross\"\r\n data-icon-variant=\"Line\"\r\n data-icon-size=\"medium\"\r\n data-icon-color=\"#ffffff\"\r\n ></div>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n}\r\n", styles: [".fn-input-container{display:flex;flex-direction:column;width:100%}.fn-label{font-family:Outfit,sans-serif;font-weight:500;margin-bottom:8px;display:flex;align-items:center}.fn-label span{color:#c4cdd2;font-size:14px;font-weight:400}.fn-input-field{width:100%;height:48px;padding:0 16px;background-color:#f7f8f9;border-bottom:1.5px solid #c4cdd2;font-family:Outfit,sans-serif;font-size:16px;color:#03182b;transition:all .2s ease;border-radius:4px 4px 0 0}.fn-input-field::placeholder{color:#c4cdd2}.fn-input-field:focus{outline:none;background-color:#fff;border-bottom-color:#03182b}.fn-input-field.error{border-bottom-color:#ef3e42}.fn-input-field.success{border-bottom-color:#6cc24a}.fn-input-field.disabled{background-color:#eef0f2;color:#c4cdd2;cursor:not-allowed}.fn-input-field.pl-10{padding-left:40px!important}.fn-input-field.has-prefix-text{padding-left:100px!important}.fn-input-field.pr-10{padding-right:40px!important}.fn-input-field.has-suffix-text{padding-right:120px!important}.fn-input-field.pr-12{padding-right:44px!important}.fn-input-field.pr-20{padding-right:72px!important}.fn-input-field.pr-24{padding-right:88px!important}.fn-input-field.pr-30{padding-right:104px!important}.fn-input-field.pr-32{padding-right:120px!important}.fn-field-message-container{margin-top:4px}.fn-field-message-text{font-family:Outfit,sans-serif;font-size:12px;color:#c4cdd2}.fn-field-message-text.error{color:#ef3e42}.fn-field-message-text.success{color:#6cc24a}.icon-container{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px}.relative{position:relative}.absolute{position:absolute}.right-0{right:0}.left-0{left:0}.top-1\\/2{top:50%}.-translate-y-1\\/2{transform:translateY(-50%)}.flex{display:flex}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.pr-3{padding-right:.75rem}.pl-3{padding-left:.75rem}.mt-2{margin-top:.5rem}.space-y-1>:not([hidden])~:not([hidden]){margin-top:.25rem}.text-xs{font-size:.75rem}.font-medium{font-weight:500}.h-1\\.5{height:.375rem}.w-full{width:100%}.bg-\\[\\#eef0f2\\]{background-color:#eef0f2}.rounded-full{border-radius:9999px}.overflow-hidden{overflow:hidden}.transition-all{transition-property:all}.duration-300{transition-duration:.3s}.cursor-pointer{cursor:pointer}.opacity-50{opacity:.5}.cursor-not-allowed{cursor:not-allowed}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.toast-container{position:fixed;top:24px;left:50%;transform:translate(-50%);z-index:9999;width:100%;max-width:336px;display:flex;flex-direction:column;gap:8px;pointer-events:none}.toast{display:flex;align-items:center;background:#25333f;border-radius:8px;padding:12px;width:336px;max-width:100%;opacity:0;transform:translateY(-20px);transition:all .3s cubic-bezier(.4,0,.2,1);pointer-events:auto}.toast.toast-enter{opacity:1;transform:translateY(0)}.toast.toast-success{border-left:4px solid #6cc24a}.toast.toast-warn{border-left:4px solid #ff9f00}.toast.toast-error{border-left:4px solid #ef3e42}.toast.toast-info{border-left:4px solid #3b82f6}.toast .toast-icon{width:24px;height:24px;display:flex;align-items:center;justify-content:center;margin-right:8px;flex-shrink:0}.toast .toast-content{flex:1;min-width:0}.toast .toast-message{font-size:14px;line-height:20px;color:#fff;display:block}.toast .toast-close{background:none;border:none;font-size:20px;color:#fff;opacity:.7;cursor:pointer;padding:0;margin-left:8px;width:24px;height:24px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:opacity .2s;pointer-events:auto}.toast .toast-close:hover{opacity:1}\n"] }]
1147
1168
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { field: [{
1148
1169
  type: Input
1149
1170
  }], helperHandle: [{
@@ -1167,4 +1188,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1167
1188
  type: ViewChildren,
1168
1189
  args: ['iconContainer']
1169
1190
  }] } });
1170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm4taW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZm4taW5wdXQvc3JjL2xpYi9mbi1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9mbi1pbnB1dC9zcmMvbGliL2ZuLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUlULFlBQVksR0FFYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsNEJBQTRCO0FBQzVCLE9BQU8sRUFBMEIsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBSUwscUJBQXFCLEVBR3JCLGdCQUFnQixHQUNqQixNQUFNLGtCQUFrQixDQUFDOzs7OztBQUkxQixNQUFNLFVBQVUsR0FBMkI7SUFDekMsVUFBVSxFQUFFLG1WQUFtVjtJQUMvVixXQUFXLEVBQUUsc1VBQXNVO0lBQ25WLFlBQVksRUFBRSxpVkFBaVY7SUFDL1Ysc0JBQXNCLEVBQUUsMFFBQTBRO0lBQ2xTLGNBQWMsRUFBRSxzUUFBc1E7SUFDdFIsYUFBYSxFQUFFLGljQUFpYztJQUNoZCxjQUFjLEVBQUUsa2NBQWtjO0lBQ2xkLG9CQUFvQixFQUFFLGtjQUFrYztJQUN4ZCxLQUFLLEVBQUUsc01BQXNN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QUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxRCxDQUFDO3dHQWgwQ1UsT0FBTzs0RkFBUCxPQUFPLGtnQkN6RHBCLGlra0JBMmFBLDI4R0R2WFksV0FBVyxtbkJBQUUsWUFBWSxpTkFBRSxtQkFBbUIsaU5BQUUsZUFBZTs7NEZBSzlELE9BQU87a0JBUm5CLFNBQVM7K0JBQ0UsVUFBVSxjQUNSLElBQUksV0FDUCxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxDQUFDLG1CQUd6RCx1QkFBdUIsQ0FBQyxNQUFNO3NGQUd0QyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQU1HLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUlrQixlQUFlO3NCQUF2QyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ1EsY0FBYztzQkFBNUMsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBpbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBzaWduYWwsXHJcbiAgVmlld0NoaWxkLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG4vLyBSZW1vdmVkIEh0dHBDbGllbnQgaW1wb3J0XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBtZXJnZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7XHJcbiAgRk5JbnB1dEJhc2UsXHJcbiAgRk5JbnB1dEhlbHBlcixcclxuICBGTklucHV0VG9hc3QsXHJcbiAgREVGQVVMVF9DVVJSRU5DWV9NRVRBLFxyXG4gIFR5cGVJY29uVmFyaWFudCxcclxuICBUeXBlSWNvblNpemUsXHJcbiAgRk5fVE9BU1RfU0VSVklDRSxcclxufSBmcm9tICcuL2ZuLWlucHV0LnR5cGVzJztcclxuXHJcbmV4cG9ydCB0eXBlIFR5cGVJY29uU2l6ZU5hbWUgPSAnZXh0cmFzbWFsbCcgfCAnc21hbGwnIHwgJ21lZGl1bScgfCAnbGFyZ2UnIHwgJ3gtbGFyZ2UnIHwgJ3h4bGFyZ2UnO1xyXG5cclxuY29uc3QgQ09SRV9JQ09OUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcclxuICAnZXllLW9wZW4nOiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0yIDEyczQtOCAxMC04IDEwIDggMTAgOC00IDgtMTAgOC0xMC04LTEwLTh6XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbiAgJ2V5ZS1jbG9zZSc6IGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTIgMTBhMTEgMTEgMCAwIDAgMjAgMFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk01IDEzbC0xIDJNMTIgMTR2Mk0xOSAxM2wxIDJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbiAgJ3R3by1zcXVhcmUnOiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHJlY3QgeD1cIjhcIiB5PVwiNFwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHJ4PVwiMlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk00IDh2MTBhMiAyIDAgMCAwIDIgMmgxMFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+YCxcclxuICAncm91bmQtYXJyb3ctdG9wLWxlZnQnOiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0yMyA0djZoLTZNMSAyMHYtNmg2TTMuNTEgOWE5IDkgMCAwIDEgMTQuODUtMy4zNkwyMyAxME0xIDE0bDQuNjQgNC4zNkE5IDkgMCAwIDAgMjAuNDkgMTVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbiAgJ2NoZWNrLWNpcmNsZSc6IGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiLz48cGF0aCBkPVwiTTggMTJsMyAzIDUtNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+YCxcclxuICAnaW5mby1jaXJjbGUnOiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTIuMDFcIiB5Mj1cIjhcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbiAgJ2FsZXJ0LWNpcmNsZSc6IGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbiAgJ2V4Y2xhbWF0aW9uLWNpcmNsZSc6IGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbiAgY3Jvc3M6IGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTE4IDZMNiAxOE02IDZsMTIgMTJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2ZuLWlucHV0JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtGb3Jtc01vZHVsZSwgQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBUcmFuc2xhdGVNb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mbi1pbnB1dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZm4taW5wdXQuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEZOSW5wdXQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBmaWVsZCA9IHt9IGFzIEZOSW5wdXRCYXNlO1xyXG4gIEBJbnB1dCgpIGhlbHBlckhhbmRsZT86IEZOSW5wdXRIZWxwZXI7XHJcbiAgQElucHV0KCkgdG9hc3RTZXJ2aWNlPzogRk5JbnB1dFRvYXN0O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0ZWRUb2FzdFNlcnZpY2UgPSBpbmplY3QoRk5fVE9BU1RfU0VSVklDRSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcclxuXHJcbiAgZ2V0IGVmZmVjdGl2ZVRvYXN0U2VydmljZSgpOiBGTklucHV0VG9hc3QgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMudG9hc3RTZXJ2aWNlIHx8IHRoaXMuaW5qZWN0ZWRUb2FzdFNlcnZpY2UgfHwgdW5kZWZpbmVkO1xyXG4gIH1cclxuICBASW5wdXQoKSBjdXJyZW5jeU1ldGEgPSBERUZBVUxUX0NVUlJFTkNZX01FVEE7XHJcbiAgQElucHV0KCkgZGVmYXVsdExvY2FsZSA9ICdlbi1VUyc7XHJcbiAgQElucHV0KCkgZm9ybSE6IEZvcm1Hcm91cDtcclxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGZpZWxkQmx1ciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcclxuICBoYXNGb2N1cyA9IHNpZ25hbChmYWxzZSk7XHJcbiAgQFZpZXdDaGlsZCgnZm5UZXh0YXJlYScpIHRleHRhcmVhRWxlbWVudCE6IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZHJlbignaWNvbkNvbnRhaW5lcicpIGljb25Db250YWluZXJzITogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcclxuXHJcbiAgLy8gSW50ZXJuYWwgVG9hc3QgU3RhdGVcclxuICB0b2FzdHMgPSBzaWduYWw8YW55W10+KFtdKTtcclxuXHJcbiAgLy8gUmVtb3ZlZCBIdHRwQ2xpZW50IGluamVjdGlvblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaXplTWFwOiBSZWNvcmQ8VHlwZUljb25TaXplTmFtZSwgVHlwZUljb25TaXplPiA9IHtcclxuICAgIGV4dHJhc21hbGw6IDEwLFxyXG4gICAgc21hbGw6IDE2LFxyXG4gICAgbWVkaXVtOiAyMCxcclxuICAgIGxhcmdlOiAyNCxcclxuICAgICd4LWxhcmdlJzogMzIsXHJcbiAgICB4eGxhcmdlOiA0OCxcclxuICB9O1xyXG5cclxuICBnZXRJY29uU2l6ZU5hbWUoc2l6ZTogbnVtYmVyKTogJ3NtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJyB8ICd4LWxhcmdlJyB7XHJcbiAgICBzd2l0Y2ggKHNpemUpIHtcclxuICAgICAgY2FzZSAxNjpcclxuICAgICAgICByZXR1cm4gJ3NtYWxsJztcclxuICAgICAgY2FzZSAyMDpcclxuICAgICAgICByZXR1cm4gJ21lZGl1bSc7XHJcbiAgICAgIGNhc2UgMjQ6XHJcbiAgICAgICAgcmV0dXJuICdsYXJnZSc7XHJcbiAgICAgIGNhc2UgMzI6XHJcbiAgICAgICAgcmV0dXJuICd4LWxhcmdlJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ21lZGl1bSc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaXNBbHBoYW51bWVyaWMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5maWVsZC5pc0FscGhhbnVtZXJpYyAhPT0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNFbWFpbEZpZWxkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGQudHlwZSA9PT0gJ2VtYWlsJyB8fCB0aGlzLmZpZWxkLm5hbWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2VtYWlsJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBhbHBoYW51bWVyaWNQYXR0ZXJuKCk6IFJlZ0V4cCB7XHJcbiAgICBpZiAodGhpcy5maWVsZC5pc0FkZHJlc3NMaW5lKSB7XHJcbiAgICAgIHJldHVybiAvW15BLVphLXowLTkgXFwtXyYoKSwvXS9nO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAvW15BLVphLXowLTkgXFwtXyYoKV0vZztcclxuICB9XHJcblxyXG4gIGlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICBjb250cm9sITogRm9ybUNvbnRyb2w7XHJcbiAgaXNWaXNpYmxlID0gc2lnbmFsKHRydWUpOyAvLyBUcmFjayB2aXNpYmlsaXR5IHN0YXRlXHJcbiAgaGVscGVyVGV4dCA9ICcnO1xyXG5cclxuICAvLyBVc2UgYSBjb3VudGVyLWJhc2VkIGFwcHJvYWNoIGZvciB1bmlxdWUgSURzIChzYWZlciB0aGFuIE1hdGgucmFuZG9tKCkpXHJcbiAgcHJpdmF0ZSBzdGF0aWMgaWRDb3VudGVyID0gMDtcclxuICB1bmlxdWVJZCA9IGBmbi1pbnB1dC0keysrRk5JbnB1dC5pZENvdW50ZXJ9YDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZpZWxkLmhpZGRlbikgcmV0dXJuO1xyXG4gICAgdGhpcy5oZWxwZXJUZXh0ID0gdGhpcy5maWVsZC5oZWxwZXJUZXh0ID8/ICcnO1xyXG4gICAgdGhpcy5pbml0Rm9ybUNvbnRyb2woKTtcclxuXHJcbiAgICBpZiAodGhpcy5maWVsZC52YWx1ZSkgdGhpcy5jb250cm9sLnNldFZhbHVlKHRoaXMuZmllbGQudmFsdWUpO1xyXG4gICAgdGhpcy5zZXR1cFZpc2liaWxpdHlDb25kaXRpb24oKTtcclxuICAgIHRoaXMuc2V0dXBGaWVsZE1lc3NhZ2VMaXN0ZW5lcigpO1xyXG4gICAgdGhpcy5zZXR1cFRvYXN0U3Vic2NyaXB0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vicy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ2ZpZWxkJ10gfHwgY2hhbmdlc1snZm9ybSddKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQWxsSWNvbnMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBGaWVsZE1lc3NhZ2VMaXN0ZW5lcigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jb250cm9sKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgdmFsJCA9IHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy5jb250cm9sLnZhbHVlKSk7XHJcbiAgICBjb25zdCBzdGF0dXMkID0gdGhpcy5jb250cm9sLnN0YXR1c0NoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy5jb250cm9sLnN0YXR1cykpO1xyXG5cclxuICAgIHRoaXMuc3Vicy5hZGQoXHJcbiAgICAgIG1lcmdlKHZhbCQsIHN0YXR1cyQpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0NEUiBkZXRlY3RDaGFuZ2VzIGZhaWxlZCBkdXJpbmcgZmllbGQgbWVzc2FnZSB1cGRhdGU6JywgZSk7XHJcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIEFjY2VzcyB0aGUgdGV4dGFyZWEgZWxlbWVudCBieSBWaWV3Q2hpbGQgb3IgbmF0aXZlIGVsZW1lbnQgcmVmZXJlbmNlXHJcbiAgICB0aGlzLmF1dG9SZXNpemVJbml0aWFsKCk7XHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSAndGV4dGFyZWEnICYmIHRoaXMuY29udHJvbD8udmFsdWUpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmF1dG9SZXNpemVJbml0aWFsKCksIDMwKTtcclxuICAgIH1cclxuICAgIC8vIEFwcGx5IGluaXRpYWwgZm9ybWF0dGluZyBhZnRlciB2aWV3IGlzIGluaXRpYWxpemVkXHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSAnbnVtYmVyJyAmJiB0aGlzLmZpZWxkLmlzQ3VycmVuY3kgJiYgdGhpcy5jb250cm9sPy52YWx1ZSkge1xyXG4gICAgICB0aGlzLmZvcm1hdEluaXRpYWxDdXJyZW5jeVZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldHVwSWNvbkNvbnRhaW5lcnNMaXN0ZW5lcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEljb25Db250YWluZXJzTGlzdGVuZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnMuYWRkKFxyXG4gICAgICB0aGlzLmljb25Db250YWluZXJzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUFsbEljb25zKCk7XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGVuZm9yY2VMb3dlcmNhc2UoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3Qgc3RhcnQgPSBpbnB1dC5zZWxlY3Rpb25TdGFydDtcclxuICAgIGNvbnN0IGVuZCA9IGlucHV0LnNlbGVjdGlvbkVuZDtcclxuXHJcbiAgICBpbnB1dC52YWx1ZSA9IGlucHV0LnZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAodGhpcy5jb250cm9sKSB7XHJcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShpbnB1dC52YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogaW5wdXQudmFsdWUgfSk7XHJcblxyXG4gICAgLy8gcmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gc28gdHlwaW5nIGlzIHNtb290aFxyXG4gICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgZW1haWwgaW5wdXQgLSBhbGxvd3Mgb25seSB2YWxpZCBlbWFpbCBjaGFyYWN0ZXJzIGFuZCBlbmZvcmNlcyBsb3dlcmNhc2UuXHJcbiAgICogQWxsb3dlZDogYS16LCAwLTksIC4gXyArIC0gQFxyXG4gICAqIFJ1bGVzOlxyXG4gICAqIC0gT25seSBvbmUgQCBhbGxvd2VkXHJcbiAgICogLSBObyBjb25zZWN1dGl2ZSBkb3RzICguLilcclxuICAgKiAtIEF1dG9tYXRpYyBsb3dlcmNhc2VcclxuICAgKi9cclxuICBoYW5kbGVFbWFpbElucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgfHwgMDtcclxuICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSBpbnB1dC52YWx1ZTtcclxuXHJcbiAgICAvLyAxLiBDb252ZXJ0IHRvIGxvd2VyY2FzZVxyXG4gICAgY29uc3QgbG93ZXJWYWx1ZSA9IG9yaWdpbmFsVmFsdWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAvLyAyLiBTcGxpdCBhdCB0aGUgZmlyc3QgQCB0byBoYW5kbGUgbG9jYWwgYW5kIGRvbWFpbiBwYXJ0cyBzZXBhcmF0ZWx5XHJcbiAgICBjb25zdCBwYXJ0cyA9IGxvd2VyVmFsdWUuc3BsaXQoJ0AnKTtcclxuICAgIGxldCBsb2NhbFBhcnQgPSBwYXJ0c1swXTtcclxuICAgIGxldCBkb21haW5QYXJ0ID0gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzLnNsaWNlKDEpLmpvaW4oJycpIDogbnVsbDtcclxuXHJcbiAgICAvLyAzLiBGaWx0ZXIgbG9jYWwgcGFydDogYS16LCAwLTksIC4sIF8sICssIC1cclxuICAgIC8vIFJ1bGU6IENhbm5vdCBzdGFydCB3aXRoIGEgZG90ICguKVxyXG4gICAgbG9jYWxQYXJ0ID0gbG9jYWxQYXJ0LnJlcGxhY2VBbGwoL1teYS16MC05Ll8rLV0vZywgJycpO1xyXG4gICAgd2hpbGUgKGxvY2FsUGFydC5zdGFydHNXaXRoKCcuJykpIHtcclxuICAgICAgbG9jYWxQYXJ0ID0gbG9jYWxQYXJ0LnN1YnN0cmluZygxKTtcclxuICAgIH1cclxuICAgIHdoaWxlIChsb2NhbFBhcnQuaW5jbHVkZXMoJy4uJykpIHtcclxuICAgICAgbG9jYWxQYXJ0ID0gbG9jYWxQYXJ0LnJlcGxhY2VBbGwoJy4uJywgJy4nKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA0LiBGaWx0ZXIgZG9tYWluIHBhcnQ6IGEteiwgMC05LCAuLCAtXHJcbiAgICAvLyBSdWxlOiBObyB1bmRlcnNjb3JlcyAoXyksIG5vIHBsdXMgc2lnbnMgKCspLCBjYW5ub3Qgc3RhcnQgd2l0aCBhIGh5cGhlbiAoLSlcclxuICAgIGxldCBmaWx0ZXJlZFZhbHVlID0gbG9jYWxQYXJ0O1xyXG4gICAgaWYgKGRvbWFpblBhcnQgIT09IG51bGwpIHtcclxuICAgICAgZG9tYWluUGFydCA9IGRvbWFpblBhcnQucmVwbGFjZUFsbCgvW15hLXowLTkuLV0vZywgJycpO1xyXG4gICAgICB3aGlsZSAoZG9tYWluUGFydC5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICBkb21haW5QYXJ0ID0gZG9tYWluUGFydC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgIH1cclxuICAgICAgd2hpbGUgKGRvbWFpblBhcnQuaW5jbHVkZXMoJy4uJykpIHtcclxuICAgICAgICBkb21haW5QYXJ0ID0gZG9tYWluUGFydC5yZXBsYWNlQWxsKCcuLicsICcuJyk7XHJcbiAgICAgIH1cclxuICAgICAgZmlsdGVyZWRWYWx1ZSArPSAnQCcgKyBkb21haW5QYXJ0O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcmlnaW5hbFZhbHVlICE9PSBmaWx0ZXJlZFZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IGNoYXJzUmVtb3ZlZEJlZm9yZUN1cnNvciA9IHRoaXMuY291bnRSZW1vdmVkQ2hhcnNCZWZvcmVDdXJzb3IoXHJcbiAgICAgICAgb3JpZ2luYWxWYWx1ZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgIGZpbHRlcmVkVmFsdWUsXHJcbiAgICAgICAgY3Vyc29yUG9zaXRpb24sXHJcbiAgICAgICk7XHJcbiAgICAgIGlucHV0LnZhbHVlID0gZmlsdGVyZWRWYWx1ZTtcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGZpbHRlcmVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gTWF0aC5tYXgoMCwgY3Vyc29yUG9zaXRpb24gLSBjaGFyc1JlbW92ZWRCZWZvcmVDdXJzb3IpO1xyXG4gICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShuZXdDdXJzb3JQb3MsIG5ld0N1cnNvclBvcyk7XHJcbiAgICB9IGVsc2UgaWYgKG9yaWdpbmFsVmFsdWUgIT09IGxvd2VyVmFsdWUpIHtcclxuICAgICAgLy8gSWYgb25seSBjYXNlIGNoYW5nZWQgKGUuZy4sIHR5cGVkIFVwcGVyY2FzZSlcclxuICAgICAgaW5wdXQudmFsdWUgPSBmaWx0ZXJlZFZhbHVlO1xyXG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoZmlsdGVyZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShjdXJzb3JQb3NpdGlvbiwgY3Vyc29yUG9zaXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpZWxkLnR5cGUgPT09ICdwYXNzd29yZCcgJiYgdGhpcy5maWVsZC5mZWVkYmFjaykge1xyXG4gICAgICB0aGlzLmNoZWNrUGFzc3dvcmRTdHJlbmd0aChmaWx0ZXJlZFZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiBmaWx0ZXJlZFZhbHVlIH0pO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIG9uRm9jdXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhhc0ZvY3VzLnNldCh0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0SW5pdGlhbEN1cnJlbmN5VmFsdWUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBudW1lcmljVmFsdWUgPSBOdW1iZXIodGhpcy5jb250cm9sLnZhbHVlKTtcclxuICAgIGlmICghTnVtYmVyLmlzTmFOKG51bWVyaWNWYWx1ZSkpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy51bmlxdWVJZCkgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICBpZiAoaW5wdXRFbGVtZW50KSB7XHJcbiAgICAgICAgICBpbnB1dEVsZW1lbnQudmFsdWUgPSB0aGlzLmZvcm1hdEN1cnJlbmN5V2l0aENvbW1hcyhudW1lcmljVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgNTApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdEZvcm1Db250cm9sKCkge1xyXG4gICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuZm9ybS5jb250cm9scz8uW3RoaXMuZmllbGQubmFtZV07XHJcbiAgICB0aGlzLmNvbnRyb2wgPSBjb250cm9sbGVyIGFzIEZvcm1Db250cm9sO1xyXG4gICAgaWYgKHRoaXMuZmllbGQudmFsdWUpIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh0aGlzLmZpZWxkLnZhbHVlKTtcclxuXHJcbiAgICBpZiAodGhpcy5jb250cm9sKSB7XHJcbiAgICAgIC8vIEhhbmRsZSBkaXNhYmxlZCBzdGF0ZVxyXG4gICAgICBpZiAodGhpcy5maWVsZC5kaXNhYmxlZCA/PyBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMuY29udHJvbD8uZGlzYWJsZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY29udHJvbD8uZW5hYmxlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGF1dG9SZXNpemVJbml0aWFsKCkge1xyXG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnRleHRhcmVhRWxlbWVudD8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmICh0ZXh0YXJlYSkge1xyXG4gICAgICAvLyBHZXQgdGhlIG51bWJlciBvZiByb3dzIChkZWZhdWx0IHRvIDIgaWYgbm90IHNwZWNpZmllZClcclxuICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZmllbGQucm93cyB8fCAxO1xyXG5cclxuICAgICAgLy8gQ2FsY3VsYXRlIGxpbmUgaGVpZ2h0IGZyb20gY29tcHV0ZWQgc3R5bGVzXHJcbiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnbG9iYWxUaGlzLmdldENvbXB1dGVkU3R5bGUodGV4dGFyZWEpO1xyXG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gTnVtYmVyLnBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5saW5lSGVpZ2h0KSB8fCAzMjsgLy8gRGVmYXVsdCB0byAyNHB4IGlmIG5vdCBzZXRcclxuXHJcbiAgICAgIC8vIENhbGN1bGF0ZSBtaW5pbXVtIGhlaWdodCBiYXNlZCBvbiByb3dzXHJcbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IHJvd3MgKiBsaW5lSGVpZ2h0O1xyXG5cclxuICAgICAgLy8gUmVzZXQgaGVpZ2h0IHRvIGF1dG8gdG8gZ2V0IGFjY3VyYXRlIHNjcm9sbEhlaWdodFxyXG4gICAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XHJcblxyXG4gICAgICAvLyBVc2UgdGhlIGxhcmdlciBvZiBzY3JvbGxIZWlnaHQgb3IgbWluSGVpZ2h0XHJcbiAgICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWF4KHRleHRhcmVhLnNjcm9sbEhlaWdodCwgbWluSGVpZ2h0KTtcclxuICAgICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gbmV3SGVpZ2h0ICsgJ3B4JztcclxuICAgICAgdGV4dGFyZWEuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVRleHRBcmVhKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50O1xyXG4gICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBlbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9IGVsZW1lbnQudmFsdWU7XHJcblxyXG4gICAgLy8gQXBwbHkgYWxwaGFudW1lcmljIGZpbHRlcmluZyBpZiBlbmFibGVkXHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSAndGV4dGFyZWEnICYmIHRoaXMuaXNBbHBoYW51bWVyaWMpIHtcclxuICAgICAgLy8gT25seSBhbGxvdyBjaGFyYWN0ZXJzIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBwYXR0ZXJuXHJcbiAgICAgIGNvbnN0IGFscGhhbnVtZXJpY1BhdHRlcm4gPSB0aGlzLmFscGhhbnVtZXJpY1BhdHRlcm47XHJcbiAgICAgIGxldCBmaWx0ZXJlZFZhbHVlID0gb3JpZ2luYWxWYWx1ZS5yZXBsYWNlQWxsKGFscGhhbnVtZXJpY1BhdHRlcm4sICcnKTtcclxuXHJcbiAgICAgIC8vIFByZXZlbnQgbGVhZGluZyBzcGFjZXNcclxuICAgICAgaWYgKGZpbHRlcmVkVmFsdWUuc3RhcnRzV2l0aCgnICcpKSB7XHJcbiAgICAgICAgZmlsdGVyZWRWYWx1ZSA9IGZpbHRlcmVkVmFsdWUudHJpbVN0YXJ0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFJlcGxhY2UgbXVsdGlwbGUgY29uc2VjdXRpdmUgc3BhY2VzIHdpdGggc2luZ2xlIHNwYWNlXHJcbiAgICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnJlcGxhY2VBbGwoL1xcc3syLH0vZywgJyAnKTtcclxuXHJcbiAgICAgIGlmIChvcmlnaW5hbFZhbHVlICE9PSBmaWx0ZXJlZFZhbHVlKSB7XHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1vdmVkIGJlZm9yZSB0aGUgY3Vyc29yIHBvc2l0aW9uXHJcbiAgICAgICAgY29uc3QgY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yID0gb3JpZ2luYWxWYWx1ZS5sZW5ndGggLSBmaWx0ZXJlZFZhbHVlLmxlbmd0aDtcclxuICAgICAgICBlbGVtZW50LnZhbHVlID0gZmlsdGVyZWRWYWx1ZTtcclxuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoZmlsdGVyZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIC8vIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uIC0gYWNjb3VudCBmb3IgcmVtb3ZlZCBjaGFyYWN0ZXJzXHJcbiAgICAgICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gTWF0aC5tYXgoMCwgKGN1cnNvclBvc2l0aW9uIHx8IDApIC0gY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yKTtcclxuICAgICAgICBlbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKG5ld0N1cnNvclBvcywgbmV3Q3Vyc29yUG9zKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaW5jcmVhc2UgaGVpZ2h0XHJcbiAgICAgIHRoaXMuYXV0b1Jlc2l6ZUluaXRpYWwoKTtcclxuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogZmlsdGVyZWRWYWx1ZSB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBmaWx0ZXJlZFZhbHVlID0gb3JpZ2luYWxWYWx1ZTtcclxuXHJcbiAgICAgIC8vIFN0cmljdCBmaWx0ZXJpbmcgaWYgIWlzQWxwaGFudW1lcmljXHJcbiAgICAgIGlmICghdGhpcy5pc0FscGhhbnVtZXJpYykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdpc0FscGhhbnVtZXJpYycsIHRoaXMuaXNBbHBoYW51bWVyaWMpO1xyXG5cclxuICAgICAgICBjb25zdCBhbGxvd2VkUGF0dGVybiA9IC9bXmEtekEtWjAtOVxccygpe31bXFxdOywuXCI9JytcXC0qLzw+ISZ8JV9AJD86XS9nO1xyXG4gICAgICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnJlcGxhY2VBbGwoYWxsb3dlZFBhdHRlcm4sICcnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUHJldmVudCBsZWFkaW5nIHNwYWNlc1xyXG4gICAgICBpZiAoZmlsdGVyZWRWYWx1ZS5zdGFydHNXaXRoKCcgJykpIHtcclxuICAgICAgICBmaWx0ZXJlZFZhbHVlID0gZmlsdGVyZWRWYWx1ZS50cmltU3RhcnQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmVwbGFjZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXMgd2l0aCBzaW5nbGUgc3BhY2VcclxuICAgICAgZmlsdGVyZWRWYWx1ZSA9IGZpbHRlcmVkVmFsdWUucmVwbGFjZUFsbCgvXFxzezIsfS9nLCAnICcpO1xyXG5cclxuICAgICAgaWYgKG9yaWdpbmFsVmFsdWUgIT09IGZpbHRlcmVkVmFsdWUpIHtcclxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbW92ZWQgYmVmb3JlIHRoZSBjdXJzb3IgcG9zaXRpb25cclxuICAgICAgICBjb25zdCBjaGFyc1JlbW92ZWRCZWZvcmVDdXJzb3IgPSBvcmlnaW5hbFZhbHVlLmxlbmd0aCAtIGZpbHRlcmVkVmFsdWUubGVuZ3RoO1xyXG4gICAgICAgIGVsZW1lbnQudmFsdWUgPSBmaWx0ZXJlZFZhbHVlO1xyXG4gICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShmaWx0ZXJlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgLy8gUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gLSBhY2NvdW50IGZvciByZW1vdmVkIGNoYXJhY3RlcnNcclxuICAgICAgICBjb25zdCBuZXdDdXJzb3JQb3MgPSBNYXRoLm1heCgwLCAoY3Vyc29yUG9zaXRpb24gfHwgMCkgLSBjaGFyc1JlbW92ZWRCZWZvcmVDdXJzb3IpO1xyXG4gICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UobmV3Q3Vyc29yUG9zLCBuZXdDdXJzb3JQb3MpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBpbmNyZWFzZSBoZWlnaHRcclxuICAgICAgdGhpcy5hdXRvUmVzaXplSW5pdGlhbCgpO1xyXG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiBmaWx0ZXJlZFZhbHVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVQYXNzd29yZFZpc2liaWxpdHkoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNob3dQYXNzd29yZCA9ICF0aGlzLnNob3dQYXNzd29yZDtcclxuICAgIHRoaXMudXBkYXRlQWxsSWNvbnMoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUlucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBjdXJzb3JQb3NpdGlvbiA9IHRhcmdldC5zZWxlY3Rpb25TdGFydDtcclxuICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSB0YXJnZXQudmFsdWU7XHJcblxyXG4gICAgbGV0IGZpbHRlcmVkVmFsdWUgPSBvcmlnaW5hbFZhbHVlO1xyXG5cclxuICAgIC8vIElGIE5PVCBhbHBoYW51bWVyaWMsIHVzZXIgd2FudHMgc3RyaWN0IGZpbHRlcmluZzpcclxuICAgIC8vIFwib25seSBhY2NlcHQgdGlocy4pIHt9IFtdIDsgLCAuIFwiICcgPSArIC0gKiAvIDwgPiAhICYgfCAlICZfKCApLS8uO0AhLCAkJSA6IGRvbnQgYWxsb3cgZW1vamlcIlxyXG4gICAgLy8gSW50ZXJwcmV0YXRpb246IEFsbG93IGFscGhhbnVtZXJpYyArIHNwZWNpZmllZCBzcGVjaWFsIGNoYXJzLiBCYW4gZW1vamlzLlxyXG4gICAgLy8gQWN0dWFsbHksIHRoZSB1c2VyIHNhaWQ6IFwiaWYgaXNBbHBoYW51bWVyaWMgZmFsc2Ugb25seSBhY2NlcHQuLi5cIlxyXG4gICAgLy8gU28gaWYgaXNBbHBoYW51bWVyaWMgaXMgVFJVRSwgd2UgdXNlIHRoZSBleGlzdGluZyBoYW5kbGVBbHBoYW51bWVyaWNJbnB1dCBsb2dpYyAob3Igc2ltaWxhcikuXHJcbiAgICAvLyBUaGUgY3VycmVudCBsb2dpYyBpbiBoYW5kbGVJbnB1dCBpcyBnZW5lcmljLlxyXG4gICAgLy8gVGhlIGV4aXN0aW5nIGNvZGUgaGFzIGEgc2VwYXJhdGUgYGhhbmRsZUFscGhhbnVtZXJpY0lucHV0YCBtZXRob2QgYnV0IGl0J3Mgbm90IGNhbGxlZCBoZXJlP1xyXG4gICAgLy8gV2FpdCwgdGhlIHRlbXBsYXRlIGxpa2VseSBjYWxscyBgaGFuZGxlQWxwaGFudW1lcmljSW5wdXRgIGlmIGBpc0FscGhhbnVtZXJpY2AgaXMgdHJ1ZSwgb3IgYGhhbmRsZUlucHV0YCBvdGhlcndpc2U/XHJcbiAgICAvLyBMZXQncyBjaGVjayB0aGUgdGVtcGxhdGUuXHJcbiAgICAvLyBCVVQgYXNzdW1pbmcgYGhhbmRsZUlucHV0YCBpcyB0aGUgZ2VuZXJpYyBoYW5kbGVyOlxyXG5cclxuICAgIGlmICghdGhpcy5pc0FscGhhbnVtZXJpYykge1xyXG4gICAgICAvLyBSZWdleCB0byBhbGxvdzogYS16LCBBLVosIDAtOSwgYW5kOiApIHt9IFtdIDsgLCAuIFwiICcgPSArIC0gKiAvIDwgPiAhICYgfCAlIF8gKCAtIEAgJCA/IDpcclxuICAgICAgLy8gTm90ZTogVXNlciBsaXN0OiApIHt9IFtdIDsgLCAuIFwiICcgPSArIC0gKiAvIDwgPiAhICYgfCAlICZfKCApLS8uO0AhLCAkJVxyXG4gICAgICAvLyBDb21iaW5lZCB1bmlxdWUgc3BlY2lhbCBjaGFyczogKSB7IH0gWyBdIDsgLCAuIFwiICcgPSArIC0gKiAvIDwgPiAhICYgfCAlIF8gKCBAICQgPyA6XHJcbiAgICAgIC8vIEFsc28gc3BhY2UgaXMgaW1wbGllZD8gdXN1YWxseSB5ZXMuXHJcbiAgICAgIC8vIEFuZCBOTyBFTU9KSVMuXHJcbiAgICAgIC8vIGVhc2llciB0byBqdXN0IHJlcGxhY2UgYW55dGhpbmcgTk9UIGluIHRoZSBhbGxvd2VkIHNldC5cclxuXHJcbiAgICAgIC8vIEFsbG93ZWQgY2hhcnMgcmVnZXggcGF0dGVybjpcclxuICAgICAgLy8gQS1aYS16MC05XHJcbiAgICAgIC8vIFNwYWNlOiBcXHNcclxuICAgICAgLy8gU3BlY2lhbDogKCl7fVtcXF07LC5cIj0nK1xcLSovPD4hJnwlX0AkPzpcclxuICAgICAgLy8gTm90ZTogLSBpbnNpZGUgW10gbmVlZHMgdG8gYmUgZXNjYXBlZCBvciBhdCBlbmQuIF0gbmVlZHMgZXNjYXBlLiBcXCBuZWVkcyBlc2NhcGU/IChub3QgaW4gbGlzdCkuXHJcbiAgICAgIC8vIFVzZXIgbGlzdCBoYXM6IGAuYCBgXCJgIGAnYCBgP2AgKHdhaXQsID8gbm90IGluIGxpc3Q/KVxyXG4gICAgICAvLyBVc2VyIGxpc3Q6IGApIHt9IFtdIDsgLCAuIFwiICcgPSArIC0gKiAvIDwgPiAhICYgfCAlICZfKCApLS8uO0AhLCAkJWBcclxuICAgICAgLy8gVW5pcXVlczogKSB7IH0gWyBdIDsgLCAuIFwiICcgPSArIC0gKiAvIDwgPiAhICYgfCAlIF8gKCBAICRcclxuICAgICAgLy8gKFRoZSBgJmAgaXMgcmVwZWF0ZWQsIGAuYCByZXBlYXRlZCwgYCxgIHJlcGVhdGVkIGV0Yy4pXHJcbiAgICAgIC8vIEkgd2lsbCBjcmVhdGUgYSByZWdleCB0aGF0IG1hdGNoZXMgYW55dGhpbmcgTk9UIGluIHRoaXMgbGlzdCBhbmQgcmVwbGFjZSB3aXRoIGVtcHR5IHN0cmluZy5cclxuXHJcbiAgICAgIC8vIFteYS16QS1aMC05XFxzKCl7fVtcXF07LC5cIj0nK1xcLSovPD4hJnwlX0AkXVxyXG4gICAgICAvLyBOb3RlOiBgKmAsIGArYCwgYD9gIGV0YyBuZWVkIGVzY2FwaW5nIGluIHJlZ2V4IGlmIG91dHNpZGUgW10sIGJ1dCBpbnNpZGUgW10gdGhleSBhcmUgbGl0ZXJhbHMgbW9zdGx5LlxyXG4gICAgICAvLyBgLWAgbmVlZHMgdG8gYmUgbGFzdCBvciBlc2NhcGVkLiBgXWAgbmVlZHMgZXNjYXBlLiBgXmAgbmVlZHMgZXNjYXBlIGlmIGZpcnN0PyBObywgaW52YWxpZCBoZXJlLlxyXG4gICAgICAvLyBMZXQncyB2ZXJpZnkgdmFsaWQgY2hhcnM6XHJcbiAgICAgIC8vIGEteiBBLVogMC05XHJcbiAgICAgIC8vIHNwYWNlXHJcbiAgICAgIC8vICkgeyB9IFsgXSA7ICwgLiBcIiAnID0gKyAtICogLyA8ID4gISAmIHwgJSBfICggQCAkIDpcclxuXHJcbiAgICAgIGNvbnN0IGFsbG93ZWRQYXR0ZXJuID0gL1teYS16QS1aMC05XFxzKCl7fVtcXF07LC5cIj0nK1xcLSovPD4hJnwlX0AkPzpdL2c7XHJcbiAgICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnJlcGxhY2VBbGwoYWxsb3dlZFBhdHRlcm4sICcnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBQcmV2ZW50IGxlYWRpbmcgc3BhY2VzXHJcbiAgICBpZiAoZmlsdGVyZWRWYWx1ZS5zdGFydHNXaXRoKCcgJykpIHtcclxuICAgICAgZmlsdGVyZWRWYWx1ZSA9IGZpbHRlcmVkVmFsdWUudHJpbVN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmVwbGFjZUFsbCBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXMgd2l0aCBzaW5nbGUgc3BhY2VcclxuICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnJlcGxhY2VBbGwoL1xcc3syLH0vZywgJyAnKTtcclxuXHJcbiAgICBpZiAob3JpZ2luYWxWYWx1ZSAhPT0gZmlsdGVyZWRWYWx1ZSkge1xyXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbW92ZWQgYmVmb3JlIHRoZSBjdXJzb3IgcG9zaXRpb25cclxuICAgICAgY29uc3QgY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yID0gb3JpZ2luYWxWYWx1ZS5sZW5ndGggLSBmaWx0ZXJlZFZhbHVlLmxlbmd0aDtcclxuICAgICAgdGFyZ2V0LnZhbHVlID0gZmlsdGVyZWRWYWx1ZTtcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGZpbHRlcmVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgLy8gUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gLSBhY2NvdW50IGZvciByZW1vdmVkIGNoYXJhY3RlcnNcclxuICAgICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gTWF0aC5tYXgoMCwgKGN1cnNvclBvc2l0aW9uIHx8IDApIC0gY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yKTtcclxuICAgICAgdGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKG5ld0N1cnNvclBvcywgbmV3Q3Vyc29yUG9zKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUcmFpbGluZyBzcGFjZXMgd2lsbCBiZSB0cmltbWVkIG9uIGJsdXIsIG5vdCBkdXJpbmcgaW5wdXRcclxuICAgIGlmICh0aGlzLmZpZWxkLnR5cGUgPT09ICdwYXNzd29yZCcgJiYgdGhpcy5maWVsZC5mZWVkYmFjaykge1xyXG4gICAgICB0aGlzLmNoZWNrUGFzc3dvcmRTdHJlbmd0aChmaWx0ZXJlZFZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiBmaWx0ZXJlZFZhbHVlIH0pO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBhbHBoYW51bWVyaWMgaW5wdXQgLSBhbGxvd3Mgb25seSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgc3BlY2lmaWMgc3BlY2lhbCBjaGFyYWN0ZXJzXHJcbiAgICogQWxsb3dlZDogQS1aLCBhLXosIDAtOSwgc3BhY2UsIGh5cGhlbiwgdW5kZXJzY29yZSwgYW1wZXJzYW5kLCBhbmQgcGFyZW50aGVzZXNcclxuICAgKiBBbHNvIHByZXZlbnRzIGxlYWRpbmcgc3BhY2VzIGFuZCBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXNcclxuICAgKi9cclxuICBoYW5kbGVBbHBoYW51bWVyaWNJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSB0YXJnZXQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gdGFyZ2V0LnZhbHVlO1xyXG5cclxuICAgIC8vIE9ubHkgYWxsb3cgY2hhcmFjdGVycyBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgcGF0dGVyblxyXG4gICAgY29uc3QgYWxwaGFudW1lcmljUGF0dGVybiA9IHRoaXMuYWxwaGFudW1lcmljUGF0dGVybjtcclxuICAgIGxldCBmaWx0ZXJlZFZhbHVlID0gb3JpZ2luYWxWYWx1ZS5yZXBsYWNlQWxsKGFscGhhbnVtZXJpY1BhdHRlcm4sICcnKTtcclxuXHJcbiAgICAvLyBQcmV2ZW50IGxlYWRpbmcgc3BhY2VzXHJcbiAgICBpZiAoZmlsdGVyZWRWYWx1ZS5zdGFydHNXaXRoKCcgJykpIHtcclxuICAgICAgZmlsdGVyZWRWYWx1ZSA9IGZpbHRlcmVkVmFsdWUudHJpbVN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVwbGFjZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXMgd2l0aCBzaW5nbGUgc3BhY2VcclxuICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnJlcGxhY2VBbGwoL1xcc3syLH0vZywgJyAnKTtcclxuXHJcbiAgICBpZiAob3JpZ2luYWxWYWx1ZSAhPT0gZmlsdGVyZWRWYWx1ZSkge1xyXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbW92ZWQgYmVmb3JlIHRoZSBjdXJzb3IgcG9zaXRpb25cclxuICAgICAgY29uc3QgY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yID0gb3JpZ2luYWxWYWx1ZS5sZW5ndGggLSBmaWx0ZXJlZFZhbHVlLmxlbmd0aDtcclxuICAgICAgdGFyZ2V0LnZhbHVlID0gZmlsdGVyZWRWYWx1ZTtcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGZpbHRlcmVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgLy8gUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gLSBhY2NvdW50IGZvciByZW1vdmVkIGNoYXJhY3RlcnNcclxuICAgICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gTWF0aC5tYXgoMCwgKGN1cnNvclBvc2l0aW9uIHx8IDApIC0gY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yKTtcclxuICAgICAgdGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKG5ld0N1cnNvclBvcywgbmV3Q3Vyc29yUG9zKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSAncGFzc3dvcmQnICYmIHRoaXMuZmllbGQuZmVlZGJhY2spIHtcclxuICAgICAgdGhpcy5jaGVja1Bhc3N3b3JkU3RyZW5ndGgoZmlsdGVyZWRWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogZmlsdGVyZWRWYWx1ZSB9KTtcclxuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVCbHVyKGU6IEV2ZW50LCBtYXhEZWNpbWFsczogbnVtYmVyID0gMik6IHZvaWQge1xyXG4gICAgdGhpcy5oYXNGb2N1cy5zZXQoZmFsc2UpO1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XHJcbiAgICBjb25zdCBjbGVhblZhbHVlU3RyaW5nID0gdGFyZ2V0LnZhbHVlO1xyXG5cclxuICAgIGlmICghY2xlYW5WYWx1ZVN0cmluZykge1xyXG4gICAgICB0aGlzLmZpZWxkQmx1ci5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogJycgfSk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERlbGVnYXRlIHRvIHR5cGUtc3BlY2lmaWMgaGFuZGxlcnNcclxuICAgIGlmICh0aGlzLmZpZWxkLnR5cGUgPT09ICd0ZXh0JyB8fCB0aGlzLmZpZWxkLnR5cGUgPT09ICd0ZXh0YXJlYScpIHtcclxuICAgICAgdGhpcy5oYW5kbGVUZXh0RmllbGRCbHVyKHRhcmdldCwgY2xlYW5WYWx1ZVN0cmluZyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmllbGQudHlwZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgdGhpcy5oYW5kbGVOdW1iZXJGaWVsZEJsdXIodGFyZ2V0LCBjbGVhblZhbHVlU3RyaW5nLCBtYXhEZWNpbWFscyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRW1pdCBmaW5hbCB2YWx1ZVxyXG4gICAgdGhpcy5maWVsZEJsdXIuZW1pdCh7XHJcbiAgICAgIG5hbWU6IHRoaXMuZmllbGQubmFtZSxcclxuICAgICAgdmFsdWU6IHRhcmdldC52YWx1ZSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGJsdXIgZm9yIHRleHQgYW5kIHRleHRhcmVhIGZpZWxkcyAtIHRyaW0gdHJhaWxpbmcgc3BhY2VzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVUZXh0RmllbGRCbHVyKFxyXG4gICAgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCxcclxuICAgIGNsZWFuVmFsdWVTdHJpbmc6IHN0cmluZyxcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IHRyaW1tZWQgPSBjbGVhblZhbHVlU3RyaW5nLnRyaW0oKTtcclxuICAgIGlmIChjbGVhblZhbHVlU3RyaW5nICE9PSB0cmltbWVkKSB7XHJcbiAgICAgIHRhcmdldC52YWx1ZSA9IHRyaW1tZWQ7XHJcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh0cmltbWVkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgYmx1ciBmb3IgbnVtYmVyIGZpZWxkcyAtIHZhbGlkYXRlIGFuZCBmb3JtYXRcclxuICAgKi9cclxuICBwcml2YXRlIGhhbmRsZU51bWJlckZpZWxkQmx1cihcclxuICAgIHRhcmdldDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQsXHJcbiAgICBjbGVhblZhbHVlU3RyaW5nOiBzdHJpbmcsXHJcbiAgICBtYXhEZWNpbWFsczogbnVtYmVyLFxyXG4gICk6IHZvaWQge1xyXG4gICAgLy8gUmVtb3ZlIGNvbW1hcyBmb3IgcGFyc2luZy92YWxpZGF0aW9uXHJcbiAgICBjb25zdCBudW1TdHJpbmcgPSBjbGVhblZhbHVlU3RyaW5nLnJlcGxhY2VBbGwoJywnLCAnJyk7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIG51bWJlciBmb3JtYXRcclxuICAgIGNvbnN0IGlzVmFsaWROdW1iZXJGb3JtYXQgPSAvXi0/XFxkKyhcXC5cXGQrKT8kLy50ZXN0KG51bVN0cmluZyk7XHJcblxyXG4gICAgLy8gSWYgbm90IGEgdmFsaWQgbnVtYmVyIGZvcm1hdCwgY2xlYXIgdGhlIGZpZWxkXHJcbiAgICBpZiAoIWlzVmFsaWROdW1iZXJGb3JtYXQpIHtcclxuICAgICAgdGFyZ2V0LnZhbHVlID0gJyc7XHJcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSgnJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3JtYXQgY3VycmVuY3kgZmllbGRzIG9yIHNldCByYXcgdmFsdWUgZm9yIG5vbi1jdXJyZW5jeVxyXG4gICAgaWYgKHRoaXMuZmllbGQudHlwZSA9PT0gJ251bWJlcicgJiYgdGhpcy5maWVsZC5pc0N1cnJlbmN5KSB7XHJcbiAgICAgIHRoaXMucHJvY2Vzc0N1cnJlbmN5VmFsdWUodGFyZ2V0LCBudW1TdHJpbmcsIG1heERlY2ltYWxzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIE5vbi1jdXJyZW5jeTogcHJlc2VydmUgdGhlIHJhdyBzdHJpbmcgdmFsdWVcclxuICAgICAgdGFyZ2V0LnZhbHVlID0gbnVtU3RyaW5nO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJvY2VzcyBjdXJyZW5jeSB2YWx1ZSAtIGhhbmRsZSBmb3JtYXR0aW5nIGFuZCBkZWNpbWFsIHBsYWNlc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcHJvY2Vzc0N1cnJlbmN5VmFsdWUoXHJcbiAgICB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50LFxyXG4gICAgbnVtU3RyaW5nOiBzdHJpbmcsXHJcbiAgICBtYXhEZWNpbWFsczogbnVtYmVyLFxyXG4gICk6IHZvaWQge1xyXG4gICAgLy8gSGFuZGxlIG5lZ2F0aXZlIHZhbHVlcyAtIGNvbnZlcnQgdG8gcG9zaXRpdmVcclxuICAgIGxldCBwcm9jZXNzZWRWYWx1ZSA9IG51bVN0cmluZy5zdGFydHNXaXRoKCctJykgPyBudW1TdHJpbmcuc3Vic3RyaW5nKDEpIDogbnVtU3RyaW5nO1xyXG5cclxuICAgIC8vIEhhbmRsZSBlZGdlIGNhc2Ugb2YgXCItMFwiIG9yIGp1c3QgXCItXCJcclxuICAgIGlmIChwcm9jZXNzZWRWYWx1ZSA9PT0gJycgfHwgcHJvY2Vzc2VkVmFsdWUgPT09ICcwJykge1xyXG4gICAgICBwcm9jZXNzZWRWYWx1ZSA9ICcwJztcclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3JtYXQgdGhlIHZhbHVlIHdpdGggcHJvcGVyIGRlY2ltYWwgcGxhY2VzXHJcbiAgICBjb25zdCBjbGVhblZhbHVlU3RyaW5nID0gdGhpcy5mb3JtYXREZWNpbWFsUGxhY2VzKHByb2Nlc3NlZFZhbHVlLCBtYXhEZWNpbWFscyk7XHJcblxyXG4gICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZvcm1hdEN1cnJlbmN5V2l0aENvbW1hcyhjbGVhblZhbHVlU3RyaW5nLCBtYXhEZWNpbWFscyk7XHJcblxyXG4gICAgLy8gVXBkYXRlIHRoZSBjb250cm9sIHZhbHVlIHdpdGggdGhlIG51bWVyaWMgc3RyaW5nIChub3QgZm9ybWF0dGVkKVxyXG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGNsZWFuVmFsdWVTdHJpbmcsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcbiAgICAvLyBUcmlnZ2VyIHZhbGlkYXRvcnMgYW5kIG1hcmsgYXMgdG91Y2hlZFxyXG4gICAgdGhpcy5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcblxyXG4gICAgLy8gU2V0IGRpc3BsYXkgdmFsdWUgd2l0aCBjb21tYXMgYWZ0ZXIgQW5ndWxhcidzIGZvcm0gY29udHJvbCB1cGRhdGVcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0YXJnZXQudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9ybWF0IGRlY2ltYWwgcGxhY2VzIC0gcGFkIG9yIHRydW5jYXRlIHRvIG1heERlY2ltYWxzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBmb3JtYXREZWNpbWFsUGxhY2VzKHZhbHVlOiBzdHJpbmcsIG1heERlY2ltYWxzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IFtpbnRQYXJ0LCBkZWNQYXJ0XSA9IHZhbHVlLmluY2x1ZGVzKCcuJykgPyB2YWx1ZS5zcGxpdCgnLicpIDogW3ZhbHVlLCAnJ107XHJcblxyXG4gICAgLy8gUGFkIG9yIHRydW5jYXRlIGRlY2ltYWwgcGFydCB0byBtYXhEZWNpbWFsc1xyXG4gICAgaWYgKGRlY1BhcnQubGVuZ3RoIDwgbWF4RGVjaW1hbHMpIHtcclxuICAgICAgZGVjUGFydCA9IGRlY1BhcnQucGFkRW5kKG1heERlY2ltYWxzLCAnMCcpO1xyXG4gICAgfSBlbHNlIGlmIChkZWNQYXJ0Lmxlbmd0aCA+IG1heERlY2ltYWxzKSB7XHJcbiAgICAgIGRlY1BhcnQgPSBkZWNQYXJ0LnNsaWNlKDAsIG1heERlY2ltYWxzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBCdWlsZCB0aGUgY2xlYW4gdmFsdWUgc3RyaW5nICh3aXRob3V0IGNvbW1hcylcclxuICAgIHJldHVybiBtYXhEZWNpbWFscyA+IDAgPyBgJHtpbnRQYXJ0fS4ke2RlY1BhcnR9YCA6IGludFBhcnQ7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVOdW1iZXJJbnB1dChldmVudDogRXZlbnQsIG1heERlY2ltYWxzOiBudW1iZXIgPSAyKTogdm9pZCB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSB0YXJnZXQudmFsdWU7XHJcbiAgICBjb25zdCBjdXJzb3JQb3NpdGlvbiA9IHRhcmdldC5zZWxlY3Rpb25TdGFydCA/PyAwO1xyXG5cclxuICAgIC8vIFN0ZXAgMTogRmlsdGVyIGFuZCBmb3JtYXQgdGhlIGlucHV0IHZhbHVlXHJcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmZpbHRlck51bWVyaWNJbnB1dCh0YXJnZXQudmFsdWUsIG1heERlY2ltYWxzKTtcclxuXHJcbiAgICAvLyBTdGVwIDI6IFVwZGF0ZSBjdXJzb3IgcG9zaXRpb24gaWYgdmFsdWUgY2hhbmdlZFxyXG4gICAgdGhpcy51cGRhdGVDdXJzb3JQb3NpdGlvbkFmdGVyRmlsdGVyKHRhcmdldCwgb3JpZ2luYWxWYWx1ZSwgdmFsdWUsIGN1cnNvclBvc2l0aW9uKTtcclxuXHJcbiAgICAvLyBTdGVwIDM6IFVwZGF0ZSBmb3JtIGNvbnRyb2wgYW5kIHZhbGlkYXRlXHJcbiAgICB0aGlzLnVwZGF0ZUZvcm1Db250cm9sVmFsdWUodmFsdWUsIG1heERlY2ltYWxzKTtcclxuXHJcbiAgICAvLyBTdGVwIDQ6IEVtaXQgY2hhbmdlc1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogdGFyZ2V0LnZhbHVlIH0pO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbHRlciBudW1lcmljIGlucHV0IHRvIG9ubHkgYWxsb3cgZGlnaXRzIGFuZCBkZWNpbWFsIHBvaW50XHJcbiAgICogRW5zdXJlcyBvbmx5IG9uZSBkZWNpbWFsIHBvaW50IGFuZCBlbmZvcmNlcyBtYXggZGVjaW1hbCBwbGFjZXNcclxuICAgKi9cclxuICBwcml2YXRlIGZpbHRlck51bWVyaWNJbnB1dCh2YWx1ZTogc3RyaW5nLCBtYXhEZWNpbWFsczogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIC8vIFJlbW92ZSBBTEwgbm9uLW51bWVyaWMgY2hhcmFjdGVycyBleGNlcHQgZGVjaW1hbCBwb2ludFxyXG4gICAgbGV0IGZpbHRlcmVkID0gdmFsdWUucmVwbGFjZUFsbCgvW14wLTkuXS9nLCAnJyk7XHJcblxyXG4gICAgLy8gRW5zdXJlIG9ubHkgb25lIGRlY2ltYWwgcG9pbnRcclxuICAgIGZpbHRlcmVkID0gdGhpcy5maWx0ZXJEZWNpbWFsUG9pbnRzKGZpbHRlcmVkKTtcclxuXHJcbiAgICAvLyBSZXN0cmljdCB0byBtYXhEZWNpbWFscyBkZWNpbWFsIHBsYWNlcyBpZiBkZWNpbWFsIGV4aXN0c1xyXG4gICAgZmlsdGVyZWQgPSB0aGlzLmVuZm9yY2VEZWNpbWFsTGltaXQoZmlsdGVyZWQsIG1heERlY2ltYWxzKTtcclxuXHJcbiAgICByZXR1cm4gZmlsdGVyZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbnN1cmUgb25seSBvbmUgZGVjaW1hbCBwb2ludCBleGlzdHMgaW4gdGhlIHZhbHVlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBmaWx0ZXJEZWNpbWFsUG9pbnRzKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zcGxpdCgnLicpO1xyXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+IDIpIHtcclxuICAgICAgcmV0dXJuIHBhcnRzWzBdICsgJy4nICsgcGFydHMuc2xpY2UoMSkuam9pbignJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbmZvcmNlIG1heGltdW0gZGVjaW1hbCBwbGFjZXMgbGltaXRcclxuICAgKi9cclxuICBwcml2YXRlIGVuZm9yY2VEZWNpbWFsTGltaXQodmFsdWU6IHN0cmluZywgbWF4RGVjaW1hbHM6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCcuJykpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IFtpbnRlZ2VyUGFydCwgZGVjaW1hbFBhcnRdID0gdmFsdWUuc3BsaXQoJy4nKTtcclxuICAgIGlmIChkZWNpbWFsUGFydCAmJiBkZWNpbWFsUGFydC5sZW5ndGggPiBtYXhEZWNpbWFscykge1xyXG4gICAgICByZXR1cm4gaW50ZWdlclBhcnQgKyAnLicgKyBkZWNpbWFsUGFydC5zbGljZSgwLCBtYXhEZWNpbWFscyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIGZpbHRlcmluZyBpbnB1dFxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlQ3Vyc29yUG9zaXRpb25BZnRlckZpbHRlcihcclxuICAgIHRhcmdldDogSFRNTElucHV0RWxlbWVudCxcclxuICAgIG9yaWdpbmFsVmFsdWU6IHN0cmluZyxcclxuICAgIG5ld1ZhbHVlOiBzdHJpbmcsXHJcbiAgICBjdXJzb3JQb3NpdGlvbjogbnVtYmVyLFxyXG4gICk6IHZvaWQge1xyXG4gICAgaWYgKHRhcmdldC52YWx1ZSA9PT0gbmV3VmFsdWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNoYXJzUmVtb3ZlZEJlZm9yZUN1cnNvciA9IHRoaXMuY291bnRSZW1vdmVkQ2hhcnNCZWZvcmVDdXJzb3IoXHJcbiAgICAgIG9yaWdpbmFsVmFsdWUsXHJcbiAgICAgIG5ld1ZhbHVlLFxyXG4gICAgICBjdXJzb3JQb3NpdGlvbixcclxuICAgICk7XHJcbiAgICB0YXJnZXQudmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gTWF0aC5tYXgoMCwgY3Vyc29yUG9zaXRpb24gLSBjaGFyc1JlbW92ZWRCZWZvcmVDdXJzb3IpO1xyXG4gICAgdGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKG5ld1Bvc2l0aW9uLCBuZXdQb3NpdGlvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgZm9ybSBjb250cm9sIHZhbHVlIGFuZCBwZXJmb3JtIHZhbGlkYXRpb25cclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZUZvcm1Db250cm9sVmFsdWUodmFsdWU6IHN0cmluZywgbWF4RGVjaW1hbHM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLnZhbGlkYXRlSW50ZWdlckRpZ2l0cyh2YWx1ZSwgbWF4RGVjaW1hbHMpO1xyXG4gICAgdGhpcy5jbGVhck51bWVyaWNFcnJvcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ291bnQgaG93IG1hbnkgY2hhcmFjdGVycyB3ZXJlIHJlbW92ZWQgYmVmb3JlIHRoZSBjdXJzb3IgcG9zaXRpb25cclxuICAgKiBUaGlzIGhlbHBzIG1haW50YWluIGNvcnJlY3QgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIGZpbHRlcmluZyBpbnB1dFxyXG4gICAqL1xyXG4gIHByaXZhdGUgY291bnRSZW1vdmVkQ2hhcnNCZWZvcmVDdXJzb3IoXHJcbiAgICBvcmlnaW5hbDogc3RyaW5nLFxyXG4gICAgZmlsdGVyZWQ6IHN0cmluZyxcclxuICAgIGN1cnNvclBvczogbnVtYmVyLFxyXG4gICk6IG51bWJlciB7XHJcbiAgICBsZXQgcmVtb3ZlZENvdW50ID0gMDtcclxuICAgIGxldCBmaWx0ZXJlZEluZGV4ID0gMDtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnNvclBvcyAmJiBpIDwgb3JpZ2luYWwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGZpbHRlcmVkSW5kZXggPCBmaWx0ZXJlZC5sZW5ndGggJiYgb3JpZ2luYWxbaV0gPT09IGZpbHRlcmVkW2ZpbHRlcmVkSW5kZXhdKSB7XHJcbiAgICAgICAgZmlsdGVyZWRJbmRleCsrO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlbW92ZWRDb3VudCsrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlbW92ZWRDb3VudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBwYXN0ZSBldmVudCBmb3IgbnVtYmVyIGlucHV0c1xyXG4gICAqIFByZXZlbnRzIHBhc3Rpbmcgb2Ygbm9uLW51bWVyaWMgY2hhcmFjdGVycyBhbmQgZW5mb3JjZXMgZGlnaXQgbGltaXRzXHJcbiAgICovXHJcbiAgaGFuZGxlTnVtYmVyUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50LCBtYXhEZWNpbWFsczogbnVtYmVyID0gMik6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3QgcGFzdGVkVGV4dCA9IGV2ZW50LmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQnKSB8fCAnJztcclxuICAgIGNvbnN0IGlzQ3VycmVuY3kgPSB0aGlzLmZpZWxkLnR5cGUgPT09ICdudW1iZXInICYmICEhdGhpcy5maWVsZC5pc0N1cnJlbmN5O1xyXG5cclxuICAgIGNvbnN0IGZpbHRlcmVkVGV4dCA9IGlzQ3VycmVuY3lcclxuICAgICAgPyB0aGlzLmdldEZpbHRlcmVkQ3VycmVuY3lQYXN0ZWRUZXh0KHBhc3RlZFRleHQpXHJcbiAgICAgIDogdGhpcy5nZXRGaWx0ZXJlZEludGVnZXJQYXN0ZWRUZXh0KHBhc3RlZFRleHQpO1xyXG4gICAgY29uc3QgZmluYWxWYWx1ZSA9IHRoaXMuYnVpbGRGaW5hbFBhc3RlVmFsdWUodGFyZ2V0LCBmaWx0ZXJlZFRleHQsIGlzQ3VycmVuY3ksIG1heERlY2ltYWxzKTtcclxuXHJcbiAgICAvLyBVcGRhdGUgdGhlIGlucHV0XHJcbiAgICB0YXJnZXQudmFsdWUgPSBmaW5hbFZhbHVlO1xyXG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGZpbmFsVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcbiAgICB0aGlzLnZhbGlkYXRlSW50ZWdlckRpZ2l0cyhmaW5hbFZhbHVlLCBtYXhEZWNpbWFscyk7XHJcbiAgICB0aGlzLmNsZWFyTnVtZXJpY0Vycm9yKCk7XHJcblxyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogZmluYWxWYWx1ZSB9KTtcclxuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcblxyXG4gICAgdGhpcy5zZXRDdXJzb3JBZnRlclBhc3RlKHRhcmdldCwgZmlsdGVyZWRUZXh0LCBmaW5hbFZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbHRlciBwYXN0ZWQgdGV4dCBmb3IgY3VycmVuY3kgaW5wdXQgKGFsbG93cyBkaWdpdHMgYW5kIGRlY2ltYWwgcG9pbnQpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJlZEN1cnJlbmN5UGFzdGVkVGV4dChwYXN0ZWRUZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHBhc3RlZFRleHQucmVwbGFjZUFsbCgvW14wLTkuXS9nLCAnJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaWx0ZXIgcGFzdGVkIHRleHQgZm9yIGludGVnZXItb25seSBpbnB1dCAoYWxsb3dzIGRpZ2l0cyBvbmx5KVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyZWRJbnRlZ2VyUGFzdGVkVGV4dChwYXN0ZWRUZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHBhc3RlZFRleHQucmVwbGFjZUFsbCgvXFxEL2csICcnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkIGZpbmFsIHZhbHVlIGFmdGVyIHBhc3RlIG9wZXJhdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgYnVpbGRGaW5hbFBhc3RlVmFsdWUoXHJcbiAgICB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQsXHJcbiAgICBmaWx0ZXJlZFRleHQ6IHN0cmluZyxcclxuICAgIGlzQ3VycmVuY3k6IGJvb2xlYW4sXHJcbiAgICBtYXhEZWNpbWFsczogbnVtYmVyLFxyXG4gICk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0YXJnZXQudmFsdWU7XHJcbiAgICBjb25zdCBzdGFydCA9IHRhcmdldC5zZWxlY3Rpb25TdGFydDtcclxuICAgIGNvbnN0IGVuZCA9IHRhcmdldC5zZWxlY3Rpb25FbmQ7XHJcblxyXG4gICAgbGV0IGZpbmFsVmFsdWU6IHN0cmluZztcclxuXHJcbiAgICAvLyBJZiBzZWxlY3Rpb24gQVBJIGlzIG5vdCBzdXBwb3J0ZWQgb3Igbm8gc2VsZWN0aW9uLCByZXBsYWNlIGVudGlyZSBjb250ZW50XHJcbiAgICBpZiAoc3RhcnQgPT09IG51bGwgfHwgZW5kID09PSBudWxsIHx8IChzdGFydCA9PT0gMCAmJiBlbmQgPT09IDApKSB7XHJcbiAgICAgIGZpbmFsVmFsdWUgPSBmaWx0ZXJlZFRleHQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmaW5hbFZhbHVlID0gY3VycmVudFZhbHVlLnN1YnN0cmluZygwLCBzdGFydCkgKyBmaWx0ZXJlZFRleHQgKyBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGVuZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzQ3VycmVuY3kgPyB0aGlzLmFwcGx5RGVjaW1hbFJlc3RyaWN0aW9ucyhmaW5hbFZhbHVlLCBtYXhEZWNpbWFscykgOiBmaW5hbFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgZGVjaW1hbCByZXN0cmljdGlvbnMgZm9yIGN1cnJlbmN5IGZpZWxkc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgYXBwbHlEZWNpbWFsUmVzdHJpY3Rpb25zKHZhbHVlOiBzdHJpbmcsIG1heERlY2ltYWxzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlc3VsdCA9IHZhbHVlO1xyXG5cclxuICAgIC8vIEVuc3VyZSBvbmx5IG9uZSBkZWNpbWFsIHBvaW50XHJcbiAgICBjb25zdCBwYXJ0cyA9IHJlc3VsdC5zcGxpdCgnLicpO1xyXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+IDIpIHtcclxuICAgICAgcmVzdWx0ID0gcGFydHNbMF0gKyAnLicgKyBwYXJ0cy5zbGljZSgxKS5qb2luKCcnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXN0cmljdCB0byBtYXhEZWNpbWFscyBkZWNpbWFsIHBsYWNlc1xyXG4gICAgaWYgKHJlc3VsdC5pbmNsdWRlcygnLicpKSB7XHJcbiAgICAgIGNvbnN0IFtpbnRQYXJ0LCBkZWNQYXJ0XSA9IHJlc3VsdC5zcGxpdCgnLicpO1xyXG4gICAgICBpZiAoZGVjUGFydC5sZW5ndGggPiBtYXhEZWNpbWFscykge1xyXG4gICAgICAgIHJlc3VsdCA9IGludFBhcnQgKyAnLicgKyBkZWNQYXJ0LnNsaWNlKDAsIG1heERlY2ltYWxzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZSBpbnRlZ2VyIGRpZ2l0IGxpbWl0IGFuZCBzZXQvY2xlYXIgZXJyb3JzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB2YWxpZGF0ZUludGVnZXJEaWdpdHModmFsdWU6IHN0cmluZywgbWF4RGVjaW1hbHM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZmllbGQudHlwZSAhPT0gJ251bWJlcicgfHwgIXRoaXMuZmllbGQubWF4SW50ZWdlckRpZ2l0cykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWF4SW50RGlnaXRzID0gdGhpcy5maWVsZC5tYXhJbnRlZ2VyRGlnaXRzID8/IDE1O1xyXG4gICAgY29uc3QgW2ludFBhcnRdID0gdmFsdWUuaW5jbHVkZXMoJy4nKSA/IHZhbHVlLnNwbGl0KCcuJykgOiBbdmFsdWVdO1xyXG5cclxuICAgIGlmIChpbnRQYXJ0Lmxlbmd0aCA+IG1heEludERpZ2l0cykge1xyXG4gICAgICB0aGlzLnNldE1heEludGVnZXJEaWdpdHNFcnJvcihpbnRQYXJ0Lmxlbmd0aCwgbWF4SW50RGlnaXRzLCBtYXhEZWNpbWFscyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNsZWFyTWF4SW50ZWdlckRpZ2l0c0Vycm9yKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgbWF4IGludGVnZXIgZGlnaXRzIGVycm9yXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRNYXhJbnRlZ2VyRGlnaXRzRXJyb3IoYWN0dWFsOiBudW1iZXIsIG1heDogbnVtYmVyLCBtYXhEZWNpbWFsczogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBjdXJyZW50RXJyb3JzID0gdGhpcy5jb250cm9sLmVycm9ycyB8fCB7fTtcclxuICAgIHRoaXMuY29udHJvbC5zZXRFcnJvcnMoe1xyXG4gICAgICAuLi5jdXJyZW50RXJyb3JzLFxyXG4gICAgICBtYXhJbnRlZ2VyRGlnaXRzOiB7XHJcbiAgICAgICAgYWN0dWFsLFxyXG4gICAgICAgIG1heCxcclxuICAgICAgICBtYXhEZWNpbWFscyxcclxuICAgICAgICBtZXNzYWdlOiBgUGxlYXNlIHNob3J0ZW4geW91ciBpbnB1dCB0byAke21heH0gd2hvbGUgZGlnaXRzIGFuZCAke21heERlY2ltYWxzfSBkZWNpbWFsIG9yIGZld2VyLmAsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIG1heCBpbnRlZ2VyIGRpZ2l0cyBlcnJvciBpZiBwcmVzZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbGVhck1heEludGVnZXJEaWdpdHNFcnJvcigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jb250cm9sLmhhc0Vycm9yKCdtYXhJbnRlZ2VyRGlnaXRzJykpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGVycm9ycyA9IHsgLi4udGhpcy5jb250cm9sLmVycm9ycyB9O1xyXG4gICAgZGVsZXRlIGVycm9yc1snbWF4SW50ZWdlckRpZ2l0cyddO1xyXG4gICAgdGhpcy5jb250cm9sLnNldEVycm9ycyhPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA/IGVycm9ycyA6IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgbnVtZXJpYyBlcnJvciBpZiBwcmVzZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbGVhck51bWVyaWNFcnJvcigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jb250cm9sLmhhc0Vycm9yKCdudW1lcmljJykpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGVycm9ycyA9IHsgLi4udGhpcy5jb250cm9sLmVycm9ycyB9O1xyXG4gICAgZGVsZXRlIGVycm9yc1snbnVtZXJpYyddO1xyXG4gICAgdGhpcy5jb250cm9sLnNldEVycm9ycyhPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA/IGVycm9ycyA6IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGN1cnNvciBwb3NpdGlvbiBhZnRlciBwYXN0ZSBvcGVyYXRpb25cclxuICAgKi9cclxuICBwcml2YXRlIHNldEN1cnNvckFmdGVyUGFzdGUoXHJcbiAgICB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQsXHJcbiAgICBmaWx0ZXJlZFRleHQ6IHN0cmluZyxcclxuICAgIGZpbmFsVmFsdWU6IHN0cmluZyxcclxuICApOiB2b2lkIHtcclxuICAgIC8vIElucHV0IHR5cGU9XCJudW1iZXJcIiBkb2VzIG5vdCBzdXBwb3J0IHNlbGVjdGlvbiBBUElzXHJcbiAgICBpZiAodGFyZ2V0LnR5cGUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdGFydCA9IHRhcmdldC5zZWxlY3Rpb25TdGFydCB8fCAwO1xyXG4gICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gc3RhcnQgKyBmaWx0ZXJlZFRleHQubGVuZ3RoO1xyXG4gICAgY29uc3QgYWN0dWFsUG9zID0gTWF0aC5taW4obmV3Q3Vyc29yUG9zLCBmaW5hbFZhbHVlLmxlbmd0aCk7XHJcbiAgICB0YXJnZXQuc2V0U2VsZWN0aW9uUmFuZ2UoYWN0dWFsUG9zLCBhY3R1YWxQb3MpO1xyXG4gIH1cclxuXHJcbiAgLy8gRm9ybWF0IG51bWJlciB3aXRoIGNvbW1hIHNlcGFyYXRvcnNcclxuICAvLyBVc2VzIHN0cmluZy1iYXNlZCBmb3JtYXR0aW5nIGZvciBsYXJnZSBudW1iZXJzIHRvIHByZXNlcnZlIHByZWNpc2lvblxyXG4gIGZvcm1hdEN1cnJlbmN5V2l0aENvbW1hcyh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nLCBtYXhEZWNpbWFsczogbnVtYmVyID0gMik6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlICE9PSAnbnVtYmVyJyB8fCAhdGhpcy5maWVsZC5pc0N1cnJlbmN5KSByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcclxuXHJcbiAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgLy8gUmV0dXJuIG9yaWdpbmFsIHZhbHVlIGZvciBlbXB0eSBvciBpbnZhbGlkIGlucHV0c1xyXG4gICAgaWYgKCFzdHJWYWx1ZSB8fCBzdHJWYWx1ZSA9PT0gJ05hTicpIHJldHVybiAnJztcclxuXHJcbiAgICAvLyBVc2Ugc3RyaW5nLWJhc2VkIGZvcm1hdHRpbmcgdG8gcHJlc2VydmUgcHJlY2lzaW9uIGZvciBsYXJnZSBudW1iZXJzXHJcbiAgICBjb25zdCBbaW50ZWdlclBhcnQsIGRlY2ltYWxQYXJ0XSA9IHN0clZhbHVlLmluY2x1ZGVzKCcuJylcclxuICAgICAgPyBzdHJWYWx1ZS5zcGxpdCgnLicpXHJcbiAgICAgIDogW3N0clZhbHVlLCAnJ107XHJcblxyXG4gICAgLy8gRm9ybWF0IGludGVnZXIgcGFydCB3aXRoIGNvbW1hIHNlcGFyYXRvcnMgKGV2ZXJ5IDMgZGlnaXRzIGZyb20gcmlnaHQpXHJcbiAgICAvLyBVc2luZyBpdGVyYXRpdmUgYXBwcm9hY2ggaW5zdGVhZCBvZiByZWdleCB0byBhdm9pZCBSZURvUyBjb25jZXJuc1xyXG4gICAgbGV0IGZvcm1hdHRlZEludGVnZXIgPSAnJztcclxuICAgIGNvbnN0IGxlbiA9IGludGVnZXJQYXJ0Lmxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgaWYgKGkgPiAwICYmIChsZW4gLSBpKSAlIDMgPT09IDApIHtcclxuICAgICAgICBmb3JtYXR0ZWRJbnRlZ2VyICs9ICcsJztcclxuICAgICAgfVxyXG4gICAgICBmb3JtYXR0ZWRJbnRlZ2VyICs9IGludGVnZXJQYXJ0W2ldO1xyXG4gICAgfVxyXG4gICAgLy8gRm9ybWF0IGRlY2ltYWwgcGFydCAocGFkIG9yIHRydW5jYXRlIHRvIG1heERlY2ltYWxzKVxyXG4gICAgbGV0IGZvcm1hdHRlZERlY2ltYWwgPSBkZWNpbWFsUGFydCB8fCAnJztcclxuICAgIGlmIChmb3JtYXR0ZWREZWNpbWFsLmxlbmd0aCA8IG1heERlY2ltYWxzKSB7XHJcbiAgICAgIGZvcm1hdHRlZERlY2ltYWwgPSBmb3JtYXR0ZWREZWNpbWFsLnBhZEVuZChtYXhEZWNpbWFscywgJzAnKTtcclxuICAgIH0gZWxzZSBpZiAoZm9ybWF0dGVkRGVjaW1hbC5sZW5ndGggPiBtYXhEZWNpbWFscykge1xyXG4gICAgICBmb3JtYXR0ZWREZWNpbWFsID0gZm9ybWF0dGVkRGVjaW1hbC5zbGljZSgwLCBtYXhEZWNpbWFscyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1heERlY2ltYWxzID4gMCA/IGAke2Zvcm1hdHRlZEludGVnZXJ9LiR7Zm9ybWF0dGVkRGVjaW1hbH1gIDogZm9ybWF0dGVkSW50ZWdlcjtcclxuICB9XHJcblxyXG4gIGhhbmRsZU51bWJlcktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGlzQ3VycmVuY3k6IGJvb2xlYW4pIHtcclxuICAgIGlmIChpc0N1cnJlbmN5KSByZXR1cm47XHJcblxyXG4gICAgLy8gQWxsb3c6IEJhY2tzcGFjZSwgRGVsZXRlLCBUYWIsIEFycm93IGtleXNcclxuICAgIGlmIChbJ0JhY2tzcGFjZScsICdEZWxldGUnLCAnVGFiJywgJ0Fycm93TGVmdCcsICdBcnJvd1JpZ2h0J10uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWxsb3cgY2xpcGJvYXJkIG9wZXJhdGlvbnMgKEN0cmwrViwgQ3RybCtDLCBDdHJsK1gsIENtZCtWLCBDbWQrQywgQ21kK1gpXHJcbiAgICAvLyBhbmQgc2VsZWN0aW9uIChDdHJsK0EsIENtZCtBKVxyXG4gICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQmxvY2sgZXZlcnl0aGluZyB0aGF0IGlzIG5vdCAwLTlcclxuICAgIGlmICghL15cXGQkLy50ZXN0KGV2ZW50LmtleSkpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEdldCBsb2NhbGUgZnJvbSBjdXJyZW5jeSBjb2RlIHVzaW5nIGN1cnJlbmN5TWV0YVxyXG4gIGdldExvY2FsZUZyb21DdXJyZW5jeShjdXJyZW5jeUNvZGU/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY3VycmVuY3lPYmogPSB0aGlzLmN1cnJlbmN5TWV0YS5maW5kKFxyXG4gICAgICAoYzogeyBjb2RlOiBzdHJpbmc7IGxvY2FsZTogc3RyaW5nIH0pID0+IGMuY29kZSA9PT0gY3VycmVuY3lDb2RlLFxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gY3VycmVuY3lPYmo/LmxvY2FsZSB8fCB0aGlzLmRlZmF1bHRMb2NhbGU7XHJcbiAgfVxyXG5cclxuICBzaG93UGFzc3dvcmQgPSBmYWxzZTtcclxuICBwYXNzd29yZFN0cmVuZ3RoTGFiZWwgPSAnJztcclxuICBzdHJlbmd0aENsYXNzID0gJyc7XHJcbiAgcGFzc3dvcmRTdHJlbmd0aFBlcmNlbnQgPSAwO1xyXG4gIGlzUGFzc3dvcmRGb2N1c2VkID0gZmFsc2U7XHJcbiAgb25QYXNzd29yZEZvY3VzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5oYXNGb2N1cy5zZXQodHJ1ZSk7XHJcbiAgICB0aGlzLmlzUGFzc3dvcmRGb2N1c2VkID0gdHJ1ZTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG9uUGFzc3dvcmRCbHVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc1Bhc3N3b3JkRm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUGFzc3dvcmRCbHVyKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmhhbmRsZUJsdXIoZSk7IC8vIE9yaWdpbmFsIGJsdXIgZnVuY3Rpb25hbGl0eSAoc2V0cyBoYXNGb2N1cyB0byBmYWxzZSlcclxuICAgIHRoaXMub25QYXNzd29yZEJsdXIoKTsgLy8gSGlkZSBwYXNzd29yZCBmZWVkYmFja1xyXG4gIH1cclxuXHJcbiAgY2hlY2tQYXNzd29yZFN0cmVuZ3RoKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmICghdmFsdWUgfHwgdGhpcy5maWVsZC50eXBlICE9PSAncGFzc3dvcmQnKSB7XHJcbiAgICAgIHRoaXMucGFzc3dvcmRTdHJlbmd0aExhYmVsID0gJyc7XHJcbiAgICAgIHRoaXMuc3RyZW5ndGhDbGFzcyA9ICcnO1xyXG4gICAgICB0aGlzLnBhc3N3b3JkU3RyZW5ndGhQZXJjZW50ID0gMDtcclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBzY29yZSA9IDA7XHJcbiAgICBpZiAodmFsdWUubGVuZ3RoID49IDgpIHNjb3JlKys7XHJcbiAgICBpZiAoL1tBLVpdLy50ZXN0KHZhbHVlKSkgc2NvcmUrKztcclxuICAgIGlmICgvXFxkLy50ZXN0KHZhbHVlKSkgc2NvcmUrKztcclxuICAgIGlmICgvW1xcV19dLy50ZXN0KHZhbHVlKSkgc2NvcmUrKztcclxuXHJcbiAgICBpZiAoc2NvcmUgPD0gMSkge1xyXG4gICAgICB0aGlzLnBhc3N3b3JkU3RyZW5ndGhMYWJlbCA9IHRoaXMuZmllbGQud2Vha0xhYmVsIHx8ICdXZWFrJztcclxuICAgICAgdGhpcy5zdHJlbmd0aENsYXNzID0gJ3RleHQtW3ZhcigtLVJIQi1SZWQtMTAwKV0nO1xyXG4gICAgICB0aGlzLnBhc3N3b3JkU3RyZW5ndGhQZXJjZW50ID0gMjU7XHJcbiAgICB9IGVsc2UgaWYgKHNjb3JlID09PSAyIHx8IHNjb3JlID09PSAzKSB7XHJcbiAgICAgIHRoaXMucGFzc3dvcmRTdHJlbmd0aExhYmVsID0gdGhpcy5maWVsZC5tZWRpdW1MYWJlbCB8fCAnTWVkaXVtJztcclxuICAgICAgdGhpcy5zdHJlbmd0aENsYXNzID0gJ3RleHQtW3ZhcigtLU9yYW5nZS0xMDApXSc7XHJcbiAgICAgIHRoaXMucGFzc3dvcmRTdHJlbmd0aFBlcmNlbnQgPSBzY29yZSA9PT0gMiA/IDUwIDogNzU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBhc3N3b3JkU3RyZW5ndGhMYWJlbCA9IHRoaXMuZmllbGQuc3Ryb25nTGFiZWwgfHwgJ1N0cm9uZyc7XHJcbiAgICAgIHRoaXMuc3RyZW5ndGhDbGFzcyA9ICd0ZXh0LVt2YXIoLS1HcmVlbi0xMDApXSc7XHJcbiAgICAgIHRoaXMucGFzc3dvcmRTdHJlbmd0aFBlcmNlbnQgPSAxMDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbmNyZW1lbnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlICE9PSAnbnVtYmVyJykgcmV0dXJuO1xyXG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuZmllbGQuc3RlcCB8fCAxO1xyXG4gICAgY29uc3QgY3VycmVudCA9IE51bWJlcih0aGlzLmNvbnRyb2wudmFsdWUpIHx8IDA7XHJcbiAgICBsZXQgbmV4dFZhbHVlID0gY3VycmVudCArIHN0ZXA7XHJcblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmZpZWxkLm1heCA9PT0gJ251bWJlcicpIHtcclxuICAgICAgbmV4dFZhbHVlID0gTWF0aC5taW4obmV4dFZhbHVlLCB0aGlzLmZpZWxkLm1heCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKG5leHRWYWx1ZSk7XHJcbiAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogbmV4dFZhbHVlIH0pO1xyXG5cclxuICAgIC8vIFVwZGF0ZSBkaXNwbGF5IHZhbHVlIGZvciBjdXJyZW5jeSBpbnB1dHNcclxuICAgIGlmICh0aGlzLmZpZWxkLmlzQ3VycmVuY3kpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy51bmlxdWVJZCkgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICBpZiAoaW5wdXRFbGVtZW50KSB7XHJcbiAgICAgICAgICBpbnB1dEVsZW1lbnQudmFsdWUgPSB0aGlzLmZvcm1hdEN1cnJlbmN5V2l0aENvbW1hcyhuZXh0VmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkZWNyZW1lbnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlICE9PSAnbnVtYmVyJykgcmV0dXJuO1xyXG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuZmllbGQuc3RlcCB8fCAxO1xyXG4gICAgY29uc3QgY3VycmVudCA9IE51bWJlcih0aGlzLmNvbnRyb2wudmFsdWUpIHx8IDA7XHJcbiAgICBsZXQgbmV4dFZhbHVlID0gY3VycmVudCAtIHN0ZXA7XHJcblxyXG4gICAgLy8gRW5zdXJlIG1pbmltdW0gdmFsdWUgaXMgMCAobm8gbmVnYXRpdmUgdmFsdWVzKVxyXG4gICAgY29uc3QgbWluVmFsdWUgPSBNYXRoLm1heCh0aGlzLmZpZWxkLm1pbiB8fCAwLCAwKTtcclxuICAgIG5leHRWYWx1ZSA9IE1hdGgubWF4KG5leHRWYWx1ZSwgbWluVmFsdWUpO1xyXG5cclxuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShuZXh0VmFsdWUpO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHRoaXMuZmllbGQubmFtZSwgdmFsdWU6IG5leHRWYWx1ZSB9KTtcclxuXHJcbiAgICAvLyBVcGRhdGUgZGlzcGxheSB2YWx1ZSBmb3IgY3VycmVuY3kgaW5wdXRzXHJcbiAgICBpZiAodGhpcy5maWVsZC5pc0N1cnJlbmN5KSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudW5pcXVlSWQpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKGlucHV0RWxlbWVudCkge1xyXG4gICAgICAgICAgaW5wdXRFbGVtZW50LnZhbHVlID0gdGhpcy5mb3JtYXRDdXJyZW5jeVdpdGhDb21tYXMobmV4dFZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29weVRleHQoZTogRXZlbnQpOiB2b2lkIHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAoIXRoaXMuY29udHJvbC52YWx1ZSkgcmV0dXJuO1xyXG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGhpcy5jb250cm9sLnZhbHVlKS50aGVuKCgpID0+IHtcclxuICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuZWZmZWN0aXZlVG9hc3RTZXJ2aWNlO1xyXG4gICAgICBpZiAoc2VydmljZSkge1xyXG4gICAgICAgIC8vIFBvc2l0aW9uIHNldCB0byB0b3AgYXMgcmVxdWVzdGVkXHJcbiAgICAgICAgc2VydmljZS5zdWNjZXNzKCdDb3BpZWQgdG8gY2xpcGJvYXJkJywgJ1N1Y2Nlc3MnLCAyMDAwKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdXAgdmlzaWJpbGl0eSBjb25kaXRpb24gbGlzdGVuZXJcclxuICAgKiBXYXRjaGVzIHRoZSBkZXBlbmRlbnQgZmllbGQgYW5kIHNob3dzL2hpZGVzIHRoaXMgZmllbGQgYmFzZWQgb24gY29uZGl0aW9uc1xyXG4gICAqL1xyXG4gIHNldHVwVmlzaWJpbGl0eUNvbmRpdGlvbigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5maWVsZC52aXNpYmlsaXR5Q29uZGl0aW9uIHx8ICF0aGlzLmZvcm0pIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB7IGRlcGVuZHNPbiB9ID0gdGhpcy5maWVsZC52aXNpYmlsaXR5Q29uZGl0aW9uO1xyXG4gICAgY29uc3QgZGVwZW5kZW50Q29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZGVwZW5kc09uKTtcclxuXHJcbiAgICBpZiAoIWRlcGVuZGVudENvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEluaXRpYWwgdmlzaWJpbGl0eSBjaGVja1xyXG4gICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KGRlcGVuZGVudENvbnRyb2wudmFsdWUpO1xyXG5cclxuICAgIC8vIFN1YnNjcmliZSB0byB2YWx1ZSBjaGFuZ2VzXHJcbiAgICBkZXBlbmRlbnRDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSh2YWx1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBmaWVsZCB2aXNpYmlsaXR5IGJhc2VkIG9uIGRlcGVuZGVudCBmaWVsZCB2YWx1ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJpbGl0eShkZXBlbmRlbnRWYWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZmllbGQudmlzaWJpbGl0eUNvbmRpdGlvbikgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHsgc2hvd1doZW4sIGhpZGVXaGVuIH0gPSB0aGlzLmZpZWxkLnZpc2liaWxpdHlDb25kaXRpb247XHJcbiAgICBsZXQgc2hvdWxkQmVWaXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgLy8gQ2hlY2sgc2hvd1doZW4gY29uZGl0aW9uXHJcbiAgICBpZiAoc2hvd1doZW4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzaG93V2hlbikpIHtcclxuICAgICAgICBzaG91bGRCZVZpc2libGUgPSBzaG93V2hlbi5pbmNsdWRlcyhkZXBlbmRlbnRWYWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2hvdWxkQmVWaXNpYmxlID0gZGVwZW5kZW50VmFsdWUgPT09IHNob3dXaGVuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaGlkZVdoZW4gY29uZGl0aW9uIChvdmVycmlkZXMgc2hvd1doZW4pXHJcbiAgICBpZiAoaGlkZVdoZW4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBjb25zdCBzaG91bGRIaWRlID0gQXJyYXkuaXNBcnJheShoaWRlV2hlbilcclxuICAgICAgICA/IGhpZGVXaGVuLmluY2x1ZGVzKGRlcGVuZGVudFZhbHVlKVxyXG4gICAgICAgIDogZGVwZW5kZW50VmFsdWUgPT09IGhpZGVXaGVuO1xyXG5cclxuICAgICAgaWYgKHNob3VsZEhpZGUpIHtcclxuICAgICAgICBzaG91bGRCZVZpc2libGUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSB2aXNpYmlsaXR5XHJcbiAgICB0aGlzLmlzVmlzaWJsZS5zZXQoc2hvdWxkQmVWaXNpYmxlKTtcclxuXHJcbiAgICAvLyBPbmx5IGNsZWFyIHZhbHVlIHdoZW4gaGlkaW5nIGlmIHRoZXJlJ3Mgbm8gaW5pdGlhbCB2YWx1ZVxyXG4gICAgLy8gVGhpcyBwcmVzZXJ2ZXMgZGF0YSB3aGVuIGVkaXRpbmcgZXhpc3RpbmcgcmVjb3Jkc1xyXG4gICAgaWYgKCFzaG91bGRCZVZpc2libGUgJiYgdGhpcy5jb250cm9sICYmICF0aGlzLmNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmNvbnRyb2wubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICAgIHRoaXMuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cFRvYXN0U3Vic2NyaXB0aW9uKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VydmljZSA9IHRoaXMuZWZmZWN0aXZlVG9hc3RTZXJ2aWNlO1xyXG4gICAgaWYgKHNlcnZpY2UpIHtcclxuICAgICAgdGhpcy5zdWJzLmFkZChcclxuICAgICAgICBzZXJ2aWNlLnRvYXN0cyQuc3Vic2NyaWJlKCh0b2FzdHM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0cy5zZXQodG9hc3RzKTtcclxuICAgICAgICAgIC8vIFdhaXQgZm9yIERPTSB0byB1cGRhdGUgdGhlbiByZW5kZXIgdG9hc3QgaWNvbnNcclxuICAgICAgICAgIHRoaXMudXBkYXRlQWxsSWNvbnMoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZVRvYXN0KGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZWZmZWN0aXZlVG9hc3RTZXJ2aWNlPy5yZW1vdmUoaWQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VHJhbnNsYXRlZE1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmhlbHBlckhhbmRsZSAmJiB0eXBlb2YgdGhpcy5oZWxwZXJIYW5kbGUudHJhbnNsYXRlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmhlbHBlckhhbmRsZS50cmFuc2xhdGUobWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWVzc2FnZTtcclxuICB9XHJcblxyXG4gIGdldFRvYXN0SWNvbk5hbWUodG9hc3Q6IGFueSk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKHRvYXN0LnR5cGUpIHtcclxuICAgICAgY2FzZSAnc3VjY2Vzcyc6XHJcbiAgICAgICAgcmV0dXJuICdjaGVjay1jaXJjbGUnO1xyXG4gICAgICBjYXNlICd3YXJuJzpcclxuICAgICAgY2FzZSAnaW5mbyc6XHJcbiAgICAgICAgcmV0dXJuICdpbmZvLWNpcmNsZSc7XHJcbiAgICAgIGNhc2UgJ2Vycm9yJzpcclxuICAgICAgICByZXR1cm4gJ2V4Y2xhbWF0aW9uLWNpcmNsZSc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICdpbmZvLWNpcmNsZSc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93Rm9ybUZpZWxkTWVzc2FnZShjb250cm9sOiBhbnksIGhlbHBlclRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaGVscGVySGFuZGxlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmhlbHBlckhhbmRsZS5zaG93Rm9ybUZpZWxkTWVzc2FnZShjb250cm9sLCBoZWxwZXJUZXh0KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGlzRXJyb3IgPSBjb250cm9sPy50b3VjaGVkICYmICEhY29udHJvbD8uZXJyb3JzO1xyXG4gICAgY29uc3QgaXNIZWxwZXIgPSAhaXNFcnJvciAmJiBCb29sZWFuKGhlbHBlclRleHQgPz8gJycpO1xyXG4gICAgcmV0dXJuIGlzRXJyb3IgfHwgaXNIZWxwZXI7XHJcbiAgfVxyXG5cclxuICBnZXRUcmFuc2xhdGVkTGFiZWwobGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWxhYmVsKSByZXR1cm4gJyc7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBsYWJlbFN0ciA9IGxhYmVsLnRvU3RyaW5nKCk7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgbGFiZWxTdHJcclxuICAgICAgICAgIC5zcGxpdCgnOjonKVxyXG4gICAgICAgICAgLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpXHJcbiAgICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiAhIXBhcnQpXHJcbiAgICAgICAgICAubWFwKChwYXJ0KSA9PiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChwYXJ0KSlcclxuICAgICAgICAgIC5qb2luKCcgJykgKyB0aGlzLmdldEVuZFN5bWJvbChsYWJlbFN0cilcclxuICAgICAgKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdUcmFuc2xhdGlvbiBmYWlsZWQgaW4gZ2V0VHJhbnNsYXRlZExhYmVsOicsIGxhYmVsLCBlKTtcclxuICAgICAgcmV0dXJuIGxhYmVsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RW5kU3ltYm9sKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGxhYmVsLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ3JlcXVpcmVkJykgJiYgbGFiZWwudG9TdHJpbmcoKS5pbmNsdWRlcygnRk5GaWVsZE1lc3NhZ2UnKVxyXG4gICAgICA/ICcuJ1xyXG4gICAgICA6ICcnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tIElDT04gTE9HSUMgLS0tXHJcbiAgcHJpdmF0ZSB1cGRhdGVBbGxJY29ucygpOiB2b2lkIHtcclxuICAgIC8vIFdlJ2xsIGNhbGwgdGhpcyBhZnRlciBWaWV3SW5pdCBvciB3aGVuIGlucHV0cyBjaGFuZ2VcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmljb25Db250YWluZXJzPy5mb3JFYWNoKChjb250YWluZXIpID0+IHtcclxuICAgICAgICBjb25zdCBkcyA9IGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmRhdGFzZXQ7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IGRzWydpY29uTmFtZSddO1xyXG4gICAgICAgIGNvbnN0IHZhcmlhbnQgPSAoZHNbJ2ljb25WYXJpYW50J10gYXMgVHlwZUljb25WYXJpYW50KSB8fCAnTGluZSc7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IChkc1snaWNvblNpemUnXSB8fCAnbWVkaXVtJykgYXMgVHlwZUljb25TaXplTmFtZTtcclxuICAgICAgICBjb25zdCBjb2xvciA9IGRzWydpY29uQ29sb3InXTtcclxuICAgICAgICBjb25zdCBkaXNhYmxlZCA9IGRzWydpY29uRGlzYWJsZWQnXSA9PT0gJ3RydWUnO1xyXG5cclxuICAgICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgICAgdGhpcy5sb2FkSWNvblRvQ29udGFpbmVyKGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LCBuYW1lLCB2YXJpYW50LCBzaXplLCBjb2xvciwgZGlzYWJsZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZEljb25Ub0NvbnRhaW5lcihcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICB2YXJpYW50OiBUeXBlSWNvblZhcmlhbnQsXHJcbiAgICBzaXplTmFtZTogVHlwZUljb25TaXplTmFtZSxcclxuICAgIGNvbG9yPzogc3RyaW5nIHwgbnVsbCxcclxuICAgIGRpc2FibGVkPzogYm9vbGVhbixcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemVNYXBbc2l6ZU5hbWVdO1xyXG5cclxuICAgIC8vIDEuIENoZWNrIGlmIHJhdyBTVkcgc3RyaW5nIGlzIHByb3ZpZGVkXHJcbiAgICBpZiAobmFtZS50cmltKCkuc3RhcnRzV2l0aCgnPHN2ZycpKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyU3ZnVG9Db250YWluZXIoY29udGFpbmVyLCBuYW1lLCBjb2xvciwgc2l6ZSwgJ2N1c3RvbScsIGRpc2FibGVkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDIuIENoZWNrIGJ1aWx0LWluIGljb25zIHJlZ2lzdHJ5XHJcbiAgICAvLyBTdHJpcCBwb3NzaWJsZSAtLXNpemUgc3VmZml4IGlmIGl0IHdhcyBwYXNzZWQgYnkgbWlzdGFrZSBmcm9tIG9sZCBsb2dpY1xyXG4gICAgY29uc3QgYmFzZU5hbWUgPSBuYW1lLnNwbGl0KCctLScpWzBdLnRyaW0oKTtcclxuICAgIGlmIChDT1JFX0lDT05TW2Jhc2VOYW1lXSkge1xyXG4gICAgICB0aGlzLnJlbmRlclN2Z1RvQ29udGFpbmVyKGNvbnRhaW5lciwgQ09SRV9JQ09OU1tiYXNlTmFtZV0sIGNvbG9yLCBzaXplLCBiYXNlTmFtZSwgZGlzYWJsZWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTm8gZmFsbGJhY2sgdG8gSFRUUFxyXG4gICAgY29uc29sZS53YXJuKGBbZm4taW5wdXRdIEljb24gXCIke25hbWV9XCIgbm90IGZvdW5kIGluIGNvcmUgcmVnaXN0cnkgYW5kIG5vIHJhdyBTVkcgcHJvdmlkZWQuYCk7XHJcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclN2Z1RvQ29udGFpbmVyKFxyXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcclxuICAgIHJhdzogc3RyaW5nLFxyXG4gICAgY29sb3I6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXHJcbiAgICBzaXplOiBudW1iZXIsXHJcbiAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICBkaXNhYmxlZD86IGJvb2xlYW4sXHJcbiAgKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XHJcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmF3LCAnaW1hZ2Uvc3ZnK3htbCcpO1xyXG4gICAgICBjb25zdCBzdmcgPSBkb2MucXVlcnlTZWxlY3Rvcignc3ZnJykgYXMgdW5rbm93biBhcyBTVkdTVkdFbGVtZW50O1xyXG5cclxuICAgICAgaWYgKCFzdmcpIHtcclxuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBTVkcgTm9ybWFsaXphdGlvbiBsb2dpY1xyXG4gICAgICBmb3IgKGNvbnN0IHMgb2Ygc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJykpIHMucmVtb3ZlKCk7XHJcblxyXG4gICAgICBpZiAoY29sb3IpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIHN2Zy5xdWVyeVNlbGVjdG9yQWxsPFNWR0VsZW1lbnQ+KCcqJykpIHtcclxuICAgICAgICAgIGNvbnN0IHN0eWxlID0gZWwuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xyXG4gICAgICAgICAgaWYgKHN0eWxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsZWFuZWQgPSBzdHlsZVxyXG4gICAgICAgICAgICAgIC5yZXBsYWNlQWxsKC9maWxsXFxzKjpcXHMqW147XSs7Py9naSwgJycpXHJcbiAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoL3N0cm9rZVxccyo6XFxzKlteO10rOz8vZ2ksICcnKTtcclxuICAgICAgICAgICAgaWYgKGNsZWFuZWQpIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBjbGVhbmVkKTtcclxuICAgICAgICAgICAgZWxzZSBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZmlsbCA9IGVsLmdldEF0dHJpYnV0ZSgnZmlsbCcpO1xyXG4gICAgICAgICAgaWYgKGZpbGwgJiYgZmlsbCAhPT0gJ25vbmUnICYmICFmaWxsLnN0YXJ0c1dpdGgoJ3VybCgnKSkge1xyXG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnY3VycmVudENvbG9yJyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3Qgc3Ryb2tlID0gZWwuZ2V0QXR0cmlidXRlKCdzdHJva2UnKTtcclxuICAgICAgICAgIGlmIChzdHJva2UgJiYgc3Ryb2tlICE9PSAnbm9uZScgJiYgIXN0cm9rZS5zdGFydHNXaXRoKCd1cmwoJykpIHtcclxuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnY3VycmVudENvbG9yJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBzdmcucmVtb3ZlQXR0cmlidXRlKCd3aWR0aCcpO1xyXG4gICAgICBzdmcucmVtb3ZlQXR0cmlidXRlKCdoZWlnaHQnKTtcclxuICAgICAgaWYgKCFzdmcuZ2V0QXR0cmlidXRlKCd2aWV3Qm94JykpIHtcclxuICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywgYDAgMCAke3NpemV9ICR7c2l6ZX1gKTtcclxuICAgICAgfVxyXG4gICAgICBzdmcuc2V0QXR0cmlidXRlKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ3hNaWRZTWlkIG1lZXQnKTtcclxuICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnZm9jdXNhYmxlJywgJ2ZhbHNlJyk7XHJcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcclxuICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMTAwJScpO1xyXG4gICAgICBzdmcuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnMTAwJScpO1xyXG5cclxuICAgICAgY29uc3Qgc3R5bGUgPSBgO2Rpc3BsYXk6YmxvY2s7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlO2A7XHJcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgKHN2Zy5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykgfHwgJycpICsgc3R5bGUpO1xyXG5cclxuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xyXG4gICAgICBpZiAoY29sb3IpIHtcclxuICAgICAgICBjb250YWluZXIuc3R5bGUuY29sb3IgPSBjb2xvcjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZGlzYWJsZWQpIHtcclxuICAgICAgICBjb250YWluZXIuc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5jdXJzb3IgPSAnbm90LWFsbG93ZWQnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5vcGFjaXR5ID0gJzEnO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5jdXJzb3IgPSAnJztcclxuICAgICAgfVxyXG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc3ZnKTtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgW2ZuLWlucHV0XSBFcnJvciBwYXJzaW5nIFNWRyBmb3IgaWNvbiBcIiR7bmFtZX1cIjpgLCBlcnJvcik7XHJcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFJlbW92ZWQgZ2V0SWNvblBhdGggYXMgSFRUUCBsb2FkaW5nIGlzIGRpc2FibGVkXHJcblxyXG4gIC8vIC0tLSBNRVNTQUdFIExPR0lDIC0tLVxyXG4gIGdldEZpZWxkTWVzc2FnZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmNvbnRyb2wpIHJldHVybiB0aGlzLmZpZWxkPy5oZWxwZXJUZXh0IHx8ICcnO1xyXG5cclxuICAgIGlmICh0aGlzLmNvbnRyb2wudG91Y2hlZCAmJiB0aGlzLmNvbnRyb2wuZXJyb3JzKSB7XHJcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuY29udHJvbC5lcnJvcnMpKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3JWYWx1ZSA9IHRoaXMuY29udHJvbC5lcnJvcnNba2V5XTtcclxuICAgICAgICBpZiAoZXJyb3JWYWx1ZSAmJiB0eXBlb2YgZXJyb3JWYWx1ZSA9PT0gJ29iamVjdCcgJiYgZXJyb3JWYWx1ZS5tZXNzYWdlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZXJyb3JWYWx1ZS5tZXNzYWdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5maWVsZD8uZXJyb3JzPy5ba2V5XSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGQuZXJyb3JzW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgdGhpcy5maWVsZD8uZXJyb3JzPy5bJ2RlZmF1bHQnXSB8fFxyXG4gICAgICAgICdQbGVhc2UgZW50ZXIgJyArIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMuZmllbGQ/LmxhYmVsKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmZpZWxkPy5oZWxwZXJUZXh0IHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzRXJyb3IoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISEodGhpcy5jb250cm9sPy50b3VjaGVkICYmIHRoaXMuY29udHJvbD8uZXJyb3JzKTtcclxuICB9XHJcblxyXG4gIGdldCBpc1N1Y2Nlc3MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISEodGhpcy5jb250cm9sPy52YWxpZCAmJiB0aGlzLmNvbnRyb2w/LnRvdWNoZWQpO1xyXG4gIH1cclxufVxyXG4iLCJAaWYgKGZpZWxkLm5hbWUgJiYgaXNWaXNpYmxlKCkgJiYgIWZpZWxkLmhpZGRlbikge1xyXG4gIDxkaXYgY2xhc3M9XCJmbi1pbnB1dC1jb250YWluZXJcIj5cclxuICAgIEBpZiAoZmllbGQudHlwZSEgIT09ICdoaWRkZW4nKSB7XHJcbiAgICAgIDxsYWJlbFxyXG4gICAgICAgIFtmb3JdPVwidW5pcXVlSWRcIlxyXG4gICAgICAgIGNsYXNzPVwiZm4tbGFiZWxcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgIGNvbG9yOiBmaWVsZC5jb2xvciB8fCAnIzAzMTgyYicsXHJcbiAgICAgICAgICAnZm9udC1zaXplJzogZmllbGQubGFiZWxTaXplIHx8ICcnLFxyXG4gICAgICAgIH1cIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgZ2V0VHJhbnNsYXRlZExhYmVsKGZpZWxkLmxhYmVsKSB9fVxyXG4gICAgICAgIEBpZiAoIWZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlT3B0aW9uYWwpIHtcclxuICAgICAgICAgIDxzcGFuPiZuYnNwOyhPcHRpb25hbCk8L3NwYW4+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgfVxyXG5cclxuICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgIEBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcclxuICAgICAgICA8IS0tIFRleHRhcmVhIEZpZWxkIC0tPlxyXG4gICAgICAgIEBjYXNlICgndGV4dGFyZWEnKSB7XHJcbiAgICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgICAgI2ZuVGV4dGFyZWFcclxuICAgICAgICAgICAgc3R5bGU9XCJyZXNpemU6IG5vbmVcIlxyXG4gICAgICAgICAgICBbbmFtZV09XCJmaWVsZC5uYW1lXCJcclxuICAgICAgICAgICAgW2lkXT1cInVuaXF1ZUlkXCJcclxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgW3Jvd3NdPVwiZmllbGQucm93cyB8fCAxXCJcclxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRPbmx5IHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxyXG4gICAgICAgICAgICAoaW5wdXQpPVwiaGFuZGxlVGV4dEFyZWEoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cImhhbmRsZUJsdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm4taW5wdXQtZmllbGRcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgZGlzYWJsZWQ6IGNvbnRyb2wuZGlzYWJsZWQgfHwgZmllbGQucmVhZE9ubHksXHJcbiAgICAgICAgICAgICAgZXJyb3I6IGNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmVycm9ycyxcclxuICAgICAgICAgICAgICBzdWNjZXNzOiBmaWVsZFsnaGFzU3VjY2Vzc0JvcmRlciddICYmIGNvbnRyb2wudmFsaWQgJiYgIWNvbnRyb2wuZXJyb3JzLFxyXG4gICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgIGNvbG9yOiBmaWVsZC52YWx1ZUNvbG9yIHx8ICdpbmhlcml0JyxcclxuICAgICAgICAgICAgICAnZm9udC1zaXplJzogZmllbGQudmFsdWVTaXplIHx8ICcnLFxyXG4gICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXHJcbiAgICAgICAgICA+PC90ZXh0YXJlYT5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDwhLS0gUGFzc3dvcmQgRmllbGQgLS0+XHJcbiAgICAgICAgQGNhc2UgKCdwYXNzd29yZCcpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSB3LWZ1bGxcIj5cclxuICAgICAgICAgICAgQGlmIChmaWVsZC5wcmVmaXg/Lmljb24pIHtcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgbGVmdC0wIHRvcC0xLzIgLXRyYW5zbGF0ZS15LTEvMiBwbC0zIGZsZXggaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tbmFtZV09XCJmaWVsZC5wcmVmaXghLmljb25cIlxyXG4gICAgICAgICAgICAgICAgICBkYXRhLWljb24tdmFyaWFudD1cIkxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICBkYXRhLWljb24tc2l6ZT1cIm1lZGl1bVwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaWNvbi1jb2xvcl09XCJjb250cm9sLmRpc2FibGVkID8gJyNjNGNkZDInIDogJyMwMzE4MmInXCJcclxuICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICBbdHlwZV09XCJzaG93UGFzc3dvcmQgPyAndGV4dCcgOiAncGFzc3dvcmQnXCJcclxuICAgICAgICAgICAgICBbaWRdPVwidW5pcXVlSWRcIlxyXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmllbGQucmVhZE9ubHkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJpc0FscGhhbnVtZXJpYyA/IGhhbmRsZUFscGhhbnVtZXJpY0lucHV0KCRldmVudCkgOiBoYW5kbGVJbnB1dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoZm9jdXMpPVwib25QYXNzd29yZEZvY3VzKClcIlxyXG4gICAgICAgICAgICAgIChibHVyKT1cImhhbmRsZVBhc3N3b3JkQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImZuLWlucHV0LWZpZWxkIG92ZXJmbG93LWhpZGRlbiB0ZXh0LWVsbGlwc2lzXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogY29udHJvbC5kaXNhYmxlZCB8fCBmaWVsZC5yZWFkT25seSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiBjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5lcnJvcnMsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmaWVsZFsnaGFzU3VjY2Vzc0JvcmRlciddICYmIGNvbnRyb2wudmFsaWQsXHJcbiAgICAgICAgICAgICAgICAncGwtMTAnOiBmaWVsZC5wcmVmaXg/Lmljb24sXHJcbiAgICAgICAgICAgICAgICAncHItMTInOlxyXG4gICAgICAgICAgICAgICAgICAoZmllbGQudG9nZ2xlTWFzayAmJiAhZmllbGQuaXNDb3B5VGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgKCFmaWVsZC50b2dnbGVNYXNrICYmIGZpZWxkLmlzQ29weVRleHQpLFxyXG4gICAgICAgICAgICAgICAgJ3ByLTI0JzogZmllbGQudG9nZ2xlTWFzayAmJiBmaWVsZC5pc0NvcHlUZXh0ICYmICFmaWVsZC5oYXNHZW5lcmF0ZUtleSxcclxuICAgICAgICAgICAgICAgICdwci0zMic6IGZpZWxkLnRvZ2dsZU1hc2sgJiYgZmllbGQuaXNDb3B5VGV4dCAmJiBmaWVsZC5oYXNHZW5lcmF0ZUtleSxcclxuICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICBjb2xvcjogZmllbGQudmFsdWVDb2xvciB8fCAnaW5oZXJpdCcsXHJcbiAgICAgICAgICAgICAgICAnZm9udC1zaXplJzogZmllbGQudmFsdWVTaXplIHx8ICcnLFxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIHJpZ2h0LTAgdG9wLTEvMiAtdHJhbnNsYXRlLXktMS8yIGZsZXggaXRlbXMtY2VudGVyIHByLTMgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICBAaWYgKGZpZWxkLnRvZ2dsZU1hc2sgJiYgIWZpZWxkLmlzQ29weVRleHQpIHtcclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGFzc3dvcmRWaXNpYmlsaXR5KClcIlxyXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJ0b2dnbGVQYXNzd29yZFZpc2liaWxpdHkoKVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAjaWNvbkNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaWNvbi1uYW1lXT1cInNob3dQYXNzd29yZCA/ICdleWUtb3BlbicgOiAnZXllLWNsb3NlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLXZhcmlhbnQ9XCJMaW5lXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tc2l6ZT1cImxhcmdlXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tY29sb3I9XCIjMDMxODJiXCJcclxuICAgICAgICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGZpZWxkLmlzQ29weVRleHQgJiYgIWZpZWxkLnRvZ2dsZU1hc2spIHtcclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29weVRleHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImNvcHlUZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgI2ljb25Db250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tbmFtZT1cInR3by1zcXVhcmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1jb2xvcj1cIiMwMzE4MmJcIlxyXG4gICAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICBAaWYgKGZpZWxkLmhhc0dlbmVyYXRlS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZpZWxkLm9uR2VuZXJhdGVLZXkgJiYgZmllbGQub25HZW5lcmF0ZUtleSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJmaWVsZC5vbkdlbmVyYXRlS2V5ICYmIGZpZWxkLm9uR2VuZXJhdGVLZXkoKVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAjaWNvbkNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tbmFtZT1cInJvdW5kLWFycm93LXRvcC1sZWZ0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi12YXJpYW50PVwiTGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tc2l6ZT1cImxhcmdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1jb2xvcj1cIiMwMzE4MmJcIlxyXG4gICAgICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGZpZWxkLnRvZ2dsZU1hc2sgJiYgZmllbGQuaXNDb3B5VGV4dCkge1xyXG4gICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVQYXNzd29yZFZpc2liaWxpdHkoKVwiXHJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cInRvZ2dsZVBhc3N3b3JkVmlzaWJpbGl0eSgpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLW5hbWVdPVwic2hvd1Bhc3N3b3JkID8gJ2V5ZS1vcGVuJyA6ICdleWUtY2xvc2UnXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tdmFyaWFudD1cIkxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1zaXplPVwibGFyZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1jb2xvcj1cIiMwMzE4MmJcIlxyXG4gICAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvcHlUZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJjb3B5VGV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLW5hbWU9XCJ0d28tc3F1YXJlXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tY29sb3I9XCIjMDMxODJiXCJcclxuICAgICAgICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgQGlmIChmaWVsZC5oYXNHZW5lcmF0ZUtleSkge1xyXG4gICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmaWVsZC5vbkdlbmVyYXRlS2V5ICYmIGZpZWxkLm9uR2VuZXJhdGVLZXkoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiZmllbGQub25HZW5lcmF0ZUtleSAmJiBmaWVsZC5vbkdlbmVyYXRlS2V5KClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ29wYWNpdHktNTAgY3Vyc29yLW5vdC1hbGxvd2VkJzogIWNvbnRyb2wudmFsdWUgfVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAjaWNvbkNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tbmFtZT1cInJvdW5kLWFycm93LXRvcC1sZWZ0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1jb2xvcj1cIiMwMzE4MmJcIlxyXG4gICAgICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICBAaWYgKGZpZWxkLmZlZWRiYWNrICYmIGlzUGFzc3dvcmRGb2N1c2VkKSB7XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIHNwYWNlLXktMVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gdGV4dC14c1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LW1lZGl1bVwiIFtuZ0NsYXNzXT1cInN0cmVuZ3RoQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAge3sgcGFzc3dvcmRTdHJlbmd0aExhYmVsIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLW5hbWVdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZFN0cmVuZ3RoUGVyY2VudCA+IDUwID8gJ2NoZWNrLWNpcmNsZScgOiAnaW5mby1jaXJjbGUnXHJcbiAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tdmFyaWFudD1cIkxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1zaXplPVwiZXh0cmFzbWFsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLWNvbG9yXT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRTdHJlbmd0aFBlcmNlbnQgPD0gMjVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnI2VmM2U0MidcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBwYXNzd29yZFN0cmVuZ3RoUGVyY2VudCA8PSA3NVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJyNmZjlmMDAnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnIzZjYzI0YSdcclxuICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC0xLjUgdy1mdWxsIGJnLVsjZWVmMGYyXSByb3VuZGVkLWZ1bGwgb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC1mdWxsIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTMwMCByb3VuZGVkLWZ1bGxcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2JnLVsjZWYzZTQyXSc6IHBhc3N3b3JkU3RyZW5ndGhQZXJjZW50IDw9IDI1LFxyXG4gICAgICAgICAgICAgICAgICAgICdiZy1bI2ZmOWYwMF0nOiBwYXNzd29yZFN0cmVuZ3RoUGVyY2VudCA+IDI1ICYmIHBhc3N3b3JkU3RyZW5ndGhQZXJjZW50IDw9IDc1LFxyXG4gICAgICAgICAgICAgICAgICAgICdiZy1bIzZjYzI0YV0nOiBwYXNzd29yZFN0cmVuZ3RoUGVyY2VudCA+IDc1LFxyXG4gICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwicGFzc3dvcmRTdHJlbmd0aFBlcmNlbnRcIlxyXG4gICAgICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDwhLS0gTnVtYmVyIEZpZWxkIC0tPlxyXG4gICAgICAgIEBjYXNlICgnbnVtYmVyJykge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIHctZnVsbFwiPlxyXG4gICAgICAgICAgICBAaWYgKGZpZWxkLnByZWZpeD8uaWNvbikge1xyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSBsZWZ0LTAgdG9wLTEvMiAtdHJhbnNsYXRlLXktMS8yIHBsLTMgZmxleCBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgI2ljb25Db250YWluZXJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaWNvbi1uYW1lXT1cImZpZWxkLnByZWZpeCEuaWNvblwiXHJcbiAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi12YXJpYW50PVwiTGluZVwiXHJcbiAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1zaXplPVwibWVkaXVtXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLWNvbG9yXT1cImNvbnRyb2wuZGlzYWJsZWQgPyAnI2M0Y2RkMicgOiAnIzAzMTgyYidcIlxyXG4gICAgICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIFt0eXBlXT1cImZpZWxkLnR5cGUgPT09ICdudW1iZXInICYmIGZpZWxkLmlzQ3VycmVuY3kgPyAndGV4dCcgOiAnbnVtYmVyJ1wiXHJcbiAgICAgICAgICAgICAgW25hbWVdPVwiZmllbGQubmFtZVwiXHJcbiAgICAgICAgICAgICAgW2lkXT1cInVuaXF1ZUlkXCJcclxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtyZWFkT25seV09XCJmaWVsZC5yZWFkT25seSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgIFttaW5dPVwiZmllbGQudHlwZSA9PT0gJ251bWJlcicgJiYgIWZpZWxkLmlzQ3VycmVuY3kgPyAwIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgW21heF09XCJmaWVsZC50eXBlID09PSAnbnVtYmVyJyAmJiAhZmllbGQuaXNDdXJyZW5jeSA/IGZpZWxkLm1heCA6IG51bGxcIlxyXG4gICAgICAgICAgICAgIFtzdGVwXT1cImZpZWxkLnR5cGUgPT09ICdudW1iZXInICYmICFmaWVsZC5pc0N1cnJlbmN5ID8gZmllbGQuc3RlcCB8fCAxIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cImhhbmRsZU51bWJlcklucHV0KCRldmVudCwgZmllbGQubWluRnJhY3Rpb25EaWdpdHMgfHwgMilcIlxyXG4gICAgICAgICAgICAgIChwYXN0ZSk9XCJoYW5kbGVOdW1iZXJQYXN0ZSgkZXZlbnQsIGZpZWxkLm1pbkZyYWN0aW9uRGlnaXRzIHx8IDIpXCJcclxuICAgICAgICAgICAgICAoYmx1cik9XCJoYW5kbGVCbHVyKCRldmVudCwgZmllbGQubWluRnJhY3Rpb25EaWdpdHMgfHwgMilcIlxyXG4gICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZU51bWJlcktleWRvd24oJGV2ZW50LCBmaWVsZC5pc0N1cnJlbmN5IHx8IGZhbHNlKVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbi1pbnB1dC1maWVsZFwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGNvbnRyb2wuZGlzYWJsZWQgfHwgZmllbGQucmVhZE9ubHksXHJcbiAgICAgICAgICAgICAgICBlcnJvcjogY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZXJyb3JzLFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmllbGRbJ2hhc1N1Y2Nlc3NCb3JkZXInXSAmJiBjb250cm9sLnZhbGlkICYmICFjb250cm9sLmVycm9ycyxcclxuICAgICAgICAgICAgICAgICdwbC0xMCc6IGZpZWxkLnByZWZpeD8uaWNvbixcclxuICAgICAgICAgICAgICAgICd0ZXh0LVsyNHB4XSBmb250LWJvbGQnOiBmaWVsZC5pc0N1cnJlbmN5LFxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgIGNvbG9yOiBmaWVsZC52YWx1ZUNvbG9yIHx8ICdpbmhlcml0JyxcclxuICAgICAgICAgICAgICAgICdmb250LXNpemUnOiBmaWVsZC52YWx1ZVNpemUgfHwgJycsXHJcbiAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDwhLS0gRGVmYXVsdCBJbnB1dCBGaWVsZCAodGV4dCwgZW1haWwsIGV0Yy4pIC0tPlxyXG4gICAgICAgIEBkZWZhdWx0IHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSB6LTBcIj5cclxuICAgICAgICAgICAgQGlmIChmaWVsZC5wcmVmaXg/Lmljb24pIHtcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgbGVmdC0wIHRvcC0xLzIgLXRyYW5zbGF0ZS15LTEvMiBwbC0zIGZsZXggaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tbmFtZV09XCJmaWVsZC5wcmVmaXghLmljb25cIlxyXG4gICAgICAgICAgICAgICAgICBkYXRhLWljb24tdmFyaWFudD1cIkxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICBkYXRhLWljb24tc2l6ZT1cIm1lZGl1bVwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaWNvbi1jb2xvcl09XCJjb250cm9sLmRpc2FibGVkID8gJyNjNGNkZDInIDogJyMwMzE4MmInXCJcclxuICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICBbdHlwZV09XCJmaWVsZC50eXBlXCJcclxuICAgICAgICAgICAgICBbbmFtZV09XCJmaWVsZC5uYW1lXCJcclxuICAgICAgICAgICAgICBbaWRdPVwidW5pcXVlSWRcIlxyXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQuZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtyZWFkT25seV09XCJmaWVsZC5yZWFkT25seSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJcclxuICAgICAgICAgICAgICAgIGlzRW1haWxGaWVsZFxyXG4gICAgICAgICAgICAgICAgICA/IGhhbmRsZUVtYWlsSW5wdXQoJGV2ZW50KVxyXG4gICAgICAgICAgICAgICAgICA6IGZpZWxkLnR5cGUgPT09ICd0ZXh0JyAmJiBpc0FscGhhbnVtZXJpY1xyXG4gICAgICAgICAgICAgICAgICAgID8gaGFuZGxlQWxwaGFudW1lcmljSW5wdXQoJGV2ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgIDogaGFuZGxlSW5wdXQoJGV2ZW50KVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgKGJsdXIpPVwiaGFuZGxlQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImZuLWlucHV0LWZpZWxkXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogY29udHJvbC5kaXNhYmxlZCB8fCBmaWVsZC5yZWFkT25seSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiBjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5lcnJvcnMsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmaWVsZFsnaGFzU3VjY2Vzc0JvcmRlciddICYmIGNvbnRyb2wudmFsaWQgJiYgIWNvbnRyb2wuZXJyb3JzLFxyXG4gICAgICAgICAgICAgICAgJ3BsLTEwJzogZmllbGQucHJlZml4Py5pY29uLFxyXG4gICAgICAgICAgICAgICAgJ3ByLTEwJzogKGZpZWxkLmljb24gfHwgZmllbGQuc3VmZml4Py5pY29uKSAmJiAhZmllbGQuaXNDb3B5VGV4dCxcclxuICAgICAgICAgICAgICAgICdwci0yMCc6XHJcbiAgICAgICAgICAgICAgICAgIGZpZWxkLmlzQ29weVRleHQgJiYgIWZpZWxkLmhhc0dlbmVyYXRlS2V5ICYmICEoZmllbGQuaWNvbiB8fCBmaWVsZC5zdWZmaXg/Lmljb24pLFxyXG4gICAgICAgICAgICAgICAgJ3ByLTMwJzpcclxuICAgICAgICAgICAgICAgICAgZmllbGQuaXNDb3B5VGV4dCAmJiBmaWVsZC5oYXNHZW5lcmF0ZUtleSAmJiAhKGZpZWxkLmljb24gfHwgZmllbGQuc3VmZml4Py5pY29uKSxcclxuICAgICAgICAgICAgICAgICdwci0zMic6XHJcbiAgICAgICAgICAgICAgICAgIGZpZWxkLmlzQ29weVRleHQgJiYgZmllbGQuaGFzR2VuZXJhdGVLZXkgJiYgKGZpZWxkLmljb24gfHwgZmllbGQuc3VmZml4Py5pY29uKSxcclxuICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICBjb2xvcjogZmllbGQudmFsdWVDb2xvciB8fCAnaW5oZXJpdCcsXHJcbiAgICAgICAgICAgICAgICAnZm9udC1zaXplJzogZmllbGQudmFsdWVTaXplIHx8ICcnLFxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxyXG4gICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIHJpZ2h0LTAgdG9wLTEvMiAtdHJhbnNsYXRlLXktMS8yIGZsZXggaXRlbXMtY2VudGVyIHByLTMgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICBAaWYgKGZpZWxkLmlzQ29weVRleHQpIHtcclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29weVRleHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImNvcHlUZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgI2ljb25Db250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tbmFtZT1cInR3by1zcXVhcmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1jb2xvcj1cIiMwMzE4MmJcIlxyXG4gICAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICBAaWYgKGZpZWxkLmhhc0dlbmVyYXRlS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZpZWxkLm9uR2VuZXJhdGVLZXkgJiYgZmllbGQub25HZW5lcmF0ZUtleSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJmaWVsZC5vbkdlbmVyYXRlS2V5ICYmIGZpZWxkLm9uR2VuZXJhdGVLZXkoKVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAjaWNvbkNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tbmFtZT1cInJvdW5kLWFycm93LXRvcC1sZWZ0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1jb2xvcj1cIiMwMzE4MmJcIlxyXG4gICAgICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgQGlmIChmaWVsZC5pY29uIHx8IGZpZWxkLnN1ZmZpeD8uaWNvbikge1xyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAjaWNvbkNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLW5hbWVdPVwiZmllbGQuc3VmZml4Py5pY29uIHx8IGZpZWxkLmljb24hLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tdmFyaWFudF09XCJmaWVsZC5pY29uPy52YXJpYW50IHx8ICdMaW5lJ1wiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaWNvbi1zaXplXT1cImZpZWxkLmljb24gPyBnZXRJY29uU2l6ZU5hbWUoZmllbGQuaWNvbi5zaXplKSA6ICdtZWRpdW0nXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLWNvbG9yXT1cImNvbnRyb2wuZGlzYWJsZWQgPyAnI2M0Y2RkMicgOiAnIzAzMTgyYidcIlxyXG4gICAgICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIEBpZiAoc2hvd0Zvcm1GaWVsZE1lc3NhZ2UoY29udHJvbCwgaGVscGVyVGV4dCkpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cImZuLWZpZWxkLW1lc3NhZ2UtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPHNwYW5cclxuICAgICAgICAgIGNsYXNzPVwiZm4tZmllbGQtbWVzc2FnZS10ZXh0XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgZXJyb3I6IGlzRXJyb3IsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGlzU3VjY2VzcyxcclxuICAgICAgICAgIH1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldEZpZWxkTWVzc2FnZSgpIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBJbnRlZ3JhdGVkIFRvYXN0IE5vdGlmaWNhdGlvbnMgLS0+XHJcbiAgPGRpdiBjbGFzcz1cInRvYXN0LWNvbnRhaW5lclwiPlxyXG4gICAgQGZvciAodG9hc3Qgb2YgdG9hc3RzKCk7IHRyYWNrIHRvYXN0LmlkKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0b2FzdCB0b2FzdC17eyB0b2FzdC50eXBlIH19XCIgW2NsYXNzLnRvYXN0LWVudGVyXT1cInRvYXN0LmlzVmlzaWJsZVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidG9hc3QtaWNvblwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAjaWNvbkNvbnRhaW5lclxyXG4gICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLW5hbWVdPVwiZ2V0VG9hc3RJY29uTmFtZSh0b2FzdClcIlxyXG4gICAgICAgICAgICBkYXRhLWljb24tdmFyaWFudD1cIkNvbG91clwiXHJcbiAgICAgICAgICAgIGRhdGEtaWNvbi1zaXplPVwibWVkaXVtXCJcclxuICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLWNvbG9yXT1cIlxyXG4gICAgICAgICAgICAgIHRvYXN0LnR5cGUgPT09ICdzdWNjZXNzJ1xyXG4gICAgICAgICAgICAgICAgPyAnIzZjYzI0YSdcclxuICAgICAgICAgICAgICAgIDogdG9hc3QudHlwZSA9PT0gJ3dhcm4nXHJcbiAgICAgICAgICAgICAgICAgID8gJyNmZjlmMDAnXHJcbiAgICAgICAgICAgICAgICAgIDogdG9hc3QudHlwZSA9PT0gJ2Vycm9yJ1xyXG4gICAgICAgICAgICAgICAgICAgID8gJyNlZjNlNDInXHJcbiAgICAgICAgICAgICAgICAgICAgOiAnIzAzMTgyYidcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRvYXN0LWNvbnRlbnRcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9hc3QtbWVzc2FnZVwiPlxyXG4gICAgICAgICAgICB7eyBnZXRUcmFuc2xhdGVkTWVzc2FnZSh0b2FzdC5tZXNzYWdlKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJ0b2FzdC1jbG9zZVwiIChjbGljayk9XCJyZW1vdmVUb2FzdCh0b2FzdC5pZClcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgI2ljb25Db250YWluZXJcclxuICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgIGRhdGEtaWNvbi1uYW1lPVwiY3Jvc3NcIlxyXG4gICAgICAgICAgICBkYXRhLWljb24tdmFyaWFudD1cIkxpbmVcIlxyXG4gICAgICAgICAgICBkYXRhLWljb24tc2l6ZT1cIm1lZGl1bVwiXHJcbiAgICAgICAgICAgIGRhdGEtaWNvbi1jb2xvcj1cIiNmZmZmZmZcIlxyXG4gICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxufVxyXG4iXX0=
1191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm4taW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZm4taW5wdXQvc3JjL2xpYi9mbi1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9mbi1pbnB1dC9zcmMvbGliL2ZuLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUlULFlBQVksR0FFYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsNEJBQTRCO0FBQzVCLE9BQU8sRUFBMEIsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBSUwscUJBQXFCLEVBR3JCLGdCQUFnQixHQUNqQixNQUFNLGtCQUFrQixDQUFDOzs7OztBQUkxQixNQUFNLFVBQVUsR0FBMkI7SUFDekMsVUFBVSxFQUFFLG1WQUFtVjtJQUMvVixXQUFXLEVBQUUsc1VBQXNVO0lBQ25WLFlBQVksRUFBRSxpVkFBaVY7SUFDL1Ysc0JBQXNCLEVBQUUsMFFBQTBRO0lBQ2xTLGNBQWMsRUFBRSxzUUFBc1E7SUFDdFIsYUFBYSxFQUFFLGljQUFpYztJQUNoZCxjQUFjLEVBQUUsa2NBQWtjO0lBQ2xkLG9CQUFvQixFQUFFLGtjQUFrYztJQUN4ZCxLQUFLLEVBQUUsc01BQXNN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RHBCLGdqckJBK2VBLDRtSEQzYlksV0FBVyxtbkJBQUUsWUFBWSxpTkFBRSxtQkFBbUIsaU5BQUUsZUFBZTs7NEZBSzlELE9BQU87a0JBUm5CLFNBQVM7K0JBQ0UsVUFBVSxjQUNSLElBQUksV0FDUCxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxDQUFDLG1CQUd6RCx1QkFBdUIsQ0FBQyxNQUFNO3NGQUd0QyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQU1HLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUlrQixlQUFlO3NCQUF2QyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ1EsY0FBYztzQkFBNUMsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBpbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBzaWduYWwsXHJcbiAgVmlld0NoaWxkLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG4vLyBSZW1vdmVkIEh0dHBDbGllbnQgaW1wb3J0XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBtZXJnZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7XHJcbiAgRk5JbnB1dEJhc2UsXHJcbiAgRk5JbnB1dEhlbHBlcixcclxuICBGTklucHV0VG9hc3QsXHJcbiAgREVGQVVMVF9DVVJSRU5DWV9NRVRBLFxyXG4gIFR5cGVJY29uVmFyaWFudCxcclxuICBUeXBlSWNvblNpemUsXHJcbiAgRk5fVE9BU1RfU0VSVklDRSxcclxufSBmcm9tICcuL2ZuLWlucHV0LnR5cGVzJztcclxuXHJcbmV4cG9ydCB0eXBlIFR5cGVJY29uU2l6ZU5hbWUgPSAnZXh0cmFzbWFsbCcgfCAnc21hbGwnIHwgJ21lZGl1bScgfCAnbGFyZ2UnIHwgJ3gtbGFyZ2UnIHwgJ3h4bGFyZ2UnO1xyXG5cclxuY29uc3QgQ09SRV9JQ09OUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcclxuICAnZXllLW9wZW4nOiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0yIDEyczQtOCAxMC04IDEwIDggMTAgOC00IDgtMTAgOC0xMC04LTEwLTh6XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbiAgJ2V5ZS1jbG9zZSc6IGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTIgMTBhMTEgMTEgMCAwIDAgMjAgMFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk01IDEzbC0xIDJNMTIgMTR2Mk0xOSAxM2wxIDJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbiAgJ3R3by1zcXVhcmUnOiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHJlY3QgeD1cIjhcIiB5PVwiNFwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHJ4PVwiMlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk00IDh2MTBhMiAyIDAgMCAwIDIgMmgxMFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+YCxcclxuICAncm91bmQtYXJyb3ctdG9wLWxlZnQnOiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0yMyA0djZoLTZNMSAyMHYtNmg2TTMuNTEgOWE5IDkgMCAwIDEgMTQuODUtMy4zNkwyMyAxME0xIDE0bDQuNjQgNC4zNkE5IDkgMCAwIDAgMjAuNDkgMTVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbiAgJ2NoZWNrLWNpcmNsZSc6IGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiLz48cGF0aCBkPVwiTTggMTJsMyAzIDUtNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+YCxcclxuICAnaW5mby1jaXJjbGUnOiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTIuMDFcIiB5Mj1cIjhcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbiAgJ2FsZXJ0LWNpcmNsZSc6IGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbiAgJ2V4Y2xhbWF0aW9uLWNpcmNsZSc6IGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbiAgY3Jvc3M6IGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTE4IDZMNiAxOE02IDZsMTIgMTJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2ZuLWlucHV0JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtGb3Jtc01vZHVsZSwgQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBUcmFuc2xhdGVNb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mbi1pbnB1dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZm4taW5wdXQuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEZOSW5wdXQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBmaWVsZCA9IHt9IGFzIEZOSW5wdXRCYXNlO1xyXG4gIEBJbnB1dCgpIGhlbHBlckhhbmRsZT86IEZOSW5wdXRIZWxwZXI7XHJcbiAgQElucHV0KCkgdG9hc3RTZXJ2aWNlPzogRk5JbnB1dFRvYXN0O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0ZWRUb2FzdFNlcnZpY2UgPSBpbmplY3QoRk5fVE9BU1RfU0VSVklDRSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcclxuXHJcbiAgZ2V0IGVmZmVjdGl2ZVRvYXN0U2VydmljZSgpOiBGTklucHV0VG9hc3QgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMudG9hc3RTZXJ2aWNlIHx8IHRoaXMuaW5qZWN0ZWRUb2FzdFNlcnZpY2UgfHwgdW5kZWZpbmVkO1xyXG4gIH1cclxuICBASW5wdXQoKSBjdXJyZW5jeU1ldGEgPSBERUZBVUxUX0NVUlJFTkNZX01FVEE7XHJcbiAgQElucHV0KCkgZGVmYXVsdExvY2FsZSA9ICdlbi1VUyc7XHJcbiAgQElucHV0KCkgZm9ybSE6IEZvcm1Hcm91cDtcclxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGZpZWxkQmx1ciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcclxuICBoYXNGb2N1cyA9IHNpZ25hbChmYWxzZSk7XHJcbiAgQFZpZXdDaGlsZCgnZm5UZXh0YXJlYScpIHRleHRhcmVhRWxlbWVudCE6IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZHJlbignaWNvbkNvbnRhaW5lcicpIGljb25Db250YWluZXJzITogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcclxuXHJcbiAgLy8gSW50ZXJuYWwgVG9hc3QgU3RhdGVcclxuICB0b2FzdHMgPSBzaWduYWw8YW55W10+KFtdKTtcclxuXHJcbiAgLy8gUmVtb3ZlZCBIdHRwQ2xpZW50IGluamVjdGlvblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaXplTWFwOiBSZWNvcmQ8VHlwZUljb25TaXplTmFtZSwgVHlwZUljb25TaXplPiA9IHtcclxuICAgIGV4dHJhc21hbGw6IDEwLFxyXG4gICAgc21hbGw6IDE2LFxyXG4gICAgbWVkaXVtOiAyMCxcclxuICAgIGxhcmdlOiAyNCxcclxuICAgICd4LWxhcmdlJzogMzIsXHJcbiAgICB4eGxhcmdlOiA0OCxcclxuICB9O1xyXG5cclxuICBnZXRJY29uU2l6ZU5hbWUoc2l6ZTogbnVtYmVyKTogJ3NtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJyB8ICd4LWxhcmdlJyB7XHJcbiAgICBzd2l0Y2ggKHNpemUpIHtcclxuICAgICAgY2FzZSAxNjpcclxuICAgICAgICByZXR1cm4gJ3NtYWxsJztcclxuICAgICAgY2FzZSAyMDpcclxuICAgICAgICByZXR1cm4gJ21lZGl1bSc7XHJcbiAgICAgIGNhc2UgMjQ6XHJcbiAgICAgICAgcmV0dXJuICdsYXJnZSc7XHJcbiAgICAgIGNhc2UgMzI6XHJcbiAgICAgICAgcmV0dXJuICd4LWxhcmdlJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ21lZGl1bSc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaXNBbHBoYW51bWVyaWMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5maWVsZC5pc0FscGhhbnVtZXJpYyAhPT0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNFbWFpbEZpZWxkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGQudHlwZSA9PT0gJ2VtYWlsJyB8fCB0aGlzLmZpZWxkLm5hbWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2VtYWlsJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBhbHBoYW51bWVyaWNQYXR0ZXJuKCk6IFJlZ0V4cCB7XHJcbiAgICBpZiAodGhpcy5maWVsZC5pc0FkZHJlc3NMaW5lKSB7XHJcbiAgICAgIHJldHVybiAvW15BLVphLXowLTkgXFwtXyYoKSwvXS9nO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAvW15BLVphLXowLTkgXFwtXyYoKV0vZztcclxuICB9XHJcblxyXG4gIGlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICBjb250cm9sITogRm9ybUNvbnRyb2w7XHJcbiAgaXNWaXNpYmxlID0gc2lnbmFsKHRydWUpOyAvLyBUcmFjayB2aXNpYmlsaXR5IHN0YXRlXHJcbiAgaGVscGVyVGV4dCA9ICcnO1xyXG5cclxuICAvLyBVc2UgYSBjb3VudGVyLWJhc2VkIGFwcHJvYWNoIGZvciB1bmlxdWUgSURzIChzYWZlciB0aGFuIE1hdGgucmFuZG9tKCkpXHJcbiAgcHJpdmF0ZSBzdGF0aWMgaWRDb3VudGVyID0gMDtcclxuICB1bmlxdWVJZCA9IGBmbi1pbnB1dC0keysrRk5JbnB1dC5pZENvdW50ZXJ9YDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZpZWxkLmhpZGRlbikgcmV0dXJuO1xyXG4gICAgdGhpcy5oZWxwZXJUZXh0ID0gdGhpcy5maWVsZC5oZWxwZXJUZXh0ID8/ICcnO1xyXG4gICAgdGhpcy5pbml0Rm9ybUNvbnRyb2woKTtcclxuXHJcbiAgICBpZiAodGhpcy5maWVsZC52YWx1ZSkgdGhpcy5jb250cm9sLnNldFZhbHVlKHRoaXMuZmllbGQudmFsdWUpO1xyXG4gICAgdGhpcy5zZXR1cFZpc2liaWxpdHlDb25kaXRpb24oKTtcclxuICAgIHRoaXMuc2V0dXBGaWVsZE1lc3NhZ2VMaXN0ZW5lcigpO1xyXG4gICAgdGhpcy5zZXR1cFRvYXN0U3Vic2NyaXB0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vicy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ2ZpZWxkJ10gfHwgY2hhbmdlc1snZm9ybSddKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQWxsSWNvbnMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBGaWVsZE1lc3NhZ2VMaXN0ZW5lcigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jb250cm9sKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgdmFsJCA9IHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy5jb250cm9sLnZhbHVlKSk7XHJcbiAgICBjb25zdCBzdGF0dXMkID0gdGhpcy5jb250cm9sLnN0YXR1c0NoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy5jb250cm9sLnN0YXR1cykpO1xyXG5cclxuICAgIHRoaXMuc3Vicy5hZGQoXHJcbiAgICAgIG1lcmdlKHZhbCQsIHN0YXR1cyQpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0NEUiBkZXRlY3RDaGFuZ2VzIGZhaWxlZCBkdXJpbmcgZmllbGQgbWVzc2FnZSB1cGRhdGU6JywgZSk7XHJcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIEFjY2VzcyB0aGUgdGV4dGFyZWEgZWxlbWVudCBieSBWaWV3Q2hpbGQgb3IgbmF0aXZlIGVsZW1lbnQgcmVmZXJlbmNlXHJcbiAgICB0aGlzLmF1dG9SZXNpemVJbml0aWFsKCk7XHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSAndGV4dGFyZWEnICYmIHRoaXMuY29udHJvbD8udmFsdWUpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmF1dG9SZXNpemVJbml0aWFsKCksIDMwKTtcclxuICAgIH1cclxuICAgIC8vIEFwcGx5IGluaXRpYWwgZm9ybWF0dGluZyBhZnRlciB2aWV3IGlzIGluaXRpYWxpemVkXHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSAnbnVtYmVyJyAmJiB0aGlzLmZpZWxkLmlzQ3VycmVuY3kgJiYgdGhpcy5jb250cm9sPy52YWx1ZSkge1xyXG4gICAgICB0aGlzLmZvcm1hdEluaXRpYWxDdXJyZW5jeVZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldHVwSWNvbkNvbnRhaW5lcnNMaXN0ZW5lcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEljb25Db250YWluZXJzTGlzdGVuZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnMuYWRkKFxyXG4gICAgICB0aGlzLmljb25Db250YWluZXJzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUFsbEljb25zKCk7XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGVuZm9yY2VMb3dlcmNhc2UoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3Qgc3RhcnQgPSBpbnB1dC5zZWxlY3Rpb25TdGFydDtcclxuICAgIGNvbnN0IGVuZCA9IGlucHV0LnNlbGVjdGlvbkVuZDtcclxuXHJcbiAgICBpbnB1dC52YWx1ZSA9IGlucHV0LnZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAodGhpcy5jb250cm9sKSB7XHJcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShpbnB1dC52YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogaW5wdXQudmFsdWUgfSk7XHJcblxyXG4gICAgLy8gcmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gc28gdHlwaW5nIGlzIHNtb290aFxyXG4gICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgZW1haWwgaW5wdXQgLSBhbGxvd3Mgb25seSB2YWxpZCBlbWFpbCBjaGFyYWN0ZXJzIGFuZCBlbmZvcmNlcyBsb3dlcmNhc2UuXHJcbiAgICogQWxsb3dlZDogYS16LCAwLTksIC4gXyArIC0gQFxyXG4gICAqIFJ1bGVzOlxyXG4gICAqIC0gT25seSBvbmUgQCBhbGxvd2VkXHJcbiAgICogLSBObyBjb25zZWN1dGl2ZSBkb3RzICguLilcclxuICAgKiAtIEF1dG9tYXRpYyBsb3dlcmNhc2VcclxuICAgKi9cclxuICBoYW5kbGVFbWFpbElucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgfHwgMDtcclxuICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSBpbnB1dC52YWx1ZTtcclxuXHJcbiAgICAvLyAxLiBDb252ZXJ0IHRvIGxvd2VyY2FzZVxyXG4gICAgY29uc3QgbG93ZXJWYWx1ZSA9IG9yaWdpbmFsVmFsdWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAvLyAyLiBTcGxpdCBhdCB0aGUgZmlyc3QgQCB0byBoYW5kbGUgbG9jYWwgYW5kIGRvbWFpbiBwYXJ0cyBzZXBhcmF0ZWx5XHJcbiAgICBjb25zdCBwYXJ0cyA9IGxvd2VyVmFsdWUuc3BsaXQoJ0AnKTtcclxuICAgIGxldCBsb2NhbFBhcnQgPSBwYXJ0c1swXTtcclxuICAgIGxldCBkb21haW5QYXJ0ID0gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzLnNsaWNlKDEpLmpvaW4oJycpIDogbnVsbDtcclxuXHJcbiAgICAvLyAzLiBGaWx0ZXIgbG9jYWwgcGFydDogYS16LCAwLTksIC4sIF8sICssIC1cclxuICAgIC8vIFJ1bGU6IENhbm5vdCBzdGFydCB3aXRoIGEgZG90ICguKVxyXG4gICAgbG9jYWxQYXJ0ID0gbG9jYWxQYXJ0LnJlcGxhY2VBbGwoL1teYS16MC05Ll8rLV0vZywgJycpO1xyXG4gICAgd2hpbGUgKGxvY2FsUGFydC5zdGFydHNXaXRoKCcuJykpIHtcclxuICAgICAgbG9jYWxQYXJ0ID0gbG9jYWxQYXJ0LnN1YnN0cmluZygxKTtcclxuICAgIH1cclxuICAgIHdoaWxlIChsb2NhbFBhcnQuaW5jbHVkZXMoJy4uJykpIHtcclxuICAgICAgbG9jYWxQYXJ0ID0gbG9jYWxQYXJ0LnJlcGxhY2VBbGwoJy4uJywgJy4nKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA0LiBGaWx0ZXIgZG9tYWluIHBhcnQ6IGEteiwgMC05LCAuLCAtXHJcbiAgICAvLyBSdWxlOiBObyB1bmRlcnNjb3JlcyAoXyksIG5vIHBsdXMgc2lnbnMgKCspLCBjYW5ub3Qgc3RhcnQgd2l0aCBhIGh5cGhlbiAoLSlcclxuICAgIGxldCBmaWx0ZXJlZFZhbHVlID0gbG9jYWxQYXJ0O1xyXG4gICAgaWYgKGRvbWFpblBhcnQgIT09IG51bGwpIHtcclxuICAgICAgZG9tYWluUGFydCA9IGRvbWFpblBhcnQucmVwbGFjZUFsbCgvW15hLXowLTkuLV0vZywgJycpO1xyXG4gICAgICB3aGlsZSAoZG9tYWluUGFydC5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICBkb21haW5QYXJ0ID0gZG9tYWluUGFydC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgIH1cclxuICAgICAgd2hpbGUgKGRvbWFpblBhcnQuaW5jbHVkZXMoJy4uJykpIHtcclxuICAgICAgICBkb21haW5QYXJ0ID0gZG9tYWluUGFydC5yZXBsYWNlQWxsKCcuLicsICcuJyk7XHJcbiAgICAgIH1cclxuICAgICAgZmlsdGVyZWRWYWx1ZSArPSAnQCcgKyBkb21haW5QYXJ0O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcmlnaW5hbFZhbHVlICE9PSBmaWx0ZXJlZFZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IGNoYXJzUmVtb3ZlZEJlZm9yZUN1cnNvciA9IHRoaXMuY291bnRSZW1vdmVkQ2hhcnNCZWZvcmVDdXJzb3IoXHJcbiAgICAgICAgb3JpZ2luYWxWYWx1ZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgIGZpbHRlcmVkVmFsdWUsXHJcbiAgICAgICAgY3Vyc29yUG9zaXRpb24sXHJcbiAgICAgICk7XHJcbiAgICAgIGlucHV0LnZhbHVlID0gZmlsdGVyZWRWYWx1ZTtcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGZpbHRlcmVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gTWF0aC5tYXgoMCwgY3Vyc29yUG9zaXRpb24gLSBjaGFyc1JlbW92ZWRCZWZvcmVDdXJzb3IpO1xyXG4gICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShuZXdDdXJzb3JQb3MsIG5ld0N1cnNvclBvcyk7XHJcbiAgICB9IGVsc2UgaWYgKG9yaWdpbmFsVmFsdWUgIT09IGxvd2VyVmFsdWUpIHtcclxuICAgICAgLy8gSWYgb25seSBjYXNlIGNoYW5nZWQgKGUuZy4sIHR5cGVkIFVwcGVyY2FzZSlcclxuICAgICAgaW5wdXQudmFsdWUgPSBmaWx0ZXJlZFZhbHVlO1xyXG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoZmlsdGVyZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShjdXJzb3JQb3NpdGlvbiwgY3Vyc29yUG9zaXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpZWxkLnR5cGUgPT09ICdwYXNzd29yZCcgJiYgdGhpcy5maWVsZC5mZWVkYmFjaykge1xyXG4gICAgICB0aGlzLmNoZWNrUGFzc3dvcmRTdHJlbmd0aChmaWx0ZXJlZFZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiBmaWx0ZXJlZFZhbHVlIH0pO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIG9uRm9jdXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhhc0ZvY3VzLnNldCh0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0SW5pdGlhbEN1cnJlbmN5VmFsdWUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBudW1lcmljVmFsdWUgPSBOdW1iZXIodGhpcy5jb250cm9sLnZhbHVlKTtcclxuICAgIGlmICghTnVtYmVyLmlzTmFOKG51bWVyaWNWYWx1ZSkpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy51bmlxdWVJZCkgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICBpZiAoaW5wdXRFbGVtZW50KSB7XHJcbiAgICAgICAgICBpbnB1dEVsZW1lbnQudmFsdWUgPSB0aGlzLmZvcm1hdEN1cnJlbmN5V2l0aENvbW1hcyhudW1lcmljVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgNTApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdEZvcm1Db250cm9sKCkge1xyXG4gICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuZm9ybS5jb250cm9scz8uW3RoaXMuZmllbGQubmFtZV07XHJcbiAgICB0aGlzLmNvbnRyb2wgPSBjb250cm9sbGVyIGFzIEZvcm1Db250cm9sO1xyXG4gICAgaWYgKHRoaXMuZmllbGQudmFsdWUpIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh0aGlzLmZpZWxkLnZhbHVlKTtcclxuXHJcbiAgICBpZiAodGhpcy5jb250cm9sKSB7XHJcbiAgICAgIC8vIEhhbmRsZSBkaXNhYmxlZCBzdGF0ZVxyXG4gICAgICBpZiAodGhpcy5maWVsZC5kaXNhYmxlZCA/PyBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMuY29udHJvbD8uZGlzYWJsZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY29udHJvbD8uZW5hYmxlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGF1dG9SZXNpemVJbml0aWFsKCkge1xyXG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnRleHRhcmVhRWxlbWVudD8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmICh0ZXh0YXJlYSkge1xyXG4gICAgICAvLyBHZXQgdGhlIG51bWJlciBvZiByb3dzIChkZWZhdWx0IHRvIDIgaWYgbm90IHNwZWNpZmllZClcclxuICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZmllbGQucm93cyB8fCAxO1xyXG5cclxuICAgICAgLy8gQ2FsY3VsYXRlIGxpbmUgaGVpZ2h0IGZyb20gY29tcHV0ZWQgc3R5bGVzXHJcbiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnbG9iYWxUaGlzLmdldENvbXB1dGVkU3R5bGUodGV4dGFyZWEpO1xyXG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gTnVtYmVyLnBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5saW5lSGVpZ2h0KSB8fCAzMjsgLy8gRGVmYXVsdCB0byAyNHB4IGlmIG5vdCBzZXRcclxuXHJcbiAgICAgIC8vIENhbGN1bGF0ZSBtaW5pbXVtIGhlaWdodCBiYXNlZCBvbiByb3dzXHJcbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IHJvd3MgKiBsaW5lSGVpZ2h0O1xyXG5cclxuICAgICAgLy8gUmVzZXQgaGVpZ2h0IHRvIGF1dG8gdG8gZ2V0IGFjY3VyYXRlIHNjcm9sbEhlaWdodFxyXG4gICAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XHJcblxyXG4gICAgICAvLyBVc2UgdGhlIGxhcmdlciBvZiBzY3JvbGxIZWlnaHQgb3IgbWluSGVpZ2h0XHJcbiAgICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWF4KHRleHRhcmVhLnNjcm9sbEhlaWdodCwgbWluSGVpZ2h0KTtcclxuICAgICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gbmV3SGVpZ2h0ICsgJ3B4JztcclxuICAgICAgdGV4dGFyZWEuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVRleHRBcmVhKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50O1xyXG4gICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBlbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9IGVsZW1lbnQudmFsdWU7XHJcblxyXG4gICAgLy8gQXBwbHkgYWxwaGFudW1lcmljIGZpbHRlcmluZyBpZiBlbmFibGVkXHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSAndGV4dGFyZWEnICYmIHRoaXMuaXNBbHBoYW51bWVyaWMpIHtcclxuICAgICAgLy8gT25seSBhbGxvdyBjaGFyYWN0ZXJzIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBwYXR0ZXJuXHJcbiAgICAgIGNvbnN0IGFscGhhbnVtZXJpY1BhdHRlcm4gPSB0aGlzLmFscGhhbnVtZXJpY1BhdHRlcm47XHJcbiAgICAgIGxldCBmaWx0ZXJlZFZhbHVlID0gb3JpZ2luYWxWYWx1ZS5yZXBsYWNlQWxsKGFscGhhbnVtZXJpY1BhdHRlcm4sICcnKTtcclxuXHJcbiAgICAgIC8vIFByZXZlbnQgbGVhZGluZyBzcGFjZXNcclxuICAgICAgaWYgKGZpbHRlcmVkVmFsdWUuc3RhcnRzV2l0aCgnICcpKSB7XHJcbiAgICAgICAgZmlsdGVyZWRWYWx1ZSA9IGZpbHRlcmVkVmFsdWUudHJpbVN0YXJ0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFJlcGxhY2UgbXVsdGlwbGUgY29uc2VjdXRpdmUgc3BhY2VzIHdpdGggc2luZ2xlIHNwYWNlXHJcbiAgICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnJlcGxhY2VBbGwoL1xcc3syLH0vZywgJyAnKTtcclxuXHJcbiAgICAgIGlmIChvcmlnaW5hbFZhbHVlICE9PSBmaWx0ZXJlZFZhbHVlKSB7XHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1vdmVkIGJlZm9yZSB0aGUgY3Vyc29yIHBvc2l0aW9uXHJcbiAgICAgICAgY29uc3QgY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yID0gb3JpZ2luYWxWYWx1ZS5sZW5ndGggLSBmaWx0ZXJlZFZhbHVlLmxlbmd0aDtcclxuICAgICAgICBlbGVtZW50LnZhbHVlID0gZmlsdGVyZWRWYWx1ZTtcclxuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoZmlsdGVyZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIC8vIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uIC0gYWNjb3VudCBmb3IgcmVtb3ZlZCBjaGFyYWN0ZXJzXHJcbiAgICAgICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gTWF0aC5tYXgoMCwgKGN1cnNvclBvc2l0aW9uIHx8IDApIC0gY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yKTtcclxuICAgICAgICBlbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKG5ld0N1cnNvclBvcywgbmV3Q3Vyc29yUG9zKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaW5jcmVhc2UgaGVpZ2h0XHJcbiAgICAgIHRoaXMuYXV0b1Jlc2l6ZUluaXRpYWwoKTtcclxuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogZmlsdGVyZWRWYWx1ZSB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBmaWx0ZXJlZFZhbHVlID0gb3JpZ2luYWxWYWx1ZTtcclxuXHJcbiAgICAgIC8vIFN0cmljdCBmaWx0ZXJpbmcgaWYgIWlzQWxwaGFudW1lcmljXHJcbiAgICAgIGlmICghdGhpcy5pc0FscGhhbnVtZXJpYykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdpc0FscGhhbnVtZXJpYycsIHRoaXMuaXNBbHBoYW51bWVyaWMpO1xyXG5cclxuICAgICAgICBjb25zdCBhbGxvd2VkUGF0dGVybiA9IC9bXmEtekEtWjAtOVxccygpe31bXFxdOywuXCI9JytcXC0qLzw+ISZ8JV9AJD86XS9nO1xyXG4gICAgICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnJlcGxhY2VBbGwoYWxsb3dlZFBhdHRlcm4sICcnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUHJldmVudCBsZWFkaW5nIHNwYWNlc1xyXG4gICAgICBpZiAoZmlsdGVyZWRWYWx1ZS5zdGFydHNXaXRoKCcgJykpIHtcclxuICAgICAgICBmaWx0ZXJlZFZhbHVlID0gZmlsdGVyZWRWYWx1ZS50cmltU3RhcnQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmVwbGFjZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXMgd2l0aCBzaW5nbGUgc3BhY2VcclxuICAgICAgZmlsdGVyZWRWYWx1ZSA9IGZpbHRlcmVkVmFsdWUucmVwbGFjZUFsbCgvXFxzezIsfS9nLCAnICcpO1xyXG5cclxuICAgICAgaWYgKG9yaWdpbmFsVmFsdWUgIT09IGZpbHRlcmVkVmFsdWUpIHtcclxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbW92ZWQgYmVmb3JlIHRoZSBjdXJzb3IgcG9zaXRpb25cclxuICAgICAgICBjb25zdCBjaGFyc1JlbW92ZWRCZWZvcmVDdXJzb3IgPSBvcmlnaW5hbFZhbHVlLmxlbmd0aCAtIGZpbHRlcmVkVmFsdWUubGVuZ3RoO1xyXG4gICAgICAgIGVsZW1lbnQudmFsdWUgPSBmaWx0ZXJlZFZhbHVlO1xyXG4gICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShmaWx0ZXJlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgLy8gUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gLSBhY2NvdW50IGZvciByZW1vdmVkIGNoYXJhY3RlcnNcclxuICAgICAgICBjb25zdCBuZXdDdXJzb3JQb3MgPSBNYXRoLm1heCgwLCAoY3Vyc29yUG9zaXRpb24gfHwgMCkgLSBjaGFyc1JlbW92ZWRCZWZvcmVDdXJzb3IpO1xyXG4gICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UobmV3Q3Vyc29yUG9zLCBuZXdDdXJzb3JQb3MpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBpbmNyZWFzZSBoZWlnaHRcclxuICAgICAgdGhpcy5hdXRvUmVzaXplSW5pdGlhbCgpO1xyXG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiBmaWx0ZXJlZFZhbHVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVQYXNzd29yZFZpc2liaWxpdHkoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNob3dQYXNzd29yZCA9ICF0aGlzLnNob3dQYXNzd29yZDtcclxuICAgIHRoaXMudXBkYXRlQWxsSWNvbnMoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUlucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBjdXJzb3JQb3NpdGlvbiA9IHRhcmdldC5zZWxlY3Rpb25TdGFydDtcclxuICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSB0YXJnZXQudmFsdWU7XHJcblxyXG4gICAgbGV0IGZpbHRlcmVkVmFsdWUgPSBvcmlnaW5hbFZhbHVlO1xyXG5cclxuICAgIC8vIElGIE5PVCBhbHBoYW51bWVyaWMsIHVzZXIgd2FudHMgc3RyaWN0IGZpbHRlcmluZzpcclxuICAgIC8vIFwib25seSBhY2NlcHQgdGlocy4pIHt9IFtdIDsgLCAuIFwiICcgPSArIC0gKiAvIDwgPiAhICYgfCAlICZfKCApLS8uO0AhLCAkJSA6IGRvbnQgYWxsb3cgZW1vamlcIlxyXG4gICAgLy8gSW50ZXJwcmV0YXRpb246IEFsbG93IGFscGhhbnVtZXJpYyArIHNwZWNpZmllZCBzcGVjaWFsIGNoYXJzLiBCYW4gZW1vamlzLlxyXG4gICAgLy8gQWN0dWFsbHksIHRoZSB1c2VyIHNhaWQ6IFwiaWYgaXNBbHBoYW51bWVyaWMgZmFsc2Ugb25seSBhY2NlcHQuLi5cIlxyXG4gICAgLy8gU28gaWYgaXNBbHBoYW51bWVyaWMgaXMgVFJVRSwgd2UgdXNlIHRoZSBleGlzdGluZyBoYW5kbGVBbHBoYW51bWVyaWNJbnB1dCBsb2dpYyAob3Igc2ltaWxhcikuXHJcbiAgICAvLyBUaGUgY3VycmVudCBsb2dpYyBpbiBoYW5kbGVJbnB1dCBpcyBnZW5lcmljLlxyXG4gICAgLy8gVGhlIGV4aXN0aW5nIGNvZGUgaGFzIGEgc2VwYXJhdGUgYGhhbmRsZUFscGhhbnVtZXJpY0lucHV0YCBtZXRob2QgYnV0IGl0J3Mgbm90IGNhbGxlZCBoZXJlP1xyXG4gICAgLy8gV2FpdCwgdGhlIHRlbXBsYXRlIGxpa2VseSBjYWxscyBgaGFuZGxlQWxwaGFudW1lcmljSW5wdXRgIGlmIGBpc0FscGhhbnVtZXJpY2AgaXMgdHJ1ZSwgb3IgYGhhbmRsZUlucHV0YCBvdGhlcndpc2U/XHJcbiAgICAvLyBMZXQncyBjaGVjayB0aGUgdGVtcGxhdGUuXHJcbiAgICAvLyBCVVQgYXNzdW1pbmcgYGhhbmRsZUlucHV0YCBpcyB0aGUgZ2VuZXJpYyBoYW5kbGVyOlxyXG5cclxuICAgIGlmICghdGhpcy5pc0FscGhhbnVtZXJpYykge1xyXG4gICAgICAvLyBSZWdleCB0byBhbGxvdzogYS16LCBBLVosIDAtOSwgYW5kOiApIHt9IFtdIDsgLCAuIFwiICcgPSArIC0gKiAvIDwgPiAhICYgfCAlIF8gKCAtIEAgJCA/IDpcclxuICAgICAgLy8gTm90ZTogVXNlciBsaXN0OiApIHt9IFtdIDsgLCAuIFwiICcgPSArIC0gKiAvIDwgPiAhICYgfCAlICZfKCApLS8uO0AhLCAkJVxyXG4gICAgICAvLyBDb21iaW5lZCB1bmlxdWUgc3BlY2lhbCBjaGFyczogKSB7IH0gWyBdIDsgLCAuIFwiICcgPSArIC0gKiAvIDwgPiAhICYgfCAlIF8gKCBAICQgPyA6XHJcbiAgICAgIC8vIEFsc28gc3BhY2UgaXMgaW1wbGllZD8gdXN1YWxseSB5ZXMuXHJcbiAgICAgIC8vIEFuZCBOTyBFTU9KSVMuXHJcbiAgICAgIC8vIGVhc2llciB0byBqdXN0IHJlcGxhY2UgYW55dGhpbmcgTk9UIGluIHRoZSBhbGxvd2VkIHNldC5cclxuXHJcbiAgICAgIC8vIEFsbG93ZWQgY2hhcnMgcmVnZXggcGF0dGVybjpcclxuICAgICAgLy8gQS1aYS16MC05XHJcbiAgICAgIC8vIFNwYWNlOiBcXHNcclxuICAgICAgLy8gU3BlY2lhbDogKCl7fVtcXF07LC5cIj0nK1xcLSovPD4hJnwlX0AkPzpcclxuICAgICAgLy8gTm90ZTogLSBpbnNpZGUgW10gbmVlZHMgdG8gYmUgZXNjYXBlZCBvciBhdCBlbmQuIF0gbmVlZHMgZXNjYXBlLiBcXCBuZWVkcyBlc2NhcGU/IChub3QgaW4gbGlzdCkuXHJcbiAgICAgIC8vIFVzZXIgbGlzdCBoYXM6IGAuYCBgXCJgIGAnYCBgP2AgKHdhaXQsID8gbm90IGluIGxpc3Q/KVxyXG4gICAgICAvLyBVc2VyIGxpc3Q6IGApIHt9IFtdIDsgLCAuIFwiICcgPSArIC0gKiAvIDwgPiAhICYgfCAlICZfKCApLS8uO0AhLCAkJWBcclxuICAgICAgLy8gVW5pcXVlczogKSB7IH0gWyBdIDsgLCAuIFwiICcgPSArIC0gKiAvIDwgPiAhICYgfCAlIF8gKCBAICRcclxuICAgICAgLy8gKFRoZSBgJmAgaXMgcmVwZWF0ZWQsIGAuYCByZXBlYXRlZCwgYCxgIHJlcGVhdGVkIGV0Yy4pXHJcbiAgICAgIC8vIEkgd2lsbCBjcmVhdGUgYSByZWdleCB0aGF0IG1hdGNoZXMgYW55dGhpbmcgTk9UIGluIHRoaXMgbGlzdCBhbmQgcmVwbGFjZSB3aXRoIGVtcHR5IHN0cmluZy5cclxuXHJcbiAgICAgIC8vIFteYS16QS1aMC05XFxzKCl7fVtcXF07LC5cIj0nK1xcLSovPD4hJnwlX0AkXVxyXG4gICAgICAvLyBOb3RlOiBgKmAsIGArYCwgYD9gIGV0YyBuZWVkIGVzY2FwaW5nIGluIHJlZ2V4IGlmIG91dHNpZGUgW10sIGJ1dCBpbnNpZGUgW10gdGhleSBhcmUgbGl0ZXJhbHMgbW9zdGx5LlxyXG4gICAgICAvLyBgLWAgbmVlZHMgdG8gYmUgbGFzdCBvciBlc2NhcGVkLiBgXWAgbmVlZHMgZXNjYXBlLiBgXmAgbmVlZHMgZXNjYXBlIGlmIGZpcnN0PyBObywgaW52YWxpZCBoZXJlLlxyXG4gICAgICAvLyBMZXQncyB2ZXJpZnkgdmFsaWQgY2hhcnM6XHJcbiAgICAgIC8vIGEteiBBLVogMC05XHJcbiAgICAgIC8vIHNwYWNlXHJcbiAgICAgIC8vICkgeyB9IFsgXSA7ICwgLiBcIiAnID0gKyAtICogLyA8ID4gISAmIHwgJSBfICggQCAkIDpcclxuXHJcbiAgICAgIGNvbnN0IGFsbG93ZWRQYXR0ZXJuID0gL1teYS16QS1aMC05XFxzKCl7fVtcXF07LC5cIj0nK1xcLSovPD4hJnwlX0AkPzpdL2c7XHJcbiAgICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnJlcGxhY2VBbGwoYWxsb3dlZFBhdHRlcm4sICcnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBQcmV2ZW50IGxlYWRpbmcgc3BhY2VzXHJcbiAgICBpZiAoZmlsdGVyZWRWYWx1ZS5zdGFydHNXaXRoKCcgJykpIHtcclxuICAgICAgZmlsdGVyZWRWYWx1ZSA9IGZpbHRlcmVkVmFsdWUudHJpbVN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmVwbGFjZUFsbCBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXMgd2l0aCBzaW5nbGUgc3BhY2VcclxuICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnJlcGxhY2VBbGwoL1xcc3syLH0vZywgJyAnKTtcclxuXHJcbiAgICBpZiAob3JpZ2luYWxWYWx1ZSAhPT0gZmlsdGVyZWRWYWx1ZSkge1xyXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbW92ZWQgYmVmb3JlIHRoZSBjdXJzb3IgcG9zaXRpb25cclxuICAgICAgY29uc3QgY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yID0gb3JpZ2luYWxWYWx1ZS5sZW5ndGggLSBmaWx0ZXJlZFZhbHVlLmxlbmd0aDtcclxuICAgICAgdGFyZ2V0LnZhbHVlID0gZmlsdGVyZWRWYWx1ZTtcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGZpbHRlcmVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgLy8gUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gLSBhY2NvdW50IGZvciByZW1vdmVkIGNoYXJhY3RlcnNcclxuICAgICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gTWF0aC5tYXgoMCwgKGN1cnNvclBvc2l0aW9uIHx8IDApIC0gY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yKTtcclxuICAgICAgdGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKG5ld0N1cnNvclBvcywgbmV3Q3Vyc29yUG9zKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUcmFpbGluZyBzcGFjZXMgd2lsbCBiZSB0cmltbWVkIG9uIGJsdXIsIG5vdCBkdXJpbmcgaW5wdXRcclxuICAgIGlmICh0aGlzLmZpZWxkLnR5cGUgPT09ICdwYXNzd29yZCcgJiYgdGhpcy5maWVsZC5mZWVkYmFjaykge1xyXG4gICAgICB0aGlzLmNoZWNrUGFzc3dvcmRTdHJlbmd0aChmaWx0ZXJlZFZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiBmaWx0ZXJlZFZhbHVlIH0pO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBhbHBoYW51bWVyaWMgaW5wdXQgLSBhbGxvd3Mgb25seSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgc3BlY2lmaWMgc3BlY2lhbCBjaGFyYWN0ZXJzXHJcbiAgICogQWxsb3dlZDogQS1aLCBhLXosIDAtOSwgc3BhY2UsIGh5cGhlbiwgdW5kZXJzY29yZSwgYW1wZXJzYW5kLCBhbmQgcGFyZW50aGVzZXNcclxuICAgKiBBbHNvIHByZXZlbnRzIGxlYWRpbmcgc3BhY2VzIGFuZCBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXNcclxuICAgKi9cclxuICBoYW5kbGVBbHBoYW51bWVyaWNJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSB0YXJnZXQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gdGFyZ2V0LnZhbHVlO1xyXG5cclxuICAgIC8vIE9ubHkgYWxsb3cgY2hhcmFjdGVycyBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgcGF0dGVyblxyXG4gICAgY29uc3QgYWxwaGFudW1lcmljUGF0dGVybiA9IHRoaXMuYWxwaGFudW1lcmljUGF0dGVybjtcclxuICAgIGxldCBmaWx0ZXJlZFZhbHVlID0gb3JpZ2luYWxWYWx1ZS5yZXBsYWNlQWxsKGFscGhhbnVtZXJpY1BhdHRlcm4sICcnKTtcclxuXHJcbiAgICAvLyBQcmV2ZW50IGxlYWRpbmcgc3BhY2VzXHJcbiAgICBpZiAoZmlsdGVyZWRWYWx1ZS5zdGFydHNXaXRoKCcgJykpIHtcclxuICAgICAgZmlsdGVyZWRWYWx1ZSA9IGZpbHRlcmVkVmFsdWUudHJpbVN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVwbGFjZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXMgd2l0aCBzaW5nbGUgc3BhY2VcclxuICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnJlcGxhY2VBbGwoL1xcc3syLH0vZywgJyAnKTtcclxuXHJcbiAgICBpZiAob3JpZ2luYWxWYWx1ZSAhPT0gZmlsdGVyZWRWYWx1ZSkge1xyXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbW92ZWQgYmVmb3JlIHRoZSBjdXJzb3IgcG9zaXRpb25cclxuICAgICAgY29uc3QgY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yID0gb3JpZ2luYWxWYWx1ZS5sZW5ndGggLSBmaWx0ZXJlZFZhbHVlLmxlbmd0aDtcclxuICAgICAgdGFyZ2V0LnZhbHVlID0gZmlsdGVyZWRWYWx1ZTtcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGZpbHRlcmVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgLy8gUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gLSBhY2NvdW50IGZvciByZW1vdmVkIGNoYXJhY3RlcnNcclxuICAgICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gTWF0aC5tYXgoMCwgKGN1cnNvclBvc2l0aW9uIHx8IDApIC0gY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yKTtcclxuICAgICAgdGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKG5ld0N1cnNvclBvcywgbmV3Q3Vyc29yUG9zKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSAncGFzc3dvcmQnICYmIHRoaXMuZmllbGQuZmVlZGJhY2spIHtcclxuICAgICAgdGhpcy5jaGVja1Bhc3N3b3JkU3RyZW5ndGgoZmlsdGVyZWRWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogZmlsdGVyZWRWYWx1ZSB9KTtcclxuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVCbHVyKGU6IEV2ZW50LCBtYXhEZWNpbWFsczogbnVtYmVyID0gMik6IHZvaWQge1xyXG4gICAgdGhpcy5oYXNGb2N1cy5zZXQoZmFsc2UpO1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XHJcbiAgICBjb25zdCBjbGVhblZhbHVlU3RyaW5nID0gdGFyZ2V0LnZhbHVlO1xyXG5cclxuICAgIGlmICghY2xlYW5WYWx1ZVN0cmluZykge1xyXG4gICAgICB0aGlzLmZpZWxkQmx1ci5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogJycgfSk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERlbGVnYXRlIHRvIHR5cGUtc3BlY2lmaWMgaGFuZGxlcnNcclxuICAgIGlmICh0aGlzLmZpZWxkLnR5cGUgPT09ICd0ZXh0JyB8fCB0aGlzLmZpZWxkLnR5cGUgPT09ICd0ZXh0YXJlYScpIHtcclxuICAgICAgdGhpcy5oYW5kbGVUZXh0RmllbGRCbHVyKHRhcmdldCwgY2xlYW5WYWx1ZVN0cmluZyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmllbGQudHlwZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgdGhpcy5oYW5kbGVOdW1iZXJGaWVsZEJsdXIodGFyZ2V0LCBjbGVhblZhbHVlU3RyaW5nLCBtYXhEZWNpbWFscyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRW1pdCBmaW5hbCB2YWx1ZVxyXG4gICAgdGhpcy5maWVsZEJsdXIuZW1pdCh7XHJcbiAgICAgIG5hbWU6IHRoaXMuZmllbGQubmFtZSxcclxuICAgICAgdmFsdWU6IHRhcmdldC52YWx1ZSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGJsdXIgZm9yIHRleHQgYW5kIHRleHRhcmVhIGZpZWxkcyAtIHRyaW0gdHJhaWxpbmcgc3BhY2VzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVUZXh0RmllbGRCbHVyKFxyXG4gICAgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCxcclxuICAgIGNsZWFuVmFsdWVTdHJpbmc6IHN0cmluZyxcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IHRyaW1tZWQgPSBjbGVhblZhbHVlU3RyaW5nLnRyaW0oKTtcclxuICAgIGlmIChjbGVhblZhbHVlU3RyaW5nICE9PSB0cmltbWVkKSB7XHJcbiAgICAgIHRhcmdldC52YWx1ZSA9IHRyaW1tZWQ7XHJcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh0cmltbWVkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgYmx1ciBmb3IgbnVtYmVyIGZpZWxkcyAtIHZhbGlkYXRlIGFuZCBmb3JtYXRcclxuICAgKi9cclxuICBwcml2YXRlIGhhbmRsZU51bWJlckZpZWxkQmx1cihcclxuICAgIHRhcmdldDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQsXHJcbiAgICBjbGVhblZhbHVlU3RyaW5nOiBzdHJpbmcsXHJcbiAgICBtYXhEZWNpbWFsczogbnVtYmVyLFxyXG4gICk6IHZvaWQge1xyXG4gICAgLy8gUmVtb3ZlIGNvbW1hcyBmb3IgcGFyc2luZy92YWxpZGF0aW9uXHJcbiAgICBjb25zdCBudW1TdHJpbmcgPSBjbGVhblZhbHVlU3RyaW5nLnJlcGxhY2VBbGwoJywnLCAnJyk7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIG51bWJlciBmb3JtYXRcclxuICAgIGNvbnN0IGlzVmFsaWROdW1iZXJGb3JtYXQgPSAvXi0/XFxkKyhcXC5cXGQrKT8kLy50ZXN0KG51bVN0cmluZyk7XHJcblxyXG4gICAgLy8gSWYgbm90IGEgdmFsaWQgbnVtYmVyIGZvcm1hdCwgY2xlYXIgdGhlIGZpZWxkXHJcbiAgICBpZiAoIWlzVmFsaWROdW1iZXJGb3JtYXQpIHtcclxuICAgICAgdGFyZ2V0LnZhbHVlID0gJyc7XHJcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSgnJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3JtYXQgY3VycmVuY3kgZmllbGRzIG9yIHNldCByYXcgdmFsdWUgZm9yIG5vbi1jdXJyZW5jeVxyXG4gICAgaWYgKHRoaXMuZmllbGQudHlwZSA9PT0gJ251bWJlcicgJiYgdGhpcy5maWVsZC5pc0N1cnJlbmN5KSB7XHJcbiAgICAgIHRoaXMucHJvY2Vzc0N1cnJlbmN5VmFsdWUodGFyZ2V0LCBudW1TdHJpbmcsIG1heERlY2ltYWxzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIE5vbi1jdXJyZW5jeTogcHJlc2VydmUgdGhlIHJhdyBzdHJpbmcgdmFsdWVcclxuICAgICAgdGFyZ2V0LnZhbHVlID0gbnVtU3RyaW5nO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJvY2VzcyBjdXJyZW5jeSB2YWx1ZSAtIGhhbmRsZSBmb3JtYXR0aW5nIGFuZCBkZWNpbWFsIHBsYWNlc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcHJvY2Vzc0N1cnJlbmN5VmFsdWUoXHJcbiAgICB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50LFxyXG4gICAgbnVtU3RyaW5nOiBzdHJpbmcsXHJcbiAgICBtYXhEZWNpbWFsczogbnVtYmVyLFxyXG4gICk6IHZvaWQge1xyXG4gICAgLy8gSGFuZGxlIG5lZ2F0aXZlIHZhbHVlcyAtIGNvbnZlcnQgdG8gcG9zaXRpdmVcclxuICAgIGxldCBwcm9jZXNzZWRWYWx1ZSA9IG51bVN0cmluZy5zdGFydHNXaXRoKCctJykgPyBudW1TdHJpbmcuc3Vic3RyaW5nKDEpIDogbnVtU3RyaW5nO1xyXG5cclxuICAgIC8vIEhhbmRsZSBlZGdlIGNhc2Ugb2YgXCItMFwiIG9yIGp1c3QgXCItXCJcclxuICAgIGlmIChwcm9jZXNzZWRWYWx1ZSA9PT0gJycgfHwgcHJvY2Vzc2VkVmFsdWUgPT09ICcwJykge1xyXG4gICAgICBwcm9jZXNzZWRWYWx1ZSA9ICcwJztcclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3JtYXQgdGhlIHZhbHVlIHdpdGggcHJvcGVyIGRlY2ltYWwgcGxhY2VzXHJcbiAgICBjb25zdCBjbGVhblZhbHVlU3RyaW5nID0gdGhpcy5mb3JtYXREZWNpbWFsUGxhY2VzKHByb2Nlc3NlZFZhbHVlLCBtYXhEZWNpbWFscyk7XHJcblxyXG4gICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZvcm1hdEN1cnJlbmN5V2l0aENvbW1hcyhjbGVhblZhbHVlU3RyaW5nLCBtYXhEZWNpbWFscyk7XHJcblxyXG4gICAgLy8gVXBkYXRlIHRoZSBjb250cm9sIHZhbHVlIHdpdGggdGhlIG51bWVyaWMgc3RyaW5nIChub3QgZm9ybWF0dGVkKVxyXG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGNsZWFuVmFsdWVTdHJpbmcsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcbiAgICAvLyBUcmlnZ2VyIHZhbGlkYXRvcnMgYW5kIG1hcmsgYXMgdG91Y2hlZFxyXG4gICAgdGhpcy5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcblxyXG4gICAgLy8gU2V0IGRpc3BsYXkgdmFsdWUgd2l0aCBjb21tYXMgYWZ0ZXIgQW5ndWxhcidzIGZvcm0gY29udHJvbCB1cGRhdGVcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0YXJnZXQudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9ybWF0IGRlY2ltYWwgcGxhY2VzIC0gcGFkIG9yIHRydW5jYXRlIHRvIG1heERlY2ltYWxzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBmb3JtYXREZWNpbWFsUGxhY2VzKHZhbHVlOiBzdHJpbmcsIG1heERlY2ltYWxzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IFtpbnRQYXJ0LCBkZWNQYXJ0XSA9IHZhbHVlLmluY2x1ZGVzKCcuJykgPyB2YWx1ZS5zcGxpdCgnLicpIDogW3ZhbHVlLCAnJ107XHJcblxyXG4gICAgLy8gUGFkIG9yIHRydW5jYXRlIGRlY2ltYWwgcGFydCB0byBtYXhEZWNpbWFsc1xyXG4gICAgaWYgKGRlY1BhcnQubGVuZ3RoIDwgbWF4RGVjaW1hbHMpIHtcclxuICAgICAgZGVjUGFydCA9IGRlY1BhcnQucGFkRW5kKG1heERlY2ltYWxzLCAnMCcpO1xyXG4gICAgfSBlbHNlIGlmIChkZWNQYXJ0Lmxlbmd0aCA+IG1heERlY2ltYWxzKSB7XHJcbiAgICAgIGRlY1BhcnQgPSBkZWNQYXJ0LnNsaWNlKDAsIG1heERlY2ltYWxzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBCdWlsZCB0aGUgY2xlYW4gdmFsdWUgc3RyaW5nICh3aXRob3V0IGNvbW1hcylcclxuICAgIHJldHVybiBtYXhEZWNpbWFscyA+IDAgPyBgJHtpbnRQYXJ0fS4ke2RlY1BhcnR9YCA6IGludFBhcnQ7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVOdW1iZXJJbnB1dChldmVudDogRXZlbnQsIG1heERlY2ltYWxzOiBudW1iZXIgPSAyKTogdm9pZCB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSB0YXJnZXQudmFsdWU7XHJcbiAgICBjb25zdCBjdXJzb3JQb3NpdGlvbiA9IHRhcmdldC5zZWxlY3Rpb25TdGFydCA/PyAwO1xyXG5cclxuICAgIC8vIFN0ZXAgMTogRmlsdGVyIGFuZCBmb3JtYXQgdGhlIGlucHV0IHZhbHVlXHJcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmZpbHRlck51bWVyaWNJbnB1dCh0YXJnZXQudmFsdWUsIG1heERlY2ltYWxzKTtcclxuXHJcbiAgICAvLyBTdGVwIDI6IFVwZGF0ZSBjdXJzb3IgcG9zaXRpb24gaWYgdmFsdWUgY2hhbmdlZFxyXG4gICAgdGhpcy51cGRhdGVDdXJzb3JQb3NpdGlvbkFmdGVyRmlsdGVyKHRhcmdldCwgb3JpZ2luYWxWYWx1ZSwgdmFsdWUsIGN1cnNvclBvc2l0aW9uKTtcclxuXHJcbiAgICAvLyBTdGVwIDM6IFVwZGF0ZSBmb3JtIGNvbnRyb2wgYW5kIHZhbGlkYXRlXHJcbiAgICB0aGlzLnVwZGF0ZUZvcm1Db250cm9sVmFsdWUodmFsdWUsIG1heERlY2ltYWxzKTtcclxuXHJcbiAgICAvLyBTdGVwIDQ6IEVtaXQgY2hhbmdlc1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogdGFyZ2V0LnZhbHVlIH0pO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbHRlciBudW1lcmljIGlucHV0IHRvIG9ubHkgYWxsb3cgZGlnaXRzIGFuZCBkZWNpbWFsIHBvaW50XHJcbiAgICogRW5zdXJlcyBvbmx5IG9uZSBkZWNpbWFsIHBvaW50IGFuZCBlbmZvcmNlcyBtYXggZGVjaW1hbCBwbGFjZXNcclxuICAgKi9cclxuICBwcml2YXRlIGZpbHRlck51bWVyaWNJbnB1dCh2YWx1ZTogc3RyaW5nLCBtYXhEZWNpbWFsczogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIC8vIFJlbW92ZSBBTEwgbm9uLW51bWVyaWMgY2hhcmFjdGVycyBleGNlcHQgZGVjaW1hbCBwb2ludFxyXG4gICAgbGV0IGZpbHRlcmVkID0gdmFsdWUucmVwbGFjZUFsbCgvW14wLTkuXS9nLCAnJyk7XHJcblxyXG4gICAgLy8gRW5zdXJlIG9ubHkgb25lIGRlY2ltYWwgcG9pbnRcclxuICAgIGZpbHRlcmVkID0gdGhpcy5maWx0ZXJEZWNpbWFsUG9pbnRzKGZpbHRlcmVkKTtcclxuXHJcbiAgICAvLyBSZXN0cmljdCB0byBtYXhEZWNpbWFscyBkZWNpbWFsIHBsYWNlcyBpZiBkZWNpbWFsIGV4aXN0c1xyXG4gICAgZmlsdGVyZWQgPSB0aGlzLmVuZm9yY2VEZWNpbWFsTGltaXQoZmlsdGVyZWQsIG1heERlY2ltYWxzKTtcclxuXHJcbiAgICByZXR1cm4gZmlsdGVyZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbnN1cmUgb25seSBvbmUgZGVjaW1hbCBwb2ludCBleGlzdHMgaW4gdGhlIHZhbHVlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBmaWx0ZXJEZWNpbWFsUG9pbnRzKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zcGxpdCgnLicpO1xyXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+IDIpIHtcclxuICAgICAgcmV0dXJuIHBhcnRzWzBdICsgJy4nICsgcGFydHMuc2xpY2UoMSkuam9pbignJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbmZvcmNlIG1heGltdW0gZGVjaW1hbCBwbGFjZXMgbGltaXRcclxuICAgKi9cclxuICBwcml2YXRlIGVuZm9yY2VEZWNpbWFsTGltaXQodmFsdWU6IHN0cmluZywgbWF4RGVjaW1hbHM6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCcuJykpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IFtpbnRlZ2VyUGFydCwgZGVjaW1hbFBhcnRdID0gdmFsdWUuc3BsaXQoJy4nKTtcclxuICAgIGlmIChkZWNpbWFsUGFydCAmJiBkZWNpbWFsUGFydC5sZW5ndGggPiBtYXhEZWNpbWFscykge1xyXG4gICAgICByZXR1cm4gaW50ZWdlclBhcnQgKyAnLicgKyBkZWNpbWFsUGFydC5zbGljZSgwLCBtYXhEZWNpbWFscyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIGZpbHRlcmluZyBpbnB1dFxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlQ3Vyc29yUG9zaXRpb25BZnRlckZpbHRlcihcclxuICAgIHRhcmdldDogSFRNTElucHV0RWxlbWVudCxcclxuICAgIG9yaWdpbmFsVmFsdWU6IHN0cmluZyxcclxuICAgIG5ld1ZhbHVlOiBzdHJpbmcsXHJcbiAgICBjdXJzb3JQb3NpdGlvbjogbnVtYmVyLFxyXG4gICk6IHZvaWQge1xyXG4gICAgaWYgKHRhcmdldC52YWx1ZSA9PT0gbmV3VmFsdWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNoYXJzUmVtb3ZlZEJlZm9yZUN1cnNvciA9IHRoaXMuY291bnRSZW1vdmVkQ2hhcnNCZWZvcmVDdXJzb3IoXHJcbiAgICAgIG9yaWdpbmFsVmFsdWUsXHJcbiAgICAgIG5ld1ZhbHVlLFxyXG4gICAgICBjdXJzb3JQb3NpdGlvbixcclxuICAgICk7XHJcbiAgICB0YXJnZXQudmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gTWF0aC5tYXgoMCwgY3Vyc29yUG9zaXRpb24gLSBjaGFyc1JlbW92ZWRCZWZvcmVDdXJzb3IpO1xyXG4gICAgdGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKG5ld1Bvc2l0aW9uLCBuZXdQb3NpdGlvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgZm9ybSBjb250cm9sIHZhbHVlIGFuZCBwZXJmb3JtIHZhbGlkYXRpb25cclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZUZvcm1Db250cm9sVmFsdWUodmFsdWU6IHN0cmluZywgbWF4RGVjaW1hbHM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLnZhbGlkYXRlSW50ZWdlckRpZ2l0cyh2YWx1ZSwgbWF4RGVjaW1hbHMpO1xyXG4gICAgdGhpcy5jbGVhck51bWVyaWNFcnJvcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ291bnQgaG93IG1hbnkgY2hhcmFjdGVycyB3ZXJlIHJlbW92ZWQgYmVmb3JlIHRoZSBjdXJzb3IgcG9zaXRpb25cclxuICAgKiBUaGlzIGhlbHBzIG1haW50YWluIGNvcnJlY3QgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIGZpbHRlcmluZyBpbnB1dFxyXG4gICAqL1xyXG4gIHByaXZhdGUgY291bnRSZW1vdmVkQ2hhcnNCZWZvcmVDdXJzb3IoXHJcbiAgICBvcmlnaW5hbDogc3RyaW5nLFxyXG4gICAgZmlsdGVyZWQ6IHN0cmluZyxcclxuICAgIGN1cnNvclBvczogbnVtYmVyLFxyXG4gICk6IG51bWJlciB7XHJcbiAgICBsZXQgcmVtb3ZlZENvdW50ID0gMDtcclxuICAgIGxldCBmaWx0ZXJlZEluZGV4ID0gMDtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnNvclBvcyAmJiBpIDwgb3JpZ2luYWwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGZpbHRlcmVkSW5kZXggPCBmaWx0ZXJlZC5sZW5ndGggJiYgb3JpZ2luYWxbaV0gPT09IGZpbHRlcmVkW2ZpbHRlcmVkSW5kZXhdKSB7XHJcbiAgICAgICAgZmlsdGVyZWRJbmRleCsrO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlbW92ZWRDb3VudCsrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlbW92ZWRDb3VudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBwYXN0ZSBldmVudCBmb3IgbnVtYmVyIGlucHV0c1xyXG4gICAqIFByZXZlbnRzIHBhc3Rpbmcgb2Ygbm9uLW51bWVyaWMgY2hhcmFjdGVycyBhbmQgZW5mb3JjZXMgZGlnaXQgbGltaXRzXHJcbiAgICovXHJcbiAgaGFuZGxlTnVtYmVyUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50LCBtYXhEZWNpbWFsczogbnVtYmVyID0gMik6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3QgcGFzdGVkVGV4dCA9IGV2ZW50LmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQnKSB8fCAnJztcclxuICAgIGNvbnN0IGlzQ3VycmVuY3kgPSB0aGlzLmZpZWxkLnR5cGUgPT09ICdudW1iZXInICYmICEhdGhpcy5maWVsZC5pc0N1cnJlbmN5O1xyXG5cclxuICAgIGNvbnN0IGZpbHRlcmVkVGV4dCA9IGlzQ3VycmVuY3lcclxuICAgICAgPyB0aGlzLmdldEZpbHRlcmVkQ3VycmVuY3lQYXN0ZWRUZXh0KHBhc3RlZFRleHQpXHJcbiAgICAgIDogdGhpcy5nZXRGaWx0ZXJlZEludGVnZXJQYXN0ZWRUZXh0KHBhc3RlZFRleHQpO1xyXG4gICAgY29uc3QgZmluYWxWYWx1ZSA9IHRoaXMuYnVpbGRGaW5hbFBhc3RlVmFsdWUodGFyZ2V0LCBmaWx0ZXJlZFRleHQsIGlzQ3VycmVuY3ksIG1heERlY2ltYWxzKTtcclxuXHJcbiAgICAvLyBVcGRhdGUgdGhlIGlucHV0XHJcbiAgICB0YXJnZXQudmFsdWUgPSBmaW5hbFZhbHVlO1xyXG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGZpbmFsVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcbiAgICB0aGlzLnZhbGlkYXRlSW50ZWdlckRpZ2l0cyhmaW5hbFZhbHVlLCBtYXhEZWNpbWFscyk7XHJcbiAgICB0aGlzLmNsZWFyTnVtZXJpY0Vycm9yKCk7XHJcblxyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogZmluYWxWYWx1ZSB9KTtcclxuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcblxyXG4gICAgdGhpcy5zZXRDdXJzb3JBZnRlclBhc3RlKHRhcmdldCwgZmlsdGVyZWRUZXh0LCBmaW5hbFZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbHRlciBwYXN0ZWQgdGV4dCBmb3IgY3VycmVuY3kgaW5wdXQgKGFsbG93cyBkaWdpdHMgYW5kIGRlY2ltYWwgcG9pbnQpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJlZEN1cnJlbmN5UGFzdGVkVGV4dChwYXN0ZWRUZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHBhc3RlZFRleHQucmVwbGFjZUFsbCgvW14wLTkuXS9nLCAnJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaWx0ZXIgcGFzdGVkIHRleHQgZm9yIGludGVnZXItb25seSBpbnB1dCAoYWxsb3dzIGRpZ2l0cyBvbmx5KVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyZWRJbnRlZ2VyUGFzdGVkVGV4dChwYXN0ZWRUZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHBhc3RlZFRleHQucmVwbGFjZUFsbCgvXFxEL2csICcnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkIGZpbmFsIHZhbHVlIGFmdGVyIHBhc3RlIG9wZXJhdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgYnVpbGRGaW5hbFBhc3RlVmFsdWUoXHJcbiAgICB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQsXHJcbiAgICBmaWx0ZXJlZFRleHQ6IHN0cmluZyxcclxuICAgIGlzQ3VycmVuY3k6IGJvb2xlYW4sXHJcbiAgICBtYXhEZWNpbWFsczogbnVtYmVyLFxyXG4gICk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0YXJnZXQudmFsdWU7XHJcbiAgICBjb25zdCBzdGFydCA9IHRhcmdldC5zZWxlY3Rpb25TdGFydDtcclxuICAgIGNvbnN0IGVuZCA9IHRhcmdldC5zZWxlY3Rpb25FbmQ7XHJcblxyXG4gICAgbGV0IGZpbmFsVmFsdWU6IHN0cmluZztcclxuXHJcbiAgICAvLyBJZiBzZWxlY3Rpb24gQVBJIGlzIG5vdCBzdXBwb3J0ZWQgb3Igbm8gc2VsZWN0aW9uLCByZXBsYWNlIGVudGlyZSBjb250ZW50XHJcbiAgICBpZiAoc3RhcnQgPT09IG51bGwgfHwgZW5kID09PSBudWxsIHx8IChzdGFydCA9PT0gMCAmJiBlbmQgPT09IDApKSB7XHJcbiAgICAgIGZpbmFsVmFsdWUgPSBmaWx0ZXJlZFRleHQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmaW5hbFZhbHVlID0gY3VycmVudFZhbHVlLnN1YnN0cmluZygwLCBzdGFydCkgKyBmaWx0ZXJlZFRleHQgKyBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGVuZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzQ3VycmVuY3kgPyB0aGlzLmFwcGx5RGVjaW1hbFJlc3RyaWN0aW9ucyhmaW5hbFZhbHVlLCBtYXhEZWNpbWFscykgOiBmaW5hbFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgZGVjaW1hbCByZXN0cmljdGlvbnMgZm9yIGN1cnJlbmN5IGZpZWxkc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgYXBwbHlEZWNpbWFsUmVzdHJpY3Rpb25zKHZhbHVlOiBzdHJpbmcsIG1heERlY2ltYWxzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlc3VsdCA9IHZhbHVlO1xyXG5cclxuICAgIC8vIEVuc3VyZSBvbmx5IG9uZSBkZWNpbWFsIHBvaW50XHJcbiAgICBjb25zdCBwYXJ0cyA9IHJlc3VsdC5zcGxpdCgnLicpO1xyXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+IDIpIHtcclxuICAgICAgcmVzdWx0ID0gcGFydHNbMF0gKyAnLicgKyBwYXJ0cy5zbGljZSgxKS5qb2luKCcnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXN0cmljdCB0byBtYXhEZWNpbWFscyBkZWNpbWFsIHBsYWNlc1xyXG4gICAgaWYgKHJlc3VsdC5pbmNsdWRlcygnLicpKSB7XHJcbiAgICAgIGNvbnN0IFtpbnRQYXJ0LCBkZWNQYXJ0XSA9IHJlc3VsdC5zcGxpdCgnLicpO1xyXG4gICAgICBpZiAoZGVjUGFydC5sZW5ndGggPiBtYXhEZWNpbWFscykge1xyXG4gICAgICAgIHJlc3VsdCA9IGludFBhcnQgKyAnLicgKyBkZWNQYXJ0LnNsaWNlKDAsIG1heERlY2ltYWxzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZSBpbnRlZ2VyIGRpZ2l0IGxpbWl0IGFuZCBzZXQvY2xlYXIgZXJyb3JzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB2YWxpZGF0ZUludGVnZXJEaWdpdHModmFsdWU6IHN0cmluZywgbWF4RGVjaW1hbHM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZmllbGQudHlwZSAhPT0gJ251bWJlcicgfHwgIXRoaXMuZmllbGQubWF4SW50ZWdlckRpZ2l0cykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWF4SW50RGlnaXRzID0gdGhpcy5maWVsZC5tYXhJbnRlZ2VyRGlnaXRzID8/IDE1O1xyXG4gICAgY29uc3QgW2ludFBhcnRdID0gdmFsdWUuaW5jbHVkZXMoJy4nKSA/IHZhbHVlLnNwbGl0KCcuJykgOiBbdmFsdWVdO1xyXG5cclxuICAgIGlmIChpbnRQYXJ0Lmxlbmd0aCA+IG1heEludERpZ2l0cykge1xyXG4gICAgICB0aGlzLnNldE1heEludGVnZXJEaWdpdHNFcnJvcihpbnRQYXJ0Lmxlbmd0aCwgbWF4SW50RGlnaXRzLCBtYXhEZWNpbWFscyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNsZWFyTWF4SW50ZWdlckRpZ2l0c0Vycm9yKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgbWF4IGludGVnZXIgZGlnaXRzIGVycm9yXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRNYXhJbnRlZ2VyRGlnaXRzRXJyb3IoYWN0dWFsOiBudW1iZXIsIG1heDogbnVtYmVyLCBtYXhEZWNpbWFsczogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBjdXJyZW50RXJyb3JzID0gdGhpcy5jb250cm9sLmVycm9ycyB8fCB7fTtcclxuICAgIHRoaXMuY29udHJvbC5zZXRFcnJvcnMoe1xyXG4gICAgICAuLi5jdXJyZW50RXJyb3JzLFxyXG4gICAgICBtYXhJbnRlZ2VyRGlnaXRzOiB7XHJcbiAgICAgICAgYWN0dWFsLFxyXG4gICAgICAgIG1heCxcclxuICAgICAgICBtYXhEZWNpbWFscyxcclxuICAgICAgICBtZXNzYWdlOiBgUGxlYXNlIHNob3J0ZW4geW91ciBpbnB1dCB0byAke21heH0gd2hvbGUgZGlnaXRzIGFuZCAke21heERlY2ltYWxzfSBkZWNpbWFsIG9yIGZld2VyLmAsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIG1heCBpbnRlZ2VyIGRpZ2l0cyBlcnJvciBpZiBwcmVzZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbGVhck1heEludGVnZXJEaWdpdHNFcnJvcigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jb250cm9sLmhhc0Vycm9yKCdtYXhJbnRlZ2VyRGlnaXRzJykpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGVycm9ycyA9IHsgLi4udGhpcy5jb250cm9sLmVycm9ycyB9O1xyXG4gICAgZGVsZXRlIGVycm9yc1snbWF4SW50ZWdlckRpZ2l0cyddO1xyXG4gICAgdGhpcy5jb250cm9sLnNldEVycm9ycyhPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA/IGVycm9ycyA6IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgbnVtZXJpYyBlcnJvciBpZiBwcmVzZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbGVhck51bWVyaWNFcnJvcigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jb250cm9sLmhhc0Vycm9yKCdudW1lcmljJykpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGVycm9ycyA9IHsgLi4udGhpcy5jb250cm9sLmVycm9ycyB9O1xyXG4gICAgZGVsZXRlIGVycm9yc1snbnVtZXJpYyddO1xyXG4gICAgdGhpcy5jb250cm9sLnNldEVycm9ycyhPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA/IGVycm9ycyA6IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGN1cnNvciBwb3NpdGlvbiBhZnRlciBwYXN0ZSBvcGVyYXRpb25cclxuICAgKi9cclxuICBwcml2YXRlIHNldEN1cnNvckFmdGVyUGFzdGUoXHJcbiAgICB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQsXHJcbiAgICBmaWx0ZXJlZFRleHQ6IHN0cmluZyxcclxuICAgIGZpbmFsVmFsdWU6IHN0cmluZyxcclxuICApOiB2b2lkIHtcclxuICAgIC8vIElucHV0IHR5cGU9XCJudW1iZXJcIiBkb2VzIG5vdCBzdXBwb3J0IHNlbGVjdGlvbiBBUElzXHJcbiAgICBpZiAodGFyZ2V0LnR5cGUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdGFydCA9IHRhcmdldC5zZWxlY3Rpb25TdGFydCB8fCAwO1xyXG4gICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gc3RhcnQgKyBmaWx0ZXJlZFRleHQubGVuZ3RoO1xyXG4gICAgY29uc3QgYWN0dWFsUG9zID0gTWF0aC5taW4obmV3Q3Vyc29yUG9zLCBmaW5hbFZhbHVlLmxlbmd0aCk7XHJcbiAgICB0YXJnZXQuc2V0U2VsZWN0aW9uUmFuZ2UoYWN0dWFsUG9zLCBhY3R1YWxQb3MpO1xyXG4gIH1cclxuXHJcbiAgLy8gRm9ybWF0IG51bWJlciB3aXRoIGNvbW1hIHNlcGFyYXRvcnNcclxuICAvLyBVc2VzIHN0cmluZy1iYXNlZCBmb3JtYXR0aW5nIGZvciBsYXJnZSBudW1iZXJzIHRvIHByZXNlcnZlIHByZWNpc2lvblxyXG4gIGZvcm1hdEN1cnJlbmN5V2l0aENvbW1hcyh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nLCBtYXhEZWNpbWFsczogbnVtYmVyID0gMik6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlICE9PSAnbnVtYmVyJyB8fCAhdGhpcy5maWVsZC5pc0N1cnJlbmN5KSByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcclxuXHJcbiAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgLy8gUmV0dXJuIG9yaWdpbmFsIHZhbHVlIGZvciBlbXB0eSBvciBpbnZhbGlkIGlucHV0c1xyXG4gICAgaWYgKCFzdHJWYWx1ZSB8fCBzdHJWYWx1ZSA9PT0gJ05hTicpIHJldHVybiAnJztcclxuXHJcbiAgICAvLyBVc2Ugc3RyaW5nLWJhc2VkIGZvcm1hdHRpbmcgdG8gcHJlc2VydmUgcHJlY2lzaW9uIGZvciBsYXJnZSBudW1iZXJzXHJcbiAgICBjb25zdCBbaW50ZWdlclBhcnQsIGRlY2ltYWxQYXJ0XSA9IHN0clZhbHVlLmluY2x1ZGVzKCcuJylcclxuICAgICAgPyBzdHJWYWx1ZS5zcGxpdCgnLicpXHJcbiAgICAgIDogW3N0clZhbHVlLCAnJ107XHJcblxyXG4gICAgLy8gRm9ybWF0IGludGVnZXIgcGFydCB3aXRoIGNvbW1hIHNlcGFyYXRvcnMgKGV2ZXJ5IDMgZGlnaXRzIGZyb20gcmlnaHQpXHJcbiAgICAvLyBVc2luZyBpdGVyYXRpdmUgYXBwcm9hY2ggaW5zdGVhZCBvZiByZWdleCB0byBhdm9pZCBSZURvUyBjb25jZXJuc1xyXG4gICAgbGV0IGZvcm1hdHRlZEludGVnZXIgPSAnJztcclxuICAgIGNvbnN0IGxlbiA9IGludGVnZXJQYXJ0Lmxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgaWYgKGkgPiAwICYmIChsZW4gLSBpKSAlIDMgPT09IDApIHtcclxuICAgICAgICBmb3JtYXR0ZWRJbnRlZ2VyICs9ICcsJztcclxuICAgICAgfVxyXG4gICAgICBmb3JtYXR0ZWRJbnRlZ2VyICs9IGludGVnZXJQYXJ0W2ldO1xyXG4gICAgfVxyXG4gICAgLy8gRm9ybWF0IGRlY2ltYWwgcGFydCAocGFkIG9yIHRydW5jYXRlIHRvIG1heERlY2ltYWxzKVxyXG4gICAgbGV0IGZvcm1hdHRlZERlY2ltYWwgPSBkZWNpbWFsUGFydCB8fCAnJztcclxuICAgIGlmIChmb3JtYXR0ZWREZWNpbWFsLmxlbmd0aCA8IG1heERlY2ltYWxzKSB7XHJcbiAgICAgIGZvcm1hdHRlZERlY2ltYWwgPSBmb3JtYXR0ZWREZWNpbWFsLnBhZEVuZChtYXhEZWNpbWFscywgJzAnKTtcclxuICAgIH0gZWxzZSBpZiAoZm9ybWF0dGVkRGVjaW1hbC5sZW5ndGggPiBtYXhEZWNpbWFscykge1xyXG4gICAgICBmb3JtYXR0ZWREZWNpbWFsID0gZm9ybWF0dGVkRGVjaW1hbC5zbGljZSgwLCBtYXhEZWNpbWFscyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1heERlY2ltYWxzID4gMCA/IGAke2Zvcm1hdHRlZEludGVnZXJ9LiR7Zm9ybWF0dGVkRGVjaW1hbH1gIDogZm9ybWF0dGVkSW50ZWdlcjtcclxuICB9XHJcblxyXG4gIGhhbmRsZU51bWJlcktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGlzQ3VycmVuY3k6IGJvb2xlYW4pIHtcclxuICAgIGlmIChpc0N1cnJlbmN5KSByZXR1cm47XHJcblxyXG4gICAgLy8gQWxsb3c6IEJhY2tzcGFjZSwgRGVsZXRlLCBUYWIsIEFycm93IGtleXNcclxuICAgIGlmIChbJ0JhY2tzcGFjZScsICdEZWxldGUnLCAnVGFiJywgJ0Fycm93TGVmdCcsICdBcnJvd1JpZ2h0J10uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWxsb3cgY2xpcGJvYXJkIG9wZXJhdGlvbnMgKEN0cmwrViwgQ3RybCtDLCBDdHJsK1gsIENtZCtWLCBDbWQrQywgQ21kK1gpXHJcbiAgICAvLyBhbmQgc2VsZWN0aW9uIChDdHJsK0EsIENtZCtBKVxyXG4gICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQmxvY2sgZXZlcnl0aGluZyB0aGF0IGlzIG5vdCAwLTlcclxuICAgIGlmICghL15cXGQkLy50ZXN0KGV2ZW50LmtleSkpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEdldCBsb2NhbGUgZnJvbSBjdXJyZW5jeSBjb2RlIHVzaW5nIGN1cnJlbmN5TWV0YVxyXG4gIGdldExvY2FsZUZyb21DdXJyZW5jeShjdXJyZW5jeUNvZGU/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY3VycmVuY3lPYmogPSB0aGlzLmN1cnJlbmN5TWV0YS5maW5kKFxyXG4gICAgICAoYzogeyBjb2RlOiBzdHJpbmc7IGxvY2FsZTogc3RyaW5nIH0pID0+IGMuY29kZSA9PT0gY3VycmVuY3lDb2RlLFxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gY3VycmVuY3lPYmo/LmxvY2FsZSB8fCB0aGlzLmRlZmF1bHRMb2NhbGU7XHJcbiAgfVxyXG5cclxuICBzaG93UGFzc3dvcmQgPSBmYWxzZTtcclxuICBwYXNzd29yZFN0cmVuZ3RoTGFiZWwgPSAnJztcclxuICBzdHJlbmd0aENsYXNzID0gJyc7XHJcbiAgcGFzc3dvcmRTdHJlbmd0aFBlcmNlbnQgPSAwO1xyXG4gIGlzUGFzc3dvcmRGb2N1c2VkID0gZmFsc2U7XHJcbiAgb25QYXNzd29yZEZvY3VzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5oYXNGb2N1cy5zZXQodHJ1ZSk7XHJcbiAgICB0aGlzLmlzUGFzc3dvcmRGb2N1c2VkID0gdHJ1ZTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG9uUGFzc3dvcmRCbHVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc1Bhc3N3b3JkRm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUGFzc3dvcmRCbHVyKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmhhbmRsZUJsdXIoZSk7IC8vIE9yaWdpbmFsIGJsdXIgZnVuY3Rpb25hbGl0eSAoc2V0cyBoYXNGb2N1cyB0byBmYWxzZSlcclxuICAgIHRoaXMub25QYXNzd29yZEJsdXIoKTsgLy8gSGlkZSBwYXNzd29yZCBmZWVkYmFja1xyXG4gIH1cclxuXHJcbiAgY2hlY2tQYXNzd29yZFN0cmVuZ3RoKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmICghdmFsdWUgfHwgdGhpcy5maWVsZC50eXBlICE9PSAncGFzc3dvcmQnKSB7XHJcbiAgICAgIHRoaXMucGFzc3dvcmRTdHJlbmd0aExhYmVsID0gJyc7XHJcbiAgICAgIHRoaXMuc3RyZW5ndGhDbGFzcyA9ICcnO1xyXG4gICAgICB0aGlzLnBhc3N3b3JkU3RyZW5ndGhQZXJjZW50ID0gMDtcclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBzY29yZSA9IDA7XHJcbiAgICBpZiAodmFsdWUubGVuZ3RoID49IDgpIHNjb3JlKys7XHJcbiAgICBpZiAoL1tBLVpdLy50ZXN0KHZhbHVlKSkgc2NvcmUrKztcclxuICAgIGlmICgvXFxkLy50ZXN0KHZhbHVlKSkgc2NvcmUrKztcclxuICAgIGlmICgvW1xcV19dLy50ZXN0KHZhbHVlKSkgc2NvcmUrKztcclxuXHJcbiAgICBpZiAoc2NvcmUgPD0gMSkge1xyXG4gICAgICB0aGlzLnBhc3N3b3JkU3RyZW5ndGhMYWJlbCA9IHRoaXMuZmllbGQud2Vha0xhYmVsIHx8ICdXZWFrJztcclxuICAgICAgdGhpcy5zdHJlbmd0aENsYXNzID0gJ3RleHQtW3ZhcigtLVJIQi1SZWQtMTAwKV0nO1xyXG4gICAgICB0aGlzLnBhc3N3b3JkU3RyZW5ndGhQZXJjZW50ID0gMjU7XHJcbiAgICB9IGVsc2UgaWYgKHNjb3JlID09PSAyIHx8IHNjb3JlID09PSAzKSB7XHJcbiAgICAgIHRoaXMucGFzc3dvcmRTdHJlbmd0aExhYmVsID0gdGhpcy5maWVsZC5tZWRpdW1MYWJlbCB8fCAnTWVkaXVtJztcclxuICAgICAgdGhpcy5zdHJlbmd0aENsYXNzID0gJ3RleHQtW3ZhcigtLU9yYW5nZS0xMDApXSc7XHJcbiAgICAgIHRoaXMucGFzc3dvcmRTdHJlbmd0aFBlcmNlbnQgPSBzY29yZSA9PT0gMiA/IDUwIDogNzU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBhc3N3b3JkU3RyZW5ndGhMYWJlbCA9IHRoaXMuZmllbGQuc3Ryb25nTGFiZWwgfHwgJ1N0cm9uZyc7XHJcbiAgICAgIHRoaXMuc3RyZW5ndGhDbGFzcyA9ICd0ZXh0LVt2YXIoLS1HcmVlbi0xMDApXSc7XHJcbiAgICAgIHRoaXMucGFzc3dvcmRTdHJlbmd0aFBlcmNlbnQgPSAxMDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbmNyZW1lbnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlICE9PSAnbnVtYmVyJykgcmV0dXJuO1xyXG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuZmllbGQuc3RlcCB8fCAxO1xyXG4gICAgY29uc3QgY3VycmVudCA9IE51bWJlcih0aGlzLmNvbnRyb2wudmFsdWUpIHx8IDA7XHJcbiAgICBsZXQgbmV4dFZhbHVlID0gY3VycmVudCArIHN0ZXA7XHJcblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmZpZWxkLm1heCA9PT0gJ251bWJlcicpIHtcclxuICAgICAgbmV4dFZhbHVlID0gTWF0aC5taW4obmV4dFZhbHVlLCB0aGlzLmZpZWxkLm1heCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKG5leHRWYWx1ZSk7XHJcbiAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogbmV4dFZhbHVlIH0pO1xyXG5cclxuICAgIC8vIFVwZGF0ZSBkaXNwbGF5IHZhbHVlIGZvciBjdXJyZW5jeSBpbnB1dHNcclxuICAgIGlmICh0aGlzLmZpZWxkLmlzQ3VycmVuY3kpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy51bmlxdWVJZCkgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICBpZiAoaW5wdXRFbGVtZW50KSB7XHJcbiAgICAgICAgICBpbnB1dEVsZW1lbnQudmFsdWUgPSB0aGlzLmZvcm1hdEN1cnJlbmN5V2l0aENvbW1hcyhuZXh0VmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkZWNyZW1lbnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlICE9PSAnbnVtYmVyJykgcmV0dXJuO1xyXG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuZmllbGQuc3RlcCB8fCAxO1xyXG4gICAgY29uc3QgY3VycmVudCA9IE51bWJlcih0aGlzLmNvbnRyb2wudmFsdWUpIHx8IDA7XHJcbiAgICBsZXQgbmV4dFZhbHVlID0gY3VycmVudCAtIHN0ZXA7XHJcblxyXG4gICAgLy8gRW5zdXJlIG1pbmltdW0gdmFsdWUgaXMgMCAobm8gbmVnYXRpdmUgdmFsdWVzKVxyXG4gICAgY29uc3QgbWluVmFsdWUgPSBNYXRoLm1heCh0aGlzLmZpZWxkLm1pbiB8fCAwLCAwKTtcclxuICAgIG5leHRWYWx1ZSA9IE1hdGgubWF4KG5leHRWYWx1ZSwgbWluVmFsdWUpO1xyXG5cclxuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShuZXh0VmFsdWUpO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHRoaXMuZmllbGQubmFtZSwgdmFsdWU6IG5leHRWYWx1ZSB9KTtcclxuXHJcbiAgICAvLyBVcGRhdGUgZGlzcGxheSB2YWx1ZSBmb3IgY3VycmVuY3kgaW5wdXRzXHJcbiAgICBpZiAodGhpcy5maWVsZC5pc0N1cnJlbmN5KSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudW5pcXVlSWQpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKGlucHV0RWxlbWVudCkge1xyXG4gICAgICAgICAgaW5wdXRFbGVtZW50LnZhbHVlID0gdGhpcy5mb3JtYXRDdXJyZW5jeVdpdGhDb21tYXMobmV4dFZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29weVRleHQoZTogRXZlbnQpOiB2b2lkIHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAoIXRoaXMuY29udHJvbC52YWx1ZSkgcmV0dXJuO1xyXG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGhpcy5jb250cm9sLnZhbHVlKS50aGVuKCgpID0+IHtcclxuICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuZWZmZWN0aXZlVG9hc3RTZXJ2aWNlO1xyXG4gICAgICBpZiAoc2VydmljZSkge1xyXG4gICAgICAgIC8vIFBvc2l0aW9uIHNldCB0byB0b3AgYXMgcmVxdWVzdGVkXHJcbiAgICAgICAgc2VydmljZS5zdWNjZXNzKCdDb3BpZWQgdG8gY2xpcGJvYXJkJywgJ1N1Y2Nlc3MnLCAyMDAwKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcmVmaXhDbGljayhlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZmllbGQucHJlZml4Py5vbkNsaWNrKSB7XHJcbiAgICAgIHRoaXMuZmllbGQucHJlZml4Lm9uQ2xpY2soZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdWZmaXhDbGljayhlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZmllbGQuc3VmZml4Py5vbkNsaWNrKSB7XHJcbiAgICAgIHRoaXMuZmllbGQuc3VmZml4Lm9uQ2xpY2soZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdXAgdmlzaWJpbGl0eSBjb25kaXRpb24gbGlzdGVuZXJcclxuICAgKiBXYXRjaGVzIHRoZSBkZXBlbmRlbnQgZmllbGQgYW5kIHNob3dzL2hpZGVzIHRoaXMgZmllbGQgYmFzZWQgb24gY29uZGl0aW9uc1xyXG4gICAqL1xyXG4gIHNldHVwVmlzaWJpbGl0eUNvbmRpdGlvbigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5maWVsZC52aXNpYmlsaXR5Q29uZGl0aW9uIHx8ICF0aGlzLmZvcm0pIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB7IGRlcGVuZHNPbiB9ID0gdGhpcy5maWVsZC52aXNpYmlsaXR5Q29uZGl0aW9uO1xyXG4gICAgY29uc3QgZGVwZW5kZW50Q29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZGVwZW5kc09uKTtcclxuXHJcbiAgICBpZiAoIWRlcGVuZGVudENvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEluaXRpYWwgdmlzaWJpbGl0eSBjaGVja1xyXG4gICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KGRlcGVuZGVudENvbnRyb2wudmFsdWUpO1xyXG5cclxuICAgIC8vIFN1YnNjcmliZSB0byB2YWx1ZSBjaGFuZ2VzXHJcbiAgICBkZXBlbmRlbnRDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSh2YWx1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBmaWVsZCB2aXNpYmlsaXR5IGJhc2VkIG9uIGRlcGVuZGVudCBmaWVsZCB2YWx1ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJpbGl0eShkZXBlbmRlbnRWYWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZmllbGQudmlzaWJpbGl0eUNvbmRpdGlvbikgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHsgc2hvd1doZW4sIGhpZGVXaGVuIH0gPSB0aGlzLmZpZWxkLnZpc2liaWxpdHlDb25kaXRpb247XHJcbiAgICBsZXQgc2hvdWxkQmVWaXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgLy8gQ2hlY2sgc2hvd1doZW4gY29uZGl0aW9uXHJcbiAgICBpZiAoc2hvd1doZW4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzaG93V2hlbikpIHtcclxuICAgICAgICBzaG91bGRCZVZpc2libGUgPSBzaG93V2hlbi5pbmNsdWRlcyhkZXBlbmRlbnRWYWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2hvdWxkQmVWaXNpYmxlID0gZGVwZW5kZW50VmFsdWUgPT09IHNob3dXaGVuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaGlkZVdoZW4gY29uZGl0aW9uIChvdmVycmlkZXMgc2hvd1doZW4pXHJcbiAgICBpZiAoaGlkZVdoZW4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBjb25zdCBzaG91bGRIaWRlID0gQXJyYXkuaXNBcnJheShoaWRlV2hlbilcclxuICAgICAgICA/IGhpZGVXaGVuLmluY2x1ZGVzKGRlcGVuZGVudFZhbHVlKVxyXG4gICAgICAgIDogZGVwZW5kZW50VmFsdWUgPT09IGhpZGVXaGVuO1xyXG5cclxuICAgICAgaWYgKHNob3VsZEhpZGUpIHtcclxuICAgICAgICBzaG91bGRCZVZpc2libGUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSB2aXNpYmlsaXR5XHJcbiAgICB0aGlzLmlzVmlzaWJsZS5zZXQoc2hvdWxkQmVWaXNpYmxlKTtcclxuXHJcbiAgICAvLyBPbmx5IGNsZWFyIHZhbHVlIHdoZW4gaGlkaW5nIGlmIHRoZXJlJ3Mgbm8gaW5pdGlhbCB2YWx1ZVxyXG4gICAgLy8gVGhpcyBwcmVzZXJ2ZXMgZGF0YSB3aGVuIGVkaXRpbmcgZXhpc3RpbmcgcmVjb3Jkc1xyXG4gICAgaWYgKCFzaG91bGRCZVZpc2libGUgJiYgdGhpcy5jb250cm9sICYmICF0aGlzLmNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmNvbnRyb2wubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICAgIHRoaXMuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cFRvYXN0U3Vic2NyaXB0aW9uKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VydmljZSA9IHRoaXMuZWZmZWN0aXZlVG9hc3RTZXJ2aWNlO1xyXG4gICAgaWYgKHNlcnZpY2UpIHtcclxuICAgICAgdGhpcy5zdWJzLmFkZChcclxuICAgICAgICBzZXJ2aWNlLnRvYXN0cyQuc3Vic2NyaWJlKCh0b2FzdHM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0cy5zZXQodG9hc3RzKTtcclxuICAgICAgICAgIC8vIFdhaXQgZm9yIERPTSB0byB1cGRhdGUgdGhlbiByZW5kZXIgdG9hc3QgaWNvbnNcclxuICAgICAgICAgIHRoaXMudXBkYXRlQWxsSWNvbnMoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZVRvYXN0KGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZWZmZWN0aXZlVG9hc3RTZXJ2aWNlPy5yZW1vdmUoaWQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VHJhbnNsYXRlZE1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmhlbHBlckhhbmRsZSAmJiB0eXBlb2YgdGhpcy5oZWxwZXJIYW5kbGUudHJhbnNsYXRlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmhlbHBlckhhbmRsZS50cmFuc2xhdGUobWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWVzc2FnZTtcclxuICB9XHJcblxyXG4gIGdldFRvYXN0SWNvbk5hbWUodG9hc3Q6IGFueSk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKHRvYXN0LnR5cGUpIHtcclxuICAgICAgY2FzZSAnc3VjY2Vzcyc6XHJcbiAgICAgICAgcmV0dXJuICdjaGVjay1jaXJjbGUnO1xyXG4gICAgICBjYXNlICd3YXJuJzpcclxuICAgICAgY2FzZSAnaW5mbyc6XHJcbiAgICAgICAgcmV0dXJuICdpbmZvLWNpcmNsZSc7XHJcbiAgICAgIGNhc2UgJ2Vycm9yJzpcclxuICAgICAgICByZXR1cm4gJ2V4Y2xhbWF0aW9uLWNpcmNsZSc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICdpbmZvLWNpcmNsZSc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93Rm9ybUZpZWxkTWVzc2FnZShjb250cm9sOiBhbnksIGhlbHBlclRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaGVscGVySGFuZGxlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmhlbHBlckhhbmRsZS5zaG93Rm9ybUZpZWxkTWVzc2FnZShjb250cm9sLCBoZWxwZXJUZXh0KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGlzRXJyb3IgPSBjb250cm9sPy50b3VjaGVkICYmICEhY29udHJvbD8uZXJyb3JzO1xyXG4gICAgY29uc3QgaXNIZWxwZXIgPSAhaXNFcnJvciAmJiBCb29sZWFuKGhlbHBlclRleHQgPz8gJycpO1xyXG4gICAgcmV0dXJuIGlzRXJyb3IgfHwgaXNIZWxwZXI7XHJcbiAgfVxyXG5cclxuICBnZXRUcmFuc2xhdGVkTGFiZWwobGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWxhYmVsKSByZXR1cm4gJyc7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBsYWJlbFN0ciA9IGxhYmVsLnRvU3RyaW5nKCk7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgbGFiZWxTdHJcclxuICAgICAgICAgIC5zcGxpdCgnOjonKVxyXG4gICAgICAgICAgLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpXHJcbiAgICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiAhIXBhcnQpXHJcbiAgICAgICAgICAubWFwKChwYXJ0KSA9PiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChwYXJ0KSlcclxuICAgICAgICAgIC5qb2luKCcgJykgKyB0aGlzLmdldEVuZFN5bWJvbChsYWJlbFN0cilcclxuICAgICAgKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdUcmFuc2xhdGlvbiBmYWlsZWQgaW4gZ2V0VHJhbnNsYXRlZExhYmVsOicsIGxhYmVsLCBlKTtcclxuICAgICAgcmV0dXJuIGxhYmVsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RW5kU3ltYm9sKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGxhYmVsLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ3JlcXVpcmVkJykgJiYgbGFiZWwudG9TdHJpbmcoKS5pbmNsdWRlcygnRk5GaWVsZE1lc3NhZ2UnKVxyXG4gICAgICA/ICcuJ1xyXG4gICAgICA6ICcnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tIElDT04gTE9HSUMgLS0tXHJcbiAgcHJpdmF0ZSB1cGRhdGVBbGxJY29ucygpOiB2b2lkIHtcclxuICAgIC8vIFdlJ2xsIGNhbGwgdGhpcyBhZnRlciBWaWV3SW5pdCBvciB3aGVuIGlucHV0cyBjaGFuZ2VcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmljb25Db250YWluZXJzPy5mb3JFYWNoKChjb250YWluZXIpID0+IHtcclxuICAgICAgICBjb25zdCBkcyA9IGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmRhdGFzZXQ7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IGRzWydpY29uTmFtZSddO1xyXG4gICAgICAgIGNvbnN0IHZhcmlhbnQgPSAoZHNbJ2ljb25WYXJpYW50J10gYXMgVHlwZUljb25WYXJpYW50KSB8fCAnTGluZSc7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IChkc1snaWNvblNpemUnXSB8fCAnbWVkaXVtJykgYXMgVHlwZUljb25TaXplTmFtZTtcclxuICAgICAgICBjb25zdCBjb2xvciA9IGRzWydpY29uQ29sb3InXTtcclxuICAgICAgICBjb25zdCBkaXNhYmxlZCA9IGRzWydpY29uRGlzYWJsZWQnXSA9PT0gJ3RydWUnO1xyXG5cclxuICAgICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgICAgdGhpcy5sb2FkSWNvblRvQ29udGFpbmVyKGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LCBuYW1lLCB2YXJpYW50LCBzaXplLCBjb2xvciwgZGlzYWJsZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZEljb25Ub0NvbnRhaW5lcihcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICB2YXJpYW50OiBUeXBlSWNvblZhcmlhbnQsXHJcbiAgICBzaXplTmFtZTogVHlwZUljb25TaXplTmFtZSxcclxuICAgIGNvbG9yPzogc3RyaW5nIHwgbnVsbCxcclxuICAgIGRpc2FibGVkPzogYm9vbGVhbixcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemVNYXBbc2l6ZU5hbWVdO1xyXG5cclxuICAgIC8vIDEuIENoZWNrIGlmIHJhdyBTVkcgc3RyaW5nIGlzIHByb3ZpZGVkXHJcbiAgICBjb25zdCB0cmltbWVkTmFtZSA9IG5hbWUudHJpbSgpO1xyXG4gICAgaWYgKHRyaW1tZWROYW1lLnN0YXJ0c1dpdGgoJzxzdmcnKSkge1xyXG4gICAgICB0aGlzLnJlbmRlclN2Z1RvQ29udGFpbmVyKGNvbnRhaW5lciwgdHJpbW1lZE5hbWUsIGNvbG9yLCBzaXplLCAnY3VzdG9tJywgZGlzYWJsZWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMWIuIENoZWNrIGlmIGl0J3MganVzdCByYXcgU1ZHIGlubmVyIGNvbnRlbnQgKGxpa2UgYDxwYXRoIC4uLj5gKVxyXG4gICAgaWYgKFxyXG4gICAgICB0cmltbWVkTmFtZS5zdGFydHNXaXRoKCc8cGF0aCcpIHx8XHJcbiAgICAgIHRyaW1tZWROYW1lLnN0YXJ0c1dpdGgoJzxnJykgfHxcclxuICAgICAgdHJpbW1lZE5hbWUuc3RhcnRzV2l0aCgnPGNpcmNsZScpIHx8XHJcbiAgICAgIHRyaW1tZWROYW1lLnN0YXJ0c1dpdGgoJzxyZWN0JykgfHxcclxuICAgICAgdHJpbW1lZE5hbWUuc3RhcnRzV2l0aCgnPHBvbHlnb24nKVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHdyYXBwZWRTdmcgPSBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4ke3RyaW1tZWROYW1lfTwvc3ZnPmA7XHJcbiAgICAgIHRoaXMucmVuZGVyU3ZnVG9Db250YWluZXIoY29udGFpbmVyLCB3cmFwcGVkU3ZnLCBjb2xvciwgc2l6ZSwgJ2N1c3RvbScsIGRpc2FibGVkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDIuIENoZWNrIGJ1aWx0LWluIGljb25zIHJlZ2lzdHJ5XHJcbiAgICAvLyBTdHJpcCBwb3NzaWJsZSAtLXNpemUgc3VmZml4IGlmIGl0IHdhcyBwYXNzZWQgYnkgbWlzdGFrZSBmcm9tIG9sZCBsb2dpY1xyXG4gICAgY29uc3QgYmFzZU5hbWUgPSB0cmltbWVkTmFtZS5zcGxpdCgnLS0nKVswXS50cmltKCk7XHJcbiAgICBpZiAoQ09SRV9JQ09OU1tiYXNlTmFtZV0pIHtcclxuICAgICAgdGhpcy5yZW5kZXJTdmdUb0NvbnRhaW5lcihjb250YWluZXIsIENPUkVfSUNPTlNbYmFzZU5hbWVdLCBjb2xvciwgc2l6ZSwgYmFzZU5hbWUsIGRpc2FibGVkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE5vIGZhbGxiYWNrIHRvIEhUVFBcclxuICAgIGNvbnNvbGUud2FybihgW2ZuLWlucHV0XSBJY29uIFwiJHtuYW1lfVwiIG5vdCBmb3VuZCBpbiBjb3JlIHJlZ2lzdHJ5IGFuZCBubyByYXcgU1ZHIHByb3ZpZGVkLmApO1xyXG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJTdmdUb0NvbnRhaW5lcihcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICByYXc6IHN0cmluZyxcclxuICAgIGNvbG9yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgc2l6ZTogbnVtYmVyLFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgZGlzYWJsZWQ/OiBib29sZWFuLFxyXG4gICk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJhdywgJ2ltYWdlL3N2Zyt4bWwnKTtcclxuICAgICAgY29uc3Qgc3ZnID0gZG9jLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpIGFzIHVua25vd24gYXMgU1ZHU1ZHRWxlbWVudDtcclxuXHJcbiAgICAgIGlmICghc3ZnKSB7XHJcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gU1ZHIE5vcm1hbGl6YXRpb24gbG9naWNcclxuICAgICAgZm9yIChjb25zdCBzIG9mIHN2Zy5xdWVyeVNlbGVjdG9yQWxsKCdzdHlsZScpKSBzLnJlbW92ZSgpO1xyXG5cclxuICAgICAgaWYgKGNvbG9yKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBlbCBvZiBzdmcucXVlcnlTZWxlY3RvckFsbDxTVkdFbGVtZW50PignKicpKSB7XHJcbiAgICAgICAgICBjb25zdCBzdHlsZSA9IGVsLmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcclxuICAgICAgICAgIGlmIChzdHlsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBjbGVhbmVkID0gc3R5bGVcclxuICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvZmlsbFxccyo6XFxzKlteO10rOz8vZ2ksICcnKVxyXG4gICAgICAgICAgICAgIC5yZXBsYWNlQWxsKC9zdHJva2VcXHMqOlxccypbXjtdKzs/L2dpLCAnJyk7XHJcbiAgICAgICAgICAgIGlmIChjbGVhbmVkKSBlbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgY2xlYW5lZCk7XHJcbiAgICAgICAgICAgIGVsc2UgZWwucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGZpbGwgPSBlbC5nZXRBdHRyaWJ1dGUoJ2ZpbGwnKTtcclxuICAgICAgICAgIGlmIChmaWxsICYmIGZpbGwgIT09ICdub25lJyAmJiAhZmlsbC5zdGFydHNXaXRoKCd1cmwoJykpIHtcclxuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdmaWxsJywgJ2N1cnJlbnRDb2xvcicpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IHN0cm9rZSA9IGVsLmdldEF0dHJpYnV0ZSgnc3Ryb2tlJyk7XHJcbiAgICAgICAgICBpZiAoc3Ryb2tlICYmIHN0cm9rZSAhPT0gJ25vbmUnICYmICFzdHJva2Uuc3RhcnRzV2l0aCgndXJsKCcpKSB7XHJcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgJ2N1cnJlbnRDb2xvcicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgc3ZnLnJlbW92ZUF0dHJpYnV0ZSgnd2lkdGgnKTtcclxuICAgICAgc3ZnLnJlbW92ZUF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XHJcbiAgICAgIGlmICghc3ZnLmdldEF0dHJpYnV0ZSgndmlld0JveCcpKSB7XHJcbiAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgndmlld0JveCcsIGAwIDAgJHtzaXplfSAke3NpemV9YCk7XHJcbiAgICAgIH1cclxuICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWlkWU1pZCBtZWV0Jyk7XHJcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2ZvY3VzYWJsZScsICdmYWxzZScpO1xyXG4gICAgICBzdmcuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XHJcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzEwMCUnKTtcclxuICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJzEwMCUnKTtcclxuXHJcbiAgICAgIGNvbnN0IHN0eWxlID0gYDtkaXNwbGF5OmJsb2NrO21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJTtgO1xyXG4gICAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHlsZScsIChzdmcuZ2V0QXR0cmlidXRlKCdzdHlsZScpIHx8ICcnKSArIHN0eWxlKTtcclxuXHJcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcclxuICAgICAgaWYgKGNvbG9yKSB7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLmNvbG9yID0gY29sb3I7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGRpc2FibGVkKSB7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLm9wYWNpdHkgPSAnMC41JztcclxuICAgICAgICBjb250YWluZXIuc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb250YWluZXIuc3R5bGUub3BhY2l0eSA9ICcxJztcclxuICAgICAgICBjb250YWluZXIuc3R5bGUuY3Vyc29yID0gJyc7XHJcbiAgICAgIH1cclxuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHN2Zyk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtmbi1pbnB1dF0gRXJyb3IgcGFyc2luZyBTVkcgZm9yIGljb24gXCIke25hbWV9XCI6YCwgZXJyb3IpO1xyXG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBSZW1vdmVkIGdldEljb25QYXRoIGFzIEhUVFAgbG9hZGluZyBpcyBkaXNhYmxlZFxyXG5cclxuICAvLyAtLS0gTUVTU0FHRSBMT0dJQyAtLS1cclxuICBnZXRGaWVsZE1lc3NhZ2UoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5jb250cm9sKSByZXR1cm4gdGhpcy5maWVsZD8uaGVscGVyVGV4dCB8fCAnJztcclxuXHJcbiAgICBpZiAodGhpcy5jb250cm9sLnRvdWNoZWQgJiYgdGhpcy5jb250cm9sLmVycm9ycykge1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmNvbnRyb2wuZXJyb3JzKSkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yVmFsdWUgPSB0aGlzLmNvbnRyb2wuZXJyb3JzW2tleV07XHJcbiAgICAgICAgaWYgKGVycm9yVmFsdWUgJiYgdHlwZW9mIGVycm9yVmFsdWUgPT09ICdvYmplY3QnICYmIGVycm9yVmFsdWUubWVzc2FnZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGVycm9yVmFsdWUubWVzc2FnZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZmllbGQ/LmVycm9ycz8uW2tleV0pIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmZpZWxkLmVycm9yc1trZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIHRoaXMuZmllbGQ/LmVycm9ycz8uWydkZWZhdWx0J10gfHxcclxuICAgICAgICAnUGxlYXNlIGVudGVyICcgKyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmZpZWxkPy5sYWJlbClcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5maWVsZD8uaGVscGVyVGV4dCB8fCAnJztcclxuICB9XHJcblxyXG4gIGdldCBpc0Vycm9yKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhKHRoaXMuY29udHJvbD8udG91Y2hlZCAmJiB0aGlzLmNvbnRyb2w/LmVycm9ycyk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNTdWNjZXNzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhKHRoaXMuY29udHJvbD8udmFsaWQgJiYgdGhpcy5jb250cm9sPy50b3VjaGVkKTtcclxuICB9XHJcbn1cclxuIiwiQGlmIChmaWVsZC5uYW1lICYmIGlzVmlzaWJsZSgpICYmICFmaWVsZC5oaWRkZW4pIHtcclxuICA8ZGl2IGNsYXNzPVwiZm4taW5wdXQtY29udGFpbmVyXCI+XHJcbiAgICBAaWYgKGZpZWxkLnR5cGUhICE9PSAnaGlkZGVuJykge1xyXG4gICAgICA8bGFiZWxcclxuICAgICAgICBbZm9yXT1cInVuaXF1ZUlkXCJcclxuICAgICAgICBjbGFzcz1cImZuLWxhYmVsXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICBjb2xvcjogZmllbGQuY29sb3IgfHwgJyMwMzE4MmInLFxyXG4gICAgICAgICAgJ2ZvbnQtc2l6ZSc6IGZpZWxkLmxhYmVsU2l6ZSB8fCAnJyxcclxuICAgICAgICB9XCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGdldFRyYW5zbGF0ZWRMYWJlbChmaWVsZC5sYWJlbCkgfX1cclxuICAgICAgICBAaWYgKCFmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZU9wdGlvbmFsKSB7XHJcbiAgICAgICAgICA8c3Bhbj4mbmJzcDsoT3B0aW9uYWwpPC9zcGFuPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9sYWJlbD5cclxuICAgIH1cclxuXHJcbiAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICBAc3dpdGNoIChmaWVsZC50eXBlKSB7XHJcbiAgICAgICAgPCEtLSBUZXh0YXJlYSBGaWVsZCAtLT5cclxuICAgICAgICBAY2FzZSAoJ3RleHRhcmVhJykge1xyXG4gICAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICAgICNmblRleHRhcmVhXHJcbiAgICAgICAgICAgIHN0eWxlPVwicmVzaXplOiBub25lXCJcclxuICAgICAgICAgICAgW25hbWVdPVwiZmllbGQubmFtZVwiXHJcbiAgICAgICAgICAgIFtpZF09XCJ1bmlxdWVJZFwiXHJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5kaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgIFtyb3dzXT1cImZpZWxkLnJvd3MgfHwgMVwiXHJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJmaWVsZC5yZWFkT25seSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcclxuICAgICAgICAgICAgKGlucHV0KT1cImhhbmRsZVRleHRBcmVhKCRldmVudClcIlxyXG4gICAgICAgICAgICAoYmx1cik9XCJoYW5kbGVCbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZuLWlucHV0LWZpZWxkXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgIGRpc2FibGVkOiBjb250cm9sLmRpc2FibGVkIHx8IGZpZWxkLnJlYWRPbmx5LFxyXG4gICAgICAgICAgICAgIGVycm9yOiBjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5lcnJvcnMsXHJcbiAgICAgICAgICAgICAgc3VjY2VzczogZmllbGRbJ2hhc1N1Y2Nlc3NCb3JkZXInXSAmJiBjb250cm9sLnZhbGlkICYmICFjb250cm9sLmVycm9ycyxcclxuICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICBjb2xvcjogZmllbGQudmFsdWVDb2xvciB8fCAnaW5oZXJpdCcsXHJcbiAgICAgICAgICAgICAgJ2ZvbnQtc2l6ZSc6IGZpZWxkLnZhbHVlU2l6ZSB8fCAnJyxcclxuICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxyXG4gICAgICAgICAgPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8IS0tIFBhc3N3b3JkIEZpZWxkIC0tPlxyXG4gICAgICAgIEBjYXNlICgncGFzc3dvcmQnKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsXCI+XHJcbiAgICAgICAgICAgIEBpZiAoZmllbGQucHJlZml4Py5pY29uIHx8IGZpZWxkLnByZWZpeD8udGV4dCkge1xyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgbGVmdC0wIHRvcC0xLzIgLXRyYW5zbGF0ZS15LTEvMiBwbC0zIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwiei1pbmRleDogMVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgQGlmIChmaWVsZC5wcmVmaXg/Lmljb24pIHtcclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLW5hbWVdPVwiZmllbGQucHJlZml4IS5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tdmFyaWFudD1cIkxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1zaXplPVwibWVkaXVtXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tY29sb3JdPVwiY29udHJvbC5kaXNhYmxlZCA/ICcjYzRjZGQyJyA6ICcjMDMxODJiJ1wiXHJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEBpZiAoZmllbGQucHJlZml4Py50ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHdoaXRlc3BhY2Utbm93cmFwXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGNvbG9yOiBjb250cm9sLmRpc2FibGVkID8gJyNjNGNkZDInIDogJyMwMzE4MmInIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwcmVmaXhDbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJwcmVmaXhDbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJmaWVsZC5wcmVmaXg/Lm9uQ2xpY2sgPyAwIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cIiEhZmllbGQucHJlZml4Py5vbkNsaWNrXCJcclxuICAgICAgICAgICAgICAgICAgICA+e3sgZmllbGQucHJlZml4IS50ZXh0IH19PC9zcGFuXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICBbdHlwZV09XCJzaG93UGFzc3dvcmQgPyAndGV4dCcgOiAncGFzc3dvcmQnXCJcclxuICAgICAgICAgICAgICBbaWRdPVwidW5pcXVlSWRcIlxyXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmllbGQucmVhZE9ubHkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJpc0FscGhhbnVtZXJpYyA/IGhhbmRsZUFscGhhbnVtZXJpY0lucHV0KCRldmVudCkgOiBoYW5kbGVJbnB1dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoZm9jdXMpPVwib25QYXNzd29yZEZvY3VzKClcIlxyXG4gICAgICAgICAgICAgIChibHVyKT1cImhhbmRsZVBhc3N3b3JkQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImZuLWlucHV0LWZpZWxkIG92ZXJmbG93LWhpZGRlbiB0ZXh0LWVsbGlwc2lzXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogY29udHJvbC5kaXNhYmxlZCB8fCBmaWVsZC5yZWFkT25seSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiBjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5lcnJvcnMsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmaWVsZFsnaGFzU3VjY2Vzc0JvcmRlciddICYmIGNvbnRyb2wudmFsaWQsXHJcbiAgICAgICAgICAgICAgICAncGwtMTAnOiBmaWVsZC5wcmVmaXg/Lmljb24gJiYgIWZpZWxkLnByZWZpeD8udGV4dCxcclxuICAgICAgICAgICAgICAgICdoYXMtcHJlZml4LXRleHQnOiAhIWZpZWxkLnByZWZpeD8udGV4dCxcclxuICAgICAgICAgICAgICAgICdwci0xMic6XHJcbiAgICAgICAgICAgICAgICAgIChmaWVsZC50b2dnbGVNYXNrICYmICFmaWVsZC5pc0NvcHlUZXh0KSB8fFxyXG4gICAgICAgICAgICAgICAgICAoIWZpZWxkLnRvZ2dsZU1hc2sgJiYgZmllbGQuaXNDb3B5VGV4dCksXHJcbiAgICAgICAgICAgICAgICAncHItMjQnOiBmaWVsZC50b2dnbGVNYXNrICYmIGZpZWxkLmlzQ29weVRleHQgJiYgIWZpZWxkLmhhc0dlbmVyYXRlS2V5LFxyXG4gICAgICAgICAgICAgICAgJ3ByLTMyJzogZmllbGQudG9nZ2xlTWFzayAmJiBmaWVsZC5pc0NvcHlUZXh0ICYmIGZpZWxkLmhhc0dlbmVyYXRlS2V5LFxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgIGNvbG9yOiBmaWVsZC52YWx1ZUNvbG9yIHx8ICdpbmhlcml0JyxcclxuICAgICAgICAgICAgICAgICdmb250LXNpemUnOiBmaWVsZC52YWx1ZVNpemUgfHwgJycsXHJcbiAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgIC8+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgcmlnaHQtMCB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgZmxleCBpdGVtcy1jZW50ZXIgcHItMyBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgIEBpZiAoZmllbGQudG9nZ2xlTWFzayAmJiAhZmllbGQuaXNDb3B5VGV4dCkge1xyXG4gICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVQYXNzd29yZFZpc2liaWxpdHkoKVwiXHJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cInRvZ2dsZVBhc3N3b3JkVmlzaWJpbGl0eSgpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLW5hbWVdPVwic2hvd1Bhc3N3b3JkID8gJ2V5ZS1vcGVuJyA6ICdleWUtY2xvc2UnXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tdmFyaWFudD1cIkxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1zaXplPVwibGFyZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1jb2xvcj1cIiMwMzE4MmJcIlxyXG4gICAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoZmllbGQuaXNDb3B5VGV4dCAmJiAhZmllbGQudG9nZ2xlTWFzaykge1xyXG4gICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb3B5VGV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiY29weVRleHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAjaWNvbkNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1uYW1lPVwidHdvLXNxdWFyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLWNvbG9yPVwiIzAzMTgyYlwiXHJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIEBpZiAoZmllbGQuaGFzR2VuZXJhdGVLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmllbGQub25HZW5lcmF0ZUtleSAmJiBmaWVsZC5vbkdlbmVyYXRlS2V5KClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImZpZWxkLm9uR2VuZXJhdGVLZXkgJiYgZmllbGQub25HZW5lcmF0ZUtleSgpXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1uYW1lPVwicm91bmQtYXJyb3ctdG9wLWxlZnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLXZhcmlhbnQ9XCJMaW5lXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1zaXplPVwibGFyZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLWNvbG9yPVwiIzAzMTgyYlwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoZmllbGQudG9nZ2xlTWFzayAmJiBmaWVsZC5pc0NvcHlUZXh0KSB7XHJcbiAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBhc3N3b3JkVmlzaWJpbGl0eSgpXCJcclxuICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwidG9nZ2xlUGFzc3dvcmRWaXNpYmlsaXR5KClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgI2ljb25Db250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tbmFtZV09XCJzaG93UGFzc3dvcmQgPyAnZXllLW9wZW4nIDogJ2V5ZS1jbG9zZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi12YXJpYW50PVwiTGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLXNpemU9XCJsYXJnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLWNvbG9yPVwiIzAzMTgyYlwiXHJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29weVRleHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImNvcHlUZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgI2ljb25Db250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tbmFtZT1cInR3by1zcXVhcmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1jb2xvcj1cIiMwMzE4MmJcIlxyXG4gICAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICBAaWYgKGZpZWxkLmhhc0dlbmVyYXRlS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZpZWxkLm9uR2VuZXJhdGVLZXkgJiYgZmllbGQub25HZW5lcmF0ZUtleSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJmaWVsZC5vbkdlbmVyYXRlS2V5ICYmIGZpZWxkLm9uR2VuZXJhdGVLZXkoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnb3BhY2l0eS01MCBjdXJzb3Itbm90LWFsbG93ZWQnOiAhY29udHJvbC52YWx1ZSB9XCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1uYW1lPVwicm91bmQtYXJyb3ctdG9wLWxlZnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLWNvbG9yPVwiIzAzMTgyYlwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIEBpZiAoZmllbGQuZmVlZGJhY2sgJiYgaXNQYXNzd29yZEZvY3VzZWQpIHtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgc3BhY2UteS0xXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiB0ZXh0LXhzXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtbWVkaXVtXCIgW25nQ2xhc3NdPVwic3RyZW5ndGhDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBwYXNzd29yZFN0cmVuZ3RoTGFiZWwgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgI2ljb25Db250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tbmFtZV09XCJcclxuICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkU3RyZW5ndGhQZXJjZW50ID4gNTAgPyAnY2hlY2stY2lyY2xlJyA6ICdpbmZvLWNpcmNsZSdcclxuICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi12YXJpYW50PVwiTGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLXNpemU9XCJleHRyYXNtYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tY29sb3JdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZFN0cmVuZ3RoUGVyY2VudCA8PSAyNVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICcjZWYzZTQyJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHBhc3N3b3JkU3RyZW5ndGhQZXJjZW50IDw9IDc1XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnI2ZmOWYwMCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcjNmNjMjRhJ1xyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLTEuNSB3LWZ1bGwgYmctWyNlZWYwZjJdIHJvdW5kZWQtZnVsbCBvdmVyZmxvdy1oaWRkZW5cIj5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLWZ1bGwgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMzAwIHJvdW5kZWQtZnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAnYmctWyNlZjNlNDJdJzogcGFzc3dvcmRTdHJlbmd0aFBlcmNlbnQgPD0gMjUsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2JnLVsjZmY5ZjAwXSc6IHBhc3N3b3JkU3RyZW5ndGhQZXJjZW50ID4gMjUgJiYgcGFzc3dvcmRTdHJlbmd0aFBlcmNlbnQgPD0gNzUsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2JnLVsjNmNjMjRhXSc6IHBhc3N3b3JkU3RyZW5ndGhQZXJjZW50ID4gNzUsXHJcbiAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJwYXNzd29yZFN0cmVuZ3RoUGVyY2VudFwiXHJcbiAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPCEtLSBOdW1iZXIgRmllbGQgLS0+XHJcbiAgICAgICAgQGNhc2UgKCdudW1iZXInKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsXCI+XHJcbiAgICAgICAgICAgIEBpZiAoZmllbGQucHJlZml4Py5pY29uIHx8IGZpZWxkLnByZWZpeD8udGV4dCkge1xyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgbGVmdC0wIHRvcC0xLzIgLXRyYW5zbGF0ZS15LTEvMiBwbC0zIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwiei1pbmRleDogMVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgQGlmIChmaWVsZC5wcmVmaXg/Lmljb24pIHtcclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLW5hbWVdPVwiZmllbGQucHJlZml4IS5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tdmFyaWFudD1cIkxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1zaXplPVwibWVkaXVtXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tY29sb3JdPVwiY29udHJvbC5kaXNhYmxlZCA/ICcjYzRjZGQyJyA6ICcjMDMxODJiJ1wiXHJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEBpZiAoZmllbGQucHJlZml4Py50ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHdoaXRlc3BhY2Utbm93cmFwXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGNvbG9yOiBjb250cm9sLmRpc2FibGVkID8gJyNjNGNkZDInIDogJyMwMzE4MmInIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwcmVmaXhDbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJwcmVmaXhDbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJmaWVsZC5wcmVmaXg/Lm9uQ2xpY2sgPyAwIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cIiEhZmllbGQucHJlZml4Py5vbkNsaWNrXCJcclxuICAgICAgICAgICAgICAgICAgICA+e3sgZmllbGQucHJlZml4IS50ZXh0IH19PC9zcGFuXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICBbdHlwZV09XCJmaWVsZC50eXBlID09PSAnbnVtYmVyJyAmJiBmaWVsZC5pc0N1cnJlbmN5ID8gJ3RleHQnIDogJ251bWJlcidcIlxyXG4gICAgICAgICAgICAgIFtuYW1lXT1cImZpZWxkLm5hbWVcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJ1bmlxdWVJZFwiXHJcbiAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgfHwgJycgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiZmllbGQucmVhZE9ubHkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcclxuICAgICAgICAgICAgICBbbWluXT1cImZpZWxkLnR5cGUgPT09ICdudW1iZXInICYmICFmaWVsZC5pc0N1cnJlbmN5ID8gMCA6IG51bGxcIlxyXG4gICAgICAgICAgICAgIFttYXhdPVwiZmllbGQudHlwZSA9PT0gJ251bWJlcicgJiYgIWZpZWxkLmlzQ3VycmVuY3kgPyBmaWVsZC5tYXggOiBudWxsXCJcclxuICAgICAgICAgICAgICBbc3RlcF09XCJmaWVsZC50eXBlID09PSAnbnVtYmVyJyAmJiAhZmllbGQuaXNDdXJyZW5jeSA/IGZpZWxkLnN0ZXAgfHwgMSA6IG51bGxcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJoYW5kbGVOdW1iZXJJbnB1dCgkZXZlbnQsIGZpZWxkLm1pbkZyYWN0aW9uRGlnaXRzIHx8IDIpXCJcclxuICAgICAgICAgICAgICAocGFzdGUpPVwiaGFuZGxlTnVtYmVyUGFzdGUoJGV2ZW50LCBmaWVsZC5taW5GcmFjdGlvbkRpZ2l0cyB8fCAyKVwiXHJcbiAgICAgICAgICAgICAgKGJsdXIpPVwiaGFuZGxlQmx1cigkZXZlbnQsIGZpZWxkLm1pbkZyYWN0aW9uRGlnaXRzIHx8IDIpXCJcclxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVOdW1iZXJLZXlkb3duKCRldmVudCwgZmllbGQuaXNDdXJyZW5jeSB8fCBmYWxzZSlcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm4taW5wdXQtZmllbGRcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBjb250cm9sLmRpc2FibGVkIHx8IGZpZWxkLnJlYWRPbmx5LFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6IGNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmVycm9ycyxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZpZWxkWydoYXNTdWNjZXNzQm9yZGVyJ10gJiYgY29udHJvbC52YWxpZCAmJiAhY29udHJvbC5lcnJvcnMsXHJcbiAgICAgICAgICAgICAgICAncGwtMTAnOiBmaWVsZC5wcmVmaXg/Lmljb24gJiYgIWZpZWxkLnByZWZpeD8udGV4dCxcclxuICAgICAgICAgICAgICAgICdoYXMtcHJlZml4LXRleHQnOiAhIWZpZWxkLnByZWZpeD8udGV4dCxcclxuICAgICAgICAgICAgICAgICdwci0xMCc6IGZpZWxkLnN1ZmZpeD8uaWNvbiAmJiAhZmllbGQuc3VmZml4Py50ZXh0LFxyXG4gICAgICAgICAgICAgICAgJ2hhcy1zdWZmaXgtdGV4dCc6ICEhZmllbGQuc3VmZml4Py50ZXh0LFxyXG4gICAgICAgICAgICAgICAgJ3RleHQtWzI0cHhdIGZvbnQtYm9sZCc6IGZpZWxkLmlzQ3VycmVuY3ksXHJcbiAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgY29sb3I6IGZpZWxkLnZhbHVlQ29sb3IgfHwgJ2luaGVyaXQnLFxyXG4gICAgICAgICAgICAgICAgJ2ZvbnQtc2l6ZSc6IGZpZWxkLnZhbHVlU2l6ZSB8fCAnJyxcclxuICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPCEtLSBEZWZhdWx0IElucHV0IEZpZWxkICh0ZXh0LCBlbWFpbCwgZXRjLikgLS0+XHJcbiAgICAgICAgQGRlZmF1bHQge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIHotMFwiPlxyXG4gICAgICAgICAgICBAaWYgKGZpZWxkLnByZWZpeD8uaWNvbiB8fCBmaWVsZC5wcmVmaXg/LnRleHQpIHtcclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGxlZnQtMCB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgcGwtMyBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiXHJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInotaW5kZXg6IDFcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIEBpZiAoZmllbGQucHJlZml4Py5pY29uKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAjaWNvbkNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaWNvbi1uYW1lXT1cImZpZWxkLnByZWZpeCEuaWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLXZhcmlhbnQ9XCJMaW5lXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tc2l6ZT1cIm1lZGl1bVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLWNvbG9yXT1cImNvbnRyb2wuZGlzYWJsZWQgPyAnI2M0Y2RkMicgOiAnIzAzMTgyYidcIlxyXG4gICAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBAaWYgKGZpZWxkLnByZWZpeD8udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1zbSBmb250LW1lZGl1bSB3aGl0ZXNwYWNlLW5vd3JhcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBjb2xvcjogY29udHJvbC5kaXNhYmxlZCA/ICcjYzRjZGQyJyA6ICcjMDMxODJiJyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicHJlZml4Q2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwicHJlZml4Q2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiZmllbGQucHJlZml4Py5vbkNsaWNrID8gMCA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jdXJzb3ItcG9pbnRlcl09XCIhIWZpZWxkLnByZWZpeD8ub25DbGlja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPnt7IGZpZWxkLnByZWZpeCEudGV4dCB9fTwvc3BhblxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiZmllbGQudHlwZVwiXHJcbiAgICAgICAgICAgICAgW25hbWVdPVwiZmllbGQubmFtZVwiXHJcbiAgICAgICAgICAgICAgW2lkXT1cInVuaXF1ZUlkXCJcclxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiZmllbGQucmVhZE9ubHkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwiXHJcbiAgICAgICAgICAgICAgICBpc0VtYWlsRmllbGRcclxuICAgICAgICAgICAgICAgICAgPyBoYW5kbGVFbWFpbElucHV0KCRldmVudClcclxuICAgICAgICAgICAgICAgICAgOiBmaWVsZC50eXBlID09PSAndGV4dCcgJiYgaXNBbHBoYW51bWVyaWNcclxuICAgICAgICAgICAgICAgICAgICA/IGhhbmRsZUFscGhhbnVtZXJpY0lucHV0KCRldmVudClcclxuICAgICAgICAgICAgICAgICAgICA6IGhhbmRsZUlucHV0KCRldmVudClcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIChibHVyKT1cImhhbmRsZUJsdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbi1pbnB1dC1maWVsZFwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGNvbnRyb2wuZGlzYWJsZWQgfHwgZmllbGQucmVhZE9ubHksXHJcbiAgICAgICAgICAgICAgICBlcnJvcjogY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZXJyb3JzLFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmllbGRbJ2hhc1N1Y2Nlc3NCb3JkZXInXSAmJiBjb250cm9sLnZhbGlkICYmICFjb250cm9sLmVycm9ycyxcclxuICAgICAgICAgICAgICAgICdwbC0xMCc6IGZpZWxkLnByZWZpeD8uaWNvbiAmJiAhZmllbGQucHJlZml4Py50ZXh0LFxyXG4gICAgICAgICAgICAgICAgJ2hhcy1wcmVmaXgtdGV4dCc6ICEhZmllbGQucHJlZml4Py50ZXh0LFxyXG4gICAgICAgICAgICAgICAgJ3ByLTEwJzpcclxuICAgICAgICAgICAgICAgICAgKGZpZWxkLmljb24gfHwgZmllbGQuc3VmZml4Py5pY29uKSAmJiAhZmllbGQuaXNDb3B5VGV4dCAmJiAhZmllbGQuc3VmZml4Py50ZXh0LFxyXG4gICAgICAgICAgICAgICAgJ2hhcy1zdWZmaXgtdGV4dCc6ICEhZmllbGQuc3VmZml4Py50ZXh0LFxyXG4gICAgICAgICAgICAgICAgJ3ByLTIwJzpcclxuICAgICAgICAgICAgICAgICAgZmllbGQuaXNDb3B5VGV4dCAmJiAhZmllbGQuaGFzR2VuZXJhdGVLZXkgJiYgIShmaWVsZC5pY29uIHx8IGZpZWxkLnN1ZmZpeD8uaWNvbiksXHJcbiAgICAgICAgICAgICAgICAncHItMzAnOlxyXG4gICAgICAgICAgICAgICAgICBmaWVsZC5pc0NvcHlUZXh0ICYmIGZpZWxkLmhhc0dlbmVyYXRlS2V5ICYmICEoZmllbGQuaWNvbiB8fCBmaWVsZC5zdWZmaXg/Lmljb24pLFxyXG4gICAgICAgICAgICAgICAgJ3ByLTMyJzpcclxuICAgICAgICAgICAgICAgICAgZmllbGQuaXNDb3B5VGV4dCAmJiBmaWVsZC5oYXNHZW5lcmF0ZUtleSAmJiAoZmllbGQuaWNvbiB8fCBmaWVsZC5zdWZmaXg/Lmljb24pLFxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgIGNvbG9yOiBmaWVsZC52YWx1ZUNvbG9yIHx8ICdpbmhlcml0JyxcclxuICAgICAgICAgICAgICAgICdmb250LXNpemUnOiBmaWVsZC52YWx1ZVNpemUgfHwgJycsXHJcbiAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXHJcbiAgICAgICAgICAgIC8+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgcmlnaHQtMCB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgZmxleCBpdGVtcy1jZW50ZXIgcHItMyBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgIEBpZiAoZmllbGQuaXNDb3B5VGV4dCkge1xyXG4gICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb3B5VGV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiY29weVRleHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAjaWNvbkNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1uYW1lPVwidHdvLXNxdWFyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLWNvbG9yPVwiIzAzMTgyYlwiXHJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIEBpZiAoZmllbGQuaGFzR2VuZXJhdGVLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmllbGQub25HZW5lcmF0ZUtleSAmJiBmaWVsZC5vbkdlbmVyYXRlS2V5KClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImZpZWxkLm9uR2VuZXJhdGVLZXkgJiYgZmllbGQub25HZW5lcmF0ZUtleSgpXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1uYW1lPVwicm91bmQtYXJyb3ctdG9wLWxlZnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLWNvbG9yPVwiIzAzMTgyYlwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBAaWYgKGZpZWxkLmljb24gfHwgZmllbGQuc3VmZml4Py5pY29uIHx8IGZpZWxkLnN1ZmZpeD8udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgQGlmIChmaWVsZC5zdWZmaXg/LnRleHQpIHtcclxuICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtc20gZm9udC1tZWRpdW0gd2hpdGVzcGFjZS1ub3dyYXBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgY29sb3I6IGNvbnRyb2wuZGlzYWJsZWQgPyAnI2M0Y2RkMicgOiAnIzAzMTgyYicgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN1ZmZpeENsaWNrKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInN1ZmZpeENsaWNrKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImZpZWxkLnN1ZmZpeD8ub25DbGljayA/IDAgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY3Vyc29yLXBvaW50ZXJdPVwiISFmaWVsZC5zdWZmaXg/Lm9uQ2xpY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgID57eyBmaWVsZC5zdWZmaXghLnRleHQgfX08L3NwYW5cclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgQGlmIChmaWVsZC5pY29uIHx8IGZpZWxkLnN1ZmZpeD8uaWNvbikge1xyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgI2ljb25Db250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tbmFtZV09XCJmaWVsZC5zdWZmaXg/Lmljb24gfHwgZmllbGQuaWNvbiEubmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLXZhcmlhbnRdPVwiZmllbGQuaWNvbj8udmFyaWFudCB8fCAnTGluZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaWNvbi1zaXplXT1cImZpZWxkLmljb24gPyBnZXRJY29uU2l6ZU5hbWUoZmllbGQuaWNvbi5zaXplKSA6ICdtZWRpdW0nXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tY29sb3JdPVwiY29udHJvbC5kaXNhYmxlZCA/ICcjYzRjZGQyJyA6ICcjMDMxODJiJ1wiXHJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICBAaWYgKHNob3dGb3JtRmllbGRNZXNzYWdlKGNvbnRyb2wsIGhlbHBlclRleHQpKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbi1maWVsZC1tZXNzYWdlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICBjbGFzcz1cImZuLWZpZWxkLW1lc3NhZ2UtdGV4dFwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgIGVycm9yOiBpc0Vycm9yLFxyXG4gICAgICAgICAgICBzdWNjZXNzOiBpc1N1Y2Nlc3MsXHJcbiAgICAgICAgICB9XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRGaWVsZE1lc3NhZ2UoKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gSW50ZWdyYXRlZCBUb2FzdCBOb3RpZmljYXRpb25zIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJ0b2FzdC1jb250YWluZXJcIj5cclxuICAgIEBmb3IgKHRvYXN0IG9mIHRvYXN0cygpOyB0cmFjayB0b2FzdC5pZCkge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwidG9hc3QgdG9hc3Qte3sgdG9hc3QudHlwZSB9fVwiIFtjbGFzcy50b2FzdC1lbnRlcl09XCJ0b2FzdC5pc1Zpc2libGVcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInRvYXN0LWljb25cIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgI2ljb25Db250YWluZXJcclxuICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtaWNvbi1uYW1lXT1cImdldFRvYXN0SWNvbk5hbWUodG9hc3QpXCJcclxuICAgICAgICAgICAgZGF0YS1pY29uLXZhcmlhbnQ9XCJDb2xvdXJcIlxyXG4gICAgICAgICAgICBkYXRhLWljb24tc2l6ZT1cIm1lZGl1bVwiXHJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtaWNvbi1jb2xvcl09XCJcclxuICAgICAgICAgICAgICB0b2FzdC50eXBlID09PSAnc3VjY2VzcydcclxuICAgICAgICAgICAgICAgID8gJyM2Y2MyNGEnXHJcbiAgICAgICAgICAgICAgICA6IHRvYXN0LnR5cGUgPT09ICd3YXJuJ1xyXG4gICAgICAgICAgICAgICAgICA/ICcjZmY5ZjAwJ1xyXG4gICAgICAgICAgICAgICAgICA6IHRvYXN0LnR5cGUgPT09ICdlcnJvcidcclxuICAgICAgICAgICAgICAgICAgICA/ICcjZWYzZTQyJ1xyXG4gICAgICAgICAgICAgICAgICAgIDogJyMwMzE4MmInXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b2FzdC1jb250ZW50XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvYXN0LW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAge3sgZ2V0VHJhbnNsYXRlZE1lc3NhZ2UodG9hc3QubWVzc2FnZSkgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwidG9hc3QtY2xvc2VcIiAoY2xpY2spPVwicmVtb3ZlVG9hc3QodG9hc3QuaWQpXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIlxyXG4gICAgICAgICAgICBkYXRhLWljb24tbmFtZT1cImNyb3NzXCJcclxuICAgICAgICAgICAgZGF0YS1pY29uLXZhcmlhbnQ9XCJMaW5lXCJcclxuICAgICAgICAgICAgZGF0YS1pY29uLXNpemU9XCJtZWRpdW1cIlxyXG4gICAgICAgICAgICBkYXRhLWljb24tY29sb3I9XCIjZmZmZmZmXCJcclxuICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbn1cclxuIl19