@cqa-lib/cqa-ui 1.1.186 → 1.1.188
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/esm2020/lib/step-builder/step-builder-api/step-builder-api.component.mjs +132 -7
- package/esm2020/lib/step-builder/step-builder-database/step-builder-database.component.mjs +4 -5
- package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +1 -1
- package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +1 -1
- package/esm2020/lib/test-case-details/normal-step/normal-step.component.mjs +25 -8
- package/esm2020/lib/test-case-details/step-group/step-group.component.mjs +1 -1
- package/esm2020/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.mjs +15 -3
- package/esm2020/lib/test-case-details/test-case-step.models.mjs +1 -1
- 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 +51 -17
- package/fesm2015/cqa-lib-cqa-ui.mjs +221 -33
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +219 -33
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/step-builder/step-builder-api/step-builder-api.component.d.ts +6 -0
- package/lib/test-case-details/normal-step/normal-step.component.d.ts +7 -2
- package/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.d.ts +7 -1
- package/lib/test-case-details/test-case-step.models.d.ts +1 -0
- package/lib/test-case-details/test-data-modal/test-data-modal-data.d.ts +6 -1
- package/lib/test-case-details/test-data-modal/test-data-modal.component.d.ts +11 -7
- package/package.json +1 -1
- package/styles.css +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Optional, Output, } from '@angular/core';
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Optional, Output, } from '@angular/core';
|
|
2
2
|
import { TEST_DATA_MODAL_DATA, TEST_DATA_MODAL_EDIT_IN_DEPTH, } from './test-data-modal-data';
|
|
3
3
|
import { TEST_DATA_MODAL_REF } from './test-data-modal-ref';
|
|
4
4
|
import { MOCK_ENVIRONMENT_ITEMS, } from './test-data-modal-environment.model';
|
|
@@ -25,12 +25,12 @@ const PARAMETER_FILTER_TABS = [
|
|
|
25
25
|
];
|
|
26
26
|
/** Mock runtime variable suggestions (replace with API when integrating). */
|
|
27
27
|
const RUNTIME_SUGGESTED_VALUES = [
|
|
28
|
-
'
|
|
29
|
-
'
|
|
30
|
-
'
|
|
31
|
-
'
|
|
32
|
-
'
|
|
33
|
-
'
|
|
28
|
+
'runtime.MaxWaitTime',
|
|
29
|
+
'runtime.session_id',
|
|
30
|
+
'runtime.auth_token',
|
|
31
|
+
'runtime.step_index',
|
|
32
|
+
'runtime.timestamp',
|
|
33
|
+
'runtime.test_name',
|
|
34
34
|
];
|
|
35
35
|
export class TestDataModalComponent {
|
|
36
36
|
constructor(fb, cdr, ref, data) {
|
|
@@ -40,11 +40,15 @@ export class TestDataModalComponent {
|
|
|
40
40
|
this.apply = new EventEmitter();
|
|
41
41
|
this.cancel = new EventEmitter();
|
|
42
42
|
this.editInDepth = new EventEmitter();
|
|
43
|
+
this.parameterCreate = new EventEmitter();
|
|
44
|
+
this.parameterEdit = new EventEmitter();
|
|
45
|
+
this.environmentCreate = new EventEmitter();
|
|
46
|
+
this.environmentEdit = new EventEmitter();
|
|
43
47
|
this.tabSegments = TAB_SEGMENTS;
|
|
44
48
|
this.parameterFilterTabs = PARAMETER_FILTER_TABS;
|
|
45
|
-
/**
|
|
49
|
+
/** Parameter list from input, falls back to mock data if not provided. */
|
|
46
50
|
this.parameters = MOCK_PARAMETERS;
|
|
47
|
-
/**
|
|
51
|
+
/** Environment list from input, falls back to mock data if not provided. */
|
|
48
52
|
this.environmentItems = MOCK_ENVIRONMENT_ITEMS;
|
|
49
53
|
/** Runtime tab: suggested variable chips. */
|
|
50
54
|
this.runtimeSuggestedValues = RUNTIME_SUGGESTED_VALUES;
|
|
@@ -72,6 +76,13 @@ export class TestDataModalComponent {
|
|
|
72
76
|
this.environmentSearchQuery = data.environmentSearchQuery ?? '';
|
|
73
77
|
this.selectedEnvironmentId = data.selectedEnvironmentId ?? null;
|
|
74
78
|
this.runtimeValue = data.runtimeValue ?? '';
|
|
79
|
+
// Set parameters and environmentItems from data if provided
|
|
80
|
+
if (data.parameters !== undefined) {
|
|
81
|
+
this.parameters = data.parameters;
|
|
82
|
+
}
|
|
83
|
+
if (data.environmentItems !== undefined) {
|
|
84
|
+
this.environmentItems = data.environmentItems;
|
|
85
|
+
}
|
|
75
86
|
}
|
|
76
87
|
}
|
|
77
88
|
ngOnInit() {
|
|
@@ -198,12 +209,12 @@ export class TestDataModalComponent {
|
|
|
198
209
|
this.onEditFormFieldChange('value', param.name);
|
|
199
210
|
}
|
|
200
211
|
}
|
|
201
|
-
onParameterEdit(
|
|
202
|
-
|
|
212
|
+
onParameterEdit(paramId) {
|
|
213
|
+
this.parameterEdit.emit(paramId);
|
|
203
214
|
}
|
|
204
215
|
onCreateNewVariable(event) {
|
|
205
216
|
event.preventDefault();
|
|
206
|
-
|
|
217
|
+
this.parameterCreate.emit();
|
|
207
218
|
}
|
|
208
219
|
onEnvironmentSearchInput(value) {
|
|
209
220
|
this.onEditFormFieldChange('environmentSearchQuery', value);
|
|
@@ -217,12 +228,12 @@ export class TestDataModalComponent {
|
|
|
217
228
|
this.onEditFormFieldChange('value', item.name);
|
|
218
229
|
}
|
|
219
230
|
}
|
|
220
|
-
onEnvironmentEdit(
|
|
221
|
-
|
|
231
|
+
onEnvironmentEdit(itemId) {
|
|
232
|
+
this.environmentEdit.emit(itemId);
|
|
222
233
|
}
|
|
223
234
|
onCreateNewEnvironment(event) {
|
|
224
235
|
event.preventDefault();
|
|
225
|
-
|
|
236
|
+
this.environmentCreate.emit();
|
|
226
237
|
}
|
|
227
238
|
/** Runtime tab: insert suggested value into the runtime input field. */
|
|
228
239
|
onRuntimeChipInsert(snippet) {
|
|
@@ -240,6 +251,17 @@ export class TestDataModalComponent {
|
|
|
240
251
|
else if (this.activeTab === 'environment') {
|
|
241
252
|
valueToApply = this.selectedEnvironmentId ? this.environmentItems.find((e) => e.id === this.selectedEnvironmentId)?.name ?? '' : '';
|
|
242
253
|
}
|
|
254
|
+
// Wrap valueToApply based on active tab
|
|
255
|
+
if (this.activeTab === 'parameter' && valueToApply) {
|
|
256
|
+
valueToApply = `@|${valueToApply}|`;
|
|
257
|
+
}
|
|
258
|
+
else if (this.activeTab === 'runtime' && valueToApply) {
|
|
259
|
+
valueToApply = `$|${valueToApply}|`;
|
|
260
|
+
}
|
|
261
|
+
else if (this.activeTab === 'environment' && valueToApply) {
|
|
262
|
+
valueToApply = `*|${valueToApply}|`;
|
|
263
|
+
}
|
|
264
|
+
// plain-text tab: no wrapping, use value as is
|
|
243
265
|
// Build result with only the active tab's data, clear other tabs' data
|
|
244
266
|
const result = {
|
|
245
267
|
value: valueToApply,
|
|
@@ -279,7 +301,7 @@ export class TestDataModalComponent {
|
|
|
279
301
|
}
|
|
280
302
|
}
|
|
281
303
|
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 });
|
|
282
|
-
TestDataModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestDataModalComponent, selector: "cqa-test-data-modal", outputs: { apply: "apply", cancel: "cancel", editInDepth: "editInDepth" }, host: { classAttribute: "cqa-ui-root" }, 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-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 -->\n <div class=\"cqa-flex 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 (works inside overlay) -->\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 <!-- Custom tooltip (exact spec: 306\u00D720 content, 6px radius, #0A0A0A, no arrow) -->\n <div *ngIf=\"showHelpTooltip\"\n class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-top-[-24px] cqa-left-[-125px]\"\n role=\"tooltip\">\n <div\n class=\"cqa-text-white cqa-text-center cqa-whitespace-nowrap cqa-w-[306px] cqa-min-h-[20px] cqa-rounded-[6px] cqa-py-1 cqa-px-2 cqa-bg-[#0A0A0A] cqa-leading-[20px] cqa-text-[8px]\">\n {{ helpTooltipText }}\n </div>\n </div>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px] !cqa-block !cqa-leading-none\">close</mat-icon>\n </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 (bound to editForm like Loop Step) -->\n <div class=\"cqa-w-full cqa-test-data-modal-tabs\">\n <cqa-segment-control\n [segments]=\"tabSegments\"\n [value]=\"editForm.get('activeTab')?.value ?? activeTab\"\n (valueChange)=\"onTabChange($event)\">\n </cqa-segment-control>\n </div>\n\n <!-- Content per tab: flex-1 min-h-0 so Parameter/Environment/Runtime content can scroll -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-h-0\"\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 Variable Library\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 <!-- Filter tabs: All, Global, Local (blue underline under active label only) -->\n <div class=\"cqa-flex cqa-w-full cqa-flex-shrink-0\">\n <button *ngFor=\"let tab of parameterFilterTabs\" type=\"button\"\n (click)=\"onParameterScopeFilterChange(tab.value)\"\n class=\"cqa-flex-1 cqa-py-0 cqa-px-3 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-cursor-pointer cqa-transition-colors cqa-flex cqa-justify-center cqa-items-center\"\n [class.cqa-text-[#6B7280]]=\"parameterScopeFilter !== tab.value\">\n <span class=\"cqa-test-data-param-filter-label cqa-inline-block cqa-pb-0.5\"\n [class.cqa-test-data-param-filter-active]=\"parameterScopeFilter === tab.value\">\n {{ tab.label }}\n </span>\n </button>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0 cqa-relative cqa-flex cqa-items-center\">\n <span class=\"cqa-absolute cqa-left-4 cqa-top-0 cqa-bottom-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none cqa-text-[#6B7280] cqa-leading-none\" aria-hidden=\"true\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">search</mat-icon>\n </span>\n <input\n type=\"text\"\n [value]=\"editForm.get('parameterSearchQuery')?.value ?? ''\"\n (input)=\"onParameterSearchInput($any($event.target).value)\"\n placeholder=\"Search library\"\n class=\"cqa-test-data-search-input cqa-w-full cqa-pl-10 cqa-pr-4 cqa-py-2.5 cqa-text-sm cqa-leading-5 cqa-text-[#0A0A0A] placeholder:cqa-text-[#9CA3AF] focus:cqa-outline-none focus:cqa-border-[#3B82F6] focus:cqa-ring-1 focus:cqa-ring-[#3B82F6]\"\n aria-label=\"Search library\"\n />\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\">\n <cqa-item-list\n [items]=\"parameterListConfig\"\n [selectedId]=\"selectedParameterId\"\n emptyMessage=\"No parameters match your search.\"\n [scrollable]=\"true\"\n (itemSelect)=\"onParameterSelect($event)\"\n (itemEdit)=\"onParameterEdit($event)\">\n </cqa-item-list>\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 cqa-relative cqa-flex cqa-items-center\">\n <span class=\"cqa-absolute cqa-left-4 cqa-top-0 cqa-bottom-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none cqa-text-[#6B7280] cqa-leading-none\" aria-hidden=\"true\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">search</mat-icon>\n </span>\n <input\n type=\"text\"\n [value]=\"editForm.get('environmentSearchQuery')?.value ?? ''\"\n (input)=\"onEnvironmentSearchInput($any($event.target).value)\"\n placeholder=\"Search Environment\"\n class=\"cqa-test-data-search-input cqa-w-full cqa-pl-10 cqa-pr-4 cqa-py-2.5 cqa-text-sm cqa-leading-5 cqa-text-[#0A0A0A] placeholder:cqa-text-[#9CA3AF] focus:cqa-outline-none focus:cqa-border-[#3B82F6] focus:cqa-ring-1 focus:cqa-ring-[#3B82F6]\"\n aria-label=\"Search Environment\"\n />\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\">\n <cqa-item-list\n [items]=\"environmentListConfig\"\n [selectedId]=\"selectedEnvironmentId\"\n emptyMessage=\"No environment variables match your search.\"\n [scrollable]=\"true\"\n (itemSelect)=\"onEnvironmentSelect($event)\"\n (itemEdit)=\"onEnvironmentEdit($event)\">\n </cqa-item-list>\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-[#374151]\">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 <button\n *ngFor=\"let snippet of runtimeSuggestedValues\"\n type=\"button\"\n (click)=\"onRuntimeChipInsert(snippet)\"\n class=\"cqa-flex-shrink-0 cqa-px-3 cqa-py-1.5 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#374151] cqa-bg-[#F3F4F6] cqa-rounded-full hover:cqa-bg-[#E5E7EB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] cqa-transition-colors cqa-whitespace-nowrap\">\n {{ snippet }}\n </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 href=\"#\" (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\">\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.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor"], outputs: ["valueChange"] }, { type: i4.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i5.ItemListComponent, selector: "cqa-item-list", inputs: ["items", "selectedId", "emptyMessage", "scrollable"], outputs: ["itemSelect", "itemEdit"] }, { type: i6.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
304
|
+
TestDataModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestDataModalComponent, selector: "cqa-test-data-modal", inputs: { parameters: "parameters", environmentItems: "environmentItems" }, outputs: { apply: "apply", cancel: "cancel", editInDepth: "editInDepth", parameterCreate: "parameterCreate", parameterEdit: "parameterEdit", environmentCreate: "environmentCreate", environmentEdit: "environmentEdit" }, host: { classAttribute: "cqa-ui-root" }, 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-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 -->\n <div class=\"cqa-flex 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 (works inside overlay) -->\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 <!-- Custom tooltip (exact spec: 306\u00D720 content, 6px radius, #0A0A0A, no arrow) -->\n <div *ngIf=\"showHelpTooltip\"\n class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-top-[-24px] cqa-left-[-125px]\"\n role=\"tooltip\">\n <div\n class=\"cqa-text-white cqa-text-center cqa-whitespace-nowrap cqa-w-[306px] cqa-min-h-[20px] cqa-rounded-[6px] cqa-py-1 cqa-px-2 cqa-bg-[#0A0A0A] cqa-leading-[20px] cqa-text-[8px]\">\n {{ helpTooltipText }}\n </div>\n </div>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px] !cqa-block !cqa-leading-none\">close</mat-icon>\n </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 (bound to editForm like Loop Step) -->\n <div class=\"cqa-w-full cqa-test-data-modal-tabs\">\n <cqa-segment-control\n [segments]=\"tabSegments\"\n [value]=\"editForm.get('activeTab')?.value ?? activeTab\"\n (valueChange)=\"onTabChange($event)\">\n </cqa-segment-control>\n </div>\n\n <!-- Content per tab: flex-1 min-h-0 so Parameter/Environment/Runtime content can scroll -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-h-0\"\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 Variable Library\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 <!-- Filter tabs: All, Global, Local (blue underline under active label only) -->\n <div class=\"cqa-flex cqa-w-full cqa-flex-shrink-0\">\n <button *ngFor=\"let tab of parameterFilterTabs\" type=\"button\"\n (click)=\"onParameterScopeFilterChange(tab.value)\"\n class=\"cqa-flex-1 cqa-py-0 cqa-px-3 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-cursor-pointer cqa-transition-colors cqa-flex cqa-justify-center cqa-items-center\"\n [class.cqa-text-[#6B7280]]=\"parameterScopeFilter !== tab.value\">\n <span class=\"cqa-test-data-param-filter-label cqa-inline-block cqa-pb-0.5\"\n [class.cqa-test-data-param-filter-active]=\"parameterScopeFilter === tab.value\">\n {{ tab.label }}\n </span>\n </button>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0 cqa-relative cqa-flex cqa-items-center\">\n <span class=\"cqa-absolute cqa-left-4 cqa-top-0 cqa-bottom-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none cqa-text-[#6B7280] cqa-leading-none\" aria-hidden=\"true\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">search</mat-icon>\n </span>\n <input\n type=\"text\"\n [value]=\"editForm.get('parameterSearchQuery')?.value ?? ''\"\n (input)=\"onParameterSearchInput($any($event.target).value)\"\n placeholder=\"Search library\"\n class=\"cqa-test-data-search-input cqa-w-full cqa-pl-10 cqa-pr-4 cqa-py-2.5 cqa-text-sm cqa-leading-5 cqa-text-[#0A0A0A] placeholder:cqa-text-[#9CA3AF] focus:cqa-outline-none focus:cqa-border-[#3B82F6] focus:cqa-ring-1 focus:cqa-ring-[#3B82F6]\"\n aria-label=\"Search library\"\n />\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\">\n <cqa-item-list\n [items]=\"parameterListConfig\"\n [selectedId]=\"selectedParameterId\"\n emptyMessage=\"No parameters match your search.\"\n [scrollable]=\"true\"\n (itemSelect)=\"onParameterSelect($event)\"\n (itemEdit)=\"onParameterEdit($event)\">\n </cqa-item-list>\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 cqa-relative cqa-flex cqa-items-center\">\n <span class=\"cqa-absolute cqa-left-4 cqa-top-0 cqa-bottom-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none cqa-text-[#6B7280] cqa-leading-none\" aria-hidden=\"true\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">search</mat-icon>\n </span>\n <input\n type=\"text\"\n [value]=\"editForm.get('environmentSearchQuery')?.value ?? ''\"\n (input)=\"onEnvironmentSearchInput($any($event.target).value)\"\n placeholder=\"Search Environment\"\n class=\"cqa-test-data-search-input cqa-w-full cqa-pl-10 cqa-pr-4 cqa-py-2.5 cqa-text-sm cqa-leading-5 cqa-text-[#0A0A0A] placeholder:cqa-text-[#9CA3AF] focus:cqa-outline-none focus:cqa-border-[#3B82F6] focus:cqa-ring-1 focus:cqa-ring-[#3B82F6]\"\n aria-label=\"Search Environment\"\n />\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\">\n <cqa-item-list\n [items]=\"environmentListConfig\"\n [selectedId]=\"selectedEnvironmentId\"\n emptyMessage=\"No environment variables match your search.\"\n [scrollable]=\"true\"\n (itemSelect)=\"onEnvironmentSelect($event)\"\n (itemEdit)=\"onEnvironmentEdit($event)\">\n </cqa-item-list>\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-[#374151]\">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 <button\n *ngFor=\"let snippet of runtimeSuggestedValues\"\n type=\"button\"\n (click)=\"onRuntimeChipInsert(snippet)\"\n class=\"cqa-flex-shrink-0 cqa-px-3 cqa-py-1.5 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#374151] cqa-bg-[#F3F4F6] cqa-rounded-full hover:cqa-bg-[#E5E7EB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] cqa-transition-colors cqa-whitespace-nowrap\">\n {{ snippet }}\n </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 href=\"#\" (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\">\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.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor"], outputs: ["valueChange"] }, { type: i4.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i5.ItemListComponent, selector: "cqa-item-list", inputs: ["items", "selectedId", "emptyMessage", "scrollable"], outputs: ["itemSelect", "itemEdit"] }, { type: i6.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
283
305
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestDataModalComponent, decorators: [{
|
|
284
306
|
type: Component,
|
|
285
307
|
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-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 -->\n <div class=\"cqa-flex 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 (works inside overlay) -->\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 <!-- Custom tooltip (exact spec: 306\u00D720 content, 6px radius, #0A0A0A, no arrow) -->\n <div *ngIf=\"showHelpTooltip\"\n class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-top-[-24px] cqa-left-[-125px]\"\n role=\"tooltip\">\n <div\n class=\"cqa-text-white cqa-text-center cqa-whitespace-nowrap cqa-w-[306px] cqa-min-h-[20px] cqa-rounded-[6px] cqa-py-1 cqa-px-2 cqa-bg-[#0A0A0A] cqa-leading-[20px] cqa-text-[8px]\">\n {{ helpTooltipText }}\n </div>\n </div>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px] !cqa-block !cqa-leading-none\">close</mat-icon>\n </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 (bound to editForm like Loop Step) -->\n <div class=\"cqa-w-full cqa-test-data-modal-tabs\">\n <cqa-segment-control\n [segments]=\"tabSegments\"\n [value]=\"editForm.get('activeTab')?.value ?? activeTab\"\n (valueChange)=\"onTabChange($event)\">\n </cqa-segment-control>\n </div>\n\n <!-- Content per tab: flex-1 min-h-0 so Parameter/Environment/Runtime content can scroll -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-h-0\"\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 Variable Library\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 <!-- Filter tabs: All, Global, Local (blue underline under active label only) -->\n <div class=\"cqa-flex cqa-w-full cqa-flex-shrink-0\">\n <button *ngFor=\"let tab of parameterFilterTabs\" type=\"button\"\n (click)=\"onParameterScopeFilterChange(tab.value)\"\n class=\"cqa-flex-1 cqa-py-0 cqa-px-3 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-cursor-pointer cqa-transition-colors cqa-flex cqa-justify-center cqa-items-center\"\n [class.cqa-text-[#6B7280]]=\"parameterScopeFilter !== tab.value\">\n <span class=\"cqa-test-data-param-filter-label cqa-inline-block cqa-pb-0.5\"\n [class.cqa-test-data-param-filter-active]=\"parameterScopeFilter === tab.value\">\n {{ tab.label }}\n </span>\n </button>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0 cqa-relative cqa-flex cqa-items-center\">\n <span class=\"cqa-absolute cqa-left-4 cqa-top-0 cqa-bottom-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none cqa-text-[#6B7280] cqa-leading-none\" aria-hidden=\"true\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">search</mat-icon>\n </span>\n <input\n type=\"text\"\n [value]=\"editForm.get('parameterSearchQuery')?.value ?? ''\"\n (input)=\"onParameterSearchInput($any($event.target).value)\"\n placeholder=\"Search library\"\n class=\"cqa-test-data-search-input cqa-w-full cqa-pl-10 cqa-pr-4 cqa-py-2.5 cqa-text-sm cqa-leading-5 cqa-text-[#0A0A0A] placeholder:cqa-text-[#9CA3AF] focus:cqa-outline-none focus:cqa-border-[#3B82F6] focus:cqa-ring-1 focus:cqa-ring-[#3B82F6]\"\n aria-label=\"Search library\"\n />\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\">\n <cqa-item-list\n [items]=\"parameterListConfig\"\n [selectedId]=\"selectedParameterId\"\n emptyMessage=\"No parameters match your search.\"\n [scrollable]=\"true\"\n (itemSelect)=\"onParameterSelect($event)\"\n (itemEdit)=\"onParameterEdit($event)\">\n </cqa-item-list>\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 cqa-relative cqa-flex cqa-items-center\">\n <span class=\"cqa-absolute cqa-left-4 cqa-top-0 cqa-bottom-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none cqa-text-[#6B7280] cqa-leading-none\" aria-hidden=\"true\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">search</mat-icon>\n </span>\n <input\n type=\"text\"\n [value]=\"editForm.get('environmentSearchQuery')?.value ?? ''\"\n (input)=\"onEnvironmentSearchInput($any($event.target).value)\"\n placeholder=\"Search Environment\"\n class=\"cqa-test-data-search-input cqa-w-full cqa-pl-10 cqa-pr-4 cqa-py-2.5 cqa-text-sm cqa-leading-5 cqa-text-[#0A0A0A] placeholder:cqa-text-[#9CA3AF] focus:cqa-outline-none focus:cqa-border-[#3B82F6] focus:cqa-ring-1 focus:cqa-ring-[#3B82F6]\"\n aria-label=\"Search Environment\"\n />\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\">\n <cqa-item-list\n [items]=\"environmentListConfig\"\n [selectedId]=\"selectedEnvironmentId\"\n emptyMessage=\"No environment variables match your search.\"\n [scrollable]=\"true\"\n (itemSelect)=\"onEnvironmentSelect($event)\"\n (itemEdit)=\"onEnvironmentEdit($event)\">\n </cqa-item-list>\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-[#374151]\">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 <button\n *ngFor=\"let snippet of runtimeSuggestedValues\"\n type=\"button\"\n (click)=\"onRuntimeChipInsert(snippet)\"\n class=\"cqa-flex-shrink-0 cqa-px-3 cqa-py-1.5 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#374151] cqa-bg-[#F3F4F6] cqa-rounded-full hover:cqa-bg-[#E5E7EB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] cqa-transition-colors cqa-whitespace-nowrap\">\n {{ snippet }}\n </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 href=\"#\" (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\">\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" }]
|
|
@@ -297,5 +319,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
297
319
|
type: Output
|
|
298
320
|
}], editInDepth: [{
|
|
299
321
|
type: Output
|
|
322
|
+
}], parameterCreate: [{
|
|
323
|
+
type: Output
|
|
324
|
+
}], parameterEdit: [{
|
|
325
|
+
type: Output
|
|
326
|
+
}], environmentCreate: [{
|
|
327
|
+
type: Output
|
|
328
|
+
}], environmentEdit: [{
|
|
329
|
+
type: Output
|
|
330
|
+
}], parameters: [{
|
|
331
|
+
type: Input
|
|
332
|
+
}], environmentItems: [{
|
|
333
|
+
type: Input
|
|
300
334
|
}] } });
|
|
301
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1kYXRhLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvdGVzdC1kYXRhLW1vZGFsL3Rlc3QtZGF0YS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtZGF0YS1tb2RhbC90ZXN0LWRhdGEtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFFTixRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsNkJBQTZCLEdBRzlCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLG1CQUFtQixFQUFvQixNQUFNLHVCQUF1QixDQUFDO0FBRTlFLE9BQU8sRUFDTCxzQkFBc0IsR0FFdkIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsZUFBZSxHQUdoQixNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7Ozs7O0FBRzNDLE1BQU0sWUFBWSxHQUFHO0lBQ25CLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO0lBQzVDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO0lBQzFDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO0lBQzlDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0NBQ3ZDLENBQUM7QUFFRixNQUFNLHFCQUFxQixHQUFxRDtJQUM5RSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtJQUM5QixF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QUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDZCQUFvQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFZO1FBQ2pCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3JDO0lBQ0gsQ0FBQzs7bUhBalNVLHNCQUFzQiw4RUEyQ3ZCLG1CQUFtQixhQUNQLG9CQUFvQjt1R0E1Qy9CLHNCQUFzQiwrS0M1RG5DLHNpZUF3UEE7MkZENUxhLHNCQUFzQjtrQkFObEMsU0FBUzsrQkFDRSxxQkFBcUIsUUFFekIsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLG1CQUNiLHVCQUF1QixDQUFDLE1BQU07OzBCQTZDNUMsTUFBTTsyQkFBQyxtQkFBbUI7OzBCQUMxQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLG9CQUFvQjs0Q0EzQ2hDLEtBQUs7c0JBQWQsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBURVNUX0RBVEFfTU9EQUxfREFUQSxcbiAgVEVTVF9EQVRBX01PREFMX0VESVRfSU5fREVQVEgsXG4gIFRlc3REYXRhTW9kYWxEYXRhLFxuICBUZXN0RGF0YU1vZGFsVGFiLFxufSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1kYXRhJztcbmltcG9ydCB7IFRFU1RfREFUQV9NT0RBTF9SRUYsIFRlc3REYXRhTW9kYWxSZWYgfSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1yZWYnO1xuaW1wb3J0IHsgVGVzdERhdGFNb2RhbFJlc3VsdCB9IGZyb20gJy4vdGVzdC1kYXRhLW1vZGFsLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTU9DS19FTlZJUk9OTUVOVF9JVEVNUyxcbiAgRW52aXJvbm1lbnRJdGVtLFxufSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1lbnZpcm9ubWVudC5tb2RlbCc7XG5pbXBvcnQge1xuICBNT0NLX1BBUkFNRVRFUlMsXG4gIFBhcmFtZXRlckl0ZW0sXG4gIFBhcmFtZXRlclNjb3BlRmlsdGVyLFxufSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1wYXJhbWV0ZXIubW9kZWwnO1xuaW1wb3J0IHsgQ3FhTGlzdEl0ZW1Db25maWcgfSBmcm9tICcuLi8uLi9pdGVtLWxpc3QvaXRlbS1saXN0Lm1vZGVsJztcblxuY29uc3QgVEFCX1NFR01FTlRTID0gW1xuICB7IGxhYmVsOiAnUGxhaW4gVGV4dCcsIHZhbHVlOiAncGxhaW4tdGV4dCcgfSxcbiAgeyBsYWJlbDogJ1BhcmFtZXRlcicsIHZhbHVlOiAncGFyYW1ldGVyJyB9LFxuICB7IGxhYmVsOiAnRW52aXJvbm1lbnQnLCB2YWx1ZTogJ2Vudmlyb25tZW50JyB9LFxuICB7IGxhYmVsOiAnUnVudGltZScsIHZhbHVlOiAncnVudGltZScgfSxcbl07XG5cbmNvbnN0IFBBUkFNRVRFUl9GSUxURVJfVEFCUzogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogUGFyYW1ldGVyU2NvcGVGaWx0ZXIgfVtdID0gW1xuICB7IGxhYmVsOiAnQWxsJywgdmFsdWU6ICdhbGwnIH0sXG4gIHsgbGFiZWw6ICdHbG9iYWwnLCB2YWx1ZTogJ2dsb2JhbCcgfSxcbiAgeyBsYWJlbDogJ0xvY2FsJywgdmFsdWU6ICdsb2NhbCcgfSxcbl07XG5cbi8qKiBNb2NrIHJ1bnRpbWUgdmFyaWFibGUgc3VnZ2VzdGlvbnMgKHJlcGxhY2Ugd2l0aCBBUEkgd2hlbiBpbnRlZ3JhdGluZykuICovXG5jb25zdCBSVU5USU1FX1NVR0dFU1RFRF9WQUxVRVMgPSBbXG4gICd7e3J1bnRpbWUuTWF4V2FpdFRpbWV9fScsXG4gICd7e3J1bnRpbWUuc2Vzc2lvbl9pZH19JyxcbiAgJ3t7cnVudGltZS5hdXRoX3Rva2VufX0nLFxuICAne3tydW50aW1lLnN0ZXBfaW5kZXh9fScsXG4gICd7e3J1bnRpbWUudGltZXN0YW1wfX0nLFxuICAne3tydW50aW1lLnRlc3RfbmFtZX19Jyxcbl07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZXN0LWRhdGEtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVzdC1kYXRhLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdERhdGFNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBPdXRwdXQoKSBhcHBseSA9IG5ldyBFdmVudEVtaXR0ZXI8e3ZhbHVlOiBzdHJpbmcsIGFjdGl2ZVRhYjogVGVzdERhdGFNb2RhbFRhYn0+KCk7XG4gIEBPdXRwdXQoKSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBlZGl0SW5EZXB0aCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICByZWFkb25seSB0YWJTZWdtZW50cyA9IFRBQl9TRUdNRU5UUztcbiAgcmVhZG9ubHkgcGFyYW1ldGVyRmlsdGVyVGFicyA9IFBBUkFNRVRFUl9GSUxURVJfVEFCUztcbiAgLyoqIE1vY2sgcGFyYW1ldGVyIGxpc3QgKHJlcGxhY2Ugd2l0aCBBUEkgd2hlbiBpbnRlZ3JhdGluZykuICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM6IFBhcmFtZXRlckl0ZW1bXSA9IE1PQ0tfUEFSQU1FVEVSUztcbiAgLyoqIE1vY2sgZW52aXJvbm1lbnQgbGlzdCAocmVwbGFjZSB3aXRoIEFQSSB3aGVuIGludGVncmF0aW5nKS4gKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnRJdGVtczogRW52aXJvbm1lbnRJdGVtW10gPSBNT0NLX0VOVklST05NRU5UX0lURU1TO1xuICAvKiogUnVudGltZSB0YWI6IHN1Z2dlc3RlZCB2YXJpYWJsZSBjaGlwcy4gKi9cbiAgcmVhZG9ubHkgcnVudGltZVN1Z2dlc3RlZFZhbHVlczogcmVhZG9ubHkgc3RyaW5nW10gPSBSVU5USU1FX1NVR0dFU1RFRF9WQUxVRVM7XG5cbiAgLyoqIEZvcm0gZm9yIGFsbCBtb2RhbCBjb250cm9scyAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBlZGl0Rm9ybSkuICovXG4gIGVkaXRGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBDYWNoZWQgc2VsZWN0IGNvbmZpZ3MgKHN0YWJsZSByZWZzLCBzYW1lIG5hbWluZyBhcyBMb29wIFN0ZXA6IHh4eFNlbGVjdENvbmZpZykuICovXG4gIGFjdGl2ZVRhYlNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgcGFyYW1ldGVyU2NvcGVGaWx0ZXJTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG5cbiAgLyoqIExvY2FsIGNvcHkgb2YgZm9ybSB2YWx1ZSBmb3IgQ2FuY2VsIHJldmVydCAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBlZGl0U25hcHNob3QpLiAqL1xuICBwcml2YXRlIGVkaXRTbmFwc2hvdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvKiogU3RhdGUgZGVyaXZlZCBmcm9tIGNvbmZpZy9lZGl0Rm9ybSBmb3IgdGVtcGxhdGUgYW5kIGdldHRlcnMgKG1pcnJvcnMgTG9vcCBTdGVwIGlucHV0cykuICovXG4gIGFjdGl2ZVRhYjogVGVzdERhdGFNb2RhbFRhYiA9ICdwbGFpbi10ZXh0JztcbiAgdmFsdWUgPSAnJztcbiAgaGVscFVybCA9ICcnO1xuICBoZWxwVG9vbHRpcFRleHQgPSAnTm90IHN1cmUgd2hhdCB0byBkbz8gQ2xpY2sgdG8gZ28gdG8gb3VyIGRldGFpbGVkIHN0ZXAgY3JlYXRpb24gZG9jdW1lbnRhdGlvbic7XG4gIHNob3dIZWxwVG9vbHRpcCA9IGZhbHNlO1xuXG4gIHBhcmFtZXRlclNjb3BlRmlsdGVyOiBQYXJhbWV0ZXJTY29wZUZpbHRlciA9ICdhbGwnO1xuICBwYXJhbWV0ZXJTZWFyY2hRdWVyeSA9ICcnO1xuICBzZWxlY3RlZFBhcmFtZXRlcklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBlbnZpcm9ubWVudFNlYXJjaFF1ZXJ5ID0gJyc7XG4gIHNlbGVjdGVkRW52aXJvbm1lbnRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgcnVudGltZVZhbHVlID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoVEVTVF9EQVRBX01PREFMX1JFRikgcHJpdmF0ZSByZWY6IFRlc3REYXRhTW9kYWxSZWY8VGVzdERhdGFNb2RhbFJlc3VsdD4sXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChURVNUX0RBVEFfTU9EQUxfREFUQSkgZGF0YT86IFRlc3REYXRhTW9kYWxEYXRhXG4gICkge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZGF0YS52YWx1ZSA/PyAnJztcbiAgICAgIHRoaXMuaGVscFVybCA9IGRhdGEuaGVscFVybCA/PyAnJztcbiAgICAgIHRoaXMuYWN0aXZlVGFiID0gKGRhdGEuYWN0aXZlVGFiID8/ICdwbGFpbi10ZXh0JykgYXMgVGVzdERhdGFNb2RhbFRhYjtcbiAgICAgIHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPSBkYXRhLnBhcmFtZXRlclNjb3BlRmlsdGVyID8/ICdhbGwnO1xuICAgICAgdGhpcy5wYXJhbWV0ZXJTZWFyY2hRdWVyeSA9IGRhdGEucGFyYW1ldGVyU2VhcmNoUXVlcnkgPz8gJyc7XG4gICAgICB0aGlzLnNlbGVjdGVkUGFyYW1ldGVySWQgPSBkYXRhLnNlbGVjdGVkUGFyYW1ldGVySWQgPz8gbnVsbDtcbiAgICAgIHRoaXMuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA9IGRhdGEuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA/PyAnJztcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkID0gZGF0YS5zZWxlY3RlZEVudmlyb25tZW50SWQgPz8gbnVsbDtcbiAgICAgIHRoaXMucnVudGltZVZhbHVlID0gZGF0YS5ydW50aW1lVmFsdWUgPz8gJyc7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5idWlsZEVkaXRGb3JtKCk7XG4gICAgdGhpcy5idWlsZFNlbGVjdENvbmZpZ3MoKTtcbiAgICB0aGlzLmVkaXRTbmFwc2hvdCA9IHsgLi4udGhpcy5lZGl0Rm9ybS52YWx1ZSB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIGZvcm0gd2l0aCBhbGwgY29udHJvbCB2YWx1ZXMgKHNhbWUgcGF0dGVybiBhcyBMb29wIFN0ZXAgYnVpbGRFZGl0Rm9ybSkuICovXG4gIHByaXZhdGUgYnVpbGRFZGl0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICB2YWx1ZTogW3RoaXMudmFsdWUgPz8gJyddLFxuICAgICAgYWN0aXZlVGFiOiBbdGhpcy5hY3RpdmVUYWIgPz8gJ3BsYWluLXRleHQnXSxcbiAgICAgIHBhcmFtZXRlclNjb3BlRmlsdGVyOiBbdGhpcy5wYXJhbWV0ZXJTY29wZUZpbHRlciA/PyAnYWxsJ10sXG4gICAgICBwYXJhbWV0ZXJTZWFyY2hRdWVyeTogW3RoaXMucGFyYW1ldGVyU2VhcmNoUXVlcnkgPz8gJyddLFxuICAgICAgc2VsZWN0ZWRQYXJhbWV0ZXJJZDogW3RoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA/PyBudWxsXSxcbiAgICAgIGVudmlyb25tZW50U2VhcmNoUXVlcnk6IFt0aGlzLmVudmlyb25tZW50U2VhcmNoUXVlcnkgPz8gJyddLFxuICAgICAgc2VsZWN0ZWRFbnZpcm9ubWVudElkOiBbdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgPz8gbnVsbF0sXG4gICAgICBydW50aW1lVmFsdWU6IFt0aGlzLnJ1bnRpbWVWYWx1ZSA/PyAnJ10sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQnVpbGQgc2VsZWN0IGNvbmZpZ3Mgb25jZSAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBidWlsZFNlbGVjdENvbmZpZ3MpLiAqL1xuICBwcml2YXRlIGJ1aWxkU2VsZWN0Q29uZmlncygpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFRBQl9TRUdNRU5UUy5tYXAoKHMpID0+ICh7XG4gICAgICBpZDogcy52YWx1ZSxcbiAgICAgIHZhbHVlOiBzLnZhbHVlLFxuICAgICAgbmFtZTogcy5sYWJlbCxcbiAgICAgIGxhYmVsOiBzLmxhYmVsLFxuICAgIH0pKTtcbiAgICBjb25zdCBmaWx0ZXJPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFBBUkFNRVRFUl9GSUxURVJfVEFCUy5tYXAoKHMpID0+ICh7XG4gICAgICBpZDogcy52YWx1ZSxcbiAgICAgIHZhbHVlOiBzLnZhbHVlLFxuICAgICAgbmFtZTogcy5sYWJlbCxcbiAgICAgIGxhYmVsOiBzLmxhYmVsLFxuICAgIH0pKTtcbiAgICB0aGlzLmFjdGl2ZVRhYlNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2FjdGl2ZVRhYicsXG4gICAgICBwbGFjZWhvbGRlcjogJ1RhYicsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRhYk9wdGlvbnMsXG4gICAgfTtcbiAgICB0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAncGFyYW1ldGVyU2NvcGVGaWx0ZXInLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTY29wZScsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IGZpbHRlck9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgZm9ybSBjb250cm9sIGFuZCBzeW5jIGNvbXBvbmVudCBzdGF0ZSAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBvbkVkaXRGb3JtRmllbGRDaGFuZ2UpLiAqL1xuICBvbkVkaXRGb3JtRmllbGRDaGFuZ2UoY29udHJvbE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtLmdldChjb250cm9sTmFtZSk/LnNldFZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLnN5bmNTdGF0ZUZyb21Gb3JtKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogU3luYyBjb21wb25lbnQgc3RhdGUgZnJvbSBlZGl0Rm9ybSBzbyBnZXR0ZXJzIChlLmcuIGZpbHRlcmVkUGFyYW1ldGVycykgc3RheSBjb3JyZWN0LiAqL1xuICBwcml2YXRlIHN5bmNTdGF0ZUZyb21Gb3JtKCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLmVkaXRGb3JtLnZhbHVlO1xuICAgIHRoaXMudmFsdWUgPSB2LnZhbHVlID8/ICcnO1xuICAgIHRoaXMuYWN0aXZlVGFiID0gKHYuYWN0aXZlVGFiID8/ICdwbGFpbi10ZXh0JykgYXMgVGVzdERhdGFNb2RhbFRhYjtcbiAgICB0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyID0gKHYucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPz8gJ2FsbCcpIGFzIFBhcmFtZXRlclNjb3BlRmlsdGVyO1xuICAgIHRoaXMucGFyYW1ldGVyU2VhcmNoUXVlcnkgPSB2LnBhcmFtZXRlclNlYXJjaFF1ZXJ5ID8/ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA9IHYuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA/PyBudWxsO1xuICAgIHRoaXMuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA9IHYuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA/PyAnJztcbiAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IHYuc2VsZWN0ZWRFbnZpcm9ubWVudElkID8/IG51bGw7XG4gICAgdGhpcy5ydW50aW1lVmFsdWUgPSB2LnJ1bnRpbWVWYWx1ZSA/PyAnJztcbiAgfVxuXG4gIC8qKiBGaWx0ZXJlZCBwYXJhbWV0ZXJzIGJ5IHNjb3BlIGFuZCBzZWFyY2ggKFBhcmFtZXRlciB0YWIpLiAqL1xuICBnZXQgZmlsdGVyZWRQYXJhbWV0ZXJzKCk6IFBhcmFtZXRlckl0ZW1bXSB7XG4gICAgbGV0IGxpc3QgPSB0aGlzLnBhcmFtZXRlcnM7XG4gICAgaWYgKHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPT09ICdnbG9iYWwnKSB7XG4gICAgICBsaXN0ID0gbGlzdC5maWx0ZXIoKHApID0+IHAuc2NvcGUgPT09ICdHbG9iYWwnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPT09ICdsb2NhbCcpIHtcbiAgICAgIGxpc3QgPSBsaXN0LmZpbHRlcigocCkgPT4gcC5zY29wZSA9PT0gJ0xvY2FsJyk7XG4gICAgfVxuICAgIGNvbnN0IHEgPSB0aGlzLnBhcmFtZXRlclNlYXJjaFF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChxKSB7XG4gICAgICBsaXN0ID0gbGlzdC5maWx0ZXIoKHApID0+IHAubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICAvKiogRmlsdGVyZWQgZW52aXJvbm1lbnQgaXRlbXMgYnkgc2VhcmNoIChFbnZpcm9ubWVudCB0YWIpLiAqL1xuICBnZXQgZmlsdGVyZWRFbnZpcm9ubWVudHMoKTogRW52aXJvbm1lbnRJdGVtW10ge1xuICAgIGNvbnN0IHEgPSB0aGlzLmVudmlyb25tZW50U2VhcmNoUXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFxKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudEl0ZW1zO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudEl0ZW1zLmZpbHRlcihcbiAgICAgIChlKSA9PlxuICAgICAgICBlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fCBlLnZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSlcbiAgICApO1xuICB9XG5cbiAgLyoqIFBhcmFtZXRlciB0YWI6IGxpc3QgY29uZmlnIGZvciBjcWEtaXRlbS1saXN0IChzZWFyY2gtZnJpZW5kbHk6IGJpbmQgZmlsdGVyZWQgbGlzdCkuICovXG4gIGdldCBwYXJhbWV0ZXJMaXN0Q29uZmlnKCk6IENxYUxpc3RJdGVtQ29uZmlnW10ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUGFyYW1ldGVycy5tYXAoKHApID0+ICh7XG4gICAgICBpZDogcC5pZCxcbiAgICAgIHRpdGxlOiBwLm5hbWUsXG4gICAgICBzdWJ0aXRsZTogcC52YWx1ZSxcbiAgICAgIGJhZGdlOiBwLnNjb3BlLFxuICAgICAgc2hvd0VkaXQ6IHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA9PT0gcC5pZCxcbiAgICB9KSk7XG4gIH1cblxuICAvKiogRW52aXJvbm1lbnQgdGFiOiBsaXN0IGNvbmZpZyBmb3IgY3FhLWl0ZW0tbGlzdC4gKi9cbiAgZ2V0IGVudmlyb25tZW50TGlzdENvbmZpZygpOiBDcWFMaXN0SXRlbUNvbmZpZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZEVudmlyb25tZW50cy5tYXAoKGUpID0+ICh7XG4gICAgICBpZDogZS5pZCxcbiAgICAgIHRpdGxlOiBlLm5hbWUsXG4gICAgICBzdWJ0aXRsZTogYFZhbHVlOiAke2UudmFsdWV9YCxcbiAgICAgIGJhZGdlOiBlLmVudmlyb25tZW50LFxuICAgICAgc2hvd0VkaXQ6IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkID09PSBlLmlkICYmIChlLmVkaXRhYmxlID8/IHRydWUpLFxuICAgIH0pKTtcbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKHRhYlZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9uRWRpdEZvcm1GaWVsZENoYW5nZSgnYWN0aXZlVGFiJywgdGFiVmFsdWUpO1xuICB9XG5cbiAgb25QYXJhbWV0ZXJTY29wZUZpbHRlckNoYW5nZShmaWx0ZXI6IFBhcmFtZXRlclNjb3BlRmlsdGVyKTogdm9pZCB7XG4gICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3BhcmFtZXRlclNjb3BlRmlsdGVyJywgZmlsdGVyKTtcbiAgfVxuXG4gIG9uUGFyYW1ldGVyU2VhcmNoSW5wdXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdwYXJhbWV0ZXJTZWFyY2hRdWVyeScsIHZhbHVlKTtcbiAgfVxuXG4gIG9uUGFyYW1ldGVyU2VsZWN0KHBhcmFtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmFtID0gdGhpcy5wYXJhbWV0ZXJzLmZpbmQoKHApID0+IHAuaWQgPT09IHBhcmFtSWQpO1xuICAgIGlmIChwYXJhbSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID0gdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID09PSBwYXJhbS5pZCA/IG51bGwgOiBwYXJhbS5pZDtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdzZWxlY3RlZFBhcmFtZXRlcklkJywgdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkKTtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCd2YWx1ZScsIHBhcmFtLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFyYW1ldGVyRWRpdChfcGFyYW1JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gUGxhY2Vob2xkZXIgZm9yIGZ1dHVyZSBlZGl0IGFjdGlvbiAoZS5nLiBvcGVuIGVkaXQgZHJhd2VyKS5cbiAgfVxuXG4gIG9uQ3JlYXRlTmV3VmFyaWFibGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyBQbGFjZWhvbGRlciBmb3IgZnV0dXJlIFwiQ3JlYXRlIE5ld1wiIGFjdGlvbiAobm8gQVBJIHlldCkuXG4gIH1cblxuICBvbkVudmlyb25tZW50U2VhcmNoSW5wdXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdlbnZpcm9ubWVudFNlYXJjaFF1ZXJ5JywgdmFsdWUpO1xuICB9XG5cbiAgb25FbnZpcm9ubWVudFNlbGVjdChpdGVtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmVudmlyb25tZW50SXRlbXMuZmluZCgoZSkgPT4gZS5pZCA9PT0gaXRlbUlkKTtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgPVxuICAgICAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9PT0gaXRlbS5pZCA/IG51bGwgOiBpdGVtLmlkO1xuICAgICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3NlbGVjdGVkRW52aXJvbm1lbnRJZCcsIHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkKTtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCd2YWx1ZScsIGl0ZW0ubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgb25FbnZpcm9ubWVudEVkaXQoX2l0ZW1JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gUGxhY2Vob2xkZXIgZm9yIGZ1dHVyZSBlZGl0IGFjdGlvbiAoZS5nLiBvcGVuIGVkaXQgZHJhd2VyKS5cbiAgfVxuXG4gIG9uQ3JlYXRlTmV3RW52aXJvbm1lbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyBQbGFjZWhvbGRlciBmb3IgZnV0dXJlIFwiQ3JlYXRlIE5ld1wiIGFjdGlvbiAobm8gQVBJIHlldCkuXG4gIH1cblxuICAvKiogUnVudGltZSB0YWI6IGluc2VydCBzdWdnZXN0ZWQgdmFsdWUgaW50byB0aGUgcnVudGltZSBpbnB1dCBmaWVsZC4gKi9cbiAgb25SdW50aW1lQ2hpcEluc2VydChzbmlwcGV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3J1bnRpbWVWYWx1ZScpPy52YWx1ZVxuICAgICAgPyB0aGlzLmVkaXRGb3JtLmdldCgncnVudGltZVZhbHVlJyk/LnZhbHVlICsgJyAnICsgc25pcHBldFxuICAgICAgOiBzbmlwcGV0O1xuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdydW50aW1lVmFsdWUnLCBuZXh0KTtcbiAgfVxuXG4gIG9uQXBwbHkoKTogdm9pZCB7XG4gICAgdGhpcy5zeW5jU3RhdGVGcm9tRm9ybSgpO1xuICAgIGxldCB2YWx1ZVRvQXBwbHkgPSB0aGlzLmFjdGl2ZVRhYiA9PT0gJ3J1bnRpbWUnID8gdGhpcy5ydW50aW1lVmFsdWUgOiB0aGlzLnZhbHVlO1xuXG4gICAgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJykge1xuICAgICAgdmFsdWVUb0FwcGx5ID0gdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID8gdGhpcy5wYXJhbWV0ZXJzLmZpbmQoKHApID0+IHAuaWQgPT09IHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCk/Lm5hbWUgPz8gJycgOiAnJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAnZW52aXJvbm1lbnQnKSB7XG4gICAgICB2YWx1ZVRvQXBwbHkgPSB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA/IHRoaXMuZW52aXJvbm1lbnRJdGVtcy5maW5kKChlKSA9PiBlLmlkID09PSB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCk/Lm5hbWUgPz8gJycgOiAnJztcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByZXN1bHQgd2l0aCBvbmx5IHRoZSBhY3RpdmUgdGFiJ3MgZGF0YSwgY2xlYXIgb3RoZXIgdGFicycgZGF0YVxuICAgIGNvbnN0IHJlc3VsdDogVGVzdERhdGFNb2RhbERhdGEgPSB7XG4gICAgICB2YWx1ZTogdmFsdWVUb0FwcGx5LFxuICAgICAgYWN0aXZlVGFiOiB0aGlzLmFjdGl2ZVRhYixcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSBwYXJhbWV0ZXIgZGF0YSBpZiBwYXJhbWV0ZXIgdGFiIGlzIGFjdGl2ZVxuICAgICAgcGFyYW1ldGVyU2NvcGVGaWx0ZXI6IHRoaXMuYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJyA/IHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgOiB1bmRlZmluZWQsXG4gICAgICBwYXJhbWV0ZXJTZWFyY2hRdWVyeTogdGhpcy5hY3RpdmVUYWIgPT09ICdwYXJhbWV0ZXInID8gdGhpcy5wYXJhbWV0ZXJTZWFyY2hRdWVyeSA6IHVuZGVmaW5lZCxcbiAgICAgIHNlbGVjdGVkUGFyYW1ldGVySWQ6IHRoaXMuYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJyA/IHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA6IHVuZGVmaW5lZCxcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSBlbnZpcm9ubWVudCBkYXRhIGlmIGVudmlyb25tZW50IHRhYiBpcyBhY3RpdmVcbiAgICAgIGVudmlyb25tZW50U2VhcmNoUXVlcnk6IHRoaXMuYWN0aXZlVGFiID09PSAnZW52aXJvbm1lbnQnID8gdGhpcy5lbnZpcm9ubWVudFNlYXJjaFF1ZXJ5IDogdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0ZWRFbnZpcm9ubWVudElkOiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ2Vudmlyb25tZW50JyA/IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkIDogdW5kZWZpbmVkLFxuICAgICAgLy8gT25seSBpbmNsdWRlIHJ1bnRpbWUgZGF0YSBpZiBydW50aW1lIHRhYiBpcyBhY3RpdmVcbiAgICAgIHJ1bnRpbWVWYWx1ZTogdGhpcy5hY3RpdmVUYWIgPT09ICdydW50aW1lJyA/IHRoaXMucnVudGltZVZhbHVlIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICB0aGlzLmFwcGx5LmVtaXQoe3ZhbHVlOiB2YWx1ZVRvQXBwbHksIGFjdGl2ZVRhYjogdGhpcy5hY3RpdmVUYWIgYXMgVGVzdERhdGFNb2RhbFRhYn0pO1xuICAgIHRoaXMucmVmLmNsb3NlKHJlc3VsdCk7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUodGhpcy5lZGl0U25hcHNob3QpO1xuICAgIHRoaXMuc3luY1N0YXRlRnJvbUZvcm0oKTtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgdGhpcy5yZWYuY2xvc2UodW5kZWZpbmVkKTtcbiAgfVxuXG4gIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5vbkNhbmNlbCgpO1xuICB9XG5cbiAgb25FZGl0SW5EZXB0aChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZWRpdEluRGVwdGguZW1pdCgpO1xuICAgIHRoaXMucmVmLmNsb3NlKFRFU1RfREFUQV9NT0RBTF9FRElUX0lOX0RFUFRIIGFzIGFueSk7XG4gIH1cblxuICBvbkhlbHAoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGVscFVybCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHdpbmRvdy5vcGVuKHRoaXMuaGVscFVybCwgJ19ibGFuaycpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImNxYS1iZy13aGl0ZSBjcWEtcm91bmRlZC1bMTJweF0gY3FhLXNoYWRvdy1sZyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl0gY3FhLXctWzUwMHB4XSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC1bMTJweF0gY3FhLXAtMiBjcWEtYm94LWJvcmRlciBjcWEtbWluLWgtMFwiPlxuICA8IS0tIEhlYWRlcjogdGl0bGUgbGVmdDsgTmVlZCBoZWxwPyArIGNsb3NlIGljb24gcmlnaHQgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0yIGNxYS1weC00XCI+XG4gICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzE2cHhdIGNxYS1sZWFkaW5nLVsyNHB4XSBjcWEtZm9udC1ib2xkIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wIGNxYS1mb250LVs2MDBdXCI+XG4gICAgICBUZXN0IERhdGFcbiAgICA8L2gyPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtbWluLWgtWzI4cHhdXCI+XG4gICAgICA8IS0tIE5lZWQgaGVscD8gd2l0aCBjdXN0b20gdG9vbHRpcCAod29ya3MgaW5zaWRlIG92ZXJsYXkpIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cInNob3dIZWxwVG9vbHRpcCA9IHRydWVcIiAobW91c2VsZWF2ZSk9XCJzaG93SGVscFRvb2x0aXAgPSBmYWxzZVwiPlxuICAgICAgICA8YSAqbmdJZj1cImhlbHBVcmxcIiBocmVmPVwiI1wiIChjbGljayk9XCJvbkhlbHAoJGV2ZW50KVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyMXB4XSBjcWEtbm8tdW5kZXJsaW5lIGhvdmVyOmNxYS11bmRlcmxpbmUgY3FhLWN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE3IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCN0ZXN0LWRhdGEtaGVscC1jbGlwKVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNTAwMzMgMTQuNjY2M0MxMi40MTIzIDE0LjY2NjMgMTUuNTgzNyAxMS42ODE2IDE1LjU4MzcgNy45OTk2N0MxNS41ODM3IDQuMzE3NzggMTIuNDEyMyAxLjMzMzAxIDguNTAwMzMgMS4zMzMwMUM0LjU4ODMxIDEuMzMzMDEgMS40MTY5OSA0LjMxNzc4IDEuNDE2OTkgNy45OTk2N0MxLjQxNjk5IDExLjY4MTYgNC41ODgzMSAxNC42NjYzIDguNTAwMzMgMTQuNjY2M1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi40Mzg0OCA2LjAwMDM4QzYuNjA1MDEgNS41NTQ4MyA2LjkzMzcxIDUuMTc5MTIgNy4zNjYzNiA0LjkzOThDNy43OTkwMSA0LjcwMDQ5IDguMzA3NjkgNC42MTMwMSA4LjgwMjMxIDQuNjkyODVDOS4yOTY5MyA0Ljc3MjcgOS43NDU1NiA1LjAxNDczIDEwLjA2ODcgNS4zNzYwN0MxMC4zOTE5IDUuNzM3NCAxMC41Njg4IDYuMTk0NzMgMTAuNTY4MSA2LjY2NzA1QzEwLjU2ODEgOC4wMDAzOCA4LjQ0MzA2IDguNjY3MDUgOC40NDMwNiA4LjY2NzA1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNSAxMS4zMzNIOC41MDk2NlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJ0ZXN0LWRhdGEtaGVscC1jbGlwXCI+XG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIE5lZWQgaGVscCA/XG4gICAgICAgIDwvYT5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhaGVscFVybFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtZm9udC1bNTAwXSBjcWEtdGV4dC1bMTBweF0gY3FhLWN1cnNvci1kZWZhdWx0XCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE3IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMCBjcWEtdGV4dC1bIzNGNDNFRV1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjdGVzdC1kYXRhLWhlbHAtY2xpcC1ub2xpbmspXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC41MDAzMyAxNC42NjYzQzEyLjQxMjMgMTQuNjY2MyAxNS41ODM3IDExLjY4MTYgMTUuNTgzNyA3Ljk5OTY3QzE1LjU4MzcgNC4zMTc3OCAxMi40MTIzIDEuMzMzMDEgOC41MDAzMyAxLjMzMzAxQzQuNTg4MzEgMS4zMzMwMSAxLjQxNjk5IDQuMzE3NzggMS40MTY5OSA3Ljk5OTY3QzEuNDE2OTkgMTEuNjgxNiA0LjU4ODMxIDE0LjY2NjMgOC41MDAzMyAxNC42NjYzWlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjQzODQ4IDYuMDAwMzhDNi42MDUwMSA1LjU1NDgzIDYuOTMzNzEgNS4xNzkxMiA3LjM2NjM2IDQuOTM5OEM3Ljc5OTAxIDQuNzAwNDkgOC4zMDc2OSA0LjYxMzAxIDguODAyMzEgNC42OTI4NUM5LjI5NjkzIDQuNzcyNyA5Ljc0NTU2IDUuMDE0NzMgMTAuMDY4NyA1LjM3NjA3QzEwLjM5MTkgNS43Mzc0IDEwLjU2ODggNi4xOTQ3MyAxMC41NjgxIDYuNjY3MDVDMTAuNTY4MSA4LjAwMDM4IDguNDQzMDYgOC42NjcwNSA4LjQ0MzA2IDguNjY3MDVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC41IDExLjMzM0g4LjUwOTY2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cInRlc3QtZGF0YS1oZWxwLWNsaXAtbm9saW5rXCI+XG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIE5lZWQgaGVscCA/XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPCEtLSBDdXN0b20gdG9vbHRpcCAoZXhhY3Qgc3BlYzogMzA2w5cyMCBjb250ZW50LCA2cHggcmFkaXVzLCAjMEEwQTBBLCBubyBhcnJvdykgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93SGVscFRvb2x0aXBcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LVsxMDBdIGNxYS10b3AtWy0yNHB4XSBjcWEtbGVmdC1bLTEyNXB4XVwiXG4gICAgICAgICAgcm9sZT1cInRvb2x0aXBcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LXdoaXRlIGNxYS10ZXh0LWNlbnRlciBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLXctWzMwNnB4XSBjcWEtbWluLWgtWzIwcHhdIGNxYS1yb3VuZGVkLVs2cHhdIGNxYS1weS0xIGNxYS1weC0yIGNxYS1iZy1bIzBBMEEwQV0gY3FhLWxlYWRpbmctWzIwcHhdIGNxYS10ZXh0LVs4cHhdXCI+XG4gICAgICAgICAgICB7eyBoZWxwVG9vbHRpcFRleHQgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNsb3NlKClcIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1taW4taC1bMjhweF0gY3FhLW1pbi13LVsyOHB4XSBjcWEtcm91bmRlZCBjcWEtdGV4dC1bIzZCNzI4MF0gaG92ZXI6Y3FhLWJnLVsjRjNGNEY2XSBjcWEtcC0wXCJcbiAgICAgICAgdGl0bGU9XCJDbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNSAhY3FhLWgtNSAhY3FhLXRleHQtWzIwcHhdICFjcWEtYmxvY2sgIWNxYS1sZWFkaW5nLW5vbmVcIj5jbG9zZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMaW5lIGJlbG93IGhlYWRlciAoZnVsbCB3aWR0aCBvZiBtb2RhbCwgbm8gc2lkZSBtYXJnaW4pIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLS1teC0yIGNxYS13LVtjYWxjKDEwMCUrMXJlbSldIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1oLXB4IGNxYS13LWZ1bGwgY3FhLWJnLVsjRTVFN0VCXVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBUYWJzOiBQbGFpbiBUZXh0LCBQYXJhbWV0ZXIsIEVudmlyb25tZW50LCBSdW50aW1lIChib3VuZCB0byBlZGl0Rm9ybSBsaWtlIExvb3AgU3RlcCkgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS10ZXN0LWRhdGEtbW9kYWwtdGFic1wiPlxuICAgIDxjcWEtc2VnbWVudC1jb250cm9sXG4gICAgICBbc2VnbWVudHNdPVwidGFiU2VnbWVudHNcIlxuICAgICAgW3ZhbHVlXT1cImVkaXRGb3JtLmdldCgnYWN0aXZlVGFiJyk/LnZhbHVlID8/IGFjdGl2ZVRhYlwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwib25UYWJDaGFuZ2UoJGV2ZW50KVwiPlxuICAgIDwvY3FhLXNlZ21lbnQtY29udHJvbD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBDb250ZW50IHBlciB0YWI6IGZsZXgtMSBtaW4taC0wIHNvIFBhcmFtZXRlci9FbnZpcm9ubWVudC9SdW50aW1lIGNvbnRlbnQgY2FuIHNjcm9sbCAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLWgtMFwiXG4gICAgW2NsYXNzLmNxYS1mbGV4LTFdPVwiYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJyB8fCBhY3RpdmVUYWIgPT09ICdlbnZpcm9ubWVudCcgfHwgYWN0aXZlVGFiID09PSAncnVudGltZSdcIj5cbiAgICA8IS0tIFBsYWluIFRleHQgdGFiIChmb3JtLWJvdW5kIGxpa2UgTG9vcCBTdGVwIGVkaXRGb3JtICsgb25FZGl0Rm9ybUZpZWxkQ2hhbmdlKSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlVGFiID09PSAncGxhaW4tdGV4dCdcIj5cbiAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgIGxhYmVsPVwiVmFsdWVcIlxuICAgICAgICBbdmFsdWVdPVwiZWRpdEZvcm0uZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3ZhbHVlJywgJGV2ZW50KVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly9leGFtcGxlLmNvbS9kYXNoYm9hcmRcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICBzaXplPVwibWRcIj5cbiAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLW0tMFwiPlxuICAgICAgICBFbnRlciBhIHN0YXRpYyB0ZXh0IHZhbHVlIHRoYXQgd29uJ3QgY2hhbmdlIGR1cmluZyBleGVjdXRpb24uXG4gICAgICA8L3A+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIFBhcmFtZXRlciB0YWI6IFZhcmlhYmxlIExpYnJhcnkgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ3BhcmFtZXRlcidcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1taW4taC0wIGNxYS1mbGV4LTEgY3FhLW1pbi1oLVsxOHJlbV1cIj5cbiAgICAgICAgPCEtLSBWYXJpYWJsZSBMaWJyYXJ5IGhlYWRlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTBcIj5cbiAgICAgICAgICAgIFZhcmlhYmxlIExpYnJhcnlcbiAgICAgICAgICA8L2gzPlxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uQ3JlYXRlTmV3VmFyaWFibGUoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtbm8tdW5kZXJsaW5lIGhvdmVyOmNxYS1vcGFjaXR5LTkwIGNxYS1jdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgQ3JlYXRlIE5ldyArXG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBGaWx0ZXIgdGFiczogQWxsLCBHbG9iYWwsIExvY2FsIChibHVlIHVuZGVybGluZSB1bmRlciBhY3RpdmUgbGFiZWwgb25seSkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgdGFiIG9mIHBhcmFtZXRlckZpbHRlclRhYnNcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblBhcmFtZXRlclNjb3BlRmlsdGVyQ2hhbmdlKHRhYi52YWx1ZSlcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1weS0wIGNxYS1weC0zIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tY29sb3JzIGNxYS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtdGV4dC1bIzZCNzI4MF1dPVwicGFyYW1ldGVyU2NvcGVGaWx0ZXIgIT09IHRhYi52YWx1ZVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGVzdC1kYXRhLXBhcmFtLWZpbHRlci1sYWJlbCBjcWEtaW5saW5lLWJsb2NrIGNxYS1wYi0wLjVcIlxuICAgICAgICAgICAgICBbY2xhc3MuY3FhLXRlc3QtZGF0YS1wYXJhbS1maWx0ZXItYWN0aXZlXT1cInBhcmFtZXRlclNjb3BlRmlsdGVyID09PSB0YWIudmFsdWVcIj5cbiAgICAgICAgICAgICAge3sgdGFiLmxhYmVsIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFNlYXJjaDogYm91bmQgdG8gZWRpdEZvcm0gKHNhbWUgcGF0dGVybiBhcyBMb29wIFN0ZXAgY29udHJvbCBiaW5kaW5nKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wIGNxYS1yZWxhdGl2ZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWxlZnQtNCBjcWEtdG9wLTAgY3FhLWJvdHRvbS0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbGVhZGluZy1ub25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNCAhY3FhLWgtNCAhY3FhLXRleHQtWzE2cHhdXCI+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZWRpdEZvcm0uZ2V0KCdwYXJhbWV0ZXJTZWFyY2hRdWVyeScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAoaW5wdXQpPVwib25QYXJhbWV0ZXJTZWFyY2hJbnB1dCgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBsaWJyYXJ5XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRlc3QtZGF0YS1zZWFyY2gtaW5wdXQgY3FhLXctZnVsbCBjcWEtcGwtMTAgY3FhLXByLTQgY3FhLXB5LTIuNSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy01IGNxYS10ZXh0LVsjMEEwQTBBXSBwbGFjZWhvbGRlcjpjcWEtdGV4dC1bIzlDQTNBRl0gZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1czpjcWEtYm9yZGVyLVsjM0I4MkY2XSBmb2N1czpjcWEtcmluZy0xIGZvY3VzOmNxYS1yaW5nLVsjM0I4MkY2XVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2VhcmNoIGxpYnJhcnlcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFBhcmFtZXRlciBsaXN0IChzY3JvbGxhYmxlLCBzZWFyY2gtaW50ZWdyYXRlZCB2aWEgZmlsdGVyZWQgbGlzdCBiaW5kaW5nKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4taC1bMjAwcHhdIGNxYS1mbGV4LTEgY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgICAgICAgPGNxYS1pdGVtLWxpc3RcbiAgICAgICAgICAgIFtpdGVtc109XCJwYXJhbWV0ZXJMaXN0Q29uZmlnXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZElkXT1cInNlbGVjdGVkUGFyYW1ldGVySWRcIlxuICAgICAgICAgICAgZW1wdHlNZXNzYWdlPVwiTm8gcGFyYW1ldGVycyBtYXRjaCB5b3VyIHNlYXJjaC5cIlxuICAgICAgICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAoaXRlbVNlbGVjdCk9XCJvblBhcmFtZXRlclNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChpdGVtRWRpdCk9XCJvblBhcmFtZXRlckVkaXQoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvY3FhLWl0ZW0tbGlzdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRW52aXJvbm1lbnQgdGFiOiBWYXJpYWJsZSBsaWJyYXJ5IGJ5IGVudmlyb25tZW50IC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdlbnZpcm9ubWVudCdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1taW4taC0wIGNxYS1mbGV4LTEgY3FhLW1pbi1oLVsxOHJlbV1cIj5cbiAgICAgICAgPCEtLSBTZWN0aW9uIGhlYWRlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTBcIj5cbiAgICAgICAgICAgIEVudmlyb25tZW50XG4gICAgICAgICAgPC9oMz5cbiAgICAgICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvbkNyZWF0ZU5ld0Vudmlyb25tZW50KCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLW5vLXVuZGVybGluZSBob3ZlcjpjcWEtb3BhY2l0eS05MCBjcWEtY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgIENyZWF0ZSBOZXcgK1xuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gU2VhcmNoOiBib3VuZCB0byBlZGl0Rm9ybSAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBjb250cm9sIGJpbmRpbmcpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXJlbGF0aXZlIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC00IGNxYS10b3AtMCBjcWEtYm90dG9tLTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXRleHQtWyM2QjcyODBdIGNxYS1sZWFkaW5nLW5vbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy00ICFjcWEtaC00ICFjcWEtdGV4dC1bMTZweF1cIj5zZWFyY2g8L21hdC1pY29uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJlZGl0Rm9ybS5nZXQoJ2Vudmlyb25tZW50U2VhcmNoUXVlcnknKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uRW52aXJvbm1lbnRTZWFyY2hJbnB1dCgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBFbnZpcm9ubWVudFwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXN0LWRhdGEtc2VhcmNoLWlucHV0IGNxYS13LWZ1bGwgY3FhLXBsLTEwIGNxYS1wci00IGNxYS1weS0yLjUgY3FhLXRleHQtc20gY3FhLWxlYWRpbmctNSBjcWEtdGV4dC1bIzBBMEEwQV0gcGxhY2Vob2xkZXI6Y3FhLXRleHQtWyM5Q0EzQUZdIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXM6Y3FhLWJvcmRlci1bIzNCODJGNl0gZm9jdXM6Y3FhLXJpbmctMSBmb2N1czpjcWEtcmluZy1bIzNCODJGNl1cIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlNlYXJjaCBFbnZpcm9ubWVudFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gRW52aXJvbm1lbnQgbGlzdCAoc2Nyb2xsYWJsZSwgc2VhcmNoLWludGVncmF0ZWQgdmlhIGZpbHRlcmVkIGxpc3QgYmluZGluZykgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWluLWgtWzIyMHB4XSBjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgICAgIDxjcWEtaXRlbS1saXN0XG4gICAgICAgICAgICBbaXRlbXNdPVwiZW52aXJvbm1lbnRMaXN0Q29uZmlnXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZElkXT1cInNlbGVjdGVkRW52aXJvbm1lbnRJZFwiXG4gICAgICAgICAgICBlbXB0eU1lc3NhZ2U9XCJObyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbWF0Y2ggeW91ciBzZWFyY2guXCJcbiAgICAgICAgICAgIFtzY3JvbGxhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgKGl0ZW1TZWxlY3QpPVwib25FbnZpcm9ubWVudFNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChpdGVtRWRpdCk9XCJvbkVudmlyb25tZW50RWRpdCgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtaXRlbS1saXN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBSdW50aW1lIHRhYjogZHluYW1pYyB2YWx1ZSBpbmplY3RvciAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlVGFiID09PSAncnVudGltZSdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1taW4taC0wIGNxYS1oLWZ1bGwgY3FhLW92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIwcHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgUnVudGltZVxuICAgICAgICA8L2gzPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgW3ZhbHVlXT1cImVkaXRGb3JtLmdldCgncnVudGltZVZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3J1bnRpbWVWYWx1ZScsICRldmVudClcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJpbnB1dCB0ZXh0XCJcbiAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICBzaXplPVwibWRcIj5cbiAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbXQtMS41IGNxYS1tYi0wXCI+XG4gICAgICAgICAgICBWYWx1ZXMgcmVzb2x2ZWQgZHVyaW5nIHRlc3QgZXhlY3V0aW9uIGJhc2VkIG9uIHNlc3Npb24gYW5kIHN0ZXAgc3RhdGUuXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBSZWNvbW1lbmRlZDogc3VnZ2VzdGlvbiBjaGlwcyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LTQgIWNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XSBjcWEtdGV4dC1bIzlDQTNBRl1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5zY2hlZHVsZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPlJlY29tbWVuZGVkPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGVzdC1kYXRhLXJ1bnRpbWUtY2hpcHMtc2Nyb2xsIGNxYS1mbGV4IGNxYS1nYXAtMiBjcWEtb3ZlcmZsb3cteC1hdXRvIGNxYS1taW4tdy0wIGNxYS1wYi0xXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzbmlwcGV0IG9mIHJ1bnRpbWVTdWdnZXN0ZWRWYWx1ZXNcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUnVudGltZUNoaXBJbnNlcnQoc25pcHBldClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wIGNxYS1weC0zIGNxYS1weS0xLjUgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1iZy1bI0YzRjRGNl0gY3FhLXJvdW5kZWQtZnVsbCBob3ZlcjpjcWEtYmctWyNFNUU3RUJdIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy0yIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctWyMzRjQzRUVdIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBjcWEtd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAge3sgc25pcHBldCB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDwhLS0gTGluZSBiZWxvdyBjb250ZW50IChmdWxsIHdpZHRoIG9mIG1vZGFsLCBubyBzaWRlIG1hcmdpbikgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtLW14LTIgY3FhLXctW2NhbGMoMTAwJSsxcmVtKV0gY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWgtcHggY3FhLXctZnVsbCBjcWEtYmctWyNFNUU3RUJdXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEZvb3RlcjogQ2FuY2VsLCBBcHBseSAoZnVsbCB3aWR0aCBpbiBvbmUgcm93KSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0cmV0Y2ggY3FhLWdhcC0yIGNxYS13LWZ1bGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cIidDYW5jZWwnXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiXG4gICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTJweF0gY3FhLXB5LVs5cHhdIGNxYS1ib3JkZXItWyM0MTQxNDZdJ1wiPjwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cIidBcHBseSdcIiBbZnVsbFdpZHRoXT1cInRydWVcIiAoY2xpY2tlZCk9XCJvbkFwcGx5KClcIlxuICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzEycHhdIGNxYS1weS1bOXB4XSBjcWEtYm9yZGVyLVsjM0Y0M0VFXSdcIj48L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKCRldmVudClcIlxuICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtbm8tdW5kZXJsaW5lIGhvdmVyOmNxYS1uby11bmRlcmxpbmUgY3FhLXNlbGYtY2VudGVyXCI+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNCAhY3FhLWgtNCAhY3FhLXRleHQtWzE2cHhdXCI+b3Blbl9pbl9uZXc8L21hdC1pY29uPlxuICAgICAgRWRpdCBpbiBkZXB0aCAob3BlbiBkZXRhaWxlZCByaWdodCBwYW5lbClcbiAgICA8L2E+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
335
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1kYXRhLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvdGVzdC1kYXRhLW1vZGFsL3Rlc3QtZGF0YS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtZGF0YS1tb2RhbC90ZXN0LWRhdGEtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLDZCQUE2QixHQUc5QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBb0IsTUFBTSx1QkFBdUIsQ0FBQztBQUU5RSxPQUFPLEVBQ0wsc0JBQXNCLEdBRXZCLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUNMLGVBQWUsR0FHaEIsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7OztBQUczQyxNQUFNLFlBQVksR0FBRztJQUNuQixFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtJQUM1QyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRTtJQUMxQyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRTtJQUM5QyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtDQUN2QyxDQUFDO0FBRUYsTUFBTSxxQkFBcUIsR0FBcUQ7SUFDOUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUU7SUFDOUIsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7SUFDcEMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7Q0FDbkMsQ0FBQztBQUVGLDZFQUE2RTtBQUM3RSxNQUFNLHdCQUF3QixHQUFHO0lBQy9CLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNwQixtQkFBbUI7SUFDbkIsbUJBQW1CO0NBQ3BCLENBQUM7QUFRRixNQUFNLE9BQU8sc0JBQXNCO0lBNENqQyxZQUNtQixFQUFlLEVBQ2YsR0FBc0IsRUFDRixHQUEwQyxFQUNyQyxJQUF3QjtRQUhqRCxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDRixRQUFHLEdBQUgsR0FBRyxDQUF1QztRQTlDdkUsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFnRCxDQUFDO1FBQ3pFLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ2xDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUN2QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDM0Msa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzNDLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDN0Msb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRTlDLGdCQUFXLEdBQUcsWUFBWSxDQUFDO1FBQzNCLHdCQUFtQixHQUFHLHFCQUFxQixDQUFDO1FBQ3JELDBFQUEwRTtRQUNqRSxlQUFVLEdBQW9CLGVBQWUsQ0FBQztRQUN2RCw0RUFBNEU7UUFDbkUscUJBQWdCLEdBQXNCLHNCQUFzQixDQUFDO1FBQ3RFLDZDQUE2QztRQUNwQywyQkFBc0IsR0FBc0Isd0JBQXdCLENBQUM7UUFTOUUsMkZBQTJGO1FBQ25GLGlCQUFZLEdBQTRCLEVBQUUsQ0FBQztRQUVuRCw4RkFBOEY7UUFDOUYsY0FBUyxHQUFxQixZQUFZLENBQUM7UUFDM0MsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixvQkFBZSxHQUFHLDhFQUE4RSxDQUFDO1FBQ2pHLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBRXhCLHlCQUFvQixHQUF5QixLQUFLLENBQUM7UUFDbkQseUJBQW9CLEdBQUcsRUFBRSxDQUFDO1FBQzFCLHdCQUFtQixHQUFrQixJQUFJLENBQUM7UUFFMUMsMkJBQXNCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLDBCQUFxQixHQUFrQixJQUFJLENBQUM7UUFFNUMsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFRaEIsSUFBSSxJQUFJLEVBQUU7WUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksWUFBWSxDQUFxQixDQUFDO1lBQ3RFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLElBQUksS0FBSyxDQUFDO1lBQy9ELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLElBQUksRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDO1lBQzVELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLElBQUksRUFBRSxDQUFDO1lBQ2hFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDO1lBQ2hFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7WUFDNUMsNERBQTREO1lBQzVELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNuQztZQUNELElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtnQkFDdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzthQUMvQztTQUNGO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxvRkFBb0Y7SUFDNUUsYUFBYTtRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQzVCLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3pCLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksWUFBWSxDQUFDO1lBQzNDLG9CQUFvQixFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixJQUFJLEtBQUssQ0FBQztZQUMxRCxvQkFBb0IsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUM7WUFDdkQsbUJBQW1CLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDO1lBQ3ZELHNCQUFzQixFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLEVBQUUsQ0FBQztZQUMzRCxxQkFBcUIsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUM7WUFDM0QsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7U0FDeEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdGQUFnRjtJQUN4RSxrQkFBa0I7UUFDeEIsTUFBTSxVQUFVLEdBQW1CLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUQsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLO1lBQ1gsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO1lBQ2QsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLO1lBQ2IsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO1NBQ2YsQ0FBQyxDQUFDLENBQUM7UUFDSixNQUFNLGFBQWEsR0FBbUIscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSztZQUNYLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztZQUNkLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSztZQUNiLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztTQUNmLENBQUMsQ0FBQyxDQUFDO1FBQ0osSUFBSSxDQUFDLHFCQUFxQixHQUFHO1lBQzNCLEdBQUcsRUFBRSxXQUFXO1lBQ2hCLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLE9BQU8sRUFBRSxVQUFVO1NBQ3BCLENBQUM7UUFDRixJQUFJLENBQUMsZ0NBQWdDLEdBQUc7WUFDdEMsR0FBRyxFQUFFLHNCQUFzQjtZQUMzQixXQUFXLEVBQUUsT0FBTztZQUNwQixVQUFVLEVBQUUsS0FBSztZQUNqQixPQUFPLEVBQUUsYUFBYTtTQUN2QixDQUFDO0lBQ0osQ0FBQztJQUVELHNHQUFzRztJQUN0RyxxQkFBcUIsQ0FBQyxXQUFtQixFQUFFLEtBQTZCO1FBQ3RFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCw0RkFBNEY7SUFDcEYsaUJBQWlCO1FBQ3ZCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksWUFBWSxDQUFxQixDQUFDO1FBQ25FLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLENBQXlCLENBQUM7UUFDdEYsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUM7UUFDekQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLENBQUMsQ0FBQyxzQkFBc0IsSUFBSSxFQUFFLENBQUM7UUFDN0QsSUFBSSxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUM7UUFDN0QsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsK0RBQStEO0lBQy9ELElBQUksa0JBQWtCO1FBQ3BCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDM0IsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssUUFBUSxFQUFFO1lBQzFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDO1NBQ2pEO2FBQU0sSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssT0FBTyxFQUFFO1lBQ2hELElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLE9BQU8sQ0FBQyxDQUFDO1NBQ2hEO1FBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyxFQUFFO1lBQ0wsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0Q7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCw4REFBOEQ7SUFDOUQsSUFBSSxvQkFBb0I7UUFDdEIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDTixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztTQUM5QjtRQUNELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FDakMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUN4RSxDQUFDO0lBQ0osQ0FBQztJQUVELDBGQUEwRjtJQUMxRixJQUFJLG1CQUFtQjtRQUNyQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDekMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQ1IsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ2IsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLO1lBQ2pCLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztZQUNkLFFBQVEsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEtBQUssQ0FBQyxDQUFDLEVBQUU7U0FDNUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQsc0RBQXNEO0lBQ3RELElBQUkscUJBQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDUixLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUk7WUFDYixRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFO1lBQzdCLEtBQUssRUFBRSxDQUFDLENBQUMsV0FBVztZQUNwQixRQUFRLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQztTQUN0RSxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxXQUFXLENBQUMsUUFBZ0I7UUFDMUIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsNEJBQTRCLENBQUMsTUFBNEI7UUFDdkQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLHNCQUFzQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxLQUFhO1FBQ2xDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsT0FBZTtRQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsQ0FBQztRQUM1RCxJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25GLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUM1RSxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqRDtJQUNILENBQUM7SUFFRCxlQUFlLENBQUMsT0FBZTtRQUM3QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBWTtRQUM5QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsd0JBQXdCLENBQUMsS0FBYTtRQUNwQyxJQUFJLENBQUMscUJBQXFCLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELG1CQUFtQixDQUFDLE1BQWM7UUFDaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQztRQUNoRSxJQUFJLElBQUksRUFBRTtZQUNSLElBQUksQ0FBQyxxQkFBcUI7Z0JBQ3hCLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2hEO0lBQ0gsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQWM7UUFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELHNCQUFzQixDQUFDLEtBQVk7UUFDakMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLG1CQUFtQixDQUFDLE9BQWU7UUFDakMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSztZQUNuRCxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxHQUFHLEdBQUcsR0FBRyxPQUFPO1lBQzFELENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDWixJQUFJLENBQUMscUJBQXFCLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFakYsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFdBQVcsRUFBRTtZQUNsQyxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDM0g7YUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssYUFBYSxFQUFFO1lBQzNDLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3JJO1FBRUQsd0NBQXdDO1FBQ3hDLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxXQUFXLElBQUksWUFBWSxFQUFFO1lBQ2xELFlBQVksR0FBRyxLQUFLLFlBQVksR0FBRyxDQUFDO1NBQ3JDO2FBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxZQUFZLEVBQUU7WUFDdkQsWUFBWSxHQUFHLEtBQUssWUFBWSxHQUFHLENBQUM7U0FDckM7YUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssYUFBYSxJQUFJLFlBQVksRUFBRTtZQUMzRCxZQUFZLEdBQUcsS0FBSyxZQUFZLEdBQUcsQ0FBQztTQUNyQztRQUNELCtDQUErQztRQUUvQyx1RUFBdUU7UUFDdkUsTUFBTSxNQUFNLEdBQXNCO1lBQ2hDLEtBQUssRUFBRSxZQUFZO1lBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6Qix5REFBeUQ7WUFDekQsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLFNBQVMsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUM1RixvQkFBb0IsRUFBRSxJQUFJLENBQUMsU0FBUyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzVGLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDMUYsNkRBQTZEO1lBQzdELHNCQUFzQixFQUFFLElBQUksQ0FBQyxTQUFTLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDbEcscUJBQXFCLEVBQUUsSUFBSSxDQUFDLFNBQVMsS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNoRyxxREFBcUQ7WUFDckQsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQzNFLENBQUM7UUFFRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUE2QixFQUFDLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBWTtRQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyw2QkFBb0MsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxNQUFNLENBQUMsS0FBWTtRQUNqQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNyQztJQUNILENBQUM7O21IQXRUVSxzQkFBc0IsOEVBK0N2QixtQkFBbUIsYUFDUCxvQkFBb0I7dUdBaEQvQixzQkFBc0IsMllDN0RuQyxzaWVBd1BBOzJGRDNMYSxzQkFBc0I7a0JBTmxDLFNBQVM7K0JBQ0UscUJBQXFCLFFBRXpCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxtQkFDYix1QkFBdUIsQ0FBQyxNQUFNOzswQkFpRDVDLE1BQU07MkJBQUMsbUJBQW1COzswQkFDMUIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxvQkFBb0I7NENBL0NoQyxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUtFLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBURVNUX0RBVEFfTU9EQUxfREFUQSxcbiAgVEVTVF9EQVRBX01PREFMX0VESVRfSU5fREVQVEgsXG4gIFRlc3REYXRhTW9kYWxEYXRhLFxuICBUZXN0RGF0YU1vZGFsVGFiLFxufSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1kYXRhJztcbmltcG9ydCB7IFRFU1RfREFUQV9NT0RBTF9SRUYsIFRlc3REYXRhTW9kYWxSZWYgfSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1yZWYnO1xuaW1wb3J0IHsgVGVzdERhdGFNb2RhbFJlc3VsdCB9IGZyb20gJy4vdGVzdC1kYXRhLW1vZGFsLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTU9DS19FTlZJUk9OTUVOVF9JVEVNUyxcbiAgRW52aXJvbm1lbnRJdGVtLFxufSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1lbnZpcm9ubWVudC5tb2RlbCc7XG5pbXBvcnQge1xuICBNT0NLX1BBUkFNRVRFUlMsXG4gIFBhcmFtZXRlckl0ZW0sXG4gIFBhcmFtZXRlclNjb3BlRmlsdGVyLFxufSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1wYXJhbWV0ZXIubW9kZWwnO1xuaW1wb3J0IHsgQ3FhTGlzdEl0ZW1Db25maWcgfSBmcm9tICcuLi8uLi9pdGVtLWxpc3QvaXRlbS1saXN0Lm1vZGVsJztcblxuY29uc3QgVEFCX1NFR01FTlRTID0gW1xuICB7IGxhYmVsOiAnUGxhaW4gVGV4dCcsIHZhbHVlOiAncGxhaW4tdGV4dCcgfSxcbiAgeyBsYWJlbDogJ1BhcmFtZXRlcicsIHZhbHVlOiAncGFyYW1ldGVyJyB9LFxuICB7IGxhYmVsOiAnRW52aXJvbm1lbnQnLCB2YWx1ZTogJ2Vudmlyb25tZW50JyB9LFxuICB7IGxhYmVsOiAnUnVudGltZScsIHZhbHVlOiAncnVudGltZScgfSxcbl07XG5cbmNvbnN0IFBBUkFNRVRFUl9GSUxURVJfVEFCUzogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogUGFyYW1ldGVyU2NvcGVGaWx0ZXIgfVtdID0gW1xuICB7IGxhYmVsOiAnQWxsJywgdmFsdWU6ICdhbGwnIH0sXG4gIHsgbGFiZWw6ICdHbG9iYWwnLCB2YWx1ZTogJ2dsb2JhbCcgfSxcbiAgeyBsYWJlbDogJ0xvY2FsJywgdmFsdWU6ICdsb2NhbCcgfSxcbl07XG5cbi8qKiBNb2NrIHJ1bnRpbWUgdmFyaWFibGUgc3VnZ2VzdGlvbnMgKHJlcGxhY2Ugd2l0aCBBUEkgd2hlbiBpbnRlZ3JhdGluZykuICovXG5jb25zdCBSVU5USU1FX1NVR0dFU1RFRF9WQUxVRVMgPSBbXG4gICdydW50aW1lLk1heFdhaXRUaW1lJyxcbiAgJ3J1bnRpbWUuc2Vzc2lvbl9pZCcsXG4gICdydW50aW1lLmF1dGhfdG9rZW4nLFxuICAncnVudGltZS5zdGVwX2luZGV4JyxcbiAgJ3J1bnRpbWUudGltZXN0YW1wJyxcbiAgJ3J1bnRpbWUudGVzdF9uYW1lJyxcbl07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZXN0LWRhdGEtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVzdC1kYXRhLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdERhdGFNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBPdXRwdXQoKSBhcHBseSA9IG5ldyBFdmVudEVtaXR0ZXI8e3ZhbHVlOiBzdHJpbmcsIGFjdGl2ZVRhYjogVGVzdERhdGFNb2RhbFRhYn0+KCk7XG4gIEBPdXRwdXQoKSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBlZGl0SW5EZXB0aCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHBhcmFtZXRlckNyZWF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHBhcmFtZXRlckVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGVudmlyb25tZW50Q3JlYXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZW52aXJvbm1lbnRFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgcmVhZG9ubHkgdGFiU2VnbWVudHMgPSBUQUJfU0VHTUVOVFM7XG4gIHJlYWRvbmx5IHBhcmFtZXRlckZpbHRlclRhYnMgPSBQQVJBTUVURVJfRklMVEVSX1RBQlM7XG4gIC8qKiBQYXJhbWV0ZXIgbGlzdCBmcm9tIGlucHV0LCBmYWxscyBiYWNrIHRvIG1vY2sgZGF0YSBpZiBub3QgcHJvdmlkZWQuICovXG4gIEBJbnB1dCgpIHBhcmFtZXRlcnM6IFBhcmFtZXRlckl0ZW1bXSA9IE1PQ0tfUEFSQU1FVEVSUztcbiAgLyoqIEVudmlyb25tZW50IGxpc3QgZnJvbSBpbnB1dCwgZmFsbHMgYmFjayB0byBtb2NrIGRhdGEgaWYgbm90IHByb3ZpZGVkLiAqL1xuICBASW5wdXQoKSBlbnZpcm9ubWVudEl0ZW1zOiBFbnZpcm9ubWVudEl0ZW1bXSA9IE1PQ0tfRU5WSVJPTk1FTlRfSVRFTVM7XG4gIC8qKiBSdW50aW1lIHRhYjogc3VnZ2VzdGVkIHZhcmlhYmxlIGNoaXBzLiAqL1xuICByZWFkb25seSBydW50aW1lU3VnZ2VzdGVkVmFsdWVzOiByZWFkb25seSBzdHJpbmdbXSA9IFJVTlRJTUVfU1VHR0VTVEVEX1ZBTFVFUztcblxuICAvKiogRm9ybSBmb3IgYWxsIG1vZGFsIGNvbnRyb2xzIChzYW1lIHBhdHRlcm4gYXMgTG9vcCBTdGVwIGVkaXRGb3JtKS4gKi9cbiAgZWRpdEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIENhY2hlZCBzZWxlY3QgY29uZmlncyAoc3RhYmxlIHJlZnMsIHNhbWUgbmFtaW5nIGFzIExvb3AgU3RlcDogeHh4U2VsZWN0Q29uZmlnKS4gKi9cbiAgYWN0aXZlVGFiU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBwYXJhbWV0ZXJTY29wZUZpbHRlclNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuICAvKiogTG9jYWwgY29weSBvZiBmb3JtIHZhbHVlIGZvciBDYW5jZWwgcmV2ZXJ0IChzYW1lIHBhdHRlcm4gYXMgTG9vcCBTdGVwIGVkaXRTbmFwc2hvdCkuICovXG4gIHByaXZhdGUgZWRpdFNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIC8qKiBTdGF0ZSBkZXJpdmVkIGZyb20gY29uZmlnL2VkaXRGb3JtIGZvciB0ZW1wbGF0ZSBhbmQgZ2V0dGVycyAobWlycm9ycyBMb29wIFN0ZXAgaW5wdXRzKS4gKi9cbiAgYWN0aXZlVGFiOiBUZXN0RGF0YU1vZGFsVGFiID0gJ3BsYWluLXRleHQnO1xuICB2YWx1ZSA9ICcnO1xuICBoZWxwVXJsID0gJyc7XG4gIGhlbHBUb29sdGlwVGV4dCA9ICdOb3Qgc3VyZSB3aGF0IHRvIGRvPyBDbGljayB0byBnbyB0byBvdXIgZGV0YWlsZWQgc3RlcCBjcmVhdGlvbiBkb2N1bWVudGF0aW9uJztcbiAgc2hvd0hlbHBUb29sdGlwID0gZmFsc2U7XG5cbiAgcGFyYW1ldGVyU2NvcGVGaWx0ZXI6IFBhcmFtZXRlclNjb3BlRmlsdGVyID0gJ2FsbCc7XG4gIHBhcmFtZXRlclNlYXJjaFF1ZXJ5ID0gJyc7XG4gIHNlbGVjdGVkUGFyYW1ldGVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGVudmlyb25tZW50U2VhcmNoUXVlcnkgPSAnJztcbiAgc2VsZWN0ZWRFbnZpcm9ubWVudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBydW50aW1lVmFsdWUgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEluamVjdChURVNUX0RBVEFfTU9EQUxfUkVGKSBwcml2YXRlIHJlZjogVGVzdERhdGFNb2RhbFJlZjxUZXN0RGF0YU1vZGFsUmVzdWx0PixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRFU1RfREFUQV9NT0RBTF9EQVRBKSBkYXRhPzogVGVzdERhdGFNb2RhbERhdGFcbiAgKSB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBkYXRhLnZhbHVlID8/ICcnO1xuICAgICAgdGhpcy5oZWxwVXJsID0gZGF0YS5oZWxwVXJsID8/ICcnO1xuICAgICAgdGhpcy5hY3RpdmVUYWIgPSAoZGF0YS5hY3RpdmVUYWIgPz8gJ3BsYWluLXRleHQnKSBhcyBUZXN0RGF0YU1vZGFsVGFiO1xuICAgICAgdGhpcy5wYXJhbWV0ZXJTY29wZUZpbHRlciA9IGRhdGEucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPz8gJ2FsbCc7XG4gICAgICB0aGlzLnBhcmFtZXRlclNlYXJjaFF1ZXJ5ID0gZGF0YS5wYXJhbWV0ZXJTZWFyY2hRdWVyeSA/PyAnJztcbiAgICAgIHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA9IGRhdGEuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA/PyBudWxsO1xuICAgICAgdGhpcy5lbnZpcm9ubWVudFNlYXJjaFF1ZXJ5ID0gZGF0YS5lbnZpcm9ubWVudFNlYXJjaFF1ZXJ5ID8/ICcnO1xuICAgICAgdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgPSBkYXRhLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA/PyBudWxsO1xuICAgICAgdGhpcy5ydW50aW1lVmFsdWUgPSBkYXRhLnJ1bnRpbWVWYWx1ZSA/PyAnJztcbiAgICAgIC8vIFNldCBwYXJhbWV0ZXJzIGFuZCBlbnZpcm9ubWVudEl0ZW1zIGZyb20gZGF0YSBpZiBwcm92aWRlZFxuICAgICAgaWYgKGRhdGEucGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucGFyYW1ldGVycyA9IGRhdGEucGFyYW1ldGVycztcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmVudmlyb25tZW50SXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmVudmlyb25tZW50SXRlbXMgPSBkYXRhLmVudmlyb25tZW50SXRlbXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5idWlsZEVkaXRGb3JtKCk7XG4gICAgdGhpcy5idWlsZFNlbGVjdENvbmZpZ3MoKTtcbiAgICB0aGlzLmVkaXRTbmFwc2hvdCA9IHsgLi4udGhpcy5lZGl0Rm9ybS52YWx1ZSB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIGZvcm0gd2l0aCBhbGwgY29udHJvbCB2YWx1ZXMgKHNhbWUgcGF0dGVybiBhcyBMb29wIFN0ZXAgYnVpbGRFZGl0Rm9ybSkuICovXG4gIHByaXZhdGUgYnVpbGRFZGl0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICB2YWx1ZTogW3RoaXMudmFsdWUgPz8gJyddLFxuICAgICAgYWN0aXZlVGFiOiBbdGhpcy5hY3RpdmVUYWIgPz8gJ3BsYWluLXRleHQnXSxcbiAgICAgIHBhcmFtZXRlclNjb3BlRmlsdGVyOiBbdGhpcy5wYXJhbWV0ZXJTY29wZUZpbHRlciA/PyAnYWxsJ10sXG4gICAgICBwYXJhbWV0ZXJTZWFyY2hRdWVyeTogW3RoaXMucGFyYW1ldGVyU2VhcmNoUXVlcnkgPz8gJyddLFxuICAgICAgc2VsZWN0ZWRQYXJhbWV0ZXJJZDogW3RoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA/PyBudWxsXSxcbiAgICAgIGVudmlyb25tZW50U2VhcmNoUXVlcnk6IFt0aGlzLmVudmlyb25tZW50U2VhcmNoUXVlcnkgPz8gJyddLFxuICAgICAgc2VsZWN0ZWRFbnZpcm9ubWVudElkOiBbdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgPz8gbnVsbF0sXG4gICAgICBydW50aW1lVmFsdWU6IFt0aGlzLnJ1bnRpbWVWYWx1ZSA/PyAnJ10sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQnVpbGQgc2VsZWN0IGNvbmZpZ3Mgb25jZSAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBidWlsZFNlbGVjdENvbmZpZ3MpLiAqL1xuICBwcml2YXRlIGJ1aWxkU2VsZWN0Q29uZmlncygpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFRBQl9TRUdNRU5UUy5tYXAoKHMpID0+ICh7XG4gICAgICBpZDogcy52YWx1ZSxcbiAgICAgIHZhbHVlOiBzLnZhbHVlLFxuICAgICAgbmFtZTogcy5sYWJlbCxcbiAgICAgIGxhYmVsOiBzLmxhYmVsLFxuICAgIH0pKTtcbiAgICBjb25zdCBmaWx0ZXJPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFBBUkFNRVRFUl9GSUxURVJfVEFCUy5tYXAoKHMpID0+ICh7XG4gICAgICBpZDogcy52YWx1ZSxcbiAgICAgIHZhbHVlOiBzLnZhbHVlLFxuICAgICAgbmFtZTogcy5sYWJlbCxcbiAgICAgIGxhYmVsOiBzLmxhYmVsLFxuICAgIH0pKTtcbiAgICB0aGlzLmFjdGl2ZVRhYlNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2FjdGl2ZVRhYicsXG4gICAgICBwbGFjZWhvbGRlcjogJ1RhYicsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRhYk9wdGlvbnMsXG4gICAgfTtcbiAgICB0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAncGFyYW1ldGVyU2NvcGVGaWx0ZXInLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTY29wZScsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IGZpbHRlck9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgZm9ybSBjb250cm9sIGFuZCBzeW5jIGNvbXBvbmVudCBzdGF0ZSAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBvbkVkaXRGb3JtRmllbGRDaGFuZ2UpLiAqL1xuICBvbkVkaXRGb3JtRmllbGRDaGFuZ2UoY29udHJvbE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtLmdldChjb250cm9sTmFtZSk/LnNldFZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLnN5bmNTdGF0ZUZyb21Gb3JtKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogU3luYyBjb21wb25lbnQgc3RhdGUgZnJvbSBlZGl0Rm9ybSBzbyBnZXR0ZXJzIChlLmcuIGZpbHRlcmVkUGFyYW1ldGVycykgc3RheSBjb3JyZWN0LiAqL1xuICBwcml2YXRlIHN5bmNTdGF0ZUZyb21Gb3JtKCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLmVkaXRGb3JtLnZhbHVlO1xuICAgIHRoaXMudmFsdWUgPSB2LnZhbHVlID8/ICcnO1xuICAgIHRoaXMuYWN0aXZlVGFiID0gKHYuYWN0aXZlVGFiID8/ICdwbGFpbi10ZXh0JykgYXMgVGVzdERhdGFNb2RhbFRhYjtcbiAgICB0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyID0gKHYucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPz8gJ2FsbCcpIGFzIFBhcmFtZXRlclNjb3BlRmlsdGVyO1xuICAgIHRoaXMucGFyYW1ldGVyU2VhcmNoUXVlcnkgPSB2LnBhcmFtZXRlclNlYXJjaFF1ZXJ5ID8/ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA9IHYuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA/PyBudWxsO1xuICAgIHRoaXMuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA9IHYuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA/PyAnJztcbiAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IHYuc2VsZWN0ZWRFbnZpcm9ubWVudElkID8/IG51bGw7XG4gICAgdGhpcy5ydW50aW1lVmFsdWUgPSB2LnJ1bnRpbWVWYWx1ZSA/PyAnJztcbiAgfVxuXG4gIC8qKiBGaWx0ZXJlZCBwYXJhbWV0ZXJzIGJ5IHNjb3BlIGFuZCBzZWFyY2ggKFBhcmFtZXRlciB0YWIpLiAqL1xuICBnZXQgZmlsdGVyZWRQYXJhbWV0ZXJzKCk6IFBhcmFtZXRlckl0ZW1bXSB7XG4gICAgbGV0IGxpc3QgPSB0aGlzLnBhcmFtZXRlcnM7XG4gICAgaWYgKHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPT09ICdnbG9iYWwnKSB7XG4gICAgICBsaXN0ID0gbGlzdC5maWx0ZXIoKHApID0+IHAuc2NvcGUgPT09ICdHbG9iYWwnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPT09ICdsb2NhbCcpIHtcbiAgICAgIGxpc3QgPSBsaXN0LmZpbHRlcigocCkgPT4gcC5zY29wZSA9PT0gJ0xvY2FsJyk7XG4gICAgfVxuICAgIGNvbnN0IHEgPSB0aGlzLnBhcmFtZXRlclNlYXJjaFF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChxKSB7XG4gICAgICBsaXN0ID0gbGlzdC5maWx0ZXIoKHApID0+IHAubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICAvKiogRmlsdGVyZWQgZW52aXJvbm1lbnQgaXRlbXMgYnkgc2VhcmNoIChFbnZpcm9ubWVudCB0YWIpLiAqL1xuICBnZXQgZmlsdGVyZWRFbnZpcm9ubWVudHMoKTogRW52aXJvbm1lbnRJdGVtW10ge1xuICAgIGNvbnN0IHEgPSB0aGlzLmVudmlyb25tZW50U2VhcmNoUXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFxKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudEl0ZW1zO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudEl0ZW1zLmZpbHRlcihcbiAgICAgIChlKSA9PlxuICAgICAgICBlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fCBlLnZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSlcbiAgICApO1xuICB9XG5cbiAgLyoqIFBhcmFtZXRlciB0YWI6IGxpc3QgY29uZmlnIGZvciBjcWEtaXRlbS1saXN0IChzZWFyY2gtZnJpZW5kbHk6IGJpbmQgZmlsdGVyZWQgbGlzdCkuICovXG4gIGdldCBwYXJhbWV0ZXJMaXN0Q29uZmlnKCk6IENxYUxpc3RJdGVtQ29uZmlnW10ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUGFyYW1ldGVycy5tYXAoKHApID0+ICh7XG4gICAgICBpZDogcC5pZCxcbiAgICAgIHRpdGxlOiBwLm5hbWUsXG4gICAgICBzdWJ0aXRsZTogcC52YWx1ZSxcbiAgICAgIGJhZGdlOiBwLnNjb3BlLFxuICAgICAgc2hvd0VkaXQ6IHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA9PT0gcC5pZCxcbiAgICB9KSk7XG4gIH1cblxuICAvKiogRW52aXJvbm1lbnQgdGFiOiBsaXN0IGNvbmZpZyBmb3IgY3FhLWl0ZW0tbGlzdC4gKi9cbiAgZ2V0IGVudmlyb25tZW50TGlzdENvbmZpZygpOiBDcWFMaXN0SXRlbUNvbmZpZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZEVudmlyb25tZW50cy5tYXAoKGUpID0+ICh7XG4gICAgICBpZDogZS5pZCxcbiAgICAgIHRpdGxlOiBlLm5hbWUsXG4gICAgICBzdWJ0aXRsZTogYFZhbHVlOiAke2UudmFsdWV9YCxcbiAgICAgIGJhZGdlOiBlLmVudmlyb25tZW50LFxuICAgICAgc2hvd0VkaXQ6IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkID09PSBlLmlkICYmIChlLmVkaXRhYmxlID8/IHRydWUpLFxuICAgIH0pKTtcbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKHRhYlZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9uRWRpdEZvcm1GaWVsZENoYW5nZSgnYWN0aXZlVGFiJywgdGFiVmFsdWUpO1xuICB9XG5cbiAgb25QYXJhbWV0ZXJTY29wZUZpbHRlckNoYW5nZShmaWx0ZXI6IFBhcmFtZXRlclNjb3BlRmlsdGVyKTogdm9pZCB7XG4gICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3BhcmFtZXRlclNjb3BlRmlsdGVyJywgZmlsdGVyKTtcbiAgfVxuXG4gIG9uUGFyYW1ldGVyU2VhcmNoSW5wdXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdwYXJhbWV0ZXJTZWFyY2hRdWVyeScsIHZhbHVlKTtcbiAgfVxuXG4gIG9uUGFyYW1ldGVyU2VsZWN0KHBhcmFtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmFtID0gdGhpcy5wYXJhbWV0ZXJzLmZpbmQoKHApID0+IHAuaWQgPT09IHBhcmFtSWQpO1xuICAgIGlmIChwYXJhbSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID0gdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID09PSBwYXJhbS5pZCA/IG51bGwgOiBwYXJhbS5pZDtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdzZWxlY3RlZFBhcmFtZXRlcklkJywgdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkKTtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCd2YWx1ZScsIHBhcmFtLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFyYW1ldGVyRWRpdChwYXJhbUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmFtZXRlckVkaXQuZW1pdChwYXJhbUlkKTtcbiAgfVxuXG4gIG9uQ3JlYXRlTmV3VmFyaWFibGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnBhcmFtZXRlckNyZWF0ZS5lbWl0KCk7XG4gIH1cblxuICBvbkVudmlyb25tZW50U2VhcmNoSW5wdXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdlbnZpcm9ubWVudFNlYXJjaFF1ZXJ5JywgdmFsdWUpO1xuICB9XG5cbiAgb25FbnZpcm9ubWVudFNlbGVjdChpdGVtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmVudmlyb25tZW50SXRlbXMuZmluZCgoZSkgPT4gZS5pZCA9PT0gaXRlbUlkKTtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgPVxuICAgICAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9PT0gaXRlbS5pZCA/IG51bGwgOiBpdGVtLmlkO1xuICAgICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3NlbGVjdGVkRW52aXJvbm1lbnRJZCcsIHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkKTtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCd2YWx1ZScsIGl0ZW0ubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgb25FbnZpcm9ubWVudEVkaXQoaXRlbUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmVudmlyb25tZW50RWRpdC5lbWl0KGl0ZW1JZCk7XG4gIH1cblxuICBvbkNyZWF0ZU5ld0Vudmlyb25tZW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5lbnZpcm9ubWVudENyZWF0ZS5lbWl0KCk7XG4gIH1cblxuICAvKiogUnVudGltZSB0YWI6IGluc2VydCBzdWdnZXN0ZWQgdmFsdWUgaW50byB0aGUgcnVudGltZSBpbnB1dCBmaWVsZC4gKi9cbiAgb25SdW50aW1lQ2hpcEluc2VydChzbmlwcGV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3J1bnRpbWVWYWx1ZScpPy52YWx1ZVxuICAgICAgPyB0aGlzLmVkaXRGb3JtLmdldCgncnVudGltZVZhbHVlJyk/LnZhbHVlICsgJyAnICsgc25pcHBldFxuICAgICAgOiBzbmlwcGV0O1xuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdydW50aW1lVmFsdWUnLCBuZXh0KTtcbiAgfVxuXG4gIG9uQXBwbHkoKTogdm9pZCB7XG4gICAgdGhpcy5zeW5jU3RhdGVGcm9tRm9ybSgpO1xuICAgIGxldCB2YWx1ZVRvQXBwbHkgPSB0aGlzLmFjdGl2ZVRhYiA9PT0gJ3J1bnRpbWUnID8gdGhpcy5ydW50aW1lVmFsdWUgOiB0aGlzLnZhbHVlO1xuXG4gICAgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJykge1xuICAgICAgdmFsdWVUb0FwcGx5ID0gdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID8gdGhpcy5wYXJhbWV0ZXJzLmZpbmQoKHApID0+IHAuaWQgPT09IHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCk/Lm5hbWUgPz8gJycgOiAnJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAnZW52aXJvbm1lbnQnKSB7XG4gICAgICB2YWx1ZVRvQXBwbHkgPSB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA/IHRoaXMuZW52aXJvbm1lbnRJdGVtcy5maW5kKChlKSA9PiBlLmlkID09PSB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCk/Lm5hbWUgPz8gJycgOiAnJztcbiAgICB9XG5cbiAgICAvLyBXcmFwIHZhbHVlVG9BcHBseSBiYXNlZCBvbiBhY3RpdmUgdGFiXG4gICAgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJyAmJiB2YWx1ZVRvQXBwbHkpIHtcbiAgICAgIHZhbHVlVG9BcHBseSA9IGBAfCR7dmFsdWVUb0FwcGx5fXxgO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdydW50aW1lJyAmJiB2YWx1ZVRvQXBwbHkpIHtcbiAgICAgIHZhbHVlVG9BcHBseSA9IGAkfCR7dmFsdWVUb0FwcGx5fXxgO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdlbnZpcm9ubWVudCcgJiYgdmFsdWVUb0FwcGx5KSB7XG4gICAgICB2YWx1ZVRvQXBwbHkgPSBgKnwke3ZhbHVlVG9BcHBseX18YDtcbiAgICB9XG4gICAgLy8gcGxhaW4tdGV4dCB0YWI6IG5vIHdyYXBwaW5nLCB1c2UgdmFsdWUgYXMgaXNcblxuICAgIC8vIEJ1aWxkIHJlc3VsdCB3aXRoIG9ubHkgdGhlIGFjdGl2ZSB0YWIncyBkYXRhLCBjbGVhciBvdGhlciB0YWJzJyBkYXRhXG4gICAgY29uc3QgcmVzdWx0OiBUZXN0RGF0YU1vZGFsRGF0YSA9IHtcbiAgICAgIHZhbHVlOiB2YWx1ZVRvQXBwbHksXG4gICAgICBhY3RpdmVUYWI6IHRoaXMuYWN0aXZlVGFiLFxuICAgICAgLy8gT25seSBpbmNsdWRlIHBhcmFtZXRlciBkYXRhIGlmIHBhcmFtZXRlciB0YWIgaXMgYWN0aXZlXG4gICAgICBwYXJhbWV0ZXJTY29wZUZpbHRlcjogdGhpcy5hY3RpdmVUYWIgPT09ICdwYXJhbWV0ZXInID8gdGhpcy5wYXJhbWV0ZXJTY29wZUZpbHRlciA6IHVuZGVmaW5lZCxcbiAgICAgIHBhcmFtZXRlclNlYXJjaFF1ZXJ5OiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ3BhcmFtZXRlcicgPyB0aGlzLnBhcmFtZXRlclNlYXJjaFF1ZXJ5IDogdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0ZWRQYXJhbWV0ZXJJZDogdGhpcy5hY3RpdmVUYWIgPT09ICdwYXJhbWV0ZXInID8gdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkIDogdW5kZWZpbmVkLFxuICAgICAgLy8gT25seSBpbmNsdWRlIGVudmlyb25tZW50IGRhdGEgaWYgZW52aXJvbm1lbnQgdGFiIGlzIGFjdGl2ZVxuICAgICAgZW52aXJvbm1lbnRTZWFyY2hRdWVyeTogdGhpcy5hY3RpdmVUYWIgPT09ICdlbnZpcm9ubWVudCcgPyB0aGlzLmVudmlyb25tZW50U2VhcmNoUXVlcnkgOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3RlZEVudmlyb25tZW50SWQ6IHRoaXMuYWN0aXZlVGFiID09PSAnZW52aXJvbm1lbnQnID8gdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgOiB1bmRlZmluZWQsXG4gICAgICAvLyBPbmx5IGluY2x1ZGUgcnVudGltZSBkYXRhIGlmIHJ1bnRpbWUgdGFiIGlzIGFjdGl2ZVxuICAgICAgcnVudGltZVZhbHVlOiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ3J1bnRpbWUnID8gdGhpcy5ydW50aW1lVmFsdWUgOiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIHRoaXMuYXBwbHkuZW1pdCh7dmFsdWU6IHZhbHVlVG9BcHBseSwgYWN0aXZlVGFiOiB0aGlzLmFjdGl2ZVRhYiBhcyBUZXN0RGF0YU1vZGFsVGFifSk7XG4gICAgdGhpcy5yZWYuY2xvc2UocmVzdWx0KTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZSh0aGlzLmVkaXRTbmFwc2hvdCk7XG4gICAgdGhpcy5zeW5jU3RhdGVGcm9tRm9ybSgpO1xuICAgIHRoaXMuY2FuY2VsLmVtaXQoKTtcbiAgICB0aGlzLnJlZi5jbG9zZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2FuY2VsKCk7XG4gIH1cblxuICBvbkVkaXRJbkRlcHRoKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5lZGl0SW5EZXB0aC5lbWl0KCk7XG4gICAgdGhpcy5yZWYuY2xvc2UoVEVTVF9EQVRBX01PREFMX0VESVRfSU5fREVQVEggYXMgYW55KTtcbiAgfVxuXG4gIG9uSGVscChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oZWxwVXJsKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgd2luZG93Lm9wZW4odGhpcy5oZWxwVXJsLCAnX2JsYW5rJyk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiY3FhLWJnLXdoaXRlIGNxYS1yb3VuZGVkLVsxMnB4XSBjcWEtc2hhZG93LWxnIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFN0VCXSBjcWEtdy1bNTAwcHhdIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLVsxMnB4XSBjcWEtcC0yIGNxYS1ib3gtYm9yZGVyIGNxYS1taW4taC0wXCI+XG4gIDwhLS0gSGVhZGVyOiB0aXRsZSBsZWZ0OyBOZWVkIGhlbHA/ICsgY2xvc2UgaWNvbiByaWdodCAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTIgY3FhLXB4LTRcIj5cbiAgICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1bMTZweF0gY3FhLWxlYWRpbmctWzI0cHhdIGNxYS1mb250LWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTAgY3FhLWZvbnQtWzYwMF1cIj5cbiAgICAgIFRlc3QgRGF0YVxuICAgIDwvaDI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1taW4taC1bMjhweF1cIj5cbiAgICAgIDwhLS0gTmVlZCBoZWxwPyB3aXRoIGN1c3RvbSB0b29sdGlwICh3b3JrcyBpbnNpZGUgb3ZlcmxheSkgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwic2hvd0hlbHBUb29sdGlwID0gdHJ1ZVwiIChtb3VzZWxlYXZlKT1cInNob3dIZWxwVG9vbHRpcCA9IGZhbHNlXCI+XG4gICAgICAgIDxhICpuZ0lmPVwiaGVscFVybFwiIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uSGVscCgkZXZlbnQpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIxcHhdIGNxYS1uby11bmRlcmxpbmUgaG92ZXI6Y3FhLXVuZGVybGluZSBjcWEtY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTcgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI3Rlc3QtZGF0YS1oZWxwLWNsaXApXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC41MDAzMyAxNC42NjYzQzEyLjQxMjMgMTQuNjY2MyAxNS41ODM3IDExLjY4MTYgMTUuNTgzNyA3Ljk5OTY3QzE1LjU4MzcgNC4zMTc3OCAxMi40MTIzIDEuMzMzMDEgOC41MDAzMyAxLjMzMzAxQzQuNTg4MzEgMS4zMzMwMSAxLjQxNjk5IDQuMzE3NzggMS40MTY5OSA3Ljk5OTY3QzEuNDE2OTkgMTEuNjgxNiA0LjU4ODMxIDE0LjY2NjMgOC41MDAzMyAxNC42NjYzWlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjQzODQ4IDYuMDAwMzhDNi42MDUwMSA1LjU1NDgzIDYuOTMzNzEgNS4xNzkxMiA3LjM2NjM2IDQuOTM5OEM3Ljc5OTAxIDQuNzAwNDkgOC4zMDc2OSA0LjYxMzAxIDguODAyMzEgNC42OTI4NUM5LjI5NjkzIDQuNzcyNyA5Ljc0NTU2IDUuMDE0NzMgMTAuMDY4NyA1LjM3NjA3QzEwLjM5MTkgNS43Mzc0IDEwLjU2ODggNi4xOTQ3MyAxMC41NjgxIDYuNjY3MDVDMTAuNTY4MSA4LjAwMDM4IDguNDQzMDYgOC42NjcwNSA4LjQ0MzA2IDguNjY3MDVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC41IDExLjMzM0g4LjUwOTY2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cInRlc3QtZGF0YS1oZWxwLWNsaXBcIj5cbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwid2hpdGVcIi8+XG4gICAgICAgICAgICAgIDwvY2xpcFBhdGg+XG4gICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgTmVlZCBoZWxwID9cbiAgICAgICAgPC9hPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFoZWxwVXJsXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1mb250LVs1MDBdIGNxYS10ZXh0LVsxMHB4XSBjcWEtY3Vyc29yLWRlZmF1bHRcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTcgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wIGNxYS10ZXh0LVsjM0Y0M0VFXVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCN0ZXN0LWRhdGEtaGVscC1jbGlwLW5vbGluaylcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjUwMDMzIDE0LjY2NjNDMTIuNDEyMyAxNC42NjYzIDE1LjU4MzcgMTEuNjgxNiAxNS41ODM3IDcuOTk5NjdDMTUuNTgzNyA0LjMxNzc4IDEyLjQxMjMgMS4zMzMwMSA4LjUwMDMzIDEuMzMzMDFDNC41ODgzMSAxLjMzMzAxIDEuNDE2OTkgNC4zMTc3OCAxLjQxNjk5IDcuOTk5NjdDMS40MTY5OSAxMS42ODE2IDQuNTg4MzEgMTQuNjY2MyA4LjUwMDMzIDE0LjY2NjNaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuNDM4NDggNi4wMDAzOEM2LjYwNTAxIDUuNTU0ODMgNi45MzM3MSA1LjE3OTEyIDcuMzY2MzYgNC45Mzk4QzcuNzk5MDEgNC43MDA0OSA4LjMwNzY5IDQuNjEzMDEgOC44MDIzMSA0LjY5Mjg1QzkuMjk2OTMgNC43NzI3IDkuNzQ1NTYgNS4wMTQ3MyAxMC4wNjg3IDUuMzc2MDdDMTAuMzkxOSA1LjczNzQgMTAuNTY4OCA2LjE5NDczIDEwLjU2ODEgNi42NjcwNUMxMC41NjgxIDguMDAwMzggOC40NDMwNiA4LjY2NzA1IDguNDQzMDYgOC42NjcwNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjUgMTEuMzMzSDguNTA5NjZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwidGVzdC1kYXRhLWhlbHAtY2xpcC1ub2xpbmtcIj5cbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwid2hpdGVcIi8+XG4gICAgICAgICAgICAgIDwvY2xpcFBhdGg+XG4gICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgTmVlZCBoZWxwID9cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8IS0tIEN1c3RvbSB0b29sdGlwIChleGFjdCBzcGVjOiAzMDbDlzIwIGNvbnRlbnQsIDZweCByYWRpdXMsICMwQTBBMEEsIG5vIGFycm93KSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dIZWxwVG9vbHRpcFwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotWzEwMF0gY3FhLXRvcC1bLTI0cHhdIGNxYS1sZWZ0LVstMTI1cHhdXCJcbiAgICAgICAgICByb2xlPVwidG9vbHRpcFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtd2hpdGUgY3FhLXRleHQtY2VudGVyIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtdy1bMzA2cHhdIGNxYS1taW4taC1bMjBweF0gY3FhLXJvdW5kZWQtWzZweF0gY3FhLXB5LTEgY3FhLXB4LTIgY3FhLWJnLVsjMEEwQTBBXSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLXRleHQtWzhweF1cIj5cbiAgICAgICAgICAgIHt7IGhlbHBUb29sdGlwVGV4dCB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW1pbi1oLVsyOHB4XSBjcWEtbWluLXctWzI4cHhdIGNxYS1yb3VuZGVkIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtYmctWyNGM0Y0RjZdIGNxYS1wLTBcIlxuICAgICAgICB0aXRsZT1cIkNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy01ICFjcWEtaC01ICFjcWEtdGV4dC1bMjBweF0gIWNxYS1ibG9jayAhY3FhLWxlYWRpbmctbm9uZVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIExpbmUgYmVsb3cgaGVhZGVyIChmdWxsIHdpZHRoIG9mIG1vZGFsLCBubyBzaWRlIG1hcmdpbikgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtLW14LTIgY3FhLXctW2NhbGMoMTAwJSsxcmVtKV0gY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWgtcHggY3FhLXctZnVsbCBjcWEtYmctWyNFNUU3RUJdXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIFRhYnM6IFBsYWluIFRleHQsIFBhcmFtZXRlciwgRW52aXJvbm1lbnQsIFJ1bnRpbWUgKGJvdW5kIHRvIGVkaXRGb3JtIGxpa2UgTG9vcCBTdGVwKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLXRlc3QtZGF0YS1tb2RhbC10YWJzXCI+XG4gICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgIFtzZWdtZW50c109XCJ0YWJTZWdtZW50c1wiXG4gICAgICBbdmFsdWVdPVwiZWRpdEZvcm0uZ2V0KCdhY3RpdmVUYWInKT8udmFsdWUgPz8gYWN0aXZlVGFiXCJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblRhYkNoYW5nZSgkZXZlbnQpXCI+XG4gICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICA8L2Rpdj5cblxuICA8IS0tIENvbnRlbnQgcGVyIHRhYjogZmxleC0xIG1pbi1oLTAgc28gUGFyYW1ldGVyL0Vudmlyb25tZW50L1J1bnRpbWUgY29udGVudCBjYW4gc2Nyb2xsIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4taC0wXCJcbiAgICBbY2xhc3MuY3FhLWZsZXgtMV09XCJhY3RpdmVUYWIgPT09ICdwYXJhbWV0ZXInIHx8IGFjdGl2ZVRhYiA9PT0gJ2Vudmlyb25tZW50JyB8fCBhY3RpdmVUYWIgPT09ICdydW50aW1lJ1wiPlxuICAgIDwhLS0gUGxhaW4gVGV4dCB0YWIgKGZvcm0tYm91bmQgbGlrZSBMb29wIFN0ZXAgZWRpdEZvcm0gKyBvbkVkaXRGb3JtRmllbGRDaGFuZ2UpIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdwbGFpbi10ZXh0J1wiPlxuICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgbGFiZWw9XCJWYWx1ZVwiXG4gICAgICAgIFt2YWx1ZV09XCJlZGl0Rm9ybS5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRWRpdEZvcm1GaWVsZENoYW5nZSgndmFsdWUnLCAkZXZlbnQpXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJodHRwczovL2V4YW1wbGUuY29tL2Rhc2hib2FyZFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIHNpemU9XCJtZFwiPlxuICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtbS0wXCI+XG4gICAgICAgIEVudGVyIGEgc3RhdGljIHRleHQgdmFsdWUgdGhhdCB3b24ndCBjaGFuZ2UgZHVyaW5nIGV4ZWN1dGlvbi5cbiAgICAgIDwvcD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gUGFyYW1ldGVyIHRhYjogVmFyaWFibGUgTGlicmFyeSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLW1pbi1oLTAgY3FhLWZsZXgtMSBjcWEtbWluLWgtWzE4cmVtXVwiPlxuICAgICAgICA8IS0tIFZhcmlhYmxlIExpYnJhcnkgaGVhZGVyIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyMHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMFwiPlxuICAgICAgICAgICAgVmFyaWFibGUgTGlicmFyeVxuICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwib25DcmVhdGVOZXdWYXJpYWJsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1uby11bmRlcmxpbmUgaG92ZXI6Y3FhLW9wYWNpdHktOTAgY3FhLWN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICBDcmVhdGUgTmV3ICtcbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIEZpbHRlciB0YWJzOiBBbGwsIEdsb2JhbCwgTG9jYWwgKGJsdWUgdW5kZXJsaW5lIHVuZGVyIGFjdGl2ZSBsYWJlbCBvbmx5KSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCB0YWIgb2YgcGFyYW1ldGVyRmlsdGVyVGFic1wiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUGFyYW1ldGVyU2NvcGVGaWx0ZXJDaGFuZ2UodGFiLnZhbHVlKVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXB5LTAgY3FhLXB4LTMgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS10ZXh0LVsjNkI3MjgwXV09XCJwYXJhbWV0ZXJTY29wZUZpbHRlciAhPT0gdGFiLnZhbHVlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXN0LWRhdGEtcGFyYW0tZmlsdGVyLWxhYmVsIGNxYS1pbmxpbmUtYmxvY2sgY3FhLXBiLTAuNVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5jcWEtdGVzdC1kYXRhLXBhcmFtLWZpbHRlci1hY3RpdmVdPVwicGFyYW1ldGVyU2NvcGVGaWx0ZXIgPT09IHRhYi52YWx1ZVwiPlxuICAgICAgICAgICAgICB7eyB0YWIubGFiZWwgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gU2VhcmNoOiBib3VuZCB0byBlZGl0Rm9ybSAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBjb250cm9sIGJpbmRpbmcpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXJlbGF0aXZlIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC00IGNxYS10b3AtMCBjcWEtYm90dG9tLTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXRleHQtWyM2QjcyODBdIGNxYS1sZWFkaW5nLW5vbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy00ICFjcWEtaC00ICFjcWEtdGV4dC1bMTZweF1cIj5zZWFyY2g8L21hdC1pY29uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJlZGl0Rm9ybS5nZXQoJ3BhcmFtZXRlclNlYXJjaFF1ZXJ5Jyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJvblBhcmFtZXRlclNlYXJjaElucHV0KCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGxpYnJhcnlcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGVzdC1kYXRhLXNlYXJjaC1pbnB1dCBjcWEtdy1mdWxsIGNxYS1wbC0xMCBjcWEtcHItNCBjcWEtcHktMi41IGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLTUgY3FhLXRleHQtWyMwQTBBMEFdIHBsYWNlaG9sZGVyOmNxYS10ZXh0LVsjOUNBM0FGXSBmb2N1czpjcWEtb3V0bGluZS1ub25lIGZvY3VzOmNxYS1ib3JkZXItWyMzQjgyRjZdIGZvY3VzOmNxYS1yaW5nLTEgZm9jdXM6Y3FhLXJpbmctWyMzQjgyRjZdXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTZWFyY2ggbGlicmFyeVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gUGFyYW1ldGVyIGxpc3QgKHNjcm9sbGFibGUsIHNlYXJjaC1pbnRlZ3JhdGVkIHZpYSBmaWx0ZXJlZCBsaXN0IGJpbmRpbmcpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1pbi1oLVsyMDBweF0gY3FhLWZsZXgtMSBjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgICAgICA8Y3FhLWl0ZW0tbGlzdFxuICAgICAgICAgICAgW2l0ZW1zXT1cInBhcmFtZXRlckxpc3RDb25maWdcIlxuICAgICAgICAgICAgW3NlbGVjdGVkSWRdPVwic2VsZWN0ZWRQYXJhbWV0ZXJJZFwiXG4gICAgICAgICAgICBlbXB0eU1lc3NhZ2U9XCJObyBwYXJhbWV0ZXJzIG1hdGNoIHlvdXIgc2VhcmNoLlwiXG4gICAgICAgICAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIChpdGVtU2VsZWN0KT1cIm9uUGFyYW1ldGVyU2VsZWN0KCRldmVudClcIlxuICAgICAgICAgICAgKGl0ZW1FZGl0KT1cIm9uUGFyYW1ldGVyRWRpdCgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtaXRlbS1saXN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBFbnZpcm9ubWVudCB0YWI6IFZhcmlhYmxlIGxpYnJhcnkgYnkgZW52aXJvbm1lbnQgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ2Vudmlyb25tZW50J1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLW1pbi1oLTAgY3FhLWZsZXgtMSBjcWEtbWluLWgtWzE4cmVtXVwiPlxuICAgICAgICA8IS0tIFNlY3Rpb24gaGVhZGVyIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyMHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMFwiPlxuICAgICAgICAgICAgRW52aXJvbm1lbnRcbiAgICAgICAgICA8L2gzPlxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uQ3JlYXRlTmV3RW52aXJvbm1lbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtbm8tdW5kZXJsaW5lIGhvdmVyOmNxYS1vcGFjaXR5LTkwIGNxYS1jdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgQ3JlYXRlIE5ldyArXG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBTZWFyY2g6IGJvdW5kIHRvIGVkaXRGb3JtIChzYW1lIHBhdHRlcm4gYXMgTG9vcCBTdGVwIGNvbnRyb2wgYmluZGluZykgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMCBjcWEtcmVsYXRpdmUgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1sZWZ0LTQgY3FhLXRvcC0wIGNxYS1ib3R0b20tMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLWxlYWRpbmctbm9uZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LTQgIWNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XVwiPnNlYXJjaDwvbWF0LWljb24+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImVkaXRGb3JtLmdldCgnZW52aXJvbm1lbnRTZWFyY2hRdWVyeScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAoaW5wdXQpPVwib25FbnZpcm9ubWVudFNlYXJjaElucHV0KCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIEVudmlyb25tZW50XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRlc3QtZGF0YS1zZWFyY2gtaW5wdXQgY3FhLXctZnVsbCBjcWEtcGwtMTAgY3FhLXByLTQgY3FhLXB5LTIuNSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy01IGNxYS10ZXh0LVsjMEEwQTBBXSBwbGFjZWhvbGRlcjpjcWEtdGV4dC1bIzlDQTNBRl0gZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1czpjcWEtYm9yZGVyLVsjM0I4MkY2XSBmb2N1czpjcWEtcmluZy0xIGZvY3VzOmNxYS1yaW5nLVsjM0I4MkY2XVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2VhcmNoIEVudmlyb25tZW50XCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBFbnZpcm9ubWVudCBsaXN0IChzY3JvbGxhYmxlLCBzZWFyY2gtaW50ZWdyYXRlZCB2aWEgZmlsdGVyZWQgbGlzdCBiaW5kaW5nKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4taC1bMjIwcHhdIGNxYS1mbGV4LTEgY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgICAgICAgPGNxYS1pdGVtLWxpc3RcbiAgICAgICAgICAgIFtpdGVtc109XCJlbnZpcm9ubWVudExpc3RDb25maWdcIlxuICAgICAgICAgICAgW3NlbGVjdGVkSWRdPVwic2VsZWN0ZWRFbnZpcm9ubWVudElkXCJcbiAgICAgICAgICAgIGVtcHR5TWVzc2FnZT1cIk5vIGVudmlyb25tZW50IHZhcmlhYmxlcyBtYXRjaCB5b3VyIHNlYXJjaC5cIlxuICAgICAgICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAoaXRlbVNlbGVjdCk9XCJvbkVudmlyb25tZW50U2VsZWN0KCRldmVudClcIlxuICAgICAgICAgICAgKGl0ZW1FZGl0KT1cIm9uRW52aXJvbm1lbnRFZGl0KCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS1pdGVtLWxpc3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIFJ1bnRpbWUgdGFiOiBkeW5hbWljIHZhbHVlIGluamVjdG9yIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdydW50aW1lJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLW1pbi1oLTAgY3FhLWgtZnVsbCBjcWEtb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTAgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICBSdW50aW1lXG4gICAgICAgIDwvaDM+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICBbdmFsdWVdPVwiZWRpdEZvcm0uZ2V0KCdydW50aW1lVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRWRpdEZvcm1GaWVsZENoYW5nZSgncnVudGltZVZhbHVlJywgJGV2ZW50KVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImlucHV0IHRleHRcIlxuICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgIHNpemU9XCJtZFwiPlxuICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tdC0xLjUgY3FhLW1iLTBcIj5cbiAgICAgICAgICAgIFZhbHVlcyByZXNvbHZlZCBkdXJpbmcgdGVzdCBleGVjdXRpb24gYmFzZWQgb24gc2Vzc2lvbiBhbmQgc3RlcCBzdGF0ZS5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFJlY29tbWVuZGVkOiBzdWdnZXN0aW9uIGNoaXBzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMiBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNCAhY3FhLWgtNCAhY3FhLXRleHQtWzE2cHhdIGNxYS10ZXh0LVsjOUNBM0FGXVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnNjaGVkdWxlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+UmVjb21tZW5kZWQ8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXN0LWRhdGEtcnVudGltZS1jaGlwcy1zY3JvbGwgY3FhLWZsZXggY3FhLWdhcC0yIGNxYS1vdmVyZmxvdy14LWF1dG8gY3FhLW1pbi13LTAgY3FhLXBiLTFcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHNuaXBwZXQgb2YgcnVudGltZVN1Z2dlc3RlZFZhbHVlc1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25SdW50aW1lQ2hpcEluc2VydChzbmlwcGV0KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXB4LTMgY3FhLXB5LTEuNSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLWJnLVsjRjNGNEY2XSBjcWEtcm91bmRlZC1mdWxsIGhvdmVyOmNxYS1iZy1bI0U1RTdFQl0gZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLTIgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1bIzNGNDNFRV0gY3FhLXRyYW5zaXRpb24tY29sb3JzIGNxYS13aGl0ZXNwYWNlLW5vd3JhcFwiPlxuICAgICAgICAgICAgICB7eyBzbmlwcGV0IH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMaW5lIGJlbG93IGNvbnRlbnQgKGZ1bGwgd2lkdGggb2YgbW9kYWwsIG5vIHNpZGUgbWFyZ2luKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS0tbXgtMiBjcWEtdy1bY2FsYygxMDAlKzFyZW0pXSBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtaC1weCBjcWEtdy1mdWxsIGNxYS1iZy1bI0U1RTdFQl1cIiByb2xlPVwicHJlc2VudGF0aW9uXCI+PC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRm9vdGVyOiBDYW5jZWwsIEFwcGx5IChmdWxsIHdpZHRoIGluIG9uZSByb3cpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RyZXRjaCBjcWEtZ2FwLTIgY3FhLXctZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiJ0NhbmNlbCdcIiBbZnVsbFdpZHRoXT1cInRydWVcIiAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCJcbiAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxMnB4XSBjcWEtcHktWzlweF0gY3FhLWJvcmRlci1bIzQxNDE0Nl0nXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiJ0FwcGx5J1wiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIChjbGlja2VkKT1cIm9uQXBwbHkoKVwiXG4gICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTJweF0gY3FhLXB5LVs5cHhdIGNxYS1ib3JkZXItWyMzRjQzRUVdJ1wiPjwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uRWRpdEluRGVwdGgoJGV2ZW50KVwiXG4gICAgICBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1uby11bmRlcmxpbmUgaG92ZXI6Y3FhLW5vLXVuZGVybGluZSBjcWEtc2VsZi1jZW50ZXJcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy00ICFjcWEtaC00ICFjcWEtdGV4dC1bMTZweF1cIj5vcGVuX2luX25ldzwvbWF0LWljb24+XG4gICAgICBFZGl0IGluIGRlcHRoIChvcGVuIGRldGFpbGVkIHJpZ2h0IHBhbmVsKVxuICAgIDwvYT5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|