@cqa-lib/cqa-ui 1.1.541-gamma.8 → 1.1.542
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/README.md +1 -8
- package/esm2020/lib/compare-runs/compare-runs.component.mjs +1 -1
- package/esm2020/lib/execution-screen/condition-debug-step/condition-branch-editor.component.mjs +3 -32
- package/esm2020/lib/execution-screen/db-query-execution-item/db-query-execution-item.component.mjs +1 -1
- package/esm2020/lib/execution-screen/db-verification-step/db-verification-step.component.mjs +1 -1
- package/esm2020/lib/iterations-loop/iterations-loop.component.mjs +1 -1
- package/esm2020/lib/mixed-variable-input/mixed-variable-input.component.mjs +10 -30
- package/esm2020/lib/new-global-variable-dialog/new-global-variable-dialog.component.mjs +5 -16
- package/esm2020/lib/new-global-variable-dialog/new-global-variable-dialog.models.mjs +1 -1
- package/esm2020/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.component.mjs +51 -50
- package/esm2020/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.models.mjs +1 -1
- package/esm2020/lib/segment-control/segment-control.component.mjs +4 -12
- package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +3 -21
- package/esm2020/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.mjs +23 -47
- package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +3 -21
- package/esm2020/lib/step-builder/step-builder-database/step-builder-database.component.mjs +47 -76
- package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +3 -16
- package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +170 -326
- package/esm2020/lib/templates/table-template.component.mjs +3 -5
- package/esm2020/lib/test-case-details/ai-agent-step/ai-agent-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/ai-verify-step/ai-verify-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/api-edit-step/api-edit-step.component.mjs +7 -20
- package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +4 -43
- package/esm2020/lib/test-case-details/test-case-details.models.mjs +1 -3
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal-data.mjs +1 -1
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal.component.mjs +7 -137
- package/esm2020/lib/ui-kit.module.mjs +3 -23
- package/esm2020/public-api.mjs +1 -6
- package/fesm2015/cqa-lib-cqa-ui.mjs +404 -1245
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +330 -1156
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/execution-screen/condition-debug-step/condition-branch-editor.component.d.ts +1 -26
- package/lib/new-global-variable-dialog/new-global-variable-dialog.component.d.ts +2 -5
- package/lib/new-global-variable-dialog/new-global-variable-dialog.models.d.ts +0 -8
- package/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.component.d.ts +10 -9
- package/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.models.d.ts +1 -1
- package/lib/segment-control/segment-control.component.d.ts +1 -3
- package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +1 -19
- package/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.d.ts +2 -16
- package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +1 -19
- package/lib/step-builder/step-builder-database/step-builder-database.component.d.ts +11 -33
- package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +1 -15
- package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +20 -75
- package/lib/templates/table-template.component.d.ts +1 -8
- package/lib/test-case-details/api-edit-step/api-edit-step.component.d.ts +1 -7
- package/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.d.ts +0 -7
- package/lib/test-case-details/test-case-details.models.d.ts +0 -2
- package/lib/test-case-details/test-data-modal/test-data-modal-data.d.ts +1 -23
- package/lib/test-case-details/test-data-modal/test-data-modal.component.d.ts +6 -40
- package/lib/ui-kit.module.d.ts +96 -100
- package/package.json +1 -1
- package/public-api.d.ts +0 -5
- package/styles.css +1 -1
- package/esm2020/lib/new-global-variable-dialog/global-variable-tags-input.component.mjs +0 -129
- package/esm2020/lib/test-case-details/data-library-panel/data-library-panel.component.mjs +0 -116
- package/esm2020/lib/test-case-details/data-library-panel/data-library-panel.models.mjs +0 -2
- package/esm2020/lib/test-case-details/data-library-panel/element-card.component.mjs +0 -36
- package/esm2020/lib/test-case-details/data-library-panel/test-data-profile-card.component.mjs +0 -38
- package/lib/new-global-variable-dialog/global-variable-tags-input.component.d.ts +0 -39
- package/lib/test-case-details/data-library-panel/data-library-panel.component.d.ts +0 -42
- package/lib/test-case-details/data-library-panel/data-library-panel.models.d.ts +0 -17
- package/lib/test-case-details/data-library-panel/element-card.component.d.ts +0 -13
- package/lib/test-case-details/data-library-panel/test-data-profile-card.component.d.ts +0 -13
|
@@ -11,11 +11,10 @@ import * as i4 from "../../search-bar/search-bar.component";
|
|
|
11
11
|
import * as i5 from "@angular/material/icon";
|
|
12
12
|
import * as i6 from "@angular/common";
|
|
13
13
|
import * as i7 from "./test-data-modal-ref";
|
|
14
|
-
const
|
|
14
|
+
const TAB_SEGMENTS = [
|
|
15
15
|
{ label: 'Plain Text', value: 'plain-text' },
|
|
16
16
|
{ label: 'Parameter', value: 'parameter' },
|
|
17
17
|
{ label: 'Environment', value: 'environment' },
|
|
18
|
-
{ label: 'Global Data', value: 'global' },
|
|
19
18
|
{ label: 'Runtime', value: 'runtime' },
|
|
20
19
|
];
|
|
21
20
|
const PARAMETER_FILTER_TABS = [
|
|
@@ -44,21 +43,12 @@ export class TestDataModalComponent {
|
|
|
44
43
|
this.parameterEdit = new EventEmitter();
|
|
45
44
|
this.environmentCreate = new EventEmitter();
|
|
46
45
|
this.environmentEdit = new EventEmitter();
|
|
47
|
-
|
|
48
|
-
this.searchGlobalVariables = new EventEmitter();
|
|
49
|
-
/** Computed segments — recomputed in ngOnChanges, never as a getter (segment-control needs a stable ref). */
|
|
50
|
-
this.tabSegments = ALL_TAB_SEGMENTS.filter(s => s.value !== 'parameter');
|
|
46
|
+
this.tabSegments = TAB_SEGMENTS;
|
|
51
47
|
this.parameterFilterTabs = PARAMETER_FILTER_TABS;
|
|
52
48
|
/** Parameter list from input, falls back to mock data if not provided. */
|
|
53
49
|
this.parameters = MOCK_PARAMETERS;
|
|
54
50
|
/** Environment list from input, falls back to mock data if not provided. */
|
|
55
51
|
this.environmentItems = MOCK_ENVIRONMENT_ITEMS;
|
|
56
|
-
/** Global Data variables (workspace-scoped) for the new Global Data tab. */
|
|
57
|
-
this.globalVariables = [];
|
|
58
|
-
/** True while the consuming app loads global variables (search/initial). */
|
|
59
|
-
this.isLoadingGlobalVariables = false;
|
|
60
|
-
/** When set, the Test Data Profile tab is shown — gated on test case having a TDP. */
|
|
61
|
-
this.testCaseTestDataId = null;
|
|
62
52
|
/** Runtime tab: suggested variable chips. */
|
|
63
53
|
this.runtimeSuggestedValues = RUNTIME_SUGGESTED_VALUES;
|
|
64
54
|
/** Local copy of form value for Cancel revert (same pattern as Loop Step editSnapshot). */
|
|
@@ -76,9 +66,6 @@ export class TestDataModalComponent {
|
|
|
76
66
|
this.selectedParameterId = null;
|
|
77
67
|
this.environmentSearchQuery = '';
|
|
78
68
|
this.selectedEnvironmentId = null;
|
|
79
|
-
this.globalVariableSearchQuery = '';
|
|
80
|
-
/** Stores the variable NAME (used as the id for the row, since names are unique within a workspace). */
|
|
81
|
-
this.selectedGlobalVariableId = null;
|
|
82
69
|
this.runtimeValue = '';
|
|
83
70
|
if (data) {
|
|
84
71
|
this.value = data.value ?? '';
|
|
@@ -90,20 +77,6 @@ export class TestDataModalComponent {
|
|
|
90
77
|
this.environmentSearchQuery = data.environmentSearchQuery ?? '';
|
|
91
78
|
this.selectedEnvironmentId = data.selectedEnvironmentId ?? null;
|
|
92
79
|
this.runtimeValue = data.runtimeValue ?? '';
|
|
93
|
-
this.globalVariableSearchQuery = data.globalVariableSearchQuery ?? '';
|
|
94
|
-
this.selectedGlobalVariableId = data.selectedGlobalVariableId ?? null;
|
|
95
|
-
if (data.testCaseTestDataId !== undefined) {
|
|
96
|
-
this.testCaseTestDataId = data.testCaseTestDataId ?? null;
|
|
97
|
-
}
|
|
98
|
-
if (data.testCaseEnvironmentName !== undefined) {
|
|
99
|
-
this.testCaseEnvironmentName = data.testCaseEnvironmentName;
|
|
100
|
-
}
|
|
101
|
-
if (data.testCaseEnvironmentLabelSuffix !== undefined) {
|
|
102
|
-
this.testCaseEnvironmentLabelSuffix = data.testCaseEnvironmentLabelSuffix;
|
|
103
|
-
}
|
|
104
|
-
if (data.environmentLegacyDeprecationMessage !== undefined) {
|
|
105
|
-
this.environmentLegacyDeprecationMessage = data.environmentLegacyDeprecationMessage;
|
|
106
|
-
}
|
|
107
80
|
// Set parameters and environmentItems from data if provided
|
|
108
81
|
if (data.parameters !== undefined) {
|
|
109
82
|
this.parameters = data.parameters;
|
|
@@ -111,24 +84,16 @@ export class TestDataModalComponent {
|
|
|
111
84
|
if (data.environmentItems !== undefined) {
|
|
112
85
|
this.environmentItems = data.environmentItems;
|
|
113
86
|
}
|
|
114
|
-
if (data.globalVariables !== undefined) {
|
|
115
|
-
this.globalVariables = data.globalVariables;
|
|
116
|
-
}
|
|
117
87
|
}
|
|
118
88
|
this.plainTextValue = this.activeTab === 'plain-text' ? (this.value ?? '') : '';
|
|
119
|
-
this.recomputeVisibleTabs();
|
|
120
89
|
}
|
|
121
90
|
ngOnInit() {
|
|
122
91
|
this.buildEditForm();
|
|
123
92
|
this.buildSelectConfigs();
|
|
124
|
-
this.recomputeVisibleTabs();
|
|
125
93
|
this.editSnapshot = { ...this.editForm.value };
|
|
126
94
|
this.cdr.markForCheck();
|
|
127
95
|
}
|
|
128
96
|
ngOnChanges(changes) {
|
|
129
|
-
if (changes['testCaseTestDataId']) {
|
|
130
|
-
this.recomputeVisibleTabs();
|
|
131
|
-
}
|
|
132
97
|
if (!this.editForm) {
|
|
133
98
|
return;
|
|
134
99
|
}
|
|
@@ -145,11 +110,6 @@ export class TestDataModalComponent {
|
|
|
145
110
|
this.syncStateFromForm();
|
|
146
111
|
this.cdr.markForCheck();
|
|
147
112
|
}
|
|
148
|
-
/** Memoize visible segments — `[segments]`-style refs must be stable across CD passes. */
|
|
149
|
-
recomputeVisibleTabs() {
|
|
150
|
-
const showTdp = this.testCaseTestDataId != null;
|
|
151
|
-
this.tabSegments = ALL_TAB_SEGMENTS.filter(s => s.value !== 'parameter' || showTdp);
|
|
152
|
-
}
|
|
153
113
|
/** Build form with all control values (same pattern as Loop Step buildEditForm). */
|
|
154
114
|
buildEditForm() {
|
|
155
115
|
this.editForm = this.fb.group({
|
|
@@ -160,14 +120,12 @@ export class TestDataModalComponent {
|
|
|
160
120
|
selectedParameterId: [this.selectedParameterId ?? null],
|
|
161
121
|
environmentSearchQuery: [this.environmentSearchQuery ?? ''],
|
|
162
122
|
selectedEnvironmentId: [this.selectedEnvironmentId ?? null],
|
|
163
|
-
globalVariableSearchQuery: [this.globalVariableSearchQuery ?? ''],
|
|
164
|
-
selectedGlobalVariableId: [this.selectedGlobalVariableId ?? null],
|
|
165
123
|
runtimeValue: [this.runtimeValue ?? ''],
|
|
166
124
|
});
|
|
167
125
|
}
|
|
168
126
|
/** Build select configs once (same pattern as Loop Step buildSelectConfigs). */
|
|
169
127
|
buildSelectConfigs() {
|
|
170
|
-
const tabOptions =
|
|
128
|
+
const tabOptions = TAB_SEGMENTS.map((s) => ({
|
|
171
129
|
id: s.value,
|
|
172
130
|
value: s.value,
|
|
173
131
|
name: s.label,
|
|
@@ -211,8 +169,6 @@ export class TestDataModalComponent {
|
|
|
211
169
|
this.selectedParameterId = v.selectedParameterId ?? null;
|
|
212
170
|
this.environmentSearchQuery = v.environmentSearchQuery ?? '';
|
|
213
171
|
this.selectedEnvironmentId = v.selectedEnvironmentId ?? null;
|
|
214
|
-
this.globalVariableSearchQuery = v.globalVariableSearchQuery ?? '';
|
|
215
|
-
this.selectedGlobalVariableId = v.selectedGlobalVariableId ?? null;
|
|
216
172
|
this.runtimeValue = v.runtimeValue ?? '';
|
|
217
173
|
}
|
|
218
174
|
/** Filtered parameters by scope and search (Parameter tab). */
|
|
@@ -248,34 +204,13 @@ export class TestDataModalComponent {
|
|
|
248
204
|
showEdit: this.selectedParameterId === p.id,
|
|
249
205
|
}));
|
|
250
206
|
}
|
|
251
|
-
/** Filtered global variables by search (Global Data tab). */
|
|
252
|
-
get filteredGlobalVariables() {
|
|
253
|
-
const q = this.globalVariableSearchQuery.trim().toLowerCase();
|
|
254
|
-
if (!q) {
|
|
255
|
-
return this.globalVariables;
|
|
256
|
-
}
|
|
257
|
-
return this.globalVariables.filter((g) => g.name.toLowerCase().includes(q) ||
|
|
258
|
-
(g.value || '').toLowerCase().includes(q));
|
|
259
|
-
}
|
|
260
|
-
/** Global Data tab: list config (mirrors environment listing pattern). */
|
|
261
|
-
get globalVariableListConfig() {
|
|
262
|
-
return this.filteredGlobalVariables.map((g) => ({
|
|
263
|
-
id: g.name,
|
|
264
|
-
title: g.name,
|
|
265
|
-
subtitle: g.value ? `Value: ${g.value}` : '',
|
|
266
|
-
badge: 'Global',
|
|
267
|
-
showEdit: false,
|
|
268
|
-
}));
|
|
269
|
-
}
|
|
270
207
|
/** Environment tab: list config for cqa-item-list. */
|
|
271
208
|
get environmentListConfig() {
|
|
272
|
-
const suffix = (this.testCaseEnvironmentLabelSuffix ?? '').trim();
|
|
273
|
-
const decorate = (envName) => suffix ? `${envName} ${suffix}` : envName;
|
|
274
209
|
return this.filteredEnvironments.map((e) => ({
|
|
275
210
|
id: e.id,
|
|
276
211
|
title: e.name,
|
|
277
212
|
subtitle: `Value: ${e.value}`,
|
|
278
|
-
badge:
|
|
213
|
+
badge: e.environment,
|
|
279
214
|
showEdit: this.selectedEnvironmentId === e.id && (e.editable ?? true),
|
|
280
215
|
}));
|
|
281
216
|
}
|
|
@@ -300,7 +235,6 @@ export class TestDataModalComponent {
|
|
|
300
235
|
this.selectedParameterId = this.selectedParameterId === param.id ? null : param.id;
|
|
301
236
|
this.onEditFormFieldChange('selectedParameterId', this.selectedParameterId);
|
|
302
237
|
this.onEditFormFieldChange('value', param.name);
|
|
303
|
-
this.clearSelectionsExcept('parameter');
|
|
304
238
|
}
|
|
305
239
|
}
|
|
306
240
|
/** Handle row click (select parameter). Edit button uses onParameterEditClick to avoid triggering this. */
|
|
@@ -334,7 +268,6 @@ export class TestDataModalComponent {
|
|
|
334
268
|
this.selectedEnvironmentId === item.id ? null : item.id;
|
|
335
269
|
this.onEditFormFieldChange('selectedEnvironmentId', this.selectedEnvironmentId);
|
|
336
270
|
this.onEditFormFieldChange('value', item.name);
|
|
337
|
-
this.clearSelectionsExcept('environment');
|
|
338
271
|
}
|
|
339
272
|
}
|
|
340
273
|
onEnvironmentEdit(itemId) {
|
|
@@ -344,47 +277,9 @@ export class TestDataModalComponent {
|
|
|
344
277
|
event.preventDefault();
|
|
345
278
|
this.environmentCreate.emit();
|
|
346
279
|
}
|
|
347
|
-
onGlobalVariableSearchInput(value) {
|
|
348
|
-
this.onEditFormFieldChange('globalVariableSearchQuery', value);
|
|
349
|
-
this.searchGlobalVariables.emit(value);
|
|
350
|
-
}
|
|
351
|
-
onGlobalVariableSelect(name) {
|
|
352
|
-
const item = this.globalVariables.find((g) => g.name === name);
|
|
353
|
-
if (item) {
|
|
354
|
-
this.selectedGlobalVariableId =
|
|
355
|
-
this.selectedGlobalVariableId === item.name ? null : item.name;
|
|
356
|
-
this.onEditFormFieldChange('selectedGlobalVariableId', this.selectedGlobalVariableId);
|
|
357
|
-
this.onEditFormFieldChange('value', item.name);
|
|
358
|
-
this.clearSelectionsExcept('global');
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
280
|
/** Runtime tab: replace the runtime input with the selected suggestion. */
|
|
362
281
|
onRuntimeChipInsert(snippet) {
|
|
363
282
|
this.onEditFormFieldChange('runtimeValue', snippet);
|
|
364
|
-
this.clearSelectionsExcept('runtime');
|
|
365
|
-
}
|
|
366
|
-
/**
|
|
367
|
-
* When the user picks a value in any tab, the others' visual selection must
|
|
368
|
-
* reset — the modal applies only the active tab's value, so keeping stale
|
|
369
|
-
* highlights confuses which one will land on Apply.
|
|
370
|
-
*/
|
|
371
|
-
clearSelectionsExcept(keep) {
|
|
372
|
-
if (keep !== 'parameter' && this.selectedParameterId !== null) {
|
|
373
|
-
this.selectedParameterId = null;
|
|
374
|
-
this.editForm.get('selectedParameterId')?.setValue(null, { emitEvent: false });
|
|
375
|
-
}
|
|
376
|
-
if (keep !== 'environment' && this.selectedEnvironmentId !== null) {
|
|
377
|
-
this.selectedEnvironmentId = null;
|
|
378
|
-
this.editForm.get('selectedEnvironmentId')?.setValue(null, { emitEvent: false });
|
|
379
|
-
}
|
|
380
|
-
if (keep !== 'global' && this.selectedGlobalVariableId !== null) {
|
|
381
|
-
this.selectedGlobalVariableId = null;
|
|
382
|
-
this.editForm.get('selectedGlobalVariableId')?.setValue(null, { emitEvent: false });
|
|
383
|
-
}
|
|
384
|
-
if (keep !== 'runtime' && this.runtimeValue !== '') {
|
|
385
|
-
this.runtimeValue = '';
|
|
386
|
-
this.editForm.get('runtimeValue')?.setValue('', { emitEvent: false });
|
|
387
|
-
}
|
|
388
283
|
}
|
|
389
284
|
onApply() {
|
|
390
285
|
this.syncStateFromForm();
|
|
@@ -395,11 +290,6 @@ export class TestDataModalComponent {
|
|
|
395
290
|
else if (this.activeTab === 'environment') {
|
|
396
291
|
valueToApply = this.selectedEnvironmentId ? this.environmentItems.find((e) => e.id === this.selectedEnvironmentId)?.name ?? '' : '';
|
|
397
292
|
}
|
|
398
|
-
else if (this.activeTab === 'global') {
|
|
399
|
-
valueToApply = this.selectedGlobalVariableId
|
|
400
|
-
? this.globalVariables.find((g) => g.name === this.selectedGlobalVariableId)?.name ?? ''
|
|
401
|
-
: '';
|
|
402
|
-
}
|
|
403
293
|
// Wrap valueToApply based on active tab
|
|
404
294
|
if (this.activeTab === 'parameter' && valueToApply) {
|
|
405
295
|
valueToApply = `@|${valueToApply}|`;
|
|
@@ -410,9 +300,6 @@ export class TestDataModalComponent {
|
|
|
410
300
|
else if (this.activeTab === 'environment' && valueToApply) {
|
|
411
301
|
valueToApply = `*|${valueToApply}|`;
|
|
412
302
|
}
|
|
413
|
-
else if (this.activeTab === 'global' && valueToApply) {
|
|
414
|
-
valueToApply = `{{${valueToApply}}}`;
|
|
415
|
-
}
|
|
416
303
|
// plain-text tab: no wrapping, use value as is
|
|
417
304
|
// Build result with only the active tab's data, clear other tabs' data
|
|
418
305
|
const result = {
|
|
@@ -425,9 +312,6 @@ export class TestDataModalComponent {
|
|
|
425
312
|
// Only include environment data if environment tab is active
|
|
426
313
|
environmentSearchQuery: this.activeTab === 'environment' ? this.environmentSearchQuery : undefined,
|
|
427
314
|
selectedEnvironmentId: this.activeTab === 'environment' ? this.selectedEnvironmentId : undefined,
|
|
428
|
-
// Only include global data if global tab is active
|
|
429
|
-
globalVariableSearchQuery: this.activeTab === 'global' ? this.globalVariableSearchQuery : undefined,
|
|
430
|
-
selectedGlobalVariableId: this.activeTab === 'global' ? this.selectedGlobalVariableId : undefined,
|
|
431
315
|
// Only include runtime data if runtime tab is active
|
|
432
316
|
runtimeValue: this.activeTab === 'runtime' ? this.runtimeValue : undefined,
|
|
433
317
|
};
|
|
@@ -457,10 +341,10 @@ export class TestDataModalComponent {
|
|
|
457
341
|
}
|
|
458
342
|
}
|
|
459
343
|
TestDataModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestDataModalComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: TEST_DATA_MODAL_REF }, { token: TEST_DATA_MODAL_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
460
|
-
TestDataModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestDataModalComponent, selector: "cqa-test-data-modal", inputs: { parameters: "parameters", environmentItems: "environmentItems", globalVariables: "globalVariables", isLoadingGlobalVariables: "isLoadingGlobalVariables", testCaseTestDataId: "testCaseTestDataId", testCaseEnvironmentName: "testCaseEnvironmentName", testCaseEnvironmentLabelSuffix: "testCaseEnvironmentLabelSuffix", environmentLegacyDeprecationMessage: "environmentLegacyDeprecationMessage", activeTab: "activeTab", value: "value", helpUrl: "helpUrl" }, outputs: { apply: "apply", cancel: "cancel", editInDepth: "editInDepth", parameterCreate: "parameterCreate", parameterEdit: "parameterEdit", environmentCreate: "environmentCreate", environmentEdit: "environmentEdit", searchGlobalVariables: "searchGlobalVariables" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"cqa-bg-white cqa-rounded-[12px] cqa-shadow-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-w-[500px] cqa-max-h-[77vh] cqa-flex cqa-flex-col cqa-gap-[12px] cqa-p-2 cqa-box-border cqa-min-h-0\">\n <!-- Header: title left; Need help? + close icon right (no overflow here so tooltip is not clipped) -->\n <div class=\"cqa-flex cqa-flex-shrink-0 cqa-items-center cqa-justify-between cqa-gap-2 cqa-px-4\">\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-bold cqa-text-[#111827] cqa-m-0 cqa-font-[600]\">\n Test Data\n </h2>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-h-[28px]\">\n <!-- Need help? with custom tooltip: show below trigger so it is not clipped by modal overflow-y-auto -->\n <div class=\"cqa-relative cqa-inline-flex cqa-items-center\"\n (mouseenter)=\"showHelpTooltip = true\" (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"helpUrl\" href=\"#\" (click)=\"onHelp($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline hover:cqa-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!helpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <!-- Tooltip above trigger (same as element-popup); header has no overflow so tooltip is not clipped -->\n <div *ngIf=\"showHelpTooltip\"\n class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-bottom-[100%] cqa-mb-1 cqa-top-[22px]\"\n role=\"tooltip\">\n <div class=\"cqa-text-white cqa-text-left cqa-w-[306px] cqa-max-w-[306px] cqa-min-h-[20px] cqa-rounded-[6px] cqa-py-1 cqa-px-2 cqa-bg-[#0A0A0A] cqa-leading-[20px] cqa-text-[8px] cqa-break-words\">\n {{ helpTooltipText }}\n </div>\n </div>\n </div>\n <cqa-button type=\"button\" variant=\"text\" btnSize=\"md\"\n [text]=\"''\"\n icon=\"close\"\n (clicked)=\"onClose()\"\n [customClass]=\"'cqa-min-h-[28px] cqa-min-w-[28px] cqa-p-0 cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6]'\"\n title=\"Close\"\n aria-label=\"Close\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Line below header (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Tabs: Plain Text, Parameter, Environment, Runtime (full-width, cqa-button) -->\n <div class=\"cqa-w-full cqa-min-w-0 cqa-test-data-modal-tabs cqa-flex cqa-flex-row cqa-p-[3.5px] cqa-h-[31.5px] cqa-rounded-[8px] cqa-bg-[#F3F4F6] cqa-gap-0\" role=\"tablist\">\n <div *ngFor=\"let segment of tabSegments\" class=\"cqa-flex-1 cqa-min-w-0 cqa-flex\">\n <cqa-button\n type=\"button\"\n [attr.role]=\"'tab'\"\n [attr.aria-selected]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value\"\n [text]=\"segment.label\"\n [variant]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value ? 'filled' : 'text'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onTabChange(segment.value)\"\n [customClass]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value ? 'cqa-h-[25px] cqa-rounded-[8px] cqa-text-[12px] cqa-bg-[#3F43EE] cqa-text-white cqa-font-medium' : 'cqa-h-[25px] cqa-rounded-[8px] cqa-text-[12px] cqa-text-[#6B7280] hover:cqa-text-[#111827]'\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Content per tab: only this section scrolls (overflow here, not on root), so header tooltip is never clipped -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-h-0 cqa-overflow-y-auto\"\n [class.cqa-flex-1]=\"activeTab === 'parameter' || activeTab === 'environment' || activeTab === 'runtime' || activeTab === 'global'\">\n <!-- Plain Text tab (form-bound like Loop Step editForm + onEditFormFieldChange) -->\n <ng-container *ngIf=\"activeTab === 'plain-text'\">\n <cqa-custom-input\n label=\"Value\"\n [value]=\"editForm.get('value')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('value', $event)\"\n placeholder=\"https://example.com/dashboard\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#0A0A0A] cqa-m-0\">\n Enter a static text value that won't change during execution.\n </p>\n </ng-container>\n\n <!-- Test Data Profile tab (legacy \"parameter\" key): Variable Library -->\n <ng-container *ngIf=\"activeTab === 'parameter'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Variable Library header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Test Data Profile\n </h3>\n <a href=\"#\" (click)=\"onCreateNewVariable($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search library'\"\n [value]=\"editForm.get('parameterSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search library'\"\n (valueChange)=\"onParameterSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <!-- Parameter list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[200px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <div\n *ngFor=\"let item of parameterListConfig\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onParameterRowClick($event, item)\"\n (keydown.enter)=\"onParameterRowClick($event, item)\"\n (keydown.space)=\"onParameterRowClick($event, item)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedParameterId === item.id\"\n [class.cqa-border]=\"selectedParameterId === item.id\"\n [class.cqa-border-solid]=\"selectedParameterId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedParameterId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC] cqa-cursor-pointer\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n <button\n *ngIf=\"item.showEdit\"\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-p-1 cqa-min-w-0 cqa-text-[#1447E6] hover:cqa-bg-[#E5E7EB] cqa-bg-transparent cqa-border-none cqa-rounded-[6px] cqa-cursor-pointer\"\n (click)=\"onParameterEditClick($event, item.id)\"\n title=\"Edit\"\n aria-label=\"Edit\">\n <mat-icon\n class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\"\n (click)=\"onParameterEditClick($event, item.id)\">edit</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <p *ngIf=\"parameterListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No parameters match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Environment tab: Variable library by environment -->\n <ng-container *ngIf=\"activeTab === 'environment'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Section header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Environment\n </h3>\n <a href=\"#\" (click)=\"onCreateNewEnvironment($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <p *ngIf=\"environmentLegacyDeprecationMessage\"\n class=\"cqa-text-xs cqa-italic cqa-text-amber-600 cqa-m-0 cqa-flex-shrink-0\"\n [innerHTML]=\"environmentLegacyDeprecationMessage\"></p>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search Environment'\"\n [value]=\"editForm.get('environmentSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search Environment'\"\n (valueChange)=\"onEnvironmentSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <!-- Environment list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[220px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <button\n *ngFor=\"let item of environmentListConfig\"\n type=\"button\"\n (click)=\"onEnvironmentSelect(item.id)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border-solid]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedEnvironmentId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC]\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n </div>\n </div>\n </button>\n <p *ngIf=\"environmentListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No environment variables match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Global Data tab: workspace-scoped global variables (mirrors Environment listing) -->\n <ng-container *ngIf=\"activeTab === 'global'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Global Data\n </h3>\n </div>\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search global variables'\"\n [value]=\"editForm.get('globalVariableSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search global variables'\"\n (valueChange)=\"onGlobalVariableSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <div class=\"cqa-min-h-[220px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <p *ngIf=\"isLoadingGlobalVariables\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n Loading global variables\u2026\n </p>\n <button\n *ngFor=\"let item of globalVariableListConfig\"\n type=\"button\"\n (click)=\"onGlobalVariableSelect(item.id)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedGlobalVariableId === item.id\"\n [class.cqa-border]=\"selectedGlobalVariableId === item.id\"\n [class.cqa-border-solid]=\"selectedGlobalVariableId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedGlobalVariableId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC]\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n </div>\n </div>\n </button>\n <p *ngIf=\"!isLoadingGlobalVariables && globalVariableListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No global variables match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Runtime tab: dynamic value injector -->\n <ng-container *ngIf=\"activeTab === 'runtime'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-h-0 cqa-h-full cqa-overflow-y-auto\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-shrink-0\">\n Runtime\n </h3>\n <div class=\"cqa-flex-shrink-0\">\n <cqa-custom-input\n [value]=\"editForm.get('runtimeValue')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('runtimeValue', $event)\"\n placeholder=\"input text\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-mt-1.5 cqa-mb-0\">\n Values resolved during test execution based on session and step state.\n </p>\n </div>\n <!-- Recommended: suggestion chips -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-flex-shrink-0\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px] cqa-text-[#9CA3AF]\" aria-hidden=\"true\">schedule</mat-icon>\n <span class=\"cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#6B7280]\">Recommended</span>\n </div>\n <div class=\"cqa-test-data-runtime-chips-scroll cqa-flex cqa-gap-2 cqa-overflow-x-auto cqa-min-w-0 cqa-pb-1\">\n <cqa-button\n *ngFor=\"let snippet of runtimeSuggestedValues\"\n type=\"button\"\n variant=\"outlined\"\n btnSize=\"md\"\n [text]=\"snippet\"\n (clicked)=\"onRuntimeChipInsert(snippet)\"\n [customClass]=\"'cqa-flex-shrink-0 cqa-px-2 cqa-py-1 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#374151] cqa-bg-[#FFFFFF] cqa-border-[#E5E7EB] cqa-rounded-[8px] cqa-whitespace-nowrap'\">\n </cqa-button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Line below content (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Footer: Cancel, Apply (full width in one row) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Cancel'\" [fullWidth]=\"true\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Apply'\" [fullWidth]=\"true\" (clicked)=\"onApply()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n </div>\n <a role=\"button\" tabindex=\"0\" href=\"javascript:void(0)\" (click)=\"onEditInDepth($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-1.5 cqa-no-underline hover:cqa-no-underline cqa-self-center cqa-cursor-pointer\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">open_in_new</mat-icon>\n Edit in depth (open detailed right panel)\n </a>\n </div>\n</div>\n", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i4.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
344
|
+
TestDataModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestDataModalComponent, selector: "cqa-test-data-modal", inputs: { parameters: "parameters", environmentItems: "environmentItems", activeTab: "activeTab", value: "value", helpUrl: "helpUrl" }, outputs: { apply: "apply", cancel: "cancel", editInDepth: "editInDepth", parameterCreate: "parameterCreate", parameterEdit: "parameterEdit", environmentCreate: "environmentCreate", environmentEdit: "environmentEdit" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"cqa-bg-white cqa-rounded-[12px] cqa-shadow-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-w-[500px] cqa-max-h-[77vh] cqa-flex cqa-flex-col cqa-gap-[12px] cqa-p-2 cqa-box-border cqa-min-h-0\">\n <!-- Header: title left; Need help? + close icon right (no overflow here so tooltip is not clipped) -->\n <div class=\"cqa-flex cqa-flex-shrink-0 cqa-items-center cqa-justify-between cqa-gap-2 cqa-px-4\">\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-bold cqa-text-[#111827] cqa-m-0 cqa-font-[600]\">\n Test Data\n </h2>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-h-[28px]\">\n <!-- Need help? with custom tooltip: show below trigger so it is not clipped by modal overflow-y-auto -->\n <div class=\"cqa-relative cqa-inline-flex cqa-items-center\"\n (mouseenter)=\"showHelpTooltip = true\" (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"helpUrl\" href=\"#\" (click)=\"onHelp($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline hover:cqa-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!helpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <!-- Tooltip above trigger (same as element-popup); header has no overflow so tooltip is not clipped -->\n <div *ngIf=\"showHelpTooltip\"\n class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-bottom-[100%] cqa-mb-1 cqa-top-[22px]\"\n role=\"tooltip\">\n <div class=\"cqa-text-white cqa-text-left cqa-w-[306px] cqa-max-w-[306px] cqa-min-h-[20px] cqa-rounded-[6px] cqa-py-1 cqa-px-2 cqa-bg-[#0A0A0A] cqa-leading-[20px] cqa-text-[8px] cqa-break-words\">\n {{ helpTooltipText }}\n </div>\n </div>\n </div>\n <cqa-button type=\"button\" variant=\"text\" btnSize=\"md\"\n [text]=\"''\"\n icon=\"close\"\n (clicked)=\"onClose()\"\n [customClass]=\"'cqa-min-h-[28px] cqa-min-w-[28px] cqa-p-0 cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6]'\"\n title=\"Close\"\n aria-label=\"Close\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Line below header (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Tabs: Plain Text, Parameter, Environment, Runtime (full-width, cqa-button) -->\n <div class=\"cqa-w-full cqa-min-w-0 cqa-test-data-modal-tabs cqa-flex cqa-flex-row cqa-p-[3.5px] cqa-h-[31.5px] cqa-rounded-[8px] cqa-bg-[#F3F4F6] cqa-gap-0\" role=\"tablist\">\n <div *ngFor=\"let segment of tabSegments\" class=\"cqa-flex-1 cqa-min-w-0 cqa-flex\">\n <cqa-button\n type=\"button\"\n [attr.role]=\"'tab'\"\n [attr.aria-selected]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value\"\n [text]=\"segment.label\"\n [variant]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value ? 'filled' : 'text'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onTabChange(segment.value)\"\n [customClass]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value ? 'cqa-h-[25px] cqa-rounded-[8px] cqa-text-[12px] cqa-bg-[#3F43EE] cqa-text-white cqa-font-medium' : 'cqa-h-[25px] cqa-rounded-[8px] cqa-text-[12px] cqa-text-[#6B7280] hover:cqa-text-[#111827]'\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Content per tab: only this section scrolls (overflow here, not on root), so header tooltip is never clipped -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-h-0 cqa-overflow-y-auto\"\n [class.cqa-flex-1]=\"activeTab === 'parameter' || activeTab === 'environment' || activeTab === 'runtime'\">\n <!-- Plain Text tab (form-bound like Loop Step editForm + onEditFormFieldChange) -->\n <ng-container *ngIf=\"activeTab === 'plain-text'\">\n <cqa-custom-input\n label=\"Value\"\n [value]=\"editForm.get('value')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('value', $event)\"\n placeholder=\"https://example.com/dashboard\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#0A0A0A] cqa-m-0\">\n Enter a static text value that won't change during execution.\n </p>\n </ng-container>\n\n <!-- Parameter tab: Variable Library -->\n <ng-container *ngIf=\"activeTab === 'parameter'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Variable Library header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Parameters\n </h3>\n <a href=\"#\" (click)=\"onCreateNewVariable($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search library'\"\n [value]=\"editForm.get('parameterSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search library'\"\n (valueChange)=\"onParameterSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <!-- Parameter list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[200px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <div\n *ngFor=\"let item of parameterListConfig\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onParameterRowClick($event, item)\"\n (keydown.enter)=\"onParameterRowClick($event, item)\"\n (keydown.space)=\"onParameterRowClick($event, item)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedParameterId === item.id\"\n [class.cqa-border]=\"selectedParameterId === item.id\"\n [class.cqa-border-solid]=\"selectedParameterId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedParameterId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC] cqa-cursor-pointer\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n <button\n *ngIf=\"item.showEdit\"\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-p-1 cqa-min-w-0 cqa-text-[#1447E6] hover:cqa-bg-[#E5E7EB] cqa-bg-transparent cqa-border-none cqa-rounded-[6px] cqa-cursor-pointer\"\n (click)=\"onParameterEditClick($event, item.id)\"\n title=\"Edit\"\n aria-label=\"Edit\">\n <mat-icon\n class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\"\n (click)=\"onParameterEditClick($event, item.id)\">edit</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <p *ngIf=\"parameterListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No parameters match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Environment tab: Variable library by environment -->\n <ng-container *ngIf=\"activeTab === 'environment'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Section header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Environment\n </h3>\n <a href=\"#\" (click)=\"onCreateNewEnvironment($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search Environment'\"\n [value]=\"editForm.get('environmentSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search Environment'\"\n (valueChange)=\"onEnvironmentSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <!-- Environment list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[220px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <button\n *ngFor=\"let item of environmentListConfig\"\n type=\"button\"\n (click)=\"onEnvironmentSelect(item.id)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border-solid]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedEnvironmentId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC]\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n </div>\n </div>\n </button>\n <p *ngIf=\"environmentListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No environment variables match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Runtime tab: dynamic value injector -->\n <ng-container *ngIf=\"activeTab === 'runtime'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-h-0 cqa-h-full cqa-overflow-y-auto\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-shrink-0\">\n Runtime\n </h3>\n <div class=\"cqa-flex-shrink-0\">\n <cqa-custom-input\n [value]=\"editForm.get('runtimeValue')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('runtimeValue', $event)\"\n placeholder=\"input text\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-mt-1.5 cqa-mb-0\">\n Values resolved during test execution based on session and step state.\n </p>\n </div>\n <!-- Recommended: suggestion chips -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-flex-shrink-0\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px] cqa-text-[#9CA3AF]\" aria-hidden=\"true\">schedule</mat-icon>\n <span class=\"cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#6B7280]\">Recommended</span>\n </div>\n <div class=\"cqa-test-data-runtime-chips-scroll cqa-flex cqa-gap-2 cqa-overflow-x-auto cqa-min-w-0 cqa-pb-1\">\n <cqa-button\n *ngFor=\"let snippet of runtimeSuggestedValues\"\n type=\"button\"\n variant=\"outlined\"\n btnSize=\"md\"\n [text]=\"snippet\"\n (clicked)=\"onRuntimeChipInsert(snippet)\"\n [customClass]=\"'cqa-flex-shrink-0 cqa-px-2 cqa-py-1 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#374151] cqa-bg-[#FFFFFF] cqa-border-[#E5E7EB] cqa-rounded-[8px] cqa-whitespace-nowrap'\">\n </cqa-button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Line below content (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Footer: Cancel, Apply (full width in one row) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Cancel'\" [fullWidth]=\"true\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Apply'\" [fullWidth]=\"true\" (clicked)=\"onApply()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n </div>\n <a role=\"button\" tabindex=\"0\" href=\"javascript:void(0)\" (click)=\"onEditInDepth($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-1.5 cqa-no-underline hover:cqa-no-underline cqa-self-center cqa-cursor-pointer\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">open_in_new</mat-icon>\n Edit in depth (open detailed right panel)\n </a>\n </div>\n</div>\n", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i4.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
461
345
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestDataModalComponent, decorators: [{
|
|
462
346
|
type: Component,
|
|
463
|
-
args: [{ selector: 'cqa-test-data-modal', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"cqa-bg-white cqa-rounded-[12px] cqa-shadow-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-w-[500px] cqa-max-h-[77vh] cqa-flex cqa-flex-col cqa-gap-[12px] cqa-p-2 cqa-box-border cqa-min-h-0\">\n <!-- Header: title left; Need help? + close icon right (no overflow here so tooltip is not clipped) -->\n <div class=\"cqa-flex cqa-flex-shrink-0 cqa-items-center cqa-justify-between cqa-gap-2 cqa-px-4\">\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-bold cqa-text-[#111827] cqa-m-0 cqa-font-[600]\">\n Test Data\n </h2>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-h-[28px]\">\n <!-- Need help? with custom tooltip: show below trigger so it is not clipped by modal overflow-y-auto -->\n <div class=\"cqa-relative cqa-inline-flex cqa-items-center\"\n (mouseenter)=\"showHelpTooltip = true\" (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"helpUrl\" href=\"#\" (click)=\"onHelp($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline hover:cqa-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!helpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <!-- Tooltip above trigger (same as element-popup); header has no overflow so tooltip is not clipped -->\n <div *ngIf=\"showHelpTooltip\"\n class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-bottom-[100%] cqa-mb-1 cqa-top-[22px]\"\n role=\"tooltip\">\n <div class=\"cqa-text-white cqa-text-left cqa-w-[306px] cqa-max-w-[306px] cqa-min-h-[20px] cqa-rounded-[6px] cqa-py-1 cqa-px-2 cqa-bg-[#0A0A0A] cqa-leading-[20px] cqa-text-[8px] cqa-break-words\">\n {{ helpTooltipText }}\n </div>\n </div>\n </div>\n <cqa-button type=\"button\" variant=\"text\" btnSize=\"md\"\n [text]=\"''\"\n icon=\"close\"\n (clicked)=\"onClose()\"\n [customClass]=\"'cqa-min-h-[28px] cqa-min-w-[28px] cqa-p-0 cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6]'\"\n title=\"Close\"\n aria-label=\"Close\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Line below header (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Tabs: Plain Text, Parameter, Environment, Runtime (full-width, cqa-button) -->\n <div class=\"cqa-w-full cqa-min-w-0 cqa-test-data-modal-tabs cqa-flex cqa-flex-row cqa-p-[3.5px] cqa-h-[31.5px] cqa-rounded-[8px] cqa-bg-[#F3F4F6] cqa-gap-0\" role=\"tablist\">\n <div *ngFor=\"let segment of tabSegments\" class=\"cqa-flex-1 cqa-min-w-0 cqa-flex\">\n <cqa-button\n type=\"button\"\n [attr.role]=\"'tab'\"\n [attr.aria-selected]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value\"\n [text]=\"segment.label\"\n [variant]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value ? 'filled' : 'text'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onTabChange(segment.value)\"\n [customClass]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value ? 'cqa-h-[25px] cqa-rounded-[8px] cqa-text-[12px] cqa-bg-[#3F43EE] cqa-text-white cqa-font-medium' : 'cqa-h-[25px] cqa-rounded-[8px] cqa-text-[12px] cqa-text-[#6B7280] hover:cqa-text-[#111827]'\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Content per tab: only this section scrolls (overflow here, not on root), so header tooltip is never clipped -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-h-0 cqa-overflow-y-auto\"\n [class.cqa-flex-1]=\"activeTab === 'parameter' || activeTab === 'environment' || activeTab === 'runtime' || activeTab === 'global'\">\n <!-- Plain Text tab (form-bound like Loop Step editForm + onEditFormFieldChange) -->\n <ng-container *ngIf=\"activeTab === 'plain-text'\">\n <cqa-custom-input\n label=\"Value\"\n [value]=\"editForm.get('value')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('value', $event)\"\n placeholder=\"https://example.com/dashboard\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#0A0A0A] cqa-m-0\">\n Enter a static text value that won't change during execution.\n </p>\n </ng-container>\n\n <!-- Test Data Profile tab (legacy \"parameter\" key): Variable Library -->\n <ng-container *ngIf=\"activeTab === 'parameter'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Variable Library header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Test Data Profile\n </h3>\n <a href=\"#\" (click)=\"onCreateNewVariable($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search library'\"\n [value]=\"editForm.get('parameterSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search library'\"\n (valueChange)=\"onParameterSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <!-- Parameter list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[200px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <div\n *ngFor=\"let item of parameterListConfig\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onParameterRowClick($event, item)\"\n (keydown.enter)=\"onParameterRowClick($event, item)\"\n (keydown.space)=\"onParameterRowClick($event, item)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedParameterId === item.id\"\n [class.cqa-border]=\"selectedParameterId === item.id\"\n [class.cqa-border-solid]=\"selectedParameterId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedParameterId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC] cqa-cursor-pointer\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n <button\n *ngIf=\"item.showEdit\"\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-p-1 cqa-min-w-0 cqa-text-[#1447E6] hover:cqa-bg-[#E5E7EB] cqa-bg-transparent cqa-border-none cqa-rounded-[6px] cqa-cursor-pointer\"\n (click)=\"onParameterEditClick($event, item.id)\"\n title=\"Edit\"\n aria-label=\"Edit\">\n <mat-icon\n class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\"\n (click)=\"onParameterEditClick($event, item.id)\">edit</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <p *ngIf=\"parameterListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No parameters match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Environment tab: Variable library by environment -->\n <ng-container *ngIf=\"activeTab === 'environment'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Section header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Environment\n </h3>\n <a href=\"#\" (click)=\"onCreateNewEnvironment($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <p *ngIf=\"environmentLegacyDeprecationMessage\"\n class=\"cqa-text-xs cqa-italic cqa-text-amber-600 cqa-m-0 cqa-flex-shrink-0\"\n [innerHTML]=\"environmentLegacyDeprecationMessage\"></p>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search Environment'\"\n [value]=\"editForm.get('environmentSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search Environment'\"\n (valueChange)=\"onEnvironmentSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <!-- Environment list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[220px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <button\n *ngFor=\"let item of environmentListConfig\"\n type=\"button\"\n (click)=\"onEnvironmentSelect(item.id)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border-solid]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedEnvironmentId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC]\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n </div>\n </div>\n </button>\n <p *ngIf=\"environmentListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No environment variables match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Global Data tab: workspace-scoped global variables (mirrors Environment listing) -->\n <ng-container *ngIf=\"activeTab === 'global'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Global Data\n </h3>\n </div>\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search global variables'\"\n [value]=\"editForm.get('globalVariableSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search global variables'\"\n (valueChange)=\"onGlobalVariableSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <div class=\"cqa-min-h-[220px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <p *ngIf=\"isLoadingGlobalVariables\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n Loading global variables\u2026\n </p>\n <button\n *ngFor=\"let item of globalVariableListConfig\"\n type=\"button\"\n (click)=\"onGlobalVariableSelect(item.id)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedGlobalVariableId === item.id\"\n [class.cqa-border]=\"selectedGlobalVariableId === item.id\"\n [class.cqa-border-solid]=\"selectedGlobalVariableId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedGlobalVariableId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC]\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n </div>\n </div>\n </button>\n <p *ngIf=\"!isLoadingGlobalVariables && globalVariableListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No global variables match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Runtime tab: dynamic value injector -->\n <ng-container *ngIf=\"activeTab === 'runtime'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-h-0 cqa-h-full cqa-overflow-y-auto\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-shrink-0\">\n Runtime\n </h3>\n <div class=\"cqa-flex-shrink-0\">\n <cqa-custom-input\n [value]=\"editForm.get('runtimeValue')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('runtimeValue', $event)\"\n placeholder=\"input text\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-mt-1.5 cqa-mb-0\">\n Values resolved during test execution based on session and step state.\n </p>\n </div>\n <!-- Recommended: suggestion chips -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-flex-shrink-0\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px] cqa-text-[#9CA3AF]\" aria-hidden=\"true\">schedule</mat-icon>\n <span class=\"cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#6B7280]\">Recommended</span>\n </div>\n <div class=\"cqa-test-data-runtime-chips-scroll cqa-flex cqa-gap-2 cqa-overflow-x-auto cqa-min-w-0 cqa-pb-1\">\n <cqa-button\n *ngFor=\"let snippet of runtimeSuggestedValues\"\n type=\"button\"\n variant=\"outlined\"\n btnSize=\"md\"\n [text]=\"snippet\"\n (clicked)=\"onRuntimeChipInsert(snippet)\"\n [customClass]=\"'cqa-flex-shrink-0 cqa-px-2 cqa-py-1 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#374151] cqa-bg-[#FFFFFF] cqa-border-[#E5E7EB] cqa-rounded-[8px] cqa-whitespace-nowrap'\">\n </cqa-button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Line below content (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Footer: Cancel, Apply (full width in one row) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Cancel'\" [fullWidth]=\"true\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Apply'\" [fullWidth]=\"true\" (clicked)=\"onApply()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n </div>\n <a role=\"button\" tabindex=\"0\" href=\"javascript:void(0)\" (click)=\"onEditInDepth($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-1.5 cqa-no-underline hover:cqa-no-underline cqa-self-center cqa-cursor-pointer\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">open_in_new</mat-icon>\n Edit in depth (open detailed right panel)\n </a>\n </div>\n</div>\n" }]
|
|
347
|
+
args: [{ selector: 'cqa-test-data-modal', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"cqa-bg-white cqa-rounded-[12px] cqa-shadow-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-w-[500px] cqa-max-h-[77vh] cqa-flex cqa-flex-col cqa-gap-[12px] cqa-p-2 cqa-box-border cqa-min-h-0\">\n <!-- Header: title left; Need help? + close icon right (no overflow here so tooltip is not clipped) -->\n <div class=\"cqa-flex cqa-flex-shrink-0 cqa-items-center cqa-justify-between cqa-gap-2 cqa-px-4\">\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-bold cqa-text-[#111827] cqa-m-0 cqa-font-[600]\">\n Test Data\n </h2>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-h-[28px]\">\n <!-- Need help? with custom tooltip: show below trigger so it is not clipped by modal overflow-y-auto -->\n <div class=\"cqa-relative cqa-inline-flex cqa-items-center\"\n (mouseenter)=\"showHelpTooltip = true\" (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"helpUrl\" href=\"#\" (click)=\"onHelp($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline hover:cqa-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!helpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <!-- Tooltip above trigger (same as element-popup); header has no overflow so tooltip is not clipped -->\n <div *ngIf=\"showHelpTooltip\"\n class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-bottom-[100%] cqa-mb-1 cqa-top-[22px]\"\n role=\"tooltip\">\n <div class=\"cqa-text-white cqa-text-left cqa-w-[306px] cqa-max-w-[306px] cqa-min-h-[20px] cqa-rounded-[6px] cqa-py-1 cqa-px-2 cqa-bg-[#0A0A0A] cqa-leading-[20px] cqa-text-[8px] cqa-break-words\">\n {{ helpTooltipText }}\n </div>\n </div>\n </div>\n <cqa-button type=\"button\" variant=\"text\" btnSize=\"md\"\n [text]=\"''\"\n icon=\"close\"\n (clicked)=\"onClose()\"\n [customClass]=\"'cqa-min-h-[28px] cqa-min-w-[28px] cqa-p-0 cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6]'\"\n title=\"Close\"\n aria-label=\"Close\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Line below header (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Tabs: Plain Text, Parameter, Environment, Runtime (full-width, cqa-button) -->\n <div class=\"cqa-w-full cqa-min-w-0 cqa-test-data-modal-tabs cqa-flex cqa-flex-row cqa-p-[3.5px] cqa-h-[31.5px] cqa-rounded-[8px] cqa-bg-[#F3F4F6] cqa-gap-0\" role=\"tablist\">\n <div *ngFor=\"let segment of tabSegments\" class=\"cqa-flex-1 cqa-min-w-0 cqa-flex\">\n <cqa-button\n type=\"button\"\n [attr.role]=\"'tab'\"\n [attr.aria-selected]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value\"\n [text]=\"segment.label\"\n [variant]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value ? 'filled' : 'text'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onTabChange(segment.value)\"\n [customClass]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value ? 'cqa-h-[25px] cqa-rounded-[8px] cqa-text-[12px] cqa-bg-[#3F43EE] cqa-text-white cqa-font-medium' : 'cqa-h-[25px] cqa-rounded-[8px] cqa-text-[12px] cqa-text-[#6B7280] hover:cqa-text-[#111827]'\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Content per tab: only this section scrolls (overflow here, not on root), so header tooltip is never clipped -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-h-0 cqa-overflow-y-auto\"\n [class.cqa-flex-1]=\"activeTab === 'parameter' || activeTab === 'environment' || activeTab === 'runtime'\">\n <!-- Plain Text tab (form-bound like Loop Step editForm + onEditFormFieldChange) -->\n <ng-container *ngIf=\"activeTab === 'plain-text'\">\n <cqa-custom-input\n label=\"Value\"\n [value]=\"editForm.get('value')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('value', $event)\"\n placeholder=\"https://example.com/dashboard\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#0A0A0A] cqa-m-0\">\n Enter a static text value that won't change during execution.\n </p>\n </ng-container>\n\n <!-- Parameter tab: Variable Library -->\n <ng-container *ngIf=\"activeTab === 'parameter'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Variable Library header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Parameters\n </h3>\n <a href=\"#\" (click)=\"onCreateNewVariable($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search library'\"\n [value]=\"editForm.get('parameterSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search library'\"\n (valueChange)=\"onParameterSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <!-- Parameter list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[200px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <div\n *ngFor=\"let item of parameterListConfig\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onParameterRowClick($event, item)\"\n (keydown.enter)=\"onParameterRowClick($event, item)\"\n (keydown.space)=\"onParameterRowClick($event, item)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedParameterId === item.id\"\n [class.cqa-border]=\"selectedParameterId === item.id\"\n [class.cqa-border-solid]=\"selectedParameterId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedParameterId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC] cqa-cursor-pointer\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n <button\n *ngIf=\"item.showEdit\"\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-p-1 cqa-min-w-0 cqa-text-[#1447E6] hover:cqa-bg-[#E5E7EB] cqa-bg-transparent cqa-border-none cqa-rounded-[6px] cqa-cursor-pointer\"\n (click)=\"onParameterEditClick($event, item.id)\"\n title=\"Edit\"\n aria-label=\"Edit\">\n <mat-icon\n class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\"\n (click)=\"onParameterEditClick($event, item.id)\">edit</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <p *ngIf=\"parameterListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No parameters match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Environment tab: Variable library by environment -->\n <ng-container *ngIf=\"activeTab === 'environment'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Section header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Environment\n </h3>\n <a href=\"#\" (click)=\"onCreateNewEnvironment($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search Environment'\"\n [value]=\"editForm.get('environmentSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search Environment'\"\n (valueChange)=\"onEnvironmentSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <!-- Environment list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[220px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <button\n *ngFor=\"let item of environmentListConfig\"\n type=\"button\"\n (click)=\"onEnvironmentSelect(item.id)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border-solid]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedEnvironmentId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC]\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n </div>\n </div>\n </button>\n <p *ngIf=\"environmentListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No environment variables match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Runtime tab: dynamic value injector -->\n <ng-container *ngIf=\"activeTab === 'runtime'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-h-0 cqa-h-full cqa-overflow-y-auto\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-shrink-0\">\n Runtime\n </h3>\n <div class=\"cqa-flex-shrink-0\">\n <cqa-custom-input\n [value]=\"editForm.get('runtimeValue')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('runtimeValue', $event)\"\n placeholder=\"input text\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-mt-1.5 cqa-mb-0\">\n Values resolved during test execution based on session and step state.\n </p>\n </div>\n <!-- Recommended: suggestion chips -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-flex-shrink-0\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px] cqa-text-[#9CA3AF]\" aria-hidden=\"true\">schedule</mat-icon>\n <span class=\"cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#6B7280]\">Recommended</span>\n </div>\n <div class=\"cqa-test-data-runtime-chips-scroll cqa-flex cqa-gap-2 cqa-overflow-x-auto cqa-min-w-0 cqa-pb-1\">\n <cqa-button\n *ngFor=\"let snippet of runtimeSuggestedValues\"\n type=\"button\"\n variant=\"outlined\"\n btnSize=\"md\"\n [text]=\"snippet\"\n (clicked)=\"onRuntimeChipInsert(snippet)\"\n [customClass]=\"'cqa-flex-shrink-0 cqa-px-2 cqa-py-1 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#374151] cqa-bg-[#FFFFFF] cqa-border-[#E5E7EB] cqa-rounded-[8px] cqa-whitespace-nowrap'\">\n </cqa-button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Line below content (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Footer: Cancel, Apply (full width in one row) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Cancel'\" [fullWidth]=\"true\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Apply'\" [fullWidth]=\"true\" (clicked)=\"onApply()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n </div>\n <a role=\"button\" tabindex=\"0\" href=\"javascript:void(0)\" (click)=\"onEditInDepth($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-1.5 cqa-no-underline hover:cqa-no-underline cqa-self-center cqa-cursor-pointer\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">open_in_new</mat-icon>\n Edit in depth (open detailed right panel)\n </a>\n </div>\n</div>\n" }]
|
|
464
348
|
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }, { type: i7.TestDataModalRef, decorators: [{
|
|
465
349
|
type: Inject,
|
|
466
350
|
args: [TEST_DATA_MODAL_REF]
|
|
@@ -483,24 +367,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
483
367
|
type: Output
|
|
484
368
|
}], environmentEdit: [{
|
|
485
369
|
type: Output
|
|
486
|
-
}], searchGlobalVariables: [{
|
|
487
|
-
type: Output
|
|
488
370
|
}], parameters: [{
|
|
489
371
|
type: Input
|
|
490
372
|
}], environmentItems: [{
|
|
491
373
|
type: Input
|
|
492
|
-
}], globalVariables: [{
|
|
493
|
-
type: Input
|
|
494
|
-
}], isLoadingGlobalVariables: [{
|
|
495
|
-
type: Input
|
|
496
|
-
}], testCaseTestDataId: [{
|
|
497
|
-
type: Input
|
|
498
|
-
}], testCaseEnvironmentName: [{
|
|
499
|
-
type: Input
|
|
500
|
-
}], testCaseEnvironmentLabelSuffix: [{
|
|
501
|
-
type: Input
|
|
502
|
-
}], environmentLegacyDeprecationMessage: [{
|
|
503
|
-
type: Input
|
|
504
374
|
}], activeTab: [{
|
|
505
375
|
type: Input
|
|
506
376
|
}], value: [{
|
|
@@ -508,4 +378,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
508
378
|
}], helpUrl: [{
|
|
509
379
|
type: Input
|
|
510
380
|
}] } });
|
|
511
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1kYXRhLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvdGVzdC1kYXRhLW1vZGFsL3Rlc3QtZGF0YS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtZGF0YS1tb2RhbC90ZXN0LWRhdGEtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLDZCQUE2QixHQUk5QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBb0IsTUFBTSx1QkFBdUIsQ0FBQztBQUU5RSxPQUFPLEVBQ0wsc0JBQXNCLEdBRXZCLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUNMLGVBQWUsR0FHaEIsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7O0FBSzNDLE1BQU0sZ0JBQWdCLEdBQWlCO0lBQ3JDLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO0lBQzVDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO0lBQzFDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO0lBQzlDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO0lBQ3pDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0NBQ3ZDLENBQUM7QUFFRixNQUFNLHFCQUFxQixH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Qzs7bUhBdGVVLHNCQUFzQiw4RUFvRXZCLG1CQUFtQixhQUNQLG9CQUFvQjt1R0FyRS9CLHNCQUFzQixrMUJDbkVuQyw2Z3JCQW9XQTsyRkRqU2Esc0JBQXNCO2tCQU5sQyxTQUFTOytCQUNFLHFCQUFxQixRQUV6QixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsbUJBQ2IsdUJBQXVCLENBQUMsTUFBTTs7MEJBc0U1QyxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsb0JBQW9COzRDQXBFaEMsS0FBSztzQkFBZCxNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBTUUsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUcsZUFBZTtzQkFBdkIsS0FBSztnQkFFRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUVHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFFRyw4QkFBOEI7c0JBQXRDLEtBQUs7Z0JBRUcsbUNBQW1DO3NCQUEzQyxLQUFLO2dCQWlCRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgVEVTVF9EQVRBX01PREFMX0RBVEEsXG4gIFRFU1RfREFUQV9NT0RBTF9FRElUX0lOX0RFUFRILFxuICBUZXN0RGF0YU1vZGFsRGF0YSxcbiAgVGVzdERhdGFNb2RhbFRhYixcbiAgR2xvYmFsVmFyaWFibGVJdGVtLFxufSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1kYXRhJztcbmltcG9ydCB7IFRFU1RfREFUQV9NT0RBTF9SRUYsIFRlc3REYXRhTW9kYWxSZWYgfSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1yZWYnO1xuaW1wb3J0IHsgVGVzdERhdGFNb2RhbFJlc3VsdCB9IGZyb20gJy4vdGVzdC1kYXRhLW1vZGFsLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTU9DS19FTlZJUk9OTUVOVF9JVEVNUyxcbiAgRW52aXJvbm1lbnRJdGVtLFxufSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1lbnZpcm9ubWVudC5tb2RlbCc7XG5pbXBvcnQge1xuICBNT0NLX1BBUkFNRVRFUlMsXG4gIFBhcmFtZXRlckl0ZW0sXG4gIFBhcmFtZXRlclNjb3BlRmlsdGVyLFxufSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1wYXJhbWV0ZXIubW9kZWwnO1xuaW1wb3J0IHsgQ3FhTGlzdEl0ZW1Db25maWcgfSBmcm9tICcuLi8uLi9pdGVtLWxpc3QvaXRlbS1saXN0Lm1vZGVsJztcblxuaW50ZXJmYWNlIFRhYlNlZ21lbnQgeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogVGVzdERhdGFNb2RhbFRhYjsgfVxuXG5jb25zdCBBTExfVEFCX1NFR01FTlRTOiBUYWJTZWdtZW50W10gPSBbXG4gIHsgbGFiZWw6ICdQbGFpbiBUZXh0JywgdmFsdWU6ICdwbGFpbi10ZXh0JyB9LFxuICB7IGxhYmVsOiAnUGFyYW1ldGVyJywgdmFsdWU6ICdwYXJhbWV0ZXInIH0sXG4gIHsgbGFiZWw6ICdFbnZpcm9ubWVudCcsIHZhbHVlOiAnZW52aXJvbm1lbnQnIH0sXG4gIHsgbGFiZWw6ICdHbG9iYWwgRGF0YScsIHZhbHVlOiAnZ2xvYmFsJyB9LFxuICB7IGxhYmVsOiAnUnVudGltZScsIHZhbHVlOiAncnVudGltZScgfSxcbl07XG5cbmNvbnN0IFBBUkFNRVRFUl9GSUxURVJfVEFCUzogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogUGFyYW1ldGVyU2NvcGVGaWx0ZXIgfVtdID0gW1xuICB7IGxhYmVsOiAnQWxsJywgdmFsdWU6ICdhbGwnIH0sXG4gIHsgbGFiZWw6ICdHbG9iYWwnLCB2YWx1ZTogJ2dsb2JhbCcgfSxcbiAgeyBsYWJlbDogJ0xvY2FsJywgdmFsdWU6ICdsb2NhbCcgfSxcbl07XG5cbi8qKiBNb2NrIHJ1bnRpbWUgdmFyaWFibGUgc3VnZ2VzdGlvbnMgKHJlcGxhY2Ugd2l0aCBBUEkgd2hlbiBpbnRlZ3JhdGluZykuICovXG5jb25zdCBSVU5USU1FX1NVR0dFU1RFRF9WQUxVRVMgPSBbXG4gICdydW50aW1lLk1heFdhaXRUaW1lJyxcbiAgJ3J1bnRpbWUuc2Vzc2lvbl9pZCcsXG4gICdydW50aW1lLmF1dGhfdG9rZW4nLFxuICAncnVudGltZS5zdGVwX2luZGV4JyxcbiAgJ3J1bnRpbWUudGltZXN0YW1wJyxcbiAgJ3J1bnRpbWUudGVzdF9uYW1lJyxcbl07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZXN0LWRhdGEtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVzdC1kYXRhLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdERhdGFNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQE91dHB1dCgpIGFwcGx5ID0gbmV3IEV2ZW50RW1pdHRlcjx7dmFsdWU6IHN0cmluZywgYWN0aXZlVGFiOiBUZXN0RGF0YU1vZGFsVGFifT4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGVkaXRJbkRlcHRoID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcGFyYW1ldGVyQ3JlYXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcGFyYW1ldGVyRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgZW52aXJvbm1lbnRDcmVhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBlbnZpcm9ubWVudEVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIFNlcnZlci1zaWRlIHNlYXJjaCBmb3IgZ2xvYmFsIHZhcmlhYmxlcy4gKi9cbiAgQE91dHB1dCgpIHNlYXJjaEdsb2JhbFZhcmlhYmxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKiBDb21wdXRlZCBzZWdtZW50cyDigJQgcmVjb21wdXRlZCBpbiBuZ09uQ2hhbmdlcywgbmV2ZXIgYXMgYSBnZXR0ZXIgKHNlZ21lbnQtY29udHJvbCBuZWVkcyBhIHN0YWJsZSByZWYpLiAqL1xuICB0YWJTZWdtZW50czogVGFiU2VnbWVudFtdID0gQUxMX1RBQl9TRUdNRU5UUy5maWx0ZXIocyA9PiBzLnZhbHVlICE9PSAncGFyYW1ldGVyJyk7XG4gIHJlYWRvbmx5IHBhcmFtZXRlckZpbHRlclRhYnMgPSBQQVJBTUVURVJfRklMVEVSX1RBQlM7XG4gIC8qKiBQYXJhbWV0ZXIgbGlzdCBmcm9tIGlucHV0LCBmYWxscyBiYWNrIHRvIG1vY2sgZGF0YSBpZiBub3QgcHJvdmlkZWQuICovXG4gIEBJbnB1dCgpIHBhcmFtZXRlcnM6IFBhcmFtZXRlckl0ZW1bXSA9IE1PQ0tfUEFSQU1FVEVSUztcbiAgLyoqIEVudmlyb25tZW50IGxpc3QgZnJvbSBpbnB1dCwgZmFsbHMgYmFjayB0byBtb2NrIGRhdGEgaWYgbm90IHByb3ZpZGVkLiAqL1xuICBASW5wdXQoKSBlbnZpcm9ubWVudEl0ZW1zOiBFbnZpcm9ubWVudEl0ZW1bXSA9IE1PQ0tfRU5WSVJPTk1FTlRfSVRFTVM7XG4gIC8qKiBHbG9iYWwgRGF0YSB2YXJpYWJsZXMgKHdvcmtzcGFjZS1zY29wZWQpIGZvciB0aGUgbmV3IEdsb2JhbCBEYXRhIHRhYi4gKi9cbiAgQElucHV0KCkgZ2xvYmFsVmFyaWFibGVzOiBHbG9iYWxWYXJpYWJsZUl0ZW1bXSA9IFtdO1xuICAvKiogVHJ1ZSB3aGlsZSB0aGUgY29uc3VtaW5nIGFwcCBsb2FkcyBnbG9iYWwgdmFyaWFibGVzIChzZWFyY2gvaW5pdGlhbCkuICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ0dsb2JhbFZhcmlhYmxlczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogV2hlbiBzZXQsIHRoZSBUZXN0IERhdGEgUHJvZmlsZSB0YWIgaXMgc2hvd24g4oCUIGdhdGVkIG9uIHRlc3QgY2FzZSBoYXZpbmcgYSBURFAuICovXG4gIEBJbnB1dCgpIHRlc3RDYXNlVGVzdERhdGFJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBSZXNvbHZlZCB0ZXN0LWNhc2UgZW52aXJvbm1lbnQgbmFtZS4gRHJpdmVzIHRoZSBFbnZpcm9ubWVudC10YWIgc3ViaGVhZC4gKi9cbiAgQElucHV0KCkgdGVzdENhc2VFbnZpcm9ubWVudE5hbWU/OiBzdHJpbmc7XG4gIC8qKiBTdWZmaXggb24gdGhlIGVudi1uYW1lIHNob3duIGluIHRoZSBFbnZpcm9ubWVudCB0YWIgKGUuZy4gJyhkZWZhdWx0KScpLiBSZW5kZXItb25seS4gKi9cbiAgQElucHV0KCkgdGVzdENhc2VFbnZpcm9ubWVudExhYmVsU3VmZml4Pzogc3RyaW5nO1xuICAvKiogSXRhbGljIG5vdGUgcmVuZGVyZWQgYXRvcCB0aGUgRW52aXJvbm1lbnQgdGFiIGJvZHkg4oCUIHVzZWQgZm9yIGxlZ2FjeSBzdGVwLWxldmVsIGVudiBkZXByZWNhdGlvbi4gKi9cbiAgQElucHV0KCkgZW52aXJvbm1lbnRMZWdhY3lEZXByZWNhdGlvbk1lc3NhZ2U/OiBzdHJpbmc7XG4gIC8qKiBSdW50aW1lIHRhYjogc3VnZ2VzdGVkIHZhcmlhYmxlIGNoaXBzLiAqL1xuICByZWFkb25seSBydW50aW1lU3VnZ2VzdGVkVmFsdWVzOiByZWFkb25seSBzdHJpbmdbXSA9IFJVTlRJTUVfU1VHR0VTVEVEX1ZBTFVFUztcblxuICAvKiogRm9ybSBmb3IgYWxsIG1vZGFsIGNvbnRyb2xzIChzYW1lIHBhdHRlcm4gYXMgTG9vcCBTdGVwIGVkaXRGb3JtKS4gKi9cbiAgZWRpdEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIENhY2hlZCBzZWxlY3QgY29uZmlncyAoc3RhYmxlIHJlZnMsIHNhbWUgbmFtaW5nIGFzIExvb3AgU3RlcDogeHh4U2VsZWN0Q29uZmlnKS4gKi9cbiAgYWN0aXZlVGFiU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBwYXJhbWV0ZXJTY29wZUZpbHRlclNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuICAvKiogTG9jYWwgY29weSBvZiBmb3JtIHZhbHVlIGZvciBDYW5jZWwgcmV2ZXJ0IChzYW1lIHBhdHRlcm4gYXMgTG9vcCBTdGVwIGVkaXRTbmFwc2hvdCkuICovXG4gIHByaXZhdGUgZWRpdFNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAvKiogUHJlc2VydmUgdXNlci1lbnRlcmVkIHBsYWluIHRleHQgaW5kZXBlbmRlbnRseSBmcm9tIHBhcmFtZXRlci9lbnZpcm9ubWVudC9ydW50aW1lIHNlbGVjdGlvbnMuICovXG4gIHByaXZhdGUgcGxhaW5UZXh0VmFsdWUgPSAnJztcblxuICAvKiogU3RhdGUgZGVyaXZlZCBmcm9tIGNvbmZpZy9lZGl0Rm9ybSBmb3IgdGVtcGxhdGUgYW5kIGdldHRlcnMgKG1pcnJvcnMgTG9vcCBTdGVwIGlucHV0cykuICovXG4gIEBJbnB1dCgpIGFjdGl2ZVRhYjogVGVzdERhdGFNb2RhbFRhYiA9ICdwbGFpbi10ZXh0JztcbiAgQElucHV0KCkgdmFsdWUgPSAnJztcbiAgQElucHV0KCkgaGVscFVybCA9ICcnO1xuICBoZWxwVG9vbHRpcFRleHQgPSAnTm90IHN1cmUgd2hhdCB0byBkbz8gQ2xpY2sgdG8gZ28gdG8gb3VyIGRldGFpbGVkIHN0ZXAgY3JlYXRpb24gZG9jdW1lbnRhdGlvbic7XG4gIHNob3dIZWxwVG9vbHRpcCA9IGZhbHNlO1xuXG4gIHBhcmFtZXRlclNjb3BlRmlsdGVyOiBQYXJhbWV0ZXJTY29wZUZpbHRlciA9ICdhbGwnO1xuICBwYXJhbWV0ZXJTZWFyY2hRdWVyeSA9ICcnO1xuICBzZWxlY3RlZFBhcmFtZXRlcklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBlbnZpcm9ubWVudFNlYXJjaFF1ZXJ5ID0gJyc7XG4gIHNlbGVjdGVkRW52aXJvbm1lbnRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgZ2xvYmFsVmFyaWFibGVTZWFyY2hRdWVyeSA9ICcnO1xuICAvKiogU3RvcmVzIHRoZSB2YXJpYWJsZSBOQU1FICh1c2VkIGFzIHRoZSBpZCBmb3IgdGhlIHJvdywgc2luY2UgbmFtZXMgYXJlIHVuaXF1ZSB3aXRoaW4gYSB3b3Jrc3BhY2UpLiAqL1xuICBzZWxlY3RlZEdsb2JhbFZhcmlhYmxlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHJ1bnRpbWVWYWx1ZSA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBASW5qZWN0KFRFU1RfREFUQV9NT0RBTF9SRUYpIHByaXZhdGUgcmVmOiBUZXN0RGF0YU1vZGFsUmVmPFRlc3REYXRhTW9kYWxSZXN1bHQ+LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVEVTVF9EQVRBX01PREFMX0RBVEEpIGRhdGE/OiBUZXN0RGF0YU1vZGFsRGF0YVxuICApIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGRhdGEudmFsdWUgPz8gJyc7XG4gICAgICB0aGlzLmhlbHBVcmwgPSBkYXRhLmhlbHBVcmwgPz8gJyc7XG4gICAgICB0aGlzLmFjdGl2ZVRhYiA9IChkYXRhLmFjdGl2ZVRhYiA/PyAncGxhaW4tdGV4dCcpIGFzIFRlc3REYXRhTW9kYWxUYWI7XG4gICAgICB0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyID0gZGF0YS5wYXJhbWV0ZXJTY29wZUZpbHRlciA/PyAnYWxsJztcbiAgICAgIHRoaXMucGFyYW1ldGVyU2VhcmNoUXVlcnkgPSBkYXRhLnBhcmFtZXRlclNlYXJjaFF1ZXJ5ID8/ICcnO1xuICAgICAgdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID0gZGF0YS5zZWxlY3RlZFBhcmFtZXRlcklkID8/IG51bGw7XG4gICAgICB0aGlzLmVudmlyb25tZW50U2VhcmNoUXVlcnkgPSBkYXRhLmVudmlyb25tZW50U2VhcmNoUXVlcnkgPz8gJyc7XG4gICAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IGRhdGEuc2VsZWN0ZWRFbnZpcm9ubWVudElkID8/IG51bGw7XG4gICAgICB0aGlzLnJ1bnRpbWVWYWx1ZSA9IGRhdGEucnVudGltZVZhbHVlID8/ICcnO1xuICAgICAgdGhpcy5nbG9iYWxWYXJpYWJsZVNlYXJjaFF1ZXJ5ID0gZGF0YS5nbG9iYWxWYXJpYWJsZVNlYXJjaFF1ZXJ5ID8/ICcnO1xuICAgICAgdGhpcy5zZWxlY3RlZEdsb2JhbFZhcmlhYmxlSWQgPSBkYXRhLnNlbGVjdGVkR2xvYmFsVmFyaWFibGVJZCA/PyBudWxsO1xuICAgICAgaWYgKGRhdGEudGVzdENhc2VUZXN0RGF0YUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy50ZXN0Q2FzZVRlc3REYXRhSWQgPSBkYXRhLnRlc3RDYXNlVGVzdERhdGFJZCA/PyBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEudGVzdENhc2VFbnZpcm9ubWVudE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnRlc3RDYXNlRW52aXJvbm1lbnROYW1lID0gZGF0YS50ZXN0Q2FzZUVudmlyb25tZW50TmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLnRlc3RDYXNlRW52aXJvbm1lbnRMYWJlbFN1ZmZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMudGVzdENhc2VFbnZpcm9ubWVudExhYmVsU3VmZml4ID0gZGF0YS50ZXN0Q2FzZUVudmlyb25tZW50TGFiZWxTdWZmaXg7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5lbnZpcm9ubWVudExlZ2FjeURlcHJlY2F0aW9uTWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRMZWdhY3lEZXByZWNhdGlvbk1lc3NhZ2UgPSBkYXRhLmVudmlyb25tZW50TGVnYWN5RGVwcmVjYXRpb25NZXNzYWdlO1xuICAgICAgfVxuICAgICAgLy8gU2V0IHBhcmFtZXRlcnMgYW5kIGVudmlyb25tZW50SXRlbXMgZnJvbSBkYXRhIGlmIHByb3ZpZGVkXG4gICAgICBpZiAoZGF0YS5wYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gZGF0YS5wYXJhbWV0ZXJzO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuZW52aXJvbm1lbnRJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRJdGVtcyA9IGRhdGEuZW52aXJvbm1lbnRJdGVtcztcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmdsb2JhbFZhcmlhYmxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFsVmFyaWFibGVzID0gZGF0YS5nbG9iYWxWYXJpYWJsZXM7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucGxhaW5UZXh0VmFsdWUgPSB0aGlzLmFjdGl2ZVRhYiA9PT0gJ3BsYWluLXRleHQnID8gKHRoaXMudmFsdWUgPz8gJycpIDogJyc7XG4gICAgdGhpcy5yZWNvbXB1dGVWaXNpYmxlVGFicygpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5idWlsZEVkaXRGb3JtKCk7XG4gICAgdGhpcy5idWlsZFNlbGVjdENvbmZpZ3MoKTtcbiAgICB0aGlzLnJlY29tcHV0ZVZpc2libGVUYWJzKCk7XG4gICAgdGhpcy5lZGl0U25hcHNob3QgPSB7IC4uLnRoaXMuZWRpdEZvcm0udmFsdWUgfTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndGVzdENhc2VUZXN0RGF0YUlkJ10pIHtcbiAgICAgIHRoaXMucmVjb21wdXRlVmlzaWJsZVRhYnMoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZWRpdEZvcm0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snYWN0aXZlVGFiJ10pIHtcbiAgICAgIHRoaXMuZWRpdEZvcm0uZ2V0KCdhY3RpdmVUYWInKT8uc2V0VmFsdWUodGhpcy5hY3RpdmVUYWIgPz8gJ3BsYWluLXRleHQnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd2YWx1ZSddKSB7XG4gICAgICB0aGlzLmVkaXRGb3JtLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodGhpcy52YWx1ZSA/PyAnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5wbGFpblRleHRWYWx1ZSA9IHRoaXMuYWN0aXZlVGFiID09PSAncGxhaW4tdGV4dCcgPyAodGhpcy52YWx1ZSA/PyAnJykgOiAnJztcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hlbHBVcmwnXSkge1xuICAgICAgdGhpcy5oZWxwVXJsID0gdGhpcy5oZWxwVXJsID8/ICcnO1xuICAgIH1cblxuICAgIHRoaXMuc3luY1N0YXRlRnJvbUZvcm0oKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBNZW1vaXplIHZpc2libGUgc2VnbWVudHMg4oCUIGBbc2VnbWVudHNdYC1zdHlsZSByZWZzIG11c3QgYmUgc3RhYmxlIGFjcm9zcyBDRCBwYXNzZXMuICovXG4gIHByaXZhdGUgcmVjb21wdXRlVmlzaWJsZVRhYnMoKTogdm9pZCB7XG4gICAgY29uc3Qgc2hvd1RkcCA9IHRoaXMudGVzdENhc2VUZXN0RGF0YUlkICE9IG51bGw7XG4gICAgdGhpcy50YWJTZWdtZW50cyA9IEFMTF9UQUJfU0VHTUVOVFMuZmlsdGVyKHMgPT4gcy52YWx1ZSAhPT0gJ3BhcmFtZXRlcicgfHwgc2hvd1RkcCk7XG4gIH1cblxuICAvKiogQnVpbGQgZm9ybSB3aXRoIGFsbCBjb250cm9sIHZhbHVlcyAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBidWlsZEVkaXRGb3JtKS4gKi9cbiAgcHJpdmF0ZSBidWlsZEVkaXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHZhbHVlOiBbdGhpcy52YWx1ZSA/PyAnJ10sXG4gICAgICBhY3RpdmVUYWI6IFt0aGlzLmFjdGl2ZVRhYiA/PyAncGxhaW4tdGV4dCddLFxuICAgICAgcGFyYW1ldGVyU2NvcGVGaWx0ZXI6IFt0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyID8/ICdhbGwnXSxcbiAgICAgIHBhcmFtZXRlclNlYXJjaFF1ZXJ5OiBbdGhpcy5wYXJhbWV0ZXJTZWFyY2hRdWVyeSA/PyAnJ10sXG4gICAgICBzZWxlY3RlZFBhcmFtZXRlcklkOiBbdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID8/IG51bGxdLFxuICAgICAgZW52aXJvbm1lbnRTZWFyY2hRdWVyeTogW3RoaXMuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA/PyAnJ10sXG4gICAgICBzZWxlY3RlZEVudmlyb25tZW50SWQ6IFt0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA/PyBudWxsXSxcbiAgICAgIGdsb2JhbFZhcmlhYmxlU2VhcmNoUXVlcnk6IFt0aGlzLmdsb2JhbFZhcmlhYmxlU2VhcmNoUXVlcnkgPz8gJyddLFxuICAgICAgc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZUlkOiBbdGhpcy5zZWxlY3RlZEdsb2JhbFZhcmlhYmxlSWQgPz8gbnVsbF0sXG4gICAgICBydW50aW1lVmFsdWU6IFt0aGlzLnJ1bnRpbWVWYWx1ZSA/PyAnJ10sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQnVpbGQgc2VsZWN0IGNvbmZpZ3Mgb25jZSAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBidWlsZFNlbGVjdENvbmZpZ3MpLiAqL1xuICBwcml2YXRlIGJ1aWxkU2VsZWN0Q29uZmlncygpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IEFMTF9UQUJfU0VHTUVOVFMubWFwKChzKSA9PiAoe1xuICAgICAgaWQ6IHMudmFsdWUsXG4gICAgICB2YWx1ZTogcy52YWx1ZSxcbiAgICAgIG5hbWU6IHMubGFiZWwsXG4gICAgICBsYWJlbDogcy5sYWJlbCxcbiAgICB9KSk7XG4gICAgY29uc3QgZmlsdGVyT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBQQVJBTUVURVJfRklMVEVSX1RBQlMubWFwKChzKSA9PiAoe1xuICAgICAgaWQ6IHMudmFsdWUsXG4gICAgICB2YWx1ZTogcy52YWx1ZSxcbiAgICAgIG5hbWU6IHMubGFiZWwsXG4gICAgICBsYWJlbDogcy5sYWJlbCxcbiAgICB9KSk7XG4gICAgdGhpcy5hY3RpdmVUYWJTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdhY3RpdmVUYWInLFxuICAgICAgcGxhY2Vob2xkZXI6ICdUYWInLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiB0YWJPcHRpb25zLFxuICAgIH07XG4gICAgdGhpcy5wYXJhbWV0ZXJTY29wZUZpbHRlclNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3BhcmFtZXRlclNjb3BlRmlsdGVyJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2NvcGUnLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBmaWx0ZXJPcHRpb25zLFxuICAgIH07XG4gIH1cblxuICAvKiogVXBkYXRlIGZvcm0gY29udHJvbCBhbmQgc3luYyBjb21wb25lbnQgc3RhdGUgKHNhbWUgcGF0dGVybiBhcyBMb29wIFN0ZXAgb25FZGl0Rm9ybUZpZWxkQ2hhbmdlKS4gKi9cbiAgb25FZGl0Rm9ybUZpZWxkQ2hhbmdlKGNvbnRyb2xOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybS5nZXQoY29udHJvbE5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgaWYgKGNvbnRyb2xOYW1lID09PSAndmFsdWUnICYmIHRoaXMuYWN0aXZlVGFiID09PSAncGxhaW4tdGV4dCcpIHtcbiAgICAgIHRoaXMucGxhaW5UZXh0VmFsdWUgPSBTdHJpbmcodmFsdWUgPz8gJycpO1xuICAgIH1cbiAgICB0aGlzLnN5bmNTdGF0ZUZyb21Gb3JtKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogU3luYyBjb21wb25lbnQgc3RhdGUgZnJvbSBlZGl0Rm9ybSBzbyBnZXR0ZXJzIChlLmcuIGZpbHRlcmVkUGFyYW1ldGVycykgc3RheSBjb3JyZWN0LiAqL1xuICBwcml2YXRlIHN5bmNTdGF0ZUZyb21Gb3JtKCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLmVkaXRGb3JtLnZhbHVlO1xuICAgIHRoaXMudmFsdWUgPSB2LnZhbHVlID8/ICcnO1xuICAgIHRoaXMuYWN0aXZlVGFiID0gKHYuYWN0aXZlVGFiID8/ICdwbGFpbi10ZXh0JykgYXMgVGVzdERhdGFNb2RhbFRhYjtcbiAgICB0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyID0gKHYucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPz8gJ2FsbCcpIGFzIFBhcmFtZXRlclNjb3BlRmlsdGVyO1xuICAgIHRoaXMucGFyYW1ldGVyU2VhcmNoUXVlcnkgPSB2LnBhcmFtZXRlclNlYXJjaFF1ZXJ5ID8/ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA9IHYuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA/PyBudWxsO1xuICAgIHRoaXMuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA9IHYuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA/PyAnJztcbiAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IHYuc2VsZWN0ZWRFbnZpcm9ubWVudElkID8/IG51bGw7XG4gICAgdGhpcy5nbG9iYWxWYXJpYWJsZVNlYXJjaFF1ZXJ5ID0gdi5nbG9iYWxWYXJpYWJsZVNlYXJjaFF1ZXJ5ID8/ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZUlkID0gdi5zZWxlY3RlZEdsb2JhbFZhcmlhYmxlSWQgPz8gbnVsbDtcbiAgICB0aGlzLnJ1bnRpbWVWYWx1ZSA9IHYucnVudGltZVZhbHVlID8/ICcnO1xuICB9XG5cbiAgLyoqIEZpbHRlcmVkIHBhcmFtZXRlcnMgYnkgc2NvcGUgYW5kIHNlYXJjaCAoUGFyYW1ldGVyIHRhYikuICovXG4gIGdldCBmaWx0ZXJlZFBhcmFtZXRlcnMoKTogUGFyYW1ldGVySXRlbVtdIHtcbiAgICBsZXQgbGlzdCA9IHRoaXMucGFyYW1ldGVycztcbiAgICBpZiAodGhpcy5wYXJhbWV0ZXJTY29wZUZpbHRlciA9PT0gJ2dsb2JhbCcpIHtcbiAgICAgIGxpc3QgPSBsaXN0LmZpbHRlcigocCkgPT4gcC5zY29wZSA9PT0gJ0dsb2JhbCcpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wYXJhbWV0ZXJTY29wZUZpbHRlciA9PT0gJ2xvY2FsJykge1xuICAgICAgbGlzdCA9IGxpc3QuZmlsdGVyKChwKSA9PiBwLnNjb3BlID09PSAnTG9jYWwnKTtcbiAgICB9XG4gICAgY29uc3QgcSA9IHRoaXMucGFyYW1ldGVyU2VhcmNoUXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHEpIHtcbiAgICAgIGxpc3QgPSBsaXN0LmZpbHRlcigocCkgPT4gcC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIC8qKiBGaWx0ZXJlZCBlbnZpcm9ubWVudCBpdGVtcyBieSBzZWFyY2ggKEVudmlyb25tZW50IHRhYikuICovXG4gIGdldCBmaWx0ZXJlZEVudmlyb25tZW50cygpOiBFbnZpcm9ubWVudEl0ZW1bXSB7XG4gICAgY29uc3QgcSA9IHRoaXMuZW52aXJvbm1lbnRTZWFyY2hRdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIXEpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50SXRlbXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50SXRlbXMuZmlsdGVyKFxuICAgICAgKGUpID0+XG4gICAgICAgIGUubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8IGUudmFsdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKVxuICAgICk7XG4gIH1cblxuICAvKiogUGFyYW1ldGVyIHRhYjogbGlzdCBjb25maWcgZm9yIGNxYS1pdGVtLWxpc3QgKHNlYXJjaC1mcmllbmRseTogYmluZCBmaWx0ZXJlZCBsaXN0KS4gKi9cbiAgZ2V0IHBhcmFtZXRlckxpc3RDb25maWcoKTogQ3FhTGlzdEl0ZW1Db25maWdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRQYXJhbWV0ZXJzLm1hcCgocCkgPT4gKHtcbiAgICAgIGlkOiBwLmlkLFxuICAgICAgdGl0bGU6IHAubmFtZSxcbiAgICAgIHN1YnRpdGxlOiBwLnZhbHVlLFxuICAgICAgYmFkZ2U6IHAuc2NvcGUsXG4gICAgICBzaG93RWRpdDogdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID09PSBwLmlkLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKiBGaWx0ZXJlZCBnbG9iYWwgdmFyaWFibGVzIGJ5IHNlYXJjaCAoR2xvYmFsIERhdGEgdGFiKS4gKi9cbiAgZ2V0IGZpbHRlcmVkR2xvYmFsVmFyaWFibGVzKCk6IEdsb2JhbFZhcmlhYmxlSXRlbVtdIHtcbiAgICBjb25zdCBxID0gdGhpcy5nbG9iYWxWYXJpYWJsZVNlYXJjaFF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghcSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2xvYmFsVmFyaWFibGVzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nbG9iYWxWYXJpYWJsZXMuZmlsdGVyKFxuICAgICAgKGcpID0+XG4gICAgICAgIGcubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8XG4gICAgICAgIChnLnZhbHVlIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBHbG9iYWwgRGF0YSB0YWI6IGxpc3QgY29uZmlnIChtaXJyb3JzIGVudmlyb25tZW50IGxpc3RpbmcgcGF0dGVybikuICovXG4gIGdldCBnbG9iYWxWYXJpYWJsZUxpc3RDb25maWcoKTogQ3FhTGlzdEl0ZW1Db25maWdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRHbG9iYWxWYXJpYWJsZXMubWFwKChnKSA9PiAoe1xuICAgICAgaWQ6IGcubmFtZSxcbiAgICAgIHRpdGxlOiBnLm5hbWUsXG4gICAgICBzdWJ0aXRsZTogZy52YWx1ZSA/IGBWYWx1ZTogJHtnLnZhbHVlfWAgOiAnJyxcbiAgICAgIGJhZGdlOiAnR2xvYmFsJyxcbiAgICAgIHNob3dFZGl0OiBmYWxzZSxcbiAgICB9KSk7XG4gIH1cblxuICAvKiogRW52aXJvbm1lbnQgdGFiOiBsaXN0IGNvbmZpZyBmb3IgY3FhLWl0ZW0tbGlzdC4gKi9cbiAgZ2V0IGVudmlyb25tZW50TGlzdENvbmZpZygpOiBDcWFMaXN0SXRlbUNvbmZpZ1tdIHtcbiAgICBjb25zdCBzdWZmaXggPSAodGhpcy50ZXN0Q2FzZUVudmlyb25tZW50TGFiZWxTdWZmaXggPz8gJycpLnRyaW0oKTtcbiAgICBjb25zdCBkZWNvcmF0ZSA9IChlbnZOYW1lOiBzdHJpbmcpID0+IHN1ZmZpeCA/IGAke2Vudk5hbWV9ICR7c3VmZml4fWAgOiBlbnZOYW1lO1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkRW52aXJvbm1lbnRzLm1hcCgoZSkgPT4gKHtcbiAgICAgIGlkOiBlLmlkLFxuICAgICAgdGl0bGU6IGUubmFtZSxcbiAgICAgIHN1YnRpdGxlOiBgVmFsdWU6ICR7ZS52YWx1ZX1gLFxuICAgICAgYmFkZ2U6IGRlY29yYXRlKGUuZW52aXJvbm1lbnQpLFxuICAgICAgc2hvd0VkaXQ6IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkID09PSBlLmlkICYmIChlLmVkaXRhYmxlID8/IHRydWUpLFxuICAgIH0pKTtcbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKHRhYlZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdwbGFpbi10ZXh0Jykge1xuICAgICAgdGhpcy5wbGFpblRleHRWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJztcbiAgICB9XG4gICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ2FjdGl2ZVRhYicsIHRhYlZhbHVlKTtcbiAgICBpZiAodGFiVmFsdWUgPT09ICdwbGFpbi10ZXh0Jykge1xuICAgICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3ZhbHVlJywgdGhpcy5wbGFpblRleHRWYWx1ZSA/PyAnJyk7XG4gICAgfVxuICB9XG5cbiAgb25QYXJhbWV0ZXJTY29wZUZpbHRlckNoYW5nZShmaWx0ZXI6IFBhcmFtZXRlclNjb3BlRmlsdGVyKTogdm9pZCB7XG4gICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3BhcmFtZXRlclNjb3BlRmlsdGVyJywgZmlsdGVyKTtcbiAgfVxuXG4gIG9uUGFyYW1ldGVyU2VhcmNoSW5wdXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdwYXJhbWV0ZXJTZWFyY2hRdWVyeScsIHZhbHVlKTtcbiAgfVxuXG4gIG9uUGFyYW1ldGVyU2VsZWN0KHBhcmFtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmFtID0gdGhpcy5wYXJhbWV0ZXJzLmZpbmQoKHApID0+IHAuaWQgPT09IHBhcmFtSWQpO1xuICAgIGlmIChwYXJhbSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID0gdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID09PSBwYXJhbS5pZCA/IG51bGwgOiBwYXJhbS5pZDtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdzZWxlY3RlZFBhcmFtZXRlcklkJywgdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkKTtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCd2YWx1ZScsIHBhcmFtLm5hbWUpO1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbnNFeGNlcHQoJ3BhcmFtZXRlcicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBIYW5kbGUgcm93IGNsaWNrIChzZWxlY3QgcGFyYW1ldGVyKS4gRWRpdCBidXR0b24gdXNlcyBvblBhcmFtZXRlckVkaXRDbGljayB0byBhdm9pZCB0cmlnZ2VyaW5nIHRoaXMuICovXG4gIG9uUGFyYW1ldGVyUm93Q2xpY2soZXZlbnQ6IEV2ZW50LCBpdGVtOiB7IGlkOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJ2J1dHRvbiwgbWF0LWljb24sIFthcmlhLWxhYmVsPVwiRWRpdFwiXScpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub25QYXJhbWV0ZXJTZWxlY3QoaXRlbS5pZCk7XG4gIH1cblxuICAvKiogSGFuZGxlIEVkaXQgYnV0dG9uIGNsaWNrIC0gc3RvcCBwcm9wYWdhdGlvbiBhbmQgZW1pdCBzbyBwYXJlbnQgY2FuIG5hdmlnYXRlLiAqL1xuICBvblBhcmFtZXRlckVkaXRDbGljayhldmVudDogTW91c2VFdmVudCwgcGFyYW1JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLm9uUGFyYW1ldGVyRWRpdChwYXJhbUlkKTtcbiAgfVxuXG4gIG9uUGFyYW1ldGVyRWRpdChwYXJhbUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmFtZXRlckVkaXQuZW1pdChwYXJhbUlkKTtcbiAgfVxuXG4gIG9uQ3JlYXRlTmV3VmFyaWFibGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnBhcmFtZXRlckNyZWF0ZS5lbWl0KCk7XG4gIH1cblxuICBvbkVudmlyb25tZW50U2VhcmNoSW5wdXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdlbnZpcm9ubWVudFNlYXJjaFF1ZXJ5JywgdmFsdWUpO1xuICB9XG5cbiAgb25FbnZpcm9ubWVudFNlbGVjdChpdGVtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmVudmlyb25tZW50SXRlbXMuZmluZCgoZSkgPT4gZS5pZCA9PT0gaXRlbUlkKTtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgPVxuICAgICAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9PT0gaXRlbS5pZCA/IG51bGwgOiBpdGVtLmlkO1xuICAgICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3NlbGVjdGVkRW52aXJvbm1lbnRJZCcsIHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkKTtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCd2YWx1ZScsIGl0ZW0ubmFtZSk7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uc0V4Y2VwdCgnZW52aXJvbm1lbnQnKTtcbiAgICB9XG4gIH1cblxuICBvbkVudmlyb25tZW50RWRpdChpdGVtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZW52aXJvbm1lbnRFZGl0LmVtaXQoaXRlbUlkKTtcbiAgfVxuXG4gIG9uQ3JlYXRlTmV3RW52aXJvbm1lbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmVudmlyb25tZW50Q3JlYXRlLmVtaXQoKTtcbiAgfVxuXG4gIG9uR2xvYmFsVmFyaWFibGVTZWFyY2hJbnB1dCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ2dsb2JhbFZhcmlhYmxlU2VhcmNoUXVlcnknLCB2YWx1ZSk7XG4gICAgdGhpcy5zZWFyY2hHbG9iYWxWYXJpYWJsZXMuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbkdsb2JhbFZhcmlhYmxlU2VsZWN0KG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdsb2JhbFZhcmlhYmxlcy5maW5kKChnKSA9PiBnLm5hbWUgPT09IG5hbWUpO1xuICAgIGlmIChpdGVtKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkR2xvYmFsVmFyaWFibGVJZCA9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZUlkID09PSBpdGVtLm5hbWUgPyBudWxsIDogaXRlbS5uYW1lO1xuICAgICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3NlbGVjdGVkR2xvYmFsVmFyaWFibGVJZCcsIHRoaXMuc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZUlkKTtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCd2YWx1ZScsIGl0ZW0ubmFtZSk7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uc0V4Y2VwdCgnZ2xvYmFsJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJ1bnRpbWUgdGFiOiByZXBsYWNlIHRoZSBydW50aW1lIGlucHV0IHdpdGggdGhlIHNlbGVjdGVkIHN1Z2dlc3Rpb24uICovXG4gIG9uUnVudGltZUNoaXBJbnNlcnQoc25pcHBldDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3J1bnRpbWVWYWx1ZScsIHNuaXBwZXQpO1xuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25zRXhjZXB0KCdydW50aW1lJyk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiB0aGUgdXNlciBwaWNrcyBhIHZhbHVlIGluIGFueSB0YWIsIHRoZSBvdGhlcnMnIHZpc3VhbCBzZWxlY3Rpb24gbXVzdFxuICAgKiByZXNldCDigJQgdGhlIG1vZGFsIGFwcGxpZXMgb25seSB0aGUgYWN0aXZlIHRhYidzIHZhbHVlLCBzbyBrZWVwaW5nIHN0YWxlXG4gICAqIGhpZ2hsaWdodHMgY29uZnVzZXMgd2hpY2ggb25lIHdpbGwgbGFuZCBvbiBBcHBseS5cbiAgICovXG4gIHByaXZhdGUgY2xlYXJTZWxlY3Rpb25zRXhjZXB0KGtlZXA6ICdwYXJhbWV0ZXInIHwgJ2Vudmlyb25tZW50JyB8ICdnbG9iYWwnIHwgJ3J1bnRpbWUnKTogdm9pZCB7XG4gICAgaWYgKGtlZXAgIT09ICdwYXJhbWV0ZXInICYmIHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID0gbnVsbDtcbiAgICAgIHRoaXMuZWRpdEZvcm0uZ2V0KCdzZWxlY3RlZFBhcmFtZXRlcklkJyk/LnNldFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgaWYgKGtlZXAgIT09ICdlbnZpcm9ubWVudCcgJiYgdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkID0gbnVsbDtcbiAgICAgIHRoaXMuZWRpdEZvcm0uZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50SWQnKT8uc2V0VmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICBpZiAoa2VlcCAhPT0gJ2dsb2JhbCcgJiYgdGhpcy5zZWxlY3RlZEdsb2JhbFZhcmlhYmxlSWQgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZUlkID0gbnVsbDtcbiAgICAgIHRoaXMuZWRpdEZvcm0uZ2V0KCdzZWxlY3RlZEdsb2JhbFZhcmlhYmxlSWQnKT8uc2V0VmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICBpZiAoa2VlcCAhPT0gJ3J1bnRpbWUnICYmIHRoaXMucnVudGltZVZhbHVlICE9PSAnJykge1xuICAgICAgdGhpcy5ydW50aW1lVmFsdWUgPSAnJztcbiAgICAgIHRoaXMuZWRpdEZvcm0uZ2V0KCdydW50aW1lVmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBvbkFwcGx5KCk6IHZvaWQge1xuICAgIHRoaXMuc3luY1N0YXRlRnJvbUZvcm0oKTtcbiAgICBsZXQgdmFsdWVUb0FwcGx5ID0gdGhpcy5hY3RpdmVUYWIgPT09ICdydW50aW1lJyA/IHRoaXMucnVudGltZVZhbHVlIDogdGhpcy52YWx1ZTtcblxuICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ3BhcmFtZXRlcicpIHtcbiAgICAgIHZhbHVlVG9BcHBseSA9IHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA/IHRoaXMucGFyYW1ldGVycy5maW5kKChwKSA9PiBwLmlkID09PSB0aGlzLnNlbGVjdGVkUGFyYW1ldGVySWQpPy5uYW1lID8/ICcnIDogJyc7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgdmFsdWVUb0FwcGx5ID0gdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgPyB0aGlzLmVudmlyb25tZW50SXRlbXMuZmluZCgoZSkgPT4gZS5pZCA9PT0gdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQpPy5uYW1lID8/ICcnIDogJyc7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ2dsb2JhbCcpIHtcbiAgICAgIHZhbHVlVG9BcHBseSA9IHRoaXMuc2VsZWN0ZWRHbG9iYWxWYXJpYWJsZUlkXG4gICAgICAgID8gdGhpcy5nbG9iYWxWYXJpYWJsZXMuZmluZCgoZykgPT4gZy5uYW1lID09PSB0aGlzLnNlbGVjdGVkR2xvYmFsVmFyaWFibGVJZCk/Lm5hbWUgPz8gJydcbiAgICAgICAgOiAnJztcbiAgICB9XG5cbiAgICAvLyBXcmFwIHZhbHVlVG9BcHBseSBiYXNlZCBvbiBhY3RpdmUgdGFiXG4gICAgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJyAmJiB2YWx1ZVRvQXBwbHkpIHtcbiAgICAgIHZhbHVlVG9BcHBseSA9IGBAfCR7dmFsdWVUb0FwcGx5fXxgO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdydW50aW1lJyAmJiB2YWx1ZVRvQXBwbHkpIHtcbiAgICAgIHZhbHVlVG9BcHBseSA9IGAkfCR7dmFsdWVUb0FwcGx5fXxgO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdlbnZpcm9ubWVudCcgJiYgdmFsdWVUb0FwcGx5KSB7XG4gICAgICB2YWx1ZVRvQXBwbHkgPSBgKnwke3ZhbHVlVG9BcHBseX18YDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsJyAmJiB2YWx1ZVRvQXBwbHkpIHtcbiAgICAgIHZhbHVlVG9BcHBseSA9IGB7eyR7dmFsdWVUb0FwcGx5fX19YDtcbiAgICB9XG4gICAgLy8gcGxhaW4tdGV4dCB0YWI6IG5vIHdyYXBwaW5nLCB1c2UgdmFsdWUgYXMgaXNcblxuICAgIC8vIEJ1aWxkIHJlc3VsdCB3aXRoIG9ubHkgdGhlIGFjdGl2ZSB0YWIncyBkYXRhLCBjbGVhciBvdGhlciB0YWJzJyBkYXRhXG4gICAgY29uc3QgcmVzdWx0OiBUZXN0RGF0YU1vZGFsRGF0YSA9IHtcbiAgICAgIHZhbHVlOiB2YWx1ZVRvQXBwbHksXG4gICAgICBhY3RpdmVUYWI6IHRoaXMuYWN0aXZlVGFiLFxuICAgICAgLy8gT25seSBpbmNsdWRlIHBhcmFtZXRlciBkYXRhIGlmIHBhcmFtZXRlciB0YWIgaXMgYWN0aXZlXG4gICAgICBwYXJhbWV0ZXJTY29wZUZpbHRlcjogdGhpcy5hY3RpdmVUYWIgPT09ICdwYXJhbWV0ZXInID8gdGhpcy5wYXJhbWV0ZXJTY29wZUZpbHRlciA6IHVuZGVmaW5lZCxcbiAgICAgIHBhcmFtZXRlclNlYXJjaFF1ZXJ5OiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ3BhcmFtZXRlcicgPyB0aGlzLnBhcmFtZXRlclNlYXJjaFF1ZXJ5IDogdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0ZWRQYXJhbWV0ZXJJZDogdGhpcy5hY3RpdmVUYWIgPT09ICdwYXJhbWV0ZXInID8gdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkIDogdW5kZWZpbmVkLFxuICAgICAgLy8gT25seSBpbmNsdWRlIGVudmlyb25tZW50IGRhdGEgaWYgZW52aXJvbm1lbnQgdGFiIGlzIGFjdGl2ZVxuICAgICAgZW52aXJvbm1lbnRTZWFyY2hRdWVyeTogdGhpcy5hY3RpdmVUYWIgPT09ICdlbnZpcm9ubWVudCcgPyB0aGlzLmVudmlyb25tZW50U2VhcmNoUXVlcnkgOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3RlZEVudmlyb25tZW50SWQ6IHRoaXMuYWN0aXZlVGFiID09PSAnZW52aXJvbm1lbnQnID8gdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgOiB1bmRlZmluZWQsXG4gICAgICAvLyBPbmx5IGluY2x1ZGUgZ2xvYmFsIGRhdGEgaWYgZ2xvYmFsIHRhYiBpcyBhY3RpdmVcbiAgICAgIGdsb2JhbFZhcmlhYmxlU2VhcmNoUXVlcnk6IHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsJyA/IHRoaXMuZ2xvYmFsVmFyaWFibGVTZWFyY2hRdWVyeSA6IHVuZGVmaW5lZCxcbiAgICAgIHNlbGVjdGVkR2xvYmFsVmFyaWFibGVJZDogdGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWwnID8gdGhpcy5zZWxlY3RlZEdsb2JhbFZhcmlhYmxlSWQgOiB1bmRlZmluZWQsXG4gICAgICAvLyBPbmx5IGluY2x1ZGUgcnVudGltZSBkYXRhIGlmIHJ1bnRpbWUgdGFiIGlzIGFjdGl2ZVxuICAgICAgcnVudGltZVZhbHVlOiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ3J1bnRpbWUnID8gdGhpcy5ydW50aW1lVmFsdWUgOiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIHRoaXMuYXBwbHkuZW1pdCh7dmFsdWU6IHZhbHVlVG9BcHBseSwgYWN0aXZlVGFiOiB0aGlzLmFjdGl2ZVRhYiBhcyBUZXN0RGF0YU1vZGFsVGFifSk7XG4gICAgdGhpcy5yZWYuY2xvc2UocmVzdWx0KTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZSh0aGlzLmVkaXRTbmFwc2hvdCk7XG4gICAgdGhpcy5zeW5jU3RhdGVGcm9tRm9ybSgpO1xuICAgIHRoaXMuY2FuY2VsLmVtaXQoKTtcbiAgICB0aGlzLnJlZi5jbG9zZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2FuY2VsKCk7XG4gIH1cblxuICBvbkVkaXRJbkRlcHRoKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5lZGl0SW5EZXB0aC5lbWl0KCk7XG4gICAgdGhpcy5yZWYuY2xvc2UoVEVTVF9EQVRBX01PREFMX0VESVRfSU5fREVQVEggYXMgYW55KTtcbiAgfVxuXG4gIG9uSGVscChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oZWxwVXJsKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgd2luZG93Lm9wZW4odGhpcy5oZWxwVXJsLCAnX2JsYW5rJyk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiY3FhLWJnLXdoaXRlIGNxYS1yb3VuZGVkLVsxMnB4XSBjcWEtc2hhZG93LWxnIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFN0VCXSBjcWEtdy1bNTAwcHhdIGNxYS1tYXgtaC1bNzd2aF0gY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtWzEycHhdIGNxYS1wLTIgY3FhLWJveC1ib3JkZXIgY3FhLW1pbi1oLTBcIj5cbiAgPCEtLSBIZWFkZXI6IHRpdGxlIGxlZnQ7IE5lZWQgaGVscD8gKyBjbG9zZSBpY29uIHJpZ2h0IChubyBvdmVyZmxvdyBoZXJlIHNvIHRvb2x0aXAgaXMgbm90IGNsaXBwZWQpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMiBjcWEtcHgtNFwiPlxuICAgIDxoMiBjbGFzcz1cImNxYS10ZXh0LVsxNnB4XSBjcWEtbGVhZGluZy1bMjRweF0gY3FhLWZvbnQtYm9sZCBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMCBjcWEtZm9udC1bNjAwXVwiPlxuICAgICAgVGVzdCBEYXRhXG4gICAgPC9oMj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1pbi1oLVsyOHB4XVwiPlxuICAgICAgPCEtLSBOZWVkIGhlbHA/IHdpdGggY3VzdG9tIHRvb2x0aXA6IHNob3cgYmVsb3cgdHJpZ2dlciBzbyBpdCBpcyBub3QgY2xpcHBlZCBieSBtb2RhbCBvdmVyZmxvdy15LWF1dG8gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwic2hvd0hlbHBUb29sdGlwID0gdHJ1ZVwiIChtb3VzZWxlYXZlKT1cInNob3dIZWxwVG9vbHRpcCA9IGZhbHNlXCI+XG4gICAgICAgIDxhICpuZ0lmPVwiaGVscFVybFwiIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uSGVscCgkZXZlbnQpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIxcHhdIGNxYS1uby11bmRlcmxpbmUgaG92ZXI6Y3FhLXVuZGVybGluZSBjcWEtY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTcgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI3Rlc3QtZGF0YS1oZWxwLWNsaXApXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC41MDAzMyAxNC42NjYzQzEyLjQxMjMgMTQuNjY2MyAxNS41ODM3IDExLjY4MTYgMTUuNTgzNyA3Ljk5OTY3QzE1LjU4MzcgNC4zMTc3OCAxMi40MTIzIDEuMzMzMDEgOC41MDAzMyAxLjMzMzAxQzQuNTg4MzEgMS4zMzMwMSAxLjQxNjk5IDQuMzE3NzggMS40MTY5OSA3Ljk5OTY3QzEuNDE2OTkgMTEuNjgxNiA0LjU4ODMxIDE0LjY2NjMgOC41MDAzMyAxNC42NjYzWlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjQzODQ4IDYuMDAwMzhDNi42MDUwMSA1LjU1NDgzIDYuOTMzNzEgNS4xNzkxMiA3LjM2NjM2IDQuOTM5OEM3Ljc5OTAxIDQuNzAwNDkgOC4zMDc2OSA0LjYxMzAxIDguODAyMzEgNC42OTI4NUM5LjI5NjkzIDQuNzcyNyA5Ljc0NTU2IDUuMDE0NzMgMTAuMDY4NyA1LjM3NjA3QzEwLjM5MTkgNS43Mzc0IDEwLjU2ODggNi4xOTQ3MyAxMC41NjgxIDYuNjY3MDVDMTAuNTY4MSA4LjAwMDM4IDguNDQzMDYgOC42NjcwNSA4LjQ0MzA2IDguNjY3MDVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC41IDExLjMzM0g4LjUwOTY2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cInRlc3QtZGF0YS1oZWxwLWNsaXBcIj5cbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwid2hpdGVcIi8+XG4gICAgICAgICAgICAgIDwvY2xpcFBhdGg+XG4gICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgTmVlZCBoZWxwID9cbiAgICAgICAgPC9hPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFoZWxwVXJsXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1mb250LVs1MDBdIGNxYS10ZXh0LVsxMHB4XSBjcWEtY3Vyc29yLWRlZmF1bHRcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTcgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wIGNxYS10ZXh0LVsjM0Y0M0VFXVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCN0ZXN0LWRhdGEtaGVscC1jbGlwLW5vbGluaylcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjUwMDMzIDE0LjY2NjNDMTIuNDEyMyAxNC42NjYzIDE1LjU4MzcgMTEuNjgxNiAxNS41ODM3IDcuOTk5NjdDMTUuNTgzNyA0LjMxNzc4IDEyLjQxMjMgMS4zMzMwMSA4LjUwMDMzIDEuMzMzMDFDNC41ODgzMSAxLjMzMzAxIDEuNDE2OTkgNC4zMTc3OCAxLjQxNjk5IDcuOTk5NjdDMS40MTY5OSAxMS42ODE2IDQuNTg4MzEgMTQuNjY2MyA4LjUwMDMzIDE0LjY2NjNaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuNDM4NDggNi4wMDAzOEM2LjYwNTAxIDUuNTU0ODMgNi45MzM3MSA1LjE3OTEyIDcuMzY2MzYgNC45Mzk4QzcuNzk5MDEgNC43MDA0OSA4LjMwNzY5IDQuNjEzMDEgOC44MDIzMSA0LjY5Mjg1QzkuMjk2OTMgNC43NzI3IDkuNzQ1NTYgNS4wMTQ3MyAxMC4wNjg3IDUuMzc2MDdDMTAuMzkxOSA1LjczNzQgMTAuNTY4OCA2LjE5NDczIDEwLjU2ODEgNi42NjcwNUMxMC41NjgxIDguMDAwMzggOC40NDMwNiA4LjY2NzA1IDguNDQzMDYgOC42NjcwNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjUgMTEuMzMzSDguNTA5NjZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwidGVzdC1kYXRhLWhlbHAtY2xpcC1ub2xpbmtcIj5cbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwid2hpdGVcIi8+XG4gICAgICAgICAgICAgIDwvY2xpcFBhdGg+XG4gICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgTmVlZCBoZWxwID9cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8IS0tIFRvb2x0aXAgYWJvdmUgdHJpZ2dlciAoc2FtZSBhcyBlbGVtZW50LXBvcHVwKTsgaGVhZGVyIGhhcyBubyBvdmVyZmxvdyBzbyB0b29sdGlwIGlzIG5vdCBjbGlwcGVkIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0hlbHBUb29sdGlwXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtei1bMTAwXSBjcWEtYm90dG9tLVsxMDAlXSBjcWEtbWItMSBjcWEtdG9wLVsyMnB4XVwiXG4gICAgICAgICAgcm9sZT1cInRvb2x0aXBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtd2hpdGUgY3FhLXRleHQtbGVmdCBjcWEtdy1bMzA2cHhdIGNxYS1tYXgtdy1bMzA2cHhdIGNxYS1taW4taC1bMjBweF0gY3FhLXJvdW5kZWQtWzZweF0gY3FhLXB5LTEgY3FhLXB4LTIgY3FhLWJnLVsjMEEwQTBBXSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLXRleHQtWzhweF0gY3FhLWJyZWFrLXdvcmRzXCI+XG4gICAgICAgICAgICB7eyBoZWxwVG9vbHRpcFRleHQgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIGJ0blNpemU9XCJtZFwiXG4gICAgICAgIFt0ZXh0XT1cIicnXCJcbiAgICAgICAgaWNvbj1cImNsb3NlXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DbG9zZSgpXCJcbiAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtbWluLWgtWzI4cHhdIGNxYS1taW4tdy1bMjhweF0gY3FhLXAtMCBjcWEtdGV4dC1bIzZCNzI4MF0gaG92ZXI6Y3FhLWJnLVsjRjNGNEY2XSdcIlxuICAgICAgICB0aXRsZT1cIkNsb3NlXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gTGluZSBiZWxvdyBoZWFkZXIgKGZ1bGwgd2lkdGggb2YgbW9kYWwsIG5vIHNpZGUgbWFyZ2luKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS0tbXgtMiBjcWEtdy1bY2FsYygxMDAlKzFyZW0pXSBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtaC1weCBjcWEtdy1mdWxsIGNxYS1iZy1bI0U1RTdFQl1cIiByb2xlPVwicHJlc2VudGF0aW9uXCI+PC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gVGFiczogUGxhaW4gVGV4dCwgUGFyYW1ldGVyLCBFbnZpcm9ubWVudCwgUnVudGltZSAoZnVsbC13aWR0aCwgY3FhLWJ1dHRvbikgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1taW4tdy0wIGNxYS10ZXN0LWRhdGEtbW9kYWwtdGFicyBjcWEtZmxleCBjcWEtZmxleC1yb3cgY3FhLXAtWzMuNXB4XSBjcWEtaC1bMzEuNXB4XSBjcWEtcm91bmRlZC1bOHB4XSBjcWEtYmctWyNGM0Y0RjZdIGNxYS1nYXAtMFwiIHJvbGU9XCJ0YWJsaXN0XCI+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgc2VnbWVudCBvZiB0YWJTZWdtZW50c1wiIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtZmxleFwiPlxuICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFthdHRyLnJvbGVdPVwiJ3RhYidcIlxuICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIihlZGl0Rm9ybS5nZXQoJ2FjdGl2ZVRhYicpPy52YWx1ZSA/PyBhY3RpdmVUYWIpID09PSBzZWdtZW50LnZhbHVlXCJcbiAgICAgICAgW3RleHRdPVwic2VnbWVudC5sYWJlbFwiXG4gICAgICAgIFt2YXJpYW50XT1cIihlZGl0Rm9ybS5nZXQoJ2FjdGl2ZVRhYicpPy52YWx1ZSA/PyBhY3RpdmVUYWIpID09PSBzZWdtZW50LnZhbHVlID8gJ2ZpbGxlZCcgOiAndGV4dCdcIlxuICAgICAgICBidG5TaXplPVwibWRcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvblRhYkNoYW5nZShzZWdtZW50LnZhbHVlKVwiXG4gICAgICAgIFtjdXN0b21DbGFzc109XCIoZWRpdEZvcm0uZ2V0KCdhY3RpdmVUYWInKT8udmFsdWUgPz8gYWN0aXZlVGFiKSA9PT0gc2VnbWVudC52YWx1ZSA/ICdjcWEtaC1bMjVweF0gY3FhLXJvdW5kZWQtWzhweF0gY3FhLXRleHQtWzEycHhdIGNxYS1iZy1bIzNGNDNFRV0gY3FhLXRleHQtd2hpdGUgY3FhLWZvbnQtbWVkaXVtJyA6ICdjcWEtaC1bMjVweF0gY3FhLXJvdW5kZWQtWzhweF0gY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtdGV4dC1bIzExMTgyN10nXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQ29udGVudCBwZXIgdGFiOiBvbmx5IHRoaXMgc2VjdGlvbiBzY3JvbGxzIChvdmVyZmxvdyBoZXJlLCBub3Qgb24gcm9vdCksIHNvIGhlYWRlciB0b29sdGlwIGlzIG5ldmVyIGNsaXBwZWQgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi1oLTAgY3FhLW92ZXJmbG93LXktYXV0b1wiXG4gICAgW2NsYXNzLmNxYS1mbGV4LTFdPVwiYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJyB8fCBhY3RpdmVUYWIgPT09ICdlbnZpcm9ubWVudCcgfHwgYWN0aXZlVGFiID09PSAncnVudGltZScgfHwgYWN0aXZlVGFiID09PSAnZ2xvYmFsJ1wiPlxuICAgIDwhLS0gUGxhaW4gVGV4dCB0YWIgKGZvcm0tYm91bmQgbGlrZSBMb29wIFN0ZXAgZWRpdEZvcm0gKyBvbkVkaXRGb3JtRmllbGRDaGFuZ2UpIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdwbGFpbi10ZXh0J1wiPlxuICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgbGFiZWw9XCJWYWx1ZVwiXG4gICAgICAgIFt2YWx1ZV09XCJlZGl0Rm9ybS5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRWRpdEZvcm1GaWVsZENoYW5nZSgndmFsdWUnLCAkZXZlbnQpXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJodHRwczovL2V4YW1wbGUuY29tL2Rhc2hib2FyZFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIHNpemU9XCJtZFwiPlxuICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtbS0wXCI+XG4gICAgICAgIEVudGVyIGEgc3RhdGljIHRleHQgdmFsdWUgdGhhdCB3b24ndCBjaGFuZ2UgZHVyaW5nIGV4ZWN1dGlvbi5cbiAgICAgIDwvcD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gVGVzdCBEYXRhIFByb2ZpbGUgdGFiIChsZWdhY3kgXCJwYXJhbWV0ZXJcIiBrZXkpOiBWYXJpYWJsZSBMaWJyYXJ5IC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdwYXJhbWV0ZXInXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMiBjcWEtbWluLWgtMCBjcWEtZmxleC0xIGNxYS1taW4taC1bMThyZW1dXCI+XG4gICAgICAgIDwhLS0gVmFyaWFibGUgTGlicmFyeSBoZWFkZXIgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIwcHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wXCI+XG4gICAgICAgICAgICBUZXN0IERhdGEgUHJvZmlsZVxuICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwib25DcmVhdGVOZXdWYXJpYWJsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1uby11bmRlcmxpbmUgaG92ZXI6Y3FhLW9wYWNpdHktOTAgY3FhLWN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICBDcmVhdGUgTmV3ICtcbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFNlYXJjaDogYm91bmQgdG8gZWRpdEZvcm0gKHNhbWUgcGF0dGVybiBhcyBMb29wIFN0ZXAgY29udHJvbCBiaW5kaW5nKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgPGNxYS1zZWFyY2gtYmFyXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlYXJjaCBsaWJyYXJ5J1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZWRpdEZvcm0uZ2V0KCdwYXJhbWV0ZXJTZWFyY2hRdWVyeScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiJ1NlYXJjaCBsaWJyYXJ5J1wiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25QYXJhbWV0ZXJTZWFyY2hJbnB1dCgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtc2VhcmNoLWJhcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gUGFyYW1ldGVyIGxpc3QgKHNjcm9sbGFibGUsIHNlYXJjaC1pbnRlZ3JhdGVkIHZpYSBmaWx0ZXJlZCBsaXN0IGJpbmRpbmcpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1pbi1oLVsyMDBweF0gY3FhLWZsZXgtMSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xIGNxYS1taW4taC0wIGNxYS1vdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwYXJhbWV0ZXJMaXN0Q29uZmlnXCJcbiAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblBhcmFtZXRlclJvd0NsaWNrKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25QYXJhbWV0ZXJSb3dDbGljaygkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIm9uUGFyYW1ldGVyUm93Q2xpY2soJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWJnLVsjRDhEOUZDXV09XCJzZWxlY3RlZFBhcmFtZXRlcklkID09PSBpdGVtLmlkXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyXT1cInNlbGVjdGVkUGFyYW1ldGVySWQgPT09IGl0ZW0uaWRcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXItc29saWRdPVwic2VsZWN0ZWRQYXJhbWV0ZXJJZCA9PT0gaXRlbS5pZFwiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWJvcmRlci1bIzNGNDNFRV1dPVwic2VsZWN0ZWRQYXJhbWV0ZXJJZCA9PT0gaXRlbS5pZFwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLXRleHQtbGVmdCBjcWEtcm91bmRlZC1sZyBjcWEtcC0xIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBjcWEtYmctd2hpdGUgaG92ZXI6Y3FhLWJnLVsjRjlGQUZCXSBmb2N1czpjcWEtb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctMiBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLVsjRDhEOUZDXSBjcWEtY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RhcnQgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTAgY3FhLXRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiaXRlbS5zdWJ0aXRsZVwiIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW0tMCBjcWEtbXQtMC41IGNxYS10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAge3sgaXRlbS5zdWJ0aXRsZSB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWVuZCBjcWEtZ2FwLTEgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0uYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtcHgtMiBjcWEtcm91bmRlZC1bOHB4XSBjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtYmctWyNlZmY2ZmZdIGNxYS10ZXh0LVsjMTQ0N0U2XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI2M4ZTBmZl1cIj5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uYmFkZ2UgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnNob3dFZGl0XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtMSBjcWEtbWluLXctMCBjcWEtdGV4dC1bIzE0NDdFNl0gaG92ZXI6Y3FhLWJnLVsjRTVFN0VCXSBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1yb3VuZGVkLVs2cHhdIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25QYXJhbWV0ZXJFZGl0Q2xpY2soJGV2ZW50LCBpdGVtLmlkKVwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIkVkaXRcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXRcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIiFjcWEtdy00ICFjcWEtaC00ICFjcWEtdGV4dC1bMTZweF1cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25QYXJhbWV0ZXJFZGl0Q2xpY2soJGV2ZW50LCBpdGVtLmlkKVwiPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwICpuZ0lmPVwicGFyYW1ldGVyTGlzdENvbmZpZy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tLTAgY3FhLXB5LTQgY3FhLXRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICBObyBwYXJhbWV0ZXJzIG1hdGNoIHlvdXIgc2VhcmNoLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRW52aXJvbm1lbnQgdGFiOiBWYXJpYWJsZSBsaWJyYXJ5IGJ5IGVudmlyb25tZW50IC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdlbnZpcm9ubWVudCdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1taW4taC0wIGNxYS1mbGV4LTEgY3FhLW1pbi1oLVsxOHJlbV1cIj5cbiAgICAgICAgPCEtLSBTZWN0aW9uIGhlYWRlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTBcIj5cbiAgICAgICAgICAgIEVudmlyb25tZW50XG4gICAgICAgICAgPC9oMz5cbiAgICAgICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvbkNyZWF0ZU5ld0Vudmlyb25tZW50KCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLW5vLXVuZGVybGluZSBob3ZlcjpjcWEtb3BhY2l0eS05MCBjcWEtY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgIENyZWF0ZSBOZXcgK1xuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwICpuZ0lmPVwiZW52aXJvbm1lbnRMZWdhY3lEZXByZWNhdGlvbk1lc3NhZ2VcIlxuICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS1pdGFsaWMgY3FhLXRleHQtYW1iZXItNjAwIGNxYS1tLTAgY3FhLWZsZXgtc2hyaW5rLTBcIlxuICAgICAgICAgICBbaW5uZXJIVE1MXT1cImVudmlyb25tZW50TGVnYWN5RGVwcmVjYXRpb25NZXNzYWdlXCI+PC9wPlxuICAgICAgICA8IS0tIFNlYXJjaDogYm91bmQgdG8gZWRpdEZvcm0gKHNhbWUgcGF0dGVybiBhcyBMb29wIFN0ZXAgY29udHJvbCBiaW5kaW5nKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgPGNxYS1zZWFyY2gtYmFyXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlYXJjaCBFbnZpcm9ubWVudCdcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImVkaXRGb3JtLmdldCgnZW52aXJvbm1lbnRTZWFyY2hRdWVyeScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiJ1NlYXJjaCBFbnZpcm9ubWVudCdcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRW52aXJvbm1lbnRTZWFyY2hJbnB1dCgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtc2VhcmNoLWJhcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gRW52aXJvbm1lbnQgbGlzdCAoc2Nyb2xsYWJsZSwgc2VhcmNoLWludGVncmF0ZWQgdmlhIGZpbHRlcmVkIGxpc3QgYmluZGluZykgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWluLWgtWzIyMHB4XSBjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEgY3FhLW1pbi1oLTAgY3FhLW92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGVudmlyb25tZW50TGlzdENvbmZpZ1wiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkVudmlyb25tZW50U2VsZWN0KGl0ZW0uaWQpXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtYmctWyNEOEQ5RkNdXT1cInNlbGVjdGVkRW52aXJvbm1lbnRJZCA9PT0gaXRlbS5pZFwiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWJvcmRlcl09XCJzZWxlY3RlZEVudmlyb25tZW50SWQgPT09IGl0ZW0uaWRcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXItc29saWRdPVwic2VsZWN0ZWRFbnZpcm9ubWVudElkID09PSBpdGVtLmlkXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLVsjM0Y0M0VFXV09XCJzZWxlY3RlZEVudmlyb25tZW50SWQgPT09IGl0ZW0uaWRcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS10ZXh0LWxlZnQgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLWJnLXdoaXRlIGhvdmVyOmNxYS1iZy1bI0Y5RkFGQl0gZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLTIgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1bI0Q4RDlGQ11cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RhcnQgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTAgY3FhLXRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiaXRlbS5zdWJ0aXRsZVwiIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW0tMCBjcWEtbXQtMC41IGNxYS10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAge3sgaXRlbS5zdWJ0aXRsZSB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWVuZCBjcWEtZ2FwLTEgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0uYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtcHgtMiBjcWEtcm91bmRlZC1bOHB4XSBjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtYmctWyNlZmY2ZmZdIGNxYS10ZXh0LVsjMTQ0N0U2XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI2M4ZTBmZl1cIj5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uYmFkZ2UgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPHAgKm5nSWY9XCJlbnZpcm9ubWVudExpc3RDb25maWcubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbS0wIGNxYS1weS00IGNxYS10ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgTm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIG1hdGNoIHlvdXIgc2VhcmNoLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gR2xvYmFsIERhdGEgdGFiOiB3b3Jrc3BhY2Utc2NvcGVkIGdsb2JhbCB2YXJpYWJsZXMgKG1pcnJvcnMgRW52aXJvbm1lbnQgbGlzdGluZykgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ2dsb2JhbCdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1taW4taC0wIGNxYS1mbGV4LTEgY3FhLW1pbi1oLVsxOHJlbV1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTBcIj5cbiAgICAgICAgICAgIEdsb2JhbCBEYXRhXG4gICAgICAgICAgPC9oMz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIDxjcWEtc2VhcmNoLWJhclxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWFyY2ggZ2xvYmFsIHZhcmlhYmxlcydcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImVkaXRGb3JtLmdldCgnZ2xvYmFsVmFyaWFibGVTZWFyY2hRdWVyeScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiJ1NlYXJjaCBnbG9iYWwgdmFyaWFibGVzJ1wiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25HbG9iYWxWYXJpYWJsZVNlYXJjaElucHV0KCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS1zZWFyY2gtYmFyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4taC1bMjIwcHhdIGNxYS1mbGV4LTEgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMSBjcWEtbWluLWgtMCBjcWEtb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgPHAgKm5nSWY9XCJpc0xvYWRpbmdHbG9iYWxWYXJpYWJsZXNcIiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tLTAgY3FhLXB5LTQgY3FhLXRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICBMb2FkaW5nIGdsb2JhbCB2YXJpYWJsZXPigKZcbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2xvYmFsVmFyaWFibGVMaXN0Q29uZmlnXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uR2xvYmFsVmFyaWFibGVTZWxlY3QoaXRlbS5pZClcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS1iZy1bI0Q4RDlGQ11dPVwic2VsZWN0ZWRHbG9iYWxWYXJpYWJsZUlkID09PSBpdGVtLmlkXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyXT1cInNlbGVjdGVkR2xvYmFsVmFyaWFibGVJZCA9PT0gaXRlbS5pZFwiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWJvcmRlci1zb2xpZF09XCJzZWxlY3RlZEdsb2JhbFZhcmlhYmxlSWQgPT09IGl0ZW0uaWRcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXItWyMzRjQzRUVdXT1cInNlbGVjdGVkR2xvYmFsVmFyaWFibGVJZCA9PT0gaXRlbS5pZFwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLXRleHQtbGVmdCBjcWEtcm91bmRlZC1sZyBjcWEtcC0xIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBjcWEtYmctd2hpdGUgaG92ZXI6Y3FhLWJnLVsjRjlGQUZCXSBmb2N1czpjcWEtb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctMiBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLVsjRDhEOUZDXVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1zdGFydCBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyMHB4XSBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMCBjcWEtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0udGl0bGUgfX1cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJpdGVtLnN1YnRpdGxlXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbS0wIGNxYS1tdC0wLjUgY3FhLXRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLnN1YnRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtZW5kIGNxYS1nYXAtMSBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbS5iYWRnZVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1weC0yIGNxYS1yb3VuZGVkLVs4cHhdIGNxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1iZy1bI2VmZjZmZl0gY3FhLXRleHQtWyMxNDQ3RTZdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjYzhlMGZmXVwiPlxuICAgICAgICAgICAgICAgICAge3sgaXRlbS5iYWRnZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8cCAqbmdJZj1cIiFpc0xvYWRpbmdHbG9iYWxWYXJpYWJsZXMgJiYgZ2xvYmFsVmFyaWFibGVMaXN0Q29uZmlnLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW0tMCBjcWEtcHktNCBjcWEtdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIE5vIGdsb2JhbCB2YXJpYWJsZXMgbWF0Y2ggeW91ciBzZWFyY2guXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBSdW50aW1lIHRhYjogZHluYW1pYyB2YWx1ZSBpbmplY3RvciAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlVGFiID09PSAncnVudGltZSdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1taW4taC0wIGNxYS1oLWZ1bGwgY3FhLW92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIwcHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgUnVudGltZVxuICAgICAgICA8L2gzPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgW3ZhbHVlXT1cImVkaXRGb3JtLmdldCgncnVudGltZVZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3J1bnRpbWVWYWx1ZScsICRldmVudClcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJpbnB1dCB0ZXh0XCJcbiAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICBzaXplPVwibWRcIj5cbiAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbXQtMS41IGNxYS1tYi0wXCI+XG4gICAgICAgICAgICBWYWx1ZXMgcmVzb2x2ZWQgZHVyaW5nIHRlc3QgZXhlY3V0aW9uIGJhc2VkIG9uIHNlc3Npb24gYW5kIHN0ZXAgc3RhdGUuXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBSZWNvbW1lbmRlZDogc3VnZ2VzdGlvbiBjaGlwcyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LTQgIWNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XSBjcWEtdGV4dC1bIzlDQTNBRl1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5zY2hlZHVsZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXVwiPlJlY29tbWVuZGVkPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGVzdC1kYXRhLXJ1bnRpbWUtY2hpcHMtc2Nyb2xsIGNxYS1mbGV4IGNxYS1nYXAtMiBjcWEtb3ZlcmZsb3cteC1hdXRvIGNxYS1taW4tdy0wIGNxYS1wYi0xXCI+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc25pcHBldCBvZiBydW50aW1lU3VnZ2VzdGVkVmFsdWVzXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgICAgICAgIFt0ZXh0XT1cInNuaXBwZXRcIlxuICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJvblJ1bnRpbWVDaGlwSW5zZXJ0KHNuaXBwZXQpXCJcbiAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC1zaHJpbmstMCBjcWEtcHgtMiBjcWEtcHktMSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLWJnLVsjRkZGRkZGXSBjcWEtYm9yZGVyLVsjRTVFN0VCXSBjcWEtcm91bmRlZC1bOHB4XSBjcWEtd2hpdGVzcGFjZS1ub3dyYXAnXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDwhLS0gTGluZSBiZWxvdyBjb250ZW50IChmdWxsIHdpZHRoIG9mIG1vZGFsLCBubyBzaWRlIG1hcmdpbikgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtLW14LTIgY3FhLXctW2NhbGMoMTAwJSsxcmVtKV0gY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWgtcHggY3FhLXctZnVsbCBjcWEtYmctWyNFNUU3RUJdXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEZvb3RlcjogQ2FuY2VsLCBBcHBseSAoZnVsbCB3aWR0aCBpbiBvbmUgcm93KSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0cmV0Y2ggY3FhLWdhcC0yIGNxYS13LWZ1bGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cIidDYW5jZWwnXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiXG4gICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTJweF0gY3FhLXB5LVs5cHhdIGNxYS1ib3JkZXItWyM0MTQxNDZdJ1wiPjwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cIidBcHBseSdcIiBbZnVsbFdpZHRoXT1cInRydWVcIiAoY2xpY2tlZCk9XCJvbkFwcGx5KClcIlxuICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzEycHhdIGNxYS1weS1bOXB4XSBjcWEtYm9yZGVyLVsjM0Y0M0VFXSdcIj48L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8YSByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCIgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKCRldmVudClcIlxuICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtbm8tdW5kZXJsaW5lIGhvdmVyOmNxYS1uby11bmRlcmxpbmUgY3FhLXNlbGYtY2VudGVyIGNxYS1jdXJzb3ItcG9pbnRlclwiPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LTQgIWNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XVwiPm9wZW5faW5fbmV3PC9tYXQtaWNvbj5cbiAgICAgIEVkaXQgaW4gZGVwdGggKG9wZW4gZGV0YWlsZWQgcmlnaHQgcGFuZWwpXG4gICAgPC9hPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
381
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1kYXRhLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvdGVzdC1kYXRhLW1vZGFsL3Rlc3QtZGF0YS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtZGF0YS1tb2RhbC90ZXN0LWRhdGEtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLDZCQUE2QixHQUc5QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBb0IsTUFBTSx1QkFBdUIsQ0FBQztBQUU5RSxPQUFPLEVBQ0wsc0JBQXNCLEdBRXZCLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUNMLGVBQWUsR0FHaEIsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7O0FBRzNDLE1BQU0sWUFBWSxHQUFHO0lBQ25CLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO0lBQzVDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO0lBQzFDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO0lBQzlDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0NBQ3ZDLENBQUM7QUFFRixNQUFNLHFCQUFxQixHQUFxRDtJQUM5RSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFB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LE1BQU07OzBCQW1ENUMsTUFBTTsyQkFBQyxtQkFBbUI7OzBCQUMxQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLG9CQUFvQjs0Q0FqRGhDLEtBQUs7c0JBQWQsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBS0UsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBaUJHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBURVNUX0RBVEFfTU9EQUxfREFUQSxcbiAgVEVTVF9EQVRBX01PREFMX0VESVRfSU5fREVQVEgsXG4gIFRlc3REYXRhTW9kYWxEYXRhLFxuICBUZXN0RGF0YU1vZGFsVGFiLFxufSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1kYXRhJztcbmltcG9ydCB7IFRFU1RfREFUQV9NT0RBTF9SRUYsIFRlc3REYXRhTW9kYWxSZWYgfSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1yZWYnO1xuaW1wb3J0IHsgVGVzdERhdGFNb2RhbFJlc3VsdCB9IGZyb20gJy4vdGVzdC1kYXRhLW1vZGFsLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTU9DS19FTlZJUk9OTUVOVF9JVEVNUyxcbiAgRW52aXJvbm1lbnRJdGVtLFxufSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1lbnZpcm9ubWVudC5tb2RlbCc7XG5pbXBvcnQge1xuICBNT0NLX1BBUkFNRVRFUlMsXG4gIFBhcmFtZXRlckl0ZW0sXG4gIFBhcmFtZXRlclNjb3BlRmlsdGVyLFxufSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1wYXJhbWV0ZXIubW9kZWwnO1xuaW1wb3J0IHsgQ3FhTGlzdEl0ZW1Db25maWcgfSBmcm9tICcuLi8uLi9pdGVtLWxpc3QvaXRlbS1saXN0Lm1vZGVsJztcblxuY29uc3QgVEFCX1NFR01FTlRTID0gW1xuICB7IGxhYmVsOiAnUGxhaW4gVGV4dCcsIHZhbHVlOiAncGxhaW4tdGV4dCcgfSxcbiAgeyBsYWJlbDogJ1BhcmFtZXRlcicsIHZhbHVlOiAncGFyYW1ldGVyJyB9LFxuICB7IGxhYmVsOiAnRW52aXJvbm1lbnQnLCB2YWx1ZTogJ2Vudmlyb25tZW50JyB9LFxuICB7IGxhYmVsOiAnUnVudGltZScsIHZhbHVlOiAncnVudGltZScgfSxcbl07XG5cbmNvbnN0IFBBUkFNRVRFUl9GSUxURVJfVEFCUzogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogUGFyYW1ldGVyU2NvcGVGaWx0ZXIgfVtdID0gW1xuICB7IGxhYmVsOiAnQWxsJywgdmFsdWU6ICdhbGwnIH0sXG4gIHsgbGFiZWw6ICdHbG9iYWwnLCB2YWx1ZTogJ2dsb2JhbCcgfSxcbiAgeyBsYWJlbDogJ0xvY2FsJywgdmFsdWU6ICdsb2NhbCcgfSxcbl07XG5cbi8qKiBNb2NrIHJ1bnRpbWUgdmFyaWFibGUgc3VnZ2VzdGlvbnMgKHJlcGxhY2Ugd2l0aCBBUEkgd2hlbiBpbnRlZ3JhdGluZykuICovXG5jb25zdCBSVU5USU1FX1NVR0dFU1RFRF9WQUxVRVMgPSBbXG4gICdydW50aW1lLk1heFdhaXRUaW1lJyxcbiAgJ3J1bnRpbWUuc2Vzc2lvbl9pZCcsXG4gICdydW50aW1lLmF1dGhfdG9rZW4nLFxuICAncnVudGltZS5zdGVwX2luZGV4JyxcbiAgJ3J1bnRpbWUudGltZXN0YW1wJyxcbiAgJ3J1bnRpbWUudGVzdF9uYW1lJyxcbl07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZXN0LWRhdGEtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVzdC1kYXRhLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdERhdGFNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQE91dHB1dCgpIGFwcGx5ID0gbmV3IEV2ZW50RW1pdHRlcjx7dmFsdWU6IHN0cmluZywgYWN0aXZlVGFiOiBUZXN0RGF0YU1vZGFsVGFifT4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGVkaXRJbkRlcHRoID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcGFyYW1ldGVyQ3JlYXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcGFyYW1ldGVyRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgZW52aXJvbm1lbnRDcmVhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBlbnZpcm9ubWVudEVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICByZWFkb25seSB0YWJTZWdtZW50cyA9IFRBQl9TRUdNRU5UUztcbiAgcmVhZG9ubHkgcGFyYW1ldGVyRmlsdGVyVGFicyA9IFBBUkFNRVRFUl9GSUxURVJfVEFCUztcbiAgLyoqIFBhcmFtZXRlciBsaXN0IGZyb20gaW5wdXQsIGZhbGxzIGJhY2sgdG8gbW9jayBkYXRhIGlmIG5vdCBwcm92aWRlZC4gKi9cbiAgQElucHV0KCkgcGFyYW1ldGVyczogUGFyYW1ldGVySXRlbVtdID0gTU9DS19QQVJBTUVURVJTO1xuICAvKiogRW52aXJvbm1lbnQgbGlzdCBmcm9tIGlucHV0LCBmYWxscyBiYWNrIHRvIG1vY2sgZGF0YSBpZiBub3QgcHJvdmlkZWQuICovXG4gIEBJbnB1dCgpIGVudmlyb25tZW50SXRlbXM6IEVudmlyb25tZW50SXRlbVtdID0gTU9DS19FTlZJUk9OTUVOVF9JVEVNUztcbiAgLyoqIFJ1bnRpbWUgdGFiOiBzdWdnZXN0ZWQgdmFyaWFibGUgY2hpcHMuICovXG4gIHJlYWRvbmx5IHJ1bnRpbWVTdWdnZXN0ZWRWYWx1ZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gUlVOVElNRV9TVUdHRVNURURfVkFMVUVTO1xuXG4gIC8qKiBGb3JtIGZvciBhbGwgbW9kYWwgY29udHJvbHMgKHNhbWUgcGF0dGVybiBhcyBMb29wIFN0ZXAgZWRpdEZvcm0pLiAqL1xuICBlZGl0Rm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogQ2FjaGVkIHNlbGVjdCBjb25maWdzIChzdGFibGUgcmVmcywgc2FtZSBuYW1pbmcgYXMgTG9vcCBTdGVwOiB4eHhTZWxlY3RDb25maWcpLiAqL1xuICBhY3RpdmVUYWJTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIHBhcmFtZXRlclNjb3BlRmlsdGVyU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuXG4gIC8qKiBMb2NhbCBjb3B5IG9mIGZvcm0gdmFsdWUgZm9yIENhbmNlbCByZXZlcnQgKHNhbWUgcGF0dGVybiBhcyBMb29wIFN0ZXAgZWRpdFNuYXBzaG90KS4gKi9cbiAgcHJpdmF0ZSBlZGl0U25hcHNob3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIC8qKiBQcmVzZXJ2ZSB1c2VyLWVudGVyZWQgcGxhaW4gdGV4dCBpbmRlcGVuZGVudGx5IGZyb20gcGFyYW1ldGVyL2Vudmlyb25tZW50L3J1bnRpbWUgc2VsZWN0aW9ucy4gKi9cbiAgcHJpdmF0ZSBwbGFpblRleHRWYWx1ZSA9ICcnO1xuXG4gIC8qKiBTdGF0ZSBkZXJpdmVkIGZyb20gY29uZmlnL2VkaXRGb3JtIGZvciB0ZW1wbGF0ZSBhbmQgZ2V0dGVycyAobWlycm9ycyBMb29wIFN0ZXAgaW5wdXRzKS4gKi9cbiAgQElucHV0KCkgYWN0aXZlVGFiOiBUZXN0RGF0YU1vZGFsVGFiID0gJ3BsYWluLXRleHQnO1xuICBASW5wdXQoKSB2YWx1ZSA9ICcnO1xuICBASW5wdXQoKSBoZWxwVXJsID0gJyc7XG4gIGhlbHBUb29sdGlwVGV4dCA9ICdOb3Qgc3VyZSB3aGF0IHRvIGRvPyBDbGljayB0byBnbyB0byBvdXIgZGV0YWlsZWQgc3RlcCBjcmVhdGlvbiBkb2N1bWVudGF0aW9uJztcbiAgc2hvd0hlbHBUb29sdGlwID0gZmFsc2U7XG5cbiAgcGFyYW1ldGVyU2NvcGVGaWx0ZXI6IFBhcmFtZXRlclNjb3BlRmlsdGVyID0gJ2FsbCc7XG4gIHBhcmFtZXRlclNlYXJjaFF1ZXJ5ID0gJyc7XG4gIHNlbGVjdGVkUGFyYW1ldGVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGVudmlyb25tZW50U2VhcmNoUXVlcnkgPSAnJztcbiAgc2VsZWN0ZWRFbnZpcm9ubWVudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBydW50aW1lVmFsdWUgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEluamVjdChURVNUX0RBVEFfTU9EQUxfUkVGKSBwcml2YXRlIHJlZjogVGVzdERhdGFNb2RhbFJlZjxUZXN0RGF0YU1vZGFsUmVzdWx0PixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRFU1RfREFUQV9NT0RBTF9EQVRBKSBkYXRhPzogVGVzdERhdGFNb2RhbERhdGFcbiAgKSB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBkYXRhLnZhbHVlID8/ICcnO1xuICAgICAgdGhpcy5oZWxwVXJsID0gZGF0YS5oZWxwVXJsID8/ICcnO1xuICAgICAgdGhpcy5hY3RpdmVUYWIgPSAoZGF0YS5hY3RpdmVUYWIgPz8gJ3BsYWluLXRleHQnKSBhcyBUZXN0RGF0YU1vZGFsVGFiO1xuICAgICAgdGhpcy5wYXJhbWV0ZXJTY29wZUZpbHRlciA9IGRhdGEucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPz8gJ2FsbCc7XG4gICAgICB0aGlzLnBhcmFtZXRlclNlYXJjaFF1ZXJ5ID0gZGF0YS5wYXJhbWV0ZXJTZWFyY2hRdWVyeSA/PyAnJztcbiAgICAgIHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA9IGRhdGEuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA/PyBudWxsO1xuICAgICAgdGhpcy5lbnZpcm9ubWVudFNlYXJjaFF1ZXJ5ID0gZGF0YS5lbnZpcm9ubWVudFNlYXJjaFF1ZXJ5ID8/ICcnO1xuICAgICAgdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgPSBkYXRhLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA/PyBudWxsO1xuICAgICAgdGhpcy5ydW50aW1lVmFsdWUgPSBkYXRhLnJ1bnRpbWVWYWx1ZSA/PyAnJztcbiAgICAgIC8vIFNldCBwYXJhbWV0ZXJzIGFuZCBlbnZpcm9ubWVudEl0ZW1zIGZyb20gZGF0YSBpZiBwcm92aWRlZFxuICAgICAgaWYgKGRhdGEucGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucGFyYW1ldGVycyA9IGRhdGEucGFyYW1ldGVycztcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmVudmlyb25tZW50SXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmVudmlyb25tZW50SXRlbXMgPSBkYXRhLmVudmlyb25tZW50SXRlbXM7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucGxhaW5UZXh0VmFsdWUgPSB0aGlzLmFjdGl2ZVRhYiA9PT0gJ3BsYWluLXRleHQnID8gKHRoaXMudmFsdWUgPz8gJycpIDogJyc7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1aWxkRWRpdEZvcm0oKTtcbiAgICB0aGlzLmJ1aWxkU2VsZWN0Q29uZmlncygpO1xuICAgIHRoaXMuZWRpdFNuYXBzaG90ID0geyAuLi50aGlzLmVkaXRGb3JtLnZhbHVlIH07XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRGb3JtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ2FjdGl2ZVRhYiddKSB7XG4gICAgICB0aGlzLmVkaXRGb3JtLmdldCgnYWN0aXZlVGFiJyk/LnNldFZhbHVlKHRoaXMuYWN0aXZlVGFiID8/ICdwbGFpbi10ZXh0JywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndmFsdWUnXSkge1xuICAgICAgdGhpcy5lZGl0Rm9ybS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHRoaXMudmFsdWUgPz8gJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMucGxhaW5UZXh0VmFsdWUgPSB0aGlzLmFjdGl2ZVRhYiA9PT0gJ3BsYWluLXRleHQnID8gKHRoaXMudmFsdWUgPz8gJycpIDogJyc7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydoZWxwVXJsJ10pIHtcbiAgICAgIHRoaXMuaGVscFVybCA9IHRoaXMuaGVscFVybCA/PyAnJztcbiAgICB9XG5cbiAgICB0aGlzLnN5bmNTdGF0ZUZyb21Gb3JtKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogQnVpbGQgZm9ybSB3aXRoIGFsbCBjb250cm9sIHZhbHVlcyAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBidWlsZEVkaXRGb3JtKS4gKi9cbiAgcHJpdmF0ZSBidWlsZEVkaXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHZhbHVlOiBbdGhpcy52YWx1ZSA/PyAnJ10sXG4gICAgICBhY3RpdmVUYWI6IFt0aGlzLmFjdGl2ZVRhYiA/PyAncGxhaW4tdGV4dCddLFxuICAgICAgcGFyYW1ldGVyU2NvcGVGaWx0ZXI6IFt0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyID8/ICdhbGwnXSxcbiAgICAgIHBhcmFtZXRlclNlYXJjaFF1ZXJ5OiBbdGhpcy5wYXJhbWV0ZXJTZWFyY2hRdWVyeSA/PyAnJ10sXG4gICAgICBzZWxlY3RlZFBhcmFtZXRlcklkOiBbdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID8/IG51bGxdLFxuICAgICAgZW52aXJvbm1lbnRTZWFyY2hRdWVyeTogW3RoaXMuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA/PyAnJ10sXG4gICAgICBzZWxlY3RlZEVudmlyb25tZW50SWQ6IFt0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA/PyBudWxsXSxcbiAgICAgIHJ1bnRpbWVWYWx1ZTogW3RoaXMucnVudGltZVZhbHVlID8/ICcnXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBzZWxlY3QgY29uZmlncyBvbmNlIChzYW1lIHBhdHRlcm4gYXMgTG9vcCBTdGVwIGJ1aWxkU2VsZWN0Q29uZmlncykuICovXG4gIHByaXZhdGUgYnVpbGRTZWxlY3RDb25maWdzKCk6IHZvaWQge1xuICAgIGNvbnN0IHRhYk9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gVEFCX1NFR01FTlRTLm1hcCgocykgPT4gKHtcbiAgICAgIGlkOiBzLnZhbHVlLFxuICAgICAgdmFsdWU6IHMudmFsdWUsXG4gICAgICBuYW1lOiBzLmxhYmVsLFxuICAgICAgbGFiZWw6IHMubGFiZWwsXG4gICAgfSkpO1xuICAgIGNvbnN0IGZpbHRlck9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gUEFSQU1FVEVSX0ZJTFRFUl9UQUJTLm1hcCgocykgPT4gKHtcbiAgICAgIGlkOiBzLnZhbHVlLFxuICAgICAgdmFsdWU6IHMudmFsdWUsXG4gICAgICBuYW1lOiBzLmxhYmVsLFxuICAgICAgbGFiZWw6IHMubGFiZWwsXG4gICAgfSkpO1xuICAgIHRoaXMuYWN0aXZlVGFiU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnYWN0aXZlVGFiJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnVGFiJyxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGFiT3B0aW9ucyxcbiAgICB9O1xuICAgIHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXJTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdwYXJhbWV0ZXJTY29wZUZpbHRlcicsXG4gICAgICBwbGFjZWhvbGRlcjogJ1Njb3BlJyxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogZmlsdGVyT3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFVwZGF0ZSBmb3JtIGNvbnRyb2wgYW5kIHN5bmMgY29tcG9uZW50IHN0YXRlIChzYW1lIHBhdHRlcm4gYXMgTG9vcCBTdGVwIG9uRWRpdEZvcm1GaWVsZENoYW5nZSkuICovXG4gIG9uRWRpdEZvcm1GaWVsZENoYW5nZShjb250cm9sTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KGNvbnRyb2xOYW1lKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgIGlmIChjb250cm9sTmFtZSA9PT0gJ3ZhbHVlJyAmJiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ3BsYWluLXRleHQnKSB7XG4gICAgICB0aGlzLnBsYWluVGV4dFZhbHVlID0gU3RyaW5nKHZhbHVlID8/ICcnKTtcbiAgICB9XG4gICAgdGhpcy5zeW5jU3RhdGVGcm9tRm9ybSgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFN5bmMgY29tcG9uZW50IHN0YXRlIGZyb20gZWRpdEZvcm0gc28gZ2V0dGVycyAoZS5nLiBmaWx0ZXJlZFBhcmFtZXRlcnMpIHN0YXkgY29ycmVjdC4gKi9cbiAgcHJpdmF0ZSBzeW5jU3RhdGVGcm9tRm9ybSgpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5lZGl0Rm9ybS52YWx1ZTtcbiAgICB0aGlzLnZhbHVlID0gdi52YWx1ZSA/PyAnJztcbiAgICB0aGlzLmFjdGl2ZVRhYiA9ICh2LmFjdGl2ZVRhYiA/PyAncGxhaW4tdGV4dCcpIGFzIFRlc3REYXRhTW9kYWxUYWI7XG4gICAgdGhpcy5wYXJhbWV0ZXJTY29wZUZpbHRlciA9ICh2LnBhcmFtZXRlclNjb3BlRmlsdGVyID8/ICdhbGwnKSBhcyBQYXJhbWV0ZXJTY29wZUZpbHRlcjtcbiAgICB0aGlzLnBhcmFtZXRlclNlYXJjaFF1ZXJ5ID0gdi5wYXJhbWV0ZXJTZWFyY2hRdWVyeSA/PyAnJztcbiAgICB0aGlzLnNlbGVjdGVkUGFyYW1ldGVySWQgPSB2LnNlbGVjdGVkUGFyYW1ldGVySWQgPz8gbnVsbDtcbiAgICB0aGlzLmVudmlyb25tZW50U2VhcmNoUXVlcnkgPSB2LmVudmlyb25tZW50U2VhcmNoUXVlcnkgPz8gJyc7XG4gICAgdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgPSB2LnNlbGVjdGVkRW52aXJvbm1lbnRJZCA/PyBudWxsO1xuICAgIHRoaXMucnVudGltZVZhbHVlID0gdi5ydW50aW1lVmFsdWUgPz8gJyc7XG4gIH1cblxuICAvKiogRmlsdGVyZWQgcGFyYW1ldGVycyBieSBzY29wZSBhbmQgc2VhcmNoIChQYXJhbWV0ZXIgdGFiKS4gKi9cbiAgZ2V0IGZpbHRlcmVkUGFyYW1ldGVycygpOiBQYXJhbWV0ZXJJdGVtW10ge1xuICAgIGxldCBsaXN0ID0gdGhpcy5wYXJhbWV0ZXJzO1xuICAgIGlmICh0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyID09PSAnZ2xvYmFsJykge1xuICAgICAgbGlzdCA9IGxpc3QuZmlsdGVyKChwKSA9PiBwLnNjb3BlID09PSAnR2xvYmFsJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyID09PSAnbG9jYWwnKSB7XG4gICAgICBsaXN0ID0gbGlzdC5maWx0ZXIoKHApID0+IHAuc2NvcGUgPT09ICdMb2NhbCcpO1xuICAgIH1cbiAgICBjb25zdCBxID0gdGhpcy5wYXJhbWV0ZXJTZWFyY2hRdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAocSkge1xuICAgICAgbGlzdCA9IGxpc3QuZmlsdGVyKChwKSA9PiBwLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSk7XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgLyoqIEZpbHRlcmVkIGVudmlyb25tZW50IGl0ZW1zIGJ5IHNlYXJjaCAoRW52aXJvbm1lbnQgdGFiKS4gKi9cbiAgZ2V0IGZpbHRlcmVkRW52aXJvbm1lbnRzKCk6IEVudmlyb25tZW50SXRlbVtdIHtcbiAgICBjb25zdCBxID0gdGhpcy5lbnZpcm9ubWVudFNlYXJjaFF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghcSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnRJdGVtcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnRJdGVtcy5maWx0ZXIoXG4gICAgICAoZSkgPT5cbiAgICAgICAgZS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHwgZS52YWx1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBQYXJhbWV0ZXIgdGFiOiBsaXN0IGNvbmZpZyBmb3IgY3FhLWl0ZW0tbGlzdCAoc2VhcmNoLWZyaWVuZGx5OiBiaW5kIGZpbHRlcmVkIGxpc3QpLiAqL1xuICBnZXQgcGFyYW1ldGVyTGlzdENvbmZpZygpOiBDcWFMaXN0SXRlbUNvbmZpZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZFBhcmFtZXRlcnMubWFwKChwKSA9PiAoe1xuICAgICAgaWQ6IHAuaWQsXG4gICAgICB0aXRsZTogcC5uYW1lLFxuICAgICAgc3VidGl0bGU6IHAudmFsdWUsXG4gICAgICBiYWRnZTogcC5zY29wZSxcbiAgICAgIHNob3dFZGl0OiB0aGlzLnNlbGVjdGVkUGFyYW1ldGVySWQgPT09IHAuaWQsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqIEVudmlyb25tZW50IHRhYjogbGlzdCBjb25maWcgZm9yIGNxYS1pdGVtLWxpc3QuICovXG4gIGdldCBlbnZpcm9ubWVudExpc3RDb25maWcoKTogQ3FhTGlzdEl0ZW1Db25maWdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRFbnZpcm9ubWVudHMubWFwKChlKSA9PiAoe1xuICAgICAgaWQ6IGUuaWQsXG4gICAgICB0aXRsZTogZS5uYW1lLFxuICAgICAgc3VidGl0bGU6IGBWYWx1ZTogJHtlLnZhbHVlfWAsXG4gICAgICBiYWRnZTogZS5lbnZpcm9ubWVudCxcbiAgICAgIHNob3dFZGl0OiB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9PT0gZS5pZCAmJiAoZS5lZGl0YWJsZSA/PyB0cnVlKSxcbiAgICB9KSk7XG4gIH1cblxuICBvblRhYkNoYW5nZSh0YWJWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAncGxhaW4tdGV4dCcpIHtcbiAgICAgIHRoaXMucGxhaW5UZXh0VmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgndmFsdWUnKT8udmFsdWUgPz8gJyc7XG4gICAgfVxuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdhY3RpdmVUYWInLCB0YWJWYWx1ZSk7XG4gICAgaWYgKHRhYlZhbHVlID09PSAncGxhaW4tdGV4dCcpIHtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCd2YWx1ZScsIHRoaXMucGxhaW5UZXh0VmFsdWUgPz8gJycpO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFyYW1ldGVyU2NvcGVGaWx0ZXJDaGFuZ2UoZmlsdGVyOiBQYXJhbWV0ZXJTY29wZUZpbHRlcik6IHZvaWQge1xuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdwYXJhbWV0ZXJTY29wZUZpbHRlcicsIGZpbHRlcik7XG4gIH1cblxuICBvblBhcmFtZXRlclNlYXJjaElucHV0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9uRWRpdEZvcm1GaWVsZENoYW5nZSgncGFyYW1ldGVyU2VhcmNoUXVlcnknLCB2YWx1ZSk7XG4gIH1cblxuICBvblBhcmFtZXRlclNlbGVjdChwYXJhbUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbSA9IHRoaXMucGFyYW1ldGVycy5maW5kKChwKSA9PiBwLmlkID09PSBwYXJhbUlkKTtcbiAgICBpZiAocGFyYW0pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA9IHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA9PT0gcGFyYW0uaWQgPyBudWxsIDogcGFyYW0uaWQ7XG4gICAgICB0aGlzLm9uRWRpdEZvcm1GaWVsZENoYW5nZSgnc2VsZWN0ZWRQYXJhbWV0ZXJJZCcsIHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCk7XG4gICAgICB0aGlzLm9uRWRpdEZvcm1GaWVsZENoYW5nZSgndmFsdWUnLCBwYXJhbS5uYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKiogSGFuZGxlIHJvdyBjbGljayAoc2VsZWN0IHBhcmFtZXRlcikuIEVkaXQgYnV0dG9uIHVzZXMgb25QYXJhbWV0ZXJFZGl0Q2xpY2sgdG8gYXZvaWQgdHJpZ2dlcmluZyB0aGlzLiAqL1xuICBvblBhcmFtZXRlclJvd0NsaWNrKGV2ZW50OiBFdmVudCwgaXRlbTogeyBpZDogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldC5jbG9zZXN0KCdidXR0b24sIG1hdC1pY29uLCBbYXJpYS1sYWJlbD1cIkVkaXRcIl0nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9uUGFyYW1ldGVyU2VsZWN0KGl0ZW0uaWQpO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBFZGl0IGJ1dHRvbiBjbGljayAtIHN0b3AgcHJvcGFnYXRpb24gYW5kIGVtaXQgc28gcGFyZW50IGNhbiBuYXZpZ2F0ZS4gKi9cbiAgb25QYXJhbWV0ZXJFZGl0Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIHBhcmFtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5vblBhcmFtZXRlckVkaXQocGFyYW1JZCk7XG4gIH1cblxuICBvblBhcmFtZXRlckVkaXQocGFyYW1JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wYXJhbWV0ZXJFZGl0LmVtaXQocGFyYW1JZCk7XG4gIH1cblxuICBvbkNyZWF0ZU5ld1ZhcmlhYmxlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5wYXJhbWV0ZXJDcmVhdGUuZW1pdCgpO1xuICB9XG5cbiAgb25FbnZpcm9ubWVudFNlYXJjaElucHV0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9uRWRpdEZvcm1GaWVsZENoYW5nZSgnZW52aXJvbm1lbnRTZWFyY2hRdWVyeScsIHZhbHVlKTtcbiAgfVxuXG4gIG9uRW52aXJvbm1lbnRTZWxlY3QoaXRlbUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5lbnZpcm9ubWVudEl0ZW1zLmZpbmQoKGUpID0+IGUuaWQgPT09IGl0ZW1JZCk7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkID1cbiAgICAgICAgdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgPT09IGl0ZW0uaWQgPyBudWxsIDogaXRlbS5pZDtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdzZWxlY3RlZEVudmlyb25tZW50SWQnLCB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCk7XG4gICAgICB0aGlzLm9uRWRpdEZvcm1GaWVsZENoYW5nZSgndmFsdWUnLCBpdGVtLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uRW52aXJvbm1lbnRFZGl0KGl0ZW1JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lbnZpcm9ubWVudEVkaXQuZW1pdChpdGVtSWQpO1xuICB9XG5cbiAgb25DcmVhdGVOZXdFbnZpcm9ubWVudChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZW52aXJvbm1lbnRDcmVhdGUuZW1pdCgpO1xuICB9XG5cbiAgLyoqIFJ1bnRpbWUgdGFiOiByZXBsYWNlIHRoZSBydW50aW1lIGlucHV0IHdpdGggdGhlIHNlbGVjdGVkIHN1Z2dlc3Rpb24uICovXG4gIG9uUnVudGltZUNoaXBJbnNlcnQoc25pcHBldDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3J1bnRpbWVWYWx1ZScsIHNuaXBwZXQpO1xuICB9XG5cbiAgb25BcHBseSgpOiB2b2lkIHtcbiAgICB0aGlzLnN5bmNTdGF0ZUZyb21Gb3JtKCk7XG4gICAgbGV0IHZhbHVlVG9BcHBseSA9IHRoaXMuYWN0aXZlVGFiID09PSAncnVudGltZScgPyB0aGlzLnJ1bnRpbWVWYWx1ZSA6IHRoaXMudmFsdWU7XG5cbiAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdwYXJhbWV0ZXInKSB7XG4gICAgICB2YWx1ZVRvQXBwbHkgPSB0aGlzLnNlbGVjdGVkUGFyYW1ldGVySWQgPyB0aGlzLnBhcmFtZXRlcnMuZmluZCgocCkgPT4gcC5pZCA9PT0gdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkKT8ubmFtZSA/PyAnJyA6ICcnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdlbnZpcm9ubWVudCcpIHtcbiAgICAgIHZhbHVlVG9BcHBseSA9IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkID8gdGhpcy5lbnZpcm9ubWVudEl0ZW1zLmZpbmQoKGUpID0+IGUuaWQgPT09IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkKT8ubmFtZSA/PyAnJyA6ICcnO1xuICAgIH1cblxuICAgIC8vIFdyYXAgdmFsdWVUb0FwcGx5IGJhc2VkIG9uIGFjdGl2ZSB0YWJcbiAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdwYXJhbWV0ZXInICYmIHZhbHVlVG9BcHBseSkge1xuICAgICAgdmFsdWVUb0FwcGx5ID0gYEB8JHt2YWx1ZVRvQXBwbHl9fGA7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ3J1bnRpbWUnICYmIHZhbHVlVG9BcHBseSkge1xuICAgICAgdmFsdWVUb0FwcGx5ID0gYCR8JHt2YWx1ZVRvQXBwbHl9fGA7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ2Vudmlyb25tZW50JyAmJiB2YWx1ZVRvQXBwbHkpIHtcbiAgICAgIHZhbHVlVG9BcHBseSA9IGAqfCR7dmFsdWVUb0FwcGx5fXxgO1xuICAgIH1cbiAgICAvLyBwbGFpbi10ZXh0IHRhYjogbm8gd3JhcHBpbmcsIHVzZSB2YWx1ZSBhcyBpc1xuXG4gICAgLy8gQnVpbGQgcmVzdWx0IHdpdGggb25seSB0aGUgYWN0aXZlIHRhYidzIGRhdGEsIGNsZWFyIG90aGVyIHRhYnMnIGRhdGFcbiAgICBjb25zdCByZXN1bHQ6IFRlc3REYXRhTW9kYWxEYXRhID0ge1xuICAgICAgdmFsdWU6IHZhbHVlVG9BcHBseSxcbiAgICAgIGFjdGl2ZVRhYjogdGhpcy5hY3RpdmVUYWIsXG4gICAgICAvLyBPbmx5IGluY2x1ZGUgcGFyYW1ldGVyIGRhdGEgaWYgcGFyYW1ldGVyIHRhYiBpcyBhY3RpdmVcbiAgICAgIHBhcmFtZXRlclNjb3BlRmlsdGVyOiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ3BhcmFtZXRlcicgPyB0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyIDogdW5kZWZpbmVkLFxuICAgICAgcGFyYW1ldGVyU2VhcmNoUXVlcnk6IHRoaXMuYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJyA/IHRoaXMucGFyYW1ldGVyU2VhcmNoUXVlcnkgOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3RlZFBhcmFtZXRlcklkOiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ3BhcmFtZXRlcicgPyB0aGlzLnNlbGVjdGVkUGFyYW1ldGVySWQgOiB1bmRlZmluZWQsXG4gICAgICAvLyBPbmx5IGluY2x1ZGUgZW52aXJvbm1lbnQgZGF0YSBpZiBlbnZpcm9ubWVudCB0YWIgaXMgYWN0aXZlXG4gICAgICBlbnZpcm9ubWVudFNlYXJjaFF1ZXJ5OiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ2Vudmlyb25tZW50JyA/IHRoaXMuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA6IHVuZGVmaW5lZCxcbiAgICAgIHNlbGVjdGVkRW52aXJvbm1lbnRJZDogdGhpcy5hY3RpdmVUYWIgPT09ICdlbnZpcm9ubWVudCcgPyB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA6IHVuZGVmaW5lZCxcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSBydW50aW1lIGRhdGEgaWYgcnVudGltZSB0YWIgaXMgYWN0aXZlXG4gICAgICBydW50aW1lVmFsdWU6IHRoaXMuYWN0aXZlVGFiID09PSAncnVudGltZScgPyB0aGlzLnJ1bnRpbWVWYWx1ZSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgdGhpcy5hcHBseS5lbWl0KHt2YWx1ZTogdmFsdWVUb0FwcGx5LCBhY3RpdmVUYWI6IHRoaXMuYWN0aXZlVGFiIGFzIFRlc3REYXRhTW9kYWxUYWJ9KTtcbiAgICB0aGlzLnJlZi5jbG9zZShyZXN1bHQpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHRoaXMuZWRpdFNuYXBzaG90KTtcbiAgICB0aGlzLnN5bmNTdGF0ZUZyb21Gb3JtKCk7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMucmVmLmNsb3NlKHVuZGVmaW5lZCk7XG4gIH1cblxuICBvbkNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMub25DYW5jZWwoKTtcbiAgfVxuXG4gIG9uRWRpdEluRGVwdGgoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmVkaXRJbkRlcHRoLmVtaXQoKTtcbiAgICB0aGlzLnJlZi5jbG9zZShURVNUX0RBVEFfTU9EQUxfRURJVF9JTl9ERVBUSCBhcyBhbnkpO1xuICB9XG5cbiAgb25IZWxwKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhlbHBVcmwpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB3aW5kb3cub3Blbih0aGlzLmhlbHBVcmwsICdfYmxhbmsnKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtWzEycHhdIGNxYS1zaGFkb3ctbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS13LVs1MDBweF0gY3FhLW1heC1oLVs3N3ZoXSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC1bMTJweF0gY3FhLXAtMiBjcWEtYm94LWJvcmRlciBjcWEtbWluLWgtMFwiPlxuICA8IS0tIEhlYWRlcjogdGl0bGUgbGVmdDsgTmVlZCBoZWxwPyArIGNsb3NlIGljb24gcmlnaHQgKG5vIG92ZXJmbG93IGhlcmUgc28gdG9vbHRpcCBpcyBub3QgY2xpcHBlZCkgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1zaHJpbmstMCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0yIGNxYS1weC00XCI+XG4gICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzE2cHhdIGNxYS1sZWFkaW5nLVsyNHB4XSBjcWEtZm9udC1ib2xkIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wIGNxYS1mb250LVs2MDBdXCI+XG4gICAgICBUZXN0IERhdGFcbiAgICA8L2gyPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtbWluLWgtWzI4cHhdXCI+XG4gICAgICA8IS0tIE5lZWQgaGVscD8gd2l0aCBjdXN0b20gdG9vbHRpcDogc2hvdyBiZWxvdyB0cmlnZ2VyIHNvIGl0IGlzIG5vdCBjbGlwcGVkIGJ5IG1vZGFsIG92ZXJmbG93LXktYXV0byAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIlxuICAgICAgICAobW91c2VlbnRlcik9XCJzaG93SGVscFRvb2x0aXAgPSB0cnVlXCIgKG1vdXNlbGVhdmUpPVwic2hvd0hlbHBUb29sdGlwID0gZmFsc2VcIj5cbiAgICAgICAgPGEgKm5nSWY9XCJoZWxwVXJsXCIgaHJlZj1cIiNcIiAoY2xpY2spPVwib25IZWxwKCRldmVudClcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjFweF0gY3FhLW5vLXVuZGVybGluZSBob3ZlcjpjcWEtdW5kZXJsaW5lIGNxYS1jdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNyAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjdGVzdC1kYXRhLWhlbHAtY2xpcClcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjUwMDMzIDE0LjY2NjNDMTIuNDEyMyAxNC42NjYzIDE1LjU4MzcgMTEuNjgxNiAxNS41ODM3IDcuOTk5NjdDMTUuNTgzNyA0LjMxNzc4IDEyLjQxMjMgMS4zMzMwMSA4LjUwMDMzIDEuMzMzMDFDNC41ODgzMSAxLjMzMzAxIDEuNDE2OTkgNC4zMTc3OCAxLjQxNjk5IDcuOTk5NjdDMS40MTY5OSAxMS42ODE2IDQuNTg4MzEgMTQuNjY2MyA4LjUwMDMzIDE0LjY2NjNaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuNDM4NDggNi4wMDAzOEM2LjYwNTAxIDUuNTU0ODMgNi45MzM3MSA1LjE3OTEyIDcuMzY2MzYgNC45Mzk4QzcuNzk5MDEgNC43MDA0OSA4LjMwNzY5IDQuNjEzMDEgOC44MDIzMSA0LjY5Mjg1QzkuMjk2OTMgNC43NzI3IDkuNzQ1NTYgNS4wMTQ3MyAxMC4wNjg3IDUuMzc2MDdDMTAuMzkxOSA1LjczNzQgMTAuNTY4OCA2LjE5NDczIDEwLjU2ODEgNi42NjcwNUMxMC41NjgxIDguMDAwMzggOC40NDMwNiA4LjY2NzA1IDguNDQzMDYgOC42NjcwNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjUgMTEuMzMzSDguNTA5NjZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwidGVzdC1kYXRhLWhlbHAtY2xpcFwiPlxuICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiLz5cbiAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICBOZWVkIGhlbHAgP1xuICAgICAgICA8L2E+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWhlbHBVcmxcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLWZvbnQtWzUwMF0gY3FhLXRleHQtWzEwcHhdIGNxYS1jdXJzb3ItZGVmYXVsdFwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNyAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXRleHQtWyMzRjQzRUVdXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI3Rlc3QtZGF0YS1oZWxwLWNsaXAtbm9saW5rKVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNTAwMzMgMTQuNjY2M0MxMi40MTIzIDE0LjY2NjMgMTUuNTgzNyAxMS42ODE2IDE1LjU4MzcgNy45OTk2N0MxNS41ODM3IDQuMzE3NzggMTIuNDEyMyAxLjMzMzAxIDguNTAwMzMgMS4zMzMwMUM0LjU4ODMxIDEuMzMzMDEgMS40MTY5OSA0LjMxNzc4IDEuNDE2OTkgNy45OTk2N0MxLjQxNjk5IDExLjY4MTYgNC41ODgzMSAxNC42NjYzIDguNTAwMzMgMTQuNjY2M1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi40Mzg0OCA2LjAwMDM4QzYuNjA1MDEgNS41NTQ4MyA2LjkzMzcxIDUuMTc5MTIgNy4zNjYzNiA0LjkzOThDNy43OTkwMSA0LjcwMDQ5IDguMzA3NjkgNC42MTMwMSA4LjgwMjMxIDQuNjkyODVDOS4yOTY5MyA0Ljc3MjcgOS43NDU1NiA1LjAxNDczIDEwLjA2ODcgNS4zNzYwN0MxMC4zOTE5IDUuNzM3NCAxMC41Njg4IDYuMTk0NzMgMTAuNTY4MSA2LjY2NzA1QzEwLjU2ODEgOC4wMDAzOCA4LjQ0MzA2IDguNjY3MDUgOC40NDMwNiA4LjY2NzA1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNSAxMS4zMzNIOC41MDk2NlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJ0ZXN0LWRhdGEtaGVscC1jbGlwLW5vbGlua1wiPlxuICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiLz5cbiAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICBOZWVkIGhlbHAgP1xuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwhLS0gVG9vbHRpcCBhYm92ZSB0cmlnZ2VyIChzYW1lIGFzIGVsZW1lbnQtcG9wdXApOyBoZWFkZXIgaGFzIG5vIG92ZXJmbG93IHNvIHRvb2x0aXAgaXMgbm90IGNsaXBwZWQgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93SGVscFRvb2x0aXBcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LVsxMDBdIGNxYS1ib3R0b20tWzEwMCVdIGNxYS1tYi0xIGNxYS10b3AtWzIycHhdXCJcbiAgICAgICAgICByb2xlPVwidG9vbHRpcFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC13aGl0ZSBjcWEtdGV4dC1sZWZ0IGNxYS13LVszMDZweF0gY3FhLW1heC13LVszMDZweF0gY3FhLW1pbi1oLVsyMHB4XSBjcWEtcm91bmRlZC1bNnB4XSBjcWEtcHktMSBjcWEtcHgtMiBjcWEtYmctWyMwQTBBMEFdIGNxYS1sZWFkaW5nLVsyMHB4XSBjcWEtdGV4dC1bOHB4XSBjcWEtYnJlYWstd29yZHNcIj5cbiAgICAgICAgICAgIHt7IGhlbHBUb29sdGlwVGV4dCB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgYnRuU2l6ZT1cIm1kXCJcbiAgICAgICAgW3RleHRdPVwiJydcIlxuICAgICAgICBpY29uPVwiY2xvc2VcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvbkNsb3NlKClcIlxuICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1taW4taC1bMjhweF0gY3FhLW1pbi13LVsyOHB4XSBjcWEtcC0wIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtYmctWyNGM0Y0RjZdJ1wiXG4gICAgICAgIHRpdGxlPVwiQ2xvc2VcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMaW5lIGJlbG93IGhlYWRlciAoZnVsbCB3aWR0aCBvZiBtb2RhbCwgbm8gc2lkZSBtYXJnaW4pIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLS1teC0yIGNxYS13LVtjYWxjKDEwMCUrMXJlbSldIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1oLXB4IGNxYS13LWZ1bGwgY3FhLWJnLVsjRTVFN0VCXVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBUYWJzOiBQbGFpbiBUZXh0LCBQYXJhbWV0ZXIsIEVudmlyb25tZW50LCBSdW50aW1lIChmdWxsLXdpZHRoLCBjcWEtYnV0dG9uKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1pbi13LTAgY3FhLXRlc3QtZGF0YS1tb2RhbC10YWJzIGNxYS1mbGV4IGNxYS1mbGV4LXJvdyBjcWEtcC1bMy41cHhdIGNxYS1oLVszMS41cHhdIGNxYS1yb3VuZGVkLVs4cHhdIGNxYS1iZy1bI0YzRjRGNl0gY3FhLWdhcC0wXCIgcm9sZT1cInRhYmxpc3RcIj5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzZWdtZW50IG9mIHRhYlNlZ21lbnRzXCIgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wIGNxYS1mbGV4XCI+XG4gICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW2F0dHIucm9sZV09XCIndGFiJ1wiXG4gICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiKGVkaXRGb3JtLmdldCgnYWN0aXZlVGFiJyk/LnZhbHVlID8/IGFjdGl2ZVRhYikgPT09IHNlZ21lbnQudmFsdWVcIlxuICAgICAgICBbdGV4dF09XCJzZWdtZW50LmxhYmVsXCJcbiAgICAgICAgW3ZhcmlhbnRdPVwiKGVkaXRGb3JtLmdldCgnYWN0aXZlVGFiJyk/LnZhbHVlID8/IGFjdGl2ZVRhYikgPT09IHNlZ21lbnQudmFsdWUgPyAnZmlsbGVkJyA6ICd0ZXh0J1wiXG4gICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIChjbGlja2VkKT1cIm9uVGFiQ2hhbmdlKHNlZ21lbnQudmFsdWUpXCJcbiAgICAgICAgW2N1c3RvbUNsYXNzXT1cIihlZGl0Rm9ybS5nZXQoJ2FjdGl2ZVRhYicpPy52YWx1ZSA/PyBhY3RpdmVUYWIpID09PSBzZWdtZW50LnZhbHVlID8gJ2NxYS1oLVsyNXB4XSBjcWEtcm91bmRlZC1bOHB4XSBjcWEtdGV4dC1bMTJweF0gY3FhLWJnLVsjM0Y0M0VFXSBjcWEtdGV4dC13aGl0ZSBjcWEtZm9udC1tZWRpdW0nIDogJ2NxYS1oLVsyNXB4XSBjcWEtcm91bmRlZC1bOHB4XSBjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyM2QjcyODBdIGhvdmVyOmNxYS10ZXh0LVsjMTExODI3XSdcIj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBDb250ZW50IHBlciB0YWI6IG9ubHkgdGhpcyBzZWN0aW9uIHNjcm9sbHMgKG92ZXJmbG93IGhlcmUsIG5vdCBvbiByb290KSwgc28gaGVhZGVyIHRvb2x0aXAgaXMgbmV2ZXIgY2xpcHBlZCAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLWgtMCBjcWEtb3ZlcmZsb3cteS1hdXRvXCJcbiAgICBbY2xhc3MuY3FhLWZsZXgtMV09XCJhY3RpdmVUYWIgPT09ICdwYXJhbWV0ZXInIHx8IGFjdGl2ZVRhYiA9PT0gJ2Vudmlyb25tZW50JyB8fCBhY3RpdmVUYWIgPT09ICdydW50aW1lJ1wiPlxuICAgIDwhLS0gUGxhaW4gVGV4dCB0YWIgKGZvcm0tYm91bmQgbGlrZSBMb29wIFN0ZXAgZWRpdEZvcm0gKyBvbkVkaXRGb3JtRmllbGRDaGFuZ2UpIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdwbGFpbi10ZXh0J1wiPlxuICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgbGFiZWw9XCJWYWx1ZVwiXG4gICAgICAgIFt2YWx1ZV09XCJlZGl0Rm9ybS5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRWRpdEZvcm1GaWVsZENoYW5nZSgndmFsdWUnLCAkZXZlbnQpXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJodHRwczovL2V4YW1wbGUuY29tL2Rhc2hib2FyZFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIHNpemU9XCJtZFwiPlxuICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtbS0wXCI+XG4gICAgICAgIEVudGVyIGEgc3RhdGljIHRleHQgdmFsdWUgdGhhdCB3b24ndCBjaGFuZ2UgZHVyaW5nIGV4ZWN1dGlvbi5cbiAgICAgIDwvcD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gUGFyYW1ldGVyIHRhYjogVmFyaWFibGUgTGlicmFyeSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLW1pbi1oLTAgY3FhLWZsZXgtMSBjcWEtbWluLWgtWzE4cmVtXVwiPlxuICAgICAgICA8IS0tIFZhcmlhYmxlIExpYnJhcnkgaGVhZGVyIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyMHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMFwiPlxuICAgICAgICAgICAgUGFyYW1ldGVyc1xuICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwib25DcmVhdGVOZXdWYXJpYWJsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1uby11bmRlcmxpbmUgaG92ZXI6Y3FhLW9wYWNpdHktOTAgY3FhLWN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICBDcmVhdGUgTmV3ICtcbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFNlYXJjaDogYm91bmQgdG8gZWRpdEZvcm0gKHNhbWUgcGF0dGVybiBhcyBMb29wIFN0ZXAgY29udHJvbCBiaW5kaW5nKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgPGNxYS1zZWFyY2gtYmFyXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlYXJjaCBsaWJyYXJ5J1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZWRpdEZvcm0uZ2V0KCdwYXJhbWV0ZXJTZWFyY2hRdWVyeScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiJ1NlYXJjaCBsaWJyYXJ5J1wiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25QYXJhbWV0ZXJTZWFyY2hJbnB1dCgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtc2VhcmNoLWJhcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gUGFyYW1ldGVyIGxpc3QgKHNjcm9sbGFibGUsIHNlYXJjaC1pbnRlZ3JhdGVkIHZpYSBmaWx0ZXJlZCBsaXN0IGJpbmRpbmcpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1pbi1oLVsyMDBweF0gY3FhLWZsZXgtMSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xIGNxYS1taW4taC0wIGNxYS1vdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwYXJhbWV0ZXJMaXN0Q29uZmlnXCJcbiAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblBhcmFtZXRlclJvd0NsaWNrKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25QYXJhbWV0ZXJSb3dDbGljaygkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIm9uUGFyYW1ldGVyUm93Q2xpY2soJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWJnLVsjRDhEOUZDXV09XCJzZWxlY3RlZFBhcmFtZXRlcklkID09PSBpdGVtLmlkXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyXT1cInNlbGVjdGVkUGFyYW1ldGVySWQgPT09IGl0ZW0uaWRcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXItc29saWRdPVwic2VsZWN0ZWRQYXJhbWV0ZXJJZCA9PT0gaXRlbS5pZFwiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWJvcmRlci1bIzNGNDNFRV1dPVwic2VsZWN0ZWRQYXJhbWV0ZXJJZCA9PT0gaXRlbS5pZFwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLXRleHQtbGVmdCBjcWEtcm91bmRlZC1sZyBjcWEtcC0xIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBjcWEtYmctd2hpdGUgaG92ZXI6Y3FhLWJnLVsjRjlGQUZCXSBmb2N1czpjcWEtb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctMiBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLVsjRDhEOUZDXSBjcWEtY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RhcnQgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTAgY3FhLXRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiaXRlbS5zdWJ0aXRsZVwiIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW0tMCBjcWEtbXQtMC41IGNxYS10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAge3sgaXRlbS5zdWJ0aXRsZSB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWVuZCBjcWEtZ2FwLTEgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0uYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtcHgtMiBjcWEtcm91bmRlZC1bOHB4XSBjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtYmctWyNlZmY2ZmZdIGNxYS10ZXh0LVsjMTQ0N0U2XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI2M4ZTBmZl1cIj5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uYmFkZ2UgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnNob3dFZGl0XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtMSBjcWEtbWluLXctMCBjcWEtdGV4dC1bIzE0NDdFNl0gaG92ZXI6Y3FhLWJnLVsjRTVFN0VCXSBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1yb3VuZGVkLVs2cHhdIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25QYXJhbWV0ZXJFZGl0Q2xpY2soJGV2ZW50LCBpdGVtLmlkKVwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIkVkaXRcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXRcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIiFjcWEtdy00ICFjcWEtaC00ICFjcWEtdGV4dC1bMTZweF1cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25QYXJhbWV0ZXJFZGl0Q2xpY2soJGV2ZW50LCBpdGVtLmlkKVwiPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwICpuZ0lmPVwicGFyYW1ldGVyTGlzdENvbmZpZy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tLTAgY3FhLXB5LTQgY3FhLXRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICBObyBwYXJhbWV0ZXJzIG1hdGNoIHlvdXIgc2VhcmNoLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRW52aXJvbm1lbnQgdGFiOiBWYXJpYWJsZSBsaWJyYXJ5IGJ5IGVudmlyb25tZW50IC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdlbnZpcm9ubWVudCdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1taW4taC0wIGNxYS1mbGV4LTEgY3FhLW1pbi1oLVsxOHJlbV1cIj5cbiAgICAgICAgPCEtLSBTZWN0aW9uIGhlYWRlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTBcIj5cbiAgICAgICAgICAgIEVudmlyb25tZW50XG4gICAgICAgICAgPC9oMz5cbiAgICAgICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvbkNyZWF0ZU5ld0Vudmlyb25tZW50KCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLW5vLXVuZGVybGluZSBob3ZlcjpjcWEtb3BhY2l0eS05MCBjcWEtY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgIENyZWF0ZSBOZXcgK1xuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gU2VhcmNoOiBib3VuZCB0byBlZGl0Rm9ybSAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBjb250cm9sIGJpbmRpbmcpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8Y3FhLXNlYXJjaC1iYXJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VhcmNoIEVudmlyb25tZW50J1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZWRpdEZvcm0uZ2V0KCdlbnZpcm9ubWVudFNlYXJjaFF1ZXJ5Jyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgW2FyaWFMYWJlbF09XCInU2VhcmNoIEVudmlyb25tZW50J1wiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25FbnZpcm9ubWVudFNlYXJjaElucHV0KCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS1zZWFyY2gtYmFyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBFbnZpcm9ubWVudCBsaXN0IChzY3JvbGxhYmxlLCBzZWFyY2gtaW50ZWdyYXRlZCB2aWEgZmlsdGVyZWQgbGlzdCBiaW5kaW5nKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4taC1bMjIwcHhdIGNxYS1mbGV4LTEgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMSBjcWEtbWluLWgtMCBjcWEtb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZW52aXJvbm1lbnRMaXN0Q29uZmlnXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRW52aXJvbm1lbnRTZWxlY3QoaXRlbS5pZClcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS1iZy1bI0Q4RDlGQ11dPVwic2VsZWN0ZWRFbnZpcm9ubWVudElkID09PSBpdGVtLmlkXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyXT1cInNlbGVjdGVkRW52aXJvbm1lbnRJZCA9PT0gaXRlbS5pZFwiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWJvcmRlci1zb2xpZF09XCJzZWxlY3RlZEVudmlyb25tZW50SWQgPT09IGl0ZW0uaWRcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXItWyMzRjQzRUVdXT1cInNlbGVjdGVkRW52aXJvbm1lbnRJZCA9PT0gaXRlbS5pZFwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLXRleHQtbGVmdCBjcWEtcm91bmRlZC1sZyBjcWEtcC0xIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBjcWEtYmctd2hpdGUgaG92ZXI6Y3FhLWJnLVsjRjlGQUZCXSBmb2N1czpjcWEtb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctMiBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLVsjRDhEOUZDXVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1zdGFydCBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyMHB4XSBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMCBjcWEtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0udGl0bGUgfX1cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJpdGVtLnN1YnRpdGxlXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbS0wIGNxYS1tdC0wLjUgY3FhLXRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLnN1YnRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtZW5kIGNxYS1nYXAtMSBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbS5iYWRnZVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1weC0yIGNxYS1yb3VuZGVkLVs4cHhdIGNxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1iZy1bI2VmZjZmZl0gY3FhLXRleHQtWyMxNDQ3RTZdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjYzhlMGZmXVwiPlxuICAgICAgICAgICAgICAgICAge3sgaXRlbS5iYWRnZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8cCAqbmdJZj1cImVudmlyb25tZW50TGlzdENvbmZpZy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tLTAgY3FhLXB5LTQgY3FhLXRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICBObyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbWF0Y2ggeW91ciBzZWFyY2guXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBSdW50aW1lIHRhYjogZHluYW1pYyB2YWx1ZSBpbmplY3RvciAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlVGFiID09PSAncnVudGltZSdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1taW4taC0wIGNxYS1oLWZ1bGwgY3FhLW92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIwcHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgUnVudGltZVxuICAgICAgICA8L2gzPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgW3ZhbHVlXT1cImVkaXRGb3JtLmdldCgncnVudGltZVZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3J1bnRpbWVWYWx1ZScsICRldmVudClcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJpbnB1dCB0ZXh0XCJcbiAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICBzaXplPVwibWRcIj5cbiAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbXQtMS41IGNxYS1tYi0wXCI+XG4gICAgICAgICAgICBWYWx1ZXMgcmVzb2x2ZWQgZHVyaW5nIHRlc3QgZXhlY3V0aW9uIGJhc2VkIG9uIHNlc3Npb24gYW5kIHN0ZXAgc3RhdGUuXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBSZWNvbW1lbmRlZDogc3VnZ2VzdGlvbiBjaGlwcyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LTQgIWNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XSBjcWEtdGV4dC1bIzlDQTNBRl1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5zY2hlZHVsZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXVwiPlJlY29tbWVuZGVkPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGVzdC1kYXRhLXJ1bnRpbWUtY2hpcHMtc2Nyb2xsIGNxYS1mbGV4IGNxYS1nYXAtMiBjcWEtb3ZlcmZsb3cteC1hdXRvIGNxYS1taW4tdy0wIGNxYS1wYi0xXCI+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc25pcHBldCBvZiBydW50aW1lU3VnZ2VzdGVkVmFsdWVzXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgICAgICAgIFt0ZXh0XT1cInNuaXBwZXRcIlxuICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJvblJ1bnRpbWVDaGlwSW5zZXJ0KHNuaXBwZXQpXCJcbiAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC1zaHJpbmstMCBjcWEtcHgtMiBjcWEtcHktMSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLWJnLVsjRkZGRkZGXSBjcWEtYm9yZGVyLVsjRTVFN0VCXSBjcWEtcm91bmRlZC1bOHB4XSBjcWEtd2hpdGVzcGFjZS1ub3dyYXAnXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDwhLS0gTGluZSBiZWxvdyBjb250ZW50IChmdWxsIHdpZHRoIG9mIG1vZGFsLCBubyBzaWRlIG1hcmdpbikgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtLW14LTIgY3FhLXctW2NhbGMoMTAwJSsxcmVtKV0gY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWgtcHggY3FhLXctZnVsbCBjcWEtYmctWyNFNUU3RUJdXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEZvb3RlcjogQ2FuY2VsLCBBcHBseSAoZnVsbCB3aWR0aCBpbiBvbmUgcm93KSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0cmV0Y2ggY3FhLWdhcC0yIGNxYS13LWZ1bGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cIidDYW5jZWwnXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiXG4gICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTJweF0gY3FhLXB5LVs5cHhdIGNxYS1ib3JkZXItWyM0MTQxNDZdJ1wiPjwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cIidBcHBseSdcIiBbZnVsbFdpZHRoXT1cInRydWVcIiAoY2xpY2tlZCk9XCJvbkFwcGx5KClcIlxuICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzEycHhdIGNxYS1weS1bOXB4XSBjcWEtYm9yZGVyLVsjM0Y0M0VFXSdcIj48L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8YSByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCIgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKCRldmVudClcIlxuICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtbm8tdW5kZXJsaW5lIGhvdmVyOmNxYS1uby11bmRlcmxpbmUgY3FhLXNlbGYtY2VudGVyIGNxYS1jdXJzb3ItcG9pbnRlclwiPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LTQgIWNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XVwiPm9wZW5faW5fbmV3PC9tYXQtaWNvbj5cbiAgICAgIEVkaXQgaW4gZGVwdGggKG9wZW4gZGV0YWlsZWQgcmlnaHQgcGFuZWwpXG4gICAgPC9hPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|