@cqa-lib/cqa-ui 1.1.190 → 1.1.192

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.
@@ -16,6 +16,152 @@ export const API_EDIT_STEP_LABELS = {
16
16
  const METHODS_WITHOUT_BODY = ['GET', 'HEAD', 'DELETE'];
17
17
  /** Auto-close pairs for payload JSON editor: opening char -> closing char. */
18
18
  const PAYLOAD_AUTO_CLOSE_PAIRS = { '{': '}', '[': ']', '"': '"', "'": "'" };
19
+ function isSingleQuote(ch) {
20
+ return ch === "'" || ch === '\u2018' || ch === '\u2019';
21
+ }
22
+ function isDoubleQuote(ch) {
23
+ return ch === '"' || ch === '\u201C' || ch === '\u201D';
24
+ }
25
+ function isClosingQuote(ch, openQuote) {
26
+ if (isSingleQuote(openQuote))
27
+ return isSingleQuote(ch);
28
+ if (isDoubleQuote(openQuote))
29
+ return isDoubleQuote(ch);
30
+ return ch === openQuote;
31
+ }
32
+ /**
33
+ * Tokenize a string respecting single- and double-quoted segments (for cURL args).
34
+ * Handles straight and smart/curly quotes so pasted cURLs from browsers/docs work.
35
+ */
36
+ function tokenizeCurlLine(line) {
37
+ const tokens = [];
38
+ let i = 0;
39
+ const n = line.length;
40
+ while (i < n) {
41
+ while (i < n && /\s/.test(line[i]))
42
+ i++;
43
+ if (i >= n)
44
+ break;
45
+ const ch = line[i];
46
+ if (isSingleQuote(ch) || isDoubleQuote(ch)) {
47
+ const quote = ch;
48
+ i++;
49
+ let value = '';
50
+ while (i < n && !isClosingQuote(line[i], quote)) {
51
+ if (line[i] === '\\') {
52
+ i++;
53
+ if (i < n)
54
+ value += line[i++];
55
+ }
56
+ else {
57
+ value += line[i++];
58
+ }
59
+ }
60
+ if (i < n)
61
+ i++;
62
+ tokens.push(value);
63
+ continue;
64
+ }
65
+ let word = '';
66
+ while (i < n && !/\s/.test(line[i]) && !isSingleQuote(line[i]) && !isDoubleQuote(line[i])) {
67
+ word += line[i++];
68
+ }
69
+ if (word)
70
+ tokens.push(word);
71
+ }
72
+ return tokens;
73
+ }
74
+ /** Strip one layer of surrounding single or double quotes from a string (e.g. '{"x":1}' -> {"x":1}). */
75
+ function stripSurroundingQuotes(s) {
76
+ if (s.length >= 2 && (s.startsWith("'") && s.endsWith("'")) || (s.startsWith('"') && s.endsWith('"'))) {
77
+ return s.slice(1, -1);
78
+ }
79
+ return s;
80
+ }
81
+ /**
82
+ * Parse a cURL command string and return method, url, headers, and body.
83
+ * Supports -X/--request, -H/--header, -d/--data/--data-raw/--data-binary, and URL.
84
+ * Handles line continuations (backslash-newline) and quoted body payloads.
85
+ */
86
+ function parseCurl(curlString) {
87
+ const raw = (curlString ?? '').trim();
88
+ if (!raw)
89
+ return null;
90
+ // Remove line continuations (backslash followed by newline) so they don't break tokenization
91
+ const noContinuations = raw.replace(/\\\s*\r?\n\s*/g, ' ');
92
+ const normalized = noContinuations.replace(/\r?\n/g, ' ').replace(/\s+/g, ' ');
93
+ const tokens = tokenizeCurlLine(normalized);
94
+ let method = 'GET';
95
+ let url = '';
96
+ const headers = [];
97
+ let body = '';
98
+ const urlPattern = /^https?:\/\//i;
99
+ for (let i = 0; i < tokens.length; i++) {
100
+ const t = tokens[i];
101
+ const consumeNext = () => {
102
+ i++;
103
+ return tokens[i];
104
+ };
105
+ if (t === '-X' || t === '--request') {
106
+ const value = consumeNext();
107
+ if (value)
108
+ method = value.toUpperCase();
109
+ continue;
110
+ }
111
+ if (t === '-H' || t === '--header') {
112
+ const value = consumeNext();
113
+ if (value) {
114
+ const colon = value.indexOf(':');
115
+ if (colon !== -1) {
116
+ const name = value.slice(0, colon).trim();
117
+ const headerValue = value.slice(colon + 1).trim();
118
+ if (name)
119
+ headers.push({ name, type: 'string', value: headerValue });
120
+ }
121
+ }
122
+ continue;
123
+ }
124
+ if (t === '-d' || t === '--data' || t === '--data-raw' || t === '--data-binary' || t === '--data-ascii') {
125
+ const value = consumeNext();
126
+ if (value != null && !String(value).startsWith('@'))
127
+ body = stripSurroundingQuotes(value);
128
+ continue;
129
+ }
130
+ if (t.startsWith('--data=')) {
131
+ const value = t.slice(7);
132
+ if (!value.startsWith('@'))
133
+ body = stripSurroundingQuotes(value.replace(/^["']|["']$/g, ''));
134
+ continue;
135
+ }
136
+ if (t.startsWith('--data-raw=')) {
137
+ const value = t.slice(11);
138
+ if (!value.startsWith('@'))
139
+ body = stripSurroundingQuotes(value.replace(/^["']|["']$/g, ''));
140
+ continue;
141
+ }
142
+ if (t.startsWith('-d')) {
143
+ const value = t.length > 2 ? t.slice(2) : consumeNext();
144
+ if (value != null && !value.startsWith('@'))
145
+ body = stripSurroundingQuotes(value);
146
+ continue;
147
+ }
148
+ if (urlPattern.test(t)) {
149
+ if (!url)
150
+ url = t;
151
+ }
152
+ }
153
+ if (!url) {
154
+ const firstUrl = tokens.find((tok) => urlPattern.test(tok));
155
+ if (firstUrl)
156
+ url = firstUrl;
157
+ }
158
+ // Many cURLs (e.g. from browser devtools) omit -X POST when sending a body; infer POST
159
+ const finalMethod = (method || 'GET').toUpperCase();
160
+ if (body && (finalMethod === 'GET' || finalMethod === 'HEAD')) {
161
+ return { method: 'POST', url, headers, body };
162
+ }
163
+ return { method: finalMethod, url, headers, body };
164
+ }
19
165
  export class ApiEditStepComponent {
20
166
  constructor(fb, cdr) {
21
167
  this.fb = fb;
@@ -27,6 +173,8 @@ export class ApiEditStepComponent {
27
173
  /** Emits when user clicks Send Request, with environment, method, url, and headers. */
28
174
  this.sendRequest = new EventEmitter();
29
175
  this.back = new EventEmitter();
176
+ /** Emits when user clicks the Cancel button (step 1). */
177
+ this.cancel = new EventEmitter();
30
178
  this.next = new EventEmitter();
31
179
  /** Emits when user clicks Create with all entered details: step1 (environment, HTTP method, URL, headers, body), step2 (variable name), step3 (verifications). */
32
180
  this.create = new EventEmitter();
@@ -64,16 +212,41 @@ export class ApiEditStepComponent {
64
212
  searchable: false,
65
213
  options: [],
66
214
  };
215
+ /** Auth type options: array of strings or objects with id, name, value, label (passed from parent). Falls back to built-in list when empty. */
216
+ this.authTypeOptions = [];
217
+ /** Config for Auth Type dropdown (updated when authTypeOptions changes, like environment) */
218
+ this.authTypeSelectConfig = {
219
+ key: 'authType',
220
+ placeholder: 'No Auth',
221
+ searchable: false,
222
+ options: [],
223
+ };
224
+ /** Bearer token value (Authorization tab, when auth type is Bearer Token). */
225
+ this.bearerToken = '';
226
+ this.oauth2GrantTypeSelectConfig = {
227
+ key: 'grantType',
228
+ placeholder: 'Select grant type',
229
+ searchable: false,
230
+ options: [...ApiEditStepComponent.OAUTH_GRANT_TYPE_OPTIONS],
231
+ };
232
+ this.oauth2ClientAuthSelectConfig = {
233
+ key: 'clientAuthentication',
234
+ placeholder: 'Select method',
235
+ searchable: false,
236
+ options: [...ApiEditStepComponent.OAUTH_CLIENT_AUTH_OPTIONS],
237
+ };
67
238
  /** Cached environment value from last selection (so Create payload has the selected value). */
68
239
  this.currentEnvironmentValue = '';
69
240
  /** Cached HTTP method from last selection (so Create payload has the selected value). */
70
241
  this.currentMethodValue = '';
71
- this.url = '';
242
+ this._url = '';
243
+ /** When true, params form changes should not update the URL (we're syncing from URL). */
244
+ this.paramsSyncingFromUrl = false;
72
245
  this.payloadTabs = [
246
+ { value: 'authorization', label: 'Authorization' },
73
247
  { value: 'headers', label: 'Headers' },
74
248
  { value: 'body', label: 'Body' },
75
249
  { value: 'params', label: 'Params' },
76
- { value: 'scripts', label: 'Scripts' },
77
250
  ];
78
251
  this.activePayloadTab = 'headers';
79
252
  /** Step 3: Response verification tabs */
@@ -82,7 +255,7 @@ export class ApiEditStepComponent {
82
255
  { value: 'status', label: 'Status' },
83
256
  ];
84
257
  this.activeResponseVerificationTab = 'response-body';
85
- /** Payload type for Body/Params/Scripts: raw, x-www-form-urlencoded, form-data */
258
+ /** Payload type for Body/Params/Authorization: raw, x-www-form-urlencoded, form-data */
86
259
  this.payloadType = 'raw';
87
260
  /** Segment options for payload type (used by cqa-segment-control) */
88
261
  this.payloadTypeSegments = [
@@ -99,7 +272,7 @@ export class ApiEditStepComponent {
99
272
  searchable: false,
100
273
  options: [...ApiEditStepComponent.DEFAULT_FORMAT_OPTIONS],
101
274
  };
102
- /** Payload text area value for Body/Params/Scripts */
275
+ /** Payload text area value for Body/Params/Authorization */
103
276
  this.payloadText = '';
104
277
  /** JSON parse error when format is JSON and payload is invalid; null when valid or not JSON. */
105
278
  this.payloadJsonError = null;
@@ -228,6 +401,30 @@ export class ApiEditStepComponent {
228
401
  .map((e) => ApiEditStepComponent.getOptionValue(e))
229
402
  .filter((v) => v != null);
230
403
  }
404
+ updateAuthTypeSelectConfig() {
405
+ const options = this.authTypeOptions?.length > 0
406
+ ? this.authTypeOptions.map((a) => ApiEditStepComponent.toSelectOption(a))
407
+ : [...ApiEditStepComponent.DEFAULT_AUTH_TYPE_OPTIONS];
408
+ this.authTypeSelectConfig = {
409
+ ...this.authTypeSelectConfig,
410
+ options,
411
+ };
412
+ }
413
+ getAuthTypeValues() {
414
+ const source = this.authTypeOptions?.length > 0
415
+ ? this.authTypeOptions
416
+ : ApiEditStepComponent.DEFAULT_AUTH_TYPE_OPTIONS;
417
+ return source
418
+ .map((a) => ApiEditStepComponent.getOptionValue(a))
419
+ .filter((v) => v != null);
420
+ }
421
+ /** Current auth type value (e.g. 'no-auth') for template */
422
+ get selectedAuthType() {
423
+ const v = this.authTypeForm?.get('authType')?.value;
424
+ if (v == null || v === '')
425
+ return 'no-auth';
426
+ return typeof v === 'object' ? (v?.value ?? v?.id ?? 'no-auth') : String(v);
427
+ }
231
428
  /** Current HTTP method (from form or default: first of httpMethodOptions). Treats empty string as unset. */
232
429
  get selectedMethod() {
233
430
  const value = this.methodForm?.get('method')?.value;
@@ -277,6 +474,21 @@ export class ApiEditStepComponent {
277
474
  : String(v)
278
475
  : '';
279
476
  }
477
+ /** URL for the request. Getter/setter syncs query params with the Params tab (Postman-style). */
478
+ get url() {
479
+ return this._url;
480
+ }
481
+ set url(value) {
482
+ const next = value ?? '';
483
+ if (this._url === next)
484
+ return;
485
+ this._url = next;
486
+ if (this.paramsFormArray) {
487
+ this.paramsSyncingFromUrl = true;
488
+ this.syncParamsFromUrl();
489
+ this.paramsSyncingFromUrl = false;
490
+ }
491
+ }
280
492
  onPayloadTypeChange(val) {
281
493
  this.payloadType = val;
282
494
  }
@@ -450,6 +662,9 @@ export class ApiEditStepComponent {
450
662
  get keyTypeValueRows() {
451
663
  return (this.keyTypeValueFormArray?.controls ?? []);
452
664
  }
665
+ get paramsRows() {
666
+ return (this.paramsFormArray?.controls ?? []);
667
+ }
453
668
  get verificationRows() {
454
669
  return (this.verificationFormArray?.controls ?? []);
455
670
  }
@@ -539,6 +754,20 @@ export class ApiEditStepComponent {
539
754
  this.environmentForm = this.fb.group({
540
755
  environment: [defaultEnv],
541
756
  });
757
+ this.updateAuthTypeSelectConfig();
758
+ const firstAuthValue = this.getAuthTypeValues()[0];
759
+ const defaultAuthType = this.initialAuthType ?? firstAuthValue ?? 'no-auth';
760
+ this.authTypeForm = this.fb.group({
761
+ authType: [defaultAuthType],
762
+ });
763
+ this.oauth2Form = this.fb.group({
764
+ grantType: ['client_credentials'],
765
+ accessTokenUrl: [''],
766
+ clientId: [''],
767
+ clientSecret: [''],
768
+ scope: [''],
769
+ clientAuthentication: ['basic'],
770
+ });
542
771
  this.environmentFormChangesSub = this.environmentForm.get('environment')?.valueChanges?.subscribe((v) => {
543
772
  const s = v != null && v !== '' ? (typeof v === 'object' ? ApiEditStepComponent.getOptionValue(v) : String(v)) : '';
544
773
  this.currentEnvironmentValue = s ?? '';
@@ -561,6 +790,16 @@ export class ApiEditStepComponent {
561
790
  this.payloadFormatForm = this.fb.group({ format: [defaultFormat] });
562
791
  this.buildKeyValueFormArray();
563
792
  this.buildKeyTypeValueFormArray();
793
+ this.buildParamsFormArray();
794
+ this.paramsFormArrayChangesSub = this.paramsFormArray.valueChanges?.subscribe(() => this.syncUrlFromParams());
795
+ if (this.initialUrl != null && this.initialUrl !== '') {
796
+ this._url = this.initialUrl;
797
+ this.syncParamsFromUrl();
798
+ }
799
+ // Initialize variableName from initialVariableName
800
+ if (this.initialVariableName != null && this.initialVariableName !== '') {
801
+ this.variableName = this.initialVariableName;
802
+ }
564
803
  this.updateVerificationSelectConfig();
565
804
  this.updateVerificationDataTypeSelectConfig();
566
805
  this.buildVerificationFormArray();
@@ -587,6 +826,7 @@ export class ApiEditStepComponent {
587
826
  this.headerNameOptionsChangesSub?.unsubscribe();
588
827
  this.environmentFormChangesSub?.unsubscribe();
589
828
  this.methodFormChangesSub?.unsubscribe();
829
+ this.paramsFormArrayChangesSub?.unsubscribe();
590
830
  }
591
831
  /** Sync line numbers column scroll with payload textarea scroll (Postman-style). */
592
832
  setupPayloadTextareaScrollSync() {
@@ -601,6 +841,9 @@ export class ApiEditStepComponent {
601
841
  textarea.addEventListener('scroll', () => {
602
842
  lineNumbersEl.scrollTop = textarea.scrollTop;
603
843
  });
844
+ lineNumbersEl.addEventListener('scroll', () => {
845
+ textarea.scrollTop = lineNumbersEl.scrollTop;
846
+ });
604
847
  }, 0);
605
848
  }
606
849
  buildKeyValueFormArray(rows) {
@@ -613,6 +856,109 @@ export class ApiEditStepComponent {
613
856
  const groups = initial.map((r) => this.fb.group({ key: [r.key], type: [r.type], value: [r.value] }));
614
857
  this.keyTypeValueFormArray = this.fb.array(groups);
615
858
  }
859
+ buildParamsFormArray(rows) {
860
+ const initial = rows ?? [{ key: '', value: '' }];
861
+ const groups = initial.map((r) => this.fb.group({ key: [r.key], value: [r.value] }));
862
+ if (this.paramsFormArray) {
863
+ this.paramsFormArray.clear();
864
+ groups.forEach((g) => this.paramsFormArray.push(g));
865
+ }
866
+ else {
867
+ this.paramsFormArray = this.fb.array(groups);
868
+ }
869
+ }
870
+ /** Parse URL into base (without query/fragment) and query key-value pairs. Preserves relative URLs. */
871
+ parseQueryParamsFromUrl(urlStr) {
872
+ const empty = { baseUrl: urlStr, rows: [{ key: '', value: '' }] };
873
+ if (!urlStr || !urlStr.trim())
874
+ return empty;
875
+ try {
876
+ const isAbsolute = /^https?:\/\//i.test(urlStr.trim());
877
+ const url = new URL(urlStr, 'http://localhost');
878
+ const baseUrl = isAbsolute ? url.origin + url.pathname : url.pathname;
879
+ const rows = [];
880
+ url.searchParams.forEach((value, key) => {
881
+ rows.push({ key, value });
882
+ });
883
+ if (rows.length === 0)
884
+ rows.push({ key: '', value: '' });
885
+ return { baseUrl, rows };
886
+ }
887
+ catch {
888
+ return empty;
889
+ }
890
+ }
891
+ /** Get base URL (without query/fragment) for building URL from params. Preserves relative URLs. */
892
+ getBaseUrl(urlStr) {
893
+ if (!urlStr || !urlStr.trim())
894
+ return urlStr;
895
+ try {
896
+ const isAbsolute = /^https?:\/\//i.test(urlStr.trim());
897
+ const url = new URL(urlStr, 'http://localhost');
898
+ return isAbsolute ? url.origin + url.pathname : url.pathname;
899
+ }
900
+ catch {
901
+ return urlStr;
902
+ }
903
+ }
904
+ /** Parse application/x-www-form-urlencoded body (key=value&...) into key-value rows. */
905
+ parseFormUrlEncodedBody(body) {
906
+ const trimmed = (body ?? '').trim();
907
+ if (!trimmed)
908
+ return [];
909
+ try {
910
+ const params = new URLSearchParams(trimmed);
911
+ const rows = [];
912
+ params.forEach((value, key) => rows.push({ key, value }));
913
+ return rows;
914
+ }
915
+ catch {
916
+ return [];
917
+ }
918
+ }
919
+ /**
920
+ * If form body has a single key whose value is URL-decoded JSON, return it pretty-printed for Raw body.
921
+ * Otherwise return null (caller keeps x-www-form-urlencoded view).
922
+ */
923
+ tryFormBodyValueAsRawJson(rows) {
924
+ if (rows.length !== 1 || !rows[0].value?.trim())
925
+ return null;
926
+ const value = rows[0].value.trim();
927
+ if (!(value.startsWith('{') || value.startsWith('[')))
928
+ return null;
929
+ try {
930
+ const parsed = JSON.parse(value);
931
+ return JSON.stringify(parsed, null, 2);
932
+ }
933
+ catch {
934
+ return null;
935
+ }
936
+ }
937
+ /** Update Params table from current URL query string (Postman-style). */
938
+ syncParamsFromUrl() {
939
+ const { baseUrl: _b, rows } = this.parseQueryParamsFromUrl(this._url);
940
+ this.buildParamsFormArray(rows);
941
+ this.cdr.markForCheck();
942
+ }
943
+ /** Update URL query string from Params table (Postman-style). */
944
+ syncUrlFromParams() {
945
+ if (this.paramsSyncingFromUrl || !this.paramsFormArray)
946
+ return;
947
+ const baseUrl = this.getBaseUrl(this._url);
948
+ const params = new URLSearchParams();
949
+ for (const c of this.paramsFormArray.controls) {
950
+ const key = (c.get('key')?.value ?? '').trim();
951
+ const value = c.get('value')?.value ?? '';
952
+ if (key !== '')
953
+ params.set(key, value);
954
+ }
955
+ const queryString = params.toString();
956
+ const newUrl = queryString ? `${baseUrl}?${queryString}` : baseUrl;
957
+ if (this._url !== newUrl) {
958
+ this._url = newUrl;
959
+ this.cdr.markForCheck();
960
+ }
961
+ }
616
962
  buildVerificationFormArray(rows) {
617
963
  const defaultVerification = this.getDefaultVerification();
618
964
  const defaultDataType = this.getDefaultDataType();
@@ -647,15 +993,152 @@ export class ApiEditStepComponent {
647
993
  this.headersFormArray = this.fb.array(groups);
648
994
  }
649
995
  }
650
- /** Handler: show import cURL panel (called when user clicks "Import API cURL"). */
996
+ /** Reset all three steps and all entered data to initial/default state. Used when user cancels on step 1. */
997
+ resetAllStepsAndData() {
998
+ this.currentStep = 1;
999
+ const firstMethodValue = this.httpMethodOptions?.length
1000
+ ? ApiEditStepComponent.getOptionValue(this.httpMethodOptions[0])
1001
+ : undefined;
1002
+ const defaultMethod = this.initialMethod ?? firstMethodValue ?? 'GET';
1003
+ const methodVal = typeof defaultMethod === 'string' ? defaultMethod : (ApiEditStepComponent.getOptionValue(defaultMethod) ?? '');
1004
+ this.currentMethodValue = methodVal ?? '';
1005
+ if (this.methodForm)
1006
+ this.methodForm.patchValue({ method: defaultMethod });
1007
+ const firstEnvValue = this.environmentOptions?.length
1008
+ ? ApiEditStepComponent.getOptionValue(this.environmentOptions[0])
1009
+ : undefined;
1010
+ const defaultEnv = this.initialEnvironment ?? firstEnvValue ?? 'Development';
1011
+ const envVal = typeof defaultEnv === 'string' ? defaultEnv : (ApiEditStepComponent.getOptionValue(defaultEnv) ?? '');
1012
+ this.currentEnvironmentValue = envVal ?? '';
1013
+ if (this.environmentForm)
1014
+ this.environmentForm.patchValue({ environment: defaultEnv });
1015
+ this.url = this.initialUrl ?? '';
1016
+ this.buildHeadersFormArray(this.initialHeaders ?? [{ name: '', type: 'string', value: '' }]);
1017
+ this.updateHeaderNameSelectConfig();
1018
+ this.headersChange.emit(this.headers);
1019
+ this.bodyView = 'headers';
1020
+ this.activePayloadTab = 'headers';
1021
+ this.payloadType = 'raw';
1022
+ this.payloadText = '';
1023
+ this.payloadJsonError = null;
1024
+ const defaultFormat = this.initialFormat ?? this.getFormatValues()[0] ?? 'json';
1025
+ if (this.payloadFormatForm)
1026
+ this.payloadFormatForm.patchValue({ format: defaultFormat });
1027
+ this.buildKeyValueFormArray();
1028
+ this.buildKeyTypeValueFormArray();
1029
+ this.buildParamsFormArray();
1030
+ this.importCurlControl.setValue('');
1031
+ this.variableName = '';
1032
+ this.variableNameError = '';
1033
+ this.buildVerificationFormArray();
1034
+ this.buildStatusVerificationFormArray();
1035
+ this.activeResponseVerificationTab = 'response-body';
1036
+ this.validatePayloadJson();
1037
+ this.cdr.detectChanges();
1038
+ }
1039
+ /** Handler: show import cURL panel (called when user clicks "Import API cURL"). Resets textarea so it is cleared each time. */
651
1040
  openImportCurlPanel() {
1041
+ this.importCurlControl.setValue('');
652
1042
  this.bodyView = 'import-curl';
653
1043
  this.cdr.detectChanges();
654
1044
  }
655
- /** Handler: emit cURL value from control and close panel. Called when user clicks Import button. */
1045
+ /** Reset URL, method, headers, body, and params to empty/default before applying imported cURL. */
1046
+ resetRequestFieldsBeforeCurlImport() {
1047
+ const firstMethodValue = this.httpMethodOptions?.length
1048
+ ? ApiEditStepComponent.getOptionValue(this.httpMethodOptions[0])
1049
+ : undefined;
1050
+ const defaultMethod = this.initialMethod ?? firstMethodValue ?? 'GET';
1051
+ this.selectedMethod = typeof defaultMethod === 'string' ? defaultMethod : (ApiEditStepComponent.getOptionValue(defaultMethod) ?? '') ?? 'GET';
1052
+ this.currentMethodValue = this.selectedMethod;
1053
+ if (this.methodForm)
1054
+ this.methodForm.patchValue({ method: defaultMethod });
1055
+ this.url = '';
1056
+ this.buildHeadersFormArray([{ name: '', type: 'string', value: '' }]);
1057
+ this.updateHeaderNameSelectConfig();
1058
+ this.headersChange.emit(this.headers);
1059
+ this.payloadType = 'raw';
1060
+ this.payloadText = '';
1061
+ this.payloadJsonError = null;
1062
+ const defaultFormat = this.initialFormat ?? this.getFormatValues()[0] ?? 'json';
1063
+ if (this.payloadFormatForm)
1064
+ this.payloadFormatForm.patchValue({ format: defaultFormat });
1065
+ this.buildKeyValueFormArray([{ key: '', value: '' }]);
1066
+ this.buildKeyTypeValueFormArray([{ key: '', type: 'text', value: '' }]);
1067
+ this.buildParamsFormArray([{ key: '', value: '' }]);
1068
+ this.validatePayloadJson();
1069
+ this.cdr.detectChanges();
1070
+ }
1071
+ /** Handler: parse cURL from control, bind to form fields, emit and close panel. Called when user clicks Import button. */
656
1072
  onImportCurlConfirm() {
657
1073
  const value = this.importCurlControl.value ?? '';
658
- this.importCurl.emit(typeof value === 'string' ? value : '');
1074
+ const curlStr = typeof value === 'string' ? value : '';
1075
+ this.importCurl.emit(curlStr);
1076
+ this.resetRequestFieldsBeforeCurlImport();
1077
+ const parsed = parseCurl(curlStr);
1078
+ if (parsed) {
1079
+ const methodValue = parsed.method && this.getMethodValues().includes(parsed.method)
1080
+ ? parsed.method
1081
+ : parsed.method || 'GET';
1082
+ this.selectedMethod = methodValue;
1083
+ this.currentMethodValue = methodValue;
1084
+ if (parsed.url)
1085
+ this.url = parsed.url;
1086
+ // Bind Authorization header to Authorization section when present (Bearer or other scheme)
1087
+ let headerRows = parsed.headers;
1088
+ const authHeader = headerRows.find((h) => h.name.toLowerCase() === 'authorization');
1089
+ if (authHeader?.value?.trim()) {
1090
+ const authValue = authHeader.value.trim();
1091
+ const bearerMatch = /^Bearer\s+(.+)$/i.exec(authValue);
1092
+ if (bearerMatch) {
1093
+ const token = bearerMatch[1].trim();
1094
+ if (this.getAuthTypeValues().includes('bearer') && this.authTypeForm) {
1095
+ this.authTypeForm.patchValue({ authType: 'bearer' });
1096
+ this.bearerToken = token;
1097
+ }
1098
+ headerRows = headerRows.filter((h) => h.name.toLowerCase() !== 'authorization');
1099
+ }
1100
+ }
1101
+ headerRows = headerRows.length > 0 ? headerRows : [{ name: '', type: 'string', value: '' }];
1102
+ this.buildHeadersFormArray(headerRows);
1103
+ this.updateHeaderNameSelectConfig();
1104
+ this.headersChange.emit(this.headers);
1105
+ if (parsed.body) {
1106
+ const contentType = parsed.headers
1107
+ .find((h) => h.name.toLowerCase() === 'content-type')
1108
+ ?.value?.toLowerCase() ?? '';
1109
+ const isFormUrlEncoded = contentType.includes('application/x-www-form-urlencoded');
1110
+ if (isFormUrlEncoded) {
1111
+ const rows = this.parseFormUrlEncodedBody(parsed.body);
1112
+ this.buildKeyValueFormArray(rows.length > 0 ? rows : [{ key: '', value: '' }]);
1113
+ const decodedAsJson = this.tryFormBodyValueAsRawJson(rows);
1114
+ if (decodedAsJson != null) {
1115
+ this.payloadType = 'raw';
1116
+ this.payloadText = decodedAsJson;
1117
+ if (this.payloadFormatForm)
1118
+ this.payloadFormatForm.patchValue({ format: 'json' });
1119
+ this.validatePayloadJson();
1120
+ this.payloadJsonError = null;
1121
+ }
1122
+ else {
1123
+ this.payloadType = 'x-www-form-urlencoded';
1124
+ this.payloadText = '';
1125
+ this.payloadJsonError = null;
1126
+ }
1127
+ }
1128
+ else {
1129
+ this.payloadText = parsed.body;
1130
+ this.validatePayloadJson();
1131
+ const trimmed = parsed.body.trim();
1132
+ if ((trimmed.startsWith('{') && trimmed.endsWith('}')) || (trimmed.startsWith('[') && trimmed.endsWith(']'))) {
1133
+ const formatValues = this.getFormatValues();
1134
+ if (formatValues.includes('json') && this.payloadFormatForm) {
1135
+ this.payloadFormatForm.patchValue({ format: 'json' });
1136
+ }
1137
+ }
1138
+ }
1139
+ }
1140
+ this.cdr.detectChanges();
1141
+ }
659
1142
  this.closeImportCurlPanel();
660
1143
  }
661
1144
  /** Handler: emit cancel and close panel. Called when user clicks Cancel in import cURL panel. */
@@ -686,9 +1169,15 @@ export class ApiEditStepComponent {
686
1169
  this.setStep(this.currentStep - 1);
687
1170
  }
688
1171
  else {
1172
+ this.resetAllStepsAndData();
689
1173
  this.back.emit();
690
1174
  }
691
1175
  }
1176
+ /** Called when user clicks the Cancel button (step 1). Emits cancel then runs normal back flow. */
1177
+ onCancel() {
1178
+ this.cancel.emit();
1179
+ this.onBack();
1180
+ }
692
1181
  onNext() {
693
1182
  if (this.currentStep === 2 && !this.variableName?.trim()) {
694
1183
  this.variableNameError = 'Variable Name is required.';
@@ -742,6 +1231,15 @@ export class ApiEditStepComponent {
742
1231
  trackByKeyTypeValue(index) {
743
1232
  return index;
744
1233
  }
1234
+ addParamsRow() {
1235
+ this.paramsFormArray.push(this.fb.group({ key: [''], value: [''] }));
1236
+ }
1237
+ removeParamsRow(index) {
1238
+ this.paramsFormArray.removeAt(index);
1239
+ }
1240
+ trackByParams(index) {
1241
+ return index;
1242
+ }
745
1243
  addVerificationRow() {
746
1244
  this.verificationFormArray.push(this.fb.group({
747
1245
  jsonPath: [''],
@@ -786,18 +1284,37 @@ export class ApiEditStepComponent {
786
1284
  }
787
1285
  /** Minimal payload when getCreatePayload throws (so create always emits). */
788
1286
  getCreatePayloadFallback() {
1287
+ const authType = this.selectedAuthType;
1288
+ const bearerToken = authType === 'bearer' ? (this.bearerToken ?? '') : undefined;
1289
+ let oauth2;
1290
+ if (authType === 'oauth2' && this.oauth2Form) {
1291
+ const grantType = ApiEditStepComponent.getControlValue(this.oauth2Form.get('grantType'));
1292
+ const clientAuth = ApiEditStepComponent.getControlValue(this.oauth2Form.get('clientAuthentication'));
1293
+ oauth2 = {
1294
+ grantType: grantType !== '' ? grantType : 'client_credentials',
1295
+ accessTokenUrl: (this.oauth2Form.get('accessTokenUrl')?.value ?? ''),
1296
+ clientId: (this.oauth2Form.get('clientId')?.value ?? ''),
1297
+ clientSecret: (this.oauth2Form.get('clientSecret')?.value ?? ''),
1298
+ scope: (this.oauth2Form.get('scope')?.value ?? ''),
1299
+ clientAuthentication: clientAuth !== '' ? clientAuth : 'basic',
1300
+ };
1301
+ }
789
1302
  return {
790
1303
  step1: {
791
1304
  environment: '',
792
1305
  method: '',
793
1306
  url: this.url ?? '',
794
1307
  headers: [],
1308
+ authType,
1309
+ ...(bearerToken !== undefined && { bearerToken }),
1310
+ ...(oauth2 !== undefined && { oauth2 }),
795
1311
  activePayloadTab: this.activePayloadTab,
796
1312
  payloadType: this.payloadType,
797
1313
  payloadFormat: '',
798
1314
  payloadText: this.payloadText ?? '',
799
1315
  keyValueRows: [],
800
1316
  keyTypeValueRows: [],
1317
+ paramsRows: [],
801
1318
  },
802
1319
  step2: { variableName: this.variableName ?? '' },
803
1320
  step3: {
@@ -832,6 +1349,11 @@ export class ApiEditStepComponent {
832
1349
  type: c.get('type')?.value ?? 'text',
833
1350
  value: c.get('value')?.value ?? '',
834
1351
  }));
1352
+ const paramsFormArray = this.paramsFormArray;
1353
+ const paramsRows = (paramsFormArray?.controls ?? []).map((c) => ({
1354
+ key: c.get('key')?.value ?? '',
1355
+ value: c.get('value')?.value ?? '',
1356
+ }));
835
1357
  const verificationFormArray = this.verificationFormArray;
836
1358
  const responseBodyVerifications = (verificationFormArray?.controls ?? []).map((c) => ({
837
1359
  jsonPath: c.get('jsonPath')?.value ?? '',
@@ -844,18 +1366,37 @@ export class ApiEditStepComponent {
844
1366
  verification: c.get('verification')?.value ?? '',
845
1367
  expectedValue: c.get('expectedValue')?.value ?? '',
846
1368
  }));
1369
+ const authType = this.selectedAuthType;
1370
+ const bearerToken = authType === 'bearer' ? (this.bearerToken ?? '') : undefined;
1371
+ let oauth2;
1372
+ if (authType === 'oauth2' && this.oauth2Form) {
1373
+ const grantType = ApiEditStepComponent.getControlValue(this.oauth2Form.get('grantType'));
1374
+ const clientAuth = ApiEditStepComponent.getControlValue(this.oauth2Form.get('clientAuthentication'));
1375
+ oauth2 = {
1376
+ grantType: grantType !== '' ? grantType : 'client_credentials',
1377
+ accessTokenUrl: (this.oauth2Form.get('accessTokenUrl')?.value ?? ''),
1378
+ clientId: (this.oauth2Form.get('clientId')?.value ?? ''),
1379
+ clientSecret: (this.oauth2Form.get('clientSecret')?.value ?? ''),
1380
+ scope: (this.oauth2Form.get('scope')?.value ?? ''),
1381
+ clientAuthentication: clientAuth !== '' ? clientAuth : 'basic',
1382
+ };
1383
+ }
847
1384
  return {
848
1385
  step1: {
849
1386
  environment,
850
1387
  method,
851
1388
  url: this.url ?? '',
852
1389
  headers: this.headers,
1390
+ authType,
1391
+ ...(bearerToken !== undefined && { bearerToken }),
1392
+ ...(oauth2 !== undefined && { oauth2 }),
853
1393
  activePayloadTab: this.activePayloadTab,
854
1394
  payloadType: this.payloadType,
855
1395
  payloadFormat: format,
856
1396
  payloadText: this.payloadText ?? '',
857
1397
  keyValueRows,
858
1398
  keyTypeValueRows,
1399
+ paramsRows,
859
1400
  },
860
1401
  step2: {
861
1402
  variableName: this.variableName ?? '',
@@ -918,6 +1459,33 @@ export class ApiEditStepComponent {
918
1459
  }
919
1460
  }
920
1461
  }
1462
+ if (changes['initialAuthType']?.currentValue != null && this.authTypeForm) {
1463
+ const v = changes['initialAuthType'].currentValue;
1464
+ const resolved = typeof v === 'string' ? v : ApiEditStepComponent.getOptionValue(v);
1465
+ if (resolved != null)
1466
+ this.authTypeForm.patchValue({ authType: v });
1467
+ }
1468
+ if (changes['authTypeOptions']) {
1469
+ this.updateAuthTypeSelectConfig();
1470
+ if (this.authTypeForm) {
1471
+ const values = this.getAuthTypeValues();
1472
+ if (values.length > 0) {
1473
+ const current = this.authTypeForm.get('authType')?.value;
1474
+ const currentVal = current != null && current !== ''
1475
+ ? typeof current === 'object'
1476
+ ? ApiEditStepComponent.getOptionValue(current)
1477
+ : String(current)
1478
+ : null;
1479
+ const valid = currentVal != null && values.includes(currentVal);
1480
+ if (!valid) {
1481
+ const firstValue = values[0];
1482
+ if (firstValue != null) {
1483
+ this.authTypeForm.patchValue({ authType: firstValue });
1484
+ }
1485
+ }
1486
+ }
1487
+ }
1488
+ }
921
1489
  if (changes['initialStep']) {
922
1490
  this.applyInitialStep(changes['initialStep'].currentValue);
923
1491
  }
@@ -940,6 +1508,9 @@ export class ApiEditStepComponent {
940
1508
  if (changes['initialFormat']?.currentValue != null && this.payloadFormatForm) {
941
1509
  this.payloadFormatForm.patchValue({ format: changes['initialFormat'].currentValue });
942
1510
  }
1511
+ if (changes['initialVariableName']?.currentValue != null) {
1512
+ this.variableName = changes['initialVariableName'].currentValue;
1513
+ }
943
1514
  if (changes['formatOptions']) {
944
1515
  this.updatePayloadFormatSelectConfig();
945
1516
  if (this.payloadFormatForm) {
@@ -993,6 +1564,24 @@ export class ApiEditStepComponent {
993
1564
  }
994
1565
  }
995
1566
  }
1567
+ /** Default options when authTypeOptions is empty (same shape as environment) */
1568
+ ApiEditStepComponent.DEFAULT_AUTH_TYPE_OPTIONS = [
1569
+ { id: 'no-auth', value: 'no-auth', name: 'No Auth', label: 'No Auth' },
1570
+ { id: 'bearer', value: 'bearer', name: 'Bearer Token', label: 'Bearer Token' },
1571
+ { id: 'oauth2', value: 'oauth2', name: 'OAuth 2.0', label: 'OAuth 2.0' },
1572
+ ];
1573
+ /** Grant type options for OAuth 2.0 */
1574
+ ApiEditStepComponent.OAUTH_GRANT_TYPE_OPTIONS = [
1575
+ { id: 'client_credentials', value: 'client_credentials', name: 'Client Credentials', label: 'Client Credentials' },
1576
+ { id: 'authorization_code', value: 'authorization_code', name: 'Authorization Code', label: 'Authorization Code' },
1577
+ { id: 'password', value: 'password', name: 'Password', label: 'Password' },
1578
+ { id: 'implicit', value: 'implicit', name: 'Implicit', label: 'Implicit' },
1579
+ ];
1580
+ /** Client authentication method options for OAuth 2.0 */
1581
+ ApiEditStepComponent.OAUTH_CLIENT_AUTH_OPTIONS = [
1582
+ { id: 'basic', value: 'basic', name: 'Send as Basic Auth header', label: 'Send as Basic Auth header' },
1583
+ { id: 'body', value: 'body', name: 'Send in body', label: 'Send in body' },
1584
+ ];
996
1585
  ApiEditStepComponent.DEFAULT_FORMAT_OPTIONS = [
997
1586
  { id: 'json', value: 'json', name: 'JSON', label: 'JSON' },
998
1587
  { id: 'xml', value: 'xml', name: 'XML', label: 'XML' },
@@ -1006,7 +1595,7 @@ ApiEditStepComponent.DEFAULT_HEADER_NAME_OPTIONS = [
1006
1595
  'Accept-Language',
1007
1596
  'Access-Control-Request-Headers',
1008
1597
  'Access-Control-Request-Method',
1009
- 'Authorization',
1598
+ 'Scripts',
1010
1599
  'Cache-Control',
1011
1600
  'Content-MD5',
1012
1601
  'Content-Length',
@@ -1064,10 +1653,10 @@ ApiEditStepComponent.DEFAULT_STATUS_VERIFICATION_OPTIONS = [
1064
1653
  { id: 'greater-than', value: 'greater-than', name: 'Greater than', label: 'Greater than' },
1065
1654
  ];
1066
1655
  ApiEditStepComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiEditStepComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1067
- ApiEditStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ApiEditStepComponent, selector: "cqa-api-edit-step", inputs: { initialMethod: "initialMethod", initialEnvironment: "initialEnvironment", initialStep: "initialStep", initialUrl: "initialUrl", initialPayloadTab: "initialPayloadTab", initialHeaders: "initialHeaders", initialResponsePreview: "initialResponsePreview", httpMethodOptions: "httpMethodOptions", environmentOptions: "environmentOptions", formatOptions: "formatOptions", initialFormat: "initialFormat", headerNameOptions: "headerNameOptions", verificationOptions: "verificationOptions", verificationDataTypeOptions: "verificationDataTypeOptions", statusVerificationOptions: "statusVerificationOptions" }, outputs: { importCurl: "importCurl", importCurlCancel: "importCurlCancel", sendRequest: "sendRequest", back: "back", next: "next", create: "create", headersChange: "headersChange" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "payloadEditorWithLinesRef", first: true, predicate: ["payloadEditorWithLinesRef"], descendants: true }, { propertyName: "payloadTextareaRef", first: true, predicate: ["payloadTextareaRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-api-edit-step-container\">\n <!-- Title -->\n <h2\n class=\"cqa-api-edit-step-title cqa-font-inter cqa-text-[12px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#000000]\">\n Create API Test Step</h2>\n\n <!-- Step indicator: all three steps visible, active step highlighted (Postman-style) -->\n <div class=\"cqa-api-edit-step-indicator\">\n <ng-container *ngFor=\"let step of stepLabels; let i = index\">\n <cqa-button type=\"button\" variant=\"text\"\n customClass=\"cqa-api-edit-step-indicator-item cqa-api-edit-step-indicator-item--clickable\"\n [attr.aria-label]=\"'Step ' + step.index + ': ' + step.label\" [attr.aria-pressed]=\"step.index === currentStep\"\n (clicked)=\"setStep(step.index)\">\n <span class=\"cqa-api-edit-step-indicator-circle\"\n [class.cqa-api-edit-step-indicator-circle--active]=\"step.index === currentStep\">\n {{ step.index }}\n </span>\n <span class=\"cqa-api-edit-step-indicator-label\"\n [class.cqa-api-edit-step-indicator-label--active]=\"step.index === currentStep\">\n {{ step.label }}\n </span>\n <div *ngIf=\"i < stepLabels.length - 1\" class=\"cqa-api-edit-step-indicator-line\" aria-hidden=\"true\"></div>\n </cqa-button>\n </ng-container>\n </div>\n\n <!-- Step content viewport: smooth slide between steps -->\n <div class=\"cqa-api-edit-step-viewport\">\n <div class=\"cqa-api-edit-step-strip\" [style.transform]=\"'translateX(' + stripTranslatePercent + '%)'\">\n <!-- Step 1: Environment, request, body, response -->\n <div class=\"cqa-api-edit-step-panel\">\n <!-- Environment row: new line, select aligned right -->\n <div class=\"cqa-api-edit-step-environment-row\">\n <cqa-dynamic-select *ngIf=\"environmentForm\" [form]=\"environmentForm\" [config]=\"environmentSelectConfig\"\n class=\"cqa-api-edit-step-environment-select\" aria-label=\"Environment\"\n (selectionChange)=\"onEnvironmentSelectionChange($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Request row: method, URL, buttons -->\n <div class=\"cqa-api-edit-step-request-row\">\n <cqa-dynamic-select *ngIf=\"methodForm\" [form]=\"methodForm\" [config]=\"methodSelectConfig\"\n class=\"cqa-api-edit-step-method-select\" aria-label=\"HTTP method\"\n (selectionChange)=\"onMethodSelectionChange($event)\">\n </cqa-dynamic-select>\n <div class=\"cqa-api-edit-step-url-wrap\">\n <cqa-custom-input [(value)]=\"url\" [label]=\"''\" placeholder=\"\" [fullWidth]=\"true\" size=\"md\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-trigger\" style=\"display: contents\" (click)=\"openImportCurlPanel()\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Import API cURL\"\n customClass=\"cqa-api-edit-step-btn-outline cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#414146]\">\n </cqa-button>\n </div>\n <cqa-button variant=\"filled\" btnSize=\"lg\" text=\"Send Request\" (clicked)=\"onSendRequest()\"\n customClass=\"cqa-api-edit-step-btn-primary cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#FBFCFF]\">\n </cqa-button>\n </div>\n\n\n\n <!-- Body content: header section (default) OR import cURL section -->\n <ng-container *ngIf=\"bodyView === 'import-curl'\">\n <div class=\"cqa-api-edit-step-import-curl-panel\">\n <div class=\"cqa-api-edit-step-import-curl-header\">\n <h3 class=\"cqa-api-edit-step-import-curl-title\">Import API cURL</h3>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-separator\"></div>\n <div class=\"cqa-api-edit-step-import-curl-body\">\n <cqa-custom-textarea [value]=\"importCurlControl.value\"\n (valueChange)=\"importCurlControl.setValue($event)\"\n placeholder=\"Paste your cURL command here (e.g., curl -X POST https://api.example.com/users)\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-import-curl-textarea\">\n </cqa-custom-textarea>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-footer\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-import-curl-btn-cancel\" (clicked)=\"onCancelImportCurl()\"></cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Import\"\n customClass=\"cqa-api-edit-step-import-curl-btn-import\" (clicked)=\"onImportCurlConfirm()\"></cqa-button>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"bodyView === 'headers'\">\n <div class=\"cqa-api-edit-step-tabs-wrapper\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of payloadTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activePayloadTab === tab.value ? ' cqa-api-edit-step-tab--active' : '') + (isMethodWithoutBody && tab.value !== 'headers' ? ' cqa-api-edit-step-tab--disabled' : '')\"\n [disabled]=\"isMethodWithoutBody && tab.value !== 'headers'\"\n (clicked)=\"setPayloadTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Payload content (Headers) -->\n <div *ngIf=\"activePayloadTab === 'headers'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-headers-grid\">\n <span class=\"cqa-api-edit-step-headers-label\">Header Name</span>\n <span class=\"cqa-api-edit-step-headers-label\">Header Value</span>\n <span class=\"cqa-api-edit-step-headers-label cqa-api-edit-step-headers-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of headerRows; let i = index; trackBy: trackByHeader\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-header-row\">\n <cqa-dynamic-select [form]=\"row\" [config]=\"headerNameSelectConfig\"\n (addCustomValue)=\"onHeaderNameAddCustomValue($event, row)\"\n class=\"cqa-api-edit-step-header-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-header-value-input\" ariaLabel=\"Header value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-header-delete'\"\n [tooltip]=\"'Remove header'\" (clicked)=\"removeHeader(i)\">\n <svg class=\"cqa-api-edit-step-header-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-add-header-wrap\">\n <cqa-button type=\"button\" variant=\"text\" text=\"+ Add Header\"\n [customClass]=\"'cqa-api-edit-step-add-header-link'\" (clicked)=\"addHeader()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Body only): type, format, text area, Back/Next -->\n <div *ngIf=\"activePayloadTab === 'body'\"\n class=\"cqa-api-edit-step-payload cqa-api-edit-step-payload-editor\">\n <div class=\"cqa-api-edit-step-payload-type-row\">\n <span class=\"cqa-api-edit-step-payload-type-label\">Type</span>\n <div class=\"cqa-api-edit-step-payload-type-radios\">\n <cqa-segment-control [value]=\"payloadType\" [segments]=\"payloadTypeSegments\"\n (valueChange)=\"onPayloadTypeChange($event)\"\n class=\"cqa-api-edit-step-payload-type-segment\">\n </cqa-segment-control>\n </div>\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-format-wrap\">\n <span class=\"cqa-api-edit-step-payload-format-label\">Format:</span>\n <cqa-dynamic-select *ngIf=\"payloadFormatForm\" [form]=\"payloadFormatForm\"\n [config]=\"payloadFormatSelectConfig\" class=\"cqa-api-edit-step-payload-format-select\"\n aria-label=\"Format\">\n </cqa-dynamic-select>\n </div>\n </div>\n <!-- Raw: text area with line numbers (Postman-style payload body) -->\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-body\" #payloadEditorWithLinesRef>\n <div class=\"cqa-api-edit-step-payload-editor-with-lines\">\n <div class=\"cqa-api-edit-step-payload-line-numbers\" aria-hidden=\"true\">\n <span *ngFor=\"let n of payloadLineNumbers\" class=\"cqa-api-edit-step-payload-line-num\">\n <span *ngIf=\"payloadJsonError && payloadJsonError.line === n\"\n class=\"cqa-api-edit-step-payload-line-error-icon\" [title]=\"payloadJsonErrorTooltip\"\n aria-label=\"Parse error on this line\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#EF4444\"/>\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-api-edit-step-payload-line-num-text\">{{ n }}</span>\n </span>\n </div>\n <div class=\"cqa-api-edit-step-payload-textarea-cell\">\n <div class=\"cqa-api-edit-step-payload-textarea cqa-w-full cqa-flex cqa-flex-col cqa-min-h-0\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea--error': payloadJsonError}\">\n <textarea #payloadTextareaRef\n class=\"cqa-api-edit-step-payload-textarea-input cqa-w-full cqa-resize-y cqa-outline-none cqa-box-border\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea-input--error': payloadJsonError}\"\n [value]=\"payloadText\"\n [attr.rows]=\"10\"\n placeholder=\"\"\n [attr.aria-label]=\"'Payload'\"\n [attr.aria-invalid]=\"!!payloadJsonError\"\n (input)=\"onPayloadInput($event)\"\n (keydown)=\"onPayloadKeydown($event)\">\n </textarea>\n </div>\n </div>\n </div>\n <p *ngIf=\"payloadJsonError\" class=\"cqa-api-edit-step-payload-json-error-msg\">\n Invalid JSON format. Please check your syntax.\n </p>\n </div>\n\n <!-- x-www-form-urlencoded: Key\u2013Value rows, add/remove dynamically -->\n <div *ngIf=\"payloadType === 'x-www-form-urlencoded'\" class=\"cqa-api-edit-step-key-value\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyValueRows; let i = index; trackBy: trackByKeyValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addKeyValueRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Data: Key\u2013Type\u2013Value rows; Type is a dropdown (Text/File), add/remove dynamically -->\n <div *ngIf=\"payloadType === 'form-data'\" class=\"cqa-api-edit-step-key-type-value\">\n <div class=\"cqa-api-edit-step-key-type-value-header\">\n <span class=\"cqa-api-edit-step-key-type-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Type</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-type-value-label cqa-api-edit-step-key-type-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyTypeValueRows; let i = index; trackBy: trackByKeyTypeValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-type-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"keyTypeValueTypeSelectConfig\"\n class=\"cqa-api-edit-step-key-type-value-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-type-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyTypeValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-type-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-type-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-type-value-add-btn\" (clicked)=\"addKeyTypeValueRow()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n <!-- Step 2: Variable Name: input, validation, Back / Next -->\n <div class=\"cqa-api-edit-step-panel\">\n <div class=\"cqa-api-edit-step-variable-section\">\n <div class=\"cqa-api-edit-step-variable-input-wrap\">\n <cqa-custom-input [(value)]=\"variableName\" [label]=\"''\" placeholder=\"Variable Name\" [fullWidth]=\"true\"\n size=\"md\" (valueChange)=\"onVariableNameChange()\" aria-label=\"Variable Name\">\n </cqa-custom-input>\n </div>\n <p *ngIf=\"variableNameError\" class=\"cqa-api-edit-step-variable-error\" role=\"alert\">{{ variableNameError }}</p>\n </div>\n </div>\n <!-- Step 3: Response Body / Status tabs -->\n <div class=\"cqa-api-edit-step-panel\">\n <div class=\"cqa-api-edit-step-tabs-wrapper\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of responseVerificationTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activeResponseVerificationTab === tab.value ? ' cqa-api-edit-step-tab--active' : '')\"\n (clicked)=\"setResponseVerificationTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Response Body tab content: verification grid -->\n <div *ngIf=\"activeResponseVerificationTab === 'response-body'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-verification\">\n <div class=\"cqa-api-edit-step-verification-grid cqa-api-edit-step-verification-grid-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">JSON Path</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Data Type</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of verificationRows; let i = index; trackBy: trackByVerification\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-custom-input [value]=\"row.get('jsonPath')?.value ?? ''\"\n (valueChange)=\"row.get('jsonPath')?.setValue($event)\" placeholder=\"Json Path\" [fullWidth]=\"true\"\n size=\"sm\" class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"JSON Path\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationDataTypeSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\"\n (selectionChange)=\"onVerificationDataTypeChange(row, $event)\">\n </cqa-dynamic-select>\n <!-- Expected Value: text for String/Array/Object, number for Number, dropdown for Boolean -->\n <ng-container [ngSwitch]=\"row.get('dataType')?.value\">\n <cqa-dynamic-select *ngSwitchCase=\"'boolean'\" [form]=\"row\"\n [config]=\"verificationExpectedValueBooleanSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-api-edit-step-verification-expected-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input *ngSwitchCase=\"'number'\" [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value (number)\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input cqa-api-edit-step-verification-expected-number\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-custom-input *ngSwitchDefault [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\"\n placeholder=\"Expected Value in String\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n </ng-container>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Status tab content: S.no, Verification dropdown, Expected Value, add/remove rows -->\n <div *ngIf=\"activeResponseVerificationTab === 'status'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addStatusVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-status-verification\">\n <div class=\"cqa-api-edit-step-status-verification-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of statusVerificationRows; let i = index; trackBy: trackByStatusVerification\"\n [formGroup]=\"row\" class=\"cqa-api-edit-step-status-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-dynamic-select [form]=\"row\" [config]=\"statusVerificationSelectConfig\"\n class=\"cqa-api-edit-step-status-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\" class=\"cqa-api-edit-step-verification-input\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeStatusVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Response Preview -->\n <div class=\"cqa-api-edit-step-response\">\n <h3 class=\"cqa-api-edit-step-response-title\">Response Preview</h3>\n <pre class=\"cqa-api-edit-step-response-content\">{{ responsePreview }}</pre>\n </div>\n\n <!-- Step actions: one row, full width. Step 1: Cancel + Next; Step 2: Back + Next; Step 3: Back + Create -->\n <div class=\"cqa-api-edit-step-actions\">\n <ng-container [ngSwitch]=\"currentStep\">\n <ng-container *ngSwitchCase=\"1\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-actions-btn-cancel\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Create\"\n customClass=\"cqa-api-edit-step-actions-btn-create\" (clicked)=\"onCreate()\">\n </cqa-button>\n </ng-container>\n </ng-container>\n </div>\n</div>", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i5.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i6.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor"], outputs: ["valueChange"] }], directives: [{ type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i7.NgSwitchDefault, selector: "[ngSwitchDefault]" }], changeDetection: i0.ChangeDetectionStrategy.Default });
1656
+ ApiEditStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ApiEditStepComponent, selector: "cqa-api-edit-step", inputs: { initialMethod: "initialMethod", initialEnvironment: "initialEnvironment", initialStep: "initialStep", initialUrl: "initialUrl", initialPayloadTab: "initialPayloadTab", initialHeaders: "initialHeaders", initialResponsePreview: "initialResponsePreview", initialVariableName: "initialVariableName", editMode: "editMode", httpMethodOptions: "httpMethodOptions", environmentOptions: "environmentOptions", authTypeOptions: "authTypeOptions", initialAuthType: "initialAuthType", formatOptions: "formatOptions", initialFormat: "initialFormat", headerNameOptions: "headerNameOptions", verificationOptions: "verificationOptions", verificationDataTypeOptions: "verificationDataTypeOptions", statusVerificationOptions: "statusVerificationOptions" }, outputs: { importCurl: "importCurl", importCurlCancel: "importCurlCancel", sendRequest: "sendRequest", back: "back", cancel: "cancel", next: "next", create: "create", headersChange: "headersChange" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "payloadEditorWithLinesRef", first: true, predicate: ["payloadEditorWithLinesRef"], descendants: true }, { propertyName: "payloadTextareaRef", first: true, predicate: ["payloadTextareaRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-api-edit-step-container cqa-bg-[#ffffff] cqa-flex cqa-flex-col cqa-w-full cqa-h-full cqa-p-[16px] cqa-gap-[12px] cqa-overflow-y-auto cqa-overflow-x-hidden cqa-box-border\">\n\n <h2 class=\"cqa-api-edit-step-title cqa-font-inter cqa-text-[12px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#000000] cqa-m-0\">\n {{ editMode ? 'Update API Test Step' : 'Create API Test Step' }}\n </h2>\n\n <div class=\"cqa-api-edit-step-indicator cqa-flex cqa-items-center cqa-gap-0 cqa-max-[767px]:cqa-flex-wrap cqa-max-[767px]:cqa-gap-2 cqa-max-[767px]:cqa-justify-start\"\n [class.cqa-justify-start]=\"stepLabels.length === 1\"\n [class.cqa-justify-between]=\"stepLabels.length !== 1\">\n <ng-container *ngFor=\"let step of stepLabels; let i = index\">\n <cqa-button type=\"button\" variant=\"text\"\n customClass=\"cqa-api-edit-step-indicator-item cqa-api-edit-step-indicator-item--clickable cqa-flex cqa-items-center cqa-gap-[10px] cqa-cursor-pointer cqa-border-none cqa-p-0 cqa-font-inherit cqa-text-inherit cqa-text-left !cqa-bg-transparent\"\n [attr.aria-label]=\"'Step ' + step.index + ': ' + step.label\" [attr.aria-pressed]=\"step.index === currentStep\"\n (clicked)=\"setStep(step.index)\">\n <span class=\"cqa-api-edit-step-indicator-circle cqa-w-8 cqa-h-8 cqa-rounded-full cqa-inline-flex cqa-items-center cqa-justify-center cqa-text-sm cqa-font-medium cqa-leading-none cqa-border-none cqa-shrink-0\"\n [ngClass]=\"step.index === currentStep ? 'cqa-bg-[#4F46E5] cqa-text-white' : 'cqa-bg-[#E0E0E0] cqa-text-[#666666]'\">\n {{ step.index }}\n </span>\n <span class=\"cqa-api-edit-step-indicator-label cqa-text-sm cqa-leading-[18px] cqa-font-normal cqa-max-[767px]:cqa-text-xs\"\n [ngClass]=\"step.index === currentStep ? 'cqa-text-[#4F46E5]' : 'cqa-text-[#666666]'\">\n {{ step.label }}\n </span>\n <div *ngIf=\"i < stepLabels.length - 1\" class=\"cqa-api-edit-step-indicator-line cqa-w-[96px] cqa-h-[2px] cqa-bg-[#E0E0E0] cqa-my-0 cqa-mx-[6px] cqa-shrink-0 cqa-self-center cqa-max-[767px]:cqa-w-[24px] cqa-max-[767px]:cqa-mx-1\" aria-hidden=\"true\"></div>\n </cqa-button>\n </ng-container>\n </div>\n\n <!-- Step content viewport: only the active step body is shown (*ngIf) -->\n <div class=\"cqa-api-edit-step-viewport cqa-w-full\">\n <!-- Step 1: Environment, request, body, response -->\n <div *ngIf=\"currentStep === 1\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <!-- Environment row: new line, select aligned right -->\n <div class=\"cqa-api-edit-step-environment-row cqa-flex cqa-justify-end cqa-items-center\">\n <cqa-dynamic-select *ngIf=\"environmentForm\" [form]=\"environmentForm\" [config]=\"environmentSelectConfig\"\n class=\"cqa-api-edit-step-environment-select cqa-shrink-0 cqa-w-auto cqa-min-w-[315px] cqa-max-w-[315px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full [&_.mat-form-field-wrapper]:cqa-pb-0\" aria-label=\"Environment\"\n (selectionChange)=\"onEnvironmentSelectionChange($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Request row: method, URL, buttons -->\n <div class=\"cqa-api-edit-step-request-row cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-max-[767px]:cqa-flex-col cqa-max-[767px]:cqa-items-stretch cqa-max-[767px]:cqa-gap-2.5\">\n <cqa-dynamic-select *ngIf=\"methodForm\" [form]=\"methodForm\" [config]=\"methodSelectConfig\"\n class=\"cqa-api-edit-step-method-select cqa-shrink-0 cqa-w-auto cqa-min-w-[152px] cqa-max-w-[152px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full\" aria-label=\"HTTP method\"\n (selectionChange)=\"onMethodSelectionChange($event)\">\n </cqa-dynamic-select>\n <div class=\"cqa-api-edit-step-url-wrap cqa-flex-1 cqa-min-w-[200px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-w-full [&_cqa-custom-input_.cqa-relative_input]:cqa-h-[40px] [&_cqa-custom-input_.cqa-relative_input]:cqa-bg-white [&_cqa-custom-input_.cqa-relative_input]:cqa-border [&_cqa-custom-input_.cqa-relative_input]:cqa-border-solid [&_cqa-custom-input_.cqa-relative_input]:cqa-border-[#D1D5DB] [&_cqa-custom-input_.cqa-relative_input]:cqa-rounded-md [&_cqa-custom-input_.cqa-relative_input]:cqa-text-sm [&_cqa-custom-input_.cqa-relative_input]:cqa-text-[#374151]\">\n <cqa-custom-input [(value)]=\"url\" [label]=\"''\" placeholder=\"\" [fullWidth]=\"true\" size=\"md\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-trigger cqa-contents cqa-max-[767px]:cqa-w-full cqa-max-[767px]:!cqa-flex\" (click)=\"openImportCurlPanel()\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Import API cURL\"\n customClass=\"cqa-api-edit-step-btn-outline !cqa-bg-white !cqa-border !cqa-border-solid !cqa-border-[#6B7280] cqa-text-[#414146] cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal hover:!cqa-bg-[#F9FAFB] hover:!cqa-text-[#414146] cqa-max-[767px]:cqa-w-full\">\n </cqa-button>\n </div>\n <cqa-button variant=\"filled\" btnSize=\"lg\" text=\"Send Request\" (clicked)=\"onSendRequest()\"\n customClass=\"cqa-api-edit-step-btn-primary cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal !cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] !cqa-border-none cqa-py-2.5 cqa-px-6 cqa-gap-2 cqa-rounded-lg cqa-min-h-[37px] cqa-box-border hover:!cqa-bg-[#1B1FEB] cqa-max-[767px]:cqa-w-full\">\n </cqa-button>\n </div>\n\n\n\n <!-- Body content: header section (default) OR import cURL section -->\n <ng-container *ngIf=\"bodyView === 'import-curl'\">\n <div class=\"cqa-api-edit-step-import-curl-panel cqa-flex cqa-flex-col cqa-bg-white cqa-rounded-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-shadow-[0_1px_3px_rgba(0,0,0,0.08)] cqa-overflow-hidden\">\n <div class=\"cqa-api-edit-step-import-curl-header cqa-flex cqa-items-center cqa-justify-between cqa-py-3 cqa-px-5 cqa-border-b cqa-border-solid cqa-border-[#E2E8F0] cqa-bg-[#F9FAFB] cqa-rounded-t-lg cqa-max-[767px]:cqa-px-4\">\n <h3 class=\"cqa-api-edit-step-import-curl-title cqa-m-0 cqa-text-xs cqa-font-bold cqa-leading-[18px] cqa-text-[#374151]\">Import API cURL</h3>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-separator cqa-h-px cqa-bg-[#E2E8F0] cqa-my-0 cqa-mx-5\"></div>\n <div class=\"cqa-api-edit-step-import-curl-body\">\n <cqa-custom-textarea [value]=\"importCurlControl.value\"\n (valueChange)=\"importCurlControl.setValue($event)\"\n placeholder=\"Paste your cURL command here (e.g., curl -X POST https://api.example.com/users)\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-import-curl-textarea\">\n </cqa-custom-textarea>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-footer\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-import-curl-btn-cancel\" (clicked)=\"onCancelImportCurl()\"></cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Import\"\n customClass=\"cqa-api-edit-step-import-curl-btn-import\" (clicked)=\"onImportCurlConfirm()\"></cqa-button>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"bodyView === 'headers'\">\n <div class=\"cqa-api-edit-step-tabs-wrapper\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of payloadTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activePayloadTab === tab.value ? ' cqa-api-edit-step-tab--active' : '') + (isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params') ? ' cqa-api-edit-step-tab--disabled' : '')\"\n [disabled]=\"isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params')\"\n (clicked)=\"setPayloadTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Payload content (Authorization) -->\n <div *ngIf=\"activePayloadTab === 'authorization'\" class=\"cqa-api-edit-step-payload\"\n [attr.style]=\"'padding: 20px; min-height: 200px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 20px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 8px; width: fit-content;'\">\n <span [attr.style]=\"'font-size: 11px; font-weight: 600; letter-spacing: 0.02em; color: #6B7280; text-transform: uppercase; line-height: 1.25;'\">AUTH TYPE</span>\n <cqa-dynamic-select *ngIf=\"authTypeForm\" [form]=\"authTypeForm\" [config]=\"authTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-type-select\" aria-label=\"Auth type\"\n [attr.style]=\"'min-width: 160px;'\">\n </cqa-dynamic-select>\n </div>\n <!-- No Auth: centered message -->\n <div *ngIf=\"selectedAuthType === 'no-auth'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-width: 0; text-align: center;'\">\n <div aria-hidden=\"true\"\n [attr.style]=\"'width: 48px; height: 48px; border-radius: 10px; background: #F3F4F6; display: flex; align-items: center; justify-content: center; flex-shrink: 0;'\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <rect x=\"5\" y=\"11\" width=\"14\" height=\"2\" rx=\"1\" fill=\"#9CA3AF\"/>\n </svg>\n </div>\n <span [attr.style]=\"'font-size: 16px; font-weight: 600; color: #374151; line-height: 1.25;'\">No Auth</span>\n <div [attr.style]=\"'display: flex; align-items: center; justify-content: center; gap: 6px; flex-wrap: wrap;'\">\n <span [attr.style]=\"'font-size: 14px; font-weight: 400; color: #9CA3AF; line-height: 1.4;'\">This request does not use any authorization.</span>\n <span role=\"img\" aria-label=\"More information\" title=\"This request does not use any authorization.\"\n [attr.style]=\"'display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; color: #9CA3AF; flex-shrink: 0;'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M8 7v4M8 5v.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </div>\n </div>\n <!-- Bearer Token: Token label + textarea -->\n <div *ngIf=\"selectedAuthType === 'bearer'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; gap: 10px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Token</span>\n <cqa-custom-textarea [(value)]=\"bearerToken\"\n placeholder=\"Enter bearer token\"\n [fullWidth]=\"true\" [rows]=\"6\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-auth-token-textarea\" ariaLabel=\"Bearer token\">\n </cqa-custom-textarea>\n </div>\n <!-- OAuth 2.0: Grant Type, Access Token URL, Client ID, Client Secret, Scope, Client Authentication -->\n <div *ngIf=\"selectedAuthType === 'oauth2' && oauth2Form\"\n class=\"cqa-api-edit-step-oauth2-grid\"\n [attr.style]=\"'display: grid; grid-template-columns: 1fr 1fr; gap: 16px 24px; width: 100%;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Grant Type</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2GrantTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"OAuth grant type\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth grant type</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Access Token URL</span>\n <cqa-custom-input [value]=\"oauth2Form.get('accessTokenUrl')?.value\"\n (valueChange)=\"oauth2Form.get('accessTokenUrl')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth token endpoint\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Access Token URL\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth token endpoint</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client ID</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientId')?.value\"\n (valueChange)=\"oauth2Form.get('clientId')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth client identifier\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client ID\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client identifier</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Secret</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientSecret')?.value\"\n (valueChange)=\"oauth2Form.get('clientSecret')?.setValue($event)\"\n type=\"password\" [label]=\"''\" placeholder=\"Enter OAuth client secret\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client Secret\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client secret</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Scope</span>\n <cqa-custom-input [value]=\"oauth2Form.get('scope')?.value\"\n (valueChange)=\"oauth2Form.get('scope')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter space-separated scopes\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Scope\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Space-separated scopes</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Authentication</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2ClientAuthSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"Client authentication method\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Client authentication method</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Payload content (Headers) -->\n <div *ngIf=\"activePayloadTab === 'headers'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-headers-grid\">\n <span class=\"cqa-api-edit-step-headers-label\">Header Name</span>\n <span class=\"cqa-api-edit-step-headers-label\">Header Value</span>\n <span class=\"cqa-api-edit-step-headers-label cqa-api-edit-step-headers-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of headerRows; let i = index; trackBy: trackByHeader\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-header-row\">\n <cqa-dynamic-select [form]=\"row\" [config]=\"headerNameSelectConfig\"\n (addCustomValue)=\"onHeaderNameAddCustomValue($event, row)\"\n class=\"cqa-api-edit-step-header-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-header-value-input\" ariaLabel=\"Header value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-header-delete'\"\n [tooltip]=\"'Remove header'\" (clicked)=\"removeHeader(i)\">\n <svg class=\"cqa-api-edit-step-header-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-add-header-wrap\">\n <cqa-button type=\"button\" variant=\"text\" text=\"+ Add Header\"\n [customClass]=\"'cqa-api-edit-step-add-header-link'\" (clicked)=\"addHeader()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Params): Key\u2013Value table with add/delete rows -->\n <div *ngIf=\"activePayloadTab === 'params'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of paramsRows; let i = index; trackBy: trackByParams\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeParamsRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addParamsRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Body only): type, format, text area, Back/Next -->\n <div *ngIf=\"activePayloadTab === 'body'\"\n class=\"cqa-api-edit-step-payload cqa-api-edit-step-payload-editor\">\n <div class=\"cqa-api-edit-step-payload-type-row\">\n <span class=\"cqa-api-edit-step-payload-type-label\">Type</span>\n <div class=\"cqa-api-edit-step-payload-type-radios\">\n <cqa-segment-control [value]=\"payloadType\" [segments]=\"payloadTypeSegments\"\n (valueChange)=\"onPayloadTypeChange($event)\"\n class=\"cqa-api-edit-step-payload-type-segment\">\n </cqa-segment-control>\n </div>\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-format-wrap\">\n <span class=\"cqa-api-edit-step-payload-format-label\">Format:</span>\n <cqa-dynamic-select *ngIf=\"payloadFormatForm\" [form]=\"payloadFormatForm\"\n [config]=\"payloadFormatSelectConfig\" class=\"cqa-api-edit-step-payload-format-select\"\n aria-label=\"Format\">\n </cqa-dynamic-select>\n </div>\n </div>\n <!-- Raw: text area with line numbers (Postman-style payload body) -->\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-body\" #payloadEditorWithLinesRef>\n <div class=\"cqa-api-edit-step-payload-editor-with-lines\">\n <div class=\"cqa-api-edit-step-payload-line-numbers\" aria-hidden=\"true\">\n <span *ngFor=\"let n of payloadLineNumbers\" class=\"cqa-api-edit-step-payload-line-num\">\n <span *ngIf=\"payloadJsonError && payloadJsonError.line === n\"\n class=\"cqa-api-edit-step-payload-line-error-icon\" [title]=\"payloadJsonErrorTooltip\"\n aria-label=\"Parse error on this line\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#EF4444\"/>\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-api-edit-step-payload-line-num-text\">{{ n }}</span>\n </span>\n </div>\n <div class=\"cqa-api-edit-step-payload-textarea-cell\">\n <div class=\"cqa-api-edit-step-payload-textarea cqa-w-full cqa-flex cqa-flex-col cqa-min-h-0\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea--error': payloadJsonError}\">\n <textarea #payloadTextareaRef\n class=\"cqa-api-edit-step-payload-textarea-input cqa-w-full cqa-outline-none cqa-box-border\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea-input--error': payloadJsonError}\"\n [value]=\"payloadText\"\n placeholder=\"\"\n [attr.aria-label]=\"'Payload'\"\n [attr.aria-invalid]=\"!!payloadJsonError\"\n (input)=\"onPayloadInput($event)\"\n (keydown)=\"onPayloadKeydown($event)\">\n </textarea>\n </div>\n </div>\n </div>\n <p *ngIf=\"payloadJsonError\" class=\"cqa-api-edit-step-payload-json-error-msg\">\n Invalid JSON format. Please check your syntax.\n </p>\n </div>\n\n <!-- x-www-form-urlencoded: Key\u2013Value rows, add/remove dynamically -->\n <div *ngIf=\"payloadType === 'x-www-form-urlencoded'\" class=\"cqa-api-edit-step-key-value\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyValueRows; let i = index; trackBy: trackByKeyValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addKeyValueRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Data: Key\u2013Type\u2013Value rows; Type is a dropdown (Text/File), add/remove dynamically -->\n <div *ngIf=\"payloadType === 'form-data'\" class=\"cqa-api-edit-step-key-type-value\">\n <div class=\"cqa-api-edit-step-key-type-value-header\">\n <span class=\"cqa-api-edit-step-key-type-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Type</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-type-value-label cqa-api-edit-step-key-type-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyTypeValueRows; let i = index; trackBy: trackByKeyTypeValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-type-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"keyTypeValueTypeSelectConfig\"\n class=\"cqa-api-edit-step-key-type-value-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-type-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyTypeValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-type-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-type-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-type-value-add-btn\" (clicked)=\"addKeyTypeValueRow()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n <!-- Step 2: Variable Name: input, validation, Back / Next -->\n <div *ngIf=\"currentStep === 2\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-variable-section\">\n <div class=\"cqa-api-edit-step-variable-input-wrap\">\n <cqa-custom-input [(value)]=\"variableName\" [label]=\"''\" placeholder=\"Variable Name\" [fullWidth]=\"true\"\n size=\"md\" (valueChange)=\"onVariableNameChange()\" aria-label=\"Variable Name\">\n </cqa-custom-input>\n </div>\n <p *ngIf=\"variableNameError\" class=\"cqa-api-edit-step-variable-error\" role=\"alert\">{{ variableNameError }}</p>\n </div>\n </div>\n <!-- Step 3: Response Body / Status tabs -->\n <div *ngIf=\"currentStep === 3\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-tabs-wrapper\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of responseVerificationTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activeResponseVerificationTab === tab.value ? ' cqa-api-edit-step-tab--active' : '')\"\n (clicked)=\"setResponseVerificationTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Response Body tab content: verification grid -->\n <div *ngIf=\"activeResponseVerificationTab === 'response-body'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-verification\">\n <div class=\"cqa-api-edit-step-verification-grid cqa-api-edit-step-verification-grid-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">JSON Path</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Data Type</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of verificationRows; let i = index; trackBy: trackByVerification\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-custom-input [value]=\"row.get('jsonPath')?.value ?? ''\"\n (valueChange)=\"row.get('jsonPath')?.setValue($event)\" placeholder=\"Json Path\" [fullWidth]=\"true\"\n size=\"sm\" class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"JSON Path\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationDataTypeSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\"\n (selectionChange)=\"onVerificationDataTypeChange(row, $event)\">\n </cqa-dynamic-select>\n <!-- Expected Value: text for String/Array/Object, number for Number, dropdown for Boolean -->\n <ng-container [ngSwitch]=\"row.get('dataType')?.value\">\n <cqa-dynamic-select *ngSwitchCase=\"'boolean'\" [form]=\"row\"\n [config]=\"verificationExpectedValueBooleanSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-api-edit-step-verification-expected-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input *ngSwitchCase=\"'number'\" [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value (number)\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input cqa-api-edit-step-verification-expected-number\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-custom-input *ngSwitchDefault [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\"\n placeholder=\"Expected Value in String\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n </ng-container>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Status tab content: S.no, Verification dropdown, Expected Value, add/remove rows -->\n <div *ngIf=\"activeResponseVerificationTab === 'status'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addStatusVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-status-verification\">\n <div class=\"cqa-api-edit-step-status-verification-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of statusVerificationRows; let i = index; trackBy: trackByStatusVerification\"\n [formGroup]=\"row\" class=\"cqa-api-edit-step-status-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-dynamic-select [form]=\"row\" [config]=\"statusVerificationSelectConfig\"\n class=\"cqa-api-edit-step-status-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\" class=\"cqa-api-edit-step-verification-input\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeStatusVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Response Preview -->\n <div class=\"cqa-api-edit-step-response\">\n <h3 class=\"cqa-api-edit-step-response-title cqa-text-[14px] cqa-font-bold cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-mb-[12px] cqa-shrink-0\">Response Preview</h3>\n <pre class=\"cqa-api-edit-step-response-content\">{{ responsePreview }}</pre>\n </div>\n\n <!-- Step actions: one row, full width. Step 1: Cancel + Next; Step 2: Back + Next; Step 3: Back + Create -->\n <div class=\"cqa-api-edit-step-actions\">\n <ng-container [ngSwitch]=\"currentStep\">\n <ng-container *ngSwitchCase=\"1\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-actions-btn-cancel\" (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" [text]=\"editMode ? 'Update' : 'Create'\"\n customClass=\"cqa-api-edit-step-actions-btn-create\" (clicked)=\"onCreate()\">\n </cqa-button>\n </ng-container>\n </ng-container>\n </div>\n</div>", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i5.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i6.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor"], outputs: ["valueChange"] }], directives: [{ type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i7.NgSwitchDefault, selector: "[ngSwitchDefault]" }], changeDetection: i0.ChangeDetectionStrategy.Default });
1068
1657
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiEditStepComponent, decorators: [{
1069
1658
  type: Component,
1070
- args: [{ selector: 'cqa-api-edit-step', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.Default, template: "<div class=\"cqa-api-edit-step-container\">\n <!-- Title -->\n <h2\n class=\"cqa-api-edit-step-title cqa-font-inter cqa-text-[12px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#000000]\">\n Create API Test Step</h2>\n\n <!-- Step indicator: all three steps visible, active step highlighted (Postman-style) -->\n <div class=\"cqa-api-edit-step-indicator\">\n <ng-container *ngFor=\"let step of stepLabels; let i = index\">\n <cqa-button type=\"button\" variant=\"text\"\n customClass=\"cqa-api-edit-step-indicator-item cqa-api-edit-step-indicator-item--clickable\"\n [attr.aria-label]=\"'Step ' + step.index + ': ' + step.label\" [attr.aria-pressed]=\"step.index === currentStep\"\n (clicked)=\"setStep(step.index)\">\n <span class=\"cqa-api-edit-step-indicator-circle\"\n [class.cqa-api-edit-step-indicator-circle--active]=\"step.index === currentStep\">\n {{ step.index }}\n </span>\n <span class=\"cqa-api-edit-step-indicator-label\"\n [class.cqa-api-edit-step-indicator-label--active]=\"step.index === currentStep\">\n {{ step.label }}\n </span>\n <div *ngIf=\"i < stepLabels.length - 1\" class=\"cqa-api-edit-step-indicator-line\" aria-hidden=\"true\"></div>\n </cqa-button>\n </ng-container>\n </div>\n\n <!-- Step content viewport: smooth slide between steps -->\n <div class=\"cqa-api-edit-step-viewport\">\n <div class=\"cqa-api-edit-step-strip\" [style.transform]=\"'translateX(' + stripTranslatePercent + '%)'\">\n <!-- Step 1: Environment, request, body, response -->\n <div class=\"cqa-api-edit-step-panel\">\n <!-- Environment row: new line, select aligned right -->\n <div class=\"cqa-api-edit-step-environment-row\">\n <cqa-dynamic-select *ngIf=\"environmentForm\" [form]=\"environmentForm\" [config]=\"environmentSelectConfig\"\n class=\"cqa-api-edit-step-environment-select\" aria-label=\"Environment\"\n (selectionChange)=\"onEnvironmentSelectionChange($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Request row: method, URL, buttons -->\n <div class=\"cqa-api-edit-step-request-row\">\n <cqa-dynamic-select *ngIf=\"methodForm\" [form]=\"methodForm\" [config]=\"methodSelectConfig\"\n class=\"cqa-api-edit-step-method-select\" aria-label=\"HTTP method\"\n (selectionChange)=\"onMethodSelectionChange($event)\">\n </cqa-dynamic-select>\n <div class=\"cqa-api-edit-step-url-wrap\">\n <cqa-custom-input [(value)]=\"url\" [label]=\"''\" placeholder=\"\" [fullWidth]=\"true\" size=\"md\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-trigger\" style=\"display: contents\" (click)=\"openImportCurlPanel()\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Import API cURL\"\n customClass=\"cqa-api-edit-step-btn-outline cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#414146]\">\n </cqa-button>\n </div>\n <cqa-button variant=\"filled\" btnSize=\"lg\" text=\"Send Request\" (clicked)=\"onSendRequest()\"\n customClass=\"cqa-api-edit-step-btn-primary cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#FBFCFF]\">\n </cqa-button>\n </div>\n\n\n\n <!-- Body content: header section (default) OR import cURL section -->\n <ng-container *ngIf=\"bodyView === 'import-curl'\">\n <div class=\"cqa-api-edit-step-import-curl-panel\">\n <div class=\"cqa-api-edit-step-import-curl-header\">\n <h3 class=\"cqa-api-edit-step-import-curl-title\">Import API cURL</h3>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-separator\"></div>\n <div class=\"cqa-api-edit-step-import-curl-body\">\n <cqa-custom-textarea [value]=\"importCurlControl.value\"\n (valueChange)=\"importCurlControl.setValue($event)\"\n placeholder=\"Paste your cURL command here (e.g., curl -X POST https://api.example.com/users)\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-import-curl-textarea\">\n </cqa-custom-textarea>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-footer\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-import-curl-btn-cancel\" (clicked)=\"onCancelImportCurl()\"></cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Import\"\n customClass=\"cqa-api-edit-step-import-curl-btn-import\" (clicked)=\"onImportCurlConfirm()\"></cqa-button>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"bodyView === 'headers'\">\n <div class=\"cqa-api-edit-step-tabs-wrapper\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of payloadTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activePayloadTab === tab.value ? ' cqa-api-edit-step-tab--active' : '') + (isMethodWithoutBody && tab.value !== 'headers' ? ' cqa-api-edit-step-tab--disabled' : '')\"\n [disabled]=\"isMethodWithoutBody && tab.value !== 'headers'\"\n (clicked)=\"setPayloadTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Payload content (Headers) -->\n <div *ngIf=\"activePayloadTab === 'headers'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-headers-grid\">\n <span class=\"cqa-api-edit-step-headers-label\">Header Name</span>\n <span class=\"cqa-api-edit-step-headers-label\">Header Value</span>\n <span class=\"cqa-api-edit-step-headers-label cqa-api-edit-step-headers-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of headerRows; let i = index; trackBy: trackByHeader\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-header-row\">\n <cqa-dynamic-select [form]=\"row\" [config]=\"headerNameSelectConfig\"\n (addCustomValue)=\"onHeaderNameAddCustomValue($event, row)\"\n class=\"cqa-api-edit-step-header-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-header-value-input\" ariaLabel=\"Header value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-header-delete'\"\n [tooltip]=\"'Remove header'\" (clicked)=\"removeHeader(i)\">\n <svg class=\"cqa-api-edit-step-header-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-add-header-wrap\">\n <cqa-button type=\"button\" variant=\"text\" text=\"+ Add Header\"\n [customClass]=\"'cqa-api-edit-step-add-header-link'\" (clicked)=\"addHeader()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Body only): type, format, text area, Back/Next -->\n <div *ngIf=\"activePayloadTab === 'body'\"\n class=\"cqa-api-edit-step-payload cqa-api-edit-step-payload-editor\">\n <div class=\"cqa-api-edit-step-payload-type-row\">\n <span class=\"cqa-api-edit-step-payload-type-label\">Type</span>\n <div class=\"cqa-api-edit-step-payload-type-radios\">\n <cqa-segment-control [value]=\"payloadType\" [segments]=\"payloadTypeSegments\"\n (valueChange)=\"onPayloadTypeChange($event)\"\n class=\"cqa-api-edit-step-payload-type-segment\">\n </cqa-segment-control>\n </div>\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-format-wrap\">\n <span class=\"cqa-api-edit-step-payload-format-label\">Format:</span>\n <cqa-dynamic-select *ngIf=\"payloadFormatForm\" [form]=\"payloadFormatForm\"\n [config]=\"payloadFormatSelectConfig\" class=\"cqa-api-edit-step-payload-format-select\"\n aria-label=\"Format\">\n </cqa-dynamic-select>\n </div>\n </div>\n <!-- Raw: text area with line numbers (Postman-style payload body) -->\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-body\" #payloadEditorWithLinesRef>\n <div class=\"cqa-api-edit-step-payload-editor-with-lines\">\n <div class=\"cqa-api-edit-step-payload-line-numbers\" aria-hidden=\"true\">\n <span *ngFor=\"let n of payloadLineNumbers\" class=\"cqa-api-edit-step-payload-line-num\">\n <span *ngIf=\"payloadJsonError && payloadJsonError.line === n\"\n class=\"cqa-api-edit-step-payload-line-error-icon\" [title]=\"payloadJsonErrorTooltip\"\n aria-label=\"Parse error on this line\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#EF4444\"/>\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-api-edit-step-payload-line-num-text\">{{ n }}</span>\n </span>\n </div>\n <div class=\"cqa-api-edit-step-payload-textarea-cell\">\n <div class=\"cqa-api-edit-step-payload-textarea cqa-w-full cqa-flex cqa-flex-col cqa-min-h-0\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea--error': payloadJsonError}\">\n <textarea #payloadTextareaRef\n class=\"cqa-api-edit-step-payload-textarea-input cqa-w-full cqa-resize-y cqa-outline-none cqa-box-border\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea-input--error': payloadJsonError}\"\n [value]=\"payloadText\"\n [attr.rows]=\"10\"\n placeholder=\"\"\n [attr.aria-label]=\"'Payload'\"\n [attr.aria-invalid]=\"!!payloadJsonError\"\n (input)=\"onPayloadInput($event)\"\n (keydown)=\"onPayloadKeydown($event)\">\n </textarea>\n </div>\n </div>\n </div>\n <p *ngIf=\"payloadJsonError\" class=\"cqa-api-edit-step-payload-json-error-msg\">\n Invalid JSON format. Please check your syntax.\n </p>\n </div>\n\n <!-- x-www-form-urlencoded: Key\u2013Value rows, add/remove dynamically -->\n <div *ngIf=\"payloadType === 'x-www-form-urlencoded'\" class=\"cqa-api-edit-step-key-value\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyValueRows; let i = index; trackBy: trackByKeyValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addKeyValueRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Data: Key\u2013Type\u2013Value rows; Type is a dropdown (Text/File), add/remove dynamically -->\n <div *ngIf=\"payloadType === 'form-data'\" class=\"cqa-api-edit-step-key-type-value\">\n <div class=\"cqa-api-edit-step-key-type-value-header\">\n <span class=\"cqa-api-edit-step-key-type-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Type</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-type-value-label cqa-api-edit-step-key-type-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyTypeValueRows; let i = index; trackBy: trackByKeyTypeValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-type-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"keyTypeValueTypeSelectConfig\"\n class=\"cqa-api-edit-step-key-type-value-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-type-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyTypeValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-type-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-type-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-type-value-add-btn\" (clicked)=\"addKeyTypeValueRow()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n <!-- Step 2: Variable Name: input, validation, Back / Next -->\n <div class=\"cqa-api-edit-step-panel\">\n <div class=\"cqa-api-edit-step-variable-section\">\n <div class=\"cqa-api-edit-step-variable-input-wrap\">\n <cqa-custom-input [(value)]=\"variableName\" [label]=\"''\" placeholder=\"Variable Name\" [fullWidth]=\"true\"\n size=\"md\" (valueChange)=\"onVariableNameChange()\" aria-label=\"Variable Name\">\n </cqa-custom-input>\n </div>\n <p *ngIf=\"variableNameError\" class=\"cqa-api-edit-step-variable-error\" role=\"alert\">{{ variableNameError }}</p>\n </div>\n </div>\n <!-- Step 3: Response Body / Status tabs -->\n <div class=\"cqa-api-edit-step-panel\">\n <div class=\"cqa-api-edit-step-tabs-wrapper\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of responseVerificationTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activeResponseVerificationTab === tab.value ? ' cqa-api-edit-step-tab--active' : '')\"\n (clicked)=\"setResponseVerificationTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Response Body tab content: verification grid -->\n <div *ngIf=\"activeResponseVerificationTab === 'response-body'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-verification\">\n <div class=\"cqa-api-edit-step-verification-grid cqa-api-edit-step-verification-grid-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">JSON Path</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Data Type</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of verificationRows; let i = index; trackBy: trackByVerification\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-custom-input [value]=\"row.get('jsonPath')?.value ?? ''\"\n (valueChange)=\"row.get('jsonPath')?.setValue($event)\" placeholder=\"Json Path\" [fullWidth]=\"true\"\n size=\"sm\" class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"JSON Path\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationDataTypeSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\"\n (selectionChange)=\"onVerificationDataTypeChange(row, $event)\">\n </cqa-dynamic-select>\n <!-- Expected Value: text for String/Array/Object, number for Number, dropdown for Boolean -->\n <ng-container [ngSwitch]=\"row.get('dataType')?.value\">\n <cqa-dynamic-select *ngSwitchCase=\"'boolean'\" [form]=\"row\"\n [config]=\"verificationExpectedValueBooleanSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-api-edit-step-verification-expected-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input *ngSwitchCase=\"'number'\" [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value (number)\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input cqa-api-edit-step-verification-expected-number\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-custom-input *ngSwitchDefault [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\"\n placeholder=\"Expected Value in String\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n </ng-container>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Status tab content: S.no, Verification dropdown, Expected Value, add/remove rows -->\n <div *ngIf=\"activeResponseVerificationTab === 'status'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addStatusVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-status-verification\">\n <div class=\"cqa-api-edit-step-status-verification-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of statusVerificationRows; let i = index; trackBy: trackByStatusVerification\"\n [formGroup]=\"row\" class=\"cqa-api-edit-step-status-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-dynamic-select [form]=\"row\" [config]=\"statusVerificationSelectConfig\"\n class=\"cqa-api-edit-step-status-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\" class=\"cqa-api-edit-step-verification-input\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeStatusVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Response Preview -->\n <div class=\"cqa-api-edit-step-response\">\n <h3 class=\"cqa-api-edit-step-response-title\">Response Preview</h3>\n <pre class=\"cqa-api-edit-step-response-content\">{{ responsePreview }}</pre>\n </div>\n\n <!-- Step actions: one row, full width. Step 1: Cancel + Next; Step 2: Back + Next; Step 3: Back + Create -->\n <div class=\"cqa-api-edit-step-actions\">\n <ng-container [ngSwitch]=\"currentStep\">\n <ng-container *ngSwitchCase=\"1\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-actions-btn-cancel\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Create\"\n customClass=\"cqa-api-edit-step-actions-btn-create\" (clicked)=\"onCreate()\">\n </cqa-button>\n </ng-container>\n </ng-container>\n </div>\n</div>" }]
1659
+ args: [{ selector: 'cqa-api-edit-step', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.Default, template: "<div class=\"cqa-api-edit-step-container cqa-bg-[#ffffff] cqa-flex cqa-flex-col cqa-w-full cqa-h-full cqa-p-[16px] cqa-gap-[12px] cqa-overflow-y-auto cqa-overflow-x-hidden cqa-box-border\">\n\n <h2 class=\"cqa-api-edit-step-title cqa-font-inter cqa-text-[12px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#000000] cqa-m-0\">\n {{ editMode ? 'Update API Test Step' : 'Create API Test Step' }}\n </h2>\n\n <div class=\"cqa-api-edit-step-indicator cqa-flex cqa-items-center cqa-gap-0 cqa-max-[767px]:cqa-flex-wrap cqa-max-[767px]:cqa-gap-2 cqa-max-[767px]:cqa-justify-start\"\n [class.cqa-justify-start]=\"stepLabels.length === 1\"\n [class.cqa-justify-between]=\"stepLabels.length !== 1\">\n <ng-container *ngFor=\"let step of stepLabels; let i = index\">\n <cqa-button type=\"button\" variant=\"text\"\n customClass=\"cqa-api-edit-step-indicator-item cqa-api-edit-step-indicator-item--clickable cqa-flex cqa-items-center cqa-gap-[10px] cqa-cursor-pointer cqa-border-none cqa-p-0 cqa-font-inherit cqa-text-inherit cqa-text-left !cqa-bg-transparent\"\n [attr.aria-label]=\"'Step ' + step.index + ': ' + step.label\" [attr.aria-pressed]=\"step.index === currentStep\"\n (clicked)=\"setStep(step.index)\">\n <span class=\"cqa-api-edit-step-indicator-circle cqa-w-8 cqa-h-8 cqa-rounded-full cqa-inline-flex cqa-items-center cqa-justify-center cqa-text-sm cqa-font-medium cqa-leading-none cqa-border-none cqa-shrink-0\"\n [ngClass]=\"step.index === currentStep ? 'cqa-bg-[#4F46E5] cqa-text-white' : 'cqa-bg-[#E0E0E0] cqa-text-[#666666]'\">\n {{ step.index }}\n </span>\n <span class=\"cqa-api-edit-step-indicator-label cqa-text-sm cqa-leading-[18px] cqa-font-normal cqa-max-[767px]:cqa-text-xs\"\n [ngClass]=\"step.index === currentStep ? 'cqa-text-[#4F46E5]' : 'cqa-text-[#666666]'\">\n {{ step.label }}\n </span>\n <div *ngIf=\"i < stepLabels.length - 1\" class=\"cqa-api-edit-step-indicator-line cqa-w-[96px] cqa-h-[2px] cqa-bg-[#E0E0E0] cqa-my-0 cqa-mx-[6px] cqa-shrink-0 cqa-self-center cqa-max-[767px]:cqa-w-[24px] cqa-max-[767px]:cqa-mx-1\" aria-hidden=\"true\"></div>\n </cqa-button>\n </ng-container>\n </div>\n\n <!-- Step content viewport: only the active step body is shown (*ngIf) -->\n <div class=\"cqa-api-edit-step-viewport cqa-w-full\">\n <!-- Step 1: Environment, request, body, response -->\n <div *ngIf=\"currentStep === 1\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <!-- Environment row: new line, select aligned right -->\n <div class=\"cqa-api-edit-step-environment-row cqa-flex cqa-justify-end cqa-items-center\">\n <cqa-dynamic-select *ngIf=\"environmentForm\" [form]=\"environmentForm\" [config]=\"environmentSelectConfig\"\n class=\"cqa-api-edit-step-environment-select cqa-shrink-0 cqa-w-auto cqa-min-w-[315px] cqa-max-w-[315px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full [&_.mat-form-field-wrapper]:cqa-pb-0\" aria-label=\"Environment\"\n (selectionChange)=\"onEnvironmentSelectionChange($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Request row: method, URL, buttons -->\n <div class=\"cqa-api-edit-step-request-row cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-max-[767px]:cqa-flex-col cqa-max-[767px]:cqa-items-stretch cqa-max-[767px]:cqa-gap-2.5\">\n <cqa-dynamic-select *ngIf=\"methodForm\" [form]=\"methodForm\" [config]=\"methodSelectConfig\"\n class=\"cqa-api-edit-step-method-select cqa-shrink-0 cqa-w-auto cqa-min-w-[152px] cqa-max-w-[152px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full\" aria-label=\"HTTP method\"\n (selectionChange)=\"onMethodSelectionChange($event)\">\n </cqa-dynamic-select>\n <div class=\"cqa-api-edit-step-url-wrap cqa-flex-1 cqa-min-w-[200px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-w-full [&_cqa-custom-input_.cqa-relative_input]:cqa-h-[40px] [&_cqa-custom-input_.cqa-relative_input]:cqa-bg-white [&_cqa-custom-input_.cqa-relative_input]:cqa-border [&_cqa-custom-input_.cqa-relative_input]:cqa-border-solid [&_cqa-custom-input_.cqa-relative_input]:cqa-border-[#D1D5DB] [&_cqa-custom-input_.cqa-relative_input]:cqa-rounded-md [&_cqa-custom-input_.cqa-relative_input]:cqa-text-sm [&_cqa-custom-input_.cqa-relative_input]:cqa-text-[#374151]\">\n <cqa-custom-input [(value)]=\"url\" [label]=\"''\" placeholder=\"\" [fullWidth]=\"true\" size=\"md\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-trigger cqa-contents cqa-max-[767px]:cqa-w-full cqa-max-[767px]:!cqa-flex\" (click)=\"openImportCurlPanel()\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Import API cURL\"\n customClass=\"cqa-api-edit-step-btn-outline !cqa-bg-white !cqa-border !cqa-border-solid !cqa-border-[#6B7280] cqa-text-[#414146] cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal hover:!cqa-bg-[#F9FAFB] hover:!cqa-text-[#414146] cqa-max-[767px]:cqa-w-full\">\n </cqa-button>\n </div>\n <cqa-button variant=\"filled\" btnSize=\"lg\" text=\"Send Request\" (clicked)=\"onSendRequest()\"\n customClass=\"cqa-api-edit-step-btn-primary cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal !cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] !cqa-border-none cqa-py-2.5 cqa-px-6 cqa-gap-2 cqa-rounded-lg cqa-min-h-[37px] cqa-box-border hover:!cqa-bg-[#1B1FEB] cqa-max-[767px]:cqa-w-full\">\n </cqa-button>\n </div>\n\n\n\n <!-- Body content: header section (default) OR import cURL section -->\n <ng-container *ngIf=\"bodyView === 'import-curl'\">\n <div class=\"cqa-api-edit-step-import-curl-panel cqa-flex cqa-flex-col cqa-bg-white cqa-rounded-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-shadow-[0_1px_3px_rgba(0,0,0,0.08)] cqa-overflow-hidden\">\n <div class=\"cqa-api-edit-step-import-curl-header cqa-flex cqa-items-center cqa-justify-between cqa-py-3 cqa-px-5 cqa-border-b cqa-border-solid cqa-border-[#E2E8F0] cqa-bg-[#F9FAFB] cqa-rounded-t-lg cqa-max-[767px]:cqa-px-4\">\n <h3 class=\"cqa-api-edit-step-import-curl-title cqa-m-0 cqa-text-xs cqa-font-bold cqa-leading-[18px] cqa-text-[#374151]\">Import API cURL</h3>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-separator cqa-h-px cqa-bg-[#E2E8F0] cqa-my-0 cqa-mx-5\"></div>\n <div class=\"cqa-api-edit-step-import-curl-body\">\n <cqa-custom-textarea [value]=\"importCurlControl.value\"\n (valueChange)=\"importCurlControl.setValue($event)\"\n placeholder=\"Paste your cURL command here (e.g., curl -X POST https://api.example.com/users)\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-import-curl-textarea\">\n </cqa-custom-textarea>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-footer\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-import-curl-btn-cancel\" (clicked)=\"onCancelImportCurl()\"></cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Import\"\n customClass=\"cqa-api-edit-step-import-curl-btn-import\" (clicked)=\"onImportCurlConfirm()\"></cqa-button>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"bodyView === 'headers'\">\n <div class=\"cqa-api-edit-step-tabs-wrapper\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of payloadTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activePayloadTab === tab.value ? ' cqa-api-edit-step-tab--active' : '') + (isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params') ? ' cqa-api-edit-step-tab--disabled' : '')\"\n [disabled]=\"isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params')\"\n (clicked)=\"setPayloadTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Payload content (Authorization) -->\n <div *ngIf=\"activePayloadTab === 'authorization'\" class=\"cqa-api-edit-step-payload\"\n [attr.style]=\"'padding: 20px; min-height: 200px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 20px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 8px; width: fit-content;'\">\n <span [attr.style]=\"'font-size: 11px; font-weight: 600; letter-spacing: 0.02em; color: #6B7280; text-transform: uppercase; line-height: 1.25;'\">AUTH TYPE</span>\n <cqa-dynamic-select *ngIf=\"authTypeForm\" [form]=\"authTypeForm\" [config]=\"authTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-type-select\" aria-label=\"Auth type\"\n [attr.style]=\"'min-width: 160px;'\">\n </cqa-dynamic-select>\n </div>\n <!-- No Auth: centered message -->\n <div *ngIf=\"selectedAuthType === 'no-auth'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-width: 0; text-align: center;'\">\n <div aria-hidden=\"true\"\n [attr.style]=\"'width: 48px; height: 48px; border-radius: 10px; background: #F3F4F6; display: flex; align-items: center; justify-content: center; flex-shrink: 0;'\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <rect x=\"5\" y=\"11\" width=\"14\" height=\"2\" rx=\"1\" fill=\"#9CA3AF\"/>\n </svg>\n </div>\n <span [attr.style]=\"'font-size: 16px; font-weight: 600; color: #374151; line-height: 1.25;'\">No Auth</span>\n <div [attr.style]=\"'display: flex; align-items: center; justify-content: center; gap: 6px; flex-wrap: wrap;'\">\n <span [attr.style]=\"'font-size: 14px; font-weight: 400; color: #9CA3AF; line-height: 1.4;'\">This request does not use any authorization.</span>\n <span role=\"img\" aria-label=\"More information\" title=\"This request does not use any authorization.\"\n [attr.style]=\"'display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; color: #9CA3AF; flex-shrink: 0;'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M8 7v4M8 5v.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </div>\n </div>\n <!-- Bearer Token: Token label + textarea -->\n <div *ngIf=\"selectedAuthType === 'bearer'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; gap: 10px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Token</span>\n <cqa-custom-textarea [(value)]=\"bearerToken\"\n placeholder=\"Enter bearer token\"\n [fullWidth]=\"true\" [rows]=\"6\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-auth-token-textarea\" ariaLabel=\"Bearer token\">\n </cqa-custom-textarea>\n </div>\n <!-- OAuth 2.0: Grant Type, Access Token URL, Client ID, Client Secret, Scope, Client Authentication -->\n <div *ngIf=\"selectedAuthType === 'oauth2' && oauth2Form\"\n class=\"cqa-api-edit-step-oauth2-grid\"\n [attr.style]=\"'display: grid; grid-template-columns: 1fr 1fr; gap: 16px 24px; width: 100%;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Grant Type</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2GrantTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"OAuth grant type\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth grant type</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Access Token URL</span>\n <cqa-custom-input [value]=\"oauth2Form.get('accessTokenUrl')?.value\"\n (valueChange)=\"oauth2Form.get('accessTokenUrl')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth token endpoint\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Access Token URL\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth token endpoint</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client ID</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientId')?.value\"\n (valueChange)=\"oauth2Form.get('clientId')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth client identifier\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client ID\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client identifier</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Secret</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientSecret')?.value\"\n (valueChange)=\"oauth2Form.get('clientSecret')?.setValue($event)\"\n type=\"password\" [label]=\"''\" placeholder=\"Enter OAuth client secret\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client Secret\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client secret</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Scope</span>\n <cqa-custom-input [value]=\"oauth2Form.get('scope')?.value\"\n (valueChange)=\"oauth2Form.get('scope')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter space-separated scopes\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Scope\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Space-separated scopes</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Authentication</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2ClientAuthSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"Client authentication method\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Client authentication method</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Payload content (Headers) -->\n <div *ngIf=\"activePayloadTab === 'headers'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-headers-grid\">\n <span class=\"cqa-api-edit-step-headers-label\">Header Name</span>\n <span class=\"cqa-api-edit-step-headers-label\">Header Value</span>\n <span class=\"cqa-api-edit-step-headers-label cqa-api-edit-step-headers-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of headerRows; let i = index; trackBy: trackByHeader\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-header-row\">\n <cqa-dynamic-select [form]=\"row\" [config]=\"headerNameSelectConfig\"\n (addCustomValue)=\"onHeaderNameAddCustomValue($event, row)\"\n class=\"cqa-api-edit-step-header-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-header-value-input\" ariaLabel=\"Header value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-header-delete'\"\n [tooltip]=\"'Remove header'\" (clicked)=\"removeHeader(i)\">\n <svg class=\"cqa-api-edit-step-header-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-add-header-wrap\">\n <cqa-button type=\"button\" variant=\"text\" text=\"+ Add Header\"\n [customClass]=\"'cqa-api-edit-step-add-header-link'\" (clicked)=\"addHeader()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Params): Key\u2013Value table with add/delete rows -->\n <div *ngIf=\"activePayloadTab === 'params'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of paramsRows; let i = index; trackBy: trackByParams\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeParamsRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addParamsRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Body only): type, format, text area, Back/Next -->\n <div *ngIf=\"activePayloadTab === 'body'\"\n class=\"cqa-api-edit-step-payload cqa-api-edit-step-payload-editor\">\n <div class=\"cqa-api-edit-step-payload-type-row\">\n <span class=\"cqa-api-edit-step-payload-type-label\">Type</span>\n <div class=\"cqa-api-edit-step-payload-type-radios\">\n <cqa-segment-control [value]=\"payloadType\" [segments]=\"payloadTypeSegments\"\n (valueChange)=\"onPayloadTypeChange($event)\"\n class=\"cqa-api-edit-step-payload-type-segment\">\n </cqa-segment-control>\n </div>\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-format-wrap\">\n <span class=\"cqa-api-edit-step-payload-format-label\">Format:</span>\n <cqa-dynamic-select *ngIf=\"payloadFormatForm\" [form]=\"payloadFormatForm\"\n [config]=\"payloadFormatSelectConfig\" class=\"cqa-api-edit-step-payload-format-select\"\n aria-label=\"Format\">\n </cqa-dynamic-select>\n </div>\n </div>\n <!-- Raw: text area with line numbers (Postman-style payload body) -->\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-body\" #payloadEditorWithLinesRef>\n <div class=\"cqa-api-edit-step-payload-editor-with-lines\">\n <div class=\"cqa-api-edit-step-payload-line-numbers\" aria-hidden=\"true\">\n <span *ngFor=\"let n of payloadLineNumbers\" class=\"cqa-api-edit-step-payload-line-num\">\n <span *ngIf=\"payloadJsonError && payloadJsonError.line === n\"\n class=\"cqa-api-edit-step-payload-line-error-icon\" [title]=\"payloadJsonErrorTooltip\"\n aria-label=\"Parse error on this line\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#EF4444\"/>\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-api-edit-step-payload-line-num-text\">{{ n }}</span>\n </span>\n </div>\n <div class=\"cqa-api-edit-step-payload-textarea-cell\">\n <div class=\"cqa-api-edit-step-payload-textarea cqa-w-full cqa-flex cqa-flex-col cqa-min-h-0\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea--error': payloadJsonError}\">\n <textarea #payloadTextareaRef\n class=\"cqa-api-edit-step-payload-textarea-input cqa-w-full cqa-outline-none cqa-box-border\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea-input--error': payloadJsonError}\"\n [value]=\"payloadText\"\n placeholder=\"\"\n [attr.aria-label]=\"'Payload'\"\n [attr.aria-invalid]=\"!!payloadJsonError\"\n (input)=\"onPayloadInput($event)\"\n (keydown)=\"onPayloadKeydown($event)\">\n </textarea>\n </div>\n </div>\n </div>\n <p *ngIf=\"payloadJsonError\" class=\"cqa-api-edit-step-payload-json-error-msg\">\n Invalid JSON format. Please check your syntax.\n </p>\n </div>\n\n <!-- x-www-form-urlencoded: Key\u2013Value rows, add/remove dynamically -->\n <div *ngIf=\"payloadType === 'x-www-form-urlencoded'\" class=\"cqa-api-edit-step-key-value\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyValueRows; let i = index; trackBy: trackByKeyValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addKeyValueRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Data: Key\u2013Type\u2013Value rows; Type is a dropdown (Text/File), add/remove dynamically -->\n <div *ngIf=\"payloadType === 'form-data'\" class=\"cqa-api-edit-step-key-type-value\">\n <div class=\"cqa-api-edit-step-key-type-value-header\">\n <span class=\"cqa-api-edit-step-key-type-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Type</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-type-value-label cqa-api-edit-step-key-type-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyTypeValueRows; let i = index; trackBy: trackByKeyTypeValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-type-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"keyTypeValueTypeSelectConfig\"\n class=\"cqa-api-edit-step-key-type-value-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-type-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyTypeValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-type-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-type-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-type-value-add-btn\" (clicked)=\"addKeyTypeValueRow()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n <!-- Step 2: Variable Name: input, validation, Back / Next -->\n <div *ngIf=\"currentStep === 2\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-variable-section\">\n <div class=\"cqa-api-edit-step-variable-input-wrap\">\n <cqa-custom-input [(value)]=\"variableName\" [label]=\"''\" placeholder=\"Variable Name\" [fullWidth]=\"true\"\n size=\"md\" (valueChange)=\"onVariableNameChange()\" aria-label=\"Variable Name\">\n </cqa-custom-input>\n </div>\n <p *ngIf=\"variableNameError\" class=\"cqa-api-edit-step-variable-error\" role=\"alert\">{{ variableNameError }}</p>\n </div>\n </div>\n <!-- Step 3: Response Body / Status tabs -->\n <div *ngIf=\"currentStep === 3\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-tabs-wrapper\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of responseVerificationTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activeResponseVerificationTab === tab.value ? ' cqa-api-edit-step-tab--active' : '')\"\n (clicked)=\"setResponseVerificationTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Response Body tab content: verification grid -->\n <div *ngIf=\"activeResponseVerificationTab === 'response-body'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-verification\">\n <div class=\"cqa-api-edit-step-verification-grid cqa-api-edit-step-verification-grid-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">JSON Path</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Data Type</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of verificationRows; let i = index; trackBy: trackByVerification\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-custom-input [value]=\"row.get('jsonPath')?.value ?? ''\"\n (valueChange)=\"row.get('jsonPath')?.setValue($event)\" placeholder=\"Json Path\" [fullWidth]=\"true\"\n size=\"sm\" class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"JSON Path\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationDataTypeSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\"\n (selectionChange)=\"onVerificationDataTypeChange(row, $event)\">\n </cqa-dynamic-select>\n <!-- Expected Value: text for String/Array/Object, number for Number, dropdown for Boolean -->\n <ng-container [ngSwitch]=\"row.get('dataType')?.value\">\n <cqa-dynamic-select *ngSwitchCase=\"'boolean'\" [form]=\"row\"\n [config]=\"verificationExpectedValueBooleanSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-api-edit-step-verification-expected-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input *ngSwitchCase=\"'number'\" [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value (number)\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input cqa-api-edit-step-verification-expected-number\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-custom-input *ngSwitchDefault [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\"\n placeholder=\"Expected Value in String\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n </ng-container>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Status tab content: S.no, Verification dropdown, Expected Value, add/remove rows -->\n <div *ngIf=\"activeResponseVerificationTab === 'status'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addStatusVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-status-verification\">\n <div class=\"cqa-api-edit-step-status-verification-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of statusVerificationRows; let i = index; trackBy: trackByStatusVerification\"\n [formGroup]=\"row\" class=\"cqa-api-edit-step-status-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-dynamic-select [form]=\"row\" [config]=\"statusVerificationSelectConfig\"\n class=\"cqa-api-edit-step-status-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\" class=\"cqa-api-edit-step-verification-input\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeStatusVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Response Preview -->\n <div class=\"cqa-api-edit-step-response\">\n <h3 class=\"cqa-api-edit-step-response-title cqa-text-[14px] cqa-font-bold cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-mb-[12px] cqa-shrink-0\">Response Preview</h3>\n <pre class=\"cqa-api-edit-step-response-content\">{{ responsePreview }}</pre>\n </div>\n\n <!-- Step actions: one row, full width. Step 1: Cancel + Next; Step 2: Back + Next; Step 3: Back + Create -->\n <div class=\"cqa-api-edit-step-actions\">\n <ng-container [ngSwitch]=\"currentStep\">\n <ng-container *ngSwitchCase=\"1\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-actions-btn-cancel\" (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" [text]=\"editMode ? 'Update' : 'Create'\"\n customClass=\"cqa-api-edit-step-actions-btn-create\" (clicked)=\"onCreate()\">\n </cqa-button>\n </ng-container>\n </ng-container>\n </div>\n</div>" }]
1071
1660
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { initialMethod: [{
1072
1661
  type: Input
1073
1662
  }], initialEnvironment: [{
@@ -1082,6 +1671,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1082
1671
  type: Input
1083
1672
  }], initialResponsePreview: [{
1084
1673
  type: Input
1674
+ }], initialVariableName: [{
1675
+ type: Input
1676
+ }], editMode: [{
1677
+ type: Input
1085
1678
  }], importCurl: [{
1086
1679
  type: Output
1087
1680
  }], importCurlCancel: [{
@@ -1090,6 +1683,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1090
1683
  type: Output
1091
1684
  }], back: [{
1092
1685
  type: Output
1686
+ }], cancel: [{
1687
+ type: Output
1093
1688
  }], next: [{
1094
1689
  type: Output
1095
1690
  }], create: [{
@@ -1100,6 +1695,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1100
1695
  type: Input
1101
1696
  }], environmentOptions: [{
1102
1697
  type: Input
1698
+ }], authTypeOptions: [{
1699
+ type: Input
1700
+ }], initialAuthType: [{
1701
+ type: Input
1103
1702
  }], formatOptions: [{
1104
1703
  type: Input
1105
1704
  }], initialFormat: [{
@@ -1119,4 +1718,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1119
1718
  }], statusVerificationOptions: [{
1120
1719
  type: Input
1121
1720
  }] } });
1122
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1lZGl0LXN0ZXAvYXBpLWVkaXQtc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1lZGl0LXN0ZXAvYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUEwQixXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7O0FBSWhGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxVQUFVLEVBQUUsWUFBWTtDQUNoQixDQUFDO0FBdUVYLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBRXZELDhFQUE4RTtBQUM5RSxNQUFNLHdCQUF3QixHQUEyQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQVFwRyxNQUFNLE9BQU8sb0JBQW9CO0lBNnJCL0IsWUFDbUIsRUFBZSxFQUNmLEdBQXNCO1FBRHRCLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXRyQnpDLHVGQUF1RjtRQUM3RSxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNsRCxxRUFBcUU7UUFDM0QscUJB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TCxrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CO2dCQStDdEIsaUJBQWlCO3NCQUF6QixLQUFLO2dCQStGRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBOENHLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFnRUcseUJBQXlCO3NCQUFqQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcblxuZXhwb3J0IGNvbnN0IEFQSV9FRElUX1NURVBfTEFCRUxTID0ge1xuICBSRVFVRVNUX0RFVEFJTFM6ICdSZXF1ZXN0IERldGFpbHMnLFxuICBTVE9SRV9SRVNQT05TRTogJ1N0b3JlIFJlc3BvbnNlJyxcbiAgVkFMSURBVElPTjogJ1ZhbGlkYXRpb24nLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQXBpRWRpdFBheWxvYWRUYWIgPSAnaGVhZGVycycgfCAnYm9keScgfCAncGFyYW1zJyB8ICdzY3JpcHRzJztcblxuLyoqIFdoaWNoIGJvZHkgY29udGVudCBibG9jayBpcyB2aXNpYmxlOiBoZWFkZXJzICh0YWJzKSBvciBpbXBvcnQgY1VSTCB0ZXh0YXJlYS4gKi9cbmV4cG9ydCB0eXBlIEFwaUVkaXRCb2R5VmlldyA9ICdoZWFkZXJzJyB8ICdpbXBvcnQtY3VybCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdEhlYWRlclJvdyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKiogUGF5bG9hZCBlbWl0dGVkIHdoZW4gdXNlciBjbGlja3MgU2VuZCBSZXF1ZXN0IChlbnZpcm9ubWVudCwgbWV0aG9kLCB1cmwsIGhlYWRlcnMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0U2VuZFJlcXVlc3RQYXlsb2FkIHtcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBoZWFkZXJzOiBBcGlFZGl0SGVhZGVyUm93W107XG59XG5cbi8qKiBTdGVwIDEgcmVxdWVzdCArIGJvZHkgcGF5bG9hZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFN0ZXAxUGF5bG9hZCB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgaGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdO1xuICBhY3RpdmVQYXlsb2FkVGFiOiBBcGlFZGl0UGF5bG9hZFRhYjtcbiAgcGF5bG9hZFR5cGU6ICdyYXcnIHwgJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfCAnZm9ybS1kYXRhJztcbiAgcGF5bG9hZEZvcm1hdDogc3RyaW5nO1xuICBwYXlsb2FkVGV4dDogc3RyaW5nO1xuICBrZXlWYWx1ZVJvd3M6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdO1xuICBrZXlUeXBlVmFsdWVSb3dzOiB7IGtleTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdO1xufVxuXG4vKiogU3RlcCAyIHN0b3JlLXJlc3BvbnNlIHBheWxvYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRTdGVwMlBheWxvYWQge1xuICB2YXJpYWJsZU5hbWU6IHN0cmluZztcbn1cblxuLyoqIFJlc3BvbnNlIGJvZHkgdmVyaWZpY2F0aW9uIHJvdy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFJlc3BvbnNlQm9keVZlcmlmaWNhdGlvblJvdyB7XG4gIGpzb25QYXRoOiBzdHJpbmc7XG4gIHZlcmlmaWNhdGlvbjogc3RyaW5nO1xuICBkYXRhVHlwZTogc3RyaW5nO1xuICBleHBlY3RlZFZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKiBTdGF0dXMgdmVyaWZpY2F0aW9uIHJvdy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFN0YXR1c1ZlcmlmaWNhdGlvblJvdyB7XG4gIHZlcmlmaWNhdGlvbjogc3RyaW5nO1xuICBleHBlY3RlZFZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKiBTdGVwIDMgdmFsaWRhdGlvbiBwYXlsb2FkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0U3RlcDNQYXlsb2FkIHtcbiAgYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI6ICdyZXNwb25zZS1ib2R5JyB8ICdzdGF0dXMnO1xuICByZXNwb25zZUJvZHlWZXJpZmljYXRpb25zOiBBcGlFZGl0UmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9uUm93W107XG4gIHN0YXR1c1ZlcmlmaWNhdGlvbnM6IEFwaUVkaXRTdGF0dXNWZXJpZmljYXRpb25Sb3dbXTtcbn1cblxuLyoqIEZ1bGwgcGF5bG9hZCBlbWl0dGVkIHdoZW4gdXNlciBjbGlja3MgQ3JlYXRlIChhbGwgc3RlcHPigJkgZGF0YSkuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRDcmVhdGVQYXlsb2FkIHtcbiAgc3RlcDE6IEFwaUVkaXRTdGVwMVBheWxvYWQ7XG4gIHN0ZXAyOiBBcGlFZGl0U3RlcDJQYXlsb2FkO1xuICBzdGVwMzogQXBpRWRpdFN0ZXAzUGF5bG9hZDtcbn1cblxuLyoqIEVudmlyb25tZW50IG9wdGlvbjogZWl0aGVyIGEgc3RyaW5nIChkaXNwbGF5ID0gdmFsdWUpIG9yIGFuIG9iamVjdCB3aXRoIGlkLCBuYW1lLCB2YWx1ZSwgbGFiZWwuICovXG5leHBvcnQgdHlwZSBFbnZpcm9ubWVudE9wdGlvbklucHV0ID0gc3RyaW5nIHwgU2VsZWN0T3B0aW9uO1xuXG5jb25zdCBNRVRIT0RTX1dJVEhPVVRfQk9EWSA9IFsnR0VUJywgJ0hFQUQnLCAnREVMRVRFJ107XG5cbi8qKiBBdXRvLWNsb3NlIHBhaXJzIGZvciBwYXlsb2FkIEpTT04gZWRpdG9yOiBvcGVuaW5nIGNoYXIgLT4gY2xvc2luZyBjaGFyLiAqL1xuY29uc3QgUEFZTE9BRF9BVVRPX0NMT1NFX1BBSVJTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyAneyc6ICd9JywgJ1snOiAnXScsICdcIic6ICdcIicsIFwiJ1wiOiBcIidcIiB9O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtYXBpLWVkaXQtc3RlcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hcGktZWRpdC1zdGVwLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHQsXG59KVxuZXhwb3J0IGNsYXNzIEFwaUVkaXRTdGVwQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGluaXRpYWxNZXRob2Q/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGluaXRpYWxFbnZpcm9ubWVudD86IHN0cmluZztcbiAgQElucHV0KCkgaW5pdGlhbFN0ZXA/OiBudW1iZXI7XG4gIEBJbnB1dCgpIGluaXRpYWxVcmw/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGluaXRpYWxQYXlsb2FkVGFiPzogQXBpRWRpdFBheWxvYWRUYWI7XG4gIEBJbnB1dCgpIGluaXRpYWxIZWFkZXJzPzogQXBpRWRpdEhlYWRlclJvd1tdO1xuICBASW5wdXQoKSBpbml0aWFsUmVzcG9uc2VQcmV2aWV3Pzogc3RyaW5nO1xuXG4gIC8qKiBFbWl0cyB0aGUgY1VSTCBzdHJpbmcgd2hlbiB1c2VyIGNsaWNrcyBJbXBvcnQgKHZhbHVlIGZyb20gdGhlIHRleHRhcmVhIGNvbnRyb2wpLiAqL1xuICBAT3V0cHV0KCkgaW1wb3J0Q3VybCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdHMgd2hlbiB1c2VyIGNhbmNlbHMgdGhlIEltcG9ydCBjVVJMIHBhbmVsIChjbGlja3MgQ2FuY2VsKS4gKi9cbiAgQE91dHB1dCgpIGltcG9ydEN1cmxDYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHVzZXIgY2xpY2tzIFNlbmQgUmVxdWVzdCwgd2l0aCBlbnZpcm9ubWVudCwgbWV0aG9kLCB1cmwsIGFuZCBoZWFkZXJzLiAqL1xuICBAT3V0cHV0KCkgc2VuZFJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPEFwaUVkaXRTZW5kUmVxdWVzdFBheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSBiYWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbmV4dCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdXNlciBjbGlja3MgQ3JlYXRlIHdpdGggYWxsIGVudGVyZWQgZGV0YWlsczogc3RlcDEgKGVudmlyb25tZW50LCBIVFRQIG1ldGhvZCwgVVJMLCBoZWFkZXJzLCBib2R5KSwgc3RlcDIgKHZhcmlhYmxlIG5hbWUpLCBzdGVwMyAodmVyaWZpY2F0aW9ucykuICovXG4gIEBPdXRwdXQoKSBjcmVhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPEFwaUVkaXRDcmVhdGVQYXlsb2FkPigpO1xuICAvKiogRW1pdHMgd2hlbmV2ZXIgaGVhZGVycyBjaGFuZ2UgKGFkZCwgcmVtb3ZlLCBvciBlZGl0KSBzbyB0aGUgcGFyZW50IGNhbiByZWZsZWN0IHRoZW0gaW4gdGhlIGNhbnZhcy9jb250cm9scy4gKi9cbiAgQE91dHB1dCgpIGhlYWRlcnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFwaUVkaXRIZWFkZXJSb3dbXT4oKTtcblxuICAvKiogRm9ybSBjb250cm9sIGZvciBJbXBvcnQgY1VSTCB0ZXh0YXJlYTsgdmFsdWUgaXMgZW1pdHRlZCB3aGVuIHVzZXIgY2xpY2tzIEltcG9ydC4gKi9cbiAgcmVhZG9ubHkgaW1wb3J0Q3VybENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuXG4gIHZhcmlhYmxlTmFtZSA9ICcnO1xuICB2YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuXG4gIC8qKiBDb250cm9scyB3aGljaCBib2R5IGNvbnRlbnQgaXMgdmlzaWJsZTogaGVhZGVycyAoZGVmYXVsdCkgb3IgaW1wb3J0LWN1cmwuICovXG4gIGJvZHlWaWV3OiBBcGlFZGl0Qm9keVZpZXcgPSAnaGVhZGVycyc7XG5cbiAgcmVhZG9ubHkgc3RlcExhYmVscyA9IFtcbiAgICB7IGluZGV4OiAxLCBsYWJlbDogQVBJX0VESVRfU1RFUF9MQUJFTFMuUkVRVUVTVF9ERVRBSUxTIH0sXG4gICAgeyBpbmRleDogMiwgbGFiZWw6IEFQSV9FRElUX1NURVBfTEFCRUxTLlNUT1JFX1JFU1BPTlNFIH0sXG4gICAgeyBpbmRleDogMywgbGFiZWw6IEFQSV9FRElUX1NURVBfTEFCRUxTLlZBTElEQVRJT04gfSxcbiAgXTtcbiAgY3VycmVudFN0ZXAgPSAxO1xuXG4gIC8qKiBUaGUgbGFiZWwgZm9yIHRoZSBjdXJyZW50IHN0ZXAgb25seSAodXNlZCB3aGVuIHNob3dpbmcgYSBzaW5nbGUgc3RlcCBpbiB0aGUgaW5kaWNhdG9yKS4gKi9cbiAgZ2V0IGFjdGl2ZVN0ZXBMYWJlbCgpOiB7IGluZGV4OiBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RlcExhYmVsc1t0aGlzLmN1cnJlbnRTdGVwIC0gMV07XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IG1pblN0ZXAgPSAxO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heFN0ZXAgPSAzO1xuXG4gIC8qKiBQZXJjZW50YWdlIHRvIHRyYW5zbGF0ZSB0aGUgc3RlcCBzdHJpcCAoMCwgLTMzLjMzMywgLTY2LjY2NikgZm9yIENTUyB0cmFuc2l0aW9uLiAqL1xuICBnZXQgc3RyaXBUcmFuc2xhdGVQZXJjZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRTdGVwIC0gMSkgKiAtMzMuMzMzO1xuICB9XG5cbiAgc2V0U3RlcChzdGVwOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoc3RlcCA+PSB0aGlzLm1pblN0ZXAgJiYgc3RlcCA8PSB0aGlzLm1heFN0ZXApIHtcbiAgICAgIHRoaXMuY3VycmVudFN0ZXAgPSBzdGVwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlJbml0aWFsU3RlcCh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjtcbiAgICBjb25zdCBjbGFtcGVkID0gTWF0aC5tYXgodGhpcy5taW5TdGVwLCBNYXRoLm1pbih0aGlzLm1heFN0ZXAsIE1hdGguZmxvb3IodmFsdWUpKSk7XG4gICAgdGhpcy5jdXJyZW50U3RlcCA9IGNsYW1wZWQ7XG4gIH1cblxuICAvKiogSFRUUCBtZXRob2Qgb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHdpdGggaWQsIG5hbWUsIHZhbHVlLCBsYWJlbCAocGFzc2VkIGZyb20gcGFyZW50KS4gKi9cbiAgQElucHV0KCkgaHR0cE1ldGhvZE9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIC8qKiBGb3JtIGZvciBIVFRQIG1ldGhvZCBzZWxlY3QgKGNxYS1keW5hbWljLXNlbGVjdCkgKi9cbiAgbWV0aG9kRm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogQ29uZmlnIGZvciBtZXRob2QgZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiBodHRwTWV0aG9kT3B0aW9ucyBjaGFuZ2VzIHRvIGF2b2lkIG5ldyByZWZlcmVuY2UgZXZlcnkgQ0QpICovXG4gIG1ldGhvZFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ21ldGhvZCcsXG4gICAgcGxhY2Vob2xkZXI6ICdNZXRob2QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlTWV0aG9kU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSAodGhpcy5odHRwTWV0aG9kT3B0aW9ucyA/PyBbXSkubWFwKChtKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihtKSk7XG4gICAgdGhpcy5tZXRob2RTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLm1ldGhvZFNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWV0aG9kVmFsdWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnMgPz8gW10pXG4gICAgICAubWFwKChtKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShtKSlcbiAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9IG51bGwpO1xuICB9XG5cbiAgLyoqIEZvcm0gZm9yIGVudmlyb25tZW50IHNlbGVjdCAoY3FhLWR5bmFtaWMtc2VsZWN0KSAqL1xuICBlbnZpcm9ubWVudEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIEVudmlyb25tZW50IG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB3aXRoIGlkLCBuYW1lLCB2YWx1ZSwgbGFiZWwgKHBhc3NlZCBmcm9tIHBhcmVudCkuICovXG4gIEBJbnB1dCgpIGVudmlyb25tZW50T3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgLyoqIENvbmZpZyBmb3IgZW52aXJvbm1lbnQgZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiBlbnZpcm9ubWVudE9wdGlvbnMgY2hhbmdlcyB0byBhdm9pZCBuZXcgcmVmZXJlbmNlIGV2ZXJ5IENEKSAqL1xuICBlbnZpcm9ubWVudFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2Vudmlyb25tZW50JyxcbiAgICBwbGFjZWhvbGRlcjogJ0Vudmlyb25tZW50JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyB0b1NlbGVjdE9wdGlvbihpdGVtOiBFbnZpcm9ubWVudE9wdGlvbklucHV0KTogU2VsZWN0T3B0aW9uIHtcbiAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4geyBpZDogaXRlbSwgdmFsdWU6IGl0ZW0sIG5hbWU6IGl0ZW0sIGxhYmVsOiBpdGVtIH07XG4gICAgfVxuICAgIGNvbnN0IG8gPSBpdGVtIGFzIFNlbGVjdE9wdGlvbjtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IG8uaWQgPz8gby52YWx1ZSxcbiAgICAgIHZhbHVlOiBvLnZhbHVlID8/IG8uaWQsXG4gICAgICBuYW1lOiBvLm5hbWUgPz8gby5sYWJlbCA/PyBTdHJpbmcoby52YWx1ZSA/PyBvLmlkKSxcbiAgICAgIGxhYmVsOiBvLmxhYmVsID8/IG8ubmFtZSA/PyBTdHJpbmcoby52YWx1ZSA/PyBvLmlkKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0T3B0aW9uVmFsdWUoaXRlbTogRW52aXJvbm1lbnRPcHRpb25JbnB1dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykgcmV0dXJuIGl0ZW07XG4gICAgY29uc3QgbyA9IGl0ZW0gYXMgU2VsZWN0T3B0aW9uO1xuICAgIGNvbnN0IHYgPSBvLnZhbHVlID8/IG8uaWQ7XG4gICAgcmV0dXJuIHYgIT0gbnVsbCA/IFN0cmluZyh2KSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRW52aXJvbm1lbnRTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9ICh0aGlzLmVudmlyb25tZW50T3B0aW9ucyA/PyBbXSkubWFwKChlKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihlKSk7XG4gICAgdGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEVudmlyb25tZW50VmFsdWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gKHRoaXMuZW52aXJvbm1lbnRPcHRpb25zID8/IFtdKVxuICAgICAgLm1hcCgoZSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZSkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IEhUVFAgbWV0aG9kIChmcm9tIGZvcm0gb3IgZGVmYXVsdDogZmlyc3Qgb2YgaHR0cE1ldGhvZE9wdGlvbnMpLiBUcmVhdHMgZW1wdHkgc3RyaW5nIGFzIHVuc2V0LiAqL1xuICBnZXQgc2VsZWN0ZWRNZXRob2QoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubWV0aG9kRm9ybT8uZ2V0KCdtZXRob2QnKT8udmFsdWU7XG4gICAgY29uc3QgZmlyc3RWYWx1ZSA9IHRoaXMuaHR0cE1ldGhvZE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmh0dHBNZXRob2RPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSAnJyA/ICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodmFsdWUgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodmFsdWUpKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZWQgPz8gZmlyc3RWYWx1ZSA/PyAnR0VUJztcbiAgfVxuICBzZXQgc2VsZWN0ZWRNZXRob2Qodjogc3RyaW5nKSB7XG4gICAgdGhpcy5tZXRob2RGb3JtPy5wYXRjaFZhbHVlKHsgbWV0aG9kOiB2IH0pO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiB0aGUgc2VsZWN0ZWQgSFRUUCBtZXRob2QgaXMgR0VULCBIRUFELCBvciBERUxFVEUgKG5vIHJlcXVlc3QgYm9keSkuICovXG4gIGdldCBpc01ldGhvZFdpdGhvdXRCb2R5KCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuc2VsZWN0ZWRNZXRob2QgIT0gbnVsbCA/IFN0cmluZyh0aGlzLnNlbGVjdGVkTWV0aG9kKS50b1VwcGVyQ2FzZSgpIDogJyc7XG4gICAgcmV0dXJuIE1FVEhPRFNfV0lUSE9VVF9CT0RZLmluY2x1ZGVzKG1ldGhvZCk7XG4gIH1cblxuICAvKiogQ2FjaGVkIGVudmlyb25tZW50IHZhbHVlIGZyb20gbGFzdCBzZWxlY3Rpb24gKHNvIENyZWF0ZSBwYXlsb2FkIGhhcyB0aGUgc2VsZWN0ZWQgdmFsdWUpLiAqL1xuICBwcml2YXRlIGN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gJyc7XG5cbiAgLyoqIENhY2hlZCBIVFRQIG1ldGhvZCBmcm9tIGxhc3Qgc2VsZWN0aW9uIChzbyBDcmVhdGUgcGF5bG9hZCBoYXMgdGhlIHNlbGVjdGVkIHZhbHVlKS4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50TWV0aG9kVmFsdWUgPSAnJztcblxuICAvKiogQ3VycmVudCBlbnZpcm9ubWVudCAoZnJvbSBmb3JtIG9yIGRlZmF1bHQ6IGZpcnN0IG9mIGVudmlyb25tZW50T3B0aW9ucykuIFRyZWF0cyBlbXB0eSBzdHJpbmcgYXMgdW5zZXQuICovXG4gIGdldCBzZWxlY3RlZEVudmlyb25tZW50KCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmVudmlyb25tZW50Rm9ybT8uZ2V0KCdlbnZpcm9ubWVudCcpPy52YWx1ZTtcbiAgICBjb25zdCBmaXJzdFZhbHVlID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmVudmlyb25tZW50T3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlc29sdmVkID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gJycgPyAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHZhbHVlIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpIDogU3RyaW5nKHZhbHVlKSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc29sdmVkID8/IGZpcnN0VmFsdWUgPz8gJ0RldmVsb3BtZW50JztcbiAgfVxuICBzZXQgc2VsZWN0ZWRFbnZpcm9ubWVudCh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLmVudmlyb25tZW50Rm9ybT8ucGF0Y2hWYWx1ZSh7IGVudmlyb25tZW50OiB2IH0pO1xuICB9XG5cbiAgLyoqIENhbGxlZCB3aGVuIHVzZXIgc2VsZWN0cyBhbiBlbnZpcm9ubWVudDsga2VlcHMgY3VycmVudEVudmlyb25tZW50VmFsdWUgaW4gc3luYyBmb3IgY3JlYXRlIHBheWxvYWQuICovXG4gIG9uRW52aXJvbm1lbnRTZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gZXZlbnQudmFsdWU7XG4gICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9XG4gICAgICB2ICE9IG51bGxcbiAgICAgICAgPyB0eXBlb2YgdiA9PT0gJ29iamVjdCdcbiAgICAgICAgICA/IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKVxuICAgICAgICAgIDogU3RyaW5nKHYpXG4gICAgICAgIDogJyc7XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBzZWxlY3RzIGFuIEhUVFAgbWV0aG9kOyBrZWVwcyBjdXJyZW50TWV0aG9kVmFsdWUgaW4gc3luYyBmb3IgY3JlYXRlIHBheWxvYWQuICovXG4gIG9uTWV0aG9kU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KTogdm9pZCB7XG4gICAgY29uc3QgdiA9IGV2ZW50LnZhbHVlO1xuICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID1cbiAgICAgIHYgIT0gbnVsbFxuICAgICAgICA/IHR5cGVvZiB2ID09PSAnb2JqZWN0J1xuICAgICAgICAgID8gKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpXG4gICAgICAgICAgOiBTdHJpbmcodilcbiAgICAgICAgOiAnJztcbiAgfVxuXG4gIHVybCA9ICcnO1xuXG4gIHJlYWRvbmx5IHBheWxvYWRUYWJzOiB7IHZhbHVlOiBBcGlFZGl0UGF5bG9hZFRhYjsgbGFiZWw6IHN0cmluZyB9W10gPSBbXG4gICAgeyB2YWx1ZTogJ2hlYWRlcnMnLCBsYWJlbDogJ0hlYWRlcnMnIH0sXG4gICAgeyB2YWx1ZTogJ2JvZHknLCBsYWJlbDogJ0JvZHknIH0sXG4gICAgeyB2YWx1ZTogJ3BhcmFtcycsIGxhYmVsOiAnUGFyYW1zJyB9LFxuICAgIHsgdmFsdWU6ICdzY3JpcHRzJywgbGFiZWw6ICdTY3JpcHRzJyB9LFxuICBdO1xuICBhY3RpdmVQYXlsb2FkVGFiOiBBcGlFZGl0UGF5bG9hZFRhYiA9ICdoZWFkZXJzJztcblxuICAvKiogU3RlcCAzOiBSZXNwb25zZSB2ZXJpZmljYXRpb24gdGFicyAqL1xuICByZWFkb25seSByZXNwb25zZVZlcmlmaWNhdGlvblRhYnM6IHsgdmFsdWU6ICdyZXNwb25zZS1ib2R5JyB8ICdzdGF0dXMnOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtcbiAgICB7IHZhbHVlOiAncmVzcG9uc2UtYm9keScsIGxhYmVsOiAnUmVzcG9uc2UgQm9keScgfSxcbiAgICB7IHZhbHVlOiAnc3RhdHVzJywgbGFiZWw6ICdTdGF0dXMnIH0sXG4gIF07XG4gIGFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiOiAncmVzcG9uc2UtYm9keScgfCAnc3RhdHVzJyA9ICdyZXNwb25zZS1ib2R5JztcblxuICAvKiogUGF5bG9hZCB0eXBlIGZvciBCb2R5L1BhcmFtcy9TY3JpcHRzOiByYXcsIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCwgZm9ybS1kYXRhICovXG4gIHBheWxvYWRUeXBlOiAncmF3JyB8ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ2Zvcm0tZGF0YScgPSAncmF3JztcblxuICAvKiogU2VnbWVudCBvcHRpb25zIGZvciBwYXlsb2FkIHR5cGUgKHVzZWQgYnkgY3FhLXNlZ21lbnQtY29udHJvbCkgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZFR5cGVTZWdtZW50cyA9IFtcbiAgICB7IGxhYmVsOiAnUmF3JywgdmFsdWU6ICdyYXcnIH0sXG4gICAgeyBsYWJlbDogJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsIHZhbHVlOiAneC13d3ctZm9ybS11cmxlbmNvZGVkJyB9LFxuICAgIHsgbGFiZWw6ICdGb3JtIERhdGEnLCB2YWx1ZTogJ2Zvcm0tZGF0YScgfSxcbiAgXTtcblxuICBvblBheWxvYWRUeXBlQ2hhbmdlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wYXlsb2FkVHlwZSA9IHZhbCBhcyAncmF3JyB8ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ2Zvcm0tZGF0YSc7XG4gIH1cblxuICAvKiogRm9ybSBmb3IgRm9ybWF0IHNlbGVjdCAoQm9keS9QYXJhbXMvU2NyaXB0cykgKi9cbiAgcGF5bG9hZEZvcm1hdEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIEZvcm1hdCBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgKHBhc3NlZCBmcm9tIHBhcmVudCkuIEZhbGxzIGJhY2sgdG8gSlNPTiwgWE1MLCBIVE1MLCBUZXh0IHdoZW4gZW1wdHkuICovXG4gIEBJbnB1dCgpIGZvcm1hdE9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIGluaXRpYWxGb3JtYXQ/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GT1JNQVRfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ2pzb24nLCB2YWx1ZTogJ2pzb24nLCBuYW1lOiAnSlNPTicsIGxhYmVsOiAnSlNPTicgfSxcbiAgICB7IGlkOiAneG1sJywgdmFsdWU6ICd4bWwnLCBuYW1lOiAnWE1MJywgbGFiZWw6ICdYTUwnIH0sXG4gICAgeyBpZDogJ2h0bWwnLCB2YWx1ZTogJ2h0bWwnLCBuYW1lOiAnSFRNTCcsIGxhYmVsOiAnSFRNTCcgfSxcbiAgICB7IGlkOiAndGV4dCcsIHZhbHVlOiAndGV4dCcsIG5hbWU6ICdUZXh0JywgbGFiZWw6ICdUZXh0JyB9LFxuICBdO1xuXG4gIC8qKiBDb25maWcgZm9yIEZvcm1hdCBkcm9wZG93biAodXBkYXRlZCB3aGVuIGZvcm1hdE9wdGlvbnMgY2hhbmdlcywgbGlrZSBNZXRob2QgZHJvcGRvd24pICovXG4gIHBheWxvYWRGb3JtYXRTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdmb3JtYXQnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9GT1JNQVRfT1BUSU9OU10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYXlsb2FkRm9ybWF0U2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgdGhpcy5mb3JtYXRPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5mb3JtYXRPcHRpb25zLm1hcCgoZikgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24oZikpXG4gICAgICAgIDogQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9GT1JNQVRfT1BUSU9OUztcbiAgICB0aGlzLnBheWxvYWRGb3JtYXRTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnBheWxvYWRGb3JtYXRTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEZvcm1hdFZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMuZm9ybWF0T3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuZm9ybWF0T3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVF9PUFRJT05TIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSk7XG4gICAgcmV0dXJuIHNvdXJjZVxuICAgICAgLm1hcCgoZikgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSlcbiAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9IG51bGwpO1xuICB9XG5cbiAgLyoqIFBheWxvYWQgdGV4dCBhcmVhIHZhbHVlIGZvciBCb2R5L1BhcmFtcy9TY3JpcHRzICovXG4gIHBheWxvYWRUZXh0ID0gJyc7XG5cbiAgLyoqIEpTT04gcGFyc2UgZXJyb3Igd2hlbiBmb3JtYXQgaXMgSlNPTiBhbmQgcGF5bG9hZCBpcyBpbnZhbGlkOyBudWxsIHdoZW4gdmFsaWQgb3Igbm90IEpTT04uICovXG4gIHBheWxvYWRKc29uRXJyb3I6IHtcbiAgICBsaW5lOiBudW1iZXI7XG4gICAgY29sdW1uOiBudW1iZXI7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGV4Y2VycHQ6IHN0cmluZztcbiAgICBjYXJldE9mZnNldDogbnVtYmVyO1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIExpbmUgbnVtYmVycyBmb3IgcGF5bG9hZCB0ZXh0YXJlYSAoMSwgMiwgMywgLi4uKSBiYXNlZCBvbiBjdXJyZW50IGxpbmUgY291bnQuICovXG4gIGdldCBwYXlsb2FkTGluZU51bWJlcnMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IG4gPSBNYXRoLm1heCgxLCAodGhpcy5wYXlsb2FkVGV4dCB8fCAnJykuc3BsaXQoL1xccj9cXG4vKS5sZW5ndGgpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuIH0sIChfLCBpKSA9PiBpICsgMSk7XG4gIH1cblxuICAvKiogV2hldGhlciBjdXJyZW50IHBheWxvYWQgZm9ybWF0IGlzIEpTT04gKHNvIHdlIHZhbGlkYXRlIGFuZCBzaG93IEpTT04gZWRpdG9yIGJlaGF2aW9yKS4gKi9cbiAgZ2V0IGlzUGF5bG9hZEZvcm1hdEpzb24oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZm9ybWF0ID0gdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybT8uZ2V0KCdmb3JtYXQnKT8udmFsdWU7XG4gICAgcmV0dXJuIGZvcm1hdCA9PT0gJ2pzb24nO1xuICB9XG5cbiAgLyoqIEVycm9yIG1lc3NhZ2VzIGZvciB0aGUgcGF5bG9hZCB0ZXh0YXJlYSAocmVkIGJvcmRlciArIGJvdHRvbSBsaW5lKS4gKi9cbiAgZ2V0IHBheWxvYWRKc29uRXJyb3JzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5wYXlsb2FkSnNvbkVycm9yID8gWydJbnZhbGlkIEpTT04gZm9ybWF0LiBQbGVhc2UgY2hlY2sgeW91ciBzeW50YXguJ10gOiBbXTtcbiAgfVxuXG4gIC8qKiBUb29sdGlwIGNvbnRlbnQgZm9yIHRoZSBsaW5lLWxldmVsIGVycm9yIGljb24gKHBhcnNlIGVycm9yIG9uIGxpbmUgWCwgZXhjZXJwdCwgY2FyZXQsIG1lc3NhZ2UpLiAqL1xuICBnZXQgcGF5bG9hZEpzb25FcnJvclRvb2x0aXAoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucGF5bG9hZEpzb25FcnJvcikgcmV0dXJuICcnO1xuICAgIGNvbnN0IGUgPSB0aGlzLnBheWxvYWRKc29uRXJyb3I7XG4gICAgY29uc3QgY2FyZXQgPSAnICcucmVwZWF0KGUuY2FyZXRPZmZzZXQpICsgJ14nO1xuICAgIHJldHVybiBgUGFyc2UgZXJyb3Igb24gbGluZSAke2UubGluZX06XFxuXFxuJHtlLmV4Y2VycHR9XFxuJHtjYXJldH1cXG5cXG4ke2UubWVzc2FnZX1gO1xuICB9XG5cbiAgb25QYXlsb2FkVGV4dENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wYXlsb2FkVGV4dCA9IHZhbHVlO1xuICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICB9XG5cbiAgb25QYXlsb2FkSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xuICAgIHRoaXMub25QYXlsb2FkVGV4dENoYW5nZSh0YXJnZXQ/LnZhbHVlID8/ICcnKTtcbiAgfVxuXG4gIG9uUGF5bG9hZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNQYXlsb2FkRm9ybWF0SnNvbikgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcbiAgICBjb25zdCBjbG9zZSA9IFBBWUxPQURfQVVUT19DTE9TRV9QQUlSU1trZXldO1xuICAgIGlmICghY2xvc2UpIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID8/IDA7XG4gICAgY29uc3QgZW5kID0gdGFyZ2V0LnNlbGVjdGlvbkVuZCA/PyBzdGFydDtcbiAgICBjb25zdCBiZWZvcmUgPSB0aGlzLnBheWxvYWRUZXh0LnNsaWNlKDAsIHN0YXJ0KTtcbiAgICBjb25zdCBhZnRlciA9IHRoaXMucGF5bG9hZFRleHQuc2xpY2UoZW5kKTtcbiAgICBjb25zdCBpbnNlcnRQb3MgPSBzdGFydCArIDE7XG4gICAgY29uc3QgbmV3VmFsdWUgPSBiZWZvcmUgKyBrZXkgKyBjbG9zZSArIGFmdGVyO1xuICAgIHRoaXMucGF5bG9hZFRleHQgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucGF5bG9hZFRleHRhcmVhUmVmPy5uYXRpdmVFbGVtZW50Py5zZXRTZWxlY3Rpb25SYW5nZShpbnNlcnRQb3MsIGluc2VydFBvcyk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKiogVmFsaWRhdGUgcGF5bG9hZCB3aGVuIGZvcm1hdCBpcyBKU09OOyBzZXRzIHBheWxvYWRKc29uRXJyb3Igb3IgY2xlYXJzIGl0LiAqL1xuICB2YWxpZGF0ZVBheWxvYWRKc29uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1BheWxvYWRGb3JtYXRKc29uKSB7XG4gICAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5wYXlsb2FkVGV4dCA/PyAnJztcbiAgICBpZiAodGV4dC50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmV4dHJhY3RQb3NpdGlvbkZyb21Kc29uRXJyb3IobWVzc2FnZSk7XG4gICAgICBjb25zdCB7IGxpbmUsIGNvbHVtbiB9ID0gdGhpcy5wb3NpdGlvblRvTGluZUNvbHVtbih0ZXh0LCBwb3NpdGlvbik7XG4gICAgICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgIGNvbnN0IGxpbmVJbmRleCA9IE1hdGgubWF4KDAsIGxpbmUgLSAxKTtcbiAgICAgIGNvbnN0IGxpbmVDb250ZW50ID0gbGluZXNbbGluZUluZGV4XSA/PyAnJztcbiAgICAgIGNvbnN0IGV4Y2VycHQgPSBsaW5lQ29udGVudCB8fCAnICc7XG4gICAgICBjb25zdCBjYXJldE9mZnNldCA9IGxpbmVJbmRleCA9PT0gbGluZSAtIDEgPyBNYXRoLm1pbihjb2x1bW4gLSAxLCBsaW5lQ29udGVudC5sZW5ndGgpIDogMDtcbiAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IHtcbiAgICAgICAgbGluZSxcbiAgICAgICAgY29sdW1uLFxuICAgICAgICBtZXNzYWdlOiB0aGlzLm5vcm1hbGl6ZUpzb25FcnJvck1lc3NhZ2UobWVzc2FnZSksXG4gICAgICAgIGV4Y2VycHQsXG4gICAgICAgIGNhcmV0T2Zmc2V0LFxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RQb3NpdGlvbkZyb21Kc29uRXJyb3IobWVzc2FnZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBtYXRjaCA9IG1lc3NhZ2UubWF0Y2goL3Bvc2l0aW9uXFxzKyhcXGQrKS9pKSB8fCBtZXNzYWdlLm1hdGNoKC9hdFxccytwb3NpdGlvblxccysoXFxkKykvaSk7XG4gICAgcmV0dXJuIG1hdGNoID8gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKSA6IDA7XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uVG9MaW5lQ29sdW1uKHRleHQ6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IHsgbGluZTogbnVtYmVyOyBjb2x1bW46IG51bWJlciB9IHtcbiAgICBjb25zdCBiZWZvcmUgPSB0ZXh0LnNsaWNlKDAsIE1hdGgubWluKHBvc2l0aW9uLCB0ZXh0Lmxlbmd0aCkpO1xuICAgIGNvbnN0IGxpbmVzID0gYmVmb3JlLnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgY29uc3QgbGluZSA9IGxpbmVzLmxlbmd0aDtcbiAgICBjb25zdCBsYXN0TGluZSA9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID8/ICcnO1xuICAgIHJldHVybiB7IGxpbmUsIGNvbHVtbjogbGFzdExpbmUubGVuZ3RoICsgMSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVKc29uRXJyb3JNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoJ0V4cGVjdGluZycpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoJ2V4cGVjdGluZycpKSByZXR1cm4gbWVzc2FnZTtcbiAgICBjb25zdCB0b2tlbk1hdGNoID0gbWVzc2FnZS5tYXRjaCgvVW5leHBlY3RlZCB0b2tlblxccytbJ1wiXT8oW14nXCJdKylbJ1wiXT8vaSlcbiAgICAgIHx8IG1lc3NhZ2UubWF0Y2goL3VuZXhwZWN0ZWQgY2hhcmFjdGVyLio/KFteXFxzXSspL2kpO1xuICAgIGNvbnN0IHRva2VuID0gdG9rZW5NYXRjaCA/IHRva2VuTWF0Y2hbMV0udHJpbSgpIDogJ3VuZGVmaW5lZCc7XG4gICAgcmV0dXJuIGBFeHBlY3RpbmcgJ1NUUklORycsICdOVU1CRVInLCAnTlVMTCcsICdUUlVFJywgJ0ZBTFNFJywgJ3snLCAnWycsIGdvdCAnJHt0b2tlbn0nYDtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3BheWxvYWRFZGl0b3JXaXRoTGluZXNSZWYnKSBwYXlsb2FkRWRpdG9yV2l0aExpbmVzUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BheWxvYWRUZXh0YXJlYVJlZicpIHBheWxvYWRUZXh0YXJlYVJlZj86IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9IRUFERVJfTkFNRV9PUFRJT05TOiBzdHJpbmdbXSA9IFtcbiAgICAnQWNjZXB0JyxcbiAgICAnQWNjZXB0LUNoYXJzZXQnLFxuICAgICdBY2NlcHQtRW5jb2RpbmcnLFxuICAgICdBY2NlcHQtTGFuZ3VhZ2UnLFxuICAgICdBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LUhlYWRlcnMnLFxuICAgICdBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LU1ldGhvZCcsXG4gICAgJ0F1dGhvcml6YXRpb24nLFxuICAgICdDYWNoZS1Db250cm9sJyxcbiAgICAnQ29udGVudC1NRDUnLFxuICAgICdDb250ZW50LUxlbmd0aCcsXG4gICAgJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLFxuICAgICdDb250ZW50LVR5cGUnLFxuICAgICdDb29raWUnLFxuICAgICdEYXRlJyxcbiAgICAnRXhwZWN0JyxcbiAgICAnRnJvbScsXG4gICAgJ0hvc3QnLFxuICAgICdJZi1NYXRjaCcsXG4gICAgJ0lmLU1vZGlmaWVkLVNpbmNlJyxcbiAgICAnSWYtTm9uZS1NYXRjaCcsXG4gICAgJ0lmLVVubW9kaWZpZWQtU2luY2UnLFxuICAgICdJZi1SYW5nZScsXG4gICAgJ0tlZXAtQWxpdmUnLFxuICAgICdNYXgtRm9yd2FyZHMnLFxuICAgICdPcmlnaW4nLFxuICAgICdQcmFnbWEnLFxuICAgICdQcm94eS1BdXRob3JpemF0aW9uJyxcbiAgICAnUmFuZ2UnLFxuICAgICdSZWZlcmVyJyxcbiAgICAnVEUnLFxuICAgICdUcmFpbGVyJyxcbiAgICAnVHJhbnNmZXItRW5jb2RpbmcnLFxuICAgICdVcGdyYWRlJyxcbiAgICAnVXNlci1BZ2VudCcsXG4gICAgJ1ZpYScsXG4gICAgJ1dhcm5pbmcnLFxuICAgICdYLVJlcXVlc3RlZC1XaXRoJyxcbiAgICAnWC1Eby1Ob3QtVHJhY2snLFxuICAgICdETlQnLFxuICAgICd4LWFwaS1rZXknLFxuICAgICdDb25uZWN0aW9uJyxcbiAgXTtcblxuICAvKiogSGVhZGVyIG5hbWUgb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHdpdGggaWQsIG5hbWUsIHZhbHVlLCBsYWJlbCAocGFzc2VkIGZyb20gcGFyZW50KS4gRmFsbHMgYmFjayB0byBidWlsdC1pbiBsaXN0IHdoZW4gZW1wdHkuICovXG4gIEBJbnB1dCgpIGhlYWRlck5hbWVPcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICAvKiogRm9ybSBhcnJheSBmb3IgaGVhZGVyIHJvd3M7IGVhY2ggaXRlbSBpcyBGb3JtR3JvdXAoeyBuYW1lLCB2YWx1ZSB9KSBmb3IgY3FhLWR5bmFtaWMtc2VsZWN0IGFuZCB2YWx1ZSBpbnB1dCAqL1xuICBoZWFkZXJzRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIC8qKiBUeXBlZCBhY2Nlc3NvciBmb3IgdGVtcGxhdGUgKEZvcm1BcnJheS5jb250cm9scyBpcyBBYnN0cmFjdENvbnRyb2xbXSkgKi9cbiAgZ2V0IGhlYWRlclJvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy5oZWFkZXJzRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogQ29uZmlnIGZvciBoZWFkZXIgbmFtZSBkcm9wZG93biAodXBkYXRlZCB3aGVuIGhlYWRlck5hbWVPcHRpb25zIGNoYW5nZXMgdG8gYXZvaWQgbmV3IHJlZmVyZW5jZSBldmVyeSBDRCkgKi9cbiAgaGVhZGVyTmFtZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ25hbWUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGhlYWRlcicsXG4gICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICBhbGxvd0N1c3RvbVZhbHVlOiB0cnVlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2UgPVxuICAgICAgdGhpcy5oZWFkZXJOYW1lT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuaGVhZGVyTmFtZU9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9IRUFERVJfTkFNRV9PUFRJT05TIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSk7XG4gICAgY29uc3QgYmFzZU9wdGlvbnMgPSBzb3VyY2UubWFwKChoKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihoKSk7XG4gICAgY29uc3QgYmFzZVZhbHVlcyA9IG5ldyBTZXQoYmFzZU9wdGlvbnMubWFwKChvKSA9PiBTdHJpbmcoby52YWx1ZSA/PyBvLmlkID8/ICcnKS50cmltKCkpLmZpbHRlcihCb29sZWFuKSk7XG4gICAgY29uc3QgY3VycmVudE5hbWVzRnJvbUZvcm0gPSB0aGlzLmdldEN1cnJlbnRIZWFkZXJOYW1lc0Zyb21Gb3JtKCk7XG4gICAgY29uc3QgZXh0cmFPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBjdXJyZW50TmFtZXNGcm9tRm9ybSkge1xuICAgICAgY29uc3Qga2V5ID0gbmFtZS50cmltKCk7XG4gICAgICBpZiAoa2V5ICYmICFiYXNlVmFsdWVzLmhhcyhrZXkpKSB7XG4gICAgICAgIGJhc2VWYWx1ZXMuYWRkKGtleSk7XG4gICAgICAgIGV4dHJhT3B0aW9ucy5wdXNoKHsgaWQ6IGtleSwgdmFsdWU6IGtleSwgbmFtZToga2V5LCBsYWJlbDoga2V5IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvcHRpb25zID0gWy4uLmJhc2VPcHRpb25zLCAuLi5leHRyYU9wdGlvbnNdO1xuICAgIHRoaXMuaGVhZGVyTmFtZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuaGVhZGVyTmFtZVNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDb2xsZWN0cyBkaXN0aW5jdCBub24tZW1wdHkgaGVhZGVyIG5hbWVzIGN1cnJlbnRseSBpbiB0aGUgaGVhZGVycyBmb3JtIChmb3IgZHluYW1pYyBvcHRpb25zKS4gKi9cbiAgcHJpdmF0ZSBnZXRDdXJyZW50SGVhZGVyTmFtZXNGcm9tRm9ybSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgbmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGlmICghdGhpcy5oZWFkZXJzRm9ybUFycmF5Py5jb250cm9scz8ubGVuZ3RoKSByZXR1cm4gbmFtZXM7XG4gICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5jb250cm9scykge1xuICAgICAgY29uc3QgbmFtZSA9IChjb250cm9sIGFzIEZvcm1Hcm91cCkuZ2V0KCduYW1lJyk/LnZhbHVlO1xuICAgICAgY29uc3Qgc3RyID0gbmFtZSAhPSBudWxsID8gU3RyaW5nKG5hbWUpLnRyaW0oKSA6ICcnO1xuICAgICAgaWYgKHN0ciAmJiAhc2Vlbi5oYXMoc3RyKSkge1xuICAgICAgICBzZWVuLmFkZChzdHIpO1xuICAgICAgICBuYW1lcy5wdXNoKHN0cik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdEhlYWRlcnM6IEFwaUVkaXRIZWFkZXJSb3dbXSA9IFtcbiAgICB7IG5hbWU6ICdDb250ZW50LVR5cGUnLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICBdO1xuXG4gIC8qKiBGb3JtIGFycmF5IGZvciBrZXktdmFsdWUgcm93cyAoQm9keSBwYXlsb2FkKTsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IGtleSwgdmFsdWUgfSkgKi9cbiAga2V5VmFsdWVGb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IGtleVZhbHVlUm93cygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLmtleVZhbHVlRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogRm9ybSBhcnJheSBmb3Iga2V5LXR5cGUtdmFsdWUgcm93czsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IGtleSwgdHlwZSwgdmFsdWUgfSkgKi9cbiAga2V5VHlwZVZhbHVlRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIGdldCBrZXlUeXBlVmFsdWVSb3dzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMua2V5VHlwZVZhbHVlRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogQ29uZmlnIGZvciBUeXBlIGRyb3Bkb3duIGluIGtleS10eXBlLXZhbHVlIHJvd3MgKFRleHQsIEZpbGUpICovXG4gIHJlYWRvbmx5IGtleVR5cGVWYWx1ZVR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBwbGFjZWhvbGRlcjogJ1RleHQnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgaWQ6ICd0ZXh0JywgdmFsdWU6ICd0ZXh0JywgbmFtZTogJ1RleHQnLCBsYWJlbDogJ1RleHQnIH0sXG4gICAgICB7IGlkOiAnZmlsZScsIHZhbHVlOiAnZmlsZScsIG5hbWU6ICdGaWxlJywgbGFiZWw6ICdGaWxlJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgLyoqIEZvcm0gYXJyYXkgZm9yIHJlc3BvbnNlIGJvZHkgdmVyaWZpY2F0aW9uIHJvd3M7IGVhY2ggaXRlbSBpcyBGb3JtR3JvdXAoeyBqc29uUGF0aCwgdmVyaWZpY2F0aW9uLCBkYXRhVHlwZSwgZXhwZWN0ZWRWYWx1ZSB9KSAqL1xuICB2ZXJpZmljYXRpb25Gb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IHZlcmlmaWNhdGlvblJvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBWZXJpZmljYXRpb24gb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIChwYXNzZWQgZnJvbSBwYXJlbnQpLiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3Qgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgdmVyaWZpY2F0aW9uT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9WRVJJRklDQVRJT05fT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ2VxdWFscycsIHZhbHVlOiAnZXF1YWxzJywgbmFtZTogJ0VxdWFscycsIGxhYmVsOiAnRXF1YWxzJyB9LFxuICAgIHsgaWQ6ICdub3QtZXF1YWwnLCB2YWx1ZTogJ25vdC1lcXVhbCcsIG5hbWU6ICdOb3QgZXF1YWwnLCBsYWJlbDogJ05vdCBlcXVhbCcgfSxcbiAgICB7IGlkOiAnbGVzcy10aGFuJywgdmFsdWU6ICdsZXNzLXRoYW4nLCBuYW1lOiAnTGVzcyB0aGFuJywgbGFiZWw6ICdMZXNzIHRoYW4nIH0sXG4gICAgeyBpZDogJ2dyZWF0ZXItdGhhbicsIHZhbHVlOiAnZ3JlYXRlci10aGFuJywgbmFtZTogJ0dyZWF0ZXIgdGhhbicsIGxhYmVsOiAnR3JlYXRlciB0aGFuJyB9LFxuICAgIHsgaWQ6ICdpcy1udWxsJywgdmFsdWU6ICdpcy1udWxsJywgbmFtZTogJ0lzIG51bGwnLCBsYWJlbDogJ0lzIG51bGwnIH0sXG4gICAgeyBpZDogJ2lzLW5vdC1udWxsJywgdmFsdWU6ICdpcy1ub3QtbnVsbCcsIG5hbWU6ICdJcyBub3QgbnVsbCcsIGxhYmVsOiAnSXMgbm90IG51bGwnIH0sXG4gIF07XG5cbiAgLyoqIENvbmZpZyBmb3IgVmVyaWZpY2F0aW9uIGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gdmVyaWZpY2F0aW9uT3B0aW9ucyBjaGFuZ2VzLCBsaWtlIE1ldGhvZCBkcm9wZG93bikgKi9cbiAgdmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndmVyaWZpY2F0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ0VxdWFscycsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogWy4uLkFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfVkVSSUZJQ0FUSU9OX09QVElPTlNdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgdGhpcy52ZXJpZmljYXRpb25PcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy52ZXJpZmljYXRpb25PcHRpb25zLm1hcCgodikgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24odikpXG4gICAgICAgIDogQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9WRVJJRklDQVRJT05fT1BUSU9OUztcbiAgICB0aGlzLnZlcmlmaWNhdGlvblNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMudmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRWZXJpZmljYXRpb25WYWx1ZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNvdXJjZSA9XG4gICAgICB0aGlzLnZlcmlmaWNhdGlvbk9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnZlcmlmaWNhdGlvbk9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9WRVJJRklDQVRJT05fT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKHYpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFZlcmlmaWNhdGlvbigpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmVyaWZpY2F0aW9uVmFsdWVzKCk7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPiAwID8gdmFsdWVzWzBdIDogJ2VxdWFscyc7XG4gIH1cblxuICAvKiogRGF0YSBUeXBlIG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyAocGFzc2VkIGZyb20gcGFyZW50KS4gRmFsbHMgYmFjayB0byBidWlsdC1pbiBsaXN0IHdoZW4gZW1wdHkuICovXG4gIEBJbnB1dCgpIHZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9EQVRBX1RZUEVfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ3N0cmluZycsIHZhbHVlOiAnc3RyaW5nJywgbmFtZTogJ1N0cmluZycsIGxhYmVsOiAnU3RyaW5nJyB9LFxuICAgIHsgaWQ6ICdudW1iZXInLCB2YWx1ZTogJ251bWJlcicsIG5hbWU6ICdOdW1iZXInLCBsYWJlbDogJ051bWJlcicgfSxcbiAgICB7IGlkOiAnYm9vbGVhbicsIHZhbHVlOiAnYm9vbGVhbicsIG5hbWU6ICdCb29sZWFuJywgbGFiZWw6ICdCb29sZWFuJyB9LFxuICAgIHsgaWQ6ICdhcnJheScsIHZhbHVlOiAnYXJyYXknLCBuYW1lOiAnQXJyYXknLCBsYWJlbDogJ0FycmF5JyB9LFxuICAgIHsgaWQ6ICdvYmplY3QnLCB2YWx1ZTogJ29iamVjdCcsIG5hbWU6ICdPYmplY3QnLCBsYWJlbDogJ09iamVjdCcgfSxcbiAgXTtcblxuICAvKiogQ29uZmlnIGZvciBEYXRhIFR5cGUgZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiB2ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnMgY2hhbmdlcywgbGlrZSBNZXRob2QgZHJvcGRvd24pICovXG4gIHZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZGF0YVR5cGUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU3RyaW5nJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9EQVRBX1RZUEVfT1BUSU9OU10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVWZXJpZmljYXRpb25EYXRhVHlwZVNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID1cbiAgICAgIHRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnMubWFwKChkKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihkKSlcbiAgICAgICAgOiBBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0RBVEFfVFlQRV9PUFRJT05TO1xuICAgIHRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRhVHlwZVZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9EQVRBX1RZUEVfT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKGQpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGQgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdERhdGFUeXBlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXREYXRhVHlwZVZhbHVlcygpO1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlc1swXSA6ICdzdHJpbmcnO1xuICB9XG5cbiAgLyoqIENvbmZpZyBmb3IgRXhwZWN0ZWQgVmFsdWUgd2hlbiBEYXRhIFR5cGUgaXMgQm9vbGVhbiAodHJ1ZS9mYWxzZSBkcm9wZG93bikgKi9cbiAgcmVhZG9ubHkgdmVyaWZpY2F0aW9uRXhwZWN0ZWRWYWx1ZUJvb2xlYW5TZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdleHBlY3RlZFZhbHVlJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyBpZDogJ3RydWUnLCB2YWx1ZTogJ3RydWUnLCBuYW1lOiAndHJ1ZScsIGxhYmVsOiAndHJ1ZScgfSxcbiAgICAgIHsgaWQ6ICdmYWxzZScsIHZhbHVlOiAnZmFsc2UnLCBuYW1lOiAnZmFsc2UnLCBsYWJlbDogJ2ZhbHNlJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgLyoqIEZvcm0gYXJyYXkgZm9yIFN0YXR1cyB0YWIgdmVyaWZpY2F0aW9uIHJvd3M7IGVhY2ggaXRlbSBpcyBGb3JtR3JvdXAoeyB2ZXJpZmljYXRpb24sIGV4cGVjdGVkVmFsdWUgfSkgKi9cbiAgc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIGdldCBzdGF0dXNWZXJpZmljYXRpb25Sb3dzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogQ29uZmlnIGZvciBTdGF0dXMgdGFiIFZlcmlmaWNhdGlvbiBkcm9wZG93biAoRXF1YWxzLCBOb3QgZXF1YWwsIExlc3MgdGhhbiwgR3JlYXRlciB0aGFuKSAqL1xuICAvKiogU3RhdHVzIHRhYiBWZXJpZmljYXRpb24gb3B0aW9ucyAoRXF1YWxzLCBOb3QgZXF1YWwsIGV0Yy4pLiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3Qgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9TVEFUVVNfVkVSSUZJQ0FUSU9OX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdlcXVhbHMnLCB2YWx1ZTogJ2VxdWFscycsIG5hbWU6ICdFcXVhbHMnLCBsYWJlbDogJ0VxdWFscycgfSxcbiAgICB7IGlkOiAnbm90LWVxdWFsJywgdmFsdWU6ICdub3QtZXF1YWwnLCBuYW1lOiAnTm90IGVxdWFsJywgbGFiZWw6ICdOb3QgZXF1YWwnIH0sXG4gICAgeyBpZDogJ2xlc3MtdGhhbicsIHZhbHVlOiAnbGVzcy10aGFuJywgbmFtZTogJ0xlc3MgdGhhbicsIGxhYmVsOiAnTGVzcyB0aGFuJyB9LFxuICAgIHsgaWQ6ICdncmVhdGVyLXRoYW4nLCB2YWx1ZTogJ2dyZWF0ZXItdGhhbicsIG5hbWU6ICdHcmVhdGVyIHRoYW4nLCBsYWJlbDogJ0dyZWF0ZXIgdGhhbicgfSxcbiAgXTtcblxuICAvKiogQ29uZmlnIGZvciBTdGF0dXMgdGFiIFZlcmlmaWNhdGlvbiBkcm9wZG93biAodXBkYXRlZCB3aGVuIHN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnMgY2hhbmdlcykuICovXG4gIHN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3ZlcmlmaWNhdGlvbicsXG4gICAgcGxhY2Vob2xkZXI6ICdFcXVhbHMnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1NUQVRVU19WRVJJRklDQVRJT05fT1BUSU9OU10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnMubWFwKChvKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihvKSlcbiAgICAgICAgOiBBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1NUQVRVU19WRVJJRklDQVRJT05fT1BUSU9OUztcbiAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGF0dXNWZXJpZmljYXRpb25WYWx1ZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNvdXJjZSA9XG4gICAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9TVEFUVVNfVkVSSUZJQ0FUSU9OX09QVElPTlMgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdKTtcbiAgICByZXR1cm4gc291cmNlXG4gICAgICAubWFwKChvKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShvIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRTdGF0dXNWZXJpZmljYXRpb24oKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFN0YXR1c1ZlcmlmaWNhdGlvblZhbHVlcygpO1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlc1swXSA6ICdlcXVhbHMnO1xuICB9XG5cbiAgcmVzcG9uc2VQcmV2aWV3ID0gYGA7XG5cbiAgcHJpdmF0ZSBtZXRob2RDaGFuZ2VzU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGZvcm1hdENoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgaGVhZGVyTmFtZU9wdGlvbnNDaGFuZ2VzU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGVudmlyb25tZW50Rm9ybUNoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgbWV0aG9kRm9ybUNoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBseUluaXRpYWxTdGVwKHRoaXMuaW5pdGlhbFN0ZXApO1xuICAgIHRoaXMudXBkYXRlTWV0aG9kU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgY29uc3QgZmlyc3RNZXRob2RWYWx1ZSA9IHRoaXMuaHR0cE1ldGhvZE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmh0dHBNZXRob2RPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVmYXVsdE1ldGhvZCA9IHRoaXMuaW5pdGlhbE1ldGhvZCA/PyBmaXJzdE1ldGhvZFZhbHVlID8/ICdHRVQnO1xuICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gdHlwZW9mIGRlZmF1bHRNZXRob2QgPT09ICdzdHJpbmcnID8gZGVmYXVsdE1ldGhvZCA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShkZWZhdWx0TWV0aG9kIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKTtcbiAgICB0aGlzLm1ldGhvZEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG1ldGhvZDogW2RlZmF1bHRNZXRob2RdLFxuICAgIH0pO1xuICAgIGNvbnN0IGZpcnN0VmFsdWUgPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuZW52aXJvbm1lbnRPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVmYXVsdEVudiA9IHRoaXMuaW5pdGlhbEVudmlyb25tZW50ID8/IGZpcnN0VmFsdWUgPz8gJ0RldmVsb3BtZW50JztcbiAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gdHlwZW9mIGRlZmF1bHRFbnYgPT09ICdzdHJpbmcnID8gZGVmYXVsdEVudiA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShkZWZhdWx0RW52IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKTtcbiAgICB0aGlzLmVudmlyb25tZW50Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZW52aXJvbm1lbnQ6IFtkZWZhdWx0RW52XSxcbiAgICB9KTtcbiAgICB0aGlzLmVudmlyb25tZW50Rm9ybUNoYW5nZXNTdWIgPSB0aGlzLmVudmlyb25tZW50Rm9ybS5nZXQoJ2Vudmlyb25tZW50Jyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCh2OiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzID0gdiAhPSBudWxsICYmIHYgIT09ICcnID8gKHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodikpIDogJyc7XG4gICAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gcyA/PyAnJztcbiAgICB9KTtcbiAgICB0aGlzLm1ldGhvZEZvcm1DaGFuZ2VzU3ViID0gdGhpcy5tZXRob2RGb3JtLmdldCgnbWV0aG9kJyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCh2OiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzID0gdiAhPSBudWxsICYmIHYgIT09ICcnID8gKHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodikpIDogJyc7XG4gICAgICB0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSA9IHMgPz8gJyc7XG4gICAgfSk7XG4gICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkoXG4gICAgICB0aGlzLmluaXRpYWxIZWFkZXJzID8/IFt7IG5hbWU6ICcnLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6ICcnIH1dXG4gICAgKTtcbiAgICB0aGlzLmhlYWRlck5hbWVPcHRpb25zQ2hhbmdlc1N1YiA9IHRoaXMuaGVhZGVyc0Zvcm1BcnJheT8udmFsdWVDaGFuZ2VzPy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgICB0aGlzLmhlYWRlcnNDaGFuZ2UuZW1pdCh0aGlzLmhlYWRlcnMpO1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMuaGVhZGVyc0NoYW5nZS5lbWl0KHRoaXMuaGVhZGVycyk7XG4gICAgdGhpcy51cGRhdGVFbnZpcm9ubWVudFNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMudXBkYXRlUGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IGZpcnN0Rm9ybWF0VmFsdWUgPSB0aGlzLmdldEZvcm1hdFZhbHVlcygpWzBdO1xuICAgIGNvbnN0IGRlZmF1bHRGb3JtYXQgPSB0aGlzLmluaXRpYWxGb3JtYXQgPz8gZmlyc3RGb3JtYXRWYWx1ZSA/PyAnanNvbic7XG4gICAgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoeyBmb3JtYXQ6IFtkZWZhdWx0Rm9ybWF0XSB9KTtcbiAgICB0aGlzLmJ1aWxkS2V5VmFsdWVGb3JtQXJyYXkoKTtcbiAgICB0aGlzLmJ1aWxkS2V5VHlwZVZhbHVlRm9ybUFycmF5KCk7XG4gICAgdGhpcy51cGRhdGVWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLnVwZGF0ZVZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy5idWlsZFZlcmlmaWNhdGlvbkZvcm1BcnJheSgpO1xuICAgIHRoaXMudXBkYXRlU3RhdHVzVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy5idWlsZFN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheSgpO1xuICAgIHRoaXMubWV0aG9kQ2hhbmdlc1N1YiA9IHRoaXMubWV0aG9kRm9ybS5nZXQoJ21ldGhvZCcpPy52YWx1ZUNoYW5nZXM/LnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgbWV0aG9kID0gdmFsdWUgIT0gbnVsbCA/IFN0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKSA6ICcnO1xuICAgICAgaWYgKE1FVEhPRFNfV0lUSE9VVF9CT0RZLmluY2x1ZGVzKG1ldGhvZCkgJiYgdGhpcy5hY3RpdmVQYXlsb2FkVGFiICE9PSAnaGVhZGVycycpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gJ2hlYWRlcnMnO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5mb3JtYXRDaGFuZ2VzU3ViID0gdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5nZXQoJ2Zvcm1hdCcpPy52YWx1ZUNoYW5nZXM/LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICB9KTtcbiAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldHVwUGF5bG9hZFRleHRhcmVhU2Nyb2xsU3luYygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5tZXRob2RDaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZm9ybWF0Q2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmhlYWRlck5hbWVPcHRpb25zQ2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmVudmlyb25tZW50Rm9ybUNoYW5nZXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5tZXRob2RGb3JtQ2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKiBTeW5jIGxpbmUgbnVtYmVycyBjb2x1bW4gc2Nyb2xsIHdpdGggcGF5bG9hZCB0ZXh0YXJlYSBzY3JvbGwgKFBvc3RtYW4tc3R5bGUpLiAqL1xuICBwcml2YXRlIHNldHVwUGF5bG9hZFRleHRhcmVhU2Nyb2xsU3luYygpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLnBheWxvYWRFZGl0b3JXaXRoTGluZXNSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWhvc3QpIHJldHVybjtcbiAgICAgIGNvbnN0IGxpbmVOdW1iZXJzRWwgPSBob3N0LnF1ZXJ5U2VsZWN0b3IoJy5jcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWxpbmUtbnVtYmVycycpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGNvbnN0IHRleHRhcmVhID0gaG9zdC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgICAgaWYgKCFsaW5lTnVtYmVyc0VsIHx8ICF0ZXh0YXJlYSkgcmV0dXJuO1xuICAgICAgdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgICBsaW5lTnVtYmVyc0VsLnNjcm9sbFRvcCA9IHRleHRhcmVhLnNjcm9sbFRvcDtcbiAgICAgIH0pO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEtleVZhbHVlRm9ybUFycmF5KHJvd3M/OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuICAgIGNvbnN0IGluaXRpYWwgPSByb3dzID8/IFt7IGtleTogJycsIHZhbHVlOiAnJyB9XTtcbiAgICBjb25zdCBncm91cHMgPSBpbml0aWFsLm1hcCgocikgPT4gdGhpcy5mYi5ncm91cCh7IGtleTogW3Iua2V5XSwgdmFsdWU6IFtyLnZhbHVlXSB9KSk7XG4gICAgdGhpcy5rZXlWYWx1ZUZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoZ3JvdXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRLZXlUeXBlVmFsdWVGb3JtQXJyYXkocm93cz86IHsga2V5OiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBjb25zdCBpbml0aWFsID0gcm93cyA/PyBbeyBrZXk6ICcnLCB0eXBlOiAndGV4dCcsIHZhbHVlOiAnJyB9XTtcbiAgICBjb25zdCBncm91cHMgPSBpbml0aWFsLm1hcCgocikgPT4gdGhpcy5mYi5ncm91cCh7IGtleTogW3Iua2V5XSwgdHlwZTogW3IudHlwZV0sIHZhbHVlOiBbci52YWx1ZV0gfSkpO1xuICAgIHRoaXMua2V5VHlwZVZhbHVlRm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShncm91cHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFZlcmlmaWNhdGlvbkZvcm1BcnJheShyb3dzPzogeyBqc29uUGF0aDogc3RyaW5nOyB2ZXJpZmljYXRpb246IHN0cmluZzsgZGF0YVR5cGU6IHN0cmluZzsgZXhwZWN0ZWRWYWx1ZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRWZXJpZmljYXRpb24gPSB0aGlzLmdldERlZmF1bHRWZXJpZmljYXRpb24oKTtcbiAgICBjb25zdCBkZWZhdWx0RGF0YVR5cGUgPSB0aGlzLmdldERlZmF1bHREYXRhVHlwZSgpO1xuICAgIGNvbnN0IGluaXRpYWwgPSByb3dzID8/IFt7IGpzb25QYXRoOiAnJywgdmVyaWZpY2F0aW9uOiBkZWZhdWx0VmVyaWZpY2F0aW9uLCBkYXRhVHlwZTogZGVmYXVsdERhdGFUeXBlLCBleHBlY3RlZFZhbHVlOiAnJyB9XTtcbiAgICBjb25zdCBncm91cHMgPSBpbml0aWFsLm1hcCgocikgPT5cbiAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBqc29uUGF0aDogW3IuanNvblBhdGhdLFxuICAgICAgICB2ZXJpZmljYXRpb246IFtyLnZlcmlmaWNhdGlvbl0sXG4gICAgICAgIGRhdGFUeXBlOiBbci5kYXRhVHlwZV0sXG4gICAgICAgIGV4cGVjdGVkVmFsdWU6IFtyLmV4cGVjdGVkVmFsdWVdLFxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShncm91cHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheShyb3dzPzogeyB2ZXJpZmljYXRpb246IHN0cmluZzsgZXhwZWN0ZWRWYWx1ZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRWZXJpZmljYXRpb24gPSB0aGlzLmdldERlZmF1bHRTdGF0dXNWZXJpZmljYXRpb24oKTtcbiAgICBjb25zdCBpbml0aWFsID0gcm93cyA/PyBbeyB2ZXJpZmljYXRpb246IGRlZmF1bHRWZXJpZmljYXRpb24sIGV4cGVjdGVkVmFsdWU6ICcnIH1dO1xuICAgIGNvbnN0IGdyb3VwcyA9IGluaXRpYWwubWFwKChyKSA9PlxuICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIHZlcmlmaWNhdGlvbjogW3IudmVyaWZpY2F0aW9uXSxcbiAgICAgICAgZXhwZWN0ZWRWYWx1ZTogW3IuZXhwZWN0ZWRWYWx1ZV0sXG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KGdyb3Vwcyk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkSGVhZGVyc0Zvcm1BcnJheShyb3dzOiBBcGlFZGl0SGVhZGVyUm93W10pOiB2b2lkIHtcbiAgICBjb25zdCBncm91cHMgPSByb3dzLm1hcCgoaCkgPT5cbiAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbaC5uYW1lXSxcbiAgICAgICAgdmFsdWU6IFtoLnZhbHVlXSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBpZiAodGhpcy5oZWFkZXJzRm9ybUFycmF5KSB7XG4gICAgICB0aGlzLmhlYWRlcnNGb3JtQXJyYXkuY2xlYXIoKTtcbiAgICAgIGdyb3Vwcy5mb3JFYWNoKChnKSA9PiB0aGlzLmhlYWRlcnNGb3JtQXJyYXkucHVzaChnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVhZGVyc0Zvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoZ3JvdXBzKTtcbiAgICB9XG4gIH1cblxuICAvKiogSGFuZGxlcjogc2hvdyBpbXBvcnQgY1VSTCBwYW5lbCAoY2FsbGVkIHdoZW4gdXNlciBjbGlja3MgXCJJbXBvcnQgQVBJIGNVUkxcIikuICovXG4gIG9wZW5JbXBvcnRDdXJsUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5ib2R5VmlldyA9ICdpbXBvcnQtY3VybCc7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqIEhhbmRsZXI6IGVtaXQgY1VSTCB2YWx1ZSBmcm9tIGNvbnRyb2wgYW5kIGNsb3NlIHBhbmVsLiBDYWxsZWQgd2hlbiB1c2VyIGNsaWNrcyBJbXBvcnQgYnV0dG9uLiAqL1xuICBvbkltcG9ydEN1cmxDb25maXJtKCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbXBvcnRDdXJsQ29udHJvbC52YWx1ZSA/PyAnJztcbiAgICB0aGlzLmltcG9ydEN1cmwuZW1pdCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiAnJyk7XG4gICAgdGhpcy5jbG9zZUltcG9ydEN1cmxQYW5lbCgpO1xuICB9XG5cbiAgLyoqIEhhbmRsZXI6IGVtaXQgY2FuY2VsIGFuZCBjbG9zZSBwYW5lbC4gQ2FsbGVkIHdoZW4gdXNlciBjbGlja3MgQ2FuY2VsIGluIGltcG9ydCBjVVJMIHBhbmVsLiAqL1xuICBvbkNhbmNlbEltcG9ydEN1cmwoKTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRDdXJsQ2FuY2VsLmVtaXQoKTtcbiAgICB0aGlzLmNsb3NlSW1wb3J0Q3VybFBhbmVsKCk7XG4gIH1cblxuICAvKiogSGFuZGxlcjogc2hvdyBoZWFkZXJzIHNlY3Rpb24gKGNhbGxlZCBmcm9tIENhbmNlbCBvciBhZnRlciBJbXBvcnQgaW4gaW1wb3J0IHBhbmVsKS4gKi9cbiAgY2xvc2VJbXBvcnRDdXJsUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5ib2R5VmlldyA9ICdoZWFkZXJzJztcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBvblNlbmRSZXF1ZXN0KCk6IHZvaWQge1xuICAgIGNvbnN0IGVudmlyb25tZW50ID0gdGhpcy5zZWxlY3RlZEVudmlyb25tZW50ICE9IG51bGwgPyBTdHJpbmcodGhpcy5zZWxlY3RlZEVudmlyb25tZW50KSA6ICcnO1xuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuc2VsZWN0ZWRNZXRob2QgIT0gbnVsbCA/IFN0cmluZyh0aGlzLnNlbGVjdGVkTWV0aG9kKSA6ICcnO1xuICAgIHRoaXMuc2VuZFJlcXVlc3QuZW1pdCh7XG4gICAgICBlbnZpcm9ubWVudCxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybDogdGhpcy51cmwgPz8gJycsXG4gICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgfSk7XG4gIH1cblxuICBvblZhcmlhYmxlTmFtZUNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnZhcmlhYmxlTmFtZUVycm9yID0gJyc7XG4gIH1cblxuICBvbkJhY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY3VycmVudFN0ZXAgPiAxKSB7XG4gICAgICB0aGlzLnNldFN0ZXAodGhpcy5jdXJyZW50U3RlcCAtIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJhY2suZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uTmV4dCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJyZW50U3RlcCA9PT0gMiAmJiAhdGhpcy52YXJpYWJsZU5hbWU/LnRyaW0oKSkge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICdWYXJpYWJsZSBOYW1lIGlzIHJlcXVpcmVkLic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmFyaWFibGVOYW1lRXJyb3IgPSAnJztcbiAgICBpZiAodGhpcy5jdXJyZW50U3RlcCA8IHRoaXMuc3RlcExhYmVscy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2V0U3RlcCh0aGlzLmN1cnJlbnRTdGVwICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmV4dC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgc2V0UGF5bG9hZFRhYih2YWx1ZTogQXBpRWRpdFBheWxvYWRUYWIpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgPSB2YWx1ZTtcbiAgfVxuXG4gIHNldFJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiKHZhbHVlOiAncmVzcG9uc2UtYm9keScgfCAnc3RhdHVzJyk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIgPSB2YWx1ZTtcbiAgfVxuXG4gIGFkZEhlYWRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmhlYWRlcnNGb3JtQXJyYXkucHVzaChcbiAgICAgIHRoaXMuZmIuZ3JvdXAoeyBuYW1lOiBbJyddLCB2YWx1ZTogWycnXSB9KVxuICAgICk7XG4gIH1cblxuICByZW1vdmVIZWFkZXIoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gIH1cblxuICAvKiogV2hlbiB1c2VyIGFkZHMgYSBjdXN0b20gaGVhZGVyIG5hbWUgdmlhIHRoZSBkcm9wZG93biBcIkFkZCAn4oCmJ1wiIG9wdGlvbiwgc2V0IHRoZSBjb250cm9sIHZhbHVlLiAqL1xuICBvbkhlYWRlck5hbWVBZGRDdXN0b21WYWx1ZShldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9LCByb3c6IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRyb2wgPSByb3cuZ2V0KGV2ZW50LmtleSk7XG4gICAgaWYgKGNvbnRyb2wgJiYgZXZlbnQudmFsdWUgIT0gbnVsbCkge1xuICAgICAgY29udHJvbC5zZXRWYWx1ZShldmVudC52YWx1ZS50cmltKCkpO1xuICAgIH1cbiAgfVxuXG4gIHRyYWNrQnlIZWFkZXIoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgYWRkS2V5VmFsdWVSb3coKTogdm9pZCB7XG4gICAgdGhpcy5rZXlWYWx1ZUZvcm1BcnJheS5wdXNoKHRoaXMuZmIuZ3JvdXAoeyBrZXk6IFsnJ10sIHZhbHVlOiBbJyddIH0pKTtcbiAgfVxuXG4gIHJlbW92ZUtleVZhbHVlUm93KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmtleVZhbHVlRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIHRyYWNrQnlLZXlWYWx1ZShpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBhZGRLZXlUeXBlVmFsdWVSb3coKTogdm9pZCB7XG4gICAgdGhpcy5rZXlUeXBlVmFsdWVGb3JtQXJyYXkucHVzaCh0aGlzLmZiLmdyb3VwKHsga2V5OiBbJyddLCB0eXBlOiBbJ3RleHQnXSwgdmFsdWU6IFsnJ10gfSkpO1xuICB9XG5cbiAgcmVtb3ZlS2V5VHlwZVZhbHVlUm93KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmtleVR5cGVWYWx1ZUZvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gIH1cblxuICB0cmFja0J5S2V5VHlwZVZhbHVlKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGFkZFZlcmlmaWNhdGlvblJvdygpOiB2b2lkIHtcbiAgICB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheS5wdXNoKFxuICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGpzb25QYXRoOiBbJyddLFxuICAgICAgICB2ZXJpZmljYXRpb246IFt0aGlzLmdldERlZmF1bHRWZXJpZmljYXRpb24oKV0sXG4gICAgICAgIGRhdGFUeXBlOiBbdGhpcy5nZXREZWZhdWx0RGF0YVR5cGUoKV0sXG4gICAgICAgIGV4cGVjdGVkVmFsdWU6IFsnJ10sXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICByZW1vdmVWZXJpZmljYXRpb25Sb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIHRyYWNrQnlWZXJpZmljYXRpb24oaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqIFdoZW4gRGF0YSBUeXBlIGNoYW5nZXMgaW4gUmVzcG9uc2UgQm9keSB2ZXJpZmljYXRpb24sIHJlc2V0IEV4cGVjdGVkIFZhbHVlIGZvciB0aGF0IHJvdy4gKi9cbiAgb25WZXJpZmljYXRpb25EYXRhVHlwZUNoYW5nZShyb3c6IEZvcm1Hcm91cCwgZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnZGF0YVR5cGUnKSB7XG4gICAgICByb3cuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgYWRkU3RhdHVzVmVyaWZpY2F0aW9uUm93KCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5LnB1c2goXG4gICAgICB0aGlzLmZiLmdyb3VwKHsgdmVyaWZpY2F0aW9uOiBbdGhpcy5nZXREZWZhdWx0U3RhdHVzVmVyaWZpY2F0aW9uKCldLCBleHBlY3RlZFZhbHVlOiBbJyddIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZVN0YXR1c1ZlcmlmaWNhdGlvblJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgdHJhY2tCeVN0YXR1c1ZlcmlmaWNhdGlvbihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKiogRW1pdCBhbGwgZW50ZXJlZCBkZXRhaWxzIChlbnZpcm9ubWVudCwgSFRUUCBtZXRob2QsIFVSTCwgaGVhZGVycywgYm9keSwgc3RlcDIgdmFyaWFibGUsIHN0ZXAzIHZlcmlmaWNhdGlvbnMpIHdoZW4gdXNlciBjbGlja3MgQ3JlYXRlLiAqL1xuICBvbkNyZWF0ZSgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnOTk5OTk5OScpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5nZXRDcmVhdGVQYXlsb2FkKCk7XG4gICAgICBjb25zb2xlLmxvZygnOTk5OTk5OSBwYXlsb2FkJywgcGF5bG9hZCk7XG4gICAgICB0aGlzLmNyZWF0ZS5lbWl0KHBheWxvYWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignQXBpRWRpdFN0ZXAgZ2V0Q3JlYXRlUGF5bG9hZCBlcnJvcjonLCBlcnIpO1xuICAgICAgdGhpcy5jcmVhdGUuZW1pdCh0aGlzLmdldENyZWF0ZVBheWxvYWRGYWxsYmFjaygpKTtcbiAgICB9XG4gIH1cblxuICAvKiogTWluaW1hbCBwYXlsb2FkIHdoZW4gZ2V0Q3JlYXRlUGF5bG9hZCB0aHJvd3MgKHNvIGNyZWF0ZSBhbHdheXMgZW1pdHMpLiAqL1xuICBwcml2YXRlIGdldENyZWF0ZVBheWxvYWRGYWxsYmFjaygpOiBBcGlFZGl0Q3JlYXRlUGF5bG9hZCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0ZXAxOiB7XG4gICAgICAgIGVudmlyb25tZW50OiAnJyxcbiAgICAgICAgbWV0aG9kOiAnJyxcbiAgICAgICAgdXJsOiB0aGlzLnVybCA/PyAnJyxcbiAgICAgICAgaGVhZGVyczogW10sXG4gICAgICAgIGFjdGl2ZVBheWxvYWRUYWI6IHRoaXMuYWN0aXZlUGF5bG9hZFRhYixcbiAgICAgICAgcGF5bG9hZFR5cGU6IHRoaXMucGF5bG9hZFR5cGUsXG4gICAgICAgIHBheWxvYWRGb3JtYXQ6ICcnLFxuICAgICAgICBwYXlsb2FkVGV4dDogdGhpcy5wYXlsb2FkVGV4dCA/PyAnJyxcbiAgICAgICAga2V5VmFsdWVSb3dzOiBbXSxcbiAgICAgICAga2V5VHlwZVZhbHVlUm93czogW10sXG4gICAgICB9LFxuICAgICAgc3RlcDI6IHsgdmFyaWFibGVOYW1lOiB0aGlzLnZhcmlhYmxlTmFtZSA/PyAnJyB9LFxuICAgICAgc3RlcDM6IHtcbiAgICAgICAgYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI6IHRoaXMuYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIsXG4gICAgICAgIHJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnM6IFtdLFxuICAgICAgICBzdGF0dXNWZXJpZmljYXRpb25zOiBbXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBOb3JtYWxpemUgZm9ybSBjb250cm9sIHZhbHVlIHRvIHN0cmluZyAoaGFuZGxlcyBvYmplY3Qgb3Igc3RyaW5nKS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q29udHJvbFZhbHVlKGNvbnRyb2w6IHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHYgPSBjb250cm9sPy52YWx1ZTtcbiAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09ICcnKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKSA6IFN0cmluZyh2KTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBmdWxsIGNyZWF0ZSBwYXlsb2FkOiBlbnZpcm9ubWVudCwgSFRUUCBtZXRob2QsIFVSTCwgaGVhZGVycywgYm9keSAoc3RlcDEpLCB2YXJpYWJsZSBuYW1lIChzdGVwMiksIHZlcmlmaWNhdGlvbnMgKHN0ZXAzKS4gKi9cbiAgcHJpdmF0ZSBnZXRDcmVhdGVQYXlsb2FkKCk6IEFwaUVkaXRDcmVhdGVQYXlsb2FkIHtcbiAgICBjb25zdCBlbnZGcm9tRm9ybSA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldENvbnRyb2xWYWx1ZSh0aGlzLmVudmlyb25tZW50Rm9ybT8uZ2V0KCdlbnZpcm9ubWVudCcpIGFzIHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwpO1xuICAgIGNvbnN0IGVudmlyb25tZW50ID1cbiAgICAgIGVudkZyb21Gb3JtICE9PSAnJyA/IGVudkZyb21Gb3JtIDogKHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgIT09ICcnID8gdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA6IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudCk7XG4gICAgY29uc3QgbWV0aG9kRnJvbUZvcm0gPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRDb250cm9sVmFsdWUodGhpcy5tZXRob2RGb3JtPy5nZXQoJ21ldGhvZCcpIGFzIHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwpO1xuICAgIGNvbnN0IG1ldGhvZCA9XG4gICAgICBtZXRob2RGcm9tRm9ybSAhPT0gJycgPyBtZXRob2RGcm9tRm9ybSA6ICh0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSAhPT0gJycgPyB0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSA6IHRoaXMuc2VsZWN0ZWRNZXRob2QpO1xuICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMucGF5bG9hZEZvcm1hdEZvcm0/LmdldCgnZm9ybWF0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGtleVZhbHVlRm9ybUFycmF5ID0gdGhpcy5rZXlWYWx1ZUZvcm1BcnJheTtcbiAgICBjb25zdCBrZXlWYWx1ZVJvd3MgPSAoa2V5VmFsdWVGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKS5tYXAoKGMpID0+ICh7XG4gICAgICBrZXk6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdrZXknKT8udmFsdWUgPz8gJycsXG4gICAgICB2YWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnLFxuICAgIH0pKTtcbiAgICBjb25zdCBrZXlUeXBlVmFsdWVGb3JtQXJyYXkgPSB0aGlzLmtleVR5cGVWYWx1ZUZvcm1BcnJheTtcbiAgICBjb25zdCBrZXlUeXBlVmFsdWVSb3dzID0gKGtleVR5cGVWYWx1ZUZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pLm1hcCgoYykgPT4gKHtcbiAgICAgIGtleTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2tleScpPy52YWx1ZSA/PyAnJyxcbiAgICAgIHR5cGU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd0eXBlJyk/LnZhbHVlID8/ICd0ZXh0JyxcbiAgICAgIHZhbHVlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgndmFsdWUnKT8udmFsdWUgPz8gJycsXG4gICAgfSkpO1xuICAgIGNvbnN0IHZlcmlmaWNhdGlvbkZvcm1BcnJheSA9IHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5O1xuICAgIGNvbnN0IHJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnMgPSAodmVyaWZpY2F0aW9uRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkubWFwKChjKSA9PiAoe1xuICAgICAganNvblBhdGg6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdqc29uUGF0aCcpPy52YWx1ZSA/PyAnJyxcbiAgICAgIHZlcmlmaWNhdGlvbjogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZlcmlmaWNhdGlvbicpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGRhdGFUeXBlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgnZGF0YVR5cGUnKT8udmFsdWUgPz8gJycsXG4gICAgICBleHBlY3RlZFZhbHVlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgnZXhwZWN0ZWRWYWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gICAgY29uc3Qgc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5ID0gdGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXk7XG4gICAgY29uc3Qgc3RhdHVzVmVyaWZpY2F0aW9ucyA9IChzdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKS5tYXAoKGMpID0+ICh7XG4gICAgICB2ZXJpZmljYXRpb246IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2ZXJpZmljYXRpb24nKT8udmFsdWUgPz8gJycsXG4gICAgICBleHBlY3RlZFZhbHVlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgnZXhwZWN0ZWRWYWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0ZXAxOiB7XG4gICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIHVybDogdGhpcy51cmwgPz8gJycsXG4gICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgYWN0aXZlUGF5bG9hZFRhYjogdGhpcy5hY3RpdmVQYXlsb2FkVGFiLFxuICAgICAgICBwYXlsb2FkVHlwZTogdGhpcy5wYXlsb2FkVHlwZSxcbiAgICAgICAgcGF5bG9hZEZvcm1hdDogZm9ybWF0LFxuICAgICAgICBwYXlsb2FkVGV4dDogdGhpcy5wYXlsb2FkVGV4dCA/PyAnJyxcbiAgICAgICAga2V5VmFsdWVSb3dzLFxuICAgICAgICBrZXlUeXBlVmFsdWVSb3dzLFxuICAgICAgfSxcbiAgICAgIHN0ZXAyOiB7XG4gICAgICAgIHZhcmlhYmxlTmFtZTogdGhpcy52YXJpYWJsZU5hbWUgPz8gJycsXG4gICAgICB9LFxuICAgICAgc3RlcDM6IHtcbiAgICAgICAgYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI6IHRoaXMuYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIsXG4gICAgICAgIHJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnMsXG4gICAgICAgIHN0YXR1c1ZlcmlmaWNhdGlvbnMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogQ3VycmVudCBoZWFkZXIgcm93cyBmcm9tIGZvcm0gKGZvciBjb25zdW1lcnMgdGhhdCByZWFkIGhlYWRlcnMpICovXG4gIGdldCBoZWFkZXJzKCk6IEFwaUVkaXRIZWFkZXJSb3dbXSB7XG4gICAgaWYgKCF0aGlzLmhlYWRlcnNGb3JtQXJyYXkpIHJldHVybiBbXTtcbiAgICByZXR1cm4gdGhpcy5oZWFkZXJzRm9ybUFycmF5LmNvbnRyb2xzLm1hcCgoYykgPT4gKHtcbiAgICAgIG5hbWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCduYW1lJyk/LnZhbHVlID8/ICcnLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICB2YWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnLFxuICAgIH0pKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbE1ldGhvZCddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCAmJiB0aGlzLm1ldGhvZEZvcm0pIHtcbiAgICAgIGNvbnN0IHYgPSBjaGFuZ2VzWydpbml0aWFsTWV0aG9kJ10uY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSB0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyB2IDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpO1xuICAgICAgdGhpcy5tZXRob2RGb3JtLnBhdGNoVmFsdWUoeyBtZXRob2Q6IHYgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydodHRwTWV0aG9kT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1ldGhvZFNlbGVjdENvbmZpZygpO1xuICAgICAgaWYgKHRoaXMubWV0aG9kRm9ybSAmJiB0aGlzLmh0dHBNZXRob2RPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMubWV0aG9kRm9ybS5nZXQoJ21ldGhvZCcpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRNZXRob2RWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgdmFsaWQgPSB2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCk7XG4gICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5odHRwTWV0aG9kT3B0aW9uc1swXSk7XG4gICAgICAgICAgaWYgKGZpcnN0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSBmaXJzdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5tZXRob2RGb3JtLnBhdGNoVmFsdWUoeyBtZXRob2Q6IGZpcnN0VmFsdWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsRW52aXJvbm1lbnQnXT8uY3VycmVudFZhbHVlICE9IG51bGwgJiYgdGhpcy5lbnZpcm9ubWVudEZvcm0pIHtcbiAgICAgIGNvbnN0IHYgPSBjaGFuZ2VzWydpbml0aWFsRW52aXJvbm1lbnQnXS5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gdHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKTtcbiAgICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtLnBhdGNoVmFsdWUoeyBlbnZpcm9ubWVudDogdiB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2Vudmlyb25tZW50T3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUVudmlyb25tZW50U2VsZWN0Q29uZmlnKCk7XG4gICAgICBpZiAodGhpcy5lbnZpcm9ubWVudEZvcm0gJiYgdGhpcy5lbnZpcm9ubWVudE9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5lbnZpcm9ubWVudEZvcm0uZ2V0KCdlbnZpcm9ubWVudCcpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRFbnZpcm9ubWVudFZhbHVlcygpO1xuICAgICAgICBjb25zdCB2YWxpZCA9IHZhbHVlcy5pbmNsdWRlcyhjdXJyZW50KTtcbiAgICAgICAgaWYgKCF2YWxpZCkge1xuICAgICAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmVudmlyb25tZW50T3B0aW9uc1swXSk7XG4gICAgICAgICAgaWYgKGZpcnN0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9IGZpcnN0VmFsdWU7XG4gICAgICAgICAgICB0aGlzLmVudmlyb25tZW50Rm9ybS5wYXRjaFZhbHVlKHsgZW52aXJvbm1lbnQ6IGZpcnN0VmFsdWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsU3RlcCddKSB7XG4gICAgICB0aGlzLmFwcGx5SW5pdGlhbFN0ZXAoY2hhbmdlc1snaW5pdGlhbFN0ZXAnXS5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFVybCddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy51cmwgPSBjaGFuZ2VzWydpbml0aWFsVXJsJ10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFBheWxvYWRUYWInXT8uY3VycmVudFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYWN0aXZlUGF5bG9hZFRhYiA9IGNoYW5nZXNbJ2luaXRpYWxQYXlsb2FkVGFiJ10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaGVhZGVyTmFtZU9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsSGVhZGVycyddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkoY2hhbmdlc1snaW5pdGlhbEhlYWRlcnMnXS5jdXJyZW50VmFsdWUgYXMgQXBpRWRpdEhlYWRlclJvd1tdKTtcbiAgICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFJlc3BvbnNlUHJldmlldyddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5yZXNwb25zZVByZXZpZXcgPSBjaGFuZ2VzWydpbml0aWFsUmVzcG9uc2VQcmV2aWV3J10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbEZvcm1hdCddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCAmJiB0aGlzLnBheWxvYWRGb3JtYXRGb3JtKSB7XG4gICAgICB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IGNoYW5nZXNbJ2luaXRpYWxGb3JtYXQnXS5jdXJyZW50VmFsdWUgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydmb3JtYXRPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlUGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZygpO1xuICAgICAgaWYgKHRoaXMucGF5bG9hZEZvcm1hdEZvcm0pIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMucGF5bG9hZEZvcm1hdEZvcm0uZ2V0KCdmb3JtYXQnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0Rm9ybWF0VmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IHZhbGlkID0gdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnQpO1xuICAgICAgICBpZiAoIXZhbGlkICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IHZhbHVlc1swXTtcbiAgICAgICAgICB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IGZpcnN0VmFsdWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZlcmlmaWNhdGlvbk9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmVyaWZpY2F0aW9uVmFsdWVzKCk7XG4gICAgICBjb25zdCBkZWZhdWx0VmVyaWZpY2F0aW9uID0gdGhpcy5nZXREZWZhdWx0VmVyaWZpY2F0aW9uKCk7XG4gICAgICBpZiAodGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSAoY29udHJvbCBhcyBGb3JtR3JvdXApLmdldCgndmVyaWZpY2F0aW9uJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50ICYmICF2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCkpIHtcbiAgICAgICAgICAgIChjb250cm9sIGFzIEZvcm1Hcm91cCkucGF0Y2hWYWx1ZSh7IHZlcmlmaWNhdGlvbjogZGVmYXVsdFZlcmlmaWNhdGlvbiB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlVmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcoKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0RGF0YVR5cGVWYWx1ZXMoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHREYXRhVHlwZSA9IHRoaXMuZ2V0RGVmYXVsdERhdGFUeXBlKCk7XG4gICAgICBpZiAodGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSAoY29udHJvbCBhcyBGb3JtR3JvdXApLmdldCgnZGF0YVR5cGUnKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgJiYgIXZhbHVlcy5pbmNsdWRlcyhjdXJyZW50KSkge1xuICAgICAgICAgICAgKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5wYXRjaFZhbHVlKHsgZGF0YVR5cGU6IGRlZmF1bHREYXRhVHlwZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZygpO1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRTdGF0dXNWZXJpZmljYXRpb25WYWx1ZXMoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWZXJpZmljYXRpb24gPSB0aGlzLmdldERlZmF1bHRTdGF0dXNWZXJpZmljYXRpb24oKTtcbiAgICAgIGlmICh0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheSAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IChjb250cm9sIGFzIEZvcm1Hcm91cCkuZ2V0KCd2ZXJpZmljYXRpb24nKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgJiYgIXZhbHVlcy5pbmNsdWRlcyhjdXJyZW50KSkge1xuICAgICAgICAgICAgKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5wYXRjaFZhbHVlKHsgdmVyaWZpY2F0aW9uOiBkZWZhdWx0VmVyaWZpY2F0aW9uIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtY29udGFpbmVyXCI+XG4gIDwhLS0gVGl0bGUgLS0+XG4gIDxoMlxuICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdGl0bGUgY3FhLWZvbnQtaW50ZXIgY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLVsxMDAlXSBjcWEtdHJhY2tpbmctbm9ybWFsIGNxYS10ZXh0LVsjMDAwMDAwXVwiPlxuICAgIENyZWF0ZSBBUEkgVGVzdCBTdGVwPC9oMj5cblxuICA8IS0tIFN0ZXAgaW5kaWNhdG9yOiBhbGwgdGhyZWUgc3RlcHMgdmlzaWJsZSwgYWN0aXZlIHN0ZXAgaGlnaGxpZ2h0ZWQgKFBvc3RtYW4tc3R5bGUpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW5kaWNhdG9yXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RlcCBvZiBzdGVwTGFiZWxzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIlxuICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvci1pdGVtIGNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvci1pdGVtLS1jbGlja2FibGVcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTdGVwICcgKyBzdGVwLmluZGV4ICsgJzogJyArIHN0ZXAubGFiZWxcIiBbYXR0ci5hcmlhLXByZXNzZWRdPVwic3RlcC5pbmRleCA9PT0gY3VycmVudFN0ZXBcIlxuICAgICAgICAoY2xpY2tlZCk9XCJzZXRTdGVwKHN0ZXAuaW5kZXgpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW5kaWNhdG9yLWNpcmNsZVwiXG4gICAgICAgICAgW2NsYXNzLmNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvci1jaXJjbGUtLWFjdGl2ZV09XCJzdGVwLmluZGV4ID09PSBjdXJyZW50U3RlcFwiPlxuICAgICAgICAgIHt7IHN0ZXAuaW5kZXggfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvci1sYWJlbFwiXG4gICAgICAgICAgW2NsYXNzLmNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvci1sYWJlbC0tYWN0aXZlXT1cInN0ZXAuaW5kZXggPT09IGN1cnJlbnRTdGVwXCI+XG4gICAgICAgICAge3sgc3RlcC5sYWJlbCB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpIDwgc3RlcExhYmVscy5sZW5ndGggLSAxXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbmRpY2F0b3ItbGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cblxuICA8IS0tIFN0ZXAgY29udGVudCB2aWV3cG9ydDogc21vb3RoIHNsaWRlIGJldHdlZW4gc3RlcHMgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12aWV3cG9ydFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdHJpcFwiIFtzdHlsZS50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZVgoJyArIHN0cmlwVHJhbnNsYXRlUGVyY2VudCArICclKSdcIj5cbiAgICAgIDwhLS0gU3RlcCAxOiBFbnZpcm9ubWVudCwgcmVxdWVzdCwgYm9keSwgcmVzcG9uc2UgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGFuZWxcIj5cbiAgICAgICAgPCEtLSBFbnZpcm9ubWVudCByb3c6IG5ldyBsaW5lLCBzZWxlY3QgYWxpZ25lZCByaWdodCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWVudmlyb25tZW50LXJvd1wiPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgKm5nSWY9XCJlbnZpcm9ubWVudEZvcm1cIiBbZm9ybV09XCJlbnZpcm9ubWVudEZvcm1cIiBbY29uZmlnXT1cImVudmlyb25tZW50U2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtZW52aXJvbm1lbnQtc2VsZWN0XCIgYXJpYS1sYWJlbD1cIkVudmlyb25tZW50XCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25FbnZpcm9ubWVudFNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gUmVxdWVzdCByb3c6IG1ldGhvZCwgVVJMLCBidXR0b25zIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcmVxdWVzdC1yb3dcIj5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0ICpuZ0lmPVwibWV0aG9kRm9ybVwiIFtmb3JtXT1cIm1ldGhvZEZvcm1cIiBbY29uZmlnXT1cIm1ldGhvZFNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLW1ldGhvZC1zZWxlY3RcIiBhcmlhLWxhYmVsPVwiSFRUUCBtZXRob2RcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbk1ldGhvZFNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXVybC13cmFwXCI+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbKHZhbHVlKV09XCJ1cmxcIiBbbGFiZWxdPVwiJydcIiBwbGFjZWhvbGRlcj1cIlwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJtZFwiPlxuICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC10cmlnZ2VyXCIgc3R5bGU9XCJkaXNwbGF5OiBjb250ZW50c1wiIChjbGljayk9XCJvcGVuSW1wb3J0Q3VybFBhbmVsKClcIj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiSW1wb3J0IEFQSSBjVVJMXCJcbiAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1idG4tb3V0bGluZSBjcWEtZm9udC1pbnRlciBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzEwMCVdIGNxYS10cmFja2luZy1ub3JtYWwgY3FhLXRleHQtWyM0MTQxNDZdXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJTZW5kIFJlcXVlc3RcIiAoY2xpY2tlZCk9XCJvblNlbmRSZXF1ZXN0KClcIlxuICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1idG4tcHJpbWFyeSBjcWEtZm9udC1pbnRlciBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzEwMCVdIGNxYS10cmFja2luZy1ub3JtYWwgY3FhLXRleHQtWyNGQkZDRkZdXCI+XG4gICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuXG5cbiAgICAgICAgPCEtLSBCb2R5IGNvbnRlbnQ6IGhlYWRlciBzZWN0aW9uIChkZWZhdWx0KSBPUiBpbXBvcnQgY1VSTCBzZWN0aW9uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm9keVZpZXcgPT09ICdpbXBvcnQtY3VybCdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtcGFuZWxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtdGl0bGVcIj5JbXBvcnQgQVBJIGNVUkw8L2gzPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtc2VwYXJhdG9yXCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYm9keVwiPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYSBbdmFsdWVdPVwiaW1wb3J0Q3VybENvbnRyb2wudmFsdWVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJpbXBvcnRDdXJsQ29udHJvbC5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBhc3RlIHlvdXIgY1VSTCBjb21tYW5kIGhlcmUgKGUuZy4sIGN1cmwgLVggUE9TVCBodHRwczovL2FwaS5leGFtcGxlLmNvbS91c2VycylcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFtyb3dzXT1cIjhcIiByZXNpemU9XCJ2ZXJ0aWNhbFwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC10ZXh0YXJlYVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJDYW5jZWxcIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYnRuLWNhbmNlbFwiIChjbGlja2VkKT1cIm9uQ2FuY2VsSW1wb3J0Q3VybCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJJbXBvcnRcIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYnRuLWltcG9ydFwiIChjbGlja2VkKT1cIm9uSW1wb3J0Q3VybENvbmZpcm0oKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm9keVZpZXcgPT09ICdoZWFkZXJzJ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzXCI+XG4gICAgICAgICAgICAgIDxjcWEtYnV0dG9uICpuZ0Zvcj1cImxldCB0YWIgb2YgcGF5bG9hZFRhYnNcIiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbdGV4dF09XCJ0YWIubGFiZWxcIlxuICAgICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtdGFiJyArIChhY3RpdmVQYXlsb2FkVGFiID09PSB0YWIudmFsdWUgPyAnIGNxYS1hcGktZWRpdC1zdGVwLXRhYi0tYWN0aXZlJyA6ICcnKSArIChpc01ldGhvZFdpdGhvdXRCb2R5ICYmIHRhYi52YWx1ZSAhPT0gJ2hlYWRlcnMnID8gJyBjcWEtYXBpLWVkaXQtc3RlcC10YWItLWRpc2FibGVkJyA6ICcnKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTWV0aG9kV2l0aG91dEJvZHkgJiYgdGFiLnZhbHVlICE9PSAnaGVhZGVycydcIlxuICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInNldFBheWxvYWRUYWIodGFiLnZhbHVlKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBQYXlsb2FkIGNvbnRlbnQgKEhlYWRlcnMpIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVBheWxvYWRUYWIgPT09ICdoZWFkZXJzJ1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVycy1ncmlkXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWxhYmVsXCI+SGVhZGVyIE5hbWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWxhYmVsXCI+SGVhZGVyIFZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVycy1sYWJlbCBjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgaGVhZGVyUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUhlYWRlclwiIFtmb3JtR3JvdXBdPVwicm93XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWhlYWRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cInJvd1wiIFtjb25maWddPVwiaGVhZGVyTmFtZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAoYWRkQ3VzdG9tVmFsdWUpPVwib25IZWFkZXJOYW1lQWRkQ3VzdG9tVmFsdWUoJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVyLXR5cGUtc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgndmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIlZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVyLXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiSGVhZGVyIHZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVyLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSBoZWFkZXInXCIgKGNsaWNrZWQpPVwicmVtb3ZlSGVhZGVyKGkpXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVyLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFkZC1oZWFkZXItd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIHRleHQ9XCIrIEFkZCBIZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC1hZGQtaGVhZGVyLWxpbmsnXCIgKGNsaWNrZWQpPVwiYWRkSGVhZGVyKClcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUGF5bG9hZCBjb250ZW50IChCb2R5IG9ubHkpOiB0eXBlLCBmb3JtYXQsIHRleHQgYXJlYSwgQmFjay9OZXh0IC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVBheWxvYWRUYWIgPT09ICdib2R5J1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZCBjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWVkaXRvclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLWxhYmVsXCI+VHlwZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLXJhZGlvc1wiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2wgW3ZhbHVlXT1cInBheWxvYWRUeXBlXCIgW3NlZ21lbnRzXT1cInBheWxvYWRUeXBlU2VnbWVudHNcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25QYXlsb2FkVHlwZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXR5cGUtc2VnbWVudFwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYXlsb2FkVHlwZSA9PT0gJ3JhdydcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZm9ybWF0LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1mb3JtYXQtbGFiZWxcIj5Gb3JtYXQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cInBheWxvYWRGb3JtYXRGb3JtXCIgW2Zvcm1dPVwicGF5bG9hZEZvcm1hdEZvcm1cIlxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cInBheWxvYWRGb3JtYXRTZWxlY3RDb25maWdcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZm9ybWF0LXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGb3JtYXRcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPCEtLSBSYXc6IHRleHQgYXJlYSB3aXRoIGxpbmUgbnVtYmVycyAoUG9zdG1hbi1zdHlsZSBwYXlsb2FkIGJvZHkpIC0tPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGF5bG9hZFR5cGUgPT09ICdyYXcnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWJvZHlcIiAjcGF5bG9hZEVkaXRvcldpdGhMaW5lc1JlZj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1lZGl0b3Itd2l0aC1saW5lc1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtbGluZS1udW1iZXJzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBuIG9mIHBheWxvYWRMaW5lTnVtYmVyc1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1saW5lLW51bVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGF5bG9hZEpzb25FcnJvciAmJiBwYXlsb2FkSnNvbkVycm9yLmxpbmUgPT09IG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWxpbmUtZXJyb3ItaWNvblwiIFt0aXRsZV09XCJwYXlsb2FkSnNvbkVycm9yVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUGFyc2UgZXJyb3Igb24gdGhpcyBsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIGZpbGw9XCIjRUY0NDQ0XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNGw2IDZNMTAgNGwtNiA2XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1saW5lLW51bS10ZXh0XCI+e3sgbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10ZXh0YXJlYS1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhIGNxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4taC0wXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdGV4dGFyZWEtLWVycm9yJzogcGF5bG9hZEpzb25FcnJvcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgI3BheWxvYWRUZXh0YXJlYVJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhLWlucHV0IGNxYS13LWZ1bGwgY3FhLXJlc2l6ZS15IGNxYS1vdXRsaW5lLW5vbmUgY3FhLWJveC1ib3JkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhLWlucHV0LS1lcnJvcic6IHBheWxvYWRKc29uRXJyb3J9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwYXlsb2FkVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5yb3dzXT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1BheWxvYWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCIhIXBheWxvYWRKc29uRXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uUGF5bG9hZElucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25QYXlsb2FkS2V5ZG93bigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cInBheWxvYWRKc29uRXJyb3JcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtanNvbi1lcnJvci1tc2dcIj5cbiAgICAgICAgICAgICAgICAgIEludmFsaWQgSlNPTiBmb3JtYXQuIFBsZWFzZSBjaGVjayB5b3VyIHN5bnRheC5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0geC13d3ctZm9ybS11cmxlbmNvZGVkOiBLZXnigJNWYWx1ZSByb3dzLCBhZGQvcmVtb3ZlIGR5bmFtaWNhbGx5IC0tPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGF5bG9hZFR5cGUgPT09ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWdyaWQgY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWxcIj5LZXk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1sYWJlbFwiPlZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWwgY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2Yga2V5VmFsdWVSb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5S2V5VmFsdWVcIiBbZm9ybUdyb3VwXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCdrZXknKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgna2V5Jyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIktleVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiS2V5XCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgndmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIlZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1kZWxldGUnXCJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSByb3cnXCIgKGNsaWNrZWQpPVwicmVtb3ZlS2V5VmFsdWVSb3coaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1kZWxldGUtaWNvblwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwLjY2NjMgNlYxMi42NjY3SDUuMzMzMDFWNkgxMC42NjYzWk05LjY2NjM0IDJINi4zMzMwMUw1LjY2NjM0IDIuNjY2NjdIMy4zMzMwMVY0SDEyLjY2NjNWMi42NjY2N0gxMC4zMzNMOS42NjYzNCAyWk0xMS45OTk3IDQuNjY2NjdIMy45OTk2N1YxMi42NjY3QzMuOTk5NjcgMTMuNCA0LjU5OTY3IDE0IDUuMzMzMDEgMTRIMTAuNjY2M0MxMS4zOTk3IDE0IDExLjk5OTcgMTMuNCAxMS45OTk3IDEyLjY2NjdWNC42NjY2N1pcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWFkZC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCIrIEFkZCBSb3dcIlxuICAgICAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1hZGQtYnRuXCIgKGNsaWNrZWQpPVwiYWRkS2V5VmFsdWVSb3coKVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIEZvcm0gRGF0YTogS2V54oCTVHlwZeKAk1ZhbHVlIHJvd3M7IFR5cGUgaXMgYSBkcm9wZG93biAoVGV4dC9GaWxlKSwgYWRkL3JlbW92ZSBkeW5hbWljYWxseSAtLT5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBheWxvYWRUeXBlID09PSAnZm9ybS1kYXRhJ1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsXCI+S2V5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbFwiPlR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsXCI+VmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2Yga2V5VHlwZVZhbHVlUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUtleVR5cGVWYWx1ZVwiIFtmb3JtR3JvdXBdPVwicm93XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtcm93XCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgna2V5Jyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2tleScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJLZXlcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiS2V5XCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cInJvd1wiIFtjb25maWddPVwia2V5VHlwZVZhbHVlVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtdHlwZS1zZWxlY3QgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgndmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidSZW1vdmUgcm93J1wiIChjbGlja2VkKT1cInJlbW92ZUtleVR5cGVWYWx1ZVJvdyhpKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjlCRkJGXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWFkZC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCIrIEFkZCBSb3dcIlxuICAgICAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWFkZC1idG5cIiAoY2xpY2tlZCk9XCJhZGRLZXlUeXBlVmFsdWVSb3coKVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIFN0ZXAgMjogVmFyaWFibGUgTmFtZTogaW5wdXQsIHZhbGlkYXRpb24sIEJhY2sgLyBOZXh0IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBhbmVsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12YXJpYWJsZS1zZWN0aW9uXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZhcmlhYmxlLWlucHV0LXdyYXBcIj5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFsodmFsdWUpXT1cInZhcmlhYmxlTmFtZVwiIFtsYWJlbF09XCInJ1wiIHBsYWNlaG9sZGVyPVwiVmFyaWFibGUgTmFtZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIHNpemU9XCJtZFwiICh2YWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlTmFtZUNoYW5nZSgpXCIgYXJpYS1sYWJlbD1cIlZhcmlhYmxlIE5hbWVcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCAqbmdJZj1cInZhcmlhYmxlTmFtZUVycm9yXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12YXJpYWJsZS1lcnJvclwiIHJvbGU9XCJhbGVydFwiPnt7IHZhcmlhYmxlTmFtZUVycm9yIH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBTdGVwIDM6IFJlc3BvbnNlIEJvZHkgLyBTdGF0dXMgdGFicyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYW5lbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdGFicy13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXRhYnNcIj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uICpuZ0Zvcj1cImxldCB0YWIgb2YgcmVzcG9uc2VWZXJpZmljYXRpb25UYWJzXCIgdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW3RleHRdPVwidGFiLmxhYmVsXCJcbiAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC10YWInICsgKGFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiID09PSB0YWIudmFsdWUgPyAnIGNxYS1hcGktZWRpdC1zdGVwLXRhYi0tYWN0aXZlJyA6ICcnKVwiXG4gICAgICAgICAgICAgIChjbGlja2VkKT1cInNldFJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiKHRhYi52YWx1ZSlcIj5cbiAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gUmVzcG9uc2UgQm9keSB0YWIgY29udGVudDogdmVyaWZpY2F0aW9uIGdyaWQgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiID09PSAncmVzcG9uc2UtYm9keSdcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN0ZXAzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24taGVhZGVyLXJvd1wiPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIHRleHQ9XCJBZGQgVmVyaWZpY2F0aW9uXCJcbiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1hZGQtbGlua1wiIChjbGlja2VkKT1cImFkZFZlcmlmaWNhdGlvblJvdygpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWdyaWQgY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWdyaWQtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5TLm5vPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+SlNPTiBQYXRoPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+VmVyaWZpY2F0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+RGF0YSBUeXBlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+RXhwZWN0ZWQgVmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWwgY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgdmVyaWZpY2F0aW9uUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeVZlcmlmaWNhdGlvblwiIFtmb3JtR3JvdXBdPVwicm93XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1yb3dcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1zbm9cIj57eyBpICsgMSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgnanNvblBhdGgnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2pzb25QYXRoJyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIkpzb24gUGF0aFwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBzaXplPVwic21cIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1pbnB1dFwiIGFyaWFMYWJlbD1cIkpTT04gUGF0aFwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cInJvd1wiIFtjb25maWddPVwidmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNlbGVjdCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJyb3dcIiBbY29uZmlnXT1cInZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNlbGVjdCBjcWEtdy1mdWxsXCJcbiAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25WZXJpZmljYXRpb25EYXRhVHlwZUNoYW5nZShyb3csICRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8IS0tIEV4cGVjdGVkIFZhbHVlOiB0ZXh0IGZvciBTdHJpbmcvQXJyYXkvT2JqZWN0LCBudW1iZXIgZm9yIE51bWJlciwgZHJvcGRvd24gZm9yIEJvb2xlYW4gLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicm93LmdldCgnZGF0YVR5cGUnKT8udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgKm5nU3dpdGNoQ2FzZT1cIidib29sZWFuJ1wiIFtmb3JtXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwidmVyaWZpY2F0aW9uRXhwZWN0ZWRWYWx1ZUJvb2xlYW5TZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1zZWxlY3QgY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWV4cGVjdGVkLXNlbGVjdCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0ICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiIFt2YWx1ZV09XCJyb3cuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiRXhwZWN0ZWQgVmFsdWUgKG51bWJlcilcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24taW5wdXQgY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWV4cGVjdGVkLW51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkV4cGVjdGVkIFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCAqbmdTd2l0Y2hEZWZhdWx0IFt2YWx1ZV09XCJyb3cuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRXhwZWN0ZWQgVmFsdWUgaW4gU3RyaW5nXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24taW5wdXRcIiBhcmlhTGFiZWw9XCJFeHBlY3RlZCBWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSByb3cnXCIgKGNsaWNrZWQpPVwicmVtb3ZlVmVyaWZpY2F0aW9uUm93KGkpXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBTdGF0dXMgdGFiIGNvbnRlbnQ6IFMubm8sIFZlcmlmaWNhdGlvbiBkcm9wZG93biwgRXhwZWN0ZWQgVmFsdWUsIGFkZC9yZW1vdmUgcm93cyAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIgPT09ICdzdGF0dXMnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGVwMy1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWhlYWRlci1yb3dcIj5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiB0ZXh0PVwiQWRkIFZlcmlmaWNhdGlvblwiXG4gICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tYWRkLWxpbmtcIiAoY2xpY2tlZCk9XCJhZGRTdGF0dXNWZXJpZmljYXRpb25Sb3coKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+Uy5ubzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPlZlcmlmaWNhdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPkV4cGVjdGVkIFZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbC0tZW1wdHlcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIHN0YXR1c1ZlcmlmaWNhdGlvblJvd3M7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlTdGF0dXNWZXJpZmljYXRpb25cIlxuICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwicm93XCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNub1wiPnt7IGkgKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwicm93XCIgW2NvbmZpZ109XCJzdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uLXNlbGVjdCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiRXhwZWN0ZWQgVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkV4cGVjdGVkIFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSByb3cnXCIgKGNsaWNrZWQpPVwicmVtb3ZlU3RhdHVzVmVyaWZpY2F0aW9uUm93KGkpXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIFJlc3BvbnNlIFByZXZpZXcgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1yZXNwb25zZVwiPlxuICAgIDxoMyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXJlc3BvbnNlLXRpdGxlXCI+UmVzcG9uc2UgUHJldmlldzwvaDM+XG4gICAgPHByZSBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXJlc3BvbnNlLWNvbnRlbnRcIj57eyByZXNwb25zZVByZXZpZXcgfX08L3ByZT5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTdGVwIGFjdGlvbnM6IG9uZSByb3csIGZ1bGwgd2lkdGguIFN0ZXAgMTogQ2FuY2VsICsgTmV4dDsgU3RlcCAyOiBCYWNrICsgTmV4dDsgU3RlcCAzOiBCYWNrICsgQ3JlYXRlIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWN0aW9uc1wiPlxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImN1cnJlbnRTdGVwXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIxXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiQ2FuY2VsXCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLWNhbmNlbFwiIChjbGlja2VkKT1cIm9uQmFjaygpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiTmV4dFwiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1uZXh0XCIgKGNsaWNrZWQpPVwib25OZXh0KClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIyXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiQmFja1wiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1iYWNrXCIgKGNsaWNrZWQpPVwib25CYWNrKClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJOZXh0XCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLW5leHRcIiAoY2xpY2tlZCk9XCJvbk5leHQoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIjNcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJCYWNrXCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLWJhY2tcIiAoY2xpY2tlZCk9XCJvbkJhY2soKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIkNyZWF0ZVwiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1jcmVhdGVcIiAoY2xpY2tlZCk9XCJvbkNyZWF0ZSgpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
1721
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1lZGl0LXN0ZXAvYXBpLWVkaXQtc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1lZGl0LXN0ZXAvYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUEwQixXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7O0FBSWhGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxVQUFVLEVBQUUsWUFBWTtDQUNoQixDQUFDO0FBd0ZYLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBRXZELDhFQUE4RTtBQUM5RSxNQUFNLHdCQUF3QixHQUEyQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQVVwRyxTQUFTLGFBQWEsQ0FBQyxFQUFVO0lBQy9CLE9BQU8sRUFBRSxLQUFLLEdBQUcsSUFBSSxFQUFFLEtBQUssUUFBUSxJQUFJLEVBQUUsS0FBSyxRQUFRLENBQUM7QUFDMUQsQ0FBQztBQUNELFNBQVMsYUFBYSxDQUFDLEVBQVU7SUFDL0IsT0FBTyxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxRQUFR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SztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFHSSxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFFRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUVHLE1BQU07c0JBQWYsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQTRDRSxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBK0JHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFnREcsZUFBZTtzQkFBdkIsS0FBSztnQkFHRyxlQUFlO3NCQUF2QixLQUFLO2dCQWdNRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBaUtrQyx5QkFBeUI7c0JBQWhFLFNBQVM7dUJBQUMsMkJBQTJCO2dCQUNMLGtCQUFrQjtzQkFBbEQsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBK0N0QixpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBc0dHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkE4Q0csMkJBQTJCO3NCQUFuQyxLQUFLO2dCQWdFRyx5QkFBeUI7c0JBQWpDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuXG5leHBvcnQgY29uc3QgQVBJX0VESVRfU1RFUF9MQUJFTFMgPSB7XG4gIFJFUVVFU1RfREVUQUlMUzogJ1JlcXVlc3QgRGV0YWlscycsXG4gIFNUT1JFX1JFU1BPTlNFOiAnU3RvcmUgUmVzcG9uc2UnLFxuICBWQUxJREFUSU9OOiAnVmFsaWRhdGlvbicsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBBcGlFZGl0UGF5bG9hZFRhYiA9ICdoZWFkZXJzJyB8ICdib2R5JyB8ICdwYXJhbXMnIHwgJ2F1dGhvcml6YXRpb24nO1xuXG4vKiogV2hpY2ggYm9keSBjb250ZW50IGJsb2NrIGlzIHZpc2libGU6IGhlYWRlcnMgKHRhYnMpIG9yIGltcG9ydCBjVVJMIHRleHRhcmVhLiAqL1xuZXhwb3J0IHR5cGUgQXBpRWRpdEJvZHlWaWV3ID0gJ2hlYWRlcnMnIHwgJ2ltcG9ydC1jdXJsJztcblxuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0SGVhZGVyUm93IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKiBQYXlsb2FkIGVtaXR0ZWQgd2hlbiB1c2VyIGNsaWNrcyBTZW5kIFJlcXVlc3QgKGVudmlyb25tZW50LCBtZXRob2QsIHVybCwgaGVhZGVycykuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRTZW5kUmVxdWVzdFBheWxvYWQge1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICBtZXRob2Q6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGhlYWRlcnM6IEFwaUVkaXRIZWFkZXJSb3dbXTtcbn1cblxuLyoqIE9BdXRoIDIuMCBhdXRoIGZpZWxkcyAod2hlbiBhdXRoIHR5cGUgaXMgT0F1dGggMi4wKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdE9BdXRoMlBheWxvYWQge1xuICBncmFudFR5cGU6IHN0cmluZztcbiAgYWNjZXNzVG9rZW5Vcmw6IHN0cmluZztcbiAgY2xpZW50SWQ6IHN0cmluZztcbiAgY2xpZW50U2VjcmV0OiBzdHJpbmc7XG4gIHNjb3BlOiBzdHJpbmc7XG4gIGNsaWVudEF1dGhlbnRpY2F0aW9uOiBzdHJpbmc7XG59XG5cbi8qKiBTdGVwIDEgcmVxdWVzdCArIGJvZHkgcGF5bG9hZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFN0ZXAxUGF5bG9hZCB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgaGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdO1xuICAvKiogU2VsZWN0ZWQgYXV0aCB0eXBlOiBlLmcuICduby1hdXRoJywgJ2JlYXJlcicsICdvYXV0aDInLiAqL1xuICBhdXRoVHlwZTogc3RyaW5nO1xuICAvKiogQmVhcmVyIHRva2VuIHZhbHVlIHdoZW4gYXV0aFR5cGUgaXMgJ2JlYXJlcicuICovXG4gIGJlYXJlclRva2VuPzogc3RyaW5nO1xuICAvKiogT0F1dGggMi4wIGZpZWxkcyB3aGVuIGF1dGhUeXBlIGlzICdvYXV0aDInLiAqL1xuICBvYXV0aDI/OiBBcGlFZGl0T0F1dGgyUGF5bG9hZDtcbiAgYWN0aXZlUGF5bG9hZFRhYjogQXBpRWRpdFBheWxvYWRUYWI7XG4gIHBheWxvYWRUeXBlOiAncmF3JyB8ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ2Zvcm0tZGF0YSc7XG4gIHBheWxvYWRGb3JtYXQ6IHN0cmluZztcbiAgcGF5bG9hZFRleHQ6IHN0cmluZztcbiAga2V5VmFsdWVSb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXTtcbiAga2V5VHlwZVZhbHVlUm93czogeyBrZXk6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXTtcbiAgcGFyYW1zUm93czogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W107XG59XG5cbi8qKiBTdGVwIDIgc3RvcmUtcmVzcG9uc2UgcGF5bG9hZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFN0ZXAyUGF5bG9hZCB7XG4gIHZhcmlhYmxlTmFtZTogc3RyaW5nO1xufVxuXG4vKiogUmVzcG9uc2UgYm9keSB2ZXJpZmljYXRpb24gcm93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0UmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9uUm93IHtcbiAganNvblBhdGg6IHN0cmluZztcbiAgdmVyaWZpY2F0aW9uOiBzdHJpbmc7XG4gIGRhdGFUeXBlOiBzdHJpbmc7XG4gIGV4cGVjdGVkVmFsdWU6IHN0cmluZztcbn1cblxuLyoqIFN0YXR1cyB2ZXJpZmljYXRpb24gcm93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0U3RhdHVzVmVyaWZpY2F0aW9uUm93IHtcbiAgdmVyaWZpY2F0aW9uOiBzdHJpbmc7XG4gIGV4cGVjdGVkVmFsdWU6IHN0cmluZztcbn1cblxuLyoqIFN0ZXAgMyB2YWxpZGF0aW9uIHBheWxvYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRTdGVwM1BheWxvYWQge1xuICBhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYjogJ3Jlc3BvbnNlLWJvZHknIHwgJ3N0YXR1cyc7XG4gIHJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnM6IEFwaUVkaXRSZXNwb25zZUJvZHlWZXJpZmljYXRpb25Sb3dbXTtcbiAgc3RhdHVzVmVyaWZpY2F0aW9uczogQXBpRWRpdFN0YXR1c1ZlcmlmaWNhdGlvblJvd1tdO1xufVxuXG4vKiogRnVsbCBwYXlsb2FkIGVtaXR0ZWQgd2hlbiB1c2VyIGNsaWNrcyBDcmVhdGUgKGFsbCBzdGVwc+KAmSBkYXRhKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdENyZWF0ZVBheWxvYWQge1xuICBzdGVwMTogQXBpRWRpdFN0ZXAxUGF5bG9hZDtcbiAgc3RlcDI6IEFwaUVkaXRTdGVwMlBheWxvYWQ7XG4gIHN0ZXAzOiBBcGlFZGl0U3RlcDNQYXlsb2FkO1xufVxuXG4vKiogRW52aXJvbm1lbnQgb3B0aW9uOiBlaXRoZXIgYSBzdHJpbmcgKGRpc3BsYXkgPSB2YWx1ZSkgb3IgYW4gb2JqZWN0IHdpdGggaWQsIG5hbWUsIHZhbHVlLCBsYWJlbC4gKi9cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50T3B0aW9uSW5wdXQgPSBzdHJpbmcgfCBTZWxlY3RPcHRpb247XG5cbmNvbnN0IE1FVEhPRFNfV0lUSE9VVF9CT0RZID0gWydHRVQnLCAnSEVBRCcsICdERUxFVEUnXTtcblxuLyoqIEF1dG8tY2xvc2UgcGFpcnMgZm9yIHBheWxvYWQgSlNPTiBlZGl0b3I6IG9wZW5pbmcgY2hhciAtPiBjbG9zaW5nIGNoYXIuICovXG5jb25zdCBQQVlMT0FEX0FVVE9fQ0xPU0VfUEFJUlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7ICd7JzogJ30nLCAnWyc6ICddJywgJ1wiJzogJ1wiJywgXCInXCI6IFwiJ1wiIH07XG5cbi8qKiBSZXN1bHQgb2YgcGFyc2luZyBhIGNVUkwgY29tbWFuZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkQ3VybCB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgaGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdO1xuICBib2R5OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGlzU2luZ2xlUXVvdGUoY2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2ggPT09IFwiJ1wiIHx8IGNoID09PSAnXFx1MjAxOCcgfHwgY2ggPT09ICdcXHUyMDE5Jztcbn1cbmZ1bmN0aW9uIGlzRG91YmxlUXVvdGUoY2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2ggPT09ICdcIicgfHwgY2ggPT09ICdcXHUyMDFDJyB8fCBjaCA9PT0gJ1xcdTIwMUQnO1xufVxuZnVuY3Rpb24gaXNDbG9zaW5nUXVvdGUoY2g6IHN0cmluZywgb3BlblF1b3RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGlzU2luZ2xlUXVvdGUob3BlblF1b3RlKSkgcmV0dXJuIGlzU2luZ2xlUXVvdGUoY2gpO1xuICBpZiAoaXNEb3VibGVRdW90ZShvcGVuUXVvdGUpKSByZXR1cm4gaXNEb3VibGVRdW90ZShjaCk7XG4gIHJldHVybiBjaCA9PT0gb3BlblF1b3RlO1xufVxuXG4vKipcbiAqIFRva2VuaXplIGEgc3RyaW5nIHJlc3BlY3Rpbmcgc2luZ2xlLSBhbmQgZG91YmxlLXF1b3RlZCBzZWdtZW50cyAoZm9yIGNVUkwgYXJncykuXG4gKiBIYW5kbGVzIHN0cmFpZ2h0IGFuZCBzbWFydC9jdXJseSBxdW90ZXMgc28gcGFzdGVkIGNVUkxzIGZyb20gYnJvd3NlcnMvZG9jcyB3b3JrLlxuICovXG5mdW5jdGlvbiB0b2tlbml6ZUN1cmxMaW5lKGxpbmU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaSA9IDA7XG4gIGNvbnN0IG4gPSBsaW5lLmxlbmd0aDtcbiAgd2hpbGUgKGkgPCBuKSB7XG4gICAgd2hpbGUgKGkgPCBuICYmIC9cXHMvLnRlc3QobGluZVtpXSkpIGkrKztcbiAgICBpZiAoaSA+PSBuKSBicmVhaztcbiAgICBjb25zdCBjaCA9IGxpbmVbaV07XG4gICAgaWYgKGlzU2luZ2xlUXVvdGUoY2gpIHx8IGlzRG91YmxlUXVvdGUoY2gpKSB7XG4gICAgICBjb25zdCBxdW90ZSA9IGNoO1xuICAgICAgaSsrO1xuICAgICAgbGV0IHZhbHVlID0gJyc7XG4gICAgICB3aGlsZSAoaSA8IG4gJiYgIWlzQ2xvc2luZ1F1b3RlKGxpbmVbaV0sIHF1b3RlKSkge1xuICAgICAgICBpZiAobGluZVtpXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgaSsrO1xuICAgICAgICAgIGlmIChpIDwgbikgdmFsdWUgKz0gbGluZVtpKytdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlICs9IGxpbmVbaSsrXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPCBuKSBpKys7XG4gICAgICB0b2tlbnMucHVzaCh2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgbGV0IHdvcmQgPSAnJztcbiAgICB3aGlsZSAoaSA8IG4gJiYgIS9cXHMvLnRlc3QobGluZVtpXSkgJiYgIWlzU2luZ2xlUXVvdGUobGluZVtpXSkgJiYgIWlzRG91YmxlUXVvdGUobGluZVtpXSkpIHtcbiAgICAgIHdvcmQgKz0gbGluZVtpKytdO1xuICAgIH1cbiAgICBpZiAod29yZCkgdG9rZW5zLnB1c2god29yZCk7XG4gIH1cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuLyoqIFN0cmlwIG9uZSBsYXllciBvZiBzdXJyb3VuZGluZyBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyBmcm9tIGEgc3RyaW5nIChlLmcuICd7XCJ4XCI6MX0nIC0+IHtcInhcIjoxfSkuICovXG5mdW5jdGlvbiBzdHJpcFN1cnJvdW5kaW5nUXVvdGVzKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChzLmxlbmd0aCA+PSAyICYmIChzLnN0YXJ0c1dpdGgoXCInXCIpICYmIHMuZW5kc1dpdGgoXCInXCIpKSB8fCAocy5zdGFydHNXaXRoKCdcIicpICYmIHMuZW5kc1dpdGgoJ1wiJykpKSB7XG4gICAgcmV0dXJuIHMuc2xpY2UoMSwgLTEpO1xuICB9XG4gIHJldHVybiBzO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgY1VSTCBjb21tYW5kIHN0cmluZyBhbmQgcmV0dXJuIG1ldGhvZCwgdXJsLCBoZWFkZXJzLCBhbmQgYm9keS5cbiAqIFN1cHBvcnRzIC1YLy0tcmVxdWVzdCwgLUgvLS1oZWFkZXIsIC1kLy0tZGF0YS8tLWRhdGEtcmF3Ly0tZGF0YS1iaW5hcnksIGFuZCBVUkwuXG4gKiBIYW5kbGVzIGxpbmUgY29udGludWF0aW9ucyAoYmFja3NsYXNoLW5ld2xpbmUpIGFuZCBxdW90ZWQgYm9keSBwYXlsb2Fkcy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VDdXJsKGN1cmxTdHJpbmc6IHN0cmluZyk6IFBhcnNlZEN1cmwgfCBudWxsIHtcbiAgY29uc3QgcmF3ID0gKGN1cmxTdHJpbmcgPz8gJycpLnRyaW0oKTtcbiAgaWYgKCFyYXcpIHJldHVybiBudWxsO1xuICAvLyBSZW1vdmUgbGluZSBjb250aW51YXRpb25zIChiYWNrc2xhc2ggZm9sbG93ZWQgYnkgbmV3bGluZSkgc28gdGhleSBkb24ndCBicmVhayB0b2tlbml6YXRpb25cbiAgY29uc3Qgbm9Db250aW51YXRpb25zID0gcmF3LnJlcGxhY2UoL1xcXFxcXHMqXFxyP1xcblxccyovZywgJyAnKTtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vQ29udGludWF0aW9ucy5yZXBsYWNlKC9cXHI/XFxuL2csICcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZUN1cmxMaW5lKG5vcm1hbGl6ZWQpO1xuICBsZXQgbWV0aG9kID0gJ0dFVCc7XG4gIGxldCB1cmwgPSAnJztcbiAgY29uc3QgaGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdID0gW107XG4gIGxldCBib2R5ID0gJyc7XG4gIGNvbnN0IHVybFBhdHRlcm4gPSAvXmh0dHBzPzpcXC9cXC8vaTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0ID0gdG9rZW5zW2ldO1xuICAgIGNvbnN0IGNvbnN1bWVOZXh0ID0gKCkgPT4ge1xuICAgICAgaSsrO1xuICAgICAgcmV0dXJuIHRva2Vuc1tpXTtcbiAgICB9O1xuICAgIGlmICh0ID09PSAnLVgnIHx8IHQgPT09ICctLXJlcXVlc3QnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnN1bWVOZXh0KCk7XG4gICAgICBpZiAodmFsdWUpIG1ldGhvZCA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHQgPT09ICctSCcgfHwgdCA9PT0gJy0taGVhZGVyJykge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb25zdW1lTmV4dCgpO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNvbG9uID0gdmFsdWUuaW5kZXhPZignOicpO1xuICAgICAgICBpZiAoY29sb24gIT09IC0xKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IHZhbHVlLnNsaWNlKDAsIGNvbG9uKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgaGVhZGVyVmFsdWUgPSB2YWx1ZS5zbGljZShjb2xvbiArIDEpLnRyaW0oKTtcbiAgICAgICAgICBpZiAobmFtZSkgaGVhZGVycy5wdXNoKHsgbmFtZSwgdHlwZTogJ3N0cmluZycsIHZhbHVlOiBoZWFkZXJWYWx1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0ID09PSAnLWQnIHx8IHQgPT09ICctLWRhdGEnIHx8IHQgPT09ICctLWRhdGEtcmF3JyB8fCB0ID09PSAnLS1kYXRhLWJpbmFyeScgfHwgdCA9PT0gJy0tZGF0YS1hc2NpaScpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29uc3VtZU5leHQoKTtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICFTdHJpbmcodmFsdWUpLnN0YXJ0c1dpdGgoJ0AnKSkgYm9keSA9IHN0cmlwU3Vycm91bmRpbmdRdW90ZXModmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0LnN0YXJ0c1dpdGgoJy0tZGF0YT0nKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0LnNsaWNlKDcpO1xuICAgICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCdAJykpIGJvZHkgPSBzdHJpcFN1cnJvdW5kaW5nUXVvdGVzKHZhbHVlLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgJycpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodC5zdGFydHNXaXRoKCctLWRhdGEtcmF3PScpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHQuc2xpY2UoMTEpO1xuICAgICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCdAJykpIGJvZHkgPSBzdHJpcFN1cnJvdW5kaW5nUXVvdGVzKHZhbHVlLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgJycpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodC5zdGFydHNXaXRoKCctZCcpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHQubGVuZ3RoID4gMiA/IHQuc2xpY2UoMikgOiBjb25zdW1lTmV4dCgpO1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoJ0AnKSkgYm9keSA9IHN0cmlwU3Vycm91bmRpbmdRdW90ZXModmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh1cmxQYXR0ZXJuLnRlc3QodCkpIHtcbiAgICAgIGlmICghdXJsKSB1cmwgPSB0O1xuICAgIH1cbiAgfVxuICBpZiAoIXVybCkge1xuICAgIGNvbnN0IGZpcnN0VXJsID0gdG9rZW5zLmZpbmQoKHRvaykgPT4gdXJsUGF0dGVybi50ZXN0KHRvaykpO1xuICAgIGlmIChmaXJzdFVybCkgdXJsID0gZmlyc3RVcmw7XG4gIH1cbiAgLy8gTWFueSBjVVJMcyAoZS5nLiBmcm9tIGJyb3dzZXIgZGV2dG9vbHMpIG9taXQgLVggUE9TVCB3aGVuIHNlbmRpbmcgYSBib2R5OyBpbmZlciBQT1NUXG4gIGNvbnN0IGZpbmFsTWV0aG9kID0gKG1ldGhvZCB8fCAnR0VUJykudG9VcHBlckNhc2UoKTtcbiAgaWYgKGJvZHkgJiYgKGZpbmFsTWV0aG9kID09PSAnR0VUJyB8fCBmaW5hbE1ldGhvZCA9PT0gJ0hFQUQnKSkge1xuICAgIHJldHVybiB7IG1ldGhvZDogJ1BPU1QnLCB1cmwsIGhlYWRlcnMsIGJvZHkgfTtcbiAgfVxuICByZXR1cm4geyBtZXRob2Q6IGZpbmFsTWV0aG9kLCB1cmwsIGhlYWRlcnMsIGJvZHkgfTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWFwaS1lZGl0LXN0ZXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0LFxufSlcbmV4cG9ydCBjbGFzcyBBcGlFZGl0U3RlcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBpbml0aWFsTWV0aG9kPzogc3RyaW5nO1xuICBASW5wdXQoKSBpbml0aWFsRW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGluaXRpYWxTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBpbml0aWFsVXJsPzogc3RyaW5nO1xuICBASW5wdXQoKSBpbml0aWFsUGF5bG9hZFRhYj86IEFwaUVkaXRQYXlsb2FkVGFiO1xuICBASW5wdXQoKSBpbml0aWFsSGVhZGVycz86IEFwaUVkaXRIZWFkZXJSb3dbXTtcbiAgQElucHV0KCkgaW5pdGlhbFJlc3BvbnNlUHJldmlldz86IHN0cmluZztcbiAgQElucHV0KCkgaW5pdGlhbFZhcmlhYmxlTmFtZT86IHN0cmluZztcbiAgQElucHV0KCkgZWRpdE1vZGU/OiBib29sZWFuO1xuXG4gIC8qKiBFbWl0cyB0aGUgY1VSTCBzdHJpbmcgd2hlbiB1c2VyIGNsaWNrcyBJbXBvcnQgKHZhbHVlIGZyb20gdGhlIHRleHRhcmVhIGNvbnRyb2wpLiAqL1xuICBAT3V0cHV0KCkgaW1wb3J0Q3VybCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdHMgd2hlbiB1c2VyIGNhbmNlbHMgdGhlIEltcG9ydCBjVVJMIHBhbmVsIChjbGlja3MgQ2FuY2VsKS4gKi9cbiAgQE91dHB1dCgpIGltcG9ydEN1cmxDYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHVzZXIgY2xpY2tzIFNlbmQgUmVxdWVzdCwgd2l0aCBlbnZpcm9ubWVudCwgbWV0aG9kLCB1cmwsIGFuZCBoZWFkZXJzLiAqL1xuICBAT3V0cHV0KCkgc2VuZFJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPEFwaUVkaXRTZW5kUmVxdWVzdFBheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSBiYWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHMgd2hlbiB1c2VyIGNsaWNrcyB0aGUgQ2FuY2VsIGJ1dHRvbiAoc3RlcCAxKS4gKi9cbiAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG5leHQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHVzZXIgY2xpY2tzIENyZWF0ZSB3aXRoIGFsbCBlbnRlcmVkIGRldGFpbHM6IHN0ZXAxIChlbnZpcm9ubWVudCwgSFRUUCBtZXRob2QsIFVSTCwgaGVhZGVycywgYm9keSksIHN0ZXAyICh2YXJpYWJsZSBuYW1lKSwgc3RlcDMgKHZlcmlmaWNhdGlvbnMpLiAqL1xuICBAT3V0cHV0KCkgY3JlYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxBcGlFZGl0Q3JlYXRlUGF5bG9hZD4oKTtcbiAgLyoqIEVtaXRzIHdoZW5ldmVyIGhlYWRlcnMgY2hhbmdlIChhZGQsIHJlbW92ZSwgb3IgZWRpdCkgc28gdGhlIHBhcmVudCBjYW4gcmVmbGVjdCB0aGVtIGluIHRoZSBjYW52YXMvY29udHJvbHMuICovXG4gIEBPdXRwdXQoKSBoZWFkZXJzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcGlFZGl0SGVhZGVyUm93W10+KCk7XG5cbiAgLyoqIEZvcm0gY29udHJvbCBmb3IgSW1wb3J0IGNVUkwgdGV4dGFyZWE7IHZhbHVlIGlzIGVtaXR0ZWQgd2hlbiB1c2VyIGNsaWNrcyBJbXBvcnQuICovXG4gIHJlYWRvbmx5IGltcG9ydEN1cmxDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnKTtcblxuICB2YXJpYWJsZU5hbWUgPSAnJztcbiAgdmFyaWFibGVOYW1lRXJyb3IgPSAnJztcblxuICAvKiogQ29udHJvbHMgd2hpY2ggYm9keSBjb250ZW50IGlzIHZpc2libGU6IGhlYWRlcnMgKGRlZmF1bHQpIG9yIGltcG9ydC1jdXJsLiAqL1xuICBib2R5VmlldzogQXBpRWRpdEJvZHlWaWV3ID0gJ2hlYWRlcnMnO1xuXG4gIHJlYWRvbmx5IHN0ZXBMYWJlbHMgPSBbXG4gICAgeyBpbmRleDogMSwgbGFiZWw6IEFQSV9FRElUX1NURVBfTEFCRUxTLlJFUVVFU1RfREVUQUlMUyB9LFxuICAgIHsgaW5kZXg6IDIsIGxhYmVsOiBBUElfRURJVF9TVEVQX0xBQkVMUy5TVE9SRV9SRVNQT05TRSB9LFxuICAgIHsgaW5kZXg6IDMsIGxhYmVsOiBBUElfRURJVF9TVEVQX0xBQkVMUy5WQUxJREFUSU9OIH0sXG4gIF07XG4gIGN1cnJlbnRTdGVwID0gMTtcblxuICAvKiogVGhlIGxhYmVsIGZvciB0aGUgY3VycmVudCBzdGVwIG9ubHkgKHVzZWQgd2hlbiBzaG93aW5nIGEgc2luZ2xlIHN0ZXAgaW4gdGhlIGluZGljYXRvcikuICovXG4gIGdldCBhY3RpdmVTdGVwTGFiZWwoKTogeyBpbmRleDogbnVtYmVyOyBsYWJlbDogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0ZXBMYWJlbHNbdGhpcy5jdXJyZW50U3RlcCAtIDFdO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtaW5TdGVwID0gMTtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTdGVwID0gMztcblxuICAvKiogUGVyY2VudGFnZSB0byB0cmFuc2xhdGUgdGhlIHN0ZXAgc3RyaXAgKDAsIC0zMy4zMzMsIC02Ni42NjYpIGZvciBDU1MgdHJhbnNpdGlvbi4gKi9cbiAgZ2V0IHN0cmlwVHJhbnNsYXRlUGVyY2VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5jdXJyZW50U3RlcCAtIDEpICogLTMzLjMzMztcbiAgfVxuXG4gIHNldFN0ZXAoc3RlcDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHN0ZXAgPj0gdGhpcy5taW5TdGVwICYmIHN0ZXAgPD0gdGhpcy5tYXhTdGVwKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTdGVwID0gc3RlcDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5SW5pdGlhbFN0ZXAodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47XG4gICAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWF4KHRoaXMubWluU3RlcCwgTWF0aC5taW4odGhpcy5tYXhTdGVwLCBNYXRoLmZsb29yKHZhbHVlKSkpO1xuICAgIHRoaXMuY3VycmVudFN0ZXAgPSBjbGFtcGVkO1xuICB9XG5cbiAgLyoqIEhUVFAgbWV0aG9kIG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB3aXRoIGlkLCBuYW1lLCB2YWx1ZSwgbGFiZWwgKHBhc3NlZCBmcm9tIHBhcmVudCkuICovXG4gIEBJbnB1dCgpIGh0dHBNZXRob2RPcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICAvKiogRm9ybSBmb3IgSFRUUCBtZXRob2Qgc2VsZWN0IChjcWEtZHluYW1pYy1zZWxlY3QpICovXG4gIG1ldGhvZEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIENvbmZpZyBmb3IgbWV0aG9kIGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gaHR0cE1ldGhvZE9wdGlvbnMgY2hhbmdlcyB0byBhdm9pZCBuZXcgcmVmZXJlbmNlIGV2ZXJ5IENEKSAqL1xuICBtZXRob2RTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdtZXRob2QnLFxuICAgIHBsYWNlaG9sZGVyOiAnTWV0aG9kJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZU1ldGhvZFNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnMgPz8gW10pLm1hcCgobSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24obSkpO1xuICAgIHRoaXMubWV0aG9kU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5tZXRob2RTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldE1ldGhvZFZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuICh0aGlzLmh0dHBNZXRob2RPcHRpb25zID8/IFtdKVxuICAgICAgLm1hcCgobSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUobSkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIC8qKiBGb3JtIGZvciBlbnZpcm9ubWVudCBzZWxlY3QgKGNxYS1keW5hbWljLXNlbGVjdCkgKi9cbiAgZW52aXJvbm1lbnRGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBFbnZpcm9ubWVudCBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgd2l0aCBpZCwgbmFtZSwgdmFsdWUsIGxhYmVsIChwYXNzZWQgZnJvbSBwYXJlbnQpLiAqL1xuICBASW5wdXQoKSBlbnZpcm9ubWVudE9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIC8qKiBDb25maWcgZm9yIGVudmlyb25tZW50IGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gZW52aXJvbm1lbnRPcHRpb25zIGNoYW5nZXMgdG8gYXZvaWQgbmV3IHJlZmVyZW5jZSBldmVyeSBDRCkgKi9cbiAgZW52aXJvbm1lbnRTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdlbnZpcm9ubWVudCcsXG4gICAgcGxhY2Vob2xkZXI6ICdFbnZpcm9ubWVudCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdG9TZWxlY3RPcHRpb24oaXRlbTogRW52aXJvbm1lbnRPcHRpb25JbnB1dCk6IFNlbGVjdE9wdGlvbiB7XG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgaWQ6IGl0ZW0sIHZhbHVlOiBpdGVtLCBuYW1lOiBpdGVtLCBsYWJlbDogaXRlbSB9O1xuICAgIH1cbiAgICBjb25zdCBvID0gaXRlbSBhcyBTZWxlY3RPcHRpb247XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBvLmlkID8/IG8udmFsdWUsXG4gICAgICB2YWx1ZTogby52YWx1ZSA/PyBvLmlkLFxuICAgICAgbmFtZTogby5uYW1lID8/IG8ubGFiZWwgPz8gU3RyaW5nKG8udmFsdWUgPz8gby5pZCksXG4gICAgICBsYWJlbDogby5sYWJlbCA/PyBvLm5hbWUgPz8gU3RyaW5nKG8udmFsdWUgPz8gby5pZCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldE9wdGlvblZhbHVlKGl0ZW06IEVudmlyb25tZW50T3B0aW9uSW5wdXQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHJldHVybiBpdGVtO1xuICAgIGNvbnN0IG8gPSBpdGVtIGFzIFNlbGVjdE9wdGlvbjtcbiAgICBjb25zdCB2ID0gby52YWx1ZSA/PyBvLmlkO1xuICAgIHJldHVybiB2ICE9IG51bGwgPyBTdHJpbmcodikgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVudmlyb25tZW50U2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSAodGhpcy5lbnZpcm9ubWVudE9wdGlvbnMgPz8gW10pLm1hcCgoZSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24oZSkpO1xuICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbnZpcm9ubWVudFZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuICh0aGlzLmVudmlyb25tZW50T3B0aW9ucyA/PyBbXSlcbiAgICAgIC5tYXAoKGUpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGUpKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICAvKiogRm9ybSBmb3IgQXV0aCBUeXBlIHNlbGVjdCAoQXV0aG9yaXphdGlvbiB0YWIpICovXG4gIGF1dGhUeXBlRm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogQXV0aCB0eXBlIG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB3aXRoIGlkLCBuYW1lLCB2YWx1ZSwgbGFiZWwgKHBhc3NlZCBmcm9tIHBhcmVudCkuIEZhbGxzIGJhY2sgdG8gYnVpbHQtaW4gbGlzdCB3aGVuIGVtcHR5LiAqL1xuICBASW5wdXQoKSBhdXRoVHlwZU9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIC8qKiBJbml0aWFsIGF1dGggdHlwZSAoc3RyaW5nIG9yIG9wdGlvbiBvYmplY3QpLiBXaGVuIG5vdCBzZXQsIGZpcnN0IG9mIGF1dGhUeXBlT3B0aW9ucyBvciBkZWZhdWx0IFwiTm8gQXV0aFwiIGlzIHVzZWQuICovXG4gIEBJbnB1dCgpIGluaXRpYWxBdXRoVHlwZT86IHN0cmluZyB8IEVudmlyb25tZW50T3B0aW9uSW5wdXQ7XG5cbiAgLyoqIERlZmF1bHQgb3B0aW9ucyB3aGVuIGF1dGhUeXBlT3B0aW9ucyBpcyBlbXB0eSAoc2FtZSBzaGFwZSBhcyBlbnZpcm9ubWVudCkgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9BVVRIX1RZUEVfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ25vLWF1dGgnLCB2YWx1ZTogJ25vLWF1dGgnLCBuYW1lOiAnTm8gQXV0aCcsIGxhYmVsOiAnTm8gQXV0aCcgfSxcbiAgICB7IGlkOiAnYmVhcmVyJywgdmFsdWU6ICdiZWFyZXInLCBuYW1lOiAnQmVhcmVyIFRva2VuJywgbGFiZWw6ICdCZWFyZXIgVG9rZW4nIH0sXG4gICAgeyBpZDogJ29hdXRoMicsIHZhbHVlOiAnb2F1dGgyJywgbmFtZTogJ09BdXRoIDIuMCcsIGxhYmVsOiAnT0F1dGggMi4wJyB9LFxuICBdO1xuXG4gIC8qKiBDb25maWcgZm9yIEF1dGggVHlwZSBkcm9wZG93biAodXBkYXRlZCB3aGVuIGF1dGhUeXBlT3B0aW9ucyBjaGFuZ2VzLCBsaWtlIGVudmlyb25tZW50KSAqL1xuICBhdXRoVHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2F1dGhUeXBlJyxcbiAgICBwbGFjZWhvbGRlcjogJ05vIEF1dGgnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlQXV0aFR5cGVTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0aGlzLmF1dGhUeXBlT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuYXV0aFR5cGVPcHRpb25zLm1hcCgoYSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24oYSkpXG4gICAgICAgIDogWy4uLkFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfQVVUSF9UWVBFX09QVElPTlNdO1xuICAgIHRoaXMuYXV0aFR5cGVTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmF1dGhUeXBlU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdXRoVHlwZVZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMuYXV0aFR5cGVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5hdXRoVHlwZU9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9BVVRIX1RZUEVfT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKGEpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGEgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IGF1dGggdHlwZSB2YWx1ZSAoZS5nLiAnbm8tYXV0aCcpIGZvciB0ZW1wbGF0ZSAqL1xuICBnZXQgc2VsZWN0ZWRBdXRoVHlwZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHYgPSB0aGlzLmF1dGhUeXBlRm9ybT8uZ2V0KCdhdXRoVHlwZScpPy52YWx1ZTtcbiAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09ICcnKSByZXR1cm4gJ25vLWF1dGgnO1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyAodj8udmFsdWUgPz8gdj8uaWQgPz8gJ25vLWF1dGgnKSA6IFN0cmluZyh2KTtcbiAgfVxuXG4gIC8qKiBCZWFyZXIgdG9rZW4gdmFsdWUgKEF1dGhvcml6YXRpb24gdGFiLCB3aGVuIGF1dGggdHlwZSBpcyBCZWFyZXIgVG9rZW4pLiAqL1xuICBiZWFyZXJUb2tlbiA9ICcnO1xuXG4gIC8qKiBGb3JtIGZvciBPQXV0aCAyLjAgZmllbGRzIChBdXRob3JpemF0aW9uIHRhYiB3aGVuIGF1dGggdHlwZSBpcyBPQXV0aCAyLjApLiAqL1xuICBvYXV0aDJGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBHcmFudCB0eXBlIG9wdGlvbnMgZm9yIE9BdXRoIDIuMCAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBPQVVUSF9HUkFOVF9UWVBFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdjbGllbnRfY3JlZGVudGlhbHMnLCB2YWx1ZTogJ2NsaWVudF9jcmVkZW50aWFscycsIG5hbWU6ICdDbGllbnQgQ3JlZGVudGlhbHMnLCBsYWJlbDogJ0NsaWVudCBDcmVkZW50aWFscycgfSxcbiAgICB7IGlkOiAnYXV0aG9yaXphdGlvbl9jb2RlJywgdmFsdWU6ICdhdXRob3JpemF0aW9uX2NvZGUnLCBuYW1lOiAnQXV0aG9yaXphdGlvbiBDb2RlJywgbGFiZWw6ICdBdXRob3JpemF0aW9uIENvZGUnIH0sXG4gICAgeyBpZDogJ3Bhc3N3b3JkJywgdmFsdWU6ICdwYXNzd29yZCcsIG5hbWU6ICdQYXNzd29yZCcsIGxhYmVsOiAnUGFzc3dvcmQnIH0sXG4gICAgeyBpZDogJ2ltcGxpY2l0JywgdmFsdWU6ICdpbXBsaWNpdCcsIG5hbWU6ICdJbXBsaWNpdCcsIGxhYmVsOiAnSW1wbGljaXQnIH0sXG4gIF07XG5cbiAgLyoqIENsaWVudCBhdXRoZW50aWNhdGlvbiBtZXRob2Qgb3B0aW9ucyBmb3IgT0F1dGggMi4wICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE9BVVRIX0NMSUVOVF9BVVRIX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdiYXNpYycsIHZhbHVlOiAnYmFzaWMnLCBuYW1lOiAnU2VuZCBhcyBCYXNpYyBBdXRoIGhlYWRlcicsIGxhYmVsOiAnU2VuZCBhcyBCYXNpYyBBdXRoIGhlYWRlcicgfSxcbiAgICB7IGlkOiAnYm9keScsIHZhbHVlOiAnYm9keScsIG5hbWU6ICdTZW5kIGluIGJvZHknLCBsYWJlbDogJ1NlbmQgaW4gYm9keScgfSxcbiAgXTtcblxuICByZWFkb25seSBvYXV0aDJHcmFudFR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdncmFudFR5cGUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGdyYW50IHR5cGUnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5PQVVUSF9HUkFOVF9UWVBFX09QVElPTlNdLFxuICB9O1xuXG4gIHJlYWRvbmx5IG9hdXRoMkNsaWVudEF1dGhTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdjbGllbnRBdXRoZW50aWNhdGlvbicsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgbWV0aG9kJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuT0FVVEhfQ0xJRU5UX0FVVEhfT1BUSU9OU10sXG4gIH07XG5cbiAgLyoqIEN1cnJlbnQgSFRUUCBtZXRob2QgKGZyb20gZm9ybSBvciBkZWZhdWx0OiBmaXJzdCBvZiBodHRwTWV0aG9kT3B0aW9ucykuIFRyZWF0cyBlbXB0eSBzdHJpbmcgYXMgdW5zZXQuICovXG4gIGdldCBzZWxlY3RlZE1ldGhvZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5tZXRob2RGb3JtPy5nZXQoJ21ldGhvZCcpPy52YWx1ZTtcbiAgICBjb25zdCBmaXJzdFZhbHVlID0gdGhpcy5odHRwTWV0aG9kT3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnNbMF0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXNvbHZlZCA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09ICcnID8gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2YWx1ZSBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA6IFN0cmluZyh2YWx1ZSkpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXNvbHZlZCA/PyBmaXJzdFZhbHVlID8/ICdHRVQnO1xuICB9XG4gIHNldCBzZWxlY3RlZE1ldGhvZCh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLm1ldGhvZEZvcm0/LnBhdGNoVmFsdWUoeyBtZXRob2Q6IHYgfSk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoZSBzZWxlY3RlZCBIVFRQIG1ldGhvZCBpcyBHRVQsIEhFQUQsIG9yIERFTEVURSAobm8gcmVxdWVzdCBib2R5KS4gKi9cbiAgZ2V0IGlzTWV0aG9kV2l0aG91dEJvZHkoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5zZWxlY3RlZE1ldGhvZCAhPSBudWxsID8gU3RyaW5nKHRoaXMuc2VsZWN0ZWRNZXRob2QpLnRvVXBwZXJDYXNlKCkgOiAnJztcbiAgICByZXR1cm4gTUVUSE9EU19XSVRIT1VUX0JPRFkuaW5jbHVkZXMobWV0aG9kKTtcbiAgfVxuXG4gIC8qKiBDYWNoZWQgZW52aXJvbm1lbnQgdmFsdWUgZnJvbSBsYXN0IHNlbGVjdGlvbiAoc28gQ3JlYXRlIHBheWxvYWQgaGFzIHRoZSBzZWxlY3RlZCB2YWx1ZSkuICovXG4gIHByaXZhdGUgY3VycmVudEVudmlyb25tZW50VmFsdWUgPSAnJztcblxuICAvKiogQ2FjaGVkIEhUVFAgbWV0aG9kIGZyb20gbGFzdCBzZWxlY3Rpb24gKHNvIENyZWF0ZSBwYXlsb2FkIGhhcyB0aGUgc2VsZWN0ZWQgdmFsdWUpLiAqL1xuICBwcml2YXRlIGN1cnJlbnRNZXRob2RWYWx1ZSA9ICcnO1xuXG4gIC8qKiBDdXJyZW50IGVudmlyb25tZW50IChmcm9tIGZvcm0gb3IgZGVmYXVsdDogZmlyc3Qgb2YgZW52aXJvbm1lbnRPcHRpb25zKS4gVHJlYXRzIGVtcHR5IHN0cmluZyBhcyB1bnNldC4gKi9cbiAgZ2V0IHNlbGVjdGVkRW52aXJvbm1lbnQoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZW52aXJvbm1lbnRGb3JtPy5nZXQoJ2Vudmlyb25tZW50Jyk/LnZhbHVlO1xuICAgIGNvbnN0IGZpcnN0VmFsdWUgPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuZW52aXJvbm1lbnRPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSAnJyA/ICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodmFsdWUgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodmFsdWUpKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZWQgPz8gZmlyc3RWYWx1ZSA/PyAnRGV2ZWxvcG1lbnQnO1xuICB9XG4gIHNldCBzZWxlY3RlZEVudmlyb25tZW50KHY6IHN0cmluZykge1xuICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtPy5wYXRjaFZhbHVlKHsgZW52aXJvbm1lbnQ6IHYgfSk7XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBzZWxlY3RzIGFuIGVudmlyb25tZW50OyBrZWVwcyBjdXJyZW50RW52aXJvbm1lbnRWYWx1ZSBpbiBzeW5jIGZvciBjcmVhdGUgcGF5bG9hZC4gKi9cbiAgb25FbnZpcm9ubWVudFNlbGVjdGlvbkNoYW5nZShldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfSk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSBldmVudC52YWx1ZTtcbiAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID1cbiAgICAgIHYgIT0gbnVsbFxuICAgICAgICA/IHR5cGVvZiB2ID09PSAnb2JqZWN0J1xuICAgICAgICAgID8gKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpXG4gICAgICAgICAgOiBTdHJpbmcodilcbiAgICAgICAgOiAnJztcbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiB1c2VyIHNlbGVjdHMgYW4gSFRUUCBtZXRob2Q7IGtlZXBzIGN1cnJlbnRNZXRob2RWYWx1ZSBpbiBzeW5jIGZvciBjcmVhdGUgcGF5bG9hZC4gKi9cbiAgb25NZXRob2RTZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gZXZlbnQudmFsdWU7XG4gICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPVxuICAgICAgdiAhPSBudWxsXG4gICAgICAgID8gdHlwZW9mIHYgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJylcbiAgICAgICAgICA6IFN0cmluZyh2KVxuICAgICAgICA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXJsID0gJyc7XG5cbiAgLyoqIFVSTCBmb3IgdGhlIHJlcXVlc3QuIEdldHRlci9zZXR0ZXIgc3luY3MgcXVlcnkgcGFyYW1zIHdpdGggdGhlIFBhcmFtcyB0YWIgKFBvc3RtYW4tc3R5bGUpLiAqL1xuICBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuICBzZXQgdXJsKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBuZXh0ID0gdmFsdWUgPz8gJyc7XG4gICAgaWYgKHRoaXMuX3VybCA9PT0gbmV4dCkgcmV0dXJuO1xuICAgIHRoaXMuX3VybCA9IG5leHQ7XG4gICAgaWYgKHRoaXMucGFyYW1zRm9ybUFycmF5KSB7XG4gICAgICB0aGlzLnBhcmFtc1N5bmNpbmdGcm9tVXJsID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3luY1BhcmFtc0Zyb21VcmwoKTtcbiAgICAgIHRoaXMucGFyYW1zU3luY2luZ0Zyb21VcmwgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogV2hlbiB0cnVlLCBwYXJhbXMgZm9ybSBjaGFuZ2VzIHNob3VsZCBub3QgdXBkYXRlIHRoZSBVUkwgKHdlJ3JlIHN5bmNpbmcgZnJvbSBVUkwpLiAqL1xuICBwcml2YXRlIHBhcmFtc1N5bmNpbmdGcm9tVXJsID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgcGF5bG9hZFRhYnM6IHsgdmFsdWU6IEFwaUVkaXRQYXlsb2FkVGFiOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtcbiAgICB7IHZhbHVlOiAnYXV0aG9yaXphdGlvbicsIGxhYmVsOiAnQXV0aG9yaXphdGlvbicgfSxcbiAgICB7IHZhbHVlOiAnaGVhZGVycycsIGxhYmVsOiAnSGVhZGVycycgfSxcbiAgICB7IHZhbHVlOiAnYm9keScsIGxhYmVsOiAnQm9keScgfSxcbiAgICB7IHZhbHVlOiAncGFyYW1zJywgbGFiZWw6ICdQYXJhbXMnIH0sXG4gIF07XG4gIGFjdGl2ZVBheWxvYWRUYWI6IEFwaUVkaXRQYXlsb2FkVGFiID0gJ2hlYWRlcnMnO1xuXG4gIC8qKiBTdGVwIDM6IFJlc3BvbnNlIHZlcmlmaWNhdGlvbiB0YWJzICovXG4gIHJlYWRvbmx5IHJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiczogeyB2YWx1ZTogJ3Jlc3BvbnNlLWJvZHknIHwgJ3N0YXR1cyc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW1xuICAgIHsgdmFsdWU6ICdyZXNwb25zZS1ib2R5JywgbGFiZWw6ICdSZXNwb25zZSBCb2R5JyB9LFxuICAgIHsgdmFsdWU6ICdzdGF0dXMnLCBsYWJlbDogJ1N0YXR1cycgfSxcbiAgXTtcbiAgYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI6ICdyZXNwb25zZS1ib2R5JyB8ICdzdGF0dXMnID0gJ3Jlc3BvbnNlLWJvZHknO1xuXG4gIC8qKiBQYXlsb2FkIHR5cGUgZm9yIEJvZHkvUGFyYW1zL0F1dGhvcml6YXRpb246IHJhdywgeC13d3ctZm9ybS11cmxlbmNvZGVkLCBmb3JtLWRhdGEgKi9cbiAgcGF5bG9hZFR5cGU6ICdyYXcnIHwgJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfCAnZm9ybS1kYXRhJyA9ICdyYXcnO1xuXG4gIC8qKiBTZWdtZW50IG9wdGlvbnMgZm9yIHBheWxvYWQgdHlwZSAodXNlZCBieSBjcWEtc2VnbWVudC1jb250cm9sKSAqL1xuICByZWFkb25seSBwYXlsb2FkVHlwZVNlZ21lbnRzID0gW1xuICAgIHsgbGFiZWw6ICdSYXcnLCB2YWx1ZTogJ3JhdycgfSxcbiAgICB7IGxhYmVsOiAneC13d3ctZm9ybS11cmxlbmNvZGVkJywgdmFsdWU6ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIH0sXG4gICAgeyBsYWJlbDogJ0Zvcm0gRGF0YScsIHZhbHVlOiAnZm9ybS1kYXRhJyB9LFxuICBdO1xuXG4gIG9uUGF5bG9hZFR5cGVDaGFuZ2UodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnBheWxvYWRUeXBlID0gdmFsIGFzICdyYXcnIHwgJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfCAnZm9ybS1kYXRhJztcbiAgfVxuXG4gIC8qKiBGb3JtIGZvciBGb3JtYXQgc2VsZWN0IChCb2R5L1BhcmFtcy9BdXRob3JpemF0aW9uKSAqL1xuICBwYXlsb2FkRm9ybWF0Rm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogRm9ybWF0IG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyAocGFzc2VkIGZyb20gcGFyZW50KS4gRmFsbHMgYmFjayB0byBKU09OLCBYTUwsIEhUTUwsIFRleHQgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgZm9ybWF0T3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgQElucHV0KCkgaW5pdGlhbEZvcm1hdD86IHN0cmluZztcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0ZPUk1BVF9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAnanNvbicsIHZhbHVlOiAnanNvbicsIG5hbWU6ICdKU09OJywgbGFiZWw6ICdKU09OJyB9LFxuICAgIHsgaWQ6ICd4bWwnLCB2YWx1ZTogJ3htbCcsIG5hbWU6ICdYTUwnLCBsYWJlbDogJ1hNTCcgfSxcbiAgICB7IGlkOiAnaHRtbCcsIHZhbHVlOiAnaHRtbCcsIG5hbWU6ICdIVE1MJywgbGFiZWw6ICdIVE1MJyB9LFxuICAgIHsgaWQ6ICd0ZXh0JywgdmFsdWU6ICd0ZXh0JywgbmFtZTogJ1RleHQnLCBsYWJlbDogJ1RleHQnIH0sXG4gIF07XG5cbiAgLyoqIENvbmZpZyBmb3IgRm9ybWF0IGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gZm9ybWF0T3B0aW9ucyBjaGFuZ2VzLCBsaWtlIE1ldGhvZCBkcm9wZG93bikgKi9cbiAgcGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2Zvcm1hdCcsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVF9PUFRJT05TXSxcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZVBheWxvYWRGb3JtYXRTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0aGlzLmZvcm1hdE9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLmZvcm1hdE9wdGlvbnMubWFwKChmKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihmKSlcbiAgICAgICAgOiBBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVF9PUFRJT05TO1xuICAgIHRoaXMucGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMucGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rm9ybWF0VmFsdWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzb3VyY2UgPVxuICAgICAgdGhpcy5mb3JtYXRPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5mb3JtYXRPcHRpb25zXG4gICAgICAgIDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfRk9STUFUX09QVElPTlMgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdKTtcbiAgICByZXR1cm4gc291cmNlXG4gICAgICAubWFwKChmKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShmIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICAvKiogUGF5bG9hZCB0ZXh0IGFyZWEgdmFsdWUgZm9yIEJvZHkvUGFyYW1zL0F1dGhvcml6YXRpb24gKi9cbiAgcGF5bG9hZFRleHQgPSAnJztcblxuICAvKiogSlNPTiBwYXJzZSBlcnJvciB3aGVuIGZvcm1hdCBpcyBKU09OIGFuZCBwYXlsb2FkIGlzIGludmFsaWQ7IG51bGwgd2hlbiB2YWxpZCBvciBub3QgSlNPTi4gKi9cbiAgcGF5bG9hZEpzb25FcnJvcjoge1xuICAgIGxpbmU6IG51bWJlcjtcbiAgICBjb2x1bW46IG51bWJlcjtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgZXhjZXJwdDogc3RyaW5nO1xuICAgIGNhcmV0T2Zmc2V0OiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICAvKiogTGluZSBudW1iZXJzIGZvciBwYXlsb2FkIHRleHRhcmVhICgxLCAyLCAzLCAuLi4pIGJhc2VkIG9uIGN1cnJlbnQgbGluZSBjb3VudC4gKi9cbiAgZ2V0IHBheWxvYWRMaW5lTnVtYmVycygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgbiA9IE1hdGgubWF4KDEsICh0aGlzLnBheWxvYWRUZXh0IHx8ICcnKS5zcGxpdCgvXFxyP1xcbi8pLmxlbmd0aCk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IG4gfSwgKF8sIGkpID0+IGkgKyAxKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGN1cnJlbnQgcGF5bG9hZCBmb3JtYXQgaXMgSlNPTiAoc28gd2UgdmFsaWRhdGUgYW5kIHNob3cgSlNPTiBlZGl0b3IgYmVoYXZpb3IpLiAqL1xuICBnZXQgaXNQYXlsb2FkRm9ybWF0SnNvbigpOiBib29sZWFuIHtcbiAgICBjb25zdCBmb3JtYXQgPSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtPy5nZXQoJ2Zvcm1hdCcpPy52YWx1ZTtcbiAgICByZXR1cm4gZm9ybWF0ID09PSAnanNvbic7XG4gIH1cblxuICAvKiogRXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBwYXlsb2FkIHRleHRhcmVhIChyZWQgYm9yZGVyICsgYm90dG9tIGxpbmUpLiAqL1xuICBnZXQgcGF5bG9hZEpzb25FcnJvcnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnBheWxvYWRKc29uRXJyb3IgPyBbJ0ludmFsaWQgSlNPTiBmb3JtYXQuIFBsZWFzZSBjaGVjayB5b3VyIHN5bnRheC4nXSA6IFtdO1xuICB9XG5cbiAgLyoqIFRvb2x0aXAgY29udGVudCBmb3IgdGhlIGxpbmUtbGV2ZWwgZXJyb3IgaWNvbiAocGFyc2UgZXJyb3Igb24gbGluZSBYLCBleGNlcnB0LCBjYXJldCwgbWVzc2FnZSkuICovXG4gIGdldCBwYXlsb2FkSnNvbkVycm9yVG9vbHRpcCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5wYXlsb2FkSnNvbkVycm9yKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZSA9IHRoaXMucGF5bG9hZEpzb25FcnJvcjtcbiAgICBjb25zdCBjYXJldCA9ICcgJy5yZXBlYXQoZS5jYXJldE9mZnNldCkgKyAnXic7XG4gICAgcmV0dXJuIGBQYXJzZSBlcnJvciBvbiBsaW5lICR7ZS5saW5lfTpcXG5cXG4ke2UuZXhjZXJwdH1cXG4ke2NhcmV0fVxcblxcbiR7ZS5tZXNzYWdlfWA7XG4gIH1cblxuICBvblBheWxvYWRUZXh0Q2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnBheWxvYWRUZXh0ID0gdmFsdWU7XG4gICAgdGhpcy52YWxpZGF0ZVBheWxvYWRKc29uKCk7XG4gIH1cblxuICBvblBheWxvYWRJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudCB8IG51bGw7XG4gICAgdGhpcy5vblBheWxvYWRUZXh0Q2hhbmdlKHRhcmdldD8udmFsdWUgPz8gJycpO1xuICB9XG5cbiAgb25QYXlsb2FkS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1BheWxvYWRGb3JtYXRKc29uKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gZXZlbnQua2V5O1xuICAgIGNvbnN0IGNsb3NlID0gUEFZTE9BRF9BVVRPX0NMT1NFX1BBSVJTW2tleV07XG4gICAgaWYgKCFjbG9zZSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3Qgc3RhcnQgPSB0YXJnZXQuc2VsZWN0aW9uU3RhcnQgPz8gMDtcbiAgICBjb25zdCBlbmQgPSB0YXJnZXQuc2VsZWN0aW9uRW5kID8/IHN0YXJ0O1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucGF5bG9hZFRleHQuc2xpY2UoMCwgc3RhcnQpO1xuICAgIGNvbnN0IGFmdGVyID0gdGhpcy5wYXlsb2FkVGV4dC5zbGljZShlbmQpO1xuICAgIGNvbnN0IGluc2VydFBvcyA9IHN0YXJ0ICsgMTtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IGJlZm9yZSArIGtleSArIGNsb3NlICsgYWZ0ZXI7XG4gICAgdGhpcy5wYXlsb2FkVGV4dCA9IG5ld1ZhbHVlO1xuICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5wYXlsb2FkVGV4dGFyZWFSZWY/Lm5hdGl2ZUVsZW1lbnQ/LnNldFNlbGVjdGlvblJhbmdlKGluc2VydFBvcywgaW5zZXJ0UG9zKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZSBwYXlsb2FkIHdoZW4gZm9ybWF0IGlzIEpTT047IHNldHMgcGF5bG9hZEpzb25FcnJvciBvciBjbGVhcnMgaXQuICovXG4gIHZhbGlkYXRlUGF5bG9hZEpzb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUGF5bG9hZEZvcm1hdEpzb24pIHtcbiAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRleHQgPSB0aGlzLnBheWxvYWRUZXh0ID8/ICcnO1xuICAgIGlmICh0ZXh0LnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgdGhpcy5wYXlsb2FkSnNvbkVycm9yID0gbnVsbDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZXh0cmFjdFBvc2l0aW9uRnJvbUpzb25FcnJvcihtZXNzYWdlKTtcbiAgICAgIGNvbnN0IHsgbGluZSwgY29sdW1uIH0gPSB0aGlzLnBvc2l0aW9uVG9MaW5lQ29sdW1uKHRleHQsIHBvc2l0aW9uKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgvXFxyP1xcbi8pO1xuICAgICAgY29uc3QgbGluZUluZGV4ID0gTWF0aC5tYXgoMCwgbGluZSAtIDEpO1xuICAgICAgY29uc3QgbGluZUNvbnRlbnQgPSBsaW5lc1tsaW5lSW5kZXhdID8/ICcnO1xuICAgICAgY29uc3QgZXhjZXJwdCA9IGxpbmVDb250ZW50IHx8ICcgJztcbiAgICAgIGNvbnN0IGNhcmV0T2Zmc2V0ID0gbGluZUluZGV4ID09PSBsaW5lIC0gMSA/IE1hdGgubWluKGNvbHVtbiAtIDEsIGxpbmVDb250ZW50Lmxlbmd0aCkgOiAwO1xuICAgICAgdGhpcy5wYXlsb2FkSnNvbkVycm9yID0ge1xuICAgICAgICBsaW5lLFxuICAgICAgICBjb2x1bW4sXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMubm9ybWFsaXplSnNvbkVycm9yTWVzc2FnZShtZXNzYWdlKSxcbiAgICAgICAgZXhjZXJwdCxcbiAgICAgICAgY2FyZXRPZmZzZXQsXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFBvc2l0aW9uRnJvbUpzb25FcnJvcihtZXNzYWdlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IG1hdGNoID0gbWVzc2FnZS5tYXRjaCgvcG9zaXRpb25cXHMrKFxcZCspL2kpIHx8IG1lc3NhZ2UubWF0Y2goL2F0XFxzK3Bvc2l0aW9uXFxzKyhcXGQrKS9pKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBwYXJzZUludChtYXRjaFsxXSwgMTApIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ub0xpbmVDb2x1bW4odGV4dDogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKTogeyBsaW5lOiBudW1iZXI7IGNvbHVtbjogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRleHQuc2xpY2UoMCwgTWF0aC5taW4ocG9zaXRpb24sIHRleHQubGVuZ3RoKSk7XG4gICAgY29uc3QgbGluZXMgPSBiZWZvcmUuc3BsaXQoL1xccj9cXG4vKTtcbiAgICBjb25zdCBsaW5lID0gbGluZXMubGVuZ3RoO1xuICAgIGNvbnN0IGxhc3RMaW5lID0gbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPz8gJyc7XG4gICAgcmV0dXJuIHsgbGluZSwgY29sdW1uOiBsYXN0TGluZS5sZW5ndGggKyAxIH07XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUpzb25FcnJvck1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAobWVzc2FnZS5pbmNsdWRlcygnRXhwZWN0aW5nJykgfHwgbWVzc2FnZS5pbmNsdWRlcygnZXhwZWN0aW5nJykpIHJldHVybiBtZXNzYWdlO1xuICAgIGNvbnN0IHRva2VuTWF0Y2ggPSBtZXNzYWdlLm1hdGNoKC9VbmV4cGVjdGVkIHRva2VuXFxzK1snXCJdPyhbXidcIl0rKVsnXCJdPy9pKVxuICAgICAgfHwgbWVzc2FnZS5tYXRjaCgvdW5leHBlY3RlZCBjaGFyYWN0ZXIuKj8oW15cXHNdKykvaSk7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbk1hdGNoID8gdG9rZW5NYXRjaFsxXS50cmltKCkgOiAndW5kZWZpbmVkJztcbiAgICByZXR1cm4gYEV4cGVjdGluZyAnU1RSSU5HJywgJ05VTUJFUicsICdOVUxMJywgJ1RSVUUnLCAnRkFMU0UnLCAneycsICdbJywgZ290ICcke3Rva2VufSdgO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgncGF5bG9hZEVkaXRvcldpdGhMaW5lc1JlZicpIHBheWxvYWRFZGl0b3JXaXRoTGluZXNSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgncGF5bG9hZFRleHRhcmVhUmVmJykgcGF5bG9hZFRleHRhcmVhUmVmPzogRWxlbWVudFJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PjtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0hFQURFUl9OQU1FX09QVElPTlM6IHN0cmluZ1tdID0gW1xuICAgICdBY2NlcHQnLFxuICAgICdBY2NlcHQtQ2hhcnNldCcsXG4gICAgJ0FjY2VwdC1FbmNvZGluZycsXG4gICAgJ0FjY2VwdC1MYW5ndWFnZScsXG4gICAgJ0FjY2Vzcy1Db250cm9sLVJlcXVlc3QtSGVhZGVycycsXG4gICAgJ0FjY2Vzcy1Db250cm9sLVJlcXVlc3QtTWV0aG9kJyxcbiAgICAnU2NyaXB0cycsXG4gICAgJ0NhY2hlLUNvbnRyb2wnLFxuICAgICdDb250ZW50LU1ENScsXG4gICAgJ0NvbnRlbnQtTGVuZ3RoJyxcbiAgICAnQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycsXG4gICAgJ0NvbnRlbnQtVHlwZScsXG4gICAgJ0Nvb2tpZScsXG4gICAgJ0RhdGUnLFxuICAgICdFeHBlY3QnLFxuICAgICdGcm9tJyxcbiAgICAnSG9zdCcsXG4gICAgJ0lmLU1hdGNoJyxcbiAgICAnSWYtTW9kaWZpZWQtU2luY2UnLFxuICAgICdJZi1Ob25lLU1hdGNoJyxcbiAgICAnSWYtVW5tb2RpZmllZC1TaW5jZScsXG4gICAgJ0lmLVJhbmdlJyxcbiAgICAnS2VlcC1BbGl2ZScsXG4gICAgJ01heC1Gb3J3YXJkcycsXG4gICAgJ09yaWdpbicsXG4gICAgJ1ByYWdtYScsXG4gICAgJ1Byb3h5LUF1dGhvcml6YXRpb24nLFxuICAgICdSYW5nZScsXG4gICAgJ1JlZmVyZXInLFxuICAgICdURScsXG4gICAgJ1RyYWlsZXInLFxuICAgICdUcmFuc2Zlci1FbmNvZGluZycsXG4gICAgJ1VwZ3JhZGUnLFxuICAgICdVc2VyLUFnZW50JyxcbiAgICAnVmlhJyxcbiAgICAnV2FybmluZycsXG4gICAgJ1gtUmVxdWVzdGVkLVdpdGgnLFxuICAgICdYLURvLU5vdC1UcmFjaycsXG4gICAgJ0ROVCcsXG4gICAgJ3gtYXBpLWtleScsXG4gICAgJ0Nvbm5lY3Rpb24nLFxuICBdO1xuXG4gIC8qKiBIZWFkZXIgbmFtZSBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgd2l0aCBpZCwgbmFtZSwgdmFsdWUsIGxhYmVsIChwYXNzZWQgZnJvbSBwYXJlbnQpLiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3Qgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgaGVhZGVyTmFtZU9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIC8qKiBGb3JtIGFycmF5IGZvciBoZWFkZXIgcm93czsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IG5hbWUsIHZhbHVlIH0pIGZvciBjcWEtZHluYW1pYy1zZWxlY3QgYW5kIHZhbHVlIGlucHV0ICovXG4gIGhlYWRlcnNGb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgLyoqIFR5cGVkIGFjY2Vzc29yIGZvciB0ZW1wbGF0ZSAoRm9ybUFycmF5LmNvbnRyb2xzIGlzIEFic3RyYWN0Q29udHJvbFtdKSAqL1xuICBnZXQgaGVhZGVyUm93cygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLmhlYWRlcnNGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBDb25maWcgZm9yIGhlYWRlciBuYW1lIGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gaGVhZGVyTmFtZU9wdGlvbnMgY2hhbmdlcyB0byBhdm9pZCBuZXcgcmVmZXJlbmNlIGV2ZXJ5IENEKSAqL1xuICBoZWFkZXJOYW1lU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnbmFtZScsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgaGVhZGVyJyxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIGFsbG93Q3VzdG9tVmFsdWU6IHRydWUsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IHNvdXJjZSA9XG4gICAgICB0aGlzLmhlYWRlck5hbWVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5oZWFkZXJOYW1lT3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0hFQURFUl9OQU1FX09QVElPTlMgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdKTtcbiAgICBjb25zdCBiYXNlT3B0aW9ucyA9IHNvdXJjZS5tYXAoKGgpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LnRvU2VsZWN0T3B0aW9uKGgpKTtcbiAgICBjb25zdCBiYXNlVmFsdWVzID0gbmV3IFNldChiYXNlT3B0aW9ucy5tYXAoKG8pID0+IFN0cmluZyhvLnZhbHVlID8/IG8uaWQgPz8gJycpLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICBjb25zdCBjdXJyZW50TmFtZXNGcm9tRm9ybSA9IHRoaXMuZ2V0Q3VycmVudEhlYWRlck5hbWVzRnJvbUZvcm0oKTtcbiAgICBjb25zdCBleHRyYU9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW107XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIGN1cnJlbnROYW1lc0Zyb21Gb3JtKSB7XG4gICAgICBjb25zdCBrZXkgPSBuYW1lLnRyaW0oKTtcbiAgICAgIGlmIChrZXkgJiYgIWJhc2VWYWx1ZXMuaGFzKGtleSkpIHtcbiAgICAgICAgYmFzZVZhbHVlcy5hZGQoa2V5KTtcbiAgICAgICAgZXh0cmFPcHRpb25zLnB1c2goeyBpZDoga2V5LCB2YWx1ZToga2V5LCBuYW1lOiBrZXksIGxhYmVsOiBrZXkgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnMgPSBbLi4uYmFzZU9wdGlvbnMsIC4uLmV4dHJhT3B0aW9uc107XG4gICAgdGhpcy5oZWFkZXJOYW1lU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5oZWFkZXJOYW1lU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIENvbGxlY3RzIGRpc3RpbmN0IG5vbi1lbXB0eSBoZWFkZXIgbmFtZXMgY3VycmVudGx5IGluIHRoZSBoZWFkZXJzIGZvcm0gKGZvciBkeW5hbWljIG9wdGlvbnMpLiAqL1xuICBwcml2YXRlIGdldEN1cnJlbnRIZWFkZXJOYW1lc0Zyb21Gb3JtKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBuYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgaWYgKCF0aGlzLmhlYWRlcnNGb3JtQXJyYXk/LmNvbnRyb2xzPy5sZW5ndGgpIHJldHVybiBuYW1lcztcbiAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5oZWFkZXJzRm9ybUFycmF5LmNvbnRyb2xzKSB7XG4gICAgICBjb25zdCBuYW1lID0gKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5nZXQoJ25hbWUnKT8udmFsdWU7XG4gICAgICBjb25zdCBzdHIgPSBuYW1lICE9IG51bGwgPyBTdHJpbmcobmFtZSkudHJpbSgpIDogJyc7XG4gICAgICBpZiAoc3RyICYmICFzZWVuLmhhcyhzdHIpKSB7XG4gICAgICAgIHNlZW4uYWRkKHN0cik7XG4gICAgICAgIG5hbWVzLnB1c2goc3RyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5hbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0SGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdID0gW1xuICAgIHsgbmFtZTogJ0NvbnRlbnQtVHlwZScsIHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gIF07XG5cbiAgLyoqIEZvcm0gYXJyYXkgZm9yIGtleS12YWx1ZSByb3dzIChCb2R5IHBheWxvYWQpOyBlYWNoIGl0ZW0gaXMgRm9ybUdyb3VwKHsga2V5LCB2YWx1ZSB9KSAqL1xuICBrZXlWYWx1ZUZvcm1BcnJheSE6IEZvcm1BcnJheTtcblxuICBnZXQga2V5VmFsdWVSb3dzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMua2V5VmFsdWVGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBGb3JtIGFycmF5IGZvciBrZXktdHlwZS12YWx1ZSByb3dzOyBlYWNoIGl0ZW0gaXMgRm9ybUdyb3VwKHsga2V5LCB0eXBlLCB2YWx1ZSB9KSAqL1xuICBrZXlUeXBlVmFsdWVGb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IGtleVR5cGVWYWx1ZVJvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy5rZXlUeXBlVmFsdWVGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBGb3JtIGFycmF5IGZvciBQYXJhbXMgdGFiIGtleS12YWx1ZSByb3dzOyBlYWNoIGl0ZW0gaXMgRm9ybUdyb3VwKHsga2V5LCB2YWx1ZSB9KSAqL1xuICBwYXJhbXNGb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IHBhcmFtc1Jvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy5wYXJhbXNGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBDb25maWcgZm9yIFR5cGUgZHJvcGRvd24gaW4ga2V5LXR5cGUtdmFsdWUgcm93cyAoVGV4dCwgRmlsZSkgKi9cbiAgcmVhZG9ubHkga2V5VHlwZVZhbHVlVHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3R5cGUnLFxuICAgIHBsYWNlaG9sZGVyOiAnVGV4dCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyBpZDogJ3RleHQnLCB2YWx1ZTogJ3RleHQnLCBuYW1lOiAnVGV4dCcsIGxhYmVsOiAnVGV4dCcgfSxcbiAgICAgIHsgaWQ6ICdmaWxlJywgdmFsdWU6ICdmaWxlJywgbmFtZTogJ0ZpbGUnLCBsYWJlbDogJ0ZpbGUnIH0sXG4gICAgXSxcbiAgfTtcblxuICAvKiogRm9ybSBhcnJheSBmb3IgcmVzcG9uc2UgYm9keSB2ZXJpZmljYXRpb24gcm93czsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IGpzb25QYXRoLCB2ZXJpZmljYXRpb24sIGRhdGFUeXBlLCBleHBlY3RlZFZhbHVlIH0pICovXG4gIHZlcmlmaWNhdGlvbkZvcm1BcnJheSE6IEZvcm1BcnJheTtcblxuICBnZXQgdmVyaWZpY2F0aW9uUm93cygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pIGFzIEZvcm1Hcm91cFtdO1xuICB9XG5cbiAgLyoqIFZlcmlmaWNhdGlvbiBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgKHBhc3NlZCBmcm9tIHBhcmVudCkuIEZhbGxzIGJhY2sgdG8gYnVpbHQtaW4gbGlzdCB3aGVuIGVtcHR5LiAqL1xuICBASW5wdXQoKSB2ZXJpZmljYXRpb25PcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1ZFUklGSUNBVElPTl9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAnZXF1YWxzJywgdmFsdWU6ICdlcXVhbHMnLCBuYW1lOiAnRXF1YWxzJywgbGFiZWw6ICdFcXVhbHMnIH0sXG4gICAgeyBpZDogJ25vdC1lcXVhbCcsIHZhbHVlOiAnbm90LWVxdWFsJywgbmFtZTogJ05vdCBlcXVhbCcsIGxhYmVsOiAnTm90IGVxdWFsJyB9LFxuICAgIHsgaWQ6ICdsZXNzLXRoYW4nLCB2YWx1ZTogJ2xlc3MtdGhhbicsIG5hbWU6ICdMZXNzIHRoYW4nLCBsYWJlbDogJ0xlc3MgdGhhbicgfSxcbiAgICB7IGlkOiAnZ3JlYXRlci10aGFuJywgdmFsdWU6ICdncmVhdGVyLXRoYW4nLCBuYW1lOiAnR3JlYXRlciB0aGFuJywgbGFiZWw6ICdHcmVhdGVyIHRoYW4nIH0sXG4gICAgeyBpZDogJ2lzLW51bGwnLCB2YWx1ZTogJ2lzLW51bGwnLCBuYW1lOiAnSXMgbnVsbCcsIGxhYmVsOiAnSXMgbnVsbCcgfSxcbiAgICB7IGlkOiAnaXMtbm90LW51bGwnLCB2YWx1ZTogJ2lzLW5vdC1udWxsJywgbmFtZTogJ0lzIG5vdCBudWxsJywgbGFiZWw6ICdJcyBub3QgbnVsbCcgfSxcbiAgXTtcblxuICAvKiogQ29uZmlnIGZvciBWZXJpZmljYXRpb24gZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiB2ZXJpZmljYXRpb25PcHRpb25zIGNoYW5nZXMsIGxpa2UgTWV0aG9kIGRyb3Bkb3duKSAqL1xuICB2ZXJpZmljYXRpb25TZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd2ZXJpZmljYXRpb24nLFxuICAgIHBsYWNlaG9sZGVyOiAnRXF1YWxzJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9WRVJJRklDQVRJT05fT1BUSU9OU10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0aGlzLnZlcmlmaWNhdGlvbk9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnZlcmlmaWNhdGlvbk9wdGlvbnMubWFwKCh2KSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbih2KSlcbiAgICAgICAgOiBBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1ZFUklGSUNBVElPTl9PUFRJT05TO1xuICAgIHRoaXMudmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy52ZXJpZmljYXRpb25TZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldFZlcmlmaWNhdGlvblZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMudmVyaWZpY2F0aW9uT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMudmVyaWZpY2F0aW9uT3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1ZFUklGSUNBVElPTl9PUFRJT05TIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSk7XG4gICAgcmV0dXJuIHNvdXJjZVxuICAgICAgLm1hcCgodikgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSlcbiAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9IG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0VmVyaWZpY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWZXJpZmljYXRpb25WYWx1ZXMoKTtcbiAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA+IDAgPyB2YWx1ZXNbMF0gOiAnZXF1YWxzJztcbiAgfVxuXG4gIC8qKiBEYXRhIFR5cGUgb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIChwYXNzZWQgZnJvbSBwYXJlbnQpLiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3Qgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgdmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0RBVEFfVFlQRV9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAnc3RyaW5nJywgdmFsdWU6ICdzdHJpbmcnLCBuYW1lOiAnU3RyaW5nJywgbGFiZWw6ICdTdHJpbmcnIH0sXG4gICAgeyBpZDogJ251bWJlcicsIHZhbHVlOiAnbnVtYmVyJywgbmFtZTogJ051bWJlcicsIGxhYmVsOiAnTnVtYmVyJyB9LFxuICAgIHsgaWQ6ICdib29sZWFuJywgdmFsdWU6ICdib29sZWFuJywgbmFtZTogJ0Jvb2xlYW4nLCBsYWJlbDogJ0Jvb2xlYW4nIH0sXG4gICAgeyBpZDogJ2FycmF5JywgdmFsdWU6ICdhcnJheScsIG5hbWU6ICdBcnJheScsIGxhYmVsOiAnQXJyYXknIH0sXG4gICAgeyBpZDogJ29iamVjdCcsIHZhbHVlOiAnb2JqZWN0JywgbmFtZTogJ09iamVjdCcsIGxhYmVsOiAnT2JqZWN0JyB9LFxuICBdO1xuXG4gIC8qKiBDb25maWcgZm9yIERhdGEgVHlwZSBkcm9wZG93biAodXBkYXRlZCB3aGVuIHZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9ucyBjaGFuZ2VzLCBsaWtlIE1ldGhvZCBkcm9wZG93bikgKi9cbiAgdmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdkYXRhVHlwZScsXG4gICAgcGxhY2Vob2xkZXI6ICdTdHJpbmcnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0RBVEFfVFlQRV9PUFRJT05TXSxcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZVZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9ucy5tYXAoKGQpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LnRvU2VsZWN0T3B0aW9uKGQpKVxuICAgICAgICA6IEFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfREFUQV9UWVBFX09QVElPTlM7XG4gICAgdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldERhdGFUeXBlVmFsdWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzb3VyY2UgPVxuICAgICAgdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0RBVEFfVFlQRV9PUFRJT05TIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSk7XG4gICAgcmV0dXJuIHNvdXJjZVxuICAgICAgLm1hcCgoZCkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSlcbiAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9IG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0RGF0YVR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldERhdGFUeXBlVmFsdWVzKCk7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPiAwID8gdmFsdWVzWzBdIDogJ3N0cmluZyc7XG4gIH1cblxuICAvKiogQ29uZmlnIGZvciBFeHBlY3RlZCBWYWx1ZSB3aGVuIERhdGEgVHlwZSBpcyBCb29sZWFuICh0cnVlL2ZhbHNlIGRyb3Bkb3duKSAqL1xuICByZWFkb25seSB2ZXJpZmljYXRpb25FeHBlY3RlZFZhbHVlQm9vbGVhblNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2V4cGVjdGVkVmFsdWUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IGlkOiAndHJ1ZScsIHZhbHVlOiAndHJ1ZScsIG5hbWU6ICd0cnVlJywgbGFiZWw6ICd0cnVlJyB9LFxuICAgICAgeyBpZDogJ2ZhbHNlJywgdmFsdWU6ICdmYWxzZScsIG5hbWU6ICdmYWxzZScsIGxhYmVsOiAnZmFsc2UnIH0sXG4gICAgXSxcbiAgfTtcblxuICAvKiogRm9ybSBhcnJheSBmb3IgU3RhdHVzIHRhYiB2ZXJpZmljYXRpb24gcm93czsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IHZlcmlmaWNhdGlvbiwgZXhwZWN0ZWRWYWx1ZSB9KSAqL1xuICBzdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IHN0YXR1c1ZlcmlmaWNhdGlvblJvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBDb25maWcgZm9yIFN0YXR1cyB0YWIgVmVyaWZpY2F0aW9uIGRyb3Bkb3duIChFcXVhbHMsIE5vdCBlcXVhbCwgTGVzcyB0aGFuLCBHcmVhdGVyIHRoYW4pICovXG4gIC8qKiBTdGF0dXMgdGFiIFZlcmlmaWNhdGlvbiBvcHRpb25zIChFcXVhbHMsIE5vdCBlcXVhbCwgZXRjLikuIEZhbGxzIGJhY2sgdG8gYnVpbHQtaW4gbGlzdCB3aGVuIGVtcHR5LiAqL1xuICBASW5wdXQoKSBzdGF0dXNWZXJpZmljYXRpb25PcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1NUQVRVU19WRVJJRklDQVRJT05fT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ2VxdWFscycsIHZhbHVlOiAnZXF1YWxzJywgbmFtZTogJ0VxdWFscycsIGxhYmVsOiAnRXF1YWxzJyB9LFxuICAgIHsgaWQ6ICdub3QtZXF1YWwnLCB2YWx1ZTogJ25vdC1lcXVhbCcsIG5hbWU6ICdOb3QgZXF1YWwnLCBsYWJlbDogJ05vdCBlcXVhbCcgfSxcbiAgICB7IGlkOiAnbGVzcy10aGFuJywgdmFsdWU6ICdsZXNzLXRoYW4nLCBuYW1lOiAnTGVzcyB0aGFuJywgbGFiZWw6ICdMZXNzIHRoYW4nIH0sXG4gICAgeyBpZDogJ2dyZWF0ZXItdGhhbicsIHZhbHVlOiAnZ3JlYXRlci10aGFuJywgbmFtZTogJ0dyZWF0ZXIgdGhhbicsIGxhYmVsOiAnR3JlYXRlciB0aGFuJyB9LFxuICBdO1xuXG4gIC8qKiBDb25maWcgZm9yIFN0YXR1cyB0YWIgVmVyaWZpY2F0aW9uIGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9ucyBjaGFuZ2VzKS4gKi9cbiAgc3RhdHVzVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndmVyaWZpY2F0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ0VxdWFscycsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogWy4uLkFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfU1RBVFVTX1ZFUklGSUNBVElPTl9PUFRJT05TXSxcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZVN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID1cbiAgICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9ucy5tYXAoKG8pID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LnRvU2VsZWN0T3B0aW9uKG8pKVxuICAgICAgICA6IEFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfU1RBVFVTX1ZFUklGSUNBVElPTl9PUFRJT05TO1xuICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5zdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXR1c1ZlcmlmaWNhdGlvblZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1NUQVRVU19WRVJJRklDQVRJT05fT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKG8pID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKG8gYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFN0YXR1c1ZlcmlmaWNhdGlvbigpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0U3RhdHVzVmVyaWZpY2F0aW9uVmFsdWVzKCk7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPiAwID8gdmFsdWVzWzBdIDogJ2VxdWFscyc7XG4gIH1cblxuICByZXNwb25zZVByZXZpZXcgPSBgYDtcblxuICBwcml2YXRlIG1ldGhvZENoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZm9ybWF0Q2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBoZWFkZXJOYW1lT3B0aW9uc0NoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZW52aXJvbm1lbnRGb3JtQ2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBtZXRob2RGb3JtQ2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBwYXJhbXNGb3JtQXJyYXlDaGFuZ2VzU3ViPzogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYXBwbHlJbml0aWFsU3RlcCh0aGlzLmluaXRpYWxTdGVwKTtcbiAgICB0aGlzLnVwZGF0ZU1ldGhvZFNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IGZpcnN0TWV0aG9kVmFsdWUgPSB0aGlzLmh0dHBNZXRob2RPcHRpb25zPy5sZW5ndGhcbiAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5odHRwTWV0aG9kT3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRNZXRob2QgPSB0aGlzLmluaXRpYWxNZXRob2QgPz8gZmlyc3RNZXRob2RWYWx1ZSA/PyAnR0VUJztcbiAgICB0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSA9IHR5cGVvZiBkZWZhdWx0TWV0aG9kID09PSAnc3RyaW5nJyA/IGRlZmF1bHRNZXRob2QgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdE1ldGhvZCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgdGhpcy5tZXRob2RGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBtZXRob2Q6IFtkZWZhdWx0TWV0aG9kXSxcbiAgICB9KTtcbiAgICBjb25zdCBmaXJzdFZhbHVlID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmVudmlyb25tZW50T3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRFbnYgPSB0aGlzLmluaXRpYWxFbnZpcm9ubWVudCA/PyBmaXJzdFZhbHVlID8/ICdEZXZlbG9wbWVudCc7XG4gICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9IHR5cGVvZiBkZWZhdWx0RW52ID09PSAnc3RyaW5nJyA/IGRlZmF1bHRFbnYgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdEVudiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgdGhpcy5lbnZpcm9ubWVudEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGVudmlyb25tZW50OiBbZGVmYXVsdEVudl0sXG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVBdXRoVHlwZVNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IGZpcnN0QXV0aFZhbHVlID0gdGhpcy5nZXRBdXRoVHlwZVZhbHVlcygpWzBdO1xuICAgIGNvbnN0IGRlZmF1bHRBdXRoVHlwZSA9IHRoaXMuaW5pdGlhbEF1dGhUeXBlID8/IGZpcnN0QXV0aFZhbHVlID8/ICduby1hdXRoJztcbiAgICB0aGlzLmF1dGhUeXBlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgYXV0aFR5cGU6IFtkZWZhdWx0QXV0aFR5cGVdLFxuICAgIH0pO1xuICAgIHRoaXMub2F1dGgyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZ3JhbnRUeXBlOiBbJ2NsaWVudF9jcmVkZW50aWFscyddLFxuICAgICAgYWNjZXNzVG9rZW5Vcmw6IFsnJ10sXG4gICAgICBjbGllbnRJZDogWycnXSxcbiAgICAgIGNsaWVudFNlY3JldDogWycnXSxcbiAgICAgIHNjb3BlOiBbJyddLFxuICAgICAgY2xpZW50QXV0aGVudGljYXRpb246IFsnYmFzaWMnXSxcbiAgICB9KTtcbiAgICB0aGlzLmVudmlyb25tZW50Rm9ybUNoYW5nZXNTdWIgPSB0aGlzLmVudmlyb25tZW50Rm9ybS5nZXQoJ2Vudmlyb25tZW50Jyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCh2OiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzID0gdiAhPSBudWxsICYmIHYgIT09ICcnID8gKHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodikpIDogJyc7XG4gICAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gcyA/PyAnJztcbiAgICB9KTtcbiAgICB0aGlzLm1ldGhvZEZvcm1DaGFuZ2VzU3ViID0gdGhpcy5tZXRob2RGb3JtLmdldCgnbWV0aG9kJyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCh2OiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzID0gdiAhPSBudWxsICYmIHYgIT09ICcnID8gKHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodikpIDogJyc7XG4gICAgICB0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSA9IHMgPz8gJyc7XG4gICAgfSk7XG4gICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkoXG4gICAgICB0aGlzLmluaXRpYWxIZWFkZXJzID8/IFt7IG5hbWU6ICcnLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6ICcnIH1dXG4gICAgKTtcbiAgICB0aGlzLmhlYWRlck5hbWVPcHRpb25zQ2hhbmdlc1N1YiA9IHRoaXMuaGVhZGVyc0Zvcm1BcnJheT8udmFsdWVDaGFuZ2VzPy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgICB0aGlzLmhlYWRlcnNDaGFuZ2UuZW1pdCh0aGlzLmhlYWRlcnMpO1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMuaGVhZGVyc0NoYW5nZS5lbWl0KHRoaXMuaGVhZGVycyk7XG4gICAgdGhpcy51cGRhdGVFbnZpcm9ubWVudFNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMudXBkYXRlUGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IGZpcnN0Rm9ybWF0VmFsdWUgPSB0aGlzLmdldEZvcm1hdFZhbHVlcygpWzBdO1xuICAgIGNvbnN0IGRlZmF1bHRGb3JtYXQgPSB0aGlzLmluaXRpYWxGb3JtYXQgPz8gZmlyc3RGb3JtYXRWYWx1ZSA/PyAnanNvbic7XG4gICAgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoeyBmb3JtYXQ6IFtkZWZhdWx0Rm9ybWF0XSB9KTtcbiAgICB0aGlzLmJ1aWxkS2V5VmFsdWVGb3JtQXJyYXkoKTtcbiAgICB0aGlzLmJ1aWxkS2V5VHlwZVZhbHVlRm9ybUFycmF5KCk7XG4gICAgdGhpcy5idWlsZFBhcmFtc0Zvcm1BcnJheSgpO1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5Q2hhbmdlc1N1YiA9IHRoaXMucGFyYW1zRm9ybUFycmF5LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCgpID0+IHRoaXMuc3luY1VybEZyb21QYXJhbXMoKSk7XG4gICAgaWYgKHRoaXMuaW5pdGlhbFVybCAhPSBudWxsICYmIHRoaXMuaW5pdGlhbFVybCAhPT0gJycpIHtcbiAgICAgIHRoaXMuX3VybCA9IHRoaXMuaW5pdGlhbFVybDtcbiAgICAgIHRoaXMuc3luY1BhcmFtc0Zyb21VcmwoKTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZSB2YXJpYWJsZU5hbWUgZnJvbSBpbml0aWFsVmFyaWFibGVOYW1lXG4gICAgaWYgKHRoaXMuaW5pdGlhbFZhcmlhYmxlTmFtZSAhPSBudWxsICYmIHRoaXMuaW5pdGlhbFZhcmlhYmxlTmFtZSAhPT0gJycpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lID0gdGhpcy5pbml0aWFsVmFyaWFibGVOYW1lO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVZlcmlmaWNhdGlvblNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMudXBkYXRlVmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLmJ1aWxkVmVyaWZpY2F0aW9uRm9ybUFycmF5KCk7XG4gICAgdGhpcy51cGRhdGVTdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLmJ1aWxkU3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5KCk7XG4gICAgdGhpcy5tZXRob2RDaGFuZ2VzU3ViID0gdGhpcy5tZXRob2RGb3JtLmdldCgnbWV0aG9kJyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtZXRob2QgPSB2YWx1ZSAhPSBudWxsID8gU3RyaW5nKHZhbHVlKS50b1VwcGVyQ2FzZSgpIDogJyc7XG4gICAgICBpZiAoTUVUSE9EU19XSVRIT1VUX0JPRFkuaW5jbHVkZXMobWV0aG9kKSAmJiB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgIT09ICdoZWFkZXJzJykge1xuICAgICAgICB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgPSAnaGVhZGVycyc7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmZvcm1hdENoYW5nZXNTdWIgPSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLmdldCgnZm9ybWF0Jyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICAgIH0pO1xuICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0dXBQYXlsb2FkVGV4dGFyZWFTY3JvbGxTeW5jKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm1ldGhvZENoYW5nZXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5mb3JtYXRDaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaGVhZGVyTmFtZU9wdGlvbnNDaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtQ2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm1ldGhvZEZvcm1DaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5Q2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKiBTeW5jIGxpbmUgbnVtYmVycyBjb2x1bW4gc2Nyb2xsIHdpdGggcGF5bG9hZCB0ZXh0YXJlYSBzY3JvbGwgKFBvc3RtYW4tc3R5bGUpLiAqL1xuICBwcml2YXRlIHNldHVwUGF5bG9hZFRleHRhcmVhU2Nyb2xsU3luYygpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLnBheWxvYWRFZGl0b3JXaXRoTGluZXNSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWhvc3QpIHJldHVybjtcbiAgICAgIGNvbnN0IGxpbmVOdW1iZXJzRWwgPSBob3N0LnF1ZXJ5U2VsZWN0b3IoJy5jcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWxpbmUtbnVtYmVycycpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGNvbnN0IHRleHRhcmVhID0gaG9zdC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpIGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKCFsaW5lTnVtYmVyc0VsIHx8ICF0ZXh0YXJlYSkgcmV0dXJuO1xuICAgICAgdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgICBsaW5lTnVtYmVyc0VsLnNjcm9sbFRvcCA9IHRleHRhcmVhLnNjcm9sbFRvcDtcbiAgICAgIH0pO1xuICAgICAgbGluZU51bWJlcnNFbC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB7XG4gICAgICAgIHRleHRhcmVhLnNjcm9sbFRvcCA9IGxpbmVOdW1iZXJzRWwuc2Nyb2xsVG9wO1xuICAgICAgfSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkS2V5VmFsdWVGb3JtQXJyYXkocm93cz86IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdKTogdm9pZCB7XG4gICAgY29uc3QgaW5pdGlhbCA9IHJvd3MgPz8gW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dO1xuICAgIGNvbnN0IGdyb3VwcyA9IGluaXRpYWwubWFwKChyKSA9PiB0aGlzLmZiLmdyb3VwKHsga2V5OiBbci5rZXldLCB2YWx1ZTogW3IudmFsdWVdIH0pKTtcbiAgICB0aGlzLmtleVZhbHVlRm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShncm91cHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEtleVR5cGVWYWx1ZUZvcm1BcnJheShyb3dzPzogeyBrZXk6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuICAgIGNvbnN0IGluaXRpYWwgPSByb3dzID8/IFt7IGtleTogJycsIHR5cGU6ICd0ZXh0JywgdmFsdWU6ICcnIH1dO1xuICAgIGNvbnN0IGdyb3VwcyA9IGluaXRpYWwubWFwKChyKSA9PiB0aGlzLmZiLmdyb3VwKHsga2V5OiBbci5rZXldLCB0eXBlOiBbci50eXBlXSwgdmFsdWU6IFtyLnZhbHVlXSB9KSk7XG4gICAgdGhpcy5rZXlUeXBlVmFsdWVGb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KGdyb3Vwcyk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUGFyYW1zRm9ybUFycmF5KHJvd3M/OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuICAgIGNvbnN0IGluaXRpYWwgPSByb3dzID8/IFt7IGtleTogJycsIHZhbHVlOiAnJyB9XTtcbiAgICBjb25zdCBncm91cHMgPSBpbml0aWFsLm1hcCgocikgPT4gdGhpcy5mYi5ncm91cCh7IGtleTogW3Iua2V5XSwgdmFsdWU6IFtyLnZhbHVlXSB9KSk7XG4gICAgaWYgKHRoaXMucGFyYW1zRm9ybUFycmF5KSB7XG4gICAgICB0aGlzLnBhcmFtc0Zvcm1BcnJheS5jbGVhcigpO1xuICAgICAgZ3JvdXBzLmZvckVhY2goKGcpID0+IHRoaXMucGFyYW1zRm9ybUFycmF5LnB1c2goZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcmFtc0Zvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoZ3JvdXBzKTtcbiAgICB9XG4gIH1cblxuICAvKiogUGFyc2UgVVJMIGludG8gYmFzZSAod2l0aG91dCBxdWVyeS9mcmFnbWVudCkgYW5kIHF1ZXJ5IGtleS12YWx1ZSBwYWlycy4gUHJlc2VydmVzIHJlbGF0aXZlIFVSTHMuICovXG4gIHByaXZhdGUgcGFyc2VRdWVyeVBhcmFtc0Zyb21VcmwodXJsU3RyOiBzdHJpbmcpOiB7IGJhc2VVcmw6IHN0cmluZzsgcm93czogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gfSB7XG4gICAgY29uc3QgZW1wdHkgPSB7IGJhc2VVcmw6IHVybFN0ciwgcm93czogW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dIH07XG4gICAgaWYgKCF1cmxTdHIgfHwgIXVybFN0ci50cmltKCkpIHJldHVybiBlbXB0eTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaXNBYnNvbHV0ZSA9IC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QodXJsU3RyLnRyaW0oKSk7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHVybFN0ciwgJ2h0dHA6Ly9sb2NhbGhvc3QnKTtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBpc0Fic29sdXRlID8gdXJsLm9yaWdpbiArIHVybC5wYXRobmFtZSA6IHVybC5wYXRobmFtZTtcbiAgICAgIGNvbnN0IHJvd3M6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdID0gW107XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgcm93cy5wdXNoKHsga2V5LCB2YWx1ZSB9KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByb3dzLnB1c2goeyBrZXk6ICcnLCB2YWx1ZTogJycgfSk7XG4gICAgICByZXR1cm4geyBiYXNlVXJsLCByb3dzIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZW1wdHk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdldCBiYXNlIFVSTCAod2l0aG91dCBxdWVyeS9mcmFnbWVudCkgZm9yIGJ1aWxkaW5nIFVSTCBmcm9tIHBhcmFtcy4gUHJlc2VydmVzIHJlbGF0aXZlIFVSTHMuICovXG4gIHByaXZhdGUgZ2V0QmFzZVVybCh1cmxTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF1cmxTdHIgfHwgIXVybFN0ci50cmltKCkpIHJldHVybiB1cmxTdHI7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlzQWJzb2x1dGUgPSAvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KHVybFN0ci50cmltKCkpO1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh1cmxTdHIsICdodHRwOi8vbG9jYWxob3N0Jyk7XG4gICAgICByZXR1cm4gaXNBYnNvbHV0ZSA/IHVybC5vcmlnaW4gKyB1cmwucGF0aG5hbWUgOiB1cmwucGF0aG5hbWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdXJsU3RyO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBQYXJzZSBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgYm9keSAoa2V5PXZhbHVlJi4uLikgaW50byBrZXktdmFsdWUgcm93cy4gKi9cbiAgcHJpdmF0ZSBwYXJzZUZvcm1VcmxFbmNvZGVkQm9keShib2R5OiBzdHJpbmcpOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IChib2R5ID8/ICcnKS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm4gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModHJpbW1lZCk7XG4gICAgICBjb25zdCByb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgcGFyYW1zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHJvd3MucHVzaCh7IGtleSwgdmFsdWUgfSkpO1xuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElmIGZvcm0gYm9keSBoYXMgYSBzaW5nbGUga2V5IHdob3NlIHZhbHVlIGlzIFVSTC1kZWNvZGVkIEpTT04sIHJldHVybiBpdCBwcmV0dHktcHJpbnRlZCBmb3IgUmF3IGJvZHkuXG4gICAqIE90aGVyd2lzZSByZXR1cm4gbnVsbCAoY2FsbGVyIGtlZXBzIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCB2aWV3KS5cbiAgICovXG4gIHByaXZhdGUgdHJ5Rm9ybUJvZHlWYWx1ZUFzUmF3SnNvbihyb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChyb3dzLmxlbmd0aCAhPT0gMSB8fCAhcm93c1swXS52YWx1ZT8udHJpbSgpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB2YWx1ZSA9IHJvd3NbMF0udmFsdWUudHJpbSgpO1xuICAgIGlmICghKHZhbHVlLnN0YXJ0c1dpdGgoJ3snKSB8fCB2YWx1ZS5zdGFydHNXaXRoKCdbJykpKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCAyKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBVcGRhdGUgUGFyYW1zIHRhYmxlIGZyb20gY3VycmVudCBVUkwgcXVlcnkgc3RyaW5nIChQb3N0bWFuLXN0eWxlKS4gKi9cbiAgcHJpdmF0ZSBzeW5jUGFyYW1zRnJvbVVybCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IGJhc2VVcmw6IF9iLCByb3dzIH0gPSB0aGlzLnBhcnNlUXVlcnlQYXJhbXNGcm9tVXJsKHRoaXMuX3VybCk7XG4gICAgdGhpcy5idWlsZFBhcmFtc0Zvcm1BcnJheShyb3dzKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgVVJMIHF1ZXJ5IHN0cmluZyBmcm9tIFBhcmFtcyB0YWJsZSAoUG9zdG1hbi1zdHlsZSkuICovXG4gIHByaXZhdGUgc3luY1VybEZyb21QYXJhbXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFyYW1zU3luY2luZ0Zyb21VcmwgfHwgIXRoaXMucGFyYW1zRm9ybUFycmF5KSByZXR1cm47XG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMuZ2V0QmFzZVVybCh0aGlzLl91cmwpO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5wYXJhbXNGb3JtQXJyYXkuY29udHJvbHMpIHtcbiAgICAgIGNvbnN0IGtleSA9ICgoYyBhcyBGb3JtR3JvdXApLmdldCgna2V5Jyk/LnZhbHVlID8/ICcnKS50cmltKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJztcbiAgICAgIGlmIChrZXkgIT09ICcnKSBwYXJhbXMuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IHBhcmFtcy50b1N0cmluZygpO1xuICAgIGNvbnN0IG5ld1VybCA9IHF1ZXJ5U3RyaW5nID8gYCR7YmFzZVVybH0/JHtxdWVyeVN0cmluZ31gIDogYmFzZVVybDtcbiAgICBpZiAodGhpcy5fdXJsICE9PSBuZXdVcmwpIHtcbiAgICAgIHRoaXMuX3VybCA9IG5ld1VybDtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRWZXJpZmljYXRpb25Gb3JtQXJyYXkocm93cz86IHsganNvblBhdGg6IHN0cmluZzsgdmVyaWZpY2F0aW9uOiBzdHJpbmc7IGRhdGFUeXBlOiBzdHJpbmc7IGV4cGVjdGVkVmFsdWU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0VmVyaWZpY2F0aW9uID0gdGhpcy5nZXREZWZhdWx0VmVyaWZpY2F0aW9uKCk7XG4gICAgY29uc3QgZGVmYXVsdERhdGFUeXBlID0gdGhpcy5nZXREZWZhdWx0RGF0YVR5cGUoKTtcbiAgICBjb25zdCBpbml0aWFsID0gcm93cyA/PyBbeyBqc29uUGF0aDogJycsIHZlcmlmaWNhdGlvbjogZGVmYXVsdFZlcmlmaWNhdGlvbiwgZGF0YVR5cGU6IGRlZmF1bHREYXRhVHlwZSwgZXhwZWN0ZWRWYWx1ZTogJycgfV07XG4gICAgY29uc3QgZ3JvdXBzID0gaW5pdGlhbC5tYXAoKHIpID0+XG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAganNvblBhdGg6IFtyLmpzb25QYXRoXSxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiBbci52ZXJpZmljYXRpb25dLFxuICAgICAgICBkYXRhVHlwZTogW3IuZGF0YVR5cGVdLFxuICAgICAgICBleHBlY3RlZFZhbHVlOiBbci5leHBlY3RlZFZhbHVlXSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoZ3JvdXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkocm93cz86IHsgdmVyaWZpY2F0aW9uOiBzdHJpbmc7IGV4cGVjdGVkVmFsdWU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0VmVyaWZpY2F0aW9uID0gdGhpcy5nZXREZWZhdWx0U3RhdHVzVmVyaWZpY2F0aW9uKCk7XG4gICAgY29uc3QgaW5pdGlhbCA9IHJvd3MgPz8gW3sgdmVyaWZpY2F0aW9uOiBkZWZhdWx0VmVyaWZpY2F0aW9uLCBleHBlY3RlZFZhbHVlOiAnJyB9XTtcbiAgICBjb25zdCBncm91cHMgPSBpbml0aWFsLm1hcCgocikgPT5cbiAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICB2ZXJpZmljYXRpb246IFtyLnZlcmlmaWNhdGlvbl0sXG4gICAgICAgIGV4cGVjdGVkVmFsdWU6IFtyLmV4cGVjdGVkVmFsdWVdLFxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShncm91cHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEhlYWRlcnNGb3JtQXJyYXkocm93czogQXBpRWRpdEhlYWRlclJvd1tdKTogdm9pZCB7XG4gICAgY29uc3QgZ3JvdXBzID0gcm93cy5tYXAoKGgpID0+XG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW2gubmFtZV0sXG4gICAgICAgIHZhbHVlOiBbaC52YWx1ZV0sXG4gICAgICB9KVxuICAgICk7XG4gICAgaWYgKHRoaXMuaGVhZGVyc0Zvcm1BcnJheSkge1xuICAgICAgdGhpcy5oZWFkZXJzRm9ybUFycmF5LmNsZWFyKCk7XG4gICAgICBncm91cHMuZm9yRWFjaCgoZykgPT4gdGhpcy5oZWFkZXJzRm9ybUFycmF5LnB1c2goZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlcnNGb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KGdyb3Vwcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc2V0IGFsbCB0aHJlZSBzdGVwcyBhbmQgYWxsIGVudGVyZWQgZGF0YSB0byBpbml0aWFsL2RlZmF1bHQgc3RhdGUuIFVzZWQgd2hlbiB1c2VyIGNhbmNlbHMgb24gc3RlcCAxLiAqL1xuICBwcml2YXRlIHJlc2V0QWxsU3RlcHNBbmREYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFN0ZXAgPSAxO1xuXG4gICAgY29uc3QgZmlyc3RNZXRob2RWYWx1ZSA9IHRoaXMuaHR0cE1ldGhvZE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmh0dHBNZXRob2RPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVmYXVsdE1ldGhvZCA9IHRoaXMuaW5pdGlhbE1ldGhvZCA/PyBmaXJzdE1ldGhvZFZhbHVlID8/ICdHRVQnO1xuICAgIGNvbnN0IG1ldGhvZFZhbCA9IHR5cGVvZiBkZWZhdWx0TWV0aG9kID09PSAnc3RyaW5nJyA/IGRlZmF1bHRNZXRob2QgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdE1ldGhvZCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSBtZXRob2RWYWwgPz8gJyc7XG4gICAgaWYgKHRoaXMubWV0aG9kRm9ybSkgdGhpcy5tZXRob2RGb3JtLnBhdGNoVmFsdWUoeyBtZXRob2Q6IGRlZmF1bHRNZXRob2QgfSk7XG5cbiAgICBjb25zdCBmaXJzdEVudlZhbHVlID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmVudmlyb25tZW50T3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRFbnYgPSB0aGlzLmluaXRpYWxFbnZpcm9ubWVudCA/PyBmaXJzdEVudlZhbHVlID8/ICdEZXZlbG9wbWVudCc7XG4gICAgY29uc3QgZW52VmFsID0gdHlwZW9mIGRlZmF1bHRFbnYgPT09ICdzdHJpbmcnID8gZGVmYXVsdEVudiA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShkZWZhdWx0RW52IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKTtcbiAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gZW52VmFsID8/ICcnO1xuICAgIGlmICh0aGlzLmVudmlyb25tZW50Rm9ybSkgdGhpcy5lbnZpcm9ubWVudEZvcm0ucGF0Y2hWYWx1ZSh7IGVudmlyb25tZW50OiBkZWZhdWx0RW52IH0pO1xuXG4gICAgdGhpcy51cmwgPSB0aGlzLmluaXRpYWxVcmwgPz8gJyc7XG4gICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkodGhpcy5pbml0aWFsSGVhZGVycyA/PyBbeyBuYW1lOiAnJywgdHlwZTogJ3N0cmluZycsIHZhbHVlOiAnJyB9XSk7XG4gICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy5oZWFkZXJzQ2hhbmdlLmVtaXQodGhpcy5oZWFkZXJzKTtcblxuICAgIHRoaXMuYm9keVZpZXcgPSAnaGVhZGVycyc7XG4gICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gJ2hlYWRlcnMnO1xuICAgIHRoaXMucGF5bG9hZFR5cGUgPSAncmF3JztcbiAgICB0aGlzLnBheWxvYWRUZXh0ID0gJyc7XG4gICAgdGhpcy5wYXlsb2FkSnNvbkVycm9yID0gbnVsbDtcbiAgICBjb25zdCBkZWZhdWx0Rm9ybWF0ID0gdGhpcy5pbml0aWFsRm9ybWF0ID8/IHRoaXMuZ2V0Rm9ybWF0VmFsdWVzKClbMF0gPz8gJ2pzb24nO1xuICAgIGlmICh0aGlzLnBheWxvYWRGb3JtYXRGb3JtKSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQgfSk7XG4gICAgdGhpcy5idWlsZEtleVZhbHVlRm9ybUFycmF5KCk7XG4gICAgdGhpcy5idWlsZEtleVR5cGVWYWx1ZUZvcm1BcnJheSgpO1xuICAgIHRoaXMuYnVpbGRQYXJhbXNGb3JtQXJyYXkoKTtcbiAgICB0aGlzLmltcG9ydEN1cmxDb250cm9sLnNldFZhbHVlKCcnKTtcblxuICAgIHRoaXMudmFyaWFibGVOYW1lID0gJyc7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuXG4gICAgdGhpcy5idWlsZFZlcmlmaWNhdGlvbkZvcm1BcnJheSgpO1xuICAgIHRoaXMuYnVpbGRTdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkoKTtcbiAgICB0aGlzLmFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiID0gJ3Jlc3BvbnNlLWJvZHknO1xuXG4gICAgdGhpcy52YWxpZGF0ZVBheWxvYWRKc29uKCk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqIEhhbmRsZXI6IHNob3cgaW1wb3J0IGNVUkwgcGFuZWwgKGNhbGxlZCB3aGVuIHVzZXIgY2xpY2tzIFwiSW1wb3J0IEFQSSBjVVJMXCIpLiBSZXNldHMgdGV4dGFyZWEgc28gaXQgaXMgY2xlYXJlZCBlYWNoIHRpbWUuICovXG4gIG9wZW5JbXBvcnRDdXJsUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRDdXJsQ29udHJvbC5zZXRWYWx1ZSgnJyk7XG4gICAgdGhpcy5ib2R5VmlldyA9ICdpbXBvcnQtY3VybCc7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqIFJlc2V0IFVSTCwgbWV0aG9kLCBoZWFkZXJzLCBib2R5LCBhbmQgcGFyYW1zIHRvIGVtcHR5L2RlZmF1bHQgYmVmb3JlIGFwcGx5aW5nIGltcG9ydGVkIGNVUkwuICovXG4gIHByaXZhdGUgcmVzZXRSZXF1ZXN0RmllbGRzQmVmb3JlQ3VybEltcG9ydCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaXJzdE1ldGhvZFZhbHVlID0gdGhpcy5odHRwTWV0aG9kT3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnNbMF0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZWZhdWx0TWV0aG9kID0gdGhpcy5pbml0aWFsTWV0aG9kID8/IGZpcnN0TWV0aG9kVmFsdWUgPz8gJ0dFVCc7XG4gICAgdGhpcy5zZWxlY3RlZE1ldGhvZCA9IHR5cGVvZiBkZWZhdWx0TWV0aG9kID09PSAnc3RyaW5nJyA/IGRlZmF1bHRNZXRob2QgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdE1ldGhvZCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJykgPz8gJ0dFVCc7XG4gICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSB0aGlzLnNlbGVjdGVkTWV0aG9kO1xuICAgIGlmICh0aGlzLm1ldGhvZEZvcm0pIHRoaXMubWV0aG9kRm9ybS5wYXRjaFZhbHVlKHsgbWV0aG9kOiBkZWZhdWx0TWV0aG9kIH0pO1xuXG4gICAgdGhpcy51cmwgPSAnJztcblxuICAgIHRoaXMuYnVpbGRIZWFkZXJzRm9ybUFycmF5KFt7IG5hbWU6ICcnLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6ICcnIH1dKTtcbiAgICB0aGlzLnVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLmhlYWRlcnNDaGFuZ2UuZW1pdCh0aGlzLmhlYWRlcnMpO1xuXG4gICAgdGhpcy5wYXlsb2FkVHlwZSA9ICdyYXcnO1xuICAgIHRoaXMucGF5bG9hZFRleHQgPSAnJztcbiAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgIGNvbnN0IGRlZmF1bHRGb3JtYXQgPSB0aGlzLmluaXRpYWxGb3JtYXQgPz8gdGhpcy5nZXRGb3JtYXRWYWx1ZXMoKVswXSA/PyAnanNvbic7XG4gICAgaWYgKHRoaXMucGF5bG9hZEZvcm1hdEZvcm0pIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0ucGF0Y2hWYWx1ZSh7IGZvcm1hdDogZGVmYXVsdEZvcm1hdCB9KTtcbiAgICB0aGlzLmJ1aWxkS2V5VmFsdWVGb3JtQXJyYXkoW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dKTtcbiAgICB0aGlzLmJ1aWxkS2V5VHlwZVZhbHVlRm9ybUFycmF5KFt7IGtleTogJycsIHR5cGU6ICd0ZXh0JywgdmFsdWU6ICcnIH1dKTtcbiAgICB0aGlzLmJ1aWxkUGFyYW1zRm9ybUFycmF5KFt7IGtleTogJycsIHZhbHVlOiAnJyB9XSk7XG5cbiAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogSGFuZGxlcjogcGFyc2UgY1VSTCBmcm9tIGNvbnRyb2wsIGJpbmQgdG8gZm9ybSBmaWVsZHMsIGVtaXQgYW5kIGNsb3NlIHBhbmVsLiBDYWxsZWQgd2hlbiB1c2VyIGNsaWNrcyBJbXBvcnQgYnV0dG9uLiAqL1xuICBvbkltcG9ydEN1cmxDb25maXJtKCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbXBvcnRDdXJsQ29udHJvbC52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBjdXJsU3RyID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogJyc7XG4gICAgdGhpcy5pbXBvcnRDdXJsLmVtaXQoY3VybFN0cik7XG5cbiAgICB0aGlzLnJlc2V0UmVxdWVzdEZpZWxkc0JlZm9yZUN1cmxJbXBvcnQoKTtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQ3VybChjdXJsU3RyKTtcbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICBjb25zdCBtZXRob2RWYWx1ZSA9IHBhcnNlZC5tZXRob2QgJiYgdGhpcy5nZXRNZXRob2RWYWx1ZXMoKS5pbmNsdWRlcyhwYXJzZWQubWV0aG9kKVxuICAgICAgICA/IHBhcnNlZC5tZXRob2RcbiAgICAgICAgOiBwYXJzZWQubWV0aG9kIHx8ICdHRVQnO1xuICAgICAgdGhpcy5zZWxlY3RlZE1ldGhvZCA9IG1ldGhvZFZhbHVlO1xuICAgICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSBtZXRob2RWYWx1ZTtcbiAgICAgIGlmIChwYXJzZWQudXJsKSB0aGlzLnVybCA9IHBhcnNlZC51cmw7XG5cbiAgICAgIC8vIEJpbmQgQXV0aG9yaXphdGlvbiBoZWFkZXIgdG8gQXV0aG9yaXphdGlvbiBzZWN0aW9uIHdoZW4gcHJlc2VudCAoQmVhcmVyIG9yIG90aGVyIHNjaGVtZSlcbiAgICAgIGxldCBoZWFkZXJSb3dzOiBBcGlFZGl0SGVhZGVyUm93W10gPSBwYXJzZWQuaGVhZGVycztcbiAgICAgIGNvbnN0IGF1dGhIZWFkZXIgPSBoZWFkZXJSb3dzLmZpbmQoKGgpID0+IGgubmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYXV0aG9yaXphdGlvbicpO1xuICAgICAgaWYgKGF1dGhIZWFkZXI/LnZhbHVlPy50cmltKCkpIHtcbiAgICAgICAgY29uc3QgYXV0aFZhbHVlID0gYXV0aEhlYWRlci52YWx1ZS50cmltKCk7XG4gICAgICAgIGNvbnN0IGJlYXJlck1hdGNoID0gL15CZWFyZXJcXHMrKC4rKSQvaS5leGVjKGF1dGhWYWx1ZSk7XG4gICAgICAgIGlmIChiZWFyZXJNYXRjaCkge1xuICAgICAgICAgIGNvbnN0IHRva2VuID0gYmVhcmVyTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgICAgIGlmICh0aGlzLmdldEF1dGhUeXBlVmFsdWVzKCkuaW5jbHVkZXMoJ2JlYXJlcicpICYmIHRoaXMuYXV0aFR5cGVGb3JtKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhUeXBlRm9ybS5wYXRjaFZhbHVlKHsgYXV0aFR5cGU6ICdiZWFyZXInIH0pO1xuICAgICAgICAgICAgdGhpcy5iZWFyZXJUb2tlbiA9IHRva2VuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoZWFkZXJSb3dzID0gaGVhZGVyUm93cy5maWx0ZXIoKGgpID0+IGgubmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnYXV0aG9yaXphdGlvbicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGhlYWRlclJvd3MgPSBoZWFkZXJSb3dzLmxlbmd0aCA+IDAgPyBoZWFkZXJSb3dzIDogW3sgbmFtZTogJycsIHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogJycgfV07XG4gICAgICB0aGlzLmJ1aWxkSGVhZGVyc0Zvcm1BcnJheShoZWFkZXJSb3dzKTtcbiAgICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgICAgdGhpcy5oZWFkZXJzQ2hhbmdlLmVtaXQodGhpcy5oZWFkZXJzKTtcblxuICAgICAgaWYgKHBhcnNlZC5ib2R5KSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcGFyc2VkLmhlYWRlcnNcbiAgICAgICAgICAuZmluZCgoaCkgPT4gaC5uYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnKVxuICAgICAgICAgID8udmFsdWU/LnRvTG93ZXJDYXNlKCkgPz8gJyc7XG4gICAgICAgIGNvbnN0IGlzRm9ybVVybEVuY29kZWQgPSBjb250ZW50VHlwZS5pbmNsdWRlcygnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG5cbiAgICAgICAgaWYgKGlzRm9ybVVybEVuY29kZWQpIHtcbiAgICAgICAgICBjb25zdCByb3dzID0gdGhpcy5wYXJzZUZvcm1VcmxFbmNvZGVkQm9keShwYXJzZWQuYm9keSk7XG4gICAgICAgICAgdGhpcy5idWlsZEtleVZhbHVlRm9ybUFycmF5KHJvd3MubGVuZ3RoID4gMCA/IHJvd3MgOiBbeyBrZXk6ICcnLCB2YWx1ZTogJycgfV0pO1xuICAgICAgICAgIGNvbnN0IGRlY29kZWRBc0pzb24gPSB0aGlzLnRyeUZvcm1Cb2R5VmFsdWVBc1Jhd0pzb24ocm93cyk7XG4gICAgICAgICAgaWYgKGRlY29kZWRBc0pzb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5wYXlsb2FkVHlwZSA9ICdyYXcnO1xuICAgICAgICAgICAgdGhpcy5wYXlsb2FkVGV4dCA9IGRlY29kZWRBc0pzb247XG4gICAgICAgICAgICBpZiAodGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSkgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiAnanNvbicgfSk7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZFR5cGUgPSAneC13d3ctZm9ybS11cmxlbmNvZGVkJztcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZFRleHQgPSAnJztcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucGF5bG9hZFRleHQgPSBwYXJzZWQuYm9keTtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICAgICAgICBjb25zdCB0cmltbWVkID0gcGFyc2VkLmJvZHkudHJpbSgpO1xuICAgICAgICAgIGlmICgodHJpbW1lZC5zdGFydHNXaXRoKCd7JykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnfScpKSB8fCAodHJpbW1lZC5zdGFydHNXaXRoKCdbJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXScpKSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0VmFsdWVzID0gdGhpcy5nZXRGb3JtYXRWYWx1ZXMoKTtcbiAgICAgICAgICAgIGlmIChmb3JtYXRWYWx1ZXMuaW5jbHVkZXMoJ2pzb24nKSAmJiB0aGlzLnBheWxvYWRGb3JtYXRGb3JtKSB7XG4gICAgICAgICAgICAgIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0ucGF0Y2hWYWx1ZSh7IGZvcm1hdDogJ2pzb24nIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2VJbXBvcnRDdXJsUGFuZWwoKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVyOiBlbWl0IGNhbmNlbCBhbmQgY2xvc2UgcGFuZWwuIENhbGxlZCB3aGVuIHVzZXIgY2xpY2tzIENhbmNlbCBpbiBpbXBvcnQgY1VSTCBwYW5lbC4gKi9cbiAgb25DYW5jZWxJbXBvcnRDdXJsKCk6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0Q3VybENhbmNlbC5lbWl0KCk7XG4gICAgdGhpcy5jbG9zZUltcG9ydEN1cmxQYW5lbCgpO1xuICB9XG5cbiAgLyoqIEhhbmRsZXI6IHNob3cgaGVhZGVycyBzZWN0aW9uIChjYWxsZWQgZnJvbSBDYW5jZWwgb3IgYWZ0ZXIgSW1wb3J0IGluIGltcG9ydCBwYW5lbCkuICovXG4gIGNsb3NlSW1wb3J0Q3VybFBhbmVsKCk6IHZvaWQge1xuICAgIHRoaXMuYm9keVZpZXcgPSAnaGVhZGVycyc7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgb25TZW5kUmVxdWVzdCgpOiB2b2lkIHtcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudCAhPSBudWxsID8gU3RyaW5nKHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudCkgOiAnJztcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLnNlbGVjdGVkTWV0aG9kICE9IG51bGwgPyBTdHJpbmcodGhpcy5zZWxlY3RlZE1ldGhvZCkgOiAnJztcbiAgICB0aGlzLnNlbmRSZXF1ZXN0LmVtaXQoe1xuICAgICAgZW52aXJvbm1lbnQsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmw6IHRoaXMudXJsID8/ICcnLFxuICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgb25WYXJpYWJsZU5hbWVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICB9XG5cbiAgb25CYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID4gMSkge1xuICAgICAgdGhpcy5zZXRTdGVwKHRoaXMuY3VycmVudFN0ZXAgLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXNldEFsbFN0ZXBzQW5kRGF0YSgpO1xuICAgICAgdGhpcy5iYWNrLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBjbGlja3MgdGhlIENhbmNlbCBidXR0b24gKHN0ZXAgMSkuIEVtaXRzIGNhbmNlbCB0aGVuIHJ1bnMgbm9ybWFsIGJhY2sgZmxvdy4gKi9cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMub25CYWNrKCk7XG4gIH1cblxuICBvbk5leHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY3VycmVudFN0ZXAgPT09IDIgJiYgIXRoaXMudmFyaWFibGVOYW1lPy50cmltKCkpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lRXJyb3IgPSAnVmFyaWFibGUgTmFtZSBpcyByZXF1aXJlZC4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZhcmlhYmxlTmFtZUVycm9yID0gJyc7XG4gICAgaWYgKHRoaXMuY3VycmVudFN0ZXAgPCB0aGlzLnN0ZXBMYWJlbHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNldFN0ZXAodGhpcy5jdXJyZW50U3RlcCArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5leHQuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIHNldFBheWxvYWRUYWIodmFsdWU6IEFwaUVkaXRQYXlsb2FkVGFiKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gdmFsdWU7XG4gIH1cblxuICBzZXRSZXNwb25zZVZlcmlmaWNhdGlvblRhYih2YWx1ZTogJ3Jlc3BvbnNlLWJvZHknIHwgJ3N0YXR1cycpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiID0gdmFsdWU7XG4gIH1cblxuICBhZGRIZWFkZXIoKTogdm9pZCB7XG4gICAgdGhpcy5oZWFkZXJzRm9ybUFycmF5LnB1c2goXG4gICAgICB0aGlzLmZiLmdyb3VwKHsgbmFtZTogWycnXSwgdmFsdWU6IFsnJ10gfSlcbiAgICApO1xuICB9XG5cbiAgcmVtb3ZlSGVhZGVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmhlYWRlcnNGb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgLyoqIFdoZW4gdXNlciBhZGRzIGEgY3VzdG9tIGhlYWRlciBuYW1lIHZpYSB0aGUgZHJvcGRvd24gXCJBZGQgJ+KApidcIiBvcHRpb24sIHNldCB0aGUgY29udHJvbCB2YWx1ZS4gKi9cbiAgb25IZWFkZXJOYW1lQWRkQ3VzdG9tVmFsdWUoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSwgcm93OiBGb3JtR3JvdXApOiB2b2lkIHtcbiAgICBjb25zdCBjb250cm9sID0gcm93LmdldChldmVudC5rZXkpO1xuICAgIGlmIChjb250cm9sICYmIGV2ZW50LnZhbHVlICE9IG51bGwpIHtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUoZXZlbnQudmFsdWUudHJpbSgpKTtcbiAgICB9XG4gIH1cblxuICB0cmFja0J5SGVhZGVyKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGFkZEtleVZhbHVlUm93KCk6IHZvaWQge1xuICAgIHRoaXMua2V5VmFsdWVGb3JtQXJyYXkucHVzaCh0aGlzLmZiLmdyb3VwKHsga2V5OiBbJyddLCB2YWx1ZTogWycnXSB9KSk7XG4gIH1cblxuICByZW1vdmVLZXlWYWx1ZVJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5rZXlWYWx1ZUZvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gIH1cblxuICB0cmFja0J5S2V5VmFsdWUoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgYWRkS2V5VHlwZVZhbHVlUm93KCk6IHZvaWQge1xuICAgIHRoaXMua2V5VHlwZVZhbHVlRm9ybUFycmF5LnB1c2godGhpcy5mYi5ncm91cCh7IGtleTogWycnXSwgdHlwZTogWyd0ZXh0J10sIHZhbHVlOiBbJyddIH0pKTtcbiAgfVxuXG4gIHJlbW92ZUtleVR5cGVWYWx1ZVJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5rZXlUeXBlVmFsdWVGb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgdHJhY2tCeUtleVR5cGVWYWx1ZShpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBhZGRQYXJhbXNSb3coKTogdm9pZCB7XG4gICAgdGhpcy5wYXJhbXNGb3JtQXJyYXkucHVzaCh0aGlzLmZiLmdyb3VwKHsga2V5OiBbJyddLCB2YWx1ZTogWycnXSB9KSk7XG4gIH1cblxuICByZW1vdmVQYXJhbXNSb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIHRyYWNrQnlQYXJhbXMoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgYWRkVmVyaWZpY2F0aW9uUm93KCk6IHZvaWQge1xuICAgIHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5LnB1c2goXG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAganNvblBhdGg6IFsnJ10sXG4gICAgICAgIHZlcmlmaWNhdGlvbjogW3RoaXMuZ2V0RGVmYXVsdFZlcmlmaWNhdGlvbigpXSxcbiAgICAgICAgZGF0YVR5cGU6IFt0aGlzLmdldERlZmF1bHREYXRhVHlwZSgpXSxcbiAgICAgICAgZXhwZWN0ZWRWYWx1ZTogWycnXSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZVZlcmlmaWNhdGlvblJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgdHJhY2tCeVZlcmlmaWNhdGlvbihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKiogV2hlbiBEYXRhIFR5cGUgY2hhbmdlcyBpbiBSZXNwb25zZSBCb2R5IHZlcmlmaWNhdGlvbiwgcmVzZXQgRXhwZWN0ZWQgVmFsdWUgZm9yIHRoYXQgcm93LiAqL1xuICBvblZlcmlmaWNhdGlvbkRhdGFUeXBlQ2hhbmdlKHJvdzogRm9ybUdyb3VwLCBldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfSk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdkYXRhVHlwZScpIHtcbiAgICAgIHJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBhZGRTdGF0dXNWZXJpZmljYXRpb25Sb3coKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkucHVzaChcbiAgICAgIHRoaXMuZmIuZ3JvdXAoeyB2ZXJpZmljYXRpb246IFt0aGlzLmdldERlZmF1bHRTdGF0dXNWZXJpZmljYXRpb24oKV0sIGV4cGVjdGVkVmFsdWU6IFsnJ10gfSlcbiAgICApO1xuICB9XG5cbiAgcmVtb3ZlU3RhdHVzVmVyaWZpY2F0aW9uUm93KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gIH1cblxuICB0cmFja0J5U3RhdHVzVmVyaWZpY2F0aW9uKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKiBFbWl0IGFsbCBlbnRlcmVkIGRldGFpbHMgKGVudmlyb25tZW50LCBIVFRQIG1ldGhvZCwgVVJMLCBoZWFkZXJzLCBib2R5LCBzdGVwMiB2YXJpYWJsZSwgc3RlcDMgdmVyaWZpY2F0aW9ucykgd2hlbiB1c2VyIGNsaWNrcyBDcmVhdGUuICovXG4gIG9uQ3JlYXRlKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCc5OTk5OTk5Jyk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmdldENyZWF0ZVBheWxvYWQoKTtcbiAgICAgIGNvbnNvbGUubG9nKCc5OTk5OTk5IHBheWxvYWQnLCBwYXlsb2FkKTtcbiAgICAgIHRoaXMuY3JlYXRlLmVtaXQocGF5bG9hZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdBcGlFZGl0U3RlcCBnZXRDcmVhdGVQYXlsb2FkIGVycm9yOicsIGVycik7XG4gICAgICB0aGlzLmNyZWF0ZS5lbWl0KHRoaXMuZ2V0Q3JlYXRlUGF5bG9hZEZhbGxiYWNrKCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBNaW5pbWFsIHBheWxvYWQgd2hlbiBnZXRDcmVhdGVQYXlsb2FkIHRocm93cyAoc28gY3JlYXRlIGFsd2F5cyBlbWl0cykuICovXG4gIHByaXZhdGUgZ2V0Q3JlYXRlUGF5bG9hZEZhbGxiYWNrKCk6IEFwaUVkaXRDcmVhdGVQYXlsb2FkIHtcbiAgICBjb25zdCBhdXRoVHlwZSA9IHRoaXMuc2VsZWN0ZWRBdXRoVHlwZTtcbiAgICBjb25zdCBiZWFyZXJUb2tlbiA9IGF1dGhUeXBlID09PSAnYmVhcmVyJyA/ICh0aGlzLmJlYXJlclRva2VuID8/ICcnKSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgb2F1dGgyOiBBcGlFZGl0T0F1dGgyUGF5bG9hZCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYXV0aFR5cGUgPT09ICdvYXV0aDInICYmIHRoaXMub2F1dGgyRm9ybSkge1xuICAgICAgY29uc3QgZ3JhbnRUeXBlID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0Q29udHJvbFZhbHVlKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2dyYW50VHlwZScpIGFzIHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwpO1xuICAgICAgY29uc3QgY2xpZW50QXV0aCA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldENvbnRyb2xWYWx1ZSh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdjbGllbnRBdXRoZW50aWNhdGlvbicpIGFzIHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwpO1xuICAgICAgb2F1dGgyID0ge1xuICAgICAgICBncmFudFR5cGU6IGdyYW50VHlwZSAhPT0gJycgPyBncmFudFR5cGUgOiAnY2xpZW50X2NyZWRlbnRpYWxzJyxcbiAgICAgICAgYWNjZXNzVG9rZW5Vcmw6ICh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdhY2Nlc3NUb2tlblVybCcpPy52YWx1ZSA/PyAnJykgYXMgc3RyaW5nLFxuICAgICAgICBjbGllbnRJZDogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2NsaWVudElkJyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIGNsaWVudFNlY3JldDogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2NsaWVudFNlY3JldCcpPy52YWx1ZSA/PyAnJykgYXMgc3RyaW5nLFxuICAgICAgICBzY29wZTogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ3Njb3BlJyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIGNsaWVudEF1dGhlbnRpY2F0aW9uOiBjbGllbnRBdXRoICE9PSAnJyA/IGNsaWVudEF1dGggOiAnYmFzaWMnLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0ZXAxOiB7XG4gICAgICAgIGVudmlyb25tZW50OiAnJyxcbiAgICAgICAgbWV0aG9kOiAnJyxcbiAgICAgICAgdXJsOiB0aGlzLnVybCA/PyAnJyxcbiAgICAgICAgaGVhZGVyczogW10sXG4gICAgICAgIGF1dGhUeXBlLFxuICAgICAgICAuLi4oYmVhcmVyVG9rZW4gIT09IHVuZGVmaW5lZCAmJiB7IGJlYXJlclRva2VuIH0pLFxuICAgICAgICAuLi4ob2F1dGgyICE9PSB1bmRlZmluZWQgJiYgeyBvYXV0aDIgfSksXG4gICAgICAgIGFjdGl2ZVBheWxvYWRUYWI6IHRoaXMuYWN0aXZlUGF5bG9hZFRhYixcbiAgICAgICAgcGF5bG9hZFR5cGU6IHRoaXMucGF5bG9hZFR5cGUsXG4gICAgICAgIHBheWxvYWRGb3JtYXQ6ICcnLFxuICAgICAgICBwYXlsb2FkVGV4dDogdGhpcy5wYXlsb2FkVGV4dCA/PyAnJyxcbiAgICAgICAga2V5VmFsdWVSb3dzOiBbXSxcbiAgICAgICAga2V5VHlwZVZhbHVlUm93czogW10sXG4gICAgICAgIHBhcmFtc1Jvd3M6IFtdLFxuICAgICAgfSxcbiAgICAgIHN0ZXAyOiB7IHZhcmlhYmxlTmFtZTogdGhpcy52YXJpYWJsZU5hbWUgPz8gJycgfSxcbiAgICAgIHN0ZXAzOiB7XG4gICAgICAgIGFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiOiB0aGlzLmFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiLFxuICAgICAgICByZXNwb25zZUJvZHlWZXJpZmljYXRpb25zOiBbXSxcbiAgICAgICAgc3RhdHVzVmVyaWZpY2F0aW9uczogW10sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogTm9ybWFsaXplIGZvcm0gY29udHJvbCB2YWx1ZSB0byBzdHJpbmcgKGhhbmRsZXMgb2JqZWN0IG9yIHN0cmluZykuICovXG4gIHByaXZhdGUgc3RhdGljIGdldENvbnRyb2xWYWx1ZShjb250cm9sOiB7IHZhbHVlOiB1bmtub3duIH0gfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBjb25zdCB2ID0gY29udHJvbD8udmFsdWU7XG4gICAgaWYgKHYgPT0gbnVsbCB8fCB2ID09PSAnJykgcmV0dXJuICcnO1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJykgOiBTdHJpbmcodik7XG4gIH1cblxuICAvKiogQnVpbGQgZnVsbCBjcmVhdGUgcGF5bG9hZDogZW52aXJvbm1lbnQsIEhUVFAgbWV0aG9kLCBVUkwsIGhlYWRlcnMsIGJvZHkgKHN0ZXAxKSwgdmFyaWFibGUgbmFtZSAoc3RlcDIpLCB2ZXJpZmljYXRpb25zIChzdGVwMykuICovXG4gIHByaXZhdGUgZ2V0Q3JlYXRlUGF5bG9hZCgpOiBBcGlFZGl0Q3JlYXRlUGF5bG9hZCB7XG4gICAgY29uc3QgZW52RnJvbUZvcm0gPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRDb250cm9sVmFsdWUodGhpcy5lbnZpcm9ubWVudEZvcm0/LmdldCgnZW52aXJvbm1lbnQnKSBhcyB7IHZhbHVlOiB1bmtub3duIH0gfCBudWxsKTtcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9XG4gICAgICBlbnZGcm9tRm9ybSAhPT0gJycgPyBlbnZGcm9tRm9ybSA6ICh0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlICE9PSAnJyA/IHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgOiB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnQpO1xuICAgIGNvbnN0IG1ldGhvZEZyb21Gb3JtID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0Q29udHJvbFZhbHVlKHRoaXMubWV0aG9kRm9ybT8uZ2V0KCdtZXRob2QnKSBhcyB7IHZhbHVlOiB1bmtub3duIH0gfCBudWxsKTtcbiAgICBjb25zdCBtZXRob2QgPVxuICAgICAgbWV0aG9kRnJvbUZvcm0gIT09ICcnID8gbWV0aG9kRnJvbUZvcm0gOiAodGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgIT09ICcnID8gdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgOiB0aGlzLnNlbGVjdGVkTWV0aG9kKTtcbiAgICBjb25zdCBmb3JtYXQgPSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtPy5nZXQoJ2Zvcm1hdCcpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBrZXlWYWx1ZUZvcm1BcnJheSA9IHRoaXMua2V5VmFsdWVGb3JtQXJyYXk7XG4gICAgY29uc3Qga2V5VmFsdWVSb3dzID0gKGtleVZhbHVlRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkubWFwKChjKSA9PiAoe1xuICAgICAga2V5OiAoYyBhcyBGb3JtR3JvdXApLmdldCgna2V5Jyk/LnZhbHVlID8/ICcnLFxuICAgICAgdmFsdWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gICAgY29uc3Qga2V5VHlwZVZhbHVlRm9ybUFycmF5ID0gdGhpcy5rZXlUeXBlVmFsdWVGb3JtQXJyYXk7XG4gICAgY29uc3Qga2V5VHlwZVZhbHVlUm93cyA9IChrZXlUeXBlVmFsdWVGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKS5tYXAoKGMpID0+ICh7XG4gICAgICBrZXk6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdrZXknKT8udmFsdWUgPz8gJycsXG4gICAgICB0eXBlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgndHlwZScpPy52YWx1ZSA/PyAndGV4dCcsXG4gICAgICB2YWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnLFxuICAgIH0pKTtcbiAgICBjb25zdCBwYXJhbXNGb3JtQXJyYXkgPSB0aGlzLnBhcmFtc0Zvcm1BcnJheTtcbiAgICBjb25zdCBwYXJhbXNSb3dzID0gKHBhcmFtc0Zvcm1BcnJheT8uY29udHJvbHMgPz8gW10pLm1hcCgoYykgPT4gKHtcbiAgICAgIGtleTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2tleScpPy52YWx1ZSA/PyAnJyxcbiAgICAgIHZhbHVlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgndmFsdWUnKT8udmFsdWUgPz8gJycsXG4gICAgfSkpO1xuICAgIGNvbnN0IHZlcmlmaWNhdGlvbkZvcm1BcnJheSA9IHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5O1xuICAgIGNvbnN0IHJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnMgPSAodmVyaWZpY2F0aW9uRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkubWFwKChjKSA9PiAoe1xuICAgICAganNvblBhdGg6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdqc29uUGF0aCcpPy52YWx1ZSA/PyAnJyxcbiAgICAgIHZlcmlmaWNhdGlvbjogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZlcmlmaWNhdGlvbicpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGRhdGFUeXBlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgnZGF0YVR5cGUnKT8udmFsdWUgPz8gJycsXG4gICAgICBleHBlY3RlZFZhbHVlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgnZXhwZWN0ZWRWYWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gICAgY29uc3Qgc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5ID0gdGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXk7XG4gICAgY29uc3Qgc3RhdHVzVmVyaWZpY2F0aW9ucyA9IChzdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKS5tYXAoKGMpID0+ICh7XG4gICAgICB2ZXJpZmljYXRpb246IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2ZXJpZmljYXRpb24nKT8udmFsdWUgPz8gJycsXG4gICAgICBleHBlY3RlZFZhbHVlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgnZXhwZWN0ZWRWYWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gICAgY29uc3QgYXV0aFR5cGUgPSB0aGlzLnNlbGVjdGVkQXV0aFR5cGU7XG4gICAgY29uc3QgYmVhcmVyVG9rZW4gPSBhdXRoVHlwZSA9PT0gJ2JlYXJlcicgPyAodGhpcy5iZWFyZXJUb2tlbiA/PyAnJykgOiB1bmRlZmluZWQ7XG4gICAgbGV0IG9hdXRoMjogQXBpRWRpdE9BdXRoMlBheWxvYWQgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGF1dGhUeXBlID09PSAnb2F1dGgyJyAmJiB0aGlzLm9hdXRoMkZvcm0pIHtcbiAgICAgIGNvbnN0IGdyYW50VHlwZSA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldENvbnRyb2xWYWx1ZSh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdncmFudFR5cGUnKSBhcyB7IHZhbHVlOiB1bmtub3duIH0gfCBudWxsKTtcbiAgICAgIGNvbnN0IGNsaWVudEF1dGggPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRDb250cm9sVmFsdWUodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50QXV0aGVudGljYXRpb24nKSBhcyB7IHZhbHVlOiB1bmtub3duIH0gfCBudWxsKTtcbiAgICAgIG9hdXRoMiA9IHtcbiAgICAgICAgZ3JhbnRUeXBlOiBncmFudFR5cGUgIT09ICcnID8gZ3JhbnRUeXBlIDogJ2NsaWVudF9jcmVkZW50aWFscycsXG4gICAgICAgIGFjY2Vzc1Rva2VuVXJsOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnYWNjZXNzVG9rZW5VcmwnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50SWQ6ICh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdjbGllbnRJZCcpPy52YWx1ZSA/PyAnJykgYXMgc3RyaW5nLFxuICAgICAgICBjbGllbnRTZWNyZXQ6ICh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdjbGllbnRTZWNyZXQnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgc2NvcGU6ICh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdzY29wZScpPy52YWx1ZSA/PyAnJykgYXMgc3RyaW5nLFxuICAgICAgICBjbGllbnRBdXRoZW50aWNhdGlvbjogY2xpZW50QXV0aCAhPT0gJycgPyBjbGllbnRBdXRoIDogJ2Jhc2ljJyxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzdGVwMToge1xuICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICB1cmw6IHRoaXMudXJsID8/ICcnLFxuICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgIGF1dGhUeXBlLFxuICAgICAgICAuLi4oYmVhcmVyVG9rZW4gIT09IHVuZGVmaW5lZCAmJiB7IGJlYXJlclRva2VuIH0pLFxuICAgICAgICAuLi4ob2F1dGgyICE9PSB1bmRlZmluZWQgJiYgeyBvYXV0aDIgfSksXG4gICAgICAgIGFjdGl2ZVBheWxvYWRUYWI6IHRoaXMuYWN0aXZlUGF5bG9hZFRhYixcbiAgICAgICAgcGF5bG9hZFR5cGU6IHRoaXMucGF5bG9hZFR5cGUsXG4gICAgICAgIHBheWxvYWRGb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgcGF5bG9hZFRleHQ6IHRoaXMucGF5bG9hZFRleHQgPz8gJycsXG4gICAgICAgIGtleVZhbHVlUm93cyxcbiAgICAgICAga2V5VHlwZVZhbHVlUm93cyxcbiAgICAgICAgcGFyYW1zUm93cyxcbiAgICAgIH0sXG4gICAgICBzdGVwMjoge1xuICAgICAgICB2YXJpYWJsZU5hbWU6IHRoaXMudmFyaWFibGVOYW1lID8/ICcnLFxuICAgICAgfSxcbiAgICAgIHN0ZXAzOiB7XG4gICAgICAgIGFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiOiB0aGlzLmFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiLFxuICAgICAgICByZXNwb25zZUJvZHlWZXJpZmljYXRpb25zLFxuICAgICAgICBzdGF0dXNWZXJpZmljYXRpb25zLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEN1cnJlbnQgaGVhZGVyIHJvd3MgZnJvbSBmb3JtIChmb3IgY29uc3VtZXJzIHRoYXQgcmVhZCBoZWFkZXJzKSAqL1xuICBnZXQgaGVhZGVycygpOiBBcGlFZGl0SGVhZGVyUm93W10ge1xuICAgIGlmICghdGhpcy5oZWFkZXJzRm9ybUFycmF5KSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5jb250cm9scy5tYXAoKGMpID0+ICh7XG4gICAgICBuYW1lOiAoYyBhcyBGb3JtR3JvdXApLmdldCgnbmFtZScpPy52YWx1ZSA/PyAnJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgdmFsdWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxNZXRob2QnXT8uY3VycmVudFZhbHVlICE9IG51bGwgJiYgdGhpcy5tZXRob2RGb3JtKSB7XG4gICAgICBjb25zdCB2ID0gY2hhbmdlc1snaW5pdGlhbE1ldGhvZCddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gdHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKTtcbiAgICAgIHRoaXMubWV0aG9kRm9ybS5wYXRjaFZhbHVlKHsgbWV0aG9kOiB2IH0pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaHR0cE1ldGhvZE9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVNZXRob2RTZWxlY3RDb25maWcoKTtcbiAgICAgIGlmICh0aGlzLm1ldGhvZEZvcm0gJiYgdGhpcy5odHRwTWV0aG9kT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLm1ldGhvZEZvcm0uZ2V0KCdtZXRob2QnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0TWV0aG9kVmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IHZhbGlkID0gdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnQpO1xuICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnNbMF0pO1xuICAgICAgICAgIGlmIChmaXJzdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gZmlyc3RWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMubWV0aG9kRm9ybS5wYXRjaFZhbHVlKHsgbWV0aG9kOiBmaXJzdFZhbHVlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbEVudmlyb25tZW50J10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsICYmIHRoaXMuZW52aXJvbm1lbnRGb3JtKSB7XG4gICAgICBjb25zdCB2ID0gY2hhbmdlc1snaW5pdGlhbEVudmlyb25tZW50J10uY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9IHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IHYgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgICB0aGlzLmVudmlyb25tZW50Rm9ybS5wYXRjaFZhbHVlKHsgZW52aXJvbm1lbnQ6IHYgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydlbnZpcm9ubWVudE9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVFbnZpcm9ubWVudFNlbGVjdENvbmZpZygpO1xuICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnRGb3JtICYmIHRoaXMuZW52aXJvbm1lbnRPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuZW52aXJvbm1lbnRGb3JtLmdldCgnZW52aXJvbm1lbnQnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0RW52aXJvbm1lbnRWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgdmFsaWQgPSB2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCk7XG4gICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5lbnZpcm9ubWVudE9wdGlvbnNbMF0pO1xuICAgICAgICAgIGlmIChmaXJzdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgPSBmaXJzdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudEZvcm0ucGF0Y2hWYWx1ZSh7IGVudmlyb25tZW50OiBmaXJzdFZhbHVlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbEF1dGhUeXBlJ10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsICYmIHRoaXMuYXV0aFR5cGVGb3JtKSB7XG4gICAgICBjb25zdCB2ID0gY2hhbmdlc1snaW5pdGlhbEF1dGhUeXBlJ10uY3VycmVudFZhbHVlO1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPVxuICAgICAgICB0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyB2IDogQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KTtcbiAgICAgIGlmIChyZXNvbHZlZCAhPSBudWxsKSB0aGlzLmF1dGhUeXBlRm9ybS5wYXRjaFZhbHVlKHsgYXV0aFR5cGU6IHYgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydhdXRoVHlwZU9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVBdXRoVHlwZVNlbGVjdENvbmZpZygpO1xuICAgICAgaWYgKHRoaXMuYXV0aFR5cGVGb3JtKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0QXV0aFR5cGVWYWx1ZXMoKTtcbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuYXV0aFR5cGVGb3JtLmdldCgnYXV0aFR5cGUnKT8udmFsdWU7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbCA9XG4gICAgICAgICAgICBjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudCAhPT0gJydcbiAgICAgICAgICAgICAgPyB0eXBlb2YgY3VycmVudCA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGN1cnJlbnQgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dClcbiAgICAgICAgICAgICAgICA6IFN0cmluZyhjdXJyZW50KVxuICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgY29uc3QgdmFsaWQgPSBjdXJyZW50VmFsICE9IG51bGwgJiYgdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnRWYWwpO1xuICAgICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSB2YWx1ZXNbMF07XG4gICAgICAgICAgICBpZiAoZmlyc3RWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHRoaXMuYXV0aFR5cGVGb3JtLnBhdGNoVmFsdWUoeyBhdXRoVHlwZTogZmlyc3RWYWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxTdGVwJ10pIHtcbiAgICAgIHRoaXMuYXBwbHlJbml0aWFsU3RlcChjaGFuZ2VzWydpbml0aWFsU3RlcCddLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsVXJsJ10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnVybCA9IGNoYW5nZXNbJ2luaXRpYWxVcmwnXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsUGF5bG9hZFRhYiddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gY2hhbmdlc1snaW5pdGlhbFBheWxvYWRUYWInXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydoZWFkZXJOYW1lT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxIZWFkZXJzJ10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmJ1aWxkSGVhZGVyc0Zvcm1BcnJheShjaGFuZ2VzWydpbml0aWFsSGVhZGVycyddLmN1cnJlbnRWYWx1ZSBhcyBBcGlFZGl0SGVhZGVyUm93W10pO1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsUmVzcG9uc2VQcmV2aWV3J10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnJlc3BvbnNlUHJldmlldyA9IGNoYW5nZXNbJ2luaXRpYWxSZXNwb25zZVByZXZpZXcnXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsRm9ybWF0J10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsICYmIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0pIHtcbiAgICAgIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0ucGF0Y2hWYWx1ZSh7IGZvcm1hdDogY2hhbmdlc1snaW5pdGlhbEZvcm1hdCddLmN1cnJlbnRWYWx1ZSB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxWYXJpYWJsZU5hbWUnXT8uY3VycmVudFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lID0gY2hhbmdlc1snaW5pdGlhbFZhcmlhYmxlTmFtZSddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2Zvcm1hdE9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVQYXlsb2FkRm9ybWF0U2VsZWN0Q29uZmlnKCk7XG4gICAgICBpZiAodGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5nZXQoJ2Zvcm1hdCcpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRGb3JtYXRWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgdmFsaWQgPSB2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCk7XG4gICAgICAgIGlmICghdmFsaWQgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gdmFsdWVzWzBdO1xuICAgICAgICAgIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0ucGF0Y2hWYWx1ZSh7IGZvcm1hdDogZmlyc3RWYWx1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndmVyaWZpY2F0aW9uT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZlcmlmaWNhdGlvblNlbGVjdENvbmZpZygpO1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWZXJpZmljYXRpb25WYWx1ZXMoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWZXJpZmljYXRpb24gPSB0aGlzLmdldERlZmF1bHRWZXJpZmljYXRpb24oKTtcbiAgICAgIGlmICh0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheSAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IChjb250cm9sIGFzIEZvcm1Hcm91cCkuZ2V0KCd2ZXJpZmljYXRpb24nKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgJiYgIXZhbHVlcy5pbmNsdWRlcyhjdXJyZW50KSkge1xuICAgICAgICAgICAgKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5wYXRjaFZhbHVlKHsgdmVyaWZpY2F0aW9uOiBkZWZhdWx0VmVyaWZpY2F0aW9uIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd2ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVWZXJpZmljYXRpb25EYXRhVHlwZVNlbGVjdENvbmZpZygpO1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXREYXRhVHlwZVZhbHVlcygpO1xuICAgICAgY29uc3QgZGVmYXVsdERhdGFUeXBlID0gdGhpcy5nZXREZWZhdWx0RGF0YVR5cGUoKTtcbiAgICAgIGlmICh0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheSAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IChjb250cm9sIGFzIEZvcm1Hcm91cCkuZ2V0KCdkYXRhVHlwZScpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoY3VycmVudCAmJiAhdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAoY29udHJvbCBhcyBGb3JtR3JvdXApLnBhdGNoVmFsdWUoeyBkYXRhVHlwZTogZGVmYXVsdERhdGFUeXBlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzdGF0dXNWZXJpZmljYXRpb25PcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlU3RhdHVzVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnKCk7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFN0YXR1c1ZlcmlmaWNhdGlvblZhbHVlcygpO1xuICAgICAgY29uc3QgZGVmYXVsdFZlcmlmaWNhdGlvbiA9IHRoaXMuZ2V0RGVmYXVsdFN0YXR1c1ZlcmlmaWNhdGlvbigpO1xuICAgICAgaWYgKHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5ICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZlcmlmaWNhdGlvbicpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoY3VycmVudCAmJiAhdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAoY29udHJvbCBhcyBGb3JtR3JvdXApLnBhdGNoVmFsdWUoeyB2ZXJpZmljYXRpb246IGRlZmF1bHRWZXJpZmljYXRpb24gfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1jb250YWluZXIgY3FhLWJnLVsjZmZmZmZmXSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1wLVsxNnB4XSBjcWEtZ2FwLVsxMnB4XSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1vdmVyZmxvdy14LWhpZGRlbiBjcWEtYm94LWJvcmRlclwiPlxuXG4gIDxoMiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXRpdGxlIGNxYS1mb250LWludGVyIGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTAwJV0gY3FhLXRyYWNraW5nLW5vcm1hbCBjcWEtdGV4dC1bIzAwMDAwMF0gY3FhLW0tMFwiPlxuICAgIHt7IGVkaXRNb2RlID8gJ1VwZGF0ZSBBUEkgVGVzdCBTdGVwJyA6ICdDcmVhdGUgQVBJIFRlc3QgU3RlcCcgfX1cbiAgPC9oMj5cblxuICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW5kaWNhdG9yIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0wIGNxYS1tYXgtWzc2N3B4XTpjcWEtZmxleC13cmFwIGNxYS1tYXgtWzc2N3B4XTpjcWEtZ2FwLTIgY3FhLW1heC1bNzY3cHhdOmNxYS1qdXN0aWZ5LXN0YXJ0XCJcbiAgICBbY2xhc3MuY3FhLWp1c3RpZnktc3RhcnRdPVwic3RlcExhYmVscy5sZW5ndGggPT09IDFcIlxuICAgIFtjbGFzcy5jcWEtanVzdGlmeS1iZXR3ZWVuXT1cInN0ZXBMYWJlbHMubGVuZ3RoICE9PSAxXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RlcCBvZiBzdGVwTGFiZWxzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIlxuICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvci1pdGVtIGNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvci1pdGVtLS1jbGlja2FibGUgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVsxMHB4XSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWZvbnQtaW5oZXJpdCBjcWEtdGV4dC1pbmhlcml0IGNxYS10ZXh0LWxlZnQgIWNxYS1iZy10cmFuc3BhcmVudFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1N0ZXAgJyArIHN0ZXAuaW5kZXggKyAnOiAnICsgc3RlcC5sYWJlbFwiIFthdHRyLmFyaWEtcHJlc3NlZF09XCJzdGVwLmluZGV4ID09PSBjdXJyZW50U3RlcFwiXG4gICAgICAgIChjbGlja2VkKT1cInNldFN0ZXAoc3RlcC5pbmRleClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbmRpY2F0b3ItY2lyY2xlIGNxYS13LTggY3FhLWgtOCBjcWEtcm91bmRlZC1mdWxsIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLWxlYWRpbmctbm9uZSBjcWEtYm9yZGVyLW5vbmUgY3FhLXNocmluay0wXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJzdGVwLmluZGV4ID09PSBjdXJyZW50U3RlcCA/ICdjcWEtYmctWyM0RjQ2RTVdIGNxYS10ZXh0LXdoaXRlJyA6ICdjcWEtYmctWyNFMEUwRTBdIGNxYS10ZXh0LVsjNjY2NjY2XSdcIj5cbiAgICAgICAgICB7eyBzdGVwLmluZGV4IH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbmRpY2F0b3ItbGFiZWwgY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtbWF4LVs3NjdweF06Y3FhLXRleHQteHNcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInN0ZXAuaW5kZXggPT09IGN1cnJlbnRTdGVwID8gJ2NxYS10ZXh0LVsjNEY0NkU1XScgOiAnY3FhLXRleHQtWyM2NjY2NjZdJ1wiPlxuICAgICAgICAgIHt7IHN0ZXAubGFiZWwgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaSA8IHN0ZXBMYWJlbHMubGVuZ3RoIC0gMVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW5kaWNhdG9yLWxpbmUgY3FhLXctWzk2cHhdIGNxYS1oLVsycHhdIGNxYS1iZy1bI0UwRTBFMF0gY3FhLW15LTAgY3FhLW14LVs2cHhdIGNxYS1zaHJpbmstMCBjcWEtc2VsZi1jZW50ZXIgY3FhLW1heC1bNzY3cHhdOmNxYS13LVsyNHB4XSBjcWEtbWF4LVs3NjdweF06Y3FhLW14LTFcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2Rpdj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTdGVwIGNvbnRlbnQgdmlld3BvcnQ6IG9ubHkgdGhlIGFjdGl2ZSBzdGVwIGJvZHkgaXMgc2hvd24gKCpuZ0lmKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZpZXdwb3J0IGNxYS13LWZ1bGxcIj5cbiAgICA8IS0tIFN0ZXAgMTogRW52aXJvbm1lbnQsIHJlcXVlc3QsIGJvZHksIHJlc3BvbnNlIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U3RlcCA9PT0gMVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGFuZWwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNiBjcWEtYm94LWJvcmRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgIDwhLS0gRW52aXJvbm1lbnQgcm93OiBuZXcgbGluZSwgc2VsZWN0IGFsaWduZWQgcmlnaHQgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1lbnZpcm9ubWVudC1yb3cgY3FhLWZsZXggY3FhLWp1c3RpZnktZW5kIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0ICpuZ0lmPVwiZW52aXJvbm1lbnRGb3JtXCIgW2Zvcm1dPVwiZW52aXJvbm1lbnRGb3JtXCIgW2NvbmZpZ109XCJlbnZpcm9ubWVudFNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWVudmlyb25tZW50LXNlbGVjdCBjcWEtc2hyaW5rLTAgY3FhLXctYXV0byBjcWEtbWluLXctWzMxNXB4XSBjcWEtbWF4LXctWzMxNXB4XSBjcWEtbWF4LVs3NjdweF06Y3FhLW1pbi13LTAgY3FhLW1heC1bNzY3cHhdOmNxYS1tYXgtdy1mdWxsIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsIFsmXy5tYXQtZm9ybS1maWVsZC13cmFwcGVyXTpjcWEtcGItMFwiIGFyaWEtbGFiZWw9XCJFbnZpcm9ubWVudFwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uRW52aXJvbm1lbnRTZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJlcXVlc3Qgcm93OiBtZXRob2QsIFVSTCwgYnV0dG9ucyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXJlcXVlc3Qtcm93IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1mbGV4LXdyYXAgY3FhLW1heC1bNzY3cHhdOmNxYS1mbGV4LWNvbCBjcWEtbWF4LVs3NjdweF06Y3FhLWl0ZW1zLXN0cmV0Y2ggY3FhLW1heC1bNzY3cHhdOmNxYS1nYXAtMi41XCI+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cIm1ldGhvZEZvcm1cIiBbZm9ybV09XCJtZXRob2RGb3JtXCIgW2NvbmZpZ109XCJtZXRob2RTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1tZXRob2Qtc2VsZWN0IGNxYS1zaHJpbmstMCBjcWEtdy1hdXRvIGNxYS1taW4tdy1bMTUycHhdIGNxYS1tYXgtdy1bMTUycHhdIGNxYS1tYXgtWzc2N3B4XTpjcWEtbWluLXctMCBjcWEtbWF4LVs3NjdweF06Y3FhLW1heC13LWZ1bGwgY3FhLW1heC1bNzY3cHhdOmNxYS13LWZ1bGxcIiBhcmlhLWxhYmVsPVwiSFRUUCBtZXRob2RcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbk1ldGhvZFNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXVybC13cmFwIGNxYS1mbGV4LTEgY3FhLW1pbi13LVsyMDBweF0gY3FhLW1heC1bNzY3cHhdOmNxYS1taW4tdy0wIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsIFsmX2NxYS1jdXN0b20taW5wdXRfLmNxYS1yZWxhdGl2ZV9pbnB1dF06Y3FhLWgtWzQwcHhdIFsmX2NxYS1jdXN0b20taW5wdXRfLmNxYS1yZWxhdGl2ZV9pbnB1dF06Y3FhLWJnLXdoaXRlIFsmX2NxYS1jdXN0b20taW5wdXRfLmNxYS1yZWxhdGl2ZV9pbnB1dF06Y3FhLWJvcmRlciBbJl9jcWEtY3VzdG9tLWlucHV0Xy5jcWEtcmVsYXRpdmVfaW5wdXRdOmNxYS1ib3JkZXItc29saWQgWyZfY3FhLWN1c3RvbS1pbnB1dF8uY3FhLXJlbGF0aXZlX2lucHV0XTpjcWEtYm9yZGVyLVsjRDFENURCXSBbJl9jcWEtY3VzdG9tLWlucHV0Xy5jcWEtcmVsYXRpdmVfaW5wdXRdOmNxYS1yb3VuZGVkLW1kIFsmX2NxYS1jdXN0b20taW5wdXRfLmNxYS1yZWxhdGl2ZV9pbnB1dF06Y3FhLXRleHQtc20gWyZfY3FhLWN1c3RvbS1pbnB1dF8uY3FhLXJlbGF0aXZlX2lucHV0XTpjcWEtdGV4dC1bIzM3NDE1MV1cIj5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFsodmFsdWUpXT1cInVybFwiIFtsYWJlbF09XCInJ1wiIHBsYWNlaG9sZGVyPVwiXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cIm1kXCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXRyaWdnZXIgY3FhLWNvbnRlbnRzIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsIGNxYS1tYXgtWzc2N3B4XTohY3FhLWZsZXhcIiAoY2xpY2spPVwib3BlbkltcG9ydEN1cmxQYW5lbCgpXCI+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIkltcG9ydCBBUEkgY1VSTFwiXG4gICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYnRuLW91dGxpbmUgIWNxYS1iZy13aGl0ZSAhY3FhLWJvcmRlciAhY3FhLWJvcmRlci1zb2xpZCAhY3FhLWJvcmRlci1bIzZCNzI4MF0gY3FhLXRleHQtWyM0MTQxNDZdIGNxYS1mb250LWludGVyIGNxYS10ZXh0LVsxNHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTAwJV0gY3FhLXRyYWNraW5nLW5vcm1hbCBob3ZlcjohY3FhLWJnLVsjRjlGQUZCXSBob3ZlcjohY3FhLXRleHQtWyM0MTQxNDZdIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJTZW5kIFJlcXVlc3RcIiAoY2xpY2tlZCk9XCJvblNlbmRSZXF1ZXN0KClcIlxuICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1idG4tcHJpbWFyeSBjcWEtZm9udC1pbnRlciBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzEwMCVdIGNxYS10cmFja2luZy1ub3JtYWwgIWNxYS1iZy1bIzNGNDNFRV0gY3FhLXRleHQtWyNGQkZDRkZdICFjcWEtYm9yZGVyLW5vbmUgY3FhLXB5LTIuNSBjcWEtcHgtNiBjcWEtZ2FwLTIgY3FhLXJvdW5kZWQtbGcgY3FhLW1pbi1oLVszN3B4XSBjcWEtYm94LWJvcmRlciBob3ZlcjohY3FhLWJnLVsjMUIxRkVCXSBjcWEtbWF4LVs3NjdweF06Y3FhLXctZnVsbFwiPlxuICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cblxuXG4gICAgICAgIDwhLS0gQm9keSBjb250ZW50OiBoZWFkZXIgc2VjdGlvbiAoZGVmYXVsdCkgT1IgaW1wb3J0IGNVUkwgc2VjdGlvbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJvZHlWaWV3ID09PSAnaW1wb3J0LWN1cmwnXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXBhbmVsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1zaGFkb3ctWzBfMXB4XzNweF9yZ2JhKDAsMCwwLDAuMDgpXSBjcWEtb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtaGVhZGVyIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHktMyBjcWEtcHgtNSBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtYmctWyNGOUZBRkJdIGNxYS1yb3VuZGVkLXQtbGcgY3FhLW1heC1bNzY3cHhdOmNxYS1weC00XCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXRpdGxlIGNxYS1tLTAgY3FhLXRleHQteHMgY3FhLWZvbnQtYm9sZCBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRleHQtWyMzNzQxNTFdXCI+SW1wb3J0IEFQSSBjVVJMPC9oMz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXNlcGFyYXRvciBjcWEtaC1weCBjcWEtYmctWyNFMkU4RjBdIGNxYS1teS0wIGNxYS1teC01XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYm9keVwiPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYSBbdmFsdWVdPVwiaW1wb3J0Q3VybENvbnRyb2wudmFsdWVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJpbXBvcnRDdXJsQ29udHJvbC5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBhc3RlIHlvdXIgY1VSTCBjb21tYW5kIGhlcmUgKGUuZy4sIGN1cmwgLVggUE9TVCBodHRwczovL2FwaS5leGFtcGxlLmNvbS91c2VycylcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFtyb3dzXT1cIjhcIiByZXNpemU9XCJ2ZXJ0aWNhbFwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC10ZXh0YXJlYVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJDYW5jZWxcIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYnRuLWNhbmNlbFwiIChjbGlja2VkKT1cIm9uQ2FuY2VsSW1wb3J0Q3VybCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJJbXBvcnRcIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYnRuLWltcG9ydFwiIChjbGlja2VkKT1cIm9uSW1wb3J0Q3VybENvbmZpcm0oKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm9keVZpZXcgPT09ICdoZWFkZXJzJ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzXCI+XG4gICAgICAgICAgICAgIDxjcWEtYnV0dG9uICpuZ0Zvcj1cImxldCB0YWIgb2YgcGF5bG9hZFRhYnNcIiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbdGV4dF09XCJ0YWIubGFiZWxcIlxuICAgICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtdGFiJyArIChhY3RpdmVQYXlsb2FkVGFiID09PSB0YWIudmFsdWUgPyAnIGNxYS1hcGktZWRpdC1zdGVwLXRhYi0tYWN0aXZlJyA6ICcnKSArIChpc01ldGhvZFdpdGhvdXRCb2R5ICYmICh0YWIudmFsdWUgPT09ICdib2R5JyB8fCB0YWIudmFsdWUgPT09ICdwYXJhbXMnKSA/ICcgY3FhLWFwaS1lZGl0LXN0ZXAtdGFiLS1kaXNhYmxlZCcgOiAnJylcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc01ldGhvZFdpdGhvdXRCb2R5ICYmICh0YWIudmFsdWUgPT09ICdib2R5JyB8fCB0YWIudmFsdWUgPT09ICdwYXJhbXMnKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwic2V0UGF5bG9hZFRhYih0YWIudmFsdWUpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBheWxvYWQgY29udGVudCAoQXV0aG9yaXphdGlvbikgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlUGF5bG9hZFRhYiA9PT0gJ2F1dGhvcml6YXRpb24nXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkXCJcbiAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ3BhZGRpbmc6IDIwcHg7IG1pbi1oZWlnaHQ6IDIwMHB4OydcIj5cbiAgICAgICAgICAgICAgPGRpdiBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAyMHB4OydcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDsgd2lkdGg6IGZpdC1jb250ZW50OydcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGxldHRlci1zcGFjaW5nOiAwLjAyZW07IGNvbG9yOiAjNkI3MjgwOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBsaW5lLWhlaWdodDogMS4yNTsnXCI+QVVUSCBUWVBFPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cImF1dGhUeXBlRm9ybVwiIFtmb3JtXT1cImF1dGhUeXBlRm9ybVwiIFtjb25maWddPVwiYXV0aFR5cGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWF1dGgtdHlwZS1zZWxlY3RcIiBhcmlhLWxhYmVsPVwiQXV0aCB0eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ21pbi13aWR0aDogMTYwcHg7J1wiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSBObyBBdXRoOiBjZW50ZXJlZCBtZXNzYWdlIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEF1dGhUeXBlID09PSAnbm8tYXV0aCdcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ2ZsZXg6IDE7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBnYXA6IDEycHg7IG1pbi13aWR0aDogMDsgdGV4dC1hbGlnbjogY2VudGVyOydcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ3dpZHRoOiA0OHB4OyBoZWlnaHQ6IDQ4cHg7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJhY2tncm91bmQ6ICNGM0Y0RjY7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBmbGV4LXNocmluazogMDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjVcIiB5PVwiMTFcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMlwiIHJ4PVwiMVwiIGZpbGw9XCIjOUNBM0FGXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTZweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5ObyBBdXRoPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGRpdiBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogNnB4OyBmbGV4LXdyYXA6IHdyYXA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxNHB4OyBmb250LXdlaWdodDogNDAwOyBjb2xvcjogIzlDQTNBRjsgbGluZS1oZWlnaHQ6IDEuNDsnXCI+VGhpcyByZXF1ZXN0IGRvZXMgbm90IHVzZSBhbnkgYXV0aG9yaXphdGlvbi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHJvbGU9XCJpbWdcIiBhcmlhLWxhYmVsPVwiTW9yZSBpbmZvcm1hdGlvblwiIHRpdGxlPVwiVGhpcyByZXF1ZXN0IGRvZXMgbm90IHVzZSBhbnkgYXV0aG9yaXphdGlvbi5cIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IHdpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7IGNvbG9yOiAjOUNBM0FGOyBmbGV4LXNocmluazogMDsnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjdcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTggN3Y0TTggNXYuNVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIEJlYXJlciBUb2tlbjogVG9rZW4gbGFiZWwgKyB0ZXh0YXJlYSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRBdXRoVHlwZSA9PT0gJ2JlYXJlcidcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ2ZsZXg6IDE7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMTBweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMzc0MTUxOyBsaW5lLWhlaWdodDogMS4yNTsnXCI+VG9rZW48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYSBbKHZhbHVlKV09XCJiZWFyZXJUb2tlblwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgYmVhcmVyIHRva2VuXCJcbiAgICAgICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgW3Jvd3NdPVwiNlwiIHJlc2l6ZT1cInZlcnRpY2FsXCIgc2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hdXRoLXRva2VuLXRleHRhcmVhXCIgYXJpYUxhYmVsPVwiQmVhcmVyIHRva2VuXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSBPQXV0aCAyLjA6IEdyYW50IFR5cGUsIEFjY2VzcyBUb2tlbiBVUkwsIENsaWVudCBJRCwgQ2xpZW50IFNlY3JldCwgU2NvcGUsIENsaWVudCBBdXRoZW50aWNhdGlvbiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRBdXRoVHlwZSA9PT0gJ29hdXRoMicgJiYgb2F1dGgyRm9ybVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLW9hdXRoMi1ncmlkXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogMTZweCAyNHB4OyB3aWR0aDogMTAwJTsnXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5HcmFudCBUeXBlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0ICpuZ0lmPVwib2F1dGgyRm9ybVwiIFtmb3JtXT1cIm9hdXRoMkZvcm1cIiBbY29uZmlnXT1cIm9hdXRoMkdyYW50VHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hdXRoLW9hdXRoLXNlbGVjdFwiIGFyaWEtbGFiZWw9XCJPQXV0aCBncmFudCB0eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInbWluLXdpZHRoOiAwOyB3aWR0aDogMTAwJTsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMXB4OyBmb250LXN0eWxlOiBpdGFsaWM7IGNvbG9yOiAjNkI3MjgwOyBsaW5lLWhlaWdodDogMS4zOydcIj5PQXV0aCBncmFudCB0eXBlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5BY2Nlc3MgVG9rZW4gVVJMPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwib2F1dGgyRm9ybS5nZXQoJ2FjY2Vzc1Rva2VuVXJsJyk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib2F1dGgyRm9ybS5nZXQoJ2FjY2Vzc1Rva2VuVXJsJyk/LnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInJ1wiIHBsYWNlaG9sZGVyPVwiRW50ZXIgT0F1dGggdG9rZW4gZW5kcG9pbnRcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkFjY2VzcyBUb2tlbiBVUkxcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMXB4OyBmb250LXN0eWxlOiBpdGFsaWM7IGNvbG9yOiAjNkI3MjgwOyBsaW5lLWhlaWdodDogMS4zOydcIj5PQXV0aCB0b2tlbiBlbmRwb2ludDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7IG1pbi13aWR0aDogMDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMzc0MTUxOyBsaW5lLWhlaWdodDogMS4yNTsnXCI+Q2xpZW50IElEPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwib2F1dGgyRm9ybS5nZXQoJ2NsaWVudElkJyk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib2F1dGgyRm9ybS5nZXQoJ2NsaWVudElkJyk/LnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInJ1wiIHBsYWNlaG9sZGVyPVwiRW50ZXIgT0F1dGggY2xpZW50IGlkZW50aWZpZXJcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkNsaWVudCBJRFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgY29sb3I6ICM2QjcyODA7IGxpbmUtaGVpZ2h0OiAxLjM7J1wiPk9BdXRoIGNsaWVudCBpZGVudGlmaWVyPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5DbGllbnQgU2VjcmV0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwib2F1dGgyRm9ybS5nZXQoJ2NsaWVudFNlY3JldCcpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9hdXRoMkZvcm0uZ2V0KCdjbGllbnRTZWNyZXQnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCIgW2xhYmVsXT1cIicnXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBPQXV0aCBjbGllbnQgc2VjcmV0XCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJDbGllbnQgU2VjcmV0XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzZCNzI4MDsgbGluZS1oZWlnaHQ6IDEuMzsnXCI+T0F1dGggY2xpZW50IHNlY3JldDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7IG1pbi13aWR0aDogMDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMzc0MTUxOyBsaW5lLWhlaWdodDogMS4yNTsnXCI+U2NvcGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJvYXV0aDJGb3JtLmdldCgnc2NvcGUnKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvYXV0aDJGb3JtLmdldCgnc2NvcGUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicnXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBzcGFjZS1zZXBhcmF0ZWQgc2NvcGVzXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJTY29wZVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgY29sb3I6ICM2QjcyODA7IGxpbmUtaGVpZ2h0OiAxLjM7J1wiPlNwYWNlLXNlcGFyYXRlZCBzY29wZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPkNsaWVudCBBdXRoZW50aWNhdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cIm9hdXRoMkZvcm1cIiBbZm9ybV09XCJvYXV0aDJGb3JtXCIgW2NvbmZpZ109XCJvYXV0aDJDbGllbnRBdXRoU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWF1dGgtb2F1dGgtc2VsZWN0XCIgYXJpYS1sYWJlbD1cIkNsaWVudCBhdXRoZW50aWNhdGlvbiBtZXRob2RcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cIidtaW4td2lkdGg6IDA7IHdpZHRoOiAxMDAlOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgY29sb3I6ICM2QjcyODA7IGxpbmUtaGVpZ2h0OiAxLjM7J1wiPkNsaWVudCBhdXRoZW50aWNhdGlvbiBtZXRob2Q8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBQYXlsb2FkIGNvbnRlbnQgKEhlYWRlcnMpIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVBheWxvYWRUYWIgPT09ICdoZWFkZXJzJ1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVycy1ncmlkXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWxhYmVsXCI+SGVhZGVyIE5hbWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWxhYmVsXCI+SGVhZGVyIFZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVycy1sYWJlbCBjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgaGVhZGVyUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUhlYWRlclwiIFtmb3JtR3JvdXBdPVwicm93XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWhlYWRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cInJvd1wiIFtjb25maWddPVwiaGVhZGVyTmFtZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAoYWRkQ3VzdG9tVmFsdWUpPVwib25IZWFkZXJOYW1lQWRkQ3VzdG9tVmFsdWUoJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVyLXR5cGUtc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgndmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIlZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVyLXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiSGVhZGVyIHZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVyLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSBoZWFkZXInXCIgKGNsaWNrZWQpPVwicmVtb3ZlSGVhZGVyKGkpXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVyLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFkZC1oZWFkZXItd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIHRleHQ9XCIrIEFkZCBIZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC1hZGQtaGVhZGVyLWxpbmsnXCIgKGNsaWNrZWQpPVwiYWRkSGVhZGVyKClcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUGF5bG9hZCBjb250ZW50IChQYXJhbXMpOiBLZXnigJNWYWx1ZSB0YWJsZSB3aXRoIGFkZC9kZWxldGUgcm93cyAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVQYXlsb2FkVGFiID09PSAncGFyYW1zJ1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWdyaWQgY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsXCI+S2V5PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsXCI+VmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWwgY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgcGFyYW1zUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeVBhcmFtc1wiIFtmb3JtR3JvdXBdPVwicm93XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1yb3dcIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgna2V5Jyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyb3cuZ2V0KCdrZXknKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiS2V5XCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiS2V5XCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtaW5wdXRcIiBhcmlhTGFiZWw9XCJWYWx1ZVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1kZWxldGUnXCJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidSZW1vdmUgcm93J1wiIChjbGlja2VkKT1cInJlbW92ZVBhcmFtc1JvdyhpKVwiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1kZWxldGUtaWNvblwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwLjY2NjMgNlYxMi42NjY3SDUuMzMzMDFWNkgxMC42NjYzWk05LjY2NjM0IDJINi4zMzMwMUw1LjY2NjM0IDIuNjY2NjdIMy4zMzMwMVY0SDEyLjY2NjNWMi42NjY2N0gxMC4zMzNMOS42NjYzNCAyWk0xMS45OTk3IDQuNjY2NjdIMy45OTk2N1YxMi42NjY3QzMuOTk5NjcgMTMuNCA0LjU5OTY3IDE0IDUuMzMzMDEgMTRIMTAuNjY2M0MxMS4zOTk3IDE0IDExLjk5OTcgMTMuNCAxMS45OTk3IDEyLjY2NjdWNC42NjY2N1pcIlxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjlCRkJGXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtYWRkLXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCIrIEFkZCBSb3dcIlxuICAgICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtYWRkLWJ0blwiIChjbGlja2VkKT1cImFkZFBhcmFtc1JvdygpXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBheWxvYWQgY29udGVudCAoQm9keSBvbmx5KTogdHlwZSwgZm9ybWF0LCB0ZXh0IGFyZWEsIEJhY2svTmV4dCAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVQYXlsb2FkVGFiID09PSAnYm9keSdcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQgY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1lZGl0b3JcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdHlwZS1yb3dcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdHlwZS1sYWJlbFwiPlR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdHlwZS1yYWRpb3NcIj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sIFt2YWx1ZV09XCJwYXlsb2FkVHlwZVwiIFtzZWdtZW50c109XCJwYXlsb2FkVHlwZVNlZ21lbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uUGF5bG9hZFR5cGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLXNlZ21lbnRcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLXNlZ21lbnQtY29udHJvbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGF5bG9hZFR5cGUgPT09ICdyYXcnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWZvcm1hdC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZm9ybWF0LWxhYmVsXCI+Rm9ybWF0Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgKm5nSWY9XCJwYXlsb2FkRm9ybWF0Rm9ybVwiIFtmb3JtXT1cInBheWxvYWRGb3JtYXRGb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJwYXlsb2FkRm9ybWF0U2VsZWN0Q29uZmlnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWZvcm1hdC1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRm9ybWF0XCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwhLS0gUmF3OiB0ZXh0IGFyZWEgd2l0aCBsaW5lIG51bWJlcnMgKFBvc3RtYW4tc3R5bGUgcGF5bG9hZCBib2R5KSAtLT5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBheWxvYWRUeXBlID09PSAncmF3J1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1ib2R5XCIgI3BheWxvYWRFZGl0b3JXaXRoTGluZXNSZWY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZWRpdG9yLXdpdGgtbGluZXNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWxpbmUtbnVtYmVyc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgbiBvZiBwYXlsb2FkTGluZU51bWJlcnNcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtbGluZS1udW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInBheWxvYWRKc29uRXJyb3IgJiYgcGF5bG9hZEpzb25FcnJvci5saW5lID09PSBuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1saW5lLWVycm9yLWljb25cIiBbdGl0bGVdPVwicGF5bG9hZEpzb25FcnJvclRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlBhcnNlIGVycm9yIG9uIHRoaXMgbGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI3XCIgY3k9XCI3XCIgcj1cIjZcIiBmaWxsPVwiI0VGNDQ0NFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDRsNiA2TTEwIDRsLTYgNlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtbGluZS1udW0tdGV4dFwiPnt7IG4gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdGV4dGFyZWEtY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10ZXh0YXJlYSBjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtbWluLWgtMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhLS1lcnJvcic6IHBheWxvYWRKc29uRXJyb3J9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhICNwYXlsb2FkVGV4dGFyZWFSZWZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10ZXh0YXJlYS1pbnB1dCBjcWEtdy1mdWxsIGNxYS1vdXRsaW5lLW5vbmUgY3FhLWJveC1ib3JkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhLWlucHV0LS1lcnJvcic6IHBheWxvYWRKc29uRXJyb3J9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwYXlsb2FkVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidQYXlsb2FkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiISFwYXlsb2FkSnNvbkVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvblBheWxvYWRJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uUGF5bG9hZEtleWRvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJwYXlsb2FkSnNvbkVycm9yXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWpzb24tZXJyb3ItbXNnXCI+XG4gICAgICAgICAgICAgICAgICBJbnZhbGlkIEpTT04gZm9ybWF0LiBQbGVhc2UgY2hlY2sgeW91ciBzeW50YXguXG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIHgtd3d3LWZvcm0tdXJsZW5jb2RlZDogS2V54oCTVmFsdWUgcm93cywgYWRkL3JlbW92ZSBkeW5hbWljYWxseSAtLT5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBheWxvYWRUeXBlID09PSAneC13d3ctZm9ybS11cmxlbmNvZGVkJ1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1ncmlkIGNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsXCI+S2V5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWxcIj5WYWx1ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1sYWJlbC0tZW1wdHlcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGtleVZhbHVlUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUtleVZhbHVlXCIgW2Zvcm1Hcm91cF09XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtcm93XCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgna2V5Jyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2tleScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJLZXlcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIktleVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIlZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtaW5wdXRcIiBhcmlhTGFiZWw9XCJWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidSZW1vdmUgcm93J1wiIChjbGlja2VkKT1cInJlbW92ZUtleVZhbHVlUm93KGkpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjlCRkJGXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1hZGQtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiKyBBZGQgUm93XCJcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtYWRkLWJ0blwiIChjbGlja2VkKT1cImFkZEtleVZhbHVlUm93KClcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPCEtLSBGb3JtIERhdGE6IEtleeKAk1R5cGXigJNWYWx1ZSByb3dzOyBUeXBlIGlzIGEgZHJvcGRvd24gKFRleHQvRmlsZSksIGFkZC9yZW1vdmUgZHluYW1pY2FsbHkgLS0+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYXlsb2FkVHlwZSA9PT0gJ2Zvcm0tZGF0YSdcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbFwiPktleTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtbGFiZWxcIj5UeXBlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbFwiPlZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbCBjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbC0tZW1wdHlcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGtleVR5cGVWYWx1ZVJvd3M7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlLZXlUeXBlVmFsdWVcIiBbZm9ybUdyb3VwXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ2tleScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyb3cuZ2V0KCdrZXknKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiS2V5XCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIktleVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJyb3dcIiBbY29uZmlnXT1cImtleVR5cGVWYWx1ZVR5cGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLXR5cGUtc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIlZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIlZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInUmVtb3ZlIHJvdydcIiAoY2xpY2tlZCk9XCJyZW1vdmVLZXlUeXBlVmFsdWVSb3coaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5QkZCRlwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1hZGQtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiKyBBZGQgUm93XCJcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1hZGQtYnRuXCIgKGNsaWNrZWQpPVwiYWRkS2V5VHlwZVZhbHVlUm93KClcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIFN0ZXAgMjogVmFyaWFibGUgTmFtZTogaW5wdXQsIHZhbGlkYXRpb24sIEJhY2sgLyBOZXh0IC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U3RlcCA9PT0gMlwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGFuZWwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNiBjcWEtYm94LWJvcmRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12YXJpYWJsZS1zZWN0aW9uXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZhcmlhYmxlLWlucHV0LXdyYXBcIj5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFsodmFsdWUpXT1cInZhcmlhYmxlTmFtZVwiIFtsYWJlbF09XCInJ1wiIHBsYWNlaG9sZGVyPVwiVmFyaWFibGUgTmFtZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIHNpemU9XCJtZFwiICh2YWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlTmFtZUNoYW5nZSgpXCIgYXJpYS1sYWJlbD1cIlZhcmlhYmxlIE5hbWVcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCAqbmdJZj1cInZhcmlhYmxlTmFtZUVycm9yXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12YXJpYWJsZS1lcnJvclwiIHJvbGU9XCJhbGVydFwiPnt7IHZhcmlhYmxlTmFtZUVycm9yIH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIFN0ZXAgMzogUmVzcG9uc2UgQm9keSAvIFN0YXR1cyB0YWJzIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U3RlcCA9PT0gM1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGFuZWwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNiBjcWEtYm94LWJvcmRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzLXdyYXBwZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdGFic1wiPlxuICAgICAgICAgICAgPGNxYS1idXR0b24gKm5nRm9yPVwibGV0IHRhYiBvZiByZXNwb25zZVZlcmlmaWNhdGlvblRhYnNcIiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbdGV4dF09XCJ0YWIubGFiZWxcIlxuICAgICAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLXRhYicgKyAoYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIgPT09IHRhYi52YWx1ZSA/ICcgY3FhLWFwaS1lZGl0LXN0ZXAtdGFiLS1hY3RpdmUnIDogJycpXCJcbiAgICAgICAgICAgICAgKGNsaWNrZWQpPVwic2V0UmVzcG9uc2VWZXJpZmljYXRpb25UYWIodGFiLnZhbHVlKVwiPlxuICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBSZXNwb25zZSBCb2R5IHRhYiBjb250ZW50OiB2ZXJpZmljYXRpb24gZ3JpZCAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIgPT09ICdyZXNwb25zZS1ib2R5J1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtc3RlcDMtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1oZWFkZXItcm93XCI+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgdGV4dD1cIkFkZCBWZXJpZmljYXRpb25cIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWFkZC1saW5rXCIgKGNsaWNrZWQpPVwiYWRkVmVyaWZpY2F0aW9uUm93KClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZ3JpZCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZ3JpZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPlMubm88L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5KU09OIFBhdGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5WZXJpZmljYXRpb248L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5EYXRhIFR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5FeHBlY3RlZCBWYWx1ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWwtLWVtcHR5XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiB2ZXJpZmljYXRpb25Sb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5VmVyaWZpY2F0aW9uXCIgW2Zvcm1Hcm91cF09XCJyb3dcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNub1wiPnt7IGkgKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCdqc29uUGF0aCcpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnanNvblBhdGgnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiSnNvbiBQYXRoXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWlucHV0XCIgYXJpYUxhYmVsPVwiSlNPTiBQYXRoXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwicm93XCIgW2NvbmZpZ109XCJ2ZXJpZmljYXRpb25TZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cInJvd1wiIFtjb25maWddPVwidmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tc2VsZWN0IGNxYS13LWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblZlcmlmaWNhdGlvbkRhdGFUeXBlQ2hhbmdlKHJvdywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwhLS0gRXhwZWN0ZWQgVmFsdWU6IHRleHQgZm9yIFN0cmluZy9BcnJheS9PYmplY3QsIG51bWJlciBmb3IgTnVtYmVyLCBkcm9wZG93biBmb3IgQm9vbGVhbiAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJyb3cuZ2V0KCdkYXRhVHlwZScpPy52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdTd2l0Y2hDYXNlPVwiJ2Jvb2xlYW4nXCIgW2Zvcm1dPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJ2ZXJpZmljYXRpb25FeHBlY3RlZFZhbHVlQm9vbGVhblNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNlbGVjdCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZXhwZWN0ZWQtc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCIgW3ZhbHVlXT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnZXhwZWN0ZWRWYWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJFeHBlY3RlZCBWYWx1ZSAobnVtYmVyKVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1pbnB1dCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZXhwZWN0ZWQtbnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiRXhwZWN0ZWQgVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0ICpuZ1N3aXRjaERlZmF1bHQgW3ZhbHVlXT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnZXhwZWN0ZWRWYWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFeHBlY3RlZCBWYWx1ZSBpbiBTdHJpbmdcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1pbnB1dFwiIGFyaWFMYWJlbD1cIkV4cGVjdGVkIFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInUmVtb3ZlIHJvdydcIiAoY2xpY2tlZCk9XCJyZW1vdmVWZXJpZmljYXRpb25Sb3coaSlcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5QkZCRlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFN0YXR1cyB0YWIgY29udGVudDogUy5ubywgVmVyaWZpY2F0aW9uIGRyb3Bkb3duLCBFeHBlY3RlZCBWYWx1ZSwgYWRkL3JlbW92ZSByb3dzIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9PT0gJ3N0YXR1cydcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN0ZXAzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24taGVhZGVyLXJvd1wiPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIHRleHQ9XCJBZGQgVmVyaWZpY2F0aW9uXCJcbiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1hZGQtbGlua1wiIChjbGlja2VkKT1cImFkZFN0YXR1c1ZlcmlmaWNhdGlvblJvdygpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN0YXR1cy12ZXJpZmljYXRpb25cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN0YXR1cy12ZXJpZmljYXRpb24taGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5TLm5vPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+VmVyaWZpY2F0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+RXhwZWN0ZWQgVmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWwgY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2Ygc3RhdHVzVmVyaWZpY2F0aW9uUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeVN0YXR1c1ZlcmlmaWNhdGlvblwiXG4gICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJyb3dcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN0YXR1cy12ZXJpZmljYXRpb24tcm93XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tc25vXCI+e3sgaSArIDEgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJyb3dcIiBbY29uZmlnXT1cInN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN0YXR1cy12ZXJpZmljYXRpb24tc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgnZXhwZWN0ZWRWYWx1ZScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnZXhwZWN0ZWRWYWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJFeHBlY3RlZCBWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24taW5wdXRcIlxuICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiRXhwZWN0ZWQgVmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInUmVtb3ZlIHJvdydcIiAoY2xpY2tlZCk9XCJyZW1vdmVTdGF0dXNWZXJpZmljYXRpb25Sb3coaSlcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5QkZCRlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIFJlc3BvbnNlIFByZXZpZXcgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1yZXNwb25zZVwiPlxuICAgIDxoMyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXJlc3BvbnNlLXRpdGxlIGNxYS10ZXh0LVsxNHB4XSBjcWEtZm9udC1ib2xkIGNxYS1sZWFkaW5nLVsyMHB4XSBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMCBjcWEtbWItWzEycHhdIGNxYS1zaHJpbmstMFwiPlJlc3BvbnNlIFByZXZpZXc8L2gzPlxuICAgIDxwcmUgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1yZXNwb25zZS1jb250ZW50XCI+e3sgcmVzcG9uc2VQcmV2aWV3IH19PC9wcmU+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU3RlcCBhY3Rpb25zOiBvbmUgcm93LCBmdWxsIHdpZHRoLiBTdGVwIDE6IENhbmNlbCArIE5leHQ7IFN0ZXAgMjogQmFjayArIE5leHQ7IFN0ZXAgMzogQmFjayArIENyZWF0ZSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnNcIj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjdXJyZW50U3RlcFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiMVwiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIkNhbmNlbFwiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1jYW5jZWxcIiAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiTmV4dFwiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1uZXh0XCIgKGNsaWNrZWQpPVwib25OZXh0KClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIyXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiQmFja1wiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1iYWNrXCIgKGNsaWNrZWQpPVwib25CYWNrKClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJOZXh0XCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLW5leHRcIiAoY2xpY2tlZCk9XCJvbk5leHQoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIjNcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJCYWNrXCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLWJhY2tcIiAoY2xpY2tlZCk9XCJvbkJhY2soKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiZWRpdE1vZGUgPyAnVXBkYXRlJyA6ICdDcmVhdGUnXCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLWNyZWF0ZVwiIChjbGlja2VkKT1cIm9uQ3JlYXRlKClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+Il19