@cqa-lib/cqa-ui 1.1.380 → 1.1.382
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/detail-side-panel/detail-side-panel.component.mjs +3 -3
- package/esm2020/lib/test-case-details/run-execution-alert/run-execution-alert.component.mjs +48 -6
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal.component.mjs +3 -3
- package/fesm2015/cqa-lib-cqa-ui.mjs +48 -7
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +47 -7
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/test-case-details/run-execution-alert/run-execution-alert.component.d.ts +24 -1
- package/package.json +1 -1
- package/styles.css +1 -1
|
@@ -340,10 +340,10 @@ export class TestDataModalComponent {
|
|
|
340
340
|
}
|
|
341
341
|
}
|
|
342
342
|
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 });
|
|
343
|
-
TestDataModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestDataModalComponent, selector: "cqa-test-data-modal", inputs: { parameters: "parameters", environmentItems: "environmentItems", activeTab: "activeTab", value: "value", helpUrl: "helpUrl" }, outputs: { apply: "apply", cancel: "cancel", editInDepth: "editInDepth", parameterCreate: "parameterCreate", parameterEdit: "parameterEdit", environmentCreate: "environmentCreate", environmentEdit: "environmentEdit" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"cqa-bg-white cqa-rounded-[12px] cqa-shadow-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-w-[500px] cqa-max-h-[77vh] cqa-flex cqa-flex-col cqa-gap-[12px] cqa-p-2 cqa-box-border cqa-min-h-0\">\n <!-- Header: title left; Need help? + close icon right (no overflow here so tooltip is not clipped) -->\n <div class=\"cqa-flex cqa-flex-shrink-0 cqa-items-center cqa-justify-between cqa-gap-2 cqa-px-4\">\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-bold cqa-text-[#111827] cqa-m-0 cqa-font-[600]\">\n Test Data\n </h2>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-h-[28px]\">\n <!-- Need help? with custom tooltip: show below trigger so it is not clipped by modal overflow-y-auto -->\n <div class=\"cqa-relative cqa-inline-flex cqa-items-center\"\n (mouseenter)=\"showHelpTooltip = true\" (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"helpUrl\" href=\"#\" (click)=\"onHelp($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline hover:cqa-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!helpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <!-- Tooltip above trigger (same as element-popup); header has no overflow so tooltip is not clipped -->\n <div *ngIf=\"showHelpTooltip\"\n class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-bottom-[100%] cqa-mb-1 cqa-left-0\"\n role=\"tooltip\">\n <div class=\"cqa-text-white cqa-text-left cqa-w-[306px] cqa-max-w-[306px] cqa-min-h-[20px] cqa-rounded-[6px] cqa-py-1 cqa-px-2 cqa-bg-[#0A0A0A] cqa-leading-[20px] cqa-text-[8px] cqa-break-words\">\n {{ helpTooltipText }}\n </div>\n </div>\n </div>\n <cqa-button type=\"button\" variant=\"text\" btnSize=\"md\"\n [text]=\"''\"\n icon=\"close\"\n (clicked)=\"onClose()\"\n [customClass]=\"'cqa-min-h-[28px] cqa-min-w-[28px] cqa-p-0 cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6]'\"\n title=\"Close\"\n aria-label=\"Close\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Line below header (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Tabs: Plain Text, Parameter, Environment, Runtime (full-width, cqa-button) -->\n <div class=\"cqa-w-full cqa-min-w-0 cqa-test-data-modal-tabs cqa-flex cqa-flex-row cqa-p-[3.5px] cqa-h-[31.5px] cqa-rounded-[8px] cqa-bg-[#F3F4F6] cqa-gap-0\" role=\"tablist\">\n <div *ngFor=\"let segment of tabSegments\" class=\"cqa-flex-1 cqa-min-w-0 cqa-flex\">\n <cqa-button\n type=\"button\"\n [attr.role]=\"'tab'\"\n [attr.aria-selected]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value\"\n [text]=\"segment.label\"\n [variant]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value ? 'filled' : 'text'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onTabChange(segment.value)\"\n [customClass]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value ? 'cqa-h-[25px] cqa-rounded-[8px] cqa-text-[12px] cqa-bg-[#3F43EE] cqa-text-white cqa-font-medium' : 'cqa-h-[25px] cqa-rounded-[8px] cqa-text-[12px] cqa-text-[#6B7280] hover:cqa-text-[#111827]'\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Content per tab: only this section scrolls (overflow here, not on root), so header tooltip is never clipped -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-h-0 cqa-overflow-y-auto\"\n [class.cqa-flex-1]=\"activeTab === 'parameter' || activeTab === 'environment' || activeTab === 'runtime'\">\n <!-- Plain Text tab (form-bound like Loop Step editForm + onEditFormFieldChange) -->\n <ng-container *ngIf=\"activeTab === 'plain-text'\">\n <cqa-custom-input\n label=\"Value\"\n [value]=\"editForm.get('value')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('value', $event)\"\n placeholder=\"https://example.com/dashboard\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#0A0A0A] cqa-m-0\">\n Enter a static text value that won't change during execution.\n </p>\n </ng-container>\n\n <!-- Parameter tab: Variable Library -->\n <ng-container *ngIf=\"activeTab === 'parameter'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Variable Library header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Parameters\n </h3>\n <a href=\"#\" (click)=\"onCreateNewVariable($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search library'\"\n [value]=\"editForm.get('parameterSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search library'\"\n (valueChange)=\"onParameterSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <!-- Parameter list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[200px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <div\n *ngFor=\"let item of parameterListConfig\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onParameterRowClick($event, item)\"\n (keydown.enter)=\"onParameterRowClick($event, item)\"\n (keydown.space)=\"onParameterRowClick($event, item)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedParameterId === item.id\"\n [class.cqa-border]=\"selectedParameterId === item.id\"\n [class.cqa-border-solid]=\"selectedParameterId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedParameterId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC] cqa-cursor-pointer\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n <button\n *ngIf=\"item.showEdit\"\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-p-1 cqa-min-w-0 cqa-text-[#1447E6] hover:cqa-bg-[#E5E7EB] cqa-bg-transparent cqa-border-none cqa-rounded-[6px] cqa-cursor-pointer\"\n (click)=\"onParameterEditClick($event, item.id)\"\n title=\"Edit\"\n aria-label=\"Edit\">\n <mat-icon\n class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\"\n (click)=\"onParameterEditClick($event, item.id)\">edit</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <p *ngIf=\"parameterListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No parameters match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Environment tab: Variable library by environment -->\n <ng-container *ngIf=\"activeTab === 'environment'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Section header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Environment\n </h3>\n <a href=\"#\" (click)=\"onCreateNewEnvironment($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search Environment'\"\n [value]=\"editForm.get('environmentSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search Environment'\"\n (valueChange)=\"onEnvironmentSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <!-- Environment list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[220px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <button\n *ngFor=\"let item of environmentListConfig\"\n type=\"button\"\n (click)=\"onEnvironmentSelect(item.id)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border-solid]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedEnvironmentId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC]\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n </div>\n </div>\n </button>\n <p *ngIf=\"environmentListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No environment variables match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Runtime tab: dynamic value injector -->\n <ng-container *ngIf=\"activeTab === 'runtime'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-h-0 cqa-h-full cqa-overflow-y-auto\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-shrink-0\">\n Runtime\n </h3>\n <div class=\"cqa-flex-shrink-0\">\n <cqa-custom-input\n [value]=\"editForm.get('runtimeValue')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('runtimeValue', $event)\"\n placeholder=\"input text\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-mt-1.5 cqa-mb-0\">\n Values resolved during test execution based on session and step state.\n </p>\n </div>\n <!-- Recommended: suggestion chips -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-flex-shrink-0\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px] cqa-text-[#9CA3AF]\" aria-hidden=\"true\">schedule</mat-icon>\n <span class=\"cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#6B7280]\">Recommended</span>\n </div>\n <div class=\"cqa-test-data-runtime-chips-scroll cqa-flex cqa-gap-2 cqa-overflow-x-auto cqa-min-w-0 cqa-pb-1\">\n <cqa-button\n *ngFor=\"let snippet of runtimeSuggestedValues\"\n type=\"button\"\n variant=\"outlined\"\n btnSize=\"md\"\n [text]=\"snippet\"\n (clicked)=\"onRuntimeChipInsert(snippet)\"\n [customClass]=\"'cqa-flex-shrink-0 cqa-px-2 cqa-py-1 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#374151] cqa-bg-[#FFFFFF] cqa-border-[#E5E7EB] cqa-rounded-[8px] cqa-whitespace-nowrap'\">\n </cqa-button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Line below content (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Footer: Cancel, Apply (full width in one row) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Cancel'\" [fullWidth]=\"true\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Apply'\" [fullWidth]=\"true\" (clicked)=\"onApply()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n </div>\n <a 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.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.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: i4.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
343
|
+
TestDataModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestDataModalComponent, selector: "cqa-test-data-modal", inputs: { parameters: "parameters", environmentItems: "environmentItems", activeTab: "activeTab", value: "value", helpUrl: "helpUrl" }, outputs: { apply: "apply", cancel: "cancel", editInDepth: "editInDepth", parameterCreate: "parameterCreate", parameterEdit: "parameterEdit", environmentCreate: "environmentCreate", environmentEdit: "environmentEdit" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"cqa-bg-white cqa-rounded-[12px] cqa-shadow-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-w-[500px] cqa-max-h-[77vh] cqa-flex cqa-flex-col cqa-gap-[12px] cqa-p-2 cqa-box-border cqa-min-h-0\">\n <!-- Header: title left; Need help? + close icon right (no overflow here so tooltip is not clipped) -->\n <div class=\"cqa-flex cqa-flex-shrink-0 cqa-items-center cqa-justify-between cqa-gap-2 cqa-px-4\">\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-bold cqa-text-[#111827] cqa-m-0 cqa-font-[600]\">\n Test Data\n </h2>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-h-[28px]\">\n <!-- Need help? with custom tooltip: show below trigger so it is not clipped by modal overflow-y-auto -->\n <div class=\"cqa-relative cqa-inline-flex cqa-items-center\"\n (mouseenter)=\"showHelpTooltip = true\" (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"helpUrl\" href=\"#\" (click)=\"onHelp($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline hover:cqa-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!helpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <!-- Tooltip above trigger (same as element-popup); header has no overflow so tooltip is not clipped -->\n <div *ngIf=\"showHelpTooltip\"\n class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-bottom-[100%] cqa-mb-1 cqa-top-[22px]\"\n role=\"tooltip\">\n <div class=\"cqa-text-white cqa-text-left cqa-w-[306px] cqa-max-w-[306px] cqa-min-h-[20px] cqa-rounded-[6px] cqa-py-1 cqa-px-2 cqa-bg-[#0A0A0A] cqa-leading-[20px] cqa-text-[8px] cqa-break-words\">\n {{ helpTooltipText }}\n </div>\n </div>\n </div>\n <cqa-button type=\"button\" variant=\"text\" btnSize=\"md\"\n [text]=\"''\"\n icon=\"close\"\n (clicked)=\"onClose()\"\n [customClass]=\"'cqa-min-h-[28px] cqa-min-w-[28px] cqa-p-0 cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6]'\"\n title=\"Close\"\n aria-label=\"Close\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Line below header (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Tabs: Plain Text, Parameter, Environment, Runtime (full-width, cqa-button) -->\n <div class=\"cqa-w-full cqa-min-w-0 cqa-test-data-modal-tabs cqa-flex cqa-flex-row cqa-p-[3.5px] cqa-h-[31.5px] cqa-rounded-[8px] cqa-bg-[#F3F4F6] cqa-gap-0\" role=\"tablist\">\n <div *ngFor=\"let segment of tabSegments\" class=\"cqa-flex-1 cqa-min-w-0 cqa-flex\">\n <cqa-button\n type=\"button\"\n [attr.role]=\"'tab'\"\n [attr.aria-selected]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value\"\n [text]=\"segment.label\"\n [variant]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value ? 'filled' : 'text'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onTabChange(segment.value)\"\n [customClass]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value ? 'cqa-h-[25px] cqa-rounded-[8px] cqa-text-[12px] cqa-bg-[#3F43EE] cqa-text-white cqa-font-medium' : 'cqa-h-[25px] cqa-rounded-[8px] cqa-text-[12px] cqa-text-[#6B7280] hover:cqa-text-[#111827]'\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Content per tab: only this section scrolls (overflow here, not on root), so header tooltip is never clipped -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-h-0 cqa-overflow-y-auto\"\n [class.cqa-flex-1]=\"activeTab === 'parameter' || activeTab === 'environment' || activeTab === 'runtime'\">\n <!-- Plain Text tab (form-bound like Loop Step editForm + onEditFormFieldChange) -->\n <ng-container *ngIf=\"activeTab === 'plain-text'\">\n <cqa-custom-input\n label=\"Value\"\n [value]=\"editForm.get('value')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('value', $event)\"\n placeholder=\"https://example.com/dashboard\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#0A0A0A] cqa-m-0\">\n Enter a static text value that won't change during execution.\n </p>\n </ng-container>\n\n <!-- Parameter tab: Variable Library -->\n <ng-container *ngIf=\"activeTab === 'parameter'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Variable Library header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Parameters\n </h3>\n <a href=\"#\" (click)=\"onCreateNewVariable($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search library'\"\n [value]=\"editForm.get('parameterSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search library'\"\n (valueChange)=\"onParameterSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <!-- Parameter list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[200px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <div\n *ngFor=\"let item of parameterListConfig\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onParameterRowClick($event, item)\"\n (keydown.enter)=\"onParameterRowClick($event, item)\"\n (keydown.space)=\"onParameterRowClick($event, item)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedParameterId === item.id\"\n [class.cqa-border]=\"selectedParameterId === item.id\"\n [class.cqa-border-solid]=\"selectedParameterId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedParameterId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC] cqa-cursor-pointer\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n <button\n *ngIf=\"item.showEdit\"\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-p-1 cqa-min-w-0 cqa-text-[#1447E6] hover:cqa-bg-[#E5E7EB] cqa-bg-transparent cqa-border-none cqa-rounded-[6px] cqa-cursor-pointer\"\n (click)=\"onParameterEditClick($event, item.id)\"\n title=\"Edit\"\n aria-label=\"Edit\">\n <mat-icon\n class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\"\n (click)=\"onParameterEditClick($event, item.id)\">edit</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <p *ngIf=\"parameterListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No parameters match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Environment tab: Variable library by environment -->\n <ng-container *ngIf=\"activeTab === 'environment'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Section header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Environment\n </h3>\n <a href=\"#\" (click)=\"onCreateNewEnvironment($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search Environment'\"\n [value]=\"editForm.get('environmentSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search Environment'\"\n (valueChange)=\"onEnvironmentSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <!-- Environment list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[220px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <button\n *ngFor=\"let item of environmentListConfig\"\n type=\"button\"\n (click)=\"onEnvironmentSelect(item.id)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border-solid]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedEnvironmentId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC]\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n </div>\n </div>\n </button>\n <p *ngIf=\"environmentListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No environment variables match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Runtime tab: dynamic value injector -->\n <ng-container *ngIf=\"activeTab === 'runtime'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-h-0 cqa-h-full cqa-overflow-y-auto\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-shrink-0\">\n Runtime\n </h3>\n <div class=\"cqa-flex-shrink-0\">\n <cqa-custom-input\n [value]=\"editForm.get('runtimeValue')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('runtimeValue', $event)\"\n placeholder=\"input text\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-mt-1.5 cqa-mb-0\">\n Values resolved during test execution based on session and step state.\n </p>\n </div>\n <!-- Recommended: suggestion chips -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-flex-shrink-0\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px] cqa-text-[#9CA3AF]\" aria-hidden=\"true\">schedule</mat-icon>\n <span class=\"cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#6B7280]\">Recommended</span>\n </div>\n <div class=\"cqa-test-data-runtime-chips-scroll cqa-flex cqa-gap-2 cqa-overflow-x-auto cqa-min-w-0 cqa-pb-1\">\n <cqa-button\n *ngFor=\"let snippet of runtimeSuggestedValues\"\n type=\"button\"\n variant=\"outlined\"\n btnSize=\"md\"\n [text]=\"snippet\"\n (clicked)=\"onRuntimeChipInsert(snippet)\"\n [customClass]=\"'cqa-flex-shrink-0 cqa-px-2 cqa-py-1 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#374151] cqa-bg-[#FFFFFF] cqa-border-[#E5E7EB] cqa-rounded-[8px] cqa-whitespace-nowrap'\">\n </cqa-button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Line below content (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Footer: Cancel, Apply (full width in one row) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Cancel'\" [fullWidth]=\"true\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Apply'\" [fullWidth]=\"true\" (clicked)=\"onApply()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n </div>\n <a 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.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.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: i4.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
344
344
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestDataModalComponent, decorators: [{
|
|
345
345
|
type: Component,
|
|
346
|
-
args: [{ selector: 'cqa-test-data-modal', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"cqa-bg-white cqa-rounded-[12px] cqa-shadow-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-w-[500px] cqa-max-h-[77vh] cqa-flex cqa-flex-col cqa-gap-[12px] cqa-p-2 cqa-box-border cqa-min-h-0\">\n <!-- Header: title left; Need help? + close icon right (no overflow here so tooltip is not clipped) -->\n <div class=\"cqa-flex cqa-flex-shrink-0 cqa-items-center cqa-justify-between cqa-gap-2 cqa-px-4\">\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-bold cqa-text-[#111827] cqa-m-0 cqa-font-[600]\">\n Test Data\n </h2>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-h-[28px]\">\n <!-- Need help? with custom tooltip: show below trigger so it is not clipped by modal overflow-y-auto -->\n <div class=\"cqa-relative cqa-inline-flex cqa-items-center\"\n (mouseenter)=\"showHelpTooltip = true\" (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"helpUrl\" href=\"#\" (click)=\"onHelp($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline hover:cqa-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!helpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <!-- Tooltip above trigger (same as element-popup); header has no overflow so tooltip is not clipped -->\n <div *ngIf=\"showHelpTooltip\"\n class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-bottom-[100%] cqa-mb-1 cqa-left-0\"\n role=\"tooltip\">\n <div class=\"cqa-text-white cqa-text-left cqa-w-[306px] cqa-max-w-[306px] cqa-min-h-[20px] cqa-rounded-[6px] cqa-py-1 cqa-px-2 cqa-bg-[#0A0A0A] cqa-leading-[20px] cqa-text-[8px] cqa-break-words\">\n {{ helpTooltipText }}\n </div>\n </div>\n </div>\n <cqa-button type=\"button\" variant=\"text\" btnSize=\"md\"\n [text]=\"''\"\n icon=\"close\"\n (clicked)=\"onClose()\"\n [customClass]=\"'cqa-min-h-[28px] cqa-min-w-[28px] cqa-p-0 cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6]'\"\n title=\"Close\"\n aria-label=\"Close\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Line below header (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Tabs: Plain Text, Parameter, Environment, Runtime (full-width, cqa-button) -->\n <div class=\"cqa-w-full cqa-min-w-0 cqa-test-data-modal-tabs cqa-flex cqa-flex-row cqa-p-[3.5px] cqa-h-[31.5px] cqa-rounded-[8px] cqa-bg-[#F3F4F6] cqa-gap-0\" role=\"tablist\">\n <div *ngFor=\"let segment of tabSegments\" class=\"cqa-flex-1 cqa-min-w-0 cqa-flex\">\n <cqa-button\n type=\"button\"\n [attr.role]=\"'tab'\"\n [attr.aria-selected]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value\"\n [text]=\"segment.label\"\n [variant]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value ? 'filled' : 'text'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onTabChange(segment.value)\"\n [customClass]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value ? 'cqa-h-[25px] cqa-rounded-[8px] cqa-text-[12px] cqa-bg-[#3F43EE] cqa-text-white cqa-font-medium' : 'cqa-h-[25px] cqa-rounded-[8px] cqa-text-[12px] cqa-text-[#6B7280] hover:cqa-text-[#111827]'\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Content per tab: only this section scrolls (overflow here, not on root), so header tooltip is never clipped -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-h-0 cqa-overflow-y-auto\"\n [class.cqa-flex-1]=\"activeTab === 'parameter' || activeTab === 'environment' || activeTab === 'runtime'\">\n <!-- Plain Text tab (form-bound like Loop Step editForm + onEditFormFieldChange) -->\n <ng-container *ngIf=\"activeTab === 'plain-text'\">\n <cqa-custom-input\n label=\"Value\"\n [value]=\"editForm.get('value')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('value', $event)\"\n placeholder=\"https://example.com/dashboard\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#0A0A0A] cqa-m-0\">\n Enter a static text value that won't change during execution.\n </p>\n </ng-container>\n\n <!-- Parameter tab: Variable Library -->\n <ng-container *ngIf=\"activeTab === 'parameter'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Variable Library header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Parameters\n </h3>\n <a href=\"#\" (click)=\"onCreateNewVariable($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search library'\"\n [value]=\"editForm.get('parameterSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search library'\"\n (valueChange)=\"onParameterSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <!-- Parameter list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[200px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <div\n *ngFor=\"let item of parameterListConfig\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onParameterRowClick($event, item)\"\n (keydown.enter)=\"onParameterRowClick($event, item)\"\n (keydown.space)=\"onParameterRowClick($event, item)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedParameterId === item.id\"\n [class.cqa-border]=\"selectedParameterId === item.id\"\n [class.cqa-border-solid]=\"selectedParameterId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedParameterId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC] cqa-cursor-pointer\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n <button\n *ngIf=\"item.showEdit\"\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-p-1 cqa-min-w-0 cqa-text-[#1447E6] hover:cqa-bg-[#E5E7EB] cqa-bg-transparent cqa-border-none cqa-rounded-[6px] cqa-cursor-pointer\"\n (click)=\"onParameterEditClick($event, item.id)\"\n title=\"Edit\"\n aria-label=\"Edit\">\n <mat-icon\n class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\"\n (click)=\"onParameterEditClick($event, item.id)\">edit</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <p *ngIf=\"parameterListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No parameters match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Environment tab: Variable library by environment -->\n <ng-container *ngIf=\"activeTab === 'environment'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Section header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Environment\n </h3>\n <a href=\"#\" (click)=\"onCreateNewEnvironment($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search Environment'\"\n [value]=\"editForm.get('environmentSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search Environment'\"\n (valueChange)=\"onEnvironmentSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <!-- Environment list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[220px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <button\n *ngFor=\"let item of environmentListConfig\"\n type=\"button\"\n (click)=\"onEnvironmentSelect(item.id)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border-solid]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedEnvironmentId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC]\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n </div>\n </div>\n </button>\n <p *ngIf=\"environmentListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No environment variables match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Runtime tab: dynamic value injector -->\n <ng-container *ngIf=\"activeTab === 'runtime'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-h-0 cqa-h-full cqa-overflow-y-auto\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-shrink-0\">\n Runtime\n </h3>\n <div class=\"cqa-flex-shrink-0\">\n <cqa-custom-input\n [value]=\"editForm.get('runtimeValue')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('runtimeValue', $event)\"\n placeholder=\"input text\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-mt-1.5 cqa-mb-0\">\n Values resolved during test execution based on session and step state.\n </p>\n </div>\n <!-- Recommended: suggestion chips -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-flex-shrink-0\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px] cqa-text-[#9CA3AF]\" aria-hidden=\"true\">schedule</mat-icon>\n <span class=\"cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#6B7280]\">Recommended</span>\n </div>\n <div class=\"cqa-test-data-runtime-chips-scroll cqa-flex cqa-gap-2 cqa-overflow-x-auto cqa-min-w-0 cqa-pb-1\">\n <cqa-button\n *ngFor=\"let snippet of runtimeSuggestedValues\"\n type=\"button\"\n variant=\"outlined\"\n btnSize=\"md\"\n [text]=\"snippet\"\n (clicked)=\"onRuntimeChipInsert(snippet)\"\n [customClass]=\"'cqa-flex-shrink-0 cqa-px-2 cqa-py-1 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#374151] cqa-bg-[#FFFFFF] cqa-border-[#E5E7EB] cqa-rounded-[8px] cqa-whitespace-nowrap'\">\n </cqa-button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Line below content (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Footer: Cancel, Apply (full width in one row) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Cancel'\" [fullWidth]=\"true\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Apply'\" [fullWidth]=\"true\" (clicked)=\"onApply()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n </div>\n <a 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" }]
|
|
346
|
+
args: [{ selector: 'cqa-test-data-modal', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"cqa-bg-white cqa-rounded-[12px] cqa-shadow-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-w-[500px] cqa-max-h-[77vh] cqa-flex cqa-flex-col cqa-gap-[12px] cqa-p-2 cqa-box-border cqa-min-h-0\">\n <!-- Header: title left; Need help? + close icon right (no overflow here so tooltip is not clipped) -->\n <div class=\"cqa-flex cqa-flex-shrink-0 cqa-items-center cqa-justify-between cqa-gap-2 cqa-px-4\">\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-bold cqa-text-[#111827] cqa-m-0 cqa-font-[600]\">\n Test Data\n </h2>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-h-[28px]\">\n <!-- Need help? with custom tooltip: show below trigger so it is not clipped by modal overflow-y-auto -->\n <div class=\"cqa-relative cqa-inline-flex cqa-items-center\"\n (mouseenter)=\"showHelpTooltip = true\" (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"helpUrl\" href=\"#\" (click)=\"onHelp($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline hover:cqa-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!helpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <!-- Tooltip above trigger (same as element-popup); header has no overflow so tooltip is not clipped -->\n <div *ngIf=\"showHelpTooltip\"\n class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-bottom-[100%] cqa-mb-1 cqa-top-[22px]\"\n role=\"tooltip\">\n <div class=\"cqa-text-white cqa-text-left cqa-w-[306px] cqa-max-w-[306px] cqa-min-h-[20px] cqa-rounded-[6px] cqa-py-1 cqa-px-2 cqa-bg-[#0A0A0A] cqa-leading-[20px] cqa-text-[8px] cqa-break-words\">\n {{ helpTooltipText }}\n </div>\n </div>\n </div>\n <cqa-button type=\"button\" variant=\"text\" btnSize=\"md\"\n [text]=\"''\"\n icon=\"close\"\n (clicked)=\"onClose()\"\n [customClass]=\"'cqa-min-h-[28px] cqa-min-w-[28px] cqa-p-0 cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6]'\"\n title=\"Close\"\n aria-label=\"Close\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Line below header (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Tabs: Plain Text, Parameter, Environment, Runtime (full-width, cqa-button) -->\n <div class=\"cqa-w-full cqa-min-w-0 cqa-test-data-modal-tabs cqa-flex cqa-flex-row cqa-p-[3.5px] cqa-h-[31.5px] cqa-rounded-[8px] cqa-bg-[#F3F4F6] cqa-gap-0\" role=\"tablist\">\n <div *ngFor=\"let segment of tabSegments\" class=\"cqa-flex-1 cqa-min-w-0 cqa-flex\">\n <cqa-button\n type=\"button\"\n [attr.role]=\"'tab'\"\n [attr.aria-selected]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value\"\n [text]=\"segment.label\"\n [variant]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value ? 'filled' : 'text'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onTabChange(segment.value)\"\n [customClass]=\"(editForm.get('activeTab')?.value ?? activeTab) === segment.value ? 'cqa-h-[25px] cqa-rounded-[8px] cqa-text-[12px] cqa-bg-[#3F43EE] cqa-text-white cqa-font-medium' : 'cqa-h-[25px] cqa-rounded-[8px] cqa-text-[12px] cqa-text-[#6B7280] hover:cqa-text-[#111827]'\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Content per tab: only this section scrolls (overflow here, not on root), so header tooltip is never clipped -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-h-0 cqa-overflow-y-auto\"\n [class.cqa-flex-1]=\"activeTab === 'parameter' || activeTab === 'environment' || activeTab === 'runtime'\">\n <!-- Plain Text tab (form-bound like Loop Step editForm + onEditFormFieldChange) -->\n <ng-container *ngIf=\"activeTab === 'plain-text'\">\n <cqa-custom-input\n label=\"Value\"\n [value]=\"editForm.get('value')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('value', $event)\"\n placeholder=\"https://example.com/dashboard\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#0A0A0A] cqa-m-0\">\n Enter a static text value that won't change during execution.\n </p>\n </ng-container>\n\n <!-- Parameter tab: Variable Library -->\n <ng-container *ngIf=\"activeTab === 'parameter'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Variable Library header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Parameters\n </h3>\n <a href=\"#\" (click)=\"onCreateNewVariable($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search library'\"\n [value]=\"editForm.get('parameterSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search library'\"\n (valueChange)=\"onParameterSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <!-- Parameter list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[200px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <div\n *ngFor=\"let item of parameterListConfig\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onParameterRowClick($event, item)\"\n (keydown.enter)=\"onParameterRowClick($event, item)\"\n (keydown.space)=\"onParameterRowClick($event, item)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedParameterId === item.id\"\n [class.cqa-border]=\"selectedParameterId === item.id\"\n [class.cqa-border-solid]=\"selectedParameterId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedParameterId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC] cqa-cursor-pointer\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n <button\n *ngIf=\"item.showEdit\"\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-p-1 cqa-min-w-0 cqa-text-[#1447E6] hover:cqa-bg-[#E5E7EB] cqa-bg-transparent cqa-border-none cqa-rounded-[6px] cqa-cursor-pointer\"\n (click)=\"onParameterEditClick($event, item.id)\"\n title=\"Edit\"\n aria-label=\"Edit\">\n <mat-icon\n class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\"\n (click)=\"onParameterEditClick($event, item.id)\">edit</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <p *ngIf=\"parameterListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No parameters match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Environment tab: Variable library by environment -->\n <ng-container *ngIf=\"activeTab === 'environment'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Section header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Environment\n </h3>\n <a href=\"#\" (click)=\"onCreateNewEnvironment($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0\">\n <cqa-search-bar\n [placeholder]=\"'Search Environment'\"\n [value]=\"editForm.get('environmentSearchQuery')?.value ?? ''\"\n [fullWidth]=\"true\"\n [showClear]=\"true\"\n [ariaLabel]=\"'Search Environment'\"\n (valueChange)=\"onEnvironmentSearchInput($event)\">\n </cqa-search-bar>\n </div>\n <!-- Environment list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[220px] cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-overflow-y-auto\">\n <button\n *ngFor=\"let item of environmentListConfig\"\n type=\"button\"\n (click)=\"onEnvironmentSelect(item.id)\"\n [class.cqa-bg-[#D8D9FC]]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border-solid]=\"selectedEnvironmentId === item.id\"\n [class.cqa-border-[#3F43EE]]=\"selectedEnvironmentId === item.id\"\n class=\"cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC]\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\"\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-rounded-[8px] cqa-text-[10px] cqa-font-normal cqa-whitespace-nowrap cqa-bg-[#eff6ff] cqa-text-[#1447E6] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{ item.badge }}\n </span>\n </div>\n </div>\n </button>\n <p *ngIf=\"environmentListConfig.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n No environment variables match your search.\n </p>\n </div>\n </div>\n </ng-container>\n\n <!-- Runtime tab: dynamic value injector -->\n <ng-container *ngIf=\"activeTab === 'runtime'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-h-0 cqa-h-full cqa-overflow-y-auto\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-shrink-0\">\n Runtime\n </h3>\n <div class=\"cqa-flex-shrink-0\">\n <cqa-custom-input\n [value]=\"editForm.get('runtimeValue')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('runtimeValue', $event)\"\n placeholder=\"input text\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-mt-1.5 cqa-mb-0\">\n Values resolved during test execution based on session and step state.\n </p>\n </div>\n <!-- Recommended: suggestion chips -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-flex-shrink-0\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px] cqa-text-[#9CA3AF]\" aria-hidden=\"true\">schedule</mat-icon>\n <span class=\"cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#6B7280]\">Recommended</span>\n </div>\n <div class=\"cqa-test-data-runtime-chips-scroll cqa-flex cqa-gap-2 cqa-overflow-x-auto cqa-min-w-0 cqa-pb-1\">\n <cqa-button\n *ngFor=\"let snippet of runtimeSuggestedValues\"\n type=\"button\"\n variant=\"outlined\"\n btnSize=\"md\"\n [text]=\"snippet\"\n (clicked)=\"onRuntimeChipInsert(snippet)\"\n [customClass]=\"'cqa-flex-shrink-0 cqa-px-2 cqa-py-1 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#374151] cqa-bg-[#FFFFFF] cqa-border-[#E5E7EB] cqa-rounded-[8px] cqa-whitespace-nowrap'\">\n </cqa-button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Line below content (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Footer: Cancel, Apply (full width in one row) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Cancel'\" [fullWidth]=\"true\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Apply'\" [fullWidth]=\"true\" (clicked)=\"onApply()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n </div>\n <a 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" }]
|
|
347
347
|
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }, { type: i7.TestDataModalRef, decorators: [{
|
|
348
348
|
type: Inject,
|
|
349
349
|
args: [TEST_DATA_MODAL_REF]
|
|
@@ -377,4 +377,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
377
377
|
}], helpUrl: [{
|
|
378
378
|
type: Input
|
|
379
379
|
}] } });
|
|
380
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1kYXRhLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvdGVzdC1kYXRhLW1vZGFsL3Rlc3QtZGF0YS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtZGF0YS1tb2RhbC90ZXN0LWRhdGEtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLDZCQUE2QixHQUc5QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBb0IsTUFBTSx1QkFBdUIsQ0FBQztBQUU5RSxPQUFPLEVBQ0wsc0JBQXNCLEdBRXZCLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUNMLGVBQWUsR0FHaEIsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7O0FBRzNDLE1BQU0sWUFBWSxHQUFHO0lBQ25CLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO0lBQzVDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO0lBQzFDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO0lBQzlDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0NBQ3ZDLENBQUM7QUFFRixNQUFNLHFCQUFxQixHQUFxRDtJQUM5RSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFB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Qjs7MEJBQzFCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsb0JBQW9COzRDQWpEaEMsS0FBSztzQkFBZCxNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFLRSxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFpQkcsU0FBUztzQkFBakIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIFRFU1RfREFUQV9NT0RBTF9EQVRBLFxuICBURVNUX0RBVEFfTU9EQUxfRURJVF9JTl9ERVBUSCxcbiAgVGVzdERhdGFNb2RhbERhdGEsXG4gIFRlc3REYXRhTW9kYWxUYWIsXG59IGZyb20gJy4vdGVzdC1kYXRhLW1vZGFsLWRhdGEnO1xuaW1wb3J0IHsgVEVTVF9EQVRBX01PREFMX1JFRiwgVGVzdERhdGFNb2RhbFJlZiB9IGZyb20gJy4vdGVzdC1kYXRhLW1vZGFsLXJlZic7XG5pbXBvcnQgeyBUZXN0RGF0YU1vZGFsUmVzdWx0IH0gZnJvbSAnLi90ZXN0LWRhdGEtbW9kYWwuc2VydmljZSc7XG5pbXBvcnQge1xuICBNT0NLX0VOVklST05NRU5UX0lURU1TLFxuICBFbnZpcm9ubWVudEl0ZW0sXG59IGZyb20gJy4vdGVzdC1kYXRhLW1vZGFsLWVudmlyb25tZW50Lm1vZGVsJztcbmltcG9ydCB7XG4gIE1PQ0tfUEFSQU1FVEVSUyxcbiAgUGFyYW1ldGVySXRlbSxcbiAgUGFyYW1ldGVyU2NvcGVGaWx0ZXIsXG59IGZyb20gJy4vdGVzdC1kYXRhLW1vZGFsLXBhcmFtZXRlci5tb2RlbCc7XG5pbXBvcnQgeyBDcWFMaXN0SXRlbUNvbmZpZyB9IGZyb20gJy4uLy4uL2l0ZW0tbGlzdC9pdGVtLWxpc3QubW9kZWwnO1xuXG5jb25zdCBUQUJfU0VHTUVOVFMgPSBbXG4gIHsgbGFiZWw6ICdQbGFpbiBUZXh0JywgdmFsdWU6ICdwbGFpbi10ZXh0JyB9LFxuICB7IGxhYmVsOiAnUGFyYW1ldGVyJywgdmFsdWU6ICdwYXJhbWV0ZXInIH0sXG4gIHsgbGFiZWw6ICdFbnZpcm9ubWVudCcsIHZhbHVlOiAnZW52aXJvbm1lbnQnIH0sXG4gIHsgbGFiZWw6ICdSdW50aW1lJywgdmFsdWU6ICdydW50aW1lJyB9LFxuXTtcblxuY29uc3QgUEFSQU1FVEVSX0ZJTFRFUl9UQUJTOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBQYXJhbWV0ZXJTY29wZUZpbHRlciB9W10gPSBbXG4gIHsgbGFiZWw6ICdBbGwnLCB2YWx1ZTogJ2FsbCcgfSxcbiAgeyBsYWJlbDogJ0dsb2JhbCcsIHZhbHVlOiAnZ2xvYmFsJyB9LFxuICB7IGxhYmVsOiAnTG9jYWwnLCB2YWx1ZTogJ2xvY2FsJyB9LFxuXTtcblxuLyoqIE1vY2sgcnVudGltZSB2YXJpYWJsZSBzdWdnZXN0aW9ucyAocmVwbGFjZSB3aXRoIEFQSSB3aGVuIGludGVncmF0aW5nKS4gKi9cbmNvbnN0IFJVTlRJTUVfU1VHR0VTVEVEX1ZBTFVFUyA9IFtcbiAgJ3J1bnRpbWUuTWF4V2FpdFRpbWUnLFxuICAncnVudGltZS5zZXNzaW9uX2lkJyxcbiAgJ3J1bnRpbWUuYXV0aF90b2tlbicsXG4gICdydW50aW1lLnN0ZXBfaW5kZXgnLFxuICAncnVudGltZS50aW1lc3RhbXAnLFxuICAncnVudGltZS50ZXN0X25hbWUnLFxuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXRlc3QtZGF0YS1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90ZXN0LWRhdGEtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUZXN0RGF0YU1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBAT3V0cHV0KCkgYXBwbHkgPSBuZXcgRXZlbnRFbWl0dGVyPHt2YWx1ZTogc3RyaW5nLCBhY3RpdmVUYWI6IFRlc3REYXRhTW9kYWxUYWJ9PigpO1xuICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZWRpdEluRGVwdGggPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBwYXJhbWV0ZXJDcmVhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBwYXJhbWV0ZXJFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBlbnZpcm9ubWVudENyZWF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGVudmlyb25tZW50RWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIHJlYWRvbmx5IHRhYlNlZ21lbnRzID0gVEFCX1NFR01FTlRTO1xuICByZWFkb25seSBwYXJhbWV0ZXJGaWx0ZXJUYWJzID0gUEFSQU1FVEVSX0ZJTFRFUl9UQUJTO1xuICAvKiogUGFyYW1ldGVyIGxpc3QgZnJvbSBpbnB1dCwgZmFsbHMgYmFjayB0byBtb2NrIGRhdGEgaWYgbm90IHByb3ZpZGVkLiAqL1xuICBASW5wdXQoKSBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJJdGVtW10gPSBNT0NLX1BBUkFNRVRFUlM7XG4gIC8qKiBFbnZpcm9ubWVudCBsaXN0IGZyb20gaW5wdXQsIGZhbGxzIGJhY2sgdG8gbW9jayBkYXRhIGlmIG5vdCBwcm92aWRlZC4gKi9cbiAgQElucHV0KCkgZW52aXJvbm1lbnRJdGVtczogRW52aXJvbm1lbnRJdGVtW10gPSBNT0NLX0VOVklST05NRU5UX0lURU1TO1xuICAvKiogUnVudGltZSB0YWI6IHN1Z2dlc3RlZCB2YXJpYWJsZSBjaGlwcy4gKi9cbiAgcmVhZG9ubHkgcnVudGltZVN1Z2dlc3RlZFZhbHVlczogcmVhZG9ubHkgc3RyaW5nW10gPSBSVU5USU1FX1NVR0dFU1RFRF9WQUxVRVM7XG5cbiAgLyoqIEZvcm0gZm9yIGFsbCBtb2RhbCBjb250cm9scyAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBlZGl0Rm9ybSkuICovXG4gIGVkaXRGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBDYWNoZWQgc2VsZWN0IGNvbmZpZ3MgKHN0YWJsZSByZWZzLCBzYW1lIG5hbWluZyBhcyBMb29wIFN0ZXA6IHh4eFNlbGVjdENvbmZpZykuICovXG4gIGFjdGl2ZVRhYlNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgcGFyYW1ldGVyU2NvcGVGaWx0ZXJTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG5cbiAgLyoqIExvY2FsIGNvcHkgb2YgZm9ybSB2YWx1ZSBmb3IgQ2FuY2VsIHJldmVydCAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBlZGl0U25hcHNob3QpLiAqL1xuICBwcml2YXRlIGVkaXRTbmFwc2hvdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgLyoqIFByZXNlcnZlIHVzZXItZW50ZXJlZCBwbGFpbiB0ZXh0IGluZGVwZW5kZW50bHkgZnJvbSBwYXJhbWV0ZXIvZW52aXJvbm1lbnQvcnVudGltZSBzZWxlY3Rpb25zLiAqL1xuICBwcml2YXRlIHBsYWluVGV4dFZhbHVlID0gJyc7XG5cbiAgLyoqIFN0YXRlIGRlcml2ZWQgZnJvbSBjb25maWcvZWRpdEZvcm0gZm9yIHRlbXBsYXRlIGFuZCBnZXR0ZXJzIChtaXJyb3JzIExvb3AgU3RlcCBpbnB1dHMpLiAqL1xuICBASW5wdXQoKSBhY3RpdmVUYWI6IFRlc3REYXRhTW9kYWxUYWIgPSAncGxhaW4tdGV4dCc7XG4gIEBJbnB1dCgpIHZhbHVlID0gJyc7XG4gIEBJbnB1dCgpIGhlbHBVcmwgPSAnJztcbiAgaGVscFRvb2x0aXBUZXh0ID0gJ05vdCBzdXJlIHdoYXQgdG8gZG8/IENsaWNrIHRvIGdvIHRvIG91ciBkZXRhaWxlZCBzdGVwIGNyZWF0aW9uIGRvY3VtZW50YXRpb24nO1xuICBzaG93SGVscFRvb2x0aXAgPSBmYWxzZTtcblxuICBwYXJhbWV0ZXJTY29wZUZpbHRlcjogUGFyYW1ldGVyU2NvcGVGaWx0ZXIgPSAnYWxsJztcbiAgcGFyYW1ldGVyU2VhcmNoUXVlcnkgPSAnJztcbiAgc2VsZWN0ZWRQYXJhbWV0ZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA9ICcnO1xuICBzZWxlY3RlZEVudmlyb25tZW50SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHJ1bnRpbWVWYWx1ZSA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBASW5qZWN0KFRFU1RfREFUQV9NT0RBTF9SRUYpIHByaXZhdGUgcmVmOiBUZXN0RGF0YU1vZGFsUmVmPFRlc3REYXRhTW9kYWxSZXN1bHQ+LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVEVTVF9EQVRBX01PREFMX0RBVEEpIGRhdGE/OiBUZXN0RGF0YU1vZGFsRGF0YVxuICApIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGRhdGEudmFsdWUgPz8gJyc7XG4gICAgICB0aGlzLmhlbHBVcmwgPSBkYXRhLmhlbHBVcmwgPz8gJyc7XG4gICAgICB0aGlzLmFjdGl2ZVRhYiA9IChkYXRhLmFjdGl2ZVRhYiA/PyAncGxhaW4tdGV4dCcpIGFzIFRlc3REYXRhTW9kYWxUYWI7XG4gICAgICB0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyID0gZGF0YS5wYXJhbWV0ZXJTY29wZUZpbHRlciA/PyAnYWxsJztcbiAgICAgIHRoaXMucGFyYW1ldGVyU2VhcmNoUXVlcnkgPSBkYXRhLnBhcmFtZXRlclNlYXJjaFF1ZXJ5ID8/ICcnO1xuICAgICAgdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID0gZGF0YS5zZWxlY3RlZFBhcmFtZXRlcklkID8/IG51bGw7XG4gICAgICB0aGlzLmVudmlyb25tZW50U2VhcmNoUXVlcnkgPSBkYXRhLmVudmlyb25tZW50U2VhcmNoUXVlcnkgPz8gJyc7XG4gICAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IGRhdGEuc2VsZWN0ZWRFbnZpcm9ubWVudElkID8/IG51bGw7XG4gICAgICB0aGlzLnJ1bnRpbWVWYWx1ZSA9IGRhdGEucnVudGltZVZhbHVlID8/ICcnO1xuICAgICAgLy8gU2V0IHBhcmFtZXRlcnMgYW5kIGVudmlyb25tZW50SXRlbXMgZnJvbSBkYXRhIGlmIHByb3ZpZGVkXG4gICAgICBpZiAoZGF0YS5wYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gZGF0YS5wYXJhbWV0ZXJzO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuZW52aXJvbm1lbnRJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRJdGVtcyA9IGRhdGEuZW52aXJvbm1lbnRJdGVtcztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wbGFpblRleHRWYWx1ZSA9IHRoaXMuYWN0aXZlVGFiID09PSAncGxhaW4tdGV4dCcgPyAodGhpcy52YWx1ZSA/PyAnJykgOiAnJztcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYnVpbGRFZGl0Rm9ybSgpO1xuICAgIHRoaXMuYnVpbGRTZWxlY3RDb25maWdzKCk7XG4gICAgdGhpcy5lZGl0U25hcHNob3QgPSB7IC4uLnRoaXMuZWRpdEZvcm0udmFsdWUgfTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdEZvcm0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snYWN0aXZlVGFiJ10pIHtcbiAgICAgIHRoaXMuZWRpdEZvcm0uZ2V0KCdhY3RpdmVUYWInKT8uc2V0VmFsdWUodGhpcy5hY3RpdmVUYWIgPz8gJ3BsYWluLXRleHQnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd2YWx1ZSddKSB7XG4gICAgICB0aGlzLmVkaXRGb3JtLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodGhpcy52YWx1ZSA/PyAnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5wbGFpblRleHRWYWx1ZSA9IHRoaXMuYWN0aXZlVGFiID09PSAncGxhaW4tdGV4dCcgPyAodGhpcy52YWx1ZSA/PyAnJykgOiAnJztcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hlbHBVcmwnXSkge1xuICAgICAgdGhpcy5oZWxwVXJsID0gdGhpcy5oZWxwVXJsID8/ICcnO1xuICAgIH1cblxuICAgIHRoaXMuc3luY1N0YXRlRnJvbUZvcm0oKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBmb3JtIHdpdGggYWxsIGNvbnRyb2wgdmFsdWVzIChzYW1lIHBhdHRlcm4gYXMgTG9vcCBTdGVwIGJ1aWxkRWRpdEZvcm0pLiAqL1xuICBwcml2YXRlIGJ1aWxkRWRpdEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgdmFsdWU6IFt0aGlzLnZhbHVlID8/ICcnXSxcbiAgICAgIGFjdGl2ZVRhYjogW3RoaXMuYWN0aXZlVGFiID8/ICdwbGFpbi10ZXh0J10sXG4gICAgICBwYXJhbWV0ZXJTY29wZUZpbHRlcjogW3RoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPz8gJ2FsbCddLFxuICAgICAgcGFyYW1ldGVyU2VhcmNoUXVlcnk6IFt0aGlzLnBhcmFtZXRlclNlYXJjaFF1ZXJ5ID8/ICcnXSxcbiAgICAgIHNlbGVjdGVkUGFyYW1ldGVySWQ6IFt0aGlzLnNlbGVjdGVkUGFyYW1ldGVySWQgPz8gbnVsbF0sXG4gICAgICBlbnZpcm9ubWVudFNlYXJjaFF1ZXJ5OiBbdGhpcy5lbnZpcm9ubWVudFNlYXJjaFF1ZXJ5ID8/ICcnXSxcbiAgICAgIHNlbGVjdGVkRW52aXJvbm1lbnRJZDogW3RoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkID8/IG51bGxdLFxuICAgICAgcnVudGltZVZhbHVlOiBbdGhpcy5ydW50aW1lVmFsdWUgPz8gJyddLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHNlbGVjdCBjb25maWdzIG9uY2UgKHNhbWUgcGF0dGVybiBhcyBMb29wIFN0ZXAgYnVpbGRTZWxlY3RDb25maWdzKS4gKi9cbiAgcHJpdmF0ZSBidWlsZFNlbGVjdENvbmZpZ3MoKTogdm9pZCB7XG4gICAgY29uc3QgdGFiT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBUQUJfU0VHTUVOVFMubWFwKChzKSA9PiAoe1xuICAgICAgaWQ6IHMudmFsdWUsXG4gICAgICB2YWx1ZTogcy52YWx1ZSxcbiAgICAgIG5hbWU6IHMubGFiZWwsXG4gICAgICBsYWJlbDogcy5sYWJlbCxcbiAgICB9KSk7XG4gICAgY29uc3QgZmlsdGVyT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBQQVJBTUVURVJfRklMVEVSX1RBQlMubWFwKChzKSA9PiAoe1xuICAgICAgaWQ6IHMudmFsdWUsXG4gICAgICB2YWx1ZTogcy52YWx1ZSxcbiAgICAgIG5hbWU6IHMubGFiZWwsXG4gICAgICBsYWJlbDogcy5sYWJlbCxcbiAgICB9KSk7XG4gICAgdGhpcy5hY3RpdmVUYWJTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdhY3RpdmVUYWInLFxuICAgICAgcGxhY2Vob2xkZXI6ICdUYWInLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiB0YWJPcHRpb25zLFxuICAgIH07XG4gICAgdGhpcy5wYXJhbWV0ZXJTY29wZUZpbHRlclNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3BhcmFtZXRlclNjb3BlRmlsdGVyJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2NvcGUnLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBmaWx0ZXJPcHRpb25zLFxuICAgIH07XG4gIH1cblxuICAvKiogVXBkYXRlIGZvcm0gY29udHJvbCBhbmQgc3luYyBjb21wb25lbnQgc3RhdGUgKHNhbWUgcGF0dGVybiBhcyBMb29wIFN0ZXAgb25FZGl0Rm9ybUZpZWxkQ2hhbmdlKS4gKi9cbiAgb25FZGl0Rm9ybUZpZWxkQ2hhbmdlKGNvbnRyb2xOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybS5nZXQoY29udHJvbE5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgaWYgKGNvbnRyb2xOYW1lID09PSAndmFsdWUnICYmIHRoaXMuYWN0aXZlVGFiID09PSAncGxhaW4tdGV4dCcpIHtcbiAgICAgIHRoaXMucGxhaW5UZXh0VmFsdWUgPSBTdHJpbmcodmFsdWUgPz8gJycpO1xuICAgIH1cbiAgICB0aGlzLnN5bmNTdGF0ZUZyb21Gb3JtKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogU3luYyBjb21wb25lbnQgc3RhdGUgZnJvbSBlZGl0Rm9ybSBzbyBnZXR0ZXJzIChlLmcuIGZpbHRlcmVkUGFyYW1ldGVycykgc3RheSBjb3JyZWN0LiAqL1xuICBwcml2YXRlIHN5bmNTdGF0ZUZyb21Gb3JtKCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLmVkaXRGb3JtLnZhbHVlO1xuICAgIHRoaXMudmFsdWUgPSB2LnZhbHVlID8/ICcnO1xuICAgIHRoaXMuYWN0aXZlVGFiID0gKHYuYWN0aXZlVGFiID8/ICdwbGFpbi10ZXh0JykgYXMgVGVzdERhdGFNb2RhbFRhYjtcbiAgICB0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyID0gKHYucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPz8gJ2FsbCcpIGFzIFBhcmFtZXRlclNjb3BlRmlsdGVyO1xuICAgIHRoaXMucGFyYW1ldGVyU2VhcmNoUXVlcnkgPSB2LnBhcmFtZXRlclNlYXJjaFF1ZXJ5ID8/ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA9IHYuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA/PyBudWxsO1xuICAgIHRoaXMuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA9IHYuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA/PyAnJztcbiAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IHYuc2VsZWN0ZWRFbnZpcm9ubWVudElkID8/IG51bGw7XG4gICAgdGhpcy5ydW50aW1lVmFsdWUgPSB2LnJ1bnRpbWVWYWx1ZSA/PyAnJztcbiAgfVxuXG4gIC8qKiBGaWx0ZXJlZCBwYXJhbWV0ZXJzIGJ5IHNjb3BlIGFuZCBzZWFyY2ggKFBhcmFtZXRlciB0YWIpLiAqL1xuICBnZXQgZmlsdGVyZWRQYXJhbWV0ZXJzKCk6IFBhcmFtZXRlckl0ZW1bXSB7XG4gICAgbGV0IGxpc3QgPSB0aGlzLnBhcmFtZXRlcnM7XG4gICAgaWYgKHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPT09ICdnbG9iYWwnKSB7XG4gICAgICBsaXN0ID0gbGlzdC5maWx0ZXIoKHApID0+IHAuc2NvcGUgPT09ICdHbG9iYWwnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPT09ICdsb2NhbCcpIHtcbiAgICAgIGxpc3QgPSBsaXN0LmZpbHRlcigocCkgPT4gcC5zY29wZSA9PT0gJ0xvY2FsJyk7XG4gICAgfVxuICAgIGNvbnN0IHEgPSB0aGlzLnBhcmFtZXRlclNlYXJjaFF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChxKSB7XG4gICAgICBsaXN0ID0gbGlzdC5maWx0ZXIoKHApID0+IHAubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICAvKiogRmlsdGVyZWQgZW52aXJvbm1lbnQgaXRlbXMgYnkgc2VhcmNoIChFbnZpcm9ubWVudCB0YWIpLiAqL1xuICBnZXQgZmlsdGVyZWRFbnZpcm9ubWVudHMoKTogRW52aXJvbm1lbnRJdGVtW10ge1xuICAgIGNvbnN0IHEgPSB0aGlzLmVudmlyb25tZW50U2VhcmNoUXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFxKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudEl0ZW1zO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudEl0ZW1zLmZpbHRlcihcbiAgICAgIChlKSA9PlxuICAgICAgICBlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fCBlLnZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSlcbiAgICApO1xuICB9XG5cbiAgLyoqIFBhcmFtZXRlciB0YWI6IGxpc3QgY29uZmlnIGZvciBjcWEtaXRlbS1saXN0IChzZWFyY2gtZnJpZW5kbHk6IGJpbmQgZmlsdGVyZWQgbGlzdCkuICovXG4gIGdldCBwYXJhbWV0ZXJMaXN0Q29uZmlnKCk6IENxYUxpc3RJdGVtQ29uZmlnW10ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUGFyYW1ldGVycy5tYXAoKHApID0+ICh7XG4gICAgICBpZDogcC5pZCxcbiAgICAgIHRpdGxlOiBwLm5hbWUsXG4gICAgICBzdWJ0aXRsZTogcC52YWx1ZSxcbiAgICAgIGJhZGdlOiBwLnNjb3BlLFxuICAgICAgc2hvd0VkaXQ6IHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA9PT0gcC5pZCxcbiAgICB9KSk7XG4gIH1cblxuICAvKiogRW52aXJvbm1lbnQgdGFiOiBsaXN0IGNvbmZpZyBmb3IgY3FhLWl0ZW0tbGlzdC4gKi9cbiAgZ2V0IGVudmlyb25tZW50TGlzdENvbmZpZygpOiBDcWFMaXN0SXRlbUNvbmZpZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZEVudmlyb25tZW50cy5tYXAoKGUpID0+ICh7XG4gICAgICBpZDogZS5pZCxcbiAgICAgIHRpdGxlOiBlLm5hbWUsXG4gICAgICBzdWJ0aXRsZTogYFZhbHVlOiAke2UudmFsdWV9YCxcbiAgICAgIGJhZGdlOiBlLmVudmlyb25tZW50LFxuICAgICAgc2hvd0VkaXQ6IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkID09PSBlLmlkICYmIChlLmVkaXRhYmxlID8/IHRydWUpLFxuICAgIH0pKTtcbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKHRhYlZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdwbGFpbi10ZXh0Jykge1xuICAgICAgdGhpcy5wbGFpblRleHRWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJztcbiAgICB9XG4gICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ2FjdGl2ZVRhYicsIHRhYlZhbHVlKTtcbiAgICBpZiAodGFiVmFsdWUgPT09ICdwbGFpbi10ZXh0Jykge1xuICAgICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3ZhbHVlJywgdGhpcy5wbGFpblRleHRWYWx1ZSA/PyAnJyk7XG4gICAgfVxuICB9XG5cbiAgb25QYXJhbWV0ZXJTY29wZUZpbHRlckNoYW5nZShmaWx0ZXI6IFBhcmFtZXRlclNjb3BlRmlsdGVyKTogdm9pZCB7XG4gICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3BhcmFtZXRlclNjb3BlRmlsdGVyJywgZmlsdGVyKTtcbiAgfVxuXG4gIG9uUGFyYW1ldGVyU2VhcmNoSW5wdXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdwYXJhbWV0ZXJTZWFyY2hRdWVyeScsIHZhbHVlKTtcbiAgfVxuXG4gIG9uUGFyYW1ldGVyU2VsZWN0KHBhcmFtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmFtID0gdGhpcy5wYXJhbWV0ZXJzLmZpbmQoKHApID0+IHAuaWQgPT09IHBhcmFtSWQpO1xuICAgIGlmIChwYXJhbSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID0gdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID09PSBwYXJhbS5pZCA/IG51bGwgOiBwYXJhbS5pZDtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdzZWxlY3RlZFBhcmFtZXRlcklkJywgdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkKTtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCd2YWx1ZScsIHBhcmFtLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBIYW5kbGUgcm93IGNsaWNrIChzZWxlY3QgcGFyYW1ldGVyKS4gRWRpdCBidXR0b24gdXNlcyBvblBhcmFtZXRlckVkaXRDbGljayB0byBhdm9pZCB0cmlnZ2VyaW5nIHRoaXMuICovXG4gIG9uUGFyYW1ldGVyUm93Q2xpY2soZXZlbnQ6IEV2ZW50LCBpdGVtOiB7IGlkOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJ2J1dHRvbiwgbWF0LWljb24sIFthcmlhLWxhYmVsPVwiRWRpdFwiXScpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub25QYXJhbWV0ZXJTZWxlY3QoaXRlbS5pZCk7XG4gIH1cblxuICAvKiogSGFuZGxlIEVkaXQgYnV0dG9uIGNsaWNrIC0gc3RvcCBwcm9wYWdhdGlvbiBhbmQgZW1pdCBzbyBwYXJlbnQgY2FuIG5hdmlnYXRlLiAqL1xuICBvblBhcmFtZXRlckVkaXRDbGljayhldmVudDogTW91c2VFdmVudCwgcGFyYW1JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLm9uUGFyYW1ldGVyRWRpdChwYXJhbUlkKTtcbiAgfVxuXG4gIG9uUGFyYW1ldGVyRWRpdChwYXJhbUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmFtZXRlckVkaXQuZW1pdChwYXJhbUlkKTtcbiAgfVxuXG4gIG9uQ3JlYXRlTmV3VmFyaWFibGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnBhcmFtZXRlckNyZWF0ZS5lbWl0KCk7XG4gIH1cblxuICBvbkVudmlyb25tZW50U2VhcmNoSW5wdXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdlbnZpcm9ubWVudFNlYXJjaFF1ZXJ5JywgdmFsdWUpO1xuICB9XG5cbiAgb25FbnZpcm9ubWVudFNlbGVjdChpdGVtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmVudmlyb25tZW50SXRlbXMuZmluZCgoZSkgPT4gZS5pZCA9PT0gaXRlbUlkKTtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgPVxuICAgICAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9PT0gaXRlbS5pZCA/IG51bGwgOiBpdGVtLmlkO1xuICAgICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3NlbGVjdGVkRW52aXJvbm1lbnRJZCcsIHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkKTtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCd2YWx1ZScsIGl0ZW0ubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgb25FbnZpcm9ubWVudEVkaXQoaXRlbUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmVudmlyb25tZW50RWRpdC5lbWl0KGl0ZW1JZCk7XG4gIH1cblxuICBvbkNyZWF0ZU5ld0Vudmlyb25tZW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5lbnZpcm9ubWVudENyZWF0ZS5lbWl0KCk7XG4gIH1cblxuICAvKiogUnVudGltZSB0YWI6IHJlcGxhY2UgdGhlIHJ1bnRpbWUgaW5wdXQgd2l0aCB0aGUgc2VsZWN0ZWQgc3VnZ2VzdGlvbi4gKi9cbiAgb25SdW50aW1lQ2hpcEluc2VydChzbmlwcGV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9uRWRpdEZvcm1GaWVsZENoYW5nZSgncnVudGltZVZhbHVlJywgc25pcHBldCk7XG4gIH1cblxuICBvbkFwcGx5KCk6IHZvaWQge1xuICAgIHRoaXMuc3luY1N0YXRlRnJvbUZvcm0oKTtcbiAgICBsZXQgdmFsdWVUb0FwcGx5ID0gdGhpcy5hY3RpdmVUYWIgPT09ICdydW50aW1lJyA/IHRoaXMucnVudGltZVZhbHVlIDogdGhpcy52YWx1ZTtcblxuICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ3BhcmFtZXRlcicpIHtcbiAgICAgIHZhbHVlVG9BcHBseSA9IHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA/IHRoaXMucGFyYW1ldGVycy5maW5kKChwKSA9PiBwLmlkID09PSB0aGlzLnNlbGVjdGVkUGFyYW1ldGVySWQpPy5uYW1lID8/ICcnIDogJyc7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgdmFsdWVUb0FwcGx5ID0gdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgPyB0aGlzLmVudmlyb25tZW50SXRlbXMuZmluZCgoZSkgPT4gZS5pZCA9PT0gdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQpPy5uYW1lID8/ICcnIDogJyc7XG4gICAgfVxuXG4gICAgLy8gV3JhcCB2YWx1ZVRvQXBwbHkgYmFzZWQgb24gYWN0aXZlIHRhYlxuICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ3BhcmFtZXRlcicgJiYgdmFsdWVUb0FwcGx5KSB7XG4gICAgICB2YWx1ZVRvQXBwbHkgPSBgQHwke3ZhbHVlVG9BcHBseX18YDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAncnVudGltZScgJiYgdmFsdWVUb0FwcGx5KSB7XG4gICAgICB2YWx1ZVRvQXBwbHkgPSBgJHwke3ZhbHVlVG9BcHBseX18YDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAnZW52aXJvbm1lbnQnICYmIHZhbHVlVG9BcHBseSkge1xuICAgICAgdmFsdWVUb0FwcGx5ID0gYCp8JHt2YWx1ZVRvQXBwbHl9fGA7XG4gICAgfVxuICAgIC8vIHBsYWluLXRleHQgdGFiOiBubyB3cmFwcGluZywgdXNlIHZhbHVlIGFzIGlzXG5cbiAgICAvLyBCdWlsZCByZXN1bHQgd2l0aCBvbmx5IHRoZSBhY3RpdmUgdGFiJ3MgZGF0YSwgY2xlYXIgb3RoZXIgdGFicycgZGF0YVxuICAgIGNvbnN0IHJlc3VsdDogVGVzdERhdGFNb2RhbERhdGEgPSB7XG4gICAgICB2YWx1ZTogdmFsdWVUb0FwcGx5LFxuICAgICAgYWN0aXZlVGFiOiB0aGlzLmFjdGl2ZVRhYixcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSBwYXJhbWV0ZXIgZGF0YSBpZiBwYXJhbWV0ZXIgdGFiIGlzIGFjdGl2ZVxuICAgICAgcGFyYW1ldGVyU2NvcGVGaWx0ZXI6IHRoaXMuYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJyA/IHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgOiB1bmRlZmluZWQsXG4gICAgICBwYXJhbWV0ZXJTZWFyY2hRdWVyeTogdGhpcy5hY3RpdmVUYWIgPT09ICdwYXJhbWV0ZXInID8gdGhpcy5wYXJhbWV0ZXJTZWFyY2hRdWVyeSA6IHVuZGVmaW5lZCxcbiAgICAgIHNlbGVjdGVkUGFyYW1ldGVySWQ6IHRoaXMuYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJyA/IHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA6IHVuZGVmaW5lZCxcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSBlbnZpcm9ubWVudCBkYXRhIGlmIGVudmlyb25tZW50IHRhYiBpcyBhY3RpdmVcbiAgICAgIGVudmlyb25tZW50U2VhcmNoUXVlcnk6IHRoaXMuYWN0aXZlVGFiID09PSAnZW52aXJvbm1lbnQnID8gdGhpcy5lbnZpcm9ubWVudFNlYXJjaFF1ZXJ5IDogdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0ZWRFbnZpcm9ubWVudElkOiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ2Vudmlyb25tZW50JyA/IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkIDogdW5kZWZpbmVkLFxuICAgICAgLy8gT25seSBpbmNsdWRlIHJ1bnRpbWUgZGF0YSBpZiBydW50aW1lIHRhYiBpcyBhY3RpdmVcbiAgICAgIHJ1bnRpbWVWYWx1ZTogdGhpcy5hY3RpdmVUYWIgPT09ICdydW50aW1lJyA/IHRoaXMucnVudGltZVZhbHVlIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICB0aGlzLmFwcGx5LmVtaXQoe3ZhbHVlOiB2YWx1ZVRvQXBwbHksIGFjdGl2ZVRhYjogdGhpcy5hY3RpdmVUYWIgYXMgVGVzdERhdGFNb2RhbFRhYn0pO1xuICAgIHRoaXMucmVmLmNsb3NlKHJlc3VsdCk7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUodGhpcy5lZGl0U25hcHNob3QpO1xuICAgIHRoaXMuc3luY1N0YXRlRnJvbUZvcm0oKTtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgdGhpcy5yZWYuY2xvc2UodW5kZWZpbmVkKTtcbiAgfVxuXG4gIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5vbkNhbmNlbCgpO1xuICB9XG5cbiAgb25FZGl0SW5EZXB0aChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZWRpdEluRGVwdGguZW1pdCgpO1xuICAgIHRoaXMucmVmLmNsb3NlKFRFU1RfREFUQV9NT0RBTF9FRElUX0lOX0RFUFRIIGFzIGFueSk7XG4gIH1cblxuICBvbkhlbHAoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGVscFVybCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHdpbmRvdy5vcGVuKHRoaXMuaGVscFVybCwgJ19ibGFuaycpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImNxYS1iZy13aGl0ZSBjcWEtcm91bmRlZC1bMTJweF0gY3FhLXNoYWRvdy1sZyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl0gY3FhLXctWzUwMHB4XSBjcWEtbWF4LWgtWzc3dmhdIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLVsxMnB4XSBjcWEtcC0yIGNxYS1ib3gtYm9yZGVyIGNxYS1taW4taC0wXCI+XG4gIDwhLS0gSGVhZGVyOiB0aXRsZSBsZWZ0OyBOZWVkIGhlbHA/ICsgY2xvc2UgaWNvbiByaWdodCAobm8gb3ZlcmZsb3cgaGVyZSBzbyB0b29sdGlwIGlzIG5vdCBjbGlwcGVkKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXNocmluay0wIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTIgY3FhLXB4LTRcIj5cbiAgICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1bMTZweF0gY3FhLWxlYWRpbmctWzI0cHhdIGNxYS1mb250LWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTAgY3FhLWZvbnQtWzYwMF1cIj5cbiAgICAgIFRlc3QgRGF0YVxuICAgIDwvaDI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1taW4taC1bMjhweF1cIj5cbiAgICAgIDwhLS0gTmVlZCBoZWxwPyB3aXRoIGN1c3RvbSB0b29sdGlwOiBzaG93IGJlbG93IHRyaWdnZXIgc28gaXQgaXMgbm90IGNsaXBwZWQgYnkgbW9kYWwgb3ZlcmZsb3cteS1hdXRvIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cInNob3dIZWxwVG9vbHRpcCA9IHRydWVcIiAobW91c2VsZWF2ZSk9XCJzaG93SGVscFRvb2x0aXAgPSBmYWxzZVwiPlxuICAgICAgICA8YSAqbmdJZj1cImhlbHBVcmxcIiBocmVmPVwiI1wiIChjbGljayk9XCJvbkhlbHAoJGV2ZW50KVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyMXB4XSBjcWEtbm8tdW5kZXJsaW5lIGhvdmVyOmNxYS11bmRlcmxpbmUgY3FhLWN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE3IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCN0ZXN0LWRhdGEtaGVscC1jbGlwKVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNTAwMzMgMTQuNjY2M0MxMi40MTIzIDE0LjY2NjMgMTUuNTgzNyAxMS42ODE2IDE1LjU4MzcgNy45OTk2N0MxNS41ODM3IDQuMzE3NzggMTIuNDEyMyAxLjMzMzAxIDguNTAwMzMgMS4zMzMwMUM0LjU4ODMxIDEuMzMzMDEgMS40MTY5OSA0LjMxNzc4IDEuNDE2OTkgNy45OTk2N0MxLjQxNjk5IDExLjY4MTYgNC41ODgzMSAxNC42NjYzIDguNTAwMzMgMTQuNjY2M1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi40Mzg0OCA2LjAwMDM4QzYuNjA1MDEgNS41NTQ4MyA2LjkzMzcxIDUuMTc5MTIgNy4zNjYzNiA0LjkzOThDNy43OTkwMSA0LjcwMDQ5IDguMzA3NjkgNC42MTMwMSA4LjgwMjMxIDQuNjkyODVDOS4yOTY5MyA0Ljc3MjcgOS43NDU1NiA1LjAxNDczIDEwLjA2ODcgNS4zNzYwN0MxMC4zOTE5IDUuNzM3NCAxMC41Njg4IDYuMTk0NzMgMTAuNTY4MSA2LjY2NzA1QzEwLjU2ODEgOC4wMDAzOCA4LjQ0MzA2IDguNjY3MDUgOC40NDMwNiA4LjY2NzA1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNSAxMS4zMzNIOC41MDk2NlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJ0ZXN0LWRhdGEtaGVscC1jbGlwXCI+XG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIE5lZWQgaGVscCA/XG4gICAgICAgIDwvYT5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhaGVscFVybFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtZm9udC1bNTAwXSBjcWEtdGV4dC1bMTBweF0gY3FhLWN1cnNvci1kZWZhdWx0XCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE3IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMCBjcWEtdGV4dC1bIzNGNDNFRV1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjdGVzdC1kYXRhLWhlbHAtY2xpcC1ub2xpbmspXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC41MDAzMyAxNC42NjYzQzEyLjQxMjMgMTQuNjY2MyAxNS41ODM3IDExLjY4MTYgMTUuNTgzNyA3Ljk5OTY3QzE1LjU4MzcgNC4zMTc3OCAxMi40MTIzIDEuMzMzMDEgOC41MDAzMyAxLjMzMzAxQzQuNTg4MzEgMS4zMzMwMSAxLjQxNjk5IDQuMzE3NzggMS40MTY5OSA3Ljk5OTY3QzEuNDE2OTkgMTEuNjgxNiA0LjU4ODMxIDE0LjY2NjMgOC41MDAzMyAxNC42NjYzWlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjQzODQ4IDYuMDAwMzhDNi42MDUwMSA1LjU1NDgzIDYuOTMzNzEgNS4xNzkxMiA3LjM2NjM2IDQuOTM5OEM3Ljc5OTAxIDQuNzAwNDkgOC4zMDc2OSA0LjYxMzAxIDguODAyMzEgNC42OTI4NUM5LjI5NjkzIDQuNzcyNyA5Ljc0NTU2IDUuMDE0NzMgMTAuMDY4NyA1LjM3NjA3QzEwLjM5MTkgNS43Mzc0IDEwLjU2ODggNi4xOTQ3MyAxMC41NjgxIDYuNjY3MDVDMTAuNTY4MSA4LjAwMDM4IDguNDQzMDYgOC42NjcwNSA4LjQ0MzA2IDguNjY3MDVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC41IDExLjMzM0g4LjUwOTY2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cInRlc3QtZGF0YS1oZWxwLWNsaXAtbm9saW5rXCI+XG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIE5lZWQgaGVscCA/XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPCEtLSBUb29sdGlwIGFib3ZlIHRyaWdnZXIgKHNhbWUgYXMgZWxlbWVudC1wb3B1cCk7IGhlYWRlciBoYXMgbm8gb3ZlcmZsb3cgc28gdG9vbHRpcCBpcyBub3QgY2xpcHBlZCAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dIZWxwVG9vbHRpcFwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotWzEwMF0gY3FhLWJvdHRvbS1bMTAwJV0gY3FhLW1iLTEgY3FhLWxlZnQtMFwiXG4gICAgICAgICAgcm9sZT1cInRvb2x0aXBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtd2hpdGUgY3FhLXRleHQtbGVmdCBjcWEtdy1bMzA2cHhdIGNxYS1tYXgtdy1bMzA2cHhdIGNxYS1taW4taC1bMjBweF0gY3FhLXJvdW5kZWQtWzZweF0gY3FhLXB5LTEgY3FhLXB4LTIgY3FhLWJnLVsjMEEwQTBBXSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLXRleHQtWzhweF0gY3FhLWJyZWFrLXdvcmRzXCI+XG4gICAgICAgICAgICB7eyBoZWxwVG9vbHRpcFRleHQgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIGJ0blNpemU9XCJtZFwiXG4gICAgICAgIFt0ZXh0XT1cIicnXCJcbiAgICAgICAgaWNvbj1cImNsb3NlXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DbG9zZSgpXCJcbiAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtbWluLWgtWzI4cHhdIGNxYS1taW4tdy1bMjhweF0gY3FhLXAtMCBjcWEtdGV4dC1bIzZCNzI4MF0gaG92ZXI6Y3FhLWJnLVsjRjNGNEY2XSdcIlxuICAgICAgICB0aXRsZT1cIkNsb3NlXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gTGluZSBiZWxvdyBoZWFkZXIgKGZ1bGwgd2lkdGggb2YgbW9kYWwsIG5vIHNpZGUgbWFyZ2luKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS0tbXgtMiBjcWEtdy1bY2FsYygxMDAlKzFyZW0pXSBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtaC1weCBjcWEtdy1mdWxsIGNxYS1iZy1bI0U1RTdFQl1cIiByb2xlPVwicHJlc2VudGF0aW9uXCI+PC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gVGFiczogUGxhaW4gVGV4dCwgUGFyYW1ldGVyLCBFbnZpcm9ubWVudCwgUnVudGltZSAoZnVsbC13aWR0aCwgY3FhLWJ1dHRvbikgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1taW4tdy0wIGNxYS10ZXN0LWRhdGEtbW9kYWwtdGFicyBjcWEtZmxleCBjcWEtZmxleC1yb3cgY3FhLXAtWzMuNXB4XSBjcWEtaC1bMzEuNXB4XSBjcWEtcm91bmRlZC1bOHB4XSBjcWEtYmctWyNGM0Y0RjZdIGNxYS1nYXAtMFwiIHJvbGU9XCJ0YWJsaXN0XCI+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgc2VnbWVudCBvZiB0YWJTZWdtZW50c1wiIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtZmxleFwiPlxuICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFthdHRyLnJvbGVdPVwiJ3RhYidcIlxuICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIihlZGl0Rm9ybS5nZXQoJ2FjdGl2ZVRhYicpPy52YWx1ZSA/PyBhY3RpdmVUYWIpID09PSBzZWdtZW50LnZhbHVlXCJcbiAgICAgICAgW3RleHRdPVwic2VnbWVudC5sYWJlbFwiXG4gICAgICAgIFt2YXJpYW50XT1cIihlZGl0Rm9ybS5nZXQoJ2FjdGl2ZVRhYicpPy52YWx1ZSA/PyBhY3RpdmVUYWIpID09PSBzZWdtZW50LnZhbHVlID8gJ2ZpbGxlZCcgOiAndGV4dCdcIlxuICAgICAgICBidG5TaXplPVwibWRcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvblRhYkNoYW5nZShzZWdtZW50LnZhbHVlKVwiXG4gICAgICAgIFtjdXN0b21DbGFzc109XCIoZWRpdEZvcm0uZ2V0KCdhY3RpdmVUYWInKT8udmFsdWUgPz8gYWN0aXZlVGFiKSA9PT0gc2VnbWVudC52YWx1ZSA/ICdjcWEtaC1bMjVweF0gY3FhLXJvdW5kZWQtWzhweF0gY3FhLXRleHQtWzEycHhdIGNxYS1iZy1bIzNGNDNFRV0gY3FhLXRleHQtd2hpdGUgY3FhLWZvbnQtbWVkaXVtJyA6ICdjcWEtaC1bMjVweF0gY3FhLXJvdW5kZWQtWzhweF0gY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtdGV4dC1bIzExMTgyN10nXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQ29udGVudCBwZXIgdGFiOiBvbmx5IHRoaXMgc2VjdGlvbiBzY3JvbGxzIChvdmVyZmxvdyBoZXJlLCBub3Qgb24gcm9vdCksIHNvIGhlYWRlciB0b29sdGlwIGlzIG5ldmVyIGNsaXBwZWQgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi1oLTAgY3FhLW92ZXJmbG93LXktYXV0b1wiXG4gICAgW2NsYXNzLmNxYS1mbGV4LTFdPVwiYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJyB8fCBhY3RpdmVUYWIgPT09ICdlbnZpcm9ubWVudCcgfHwgYWN0aXZlVGFiID09PSAncnVudGltZSdcIj5cbiAgICA8IS0tIFBsYWluIFRleHQgdGFiIChmb3JtLWJvdW5kIGxpa2UgTG9vcCBTdGVwIGVkaXRGb3JtICsgb25FZGl0Rm9ybUZpZWxkQ2hhbmdlKSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlVGFiID09PSAncGxhaW4tdGV4dCdcIj5cbiAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgIGxhYmVsPVwiVmFsdWVcIlxuICAgICAgICBbdmFsdWVdPVwiZWRpdEZvcm0uZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3ZhbHVlJywgJGV2ZW50KVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly9leGFtcGxlLmNvbS9kYXNoYm9hcmRcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICBzaXplPVwibWRcIj5cbiAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLW0tMFwiPlxuICAgICAgICBFbnRlciBhIHN0YXRpYyB0ZXh0IHZhbHVlIHRoYXQgd29uJ3QgY2hhbmdlIGR1cmluZyBleGVjdXRpb24uXG4gICAgICA8L3A+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIFBhcmFtZXRlciB0YWI6IFZhcmlhYmxlIExpYnJhcnkgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ3BhcmFtZXRlcidcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1taW4taC0wIGNxYS1mbGV4LTEgY3FhLW1pbi1oLVsxOHJlbV1cIj5cbiAgICAgICAgPCEtLSBWYXJpYWJsZSBMaWJyYXJ5IGhlYWRlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTBcIj5cbiAgICAgICAgICAgIFBhcmFtZXRlcnNcbiAgICAgICAgICA8L2gzPlxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uQ3JlYXRlTmV3VmFyaWFibGUoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtbm8tdW5kZXJsaW5lIGhvdmVyOmNxYS1vcGFjaXR5LTkwIGNxYS1jdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgQ3JlYXRlIE5ldyArXG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBTZWFyY2g6IGJvdW5kIHRvIGVkaXRGb3JtIChzYW1lIHBhdHRlcm4gYXMgTG9vcCBTdGVwIGNvbnRyb2wgYmluZGluZykgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIDxjcWEtc2VhcmNoLWJhclxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWFyY2ggbGlicmFyeSdcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImVkaXRGb3JtLmdldCgncGFyYW1ldGVyU2VhcmNoUXVlcnknKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbYXJpYUxhYmVsXT1cIidTZWFyY2ggbGlicmFyeSdcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uUGFyYW1ldGVyU2VhcmNoSW5wdXQoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvY3FhLXNlYXJjaC1iYXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFBhcmFtZXRlciBsaXN0IChzY3JvbGxhYmxlLCBzZWFyY2gtaW50ZWdyYXRlZCB2aWEgZmlsdGVyZWQgbGlzdCBiaW5kaW5nKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4taC1bMjAwcHhdIGNxYS1mbGV4LTEgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMSBjcWEtbWluLWgtMCBjcWEtb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcGFyYW1ldGVyTGlzdENvbmZpZ1wiXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25QYXJhbWV0ZXJSb3dDbGljaygkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uUGFyYW1ldGVyUm93Q2xpY2soJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJvblBhcmFtZXRlclJvd0NsaWNrKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS1iZy1bI0Q4RDlGQ11dPVwic2VsZWN0ZWRQYXJhbWV0ZXJJZCA9PT0gaXRlbS5pZFwiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWJvcmRlcl09XCJzZWxlY3RlZFBhcmFtZXRlcklkID09PSBpdGVtLmlkXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLXNvbGlkXT1cInNlbGVjdGVkUGFyYW1ldGVySWQgPT09IGl0ZW0uaWRcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXItWyMzRjQzRUVdXT1cInNlbGVjdGVkUGFyYW1ldGVySWQgPT09IGl0ZW0uaWRcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS10ZXh0LWxlZnQgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLWJnLXdoaXRlIGhvdmVyOmNxYS1iZy1bI0Y5RkFGQl0gZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLTIgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1bI0Q4RDlGQ10gY3FhLWN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0YXJ0IGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIwcHhdIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wIGNxYS10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAge3sgaXRlbS50aXRsZSB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIml0ZW0uc3VidGl0bGVcIiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tLTAgY3FhLW10LTAuNSBjcWEtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uc3VidGl0bGUgfX1cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1lbmQgY3FhLWdhcC0xIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtLmJhZGdlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLXB4LTIgY3FhLXJvdW5kZWQtWzhweF0gY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW5vcm1hbCBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLWJnLVsjZWZmNmZmXSBjcWEtdGV4dC1bIzE0NDdFNl0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNjOGUwZmZdXCI+XG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLmJhZGdlIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5zaG93RWRpdFwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTEgY3FhLW1pbi13LTAgY3FhLXRleHQtWyMxNDQ3RTZdIGhvdmVyOmNxYS1iZy1bI0U1RTdFQl0gY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcm91bmRlZC1bNnB4XSBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUGFyYW1ldGVyRWRpdENsaWNrKCRldmVudCwgaXRlbS5pZClcIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJFZGl0XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0XCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCIhY3FhLXctNCAhY3FhLWgtNCAhY3FhLXRleHQtWzE2cHhdXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUGFyYW1ldGVyRWRpdENsaWNrKCRldmVudCwgaXRlbS5pZClcIj5lZGl0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCAqbmdJZj1cInBhcmFtZXRlckxpc3RDb25maWcubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbS0wIGNxYS1weS00IGNxYS10ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgTm8gcGFyYW1ldGVycyBtYXRjaCB5b3VyIHNlYXJjaC5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIEVudmlyb25tZW50IHRhYjogVmFyaWFibGUgbGlicmFyeSBieSBlbnZpcm9ubWVudCAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlVGFiID09PSAnZW52aXJvbm1lbnQnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMiBjcWEtbWluLWgtMCBjcWEtZmxleC0xIGNxYS1taW4taC1bMThyZW1dXCI+XG4gICAgICAgIDwhLS0gU2VjdGlvbiBoZWFkZXIgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIwcHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wXCI+XG4gICAgICAgICAgICBFbnZpcm9ubWVudFxuICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwib25DcmVhdGVOZXdFbnZpcm9ubWVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1uby11bmRlcmxpbmUgaG92ZXI6Y3FhLW9wYWNpdHktOTAgY3FhLWN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICBDcmVhdGUgTmV3ICtcbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFNlYXJjaDogYm91bmQgdG8gZWRpdEZvcm0gKHNhbWUgcGF0dGVybiBhcyBMb29wIFN0ZXAgY29udHJvbCBiaW5kaW5nKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgPGNxYS1zZWFyY2gtYmFyXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlYXJjaCBFbnZpcm9ubWVudCdcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImVkaXRGb3JtLmdldCgnZW52aXJvbm1lbnRTZWFyY2hRdWVyeScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiJ1NlYXJjaCBFbnZpcm9ubWVudCdcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRW52aXJvbm1lbnRTZWFyY2hJbnB1dCgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtc2VhcmNoLWJhcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gRW52aXJvbm1lbnQgbGlzdCAoc2Nyb2xsYWJsZSwgc2VhcmNoLWludGVncmF0ZWQgdmlhIGZpbHRlcmVkIGxpc3QgYmluZGluZykgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWluLWgtWzIyMHB4XSBjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEgY3FhLW1pbi1oLTAgY3FhLW92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGVudmlyb25tZW50TGlzdENvbmZpZ1wiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkVudmlyb25tZW50U2VsZWN0KGl0ZW0uaWQpXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtYmctWyNEOEQ5RkNdXT1cInNlbGVjdGVkRW52aXJvbm1lbnRJZCA9PT0gaXRlbS5pZFwiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWJvcmRlcl09XCJzZWxlY3RlZEVudmlyb25tZW50SWQgPT09IGl0ZW0uaWRcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXItc29saWRdPVwic2VsZWN0ZWRFbnZpcm9ubWVudElkID09PSBpdGVtLmlkXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLVsjM0Y0M0VFXV09XCJzZWxlY3RlZEVudmlyb25tZW50SWQgPT09IGl0ZW0uaWRcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS10ZXh0LWxlZnQgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLWJnLXdoaXRlIGhvdmVyOmNxYS1iZy1bI0Y5RkFGQl0gZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLTIgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1bI0Q4RDlGQ11cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RhcnQgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTAgY3FhLXRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiaXRlbS5zdWJ0aXRsZVwiIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW0tMCBjcWEtbXQtMC41IGNxYS10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAge3sgaXRlbS5zdWJ0aXRsZSB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWVuZCBjcWEtZ2FwLTEgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0uYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtcHgtMiBjcWEtcm91bmRlZC1bOHB4XSBjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtYmctWyNlZmY2ZmZdIGNxYS10ZXh0LVsjMTQ0N0U2XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI2M4ZTBmZl1cIj5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uYmFkZ2UgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPHAgKm5nSWY9XCJlbnZpcm9ubWVudExpc3RDb25maWcubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbS0wIGNxYS1weS00IGNxYS10ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgTm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIG1hdGNoIHlvdXIgc2VhcmNoLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gUnVudGltZSB0YWI6IGR5bmFtaWMgdmFsdWUgaW5qZWN0b3IgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ3J1bnRpbWUnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtbWluLWgtMCBjcWEtaC1mdWxsIGNxYS1vdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyMHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMCBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIFJ1bnRpbWVcbiAgICAgICAgPC9oMz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgIFt2YWx1ZV09XCJlZGl0Rm9ybS5nZXQoJ3J1bnRpbWVWYWx1ZScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdydW50aW1lVmFsdWUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiaW5wdXQgdGV4dFwiXG4gICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgc2l6ZT1cIm1kXCI+XG4gICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW10LTEuNSBjcWEtbWItMFwiPlxuICAgICAgICAgICAgVmFsdWVzIHJlc29sdmVkIGR1cmluZyB0ZXN0IGV4ZWN1dGlvbiBiYXNlZCBvbiBzZXNzaW9uIGFuZCBzdGVwIHN0YXRlLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gUmVjb21tZW5kZWQ6IHN1Z2dlc3Rpb24gY2hpcHMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy00ICFjcWEtaC00ICFjcWEtdGV4dC1bMTZweF0gY3FhLXRleHQtWyM5Q0EzQUZdXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+c2NoZWR1bGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzZCNzI4MF1cIj5SZWNvbW1lbmRlZDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRlc3QtZGF0YS1ydW50aW1lLWNoaXBzLXNjcm9sbCBjcWEtZmxleCBjcWEtZ2FwLTIgY3FhLW92ZXJmbG93LXgtYXV0byBjcWEtbWluLXctMCBjcWEtcGItMVwiPlxuICAgICAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHNuaXBwZXQgb2YgcnVudGltZVN1Z2dlc3RlZFZhbHVlc1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICBidG5TaXplPVwibWRcIlxuICAgICAgICAgICAgICBbdGV4dF09XCJzbmlwcGV0XCJcbiAgICAgICAgICAgICAgKGNsaWNrZWQpPVwib25SdW50aW1lQ2hpcEluc2VydChzbmlwcGV0KVwiXG4gICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXB4LTIgY3FhLXB5LTEgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1iZy1bI0ZGRkZGRl0gY3FhLWJvcmRlci1bI0U1RTdFQl0gY3FhLXJvdW5kZWQtWzhweF0gY3FhLXdoaXRlc3BhY2Utbm93cmFwJ1wiPlxuICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cblxuICA8IS0tIExpbmUgYmVsb3cgY29udGVudCAoZnVsbCB3aWR0aCBvZiBtb2RhbCwgbm8gc2lkZSBtYXJnaW4pIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLS1teC0yIGNxYS13LVtjYWxjKDEwMCUrMXJlbSldIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1oLXB4IGNxYS13LWZ1bGwgY3FhLWJnLVsjRTVFN0VCXVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBGb290ZXI6IENhbmNlbCwgQXBwbHkgKGZ1bGwgd2lkdGggaW4gb25lIHJvdykgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1zdHJldGNoIGNxYS1nYXAtMiBjcWEtdy1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiBbdGV4dF09XCInQ2FuY2VsJ1wiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIlxuICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzEycHhdIGNxYS1weS1bOXB4XSBjcWEtYm9yZGVyLVsjNDE0MTQ2XSdcIj48L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiBbdGV4dF09XCInQXBwbHknXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgKGNsaWNrZWQpPVwib25BcHBseSgpXCJcbiAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxMnB4XSBjcWEtcHktWzlweF0gY3FhLWJvcmRlci1bIzNGNDNFRV0nXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwib25FZGl0SW5EZXB0aCgkZXZlbnQpXCJcbiAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLW5vLXVuZGVybGluZSBob3ZlcjpjcWEtbm8tdW5kZXJsaW5lIGNxYS1zZWxmLWNlbnRlclwiPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LTQgIWNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XVwiPm9wZW5faW5fbmV3PC9tYXQtaWNvbj5cbiAgICAgIEVkaXQgaW4gZGVwdGggKG9wZW4gZGV0YWlsZWQgcmlnaHQgcGFuZWwpXG4gICAgPC9hPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
380
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1kYXRhLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvdGVzdC1kYXRhLW1vZGFsL3Rlc3QtZGF0YS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtZGF0YS1tb2RhbC90ZXN0LWRhdGEtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLDZCQUE2QixHQUc5QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBb0IsTUFBTSx1QkFBdUIsQ0FBQztBQUU5RSxPQUFPLEVBQ0wsc0JBQXNCLEdBRXZCLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUNMLGVBQWUsR0FHaEIsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7O0FBRzNDLE1BQU0sWUFBWSxHQUFHO0lBQ25CLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO0lBQzVDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO0lBQzFDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO0lBQzlDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0NBQ3ZDLENBQUM7QUFFRixNQUFNLHFCQUFxQixHQUFxRDtJQUM5RSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFB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Qjs7MEJBQzFCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsb0JBQW9COzRDQWpEaEMsS0FBSztzQkFBZCxNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFLRSxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFpQkcsU0FBUztzQkFBakIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIFRFU1RfREFUQV9NT0RBTF9EQVRBLFxuICBURVNUX0RBVEFfTU9EQUxfRURJVF9JTl9ERVBUSCxcbiAgVGVzdERhdGFNb2RhbERhdGEsXG4gIFRlc3REYXRhTW9kYWxUYWIsXG59IGZyb20gJy4vdGVzdC1kYXRhLW1vZGFsLWRhdGEnO1xuaW1wb3J0IHsgVEVTVF9EQVRBX01PREFMX1JFRiwgVGVzdERhdGFNb2RhbFJlZiB9IGZyb20gJy4vdGVzdC1kYXRhLW1vZGFsLXJlZic7XG5pbXBvcnQgeyBUZXN0RGF0YU1vZGFsUmVzdWx0IH0gZnJvbSAnLi90ZXN0LWRhdGEtbW9kYWwuc2VydmljZSc7XG5pbXBvcnQge1xuICBNT0NLX0VOVklST05NRU5UX0lURU1TLFxuICBFbnZpcm9ubWVudEl0ZW0sXG59IGZyb20gJy4vdGVzdC1kYXRhLW1vZGFsLWVudmlyb25tZW50Lm1vZGVsJztcbmltcG9ydCB7XG4gIE1PQ0tfUEFSQU1FVEVSUyxcbiAgUGFyYW1ldGVySXRlbSxcbiAgUGFyYW1ldGVyU2NvcGVGaWx0ZXIsXG59IGZyb20gJy4vdGVzdC1kYXRhLW1vZGFsLXBhcmFtZXRlci5tb2RlbCc7XG5pbXBvcnQgeyBDcWFMaXN0SXRlbUNvbmZpZyB9IGZyb20gJy4uLy4uL2l0ZW0tbGlzdC9pdGVtLWxpc3QubW9kZWwnO1xuXG5jb25zdCBUQUJfU0VHTUVOVFMgPSBbXG4gIHsgbGFiZWw6ICdQbGFpbiBUZXh0JywgdmFsdWU6ICdwbGFpbi10ZXh0JyB9LFxuICB7IGxhYmVsOiAnUGFyYW1ldGVyJywgdmFsdWU6ICdwYXJhbWV0ZXInIH0sXG4gIHsgbGFiZWw6ICdFbnZpcm9ubWVudCcsIHZhbHVlOiAnZW52aXJvbm1lbnQnIH0sXG4gIHsgbGFiZWw6ICdSdW50aW1lJywgdmFsdWU6ICdydW50aW1lJyB9LFxuXTtcblxuY29uc3QgUEFSQU1FVEVSX0ZJTFRFUl9UQUJTOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBQYXJhbWV0ZXJTY29wZUZpbHRlciB9W10gPSBbXG4gIHsgbGFiZWw6ICdBbGwnLCB2YWx1ZTogJ2FsbCcgfSxcbiAgeyBsYWJlbDogJ0dsb2JhbCcsIHZhbHVlOiAnZ2xvYmFsJyB9LFxuICB7IGxhYmVsOiAnTG9jYWwnLCB2YWx1ZTogJ2xvY2FsJyB9LFxuXTtcblxuLyoqIE1vY2sgcnVudGltZSB2YXJpYWJsZSBzdWdnZXN0aW9ucyAocmVwbGFjZSB3aXRoIEFQSSB3aGVuIGludGVncmF0aW5nKS4gKi9cbmNvbnN0IFJVTlRJTUVfU1VHR0VTVEVEX1ZBTFVFUyA9IFtcbiAgJ3J1bnRpbWUuTWF4V2FpdFRpbWUnLFxuICAncnVudGltZS5zZXNzaW9uX2lkJyxcbiAgJ3J1bnRpbWUuYXV0aF90b2tlbicsXG4gICdydW50aW1lLnN0ZXBfaW5kZXgnLFxuICAncnVudGltZS50aW1lc3RhbXAnLFxuICAncnVudGltZS50ZXN0X25hbWUnLFxuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXRlc3QtZGF0YS1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90ZXN0LWRhdGEtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUZXN0RGF0YU1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBAT3V0cHV0KCkgYXBwbHkgPSBuZXcgRXZlbnRFbWl0dGVyPHt2YWx1ZTogc3RyaW5nLCBhY3RpdmVUYWI6IFRlc3REYXRhTW9kYWxUYWJ9PigpO1xuICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZWRpdEluRGVwdGggPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBwYXJhbWV0ZXJDcmVhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBwYXJhbWV0ZXJFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBlbnZpcm9ubWVudENyZWF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGVudmlyb25tZW50RWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIHJlYWRvbmx5IHRhYlNlZ21lbnRzID0gVEFCX1NFR01FTlRTO1xuICByZWFkb25seSBwYXJhbWV0ZXJGaWx0ZXJUYWJzID0gUEFSQU1FVEVSX0ZJTFRFUl9UQUJTO1xuICAvKiogUGFyYW1ldGVyIGxpc3QgZnJvbSBpbnB1dCwgZmFsbHMgYmFjayB0byBtb2NrIGRhdGEgaWYgbm90IHByb3ZpZGVkLiAqL1xuICBASW5wdXQoKSBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJJdGVtW10gPSBNT0NLX1BBUkFNRVRFUlM7XG4gIC8qKiBFbnZpcm9ubWVudCBsaXN0IGZyb20gaW5wdXQsIGZhbGxzIGJhY2sgdG8gbW9jayBkYXRhIGlmIG5vdCBwcm92aWRlZC4gKi9cbiAgQElucHV0KCkgZW52aXJvbm1lbnRJdGVtczogRW52aXJvbm1lbnRJdGVtW10gPSBNT0NLX0VOVklST05NRU5UX0lURU1TO1xuICAvKiogUnVudGltZSB0YWI6IHN1Z2dlc3RlZCB2YXJpYWJsZSBjaGlwcy4gKi9cbiAgcmVhZG9ubHkgcnVudGltZVN1Z2dlc3RlZFZhbHVlczogcmVhZG9ubHkgc3RyaW5nW10gPSBSVU5USU1FX1NVR0dFU1RFRF9WQUxVRVM7XG5cbiAgLyoqIEZvcm0gZm9yIGFsbCBtb2RhbCBjb250cm9scyAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBlZGl0Rm9ybSkuICovXG4gIGVkaXRGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBDYWNoZWQgc2VsZWN0IGNvbmZpZ3MgKHN0YWJsZSByZWZzLCBzYW1lIG5hbWluZyBhcyBMb29wIFN0ZXA6IHh4eFNlbGVjdENvbmZpZykuICovXG4gIGFjdGl2ZVRhYlNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgcGFyYW1ldGVyU2NvcGVGaWx0ZXJTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG5cbiAgLyoqIExvY2FsIGNvcHkgb2YgZm9ybSB2YWx1ZSBmb3IgQ2FuY2VsIHJldmVydCAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBlZGl0U25hcHNob3QpLiAqL1xuICBwcml2YXRlIGVkaXRTbmFwc2hvdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgLyoqIFByZXNlcnZlIHVzZXItZW50ZXJlZCBwbGFpbiB0ZXh0IGluZGVwZW5kZW50bHkgZnJvbSBwYXJhbWV0ZXIvZW52aXJvbm1lbnQvcnVudGltZSBzZWxlY3Rpb25zLiAqL1xuICBwcml2YXRlIHBsYWluVGV4dFZhbHVlID0gJyc7XG5cbiAgLyoqIFN0YXRlIGRlcml2ZWQgZnJvbSBjb25maWcvZWRpdEZvcm0gZm9yIHRlbXBsYXRlIGFuZCBnZXR0ZXJzIChtaXJyb3JzIExvb3AgU3RlcCBpbnB1dHMpLiAqL1xuICBASW5wdXQoKSBhY3RpdmVUYWI6IFRlc3REYXRhTW9kYWxUYWIgPSAncGxhaW4tdGV4dCc7XG4gIEBJbnB1dCgpIHZhbHVlID0gJyc7XG4gIEBJbnB1dCgpIGhlbHBVcmwgPSAnJztcbiAgaGVscFRvb2x0aXBUZXh0ID0gJ05vdCBzdXJlIHdoYXQgdG8gZG8/IENsaWNrIHRvIGdvIHRvIG91ciBkZXRhaWxlZCBzdGVwIGNyZWF0aW9uIGRvY3VtZW50YXRpb24nO1xuICBzaG93SGVscFRvb2x0aXAgPSBmYWxzZTtcblxuICBwYXJhbWV0ZXJTY29wZUZpbHRlcjogUGFyYW1ldGVyU2NvcGVGaWx0ZXIgPSAnYWxsJztcbiAgcGFyYW1ldGVyU2VhcmNoUXVlcnkgPSAnJztcbiAgc2VsZWN0ZWRQYXJhbWV0ZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA9ICcnO1xuICBzZWxlY3RlZEVudmlyb25tZW50SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHJ1bnRpbWVWYWx1ZSA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBASW5qZWN0KFRFU1RfREFUQV9NT0RBTF9SRUYpIHByaXZhdGUgcmVmOiBUZXN0RGF0YU1vZGFsUmVmPFRlc3REYXRhTW9kYWxSZXN1bHQ+LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVEVTVF9EQVRBX01PREFMX0RBVEEpIGRhdGE/OiBUZXN0RGF0YU1vZGFsRGF0YVxuICApIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGRhdGEudmFsdWUgPz8gJyc7XG4gICAgICB0aGlzLmhlbHBVcmwgPSBkYXRhLmhlbHBVcmwgPz8gJyc7XG4gICAgICB0aGlzLmFjdGl2ZVRhYiA9IChkYXRhLmFjdGl2ZVRhYiA/PyAncGxhaW4tdGV4dCcpIGFzIFRlc3REYXRhTW9kYWxUYWI7XG4gICAgICB0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyID0gZGF0YS5wYXJhbWV0ZXJTY29wZUZpbHRlciA/PyAnYWxsJztcbiAgICAgIHRoaXMucGFyYW1ldGVyU2VhcmNoUXVlcnkgPSBkYXRhLnBhcmFtZXRlclNlYXJjaFF1ZXJ5ID8/ICcnO1xuICAgICAgdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID0gZGF0YS5zZWxlY3RlZFBhcmFtZXRlcklkID8/IG51bGw7XG4gICAgICB0aGlzLmVudmlyb25tZW50U2VhcmNoUXVlcnkgPSBkYXRhLmVudmlyb25tZW50U2VhcmNoUXVlcnkgPz8gJyc7XG4gICAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IGRhdGEuc2VsZWN0ZWRFbnZpcm9ubWVudElkID8/IG51bGw7XG4gICAgICB0aGlzLnJ1bnRpbWVWYWx1ZSA9IGRhdGEucnVudGltZVZhbHVlID8/ICcnO1xuICAgICAgLy8gU2V0IHBhcmFtZXRlcnMgYW5kIGVudmlyb25tZW50SXRlbXMgZnJvbSBkYXRhIGlmIHByb3ZpZGVkXG4gICAgICBpZiAoZGF0YS5wYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gZGF0YS5wYXJhbWV0ZXJzO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuZW52aXJvbm1lbnRJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRJdGVtcyA9IGRhdGEuZW52aXJvbm1lbnRJdGVtcztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wbGFpblRleHRWYWx1ZSA9IHRoaXMuYWN0aXZlVGFiID09PSAncGxhaW4tdGV4dCcgPyAodGhpcy52YWx1ZSA/PyAnJykgOiAnJztcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYnVpbGRFZGl0Rm9ybSgpO1xuICAgIHRoaXMuYnVpbGRTZWxlY3RDb25maWdzKCk7XG4gICAgdGhpcy5lZGl0U25hcHNob3QgPSB7IC4uLnRoaXMuZWRpdEZvcm0udmFsdWUgfTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdEZvcm0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snYWN0aXZlVGFiJ10pIHtcbiAgICAgIHRoaXMuZWRpdEZvcm0uZ2V0KCdhY3RpdmVUYWInKT8uc2V0VmFsdWUodGhpcy5hY3RpdmVUYWIgPz8gJ3BsYWluLXRleHQnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd2YWx1ZSddKSB7XG4gICAgICB0aGlzLmVkaXRGb3JtLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodGhpcy52YWx1ZSA/PyAnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5wbGFpblRleHRWYWx1ZSA9IHRoaXMuYWN0aXZlVGFiID09PSAncGxhaW4tdGV4dCcgPyAodGhpcy52YWx1ZSA/PyAnJykgOiAnJztcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hlbHBVcmwnXSkge1xuICAgICAgdGhpcy5oZWxwVXJsID0gdGhpcy5oZWxwVXJsID8/ICcnO1xuICAgIH1cblxuICAgIHRoaXMuc3luY1N0YXRlRnJvbUZvcm0oKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBmb3JtIHdpdGggYWxsIGNvbnRyb2wgdmFsdWVzIChzYW1lIHBhdHRlcm4gYXMgTG9vcCBTdGVwIGJ1aWxkRWRpdEZvcm0pLiAqL1xuICBwcml2YXRlIGJ1aWxkRWRpdEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgdmFsdWU6IFt0aGlzLnZhbHVlID8/ICcnXSxcbiAgICAgIGFjdGl2ZVRhYjogW3RoaXMuYWN0aXZlVGFiID8/ICdwbGFpbi10ZXh0J10sXG4gICAgICBwYXJhbWV0ZXJTY29wZUZpbHRlcjogW3RoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPz8gJ2FsbCddLFxuICAgICAgcGFyYW1ldGVyU2VhcmNoUXVlcnk6IFt0aGlzLnBhcmFtZXRlclNlYXJjaFF1ZXJ5ID8/ICcnXSxcbiAgICAgIHNlbGVjdGVkUGFyYW1ldGVySWQ6IFt0aGlzLnNlbGVjdGVkUGFyYW1ldGVySWQgPz8gbnVsbF0sXG4gICAgICBlbnZpcm9ubWVudFNlYXJjaFF1ZXJ5OiBbdGhpcy5lbnZpcm9ubWVudFNlYXJjaFF1ZXJ5ID8/ICcnXSxcbiAgICAgIHNlbGVjdGVkRW52aXJvbm1lbnRJZDogW3RoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkID8/IG51bGxdLFxuICAgICAgcnVudGltZVZhbHVlOiBbdGhpcy5ydW50aW1lVmFsdWUgPz8gJyddLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHNlbGVjdCBjb25maWdzIG9uY2UgKHNhbWUgcGF0dGVybiBhcyBMb29wIFN0ZXAgYnVpbGRTZWxlY3RDb25maWdzKS4gKi9cbiAgcHJpdmF0ZSBidWlsZFNlbGVjdENvbmZpZ3MoKTogdm9pZCB7XG4gICAgY29uc3QgdGFiT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBUQUJfU0VHTUVOVFMubWFwKChzKSA9PiAoe1xuICAgICAgaWQ6IHMudmFsdWUsXG4gICAgICB2YWx1ZTogcy52YWx1ZSxcbiAgICAgIG5hbWU6IHMubGFiZWwsXG4gICAgICBsYWJlbDogcy5sYWJlbCxcbiAgICB9KSk7XG4gICAgY29uc3QgZmlsdGVyT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBQQVJBTUVURVJfRklMVEVSX1RBQlMubWFwKChzKSA9PiAoe1xuICAgICAgaWQ6IHMudmFsdWUsXG4gICAgICB2YWx1ZTogcy52YWx1ZSxcbiAgICAgIG5hbWU6IHMubGFiZWwsXG4gICAgICBsYWJlbDogcy5sYWJlbCxcbiAgICB9KSk7XG4gICAgdGhpcy5hY3RpdmVUYWJTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdhY3RpdmVUYWInLFxuICAgICAgcGxhY2Vob2xkZXI6ICdUYWInLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiB0YWJPcHRpb25zLFxuICAgIH07XG4gICAgdGhpcy5wYXJhbWV0ZXJTY29wZUZpbHRlclNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3BhcmFtZXRlclNjb3BlRmlsdGVyJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2NvcGUnLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBmaWx0ZXJPcHRpb25zLFxuICAgIH07XG4gIH1cblxuICAvKiogVXBkYXRlIGZvcm0gY29udHJvbCBhbmQgc3luYyBjb21wb25lbnQgc3RhdGUgKHNhbWUgcGF0dGVybiBhcyBMb29wIFN0ZXAgb25FZGl0Rm9ybUZpZWxkQ2hhbmdlKS4gKi9cbiAgb25FZGl0Rm9ybUZpZWxkQ2hhbmdlKGNvbnRyb2xOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybS5nZXQoY29udHJvbE5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgaWYgKGNvbnRyb2xOYW1lID09PSAndmFsdWUnICYmIHRoaXMuYWN0aXZlVGFiID09PSAncGxhaW4tdGV4dCcpIHtcbiAgICAgIHRoaXMucGxhaW5UZXh0VmFsdWUgPSBTdHJpbmcodmFsdWUgPz8gJycpO1xuICAgIH1cbiAgICB0aGlzLnN5bmNTdGF0ZUZyb21Gb3JtKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogU3luYyBjb21wb25lbnQgc3RhdGUgZnJvbSBlZGl0Rm9ybSBzbyBnZXR0ZXJzIChlLmcuIGZpbHRlcmVkUGFyYW1ldGVycykgc3RheSBjb3JyZWN0LiAqL1xuICBwcml2YXRlIHN5bmNTdGF0ZUZyb21Gb3JtKCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLmVkaXRGb3JtLnZhbHVlO1xuICAgIHRoaXMudmFsdWUgPSB2LnZhbHVlID8/ICcnO1xuICAgIHRoaXMuYWN0aXZlVGFiID0gKHYuYWN0aXZlVGFiID8/ICdwbGFpbi10ZXh0JykgYXMgVGVzdERhdGFNb2RhbFRhYjtcbiAgICB0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyID0gKHYucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPz8gJ2FsbCcpIGFzIFBhcmFtZXRlclNjb3BlRmlsdGVyO1xuICAgIHRoaXMucGFyYW1ldGVyU2VhcmNoUXVlcnkgPSB2LnBhcmFtZXRlclNlYXJjaFF1ZXJ5ID8/ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA9IHYuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA/PyBudWxsO1xuICAgIHRoaXMuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA9IHYuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA/PyAnJztcbiAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IHYuc2VsZWN0ZWRFbnZpcm9ubWVudElkID8/IG51bGw7XG4gICAgdGhpcy5ydW50aW1lVmFsdWUgPSB2LnJ1bnRpbWVWYWx1ZSA/PyAnJztcbiAgfVxuXG4gIC8qKiBGaWx0ZXJlZCBwYXJhbWV0ZXJzIGJ5IHNjb3BlIGFuZCBzZWFyY2ggKFBhcmFtZXRlciB0YWIpLiAqL1xuICBnZXQgZmlsdGVyZWRQYXJhbWV0ZXJzKCk6IFBhcmFtZXRlckl0ZW1bXSB7XG4gICAgbGV0IGxpc3QgPSB0aGlzLnBhcmFtZXRlcnM7XG4gICAgaWYgKHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPT09ICdnbG9iYWwnKSB7XG4gICAgICBsaXN0ID0gbGlzdC5maWx0ZXIoKHApID0+IHAuc2NvcGUgPT09ICdHbG9iYWwnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPT09ICdsb2NhbCcpIHtcbiAgICAgIGxpc3QgPSBsaXN0LmZpbHRlcigocCkgPT4gcC5zY29wZSA9PT0gJ0xvY2FsJyk7XG4gICAgfVxuICAgIGNvbnN0IHEgPSB0aGlzLnBhcmFtZXRlclNlYXJjaFF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChxKSB7XG4gICAgICBsaXN0ID0gbGlzdC5maWx0ZXIoKHApID0+IHAubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICAvKiogRmlsdGVyZWQgZW52aXJvbm1lbnQgaXRlbXMgYnkgc2VhcmNoIChFbnZpcm9ubWVudCB0YWIpLiAqL1xuICBnZXQgZmlsdGVyZWRFbnZpcm9ubWVudHMoKTogRW52aXJvbm1lbnRJdGVtW10ge1xuICAgIGNvbnN0IHEgPSB0aGlzLmVudmlyb25tZW50U2VhcmNoUXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFxKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudEl0ZW1zO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudEl0ZW1zLmZpbHRlcihcbiAgICAgIChlKSA9PlxuICAgICAgICBlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fCBlLnZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSlcbiAgICApO1xuICB9XG5cbiAgLyoqIFBhcmFtZXRlciB0YWI6IGxpc3QgY29uZmlnIGZvciBjcWEtaXRlbS1saXN0IChzZWFyY2gtZnJpZW5kbHk6IGJpbmQgZmlsdGVyZWQgbGlzdCkuICovXG4gIGdldCBwYXJhbWV0ZXJMaXN0Q29uZmlnKCk6IENxYUxpc3RJdGVtQ29uZmlnW10ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUGFyYW1ldGVycy5tYXAoKHApID0+ICh7XG4gICAgICBpZDogcC5pZCxcbiAgICAgIHRpdGxlOiBwLm5hbWUsXG4gICAgICBzdWJ0aXRsZTogcC52YWx1ZSxcbiAgICAgIGJhZGdlOiBwLnNjb3BlLFxuICAgICAgc2hvd0VkaXQ6IHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA9PT0gcC5pZCxcbiAgICB9KSk7XG4gIH1cblxuICAvKiogRW52aXJvbm1lbnQgdGFiOiBsaXN0IGNvbmZpZyBmb3IgY3FhLWl0ZW0tbGlzdC4gKi9cbiAgZ2V0IGVudmlyb25tZW50TGlzdENvbmZpZygpOiBDcWFMaXN0SXRlbUNvbmZpZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZEVudmlyb25tZW50cy5tYXAoKGUpID0+ICh7XG4gICAgICBpZDogZS5pZCxcbiAgICAgIHRpdGxlOiBlLm5hbWUsXG4gICAgICBzdWJ0aXRsZTogYFZhbHVlOiAke2UudmFsdWV9YCxcbiAgICAgIGJhZGdlOiBlLmVudmlyb25tZW50LFxuICAgICAgc2hvd0VkaXQ6IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkID09PSBlLmlkICYmIChlLmVkaXRhYmxlID8/IHRydWUpLFxuICAgIH0pKTtcbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKHRhYlZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdwbGFpbi10ZXh0Jykge1xuICAgICAgdGhpcy5wbGFpblRleHRWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJztcbiAgICB9XG4gICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ2FjdGl2ZVRhYicsIHRhYlZhbHVlKTtcbiAgICBpZiAodGFiVmFsdWUgPT09ICdwbGFpbi10ZXh0Jykge1xuICAgICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3ZhbHVlJywgdGhpcy5wbGFpblRleHRWYWx1ZSA/PyAnJyk7XG4gICAgfVxuICB9XG5cbiAgb25QYXJhbWV0ZXJTY29wZUZpbHRlckNoYW5nZShmaWx0ZXI6IFBhcmFtZXRlclNjb3BlRmlsdGVyKTogdm9pZCB7XG4gICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3BhcmFtZXRlclNjb3BlRmlsdGVyJywgZmlsdGVyKTtcbiAgfVxuXG4gIG9uUGFyYW1ldGVyU2VhcmNoSW5wdXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdwYXJhbWV0ZXJTZWFyY2hRdWVyeScsIHZhbHVlKTtcbiAgfVxuXG4gIG9uUGFyYW1ldGVyU2VsZWN0KHBhcmFtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmFtID0gdGhpcy5wYXJhbWV0ZXJzLmZpbmQoKHApID0+IHAuaWQgPT09IHBhcmFtSWQpO1xuICAgIGlmIChwYXJhbSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID0gdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID09PSBwYXJhbS5pZCA/IG51bGwgOiBwYXJhbS5pZDtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdzZWxlY3RlZFBhcmFtZXRlcklkJywgdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkKTtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCd2YWx1ZScsIHBhcmFtLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBIYW5kbGUgcm93IGNsaWNrIChzZWxlY3QgcGFyYW1ldGVyKS4gRWRpdCBidXR0b24gdXNlcyBvblBhcmFtZXRlckVkaXRDbGljayB0byBhdm9pZCB0cmlnZ2VyaW5nIHRoaXMuICovXG4gIG9uUGFyYW1ldGVyUm93Q2xpY2soZXZlbnQ6IEV2ZW50LCBpdGVtOiB7IGlkOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJ2J1dHRvbiwgbWF0LWljb24sIFthcmlhLWxhYmVsPVwiRWRpdFwiXScpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub25QYXJhbWV0ZXJTZWxlY3QoaXRlbS5pZCk7XG4gIH1cblxuICAvKiogSGFuZGxlIEVkaXQgYnV0dG9uIGNsaWNrIC0gc3RvcCBwcm9wYWdhdGlvbiBhbmQgZW1pdCBzbyBwYXJlbnQgY2FuIG5hdmlnYXRlLiAqL1xuICBvblBhcmFtZXRlckVkaXRDbGljayhldmVudDogTW91c2VFdmVudCwgcGFyYW1JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLm9uUGFyYW1ldGVyRWRpdChwYXJhbUlkKTtcbiAgfVxuXG4gIG9uUGFyYW1ldGVyRWRpdChwYXJhbUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmFtZXRlckVkaXQuZW1pdChwYXJhbUlkKTtcbiAgfVxuXG4gIG9uQ3JlYXRlTmV3VmFyaWFibGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnBhcmFtZXRlckNyZWF0ZS5lbWl0KCk7XG4gIH1cblxuICBvbkVudmlyb25tZW50U2VhcmNoSW5wdXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdlbnZpcm9ubWVudFNlYXJjaFF1ZXJ5JywgdmFsdWUpO1xuICB9XG5cbiAgb25FbnZpcm9ubWVudFNlbGVjdChpdGVtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmVudmlyb25tZW50SXRlbXMuZmluZCgoZSkgPT4gZS5pZCA9PT0gaXRlbUlkKTtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgPVxuICAgICAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9PT0gaXRlbS5pZCA/IG51bGwgOiBpdGVtLmlkO1xuICAgICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3NlbGVjdGVkRW52aXJvbm1lbnRJZCcsIHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkKTtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCd2YWx1ZScsIGl0ZW0ubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgb25FbnZpcm9ubWVudEVkaXQoaXRlbUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmVudmlyb25tZW50RWRpdC5lbWl0KGl0ZW1JZCk7XG4gIH1cblxuICBvbkNyZWF0ZU5ld0Vudmlyb25tZW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5lbnZpcm9ubWVudENyZWF0ZS5lbWl0KCk7XG4gIH1cblxuICAvKiogUnVudGltZSB0YWI6IHJlcGxhY2UgdGhlIHJ1bnRpbWUgaW5wdXQgd2l0aCB0aGUgc2VsZWN0ZWQgc3VnZ2VzdGlvbi4gKi9cbiAgb25SdW50aW1lQ2hpcEluc2VydChzbmlwcGV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9uRWRpdEZvcm1GaWVsZENoYW5nZSgncnVudGltZVZhbHVlJywgc25pcHBldCk7XG4gIH1cblxuICBvbkFwcGx5KCk6IHZvaWQge1xuICAgIHRoaXMuc3luY1N0YXRlRnJvbUZvcm0oKTtcbiAgICBsZXQgdmFsdWVUb0FwcGx5ID0gdGhpcy5hY3RpdmVUYWIgPT09ICdydW50aW1lJyA/IHRoaXMucnVudGltZVZhbHVlIDogdGhpcy52YWx1ZTtcblxuICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ3BhcmFtZXRlcicpIHtcbiAgICAgIHZhbHVlVG9BcHBseSA9IHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA/IHRoaXMucGFyYW1ldGVycy5maW5kKChwKSA9PiBwLmlkID09PSB0aGlzLnNlbGVjdGVkUGFyYW1ldGVySWQpPy5uYW1lID8/ICcnIDogJyc7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgdmFsdWVUb0FwcGx5ID0gdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgPyB0aGlzLmVudmlyb25tZW50SXRlbXMuZmluZCgoZSkgPT4gZS5pZCA9PT0gdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQpPy5uYW1lID8/ICcnIDogJyc7XG4gICAgfVxuXG4gICAgLy8gV3JhcCB2YWx1ZVRvQXBwbHkgYmFzZWQgb24gYWN0aXZlIHRhYlxuICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ3BhcmFtZXRlcicgJiYgdmFsdWVUb0FwcGx5KSB7XG4gICAgICB2YWx1ZVRvQXBwbHkgPSBgQHwke3ZhbHVlVG9BcHBseX18YDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAncnVudGltZScgJiYgdmFsdWVUb0FwcGx5KSB7XG4gICAgICB2YWx1ZVRvQXBwbHkgPSBgJHwke3ZhbHVlVG9BcHBseX18YDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAnZW52aXJvbm1lbnQnICYmIHZhbHVlVG9BcHBseSkge1xuICAgICAgdmFsdWVUb0FwcGx5ID0gYCp8JHt2YWx1ZVRvQXBwbHl9fGA7XG4gICAgfVxuICAgIC8vIHBsYWluLXRleHQgdGFiOiBubyB3cmFwcGluZywgdXNlIHZhbHVlIGFzIGlzXG5cbiAgICAvLyBCdWlsZCByZXN1bHQgd2l0aCBvbmx5IHRoZSBhY3RpdmUgdGFiJ3MgZGF0YSwgY2xlYXIgb3RoZXIgdGFicycgZGF0YVxuICAgIGNvbnN0IHJlc3VsdDogVGVzdERhdGFNb2RhbERhdGEgPSB7XG4gICAgICB2YWx1ZTogdmFsdWVUb0FwcGx5LFxuICAgICAgYWN0aXZlVGFiOiB0aGlzLmFjdGl2ZVRhYixcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSBwYXJhbWV0ZXIgZGF0YSBpZiBwYXJhbWV0ZXIgdGFiIGlzIGFjdGl2ZVxuICAgICAgcGFyYW1ldGVyU2NvcGVGaWx0ZXI6IHRoaXMuYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJyA/IHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgOiB1bmRlZmluZWQsXG4gICAgICBwYXJhbWV0ZXJTZWFyY2hRdWVyeTogdGhpcy5hY3RpdmVUYWIgPT09ICdwYXJhbWV0ZXInID8gdGhpcy5wYXJhbWV0ZXJTZWFyY2hRdWVyeSA6IHVuZGVmaW5lZCxcbiAgICAgIHNlbGVjdGVkUGFyYW1ldGVySWQ6IHRoaXMuYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJyA/IHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA6IHVuZGVmaW5lZCxcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSBlbnZpcm9ubWVudCBkYXRhIGlmIGVudmlyb25tZW50IHRhYiBpcyBhY3RpdmVcbiAgICAgIGVudmlyb25tZW50U2VhcmNoUXVlcnk6IHRoaXMuYWN0aXZlVGFiID09PSAnZW52aXJvbm1lbnQnID8gdGhpcy5lbnZpcm9ubWVudFNlYXJjaFF1ZXJ5IDogdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0ZWRFbnZpcm9ubWVudElkOiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ2Vudmlyb25tZW50JyA/IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkIDogdW5kZWZpbmVkLFxuICAgICAgLy8gT25seSBpbmNsdWRlIHJ1bnRpbWUgZGF0YSBpZiBydW50aW1lIHRhYiBpcyBhY3RpdmVcbiAgICAgIHJ1bnRpbWVWYWx1ZTogdGhpcy5hY3RpdmVUYWIgPT09ICdydW50aW1lJyA/IHRoaXMucnVudGltZVZhbHVlIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICB0aGlzLmFwcGx5LmVtaXQoe3ZhbHVlOiB2YWx1ZVRvQXBwbHksIGFjdGl2ZVRhYjogdGhpcy5hY3RpdmVUYWIgYXMgVGVzdERhdGFNb2RhbFRhYn0pO1xuICAgIHRoaXMucmVmLmNsb3NlKHJlc3VsdCk7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUodGhpcy5lZGl0U25hcHNob3QpO1xuICAgIHRoaXMuc3luY1N0YXRlRnJvbUZvcm0oKTtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgdGhpcy5yZWYuY2xvc2UodW5kZWZpbmVkKTtcbiAgfVxuXG4gIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5vbkNhbmNlbCgpO1xuICB9XG5cbiAgb25FZGl0SW5EZXB0aChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZWRpdEluRGVwdGguZW1pdCgpO1xuICAgIHRoaXMucmVmLmNsb3NlKFRFU1RfREFUQV9NT0RBTF9FRElUX0lOX0RFUFRIIGFzIGFueSk7XG4gIH1cblxuICBvbkhlbHAoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGVscFVybCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHdpbmRvdy5vcGVuKHRoaXMuaGVscFVybCwgJ19ibGFuaycpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImNxYS1iZy13aGl0ZSBjcWEtcm91bmRlZC1bMTJweF0gY3FhLXNoYWRvdy1sZyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl0gY3FhLXctWzUwMHB4XSBjcWEtbWF4LWgtWzc3dmhdIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLVsxMnB4XSBjcWEtcC0yIGNxYS1ib3gtYm9yZGVyIGNxYS1taW4taC0wXCI+XG4gIDwhLS0gSGVhZGVyOiB0aXRsZSBsZWZ0OyBOZWVkIGhlbHA/ICsgY2xvc2UgaWNvbiByaWdodCAobm8gb3ZlcmZsb3cgaGVyZSBzbyB0b29sdGlwIGlzIG5vdCBjbGlwcGVkKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXNocmluay0wIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTIgY3FhLXB4LTRcIj5cbiAgICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1bMTZweF0gY3FhLWxlYWRpbmctWzI0cHhdIGNxYS1mb250LWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTAgY3FhLWZvbnQtWzYwMF1cIj5cbiAgICAgIFRlc3QgRGF0YVxuICAgIDwvaDI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1taW4taC1bMjhweF1cIj5cbiAgICAgIDwhLS0gTmVlZCBoZWxwPyB3aXRoIGN1c3RvbSB0b29sdGlwOiBzaG93IGJlbG93IHRyaWdnZXIgc28gaXQgaXMgbm90IGNsaXBwZWQgYnkgbW9kYWwgb3ZlcmZsb3cteS1hdXRvIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cInNob3dIZWxwVG9vbHRpcCA9IHRydWVcIiAobW91c2VsZWF2ZSk9XCJzaG93SGVscFRvb2x0aXAgPSBmYWxzZVwiPlxuICAgICAgICA8YSAqbmdJZj1cImhlbHBVcmxcIiBocmVmPVwiI1wiIChjbGljayk9XCJvbkhlbHAoJGV2ZW50KVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyMXB4XSBjcWEtbm8tdW5kZXJsaW5lIGhvdmVyOmNxYS11bmRlcmxpbmUgY3FhLWN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE3IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCN0ZXN0LWRhdGEtaGVscC1jbGlwKVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNTAwMzMgMTQuNjY2M0MxMi40MTIzIDE0LjY2NjMgMTUuNTgzNyAxMS42ODE2IDE1LjU4MzcgNy45OTk2N0MxNS41ODM3IDQuMzE3NzggMTIuNDEyMyAxLjMzMzAxIDguNTAwMzMgMS4zMzMwMUM0LjU4ODMxIDEuMzMzMDEgMS40MTY5OSA0LjMxNzc4IDEuNDE2OTkgNy45OTk2N0MxLjQxNjk5IDExLjY4MTYgNC41ODgzMSAxNC42NjYzIDguNTAwMzMgMTQuNjY2M1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi40Mzg0OCA2LjAwMDM4QzYuNjA1MDEgNS41NTQ4MyA2LjkzMzcxIDUuMTc5MTIgNy4zNjYzNiA0LjkzOThDNy43OTkwMSA0LjcwMDQ5IDguMzA3NjkgNC42MTMwMSA4LjgwMjMxIDQuNjkyODVDOS4yOTY5MyA0Ljc3MjcgOS43NDU1NiA1LjAxNDczIDEwLjA2ODcgNS4zNzYwN0MxMC4zOTE5IDUuNzM3NCAxMC41Njg4IDYuMTk0NzMgMTAuNTY4MSA2LjY2NzA1QzEwLjU2ODEgOC4wMDAzOCA4LjQ0MzA2IDguNjY3MDUgOC40NDMwNiA4LjY2NzA1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNSAxMS4zMzNIOC41MDk2NlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJ0ZXN0LWRhdGEtaGVscC1jbGlwXCI+XG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIE5lZWQgaGVscCA/XG4gICAgICAgIDwvYT5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhaGVscFVybFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtZm9udC1bNTAwXSBjcWEtdGV4dC1bMTBweF0gY3FhLWN1cnNvci1kZWZhdWx0XCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE3IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMCBjcWEtdGV4dC1bIzNGNDNFRV1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjdGVzdC1kYXRhLWhlbHAtY2xpcC1ub2xpbmspXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC41MDAzMyAxNC42NjYzQzEyLjQxMjMgMTQuNjY2MyAxNS41ODM3IDExLjY4MTYgMTUuNTgzNyA3Ljk5OTY3QzE1LjU4MzcgNC4zMTc3OCAxMi40MTIzIDEuMzMzMDEgOC41MDAzMyAxLjMzMzAxQzQuNTg4MzEgMS4zMzMwMSAxLjQxNjk5IDQuMzE3NzggMS40MTY5OSA3Ljk5OTY3QzEuNDE2OTkgMTEuNjgxNiA0LjU4ODMxIDE0LjY2NjMgOC41MDAzMyAxNC42NjYzWlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjQzODQ4IDYuMDAwMzhDNi42MDUwMSA1LjU1NDgzIDYuOTMzNzEgNS4xNzkxMiA3LjM2NjM2IDQuOTM5OEM3Ljc5OTAxIDQuNzAwNDkgOC4zMDc2OSA0LjYxMzAxIDguODAyMzEgNC42OTI4NUM5LjI5NjkzIDQuNzcyNyA5Ljc0NTU2IDUuMDE0NzMgMTAuMDY4NyA1LjM3NjA3QzEwLjM5MTkgNS43Mzc0IDEwLjU2ODggNi4xOTQ3MyAxMC41NjgxIDYuNjY3MDVDMTAuNTY4MSA4LjAwMDM4IDguNDQzMDYgOC42NjcwNSA4LjQ0MzA2IDguNjY3MDVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC41IDExLjMzM0g4LjUwOTY2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cInRlc3QtZGF0YS1oZWxwLWNsaXAtbm9saW5rXCI+XG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIE5lZWQgaGVscCA/XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPCEtLSBUb29sdGlwIGFib3ZlIHRyaWdnZXIgKHNhbWUgYXMgZWxlbWVudC1wb3B1cCk7IGhlYWRlciBoYXMgbm8gb3ZlcmZsb3cgc28gdG9vbHRpcCBpcyBub3QgY2xpcHBlZCAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dIZWxwVG9vbHRpcFwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotWzEwMF0gY3FhLWJvdHRvbS1bMTAwJV0gY3FhLW1iLTEgY3FhLXRvcC1bMjJweF1cIlxuICAgICAgICAgIHJvbGU9XCJ0b29sdGlwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LXdoaXRlIGNxYS10ZXh0LWxlZnQgY3FhLXctWzMwNnB4XSBjcWEtbWF4LXctWzMwNnB4XSBjcWEtbWluLWgtWzIwcHhdIGNxYS1yb3VuZGVkLVs2cHhdIGNxYS1weS0xIGNxYS1weC0yIGNxYS1iZy1bIzBBMEEwQV0gY3FhLWxlYWRpbmctWzIwcHhdIGNxYS10ZXh0LVs4cHhdIGNxYS1icmVhay13b3Jkc1wiPlxuICAgICAgICAgICAge3sgaGVscFRvb2x0aXBUZXh0IH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBidG5TaXplPVwibWRcIlxuICAgICAgICBbdGV4dF09XCInJ1wiXG4gICAgICAgIGljb249XCJjbG9zZVwiXG4gICAgICAgIChjbGlja2VkKT1cIm9uQ2xvc2UoKVwiXG4gICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLW1pbi1oLVsyOHB4XSBjcWEtbWluLXctWzI4cHhdIGNxYS1wLTAgY3FhLXRleHQtWyM2QjcyODBdIGhvdmVyOmNxYS1iZy1bI0YzRjRGNl0nXCJcbiAgICAgICAgdGl0bGU9XCJDbG9zZVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIExpbmUgYmVsb3cgaGVhZGVyIChmdWxsIHdpZHRoIG9mIG1vZGFsLCBubyBzaWRlIG1hcmdpbikgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtLW14LTIgY3FhLXctW2NhbGMoMTAwJSsxcmVtKV0gY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWgtcHggY3FhLXctZnVsbCBjcWEtYmctWyNFNUU3RUJdXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIFRhYnM6IFBsYWluIFRleHQsIFBhcmFtZXRlciwgRW52aXJvbm1lbnQsIFJ1bnRpbWUgKGZ1bGwtd2lkdGgsIGNxYS1idXR0b24pIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWluLXctMCBjcWEtdGVzdC1kYXRhLW1vZGFsLXRhYnMgY3FhLWZsZXggY3FhLWZsZXgtcm93IGNxYS1wLVszLjVweF0gY3FhLWgtWzMxLjVweF0gY3FhLXJvdW5kZWQtWzhweF0gY3FhLWJnLVsjRjNGNEY2XSBjcWEtZ2FwLTBcIiByb2xlPVwidGFibGlzdFwiPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IHNlZ21lbnQgb2YgdGFiU2VnbWVudHNcIiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTAgY3FhLWZsZXhcIj5cbiAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBbYXR0ci5yb2xlXT1cIid0YWInXCJcbiAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCIoZWRpdEZvcm0uZ2V0KCdhY3RpdmVUYWInKT8udmFsdWUgPz8gYWN0aXZlVGFiKSA9PT0gc2VnbWVudC52YWx1ZVwiXG4gICAgICAgIFt0ZXh0XT1cInNlZ21lbnQubGFiZWxcIlxuICAgICAgICBbdmFyaWFudF09XCIoZWRpdEZvcm0uZ2V0KCdhY3RpdmVUYWInKT8udmFsdWUgPz8gYWN0aXZlVGFiKSA9PT0gc2VnbWVudC52YWx1ZSA/ICdmaWxsZWQnIDogJ3RleHQnXCJcbiAgICAgICAgYnRuU2l6ZT1cIm1kXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25UYWJDaGFuZ2Uoc2VnbWVudC52YWx1ZSlcIlxuICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiKGVkaXRGb3JtLmdldCgnYWN0aXZlVGFiJyk/LnZhbHVlID8/IGFjdGl2ZVRhYikgPT09IHNlZ21lbnQudmFsdWUgPyAnY3FhLWgtWzI1cHhdIGNxYS1yb3VuZGVkLVs4cHhdIGNxYS10ZXh0LVsxMnB4XSBjcWEtYmctWyMzRjQzRUVdIGNxYS10ZXh0LXdoaXRlIGNxYS1mb250LW1lZGl1bScgOiAnY3FhLWgtWzI1cHhdIGNxYS1yb3VuZGVkLVs4cHhdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gaG92ZXI6Y3FhLXRleHQtWyMxMTE4MjddJ1wiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIENvbnRlbnQgcGVyIHRhYjogb25seSB0aGlzIHNlY3Rpb24gc2Nyb2xscyAob3ZlcmZsb3cgaGVyZSwgbm90IG9uIHJvb3QpLCBzbyBoZWFkZXIgdG9vbHRpcCBpcyBuZXZlciBjbGlwcGVkIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4taC0wIGNxYS1vdmVyZmxvdy15LWF1dG9cIlxuICAgIFtjbGFzcy5jcWEtZmxleC0xXT1cImFjdGl2ZVRhYiA9PT0gJ3BhcmFtZXRlcicgfHwgYWN0aXZlVGFiID09PSAnZW52aXJvbm1lbnQnIHx8IGFjdGl2ZVRhYiA9PT0gJ3J1bnRpbWUnXCI+XG4gICAgPCEtLSBQbGFpbiBUZXh0IHRhYiAoZm9ybS1ib3VuZCBsaWtlIExvb3AgU3RlcCBlZGl0Rm9ybSArIG9uRWRpdEZvcm1GaWVsZENoYW5nZSkgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ3BsYWluLXRleHQnXCI+XG4gICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICBsYWJlbD1cIlZhbHVlXCJcbiAgICAgICAgW3ZhbHVlXT1cImVkaXRGb3JtLmdldCgndmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCd2YWx1ZScsICRldmVudClcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cImh0dHBzOi8vZXhhbXBsZS5jb20vZGFzaGJvYXJkXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgc2l6ZT1cIm1kXCI+XG4gICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRleHQtWyMwQTBBMEFdIGNxYS1tLTBcIj5cbiAgICAgICAgRW50ZXIgYSBzdGF0aWMgdGV4dCB2YWx1ZSB0aGF0IHdvbid0IGNoYW5nZSBkdXJpbmcgZXhlY3V0aW9uLlxuICAgICAgPC9wPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBQYXJhbWV0ZXIgdGFiOiBWYXJpYWJsZSBMaWJyYXJ5IC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdwYXJhbWV0ZXInXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMiBjcWEtbWluLWgtMCBjcWEtZmxleC0xIGNxYS1taW4taC1bMThyZW1dXCI+XG4gICAgICAgIDwhLS0gVmFyaWFibGUgTGlicmFyeSBoZWFkZXIgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIwcHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wXCI+XG4gICAgICAgICAgICBQYXJhbWV0ZXJzXG4gICAgICAgICAgPC9oMz5cbiAgICAgICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvbkNyZWF0ZU5ld1ZhcmlhYmxlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLW5vLXVuZGVybGluZSBob3ZlcjpjcWEtb3BhY2l0eS05MCBjcWEtY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgIENyZWF0ZSBOZXcgK1xuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gU2VhcmNoOiBib3VuZCB0byBlZGl0Rm9ybSAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBjb250cm9sIGJpbmRpbmcpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8Y3FhLXNlYXJjaC1iYXJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VhcmNoIGxpYnJhcnknXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJlZGl0Rm9ybS5nZXQoJ3BhcmFtZXRlclNlYXJjaFF1ZXJ5Jyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgW2FyaWFMYWJlbF09XCInU2VhcmNoIGxpYnJhcnknXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblBhcmFtZXRlclNlYXJjaElucHV0KCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS1zZWFyY2gtYmFyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBQYXJhbWV0ZXIgbGlzdCAoc2Nyb2xsYWJsZSwgc2VhcmNoLWludGVncmF0ZWQgdmlhIGZpbHRlcmVkIGxpc3QgYmluZGluZykgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWluLWgtWzIwMHB4XSBjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEgY3FhLW1pbi1oLTAgY3FhLW92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHBhcmFtZXRlckxpc3RDb25maWdcIlxuICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUGFyYW1ldGVyUm93Q2xpY2soJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvblBhcmFtZXRlclJvd0NsaWNrKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwib25QYXJhbWV0ZXJSb3dDbGljaygkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtYmctWyNEOEQ5RkNdXT1cInNlbGVjdGVkUGFyYW1ldGVySWQgPT09IGl0ZW0uaWRcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXJdPVwic2VsZWN0ZWRQYXJhbWV0ZXJJZCA9PT0gaXRlbS5pZFwiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWJvcmRlci1zb2xpZF09XCJzZWxlY3RlZFBhcmFtZXRlcklkID09PSBpdGVtLmlkXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFBhcmFtZXRlcklkID09PSBpdGVtLmlkXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtdGV4dC1sZWZ0IGNxYS1yb3VuZGVkLWxnIGNxYS1wLTEgY3FhLXRyYW5zaXRpb24tY29sb3JzIGNxYS1iZy13aGl0ZSBob3ZlcjpjcWEtYmctWyNGOUZBRkJdIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy0yIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctWyNEOEQ5RkNdIGNxYS1jdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1zdGFydCBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyMHB4XSBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMCBjcWEtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0udGl0bGUgfX1cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJpdGVtLnN1YnRpdGxlXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbS0wIGNxYS1tdC0wLjUgY3FhLXRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLnN1YnRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtZW5kIGNxYS1nYXAtMSBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbS5iYWRnZVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1weC0yIGNxYS1yb3VuZGVkLVs4cHhdIGNxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1iZy1bI2VmZjZmZl0gY3FhLXRleHQtWyMxNDQ3RTZdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjYzhlMGZmXVwiPlxuICAgICAgICAgICAgICAgICAge3sgaXRlbS5iYWRnZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uc2hvd0VkaXRcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC0xIGNxYS1taW4tdy0wIGNxYS10ZXh0LVsjMTQ0N0U2XSBob3ZlcjpjcWEtYmctWyNFNUU3RUJdIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXJvdW5kZWQtWzZweF0gY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblBhcmFtZXRlckVkaXRDbGljaygkZXZlbnQsIGl0ZW0uaWQpXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRWRpdFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRWRpdFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiIWNxYS13LTQgIWNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblBhcmFtZXRlckVkaXRDbGljaygkZXZlbnQsIGl0ZW0uaWQpXCI+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHAgKm5nSWY9XCJwYXJhbWV0ZXJMaXN0Q29uZmlnLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW0tMCBjcWEtcHktNCBjcWEtdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIE5vIHBhcmFtZXRlcnMgbWF0Y2ggeW91ciBzZWFyY2guXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBFbnZpcm9ubWVudCB0YWI6IFZhcmlhYmxlIGxpYnJhcnkgYnkgZW52aXJvbm1lbnQgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ2Vudmlyb25tZW50J1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLW1pbi1oLTAgY3FhLWZsZXgtMSBjcWEtbWluLWgtWzE4cmVtXVwiPlxuICAgICAgICA8IS0tIFNlY3Rpb24gaGVhZGVyIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyMHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMFwiPlxuICAgICAgICAgICAgRW52aXJvbm1lbnRcbiAgICAgICAgICA8L2gzPlxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uQ3JlYXRlTmV3RW52aXJvbm1lbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtbm8tdW5kZXJsaW5lIGhvdmVyOmNxYS1vcGFjaXR5LTkwIGNxYS1jdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgQ3JlYXRlIE5ldyArXG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBTZWFyY2g6IGJvdW5kIHRvIGVkaXRGb3JtIChzYW1lIHBhdHRlcm4gYXMgTG9vcCBTdGVwIGNvbnRyb2wgYmluZGluZykgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIDxjcWEtc2VhcmNoLWJhclxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWFyY2ggRW52aXJvbm1lbnQnXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJlZGl0Rm9ybS5nZXQoJ2Vudmlyb25tZW50U2VhcmNoUXVlcnknKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbYXJpYUxhYmVsXT1cIidTZWFyY2ggRW52aXJvbm1lbnQnXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkVudmlyb25tZW50U2VhcmNoSW5wdXQoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvY3FhLXNlYXJjaC1iYXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIEVudmlyb25tZW50IGxpc3QgKHNjcm9sbGFibGUsIHNlYXJjaC1pbnRlZ3JhdGVkIHZpYSBmaWx0ZXJlZCBsaXN0IGJpbmRpbmcpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1pbi1oLVsyMjBweF0gY3FhLWZsZXgtMSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xIGNxYS1taW4taC0wIGNxYS1vdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBlbnZpcm9ubWVudExpc3RDb25maWdcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25FbnZpcm9ubWVudFNlbGVjdChpdGVtLmlkKVwiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWJnLVsjRDhEOUZDXV09XCJzZWxlY3RlZEVudmlyb25tZW50SWQgPT09IGl0ZW0uaWRcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXJdPVwic2VsZWN0ZWRFbnZpcm9ubWVudElkID09PSBpdGVtLmlkXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLXNvbGlkXT1cInNlbGVjdGVkRW52aXJvbm1lbnRJZCA9PT0gaXRlbS5pZFwiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWJvcmRlci1bIzNGNDNFRV1dPVwic2VsZWN0ZWRFbnZpcm9ubWVudElkID09PSBpdGVtLmlkXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtdGV4dC1sZWZ0IGNxYS1yb3VuZGVkLWxnIGNxYS1wLTEgY3FhLXRyYW5zaXRpb24tY29sb3JzIGNxYS1iZy13aGl0ZSBob3ZlcjpjcWEtYmctWyNGOUZBRkJdIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy0yIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctWyNEOEQ5RkNdXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0YXJ0IGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIwcHhdIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wIGNxYS10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAge3sgaXRlbS50aXRsZSB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIml0ZW0uc3VidGl0bGVcIiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tLTAgY3FhLW10LTAuNSBjcWEtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uc3VidGl0bGUgfX1cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1lbmQgY3FhLWdhcC0xIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtLmJhZGdlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLXB4LTIgY3FhLXJvdW5kZWQtWzhweF0gY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW5vcm1hbCBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLWJnLVsjZWZmNmZmXSBjcWEtdGV4dC1bIzE0NDdFNl0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNjOGUwZmZdXCI+XG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLmJhZGdlIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxwICpuZ0lmPVwiZW52aXJvbm1lbnRMaXN0Q29uZmlnLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW0tMCBjcWEtcHktNCBjcWEtdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIE5vIGVudmlyb25tZW50IHZhcmlhYmxlcyBtYXRjaCB5b3VyIHNlYXJjaC5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIFJ1bnRpbWUgdGFiOiBkeW5hbWljIHZhbHVlIGluamVjdG9yIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdydW50aW1lJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLW1pbi1oLTAgY3FhLWgtZnVsbCBjcWEtb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTAgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICBSdW50aW1lXG4gICAgICAgIDwvaDM+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICBbdmFsdWVdPVwiZWRpdEZvcm0uZ2V0KCdydW50aW1lVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRWRpdEZvcm1GaWVsZENoYW5nZSgncnVudGltZVZhbHVlJywgJGV2ZW50KVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImlucHV0IHRleHRcIlxuICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgIHNpemU9XCJtZFwiPlxuICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tdC0xLjUgY3FhLW1iLTBcIj5cbiAgICAgICAgICAgIFZhbHVlcyByZXNvbHZlZCBkdXJpbmcgdGVzdCBleGVjdXRpb24gYmFzZWQgb24gc2Vzc2lvbiBhbmQgc3RlcCBzdGF0ZS5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFJlY29tbWVuZGVkOiBzdWdnZXN0aW9uIGNoaXBzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMiBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNCAhY3FhLWgtNCAhY3FhLXRleHQtWzE2cHhdIGNxYS10ZXh0LVsjOUNBM0FGXVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnNjaGVkdWxlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM2QjcyODBdXCI+UmVjb21tZW5kZWQ8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXN0LWRhdGEtcnVudGltZS1jaGlwcy1zY3JvbGwgY3FhLWZsZXggY3FhLWdhcC0yIGNxYS1vdmVyZmxvdy14LWF1dG8gY3FhLW1pbi13LTAgY3FhLXBiLTFcIj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzbmlwcGV0IG9mIHJ1bnRpbWVTdWdnZXN0ZWRWYWx1ZXNcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgYnRuU2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgW3RleHRdPVwic25pcHBldFwiXG4gICAgICAgICAgICAgIChjbGlja2VkKT1cIm9uUnVudGltZUNoaXBJbnNlcnQoc25pcHBldClcIlxuICAgICAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LXNocmluay0wIGNxYS1weC0yIGNxYS1weS0xIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtYmctWyNGRkZGRkZdIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1yb3VuZGVkLVs4cHhdIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCdcIj5cbiAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMaW5lIGJlbG93IGNvbnRlbnQgKGZ1bGwgd2lkdGggb2YgbW9kYWwsIG5vIHNpZGUgbWFyZ2luKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS0tbXgtMiBjcWEtdy1bY2FsYygxMDAlKzFyZW0pXSBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtaC1weCBjcWEtdy1mdWxsIGNxYS1iZy1bI0U1RTdFQl1cIiByb2xlPVwicHJlc2VudGF0aW9uXCI+PC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRm9vdGVyOiBDYW5jZWwsIEFwcGx5IChmdWxsIHdpZHRoIGluIG9uZSByb3cpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RyZXRjaCBjcWEtZ2FwLTIgY3FhLXctZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiJ0NhbmNlbCdcIiBbZnVsbFdpZHRoXT1cInRydWVcIiAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCJcbiAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxMnB4XSBjcWEtcHktWzlweF0gY3FhLWJvcmRlci1bIzQxNDE0Nl0nXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiJ0FwcGx5J1wiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIChjbGlja2VkKT1cIm9uQXBwbHkoKVwiXG4gICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTJweF0gY3FhLXB5LVs5cHhdIGNxYS1ib3JkZXItWyMzRjQzRUVdJ1wiPjwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uRWRpdEluRGVwdGgoJGV2ZW50KVwiXG4gICAgICBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1uby11bmRlcmxpbmUgaG92ZXI6Y3FhLW5vLXVuZGVybGluZSBjcWEtc2VsZi1jZW50ZXJcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy00ICFjcWEtaC00ICFjcWEtdGV4dC1bMTZweF1cIj5vcGVuX2luX25ldzwvbWF0LWljb24+XG4gICAgICBFZGl0IGluIGRlcHRoIChvcGVuIGRldGFpbGVkIHJpZ2h0IHBhbmVsKVxuICAgIDwvYT5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|