fn-input 0.0.4 → 0.0.6
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.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output, signal, ViewChild, ViewChildren, } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
|
-
|
|
3
|
+
// Removed HttpClient import
|
|
4
4
|
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
5
5
|
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
6
6
|
import { Subscription, merge } from 'rxjs';
|
|
@@ -10,6 +10,15 @@ import * as i0 from "@angular/core";
|
|
|
10
10
|
import * as i1 from "@angular/forms";
|
|
11
11
|
import * as i2 from "@angular/common";
|
|
12
12
|
import * as i3 from "@ngx-translate/core";
|
|
13
|
+
const CORE_ICONS = {
|
|
14
|
+
'eye-open': `<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><circle cx="12" cy="12" r="3" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`,
|
|
15
|
+
'eye-close': `<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><line x1="1" y1="1" x2="23" y2="23" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`,
|
|
16
|
+
'two-square': `<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="9" y="9" width="13" height="13" rx="2" ry="2" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`,
|
|
17
|
+
'round-arrow-top-left': `<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12 2a10 10 0 1 0 10 10A10 10 0 0 0 12 2zm0 18a8 8 0 1 1 8-8 8 8 0 0 1-8 8z" fill="currentColor"/><path d="M15 9H9v6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M9 9l6 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`,
|
|
18
|
+
'check-circle': `<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M22 4L12 14.01l-3-3" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`,
|
|
19
|
+
'info-circle': `<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><line x1="12" y1="16" x2="12" y2="12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><line x1="12" y1="8" x2="12.01" y2="8" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`,
|
|
20
|
+
'alert-circle': `<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><line x1="12" y1="8" x2="12" y2="12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><line x1="12" y1="16" x2="12.01" y2="16" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`,
|
|
21
|
+
};
|
|
13
22
|
export class FNInput {
|
|
14
23
|
cdr;
|
|
15
24
|
field = {};
|
|
@@ -24,7 +33,7 @@ export class FNInput {
|
|
|
24
33
|
hasFocus = signal(false);
|
|
25
34
|
textareaElement;
|
|
26
35
|
iconContainers;
|
|
27
|
-
|
|
36
|
+
// Removed HttpClient injection
|
|
28
37
|
subs = new Subscription();
|
|
29
38
|
sizeMap = {
|
|
30
39
|
extrasmall: 10,
|
|
@@ -179,6 +188,9 @@ export class FNInput {
|
|
|
179
188
|
this.control.setValue(filteredValue, { emitEvent: false });
|
|
180
189
|
input.setSelectionRange(cursorPosition, cursorPosition);
|
|
181
190
|
}
|
|
191
|
+
if (this.field.type === 'password' && this.field.feedback) {
|
|
192
|
+
this.checkPasswordStrength(filteredValue);
|
|
193
|
+
}
|
|
182
194
|
this.valueChange.emit({ name: this.field.name, value: filteredValue });
|
|
183
195
|
this.control.markAsTouched();
|
|
184
196
|
}
|
|
@@ -344,6 +356,9 @@ export class FNInput {
|
|
|
344
356
|
target.setSelectionRange(newCursorPos, newCursorPos);
|
|
345
357
|
}
|
|
346
358
|
// Trailing spaces will be trimmed on blur, not during input
|
|
359
|
+
if (this.field.type === 'password' && this.field.feedback) {
|
|
360
|
+
this.checkPasswordStrength(filteredValue);
|
|
361
|
+
}
|
|
347
362
|
this.valueChange.emit({ name: this.field.name, value: filteredValue });
|
|
348
363
|
this.control.markAsTouched();
|
|
349
364
|
}
|
|
@@ -374,6 +389,9 @@ export class FNInput {
|
|
|
374
389
|
const newCursorPos = Math.max(0, (cursorPosition || 0) - charsRemovedBeforeCursor);
|
|
375
390
|
target.setSelectionRange(newCursorPos, newCursorPos);
|
|
376
391
|
}
|
|
392
|
+
if (this.field.type === 'password' && this.field.feedback) {
|
|
393
|
+
this.checkPasswordStrength(filteredValue);
|
|
394
|
+
}
|
|
377
395
|
this.valueChange.emit({ name: this.field.name, value: filteredValue });
|
|
378
396
|
this.control.markAsTouched();
|
|
379
397
|
}
|
|
@@ -944,12 +962,12 @@ export class FNInput {
|
|
|
944
962
|
// We'll call this after ViewInit or when inputs change
|
|
945
963
|
setTimeout(() => {
|
|
946
964
|
this.iconContainers?.forEach((container) => {
|
|
947
|
-
const
|
|
948
|
-
const
|
|
949
|
-
const
|
|
950
|
-
|
|
951
|
-
const color =
|
|
952
|
-
const disabled =
|
|
965
|
+
const ds = container.nativeElement.dataset;
|
|
966
|
+
const name = ds['iconName'];
|
|
967
|
+
const variant = ds['iconVariant'] || 'Line';
|
|
968
|
+
const size = (ds['iconSize'] || 'medium');
|
|
969
|
+
const color = ds['iconColor'];
|
|
970
|
+
const disabled = ds['iconDisabled'] === 'true';
|
|
953
971
|
if (name) {
|
|
954
972
|
this.loadIconToContainer(container.nativeElement, name, variant, size, color, disabled);
|
|
955
973
|
}
|
|
@@ -958,92 +976,90 @@ export class FNInput {
|
|
|
958
976
|
}
|
|
959
977
|
loadIconToContainer(container, name, variant, sizeName, color, disabled) {
|
|
960
978
|
const size = this.sizeMap[sizeName];
|
|
961
|
-
|
|
962
|
-
if (
|
|
963
|
-
container
|
|
979
|
+
// 1. Check if raw SVG string is provided
|
|
980
|
+
if (name.trim().startsWith('<svg')) {
|
|
981
|
+
this.renderSvgToContainer(container, name, color, size, 'custom', disabled);
|
|
964
982
|
return;
|
|
965
983
|
}
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
svg.removeAttribute('width');
|
|
1002
|
-
svg.removeAttribute('height');
|
|
1003
|
-
if (!svg.getAttribute('viewBox')) {
|
|
1004
|
-
svg.setAttribute('viewBox', `0 0 ${size} ${size}`);
|
|
1005
|
-
}
|
|
1006
|
-
svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');
|
|
1007
|
-
svg.setAttribute('focusable', 'false');
|
|
1008
|
-
svg.setAttribute('aria-hidden', 'true');
|
|
1009
|
-
svg.setAttribute('width', '100%');
|
|
1010
|
-
svg.setAttribute('height', '100%');
|
|
1011
|
-
const style = `;display:block;max-width:100%;max-height:100%;`;
|
|
1012
|
-
svg.setAttribute('style', (svg.getAttribute('style') || '') + style);
|
|
1013
|
-
container.innerHTML = '';
|
|
1014
|
-
if (color) {
|
|
1015
|
-
container.style.color = color;
|
|
984
|
+
// 2. Check built-in icons registry
|
|
985
|
+
// Strip possible --size suffix if it was passed by mistake from old logic
|
|
986
|
+
const baseName = name.split('--')[0].trim();
|
|
987
|
+
if (CORE_ICONS[baseName]) {
|
|
988
|
+
this.renderSvgToContainer(container, CORE_ICONS[baseName], color, size, baseName, disabled);
|
|
989
|
+
return;
|
|
990
|
+
}
|
|
991
|
+
// No fallback to HTTP
|
|
992
|
+
console.warn(`[fn-input] Icon "${name}" not found in core registry and no raw SVG provided.`);
|
|
993
|
+
container.innerHTML = '';
|
|
994
|
+
this.cdr.detectChanges();
|
|
995
|
+
}
|
|
996
|
+
renderSvgToContainer(container, raw, color, size, name, disabled) {
|
|
997
|
+
try {
|
|
998
|
+
const parser = new DOMParser();
|
|
999
|
+
const doc = parser.parseFromString(raw, 'image/svg+xml');
|
|
1000
|
+
const svg = doc.querySelector('svg');
|
|
1001
|
+
if (!svg) {
|
|
1002
|
+
container.innerHTML = '';
|
|
1003
|
+
return;
|
|
1004
|
+
}
|
|
1005
|
+
// SVG Normalization logic
|
|
1006
|
+
for (const s of svg.querySelectorAll('style'))
|
|
1007
|
+
s.remove();
|
|
1008
|
+
if (color) {
|
|
1009
|
+
for (const el of svg.querySelectorAll('*')) {
|
|
1010
|
+
const style = el.getAttribute('style');
|
|
1011
|
+
if (style) {
|
|
1012
|
+
const cleaned = style
|
|
1013
|
+
.replaceAll(/fill\s*:\s*[^;]+;?/gi, '')
|
|
1014
|
+
.replaceAll(/stroke\s*:\s*[^;]+;?/gi, '');
|
|
1015
|
+
if (cleaned)
|
|
1016
|
+
el.setAttribute('style', cleaned);
|
|
1017
|
+
else
|
|
1018
|
+
el.removeAttribute('style');
|
|
1016
1019
|
}
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
+
const fill = el.getAttribute('fill');
|
|
1021
|
+
if (fill && fill !== 'none' && !fill.startsWith('url(')) {
|
|
1022
|
+
el.setAttribute('fill', 'currentColor');
|
|
1020
1023
|
}
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
+
const stroke = el.getAttribute('stroke');
|
|
1025
|
+
if (stroke && stroke !== 'none' && !stroke.startsWith('url(')) {
|
|
1026
|
+
el.setAttribute('stroke', 'currentColor');
|
|
1024
1027
|
}
|
|
1025
|
-
container.appendChild(svg);
|
|
1026
|
-
this.cdr.detectChanges();
|
|
1027
1028
|
}
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1029
|
+
}
|
|
1030
|
+
svg.removeAttribute('width');
|
|
1031
|
+
svg.removeAttribute('height');
|
|
1032
|
+
if (!svg.getAttribute('viewBox')) {
|
|
1033
|
+
svg.setAttribute('viewBox', `0 0 ${size} ${size}`);
|
|
1034
|
+
}
|
|
1035
|
+
svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');
|
|
1036
|
+
svg.setAttribute('focusable', 'false');
|
|
1037
|
+
svg.setAttribute('aria-hidden', 'true');
|
|
1038
|
+
svg.setAttribute('width', '100%');
|
|
1039
|
+
svg.setAttribute('height', '100%');
|
|
1040
|
+
const style = `;display:block;max-width:100%;max-height:100%;`;
|
|
1041
|
+
svg.setAttribute('style', (svg.getAttribute('style') || '') + style);
|
|
1042
|
+
container.innerHTML = '';
|
|
1043
|
+
if (color) {
|
|
1044
|
+
container.style.color = color;
|
|
1045
|
+
}
|
|
1046
|
+
if (disabled) {
|
|
1047
|
+
container.style.opacity = '0.5';
|
|
1048
|
+
container.style.cursor = 'not-allowed';
|
|
1049
|
+
}
|
|
1050
|
+
else {
|
|
1051
|
+
container.style.opacity = '1';
|
|
1052
|
+
container.style.cursor = '';
|
|
1053
|
+
}
|
|
1054
|
+
container.appendChild(svg);
|
|
1055
|
+
this.cdr.detectChanges();
|
|
1056
|
+
}
|
|
1057
|
+
catch (error) {
|
|
1058
|
+
console.error(`[fn-input] Error parsing SVG for icon "${name}":`, error);
|
|
1059
|
+
container.innerHTML = '';
|
|
1044
1060
|
}
|
|
1045
|
-
return `assets/icons/${variant}/${size}px/${icon}--${size}.svg`;
|
|
1046
1061
|
}
|
|
1062
|
+
// Removed getIconPath as HTTP loading is disabled
|
|
1047
1063
|
// --- MESSAGE LOGIC ---
|
|
1048
1064
|
getFieldMessage() {
|
|
1049
1065
|
if (!this.control)
|
|
@@ -1070,11 +1086,11 @@ export class FNInput {
|
|
|
1070
1086
|
return !!(this.control?.valid && this.control?.touched);
|
|
1071
1087
|
}
|
|
1072
1088
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FNInput, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1073
|
-
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> (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\r\n @case ('password') {\r\n <div class=\"relative w-full\">\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 'pr-12':\r\n (field.toggleMask && !field.isCopyText) ||\r\n (!field.toggleMask && field.isCopyText),\r\n 'pr-24': field.toggleMask && field.isCopyText,\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)=\"showPassword = !showPassword\"\r\n (keydown)=\"showPassword = !showPassword\"\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=\"two-square\"\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)=\"showPassword = !showPassword\"\r\n (keydown)=\"showPassword = !showPassword\"\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\r\n <!-- Number Field -->\r\n @case ('number') {\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 '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 }\r\n\r\n <!-- Default Input Field (text, email, etc.) -->\r\n @default {\r\n <div class=\"relative z-0\">\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 'pr-10': field.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 @if (field.icon) {\r\n <span class=\"absolute right-0 top-1/2 -translate-y-1/2 pr-3 flex items-center\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.icon.name\"\r\n [attr.data-icon-variant]=\"field.icon.variant\"\r\n [attr.data-icon-size]=\"getIconSizeName(field.icon.size)\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n </span>\r\n }\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", styles: [".fn-input-container{display:flex;flex-direction:column;gap:8px;width:100%}.fn-label{color:#03182b;font-family:inherit;font-size:14px;font-weight:500;line-height:20px;margin-bottom:4px}.fn-input-field{background-color:#eff9fd;border:0!important;border-bottom:1px solid #c4cdd2!important;padding:8px 12px;width:100%;box-sizing:border-box;transition:border-color .2s ease-in-out;border-radius:0!important;appearance:none!important}.fn-input-field:focus{border-bottom:1px solid #0067b1!important;outline:none}.fn-input-field.error{border-bottom:1px solid #ef3e42!important}.fn-input-field.disabled{background-color:#eef0f2;color:#c4cdd2;cursor:not-allowed}.icon-container{display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:inherit}.fn-field-message-container{display:flex;align-items:center;gap:4px;margin-top:4px;min-height:20px}.fn-field-message-text{font-family:inherit;font-size:12px;font-weight:400;line-height:16px;color:#818c95}.fn-field-message-text.error{color:#ef3e42}.fn-field-message-text.success{color:#6cc24a}\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 });
|
|
1089
|
+
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> (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,\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)=\"showPassword = !showPassword\"\r\n (keydown)=\"showPassword = !showPassword\"\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=\"two-square\"\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)=\"showPassword = !showPassword\"\r\n (keydown)=\"showPassword = !showPassword\"\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,\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 @if (field.icon || field.suffix?.icon) {\r\n <span class=\"absolute right-0 top-1/2 -translate-y-1/2 pr-3 flex items-center\">\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 </span>\r\n }\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", styles: [".fn-input-container{display:flex;flex-direction:column;gap:8px;width:100%}.fn-label{color:#03182b;font-family:inherit;font-size:14px;font-weight:500;line-height:20px;margin-bottom:4px}.fn-input-field{background-color:#eff9fd;border:0!important;border-bottom:1px solid #c4cdd2!important;padding:8px 12px;width:100%;box-sizing:border-box;transition:border-color .2s ease-in-out;border-radius:0!important;appearance:none!important}.fn-input-field:focus{border-bottom:1px solid #0067b1!important;outline:none}.fn-input-field.error{border-bottom:1px solid #ef3e42!important}.fn-input-field.disabled{background-color:#eef0f2;color:#c4cdd2;cursor:not-allowed}.fn-input-field.pl-10{padding-left:36px!important}.fn-input-field.pr-10{padding-right:36px!important}.fn-input-field.pr-12{padding-right:44px!important}.fn-input-field.pr-24{padding-right:88px!important}.fn-input-field.pr-32{padding-right:120px!important}.icon-container{display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:inherit}.fn-field-message-container{display:flex;align-items:center;gap:4px;margin-top:4px;min-height:20px}.fn-field-message-text{font-family:inherit;font-size:12px;font-weight:400;line-height:16px;color:#818c95}.fn-field-message-text.error{color:#ef3e42}.fn-field-message-text.success{color:#6cc24a}.mt-2{margin-top:.5rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * (1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.bg-\\[\\#eef0f2\\]{background-color:#eef0f2}.bg-\\[\\#ef3e42\\]{background-color:#ef3e42}.bg-\\[\\#ff9f00\\]{background-color:#ff9f00}.bg-\\[\\#6cc24a\\]{background-color:#6cc24a}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.rounded-full{border-radius:9999px}.overflow-hidden{overflow:hidden}.h-1\\.5{height:.375rem}.w-full{width:100%}.flex{display:flex}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.pl-3{padding-left:.75rem}.pr-3{padding-right:.75rem}.absolute{position:absolute}.right-0{right:0}.left-0{left:0}.top-1\\/2{top:50%}.-translate-y-1\\/2{transform:translateY(-50%)}.z-0{z-index:0}.relative{position:relative}.cursor-pointer{cursor:pointer}.text-ellipsis{text-overflow:ellipsis}\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 });
|
|
1074
1090
|
}
|
|
1075
1091
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FNInput, decorators: [{
|
|
1076
1092
|
type: Component,
|
|
1077
|
-
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> (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\r\n @case ('password') {\r\n <div class=\"relative w-full\">\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 'pr-12':\r\n (field.toggleMask && !field.isCopyText) ||\r\n (!field.toggleMask && field.isCopyText),\r\n 'pr-24': field.toggleMask && field.isCopyText,\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)=\"showPassword = !showPassword\"\r\n (keydown)=\"showPassword = !showPassword\"\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=\"two-square\"\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)=\"showPassword = !showPassword\"\r\n (keydown)=\"showPassword = !showPassword\"\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\r\n <!-- Number Field -->\r\n @case ('number') {\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 '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 }\r\n\r\n <!-- Default Input Field (text, email, etc.) -->\r\n @default {\r\n <div class=\"relative z-0\">\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 'pr-10': field.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 @if (field.icon) {\r\n <span class=\"absolute right-0 top-1/2 -translate-y-1/2 pr-3 flex items-center\">\r\n <div\r\n #iconContainer\r\n class=\"icon-container\"\r\n [attr.data-icon-name]=\"field.icon.name\"\r\n [attr.data-icon-variant]=\"field.icon.variant\"\r\n [attr.data-icon-size]=\"getIconSizeName(field.icon.size)\"\r\n [attr.data-icon-color]=\"control.disabled ? '#c4cdd2' : '#03182b'\"\r\n ></div>\r\n </span>\r\n }\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", styles: [".fn-input-container{display:flex;flex-direction:column;gap:8px;width:100%}.fn-label{color:#03182b;font-family:inherit;font-size:14px;font-weight:500;line-height:20px;margin-bottom:4px}.fn-input-field{background-color:#eff9fd;border:0!important;border-bottom:1px solid #c4cdd2!important;padding:8px 12px;width:100%;box-sizing:border-box;transition:border-color .2s ease-in-out;border-radius:0!important;appearance:none!important}.fn-input-field:focus{border-bottom:1px solid #0067b1!important;outline:none}.fn-input-field.error{border-bottom:1px solid #ef3e42!important}.fn-input-field.disabled{background-color:#eef0f2;color:#c4cdd2;cursor:not-allowed}.icon-container{display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:inherit}.fn-field-message-container{display:flex;align-items:center;gap:4px;margin-top:4px;min-height:20px}.fn-field-message-text{font-family:inherit;font-size:12px;font-weight:400;line-height:16px;color:#818c95}.fn-field-message-text.error{color:#ef3e42}.fn-field-message-text.success{color:#6cc24a}\n"] }]
|
|
1093
|
+
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> (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,\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)=\"showPassword = !showPassword\"\r\n (keydown)=\"showPassword = !showPassword\"\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=\"two-square\"\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)=\"showPassword = !showPassword\"\r\n (keydown)=\"showPassword = !showPassword\"\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,\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 @if (field.icon || field.suffix?.icon) {\r\n <span class=\"absolute right-0 top-1/2 -translate-y-1/2 pr-3 flex items-center\">\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 </span>\r\n }\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", styles: [".fn-input-container{display:flex;flex-direction:column;gap:8px;width:100%}.fn-label{color:#03182b;font-family:inherit;font-size:14px;font-weight:500;line-height:20px;margin-bottom:4px}.fn-input-field{background-color:#eff9fd;border:0!important;border-bottom:1px solid #c4cdd2!important;padding:8px 12px;width:100%;box-sizing:border-box;transition:border-color .2s ease-in-out;border-radius:0!important;appearance:none!important}.fn-input-field:focus{border-bottom:1px solid #0067b1!important;outline:none}.fn-input-field.error{border-bottom:1px solid #ef3e42!important}.fn-input-field.disabled{background-color:#eef0f2;color:#c4cdd2;cursor:not-allowed}.fn-input-field.pl-10{padding-left:36px!important}.fn-input-field.pr-10{padding-right:36px!important}.fn-input-field.pr-12{padding-right:44px!important}.fn-input-field.pr-24{padding-right:88px!important}.fn-input-field.pr-32{padding-right:120px!important}.icon-container{display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:inherit}.fn-field-message-container{display:flex;align-items:center;gap:4px;margin-top:4px;min-height:20px}.fn-field-message-text{font-family:inherit;font-size:12px;font-weight:400;line-height:16px;color:#818c95}.fn-field-message-text.error{color:#ef3e42}.fn-field-message-text.success{color:#6cc24a}.mt-2{margin-top:.5rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * (1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.bg-\\[\\#eef0f2\\]{background-color:#eef0f2}.bg-\\[\\#ef3e42\\]{background-color:#ef3e42}.bg-\\[\\#ff9f00\\]{background-color:#ff9f00}.bg-\\[\\#6cc24a\\]{background-color:#6cc24a}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.rounded-full{border-radius:9999px}.overflow-hidden{overflow:hidden}.h-1\\.5{height:.375rem}.w-full{width:100%}.flex{display:flex}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.pl-3{padding-left:.75rem}.pr-3{padding-right:.75rem}.absolute{position:absolute}.right-0{right:0}.left-0{left:0}.top-1\\/2{top:50%}.-translate-y-1\\/2{transform:translateY(-50%)}.z-0{z-index:0}.relative{position:relative}.cursor-pointer{cursor:pointer}.text-ellipsis{text-overflow:ellipsis}\n"] }]
|
|
1078
1094
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { field: [{
|
|
1079
1095
|
type: Input
|
|
1080
1096
|
}], helperHandle: [{
|
|
@@ -1098,4 +1114,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1098
1114
|
type: ViewChildren,
|
|
1099
1115
|
args: ['iconContainer']
|
|
1100
1116
|
}] } });
|
|
1101
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm4taW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZm4taW5wdXQvc3JjL2xpYi9mbi1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9mbi1pbnB1dC9zcmMvbGliL2ZuLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUlULFlBQVksR0FFYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBMEIsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBSUwscUJBQXFCLEdBR3RCLE1BQU0sa0JBQWtCLENBQUM7Ozs7O0FBWTFCLE1BQU0sT0FBTyxPQUFPO0lBbUVXO0lBbEVwQixLQUFLLEdBQUcsRUFBaUIsQ0FBQztJQUMxQixZQUFZLENBQWlCO0lBQzdCLFlBQVksQ0FBZ0I7SUFDNUIsWUFBWSxHQUFHLHFCQUFxQixDQUFDO0lBQ3JDLGFBQWEsR0FBRyxPQUFPLENBQUM7SUFDeEIsSUFBSSxDQUFhO0lBQ2hCLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ2pDLFNBQVMsR0FBRyxJQUFJ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QU87NEZBQVAsT0FBTyxrZ0JDNUNwQiw4d1dBK1FBLHVsQ0R4T1ksV0FBVyxtbkJBQUUsWUFBWSxpTkFBRSxtQkFBbUIsaU5BQUUsZUFBZTs7NEZBSzlELE9BQU87a0JBUm5CLFNBQVM7K0JBQ0UsVUFBVSxjQUNSLElBQUksV0FDUCxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxDQUFDLG1CQUd6RCx1QkFBdUIsQ0FBQyxNQUFNO3NGQUd0QyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUlrQixlQUFlO3NCQUF2QyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ1EsY0FBYztzQkFBNUMsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBpbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBzaWduYWwsXHJcbiAgVmlld0NoaWxkLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgbWVyZ2UgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge1xyXG4gIEZOSW5wdXRCYXNlLFxyXG4gIEZOSW5wdXRIZWxwZXIsXHJcbiAgRk5JbnB1dFRvYXN0LFxyXG4gIERFRkFVTFRfQ1VSUkVOQ1lfTUVUQSxcclxuICBUeXBlSWNvblZhcmlhbnQsXHJcbiAgVHlwZUljb25TaXplLFxyXG59IGZyb20gJy4vZm4taW5wdXQudHlwZXMnO1xyXG5cclxuZXhwb3J0IHR5cGUgVHlwZUljb25TaXplTmFtZSA9ICdleHRyYXNtYWxsJyB8ICdzbWFsbCcgfCAnbWVkaXVtJyB8ICdsYXJnZScgfCAneC1sYXJnZScgfCAneHhsYXJnZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2ZuLWlucHV0JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtGb3Jtc01vZHVsZSwgQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBUcmFuc2xhdGVNb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mbi1pbnB1dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZm4taW5wdXQuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEZOSW5wdXQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBmaWVsZCA9IHt9IGFzIEZOSW5wdXRCYXNlO1xyXG4gIEBJbnB1dCgpIGhlbHBlckhhbmRsZT86IEZOSW5wdXRIZWxwZXI7XHJcbiAgQElucHV0KCkgdG9hc3RTZXJ2aWNlPzogRk5JbnB1dFRvYXN0O1xyXG4gIEBJbnB1dCgpIGN1cnJlbmN5TWV0YSA9IERFRkFVTFRfQ1VSUkVOQ1lfTUVUQTtcclxuICBASW5wdXQoKSBkZWZhdWx0TG9jYWxlID0gJ2VuLVVTJztcclxuICBASW5wdXQoKSBmb3JtITogRm9ybUdyb3VwO1xyXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZmllbGRCbHVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XHJcbiAgaGFzRm9jdXMgPSBzaWduYWwoZmFsc2UpO1xyXG4gIEBWaWV3Q2hpbGQoJ2ZuVGV4dGFyZWEnKSB0ZXh0YXJlYUVsZW1lbnQhOiBFbGVtZW50UmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGRyZW4oJ2ljb25Db250YWluZXInKSBpY29uQ29udGFpbmVycyE6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj47XHJcblxyXG4gIGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHNpemVNYXA6IFJlY29yZDxUeXBlSWNvblNpemVOYW1lLCBUeXBlSWNvblNpemU+ID0ge1xyXG4gICAgZXh0cmFzbWFsbDogMTAsXHJcbiAgICBzbWFsbDogMTYsXHJcbiAgICBtZWRpdW06IDIwLFxyXG4gICAgbGFyZ2U6IDI0LFxyXG4gICAgJ3gtbGFyZ2UnOiAzMixcclxuICAgIHh4bGFyZ2U6IDQ4LFxyXG4gIH07XHJcblxyXG4gIGdldEljb25TaXplTmFtZShzaXplOiBudW1iZXIpOiAnc21hbGwnIHwgJ21lZGl1bScgfCAnbGFyZ2UnIHwgJ3gtbGFyZ2UnIHtcclxuICAgIHN3aXRjaCAoc2l6ZSkge1xyXG4gICAgICBjYXNlIDE2OlxyXG4gICAgICAgIHJldHVybiAnc21hbGwnO1xyXG4gICAgICBjYXNlIDIwOlxyXG4gICAgICAgIHJldHVybiAnbWVkaXVtJztcclxuICAgICAgY2FzZSAyNDpcclxuICAgICAgICByZXR1cm4gJ2xhcmdlJztcclxuICAgICAgY2FzZSAzMjpcclxuICAgICAgICByZXR1cm4gJ3gtbGFyZ2UnO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnbWVkaXVtJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBpc0FscGhhbnVtZXJpYygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZpZWxkLmlzQWxwaGFudW1lcmljICE9PSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldCBpc0VtYWlsRmllbGQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5maWVsZC50eXBlID09PSAnZW1haWwnIHx8IHRoaXMuZmllbGQubmFtZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZW1haWwnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGFscGhhbnVtZXJpY1BhdHRlcm4oKTogUmVnRXhwIHtcclxuICAgIGlmICh0aGlzLmZpZWxkLmlzQWRkcmVzc0xpbmUpIHtcclxuICAgICAgcmV0dXJuIC9bXkEtWmEtejAtOSBcXC1fJigpLC9dL2c7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIC9bXkEtWmEtejAtOSBcXC1fJigpXS9nO1xyXG4gIH1cclxuXHJcbiAgaXNEaXNhYmxlZCA9IGZhbHNlO1xyXG4gIGNvbnRyb2whOiBGb3JtQ29udHJvbDtcclxuICBpc1Zpc2libGUgPSBzaWduYWwodHJ1ZSk7IC8vIFRyYWNrIHZpc2liaWxpdHkgc3RhdGVcclxuICBoZWxwZXJUZXh0ID0gJyc7XHJcblxyXG4gIC8vIFVzZSBhIGNvdW50ZXItYmFzZWQgYXBwcm9hY2ggZm9yIHVuaXF1ZSBJRHMgKHNhZmVyIHRoYW4gTWF0aC5yYW5kb20oKSlcclxuICBwcml2YXRlIHN0YXRpYyBpZENvdW50ZXIgPSAwO1xyXG4gIHVuaXF1ZUlkID0gYGZuLWlucHV0LSR7KytGTklucHV0LmlkQ291bnRlcn1gO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZmllbGQuaGlkZGVuKSByZXR1cm47XHJcbiAgICB0aGlzLmhlbHBlclRleHQgPSB0aGlzLmZpZWxkLmhlbHBlclRleHQgPz8gJyc7XHJcbiAgICB0aGlzLmluaXRGb3JtQ29udHJvbCgpO1xyXG5cclxuICAgIGlmICh0aGlzLmZpZWxkLnZhbHVlKSB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodGhpcy5maWVsZC52YWx1ZSk7XHJcbiAgICB0aGlzLnNldHVwVmlzaWJpbGl0eUNvbmRpdGlvbigpO1xyXG4gICAgdGhpcy5zZXR1cEZpZWxkTWVzc2FnZUxpc3RlbmVyKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vicy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ2ZpZWxkJ10gfHwgY2hhbmdlc1snZm9ybSddKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQWxsSWNvbnMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBGaWVsZE1lc3NhZ2VMaXN0ZW5lcigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jb250cm9sKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgdmFsJCA9IHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy5jb250cm9sLnZhbHVlKSk7XHJcbiAgICBjb25zdCBzdGF0dXMkID0gdGhpcy5jb250cm9sLnN0YXR1c0NoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy5jb250cm9sLnN0YXR1cykpO1xyXG5cclxuICAgIHRoaXMuc3Vicy5hZGQoXHJcbiAgICAgIG1lcmdlKHZhbCQsIHN0YXR1cyQpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0NEUiBkZXRlY3RDaGFuZ2VzIGZhaWxlZCBkdXJpbmcgZmllbGQgbWVzc2FnZSB1cGRhdGU6JywgZSk7XHJcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIEFjY2VzcyB0aGUgdGV4dGFyZWEgZWxlbWVudCBieSBWaWV3Q2hpbGQgb3IgbmF0aXZlIGVsZW1lbnQgcmVmZXJlbmNlXHJcbiAgICB0aGlzLmF1dG9SZXNpemVJbml0aWFsKCk7XHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSAndGV4dGFyZWEnICYmIHRoaXMuY29udHJvbD8udmFsdWUpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmF1dG9SZXNpemVJbml0aWFsKCksIDMwKTtcclxuICAgIH1cclxuICAgIC8vIEFwcGx5IGluaXRpYWwgZm9ybWF0dGluZyBhZnRlciB2aWV3IGlzIGluaXRpYWxpemVkXHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSAnbnVtYmVyJyAmJiB0aGlzLmZpZWxkLmlzQ3VycmVuY3kgJiYgdGhpcy5jb250cm9sPy52YWx1ZSkge1xyXG4gICAgICB0aGlzLmZvcm1hdEluaXRpYWxDdXJyZW5jeVZhbHVlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBlbmZvcmNlTG93ZXJjYXNlKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGNvbnN0IHN0YXJ0ID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICBjb25zdCBlbmQgPSBpbnB1dC5zZWxlY3Rpb25FbmQ7XHJcblxyXG4gICAgaW5wdXQudmFsdWUgPSBpbnB1dC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKHRoaXMuY29udHJvbCkge1xyXG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoaW5wdXQudmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHRoaXMuZmllbGQubmFtZSwgdmFsdWU6IGlucHV0LnZhbHVlIH0pO1xyXG5cclxuICAgIC8vIHJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uIHNvIHR5cGluZyBpcyBzbW9vdGhcclxuICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGVtYWlsIGlucHV0IC0gYWxsb3dzIG9ubHkgdmFsaWQgZW1haWwgY2hhcmFjdGVycyBhbmQgZW5mb3JjZXMgbG93ZXJjYXNlLlxyXG4gICAqIEFsbG93ZWQ6IGEteiwgMC05LCAuIF8gKyAtIEBcclxuICAgKiBSdWxlczpcclxuICAgKiAtIE9ubHkgb25lIEAgYWxsb3dlZFxyXG4gICAqIC0gTm8gY29uc2VjdXRpdmUgZG90cyAoLi4pXHJcbiAgICogLSBBdXRvbWF0aWMgbG93ZXJjYXNlXHJcbiAgICovXHJcbiAgaGFuZGxlRW1haWxJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBjdXJzb3JQb3NpdGlvbiA9IGlucHV0LnNlbGVjdGlvblN0YXJ0IHx8IDA7XHJcbiAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gaW5wdXQudmFsdWU7XHJcblxyXG4gICAgLy8gMS4gQ29udmVydCB0byBsb3dlcmNhc2VcclxuICAgIGNvbnN0IGxvd2VyVmFsdWUgPSBvcmlnaW5hbFZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgLy8gMi4gU3BsaXQgYXQgdGhlIGZpcnN0IEAgdG8gaGFuZGxlIGxvY2FsIGFuZCBkb21haW4gcGFydHMgc2VwYXJhdGVseVxyXG4gICAgY29uc3QgcGFydHMgPSBsb3dlclZhbHVlLnNwbGl0KCdAJyk7XHJcbiAgICBsZXQgbG9jYWxQYXJ0ID0gcGFydHNbMF07XHJcbiAgICBsZXQgZG9tYWluUGFydCA9IHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0cy5zbGljZSgxKS5qb2luKCcnKSA6IG51bGw7XHJcblxyXG4gICAgLy8gMy4gRmlsdGVyIGxvY2FsIHBhcnQ6IGEteiwgMC05LCAuLCBfLCArLCAtXHJcbiAgICAvLyBSdWxlOiBDYW5ub3Qgc3RhcnQgd2l0aCBhIGRvdCAoLilcclxuICAgIGxvY2FsUGFydCA9IGxvY2FsUGFydC5yZXBsYWNlQWxsKC9bXmEtejAtOS5fKy1dL2csICcnKTtcclxuICAgIHdoaWxlIChsb2NhbFBhcnQuc3RhcnRzV2l0aCgnLicpKSB7XHJcbiAgICAgIGxvY2FsUGFydCA9IGxvY2FsUGFydC5zdWJzdHJpbmcoMSk7XHJcbiAgICB9XHJcbiAgICB3aGlsZSAobG9jYWxQYXJ0LmluY2x1ZGVzKCcuLicpKSB7XHJcbiAgICAgIGxvY2FsUGFydCA9IGxvY2FsUGFydC5yZXBsYWNlQWxsKCcuLicsICcuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNC4gRmlsdGVyIGRvbWFpbiBwYXJ0OiBhLXosIDAtOSwgLiwgLVxyXG4gICAgLy8gUnVsZTogTm8gdW5kZXJzY29yZXMgKF8pLCBubyBwbHVzIHNpZ25zICgrKSwgY2Fubm90IHN0YXJ0IHdpdGggYSBoeXBoZW4gKC0pXHJcbiAgICBsZXQgZmlsdGVyZWRWYWx1ZSA9IGxvY2FsUGFydDtcclxuICAgIGlmIChkb21haW5QYXJ0ICE9PSBudWxsKSB7XHJcbiAgICAgIGRvbWFpblBhcnQgPSBkb21haW5QYXJ0LnJlcGxhY2VBbGwoL1teYS16MC05Li1dL2csICcnKTtcclxuICAgICAgd2hpbGUgKGRvbWFpblBhcnQuc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgZG9tYWluUGFydCA9IGRvbWFpblBhcnQuc3Vic3RyaW5nKDEpO1xyXG4gICAgICB9XHJcbiAgICAgIHdoaWxlIChkb21haW5QYXJ0LmluY2x1ZGVzKCcuLicpKSB7XHJcbiAgICAgICAgZG9tYWluUGFydCA9IGRvbWFpblBhcnQucmVwbGFjZUFsbCgnLi4nLCAnLicpO1xyXG4gICAgICB9XHJcbiAgICAgIGZpbHRlcmVkVmFsdWUgKz0gJ0AnICsgZG9tYWluUGFydDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob3JpZ2luYWxWYWx1ZSAhPT0gZmlsdGVyZWRWYWx1ZSkge1xyXG4gICAgICBjb25zdCBjaGFyc1JlbW92ZWRCZWZvcmVDdXJzb3IgPSB0aGlzLmNvdW50UmVtb3ZlZENoYXJzQmVmb3JlQ3Vyc29yKFxyXG4gICAgICAgIG9yaWdpbmFsVmFsdWUudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICBmaWx0ZXJlZFZhbHVlLFxyXG4gICAgICAgIGN1cnNvclBvc2l0aW9uLFxyXG4gICAgICApO1xyXG4gICAgICBpbnB1dC52YWx1ZSA9IGZpbHRlcmVkVmFsdWU7XHJcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShmaWx0ZXJlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIGNvbnN0IG5ld0N1cnNvclBvcyA9IE1hdGgubWF4KDAsIGN1cnNvclBvc2l0aW9uIC0gY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yKTtcclxuICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UobmV3Q3Vyc29yUG9zLCBuZXdDdXJzb3JQb3MpO1xyXG4gICAgfSBlbHNlIGlmIChvcmlnaW5hbFZhbHVlICE9PSBsb3dlclZhbHVlKSB7XHJcbiAgICAgIC8vIElmIG9ubHkgY2FzZSBjaGFuZ2VkIChlLmcuLCB0eXBlZCBVcHBlcmNhc2UpXHJcbiAgICAgIGlucHV0LnZhbHVlID0gZmlsdGVyZWRWYWx1ZTtcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGZpbHRlcmVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoY3Vyc29yUG9zaXRpb24sIGN1cnNvclBvc2l0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiBmaWx0ZXJlZFZhbHVlIH0pO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIG9uRm9jdXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhhc0ZvY3VzLnNldCh0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0SW5pdGlhbEN1cnJlbmN5VmFsdWUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBudW1lcmljVmFsdWUgPSBOdW1iZXIodGhpcy5jb250cm9sLnZhbHVlKTtcclxuICAgIGlmICghTnVtYmVyLmlzTmFOKG51bWVyaWNWYWx1ZSkpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy51bmlxdWVJZCkgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICBpZiAoaW5wdXRFbGVtZW50KSB7XHJcbiAgICAgICAgICBpbnB1dEVsZW1lbnQudmFsdWUgPSB0aGlzLmZvcm1hdEN1cnJlbmN5V2l0aENvbW1hcyhudW1lcmljVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgNTApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdEZvcm1Db250cm9sKCkge1xyXG4gICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuZm9ybS5jb250cm9scz8uW3RoaXMuZmllbGQubmFtZV07XHJcbiAgICB0aGlzLmNvbnRyb2wgPSBjb250cm9sbGVyIGFzIEZvcm1Db250cm9sO1xyXG4gICAgaWYgKHRoaXMuZmllbGQudmFsdWUpIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh0aGlzLmZpZWxkLnZhbHVlKTtcclxuXHJcbiAgICBpZiAodGhpcy5jb250cm9sKSB7XHJcbiAgICAgIC8vIEhhbmRsZSBkaXNhYmxlZCBzdGF0ZVxyXG4gICAgICBpZiAodGhpcy5maWVsZC5kaXNhYmxlZCA/PyBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMuY29udHJvbD8uZGlzYWJsZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY29udHJvbD8uZW5hYmxlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGF1dG9SZXNpemVJbml0aWFsKCkge1xyXG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnRleHRhcmVhRWxlbWVudD8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmICh0ZXh0YXJlYSkge1xyXG4gICAgICAvLyBHZXQgdGhlIG51bWJlciBvZiByb3dzIChkZWZhdWx0IHRvIDIgaWYgbm90IHNwZWNpZmllZClcclxuICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZmllbGQucm93cyB8fCAxO1xyXG5cclxuICAgICAgLy8gQ2FsY3VsYXRlIGxpbmUgaGVpZ2h0IGZyb20gY29tcHV0ZWQgc3R5bGVzXHJcbiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnbG9iYWxUaGlzLmdldENvbXB1dGVkU3R5bGUodGV4dGFyZWEpO1xyXG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gTnVtYmVyLnBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5saW5lSGVpZ2h0KSB8fCAzMjsgLy8gRGVmYXVsdCB0byAyNHB4IGlmIG5vdCBzZXRcclxuXHJcbiAgICAgIC8vIENhbGN1bGF0ZSBtaW5pbXVtIGhlaWdodCBiYXNlZCBvbiByb3dzXHJcbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IHJvd3MgKiBsaW5lSGVpZ2h0O1xyXG5cclxuICAgICAgLy8gUmVzZXQgaGVpZ2h0IHRvIGF1dG8gdG8gZ2V0IGFjY3VyYXRlIHNjcm9sbEhlaWdodFxyXG4gICAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XHJcblxyXG4gICAgICAvLyBVc2UgdGhlIGxhcmdlciBvZiBzY3JvbGxIZWlnaHQgb3IgbWluSGVpZ2h0XHJcbiAgICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWF4KHRleHRhcmVhLnNjcm9sbEhlaWdodCwgbWluSGVpZ2h0KTtcclxuICAgICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gbmV3SGVpZ2h0ICsgJ3B4JztcclxuICAgICAgdGV4dGFyZWEuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVRleHRBcmVhKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50O1xyXG4gICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBlbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9IGVsZW1lbnQudmFsdWU7XHJcblxyXG4gICAgLy8gQXBwbHkgYWxwaGFudW1lcmljIGZpbHRlcmluZyBpZiBlbmFibGVkXHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSAndGV4dGFyZWEnICYmIHRoaXMuaXNBbHBoYW51bWVyaWMpIHtcclxuICAgICAgLy8gT25seSBhbGxvdyBjaGFyYWN0ZXJzIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBwYXR0ZXJuXHJcbiAgICAgIGNvbnN0IGFscGhhbnVtZXJpY1BhdHRlcm4gPSB0aGlzLmFscGhhbnVtZXJpY1BhdHRlcm47XHJcbiAgICAgIGxldCBmaWx0ZXJlZFZhbHVlID0gb3JpZ2luYWxWYWx1ZS5yZXBsYWNlQWxsKGFscGhhbnVtZXJpY1BhdHRlcm4sICcnKTtcclxuXHJcbiAgICAgIC8vIFByZXZlbnQgbGVhZGluZyBzcGFjZXNcclxuICAgICAgaWYgKGZpbHRlcmVkVmFsdWUuc3RhcnRzV2l0aCgnICcpKSB7XHJcbiAgICAgICAgZmlsdGVyZWRWYWx1ZSA9IGZpbHRlcmVkVmFsdWUudHJpbVN0YXJ0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFJlcGxhY2UgbXVsdGlwbGUgY29uc2VjdXRpdmUgc3BhY2VzIHdpdGggc2luZ2xlIHNwYWNlXHJcbiAgICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnJlcGxhY2VBbGwoL1xcc3syLH0vZywgJyAnKTtcclxuXHJcbiAgICAgIGlmIChvcmlnaW5hbFZhbHVlICE9PSBmaWx0ZXJlZFZhbHVlKSB7XHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1vdmVkIGJlZm9yZSB0aGUgY3Vyc29yIHBvc2l0aW9uXHJcbiAgICAgICAgY29uc3QgY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yID0gb3JpZ2luYWxWYWx1ZS5sZW5ndGggLSBmaWx0ZXJlZFZhbHVlLmxlbmd0aDtcclxuICAgICAgICBlbGVtZW50LnZhbHVlID0gZmlsdGVyZWRWYWx1ZTtcclxuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoZmlsdGVyZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIC8vIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uIC0gYWNjb3VudCBmb3IgcmVtb3ZlZCBjaGFyYWN0ZXJzXHJcbiAgICAgICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gTWF0aC5tYXgoMCwgKGN1cnNvclBvc2l0aW9uIHx8IDApIC0gY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yKTtcclxuICAgICAgICBlbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKG5ld0N1cnNvclBvcywgbmV3Q3Vyc29yUG9zKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaW5jcmVhc2UgaGVpZ2h0XHJcbiAgICAgIHRoaXMuYXV0b1Jlc2l6ZUluaXRpYWwoKTtcclxuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogZmlsdGVyZWRWYWx1ZSB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBmaWx0ZXJlZFZhbHVlID0gb3JpZ2luYWxWYWx1ZTtcclxuXHJcbiAgICAgIC8vIFN0cmljdCBmaWx0ZXJpbmcgaWYgIWlzQWxwaGFudW1lcmljXHJcbiAgICAgIGlmICghdGhpcy5pc0FscGhhbnVtZXJpYykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdpc0FscGhhbnVtZXJpYycsIHRoaXMuaXNBbHBoYW51bWVyaWMpO1xyXG5cclxuICAgICAgICBjb25zdCBhbGxvd2VkUGF0dGVybiA9IC9bXmEtekEtWjAtOVxccygpe31bXFxdOywuXCI9JytcXC0qLzw+ISZ8JV9AJD86XS9nO1xyXG4gICAgICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnJlcGxhY2VBbGwoYWxsb3dlZFBhdHRlcm4sICcnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUHJldmVudCBsZWFkaW5nIHNwYWNlc1xyXG4gICAgICBpZiAoZmlsdGVyZWRWYWx1ZS5zdGFydHNXaXRoKCcgJykpIHtcclxuICAgICAgICBmaWx0ZXJlZFZhbHVlID0gZmlsdGVyZWRWYWx1ZS50cmltU3RhcnQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmVwbGFjZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXMgd2l0aCBzaW5nbGUgc3BhY2VcclxuICAgICAgZmlsdGVyZWRWYWx1ZSA9IGZpbHRlcmVkVmFsdWUucmVwbGFjZUFsbCgvXFxzezIsfS9nLCAnICcpO1xyXG5cclxuICAgICAgaWYgKG9yaWdpbmFsVmFsdWUgIT09IGZpbHRlcmVkVmFsdWUpIHtcclxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbW92ZWQgYmVmb3JlIHRoZSBjdXJzb3IgcG9zaXRpb25cclxuICAgICAgICBjb25zdCBjaGFyc1JlbW92ZWRCZWZvcmVDdXJzb3IgPSBvcmlnaW5hbFZhbHVlLmxlbmd0aCAtIGZpbHRlcmVkVmFsdWUubGVuZ3RoO1xyXG4gICAgICAgIGVsZW1lbnQudmFsdWUgPSBmaWx0ZXJlZFZhbHVlO1xyXG4gICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShmaWx0ZXJlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgLy8gUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gLSBhY2NvdW50IGZvciByZW1vdmVkIGNoYXJhY3RlcnNcclxuICAgICAgICBjb25zdCBuZXdDdXJzb3JQb3MgPSBNYXRoLm1heCgwLCAoY3Vyc29yUG9zaXRpb24gfHwgMCkgLSBjaGFyc1JlbW92ZWRCZWZvcmVDdXJzb3IpO1xyXG4gICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UobmV3Q3Vyc29yUG9zLCBuZXdDdXJzb3JQb3MpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBpbmNyZWFzZSBoZWlnaHRcclxuICAgICAgdGhpcy5hdXRvUmVzaXplSW5pdGlhbCgpO1xyXG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiBmaWx0ZXJlZFZhbHVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSB0YXJnZXQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gdGFyZ2V0LnZhbHVlO1xyXG5cclxuICAgIGxldCBmaWx0ZXJlZFZhbHVlID0gb3JpZ2luYWxWYWx1ZTtcclxuXHJcbiAgICAvLyBJRiBOT1QgYWxwaGFudW1lcmljLCB1c2VyIHdhbnRzIHN0cmljdCBmaWx0ZXJpbmc6XHJcbiAgICAvLyBcIm9ubHkgYWNjZXB0IHRpaHMuKSB7fSBbXSA7ICwgLiBcIiAnID0gKyAtICogLyA8ID4gISAmIHwgJSAmXyggKS0vLjtAISwgJCUgOiBkb250IGFsbG93IGVtb2ppXCJcclxuICAgIC8vIEludGVycHJldGF0aW9uOiBBbGxvdyBhbHBoYW51bWVyaWMgKyBzcGVjaWZpZWQgc3BlY2lhbCBjaGFycy4gQmFuIGVtb2ppcy5cclxuICAgIC8vIEFjdHVhbGx5LCB0aGUgdXNlciBzYWlkOiBcImlmIGlzQWxwaGFudW1lcmljIGZhbHNlIG9ubHkgYWNjZXB0Li4uXCJcclxuICAgIC8vIFNvIGlmIGlzQWxwaGFudW1lcmljIGlzIFRSVUUsIHdlIHVzZSB0aGUgZXhpc3RpbmcgaGFuZGxlQWxwaGFudW1lcmljSW5wdXQgbG9naWMgKG9yIHNpbWlsYXIpLlxyXG4gICAgLy8gVGhlIGN1cnJlbnQgbG9naWMgaW4gaGFuZGxlSW5wdXQgaXMgZ2VuZXJpYy5cclxuICAgIC8vIFRoZSBleGlzdGluZyBjb2RlIGhhcyBhIHNlcGFyYXRlIGBoYW5kbGVBbHBoYW51bWVyaWNJbnB1dGAgbWV0aG9kIGJ1dCBpdCdzIG5vdCBjYWxsZWQgaGVyZT9cclxuICAgIC8vIFdhaXQsIHRoZSB0ZW1wbGF0ZSBsaWtlbHkgY2FsbHMgYGhhbmRsZUFscGhhbnVtZXJpY0lucHV0YCBpZiBgaXNBbHBoYW51bWVyaWNgIGlzIHRydWUsIG9yIGBoYW5kbGVJbnB1dGAgb3RoZXJ3aXNlP1xyXG4gICAgLy8gTGV0J3MgY2hlY2sgdGhlIHRlbXBsYXRlLlxyXG4gICAgLy8gQlVUIGFzc3VtaW5nIGBoYW5kbGVJbnB1dGAgaXMgdGhlIGdlbmVyaWMgaGFuZGxlcjpcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNBbHBoYW51bWVyaWMpIHtcclxuICAgICAgLy8gUmVnZXggdG8gYWxsb3c6IGEteiwgQS1aLCAwLTksIGFuZDogKSB7fSBbXSA7ICwgLiBcIiAnID0gKyAtICogLyA8ID4gISAmIHwgJSBfICggLSBAICQgPyA6XHJcbiAgICAgIC8vIE5vdGU6IFVzZXIgbGlzdDogKSB7fSBbXSA7ICwgLiBcIiAnID0gKyAtICogLyA8ID4gISAmIHwgJSAmXyggKS0vLjtAISwgJCVcclxuICAgICAgLy8gQ29tYmluZWQgdW5pcXVlIHNwZWNpYWwgY2hhcnM6ICkgeyB9IFsgXSA7ICwgLiBcIiAnID0gKyAtICogLyA8ID4gISAmIHwgJSBfICggQCAkID8gOlxyXG4gICAgICAvLyBBbHNvIHNwYWNlIGlzIGltcGxpZWQ/IHVzdWFsbHkgeWVzLlxyXG4gICAgICAvLyBBbmQgTk8gRU1PSklTLlxyXG4gICAgICAvLyBlYXNpZXIgdG8ganVzdCByZXBsYWNlIGFueXRoaW5nIE5PVCBpbiB0aGUgYWxsb3dlZCBzZXQuXHJcblxyXG4gICAgICAvLyBBbGxvd2VkIGNoYXJzIHJlZ2V4IHBhdHRlcm46XHJcbiAgICAgIC8vIEEtWmEtejAtOVxyXG4gICAgICAvLyBTcGFjZTogXFxzXHJcbiAgICAgIC8vIFNwZWNpYWw6ICgpe31bXFxdOywuXCI9JytcXC0qLzw+ISZ8JV9AJD86XHJcbiAgICAgIC8vIE5vdGU6IC0gaW5zaWRlIFtdIG5lZWRzIHRvIGJlIGVzY2FwZWQgb3IgYXQgZW5kLiBdIG5lZWRzIGVzY2FwZS4gXFwgbmVlZHMgZXNjYXBlPyAobm90IGluIGxpc3QpLlxyXG4gICAgICAvLyBVc2VyIGxpc3QgaGFzOiBgLmAgYFwiYCBgJ2AgYD9gICh3YWl0LCA/IG5vdCBpbiBsaXN0PylcclxuICAgICAgLy8gVXNlciBsaXN0OiBgKSB7fSBbXSA7ICwgLiBcIiAnID0gKyAtICogLyA8ID4gISAmIHwgJSAmXyggKS0vLjtAISwgJCVgXHJcbiAgICAgIC8vIFVuaXF1ZXM6ICkgeyB9IFsgXSA7ICwgLiBcIiAnID0gKyAtICogLyA8ID4gISAmIHwgJSBfICggQCAkXHJcbiAgICAgIC8vIChUaGUgYCZgIGlzIHJlcGVhdGVkLCBgLmAgcmVwZWF0ZWQsIGAsYCByZXBlYXRlZCBldGMuKVxyXG4gICAgICAvLyBJIHdpbGwgY3JlYXRlIGEgcmVnZXggdGhhdCBtYXRjaGVzIGFueXRoaW5nIE5PVCBpbiB0aGlzIGxpc3QgYW5kIHJlcGxhY2Ugd2l0aCBlbXB0eSBzdHJpbmcuXHJcblxyXG4gICAgICAvLyBbXmEtekEtWjAtOVxccygpe31bXFxdOywuXCI9JytcXC0qLzw+ISZ8JV9AJF1cclxuICAgICAgLy8gTm90ZTogYCpgLCBgK2AsIGA/YCBldGMgbmVlZCBlc2NhcGluZyBpbiByZWdleCBpZiBvdXRzaWRlIFtdLCBidXQgaW5zaWRlIFtdIHRoZXkgYXJlIGxpdGVyYWxzIG1vc3RseS5cclxuICAgICAgLy8gYC1gIG5lZWRzIHRvIGJlIGxhc3Qgb3IgZXNjYXBlZC4gYF1gIG5lZWRzIGVzY2FwZS4gYF5gIG5lZWRzIGVzY2FwZSBpZiBmaXJzdD8gTm8sIGludmFsaWQgaGVyZS5cclxuICAgICAgLy8gTGV0J3MgdmVyaWZ5IHZhbGlkIGNoYXJzOlxyXG4gICAgICAvLyBhLXogQS1aIDAtOVxyXG4gICAgICAvLyBzcGFjZVxyXG4gICAgICAvLyApIHsgfSBbIF0gOyAsIC4gXCIgJyA9ICsgLSAqIC8gPCA+ICEgJiB8ICUgXyAoIEAgJCA6XHJcblxyXG4gICAgICBjb25zdCBhbGxvd2VkUGF0dGVybiA9IC9bXmEtekEtWjAtOVxccygpe31bXFxdOywuXCI9JytcXC0qLzw+ISZ8JV9AJD86XS9nO1xyXG4gICAgICBmaWx0ZXJlZFZhbHVlID0gZmlsdGVyZWRWYWx1ZS5yZXBsYWNlQWxsKGFsbG93ZWRQYXR0ZXJuLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJldmVudCBsZWFkaW5nIHNwYWNlc1xyXG4gICAgaWYgKGZpbHRlcmVkVmFsdWUuc3RhcnRzV2l0aCgnICcpKSB7XHJcbiAgICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnRyaW1TdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlcGxhY2VBbGwgbXVsdGlwbGUgY29uc2VjdXRpdmUgc3BhY2VzIHdpdGggc2luZ2xlIHNwYWNlXHJcbiAgICBmaWx0ZXJlZFZhbHVlID0gZmlsdGVyZWRWYWx1ZS5yZXBsYWNlQWxsKC9cXHN7Mix9L2csICcgJyk7XHJcblxyXG4gICAgaWYgKG9yaWdpbmFsVmFsdWUgIT09IGZpbHRlcmVkVmFsdWUpIHtcclxuICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1vdmVkIGJlZm9yZSB0aGUgY3Vyc29yIHBvc2l0aW9uXHJcbiAgICAgIGNvbnN0IGNoYXJzUmVtb3ZlZEJlZm9yZUN1cnNvciA9IG9yaWdpbmFsVmFsdWUubGVuZ3RoIC0gZmlsdGVyZWRWYWx1ZS5sZW5ndGg7XHJcbiAgICAgIHRhcmdldC52YWx1ZSA9IGZpbHRlcmVkVmFsdWU7XHJcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShmaWx0ZXJlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIC8vIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uIC0gYWNjb3VudCBmb3IgcmVtb3ZlZCBjaGFyYWN0ZXJzXHJcbiAgICAgIGNvbnN0IG5ld0N1cnNvclBvcyA9IE1hdGgubWF4KDAsIChjdXJzb3JQb3NpdGlvbiB8fCAwKSAtIGNoYXJzUmVtb3ZlZEJlZm9yZUN1cnNvcik7XHJcbiAgICAgIHRhcmdldC5zZXRTZWxlY3Rpb25SYW5nZShuZXdDdXJzb3JQb3MsIG5ld0N1cnNvclBvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVHJhaWxpbmcgc3BhY2VzIHdpbGwgYmUgdHJpbW1lZCBvbiBibHVyLCBub3QgZHVyaW5nIGlucHV0XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiBmaWx0ZXJlZFZhbHVlIH0pO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBhbHBoYW51bWVyaWMgaW5wdXQgLSBhbGxvd3Mgb25seSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgc3BlY2lmaWMgc3BlY2lhbCBjaGFyYWN0ZXJzXHJcbiAgICogQWxsb3dlZDogQS1aLCBhLXosIDAtOSwgc3BhY2UsIGh5cGhlbiwgdW5kZXJzY29yZSwgYW1wZXJzYW5kLCBhbmQgcGFyZW50aGVzZXNcclxuICAgKiBBbHNvIHByZXZlbnRzIGxlYWRpbmcgc3BhY2VzIGFuZCBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXNcclxuICAgKi9cclxuICBoYW5kbGVBbHBoYW51bWVyaWNJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSB0YXJnZXQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gdGFyZ2V0LnZhbHVlO1xyXG5cclxuICAgIC8vIE9ubHkgYWxsb3cgY2hhcmFjdGVycyBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgcGF0dGVyblxyXG4gICAgY29uc3QgYWxwaGFudW1lcmljUGF0dGVybiA9IHRoaXMuYWxwaGFudW1lcmljUGF0dGVybjtcclxuICAgIGxldCBmaWx0ZXJlZFZhbHVlID0gb3JpZ2luYWxWYWx1ZS5yZXBsYWNlQWxsKGFscGhhbnVtZXJpY1BhdHRlcm4sICcnKTtcclxuXHJcbiAgICAvLyBQcmV2ZW50IGxlYWRpbmcgc3BhY2VzXHJcbiAgICBpZiAoZmlsdGVyZWRWYWx1ZS5zdGFydHNXaXRoKCcgJykpIHtcclxuICAgICAgZmlsdGVyZWRWYWx1ZSA9IGZpbHRlcmVkVmFsdWUudHJpbVN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVwbGFjZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXMgd2l0aCBzaW5nbGUgc3BhY2VcclxuICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnJlcGxhY2VBbGwoL1xcc3syLH0vZywgJyAnKTtcclxuXHJcbiAgICBpZiAob3JpZ2luYWxWYWx1ZSAhPT0gZmlsdGVyZWRWYWx1ZSkge1xyXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbW92ZWQgYmVmb3JlIHRoZSBjdXJzb3IgcG9zaXRpb25cclxuICAgICAgY29uc3QgY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yID0gb3JpZ2luYWxWYWx1ZS5sZW5ndGggLSBmaWx0ZXJlZFZhbHVlLmxlbmd0aDtcclxuICAgICAgdGFyZ2V0LnZhbHVlID0gZmlsdGVyZWRWYWx1ZTtcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGZpbHRlcmVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgLy8gUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gLSBhY2NvdW50IGZvciByZW1vdmVkIGNoYXJhY3RlcnNcclxuICAgICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gTWF0aC5tYXgoMCwgKGN1cnNvclBvc2l0aW9uIHx8IDApIC0gY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yKTtcclxuICAgICAgdGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKG5ld0N1cnNvclBvcywgbmV3Q3Vyc29yUG9zKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiBmaWx0ZXJlZFZhbHVlIH0pO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUJsdXIoZTogRXZlbnQsIG1heERlY2ltYWxzOiBudW1iZXIgPSAyKTogdm9pZCB7XHJcbiAgICB0aGlzLmhhc0ZvY3VzLnNldChmYWxzZSk7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudDtcclxuICAgIGNvbnN0IGNsZWFuVmFsdWVTdHJpbmcgPSB0YXJnZXQudmFsdWU7XHJcblxyXG4gICAgaWYgKCFjbGVhblZhbHVlU3RyaW5nKSB7XHJcbiAgICAgIHRoaXMuZmllbGRCbHVyLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiAnJyB9KTtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGVsZWdhdGUgdG8gdHlwZS1zcGVjaWZpYyBoYW5kbGVyc1xyXG4gICAgaWYgKHRoaXMuZmllbGQudHlwZSA9PT0gJ3RleHQnIHx8IHRoaXMuZmllbGQudHlwZSA9PT0gJ3RleHRhcmVhJykge1xyXG4gICAgICB0aGlzLmhhbmRsZVRleHRGaWVsZEJsdXIodGFyZ2V0LCBjbGVhblZhbHVlU3RyaW5nKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5maWVsZC50eXBlID09PSAnbnVtYmVyJykge1xyXG4gICAgICB0aGlzLmhhbmRsZU51bWJlckZpZWxkQmx1cih0YXJnZXQsIGNsZWFuVmFsdWVTdHJpbmcsIG1heERlY2ltYWxzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFbWl0IGZpbmFsIHZhbHVlXHJcbiAgICB0aGlzLmZpZWxkQmx1ci5lbWl0KHtcclxuICAgICAgbmFtZTogdGhpcy5maWVsZC5uYW1lLFxyXG4gICAgICB2YWx1ZTogdGFyZ2V0LnZhbHVlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgYmx1ciBmb3IgdGV4dCBhbmQgdGV4dGFyZWEgZmllbGRzIC0gdHJpbSB0cmFpbGluZyBzcGFjZXNcclxuICAgKi9cclxuICBwcml2YXRlIGhhbmRsZVRleHRGaWVsZEJsdXIoXHJcbiAgICB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50LFxyXG4gICAgY2xlYW5WYWx1ZVN0cmluZzogc3RyaW5nLFxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgdHJpbW1lZCA9IGNsZWFuVmFsdWVTdHJpbmcudHJpbSgpO1xyXG4gICAgaWYgKGNsZWFuVmFsdWVTdHJpbmcgIT09IHRyaW1tZWQpIHtcclxuICAgICAgdGFyZ2V0LnZhbHVlID0gdHJpbW1lZDtcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHRyaW1tZWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBibHVyIGZvciBudW1iZXIgZmllbGRzIC0gdmFsaWRhdGUgYW5kIGZvcm1hdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFuZGxlTnVtYmVyRmllbGRCbHVyKFxyXG4gICAgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCxcclxuICAgIGNsZWFuVmFsdWVTdHJpbmc6IHN0cmluZyxcclxuICAgIG1heERlY2ltYWxzOiBudW1iZXIsXHJcbiAgKTogdm9pZCB7XHJcbiAgICAvLyBSZW1vdmUgY29tbWFzIGZvciBwYXJzaW5nL3ZhbGlkYXRpb25cclxuICAgIGNvbnN0IG51bVN0cmluZyA9IGNsZWFuVmFsdWVTdHJpbmcucmVwbGFjZUFsbCgnLCcsICcnKTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgbnVtYmVyIGZvcm1hdFxyXG4gICAgY29uc3QgaXNWYWxpZE51bWJlckZvcm1hdCA9IC9eLT9cXGQrKFxcLlxcZCspPyQvLnRlc3QobnVtU3RyaW5nKTtcclxuXHJcbiAgICAvLyBJZiBub3QgYSB2YWxpZCBudW1iZXIgZm9ybWF0LCBjbGVhciB0aGUgZmllbGRcclxuICAgIGlmICghaXNWYWxpZE51bWJlckZvcm1hdCkge1xyXG4gICAgICB0YXJnZXQudmFsdWUgPSAnJztcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKCcnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvcm1hdCBjdXJyZW5jeSBmaWVsZHMgb3Igc2V0IHJhdyB2YWx1ZSBmb3Igbm9uLWN1cnJlbmN5XHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSAnbnVtYmVyJyAmJiB0aGlzLmZpZWxkLmlzQ3VycmVuY3kpIHtcclxuICAgICAgdGhpcy5wcm9jZXNzQ3VycmVuY3lWYWx1ZSh0YXJnZXQsIG51bVN0cmluZywgbWF4RGVjaW1hbHMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gTm9uLWN1cnJlbmN5OiBwcmVzZXJ2ZSB0aGUgcmF3IHN0cmluZyB2YWx1ZVxyXG4gICAgICB0YXJnZXQudmFsdWUgPSBudW1TdHJpbmc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQcm9jZXNzIGN1cnJlbmN5IHZhbHVlIC0gaGFuZGxlIGZvcm1hdHRpbmcgYW5kIGRlY2ltYWwgcGxhY2VzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwcm9jZXNzQ3VycmVuY3lWYWx1ZShcclxuICAgIHRhcmdldDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQsXHJcbiAgICBudW1TdHJpbmc6IHN0cmluZyxcclxuICAgIG1heERlY2ltYWxzOiBudW1iZXIsXHJcbiAgKTogdm9pZCB7XHJcbiAgICAvLyBIYW5kbGUgbmVnYXRpdmUgdmFsdWVzIC0gY29udmVydCB0byBwb3NpdGl2ZVxyXG4gICAgbGV0IHByb2Nlc3NlZFZhbHVlID0gbnVtU3RyaW5nLnN0YXJ0c1dpdGgoJy0nKSA/IG51bVN0cmluZy5zdWJzdHJpbmcoMSkgOiBudW1TdHJpbmc7XHJcblxyXG4gICAgLy8gSGFuZGxlIGVkZ2UgY2FzZSBvZiBcIi0wXCIgb3IganVzdCBcIi1cIlxyXG4gICAgaWYgKHByb2Nlc3NlZFZhbHVlID09PSAnJyB8fCBwcm9jZXNzZWRWYWx1ZSA9PT0gJzAnKSB7XHJcbiAgICAgIHByb2Nlc3NlZFZhbHVlID0gJzAnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvcm1hdCB0aGUgdmFsdWUgd2l0aCBwcm9wZXIgZGVjaW1hbCBwbGFjZXNcclxuICAgIGNvbnN0IGNsZWFuVmFsdWVTdHJpbmcgPSB0aGlzLmZvcm1hdERlY2ltYWxQbGFjZXMocHJvY2Vzc2VkVmFsdWUsIG1heERlY2ltYWxzKTtcclxuXHJcbiAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuZm9ybWF0Q3VycmVuY3lXaXRoQ29tbWFzKGNsZWFuVmFsdWVTdHJpbmcsIG1heERlY2ltYWxzKTtcclxuXHJcbiAgICAvLyBVcGRhdGUgdGhlIGNvbnRyb2wgdmFsdWUgd2l0aCB0aGUgbnVtZXJpYyBzdHJpbmcgKG5vdCBmb3JtYXR0ZWQpXHJcbiAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoY2xlYW5WYWx1ZVN0cmluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cclxuICAgIC8vIFRyaWdnZXIgdmFsaWRhdG9ycyBhbmQgbWFyayBhcyB0b3VjaGVkXHJcbiAgICB0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuXHJcbiAgICAvLyBTZXQgZGlzcGxheSB2YWx1ZSB3aXRoIGNvbW1hcyBhZnRlciBBbmd1bGFyJ3MgZm9ybSBjb250cm9sIHVwZGF0ZVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRhcmdldC52YWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3JtYXQgZGVjaW1hbCBwbGFjZXMgLSBwYWQgb3IgdHJ1bmNhdGUgdG8gbWF4RGVjaW1hbHNcclxuICAgKi9cclxuICBwcml2YXRlIGZvcm1hdERlY2ltYWxQbGFjZXModmFsdWU6IHN0cmluZywgbWF4RGVjaW1hbHM6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgW2ludFBhcnQsIGRlY1BhcnRdID0gdmFsdWUuaW5jbHVkZXMoJy4nKSA/IHZhbHVlLnNwbGl0KCcuJykgOiBbdmFsdWUsICcnXTtcclxuXHJcbiAgICAvLyBQYWQgb3IgdHJ1bmNhdGUgZGVjaW1hbCBwYXJ0IHRvIG1heERlY2ltYWxzXHJcbiAgICBpZiAoZGVjUGFydC5sZW5ndGggPCBtYXhEZWNpbWFscykge1xyXG4gICAgICBkZWNQYXJ0ID0gZGVjUGFydC5wYWRFbmQobWF4RGVjaW1hbHMsICcwJyk7XHJcbiAgICB9IGVsc2UgaWYgKGRlY1BhcnQubGVuZ3RoID4gbWF4RGVjaW1hbHMpIHtcclxuICAgICAgZGVjUGFydCA9IGRlY1BhcnQuc2xpY2UoMCwgbWF4RGVjaW1hbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEJ1aWxkIHRoZSBjbGVhbiB2YWx1ZSBzdHJpbmcgKHdpdGhvdXQgY29tbWFzKVxyXG4gICAgcmV0dXJuIG1heERlY2ltYWxzID4gMCA/IGAke2ludFBhcnR9LiR7ZGVjUGFydH1gIDogaW50UGFydDtcclxuICB9XHJcblxyXG4gIGhhbmRsZU51bWJlcklucHV0KGV2ZW50OiBFdmVudCwgbWF4RGVjaW1hbHM6IG51bWJlciA9IDIpOiB2b2lkIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9IHRhcmdldC52YWx1ZTtcclxuICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gdGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID8/IDA7XHJcblxyXG4gICAgLy8gU3RlcCAxOiBGaWx0ZXIgYW5kIGZvcm1hdCB0aGUgaW5wdXQgdmFsdWVcclxuICAgIGxldCB2YWx1ZSA9IHRoaXMuZmlsdGVyTnVtZXJpY0lucHV0KHRhcmdldC52YWx1ZSwgbWF4RGVjaW1hbHMpO1xyXG5cclxuICAgIC8vIFN0ZXAgMjogVXBkYXRlIGN1cnNvciBwb3NpdGlvbiBpZiB2YWx1ZSBjaGFuZ2VkXHJcbiAgICB0aGlzLnVwZGF0ZUN1cnNvclBvc2l0aW9uQWZ0ZXJGaWx0ZXIodGFyZ2V0LCBvcmlnaW5hbFZhbHVlLCB2YWx1ZSwgY3Vyc29yUG9zaXRpb24pO1xyXG5cclxuICAgIC8vIFN0ZXAgMzogVXBkYXRlIGZvcm0gY29udHJvbCBhbmQgdmFsaWRhdGVcclxuICAgIHRoaXMudXBkYXRlRm9ybUNvbnRyb2xWYWx1ZSh2YWx1ZSwgbWF4RGVjaW1hbHMpO1xyXG5cclxuICAgIC8vIFN0ZXAgNDogRW1pdCBjaGFuZ2VzXHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiB0YXJnZXQudmFsdWUgfSk7XHJcbiAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmlsdGVyIG51bWVyaWMgaW5wdXQgdG8gb25seSBhbGxvdyBkaWdpdHMgYW5kIGRlY2ltYWwgcG9pbnRcclxuICAgKiBFbnN1cmVzIG9ubHkgb25lIGRlY2ltYWwgcG9pbnQgYW5kIGVuZm9yY2VzIG1heCBkZWNpbWFsIHBsYWNlc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZmlsdGVyTnVtZXJpY0lucHV0KHZhbHVlOiBzdHJpbmcsIG1heERlY2ltYWxzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgLy8gUmVtb3ZlIEFMTCBub24tbnVtZXJpYyBjaGFyYWN0ZXJzIGV4Y2VwdCBkZWNpbWFsIHBvaW50XHJcbiAgICBsZXQgZmlsdGVyZWQgPSB2YWx1ZS5yZXBsYWNlQWxsKC9bXjAtOS5dL2csICcnKTtcclxuXHJcbiAgICAvLyBFbnN1cmUgb25seSBvbmUgZGVjaW1hbCBwb2ludFxyXG4gICAgZmlsdGVyZWQgPSB0aGlzLmZpbHRlckRlY2ltYWxQb2ludHMoZmlsdGVyZWQpO1xyXG5cclxuICAgIC8vIFJlc3RyaWN0IHRvIG1heERlY2ltYWxzIGRlY2ltYWwgcGxhY2VzIGlmIGRlY2ltYWwgZXhpc3RzXHJcbiAgICBmaWx0ZXJlZCA9IHRoaXMuZW5mb3JjZURlY2ltYWxMaW1pdChmaWx0ZXJlZCwgbWF4RGVjaW1hbHMpO1xyXG5cclxuICAgIHJldHVybiBmaWx0ZXJlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVuc3VyZSBvbmx5IG9uZSBkZWNpbWFsIHBvaW50IGV4aXN0cyBpbiB0aGUgdmFsdWVcclxuICAgKi9cclxuICBwcml2YXRlIGZpbHRlckRlY2ltYWxQb2ludHModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNwbGl0KCcuJyk7XHJcbiAgICBpZiAocGFydHMubGVuZ3RoID4gMikge1xyXG4gICAgICByZXR1cm4gcGFydHNbMF0gKyAnLicgKyBwYXJ0cy5zbGljZSgxKS5qb2luKCcnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVuZm9yY2UgbWF4aW11bSBkZWNpbWFsIHBsYWNlcyBsaW1pdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZW5mb3JjZURlY2ltYWxMaW1pdCh2YWx1ZTogc3RyaW5nLCBtYXhEZWNpbWFsczogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGlmICghdmFsdWUuaW5jbHVkZXMoJy4nKSkge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgW2ludGVnZXJQYXJ0LCBkZWNpbWFsUGFydF0gPSB2YWx1ZS5zcGxpdCgnLicpO1xyXG4gICAgaWYgKGRlY2ltYWxQYXJ0ICYmIGRlY2ltYWxQYXJ0Lmxlbmd0aCA+IG1heERlY2ltYWxzKSB7XHJcbiAgICAgIHJldHVybiBpbnRlZ2VyUGFydCArICcuJyArIGRlY2ltYWxQYXJ0LnNsaWNlKDAsIG1heERlY2ltYWxzKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgZmlsdGVyaW5nIGlucHV0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVDdXJzb3JQb3NpdGlvbkFmdGVyRmlsdGVyKFxyXG4gICAgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50LFxyXG4gICAgb3JpZ2luYWxWYWx1ZTogc3RyaW5nLFxyXG4gICAgbmV3VmFsdWU6IHN0cmluZyxcclxuICAgIGN1cnNvclBvc2l0aW9uOiBudW1iZXIsXHJcbiAgKTogdm9pZCB7XHJcbiAgICBpZiAodGFyZ2V0LnZhbHVlID09PSBuZXdWYWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yID0gdGhpcy5jb3VudFJlbW92ZWRDaGFyc0JlZm9yZUN1cnNvcihcclxuICAgICAgb3JpZ2luYWxWYWx1ZSxcclxuICAgICAgbmV3VmFsdWUsXHJcbiAgICAgIGN1cnNvclBvc2l0aW9uLFxyXG4gICAgKTtcclxuICAgIHRhcmdldC52YWx1ZSA9IG5ld1ZhbHVlO1xyXG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSBNYXRoLm1heCgwLCBjdXJzb3JQb3NpdGlvbiAtIGNoYXJzUmVtb3ZlZEJlZm9yZUN1cnNvcik7XHJcbiAgICB0YXJnZXQuc2V0U2VsZWN0aW9uUmFuZ2UobmV3UG9zaXRpb24sIG5ld1Bvc2l0aW9uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBmb3JtIGNvbnRyb2wgdmFsdWUgYW5kIHBlcmZvcm0gdmFsaWRhdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlRm9ybUNvbnRyb2xWYWx1ZSh2YWx1ZTogc3RyaW5nLCBtYXhEZWNpbWFsczogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIHRoaXMudmFsaWRhdGVJbnRlZ2VyRGlnaXRzKHZhbHVlLCBtYXhEZWNpbWFscyk7XHJcbiAgICB0aGlzLmNsZWFyTnVtZXJpY0Vycm9yKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb3VudCBob3cgbWFueSBjaGFyYWN0ZXJzIHdlcmUgcmVtb3ZlZCBiZWZvcmUgdGhlIGN1cnNvciBwb3NpdGlvblxyXG4gICAqIFRoaXMgaGVscHMgbWFpbnRhaW4gY29ycmVjdCBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgZmlsdGVyaW5nIGlucHV0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb3VudFJlbW92ZWRDaGFyc0JlZm9yZUN1cnNvcihcclxuICAgIG9yaWdpbmFsOiBzdHJpbmcsXHJcbiAgICBmaWx0ZXJlZDogc3RyaW5nLFxyXG4gICAgY3Vyc29yUG9zOiBudW1iZXIsXHJcbiAgKTogbnVtYmVyIHtcclxuICAgIGxldCByZW1vdmVkQ291bnQgPSAwO1xyXG4gICAgbGV0IGZpbHRlcmVkSW5kZXggPSAwO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3Vyc29yUG9zICYmIGkgPCBvcmlnaW5hbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoZmlsdGVyZWRJbmRleCA8IGZpbHRlcmVkLmxlbmd0aCAmJiBvcmlnaW5hbFtpXSA9PT0gZmlsdGVyZWRbZmlsdGVyZWRJbmRleF0pIHtcclxuICAgICAgICBmaWx0ZXJlZEluZGV4Kys7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVtb3ZlZENvdW50Kys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVtb3ZlZENvdW50O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHBhc3RlIGV2ZW50IGZvciBudW1iZXIgaW5wdXRzXHJcbiAgICogUHJldmVudHMgcGFzdGluZyBvZiBub24tbnVtZXJpYyBjaGFyYWN0ZXJzIGFuZCBlbmZvcmNlcyBkaWdpdCBsaW1pdHNcclxuICAgKi9cclxuICBoYW5kbGVOdW1iZXJQYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQsIG1heERlY2ltYWxzOiBudW1iZXIgPSAyKTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZXZlbnQuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YSgndGV4dCcpIHx8ICcnO1xyXG4gICAgY29uc3QgaXNDdXJyZW5jeSA9IHRoaXMuZmllbGQudHlwZSA9PT0gJ251bWJlcicgJiYgISF0aGlzLmZpZWxkLmlzQ3VycmVuY3k7XHJcblxyXG4gICAgY29uc3QgZmlsdGVyZWRUZXh0ID0gaXNDdXJyZW5jeVxyXG4gICAgICA/IHRoaXMuZ2V0RmlsdGVyZWRDdXJyZW5jeVBhc3RlZFRleHQocGFzdGVkVGV4dClcclxuICAgICAgOiB0aGlzLmdldEZpbHRlcmVkSW50ZWdlclBhc3RlZFRleHQocGFzdGVkVGV4dCk7XHJcbiAgICBjb25zdCBmaW5hbFZhbHVlID0gdGhpcy5idWlsZEZpbmFsUGFzdGVWYWx1ZSh0YXJnZXQsIGZpbHRlcmVkVGV4dCwgaXNDdXJyZW5jeSwgbWF4RGVjaW1hbHMpO1xyXG5cclxuICAgIC8vIFVwZGF0ZSB0aGUgaW5wdXRcclxuICAgIHRhcmdldC52YWx1ZSA9IGZpbmFsVmFsdWU7XHJcbiAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoZmluYWxWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cclxuICAgIHRoaXMudmFsaWRhdGVJbnRlZ2VyRGlnaXRzKGZpbmFsVmFsdWUsIG1heERlY2ltYWxzKTtcclxuICAgIHRoaXMuY2xlYXJOdW1lcmljRXJyb3IoKTtcclxuXHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiBmaW5hbFZhbHVlIH0pO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuXHJcbiAgICB0aGlzLnNldEN1cnNvckFmdGVyUGFzdGUodGFyZ2V0LCBmaWx0ZXJlZFRleHQsIGZpbmFsVmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmlsdGVyIHBhc3RlZCB0ZXh0IGZvciBjdXJyZW5jeSBpbnB1dCAoYWxsb3dzIGRpZ2l0cyBhbmQgZGVjaW1hbCBwb2ludClcclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbHRlcmVkQ3VycmVuY3lQYXN0ZWRUZXh0KHBhc3RlZFRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcGFzdGVkVGV4dC5yZXBsYWNlQWxsKC9bXjAtOS5dL2csICcnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbHRlciBwYXN0ZWQgdGV4dCBmb3IgaW50ZWdlci1vbmx5IGlucHV0IChhbGxvd3MgZGlnaXRzIG9ubHkpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJlZEludGVnZXJQYXN0ZWRUZXh0KHBhc3RlZFRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcGFzdGVkVGV4dC5yZXBsYWNlQWxsKC9cXEQvZywgJycpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGQgZmluYWwgdmFsdWUgYWZ0ZXIgcGFzdGUgb3BlcmF0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBidWlsZEZpbmFsUGFzdGVWYWx1ZShcclxuICAgIHRhcmdldDogSFRNTElucHV0RWxlbWVudCxcclxuICAgIGZpbHRlcmVkVGV4dDogc3RyaW5nLFxyXG4gICAgaXNDdXJyZW5jeTogYm9vbGVhbixcclxuICAgIG1heERlY2ltYWxzOiBudW1iZXIsXHJcbiAgKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRhcmdldC52YWx1ZTtcclxuICAgIGNvbnN0IHN0YXJ0ID0gdGFyZ2V0LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgY29uc3QgZW5kID0gdGFyZ2V0LnNlbGVjdGlvbkVuZDtcclxuXHJcbiAgICBsZXQgZmluYWxWYWx1ZTogc3RyaW5nO1xyXG5cclxuICAgIC8vIElmIHNlbGVjdGlvbiBBUEkgaXMgbm90IHN1cHBvcnRlZCBvciBubyBzZWxlY3Rpb24sIHJlcGxhY2UgZW50aXJlIGNvbnRlbnRcclxuICAgIGlmIChzdGFydCA9PT0gbnVsbCB8fCBlbmQgPT09IG51bGwgfHwgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gMCkpIHtcclxuICAgICAgZmluYWxWYWx1ZSA9IGZpbHRlcmVkVGV4dDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpbmFsVmFsdWUgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKDAsIHN0YXJ0KSArIGZpbHRlcmVkVGV4dCArIGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoZW5kKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNDdXJyZW5jeSA/IHRoaXMuYXBwbHlEZWNpbWFsUmVzdHJpY3Rpb25zKGZpbmFsVmFsdWUsIG1heERlY2ltYWxzKSA6IGZpbmFsVmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHBseSBkZWNpbWFsIHJlc3RyaWN0aW9ucyBmb3IgY3VycmVuY3kgZmllbGRzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhcHBseURlY2ltYWxSZXN0cmljdGlvbnModmFsdWU6IHN0cmluZywgbWF4RGVjaW1hbHM6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgcmVzdWx0ID0gdmFsdWU7XHJcblxyXG4gICAgLy8gRW5zdXJlIG9ubHkgb25lIGRlY2ltYWwgcG9pbnRcclxuICAgIGNvbnN0IHBhcnRzID0gcmVzdWx0LnNwbGl0KCcuJyk7XHJcbiAgICBpZiAocGFydHMubGVuZ3RoID4gMikge1xyXG4gICAgICByZXN1bHQgPSBwYXJ0c1swXSArICcuJyArIHBhcnRzLnNsaWNlKDEpLmpvaW4oJycpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlc3RyaWN0IHRvIG1heERlY2ltYWxzIGRlY2ltYWwgcGxhY2VzXHJcbiAgICBpZiAocmVzdWx0LmluY2x1ZGVzKCcuJykpIHtcclxuICAgICAgY29uc3QgW2ludFBhcnQsIGRlY1BhcnRdID0gcmVzdWx0LnNwbGl0KCcuJyk7XHJcbiAgICAgIGlmIChkZWNQYXJ0Lmxlbmd0aCA+IG1heERlY2ltYWxzKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gaW50UGFydCArICcuJyArIGRlY1BhcnQuc2xpY2UoMCwgbWF4RGVjaW1hbHMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlIGludGVnZXIgZGlnaXQgbGltaXQgYW5kIHNldC9jbGVhciBlcnJvcnNcclxuICAgKi9cclxuICBwcml2YXRlIHZhbGlkYXRlSW50ZWdlckRpZ2l0cyh2YWx1ZTogc3RyaW5nLCBtYXhEZWNpbWFsczogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlICE9PSAnbnVtYmVyJyB8fCAhdGhpcy5maWVsZC5tYXhJbnRlZ2VyRGlnaXRzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtYXhJbnREaWdpdHMgPSB0aGlzLmZpZWxkLm1heEludGVnZXJEaWdpdHMgPz8gMTU7XHJcbiAgICBjb25zdCBbaW50UGFydF0gPSB2YWx1ZS5pbmNsdWRlcygnLicpID8gdmFsdWUuc3BsaXQoJy4nKSA6IFt2YWx1ZV07XHJcblxyXG4gICAgaWYgKGludFBhcnQubGVuZ3RoID4gbWF4SW50RGlnaXRzKSB7XHJcbiAgICAgIHRoaXMuc2V0TWF4SW50ZWdlckRpZ2l0c0Vycm9yKGludFBhcnQubGVuZ3RoLCBtYXhJbnREaWdpdHMsIG1heERlY2ltYWxzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2xlYXJNYXhJbnRlZ2VyRGlnaXRzRXJyb3IoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBtYXggaW50ZWdlciBkaWdpdHMgZXJyb3JcclxuICAgKi9cclxuICBwcml2YXRlIHNldE1heEludGVnZXJEaWdpdHNFcnJvcihhY3R1YWw6IG51bWJlciwgbWF4OiBudW1iZXIsIG1heERlY2ltYWxzOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IGN1cnJlbnRFcnJvcnMgPSB0aGlzLmNvbnRyb2wuZXJyb3JzIHx8IHt9O1xyXG4gICAgdGhpcy5jb250cm9sLnNldEVycm9ycyh7XHJcbiAgICAgIC4uLmN1cnJlbnRFcnJvcnMsXHJcbiAgICAgIG1heEludGVnZXJEaWdpdHM6IHtcclxuICAgICAgICBhY3R1YWwsXHJcbiAgICAgICAgbWF4LFxyXG4gICAgICAgIG1heERlY2ltYWxzLFxyXG4gICAgICAgIG1lc3NhZ2U6IGBQbGVhc2Ugc2hvcnRlbiB5b3VyIGlucHV0IHRvICR7bWF4fSB3aG9sZSBkaWdpdHMgYW5kICR7bWF4RGVjaW1hbHN9IGRlY2ltYWwgb3IgZmV3ZXIuYCxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgbWF4IGludGVnZXIgZGlnaXRzIGVycm9yIGlmIHByZXNlbnRcclxuICAgKi9cclxuICBwcml2YXRlIGNsZWFyTWF4SW50ZWdlckRpZ2l0c0Vycm9yKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNvbnRyb2wuaGFzRXJyb3IoJ21heEludGVnZXJEaWdpdHMnKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXJyb3JzID0geyAuLi50aGlzLmNvbnRyb2wuZXJyb3JzIH07XHJcbiAgICBkZWxldGUgZXJyb3JzWydtYXhJbnRlZ2VyRGlnaXRzJ107XHJcbiAgICB0aGlzLmNvbnRyb2wuc2V0RXJyb3JzKE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID8gZXJyb3JzIDogbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciBudW1lcmljIGVycm9yIGlmIHByZXNlbnRcclxuICAgKi9cclxuICBwcml2YXRlIGNsZWFyTnVtZXJpY0Vycm9yKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNvbnRyb2wuaGFzRXJyb3IoJ251bWVyaWMnKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXJyb3JzID0geyAuLi50aGlzLmNvbnRyb2wuZXJyb3JzIH07XHJcbiAgICBkZWxldGUgZXJyb3JzWydudW1lcmljJ107XHJcbiAgICB0aGlzLmNvbnRyb2wuc2V0RXJyb3JzKE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID8gZXJyb3JzIDogbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIHBhc3RlIG9wZXJhdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0Q3Vyc29yQWZ0ZXJQYXN0ZShcclxuICAgIHRhcmdldDogSFRNTElucHV0RWxlbWVudCxcclxuICAgIGZpbHRlcmVkVGV4dDogc3RyaW5nLFxyXG4gICAgZmluYWxWYWx1ZTogc3RyaW5nLFxyXG4gICk6IHZvaWQge1xyXG4gICAgLy8gSW5wdXQgdHlwZT1cIm51bWJlclwiIGRvZXMgbm90IHN1cHBvcnQgc2VsZWN0aW9uIEFQSXNcclxuICAgIGlmICh0YXJnZXQudHlwZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN0YXJ0ID0gdGFyZ2V0LnNlbGVjdGlvblN0YXJ0IHx8IDA7XHJcbiAgICBjb25zdCBuZXdDdXJzb3JQb3MgPSBzdGFydCArIGZpbHRlcmVkVGV4dC5sZW5ndGg7XHJcbiAgICBjb25zdCBhY3R1YWxQb3MgPSBNYXRoLm1pbihuZXdDdXJzb3JQb3MsIGZpbmFsVmFsdWUubGVuZ3RoKTtcclxuICAgIHRhcmdldC5zZXRTZWxlY3Rpb25SYW5nZShhY3R1YWxQb3MsIGFjdHVhbFBvcyk7XHJcbiAgfVxyXG5cclxuICAvLyBGb3JtYXQgbnVtYmVyIHdpdGggY29tbWEgc2VwYXJhdG9yc1xyXG4gIC8vIFVzZXMgc3RyaW5nLWJhc2VkIGZvcm1hdHRpbmcgZm9yIGxhcmdlIG51bWJlcnMgdG8gcHJlc2VydmUgcHJlY2lzaW9uXHJcbiAgZm9ybWF0Q3VycmVuY3lXaXRoQ29tbWFzKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcsIG1heERlY2ltYWxzOiBudW1iZXIgPSAyKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmZpZWxkLnR5cGUgIT09ICdudW1iZXInIHx8ICF0aGlzLmZpZWxkLmlzQ3VycmVuY3kpIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xyXG5cclxuICAgIGNvbnN0IHN0clZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcclxuXHJcbiAgICAvLyBSZXR1cm4gb3JpZ2luYWwgdmFsdWUgZm9yIGVtcHR5IG9yIGludmFsaWQgaW5wdXRzXHJcbiAgICBpZiAoIXN0clZhbHVlIHx8IHN0clZhbHVlID09PSAnTmFOJykgcmV0dXJuICcnO1xyXG5cclxuICAgIC8vIFVzZSBzdHJpbmctYmFzZWQgZm9ybWF0dGluZyB0byBwcmVzZXJ2ZSBwcmVjaXNpb24gZm9yIGxhcmdlIG51bWJlcnNcclxuICAgIGNvbnN0IFtpbnRlZ2VyUGFydCwgZGVjaW1hbFBhcnRdID0gc3RyVmFsdWUuaW5jbHVkZXMoJy4nKVxyXG4gICAgICA/IHN0clZhbHVlLnNwbGl0KCcuJylcclxuICAgICAgOiBbc3RyVmFsdWUsICcnXTtcclxuXHJcbiAgICAvLyBGb3JtYXQgaW50ZWdlciBwYXJ0IHdpdGggY29tbWEgc2VwYXJhdG9ycyAoZXZlcnkgMyBkaWdpdHMgZnJvbSByaWdodClcclxuICAgIC8vIFVzaW5nIGl0ZXJhdGl2ZSBhcHByb2FjaCBpbnN0ZWFkIG9mIHJlZ2V4IHRvIGF2b2lkIFJlRG9TIGNvbmNlcm5zXHJcbiAgICBsZXQgZm9ybWF0dGVkSW50ZWdlciA9ICcnO1xyXG4gICAgY29uc3QgbGVuID0gaW50ZWdlclBhcnQubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBpZiAoaSA+IDAgJiYgKGxlbiAtIGkpICUgMyA9PT0gMCkge1xyXG4gICAgICAgIGZvcm1hdHRlZEludGVnZXIgKz0gJywnO1xyXG4gICAgICB9XHJcbiAgICAgIGZvcm1hdHRlZEludGVnZXIgKz0gaW50ZWdlclBhcnRbaV07XHJcbiAgICB9XHJcbiAgICAvLyBGb3JtYXQgZGVjaW1hbCBwYXJ0IChwYWQgb3IgdHJ1bmNhdGUgdG8gbWF4RGVjaW1hbHMpXHJcbiAgICBsZXQgZm9ybWF0dGVkRGVjaW1hbCA9IGRlY2ltYWxQYXJ0IHx8ICcnO1xyXG4gICAgaWYgKGZvcm1hdHRlZERlY2ltYWwubGVuZ3RoIDwgbWF4RGVjaW1hbHMpIHtcclxuICAgICAgZm9ybWF0dGVkRGVjaW1hbCA9IGZvcm1hdHRlZERlY2ltYWwucGFkRW5kKG1heERlY2ltYWxzLCAnMCcpO1xyXG4gICAgfSBlbHNlIGlmIChmb3JtYXR0ZWREZWNpbWFsLmxlbmd0aCA+IG1heERlY2ltYWxzKSB7XHJcbiAgICAgIGZvcm1hdHRlZERlY2ltYWwgPSBmb3JtYXR0ZWREZWNpbWFsLnNsaWNlKDAsIG1heERlY2ltYWxzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWF4RGVjaW1hbHMgPiAwID8gYCR7Zm9ybWF0dGVkSW50ZWdlcn0uJHtmb3JtYXR0ZWREZWNpbWFsfWAgOiBmb3JtYXR0ZWRJbnRlZ2VyO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlTnVtYmVyS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgaXNDdXJyZW5jeTogYm9vbGVhbikge1xyXG4gICAgaWYgKGlzQ3VycmVuY3kpIHJldHVybjtcclxuXHJcbiAgICAvLyBBbGxvdzogQmFja3NwYWNlLCBEZWxldGUsIFRhYiwgQXJyb3cga2V5c1xyXG4gICAgaWYgKFsnQmFja3NwYWNlJywgJ0RlbGV0ZScsICdUYWInLCAnQXJyb3dMZWZ0JywgJ0Fycm93UmlnaHQnXS5pbmNsdWRlcyhldmVudC5rZXkpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBbGxvdyBjbGlwYm9hcmQgb3BlcmF0aW9ucyAoQ3RybCtWLCBDdHJsK0MsIEN0cmwrWCwgQ21kK1YsIENtZCtDLCBDbWQrWClcclxuICAgIC8vIGFuZCBzZWxlY3Rpb24gKEN0cmwrQSwgQ21kK0EpXHJcbiAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBCbG9jayBldmVyeXRoaW5nIHRoYXQgaXMgbm90IDAtOVxyXG4gICAgaWYgKCEvXlxcZCQvLnRlc3QoZXZlbnQua2V5KSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gR2V0IGxvY2FsZSBmcm9tIGN1cnJlbmN5IGNvZGUgdXNpbmcgY3VycmVuY3lNZXRhXHJcbiAgZ2V0TG9jYWxlRnJvbUN1cnJlbmN5KGN1cnJlbmN5Q29kZT86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBjdXJyZW5jeU9iaiA9IHRoaXMuY3VycmVuY3lNZXRhLmZpbmQoXHJcbiAgICAgIChjOiB7IGNvZGU6IHN0cmluZzsgbG9jYWxlOiBzdHJpbmcgfSkgPT4gYy5jb2RlID09PSBjdXJyZW5jeUNvZGUsXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBjdXJyZW5jeU9iaj8ubG9jYWxlIHx8IHRoaXMuZGVmYXVsdExvY2FsZTtcclxuICB9XHJcblxyXG4gIHNob3dQYXNzd29yZCA9IGZhbHNlO1xyXG4gIHBhc3N3b3JkU3RyZW5ndGhMYWJlbCA9ICcnO1xyXG4gIHN0cmVuZ3RoQ2xhc3MgPSAnJztcclxuICBwYXNzd29yZFN0cmVuZ3RoUGVyY2VudCA9IDA7XHJcbiAgaXNQYXNzd29yZEZvY3VzZWQgPSBmYWxzZTtcclxuICBvblBhc3N3b3JkRm9jdXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhhc0ZvY3VzLnNldCh0cnVlKTtcclxuICAgIHRoaXMuaXNQYXNzd29yZEZvY3VzZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgb25QYXNzd29yZEJsdXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzUGFzc3dvcmRGb2N1c2VkID0gZmFsc2U7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQYXNzd29yZEJsdXIoZTogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFuZGxlQmx1cihlKTsgLy8gT3JpZ2luYWwgYmx1ciBmdW5jdGlvbmFsaXR5IChzZXRzIGhhc0ZvY3VzIHRvIGZhbHNlKVxyXG4gICAgdGhpcy5vblBhc3N3b3JkQmx1cigpOyAvLyBIaWRlIHBhc3N3b3JkIGZlZWRiYWNrXHJcbiAgfVxyXG5cclxuICBjaGVja1Bhc3N3b3JkU3RyZW5ndGgodmFsdWU6IHN0cmluZykge1xyXG4gICAgaWYgKCF2YWx1ZSB8fCB0aGlzLmZpZWxkLnR5cGUgIT09ICdwYXNzd29yZCcpIHtcclxuICAgICAgdGhpcy5wYXNzd29yZFN0cmVuZ3RoTGFiZWwgPSAnJztcclxuICAgICAgdGhpcy5zdHJlbmd0aENsYXNzID0gJyc7XHJcbiAgICAgIHRoaXMucGFzc3dvcmRTdHJlbmd0aFBlcmNlbnQgPSAwO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IHNjb3JlID0gMDtcclxuICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gOCkgc2NvcmUrKztcclxuICAgIGlmICgvW0EtWl0vLnRlc3QodmFsdWUpKSBzY29yZSsrO1xyXG4gICAgaWYgKC9cXGQvLnRlc3QodmFsdWUpKSBzY29yZSsrO1xyXG4gICAgaWYgKC9bXFxXX10vLnRlc3QodmFsdWUpKSBzY29yZSsrO1xyXG5cclxuICAgIGlmIChzY29yZSA8PSAxKSB7XHJcbiAgICAgIHRoaXMucGFzc3dvcmRTdHJlbmd0aExhYmVsID0gdGhpcy5maWVsZC53ZWFrTGFiZWwgfHwgJ1dlYWsnO1xyXG4gICAgICB0aGlzLnN0cmVuZ3RoQ2xhc3MgPSAndGV4dC1bdmFyKC0tUkhCLVJlZC0xMDApXSc7XHJcbiAgICAgIHRoaXMucGFzc3dvcmRTdHJlbmd0aFBlcmNlbnQgPSAyNTtcclxuICAgIH0gZWxzZSBpZiAoc2NvcmUgPT09IDIgfHwgc2NvcmUgPT09IDMpIHtcclxuICAgICAgdGhpcy5wYXNzd29yZFN0cmVuZ3RoTGFiZWwgPSB0aGlzLmZpZWxkLm1lZGl1bUxhYmVsIHx8ICdNZWRpdW0nO1xyXG4gICAgICB0aGlzLnN0cmVuZ3RoQ2xhc3MgPSAndGV4dC1bdmFyKC0tT3JhbmdlLTEwMCldJztcclxuICAgICAgdGhpcy5wYXNzd29yZFN0cmVuZ3RoUGVyY2VudCA9IHNjb3JlID09PSAyID8gNTAgOiA3NTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucGFzc3dvcmRTdHJlbmd0aExhYmVsID0gdGhpcy5maWVsZC5zdHJvbmdMYWJlbCB8fCAnU3Ryb25nJztcclxuICAgICAgdGhpcy5zdHJlbmd0aENsYXNzID0gJ3RleHQtW3ZhcigtLUdyZWVuLTEwMCldJztcclxuICAgICAgdGhpcy5wYXNzd29yZFN0cmVuZ3RoUGVyY2VudCA9IDEwMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluY3JlbWVudCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZpZWxkLnR5cGUgIT09ICdudW1iZXInKSByZXR1cm47XHJcbiAgICBjb25zdCBzdGVwID0gdGhpcy5maWVsZC5zdGVwIHx8IDE7XHJcbiAgICBjb25zdCBjdXJyZW50ID0gTnVtYmVyKHRoaXMuY29udHJvbC52YWx1ZSkgfHwgMDtcclxuICAgIGxldCBuZXh0VmFsdWUgPSBjdXJyZW50ICsgc3RlcDtcclxuXHJcbiAgICBpZiAodHlwZW9mIHRoaXMuZmllbGQubWF4ID09PSAnbnVtYmVyJykge1xyXG4gICAgICBuZXh0VmFsdWUgPSBNYXRoLm1pbihuZXh0VmFsdWUsIHRoaXMuZmllbGQubWF4KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUobmV4dFZhbHVlKTtcclxuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiBuZXh0VmFsdWUgfSk7XHJcblxyXG4gICAgLy8gVXBkYXRlIGRpc3BsYXkgdmFsdWUgZm9yIGN1cnJlbmN5IGlucHV0c1xyXG4gICAgaWYgKHRoaXMuZmllbGQuaXNDdXJyZW5jeSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBpbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnVuaXF1ZUlkKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgIGlmIChpbnB1dEVsZW1lbnQpIHtcclxuICAgICAgICAgIGlucHV0RWxlbWVudC52YWx1ZSA9IHRoaXMuZm9ybWF0Q3VycmVuY3lXaXRoQ29tbWFzKG5leHRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRlY3JlbWVudCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZpZWxkLnR5cGUgIT09ICdudW1iZXInKSByZXR1cm47XHJcbiAgICBjb25zdCBzdGVwID0gdGhpcy5maWVsZC5zdGVwIHx8IDE7XHJcbiAgICBjb25zdCBjdXJyZW50ID0gTnVtYmVyKHRoaXMuY29udHJvbC52YWx1ZSkgfHwgMDtcclxuICAgIGxldCBuZXh0VmFsdWUgPSBjdXJyZW50IC0gc3RlcDtcclxuXHJcbiAgICAvLyBFbnN1cmUgbWluaW11bSB2YWx1ZSBpcyAwIChubyBuZWdhdGl2ZSB2YWx1ZXMpXHJcbiAgICBjb25zdCBtaW5WYWx1ZSA9IE1hdGgubWF4KHRoaXMuZmllbGQubWluIHx8IDAsIDApO1xyXG4gICAgbmV4dFZhbHVlID0gTWF0aC5tYXgobmV4dFZhbHVlLCBtaW5WYWx1ZSk7XHJcblxyXG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKG5leHRWYWx1ZSk7XHJcbiAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogbmV4dFZhbHVlIH0pO1xyXG5cclxuICAgIC8vIFVwZGF0ZSBkaXNwbGF5IHZhbHVlIGZvciBjdXJyZW5jeSBpbnB1dHNcclxuICAgIGlmICh0aGlzLmZpZWxkLmlzQ3VycmVuY3kpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy51bmlxdWVJZCkgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICBpZiAoaW5wdXRFbGVtZW50KSB7XHJcbiAgICAgICAgICBpbnB1dEVsZW1lbnQudmFsdWUgPSB0aGlzLmZvcm1hdEN1cnJlbmN5V2l0aENvbW1hcyhuZXh0VmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb3B5VGV4dChlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICghdGhpcy5jb250cm9sLnZhbHVlKSByZXR1cm47XHJcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0aGlzLmNvbnRyb2wudmFsdWUpLnRoZW4oKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy50b2FzdFNlcnZpY2UpIHtcclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zdWNjZXNzKCdDb3BpZWQgdG8gY2xpcGJvYXJkJywgJ1N1Y2Nlc3MnLCAxMDAwKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdXAgdmlzaWJpbGl0eSBjb25kaXRpb24gbGlzdGVuZXJcclxuICAgKiBXYXRjaGVzIHRoZSBkZXBlbmRlbnQgZmllbGQgYW5kIHNob3dzL2hpZGVzIHRoaXMgZmllbGQgYmFzZWQgb24gY29uZGl0aW9uc1xyXG4gICAqL1xyXG4gIHNldHVwVmlzaWJpbGl0eUNvbmRpdGlvbigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5maWVsZC52aXNpYmlsaXR5Q29uZGl0aW9uIHx8ICF0aGlzLmZvcm0pIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB7IGRlcGVuZHNPbiB9ID0gdGhpcy5maWVsZC52aXNpYmlsaXR5Q29uZGl0aW9uO1xyXG4gICAgY29uc3QgZGVwZW5kZW50Q29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZGVwZW5kc09uKTtcclxuXHJcbiAgICBpZiAoIWRlcGVuZGVudENvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEluaXRpYWwgdmlzaWJpbGl0eSBjaGVja1xyXG4gICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KGRlcGVuZGVudENvbnRyb2wudmFsdWUpO1xyXG5cclxuICAgIC8vIFN1YnNjcmliZSB0byB2YWx1ZSBjaGFuZ2VzXHJcbiAgICBkZXBlbmRlbnRDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSh2YWx1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBmaWVsZCB2aXNpYmlsaXR5IGJhc2VkIG9uIGRlcGVuZGVudCBmaWVsZCB2YWx1ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJpbGl0eShkZXBlbmRlbnRWYWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZmllbGQudmlzaWJpbGl0eUNvbmRpdGlvbikgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHsgc2hvd1doZW4sIGhpZGVXaGVuIH0gPSB0aGlzLmZpZWxkLnZpc2liaWxpdHlDb25kaXRpb247XHJcbiAgICBsZXQgc2hvdWxkQmVWaXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgLy8gQ2hlY2sgc2hvd1doZW4gY29uZGl0aW9uXHJcbiAgICBpZiAoc2hvd1doZW4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzaG93V2hlbikpIHtcclxuICAgICAgICBzaG91bGRCZVZpc2libGUgPSBzaG93V2hlbi5pbmNsdWRlcyhkZXBlbmRlbnRWYWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2hvdWxkQmVWaXNpYmxlID0gZGVwZW5kZW50VmFsdWUgPT09IHNob3dXaGVuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaGlkZVdoZW4gY29uZGl0aW9uIChvdmVycmlkZXMgc2hvd1doZW4pXHJcbiAgICBpZiAoaGlkZVdoZW4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBjb25zdCBzaG91bGRIaWRlID0gQXJyYXkuaXNBcnJheShoaWRlV2hlbilcclxuICAgICAgICA/IGhpZGVXaGVuLmluY2x1ZGVzKGRlcGVuZGVudFZhbHVlKVxyXG4gICAgICAgIDogZGVwZW5kZW50VmFsdWUgPT09IGhpZGVXaGVuO1xyXG5cclxuICAgICAgaWYgKHNob3VsZEhpZGUpIHtcclxuICAgICAgICBzaG91bGRCZVZpc2libGUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSB2aXNpYmlsaXR5XHJcbiAgICB0aGlzLmlzVmlzaWJsZS5zZXQoc2hvdWxkQmVWaXNpYmxlKTtcclxuXHJcbiAgICAvLyBPbmx5IGNsZWFyIHZhbHVlIHdoZW4gaGlkaW5nIGlmIHRoZXJlJ3Mgbm8gaW5pdGlhbCB2YWx1ZVxyXG4gICAgLy8gVGhpcyBwcmVzZXJ2ZXMgZGF0YSB3aGVuIGVkaXRpbmcgZXhpc3RpbmcgcmVjb3Jkc1xyXG4gICAgaWYgKCFzaG91bGRCZVZpc2libGUgJiYgdGhpcy5jb250cm9sICYmICF0aGlzLmNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmNvbnRyb2wubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICAgIHRoaXMuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgc2hvd0Zvcm1GaWVsZE1lc3NhZ2UoY29udHJvbDogYW55LCBoZWxwZXJUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmhlbHBlckhhbmRsZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5oZWxwZXJIYW5kbGUuc2hvd0Zvcm1GaWVsZE1lc3NhZ2UoY29udHJvbCwgaGVscGVyVGV4dCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpc0Vycm9yID0gY29udHJvbD8udG91Y2hlZCAmJiAhIWNvbnRyb2w/LmVycm9ycztcclxuICAgIGNvbnN0IGlzSGVscGVyID0gIWlzRXJyb3IgJiYgQm9vbGVhbihoZWxwZXJUZXh0ID8/ICcnKTtcclxuICAgIHJldHVybiBpc0Vycm9yIHx8IGlzSGVscGVyO1xyXG4gIH1cclxuXHJcbiAgZ2V0VHJhbnNsYXRlZExhYmVsKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFsYWJlbCkgcmV0dXJuICcnO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgbGFiZWxTdHIgPSBsYWJlbC50b1N0cmluZygpO1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIGxhYmVsU3RyXHJcbiAgICAgICAgICAuc3BsaXQoJzo6JylcclxuICAgICAgICAgIC5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKVxyXG4gICAgICAgICAgLmZpbHRlcigocGFydCkgPT4gISFwYXJ0KVxyXG4gICAgICAgICAgLm1hcCgocGFydCkgPT4gdGhpcy50cmFuc2xhdGUuaW5zdGFudChwYXJ0KSlcclxuICAgICAgICAgIC5qb2luKCcgJykgKyB0aGlzLmdldEVuZFN5bWJvbChsYWJlbFN0cilcclxuICAgICAgKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdUcmFuc2xhdGlvbiBmYWlsZWQgaW4gZ2V0VHJhbnNsYXRlZExhYmVsOicsIGxhYmVsLCBlKTtcclxuICAgICAgcmV0dXJuIGxhYmVsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RW5kU3ltYm9sKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGxhYmVsLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ3JlcXVpcmVkJykgJiYgbGFiZWwudG9TdHJpbmcoKS5pbmNsdWRlcygnRk5GaWVsZE1lc3NhZ2UnKVxyXG4gICAgICA/ICcuJ1xyXG4gICAgICA6ICcnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tIElDT04gTE9HSUMgLS0tXHJcbiAgcHJpdmF0ZSB1cGRhdGVBbGxJY29ucygpOiB2b2lkIHtcclxuICAgIC8vIFdlJ2xsIGNhbGwgdGhpcyBhZnRlciBWaWV3SW5pdCBvciB3aGVuIGlucHV0cyBjaGFuZ2VcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmljb25Db250YWluZXJzPy5mb3JFYWNoKChjb250YWluZXIpID0+IHtcclxuICAgICAgICBjb25zdCBuYW1lID0gY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWljb24tbmFtZScpO1xyXG4gICAgICAgIGNvbnN0IHZhcmlhbnQgPVxyXG4gICAgICAgICAgKGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1pY29uLXZhcmlhbnQnKSBhcyBUeXBlSWNvblZhcmlhbnQpIHx8ICdMaW5lJztcclxuICAgICAgICBjb25zdCBzaXplID0gKGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1pY29uLXNpemUnKSB8fFxyXG4gICAgICAgICAgJ21lZGl1bScpIGFzIFR5cGVJY29uU2l6ZU5hbWU7XHJcbiAgICAgICAgY29uc3QgY29sb3IgPSBjb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWNvbi1jb2xvcicpO1xyXG4gICAgICAgIGNvbnN0IGRpc2FibGVkID0gY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWljb24tZGlzYWJsZWQnKSA9PT0gJ3RydWUnO1xyXG5cclxuICAgICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgICAgdGhpcy5sb2FkSWNvblRvQ29udGFpbmVyKGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LCBuYW1lLCB2YXJpYW50LCBzaXplLCBjb2xvciwgZGlzYWJsZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZEljb25Ub0NvbnRhaW5lcihcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICB2YXJpYW50OiBUeXBlSWNvblZhcmlhbnQsXHJcbiAgICBzaXplTmFtZTogVHlwZUljb25TaXplTmFtZSxcclxuICAgIGNvbG9yPzogc3RyaW5nIHwgbnVsbCxcclxuICAgIGRpc2FibGVkPzogYm9vbGVhbixcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemVNYXBbc2l6ZU5hbWVdO1xyXG4gICAgY29uc3QgaWNvblBhdGggPSB0aGlzLmdldEljb25QYXRoKG5hbWUsIHZhcmlhbnQsIHNpemUpO1xyXG5cclxuICAgIGlmICghaWNvblBhdGgpIHtcclxuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5odHRwLmdldChpY29uUGF0aCwgeyByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmF3KSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcclxuICAgICAgICAgIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmF3LCAnaW1hZ2Uvc3ZnK3htbCcpO1xyXG4gICAgICAgICAgY29uc3Qgc3ZnID0gZG9jLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpIGFzIHVua25vd24gYXMgU1ZHU1ZHRWxlbWVudDtcclxuXHJcbiAgICAgICAgICBpZiAoIXN2Zykge1xyXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBTVkcgTm9ybWFsaXphdGlvbiBsb2dpY1xyXG4gICAgICAgICAgZm9yIChjb25zdCBzIG9mIHN2Zy5xdWVyeVNlbGVjdG9yQWxsKCdzdHlsZScpKSBzLnJlbW92ZSgpO1xyXG5cclxuICAgICAgICAgIGlmIChjb2xvcikge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIHN2Zy5xdWVyeVNlbGVjdG9yQWxsPFNWR0VsZW1lbnQ+KCcqJykpIHtcclxuICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IGVsLmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcclxuICAgICAgICAgICAgICBpZiAoc3R5bGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFuZWQgPSBzdHlsZVxyXG4gICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvZmlsbFxccyo6XFxzKlteO10rOz8vZ2ksICcnKVxyXG4gICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvc3Ryb2tlXFxzKjpcXHMqW147XSs7Py9naSwgJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNsZWFuZWQpIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBjbGVhbmVkKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgZWwucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgZmlsbCA9IGVsLmdldEF0dHJpYnV0ZSgnZmlsbCcpO1xyXG4gICAgICAgICAgICAgIGlmIChmaWxsICYmIGZpbGwgIT09ICdub25lJyAmJiAhZmlsbC5zdGFydHNXaXRoKCd1cmwoJykpIHtcclxuICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdjdXJyZW50Q29sb3InKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IHN0cm9rZSA9IGVsLmdldEF0dHJpYnV0ZSgnc3Ryb2tlJyk7XHJcbiAgICAgICAgICAgICAgaWYgKHN0cm9rZSAmJiBzdHJva2UgIT09ICdub25lJyAmJiAhc3Ryb2tlLnN0YXJ0c1dpdGgoJ3VybCgnKSkge1xyXG4gICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnY3VycmVudENvbG9yJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgc3ZnLnJlbW92ZUF0dHJpYnV0ZSgnd2lkdGgnKTtcclxuICAgICAgICAgIHN2Zy5yZW1vdmVBdHRyaWJ1dGUoJ2hlaWdodCcpO1xyXG4gICAgICAgICAgaWYgKCFzdmcuZ2V0QXR0cmlidXRlKCd2aWV3Qm94JykpIHtcclxuICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgndmlld0JveCcsIGAwIDAgJHtzaXplfSAke3NpemV9YCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ3hNaWRZTWlkIG1lZXQnKTtcclxuICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2ZvY3VzYWJsZScsICdmYWxzZScpO1xyXG4gICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xyXG4gICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMTAwJScpO1xyXG4gICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJzEwMCUnKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzdHlsZSA9IGA7ZGlzcGxheTpibG9jazttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCU7YDtcclxuICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgKHN2Zy5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykgfHwgJycpICsgc3R5bGUpO1xyXG5cclxuICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICAgIGlmIChjb2xvcikge1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuY29sb3IgPSBjb2xvcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChkaXNhYmxlZCkge1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5vcGFjaXR5ID0gJzEnO1xyXG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuY3Vyc29yID0gJyc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc3ZnKTtcclxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW2ZuLWlucHV0XSBFcnJvciBwYXJzaW5nIFNWRyBmb3IgaWNvbiBcIiR7bmFtZX1cIjpgLCBlcnJvcik7XHJcbiAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SWNvblBhdGgoaWNvbjogc3RyaW5nLCB2YXJpYW50OiBUeXBlSWNvblZhcmlhbnQsIHNpemU6IFR5cGVJY29uU2l6ZSk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgaWYgKCFpY29uKSByZXR1cm4gbnVsbDtcclxuICAgIGlmIChzaXplID09PSAxNiB8fCBzaXplID09PSAxMCkge1xyXG4gICAgICByZXR1cm4gYGFzc2V0cy9pY29ucy8ke3ZhcmlhbnR9LyR7c2l6ZX1weC8ke2ljb259LnN2Z2A7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYGFzc2V0cy9pY29ucy8ke3ZhcmlhbnR9LyR7c2l6ZX1weC8ke2ljb259LS0ke3NpemV9LnN2Z2A7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0gTUVTU0FHRSBMT0dJQyAtLS1cclxuICBnZXRGaWVsZE1lc3NhZ2UoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5jb250cm9sKSByZXR1cm4gdGhpcy5maWVsZD8uaGVscGVyVGV4dCB8fCAnJztcclxuXHJcbiAgICBpZiAodGhpcy5jb250cm9sLnRvdWNoZWQgJiYgdGhpcy5jb250cm9sLmVycm9ycykge1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmNvbnRyb2wuZXJyb3JzKSkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yVmFsdWUgPSB0aGlzLmNvbnRyb2wuZXJyb3JzW2tleV07XHJcbiAgICAgICAgaWYgKGVycm9yVmFsdWUgJiYgdHlwZW9mIGVycm9yVmFsdWUgPT09ICdvYmplY3QnICYmIGVycm9yVmFsdWUubWVzc2FnZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGVycm9yVmFsdWUubWVzc2FnZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZmllbGQ/LmVycm9ycz8uW2tleV0pIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmZpZWxkLmVycm9yc1trZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIHRoaXMuZmllbGQ/LmVycm9ycz8uWydkZWZhdWx0J10gfHxcclxuICAgICAgICAnUGxlYXNlIGVudGVyICcgKyB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KHRoaXMuZmllbGQ/LmxhYmVsKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmZpZWxkPy5oZWxwZXJUZXh0IHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzRXJyb3IoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISEodGhpcy5jb250cm9sPy50b3VjaGVkICYmIHRoaXMuY29udHJvbD8uZXJyb3JzKTtcclxuICB9XHJcblxyXG4gIGdldCBpc1N1Y2Nlc3MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISEodGhpcy5jb250cm9sPy52YWxpZCAmJiB0aGlzLmNvbnRyb2w/LnRvdWNoZWQpO1xyXG4gIH1cclxufVxyXG4iLCJAaWYgKGZpZWxkLm5hbWUgJiYgaXNWaXNpYmxlKCkgJiYgIWZpZWxkLmhpZGRlbikge1xyXG4gIDxkaXYgY2xhc3M9XCJmbi1pbnB1dC1jb250YWluZXJcIj5cclxuICAgIEBpZiAoZmllbGQudHlwZSEgIT09ICdoaWRkZW4nKSB7XHJcbiAgICAgIDxsYWJlbFxyXG4gICAgICAgIFtmb3JdPVwidW5pcXVlSWRcIlxyXG4gICAgICAgIGNsYXNzPVwiZm4tbGFiZWxcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgIGNvbG9yOiBmaWVsZC5jb2xvciB8fCAnIzAzMTgyYicsXHJcbiAgICAgICAgICAnZm9udC1zaXplJzogZmllbGQubGFiZWxTaXplIHx8ICcnLFxyXG4gICAgICAgIH1cIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgZ2V0VHJhbnNsYXRlZExhYmVsKGZpZWxkLmxhYmVsKSB9fVxyXG4gICAgICAgIEBpZiAoIWZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlT3B0aW9uYWwpIHtcclxuICAgICAgICAgIDxzcGFuPiZuYnNwOyhPcHRpb25hbCk8L3NwYW4+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgfVxyXG5cclxuICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgIEBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcclxuICAgICAgICA8IS0tIFRleHRhcmVhIEZpZWxkIC0tPlxyXG4gICAgICAgIEBjYXNlICgndGV4dGFyZWEnKSB7XHJcbiAgICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgICAgI2ZuVGV4dGFyZWFcclxuICAgICAgICAgICAgc3R5bGU9XCJyZXNpemU6IG5vbmVcIlxyXG4gICAgICAgICAgICBbbmFtZV09XCJmaWVsZC5uYW1lXCJcclxuICAgICAgICAgICAgW2lkXT1cInVuaXF1ZUlkXCJcclxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgW3Jvd3NdPVwiZmllbGQucm93cyB8fCAxXCJcclxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRPbmx5IHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxyXG4gICAgICAgICAgICAoaW5wdXQpPVwiaGFuZGxlVGV4dEFyZWEoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cImhhbmRsZUJsdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm4taW5wdXQtZmllbGRcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgZGlzYWJsZWQ6IGNvbnRyb2wuZGlzYWJsZWQgfHwgZmllbGQucmVhZE9ubHksXHJcbiAgICAgICAgICAgICAgZXJyb3I6IGNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmVycm9ycyxcclxuICAgICAgICAgICAgICBzdWNjZXNzOiBmaWVsZFsnaGFzU3VjY2Vzc0JvcmRlciddICYmIGNvbnRyb2wudmFsaWQgJiYgIWNvbnRyb2wuZXJyb3JzLFxyXG4gICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgIGNvbG9yOiBmaWVsZC52YWx1ZUNvbG9yIHx8ICdpbmhlcml0JyxcclxuICAgICAgICAgICAgICAnZm9udC1zaXplJzogZmllbGQudmFsdWVTaXplIHx8ICcnLFxyXG4gICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXHJcbiAgICAgICAgICA+PC90ZXh0YXJlYT5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDwhLS0gUGFzc3dvcmQgRmllbGQgLS0+XHJcblxyXG4gICAgICAgIEBjYXNlICgncGFzc3dvcmQnKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIFt0eXBlXT1cInNob3dQYXNzd29yZCA/ICd0ZXh0JyA6ICdwYXNzd29yZCdcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJ1bmlxdWVJZFwiXHJcbiAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQuZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgfHwgJycgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgIFtyZWFkb25seV09XCJmaWVsZC5yZWFkT25seSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cImlzQWxwaGFudW1lcmljID8gaGFuZGxlQWxwaGFudW1lcmljSW5wdXQoJGV2ZW50KSA6IGhhbmRsZUlucHV0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChmb2N1cyk9XCJvblBhc3N3b3JkRm9jdXMoKVwiXHJcbiAgICAgICAgICAgICAgKGJsdXIpPVwiaGFuZGxlUGFzc3dvcmRCbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm4taW5wdXQtZmllbGQgb3ZlcmZsb3ctaGlkZGVuIHRleHQtZWxsaXBzaXNcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBjb250cm9sLmRpc2FibGVkIHx8IGZpZWxkLnJlYWRPbmx5LFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6IGNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmVycm9ycyxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZpZWxkWydoYXNTdWNjZXNzQm9yZGVyJ10gJiYgY29udHJvbC52YWxpZCxcclxuICAgICAgICAgICAgICAgICdwci0xMic6XHJcbiAgICAgICAgICAgICAgICAgIChmaWVsZC50b2dnbGVNYXNrICYmICFmaWVsZC5pc0NvcHlUZXh0KSB8fFxyXG4gICAgICAgICAgICAgICAgICAoIWZpZWxkLnRvZ2dsZU1hc2sgJiYgZmllbGQuaXNDb3B5VGV4dCksXHJcbiAgICAgICAgICAgICAgICAncHItMjQnOiBmaWVsZC50b2dnbGVNYXNrICYmIGZpZWxkLmlzQ29weVRleHQsXHJcbiAgICAgICAgICAgICAgICAncHItMzInOiBmaWVsZC50b2dnbGVNYXNrICYmIGZpZWxkLmlzQ29weVRleHQgJiYgZmllbGQuaGFzR2VuZXJhdGVLZXksXHJcbiAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgY29sb3I6IGZpZWxkLnZhbHVlQ29sb3IgfHwgJ2luaGVyaXQnLFxyXG4gICAgICAgICAgICAgICAgJ2ZvbnQtc2l6ZSc6IGZpZWxkLnZhbHVlU2l6ZSB8fCAnJyxcclxuICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSByaWdodC0wIHRvcC0xLzIgLXRyYW5zbGF0ZS15LTEvMiBmbGV4IGl0ZW1zLWNlbnRlciBwci0zIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgQGlmIChmaWVsZC50b2dnbGVNYXNrICYmICFmaWVsZC5pc0NvcHlUZXh0KSB7XHJcbiAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dQYXNzd29yZCA9ICFzaG93UGFzc3dvcmRcIlxyXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJzaG93UGFzc3dvcmQgPSAhc2hvd1Bhc3N3b3JkXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLW5hbWVdPVwic2hvd1Bhc3N3b3JkID8gJ2V5ZS1vcGVuJyA6ICdleWUtY2xvc2UnXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tdmFyaWFudD1cIkxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1zaXplPVwibGFyZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1jb2xvcj1cIiMwMzE4MmJcIlxyXG4gICAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoZmllbGQuaXNDb3B5VGV4dCAmJiAhZmllbGQudG9nZ2xlTWFzaykge1xyXG4gICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb3B5VGV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiY29weVRleHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAjaWNvbkNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1uYW1lPVwidHdvLXNxdWFyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLWNvbG9yPVwiIzAzMTgyYlwiXHJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIEBpZiAoZmllbGQuaGFzR2VuZXJhdGVLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmllbGQub25HZW5lcmF0ZUtleSAmJiBmaWVsZC5vbkdlbmVyYXRlS2V5KClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImZpZWxkLm9uR2VuZXJhdGVLZXkgJiYgZmllbGQub25HZW5lcmF0ZUtleSgpXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1uYW1lPVwidHdvLXNxdWFyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tdmFyaWFudD1cIkxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLXNpemU9XCJsYXJnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tY29sb3I9XCIjMDMxODJiXCJcclxuICAgICAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IEBlbHNlIGlmIChmaWVsZC50b2dnbGVNYXNrICYmIGZpZWxkLmlzQ29weVRleHQpIHtcclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd1Bhc3N3b3JkID0gIXNob3dQYXNzd29yZFwiXHJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cInNob3dQYXNzd29yZCA9ICFzaG93UGFzc3dvcmRcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgI2ljb25Db250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tbmFtZV09XCJzaG93UGFzc3dvcmQgPyAnZXllLW9wZW4nIDogJ2V5ZS1jbG9zZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi12YXJpYW50PVwiTGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLXNpemU9XCJsYXJnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLWNvbG9yPVwiIzAzMTgyYlwiXHJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29weVRleHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImNvcHlUZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgI2ljb25Db250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tbmFtZT1cInR3by1zcXVhcmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1jb2xvcj1cIiMwMzE4MmJcIlxyXG4gICAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICBAaWYgKGZpZWxkLmhhc0dlbmVyYXRlS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZpZWxkLm9uR2VuZXJhdGVLZXkgJiYgZmllbGQub25HZW5lcmF0ZUtleSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJmaWVsZC5vbkdlbmVyYXRlS2V5ICYmIGZpZWxkLm9uR2VuZXJhdGVLZXkoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnb3BhY2l0eS01MCBjdXJzb3Itbm90LWFsbG93ZWQnOiAhY29udHJvbC52YWx1ZSB9XCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1uYW1lPVwicm91bmQtYXJyb3ctdG9wLWxlZnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLWNvbG9yPVwiIzAzMTgyYlwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPCEtLSBOdW1iZXIgRmllbGQgLS0+XHJcbiAgICAgICAgQGNhc2UgKCdudW1iZXInKSB7XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgW3R5cGVdPVwiZmllbGQudHlwZSA9PT0gJ251bWJlcicgJiYgZmllbGQuaXNDdXJyZW5jeSA/ICd0ZXh0JyA6ICdudW1iZXInXCJcclxuICAgICAgICAgICAgW25hbWVdPVwiZmllbGQubmFtZVwiXHJcbiAgICAgICAgICAgIFtpZF09XCJ1bmlxdWVJZFwiXHJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgW3JlYWRPbmx5XT1cImZpZWxkLnJlYWRPbmx5IHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxyXG4gICAgICAgICAgICBbbWluXT1cImZpZWxkLnR5cGUgPT09ICdudW1iZXInICYmICFmaWVsZC5pc0N1cnJlbmN5ID8gMCA6IG51bGxcIlxyXG4gICAgICAgICAgICBbbWF4XT1cImZpZWxkLnR5cGUgPT09ICdudW1iZXInICYmICFmaWVsZC5pc0N1cnJlbmN5ID8gZmllbGQubWF4IDogbnVsbFwiXHJcbiAgICAgICAgICAgIFtzdGVwXT1cImZpZWxkLnR5cGUgPT09ICdudW1iZXInICYmICFmaWVsZC5pc0N1cnJlbmN5ID8gZmllbGQuc3RlcCB8fCAxIDogbnVsbFwiXHJcbiAgICAgICAgICAgIChpbnB1dCk9XCJoYW5kbGVOdW1iZXJJbnB1dCgkZXZlbnQsIGZpZWxkPy5taW5GcmFjdGlvbkRpZ2l0cyB8fCAyKVwiXHJcbiAgICAgICAgICAgIChwYXN0ZSk9XCJoYW5kbGVOdW1iZXJQYXN0ZSgkZXZlbnQsIGZpZWxkPy5taW5GcmFjdGlvbkRpZ2l0cyB8fCAyKVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cImhhbmRsZUJsdXIoJGV2ZW50LCBmaWVsZD8ubWluRnJhY3Rpb25EaWdpdHMgfHwgMilcIlxyXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVOdW1iZXJLZXlkb3duKCRldmVudCwgZmllbGQ/LmlzQ3VycmVuY3kgfHwgZmFsc2UpXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJmbi1pbnB1dC1maWVsZFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICBkaXNhYmxlZDogY29udHJvbC5kaXNhYmxlZCB8fCBmaWVsZC5yZWFkT25seSxcclxuICAgICAgICAgICAgICBlcnJvcjogY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZXJyb3JzLFxyXG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IGZpZWxkWydoYXNTdWNjZXNzQm9yZGVyJ10gJiYgY29udHJvbC52YWxpZCAmJiAhY29udHJvbC5lcnJvcnMsXHJcbiAgICAgICAgICAgICAgJ3RleHQtWzI0cHhdIGZvbnQtYm9sZCc6IGZpZWxkLmlzQ3VycmVuY3ksXHJcbiAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgY29sb3I6IGZpZWxkLnZhbHVlQ29sb3IgfHwgJ2luaGVyaXQnLFxyXG4gICAgICAgICAgICAgICdmb250LXNpemUnOiBmaWVsZC52YWx1ZVNpemUgfHwgJycsXHJcbiAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygpXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8IS0tIERlZmF1bHQgSW5wdXQgRmllbGQgKHRleHQsIGVtYWlsLCBldGMuKSAtLT5cclxuICAgICAgICBAZGVmYXVsdCB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgei0wXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIFt0eXBlXT1cImZpZWxkLnR5cGVcIlxyXG4gICAgICAgICAgICAgIFtuYW1lXT1cImZpZWxkLm5hbWVcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJ1bmlxdWVJZFwiXHJcbiAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgfHwgJycgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5kaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImZpZWxkLnJlYWRPbmx5IHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIlxyXG4gICAgICAgICAgICAgICAgaXNFbWFpbEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgID8gaGFuZGxlRW1haWxJbnB1dCgkZXZlbnQpXHJcbiAgICAgICAgICAgICAgICAgIDogZmllbGQudHlwZSA9PT0gJ3RleHQnICYmIGlzQWxwaGFudW1lcmljXHJcbiAgICAgICAgICAgICAgICAgICAgPyBoYW5kbGVBbHBoYW51bWVyaWNJbnB1dCgkZXZlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgOiBoYW5kbGVJbnB1dCgkZXZlbnQpXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAoYmx1cik9XCJoYW5kbGVCbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm4taW5wdXQtZmllbGRcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBjb250cm9sLmRpc2FibGVkIHx8IGZpZWxkLnJlYWRPbmx5LFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6IGNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmVycm9ycyxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZpZWxkWydoYXNTdWNjZXNzQm9yZGVyJ10gJiYgY29udHJvbC52YWxpZCAmJiAhY29udHJvbC5lcnJvcnMsXHJcbiAgICAgICAgICAgICAgICAncHItMTAnOiBmaWVsZC5pY29uLFxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgIGNvbG9yOiBmaWVsZC52YWx1ZUNvbG9yIHx8ICdpbmhlcml0JyxcclxuICAgICAgICAgICAgICAgICdmb250LXNpemUnOiBmaWVsZC52YWx1ZVNpemUgfHwgJycsXHJcbiAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIEBpZiAoZmllbGQuaWNvbikge1xyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWJzb2x1dGUgcmlnaHQtMCB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgcHItMyBmbGV4IGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAjaWNvbkNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLW5hbWVdPVwiZmllbGQuaWNvbi5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLXZhcmlhbnRdPVwiZmllbGQuaWNvbi52YXJpYW50XCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLXNpemVdPVwiZ2V0SWNvblNpemVOYW1lKGZpZWxkLmljb24uc2l6ZSlcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tY29sb3JdPVwiY29udHJvbC5kaXNhYmxlZCA/ICcjYzRjZGQyJyA6ICcjMDMxODJiJ1wiXHJcbiAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIEBpZiAoc2hvd0Zvcm1GaWVsZE1lc3NhZ2UoY29udHJvbCwgaGVscGVyVGV4dCkpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cImZuLWZpZWxkLW1lc3NhZ2UtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPHNwYW5cclxuICAgICAgICAgIGNsYXNzPVwiZm4tZmllbGQtbWVzc2FnZS10ZXh0XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgZXJyb3I6IGlzRXJyb3IsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGlzU3VjY2VzcyxcclxuICAgICAgICAgIH1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldEZpZWxkTWVzc2FnZSgpIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxufVxyXG4iXX0=
|
|
1117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm4taW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZm4taW5wdXQvc3JjL2xpYi9mbi1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9mbi1pbnB1dC9zcmMvbGliL2ZuLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUlULFlBQVksR0FFYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsNEJBQTRCO0FBQzVCLE9BQU8sRUFBMEIsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBSUwscUJBQXFCLEdBR3RCLE1BQU0sa0JBQWtCLENBQUM7Ozs7O0FBSTFCLE1BQU0sVUFBVSxHQUEyQjtJQUN6QyxVQUFVLEVBQUUsbVZBQW1WO0lBQy9WLFdBQVcsRUFBRSxpZUFBaWU7SUFDOWUsWUFBWSxFQUFFLHVYQUF1WDtJQUNyWSxzQkFBc0IsRUFBRSxnWkFBZ1o7SUFDeGEsY0FBYyxFQUFFLHlVQUF5VTtJQUN6VixhQUFhLEVBQUUsaWNBQWljO0lBQ2hkLGNBQWMsRUFBRSxrY0FBa2M7Q0FDbmQsQ0FBQztBQVVGLE1BQU0sT0FBTyxPQUFPO0lBbUVXO0lBbEVwQixLQUFLLEdBQUcsRUFBaUIs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Q1EsY0FBYztzQkFBNUMsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBpbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBzaWduYWwsXHJcbiAgVmlld0NoaWxkLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG4vLyBSZW1vdmVkIEh0dHBDbGllbnQgaW1wb3J0XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBtZXJnZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7XHJcbiAgRk5JbnB1dEJhc2UsXHJcbiAgRk5JbnB1dEhlbHBlcixcclxuICBGTklucHV0VG9hc3QsXHJcbiAgREVGQVVMVF9DVVJSRU5DWV9NRVRBLFxyXG4gIFR5cGVJY29uVmFyaWFudCxcclxuICBUeXBlSWNvblNpemUsXHJcbn0gZnJvbSAnLi9mbi1pbnB1dC50eXBlcyc7XHJcblxyXG5leHBvcnQgdHlwZSBUeXBlSWNvblNpemVOYW1lID0gJ2V4dHJhc21hbGwnIHwgJ3NtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJyB8ICd4LWxhcmdlJyB8ICd4eGxhcmdlJztcclxuXHJcbmNvbnN0IENPUkVfSUNPTlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgJ2V5ZS1vcGVuJzogYDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMSAxMnM0LTggMTEtOCAxMSA4IDExIDgtNCA4LTExIDgtMTEtOC0xMS04elwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5gLFxyXG4gICdleWUtY2xvc2UnOiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xNy45NCAxNy45NEExMC4wNyAxMC4wNyAwIDAgMSAxMiAyMGMtNyAwLTExLTgtMTEtOGExOC40NSAxOC40NSAwIDAgMSA1LjA2LTUuOTRNOS45IDQuMjRBOS4xMiA5LjEyIDAgMCAxIDEyIDRjNyAwIDExIDggMTEgOGExOC41IDE4LjUgMCAwIDEtMi4xNiAzLjE5bS02LjcyLTEuMDdhMyAzIDAgMSAxLTQuMjQtNC4yNFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PGxpbmUgeDE9XCIxXCIgeTE9XCIxXCIgeDI9XCIyM1wiIHkyPVwiMjNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbiAgJ3R3by1zcXVhcmUnOiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHJlY3QgeD1cIjlcIiB5PVwiOVwiIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHJ4PVwiMlwiIHJ5PVwiMlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk01IDE1SDRhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOWEyIDIgMCAwIDEgMiAydjFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbiAgJ3JvdW5kLWFycm93LXRvcC1sZWZ0JzogYDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMTIgMmExMCAxMCAwIDEgMCAxMCAxMEExMCAxMCAwIDAgMCAxMiAyem0wIDE4YTggOCAwIDEgMSA4LTggOCA4IDAgMCAxLTggOHpcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPjxwYXRoIGQ9XCJNMTUgOUg5djZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNOSA5bDYgNlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+YCxcclxuICAnY2hlY2stY2lyY2xlJzogYDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMjIgMTEuMDhWMTJhMTAgMTAgMCAxIDEtNS45My05LjE0XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTIyIDRMMTIgMTQuMDFsLTMtM1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+YCxcclxuICAnaW5mby1jaXJjbGUnOiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTIuMDFcIiB5Mj1cIjhcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbiAgJ2FsZXJ0LWNpcmNsZSc6IGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPmAsXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2ZuLWlucHV0JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtGb3Jtc01vZHVsZSwgQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBUcmFuc2xhdGVNb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mbi1pbnB1dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZm4taW5wdXQuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEZOSW5wdXQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBmaWVsZCA9IHt9IGFzIEZOSW5wdXRCYXNlO1xyXG4gIEBJbnB1dCgpIGhlbHBlckhhbmRsZT86IEZOSW5wdXRIZWxwZXI7XHJcbiAgQElucHV0KCkgdG9hc3RTZXJ2aWNlPzogRk5JbnB1dFRvYXN0O1xyXG4gIEBJbnB1dCgpIGN1cnJlbmN5TWV0YSA9IERFRkFVTFRfQ1VSUkVOQ1lfTUVUQTtcclxuICBASW5wdXQoKSBkZWZhdWx0TG9jYWxlID0gJ2VuLVVTJztcclxuICBASW5wdXQoKSBmb3JtITogRm9ybUdyb3VwO1xyXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZmllbGRCbHVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XHJcbiAgaGFzRm9jdXMgPSBzaWduYWwoZmFsc2UpO1xyXG4gIEBWaWV3Q2hpbGQoJ2ZuVGV4dGFyZWEnKSB0ZXh0YXJlYUVsZW1lbnQhOiBFbGVtZW50UmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGRyZW4oJ2ljb25Db250YWluZXInKSBpY29uQ29udGFpbmVycyE6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj47XHJcblxyXG4gIC8vIFJlbW92ZWQgSHR0cENsaWVudCBpbmplY3Rpb25cclxuICBwcml2YXRlIHJlYWRvbmx5IHN1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2l6ZU1hcDogUmVjb3JkPFR5cGVJY29uU2l6ZU5hbWUsIFR5cGVJY29uU2l6ZT4gPSB7XHJcbiAgICBleHRyYXNtYWxsOiAxMCxcclxuICAgIHNtYWxsOiAxNixcclxuICAgIG1lZGl1bTogMjAsXHJcbiAgICBsYXJnZTogMjQsXHJcbiAgICAneC1sYXJnZSc6IDMyLFxyXG4gICAgeHhsYXJnZTogNDgsXHJcbiAgfTtcclxuXHJcbiAgZ2V0SWNvblNpemVOYW1lKHNpemU6IG51bWJlcik6ICdzbWFsbCcgfCAnbWVkaXVtJyB8ICdsYXJnZScgfCAneC1sYXJnZScge1xyXG4gICAgc3dpdGNoIChzaXplKSB7XHJcbiAgICAgIGNhc2UgMTY6XHJcbiAgICAgICAgcmV0dXJuICdzbWFsbCc7XHJcbiAgICAgIGNhc2UgMjA6XHJcbiAgICAgICAgcmV0dXJuICdtZWRpdW0nO1xyXG4gICAgICBjYXNlIDI0OlxyXG4gICAgICAgIHJldHVybiAnbGFyZ2UnO1xyXG4gICAgICBjYXNlIDMyOlxyXG4gICAgICAgIHJldHVybiAneC1sYXJnZSc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICdtZWRpdW0nO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQWxwaGFudW1lcmljKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGQuaXNBbHBoYW51bWVyaWMgIT09IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzRW1haWxGaWVsZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZpZWxkLnR5cGUgPT09ICdlbWFpbCcgfHwgdGhpcy5maWVsZC5uYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdlbWFpbCcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgYWxwaGFudW1lcmljUGF0dGVybigpOiBSZWdFeHAge1xyXG4gICAgaWYgKHRoaXMuZmllbGQuaXNBZGRyZXNzTGluZSkge1xyXG4gICAgICByZXR1cm4gL1teQS1aYS16MC05IFxcLV8mKCksL10vZztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gL1teQS1aYS16MC05IFxcLV8mKCldL2c7XHJcbiAgfVxyXG5cclxuICBpc0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgY29udHJvbCE6IEZvcm1Db250cm9sO1xyXG4gIGlzVmlzaWJsZSA9IHNpZ25hbCh0cnVlKTsgLy8gVHJhY2sgdmlzaWJpbGl0eSBzdGF0ZVxyXG4gIGhlbHBlclRleHQgPSAnJztcclxuXHJcbiAgLy8gVXNlIGEgY291bnRlci1iYXNlZCBhcHByb2FjaCBmb3IgdW5pcXVlIElEcyAoc2FmZXIgdGhhbiBNYXRoLnJhbmRvbSgpKVxyXG4gIHByaXZhdGUgc3RhdGljIGlkQ291bnRlciA9IDA7XHJcbiAgdW5pcXVlSWQgPSBgZm4taW5wdXQtJHsrK0ZOSW5wdXQuaWRDb3VudGVyfWA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5maWVsZC5oaWRkZW4pIHJldHVybjtcclxuICAgIHRoaXMuaGVscGVyVGV4dCA9IHRoaXMuZmllbGQuaGVscGVyVGV4dCA/PyAnJztcclxuICAgIHRoaXMuaW5pdEZvcm1Db250cm9sKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZmllbGQudmFsdWUpIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh0aGlzLmZpZWxkLnZhbHVlKTtcclxuICAgIHRoaXMuc2V0dXBWaXNpYmlsaXR5Q29uZGl0aW9uKCk7XHJcbiAgICB0aGlzLnNldHVwRmllbGRNZXNzYWdlTGlzdGVuZXIoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJzLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snZmllbGQnXSB8fCBjaGFuZ2VzWydmb3JtJ10pIHtcclxuICAgICAgdGhpcy51cGRhdGVBbGxJY29ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEZpZWxkTWVzc2FnZUxpc3RlbmVyKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNvbnRyb2wpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB2YWwkID0gdGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmNvbnRyb2wudmFsdWUpKTtcclxuICAgIGNvbnN0IHN0YXR1cyQgPSB0aGlzLmNvbnRyb2wuc3RhdHVzQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmNvbnRyb2wuc3RhdHVzKSk7XHJcblxyXG4gICAgdGhpcy5zdWJzLmFkZChcclxuICAgICAgbWVyZ2UodmFsJCwgc3RhdHVzJCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybignQ0RSIGRldGVjdENoYW5nZXMgZmFpbGVkIGR1cmluZyBmaWVsZCBtZXNzYWdlIHVwZGF0ZTonLCBlKTtcclxuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgLy8gQWNjZXNzIHRoZSB0ZXh0YXJlYSBlbGVtZW50IGJ5IFZpZXdDaGlsZCBvciBuYXRpdmUgZWxlbWVudCByZWZlcmVuY2VcclxuICAgIHRoaXMuYXV0b1Jlc2l6ZUluaXRpYWwoKTtcclxuICAgIGlmICh0aGlzLmZpZWxkLnR5cGUgPT09ICd0ZXh0YXJlYScgJiYgdGhpcy5jb250cm9sPy52YWx1ZSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYXV0b1Jlc2l6ZUluaXRpYWwoKSwgMzApO1xyXG4gICAgfVxyXG4gICAgLy8gQXBwbHkgaW5pdGlhbCBmb3JtYXR0aW5nIGFmdGVyIHZpZXcgaXMgaW5pdGlhbGl6ZWRcclxuICAgIGlmICh0aGlzLmZpZWxkLnR5cGUgPT09ICdudW1iZXInICYmIHRoaXMuZmllbGQuaXNDdXJyZW5jeSAmJiB0aGlzLmNvbnRyb2w/LnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZm9ybWF0SW5pdGlhbEN1cnJlbmN5VmFsdWUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGVuZm9yY2VMb3dlcmNhc2UoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3Qgc3RhcnQgPSBpbnB1dC5zZWxlY3Rpb25TdGFydDtcclxuICAgIGNvbnN0IGVuZCA9IGlucHV0LnNlbGVjdGlvbkVuZDtcclxuXHJcbiAgICBpbnB1dC52YWx1ZSA9IGlucHV0LnZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAodGhpcy5jb250cm9sKSB7XHJcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShpbnB1dC52YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogaW5wdXQudmFsdWUgfSk7XHJcblxyXG4gICAgLy8gcmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gc28gdHlwaW5nIGlzIHNtb290aFxyXG4gICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgZW1haWwgaW5wdXQgLSBhbGxvd3Mgb25seSB2YWxpZCBlbWFpbCBjaGFyYWN0ZXJzIGFuZCBlbmZvcmNlcyBsb3dlcmNhc2UuXHJcbiAgICogQWxsb3dlZDogYS16LCAwLTksIC4gXyArIC0gQFxyXG4gICAqIFJ1bGVzOlxyXG4gICAqIC0gT25seSBvbmUgQCBhbGxvd2VkXHJcbiAgICogLSBObyBjb25zZWN1dGl2ZSBkb3RzICguLilcclxuICAgKiAtIEF1dG9tYXRpYyBsb3dlcmNhc2VcclxuICAgKi9cclxuICBoYW5kbGVFbWFpbElucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgfHwgMDtcclxuICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSBpbnB1dC52YWx1ZTtcclxuXHJcbiAgICAvLyAxLiBDb252ZXJ0IHRvIGxvd2VyY2FzZVxyXG4gICAgY29uc3QgbG93ZXJWYWx1ZSA9IG9yaWdpbmFsVmFsdWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAvLyAyLiBTcGxpdCBhdCB0aGUgZmlyc3QgQCB0byBoYW5kbGUgbG9jYWwgYW5kIGRvbWFpbiBwYXJ0cyBzZXBhcmF0ZWx5XHJcbiAgICBjb25zdCBwYXJ0cyA9IGxvd2VyVmFsdWUuc3BsaXQoJ0AnKTtcclxuICAgIGxldCBsb2NhbFBhcnQgPSBwYXJ0c1swXTtcclxuICAgIGxldCBkb21haW5QYXJ0ID0gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzLnNsaWNlKDEpLmpvaW4oJycpIDogbnVsbDtcclxuXHJcbiAgICAvLyAzLiBGaWx0ZXIgbG9jYWwgcGFydDogYS16LCAwLTksIC4sIF8sICssIC1cclxuICAgIC8vIFJ1bGU6IENhbm5vdCBzdGFydCB3aXRoIGEgZG90ICguKVxyXG4gICAgbG9jYWxQYXJ0ID0gbG9jYWxQYXJ0LnJlcGxhY2VBbGwoL1teYS16MC05Ll8rLV0vZywgJycpO1xyXG4gICAgd2hpbGUgKGxvY2FsUGFydC5zdGFydHNXaXRoKCcuJykpIHtcclxuICAgICAgbG9jYWxQYXJ0ID0gbG9jYWxQYXJ0LnN1YnN0cmluZygxKTtcclxuICAgIH1cclxuICAgIHdoaWxlIChsb2NhbFBhcnQuaW5jbHVkZXMoJy4uJykpIHtcclxuICAgICAgbG9jYWxQYXJ0ID0gbG9jYWxQYXJ0LnJlcGxhY2VBbGwoJy4uJywgJy4nKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA0LiBGaWx0ZXIgZG9tYWluIHBhcnQ6IGEteiwgMC05LCAuLCAtXHJcbiAgICAvLyBSdWxlOiBObyB1bmRlcnNjb3JlcyAoXyksIG5vIHBsdXMgc2lnbnMgKCspLCBjYW5ub3Qgc3RhcnQgd2l0aCBhIGh5cGhlbiAoLSlcclxuICAgIGxldCBmaWx0ZXJlZFZhbHVlID0gbG9jYWxQYXJ0O1xyXG4gICAgaWYgKGRvbWFpblBhcnQgIT09IG51bGwpIHtcclxuICAgICAgZG9tYWluUGFydCA9IGRvbWFpblBhcnQucmVwbGFjZUFsbCgvW15hLXowLTkuLV0vZywgJycpO1xyXG4gICAgICB3aGlsZSAoZG9tYWluUGFydC5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICBkb21haW5QYXJ0ID0gZG9tYWluUGFydC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgIH1cclxuICAgICAgd2hpbGUgKGRvbWFpblBhcnQuaW5jbHVkZXMoJy4uJykpIHtcclxuICAgICAgICBkb21haW5QYXJ0ID0gZG9tYWluUGFydC5yZXBsYWNlQWxsKCcuLicsICcuJyk7XHJcbiAgICAgIH1cclxuICAgICAgZmlsdGVyZWRWYWx1ZSArPSAnQCcgKyBkb21haW5QYXJ0O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcmlnaW5hbFZhbHVlICE9PSBmaWx0ZXJlZFZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IGNoYXJzUmVtb3ZlZEJlZm9yZUN1cnNvciA9IHRoaXMuY291bnRSZW1vdmVkQ2hhcnNCZWZvcmVDdXJzb3IoXHJcbiAgICAgICAgb3JpZ2luYWxWYWx1ZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgIGZpbHRlcmVkVmFsdWUsXHJcbiAgICAgICAgY3Vyc29yUG9zaXRpb24sXHJcbiAgICAgICk7XHJcbiAgICAgIGlucHV0LnZhbHVlID0gZmlsdGVyZWRWYWx1ZTtcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGZpbHRlcmVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gTWF0aC5tYXgoMCwgY3Vyc29yUG9zaXRpb24gLSBjaGFyc1JlbW92ZWRCZWZvcmVDdXJzb3IpO1xyXG4gICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShuZXdDdXJzb3JQb3MsIG5ld0N1cnNvclBvcyk7XHJcbiAgICB9IGVsc2UgaWYgKG9yaWdpbmFsVmFsdWUgIT09IGxvd2VyVmFsdWUpIHtcclxuICAgICAgLy8gSWYgb25seSBjYXNlIGNoYW5nZWQgKGUuZy4sIHR5cGVkIFVwcGVyY2FzZSlcclxuICAgICAgaW5wdXQudmFsdWUgPSBmaWx0ZXJlZFZhbHVlO1xyXG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoZmlsdGVyZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShjdXJzb3JQb3NpdGlvbiwgY3Vyc29yUG9zaXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpZWxkLnR5cGUgPT09ICdwYXNzd29yZCcgJiYgdGhpcy5maWVsZC5mZWVkYmFjaykge1xyXG4gICAgICB0aGlzLmNoZWNrUGFzc3dvcmRTdHJlbmd0aChmaWx0ZXJlZFZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiBmaWx0ZXJlZFZhbHVlIH0pO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIG9uRm9jdXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhhc0ZvY3VzLnNldCh0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0SW5pdGlhbEN1cnJlbmN5VmFsdWUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBudW1lcmljVmFsdWUgPSBOdW1iZXIodGhpcy5jb250cm9sLnZhbHVlKTtcclxuICAgIGlmICghTnVtYmVyLmlzTmFOKG51bWVyaWNWYWx1ZSkpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy51bmlxdWVJZCkgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICBpZiAoaW5wdXRFbGVtZW50KSB7XHJcbiAgICAgICAgICBpbnB1dEVsZW1lbnQudmFsdWUgPSB0aGlzLmZvcm1hdEN1cnJlbmN5V2l0aENvbW1hcyhudW1lcmljVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgNTApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdEZvcm1Db250cm9sKCkge1xyXG4gICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuZm9ybS5jb250cm9scz8uW3RoaXMuZmllbGQubmFtZV07XHJcbiAgICB0aGlzLmNvbnRyb2wgPSBjb250cm9sbGVyIGFzIEZvcm1Db250cm9sO1xyXG4gICAgaWYgKHRoaXMuZmllbGQudmFsdWUpIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh0aGlzLmZpZWxkLnZhbHVlKTtcclxuXHJcbiAgICBpZiAodGhpcy5jb250cm9sKSB7XHJcbiAgICAgIC8vIEhhbmRsZSBkaXNhYmxlZCBzdGF0ZVxyXG4gICAgICBpZiAodGhpcy5maWVsZC5kaXNhYmxlZCA/PyBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMuY29udHJvbD8uZGlzYWJsZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY29udHJvbD8uZW5hYmxlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGF1dG9SZXNpemVJbml0aWFsKCkge1xyXG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnRleHRhcmVhRWxlbWVudD8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmICh0ZXh0YXJlYSkge1xyXG4gICAgICAvLyBHZXQgdGhlIG51bWJlciBvZiByb3dzIChkZWZhdWx0IHRvIDIgaWYgbm90IHNwZWNpZmllZClcclxuICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZmllbGQucm93cyB8fCAxO1xyXG5cclxuICAgICAgLy8gQ2FsY3VsYXRlIGxpbmUgaGVpZ2h0IGZyb20gY29tcHV0ZWQgc3R5bGVzXHJcbiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnbG9iYWxUaGlzLmdldENvbXB1dGVkU3R5bGUodGV4dGFyZWEpO1xyXG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gTnVtYmVyLnBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5saW5lSGVpZ2h0KSB8fCAzMjsgLy8gRGVmYXVsdCB0byAyNHB4IGlmIG5vdCBzZXRcclxuXHJcbiAgICAgIC8vIENhbGN1bGF0ZSBtaW5pbXVtIGhlaWdodCBiYXNlZCBvbiByb3dzXHJcbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IHJvd3MgKiBsaW5lSGVpZ2h0O1xyXG5cclxuICAgICAgLy8gUmVzZXQgaGVpZ2h0IHRvIGF1dG8gdG8gZ2V0IGFjY3VyYXRlIHNjcm9sbEhlaWdodFxyXG4gICAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XHJcblxyXG4gICAgICAvLyBVc2UgdGhlIGxhcmdlciBvZiBzY3JvbGxIZWlnaHQgb3IgbWluSGVpZ2h0XHJcbiAgICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWF4KHRleHRhcmVhLnNjcm9sbEhlaWdodCwgbWluSGVpZ2h0KTtcclxuICAgICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gbmV3SGVpZ2h0ICsgJ3B4JztcclxuICAgICAgdGV4dGFyZWEuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVRleHRBcmVhKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50O1xyXG4gICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBlbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9IGVsZW1lbnQudmFsdWU7XHJcblxyXG4gICAgLy8gQXBwbHkgYWxwaGFudW1lcmljIGZpbHRlcmluZyBpZiBlbmFibGVkXHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSAndGV4dGFyZWEnICYmIHRoaXMuaXNBbHBoYW51bWVyaWMpIHtcclxuICAgICAgLy8gT25seSBhbGxvdyBjaGFyYWN0ZXJzIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBwYXR0ZXJuXHJcbiAgICAgIGNvbnN0IGFscGhhbnVtZXJpY1BhdHRlcm4gPSB0aGlzLmFscGhhbnVtZXJpY1BhdHRlcm47XHJcbiAgICAgIGxldCBmaWx0ZXJlZFZhbHVlID0gb3JpZ2luYWxWYWx1ZS5yZXBsYWNlQWxsKGFscGhhbnVtZXJpY1BhdHRlcm4sICcnKTtcclxuXHJcbiAgICAgIC8vIFByZXZlbnQgbGVhZGluZyBzcGFjZXNcclxuICAgICAgaWYgKGZpbHRlcmVkVmFsdWUuc3RhcnRzV2l0aCgnICcpKSB7XHJcbiAgICAgICAgZmlsdGVyZWRWYWx1ZSA9IGZpbHRlcmVkVmFsdWUudHJpbVN0YXJ0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFJlcGxhY2UgbXVsdGlwbGUgY29uc2VjdXRpdmUgc3BhY2VzIHdpdGggc2luZ2xlIHNwYWNlXHJcbiAgICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnJlcGxhY2VBbGwoL1xcc3syLH0vZywgJyAnKTtcclxuXHJcbiAgICAgIGlmIChvcmlnaW5hbFZhbHVlICE9PSBmaWx0ZXJlZFZhbHVlKSB7XHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1vdmVkIGJlZm9yZSB0aGUgY3Vyc29yIHBvc2l0aW9uXHJcbiAgICAgICAgY29uc3QgY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yID0gb3JpZ2luYWxWYWx1ZS5sZW5ndGggLSBmaWx0ZXJlZFZhbHVlLmxlbmd0aDtcclxuICAgICAgICBlbGVtZW50LnZhbHVlID0gZmlsdGVyZWRWYWx1ZTtcclxuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoZmlsdGVyZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIC8vIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uIC0gYWNjb3VudCBmb3IgcmVtb3ZlZCBjaGFyYWN0ZXJzXHJcbiAgICAgICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gTWF0aC5tYXgoMCwgKGN1cnNvclBvc2l0aW9uIHx8IDApIC0gY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yKTtcclxuICAgICAgICBlbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKG5ld0N1cnNvclBvcywgbmV3Q3Vyc29yUG9zKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaW5jcmVhc2UgaGVpZ2h0XHJcbiAgICAgIHRoaXMuYXV0b1Jlc2l6ZUluaXRpYWwoKTtcclxuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogZmlsdGVyZWRWYWx1ZSB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBmaWx0ZXJlZFZhbHVlID0gb3JpZ2luYWxWYWx1ZTtcclxuXHJcbiAgICAgIC8vIFN0cmljdCBmaWx0ZXJpbmcgaWYgIWlzQWxwaGFudW1lcmljXHJcbiAgICAgIGlmICghdGhpcy5pc0FscGhhbnVtZXJpYykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdpc0FscGhhbnVtZXJpYycsIHRoaXMuaXNBbHBoYW51bWVyaWMpO1xyXG5cclxuICAgICAgICBjb25zdCBhbGxvd2VkUGF0dGVybiA9IC9bXmEtekEtWjAtOVxccygpe31bXFxdOywuXCI9JytcXC0qLzw+ISZ8JV9AJD86XS9nO1xyXG4gICAgICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnJlcGxhY2VBbGwoYWxsb3dlZFBhdHRlcm4sICcnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUHJldmVudCBsZWFkaW5nIHNwYWNlc1xyXG4gICAgICBpZiAoZmlsdGVyZWRWYWx1ZS5zdGFydHNXaXRoKCcgJykpIHtcclxuICAgICAgICBmaWx0ZXJlZFZhbHVlID0gZmlsdGVyZWRWYWx1ZS50cmltU3RhcnQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmVwbGFjZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXMgd2l0aCBzaW5nbGUgc3BhY2VcclxuICAgICAgZmlsdGVyZWRWYWx1ZSA9IGZpbHRlcmVkVmFsdWUucmVwbGFjZUFsbCgvXFxzezIsfS9nLCAnICcpO1xyXG5cclxuICAgICAgaWYgKG9yaWdpbmFsVmFsdWUgIT09IGZpbHRlcmVkVmFsdWUpIHtcclxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbW92ZWQgYmVmb3JlIHRoZSBjdXJzb3IgcG9zaXRpb25cclxuICAgICAgICBjb25zdCBjaGFyc1JlbW92ZWRCZWZvcmVDdXJzb3IgPSBvcmlnaW5hbFZhbHVlLmxlbmd0aCAtIGZpbHRlcmVkVmFsdWUubGVuZ3RoO1xyXG4gICAgICAgIGVsZW1lbnQudmFsdWUgPSBmaWx0ZXJlZFZhbHVlO1xyXG4gICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShmaWx0ZXJlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgLy8gUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gLSBhY2NvdW50IGZvciByZW1vdmVkIGNoYXJhY3RlcnNcclxuICAgICAgICBjb25zdCBuZXdDdXJzb3JQb3MgPSBNYXRoLm1heCgwLCAoY3Vyc29yUG9zaXRpb24gfHwgMCkgLSBjaGFyc1JlbW92ZWRCZWZvcmVDdXJzb3IpO1xyXG4gICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UobmV3Q3Vyc29yUG9zLCBuZXdDdXJzb3JQb3MpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBpbmNyZWFzZSBoZWlnaHRcclxuICAgICAgdGhpcy5hdXRvUmVzaXplSW5pdGlhbCgpO1xyXG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiBmaWx0ZXJlZFZhbHVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSB0YXJnZXQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gdGFyZ2V0LnZhbHVlO1xyXG5cclxuICAgIGxldCBmaWx0ZXJlZFZhbHVlID0gb3JpZ2luYWxWYWx1ZTtcclxuXHJcbiAgICAvLyBJRiBOT1QgYWxwaGFudW1lcmljLCB1c2VyIHdhbnRzIHN0cmljdCBmaWx0ZXJpbmc6XHJcbiAgICAvLyBcIm9ubHkgYWNjZXB0IHRpaHMuKSB7fSBbXSA7ICwgLiBcIiAnID0gKyAtICogLyA8ID4gISAmIHwgJSAmXyggKS0vLjtAISwgJCUgOiBkb250IGFsbG93IGVtb2ppXCJcclxuICAgIC8vIEludGVycHJldGF0aW9uOiBBbGxvdyBhbHBoYW51bWVyaWMgKyBzcGVjaWZpZWQgc3BlY2lhbCBjaGFycy4gQmFuIGVtb2ppcy5cclxuICAgIC8vIEFjdHVhbGx5LCB0aGUgdXNlciBzYWlkOiBcImlmIGlzQWxwaGFudW1lcmljIGZhbHNlIG9ubHkgYWNjZXB0Li4uXCJcclxuICAgIC8vIFNvIGlmIGlzQWxwaGFudW1lcmljIGlzIFRSVUUsIHdlIHVzZSB0aGUgZXhpc3RpbmcgaGFuZGxlQWxwaGFudW1lcmljSW5wdXQgbG9naWMgKG9yIHNpbWlsYXIpLlxyXG4gICAgLy8gVGhlIGN1cnJlbnQgbG9naWMgaW4gaGFuZGxlSW5wdXQgaXMgZ2VuZXJpYy5cclxuICAgIC8vIFRoZSBleGlzdGluZyBjb2RlIGhhcyBhIHNlcGFyYXRlIGBoYW5kbGVBbHBoYW51bWVyaWNJbnB1dGAgbWV0aG9kIGJ1dCBpdCdzIG5vdCBjYWxsZWQgaGVyZT9cclxuICAgIC8vIFdhaXQsIHRoZSB0ZW1wbGF0ZSBsaWtlbHkgY2FsbHMgYGhhbmRsZUFscGhhbnVtZXJpY0lucHV0YCBpZiBgaXNBbHBoYW51bWVyaWNgIGlzIHRydWUsIG9yIGBoYW5kbGVJbnB1dGAgb3RoZXJ3aXNlP1xyXG4gICAgLy8gTGV0J3MgY2hlY2sgdGhlIHRlbXBsYXRlLlxyXG4gICAgLy8gQlVUIGFzc3VtaW5nIGBoYW5kbGVJbnB1dGAgaXMgdGhlIGdlbmVyaWMgaGFuZGxlcjpcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNBbHBoYW51bWVyaWMpIHtcclxuICAgICAgLy8gUmVnZXggdG8gYWxsb3c6IGEteiwgQS1aLCAwLTksIGFuZDogKSB7fSBbXSA7ICwgLiBcIiAnID0gKyAtICogLyA8ID4gISAmIHwgJSBfICggLSBAICQgPyA6XHJcbiAgICAgIC8vIE5vdGU6IFVzZXIgbGlzdDogKSB7fSBbXSA7ICwgLiBcIiAnID0gKyAtICogLyA8ID4gISAmIHwgJSAmXyggKS0vLjtAISwgJCVcclxuICAgICAgLy8gQ29tYmluZWQgdW5pcXVlIHNwZWNpYWwgY2hhcnM6ICkgeyB9IFsgXSA7ICwgLiBcIiAnID0gKyAtICogLyA8ID4gISAmIHwgJSBfICggQCAkID8gOlxyXG4gICAgICAvLyBBbHNvIHNwYWNlIGlzIGltcGxpZWQ/IHVzdWFsbHkgeWVzLlxyXG4gICAgICAvLyBBbmQgTk8gRU1PSklTLlxyXG4gICAgICAvLyBlYXNpZXIgdG8ganVzdCByZXBsYWNlIGFueXRoaW5nIE5PVCBpbiB0aGUgYWxsb3dlZCBzZXQuXHJcblxyXG4gICAgICAvLyBBbGxvd2VkIGNoYXJzIHJlZ2V4IHBhdHRlcm46XHJcbiAgICAgIC8vIEEtWmEtejAtOVxyXG4gICAgICAvLyBTcGFjZTogXFxzXHJcbiAgICAgIC8vIFNwZWNpYWw6ICgpe31bXFxdOywuXCI9JytcXC0qLzw+ISZ8JV9AJD86XHJcbiAgICAgIC8vIE5vdGU6IC0gaW5zaWRlIFtdIG5lZWRzIHRvIGJlIGVzY2FwZWQgb3IgYXQgZW5kLiBdIG5lZWRzIGVzY2FwZS4gXFwgbmVlZHMgZXNjYXBlPyAobm90IGluIGxpc3QpLlxyXG4gICAgICAvLyBVc2VyIGxpc3QgaGFzOiBgLmAgYFwiYCBgJ2AgYD9gICh3YWl0LCA/IG5vdCBpbiBsaXN0PylcclxuICAgICAgLy8gVXNlciBsaXN0OiBgKSB7fSBbXSA7ICwgLiBcIiAnID0gKyAtICogLyA8ID4gISAmIHwgJSAmXyggKS0vLjtAISwgJCVgXHJcbiAgICAgIC8vIFVuaXF1ZXM6ICkgeyB9IFsgXSA7ICwgLiBcIiAnID0gKyAtICogLyA8ID4gISAmIHwgJSBfICggQCAkXHJcbiAgICAgIC8vIChUaGUgYCZgIGlzIHJlcGVhdGVkLCBgLmAgcmVwZWF0ZWQsIGAsYCByZXBlYXRlZCBldGMuKVxyXG4gICAgICAvLyBJIHdpbGwgY3JlYXRlIGEgcmVnZXggdGhhdCBtYXRjaGVzIGFueXRoaW5nIE5PVCBpbiB0aGlzIGxpc3QgYW5kIHJlcGxhY2Ugd2l0aCBlbXB0eSBzdHJpbmcuXHJcblxyXG4gICAgICAvLyBbXmEtekEtWjAtOVxccygpe31bXFxdOywuXCI9JytcXC0qLzw+ISZ8JV9AJF1cclxuICAgICAgLy8gTm90ZTogYCpgLCBgK2AsIGA/YCBldGMgbmVlZCBlc2NhcGluZyBpbiByZWdleCBpZiBvdXRzaWRlIFtdLCBidXQgaW5zaWRlIFtdIHRoZXkgYXJlIGxpdGVyYWxzIG1vc3RseS5cclxuICAgICAgLy8gYC1gIG5lZWRzIHRvIGJlIGxhc3Qgb3IgZXNjYXBlZC4gYF1gIG5lZWRzIGVzY2FwZS4gYF5gIG5lZWRzIGVzY2FwZSBpZiBmaXJzdD8gTm8sIGludmFsaWQgaGVyZS5cclxuICAgICAgLy8gTGV0J3MgdmVyaWZ5IHZhbGlkIGNoYXJzOlxyXG4gICAgICAvLyBhLXogQS1aIDAtOVxyXG4gICAgICAvLyBzcGFjZVxyXG4gICAgICAvLyApIHsgfSBbIF0gOyAsIC4gXCIgJyA9ICsgLSAqIC8gPCA+ICEgJiB8ICUgXyAoIEAgJCA6XHJcblxyXG4gICAgICBjb25zdCBhbGxvd2VkUGF0dGVybiA9IC9bXmEtekEtWjAtOVxccygpe31bXFxdOywuXCI9JytcXC0qLzw+ISZ8JV9AJD86XS9nO1xyXG4gICAgICBmaWx0ZXJlZFZhbHVlID0gZmlsdGVyZWRWYWx1ZS5yZXBsYWNlQWxsKGFsbG93ZWRQYXR0ZXJuLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJldmVudCBsZWFkaW5nIHNwYWNlc1xyXG4gICAgaWYgKGZpbHRlcmVkVmFsdWUuc3RhcnRzV2l0aCgnICcpKSB7XHJcbiAgICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnRyaW1TdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlcGxhY2VBbGwgbXVsdGlwbGUgY29uc2VjdXRpdmUgc3BhY2VzIHdpdGggc2luZ2xlIHNwYWNlXHJcbiAgICBmaWx0ZXJlZFZhbHVlID0gZmlsdGVyZWRWYWx1ZS5yZXBsYWNlQWxsKC9cXHN7Mix9L2csICcgJyk7XHJcblxyXG4gICAgaWYgKG9yaWdpbmFsVmFsdWUgIT09IGZpbHRlcmVkVmFsdWUpIHtcclxuICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1vdmVkIGJlZm9yZSB0aGUgY3Vyc29yIHBvc2l0aW9uXHJcbiAgICAgIGNvbnN0IGNoYXJzUmVtb3ZlZEJlZm9yZUN1cnNvciA9IG9yaWdpbmFsVmFsdWUubGVuZ3RoIC0gZmlsdGVyZWRWYWx1ZS5sZW5ndGg7XHJcbiAgICAgIHRhcmdldC52YWx1ZSA9IGZpbHRlcmVkVmFsdWU7XHJcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShmaWx0ZXJlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIC8vIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uIC0gYWNjb3VudCBmb3IgcmVtb3ZlZCBjaGFyYWN0ZXJzXHJcbiAgICAgIGNvbnN0IG5ld0N1cnNvclBvcyA9IE1hdGgubWF4KDAsIChjdXJzb3JQb3NpdGlvbiB8fCAwKSAtIGNoYXJzUmVtb3ZlZEJlZm9yZUN1cnNvcik7XHJcbiAgICAgIHRhcmdldC5zZXRTZWxlY3Rpb25SYW5nZShuZXdDdXJzb3JQb3MsIG5ld0N1cnNvclBvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVHJhaWxpbmcgc3BhY2VzIHdpbGwgYmUgdHJpbW1lZCBvbiBibHVyLCBub3QgZHVyaW5nIGlucHV0XHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSAncGFzc3dvcmQnICYmIHRoaXMuZmllbGQuZmVlZGJhY2spIHtcclxuICAgICAgdGhpcy5jaGVja1Bhc3N3b3JkU3RyZW5ndGgoZmlsdGVyZWRWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdGhpcy5maWVsZC5uYW1lLCB2YWx1ZTogZmlsdGVyZWRWYWx1ZSB9KTtcclxuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgYWxwaGFudW1lcmljIGlucHV0IC0gYWxsb3dzIG9ubHkgbGV0dGVycywgbnVtYmVycywgYW5kIHNwZWNpZmljIHNwZWNpYWwgY2hhcmFjdGVyc1xyXG4gICAqIEFsbG93ZWQ6IEEtWiwgYS16LCAwLTksIHNwYWNlLCBoeXBoZW4sIHVuZGVyc2NvcmUsIGFtcGVyc2FuZCwgYW5kIHBhcmVudGhlc2VzXHJcbiAgICogQWxzbyBwcmV2ZW50cyBsZWFkaW5nIHNwYWNlcyBhbmQgbXVsdGlwbGUgY29uc2VjdXRpdmUgc3BhY2VzXHJcbiAgICovXHJcbiAgaGFuZGxlQWxwaGFudW1lcmljSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gdGFyZ2V0LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9IHRhcmdldC52YWx1ZTtcclxuXHJcbiAgICAvLyBPbmx5IGFsbG93IGNoYXJhY3RlcnMgYmFzZWQgb24gdGhlIHNlbGVjdGVkIHBhdHRlcm5cclxuICAgIGNvbnN0IGFscGhhbnVtZXJpY1BhdHRlcm4gPSB0aGlzLmFscGhhbnVtZXJpY1BhdHRlcm47XHJcbiAgICBsZXQgZmlsdGVyZWRWYWx1ZSA9IG9yaWdpbmFsVmFsdWUucmVwbGFjZUFsbChhbHBoYW51bWVyaWNQYXR0ZXJuLCAnJyk7XHJcblxyXG4gICAgLy8gUHJldmVudCBsZWFkaW5nIHNwYWNlc1xyXG4gICAgaWYgKGZpbHRlcmVkVmFsdWUuc3RhcnRzV2l0aCgnICcpKSB7XHJcbiAgICAgIGZpbHRlcmVkVmFsdWUgPSBmaWx0ZXJlZFZhbHVlLnRyaW1TdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlcGxhY2UgbXVsdGlwbGUgY29uc2VjdXRpdmUgc3BhY2VzIHdpdGggc2luZ2xlIHNwYWNlXHJcbiAgICBmaWx0ZXJlZFZhbHVlID0gZmlsdGVyZWRWYWx1ZS5yZXBsYWNlQWxsKC9cXHN7Mix9L2csICcgJyk7XHJcblxyXG4gICAgaWYgKG9yaWdpbmFsVmFsdWUgIT09IGZpbHRlcmVkVmFsdWUpIHtcclxuICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1vdmVkIGJlZm9yZSB0aGUgY3Vyc29yIHBvc2l0aW9uXHJcbiAgICAgIGNvbnN0IGNoYXJzUmVtb3ZlZEJlZm9yZUN1cnNvciA9IG9yaWdpbmFsVmFsdWUubGVuZ3RoIC0gZmlsdGVyZWRWYWx1ZS5sZW5ndGg7XHJcbiAgICAgIHRhcmdldC52YWx1ZSA9IGZpbHRlcmVkVmFsdWU7XHJcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShmaWx0ZXJlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIC8vIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uIC0gYWNjb3VudCBmb3IgcmVtb3ZlZCBjaGFyYWN0ZXJzXHJcbiAgICAgIGNvbnN0IG5ld0N1cnNvclBvcyA9IE1hdGgubWF4KDAsIChjdXJzb3JQb3NpdGlvbiB8fCAwKSAtIGNoYXJzUmVtb3ZlZEJlZm9yZUN1cnNvcik7XHJcbiAgICAgIHRhcmdldC5zZXRTZWxlY3Rpb25SYW5nZShuZXdDdXJzb3JQb3MsIG5ld0N1cnNvclBvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZmllbGQudHlwZSA9PT0gJ3Bhc3N3b3JkJyAmJiB0aGlzLmZpZWxkLmZlZWRiYWNrKSB7XHJcbiAgICAgIHRoaXMuY2hlY2tQYXNzd29yZFN0cmVuZ3RoKGZpbHRlcmVkVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHRoaXMuZmllbGQubmFtZSwgdmFsdWU6IGZpbHRlcmVkVmFsdWUgfSk7XHJcbiAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQmx1cihlOiBFdmVudCwgbWF4RGVjaW1hbHM6IG51bWJlciA9IDIpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFzRm9jdXMuc2V0KGZhbHNlKTtcclxuICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50O1xyXG4gICAgY29uc3QgY2xlYW5WYWx1ZVN0cmluZyA9IHRhcmdldC52YWx1ZTtcclxuXHJcbiAgICBpZiAoIWNsZWFuVmFsdWVTdHJpbmcpIHtcclxuICAgICAgdGhpcy5maWVsZEJsdXIuZW1pdCh7IG5hbWU6IHRoaXMuZmllbGQubmFtZSwgdmFsdWU6ICcnIH0pO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEZWxlZ2F0ZSB0byB0eXBlLXNwZWNpZmljIGhhbmRsZXJzXHJcbiAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSAndGV4dCcgfHwgdGhpcy5maWVsZC50eXBlID09PSAndGV4dGFyZWEnKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlVGV4dEZpZWxkQmx1cih0YXJnZXQsIGNsZWFuVmFsdWVTdHJpbmcpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmZpZWxkLnR5cGUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlTnVtYmVyRmllbGRCbHVyKHRhcmdldCwgY2xlYW5WYWx1ZVN0cmluZywgbWF4RGVjaW1hbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEVtaXQgZmluYWwgdmFsdWVcclxuICAgIHRoaXMuZmllbGRCbHVyLmVtaXQoe1xyXG4gICAgICBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsXHJcbiAgICAgIHZhbHVlOiB0YXJnZXQudmFsdWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBibHVyIGZvciB0ZXh0IGFuZCB0ZXh0YXJlYSBmaWVsZHMgLSB0cmltIHRyYWlsaW5nIHNwYWNlc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFuZGxlVGV4dEZpZWxkQmx1cihcclxuICAgIHRhcmdldDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQsXHJcbiAgICBjbGVhblZhbHVlU3RyaW5nOiBzdHJpbmcsXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCB0cmltbWVkID0gY2xlYW5WYWx1ZVN0cmluZy50cmltKCk7XHJcbiAgICBpZiAoY2xlYW5WYWx1ZVN0cmluZyAhPT0gdHJpbW1lZCkge1xyXG4gICAgICB0YXJnZXQudmFsdWUgPSB0cmltbWVkO1xyXG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodHJpbW1lZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGJsdXIgZm9yIG51bWJlciBmaWVsZHMgLSB2YWxpZGF0ZSBhbmQgZm9ybWF0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVOdW1iZXJGaWVsZEJsdXIoXHJcbiAgICB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50LFxyXG4gICAgY2xlYW5WYWx1ZVN0cmluZzogc3RyaW5nLFxyXG4gICAgbWF4RGVjaW1hbHM6IG51bWJlcixcclxuICApOiB2b2lkIHtcclxuICAgIC8vIFJlbW92ZSBjb21tYXMgZm9yIHBhcnNpbmcvdmFsaWRhdGlvblxyXG4gICAgY29uc3QgbnVtU3RyaW5nID0gY2xlYW5WYWx1ZVN0cmluZy5yZXBsYWNlQWxsKCcsJywgJycpO1xyXG5cclxuICAgIC8vIENoZWNrIGlmIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBudW1iZXIgZm9ybWF0XHJcbiAgICBjb25zdCBpc1ZhbGlkTnVtYmVyRm9ybWF0ID0gL14tP1xcZCsoXFwuXFxkKyk/JC8udGVzdChudW1TdHJpbmcpO1xyXG5cclxuICAgIC8vIElmIG5vdCBhIHZhbGlkIG51bWJlciBmb3JtYXQsIGNsZWFyIHRoZSBmaWVsZFxyXG4gICAgaWYgKCFpc1ZhbGlkTnVtYmVyRm9ybWF0KSB7XHJcbiAgICAgIHRhcmdldC52YWx1ZSA9ICcnO1xyXG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoJycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRm9ybWF0IGN1cnJlbmN5IGZpZWxkcyBvciBzZXQgcmF3IHZhbHVlIGZvciBub24tY3VycmVuY3lcclxuICAgIGlmICh0aGlzLmZpZWxkLnR5cGUgPT09ICdudW1iZXInICYmIHRoaXMuZmllbGQuaXNDdXJyZW5jeSkge1xyXG4gICAgICB0aGlzLnByb2Nlc3NDdXJyZW5jeVZhbHVlKHRhcmdldCwgbnVtU3RyaW5nLCBtYXhEZWNpbWFscyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBOb24tY3VycmVuY3k6IHByZXNlcnZlIHRoZSByYXcgc3RyaW5nIHZhbHVlXHJcbiAgICAgIHRhcmdldC52YWx1ZSA9IG51bVN0cmluZztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByb2Nlc3MgY3VycmVuY3kgdmFsdWUgLSBoYW5kbGUgZm9ybWF0dGluZyBhbmQgZGVjaW1hbCBwbGFjZXNcclxuICAgKi9cclxuICBwcml2YXRlIHByb2Nlc3NDdXJyZW5jeVZhbHVlKFxyXG4gICAgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCxcclxuICAgIG51bVN0cmluZzogc3RyaW5nLFxyXG4gICAgbWF4RGVjaW1hbHM6IG51bWJlcixcclxuICApOiB2b2lkIHtcclxuICAgIC8vIEhhbmRsZSBuZWdhdGl2ZSB2YWx1ZXMgLSBjb252ZXJ0IHRvIHBvc2l0aXZlXHJcbiAgICBsZXQgcHJvY2Vzc2VkVmFsdWUgPSBudW1TdHJpbmcuc3RhcnRzV2l0aCgnLScpID8gbnVtU3RyaW5nLnN1YnN0cmluZygxKSA6IG51bVN0cmluZztcclxuXHJcbiAgICAvLyBIYW5kbGUgZWRnZSBjYXNlIG9mIFwiLTBcIiBvciBqdXN0IFwiLVwiXHJcbiAgICBpZiAocHJvY2Vzc2VkVmFsdWUgPT09ICcnIHx8IHByb2Nlc3NlZFZhbHVlID09PSAnMCcpIHtcclxuICAgICAgcHJvY2Vzc2VkVmFsdWUgPSAnMCc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRm9ybWF0IHRoZSB2YWx1ZSB3aXRoIHByb3BlciBkZWNpbWFsIHBsYWNlc1xyXG4gICAgY29uc3QgY2xlYW5WYWx1ZVN0cmluZyA9IHRoaXMuZm9ybWF0RGVjaW1hbFBsYWNlcyhwcm9jZXNzZWRWYWx1ZSwgbWF4RGVjaW1hbHMpO1xyXG5cclxuICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mb3JtYXRDdXJyZW5jeVdpdGhDb21tYXMoY2xlYW5WYWx1ZVN0cmluZywgbWF4RGVjaW1hbHMpO1xyXG5cclxuICAgIC8vIFVwZGF0ZSB0aGUgY29udHJvbCB2YWx1ZSB3aXRoIHRoZSBudW1lcmljIHN0cmluZyAobm90IGZvcm1hdHRlZClcclxuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShjbGVhblZhbHVlU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblxyXG4gICAgLy8gVHJpZ2dlciB2YWxpZGF0b3JzIGFuZCBtYXJrIGFzIHRvdWNoZWRcclxuICAgIHRoaXMuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG5cclxuICAgIC8vIFNldCBkaXNwbGF5IHZhbHVlIHdpdGggY29tbWFzIGFmdGVyIEFuZ3VsYXIncyBmb3JtIGNvbnRyb2wgdXBkYXRlXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGFyZ2V0LnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvcm1hdCBkZWNpbWFsIHBsYWNlcyAtIHBhZCBvciB0cnVuY2F0ZSB0byBtYXhEZWNpbWFsc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZm9ybWF0RGVjaW1hbFBsYWNlcyh2YWx1ZTogc3RyaW5nLCBtYXhEZWNpbWFsczogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBbaW50UGFydCwgZGVjUGFydF0gPSB2YWx1ZS5pbmNsdWRlcygnLicpID8gdmFsdWUuc3BsaXQoJy4nKSA6IFt2YWx1ZSwgJyddO1xyXG5cclxuICAgIC8vIFBhZCBvciB0cnVuY2F0ZSBkZWNpbWFsIHBhcnQgdG8gbWF4RGVjaW1hbHNcclxuICAgIGlmIChkZWNQYXJ0Lmxlbmd0aCA8IG1heERlY2ltYWxzKSB7XHJcbiAgICAgIGRlY1BhcnQgPSBkZWNQYXJ0LnBhZEVuZChtYXhEZWNpbWFscywgJzAnKTtcclxuICAgIH0gZWxzZSBpZiAoZGVjUGFydC5sZW5ndGggPiBtYXhEZWNpbWFscykge1xyXG4gICAgICBkZWNQYXJ0ID0gZGVjUGFydC5zbGljZSgwLCBtYXhEZWNpbWFscyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQnVpbGQgdGhlIGNsZWFuIHZhbHVlIHN0cmluZyAod2l0aG91dCBjb21tYXMpXHJcbiAgICByZXR1cm4gbWF4RGVjaW1hbHMgPiAwID8gYCR7aW50UGFydH0uJHtkZWNQYXJ0fWAgOiBpbnRQYXJ0O1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlTnVtYmVySW5wdXQoZXZlbnQ6IEV2ZW50LCBtYXhEZWNpbWFsczogbnVtYmVyID0gMik6IHZvaWQge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gdGFyZ2V0LnZhbHVlO1xyXG4gICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSB0YXJnZXQuc2VsZWN0aW9uU3RhcnQgPz8gMDtcclxuXHJcbiAgICAvLyBTdGVwIDE6IEZpbHRlciBhbmQgZm9ybWF0IHRoZSBpbnB1dCB2YWx1ZVxyXG4gICAgbGV0IHZhbHVlID0gdGhpcy5maWx0ZXJOdW1lcmljSW5wdXQodGFyZ2V0LnZhbHVlLCBtYXhEZWNpbWFscyk7XHJcblxyXG4gICAgLy8gU3RlcCAyOiBVcGRhdGUgY3Vyc29yIHBvc2l0aW9uIGlmIHZhbHVlIGNoYW5nZWRcclxuICAgIHRoaXMudXBkYXRlQ3Vyc29yUG9zaXRpb25BZnRlckZpbHRlcih0YXJnZXQsIG9yaWdpbmFsVmFsdWUsIHZhbHVlLCBjdXJzb3JQb3NpdGlvbik7XHJcblxyXG4gICAgLy8gU3RlcCAzOiBVcGRhdGUgZm9ybSBjb250cm9sIGFuZCB2YWxpZGF0ZVxyXG4gICAgdGhpcy51cGRhdGVGb3JtQ29udHJvbFZhbHVlKHZhbHVlLCBtYXhEZWNpbWFscyk7XHJcblxyXG4gICAgLy8gU3RlcCA0OiBFbWl0IGNoYW5nZXNcclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHRoaXMuZmllbGQubmFtZSwgdmFsdWU6IHRhcmdldC52YWx1ZSB9KTtcclxuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaWx0ZXIgbnVtZXJpYyBpbnB1dCB0byBvbmx5IGFsbG93IGRpZ2l0cyBhbmQgZGVjaW1hbCBwb2ludFxyXG4gICAqIEVuc3VyZXMgb25seSBvbmUgZGVjaW1hbCBwb2ludCBhbmQgZW5mb3JjZXMgbWF4IGRlY2ltYWwgcGxhY2VzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBmaWx0ZXJOdW1lcmljSW5wdXQodmFsdWU6IHN0cmluZywgbWF4RGVjaW1hbHM6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAvLyBSZW1vdmUgQUxMIG5vbi1udW1lcmljIGNoYXJhY3RlcnMgZXhjZXB0IGRlY2ltYWwgcG9pbnRcclxuICAgIGxldCBmaWx0ZXJlZCA9IHZhbHVlLnJlcGxhY2VBbGwoL1teMC05Ll0vZywgJycpO1xyXG5cclxuICAgIC8vIEVuc3VyZSBvbmx5IG9uZSBkZWNpbWFsIHBvaW50XHJcbiAgICBmaWx0ZXJlZCA9IHRoaXMuZmlsdGVyRGVjaW1hbFBvaW50cyhmaWx0ZXJlZCk7XHJcblxyXG4gICAgLy8gUmVzdHJpY3QgdG8gbWF4RGVjaW1hbHMgZGVjaW1hbCBwbGFjZXMgaWYgZGVjaW1hbCBleGlzdHNcclxuICAgIGZpbHRlcmVkID0gdGhpcy5lbmZvcmNlRGVjaW1hbExpbWl0KGZpbHRlcmVkLCBtYXhEZWNpbWFscyk7XHJcblxyXG4gICAgcmV0dXJuIGZpbHRlcmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5zdXJlIG9ubHkgb25lIGRlY2ltYWwgcG9pbnQgZXhpc3RzIGluIHRoZSB2YWx1ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZmlsdGVyRGVjaW1hbFBvaW50cyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc3BsaXQoJy4nKTtcclxuICAgIGlmIChwYXJ0cy5sZW5ndGggPiAyKSB7XHJcbiAgICAgIHJldHVybiBwYXJ0c1swXSArICcuJyArIHBhcnRzLnNsaWNlKDEpLmpvaW4oJycpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5mb3JjZSBtYXhpbXVtIGRlY2ltYWwgcGxhY2VzIGxpbWl0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBlbmZvcmNlRGVjaW1hbExpbWl0KHZhbHVlOiBzdHJpbmcsIG1heERlY2ltYWxzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnLicpKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBbaW50ZWdlclBhcnQsIGRlY2ltYWxQYXJ0XSA9IHZhbHVlLnNwbGl0KCcuJyk7XHJcbiAgICBpZiAoZGVjaW1hbFBhcnQgJiYgZGVjaW1hbFBhcnQubGVuZ3RoID4gbWF4RGVjaW1hbHMpIHtcclxuICAgICAgcmV0dXJuIGludGVnZXJQYXJ0ICsgJy4nICsgZGVjaW1hbFBhcnQuc2xpY2UoMCwgbWF4RGVjaW1hbHMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGN1cnNvciBwb3NpdGlvbiBhZnRlciBmaWx0ZXJpbmcgaW5wdXRcclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZUN1cnNvclBvc2l0aW9uQWZ0ZXJGaWx0ZXIoXHJcbiAgICB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQsXHJcbiAgICBvcmlnaW5hbFZhbHVlOiBzdHJpbmcsXHJcbiAgICBuZXdWYWx1ZTogc3RyaW5nLFxyXG4gICAgY3Vyc29yUG9zaXRpb246IG51bWJlcixcclxuICApOiB2b2lkIHtcclxuICAgIGlmICh0YXJnZXQudmFsdWUgPT09IG5ld1ZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjaGFyc1JlbW92ZWRCZWZvcmVDdXJzb3IgPSB0aGlzLmNvdW50UmVtb3ZlZENoYXJzQmVmb3JlQ3Vyc29yKFxyXG4gICAgICBvcmlnaW5hbFZhbHVlLFxyXG4gICAgICBuZXdWYWx1ZSxcclxuICAgICAgY3Vyc29yUG9zaXRpb24sXHJcbiAgICApO1xyXG4gICAgdGFyZ2V0LnZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IE1hdGgubWF4KDAsIGN1cnNvclBvc2l0aW9uIC0gY2hhcnNSZW1vdmVkQmVmb3JlQ3Vyc29yKTtcclxuICAgIHRhcmdldC5zZXRTZWxlY3Rpb25SYW5nZShuZXdQb3NpdGlvbiwgbmV3UG9zaXRpb24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGZvcm0gY29udHJvbCB2YWx1ZSBhbmQgcGVyZm9ybSB2YWxpZGF0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVGb3JtQ29udHJvbFZhbHVlKHZhbHVlOiBzdHJpbmcsIG1heERlY2ltYWxzOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgdGhpcy52YWxpZGF0ZUludGVnZXJEaWdpdHModmFsdWUsIG1heERlY2ltYWxzKTtcclxuICAgIHRoaXMuY2xlYXJOdW1lcmljRXJyb3IoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvdW50IGhvdyBtYW55IGNoYXJhY3RlcnMgd2VyZSByZW1vdmVkIGJlZm9yZSB0aGUgY3Vyc29yIHBvc2l0aW9uXHJcbiAgICogVGhpcyBoZWxwcyBtYWludGFpbiBjb3JyZWN0IGN1cnNvciBwb3NpdGlvbiBhZnRlciBmaWx0ZXJpbmcgaW5wdXRcclxuICAgKi9cclxuICBwcml2YXRlIGNvdW50UmVtb3ZlZENoYXJzQmVmb3JlQ3Vyc29yKFxyXG4gICAgb3JpZ2luYWw6IHN0cmluZyxcclxuICAgIGZpbHRlcmVkOiBzdHJpbmcsXHJcbiAgICBjdXJzb3JQb3M6IG51bWJlcixcclxuICApOiBudW1iZXIge1xyXG4gICAgbGV0IHJlbW92ZWRDb3VudCA9IDA7XHJcbiAgICBsZXQgZmlsdGVyZWRJbmRleCA9IDA7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJzb3JQb3MgJiYgaSA8IG9yaWdpbmFsLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChmaWx0ZXJlZEluZGV4IDwgZmlsdGVyZWQubGVuZ3RoICYmIG9yaWdpbmFsW2ldID09PSBmaWx0ZXJlZFtmaWx0ZXJlZEluZGV4XSkge1xyXG4gICAgICAgIGZpbHRlcmVkSW5kZXgrKztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZW1vdmVkQ291bnQrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZW1vdmVkQ291bnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgcGFzdGUgZXZlbnQgZm9yIG51bWJlciBpbnB1dHNcclxuICAgKiBQcmV2ZW50cyBwYXN0aW5nIG9mIG5vbi1udW1lcmljIGNoYXJhY3RlcnMgYW5kIGVuZm9yY2VzIGRpZ2l0IGxpbWl0c1xyXG4gICAqL1xyXG4gIGhhbmRsZU51bWJlclBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCwgbWF4RGVjaW1hbHM6IG51bWJlciA9IDIpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGNvbnN0IHBhc3RlZFRleHQgPSBldmVudC5jbGlwYm9hcmREYXRhPy5nZXREYXRhKCd0ZXh0JykgfHwgJyc7XHJcbiAgICBjb25zdCBpc0N1cnJlbmN5ID0gdGhpcy5maWVsZC50eXBlID09PSAnbnVtYmVyJyAmJiAhIXRoaXMuZmllbGQuaXNDdXJyZW5jeTtcclxuXHJcbiAgICBjb25zdCBmaWx0ZXJlZFRleHQgPSBpc0N1cnJlbmN5XHJcbiAgICAgID8gdGhpcy5nZXRGaWx0ZXJlZEN1cnJlbmN5UGFzdGVkVGV4dChwYXN0ZWRUZXh0KVxyXG4gICAgICA6IHRoaXMuZ2V0RmlsdGVyZWRJbnRlZ2VyUGFzdGVkVGV4dChwYXN0ZWRUZXh0KTtcclxuICAgIGNvbnN0IGZpbmFsVmFsdWUgPSB0aGlzLmJ1aWxkRmluYWxQYXN0ZVZhbHVlKHRhcmdldCwgZmlsdGVyZWRUZXh0LCBpc0N1cnJlbmN5LCBtYXhEZWNpbWFscyk7XHJcblxyXG4gICAgLy8gVXBkYXRlIHRoZSBpbnB1dFxyXG4gICAgdGFyZ2V0LnZhbHVlID0gZmluYWxWYWx1ZTtcclxuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShmaW5hbFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblxyXG4gICAgdGhpcy52YWxpZGF0ZUludGVnZXJEaWdpdHMoZmluYWxWYWx1ZSwgbWF4RGVjaW1hbHMpO1xyXG4gICAgdGhpcy5jbGVhck51bWVyaWNFcnJvcigpO1xyXG5cclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHRoaXMuZmllbGQubmFtZSwgdmFsdWU6IGZpbmFsVmFsdWUgfSk7XHJcbiAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG5cclxuICAgIHRoaXMuc2V0Q3Vyc29yQWZ0ZXJQYXN0ZSh0YXJnZXQsIGZpbHRlcmVkVGV4dCwgZmluYWxWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaWx0ZXIgcGFzdGVkIHRleHQgZm9yIGN1cnJlbmN5IGlucHV0IChhbGxvd3MgZGlnaXRzIGFuZCBkZWNpbWFsIHBvaW50KVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyZWRDdXJyZW5jeVBhc3RlZFRleHQocGFzdGVkVGV4dDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBwYXN0ZWRUZXh0LnJlcGxhY2VBbGwoL1teMC05Ll0vZywgJycpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmlsdGVyIHBhc3RlZCB0ZXh0IGZvciBpbnRlZ2VyLW9ubHkgaW5wdXQgKGFsbG93cyBkaWdpdHMgb25seSlcclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbHRlcmVkSW50ZWdlclBhc3RlZFRleHQocGFzdGVkVGV4dDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBwYXN0ZWRUZXh0LnJlcGxhY2VBbGwoL1xcRC9nLCAnJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWlsZCBmaW5hbCB2YWx1ZSBhZnRlciBwYXN0ZSBvcGVyYXRpb25cclxuICAgKi9cclxuICBwcml2YXRlIGJ1aWxkRmluYWxQYXN0ZVZhbHVlKFxyXG4gICAgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50LFxyXG4gICAgZmlsdGVyZWRUZXh0OiBzdHJpbmcsXHJcbiAgICBpc0N1cnJlbmN5OiBib29sZWFuLFxyXG4gICAgbWF4RGVjaW1hbHM6IG51bWJlcixcclxuICApOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGFyZ2V0LnZhbHVlO1xyXG4gICAgY29uc3Qgc3RhcnQgPSB0YXJnZXQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICBjb25zdCBlbmQgPSB0YXJnZXQuc2VsZWN0aW9uRW5kO1xyXG5cclxuICAgIGxldCBmaW5hbFZhbHVlOiBzdHJpbmc7XHJcblxyXG4gICAgLy8gSWYgc2VsZWN0aW9uIEFQSSBpcyBub3Qgc3VwcG9ydGVkIG9yIG5vIHNlbGVjdGlvbiwgcmVwbGFjZSBlbnRpcmUgY29udGVudFxyXG4gICAgaWYgKHN0YXJ0ID09PSBudWxsIHx8IGVuZCA9PT0gbnVsbCB8fCAoc3RhcnQgPT09IDAgJiYgZW5kID09PSAwKSkge1xyXG4gICAgICBmaW5hbFZhbHVlID0gZmlsdGVyZWRUZXh0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZmluYWxWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnQpICsgZmlsdGVyZWRUZXh0ICsgY3VycmVudFZhbHVlLnN1YnN0cmluZyhlbmQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpc0N1cnJlbmN5ID8gdGhpcy5hcHBseURlY2ltYWxSZXN0cmljdGlvbnMoZmluYWxWYWx1ZSwgbWF4RGVjaW1hbHMpIDogZmluYWxWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IGRlY2ltYWwgcmVzdHJpY3Rpb25zIGZvciBjdXJyZW5jeSBmaWVsZHNcclxuICAgKi9cclxuICBwcml2YXRlIGFwcGx5RGVjaW1hbFJlc3RyaWN0aW9ucyh2YWx1ZTogc3RyaW5nLCBtYXhEZWNpbWFsczogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCByZXN1bHQgPSB2YWx1ZTtcclxuXHJcbiAgICAvLyBFbnN1cmUgb25seSBvbmUgZGVjaW1hbCBwb2ludFxyXG4gICAgY29uc3QgcGFydHMgPSByZXN1bHQuc3BsaXQoJy4nKTtcclxuICAgIGlmIChwYXJ0cy5sZW5ndGggPiAyKSB7XHJcbiAgICAgIHJlc3VsdCA9IHBhcnRzWzBdICsgJy4nICsgcGFydHMuc2xpY2UoMSkuam9pbignJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVzdHJpY3QgdG8gbWF4RGVjaW1hbHMgZGVjaW1hbCBwbGFjZXNcclxuICAgIGlmIChyZXN1bHQuaW5jbHVkZXMoJy4nKSkge1xyXG4gICAgICBjb25zdCBbaW50UGFydCwgZGVjUGFydF0gPSByZXN1bHQuc3BsaXQoJy4nKTtcclxuICAgICAgaWYgKGRlY1BhcnQubGVuZ3RoID4gbWF4RGVjaW1hbHMpIHtcclxuICAgICAgICByZXN1bHQgPSBpbnRQYXJ0ICsgJy4nICsgZGVjUGFydC5zbGljZSgwLCBtYXhEZWNpbWFscyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGUgaW50ZWdlciBkaWdpdCBsaW1pdCBhbmQgc2V0L2NsZWFyIGVycm9yc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdmFsaWRhdGVJbnRlZ2VyRGlnaXRzKHZhbHVlOiBzdHJpbmcsIG1heERlY2ltYWxzOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZpZWxkLnR5cGUgIT09ICdudW1iZXInIHx8ICF0aGlzLmZpZWxkLm1heEludGVnZXJEaWdpdHMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1heEludERpZ2l0cyA9IHRoaXMuZmllbGQubWF4SW50ZWdlckRpZ2l0cyA/PyAxNTtcclxuICAgIGNvbnN0IFtpbnRQYXJ0XSA9IHZhbHVlLmluY2x1ZGVzKCcuJykgPyB2YWx1ZS5zcGxpdCgnLicpIDogW3ZhbHVlXTtcclxuXHJcbiAgICBpZiAoaW50UGFydC5sZW5ndGggPiBtYXhJbnREaWdpdHMpIHtcclxuICAgICAgdGhpcy5zZXRNYXhJbnRlZ2VyRGlnaXRzRXJyb3IoaW50UGFydC5sZW5ndGgsIG1heEludERpZ2l0cywgbWF4RGVjaW1hbHMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jbGVhck1heEludGVnZXJEaWdpdHNFcnJvcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IG1heCBpbnRlZ2VyIGRpZ2l0cyBlcnJvclxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0TWF4SW50ZWdlckRpZ2l0c0Vycm9yKGFjdHVhbDogbnVtYmVyLCBtYXg6IG51bWJlciwgbWF4RGVjaW1hbHM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3QgY3VycmVudEVycm9ycyA9IHRoaXMuY29udHJvbC5lcnJvcnMgfHwge307XHJcbiAgICB0aGlzLmNvbnRyb2wuc2V0RXJyb3JzKHtcclxuICAgICAgLi4uY3VycmVudEVycm9ycyxcclxuICAgICAgbWF4SW50ZWdlckRpZ2l0czoge1xyXG4gICAgICAgIGFjdHVhbCxcclxuICAgICAgICBtYXgsXHJcbiAgICAgICAgbWF4RGVjaW1hbHMsXHJcbiAgICAgICAgbWVzc2FnZTogYFBsZWFzZSBzaG9ydGVuIHlvdXIgaW5wdXQgdG8gJHttYXh9IHdob2xlIGRpZ2l0cyBhbmQgJHttYXhEZWNpbWFsc30gZGVjaW1hbCBvciBmZXdlci5gLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciBtYXggaW50ZWdlciBkaWdpdHMgZXJyb3IgaWYgcHJlc2VudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2xlYXJNYXhJbnRlZ2VyRGlnaXRzRXJyb3IoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY29udHJvbC5oYXNFcnJvcignbWF4SW50ZWdlckRpZ2l0cycpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlcnJvcnMgPSB7IC4uLnRoaXMuY29udHJvbC5lcnJvcnMgfTtcclxuICAgIGRlbGV0ZSBlcnJvcnNbJ21heEludGVnZXJEaWdpdHMnXTtcclxuICAgIHRoaXMuY29udHJvbC5zZXRFcnJvcnMoT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPyBlcnJvcnMgOiBudWxsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIG51bWVyaWMgZXJyb3IgaWYgcHJlc2VudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2xlYXJOdW1lcmljRXJyb3IoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY29udHJvbC5oYXNFcnJvcignbnVtZXJpYycpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlcnJvcnMgPSB7IC4uLnRoaXMuY29udHJvbC5lcnJvcnMgfTtcclxuICAgIGRlbGV0ZSBlcnJvcnNbJ251bWVyaWMnXTtcclxuICAgIHRoaXMuY29udHJvbC5zZXRFcnJvcnMoT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPyBlcnJvcnMgOiBudWxsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgcGFzdGUgb3BlcmF0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRDdXJzb3JBZnRlclBhc3RlKFxyXG4gICAgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50LFxyXG4gICAgZmlsdGVyZWRUZXh0OiBzdHJpbmcsXHJcbiAgICBmaW5hbFZhbHVlOiBzdHJpbmcsXHJcbiAgKTogdm9pZCB7XHJcbiAgICAvLyBJbnB1dCB0eXBlPVwibnVtYmVyXCIgZG9lcyBub3Qgc3VwcG9ydCBzZWxlY3Rpb24gQVBJc1xyXG4gICAgaWYgKHRhcmdldC50eXBlID09PSAnbnVtYmVyJykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3RhcnQgPSB0YXJnZXQuc2VsZWN0aW9uU3RhcnQgfHwgMDtcclxuICAgIGNvbnN0IG5ld0N1cnNvclBvcyA9IHN0YXJ0ICsgZmlsdGVyZWRUZXh0Lmxlbmd0aDtcclxuICAgIGNvbnN0IGFjdHVhbFBvcyA9IE1hdGgubWluKG5ld0N1cnNvclBvcywgZmluYWxWYWx1ZS5sZW5ndGgpO1xyXG4gICAgdGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKGFjdHVhbFBvcywgYWN0dWFsUG9zKTtcclxuICB9XHJcblxyXG4gIC8vIEZvcm1hdCBudW1iZXIgd2l0aCBjb21tYSBzZXBhcmF0b3JzXHJcbiAgLy8gVXNlcyBzdHJpbmctYmFzZWQgZm9ybWF0dGluZyBmb3IgbGFyZ2UgbnVtYmVycyB0byBwcmVzZXJ2ZSBwcmVjaXNpb25cclxuICBmb3JtYXRDdXJyZW5jeVdpdGhDb21tYXModmFsdWU6IG51bWJlciB8IHN0cmluZywgbWF4RGVjaW1hbHM6IG51bWJlciA9IDIpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuZmllbGQudHlwZSAhPT0gJ251bWJlcicgfHwgIXRoaXMuZmllbGQuaXNDdXJyZW5jeSkgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgY29uc3Qgc3RyVmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xyXG5cclxuICAgIC8vIFJldHVybiBvcmlnaW5hbCB2YWx1ZSBmb3IgZW1wdHkgb3IgaW52YWxpZCBpbnB1dHNcclxuICAgIGlmICghc3RyVmFsdWUgfHwgc3RyVmFsdWUgPT09ICdOYU4nKSByZXR1cm4gJyc7XHJcblxyXG4gICAgLy8gVXNlIHN0cmluZy1iYXNlZCBmb3JtYXR0aW5nIHRvIHByZXNlcnZlIHByZWNpc2lvbiBmb3IgbGFyZ2UgbnVtYmVyc1xyXG4gICAgY29uc3QgW2ludGVnZXJQYXJ0LCBkZWNpbWFsUGFydF0gPSBzdHJWYWx1ZS5pbmNsdWRlcygnLicpXHJcbiAgICAgID8gc3RyVmFsdWUuc3BsaXQoJy4nKVxyXG4gICAgICA6IFtzdHJWYWx1ZSwgJyddO1xyXG5cclxuICAgIC8vIEZvcm1hdCBpbnRlZ2VyIHBhcnQgd2l0aCBjb21tYSBzZXBhcmF0b3JzIChldmVyeSAzIGRpZ2l0cyBmcm9tIHJpZ2h0KVxyXG4gICAgLy8gVXNpbmcgaXRlcmF0aXZlIGFwcHJvYWNoIGluc3RlYWQgb2YgcmVnZXggdG8gYXZvaWQgUmVEb1MgY29uY2VybnNcclxuICAgIGxldCBmb3JtYXR0ZWRJbnRlZ2VyID0gJyc7XHJcbiAgICBjb25zdCBsZW4gPSBpbnRlZ2VyUGFydC5sZW5ndGg7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGlmIChpID4gMCAmJiAobGVuIC0gaSkgJSAzID09PSAwKSB7XHJcbiAgICAgICAgZm9ybWF0dGVkSW50ZWdlciArPSAnLCc7XHJcbiAgICAgIH1cclxuICAgICAgZm9ybWF0dGVkSW50ZWdlciArPSBpbnRlZ2VyUGFydFtpXTtcclxuICAgIH1cclxuICAgIC8vIEZvcm1hdCBkZWNpbWFsIHBhcnQgKHBhZCBvciB0cnVuY2F0ZSB0byBtYXhEZWNpbWFscylcclxuICAgIGxldCBmb3JtYXR0ZWREZWNpbWFsID0gZGVjaW1hbFBhcnQgfHwgJyc7XHJcbiAgICBpZiAoZm9ybWF0dGVkRGVjaW1hbC5sZW5ndGggPCBtYXhEZWNpbWFscykge1xyXG4gICAgICBmb3JtYXR0ZWREZWNpbWFsID0gZm9ybWF0dGVkRGVjaW1hbC5wYWRFbmQobWF4RGVjaW1hbHMsICcwJyk7XHJcbiAgICB9IGVsc2UgaWYgKGZvcm1hdHRlZERlY2ltYWwubGVuZ3RoID4gbWF4RGVjaW1hbHMpIHtcclxuICAgICAgZm9ybWF0dGVkRGVjaW1hbCA9IGZvcm1hdHRlZERlY2ltYWwuc2xpY2UoMCwgbWF4RGVjaW1hbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtYXhEZWNpbWFscyA+IDAgPyBgJHtmb3JtYXR0ZWRJbnRlZ2VyfS4ke2Zvcm1hdHRlZERlY2ltYWx9YCA6IGZvcm1hdHRlZEludGVnZXI7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVOdW1iZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBpc0N1cnJlbmN5OiBib29sZWFuKSB7XHJcbiAgICBpZiAoaXNDdXJyZW5jeSkgcmV0dXJuO1xyXG5cclxuICAgIC8vIEFsbG93OiBCYWNrc3BhY2UsIERlbGV0ZSwgVGFiLCBBcnJvdyBrZXlzXHJcbiAgICBpZiAoWydCYWNrc3BhY2UnLCAnRGVsZXRlJywgJ1RhYicsICdBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCddLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFsbG93IGNsaXBib2FyZCBvcGVyYXRpb25zIChDdHJsK1YsIEN0cmwrQywgQ3RybCtYLCBDbWQrViwgQ21kK0MsIENtZCtYKVxyXG4gICAgLy8gYW5kIHNlbGVjdGlvbiAoQ3RybCtBLCBDbWQrQSlcclxuICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEJsb2NrIGV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgMC05XHJcbiAgICBpZiAoIS9eXFxkJC8udGVzdChldmVudC5rZXkpKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBHZXQgbG9jYWxlIGZyb20gY3VycmVuY3kgY29kZSB1c2luZyBjdXJyZW5jeU1ldGFcclxuICBnZXRMb2NhbGVGcm9tQ3VycmVuY3koY3VycmVuY3lDb2RlPzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGN1cnJlbmN5T2JqID0gdGhpcy5jdXJyZW5jeU1ldGEuZmluZChcclxuICAgICAgKGM6IHsgY29kZTogc3RyaW5nOyBsb2NhbGU6IHN0cmluZyB9KSA9PiBjLmNvZGUgPT09IGN1cnJlbmN5Q29kZSxcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIGN1cnJlbmN5T2JqPy5sb2NhbGUgfHwgdGhpcy5kZWZhdWx0TG9jYWxlO1xyXG4gIH1cclxuXHJcbiAgc2hvd1Bhc3N3b3JkID0gZmFsc2U7XHJcbiAgcGFzc3dvcmRTdHJlbmd0aExhYmVsID0gJyc7XHJcbiAgc3RyZW5ndGhDbGFzcyA9ICcnO1xyXG4gIHBhc3N3b3JkU3RyZW5ndGhQZXJjZW50ID0gMDtcclxuICBpc1Bhc3N3b3JkRm9jdXNlZCA9IGZhbHNlO1xyXG4gIG9uUGFzc3dvcmRGb2N1cygpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFzRm9jdXMuc2V0KHRydWUpO1xyXG4gICAgdGhpcy5pc1Bhc3N3b3JkRm9jdXNlZCA9IHRydWU7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBvblBhc3N3b3JkQmx1cigpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNQYXNzd29yZEZvY3VzZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVBhc3N3b3JkQmx1cihlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5oYW5kbGVCbHVyKGUpOyAvLyBPcmlnaW5hbCBibHVyIGZ1bmN0aW9uYWxpdHkgKHNldHMgaGFzRm9jdXMgdG8gZmFsc2UpXHJcbiAgICB0aGlzLm9uUGFzc3dvcmRCbHVyKCk7IC8vIEhpZGUgcGFzc3dvcmQgZmVlZGJhY2tcclxuICB9XHJcblxyXG4gIGNoZWNrUGFzc3dvcmRTdHJlbmd0aCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoIXZhbHVlIHx8IHRoaXMuZmllbGQudHlwZSAhPT0gJ3Bhc3N3b3JkJykge1xyXG4gICAgICB0aGlzLnBhc3N3b3JkU3RyZW5ndGhMYWJlbCA9ICcnO1xyXG4gICAgICB0aGlzLnN0cmVuZ3RoQ2xhc3MgPSAnJztcclxuICAgICAgdGhpcy5wYXNzd29yZFN0cmVuZ3RoUGVyY2VudCA9IDA7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgc2NvcmUgPSAwO1xyXG4gICAgaWYgKHZhbHVlLmxlbmd0aCA+PSA4KSBzY29yZSsrO1xyXG4gICAgaWYgKC9bQS1aXS8udGVzdCh2YWx1ZSkpIHNjb3JlKys7XHJcbiAgICBpZiAoL1xcZC8udGVzdCh2YWx1ZSkpIHNjb3JlKys7XHJcbiAgICBpZiAoL1tcXFdfXS8udGVzdCh2YWx1ZSkpIHNjb3JlKys7XHJcblxyXG4gICAgaWYgKHNjb3JlIDw9IDEpIHtcclxuICAgICAgdGhpcy5wYXNzd29yZFN0cmVuZ3RoTGFiZWwgPSB0aGlzLmZpZWxkLndlYWtMYWJlbCB8fCAnV2Vhayc7XHJcbiAgICAgIHRoaXMuc3RyZW5ndGhDbGFzcyA9ICd0ZXh0LVt2YXIoLS1SSEItUmVkLTEwMCldJztcclxuICAgICAgdGhpcy5wYXNzd29yZFN0cmVuZ3RoUGVyY2VudCA9IDI1O1xyXG4gICAgfSBlbHNlIGlmIChzY29yZSA9PT0gMiB8fCBzY29yZSA9PT0gMykge1xyXG4gICAgICB0aGlzLnBhc3N3b3JkU3RyZW5ndGhMYWJlbCA9IHRoaXMuZmllbGQubWVkaXVtTGFiZWwgfHwgJ01lZGl1bSc7XHJcbiAgICAgIHRoaXMuc3RyZW5ndGhDbGFzcyA9ICd0ZXh0LVt2YXIoLS1PcmFuZ2UtMTAwKV0nO1xyXG4gICAgICB0aGlzLnBhc3N3b3JkU3RyZW5ndGhQZXJjZW50ID0gc2NvcmUgPT09IDIgPyA1MCA6IDc1O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wYXNzd29yZFN0cmVuZ3RoTGFiZWwgPSB0aGlzLmZpZWxkLnN0cm9uZ0xhYmVsIHx8ICdTdHJvbmcnO1xyXG4gICAgICB0aGlzLnN0cmVuZ3RoQ2xhc3MgPSAndGV4dC1bdmFyKC0tR3JlZW4tMTAwKV0nO1xyXG4gICAgICB0aGlzLnBhc3N3b3JkU3RyZW5ndGhQZXJjZW50ID0gMTAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5jcmVtZW50KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZmllbGQudHlwZSAhPT0gJ251bWJlcicpIHJldHVybjtcclxuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmZpZWxkLnN0ZXAgfHwgMTtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSBOdW1iZXIodGhpcy5jb250cm9sLnZhbHVlKSB8fCAwO1xyXG4gICAgbGV0IG5leHRWYWx1ZSA9IGN1cnJlbnQgKyBzdGVwO1xyXG5cclxuICAgIGlmICh0eXBlb2YgdGhpcy5maWVsZC5tYXggPT09ICdudW1iZXInKSB7XHJcbiAgICAgIG5leHRWYWx1ZSA9IE1hdGgubWluKG5leHRWYWx1ZSwgdGhpcy5maWVsZC5tYXgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShuZXh0VmFsdWUpO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHRoaXMuZmllbGQubmFtZSwgdmFsdWU6IG5leHRWYWx1ZSB9KTtcclxuXHJcbiAgICAvLyBVcGRhdGUgZGlzcGxheSB2YWx1ZSBmb3IgY3VycmVuY3kgaW5wdXRzXHJcbiAgICBpZiAodGhpcy5maWVsZC5pc0N1cnJlbmN5KSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudW5pcXVlSWQpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKGlucHV0RWxlbWVudCkge1xyXG4gICAgICAgICAgaW5wdXRFbGVtZW50LnZhbHVlID0gdGhpcy5mb3JtYXRDdXJyZW5jeVdpdGhDb21tYXMobmV4dFZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGVjcmVtZW50KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZmllbGQudHlwZSAhPT0gJ251bWJlcicpIHJldHVybjtcclxuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmZpZWxkLnN0ZXAgfHwgMTtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSBOdW1iZXIodGhpcy5jb250cm9sLnZhbHVlKSB8fCAwO1xyXG4gICAgbGV0IG5leHRWYWx1ZSA9IGN1cnJlbnQgLSBzdGVwO1xyXG5cclxuICAgIC8vIEVuc3VyZSBtaW5pbXVtIHZhbHVlIGlzIDAgKG5vIG5lZ2F0aXZlIHZhbHVlcylcclxuICAgIGNvbnN0IG1pblZhbHVlID0gTWF0aC5tYXgodGhpcy5maWVsZC5taW4gfHwgMCwgMCk7XHJcbiAgICBuZXh0VmFsdWUgPSBNYXRoLm1heChuZXh0VmFsdWUsIG1pblZhbHVlKTtcclxuXHJcbiAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUobmV4dFZhbHVlKTtcclxuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB0aGlzLmZpZWxkLm5hbWUsIHZhbHVlOiBuZXh0VmFsdWUgfSk7XHJcblxyXG4gICAgLy8gVXBkYXRlIGRpc3BsYXkgdmFsdWUgZm9yIGN1cnJlbmN5IGlucHV0c1xyXG4gICAgaWYgKHRoaXMuZmllbGQuaXNDdXJyZW5jeSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBpbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnVuaXF1ZUlkKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgIGlmIChpbnB1dEVsZW1lbnQpIHtcclxuICAgICAgICAgIGlucHV0RWxlbWVudC52YWx1ZSA9IHRoaXMuZm9ybWF0Q3VycmVuY3lXaXRoQ29tbWFzKG5leHRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvcHlUZXh0KGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKCF0aGlzLmNvbnRyb2wudmFsdWUpIHJldHVybjtcclxuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRoaXMuY29udHJvbC52YWx1ZSkudGhlbigoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnRvYXN0U2VydmljZSkge1xyXG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnN1Y2Nlc3MoJ0NvcGllZCB0byBjbGlwYm9hcmQnLCAnU3VjY2VzcycsIDEwMDApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB1cCB2aXNpYmlsaXR5IGNvbmRpdGlvbiBsaXN0ZW5lclxyXG4gICAqIFdhdGNoZXMgdGhlIGRlcGVuZGVudCBmaWVsZCBhbmQgc2hvd3MvaGlkZXMgdGhpcyBmaWVsZCBiYXNlZCBvbiBjb25kaXRpb25zXHJcbiAgICovXHJcbiAgc2V0dXBWaXNpYmlsaXR5Q29uZGl0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmZpZWxkLnZpc2liaWxpdHlDb25kaXRpb24gfHwgIXRoaXMuZm9ybSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHsgZGVwZW5kc09uIH0gPSB0aGlzLmZpZWxkLnZpc2liaWxpdHlDb25kaXRpb247XHJcbiAgICBjb25zdCBkZXBlbmRlbnRDb250cm9sID0gdGhpcy5mb3JtLmdldChkZXBlbmRzT24pO1xyXG5cclxuICAgIGlmICghZGVwZW5kZW50Q29udHJvbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSW5pdGlhbCB2aXNpYmlsaXR5IGNoZWNrXHJcbiAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHkoZGVwZW5kZW50Q29udHJvbC52YWx1ZSk7XHJcblxyXG4gICAgLy8gU3Vic2NyaWJlIHRvIHZhbHVlIGNoYW5nZXNcclxuICAgIGRlcGVuZGVudENvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KHZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGZpZWxkIHZpc2liaWxpdHkgYmFzZWQgb24gZGVwZW5kZW50IGZpZWxkIHZhbHVlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmlsaXR5KGRlcGVuZGVudFZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5maWVsZC52aXNpYmlsaXR5Q29uZGl0aW9uKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgeyBzaG93V2hlbiwgaGlkZVdoZW4gfSA9IHRoaXMuZmllbGQudmlzaWJpbGl0eUNvbmRpdGlvbjtcclxuICAgIGxldCBzaG91bGRCZVZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBDaGVjayBzaG93V2hlbiBjb25kaXRpb25cclxuICAgIGlmIChzaG93V2hlbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNob3dXaGVuKSkge1xyXG4gICAgICAgIHNob3VsZEJlVmlzaWJsZSA9IHNob3dXaGVuLmluY2x1ZGVzKGRlcGVuZGVudFZhbHVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzaG91bGRCZVZpc2libGUgPSBkZXBlbmRlbnRWYWx1ZSA9PT0gc2hvd1doZW47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBoaWRlV2hlbiBjb25kaXRpb24gKG92ZXJyaWRlcyBzaG93V2hlbilcclxuICAgIGlmIChoaWRlV2hlbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbnN0IHNob3VsZEhpZGUgPSBBcnJheS5pc0FycmF5KGhpZGVXaGVuKVxyXG4gICAgICAgID8gaGlkZVdoZW4uaW5jbHVkZXMoZGVwZW5kZW50VmFsdWUpXHJcbiAgICAgICAgOiBkZXBlbmRlbnRWYWx1ZSA9PT0gaGlkZVdoZW47XHJcblxyXG4gICAgICBpZiAoc2hvdWxkSGlkZSkge1xyXG4gICAgICAgIHNob3VsZEJlVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXBkYXRlIHZpc2liaWxpdHlcclxuICAgIHRoaXMuaXNWaXNpYmxlLnNldChzaG91bGRCZVZpc2libGUpO1xyXG5cclxuICAgIC8vIE9ubHkgY2xlYXIgdmFsdWUgd2hlbiBoaWRpbmcgaWYgdGhlcmUncyBubyBpbml0aWFsIHZhbHVlXHJcbiAgICAvLyBUaGlzIHByZXNlcnZlcyBkYXRhIHdoZW4gZWRpdGluZyBleGlzdGluZyByZWNvcmRzXHJcbiAgICBpZiAoIXNob3VsZEJlVmlzaWJsZSAmJiB0aGlzLmNvbnRyb2wgJiYgIXRoaXMuY29udHJvbC52YWx1ZSkge1xyXG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgIHRoaXMuY29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKTtcclxuICAgICAgdGhpcy5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBzaG93Rm9ybUZpZWxkTWVzc2FnZShjb250cm9sOiBhbnksIGhlbHBlclRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaGVscGVySGFuZGxlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmhlbHBlckhhbmRsZS5zaG93Rm9ybUZpZWxkTWVzc2FnZShjb250cm9sLCBoZWxwZXJUZXh0KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGlzRXJyb3IgPSBjb250cm9sPy50b3VjaGVkICYmICEhY29udHJvbD8uZXJyb3JzO1xyXG4gICAgY29uc3QgaXNIZWxwZXIgPSAhaXNFcnJvciAmJiBCb29sZWFuKGhlbHBlclRleHQgPz8gJycpO1xyXG4gICAgcmV0dXJuIGlzRXJyb3IgfHwgaXNIZWxwZXI7XHJcbiAgfVxyXG5cclxuICBnZXRUcmFuc2xhdGVkTGFiZWwobGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWxhYmVsKSByZXR1cm4gJyc7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBsYWJlbFN0ciA9IGxhYmVsLnRvU3RyaW5nKCk7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgbGFiZWxTdHJcclxuICAgICAgICAgIC5zcGxpdCgnOjonKVxyXG4gICAgICAgICAgLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpXHJcbiAgICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiAhIXBhcnQpXHJcbiAgICAgICAgICAubWFwKChwYXJ0KSA9PiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KHBhcnQpKVxyXG4gICAgICAgICAgLmpvaW4oJyAnKSArIHRoaXMuZ2V0RW5kU3ltYm9sKGxhYmVsU3RyKVxyXG4gICAgICApO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1RyYW5zbGF0aW9uIGZhaWxlZCBpbiBnZXRUcmFuc2xhdGVkTGFiZWw6JywgbGFiZWwsIGUpO1xyXG4gICAgICByZXR1cm4gbGFiZWw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRFbmRTeW1ib2wobGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbGFiZWwudG9TdHJpbmcoKS5pbmNsdWRlcygncmVxdWlyZWQnKSAmJiBsYWJlbC50b1N0cmluZygpLmluY2x1ZGVzKCdGTkZpZWxkTWVzc2FnZScpXHJcbiAgICAgID8gJy4nXHJcbiAgICAgIDogJyc7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0gSUNPTiBMT0dJQyAtLS1cclxuICBwcml2YXRlIHVwZGF0ZUFsbEljb25zKCk6IHZvaWQge1xyXG4gICAgLy8gV2UnbGwgY2FsbCB0aGlzIGFmdGVyIFZpZXdJbml0IG9yIHdoZW4gaW5wdXRzIGNoYW5nZVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaWNvbkNvbnRhaW5lcnM/LmZvckVhY2goKGNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRzID0gY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZGF0YXNldDtcclxuICAgICAgICBjb25zdCBuYW1lID0gZHNbJ2ljb25OYW1lJ107XHJcbiAgICAgICAgY29uc3QgdmFyaWFudCA9IChkc1snaWNvblZhcmlhbnQnXSBhcyBUeXBlSWNvblZhcmlhbnQpIHx8ICdMaW5lJztcclxuICAgICAgICBjb25zdCBzaXplID0gKGRzWydpY29uU2l6ZSddIHx8ICdtZWRpdW0nKSBhcyBUeXBlSWNvblNpemVOYW1lO1xyXG4gICAgICAgIGNvbnN0IGNvbG9yID0gZHNbJ2ljb25Db2xvciddO1xyXG4gICAgICAgIGNvbnN0IGRpc2FibGVkID0gZHNbJ2ljb25EaXNhYmxlZCddID09PSAndHJ1ZSc7XHJcblxyXG4gICAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRJY29uVG9Db250YWluZXIoY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIG5hbWUsIHZhcmlhbnQsIHNpemUsIGNvbG9yLCBkaXNhYmxlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkSWNvblRvQ29udGFpbmVyKFxyXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIHZhcmlhbnQ6IFR5cGVJY29uVmFyaWFudCxcclxuICAgIHNpemVOYW1lOiBUeXBlSWNvblNpemVOYW1lLFxyXG4gICAgY29sb3I/OiBzdHJpbmcgfCBudWxsLFxyXG4gICAgZGlzYWJsZWQ/OiBib29sZWFuLFxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZU1hcFtzaXplTmFtZV07XHJcblxyXG4gICAgLy8gMS4gQ2hlY2sgaWYgcmF3IFNWRyBzdHJpbmcgaXMgcHJvdmlkZWRcclxuICAgIGlmIChuYW1lLnRyaW0oKS5zdGFydHNXaXRoKCc8c3ZnJykpIHtcclxuICAgICAgdGhpcy5yZW5kZXJTdmdUb0NvbnRhaW5lcihjb250YWluZXIsIG5hbWUsIGNvbG9yLCBzaXplLCAnY3VzdG9tJywgZGlzYWJsZWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMi4gQ2hlY2sgYnVpbHQtaW4gaWNvbnMgcmVnaXN0cnlcclxuICAgIC8vIFN0cmlwIHBvc3NpYmxlIC0tc2l6ZSBzdWZmaXggaWYgaXQgd2FzIHBhc3NlZCBieSBtaXN0YWtlIGZyb20gb2xkIGxvZ2ljXHJcbiAgICBjb25zdCBiYXNlTmFtZSA9IG5hbWUuc3BsaXQoJy0tJylbMF0udHJpbSgpO1xyXG4gICAgaWYgKENPUkVfSUNPTlNbYmFzZU5hbWVdKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyU3ZnVG9Db250YWluZXIoY29udGFpbmVyLCBDT1JFX0lDT05TW2Jhc2VOYW1lXSwgY29sb3IsIHNpemUsIGJhc2VOYW1lLCBkaXNhYmxlZCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBObyBmYWxsYmFjayB0byBIVFRQXHJcbiAgICBjb25zb2xlLndhcm4oYFtmbi1pbnB1dF0gSWNvbiBcIiR7bmFtZX1cIiBub3QgZm91bmQgaW4gY29yZSByZWdpc3RyeSBhbmQgbm8gcmF3IFNWRyBwcm92aWRlZC5gKTtcclxuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyU3ZnVG9Db250YWluZXIoXHJcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxyXG4gICAgcmF3OiBzdHJpbmcsXHJcbiAgICBjb2xvcjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcclxuICAgIHNpemU6IG51bWJlcixcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIGRpc2FibGVkPzogYm9vbGVhbixcclxuICApOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcclxuICAgICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyYXcsICdpbWFnZS9zdmcreG1sJyk7XHJcbiAgICAgIGNvbnN0IHN2ZyA9IGRvYy5xdWVyeVNlbGVjdG9yKCdzdmcnKSBhcyB1bmtub3duIGFzIFNWR1NWR0VsZW1lbnQ7XHJcblxyXG4gICAgICBpZiAoIXN2Zykge1xyXG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFNWRyBOb3JtYWxpemF0aW9uIGxvZ2ljXHJcbiAgICAgIGZvciAoY29uc3QgcyBvZiBzdmcucXVlcnlTZWxlY3RvckFsbCgnc3R5bGUnKSkgcy5yZW1vdmUoKTtcclxuXHJcbiAgICAgIGlmIChjb2xvcikge1xyXG4gICAgICAgIGZvciAoY29uc3QgZWwgb2Ygc3ZnLnF1ZXJ5U2VsZWN0b3JBbGw8U1ZHRWxlbWVudD4oJyonKSkge1xyXG4gICAgICAgICAgY29uc3Qgc3R5bGUgPSBlbC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XHJcbiAgICAgICAgICBpZiAoc3R5bGUpIHtcclxuICAgICAgICAgICAgY29uc3QgY2xlYW5lZCA9IHN0eWxlXHJcbiAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoL2ZpbGxcXHMqOlxccypbXjtdKzs/L2dpLCAnJylcclxuICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvc3Ryb2tlXFxzKjpcXHMqW147XSs7Py9naSwgJycpO1xyXG4gICAgICAgICAgICBpZiAoY2xlYW5lZCkgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIGNsZWFuZWQpO1xyXG4gICAgICAgICAgICBlbHNlIGVsLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBmaWxsID0gZWwuZ2V0QXR0cmlidXRlKCdmaWxsJyk7XHJcbiAgICAgICAgICBpZiAoZmlsbCAmJiBmaWxsICE9PSAnbm9uZScgJiYgIWZpbGwuc3RhcnRzV2l0aCgndXJsKCcpKSB7XHJcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdjdXJyZW50Q29sb3InKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBzdHJva2UgPSBlbC5nZXRBdHRyaWJ1dGUoJ3N0cm9rZScpO1xyXG4gICAgICAgICAgaWYgKHN0cm9rZSAmJiBzdHJva2UgIT09ICdub25lJyAmJiAhc3Ryb2tlLnN0YXJ0c1dpdGgoJ3VybCgnKSkge1xyXG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICdjdXJyZW50Q29sb3InKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN2Zy5yZW1vdmVBdHRyaWJ1dGUoJ3dpZHRoJyk7XHJcbiAgICAgIHN2Zy5yZW1vdmVBdHRyaWJ1dGUoJ2hlaWdodCcpO1xyXG4gICAgICBpZiAoIXN2Zy5nZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnKSkge1xyXG4gICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCBgMCAwICR7c2l6ZX0gJHtzaXplfWApO1xyXG4gICAgICB9XHJcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCAneE1pZFlNaWQgbWVldCcpO1xyXG4gICAgICBzdmcuc2V0QXR0cmlidXRlKCdmb2N1c2FibGUnLCAnZmFsc2UnKTtcclxuICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xyXG4gICAgICBzdmcuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcxMDAlJyk7XHJcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcxMDAlJyk7XHJcblxyXG4gICAgICBjb25zdCBzdHlsZSA9IGA7ZGlzcGxheTpibG9jazttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCU7YDtcclxuICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAoc3ZnLmdldEF0dHJpYnV0ZSgnc3R5bGUnKSB8fCAnJykgKyBzdHlsZSk7XHJcblxyXG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XHJcbiAgICAgIGlmIChjb2xvcikge1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5jb2xvciA9IGNvbG9yO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChkaXNhYmxlZCkge1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5vcGFjaXR5ID0gJzAuNSc7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLmN1cnNvciA9ICdub3QtYWxsb3dlZCc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLm9wYWNpdHkgPSAnMSc7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLmN1cnNvciA9ICcnO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzdmcpO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGBbZm4taW5wdXRdIEVycm9yIHBhcnNpbmcgU1ZHIGZvciBpY29uIFwiJHtuYW1lfVwiOmAsIGVycm9yKTtcclxuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gUmVtb3ZlZCBnZXRJY29uUGF0aCBhcyBIVFRQIGxvYWRpbmcgaXMgZGlzYWJsZWRcclxuXHJcbiAgLy8gLS0tIE1FU1NBR0UgTE9HSUMgLS0tXHJcbiAgZ2V0RmllbGRNZXNzYWdlKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuY29udHJvbCkgcmV0dXJuIHRoaXMuZmllbGQ/LmhlbHBlclRleHQgfHwgJyc7XHJcblxyXG4gICAgaWYgKHRoaXMuY29udHJvbC50b3VjaGVkICYmIHRoaXMuY29udHJvbC5lcnJvcnMpIHtcclxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5jb250cm9sLmVycm9ycykpIHtcclxuICAgICAgICBjb25zdCBlcnJvclZhbHVlID0gdGhpcy5jb250cm9sLmVycm9yc1trZXldO1xyXG4gICAgICAgIGlmIChlcnJvclZhbHVlICYmIHR5cGVvZiBlcnJvclZhbHVlID09PSAnb2JqZWN0JyAmJiBlcnJvclZhbHVlLm1lc3NhZ2UpIHtcclxuICAgICAgICAgIHJldHVybiBlcnJvclZhbHVlLm1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmZpZWxkPy5lcnJvcnM/LltrZXldKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZC5lcnJvcnNba2V5XTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICB0aGlzLmZpZWxkPy5lcnJvcnM/LlsnZGVmYXVsdCddIHx8XHJcbiAgICAgICAgJ1BsZWFzZSBlbnRlciAnICsgdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0aGlzLmZpZWxkPy5sYWJlbClcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5maWVsZD8uaGVscGVyVGV4dCB8fCAnJztcclxuICB9XHJcblxyXG4gIGdldCBpc0Vycm9yKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhKHRoaXMuY29udHJvbD8udG91Y2hlZCAmJiB0aGlzLmNvbnRyb2w/LmVycm9ycyk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNTdWNjZXNzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhKHRoaXMuY29udHJvbD8udmFsaWQgJiYgdGhpcy5jb250cm9sPy50b3VjaGVkKTtcclxuICB9XHJcbn1cclxuIiwiQGlmIChmaWVsZC5uYW1lICYmIGlzVmlzaWJsZSgpICYmICFmaWVsZC5oaWRkZW4pIHtcclxuICA8ZGl2IGNsYXNzPVwiZm4taW5wdXQtY29udGFpbmVyXCI+XHJcbiAgICBAaWYgKGZpZWxkLnR5cGUhICE9PSAnaGlkZGVuJykge1xyXG4gICAgICA8bGFiZWxcclxuICAgICAgICBbZm9yXT1cInVuaXF1ZUlkXCJcclxuICAgICAgICBjbGFzcz1cImZuLWxhYmVsXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICBjb2xvcjogZmllbGQuY29sb3IgfHwgJyMwMzE4MmInLFxyXG4gICAgICAgICAgJ2ZvbnQtc2l6ZSc6IGZpZWxkLmxhYmVsU2l6ZSB8fCAnJyxcclxuICAgICAgICB9XCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGdldFRyYW5zbGF0ZWRMYWJlbChmaWVsZC5sYWJlbCkgfX1cclxuICAgICAgICBAaWYgKCFmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZU9wdGlvbmFsKSB7XHJcbiAgICAgICAgICA8c3Bhbj4mbmJzcDsoT3B0aW9uYWwpPC9zcGFuPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9sYWJlbD5cclxuICAgIH1cclxuXHJcbiAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICBAc3dpdGNoIChmaWVsZC50eXBlKSB7XHJcbiAgICAgICAgPCEtLSBUZXh0YXJlYSBGaWVsZCAtLT5cclxuICAgICAgICBAY2FzZSAoJ3RleHRhcmVhJykge1xyXG4gICAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICAgICNmblRleHRhcmVhXHJcbiAgICAgICAgICAgIHN0eWxlPVwicmVzaXplOiBub25lXCJcclxuICAgICAgICAgICAgW25hbWVdPVwiZmllbGQubmFtZVwiXHJcbiAgICAgICAgICAgIFtpZF09XCJ1bmlxdWVJZFwiXHJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5kaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgIFtyb3dzXT1cImZpZWxkLnJvd3MgfHwgMVwiXHJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJmaWVsZC5yZWFkT25seSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcclxuICAgICAgICAgICAgKGlucHV0KT1cImhhbmRsZVRleHRBcmVhKCRldmVudClcIlxyXG4gICAgICAgICAgICAoYmx1cik9XCJoYW5kbGVCbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZuLWlucHV0LWZpZWxkXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgIGRpc2FibGVkOiBjb250cm9sLmRpc2FibGVkIHx8IGZpZWxkLnJlYWRPbmx5LFxyXG4gICAgICAgICAgICAgIGVycm9yOiBjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5lcnJvcnMsXHJcbiAgICAgICAgICAgICAgc3VjY2VzczogZmllbGRbJ2hhc1N1Y2Nlc3NCb3JkZXInXSAmJiBjb250cm9sLnZhbGlkICYmICFjb250cm9sLmVycm9ycyxcclxuICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICBjb2xvcjogZmllbGQudmFsdWVDb2xvciB8fCAnaW5oZXJpdCcsXHJcbiAgICAgICAgICAgICAgJ2ZvbnQtc2l6ZSc6IGZpZWxkLnZhbHVlU2l6ZSB8fCAnJyxcclxuICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxyXG4gICAgICAgICAgPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8IS0tIFBhc3N3b3JkIEZpZWxkIC0tPlxyXG4gICAgICAgIEBjYXNlICgncGFzc3dvcmQnKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsXCI+XHJcbiAgICAgICAgICAgIEBpZiAoZmllbGQucHJlZml4Py5pY29uKSB7XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIGxlZnQtMCB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgcGwtMyBmbGV4IGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAjaWNvbkNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLW5hbWVdPVwiZmllbGQucHJlZml4IS5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLXZhcmlhbnQ9XCJMaW5lXCJcclxuICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLXNpemU9XCJtZWRpdW1cIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tY29sb3JdPVwiY29udHJvbC5kaXNhYmxlZCA/ICcjYzRjZGQyJyA6ICcjMDMxODJiJ1wiXHJcbiAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgW3R5cGVdPVwic2hvd1Bhc3N3b3JkID8gJ3RleHQnIDogJ3Bhc3N3b3JkJ1wiXHJcbiAgICAgICAgICAgICAgW2lkXT1cInVuaXF1ZUlkXCJcclxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5kaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRPbmx5IHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwiaXNBbHBoYW51bWVyaWMgPyBoYW5kbGVBbHBoYW51bWVyaWNJbnB1dCgkZXZlbnQpIDogaGFuZGxlSW5wdXQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uUGFzc3dvcmRGb2N1cygpXCJcclxuICAgICAgICAgICAgICAoYmx1cik9XCJoYW5kbGVQYXNzd29yZEJsdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbi1pbnB1dC1maWVsZCBvdmVyZmxvdy1oaWRkZW4gdGV4dC1lbGxpcHNpc1wiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGNvbnRyb2wuZGlzYWJsZWQgfHwgZmllbGQucmVhZE9ubHksXHJcbiAgICAgICAgICAgICAgICBlcnJvcjogY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZXJyb3JzLFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmllbGRbJ2hhc1N1Y2Nlc3NCb3JkZXInXSAmJiBjb250cm9sLnZhbGlkLFxyXG4gICAgICAgICAgICAgICAgJ3BsLTEwJzogZmllbGQucHJlZml4Py5pY29uLFxyXG4gICAgICAgICAgICAgICAgJ3ByLTEyJzpcclxuICAgICAgICAgICAgICAgICAgKGZpZWxkLnRvZ2dsZU1hc2sgJiYgIWZpZWxkLmlzQ29weVRleHQpIHx8XHJcbiAgICAgICAgICAgICAgICAgICghZmllbGQudG9nZ2xlTWFzayAmJiBmaWVsZC5pc0NvcHlUZXh0KSxcclxuICAgICAgICAgICAgICAgICdwci0yNCc6IGZpZWxkLnRvZ2dsZU1hc2sgJiYgZmllbGQuaXNDb3B5VGV4dCxcclxuICAgICAgICAgICAgICAgICdwci0zMic6IGZpZWxkLnRvZ2dsZU1hc2sgJiYgZmllbGQuaXNDb3B5VGV4dCAmJiBmaWVsZC5oYXNHZW5lcmF0ZUtleSxcclxuICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICBjb2xvcjogZmllbGQudmFsdWVDb2xvciB8fCAnaW5oZXJpdCcsXHJcbiAgICAgICAgICAgICAgICAnZm9udC1zaXplJzogZmllbGQudmFsdWVTaXplIHx8ICcnLFxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIHJpZ2h0LTAgdG9wLTEvMiAtdHJhbnNsYXRlLXktMS8yIGZsZXggaXRlbXMtY2VudGVyIHByLTMgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICBAaWYgKGZpZWxkLnRvZ2dsZU1hc2sgJiYgIWZpZWxkLmlzQ29weVRleHQpIHtcclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd1Bhc3N3b3JkID0gIXNob3dQYXNzd29yZFwiXHJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cInNob3dQYXNzd29yZCA9ICFzaG93UGFzc3dvcmRcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgI2ljb25Db250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tbmFtZV09XCJzaG93UGFzc3dvcmQgPyAnZXllLW9wZW4nIDogJ2V5ZS1jbG9zZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi12YXJpYW50PVwiTGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLXNpemU9XCJsYXJnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLWNvbG9yPVwiIzAzMTgyYlwiXHJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICB9IEBlbHNlIGlmIChmaWVsZC5pc0NvcHlUZXh0ICYmICFmaWVsZC50b2dnbGVNYXNrKSB7XHJcbiAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvcHlUZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJjb3B5VGV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLW5hbWU9XCJ0d28tc3F1YXJlXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tY29sb3I9XCIjMDMxODJiXCJcclxuICAgICAgICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgQGlmIChmaWVsZC5oYXNHZW5lcmF0ZUtleSkge1xyXG4gICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmaWVsZC5vbkdlbmVyYXRlS2V5ICYmIGZpZWxkLm9uR2VuZXJhdGVLZXkoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiZmllbGQub25HZW5lcmF0ZUtleSAmJiBmaWVsZC5vbkdlbmVyYXRlS2V5KClcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgI2ljb25Db250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLW5hbWU9XCJ0d28tc3F1YXJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi12YXJpYW50PVwiTGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tc2l6ZT1cImxhcmdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1jb2xvcj1cIiMwMzE4MmJcIlxyXG4gICAgICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGZpZWxkLnRvZ2dsZU1hc2sgJiYgZmllbGQuaXNDb3B5VGV4dCkge1xyXG4gICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93UGFzc3dvcmQgPSAhc2hvd1Bhc3N3b3JkXCJcclxuICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwic2hvd1Bhc3N3b3JkID0gIXNob3dQYXNzd29yZFwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAjaWNvbkNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaWNvbi1uYW1lXT1cInNob3dQYXNzd29yZCA/ICdleWUtb3BlbicgOiAnZXllLWNsb3NlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLXZhcmlhbnQ9XCJMaW5lXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tc2l6ZT1cImxhcmdlXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tY29sb3I9XCIjMDMxODJiXCJcclxuICAgICAgICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb3B5VGV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiY29weVRleHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAjaWNvbkNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtaWNvbi1uYW1lPVwidHdvLXNxdWFyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLWNvbG9yPVwiIzAzMTgyYlwiXHJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIEBpZiAoZmllbGQuaGFzR2VuZXJhdGVLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmllbGQub25HZW5lcmF0ZUtleSAmJiBmaWVsZC5vbkdlbmVyYXRlS2V5KClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImZpZWxkLm9uR2VuZXJhdGVLZXkgJiYgZmllbGQub25HZW5lcmF0ZUtleSgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdvcGFjaXR5LTUwIGN1cnNvci1ub3QtYWxsb3dlZCc6ICFjb250cm9sLnZhbHVlIH1cIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgI2ljb25Db250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLW5hbWU9XCJyb3VuZC1hcnJvdy10b3AtbGVmdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tY29sb3I9XCIjMDMxODJiXCJcclxuICAgICAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgQGlmIChmaWVsZC5mZWVkYmFjayAmJiBpc1Bhc3N3b3JkRm9jdXNlZCkge1xyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiBzcGFjZS15LTFcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHRleHQteHNcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1tZWRpdW1cIiBbbmdDbGFzc109XCJzdHJlbmd0aENsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHBhc3N3b3JkU3RyZW5ndGhMYWJlbCB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAjaWNvbkNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaWNvbi1uYW1lXT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRTdHJlbmd0aFBlcmNlbnQgPiA1MCA/ICdjaGVjay1jaXJjbGUnIDogJ2luZm8tY2lyY2xlJ1xyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLXZhcmlhbnQ9XCJMaW5lXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWljb24tc2l6ZT1cImV4dHJhc21hbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaWNvbi1jb2xvcl09XCJcclxuICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkU3RyZW5ndGhQZXJjZW50IDw9IDI1XHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJyNlZjNlNDInXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcGFzc3dvcmRTdHJlbmd0aFBlcmNlbnQgPD0gNzVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcjZmY5ZjAwJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogJyM2Y2MyNGEnXHJcbiAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtMS41IHctZnVsbCBiZy1bI2VlZjBmMl0gcm91bmRlZC1mdWxsIG92ZXJmbG93LWhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImgtZnVsbCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAgcm91bmRlZC1mdWxsXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICdiZy1bI2VmM2U0Ml0nOiBwYXNzd29yZFN0cmVuZ3RoUGVyY2VudCA8PSAyNSxcclxuICAgICAgICAgICAgICAgICAgICAnYmctWyNmZjlmMDBdJzogcGFzc3dvcmRTdHJlbmd0aFBlcmNlbnQgPiAyNSAmJiBwYXNzd29yZFN0cmVuZ3RoUGVyY2VudCA8PSA3NSxcclxuICAgICAgICAgICAgICAgICAgICAnYmctWyM2Y2MyNGFdJzogcGFzc3dvcmRTdHJlbmd0aFBlcmNlbnQgPiA3NSxcclxuICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cInBhc3N3b3JkU3RyZW5ndGhQZXJjZW50XCJcclxuICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8IS0tIE51bWJlciBGaWVsZCAtLT5cclxuICAgICAgICBAY2FzZSAoJ251bWJlcicpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSB3LWZ1bGxcIj5cclxuICAgICAgICAgICAgQGlmIChmaWVsZC5wcmVmaXg/Lmljb24pIHtcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgbGVmdC0wIHRvcC0xLzIgLXRyYW5zbGF0ZS15LTEvMiBwbC0zIGZsZXggaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICNpY29uQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tbmFtZV09XCJmaWVsZC5wcmVmaXghLmljb25cIlxyXG4gICAgICAgICAgICAgICAgICBkYXRhLWljb24tdmFyaWFudD1cIkxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICBkYXRhLWljb24tc2l6ZT1cIm1lZGl1bVwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaWNvbi1jb2xvcl09XCJjb250cm9sLmRpc2FibGVkID8gJyNjNGNkZDInIDogJyMwMzE4MmInXCJcclxuICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICBbdHlwZV09XCJmaWVsZC50eXBlID09PSAnbnVtYmVyJyAmJiBmaWVsZC5pc0N1cnJlbmN5ID8gJ3RleHQnIDogJ251bWJlcidcIlxyXG4gICAgICAgICAgICAgIFtuYW1lXT1cImZpZWxkLm5hbWVcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJ1bmlxdWVJZFwiXHJcbiAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgfHwgJycgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiZmllbGQucmVhZE9ubHkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcclxuICAgICAgICAgICAgICBbbWluXT1cImZpZWxkLnR5cGUgPT09ICdudW1iZXInICYmICFmaWVsZC5pc0N1cnJlbmN5ID8gMCA6IG51bGxcIlxyXG4gICAgICAgICAgICAgIFttYXhdPVwiZmllbGQudHlwZSA9PT0gJ251bWJlcicgJiYgIWZpZWxkLmlzQ3VycmVuY3kgPyBmaWVsZC5tYXggOiBudWxsXCJcclxuICAgICAgICAgICAgICBbc3RlcF09XCJmaWVsZC50eXBlID09PSAnbnVtYmVyJyAmJiAhZmllbGQuaXNDdXJyZW5jeSA/IGZpZWxkLnN0ZXAgfHwgMSA6IG51bGxcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJoYW5kbGVOdW1iZXJJbnB1dCgkZXZlbnQsIGZpZWxkLm1pbkZyYWN0aW9uRGlnaXRzIHx8IDIpXCJcclxuICAgICAgICAgICAgICAocGFzdGUpPVwiaGFuZGxlTnVtYmVyUGFzdGUoJGV2ZW50LCBmaWVsZC5taW5GcmFjdGlvbkRpZ2l0cyB8fCAyKVwiXHJcbiAgICAgICAgICAgICAgKGJsdXIpPVwiaGFuZGxlQmx1cigkZXZlbnQsIGZpZWxkLm1pbkZyYWN0aW9uRGlnaXRzIHx8IDIpXCJcclxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVOdW1iZXJLZXlkb3duKCRldmVudCwgZmllbGQuaXNDdXJyZW5jeSB8fCBmYWxzZSlcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm4taW5wdXQtZmllbGRcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBjb250cm9sLmRpc2FibGVkIHx8IGZpZWxkLnJlYWRPbmx5LFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6IGNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmVycm9ycyxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZpZWxkWydoYXNTdWNjZXNzQm9yZGVyJ10gJiYgY29udHJvbC52YWxpZCAmJiAhY29udHJvbC5lcnJvcnMsXHJcbiAgICAgICAgICAgICAgICAncGwtMTAnOiBmaWVsZC5wcmVmaXg/Lmljb24sXHJcbiAgICAgICAgICAgICAgICAndGV4dC1bMjRweF0gZm9udC1ib2xkJzogZmllbGQuaXNDdXJyZW5jeSxcclxuICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICBjb2xvcjogZmllbGQudmFsdWVDb2xvciB8fCAnaW5oZXJpdCcsXHJcbiAgICAgICAgICAgICAgICAnZm9udC1zaXplJzogZmllbGQudmFsdWVTaXplIHx8ICcnLFxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8IS0tIERlZmF1bHQgSW5wdXQgRmllbGQgKHRleHQsIGVtYWlsLCBldGMuKSAtLT5cclxuICAgICAgICBAZGVmYXVsdCB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgei0wXCI+XHJcbiAgICAgICAgICAgIEBpZiAoZmllbGQucHJlZml4Py5pY29uKSB7XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIGxlZnQtMCB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgcGwtMyBmbGV4IGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAjaWNvbkNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLW5hbWVdPVwiZmllbGQucHJlZml4IS5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLXZhcmlhbnQ9XCJMaW5lXCJcclxuICAgICAgICAgICAgICAgICAgZGF0YS1pY29uLXNpemU9XCJtZWRpdW1cIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tY29sb3JdPVwiY29udHJvbC5kaXNhYmxlZCA/ICcjYzRjZGQyJyA6ICcjMDMxODJiJ1wiXHJcbiAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiZmllbGQudHlwZVwiXHJcbiAgICAgICAgICAgICAgW25hbWVdPVwiZmllbGQubmFtZVwiXHJcbiAgICAgICAgICAgICAgW2lkXT1cInVuaXF1ZUlkXCJcclxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiZmllbGQucmVhZE9ubHkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwiXHJcbiAgICAgICAgICAgICAgICBpc0VtYWlsRmllbGRcclxuICAgICAgICAgICAgICAgICAgPyBoYW5kbGVFbWFpbElucHV0KCRldmVudClcclxuICAgICAgICAgICAgICAgICAgOiBmaWVsZC50eXBlID09PSAndGV4dCcgJiYgaXNBbHBoYW51bWVyaWNcclxuICAgICAgICAgICAgICAgICAgICA/IGhhbmRsZUFscGhhbnVtZXJpY0lucHV0KCRldmVudClcclxuICAgICAgICAgICAgICAgICAgICA6IGhhbmRsZUlucHV0KCRldmVudClcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIChibHVyKT1cImhhbmRsZUJsdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbi1pbnB1dC1maWVsZFwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGNvbnRyb2wuZGlzYWJsZWQgfHwgZmllbGQucmVhZE9ubHksXHJcbiAgICAgICAgICAgICAgICBlcnJvcjogY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZXJyb3JzLFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmllbGRbJ2hhc1N1Y2Nlc3NCb3JkZXInXSAmJiBjb250cm9sLnZhbGlkICYmICFjb250cm9sLmVycm9ycyxcclxuICAgICAgICAgICAgICAgICdwbC0xMCc6IGZpZWxkLnByZWZpeD8uaWNvbixcclxuICAgICAgICAgICAgICAgICdwci0xMCc6IGZpZWxkLmljb24gfHwgZmllbGQuc3VmZml4Py5pY29uLFxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgIGNvbG9yOiBmaWVsZC52YWx1ZUNvbG9yIHx8ICdpbmhlcml0JyxcclxuICAgICAgICAgICAgICAgICdmb250LXNpemUnOiBmaWVsZC52YWx1ZVNpemUgfHwgJycsXHJcbiAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIEBpZiAoZmllbGQuaWNvbiB8fCBmaWVsZC5zdWZmaXg/Lmljb24pIHtcclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFic29sdXRlIHJpZ2h0LTAgdG9wLTEvMiAtdHJhbnNsYXRlLXktMS8yIHByLTMgZmxleCBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgI2ljb25Db250YWluZXJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaWNvbi1uYW1lXT1cImZpZWxkLnN1ZmZpeD8uaWNvbiB8fCBmaWVsZC5pY29uIS5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pY29uLXZhcmlhbnRdPVwiZmllbGQuaWNvbj8udmFyaWFudCB8fCAnTGluZSdcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWljb24tc2l6ZV09XCJmaWVsZC5pY29uID8gZ2V0SWNvblNpemVOYW1lKGZpZWxkLmljb24uc2l6ZSkgOiAnbWVkaXVtJ1wiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaWNvbi1jb2xvcl09XCJjb250cm9sLmRpc2FibGVkID8gJyNjNGNkZDInIDogJyMwMzE4MmInXCJcclxuICAgICAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgQGlmIChzaG93Rm9ybUZpZWxkTWVzc2FnZShjb250cm9sLCBoZWxwZXJUZXh0KSkge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm4tZmllbGQtbWVzc2FnZS1jb250YWluZXJcIj5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgY2xhc3M9XCJmbi1maWVsZC1tZXNzYWdlLXRleHRcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICBlcnJvcjogaXNFcnJvcixcclxuICAgICAgICAgICAgc3VjY2VzczogaXNTdWNjZXNzLFxyXG4gICAgICAgICAgfVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0RmllbGRNZXNzYWdlKCkgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG59XHJcbiJdfQ==
|