@cqa-lib/cqa-ui 1.1.349 → 1.1.350
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-drawer/detail-drawer.component.mjs +3 -3
- package/esm2020/lib/detail-side-panel/detail-side-panel.component.mjs +3 -3
- package/esm2020/lib/test-case-details/ai-agent-step/ai-agent-step.component.mjs +6 -3
- package/esm2020/lib/test-case-details/ai-verify-step/ai-verify-step.component.mjs +6 -3
- package/esm2020/lib/test-case-details/api-step/api-step.component.mjs +6 -3
- package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +6 -3
- package/esm2020/lib/test-case-details/custom-code-step/custom-code-step.component.mjs +6 -3
- package/esm2020/lib/test-case-details/database-step/database-step.component.mjs +6 -3
- package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +6 -3
- package/esm2020/lib/test-case-details/normal-step/normal-step.component.mjs +6 -3
- package/esm2020/lib/test-case-details/restore-session-step/restore-session-step.component.mjs +6 -3
- package/esm2020/lib/test-case-details/screenshot-step/screenshot-step.component.mjs +6 -3
- package/esm2020/lib/test-case-details/scroll-step/scroll-step.component.mjs +6 -3
- package/esm2020/lib/test-case-details/step-group/step-group.component.mjs +6 -3
- package/esm2020/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.mjs +10 -4
- package/esm2020/lib/test-case-details/upload-step/upload-step.component.mjs +6 -3
- package/esm2020/lib/test-case-details/verify-url-step/verify-url-step.component.mjs +6 -3
- package/fesm2015/cqa-lib-cqa-ui.mjs +83 -35
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +83 -35
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/test-case-details/ai-agent-step/ai-agent-step.component.d.ts +2 -1
- package/lib/test-case-details/ai-verify-step/ai-verify-step.component.d.ts +2 -1
- package/lib/test-case-details/api-step/api-step.component.d.ts +2 -1
- package/lib/test-case-details/condition-step/condition-step.component.d.ts +2 -1
- package/lib/test-case-details/custom-code-step/custom-code-step.component.d.ts +2 -1
- package/lib/test-case-details/database-step/database-step.component.d.ts +2 -1
- package/lib/test-case-details/loop-step/loop-step.component.d.ts +2 -1
- package/lib/test-case-details/normal-step/normal-step.component.d.ts +2 -1
- package/lib/test-case-details/restore-session-step/restore-session-step.component.d.ts +2 -1
- package/lib/test-case-details/screenshot-step/screenshot-step.component.d.ts +2 -1
- package/lib/test-case-details/scroll-step/scroll-step.component.d.ts +2 -1
- package/lib/test-case-details/step-group/step-group.component.d.ts +2 -1
- package/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.d.ts +3 -1
- package/lib/test-case-details/upload-step/upload-step.component.d.ts +2 -1
- package/lib/test-case-details/verify-url-step/verify-url-step.component.d.ts +2 -1
- package/package.json +1 -1
- package/styles.css +1 -1
|
@@ -68,6 +68,7 @@ export class TestCaseLoopStepComponent {
|
|
|
68
68
|
this.addStepBetweenBelow = false;
|
|
69
69
|
/** @deprecated Use addStepBetweenAbove and addStepBetweenBelow instead. If set, applies to both buttons. */
|
|
70
70
|
this.addStepBetween = false;
|
|
71
|
+
this.editable = true;
|
|
71
72
|
this.toggleExpanded = new EventEmitter();
|
|
72
73
|
this.testDataProfileChange = new EventEmitter();
|
|
73
74
|
this.startStepChange = new EventEmitter();
|
|
@@ -1220,14 +1221,14 @@ TestCaseLoopStepComponent.DEFAULT_LOOP_OPTIONS_MAX = 10;
|
|
|
1220
1221
|
TestCaseLoopStepComponent.LOOP_INDEX_START = -1;
|
|
1221
1222
|
TestCaseLoopStepComponent.LOOP_INDEX_END = -1;
|
|
1222
1223
|
TestCaseLoopStepComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseLoopStepComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1223
|
-
TestCaseLoopStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseLoopStepComponent, selector: "cqa-test-case-loop-step", inputs: { config: "config", id: "id", loopType: "loopType", stepNumber: "stepNumber", index: "index", condition: "condition", maxIterations: "maxIterations", testDataProfile: "testDataProfile", startStep: "startStep", endStep: "endStep", nestedSteps: "nestedSteps", expanded: "expanded", isNested: "isNested", isInsideLoop: "isInsideLoop", isInsideStepGroup: "isInsideStepGroup", isReorder: "isReorder", selected: "selected", isDuplicating: "isDuplicating", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", naturalTextActionsOptions: "naturalTextActionsOptions", setConditionTemplateVariables: "setConditionTemplateVariables", addStepBetweenAbove: "addStepBetweenAbove", addStepBetweenBelow: "addStepBetweenBelow", addStepBetween: "addStepBetween" }, outputs: { toggleExpanded: "toggleExpanded", testDataProfileChange: "testDataProfileChange", startStepChange: "startStepChange", endStepChange: "endStepChange", conditionChange: "conditionChange", maxIterationsChange: "maxIterationsChange", nestedStepChange: "nestedStepChange", addStep: "addStep", deleteStep: "deleteStep", duplicate: "duplicate", delete: "delete", moreOptions: "moreOptions", viewDetails: "viewDetails", editInDepth: "editInDepth", edit: "edit", dndDropInZone: "dndDropInZone", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", stepUpdate: "stepUpdate", clickAction: "clickAction", addStepBetweenClick: "addStepBetweenClick", selectionChange: "selectionChange", deleteBranch: "deleteBranch", openExternal: "openExternal" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "viewDetailsTrigger", first: true, predicate: ["viewDetailsTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"loop-step-row cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: stop propagation so dropdown/select interactions don't bubble and collapse the step or start drag -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3\" (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow cqa-flex-wrap cqa-min-w-0\">\n <!-- Loop Type Label -->\n <div class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getLoopTypeLabel() }}\n </div>\n\n <!-- FOR LOOP inline edit: cqa-dynamic-select (same usage as default stories) -->\n <ng-container *ngIf=\"loopType === 'for'\">\n <!-- First select: width 216.25px, height 36px, gap 4px, opacity 1 -->\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"forOptionTypeSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"testDataProfileSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"startStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"endStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- WHILE LOOP inline edit: cqa-autocomplete + template variables (same as condition-step) -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"whileConditionAutocompleteOptions\"\n [value]=\"whileConditionDisplayValue\"\n (valueChange)=\"onEditFormFieldChange('condition', $event)\"\n (optionSelect)=\"onConditionSelect($event)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\">\n </cqa-autocomplete>\n <!-- Template variables hidden in while loop - use Edit In depth to configure -->\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" *ngIf=\"isWhileLoop()\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <!-- Cancel / Apply -->\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\"\n (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\"\n (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Loop Header (normal view when not editing) -->\n <div *ngIf=\"!isEditing\"\n [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\"\n style=\"border-bottom: 1px solid #E5E7EB;\">\n <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true and not inside step group - steps inside step groups cannot be reordered) -->\n <div *ngIf=\"isReorder && !isInsideStepGroup\" class=\"cqa-mr-2 cqa-cursor-move cqa-text-[#6B7280] hover:cqa-text-[#111827]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n <!-- Checkbox (when isReorder is false and not inside step group - hide for steps inside step groups) -->\n <label *ngIf=\"!isReorder && !isInsideStepGroup\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative cqa-mr-2\">\n <input type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"onSelectionChange($event)\"\n class=\"cqa-h-4 cqa-w-4 cqa-cursor-pointer cqa-transition-all cqa-appearance-none cqa-rounded shadow hover:cqa-shadow-md cqa-border cqa-border-solid cqa-border-slate-300 cqa-flex-shrink-0\"\n [class.cqa-bg-[#3F43EE]]=\"selected\"\n [class.cqa-border-[#3F43EE]]=\"selected\"\n id=\"check-loop-step\" />\n <span class=\"cqa-absolute cqa-text-white cqa-top-1/2 cqa-left-1/2 cqa--translate-x-1/2 cqa--translate-y-1/2 cqa-pointer-events-none cqa-flex cqa-items-center cqa-justify-center\"\n [class.cqa-opacity-0]=\"!selected\"\n [class.cqa-opacity-100]=\"selected\">\n <svg width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 3.125L4.5 8.625L2 6.125\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </label>\n </div>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px]\">{{ stepNumber }}</span>\n <!-- Expand/Collapse Icon -->\n <button type=\"button\" (click)=\"onToggleExpanded()\" class=\"cqa-p-0\">\n <svg [class.cqa-rotate-180]=\"!expanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Loop Icon -->\n <div *ngIf=\"loopType === 'for'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div *ngIf=\"loopType === 'while'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Loop Type Label -->\n <span class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-none\">\n {{ getLoopTypeLabel() }}\n </span>\n\n <!-- For Loop Display: items flow on one row; only wrap to next line when there is not enough space -->\n <div *ngIf=\"loopType === 'for' && (hasTestDataProfile() || hasStartValue() || hasEndValue())\" class=\"cqa-flex cqa-flex-wrap cqa-items-center cqa-gap-x-3 cqa-gap-y-1 cqa-ml-2 cqa-flex-1 cqa-min-w-0\">\n <span *ngIf=\"getForLoopProfileDisplay()\" class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getForLoopProfileDisplay() | cqaSafeHtml\" (click)=\"onLoopActionClick($event)\"></span>\n <span *ngIf=\"getForLoopRangeDisplay()\" class=\"for-loop-range-row cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getForLoopRangeDisplay() | cqaSafeHtml\" (click)=\"onLoopActionClick($event)\"></span>\n <div *ngIf=\"getLoopEventDetailsForDisplay().length > 0\" class=\"cqa-flex cqa-flex-wrap cqa-gap-2 cqa-items-center\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827] cqa-break-words\">{{ item.value }}</span>\n </span>\n </div>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) - same styling as condition step -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getConditionDisplay() | cqaSafeHtml\" (click)=\"onLoopActionClick($event)\"></span>\n <span *ngIf=\"maxIterations != null && maxIterations > 0\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\" data-key=\"maxIterations\" data-event-key=\"maxIterations\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">max iterations:</span>\n <span class=\"cqa-text-[#111827]\">{{ maxIterations }}</span>\n </span>\n <ng-container *ngIf=\"getLoopEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto\">\n <!-- Steps Summary -->\n <div\n class=\"cqa-ml-auto cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-lg cqa-py-0.5 cqa-px-2 cqa-text-[#0A0A0A] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getStepsSummary() }}\n </div>\n\n <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-2 cqa-no-underline cqa-ml-auto\">View Details<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg></a>\n\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover; hidden when inside step-group) -->\n <div *ngIf=\"!isInsideStepGroup && !isReorder\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px]\">\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M9.55208 2.1128C9.7843 1.88058 10.0993 1.75012 10.4277 1.75012C10.7561 1.75012 11.071 1.88058 11.3033 2.1128C11.5355 2.34502 11.6659 2.65998 11.6659 2.98838C11.6659 3.31679 11.5355 3.63175 11.3033 3.86397L4.29742 10.8704C4.15864 11.0092 3.9871 11.1107 3.79867 11.1656L2.12333 11.6544C2.07314 11.669 2.01993 11.6699 1.96928 11.6569C1.91863 11.6439 1.8724 11.6176 1.83543 11.5806C1.79846 11.5437 1.7721 11.4974 1.75913 11.4468C1.74615 11.3961 1.74703 11.3429 1.76167 11.2927L2.2505 9.61738C2.30546 9.42916 2.40698 9.25783 2.54567 9.11922L9.55208 2.1128Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <!-- <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button> -->\n <button\n type=\"button\"\n (click)=\"onDuplicate(); $event.stopPropagation()\"\n [disabled]=\"isDuplicating\"\n [attr.title]=\"isDuplicating ? 'Duplicating...' : 'Duplicate'\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6] disabled:cqa-opacity-60 disabled:cqa-cursor-not-allowed\"\n >\n <svg *ngIf=\"!isDuplicating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngIf=\"isDuplicating\" width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-label=\"Duplicating\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-opacity=\"0.2\" stroke-width=\"2\"></circle>\n <path d=\"M14 8A6 6 0 0 0 8 2\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 8 8\" to=\"360 8 8\" dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n </button>\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\"\n class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M11.0827 3.5V11.6667C11.0827 12.25 10.4993 12.8333 9.91602 12.8333H4.08268C3.49935 12.8333 2.91602 12.25 2.91602 11.6667V3.5\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M4.66602 3.49996V2.33329C4.66602 1.74996 5.24935 1.16663 5.83268 1.16663H8.16602C8.74935 1.16663 9.33268 1.74996 9.33268 2.33329V3.49996\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n <!-- Created Date (from API) - last so aligned across all steps, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"step-date cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px] cqa-ml-auto cqa-flex-shrink-0\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n </div>\n </div>\n\n <!-- Expanded Content with Nested Steps (renderer dispatches by step type, n-level nesting) -->\n <div *ngIf=\"expanded\" class=\"cqa-flex cqa-flex-col\">\n <!-- START Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getStartLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n <div *ngIf=\"!isReorder\" class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer *ngFor=\"let step of nestedSteps; let i = index\" [step]=\"step\" [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isInsideStepGroup]=\"isInsideStepGroup\" [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedOpenExternal($event)\" (edit)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedDuplicate($event, step)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n <div *ngIf=\"isReorder\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [style.min-height.px]=\"nestedSteps.length === 0 ? 52 : null\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"step-drag-placeholder-nested cqa-my-1 cqa-min-h-[50px] cqa-border-2 cqa-border-dashed cqa-border-[#3F43EE] cqa-rounded cqa-bg-[rgba(63,67,238,0.08)] cqa-flex cqa-items-center cqa-justify-center cqa-text-[#3F43EE] cqa-text-xs\">Drop here</div>\n <div *ngFor=\"let step of nestedSteps; let i = index\" class=\"nested-step-drag-item\"\n [dndDraggable]=\"step\"\n dndEffectAllowed=\"move\"\n dndType=\"step\">\n <cqa-test-case-details-renderer [step]=\"step\" [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isInsideStepGroup]=\"isInsideStepGroup\" [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedOpenExternal($event)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- Empty loop: show plus icon on hover when expanded and no steps.\n When rendered inside a step group or when reordering, hide this Add button entirely. -->\n <div *ngIf=\"nestedSteps.length === 0 && !isInsideStepGroup && !isReorder\" class=\"loop-step-empty cqa-min-h-[52px] cqa-flex cqa-items-center cqa-justify-center cqa-pl-4 cqa-pr-4\">\n <button type=\"button\" (click)=\"onAddStepEmpty(); $event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\" title=\"Add step\"\n class=\"loop-step-empty-add\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" fill=\"white\" />\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" stroke=\"#3F43EE\" stroke-width=\"2\" />\n <path d=\"M8.5 12H15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 8.5V15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <!-- END Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getEndLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n</div>", styles: [".step-actions{opacity:0;transition:opacity .15s ease}.step-row:hover .step-actions{opacity:1}.step-row{vertical-align:middle;letter-spacing:normal}\n", ".loop-step-empty{opacity:1}.loop-step-empty-add{padding:0;background:transparent;border:0;cursor:pointer;color:#3f43ee;transition:opacity .15s ease}.loop-step-empty-add:hover{opacity:.9}\n", ".for-loop-range-row{display:inline-flex;align-items:center;gap:.5rem;flex-wrap:wrap}.for-loop-range-row .for-loop-range-part+.for-loop-range-part{margin-left:.25rem}\n"], components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.AutocompleteComponent, selector: "cqa-autocomplete", inputs: ["placeholder", "options", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth", "compact"], outputs: ["valueChange", "optionSelect", "cleared"] }, { type: i4.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i5.TestCaseDetailsRendererComponent, selector: "cqa-test-case-details-renderer", inputs: ["step", "index", "isNested", "isInsideLoop", "isInsideStepGroup", "branch", "isReorder", "selected", "isDuplicating", "addStepBetweenAbove", "addStepBetweenBelow", "addStepBetween", "dataProfileOptions", "hasMoreDataProfiles", "isLoadingDataProfiles", "naturalTextActionsOptions", "setConditionTemplateVariables"], outputs: ["nestedStepChange", "addStep", "deleteStep", "toggleExpanded", "groupNameChange", "descriptionChange", "reusableChange", "openExternal", "edit", "link", "duplicate", "delete", "viewDetails", "selectionChange", "conditionChange", "branchStepChange", "addStepForBranch", "addStepForLoop", "deleteStepWithBranch", "addBranch", "addElse", "deleteBranch", "testDataProfileChange", "startStepChange", "endStepChange", "maxIterationsChange", "eventTypeChange", "parameterChange", "clickAction", "dndDropInZone", "loadMoreDataProfiles", "searchDataProfiles", "stepUpdate", "addStepBetweenClick", "editInDepth"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i7.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i7.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }], pipes: { "cqaSafeHtml": i8.SafeHtmlPipe, "date": i6.DatePipe } });
|
|
1224
|
+
TestCaseLoopStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseLoopStepComponent, selector: "cqa-test-case-loop-step", inputs: { config: "config", id: "id", loopType: "loopType", stepNumber: "stepNumber", index: "index", condition: "condition", maxIterations: "maxIterations", testDataProfile: "testDataProfile", startStep: "startStep", endStep: "endStep", nestedSteps: "nestedSteps", expanded: "expanded", isNested: "isNested", isInsideLoop: "isInsideLoop", isInsideStepGroup: "isInsideStepGroup", isReorder: "isReorder", selected: "selected", isDuplicating: "isDuplicating", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", naturalTextActionsOptions: "naturalTextActionsOptions", setConditionTemplateVariables: "setConditionTemplateVariables", addStepBetweenAbove: "addStepBetweenAbove", addStepBetweenBelow: "addStepBetweenBelow", addStepBetween: "addStepBetween", editable: "editable" }, outputs: { toggleExpanded: "toggleExpanded", testDataProfileChange: "testDataProfileChange", startStepChange: "startStepChange", endStepChange: "endStepChange", conditionChange: "conditionChange", maxIterationsChange: "maxIterationsChange", nestedStepChange: "nestedStepChange", addStep: "addStep", deleteStep: "deleteStep", duplicate: "duplicate", delete: "delete", moreOptions: "moreOptions", viewDetails: "viewDetails", editInDepth: "editInDepth", edit: "edit", dndDropInZone: "dndDropInZone", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", stepUpdate: "stepUpdate", clickAction: "clickAction", addStepBetweenClick: "addStepBetweenClick", selectionChange: "selectionChange", deleteBranch: "deleteBranch", openExternal: "openExternal" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "viewDetailsTrigger", first: true, predicate: ["viewDetailsTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"loop-step-row cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: stop propagation so dropdown/select interactions don't bubble and collapse the step or start drag -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3\" (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow cqa-flex-wrap cqa-min-w-0\">\n <!-- Loop Type Label -->\n <div class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getLoopTypeLabel() }}\n </div>\n\n <!-- FOR LOOP inline edit: cqa-dynamic-select (same usage as default stories) -->\n <ng-container *ngIf=\"loopType === 'for'\">\n <!-- First select: width 216.25px, height 36px, gap 4px, opacity 1 -->\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"forOptionTypeSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"testDataProfileSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"startStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"endStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- WHILE LOOP inline edit: cqa-autocomplete + template variables (same as condition-step) -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"whileConditionAutocompleteOptions\"\n [value]=\"whileConditionDisplayValue\"\n (valueChange)=\"onEditFormFieldChange('condition', $event)\"\n (optionSelect)=\"onConditionSelect($event)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\">\n </cqa-autocomplete>\n <!-- Template variables hidden in while loop - use Edit In depth to configure -->\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" *ngIf=\"isWhileLoop()\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <!-- Cancel / Apply -->\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\"\n (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\"\n (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Loop Header (normal view when not editing) -->\n <div *ngIf=\"!isEditing\"\n [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\"\n style=\"border-bottom: 1px solid #E5E7EB;\">\n <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true and not inside step group - steps inside step groups cannot be reordered) -->\n <div *ngIf=\"isReorder && !isInsideStepGroup\" class=\"cqa-mr-2 cqa-cursor-move cqa-text-[#6B7280] hover:cqa-text-[#111827]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n <!-- Checkbox (when isReorder is false and not inside step group - hide for steps inside step groups) -->\n <label *ngIf=\"editable && !isReorder && !isInsideStepGroup\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative cqa-mr-2\">\n <input type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"onSelectionChange($event)\"\n class=\"cqa-h-4 cqa-w-4 cqa-cursor-pointer cqa-transition-all cqa-appearance-none cqa-rounded shadow hover:cqa-shadow-md cqa-border cqa-border-solid cqa-border-slate-300 cqa-flex-shrink-0\"\n [class.cqa-bg-[#3F43EE]]=\"selected\"\n [class.cqa-border-[#3F43EE]]=\"selected\"\n id=\"check-loop-step\" />\n <span class=\"cqa-absolute cqa-text-white cqa-top-1/2 cqa-left-1/2 cqa--translate-x-1/2 cqa--translate-y-1/2 cqa-pointer-events-none cqa-flex cqa-items-center cqa-justify-center\"\n [class.cqa-opacity-0]=\"!selected\"\n [class.cqa-opacity-100]=\"selected\">\n <svg width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 3.125L4.5 8.625L2 6.125\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </label>\n </div>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px]\">{{ stepNumber }}</span>\n <!-- Expand/Collapse Icon -->\n <button type=\"button\" (click)=\"onToggleExpanded()\" class=\"cqa-p-0\">\n <svg [class.cqa-rotate-180]=\"!expanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Loop Icon -->\n <div *ngIf=\"loopType === 'for'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div *ngIf=\"loopType === 'while'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Loop Type Label -->\n <span class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-none\">\n {{ getLoopTypeLabel() }}\n </span>\n\n <!-- For Loop Display: items flow on one row; only wrap to next line when there is not enough space -->\n <div *ngIf=\"loopType === 'for' && (hasTestDataProfile() || hasStartValue() || hasEndValue())\" class=\"cqa-flex cqa-flex-wrap cqa-items-center cqa-gap-x-3 cqa-gap-y-1 cqa-ml-2 cqa-flex-1 cqa-min-w-0\">\n <span *ngIf=\"getForLoopProfileDisplay()\" class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getForLoopProfileDisplay() | cqaSafeHtml\" (click)=\"onLoopActionClick($event)\"></span>\n <span *ngIf=\"getForLoopRangeDisplay()\" class=\"for-loop-range-row cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getForLoopRangeDisplay() | cqaSafeHtml\" (click)=\"onLoopActionClick($event)\"></span>\n <div *ngIf=\"getLoopEventDetailsForDisplay().length > 0\" class=\"cqa-flex cqa-flex-wrap cqa-gap-2 cqa-items-center\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827] cqa-break-words\">{{ item.value }}</span>\n </span>\n </div>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) - same styling as condition step -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getConditionDisplay() | cqaSafeHtml\" (click)=\"onLoopActionClick($event)\"></span>\n <span *ngIf=\"maxIterations != null && maxIterations > 0\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\" data-key=\"maxIterations\" data-event-key=\"maxIterations\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">max iterations:</span>\n <span class=\"cqa-text-[#111827]\">{{ maxIterations }}</span>\n </span>\n <ng-container *ngIf=\"getLoopEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto\">\n <!-- Steps Summary -->\n <div\n class=\"cqa-ml-auto cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-lg cqa-py-0.5 cqa-px-2 cqa-text-[#0A0A0A] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getStepsSummary() }}\n </div>\n\n <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-2 cqa-no-underline cqa-ml-auto\">View Details<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg></a>\n\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover; hidden when inside step-group) -->\n <div *ngIf=\"editable && !isInsideStepGroup && !isReorder\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px]\">\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M9.55208 2.1128C9.7843 1.88058 10.0993 1.75012 10.4277 1.75012C10.7561 1.75012 11.071 1.88058 11.3033 2.1128C11.5355 2.34502 11.6659 2.65998 11.6659 2.98838C11.6659 3.31679 11.5355 3.63175 11.3033 3.86397L4.29742 10.8704C4.15864 11.0092 3.9871 11.1107 3.79867 11.1656L2.12333 11.6544C2.07314 11.669 2.01993 11.6699 1.96928 11.6569C1.91863 11.6439 1.8724 11.6176 1.83543 11.5806C1.79846 11.5437 1.7721 11.4974 1.75913 11.4468C1.74615 11.3961 1.74703 11.3429 1.76167 11.2927L2.2505 9.61738C2.30546 9.42916 2.40698 9.25783 2.54567 9.11922L9.55208 2.1128Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <!-- <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button> -->\n <button\n type=\"button\"\n (click)=\"onDuplicate(); $event.stopPropagation()\"\n [disabled]=\"isDuplicating\"\n [attr.title]=\"isDuplicating ? 'Duplicating...' : 'Duplicate'\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6] disabled:cqa-opacity-60 disabled:cqa-cursor-not-allowed\"\n >\n <svg *ngIf=\"!isDuplicating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngIf=\"isDuplicating\" width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-label=\"Duplicating\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-opacity=\"0.2\" stroke-width=\"2\"></circle>\n <path d=\"M14 8A6 6 0 0 0 8 2\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 8 8\" to=\"360 8 8\" dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n </button>\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\"\n class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M11.0827 3.5V11.6667C11.0827 12.25 10.4993 12.8333 9.91602 12.8333H4.08268C3.49935 12.8333 2.91602 12.25 2.91602 11.6667V3.5\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M4.66602 3.49996V2.33329C4.66602 1.74996 5.24935 1.16663 5.83268 1.16663H8.16602C8.74935 1.16663 9.33268 1.74996 9.33268 2.33329V3.49996\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n <!-- Created Date (from API) - last so aligned across all steps, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"step-date cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px] cqa-ml-auto cqa-flex-shrink-0\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n </div>\n </div>\n\n <!-- Expanded Content with Nested Steps (renderer dispatches by step type, n-level nesting) -->\n <div *ngIf=\"expanded\" class=\"cqa-flex cqa-flex-col\">\n <!-- START Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getStartLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n <div *ngIf=\"!isReorder\" class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer *ngFor=\"let step of nestedSteps; let i = index\" [step]=\"step\" [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isInsideStepGroup]=\"isInsideStepGroup\" [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [editable]=\"editable\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedOpenExternal($event)\" (edit)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedDuplicate($event, step)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n <div *ngIf=\"isReorder\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [style.min-height.px]=\"nestedSteps.length === 0 ? 52 : null\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"step-drag-placeholder-nested cqa-my-1 cqa-min-h-[50px] cqa-border-2 cqa-border-dashed cqa-border-[#3F43EE] cqa-rounded cqa-bg-[rgba(63,67,238,0.08)] cqa-flex cqa-items-center cqa-justify-center cqa-text-[#3F43EE] cqa-text-xs\">Drop here</div>\n <div *ngFor=\"let step of nestedSteps; let i = index\" class=\"nested-step-drag-item\"\n [dndDraggable]=\"step\"\n dndEffectAllowed=\"move\"\n dndType=\"step\">\n <cqa-test-case-details-renderer [step]=\"step\" [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isInsideStepGroup]=\"isInsideStepGroup\" [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\n [addStepBetween]=\"addStepBetween\"\n [editable]=\"editable\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedOpenExternal($event)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- Empty loop: show plus icon on hover when expanded and no steps.\n When rendered inside a step group or when reordering, hide this Add button entirely. -->\n <div *ngIf=\"nestedSteps.length === 0 && editable && !isInsideStepGroup && !isReorder\" class=\"loop-step-empty cqa-min-h-[52px] cqa-flex cqa-items-center cqa-justify-center cqa-pl-4 cqa-pr-4\">\n <button type=\"button\" (click)=\"onAddStepEmpty(); $event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\" title=\"Add step\"\n class=\"loop-step-empty-add\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" fill=\"white\" />\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" stroke=\"#3F43EE\" stroke-width=\"2\" />\n <path d=\"M8.5 12H15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 8.5V15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <!-- END Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getEndLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n</div>", styles: [".step-actions{opacity:0;transition:opacity .15s ease}.step-row:hover .step-actions{opacity:1}.step-row{vertical-align:middle;letter-spacing:normal}\n", ".loop-step-empty{opacity:1}.loop-step-empty-add{padding:0;background:transparent;border:0;cursor:pointer;color:#3f43ee;transition:opacity .15s ease}.loop-step-empty-add:hover{opacity:.9}\n", ".for-loop-range-row{display:inline-flex;align-items:center;gap:.5rem;flex-wrap:wrap}.for-loop-range-row .for-loop-range-part+.for-loop-range-part{margin-left:.25rem}\n"], components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.AutocompleteComponent, selector: "cqa-autocomplete", inputs: ["placeholder", "options", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth", "compact"], outputs: ["valueChange", "optionSelect", "cleared"] }, { type: i4.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i5.TestCaseDetailsRendererComponent, selector: "cqa-test-case-details-renderer", inputs: ["step", "index", "isNested", "isInsideLoop", "isInsideStepGroup", "branch", "isReorder", "selected", "isDuplicating", "addStepBetweenAbove", "addStepBetweenBelow", "addStepBetween", "editable", "dataProfileOptions", "hasMoreDataProfiles", "isLoadingDataProfiles", "naturalTextActionsOptions", "setConditionTemplateVariables"], outputs: ["nestedStepChange", "addStep", "deleteStep", "toggleExpanded", "groupNameChange", "descriptionChange", "reusableChange", "openExternal", "edit", "link", "duplicate", "delete", "viewDetails", "selectionChange", "conditionChange", "branchStepChange", "addStepForBranch", "addStepForLoop", "deleteStepWithBranch", "addBranch", "addElse", "deleteBranch", "testDataProfileChange", "startStepChange", "endStepChange", "maxIterationsChange", "eventTypeChange", "parameterChange", "clickAction", "dndDropInZone", "loadMoreDataProfiles", "searchDataProfiles", "stepUpdate", "addStepBetweenClick", "editInDepth"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i7.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i7.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }], pipes: { "cqaSafeHtml": i8.SafeHtmlPipe, "date": i6.DatePipe } });
|
|
1224
1225
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseLoopStepComponent, decorators: [{
|
|
1225
1226
|
type: Component,
|
|
1226
1227
|
args: [{ selector: 'cqa-test-case-loop-step', host: { class: 'cqa-ui-root' }, styles: [
|
|
1227
1228
|
STEP_ROW_ACTIONS_STYLES,
|
|
1228
1229
|
LOOP_STEP_EMPTY_STYLES,
|
|
1229
1230
|
LOOP_STEP_FOR_DISPLAY_STYLES,
|
|
1230
|
-
], template: "<div class=\"loop-step-row cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: stop propagation so dropdown/select interactions don't bubble and collapse the step or start drag -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3\" (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow cqa-flex-wrap cqa-min-w-0\">\n <!-- Loop Type Label -->\n <div class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getLoopTypeLabel() }}\n </div>\n\n <!-- FOR LOOP inline edit: cqa-dynamic-select (same usage as default stories) -->\n <ng-container *ngIf=\"loopType === 'for'\">\n <!-- First select: width 216.25px, height 36px, gap 4px, opacity 1 -->\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"forOptionTypeSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"testDataProfileSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"startStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"endStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- WHILE LOOP inline edit: cqa-autocomplete + template variables (same as condition-step) -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"whileConditionAutocompleteOptions\"\n [value]=\"whileConditionDisplayValue\"\n (valueChange)=\"onEditFormFieldChange('condition', $event)\"\n (optionSelect)=\"onConditionSelect($event)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\">\n </cqa-autocomplete>\n <!-- Template variables hidden in while loop - use Edit In depth to configure -->\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" *ngIf=\"isWhileLoop()\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <!-- Cancel / Apply -->\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\"\n (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\"\n (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Loop Header (normal view when not editing) -->\n <div *ngIf=\"!isEditing\"\n [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\"\n style=\"border-bottom: 1px solid #E5E7EB;\">\n <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true and not inside step group - steps inside step groups cannot be reordered) -->\n <div *ngIf=\"isReorder && !isInsideStepGroup\" class=\"cqa-mr-2 cqa-cursor-move cqa-text-[#6B7280] hover:cqa-text-[#111827]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n <!-- Checkbox (when isReorder is false and not inside step group - hide for steps inside step groups) -->\n <label *ngIf=\"!isReorder && !isInsideStepGroup\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative cqa-mr-2\">\n <input type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"onSelectionChange($event)\"\n class=\"cqa-h-4 cqa-w-4 cqa-cursor-pointer cqa-transition-all cqa-appearance-none cqa-rounded shadow hover:cqa-shadow-md cqa-border cqa-border-solid cqa-border-slate-300 cqa-flex-shrink-0\"\n [class.cqa-bg-[#3F43EE]]=\"selected\"\n [class.cqa-border-[#3F43EE]]=\"selected\"\n id=\"check-loop-step\" />\n <span class=\"cqa-absolute cqa-text-white cqa-top-1/2 cqa-left-1/2 cqa--translate-x-1/2 cqa--translate-y-1/2 cqa-pointer-events-none cqa-flex cqa-items-center cqa-justify-center\"\n [class.cqa-opacity-0]=\"!selected\"\n [class.cqa-opacity-100]=\"selected\">\n <svg width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 3.125L4.5 8.625L2 6.125\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </label>\n </div>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px]\">{{ stepNumber }}</span>\n <!-- Expand/Collapse Icon -->\n <button type=\"button\" (click)=\"onToggleExpanded()\" class=\"cqa-p-0\">\n <svg [class.cqa-rotate-180]=\"!expanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Loop Icon -->\n <div *ngIf=\"loopType === 'for'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div *ngIf=\"loopType === 'while'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Loop Type Label -->\n <span class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-none\">\n {{ getLoopTypeLabel() }}\n </span>\n\n <!-- For Loop Display: items flow on one row; only wrap to next line when there is not enough space -->\n <div *ngIf=\"loopType === 'for' && (hasTestDataProfile() || hasStartValue() || hasEndValue())\" class=\"cqa-flex cqa-flex-wrap cqa-items-center cqa-gap-x-3 cqa-gap-y-1 cqa-ml-2 cqa-flex-1 cqa-min-w-0\">\n <span *ngIf=\"getForLoopProfileDisplay()\" class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getForLoopProfileDisplay() | cqaSafeHtml\" (click)=\"onLoopActionClick($event)\"></span>\n <span *ngIf=\"getForLoopRangeDisplay()\" class=\"for-loop-range-row cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getForLoopRangeDisplay() | cqaSafeHtml\" (click)=\"onLoopActionClick($event)\"></span>\n <div *ngIf=\"getLoopEventDetailsForDisplay().length > 0\" class=\"cqa-flex cqa-flex-wrap cqa-gap-2 cqa-items-center\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827] cqa-break-words\">{{ item.value }}</span>\n </span>\n </div>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) - same styling as condition step -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getConditionDisplay() | cqaSafeHtml\" (click)=\"onLoopActionClick($event)\"></span>\n <span *ngIf=\"maxIterations != null && maxIterations > 0\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\" data-key=\"maxIterations\" data-event-key=\"maxIterations\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">max iterations:</span>\n <span class=\"cqa-text-[#111827]\">{{ maxIterations }}</span>\n </span>\n <ng-container *ngIf=\"getLoopEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto\">\n <!-- Steps Summary -->\n <div\n class=\"cqa-ml-auto cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-lg cqa-py-0.5 cqa-px-2 cqa-text-[#0A0A0A] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getStepsSummary() }}\n </div>\n\n <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-2 cqa-no-underline cqa-ml-auto\">View Details<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg></a>\n\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover; hidden when inside step-group) -->\n <div *ngIf=\"!isInsideStepGroup && !isReorder\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px]\">\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M9.55208 2.1128C9.7843 1.88058 10.0993 1.75012 10.4277 1.75012C10.7561 1.75012 11.071 1.88058 11.3033 2.1128C11.5355 2.34502 11.6659 2.65998 11.6659 2.98838C11.6659 3.31679 11.5355 3.63175 11.3033 3.86397L4.29742 10.8704C4.15864 11.0092 3.9871 11.1107 3.79867 11.1656L2.12333 11.6544C2.07314 11.669 2.01993 11.6699 1.96928 11.6569C1.91863 11.6439 1.8724 11.6176 1.83543 11.5806C1.79846 11.5437 1.7721 11.4974 1.75913 11.4468C1.74615 11.3961 1.74703 11.3429 1.76167 11.2927L2.2505 9.61738C2.30546 9.42916 2.40698 9.25783 2.54567 9.11922L9.55208 2.1128Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <!-- <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button> -->\n <button\n type=\"button\"\n (click)=\"onDuplicate(); $event.stopPropagation()\"\n [disabled]=\"isDuplicating\"\n [attr.title]=\"isDuplicating ? 'Duplicating...' : 'Duplicate'\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6] disabled:cqa-opacity-60 disabled:cqa-cursor-not-allowed\"\n >\n <svg *ngIf=\"!isDuplicating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngIf=\"isDuplicating\" width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-label=\"Duplicating\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-opacity=\"0.2\" stroke-width=\"2\"></circle>\n <path d=\"M14 8A6 6 0 0 0 8 2\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 8 8\" to=\"360 8 8\" dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n </button>\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\"\n class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M11.0827 3.5V11.6667C11.0827 12.25 10.4993 12.8333 9.91602 12.8333H4.08268C3.49935 12.8333 2.91602 12.25 2.91602 11.6667V3.5\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M4.66602 3.49996V2.33329C4.66602 1.74996 5.24935 1.16663 5.83268 1.16663H8.16602C8.74935 1.16663 9.33268 1.74996 9.33268 2.33329V3.49996\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n <!-- Created Date (from API) - last so aligned across all steps, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"step-date cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px] cqa-ml-auto cqa-flex-shrink-0\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n </div>\n </div>\n\n <!-- Expanded Content with Nested Steps (renderer dispatches by step type, n-level nesting) -->\n <div *ngIf=\"expanded\" class=\"cqa-flex cqa-flex-col\">\n <!-- START Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getStartLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n <div *ngIf=\"!isReorder\" class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer *ngFor=\"let step of nestedSteps; let i = index\" [step]=\"step\" [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isInsideStepGroup]=\"isInsideStepGroup\" [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedOpenExternal($event)\" (edit)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedDuplicate($event, step)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n <div *ngIf=\"isReorder\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [style.min-height.px]=\"nestedSteps.length === 0 ? 52 : null\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"step-drag-placeholder-nested cqa-my-1 cqa-min-h-[50px] cqa-border-2 cqa-border-dashed cqa-border-[#3F43EE] cqa-rounded cqa-bg-[rgba(63,67,238,0.08)] cqa-flex cqa-items-center cqa-justify-center cqa-text-[#3F43EE] cqa-text-xs\">Drop here</div>\n <div *ngFor=\"let step of nestedSteps; let i = index\" class=\"nested-step-drag-item\"\n [dndDraggable]=\"step\"\n dndEffectAllowed=\"move\"\n dndType=\"step\">\n <cqa-test-case-details-renderer [step]=\"step\" [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isInsideStepGroup]=\"isInsideStepGroup\" [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedOpenExternal($event)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- Empty loop: show plus icon on hover when expanded and no steps.\n When rendered inside a step group or when reordering, hide this Add button entirely. -->\n <div *ngIf=\"nestedSteps.length === 0 && !isInsideStepGroup && !isReorder\" class=\"loop-step-empty cqa-min-h-[52px] cqa-flex cqa-items-center cqa-justify-center cqa-pl-4 cqa-pr-4\">\n <button type=\"button\" (click)=\"onAddStepEmpty(); $event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\" title=\"Add step\"\n class=\"loop-step-empty-add\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" fill=\"white\" />\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" stroke=\"#3F43EE\" stroke-width=\"2\" />\n <path d=\"M8.5 12H15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 8.5V15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <!-- END Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getEndLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n</div>" }]
|
|
1231
|
+
], template: "<div class=\"loop-step-row cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: stop propagation so dropdown/select interactions don't bubble and collapse the step or start drag -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3\" (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow cqa-flex-wrap cqa-min-w-0\">\n <!-- Loop Type Label -->\n <div class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getLoopTypeLabel() }}\n </div>\n\n <!-- FOR LOOP inline edit: cqa-dynamic-select (same usage as default stories) -->\n <ng-container *ngIf=\"loopType === 'for'\">\n <!-- First select: width 216.25px, height 36px, gap 4px, opacity 1 -->\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"forOptionTypeSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"testDataProfileSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"startStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"endStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- WHILE LOOP inline edit: cqa-autocomplete + template variables (same as condition-step) -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"whileConditionAutocompleteOptions\"\n [value]=\"whileConditionDisplayValue\"\n (valueChange)=\"onEditFormFieldChange('condition', $event)\"\n (optionSelect)=\"onConditionSelect($event)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\">\n </cqa-autocomplete>\n <!-- Template variables hidden in while loop - use Edit In depth to configure -->\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" *ngIf=\"isWhileLoop()\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <!-- Cancel / Apply -->\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\"\n (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\"\n (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Loop Header (normal view when not editing) -->\n <div *ngIf=\"!isEditing\"\n [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\"\n style=\"border-bottom: 1px solid #E5E7EB;\">\n <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true and not inside step group - steps inside step groups cannot be reordered) -->\n <div *ngIf=\"isReorder && !isInsideStepGroup\" class=\"cqa-mr-2 cqa-cursor-move cqa-text-[#6B7280] hover:cqa-text-[#111827]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n <!-- Checkbox (when isReorder is false and not inside step group - hide for steps inside step groups) -->\n <label *ngIf=\"editable && !isReorder && !isInsideStepGroup\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative cqa-mr-2\">\n <input type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"onSelectionChange($event)\"\n class=\"cqa-h-4 cqa-w-4 cqa-cursor-pointer cqa-transition-all cqa-appearance-none cqa-rounded shadow hover:cqa-shadow-md cqa-border cqa-border-solid cqa-border-slate-300 cqa-flex-shrink-0\"\n [class.cqa-bg-[#3F43EE]]=\"selected\"\n [class.cqa-border-[#3F43EE]]=\"selected\"\n id=\"check-loop-step\" />\n <span class=\"cqa-absolute cqa-text-white cqa-top-1/2 cqa-left-1/2 cqa--translate-x-1/2 cqa--translate-y-1/2 cqa-pointer-events-none cqa-flex cqa-items-center cqa-justify-center\"\n [class.cqa-opacity-0]=\"!selected\"\n [class.cqa-opacity-100]=\"selected\">\n <svg width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 3.125L4.5 8.625L2 6.125\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </label>\n </div>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px]\">{{ stepNumber }}</span>\n <!-- Expand/Collapse Icon -->\n <button type=\"button\" (click)=\"onToggleExpanded()\" class=\"cqa-p-0\">\n <svg [class.cqa-rotate-180]=\"!expanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Loop Icon -->\n <div *ngIf=\"loopType === 'for'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div *ngIf=\"loopType === 'while'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Loop Type Label -->\n <span class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-none\">\n {{ getLoopTypeLabel() }}\n </span>\n\n <!-- For Loop Display: items flow on one row; only wrap to next line when there is not enough space -->\n <div *ngIf=\"loopType === 'for' && (hasTestDataProfile() || hasStartValue() || hasEndValue())\" class=\"cqa-flex cqa-flex-wrap cqa-items-center cqa-gap-x-3 cqa-gap-y-1 cqa-ml-2 cqa-flex-1 cqa-min-w-0\">\n <span *ngIf=\"getForLoopProfileDisplay()\" class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getForLoopProfileDisplay() | cqaSafeHtml\" (click)=\"onLoopActionClick($event)\"></span>\n <span *ngIf=\"getForLoopRangeDisplay()\" class=\"for-loop-range-row cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getForLoopRangeDisplay() | cqaSafeHtml\" (click)=\"onLoopActionClick($event)\"></span>\n <div *ngIf=\"getLoopEventDetailsForDisplay().length > 0\" class=\"cqa-flex cqa-flex-wrap cqa-gap-2 cqa-items-center\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827] cqa-break-words\">{{ item.value }}</span>\n </span>\n </div>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) - same styling as condition step -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getConditionDisplay() | cqaSafeHtml\" (click)=\"onLoopActionClick($event)\"></span>\n <span *ngIf=\"maxIterations != null && maxIterations > 0\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\" data-key=\"maxIterations\" data-event-key=\"maxIterations\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">max iterations:</span>\n <span class=\"cqa-text-[#111827]\">{{ maxIterations }}</span>\n </span>\n <ng-container *ngIf=\"getLoopEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto\">\n <!-- Steps Summary -->\n <div\n class=\"cqa-ml-auto cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-lg cqa-py-0.5 cqa-px-2 cqa-text-[#0A0A0A] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getStepsSummary() }}\n </div>\n\n <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-2 cqa-no-underline cqa-ml-auto\">View Details<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg></a>\n\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover; hidden when inside step-group) -->\n <div *ngIf=\"editable && !isInsideStepGroup && !isReorder\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px]\">\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M9.55208 2.1128C9.7843 1.88058 10.0993 1.75012 10.4277 1.75012C10.7561 1.75012 11.071 1.88058 11.3033 2.1128C11.5355 2.34502 11.6659 2.65998 11.6659 2.98838C11.6659 3.31679 11.5355 3.63175 11.3033 3.86397L4.29742 10.8704C4.15864 11.0092 3.9871 11.1107 3.79867 11.1656L2.12333 11.6544C2.07314 11.669 2.01993 11.6699 1.96928 11.6569C1.91863 11.6439 1.8724 11.6176 1.83543 11.5806C1.79846 11.5437 1.7721 11.4974 1.75913 11.4468C1.74615 11.3961 1.74703 11.3429 1.76167 11.2927L2.2505 9.61738C2.30546 9.42916 2.40698 9.25783 2.54567 9.11922L9.55208 2.1128Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <!-- <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button> -->\n <button\n type=\"button\"\n (click)=\"onDuplicate(); $event.stopPropagation()\"\n [disabled]=\"isDuplicating\"\n [attr.title]=\"isDuplicating ? 'Duplicating...' : 'Duplicate'\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6] disabled:cqa-opacity-60 disabled:cqa-cursor-not-allowed\"\n >\n <svg *ngIf=\"!isDuplicating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngIf=\"isDuplicating\" width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-label=\"Duplicating\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-opacity=\"0.2\" stroke-width=\"2\"></circle>\n <path d=\"M14 8A6 6 0 0 0 8 2\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 8 8\" to=\"360 8 8\" dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n </button>\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\"\n class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M11.0827 3.5V11.6667C11.0827 12.25 10.4993 12.8333 9.91602 12.8333H4.08268C3.49935 12.8333 2.91602 12.25 2.91602 11.6667V3.5\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M4.66602 3.49996V2.33329C4.66602 1.74996 5.24935 1.16663 5.83268 1.16663H8.16602C8.74935 1.16663 9.33268 1.74996 9.33268 2.33329V3.49996\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n <!-- Created Date (from API) - last so aligned across all steps, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"step-date cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px] cqa-ml-auto cqa-flex-shrink-0\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n </div>\n </div>\n\n <!-- Expanded Content with Nested Steps (renderer dispatches by step type, n-level nesting) -->\n <div *ngIf=\"expanded\" class=\"cqa-flex cqa-flex-col\">\n <!-- START Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getStartLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n <div *ngIf=\"!isReorder\" class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer *ngFor=\"let step of nestedSteps; let i = index\" [step]=\"step\" [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isInsideStepGroup]=\"isInsideStepGroup\" [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [editable]=\"editable\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedOpenExternal($event)\" (edit)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedDuplicate($event, step)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n <div *ngIf=\"isReorder\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [style.min-height.px]=\"nestedSteps.length === 0 ? 52 : null\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"step-drag-placeholder-nested cqa-my-1 cqa-min-h-[50px] cqa-border-2 cqa-border-dashed cqa-border-[#3F43EE] cqa-rounded cqa-bg-[rgba(63,67,238,0.08)] cqa-flex cqa-items-center cqa-justify-center cqa-text-[#3F43EE] cqa-text-xs\">Drop here</div>\n <div *ngFor=\"let step of nestedSteps; let i = index\" class=\"nested-step-drag-item\"\n [dndDraggable]=\"step\"\n dndEffectAllowed=\"move\"\n dndType=\"step\">\n <cqa-test-case-details-renderer [step]=\"step\" [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isInsideStepGroup]=\"isInsideStepGroup\" [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\n [addStepBetween]=\"addStepBetween\"\n [editable]=\"editable\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedOpenExternal($event)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- Empty loop: show plus icon on hover when expanded and no steps.\n When rendered inside a step group or when reordering, hide this Add button entirely. -->\n <div *ngIf=\"nestedSteps.length === 0 && editable && !isInsideStepGroup && !isReorder\" class=\"loop-step-empty cqa-min-h-[52px] cqa-flex cqa-items-center cqa-justify-center cqa-pl-4 cqa-pr-4\">\n <button type=\"button\" (click)=\"onAddStepEmpty(); $event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\" title=\"Add step\"\n class=\"loop-step-empty-add\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" fill=\"white\" />\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" stroke=\"#3F43EE\" stroke-width=\"2\" />\n <path d=\"M8.5 12H15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 8.5V15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <!-- END Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getEndLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n</div>" }]
|
|
1231
1232
|
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
|
|
1232
1233
|
type: Input
|
|
1233
1234
|
}], id: [{
|
|
@@ -1280,6 +1281,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1280
1281
|
type: Input
|
|
1281
1282
|
}], addStepBetween: [{
|
|
1282
1283
|
type: Input
|
|
1284
|
+
}], editable: [{
|
|
1285
|
+
type: Input
|
|
1283
1286
|
}], toggleExpanded: [{
|
|
1284
1287
|
type: Output
|
|
1285
1288
|
}], testDataProfileChange: [{
|
|
@@ -1332,4 +1335,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1332
1335
|
type: ViewChild,
|
|
1333
1336
|
args: ['viewDetailsTrigger', { static: false }]
|
|
1334
1337
|
}] } });
|
|
1335
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvbG9vcC1zdGVwL2xvb3Atc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2xvb3Atc3RlcC9sb29wLXN0ZXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsU0FBUyxFQUFpQyxNQUFNLGVBQWUsQ0FBQztBQUNuSixPQUFPLEVBQTBCLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JFLE9BQU8sRUFBK0csU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEssT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7QUFLckUsTUFBTSxzQkFBc0IsR0FBRzs7Ozs7Ozs7Ozs7Ozs7OztDQWdCOUIsQ0FBQztBQUVGLE1BQU0sNEJBQTRCLEdBQUc7Ozs7Ozs7Ozs7Q0FVcEMsQ0FBQztBQVdGLE1BQU0sT0FBTyx5QkFBeUI7SUF5SHBDLFlBQ1UsRUFBZSxFQUNmLEdBQXNCO1FBRHRCLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXhIdkIsYUFBUSxHQUFvQixLQUFLLENBQUM7UUFTbEMsZ0JBQVcsR0FBeUIsRUFBRSxDQUFDO1FBQ3ZDLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFDekIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGtCQUFh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LEtBQUs7Z0JBRUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUVHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFFRyw2QkFBNkI7c0JBQXJDLEtBQUs7Z0JBRUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVJLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBRUcsT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBRUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFFRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcsWUFBWTtzQkFBckIsTUFBTTtnQkF3QzZDLGtCQUFrQjtzQkFBckUsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRG5kRHJvcEV2ZW50IH0gZnJvbSAnbmd4LWRyYWctZHJvcCc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb29wU3RlcENvbmZpZywgVGVzdENhc2VTdGVwQ29uZmlnLCBOb3JtYWxTdGVwQ29uZmlnLCBDb25kaXRpb25TdGVwQ29uZmlnLCBTdGVwR3JvdXBDb25maWcsIENvbmRpdGlvbkJyYW5jaCwgU3RlcFR5cGVzIH0gZnJvbSAnLi4vdGVzdC1jYXNlLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFNURVBfUk9XX0FDVElPTlNfU1RZTEVTIH0gZnJvbSAnLi4vc3RlcC1yb3ctYWN0aW9ucy5zdHlsZXMnO1xuaW1wb3J0IHsgRGF0YVByb2ZpbGVPcHRpb24gfSBmcm9tICcuLi8uLi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50JztcbmltcG9ydCB7IFZpZXdEZXRhaWxzUGF5bG9hZCB9IGZyb20gJy4uL3N0ZXAtZGV0YWlscy1tb2RhbC9zdGVwLWRldGFpbHMtbW9kYWwtZGF0YSc7XG5pbXBvcnQgeyBDcWFBdXRvY29tcGxldGVPcHRpb24gfSBmcm9tICcuLi8uLi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLm1vZGVsJztcblxuY29uc3QgTE9PUF9TVEVQX0VNUFRZX1NUWUxFUyA9IGBcbiAgLyogRW1wdHkgbG9vcDogcGx1cyBpY29uIGFsd2F5cyB2aXNpYmxlIHdoZW4gZXhwYW5kZWQgYW5kIG5vIHN0ZXBzICovXG4gIC5sb29wLXN0ZXAtZW1wdHkge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbiAgLmxvb3Atc3RlcC1lbXB0eS1hZGQge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyOiAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjb2xvcjogIzNGNDNFRTtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7XG4gIH1cbiAgLmxvb3Atc3RlcC1lbXB0eS1hZGQ6aG92ZXIge1xuICAgIG9wYWNpdHk6IDAuOTtcbiAgfVxuYDtcblxuY29uc3QgTE9PUF9TVEVQX0ZPUl9ESVNQTEFZX1NUWUxFUyA9IGBcbiAgLmZvci1sb29wLXJhbmdlLXJvdyB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDAuNXJlbTtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gIH1cbiAgLmZvci1sb29wLXJhbmdlLXJvdyAuZm9yLWxvb3AtcmFuZ2UtcGFydCArIC5mb3ItbG9vcC1yYW5nZS1wYXJ0IHtcbiAgICBtYXJnaW4tbGVmdDogMC4yNXJlbTtcbiAgfVxuYDtcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZXN0LWNhc2UtbG9vcC1zdGVwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvb3Atc3RlcC5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgc3R5bGVzOiBbXG4gICAgU1RFUF9ST1dfQUNUSU9OU19TVFlMRVMsXG4gICAgTE9PUF9TVEVQX0VNUFRZX1NUWUxFUyxcbiAgICBMT09QX1NURVBfRk9SX0RJU1BMQVlfU1RZTEVTLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBUZXN0Q2FzZUxvb3BTdGVwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb25maWchOiBMb29wU3RlcENvbmZpZztcbiAgQElucHV0KCkgaWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGxvb3BUeXBlOiAnZm9yJyB8ICd3aGlsZScgPSAnZm9yJztcbiAgQElucHV0KCkgc3RlcE51bWJlciE6IG51bWJlciB8IHN0cmluZztcbiAgLyoqIEFycmF5IGluZGV4IGZyb20gcGFyZW50IHJlbmRlcmVyIC0gdXNlIHRoaXMgZm9yIGVkaXRJbkRlcHRoIGluc3RlYWQgb2Ygc3RlcE51bWJlciAoc3RlcE51bWJlciBcIjEwLjNcIiBwYXJzZXMgdG8gMTApICovXG4gIEBJbnB1dCgpIGluZGV4PzogbnVtYmVyO1xuICBASW5wdXQoKSBjb25kaXRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHRlc3REYXRhUHJvZmlsZT86IHN0cmluZztcbiAgQElucHV0KCkgc3RhcnRTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBlbmRTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBuZXN0ZWRTdGVwczogVGVzdENhc2VTdGVwQ29uZmlnW10gPSBbXTtcbiAgQElucHV0KCkgZXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBpc05lc3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0luc2lkZUxvb3A6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNJbnNpZGVTdGVwR3JvdXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNSZW9yZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzRHVwbGljYXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIE9wdGlvbnMgZm9yIHRoZSBkYXRhIHByb2ZpbGUgZHJvcGRvd24gLSBhY2NlcHRzIERhdGFQcm9maWxlT3B0aW9uIG9iamVjdHMgKi9cbiAgQElucHV0KCkgZGF0YVByb2ZpbGVPcHRpb25zOiBEYXRhUHJvZmlsZU9wdGlvbltdID0gW107XG4gIC8qKiBJbmRpY2F0ZXMgaWYgbW9yZSBkYXRhIHByb2ZpbGVzIGFyZSBhdmFpbGFibGUgZm9yIGxvYWRpbmcgKi9cbiAgQElucHV0KCkgaGFzTW9yZURhdGFQcm9maWxlczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogTG9hZGluZyBzdGF0ZSBmb3IgZGF0YSBwcm9maWxlcyAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIE9wdGlvbnMgZm9yIG5hdHVyYWwgdGV4dCBhY3Rpb25zIChmb3Igd2hpbGUgbG9vcCBjb25kaXRpb24pICovXG4gIEBJbnB1dCgpIG5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW107XG4gIC8qKiBGdW5jdGlvbiB0byBwcm9jZXNzIHRlbXBsYXRlIHZhcmlhYmxlcyBmb3Igd2hpbGUgY29uZGl0aW9uIChzYW1lIGFzIGNvbmRpdGlvbi1zdGVwKSAqL1xuICBASW5wdXQoKSBzZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlczogKHRlbXBsYXRlOiBhbnkpID0+IGFueVtdID0gKCkgPT4gW107XG4gIC8qKiBTaG93IFwiQWRkIFN0ZXAgQmV0d2VlblwiIGJ1dHRvbiBhYm92ZSBuZXN0ZWQgc3RlcHMgKi9cbiAgQElucHV0KCkgYWRkU3RlcEJldHdlZW5BYm92ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogU2hvdyBcIkFkZCBTdGVwIEJldHdlZW5cIiBidXR0b24gYmVsb3cgbmVzdGVkIHN0ZXBzICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBCZXR3ZWVuQmVsb3c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBhZGRTdGVwQmV0d2VlbkFib3ZlIGFuZCBhZGRTdGVwQmV0d2VlbkJlbG93IGluc3RlYWQuIElmIHNldCwgYXBwbGllcyB0byBib3RoIGJ1dHRvbnMuICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBCZXR3ZWVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHRvZ2dsZUV4cGFuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7Y29uZmlnOiBMb29wU3RlcENvbmZpZywgZXhwYW5kZWQ6IGJvb2xlYW59PigpO1xuICBAT3V0cHV0KCkgdGVzdERhdGFQcm9maWxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBzdGFydFN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGVuZFN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGNvbmRpdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgbWF4SXRlcmF0aW9uc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgbmVzdGVkU3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXIgfT4oKTtcbiAgLyoqIEVtaXRzIHZvaWQgd2hlbiBhZGQgaXMgZnJvbSBuZXN0ZWQgY29udGVudDsgZW1pdHMgeyBsb29wU3RlcENvbmZpZyB9IHdoZW4gZW1wdHktc3RhdGUgYWRkIGlzIGNsaWNrZWQgKHNhbWUgYmVoYXZpb3VyIGFzIGFkZC1zdGVwLWJldHdlZW4pLiAqL1xuICBAT3V0cHV0KCkgYWRkU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZCB8IHsgbG9vcFN0ZXBDb25maWc6IExvb3BTdGVwQ29uZmlnIH0+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBkdXBsaWNhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBtb3JlT3B0aW9ucyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHZpZXdEZXRhaWxzID0gbmV3IEV2ZW50RW1pdHRlcjxWaWV3RGV0YWlsc1BheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSBlZGl0SW5EZXB0aCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXI7IHRlbXBsYXRlT3ZlcnJpZGU/OiBhbnkgfT4oKTtcbiAgQE91dHB1dCgpIGVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBkbmREcm9wSW5ab25lID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBEbmREcm9wRXZlbnQ7IHRhcmdldExpc3Q6IFRlc3RDYXNlU3RlcENvbmZpZ1tdIH0+KCk7XG4gIC8qKiBFbWl0IHdoZW4gbW9yZSBkYXRhIHByb2ZpbGVzIG5lZWQgdG8gYmUgbG9hZGVkICovXG4gIEBPdXRwdXQoKSBsb2FkTW9yZURhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdCB3aGVuIGRhdGEgcHJvZmlsZSBzZWFyY2ggcXVlcnkgY2hhbmdlcyAqL1xuICBAT3V0cHV0KCkgc2VhcmNoRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0IHdoZW4gc3RlcCBpcyB1cGRhdGVkIChBcHBseSBidXR0b24gY2xpY2tlZCBpbiBlZGl0IG1vZGUpICovXG4gIEBPdXRwdXQoKSBzdGVwVXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxMb29wU3RlcENvbmZpZz4oKTtcbiAgLyoqIFJlLWVtaXQgd2hlbiBhIG5lc3RlZCBzdGVwIChlLmcuIG5vcm1hbC1zdGVwKSBlbWl0cyBjbGlja0FjdGlvbiAoZS5nLiBlbGVtZW50L2xhYmVsIGNsaWNrIGZvciBwb3B1cCkgKi9cbiAgQE91dHB1dCgpIGNsaWNrQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBNb3VzZUV2ZW50OyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcgfT4oKTtcbiAgLyoqIFJlLWVtaXQgYWRkU3RlcEJldHdlZW5DbGljayBmcm9tIG5lc3RlZCByZW5kZXJlcnMgKi9cbiAgQE91dHB1dCgpIGFkZFN0ZXBCZXR3ZWVuQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHtzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGluZGV4OiBudW1iZXIsIHBvc2l0aW9uOiAnQUJPVkUnIHwgJ0JFTE9XJ30+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGVCcmFuY2ggPSBuZXcgRXZlbnRFbWl0dGVyPENvbmRpdGlvbkJyYW5jaD4oKTtcbiAgLyoqIFJlLWVtaXQgd2hlbiBuZXN0ZWQgc3RlcCBncm91cCBlbWl0cyBvcGVuRXh0ZXJuYWwgKHJlZGlyZWN0IHRvIHN0ZXAgZ3JvdXAgaW4gbmV3IHRhYikgKi9cbiAgQE91dHB1dCgpIG9wZW5FeHRlcm5hbCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcgfT4oKTtcblxuICBvbkRuZERyb3AoZXZlbnQ6IERuZERyb3BFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZG5kRHJvcEluWm9uZS5lbWl0KHsgZXZlbnQsIHRhcmdldExpc3Q6IHRoaXMubmVzdGVkU3RlcHMgfSk7XG4gIH1cblxuICAvKiogRW1pdCBjbGlja0FjdGlvbiB3aGVuIHVzZXIgY2xpY2tzIG9uIGxvb3AgZGlzcGxheSBiYWRnZXMgKGVsZW1lbnQsIHRlc3RfZGF0YSwgZXRjLikgc28gcGFyZW50IGNhbiBvcGVuIGVkaXQgbW9kYWxzICovXG4gIG9uTG9vcEFjdGlvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jbGlja0FjdGlvbi5lbWl0KHsgZXZlbnQsIHN0ZXA6IHRoaXMuY29uZmlnIH0pO1xuICB9XG5cbiAgLyoqIEV4cG9zZSBnbG9iYWwgY29uc3RydWN0b3JzIGZvciB0ZW1wbGF0ZSAoQW5ndWxhciB0ZW1wbGF0ZXMgZG9uJ3QgaGF2ZSBTdHJpbmcvTnVtYmVyKSAqL1xuICByZWFkb25seSBzdHJpbmdGbiA9IFN0cmluZztcbiAgcmVhZG9ubHkgbnVtYmVyRm4gPSBOdW1iZXI7XG5cbiAgLyoqIFdoZW4gdHJ1ZSwgaGVhZGVyIHNob3dzIGlubGluZSBlZGl0IGZvcm0gKGRyb3Bkb3ducywgaW5wdXRzLCBDYW5jZWwvQXBwbHkpICovXG4gIGlzRWRpdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBGb3JtIGZvciBlZGl0IG1vZGU7IGJvdW5kIHRvIGNxYS1keW5hbWljLXNlbGVjdCAoc2FtZSBwYXR0ZXJuIGFzIGRlZmF1bHQgc3RvcmllcykgKi9cbiAgZWRpdEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIENhY2hlZCBzZWxlY3QgY29uZmlncyAoc3RhYmxlIHJlZnMgdG8gYXZvaWQgY2hhbmdlLWRldGVjdGlvbiBsb29wcykgKi9cbiAgZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgdGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBzdGFydFN0ZXBTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGVuZFN0ZXBTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGNvbmRpdGlvblNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgLyoqIFdoaWxlIGxvb3A6IGNvbmZpZyBmb3IgYXV0b2NvbXBsZXRlIG9wdGlvbnMgKFdISUxFX0NPTkRJVElPTiBvbmx5KSAqL1xuICB3aGlsZUNvbmRpdGlvblNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuICAvKiogU2VsZWN0ZWQgdGVtcGxhdGUgZm9yIHdoaWxlIGNvbmRpdGlvbiAoc2FtZSBwYXR0ZXJuIGFzIGNvbmRpdGlvbi1zdGVwKSAqL1xuICBzZWxlY3RlZFRlbXBsYXRlOiBhbnkgPSBudWxsO1xuICAvKiogVGVtcGxhdGUgdmFyaWFibGVzIGZvciB3aGlsZSBjb25kaXRpb24gKi9cbiAgdGVtcGxhdGVWYXJpYWJsZXM6IGFueVtdID0gW107XG4gIC8qKiBGb3JtIGdyb3VwIGZvciB0ZW1wbGF0ZSB2YXJpYWJsZXMgKi9cbiAgdGVtcGxhdGVWYXJpYWJsZXNGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBEZWZhdWx0IG1heCBmb3IgTG9vcCBTdGFydCAvIEVuZCB3aGVuIG5vIHByb2ZpbGUgc2VsZWN0ZWQgKG9wdGlvbnMgMS4uMTApICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfTE9PUF9PUFRJT05TX01BWCA9IDEwO1xuXG4gIEBWaWV3Q2hpbGQoJ3ZpZXdEZXRhaWxzVHJpZ2dlcicsIHsgc3RhdGljOiBmYWxzZSB9KSB2aWV3RGV0YWlsc1RyaWdnZXI/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAvKiogTG9jYWwgY29weSBvZiB2YWx1ZXMgd2hpbGUgZWRpdGluZyAoZm9yIENhbmNlbCByZXZlcnQpICovXG4gIHByaXZhdGUgZWRpdFNuYXBzaG90OiB7XG4gICAgdGVzdERhdGFQcm9maWxlPzogc3RyaW5nO1xuICAgIHN0YXJ0U3RlcD86IG51bWJlcjtcbiAgICBlbmRTdGVwPzogbnVtYmVyO1xuICAgIGNvbmRpdGlvbj86IHN0cmluZztcbiAgICBtYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuICAgIHNlbGVjdGVkVGVtcGxhdGU/OiBhbnk7XG4gICAgdGVtcGxhdGVWYXJpYWJsZXM/OiBhbnlbXTtcbiAgICBjb25kaXRpb25UZW1wbGF0ZUZvcm1WYWx1ZT86IGFueTtcbiAgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmlkID0gdGhpcy5jb25maWcuaWQ7XG4gICAgICB0aGlzLmxvb3BUeXBlID0gdGhpcy5jb25maWcubG9vcFR5cGU7XG4gICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLmNvbmZpZy5zdGVwTnVtYmVyO1xuICAgICAgdGhpcy5jb25kaXRpb24gPSB0aGlzLmNvbmZpZy5jb25kaXRpb247XG4gICAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB0aGlzLmNvbmZpZy5tYXhJdGVyYXRpb25zO1xuICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLmdldFN0b3JlZFRlc3REYXRhUHJvZmlsZUxhYmVsKCk7XG4gICAgICB0aGlzLnN0YXJ0U3RlcCA9IHRoaXMuY29uZmlnLnN0YXJ0U3RlcDtcbiAgICAgIHRoaXMuZW5kU3RlcCA9IHRoaXMuY29uZmlnLmVuZFN0ZXA7XG4gICAgICB0aGlzLm5lc3RlZFN0ZXBzID0gdGhpcy5jb25maWcubmVzdGVkU3RlcHMgfHwgW107XG4gICAgICB0aGlzLmV4cGFuZGVkID0gdGhpcy5jb25maWcuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLmV4cGFuZGVkIDogdHJ1ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSAodGhpcy5jb25maWcgYXMgYW55KS5zZWxlY3RlZCB8fCBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5idWlsZEVkaXRGb3JtKCk7XG4gICAgdGhpcy5idWlsZFNlbGVjdENvbmZpZ3MoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10gJiYgdGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSAodGhpcy5jb25maWcgYXMgYW55KS5zZWxlY3RlZCB8fCBmYWxzZTtcbiAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGhpcy5nZXRTdG9yZWRUZXN0RGF0YVByb2ZpbGVMYWJlbCgpO1xuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTtcbiAgICAgIH1cbiAgICAgIC8vIEZPUiBsb29wOiB3aGVuIHN0ZXAgY29uZmlnIGhhcyBmb3JMb29wVGVzdERhdGFJZC9mb3JMb29wU3RhcnRJbmRleC9mb3JMb29wRW5kSW5kZXgsIHN5bmMgZm9ybSBhbmQgcmVmcmVzaCBzZWxlY3QgY29uZmlncyBzbyBkcm9wZG93bnMgc2hvdyBzZWxlY3RlZFxuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRm9yTG9vcFNlbGVjdENvbmZpZ3NTZWxlY3RlZFZhbHVlcygpO1xuICAgICAgICBpZiAodGhpcy5lZGl0Rm9ybSkgdGhpcy5zeW5jRm9yTG9vcEVkaXRGb3JtRnJvbUNvbmZpZygpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydkYXRhUHJvZmlsZU9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlRGF0YVByb2ZpbGVzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRGF0YVByb2ZpbGVzJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk7XG4gICAgICAvLyBXaGVuIGRhdGEgcHJvZmlsZXMgbG9hZCBpbiBlZGl0IG1vZGUsIHN5bmMgZm9ybSB2YWx1ZSBzbyBkcm9wZG93biBzaG93cyBzZWxlY3RlZCAoZm9yTG9vcFRlc3REYXRhSWQgb3IgdGVzdERhdGFQcm9maWxlKVxuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InICYmIHRoaXMuZWRpdEZvcm0gJiYgdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgICAgIGlmIChjZmc/LmZvckxvb3BUZXN0RGF0YUlkICE9IG51bGwgfHwgdGhpcy50ZXN0RGF0YVByb2ZpbGUpIHRoaXMuc3luY0Zvckxvb3BFZGl0Rm9ybUZyb21Db25maWcoKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvblNlbGVjdENvbmZpZygpO1xuICAgICAgLy8gV2hlbiBvcHRpb25zIGxvYWQsIHBvcHVsYXRlIGNvbmRpdGlvbiArIHRlbXBsYXRlIGZyb20gbmF0dXJhbFRleHRBY3Rpb25JZCAoc2FtZSBhcyBjb25kaXRpb24tc3RlcClcbiAgICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnICYmIHRoaXMuZWRpdEZvcm0gJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogRGVyaXZlIGZvck9wdGlvblR5cGUgZm9yIEZPUiBsb29wIGZyb20gY29uZmlnIHNvIGRyb3Bkb3duIHNob3dzIGV4aXN0aW5nIHNlbGVjdGlvbiAqL1xuICBwcml2YXRlIGdldEZvck9wdGlvblR5cGVGcm9tQ29uZmlnKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGhhc1Rlc3REYXRhSWQgPSBjZmc/LmZvckxvb3BUZXN0RGF0YUlkICE9IG51bGwgfHwgY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8udGVzdERhdGFJZCAhPSBudWxsO1xuICAgIGlmIChoYXNUZXN0RGF0YUlkIHx8IHRoaXMudGVzdERhdGFQcm9maWxlKSByZXR1cm4gJ3Rlc3QtZGF0YSc7XG4gICAgY29uc3QgaGFzRml4ZWQgPSBjZmc/LmZvckxvb3BTdGFydEluZGV4ICE9IG51bGwgfHwgY2ZnPy5mb3JMb29wRW5kSW5kZXggIT0gbnVsbFxuICAgICAgfHwgY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFN0YXJ0SW5kZXggIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wRW5kSW5kZXggIT0gbnVsbFxuICAgICAgfHwgY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnN0YXJ0SW5kZXggIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uZW5kSW5kZXggIT0gbnVsbDtcbiAgICBpZiAodGhpcy5zdGFydFN0ZXAgIT0gbnVsbCB8fCB0aGlzLmVuZFN0ZXAgIT0gbnVsbCB8fCBoYXNGaXhlZCkgcmV0dXJuICdmaXhlZCc7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogVGVzdCBEYXRhIFByb2ZpbGUgZHJvcGRvd24gdmFsdWU6IHByZWZlciBmb3JMb29wVGVzdERhdGFJZCBmcm9tIGNvbmZpZyAob3IgZGF0YU1hcEpzb24vZGF0YU1hcEJlYW4pLiBVc2Ugb3B0aW9uLmlkIHdoZW4gb3B0aW9ucyBsb2FkZWQgc28gdHlwZSBtYXRjaGVzIHNlbGVjdC4gKi9cbiAgcHJpdmF0ZSBnZXRUZXN0RGF0YVByb2ZpbGVGb3JtVmFsdWUoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50Rm9ybVZhbHVlID0gdGhpcy5lZGl0Rm9ybT8uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKT8udmFsdWU7XG4gICAgaWYgKGN1cnJlbnRGb3JtVmFsdWUgIT09IG51bGwgJiYgY3VycmVudEZvcm1WYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGN1cnJlbnRGb3JtVmFsdWUgIT09ICcnKSB7XG4gICAgICByZXR1cm4gY3VycmVudEZvcm1WYWx1ZSBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgfVxuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBpZEZyb21Db25maWcgPSBjZmc/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy50ZXN0RGF0YUlkO1xuICAgIC8vIFdoZW4gd2UgaGF2ZSBvcHRpb25zLCByZXNvbHZlIGJ5IGlkIHNvIGZvcm0gdmFsdWUgbWF0Y2hlcyBvcHRpb24uaWQgKHN0cmljdCBlcXVhbGl0eSBpbiBkeW5hbWljLXNlbGVjdClcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgJiYgdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgaWYgKGlkRnJvbUNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgICAgICBvID0+IG8uaWQgPT09IGlkRnJvbUNvbmZpZyB8fCBTdHJpbmcoby5pZCkgPT09IFN0cmluZyhpZEZyb21Db25maWcpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoLmlkO1xuICAgICAgICByZXR1cm4gaWRGcm9tQ29uZmlnIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZXN0RGF0YVByb2ZpbGUgPz8gJyc7XG4gICAgICBpZiAodmFsdWUgIT09ICcnKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgICAgICBvID0+IG8ubmFtZSA9PT0gdmFsdWUgfHwgU3RyaW5nKG8uaWQpID09PSBTdHJpbmcodmFsdWUpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoLmlkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICB9XG4gICAgaWYgKGlkRnJvbUNvbmZpZyAhPSBudWxsKSByZXR1cm4gaWRGcm9tQ29uZmlnIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICByZXR1cm4gKHRoaXMudGVzdERhdGFQcm9maWxlID8/ICcnKSBhcyBzdHJpbmcgfCBudW1iZXI7XG4gIH1cblxuICAvKiogTG9vcCBTdGFydCBkcm9wZG93biB2YWx1ZTogcHJlZmVyIGZvckxvb3BTdGFydEluZGV4IGZyb20gY29uZmlnIChvciBkYXRhTWFwSnNvbi9kYXRhTWFwQmVhbiksIGVsc2Ugc3RhcnRTdGVwICovXG4gIHByaXZhdGUgZ2V0TG9vcFN0YXJ0Rm9ybVZhbHVlKCk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGN1cnJlbnRGb3JtVmFsdWUgPSB0aGlzLmVkaXRGb3JtPy5nZXQoJ3N0YXJ0U3RlcCcpPy52YWx1ZTtcbiAgICBpZiAoY3VycmVudEZvcm1WYWx1ZSAhPT0gbnVsbCAmJiBjdXJyZW50Rm9ybVZhbHVlICE9PSB1bmRlZmluZWQpIHJldHVybiBOdW1iZXIoY3VycmVudEZvcm1WYWx1ZSk7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHYgPSBjZmc/LmZvckxvb3BTdGFydEluZGV4ID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BTdGFydEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5zdGFydEluZGV4O1xuICAgIGlmICh2ICE9IG51bGwpIHJldHVybiBOdW1iZXIodik7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRTdGVwID8/IG51bGw7XG4gIH1cblxuICAvKiogTG9vcCBFbmQgZHJvcGRvd24gdmFsdWU6IHByZWZlciBmb3JMb29wRW5kSW5kZXggZnJvbSBjb25maWcgKG9yIGRhdGFNYXBKc29uL2RhdGFNYXBCZWFuKSwgZWxzZSBlbmRTdGVwICovXG4gIHByaXZhdGUgZ2V0TG9vcEVuZEZvcm1WYWx1ZSgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBjdXJyZW50Rm9ybVZhbHVlID0gdGhpcy5lZGl0Rm9ybT8uZ2V0KCdlbmRTdGVwJyk/LnZhbHVlO1xuICAgIGlmIChjdXJyZW50Rm9ybVZhbHVlICE9PSBudWxsICYmIGN1cnJlbnRGb3JtVmFsdWUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIE51bWJlcihjdXJyZW50Rm9ybVZhbHVlKTtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgdiA9IGNmZz8uZm9yTG9vcEVuZEluZGV4ID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BFbmRJbmRleCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uZW5kSW5kZXg7XG4gICAgaWYgKHYgIT0gbnVsbCkgcmV0dXJuIE51bWJlcih2KTtcbiAgICByZXR1cm4gdGhpcy5lbmRTdGVwID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRWRpdEZvcm0oKTogdm9pZCB7XG4gICAgLy8gRm9yIHdoaWxlIGxvb3A6IGlmIGNvbmZpZyBoYXMgbmF0dXJhbFRleHRBY3Rpb25JZCBhbmQgb3B0aW9ucyBhcmUgYWxyZWFkeSBsb2FkZWQsIHVzZSB0aGVtIGZvciBpbml0aWFsIGNvbmRpdGlvbiArIHRlbXBsYXRlXG4gICAgbGV0IGNvbmRpdGlvblZhbHVlID0gdGhpcy5jb25kaXRpb24gPz8gJyc7XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIGNvbnN0IHBvcHVsYXRlZCA9IHRoaXMucG9wdWxhdGVXaGlsZUNvbmRpdGlvbkZyb21OYXR1cmFsVGV4dEFjdGlvbklkKCk7XG4gICAgICBpZiAocG9wdWxhdGVkPy5jb25kaXRpb24gIT0gbnVsbCkge1xuICAgICAgICBjb25kaXRpb25WYWx1ZSA9IHBvcHVsYXRlZC5jb25kaXRpb247XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEZvciBGT1IgbG9vcDogaW5pdGlhbCBmb3JtIHZhbHVlcyBzbyBkcm9wZG93bnMgc2hvdyBleGlzdGluZyBzZWxlY3Rpb24gKGZvck9wdGlvblR5cGUsIGZvckxvb3BUZXN0RGF0YUlkL3Rlc3REYXRhUHJvZmlsZSwgZm9yTG9vcFN0YXJ0SW5kZXgvZm9yTG9vcEVuZEluZGV4KVxuICAgIGNvbnN0IGZvck9wdGlvblR5cGUgPSB0aGlzLmdldEZvck9wdGlvblR5cGVGcm9tQ29uZmlnKCk7XG4gICAgY29uc3QgdGVzdERhdGFQcm9maWxlVmFsdWUgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0VGVzdERhdGFQcm9maWxlRm9ybVZhbHVlKCkgOiAodGhpcy50ZXN0RGF0YVByb2ZpbGUgPz8gJycpO1xuICAgIGNvbnN0IGxvb3BTdGFydFZhbHVlID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldExvb3BTdGFydEZvcm1WYWx1ZSgpIDogKHRoaXMuc3RhcnRTdGVwID8/IG51bGwpO1xuICAgIGNvbnN0IGxvb3BFbmRWYWx1ZSA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gdGhpcy5nZXRMb29wRW5kRm9ybVZhbHVlKCkgOiAodGhpcy5lbmRTdGVwID8/IG51bGwpO1xuICAgIHRoaXMuZWRpdEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGZvck9wdGlvblR5cGU6IFtmb3JPcHRpb25UeXBlIGFzIHN0cmluZyB8IG51bGxdLFxuICAgICAgdGVzdERhdGFQcm9maWxlOiBbdGVzdERhdGFQcm9maWxlVmFsdWVdLFxuICAgICAgc3RhcnRTdGVwOiBbbG9vcFN0YXJ0VmFsdWUgYXMgbnVtYmVyIHwgbnVsbF0sXG4gICAgICBlbmRTdGVwOiBbbG9vcEVuZFZhbHVlIGFzIG51bWJlciB8IG51bGxdLFxuICAgICAgY29uZGl0aW9uOiBbY29uZGl0aW9uVmFsdWVdLFxuICAgICAgbWF4SXRlcmF0aW9uczogW3RoaXMubWF4SXRlcmF0aW9ucyA/PyA1XSxcbiAgICB9KTtcbiAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQb3B1bGF0ZSBjb25kaXRpb24sIHNlbGVjdGVkVGVtcGxhdGUgYW5kIHRlbXBsYXRlIHZhcmlhYmxlcyBmcm9tIGNvbmZpZy5uYXR1cmFsVGV4dEFjdGlvbklkIHdoZW4gb3B0aW9ucyBhcmUgYXZhaWxhYmxlLlxuICAgKiBSZXR1cm5zIHsgY29uZGl0aW9uIH0gaWYgYSBtYXRjaCB3YXMgZm91bmQgc28gYnVpbGRFZGl0Rm9ybSBjYW4gc2V0IGluaXRpYWwgZm9ybSB2YWx1ZS5cbiAgICovXG4gIHByaXZhdGUgcG9wdWxhdGVXaGlsZUNvbmRpdGlvbkZyb21OYXR1cmFsVGV4dEFjdGlvbklkKCk6IHsgY29uZGl0aW9uOiBzdHJpbmcgfSB8IG51bGwge1xuICAgIGNvbnN0IGNvbmZpZ1dpdGhJZCA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBpZiAoIWNvbmZpZ1dpdGhJZD8ubmF0dXJhbFRleHRBY3Rpb25JZCB8fCAhdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXMgYW55W10pLmZpbmQoXG4gICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQpXG4gICAgKTtcbiAgICBpZiAoIW1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbmF0dXJhbFRleHQgPSBtYXRjaGluZ09wdGlvbi5uYXR1cmFsVGV4dCA/PyBtYXRjaGluZ09wdGlvbi5uYW1lID8/IG1hdGNoaW5nT3B0aW9uLnZhbHVlID8/ICcnO1xuICAgIGlmICghbmF0dXJhbFRleHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNvbmRpdGlvbiA9IG5hdHVyYWxUZXh0O1xuICAgIGNvbnN0IGZ1bGxUZW1wbGF0ZSA9IG1hdGNoaW5nT3B0aW9uLnRlbXBsYXRlIHx8IG1hdGNoaW5nT3B0aW9uO1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICBpZiAoZnVsbFRlbXBsYXRlPy52YXJpYWJsZXMpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKGZ1bGxUZW1wbGF0ZSkgfHwgW107XG4gICAgICB0aGlzLmJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHJldHVybiB7IGNvbmRpdGlvbjogbmF0dXJhbFRleHQgfTtcbiAgfVxuXG4gIC8qKiBSZWJ1aWxkIGNvbmRpdGlvbiArIHRlbXBsYXRlIHN0YXRlIHdoZW4gbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyBsb2FkIG9yIGNvbmZpZyBjaGFuZ2VzIChzYW1lIGFzIGNvbmRpdGlvbi1zdGVwKS4gKi9cbiAgcHJpdmF0ZSByZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRGb3JtIHx8IHRoaXMubG9vcFR5cGUgIT09ICd3aGlsZScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnV2l0aElkID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGlmICghY29uZmlnV2l0aElkPy5uYXR1cmFsVGV4dEFjdGlvbklkIHx8ICF0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXMgYW55W10pLmZpbmQoXG4gICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQpXG4gICAgKTtcbiAgICBpZiAoIW1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gbWF0Y2hpbmdPcHRpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdPcHRpb24ubmFtZSA/PyBtYXRjaGluZ09wdGlvbi52YWx1ZSA/PyAnJztcbiAgICBpZiAobmF0dXJhbFRleHQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdjb25kaXRpb24nKT8udmFsdWUgPz8gJyc7XG4gICAgICBpZiAoIWN1cnJlbnRWYWx1ZSB8fCBjdXJyZW50VmFsdWUgIT09IG5hdHVyYWxUZXh0KSB7XG4gICAgICAgIHRoaXMuZWRpdEZvcm0uZ2V0KCdjb25kaXRpb24nKT8uc2V0VmFsdWUobmF0dXJhbFRleHQpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25kaXRpb24gPSBuYXR1cmFsVGV4dDtcbiAgICB9XG4gICAgY29uc3QgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gZnVsbFRlbXBsYXRlO1xuICAgIGlmIChmdWxsVGVtcGxhdGU/LnZhcmlhYmxlcykge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMoZnVsbFRlbXBsYXRlKSB8fCBbXTtcbiAgICAgIHRoaXMuYnVpbGRUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IFtdO1xuICAgIH1cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogQnVpbGQgc2VsZWN0IGNvbmZpZ3Mgb25jZSAoc2FtZSBvcHRpb24gc2hhcGUgYXMgZGVmYXVsdCBzdG9yaWVzOiBpZCArIG5hbWUpOyBGT1IgbG9vcCBhZGRzIHNlbGVjdGVkVmFsdWUgZnJvbSBzdGVwICovXG4gIHByaXZhdGUgYnVpbGRTZWxlY3RDb25maWdzKCk6IHZvaWQge1xuICAgIHRoaXMuZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2Zvck9wdGlvblR5cGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3Qgb3B0aW9uJyxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGlkOiAndGVzdC1kYXRhJywgdmFsdWU6ICd0ZXN0LWRhdGEnLCBuYW1lOiAnVGVzdCBEYXRhIFByb2ZpbGUnLCBsYWJlbDogJ1Rlc3QgRGF0YSBQcm9maWxlJyB9LFxuICAgICAgICB7IGlkOiAnZml4ZWQnLCB2YWx1ZTogJ2ZpeGVkJywgbmFtZTogJ0ZpeGVkIGNvdW50JywgbGFiZWw6ICdGaXhlZCBjb3VudCcgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZVRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IHN0YXJ0VmFsID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldExvb3BTdGFydEZvcm1WYWx1ZSgpIDogbnVsbDtcbiAgICBjb25zdCBlbmRWYWwgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0TG9vcEVuZEZvcm1WYWx1ZSgpIDogbnVsbDtcbiAgICB0aGlzLnN0YXJ0U3RlcFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3N0YXJ0U3RlcCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ0xvb3AgU3RhcnQnLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiB0aGlzLmdldExvb3BTdGFydFNlbGVjdE9wdGlvbnMoKSxcbiAgICAgIC4uLihzdGFydFZhbCAhPSBudWxsICYmIHsgc2VsZWN0ZWRWYWx1ZTogc3RhcnRWYWwgfSksXG4gICAgfTtcbiAgICB0aGlzLmVuZFN0ZXBTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdlbmRTdGVwJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnTG9vcCBFbmQnLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiB0aGlzLmdldExvb3BFbmRTZWxlY3RPcHRpb25zKCksXG4gICAgICAuLi4oZW5kVmFsICE9IG51bGwgJiYgeyBzZWxlY3RlZFZhbHVlOiBlbmRWYWwgfSksXG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvblNlbGVjdENvbmZpZygpO1xuICB9XG5cbiAgLyoqIFVwZGF0ZSBjb25kaXRpb24gc2VsZWN0IGNvbmZpZyB3aXRoIG5hdHVyYWwgdGV4dCBhY3Rpb25zIG9wdGlvbnMgKGxlZ2FjeSBtYXQtc2VsZWN0KSAqL1xuICBwcml2YXRlIHVwZGF0ZUNvbmRpdGlvblNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvblNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2NvbmRpdGlvbicsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBjb25kaXRpb24nLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSxcbiAgICB9O1xuICAgIHRoaXMudXBkYXRlV2hpbGVDb25kaXRpb25TZWxlY3RDb25maWcoKTtcbiAgfVxuXG4gIC8qKiBXaGlsZSBsb29wOiBvbmx5IHNob3cgb3B0aW9ucyB3aXRoIHN0ZXBBY3Rpb25UeXBlID09PSBcIldISUxFX0xPT1BcIiAqL1xuICBwcml2YXRlIHVwZGF0ZVdoaWxlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbHRlcmVkT3B0aW9ucyA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgfHwgW10pLmZpbHRlcigob3B0aW9uOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBvcHRpb24uc3RlcEFjdGlvblR5cGUgPT09ICdXSElMRV9MT09QJztcbiAgICB9KTtcbiAgICB0aGlzLndoaWxlQ29uZGl0aW9uU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnY29uZGl0aW9uJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGNvbmRpdGlvbicsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgb3B0aW9uczogZmlsdGVyZWRPcHRpb25zLFxuICAgIH07XG4gIH1cblxuICAvKiogT3B0aW9ucyBmb3IgdGhlIHdoaWxlIGNvbmRpdGlvbiBhdXRvY29tcGxldGUgKFdISUxFX0xPT1AgbmF0dXJhbCB0ZXh0IGFjdGlvbnMgb25seSkgKi9cbiAgZ2V0IHdoaWxlQ29uZGl0aW9uQXV0b2NvbXBsZXRlT3B0aW9ucygpOiAoQ3FhQXV0b2NvbXBsZXRlT3B0aW9uICYgeyB0ZW1wbGF0ZT86IGFueSB9KVtdIHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy53aGlsZUNvbmRpdGlvblNlbGVjdENvbmZpZz8ub3B0aW9ucyA/PyBbXTtcbiAgICByZXR1cm4gb3B0cy5tYXAoKG9wdGlvbjogYW55KSA9PiB7XG4gICAgICBjb25zdCBuYXR1cmFsVGV4dCA9IG9wdGlvbi5uYXR1cmFsVGV4dCA/PyBvcHRpb24ubmFtZSA/PyBvcHRpb24udmFsdWUgPz8gU3RyaW5nKG9wdGlvbi5pZCA/PyAnJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogbmF0dXJhbFRleHQsXG4gICAgICAgIGxhYmVsOiBuYXR1cmFsVGV4dCxcbiAgICAgICAgdGVtcGxhdGU6IG9wdGlvbi50ZW1wbGF0ZSB8fCBvcHRpb24sXG4gICAgICB9IGFzIENxYUF1dG9jb21wbGV0ZU9wdGlvbiAmIHsgdGVtcGxhdGU/OiBhbnkgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBEaXNwbGF5IHZhbHVlIGZvciB3aGlsZSBjb25kaXRpb24gYXV0b2NvbXBsZXRlOiBzaG93IG5hdHVyYWwgdGV4dCBmcm9tIG9wdGlvbiBtYXRjaGluZyBuYXR1cmFsVGV4dEFjdGlvbklkIHdoZW4gYXZhaWxhYmxlIChpbmNsdWRpbmcgd2hlbiBmb3JtIGlzIGVtcHR5IG9uIG9wZW4pLCBlbHNlIGZvcm0gdmFsdWUuIFdoZW4gdXNlciBoYXMgc2VsZWN0ZWQgYSBkaWZmZXJlbnQgb3B0aW9uLCBzaG93IGZvcm0gdmFsdWUuICovXG4gIGdldCB3aGlsZUNvbmRpdGlvbkRpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbmZpZ1dpdGhJZCA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvbicpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBpc0Zvcm1IdG1sID0gZm9ybVZhbHVlICYmIChTdHJpbmcoZm9ybVZhbHVlKS5pbmNsdWRlcygnPCcpIHx8IFN0cmluZyhmb3JtVmFsdWUpLmluY2x1ZGVzKCc+JykpO1xuICAgIGlmIChjb25maWdXaXRoSWQ/Lm5hdHVyYWxUZXh0QWN0aW9uSWQgIT0gbnVsbCAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSAodGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIGFzIGFueVtdKS5maW5kKFxuICAgICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQpXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gbWF0Y2hpbmdPcHRpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdPcHRpb24ubmFtZSA/PyBtYXRjaGluZ09wdGlvbi52YWx1ZSA/PyAnJztcbiAgICAgICAgaWYgKG5hdHVyYWxUZXh0KSB7XG4gICAgICAgICAgY29uc3QgbmF0dXJhbFRleHRTdHIgPSBTdHJpbmcobmF0dXJhbFRleHQpO1xuICAgICAgICAgIC8vIFNob3cgc2VsZWN0ZWQ6IHdoZW4gZm9ybSBpcyBlbXB0eSAoaW5pdGlhbCBvcGVuKSwgb3IgZm9ybSBtYXRjaGVzIHRoaXMgb3B0aW9uLCBvciBmb3JtIGhhcyBIVE1MLiBPbmx5IHVzZSBmb3JtIHZhbHVlIHdoZW4gdXNlciBwaWNrZWQgYSBkaWZmZXJlbnQgb3B0aW9uLlxuICAgICAgICAgIGlmICghZm9ybVZhbHVlIHx8IGZvcm1WYWx1ZSA9PT0gbmF0dXJhbFRleHRTdHIgfHwgaXNGb3JtSHRtbCkgcmV0dXJuIG5hdHVyYWxUZXh0U3RyO1xuICAgICAgICAgIHJldHVybiBmb3JtVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRm9ybUh0bWwpIHJldHVybiAnJztcbiAgICByZXR1cm4gZm9ybVZhbHVlO1xuICB9XG5cbiAgb25Db25kaXRpb25TZWxlY3Qob3B0aW9uOiBDcWFBdXRvY29tcGxldGVPcHRpb24gJiB7IHRlbXBsYXRlPzogYW55IH0pOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvbicpPy5zZXRWYWx1ZShvcHRpb24udmFsdWUpO1xuICAgIGNvbnN0IG1hdGNoaW5nVGVtcGxhdGUgPSBvcHRpb24udGVtcGxhdGU7XG4gICAgbGV0IGZ1bGxUZW1wbGF0ZSA9IG1hdGNoaW5nVGVtcGxhdGU7XG4gICAgaWYgKCFmdWxsVGVtcGxhdGUgfHwgIWZ1bGxUZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSkuZmluZChcbiAgICAgICAgKG9wdDogYW55KSA9PiBvcHQubmF0dXJhbFRleHQgPT09IG9wdGlvbi52YWx1ZSB8fCBvcHQubmFtZSA9PT0gb3B0aW9uLnZhbHVlIHx8IG9wdC52YWx1ZSA9PT0gb3B0aW9uLnZhbHVlXG4gICAgICApIGFzIGFueTtcbiAgICAgIGZ1bGxUZW1wbGF0ZSA9IG1hdGNoaW5nT3B0aW9uPy50ZW1wbGF0ZSB8fCBtYXRjaGluZ09wdGlvbjtcbiAgICB9XG4gICAgaWYgKGZ1bGxUZW1wbGF0ZSAmJiBmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBmdWxsVGVtcGxhdGU7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpIHx8IFtdO1xuICAgICAgdGhpcy5idWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBudWxsO1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IFtdO1xuICAgICAgaWYgKCF0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgICAgfVxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgICAvLyBBdXRvLW9wZW4gRWRpdCBJbiBkZXB0aCB3aGVuIHVzZXIgc2VsZWN0cyBhIGNvbmRpdGlvbiBmcm9tIHRoZSBhdXRvY29tcGxldGUuXG4gICAgLy8gUGFzcyBmdWxsVGVtcGxhdGUgc28gdGhlIG1vZGFsIHNob3dzIHRoZSBuZXdseSBzZWxlY3RlZCB0ZW1wbGF0ZSwgbm90IHRoZSBvbGQgc3RlcCB0ZW1wbGF0ZS5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMub25FZGl0SW5EZXB0aChmdWxsVGVtcGxhdGUpLCAxMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyh0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0ucmVtb3ZlQ29udHJvbChrZXkpO1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbmZpZ1dpdGhEYXRhID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGV4aXN0aW5nRGF0YSA9IGNvbmZpZ1dpdGhEYXRhLnRlbXBsYXRlVmFyaWFibGVzRGF0YSB8fCB7fTtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgbGV0IGRlZmF1bHRWYWx1ZTogYW55O1xuICAgICAgaWYgKGV4aXN0aW5nRGF0YS5oYXNPd25Qcm9wZXJ0eSh2YXJpYWJsZS5uYW1lKSkge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBleGlzdGluZ0RhdGFbdmFyaWFibGUubmFtZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbidcbiAgICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicgJiYgdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlID09PSAndHJ1ZScgfHwgZGVmYXVsdFZhbHVlID09PSAnMSc7XG4gICAgICB9XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5hZGRDb250cm9sKHZhcmlhYmxlLm5hbWUsIG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFNlbGVjdENvbmZpZ0ZvclZhcmlhYmxlKHZhcmlhYmxlOiBhbnkpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gKHZhcmlhYmxlLm9wdGlvbnMgfHwgW10pLm1hcCgob3B0OiBzdHJpbmcpID0+ICh7XG4gICAgICBpZDogb3B0LFxuICAgICAgdmFsdWU6IG9wdCxcbiAgICAgIG5hbWU6IG9wdCxcbiAgICAgIGxhYmVsOiBvcHRcbiAgICB9KSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogdmFyaWFibGUubmFtZSxcbiAgICAgIHBsYWNlaG9sZGVyOiBgU2VsZWN0ICR7dmFyaWFibGUubGFiZWx9YCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqIFVwZGF0ZSB0ZXN0IGRhdGEgcHJvZmlsZSBzZWxlY3QgY29uZmlnIHdpdGggY3VycmVudCBvcHRpb25zIGFuZCBzZWxlY3RlZFZhbHVlIChmb3JMb29wVGVzdERhdGFJZCkuIEVuc3VyZSBzZWxlY3RlZCBpZCBpcyBpbiBvcHRpb25zIHNvIG1hdC1zZWxlY3QgY2FuIGRpc3BsYXkgaXQuICovXG4gIHByaXZhdGUgdXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGxldCBvcHRpb25zID0gdGhpcy5jb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zKTtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgZm9yTG9vcFRlc3REYXRhSWQgPSBjZmc/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy50ZXN0RGF0YUlkO1xuICAgIGNvbnN0IHNlbGVjdGVkVmFsID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldFRlc3REYXRhUHJvZmlsZUZvcm1WYWx1ZSgpIDogdW5kZWZpbmVkO1xuICAgIC8vIEtlZXAgdGhlIHNlbGVjdGVkIHByb2ZpbGUgdmlzaWJsZSBieSBsYWJlbCBldmVuIHdoZW4gc2VydmVyLXNlYXJjaCByZXBsYWNlcyB0aGUgb3B0aW9uIGxpc3QuXG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlSWQgPSBzZWxlY3RlZFZhbCA/PyBmb3JMb29wVGVzdERhdGFJZDtcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgJiYgc2VsZWN0ZWRQcm9maWxlSWQgIT0gbnVsbCAmJiBzZWxlY3RlZFByb2ZpbGVJZCAhPT0gJycpIHtcbiAgICAgIGNvbnN0IGlkU3RyID0gU3RyaW5nKHNlbGVjdGVkUHJvZmlsZUlkKTtcbiAgICAgIGNvbnN0IGFscmVhZHlJbkxpc3QgPSBvcHRpb25zLnNvbWUoKG86IFNlbGVjdE9wdGlvbikgPT4gU3RyaW5nKG8uaWQgPz8gby52YWx1ZSkgPT09IGlkU3RyKTtcbiAgICAgIGlmICghYWxyZWFkeUluTGlzdCkge1xuICAgICAgICBjb25zdCBkaXNwbGF5TmFtZSA9IHRoaXMucmVzb2x2ZVRlc3REYXRhUHJvZmlsZU5hbWUoc2VsZWN0ZWRQcm9maWxlSWQpIHx8IHRoaXMucmVzb2x2ZVRlc3REYXRhUHJvZmlsZU5hbWUodGhpcy50ZXN0RGF0YVByb2ZpbGUpIHx8ICdTZWxlY3RlZCBwcm9maWxlJztcbiAgICAgICAgb3B0aW9ucyA9IFt7IGlkOiBzZWxlY3RlZFByb2ZpbGVJZCwgdmFsdWU6IHNlbGVjdGVkUHJvZmlsZUlkLCBuYW1lOiBkaXNwbGF5TmFtZSwgbGFiZWw6IGRpc3BsYXlOYW1lIH0sIC4uLm9wdGlvbnNdO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3Rlc3REYXRhUHJvZmlsZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1Rlc3RkYXRhcHJvZmlsZScsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgaW5pdGlhbEZldGNoT25PcGVuOiB0cnVlLFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlRGF0YVByb2ZpbGVzLFxuICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ0RhdGFQcm9maWxlcyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICAuLi4oc2VsZWN0ZWRWYWwgIT09IHVuZGVmaW5lZCAmJiBzZWxlY3RlZFZhbCAhPT0gJycgJiYgeyBzZWxlY3RlZFZhbHVlOiBzZWxlY3RlZFZhbCB9KSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uRGF0YVByb2ZpbGVDaGFuZ2UodmFsdWUpO1xuICAgICAgfSxcbiAgICAgIG9uU2VhcmNoOiAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm9uU2VhcmNoRGF0YVByb2ZpbGVzKHF1ZXJ5KTtcbiAgICAgIH0sXG4gICAgICBvbkxvYWRNb3JlOiAocXVlcnk/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5vbkxvYWRNb3JlRGF0YVByb2ZpbGVzKHF1ZXJ5IHx8ICcnKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgTG9vcCBTdGFydCAvIExvb3AgRW5kIHNlbGVjdCBjb25maWdzIHdpdGggc2VsZWN0ZWRWYWx1ZSAoZm9yTG9vcFN0YXJ0SW5kZXgsIGZvckxvb3BFbmRJbmRleCkgc28gZHJvcGRvd25zIHNob3cgc2VsZWN0ZWQgKi9cbiAgcHJpdmF0ZSB1cGRhdGVTdGFydEVuZFN0ZXBTZWxlY3RDb25maWdzU2VsZWN0ZWRWYWx1ZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgIT09ICdmb3InKSByZXR1cm47XG4gICAgY29uc3Qgc3RhcnRWYWwgPSB0aGlzLmdldExvb3BTdGFydEZvcm1WYWx1ZSgpO1xuICAgIGNvbnN0IGVuZFZhbCA9IHRoaXMuZ2V0TG9vcEVuZEZvcm1WYWx1ZSgpO1xuICAgIHRoaXMuc3RhcnRTdGVwU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5zdGFydFN0ZXBTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zOiB0aGlzLmdldExvb3BTdGFydFNlbGVjdE9wdGlvbnMoKSxcbiAgICAgIC4uLihzdGFydFZhbCAhPSBudWxsICYmIHsgc2VsZWN0ZWRWYWx1ZTogc3RhcnRWYWwgfSksXG4gICAgfTtcbiAgICB0aGlzLmVuZFN0ZXBTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmVuZFN0ZXBTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zOiB0aGlzLmdldExvb3BFbmRTZWxlY3RPcHRpb25zKCksXG4gICAgICAuLi4oZW5kVmFsICE9IG51bGwgJiYgeyBzZWxlY3RlZFZhbHVlOiBlbmRWYWwgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgYWxsIEZPUiBsb29wIHNlbGVjdCBjb25maWdzICh0ZXN0RGF0YVByb2ZpbGUsIHN0YXJ0U3RlcCwgZW5kU3RlcCkgd2l0aCBzZWxlY3RlZFZhbHVlIGZyb20gc3RlcCBzbyBkcm9wZG93bnMgc2hvdyBzZWxlY3RlZCAqL1xuICBwcml2YXRlIHVwZGF0ZUZvckxvb3BTZWxlY3RDb25maWdzU2VsZWN0ZWRWYWx1ZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgIT09ICdmb3InKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGVUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLnVwZGF0ZVN0YXJ0RW5kU3RlcFNlbGVjdENvbmZpZ3NTZWxlY3RlZFZhbHVlcygpO1xuICB9XG5cbiAgLyoqIENvbnZlcnQgRGF0YVByb2ZpbGVPcHRpb25bXSB0byBTZWxlY3RPcHRpb25bXSAqL1xuICBwcml2YXRlIGNvbnZlcnREYXRhUHJvZmlsZU9wdGlvbnNUb1NlbGVjdE9wdGlvbnMob3B0aW9uczogRGF0YVByb2ZpbGVPcHRpb25bXSk6IFNlbGVjdE9wdGlvbltdIHtcbiAgICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgICBpZDogb3B0aW9uLmlkLFxuICAgICAgdmFsdWU6IG9wdGlvbi5pZCxcbiAgICAgIG5hbWU6IG9wdGlvbi5uYW1lLFxuICAgICAgbGFiZWw6IG9wdGlvbi5uYW1lXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqIEJlc3Qta25vd24gcGVyc2lzdGVkIGxhYmVsIGZvciB0aGUgc2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGUsIGV2ZW4gd2hlbiBjdXJyZW50IHNlYXJjaCByZXN1bHRzIGV4Y2x1ZGUgaXQuICovXG4gIHByaXZhdGUgZ2V0U3RvcmVkVGVzdERhdGFQcm9maWxlTGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gW1xuICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUsXG4gICAgICB0aGlzLmNvbmZpZz8udGVzdERhdGFQcm9maWxlLFxuICAgICAgKHRoaXMuY29uZmlnIGFzIGFueSk/LnRlc3REYXRhPy5uYW1lLFxuICAgICAgdGhpcy5jb25maWc/LmFjdGlvbixcbiAgICBdO1xuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY2FuZGlkYXRlICE9IG51bGwgPyBTdHJpbmcoY2FuZGlkYXRlKS50cmltKCkgOiAnJztcbiAgICAgIGlmICghdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgaWYgKHZhbHVlID09PSAnVGVzdCBEYXRhIHByb2ZpbGUnKSBjb250aW51ZTtcbiAgICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkgY29udGludWU7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGEgZGF0YSBwcm9maWxlIGlkL3ZhbHVlIGJhY2sgdG8gdGhlIGRpc3BsYXkgbmFtZSB1c2VkIGJ5IHRoZSBkcm9wZG93biB0cmlnZ2VyLiAqL1xuICBwcml2YXRlIHJlc29sdmVUZXN0RGF0YVByb2ZpbGVOYW1lKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycpIHJldHVybiAnJztcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICBvcHRpb24gPT4gb3B0aW9uLmlkID09PSB2YWx1ZSB8fCBTdHJpbmcob3B0aW9uLmlkKSA9PT0gU3RyaW5nKHZhbHVlKSB8fCBvcHRpb24ubmFtZSA9PT0gdmFsdWVcbiAgICApO1xuICAgIGlmIChtYXRjaD8ubmFtZSkgcmV0dXJuIG1hdGNoLm5hbWU7XG4gICAgY29uc3Qgc3RvcmVkTGFiZWwgPSB0aGlzLmdldFN0b3JlZFRlc3REYXRhUHJvZmlsZUxhYmVsKCk7XG4gICAgaWYgKHN0b3JlZExhYmVsKSByZXR1cm4gc3RvcmVkTGFiZWw7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICAvKiogRGF0YSBsZW5ndGggKE4pIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGU7IDAgaWYgbm9uZSBzZWxlY3RlZCBvciBub3QgZm91bmQuICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRQcm9maWxlRGF0YUxlbmd0aCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHByb2ZpbGVJZCA9IHRoaXMuZWRpdEZvcm0/LmdldCgndGVzdERhdGFQcm9maWxlJyk/LnZhbHVlID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5mb3JMb29wVGVzdERhdGFJZCA/PyAodGhpcy5jb25maWcgYXMgYW55KT8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnRlc3REYXRhSWQ7XG4gICAgaWYgKHByb2ZpbGVJZCA9PSBudWxsIHx8ICF0aGlzLmRhdGFQcm9maWxlT3B0aW9ucz8ubGVuZ3RoKSByZXR1cm4gMDtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAobzogRGF0YVByb2ZpbGVPcHRpb24pID0+IFN0cmluZyhvLmlkKSA9PT0gU3RyaW5nKHByb2ZpbGVJZCkgfHwgby5pZCA9PT0gcHJvZmlsZUlkXG4gICAgKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDtcbiAgICBjb25zdCBsZW4gPSAobWF0Y2guZGF0YSAmJiBBcnJheS5pc0FycmF5KG1hdGNoLmRhdGEpID8gbWF0Y2guZGF0YS5sZW5ndGggOiAwKSB8fCAobWF0Y2guZGF0YUxlbmd0aCA/PyAwKTtcbiAgICByZXR1cm4gdHlwZW9mIGxlbiA9PT0gJ251bWJlcicgPyBsZW4gOiAwO1xuICB9XG5cbiAgLyoqIExvb3AgU3RhcnQvRW5kIG9wdGlvbnM6IDEgdG8gTiBiYXNlZCBvbiBzZWxlY3RlZCBkYXRhIHByb2ZpbGUncyBkYXRhIGFycmF5IGxlbmd0aDsgZmFsbHMgYmFjayB0byAxLi4xMCBpZiBubyBwcm9maWxlLiAqL1xuICBnZXRMb29wU3RlcE9wdGlvbnMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IE4gPSB0aGlzLmdldFNlbGVjdGVkUHJvZmlsZURhdGFMZW5ndGgoKTtcbiAgICBjb25zdCBtYXggPSBOID4gMCA/IE4gOiBUZXN0Q2FzZUxvb3BTdGVwQ29tcG9uZW50LkRFRkFVTFRfTE9PUF9PUFRJT05TX01BWDtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogbWF4IH0sIChfLCBpKSA9PiBpICsgMSk7XG4gIH1cblxuICAvKiogU2VudGluZWwgdmFsdWUgZm9yIFwiU3RhcnRcIiAvIFwiRW5kXCIgb3B0aW9ucyAoc2FtZSBhcyBvbGQgVUkpLiAqL1xuICBzdGF0aWMgcmVhZG9ubHkgTE9PUF9JTkRFWF9TVEFSVCA9IC0xO1xuICBzdGF0aWMgcmVhZG9ubHkgTE9PUF9JTkRFWF9FTkQgPSAtMTtcblxuICAvKiogTG9vcCBTdGFydC9FbmQgc2VsZWN0IG9wdGlvbnM6IHNhbWUgaW5kaWNlcyBhcyBnZXRMb29wU3RlcE9wdGlvbnMoKSwgd2l0aCBsYWJlbCBcIm5hbWUgKGluZGV4KVwiIHdoZW4gcHJvZmlsZSBkYXRhIGhhcyByb3cgbmFtZXMsIGVsc2UgXCJTdGVwIChpbmRleClcIi4gKi9cbiAgcHJpdmF0ZSBnZXRMb29wU3RlcFNlbGVjdE9wdGlvbnMoKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIGNvbnN0IGluZGljZXMgPSB0aGlzLmdldExvb3BTdGVwT3B0aW9ucygpO1xuICAgIHJldHVybiBpbmRpY2VzLm1hcCgobikgPT4ge1xuICAgICAgY29uc3Qgcm93TmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KG4pO1xuICAgICAgY29uc3QgbGFiZWwgPSByb3dOYW1lID8gYCR7cm93TmFtZX0gKCR7bn0pYCA6IGBTdGVwICgke259KWA7XG4gICAgICByZXR1cm4geyBpZDogbiwgdmFsdWU6IG4sIG5hbWU6IGxhYmVsLCBsYWJlbCB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIExvb3AgU3RhcnQgZHJvcGRvd24gb3B0aW9uczogXCJTdGFydFwiICh2YWx1ZSAtMSkgZmlyc3QsIHRoZW4gZGF0YSByb3dzLiBTYW1lIHZhbHVlcyBhcyBvbGQgVUkuICovXG4gIHByaXZhdGUgZ2V0TG9vcFN0YXJ0U2VsZWN0T3B0aW9ucygpOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgY29uc3Qgc3RhcnRPcHRpb246IFNlbGVjdE9wdGlvbiA9IHtcbiAgICAgIGlkOiBUZXN0Q2FzZUxvb3BTdGVwQ29tcG9uZW50LkxPT1BfSU5ERVhfU1RBUlQsXG4gICAgICB2YWx1ZTogVGVzdENhc2VMb29wU3RlcENvbXBvbmVudC5MT09QX0lOREVYX1NUQVJULFxuICAgICAgbmFtZTogJ1N0YXJ0JyxcbiAgICAgIGxhYmVsOiAnU3RhcnQnLFxuICAgIH07XG4gICAgcmV0dXJuIFtzdGFydE9wdGlvbiwgLi4udGhpcy5nZXRMb29wU3RlcFNlbGVjdE9wdGlvbnMoKV07XG4gIH1cblxuICAvKiogTG9vcCBFbmQgZHJvcGRvd24gb3B0aW9uczogZGF0YSByb3dzIGZpcnN0LCB0aGVuIFwiRW5kXCIgKHZhbHVlIC0xKSBsYXN0LiBTYW1lIHZhbHVlcyBhcyBvbGQgVUkuICovXG4gIHByaXZhdGUgZ2V0TG9vcEVuZFNlbGVjdE9wdGlvbnMoKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIGNvbnN0IGVuZE9wdGlvbjogU2VsZWN0T3B0aW9uID0ge1xuICAgICAgaWQ6IFRlc3RDYXNlTG9vcFN0ZXBDb21wb25lbnQuTE9PUF9JTkRFWF9FTkQsXG4gICAgICB2YWx1ZTogVGVzdENhc2VMb29wU3RlcENvbXBvbmVudC5MT09QX0lOREVYX0VORCxcbiAgICAgIG5hbWU6ICdFbmQnLFxuICAgICAgbGFiZWw6ICdFbmQnLFxuICAgIH07XG4gICAgcmV0dXJuIFsuLi50aGlzLmdldExvb3BTdGVwU2VsZWN0T3B0aW9ucygpLCBlbmRPcHRpb25dO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBkYXRhIHByb2ZpbGUgc2VsZWN0aW9uOiB1cGRhdGUgZGlzcGxheSBhbmQgcmVzZXQgc3RhcnQvZW5kIGxpa2UgdGhlIG9sZCBVSS4gKi9cbiAgcHJpdmF0ZSBvbkRhdGFQcm9maWxlQ2hhbmdlKHByb2ZpbGVJZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRlc3REYXRhUHJvZmlsZUNoYW5nZShwcm9maWxlSWQpO1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXJ0VmFsID0gVGVzdENhc2VMb29wU3RlcENvbXBvbmVudC5MT09QX0lOREVYX1NUQVJUO1xuICAgIGNvbnN0IGVuZFZhbCA9IFRlc3RDYXNlTG9vcFN0ZXBDb21wb25lbnQuTE9PUF9JTkRFWF9FTkQ7XG4gICAgaWYgKHRoaXMuZWRpdEZvcm0pIHtcbiAgICAgIHRoaXMuZWRpdEZvcm0uZ2V0KCdzdGFydFN0ZXAnKT8uc2V0VmFsdWUoc3RhcnRWYWwpO1xuICAgICAgdGhpcy5lZGl0Rm9ybS5nZXQoJ2VuZFN0ZXAnKT8uc2V0VmFsdWUoZW5kVmFsKTtcbiAgICB9XG4gICAgdGhpcy5zdGFydFN0ZXAgPSBzdGFydFZhbDtcbiAgICB0aGlzLmVuZFN0ZXAgPSBlbmRWYWw7XG4gICAgdGhpcy51cGRhdGVTdGFydEVuZFN0ZXBTZWxlY3RDb25maWdzU2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogSGFuZGxlIHNlYXJjaCBmb3IgZGF0YSBwcm9maWxlcyAqL1xuICBwcml2YXRlIG9uU2VhcmNoRGF0YVByb2ZpbGVzKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaERhdGFQcm9maWxlcy5lbWl0KHF1ZXJ5KTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgbG9hZCBtb3JlIGRhdGEgcHJvZmlsZXMgKi9cbiAgcHJpdmF0ZSBvbkxvYWRNb3JlRGF0YVByb2ZpbGVzKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQocXVlcnkpO1xuICB9XG5cbiAgb25FZGl0Rm9ybUZpZWxkQ2hhbmdlKGNvbnRyb2xOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtLmdldChjb250cm9sTmFtZSk/LnNldFZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIGdldExvb3BUeXBlTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyAnRk9SIExPT1AnIDogJ1dISUxFIExPT1AnO1xuICB9XG5cbiAgaXNXaGlsZUxvb3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZSc7XG4gIH1cblxuICBpc0Zvckxvb3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9vcFR5cGUgPT09ICdmb3InO1xuICB9XG5cbiAgZ2V0U3RhcnRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdTVEFSVCBGT1InIDogJ1NUQVJUIFdISUxFJztcbiAgfVxuXG4gIGdldEVuZExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gJ0VORCBGT1InIDogJ0VORCBXSElMRSc7XG4gIH1cblxuICAvKiogUmVzb2x2ZSBkaXNwbGF5IHN0YXJ0IGluZGV4OiBwcmVmZXIgZm9yTG9vcFN0YXJ0SW5kZXggZnJvbSBzdGVwIChvciBkYXRhTWFwSnNvbi9kYXRhTWFwQmVhbiksIGVsc2Ugc3RhcnRTdGVwLCBlbHNlIGZyb20gbmVzdGVkIHN0ZXBzICovXG4gIHByaXZhdGUgZ2V0RGlzcGxheVN0YXJ0SW5kZXgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgdiA9IGNmZz8uZm9yTG9vcFN0YXJ0SW5kZXggPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFN0YXJ0SW5kZXggPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnN0YXJ0SW5kZXg7XG4gICAgaWYgKHYgIT0gbnVsbCkgcmV0dXJuIE51bWJlcih2KTtcbiAgICBpZiAodGhpcy5zdGFydFN0ZXAgIT0gbnVsbCkgcmV0dXJuIHRoaXMuc3RhcnRTdGVwO1xuICAgIHJldHVybiB0aGlzLm5lc3RlZFN0ZXBzWzBdPy5zdGVwTnVtYmVyIGFzIG51bWJlciB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGRpc3BsYXkgZW5kIGluZGV4OiBwcmVmZXIgZm9yTG9vcEVuZEluZGV4IGZyb20gc3RlcCAob3IgZGF0YU1hcEpzb24vZGF0YU1hcEJlYW4pLCBlbHNlIGVuZFN0ZXAsIGVsc2UgZnJvbSBuZXN0ZWQgc3RlcHMgKi9cbiAgcHJpdmF0ZSBnZXREaXNwbGF5RW5kSW5kZXgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgdiA9IGNmZz8uZm9yTG9vcEVuZEluZGV4ID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BFbmRJbmRleCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uZW5kSW5kZXg7XG4gICAgaWYgKHYgIT0gbnVsbCkgcmV0dXJuIE51bWJlcih2KTtcbiAgICBpZiAodGhpcy5lbmRTdGVwICE9IG51bGwpIHJldHVybiB0aGlzLmVuZFN0ZXA7XG4gICAgY29uc3QgbGFzdCA9IHRoaXMubmVzdGVkU3RlcHNbdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gbGFzdD8uc3RlcE51bWJlciBhcyBudW1iZXIgfCB1bmRlZmluZWQgPz8gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gIH1cblxuICAvKiogUmVzb2x2ZSBkaXNwbGF5IHByb2ZpbGUgbmFtZTogbWFwIGZvckxvb3BUZXN0RGF0YUlkIHRvIHByb2ZpbGUgbmFtZSBmcm9tIGRhdGFQcm9maWxlT3B0aW9ucywgZWxzZSB1c2UgdGVzdERhdGFQcm9maWxlICovXG4gIHByaXZhdGUgZ2V0RGlzcGxheVRlc3REYXRhUHJvZmlsZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgaWQgPSBjZmc/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy50ZXN0RGF0YUlkO1xuICAgIGlmIChpZCAhPSBudWxsICYmIHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgICAgbyA9PiBvLmlkID09PSBpZCB8fCBTdHJpbmcoby5pZCkgPT09IFN0cmluZyhpZClcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaC5uYW1lO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZXN0RGF0YVByb2ZpbGUgPz8gJyc7XG4gIH1cblxuICAvKiogR2V0IHRoZSBzZWxlY3RlZCBkYXRhIHByb2ZpbGUgKGJ5IGZvckxvb3BUZXN0RGF0YUlkIG9yIGZvcm0gdmFsdWUpLCBvciBudWxsLiAqL1xuICBwcml2YXRlIGdldFNlbGVjdGVkRGF0YVByb2ZpbGUoKTogRGF0YVByb2ZpbGVPcHRpb24gfCBudWxsIHtcbiAgICBjb25zdCBwcm9maWxlSWQgPSB0aGlzLmVkaXRGb3JtPy5nZXQoJ3Rlc3REYXRhUHJvZmlsZScpPy52YWx1ZSA/PyAodGhpcy5jb25maWcgYXMgYW55KT8uZm9yTG9vcFRlc3REYXRhSWQgPz8gKHRoaXMuY29uZmlnIGFzIGFueSk/LmRhdGFNYXBKc29uPy5mb3JMb29wVGVzdERhdGFJZCA/PyAodGhpcy5jb25maWcgYXMgYW55KT8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy50ZXN0RGF0YUlkO1xuICAgIGlmIChwcm9maWxlSWQgPT0gbnVsbCB8fCAhdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnM/Lmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5maW5kKFxuICAgICAgKG86IERhdGFQcm9maWxlT3B0aW9uKSA9PiBTdHJpbmcoby5pZCkgPT09IFN0cmluZyhwcm9maWxlSWQpIHx8IG8uaWQgPT09IHByb2ZpbGVJZFxuICAgICk7XG4gICAgcmV0dXJuIG1hdGNoID8/IG51bGw7XG4gIH1cblxuICAvKiogR2V0IGRpc3BsYXkgbmFtZSBmb3IgYSAxLWJhc2VkIHJvdyBpbmRleCBmcm9tIHRoZSBzZWxlY3RlZCBwcm9maWxlJ3MgZGF0YSBhcnJheSAoZGF0YVtpbmRleC0xXS5uYW1lKS4gUmV0dXJucyBudWxsIGlmIG5vIG5hbWUuICovXG4gIHByaXZhdGUgZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KG9uZUJhc2VkSW5kZXg6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLmdldFNlbGVjdGVkRGF0YVByb2ZpbGUoKTtcbiAgICBpZiAoIXByb2ZpbGU/LmRhdGEgfHwgIUFycmF5LmlzQXJyYXkocHJvZmlsZS5kYXRhKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaWR4ID0gb25lQmFzZWRJbmRleCAtIDE7XG4gICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHByb2ZpbGUuZGF0YS5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJvdyA9IHByb2ZpbGUuZGF0YVtpZHhdO1xuICAgIHJldHVybiByb3cgJiYgKHJvdy5uYW1lICE9IG51bGwgPyBTdHJpbmcocm93Lm5hbWUpIDogbnVsbCk7XG4gIH1cblxuICAvKiogV2hldGhlciB0ZXN0IGRhdGEgcHJvZmlsZSBpcyBzZXQgKHNvIHdlIGNhbiBzaG93L2hpZGUgdGhlIGNoaXApICovXG4gIGhhc1Rlc3REYXRhUHJvZmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXREaXNwbGF5VGVzdERhdGFQcm9maWxlTmFtZSgpLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogV2hldGhlciBzdGFydCB2YWx1ZSBpcyBleHBsaWNpdGx5IHNldCAoY29uZmlnIG9yIHN0YXJ0U3RlcCBpbnB1dCksIG5vdCBpbmZlcnJlZCBmcm9tIG5lc3RlZCBzdGVwcyAqL1xuICBoYXNTdGFydFZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB2ID0gY2ZnPy5mb3JMb29wU3RhcnRJbmRleCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wU3RhcnRJbmRleCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uc3RhcnRJbmRleDtcbiAgICBpZiAodiAhPSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5zdGFydFN0ZXAgIT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgZW5kIHZhbHVlIGlzIGV4cGxpY2l0bHkgc2V0IChjb25maWcgb3IgZW5kU3RlcCBpbnB1dCksIG5vdCBpbmZlcnJlZCBmcm9tIG5lc3RlZCBzdGVwcyAqL1xuICBoYXNFbmRWYWx1ZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgdiA9IGNmZz8uZm9yTG9vcEVuZEluZGV4ID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BFbmRJbmRleCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uZW5kSW5kZXg7XG4gICAgaWYgKHYgIT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuZW5kU3RlcCAhPSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRTdGVwc1N1bW1hcnkoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnMCBzdGVwcyc7XG4gICAgfVxuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgY29uc3QgZmlyc3RTdGVwTnVtID0gKHRoaXMubmVzdGVkU3RlcHNbMF0gYXMgYW55KT8uc3RlcE51bWJlciA/PyAxO1xuICAgIGNvbnN0IGxhc3RTdGVwTnVtID0gKHRoaXMubmVzdGVkU3RlcHNbY291bnQgLSAxXSBhcyBhbnkpPy5zdGVwTnVtYmVyID8/IGNvdW50O1xuICAgIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGBTdGVwcyAke2ZpcnN0U3RlcE51bX0gKDEgc3RlcClgO1xuICAgIH1cbiAgICByZXR1cm4gYFN0ZXBzICR7Zmlyc3RTdGVwTnVtfS0ke2xhc3RTdGVwTnVtfSAoJHtjb3VudH0gc3RlcHMpYDtcbiAgfVxuXG4gIGdldFN0YXJ0U3RlcExhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmdldERpc3BsYXlTdGFydEluZGV4KCk7XG4gICAgaWYgKHN0YXJ0ID09IG51bGwpIHJldHVybiBgU3RhcnQ6ICR7dGhpcy5uZXN0ZWRTdGVwc1swXT8uc3RlcE51bWJlciA/PyAxfWA7XG4gICAgLy8gSWYgc3RhcnQgaXMgLTEsIHVzZXIgc2VsZWN0ZWQgXCJTdGFydFwiIG9wdGlvbiwganVzdCByZXR1cm4gXCJTdGFydFwiXG4gICAgaWYgKHN0YXJ0ID09PSAtMSkgcmV0dXJuICdTdGFydCc7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KHN0YXJ0KTtcbiAgICByZXR1cm4gbmFtZSAhPSBudWxsID8gYFN0YXJ0OiAke25hbWV9YCA6IGBTdGFydDogJHtzdGFydH1gO1xuICB9XG5cbiAgZ2V0RW5kU3RlcExhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZW5kID0gdGhpcy5nZXREaXNwbGF5RW5kSW5kZXgoKTtcbiAgICBpZiAoZW5kID09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRFbmQgPSB0aGlzLm5lc3RlZFN0ZXBzW3RoaXMubmVzdGVkU3RlcHMubGVuZ3RoIC0gMV0/LnN0ZXBOdW1iZXIgPz8gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYEVuZDogJHtkZWZhdWx0RW5kfWA7XG4gICAgfVxuICAgIC8vIElmIGVuZCBpcyAtMSwgdXNlciBzZWxlY3RlZCBcIkVuZFwiIG9wdGlvbiwganVzdCByZXR1cm4gXCJFbmRcIlxuICAgIGlmIChlbmQgPT09IC0xKSByZXR1cm4gJ0VuZCc7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KGVuZCk7XG4gICAgcmV0dXJuIG5hbWUgIT0gbnVsbCA/IGBFbmQ6ICR7bmFtZX1gIDogYEVuZDogJHtlbmR9YDtcbiAgfVxuXG4gIGdldFRlc3REYXRhUHJvZmlsZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGlzcGxheVRlc3REYXRhUHJvZmlsZU5hbWUoKTtcbiAgICBpZiAobmFtZSkgcmV0dXJuIGBUZXN0IERhdGEgcHJvZmlsZTogJHtuYW1lfWA7XG4gICAgcmV0dXJuICdUZXN0IERhdGEgcHJvZmlsZSc7XG4gIH1cblxuICAvKiogVGVzdCBEYXRhIHByb2ZpbGUgcGFydCBvbmx5IC0gZm9yIHZlcnRpY2FsIHN0YWNrIGxheW91dCAocm93IDEpICovXG4gIGdldEZvckxvb3BQcm9maWxlRGlzcGxheSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBpZiAoY2ZnPy5mb3JMb29wRGlzcGxheUh0bWwpIHtcbiAgICAgIGNvbnN0IG0gPSBjZmcuZm9yTG9vcERpc3BsYXlIdG1sLm1hdGNoKC9UZXN0IERhdGEgcHJvZmlsZTpcXHMqKDxbXj5dKz5bXjxdKjxcXC9bXj5dKz4pLyk7XG4gICAgICBpZiAobSkgcmV0dXJuIGBUZXN0IERhdGEgcHJvZmlsZTogJHttWzFdfWA7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNUZXN0RGF0YVByb2ZpbGUoKSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldERpc3BsYXlUZXN0RGF0YVByb2ZpbGVOYW1lKCk7XG4gICAgcmV0dXJuIGBUZXN0IERhdGEgcHJvZmlsZTogPHNwYW4gZGF0YS1rZXk9XCJ0ZXN0LWRhdGFcIiBkYXRhLWV2ZW50LWtleT1cInRlc3REYXRhUHJvZmlsZVwiIGNsYXNzPVwidGVzdF9kYXRhXCI+JHt0aGlzLmVzY2FwZUZvckxvb3BIdG1sKG5hbWUpfTwvc3Bhbj5gO1xuICB9XG5cbiAgLyoqIFN0YXJ0IGFuZCBFbmQgcGFydHMgb25seSAtIGZvciB2ZXJ0aWNhbCBzdGFjayBsYXlvdXQgKHJvdyAyLCBzdGF5cyB0b2dldGhlcikgKi9cbiAgZ2V0Rm9yTG9vcFJhbmdlRGlzcGxheSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5oYXNTdGFydFZhbHVlKCkpIHtcbiAgICAgIGNvbnN0IGZ1bGwgPSB0aGlzLmdldFN0YXJ0U3RlcExhYmVsKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZ1bGwucmVwbGFjZSgvXlN0YXJ0OlxccyovLCAnJyk7XG4gICAgICBwYXJ0cy5wdXNoKGA8c3BhbiBjbGFzcz1cImZvci1sb29wLXJhbmdlLXBhcnRcIj5TdGFydDogPHNwYW4gZGF0YS1rZXk9XCJ0ZXN0LWRhdGFcIiBkYXRhLWV2ZW50LWtleT1cImZvckxvb3BTdGFydEluZGV4XCIgY2xhc3M9XCJ0ZXN0X2RhdGFcIj4ke3RoaXMuZXNjYXBlRm9yTG9vcEh0bWwodmFsdWUpfTwvc3Bhbj48L3NwYW4+YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0VuZFZhbHVlKCkpIHtcbiAgICAgIGNvbnN0IGZ1bGwgPSB0aGlzLmdldEVuZFN0ZXBMYWJlbCgpO1xuICAgICAgY29uc3QgdmFsdWUgPSBmdWxsLnJlcGxhY2UoL15FbmQ6XFxzKi8sICcnKTtcbiAgICAgIHBhcnRzLnB1c2goYDxzcGFuIGNsYXNzPVwiZm9yLWxvb3AtcmFuZ2UtcGFydFwiPkVuZDogPHNwYW4gZGF0YS1rZXk9XCJ0ZXN0LWRhdGFcIiBkYXRhLWV2ZW50LWtleT1cImZvckxvb3BFbmRJbmRleFwiIGNsYXNzPVwidGVzdF9kYXRhXCI+JHt0aGlzLmVzY2FwZUZvckxvb3BIdG1sKHZhbHVlKX08L3NwYW4+PC9zcGFuPmApO1xuICAgIH1cbiAgICBpZiAoY2ZnPy5mb3JMb29wRGlzcGxheUh0bWwgJiYgcGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBzdGFydE1hdGNoID0gY2ZnLmZvckxvb3BEaXNwbGF5SHRtbC5tYXRjaCgvU3RhcnQ6XFxzKjxbXj5dKj4oW148XSopPC8pO1xuICAgICAgY29uc3QgZW5kTWF0Y2ggPSBjZmcuZm9yTG9vcERpc3BsYXlIdG1sLm1hdGNoKC9FbmQ6XFxzKjxbXj5dKj4oW148XSopPC8pO1xuICAgICAgaWYgKHN0YXJ0TWF0Y2gpIHBhcnRzLnB1c2goYDxzcGFuIGNsYXNzPVwiZm9yLWxvb3AtcmFuZ2UtcGFydFwiPlN0YXJ0OiA8c3BhbiBjbGFzcz1cInRlc3RfZGF0YVwiPiR7c3RhcnRNYXRjaFsxXX08L3NwYW4+PC9zcGFuPmApO1xuICAgICAgaWYgKGVuZE1hdGNoKSBwYXJ0cy5wdXNoKGA8c3BhbiBjbGFzcz1cImZvci1sb29wLXJhbmdlLXBhcnRcIj5FbmQ6IDxzcGFuIGNsYXNzPVwidGVzdF9kYXRhXCI+JHtlbmRNYXRjaFsxXX08L3NwYW4+PC9zcGFuPmApO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbignJyk7XG4gIH1cblxuICBwcml2YXRlIGVzY2FwZUZvckxvb3BIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnRleHRDb250ZW50ID0gdGV4dDtcbiAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgfVxuXG4gIC8qKiBGdWxsIGRpc3BsYXkgZm9yIHdoaWxlIGxvb3A6IHN1YnN0aXR1dGVzICN7dmFyaWFibGV9IHdpdGggSFRNTCBiYWRnZXMgKGVsZW1lbnQvdGVzdF9kYXRhKSBzbyBjbGlja3Mgb3BlbiBwb3B1cCAtIG1heCBpdGVyYXRpb25zIHNob3duIGFzIHNlcGFyYXRlIGJhZGdlICovXG4gIGdldENvbmRpdGlvbkRpc3BsYXkoKTogc3RyaW5nIHtcbiAgICBsZXQgYmFzZSA9IHRoaXMuY29uZGl0aW9uIHx8ICdlbGVtZW50IFwiLm5vdGlmaWNhdGlvbi1iYWRnZVwiIGV4aXN0cyc7XG4gICAgY29uc3Qgd2l0aFdoaWxlID0gYmFzZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ3doaWxlICcpID8gYmFzZSA6IGBXaGlsZSAke2Jhc2V9YDtcbiAgICAvLyBTdHJpcCAobWF4IE4gaXRlcmF0aW9ucykgZnJvbSB0ZXh0IC0gc2hvd24gYXMgYmFkZ2UgaW5zdGVhZFxuICAgIGNvbnN0IHJlc3VsdCA9IHdpdGhXaGlsZS5yZXBsYWNlKC9cXHMqXFwobWF4XFxzK1xcZCtcXHMraXRlcmF0aW9uc1xcKVxccyokL2ksICcnKS50cmltKCk7XG4gICAgcmV0dXJuIHRoaXMuc3Vic3RpdHV0ZVRlbXBsYXRlVmFyaWFibGVzVG9IdG1sKHJlc3VsdCk7XG4gIH1cblxuICAvKiogU3Vic3RpdHV0ZXMgI3t2YXJpYWJsZX0gcGxhY2Vob2xkZXJzIHdpdGggSFRNTCBiYWRnZSBzcGFucyB1c2luZyBjb25maWcuZXZlbnQgLSBlbmFibGVzIGNsaWNrLXRvLWVkaXQgcG9wdXAgbGlrZSBjb25kaXRpb24gc3RlcCAqL1xuICBwcml2YXRlIHN1YnN0aXR1dGVUZW1wbGF0ZVZhcmlhYmxlc1RvSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCB8fCB0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycpIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGV2ID0gKHRoaXMuY29uZmlnIGFzIGFueSk/LmV2ZW50ID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy50ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgPz8ge307XG4gICAgaWYgKHR5cGVvZiBldiAhPT0gJ29iamVjdCcgfHwgZXYgPT09IG51bGwpIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGVzY2FwZSA9ICh2OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZGl2LnRleHRDb250ZW50ID0gdjtcbiAgICAgIHJldHVybiBkaXYuaW5uZXJIVE1MO1xuICAgIH07XG4gICAgY29uc3QgZWxlbWVudFZhcnMgPSBbJ2xhYmVsJywgJ2Rlc2NyaXB0aW9uJywgJ2VsZW1lbnQnLCAnc2VsZWN0b3InLCAnYWlfdGFzaycsICdxdWVyeScsICdjdXN0b21fY29kZSddO1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhcnMgPSBbJ2F0dHJpYnV0ZSddO1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcI1xceyhbXn1dKylcXH0vZywgKF8sIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBldltrZXldO1xuICAgICAgY29uc3QgZGlzcGxheVZhbCA9IHZhbCAhPSBudWxsICYmIHZhbCAhPT0gJycgPyBTdHJpbmcodmFsKSA6IGtleTtcbiAgICAgIGNvbnN0IGVzY2FwZWQgPSBlc2NhcGUoZGlzcGxheVZhbCk7XG4gICAgICBpZiAoZWxlbWVudFZhcnMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gYDxzcGFuIGRhdGEta2V5PVwiJHtrZXl9XCIgZGF0YS1ldmVudC1rZXk9XCIke2tleX1cIiBjbGFzcz1cImVsZW1lbnRcIj4ke2VzY2FwZWR9PC9zcGFuPmA7XG4gICAgICB9XG4gICAgICBpZiAoYXR0cmlidXRlVmFycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBgPHNwYW4gZGF0YS1rZXk9XCIke2tleX1cIiBkYXRhLWV2ZW50LWtleT1cIiR7a2V5fVwiIGNsYXNzPVwiYXR0cmlidXRlXCI+JHtlc2NhcGVkfTwvc3Bhbj5gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGA8c3BhbiBkYXRhLWtleT1cIiR7a2V5fVwiIGRhdGEtZXZlbnQta2V5PVwiJHtrZXl9XCIgY2xhc3M9XCJ0ZXN0X2RhdGFcIj4ke2VzY2FwZWR9PC9zcGFuPmA7XG4gICAgfSk7XG4gIH1cblxuICAvKiogRXZlbnQga2V5LXZhbHVlIHBhaXJzIGZvciBkaXNwbGF5IChlLmcuIHNlbGVjdG9yLCBlbGVtZW50KSAtIHNhbWUgYXMgY29uZGl0aW9uIHN0ZXAgZ2V0QnJhbmNoRXZlbnREZXRhaWxzRm9yRGlzcGxheSAqL1xuICBnZXRMb29wRXZlbnREZXRhaWxzRm9yRGlzcGxheSgpOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgZXZlbnQgPSB0aGlzLmNvbmZpZz8uZXZlbnQ7XG4gICAgaWYgKCFldmVudCB8fCB0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGV2ZW50KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+IGtleSAhPT0gJ2N1c3RvbUV2ZW50JylcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogdmFsdWUgIT0gbnVsbCA/IFN0cmluZyh2YWx1ZSkgOiAnJ1xuICAgICAgfSkpO1xuICB9XG5cbiAgb25Ub2dnbGVFeHBhbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuZXhwYW5kZWQ7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZC5lbWl0KHtjb25maWc6dGhpcy5jb25maWcsIGV4cGFuZGVkOnRoaXMuZXhwYW5kZWR9KTtcbiAgfVxuXG4gIG9uVGVzdERhdGFQcm9maWxlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IHRoaXMucmVzb2x2ZVRlc3REYXRhUHJvZmlsZU5hbWUodmFsdWUpO1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gZGlzcGxheU5hbWU7XG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVDaGFuZ2UuZW1pdChkaXNwbGF5TmFtZSk7XG4gIH1cblxuICBvblN0YXJ0U3RlcENoYW5nZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydFN0ZXAgPSB2YWx1ZTtcbiAgICB0aGlzLnN0YXJ0U3RlcENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uRW5kU3RlcENoYW5nZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lbmRTdGVwID0gdmFsdWU7XG4gICAgdGhpcy5lbmRTdGVwQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25Db25kaXRpb25DaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29uZGl0aW9uID0gdmFsdWU7XG4gICAgdGhpcy5jb25kaXRpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbk1heEl0ZXJhdGlvbnNDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubWF4SXRlcmF0aW9ucyA9IHZhbHVlO1xuICAgIHRoaXMubWF4SXRlcmF0aW9uc0NoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uTmVzdGVkU3RlcENoYW5nZShzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5lc3RlZFN0ZXBDaGFuZ2UuZW1pdCh7IHN0ZXAsIGluZGV4IH0pO1xuICB9XG5cbiAgLyoqIFJlLWVtaXQgb3BlbkV4dGVybmFsIGZyb20gbmVzdGVkIHN0ZXAgZ3JvdXAgc28gcmVkaXJlY3Qgd29ya3MgZm9yIHN0ZXAgZ3JvdXBzIGluc2lkZSBsb29wcy4gKi9cbiAgb25OZXN0ZWRPcGVuRXh0ZXJuYWwocGF5bG9hZDogeyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcgfSk6IHZvaWQge1xuICAgIGlmIChwYXlsb2FkPy5zdGVwKSB7XG4gICAgICB0aGlzLm9wZW5FeHRlcm5hbC5lbWl0KHBheWxvYWQpO1xuICAgIH1cbiAgfVxuXG4gIG9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoZXZlbnQ6IGJvb2xlYW4gfCB7Y29uZmlnOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufSwgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gSGFuZGxlIGJvdGggYm9vbGVhbiBhbmQgb2JqZWN0IGZvcm1hdHNcbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0JyAmJiBldmVudCAhPT0gbnVsbCAmJiAnZXhwYW5kZWQnIGluIGV2ZW50KSB7XG4gICAgICAvLyBPYmplY3QgZm9ybWF0IGZyb20gc3RlcC1ncm91cDoge2NvbmZpZywgZXhwYW5kZWR9XG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQuZXhwYW5kZWQ7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgZXZlbnQncyBjb25maWcgaXMgYSBzdGVwLWdyb3VwIChub3QgdGhlIGN1cnJlbnQgc3RlcClcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBuZXN0ZWQgc3RlcC1ncm91cCBldmVudHMgYnViYmxlIHVwIGNvcnJlY3RseSBldmVuIHdoZW4gY29uZGl0aW9uIHN0ZXAgaXMgaW5zaWRlIGxvb3Agc3RlcFxuICAgICAgaWYgKHRoaXMuaXNTdGVwR3JvdXAoZXZlbnQuY29uZmlnKSkge1xuICAgICAgICAvLyBSZS1lbWl0IHRoZSB0b2dnbGVFeHBhbmRlZCBldmVudCB3aXRoIHRoZSBvYmplY3QgZm9ybWF0LCBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCBjb25maWdcbiAgICAgICAgLy8gQ2FzdCB0byBzYXRpc2Z5IFR5cGVTY3JpcHQgLSB0aGUgcmVuZGVyZXIgYWNjZXB0cyBUZXN0Q2FzZVN0ZXBDb25maWcgd2hpY2ggaW5jbHVkZXMgU3RlcEdyb3VwQ29uZmlnXG4gICAgICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQuZW1pdCh7Y29uZmlnOiBldmVudC5jb25maWcgYXMgYW55IGFzIExvb3BTdGVwQ29uZmlnLCBleHBhbmRlZDogZXZlbnQuZXhwYW5kZWR9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQm9vbGVhbiBmb3JtYXQgZnJvbSBvdGhlciBzdGVwIHR5cGVzXG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQgYXMgYm9vbGVhbjtcbiAgICB9XG4gICAgdGhpcy5vbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaW5kZXgpO1xuICB9XG5cbiAgb25BZGRTdGVwKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkU3RlcC5lbWl0KCk7XG4gIH1cblxuICAvKiogUmUtZW1pdCBhZGRTdGVwRm9yTG9vcCBmcm9tIG5lc3RlZCBsb29wIHNvIE4tbGV2ZWwgbmVzdGluZyB3b3JrcyAoZW1wdHktc3RhdGUgYWRkIHN0ZXApLiAqL1xuICBvbkFkZFN0ZXBGb3JMb29wRnJvbU5lc3RlZChldmVudDogeyBsb29wU3RlcENvbmZpZzogTG9vcFN0ZXBDb25maWcgfSk6IHZvaWQge1xuICAgIGlmIChldmVudD8ubG9vcFN0ZXBDb25maWcpIHtcbiAgICAgIHRoaXMuYWRkU3RlcC5lbWl0KHsgbG9vcFN0ZXBDb25maWc6IGV2ZW50Lmxvb3BTdGVwQ29uZmlnIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZFN0ZXAuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxsZWQgZnJvbSBlbXB0eS1zdGF0ZSBwbHVzIG9ubHk7IHNhbWUgYmVoYXZpb3VyIGFzIGFkZC1zdGVwLWJldHdlZW4gKHBhcmVudElkID0gbG9vcCBzdGVwIGlkLCBwb3NpdGlvbiA9IHBhcmVudCArIDEpLiAqL1xuICBvbkFkZFN0ZXBFbXB0eSgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZFN0ZXAuZW1pdCh7IGxvb3BTdGVwQ29uZmlnOiB0aGlzLmNvbmZpZyB9KTtcbiAgfVxuXG4gIG9uRGVsZXRlU3RlcChwYXlsb2FkT3JJbmRleDogYW55LCBpbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGlkeCA9IHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicgPyBpbmRleCA6IHBheWxvYWRPckluZGV4O1xuICAgIGNvbnN0IHBheWxvYWQgPSB0eXBlb2YgaW5kZXggPT09ICdudW1iZXInID8gcGF5bG9hZE9ySW5kZXggOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5kZWxldGVTdGVwLmVtaXQoaWR4KTtcbiAgICBpZiAocGF5bG9hZD8uc3RlcCkgdGhpcy5kZWxldGUuZW1pdChwYXlsb2FkKTtcbiAgfVxuXG4gIC8qKiBSZS1lbWl0IGVkaXQgZnJvbSBuZXN0ZWQgc3RlcCBzbyB0aGUgcG9ydGFsIGNhbiBvcGVuIGVkaXQgbW9kYWwgKHNhbWUgYXMgcm9vdCBsZXZlbCkuICovXG4gIG9uTmVzdGVkRWRpdChldmVudDogeyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGlmIChldmVudD8uc3RlcCAhPSBudWxsKSB0aGlzLmVkaXQuZW1pdChldmVudCBhcyBhbnkpO1xuICB9XG5cbiAgLyoqIFJlLWVtaXQgZHVwbGljYXRlIGZyb20gbmVzdGVkIHN0ZXAgc28gdGhlIHBvcnRhbCBjYW4gZHVwbGljYXRlIChzYW1lIGFzIHJvb3QgbGV2ZWwpLiAqL1xuICBvbk5lc3RlZER1cGxpY2F0ZShldmVudDogYW55LCBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmR1cGxpY2F0ZS5lbWl0KChldmVudCAmJiBldmVudC5zdGVwICE9IG51bGwpID8gZXZlbnQgOiB7IHN0ZXAgfSBhcyBhbnkpO1xuICB9XG5cbiAgaXNOb3JtYWxTdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgTm9ybWFsU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdldmVudFR5cGUnIGluIHN0ZXA7XG4gIH1cblxuICBpc0xvb3BTdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgTG9vcFN0ZXBDb25maWcge1xuICAgIHJldHVybiAnbG9vcFR5cGUnIGluIHN0ZXA7XG4gIH1cblxuICBpc0NvbmRpdGlvblN0ZXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBDb25kaXRpb25TdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2NvbmRpdGlvbicgaW4gc3RlcCAmJiAnYnJhbmNoZXMnIGluIHN0ZXA7XG4gIH1cblxuICBpc1N0ZXBHcm91cChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIFN0ZXBHcm91cENvbmZpZyB7XG4gICAgcmV0dXJuICdncm91cE5hbWUnIGluIHN0ZXA7XG4gIH1cblxuICBvbkFkZEJyYW5jaCgpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBjb25kaXRpb24gc3RlcHNcbiAgfVxuXG4gIG9uRGVsZXRlQnJhbmNoKGJyYW5jaDogYW55KTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgY29uZGl0aW9uIHN0ZXBzXG4gIH1cblxuICBvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaChuZXN0ZWRTdGVwOiBDb25kaXRpb25TdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQWRkIGEgbmV3IGJyYW5jaCB0byB0aGUgbmVzdGVkIGNvbmRpdGlvbiBzdGVwXG4gICAgaWYgKCFuZXN0ZWRTdGVwLmJyYW5jaGVzKSB7XG4gICAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzID0gW107XG4gICAgfVxuICAgIGNvbnN0IG5ld0JyYW5jaDogQ29uZGl0aW9uQnJhbmNoID0ge1xuICAgICAgdHlwZTogbmVzdGVkU3RlcC5icmFuY2hlcy5sZW5ndGggPT09IDAgPyAnaWYnIDogJ2Vsc2UnLFxuICAgICAgbGFiZWw6IG5lc3RlZFN0ZXAuYnJhbmNoZXMubGVuZ3RoID09PSAwID8gJ0lGIFRSVUUnIDogJ0VMU0UnLCBcbiAgICAgIHN0ZXBUeXBlOiBTdGVwVHlwZXMuQ09ORElUSU9OX0lGLFxuICAgICAgbmVzdGVkU3RlcHM6IFtdXG4gICAgfTtcbiAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzLnB1c2gobmV3QnJhbmNoKTtcbiAgICB0aGlzLm9uTmVzdGVkU3RlcENoYW5nZShuZXN0ZWRTdGVwLCBpbmRleCk7XG4gIH1cblxuICBvbk5lc3RlZENvbmRpdGlvbkRlbGV0ZUJyYW5jaChuZXN0ZWRTdGVwOiBDb25kaXRpb25TdGVwQ29uZmlnLCBicmFuY2g6IGFueSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFJlLWVtaXQgZGVsZXRlQnJhbmNoIHNvIHN0ZXAtbGlzdCBjYW4gb3BlbiBkZWxldGUgbW9kYWwgYW5kIGNhbGwgQVBJXG4gICAgdGhpcy5kZWxldGVCcmFuY2guZW1pdChicmFuY2gpO1xuICB9XG5cbiAgb25PcGVuRXh0ZXJuYWwoKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgc3RlcCBncm91cHNcbiAgfVxuXG4gIC8qKiBTeW5jIEZPUiBsb29wIGVkaXQgZm9ybSBzbyBkcm9wZG93bnMgc2hvdyBleGlzdGluZyBjb25maWcgKGZvck9wdGlvblR5cGUsIGZvckxvb3BUZXN0RGF0YUlkL3Rlc3REYXRhUHJvZmlsZSwgZm9yTG9vcFN0YXJ0SW5kZXgvZm9yTG9vcEVuZEluZGV4KSAqL1xuICBwcml2YXRlIHN5bmNGb3JMb29wRWRpdEZvcm1Gcm9tQ29uZmlnKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0Rm9ybSB8fCB0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuO1xuICAgIGNvbnN0IHRlc3REYXRhVmFsID0gdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVGb3JtVmFsdWUoKTtcbiAgICBjb25zdCBzdGFydFZhbCA9IHRoaXMuZ2V0TG9vcFN0YXJ0Rm9ybVZhbHVlKCk7XG4gICAgY29uc3QgZW5kVmFsID0gdGhpcy5nZXRMb29wRW5kRm9ybVZhbHVlKCk7XG4gICAgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIGZvck9wdGlvblR5cGU6IHRoaXMuZ2V0Rm9yT3B0aW9uVHlwZUZyb21Db25maWcoKSA/PyBudWxsLFxuICAgICAgdGVzdERhdGFQcm9maWxlOiB0ZXN0RGF0YVZhbCxcbiAgICAgIHN0YXJ0U3RlcDogc3RhcnRWYWwsXG4gICAgICBlbmRTdGVwOiBlbmRWYWwsXG4gICAgfSk7XG4gICAgLy8gRXhwbGljaXRseSBzZXQgZWFjaCBjb250cm9sIHNvIG1hdC1zZWxlY3QgcGlja3MgdXAgdGhlIHZhbHVlIChwYXRjaFZhbHVlIGNhbiBiZSBpZ25vcmVkIGJ5IGNoaWxkIGluIHNvbWUgdGltaW5nIGNhc2VzKVxuICAgIGNvbnN0IHRlc3REYXRhQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKTtcbiAgICBjb25zdCBzdGFydEN0cmwgPSB0aGlzLmVkaXRGb3JtLmdldCgnc3RhcnRTdGVwJyk7XG4gICAgY29uc3QgZW5kQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdlbmRTdGVwJyk7XG4gICAgaWYgKHRlc3REYXRhQ3RybCAmJiB0ZXN0RGF0YVZhbCAhPT0gdW5kZWZpbmVkICYmIHRlc3REYXRhVmFsICE9PSAnJykgdGVzdERhdGFDdHJsLnNldFZhbHVlKHRlc3REYXRhVmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgaWYgKHN0YXJ0Q3RybCAmJiBzdGFydFZhbCAhPSBudWxsKSBzdGFydEN0cmwuc2V0VmFsdWUoc3RhcnRWYWwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICBpZiAoZW5kQ3RybCAmJiBlbmRWYWwgIT0gbnVsbCkgZW5kQ3RybC5zZXRWYWx1ZShlbmRWYWwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBvbkVkaXQoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0U25hcHNob3QgPSB7XG4gICAgICB0ZXN0RGF0YVByb2ZpbGU6IHRoaXMudGVzdERhdGFQcm9maWxlLFxuICAgICAgc3RhcnRTdGVwOiB0aGlzLnN0YXJ0U3RlcCxcbiAgICAgIGVuZFN0ZXA6IHRoaXMuZW5kU3RlcCxcbiAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24sXG4gICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMsXG4gICAgICBzZWxlY3RlZFRlbXBsYXRlOiB0aGlzLnNlbGVjdGVkVGVtcGxhdGUsXG4gICAgICB0ZW1wbGF0ZVZhcmlhYmxlczogdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA/IFsuLi50aGlzLnRlbXBsYXRlVmFyaWFibGVzXSA6IFtdLFxuICAgICAgY29uZGl0aW9uVGVtcGxhdGVGb3JtVmFsdWU6IHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID8geyAuLi50aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS52YWx1ZSB9IDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgLy8gRk9SIGxvb3A6IHJlZnJlc2ggc2VsZWN0IGNvbmZpZ3MgKHNvIFRlc3QgRGF0YSBQcm9maWxlIG9wdGlvbnMgaW5jbHVkZSBzZWxlY3RlZCBpZCBpZiBuZWVkZWQpIHRoZW4gc3luYyBmb3JtIHNvIGRyb3Bkb3ducyBzaG93IHNlbGVjdGVkXG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZvckxvb3BTZWxlY3RDb25maWdzU2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICAgIHRoaXMuc3luY0Zvckxvb3BFZGl0Rm9ybUZyb21Db25maWcoKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnN5bmNGb3JMb29wRWRpdEZvcm1Gcm9tQ29uZmlnKCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICB0ZXN0RGF0YVByb2ZpbGU6IHRoaXMudGVzdERhdGFQcm9maWxlID8/ICcnLFxuICAgICAgICBzdGFydFN0ZXA6IHRoaXMuc3RhcnRTdGVwID8/IG51bGwsXG4gICAgICAgIGVuZFN0ZXA6IHRoaXMuZW5kU3RlcCA/PyBudWxsLFxuICAgICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uID8/ICcnLFxuICAgICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgLy8gV2hlbiBuYXR1cmFsVGV4dEFjdGlvbklkIGV4aXN0cywgcG9wdWxhdGUgY29uZGl0aW9uIGFuZCBzZWxlY3RlZCB0ZW1wbGF0ZSBmcm9tIG9wdGlvbnMgc28gYXV0b2NvbXBsZXRlIHNob3dzIHNlbGVjdGVkIHRlbXBsYXRlXG4gICAgICBjb25zdCBjb25maWdXaXRoSWQgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgICBpZiAoY29uZmlnV2l0aElkPy5uYXR1cmFsVGV4dEFjdGlvbklkICE9IG51bGwgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25kaXRpb24gfHwgY29uZmlnV2l0aElkPy50ZW1wbGF0ZVZhcmlhYmxlc0RhdGEpIHtcbiAgICAgICAgLy8gRmFsbGJhY2s6IG1hdGNoIGJ5IGNvbmRpdGlvbiB0ZXh0IHdoZW4gbmF0dXJhbFRleHRBY3Rpb25JZCBub3Qgc2V0XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblN0ciA9IHRoaXMuY29uZGl0aW9uIHx8IGNvbmZpZ1dpdGhJZD8uY29uZGl0aW9uIHx8ICcnO1xuICAgICAgICBpZiAoY29uZGl0aW9uU3RyICYmICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgfHwgW10pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXMgYW55W10pLmZpbmQoXG4gICAgICAgICAgICAob3B0OiBhbnkpID0+IChvcHQubmF0dXJhbFRleHQgfHwgb3B0Lm5hbWUgfHwgb3B0LnZhbHVlKSA9PT0gY29uZGl0aW9uU3RyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbj8udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgICAgICAgaWYgKGZ1bGxUZW1wbGF0ZSAmJiBmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBmdWxsVGVtcGxhdGU7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy5idWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgY29uZGl0aW9uOiB0aGlzLmNvbmRpdGlvbiA/PyAnJyxcbiAgICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zID8/IDUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5pc0VkaXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZWRpdC5lbWl0KCk7XG4gIH1cblxuICBvbkVkaXRBcHBseSgpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5lZGl0Rm9ybS52YWx1ZTtcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSA9IHYudGVzdERhdGFQcm9maWxlID8/ICcnO1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdi5zdGFydFN0ZXAgPz8gdW5kZWZpbmVkO1xuICAgIHRoaXMuZW5kU3RlcCA9IHYuZW5kU3RlcCA/PyB1bmRlZmluZWQ7XG4gICAgdGhpcy5jb25kaXRpb24gPSB2LmNvbmRpdGlvbiA/PyAnJztcbiAgICBjb25zdCBtYXhWYWwgPSB2Lm1heEl0ZXJhdGlvbnM7XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdHlwZW9mIG1heFZhbCA9PT0gJ251bWJlcicgPyBtYXhWYWwgOiAobWF4VmFsICE9IG51bGwgJiYgbWF4VmFsICE9PSAnJyA/IE51bWJlcihtYXhWYWwpIDogdW5kZWZpbmVkKTtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBzZWxlY3RlZCBkYXRhIHByb2ZpbGUgb3B0aW9uIHRvIGdldCBib3RoIElEIGFuZCBuYW1lXG4gICAgbGV0IHRlc3REYXRhUHJvZmlsZUlkOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRlc3REYXRhUHJvZmlsZU5hbWU6IHN0cmluZyA9ICcnO1xuICAgIFxuICAgIGlmICh0ZXN0RGF0YVByb2ZpbGVWYWx1ZSAmJiB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgZm9ybSB2YWx1ZSBtaWdodCBiZSBJRCAobnVtYmVyKSBvciBuYW1lIChzdHJpbmcpXG4gICAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5maW5kKFxuICAgICAgICBvcHRpb24gPT4gb3B0aW9uLmlkID09PSBOdW1iZXIodGVzdERhdGFQcm9maWxlVmFsdWUpIHx8IG9wdGlvbi5uYW1lID09PSB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSB8fCBTdHJpbmcob3B0aW9uLmlkKSA9PT0gU3RyaW5nKHRlc3REYXRhUHJvZmlsZVZhbHVlKVxuICAgICAgKTtcbiAgICAgIGlmIChzZWxlY3RlZFByb2ZpbGUpIHtcbiAgICAgICAgdGVzdERhdGFQcm9maWxlSWQgPSBzZWxlY3RlZFByb2ZpbGUuaWQ7XG4gICAgICAgIHRlc3REYXRhUHJvZmlsZU5hbWUgPSBzZWxlY3RlZFByb2ZpbGUubmFtZTtcbiAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0ZXN0RGF0YVByb2ZpbGVOYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgbm90IGZvdW5kLCB1c2UgdGhlIHZhbHVlIGFzLWlzIChtaWdodCBiZSBJRCBvciBuYW1lKVxuICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZVZhbHVlO1xuICAgICAgICB0ZXN0RGF0YVByb2ZpbGVJZCA9IE51bWJlcih0ZXN0RGF0YVByb2ZpbGVWYWx1ZSkgfHwgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZVZhbHVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBXaGlsZSBsb29wOiBidWlsZCB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgYW5kIG5hdHVyYWxUZXh0QWN0aW9uSWQgZnJvbSBzZWxlY3RlZCB0ZW1wbGF0ZSAoc2FtZSBhcyBjb25kaXRpb24tc3RlcClcbiAgICBsZXQgdGVtcGxhdGVWYXJpYWJsZXNEYXRhOiBhbnk7XG4gICAgbGV0IG5hdHVyYWxUZXh0QWN0aW9uSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJyAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzPy5sZW5ndGgpIHtcbiAgICAgIHRlbXBsYXRlVmFyaWFibGVzRGF0YSA9IHt9O1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgdGVtcGxhdGVWYXJpYWJsZXNEYXRhW3ZhcmlhYmxlLm5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZT8uaWQgIT0gbnVsbCkge1xuICAgICAgICBuYXR1cmFsVGV4dEFjdGlvbklkID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlLmlkO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUgY29uZmlnIHdpdGggbmV3IHZhbHVlcyAoaW5jbHVkZSB0ZXN0RGF0YVByb2ZpbGVJZCwgdGVtcGxhdGVWYXJpYWJsZXNEYXRhLCBuYXR1cmFsVGV4dEFjdGlvbklkIGZvciB3aGlsZTsgZm9yTG9vcFRlc3REYXRhSWQsIGZvckxvb3BTdGFydEluZGV4L2Zvckxvb3BFbmRJbmRleCBmb3IgZm9yKVxuICAgIGNvbnN0IHVwZGF0ZWRDb25maWc6IExvb3BTdGVwQ29uZmlnICYgeyB0ZXN0RGF0YVByb2ZpbGVJZD86IHN0cmluZyB8IG51bWJlcjsgdGVtcGxhdGVWYXJpYWJsZXNEYXRhPzogYW55OyBuYXR1cmFsVGV4dEFjdGlvbklkPzogbnVtYmVyIH0gPSB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGhpcy50ZXN0RGF0YVByb2ZpbGUsXG4gICAgICB0ZXN0RGF0YVByb2ZpbGVJZDogdGVzdERhdGFQcm9maWxlSWQsIC8vIEFkZCBJRCBmb3IgQVBJIGNhbGxcbiAgICAgIHN0YXJ0U3RlcDogdGhpcy5zdGFydFN0ZXAsXG4gICAgICBlbmRTdGVwOiB0aGlzLmVuZFN0ZXAsXG4gICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uLFxuICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zLFxuICAgICAgLi4uKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScgJiYgT2JqZWN0LmtleXModGVtcGxhdGVWYXJpYWJsZXNEYXRhIHx8IHt9KS5sZW5ndGggPiAwICYmIHsgdGVtcGxhdGVWYXJpYWJsZXNEYXRhIH0pLFxuICAgICAgLi4uKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScgJiYgbmF0dXJhbFRleHRBY3Rpb25JZCAhPSBudWxsICYmIHsgbmF0dXJhbFRleHRBY3Rpb25JZCB9KSxcbiAgICAgIC4uLih0aGlzLmxvb3BUeXBlID09PSAnZm9yJyAmJiB0ZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmIHsgZm9yTG9vcFRlc3REYXRhSWQ6IE51bWJlcih0ZXN0RGF0YVByb2ZpbGVJZCkgfSksXG4gICAgICAuLi4odGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgJiYgdGhpcy5zdGFydFN0ZXAgIT0gbnVsbCAmJiB7IGZvckxvb3BTdGFydEluZGV4OiB0aGlzLnN0YXJ0U3RlcCB9KSxcbiAgICAgIC4uLih0aGlzLmxvb3BUeXBlID09PSAnZm9yJyAmJiB0aGlzLmVuZFN0ZXAgIT0gbnVsbCAmJiB7IGZvckxvb3BFbmRJbmRleDogdGhpcy5lbmRTdGVwIH0pLFxuICAgIH07XG4gICAgXG4gICAgLy8gRW1pdCBpbmRpdmlkdWFsIGNoYW5nZSBldmVudHNcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZUNoYW5nZS5lbWl0KHRoaXMudGVzdERhdGFQcm9maWxlKTtcbiAgICB0aGlzLnN0YXJ0U3RlcENoYW5nZS5lbWl0KHRoaXMuc3RhcnRTdGVwID8/IDEpO1xuICAgIHRoaXMuZW5kU3RlcENoYW5nZS5lbWl0KHRoaXMuZW5kU3RlcCA/PyAxKTtcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgdGhpcy5jb25kaXRpb25DaGFuZ2UuZW1pdCh0aGlzLmNvbmRpdGlvbik7XG4gICAgICB0aGlzLm1heEl0ZXJhdGlvbnNDaGFuZ2UuZW1pdCh0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVtaXQgc3RlcCB1cGRhdGUgZXZlbnQgd2l0aCBmdWxsIGNvbmZpZ1xuICAgIGNvbnNvbGUubG9nKCdMb29wLXN0ZXA6IEVtaXR0aW5nIHN0ZXBVcGRhdGUgZXZlbnQnLCB1cGRhdGVkQ29uZmlnKTtcbiAgICB0aGlzLnN0ZXBVcGRhdGUuZW1pdCh1cGRhdGVkQ29uZmlnKTtcbiAgICBcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25FZGl0Q2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGhpcy5lZGl0U25hcHNob3QudGVzdERhdGFQcm9maWxlO1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdGhpcy5lZGl0U25hcHNob3Quc3RhcnRTdGVwO1xuICAgIHRoaXMuZW5kU3RlcCA9IHRoaXMuZWRpdFNuYXBzaG90LmVuZFN0ZXA7XG4gICAgdGhpcy5jb25kaXRpb24gPSB0aGlzLmVkaXRTbmFwc2hvdC5jb25kaXRpb247XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdGhpcy5lZGl0U25hcHNob3QubWF4SXRlcmF0aW9ucztcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSB0aGlzLmVkaXRTbmFwc2hvdC5zZWxlY3RlZFRlbXBsYXRlO1xuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLmVkaXRTbmFwc2hvdC50ZW1wbGF0ZVZhcmlhYmxlcyB8fCBbXTtcbiAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gJiYgdGhpcy5lZGl0U25hcHNob3QuY29uZGl0aW9uVGVtcGxhdGVGb3JtVmFsdWUpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtLnBhdGNoVmFsdWUodGhpcy5lZGl0U25hcHNob3QuY29uZGl0aW9uVGVtcGxhdGVGb3JtVmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25FZGl0SW5EZXB0aCh0ZW1wbGF0ZU92ZXJyaWRlPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5tb3JlT3B0aW9ucy5lbWl0KCk7XG4gICAgLy8gVXNlIHJlbmRlcmVyJ3MgaW5kZXggd2hlbiBhdmFpbGFibGUgKGNvcnJlY3QgZm9yIHN0cnVjdHVyYWwgc3RlcHMpLiBzdGVwTnVtYmVyIFwiMTAuM1wiIHBhcnNlcyB0byAxMCAtIHdyb25nLlxuICAgIGNvbnN0IGluZGV4ID0gdHlwZW9mIHRoaXMuaW5kZXggPT09ICdudW1iZXInXG4gICAgICA/IHRoaXMuaW5kZXhcbiAgICAgIDogKHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdudW1iZXInID8gdGhpcy5zdGVwTnVtYmVyIDogKHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQodGhpcy5zdGVwTnVtYmVyLCAxMCkgOiAwKSk7XG4gICAgY29uc3QgcGF5bG9hZDogeyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXI7IHRlbXBsYXRlT3ZlcnJpZGU/OiBhbnkgfSA9IHtcbiAgICAgIHN0ZXA6IHRoaXMuY29uZmlnIGFzIFRlc3RDYXNlU3RlcENvbmZpZyxcbiAgICAgIGluZGV4OiBpc05hTihpbmRleCBhcyBudW1iZXIpID8gMCA6IChpbmRleCBhcyBudW1iZXIpLFxuICAgIH07XG4gICAgaWYgKHRlbXBsYXRlT3ZlcnJpZGUpIHtcbiAgICAgIHBheWxvYWQudGVtcGxhdGVPdmVycmlkZSA9IHRlbXBsYXRlT3ZlcnJpZGU7XG4gICAgfVxuICAgIHRoaXMuZWRpdEluRGVwdGguZW1pdChwYXlsb2FkKTtcbiAgfVxuXG4gIG9uTGluaygpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBzdGVwIGdyb3Vwc1xuICB9XG5cbiAgb25EdXBsaWNhdGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEdXBsaWNhdGluZykgcmV0dXJuO1xuICAgIHRoaXMuZHVwbGljYXRlLmVtaXQoKTtcbiAgfVxuXG4gIG9uRGVsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlLmVtaXQoKTtcbiAgfVxuXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gY2hlY2tlZDtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KGNoZWNrZWQpO1xuICB9XG5cbiAgb25Nb3JlT3B0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLm1vcmVPcHRpb25zLmVtaXQoKTtcbiAgfVxuXG4gIG9uVmlld0RldGFpbHMoZXZlbnQ/OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIFxuICAgIGlmICghdGhpcy5jb25maWcuZGVzY3JpcHRpb24gfHwgdGhpcy5jb25maWcuZGVzY3JpcHRpb24udHJpbSgpID09PSAnJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudCkge1xuICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdGT1IgTE9PUCBEZXRhaWxzJyA6ICdXSElMRSBMT09QIERldGFpbHMnO1xuICAgICAgdGhpcy52aWV3RGV0YWlscy5lbWl0KHtcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRpdGxlLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5jb25maWcuZGVzY3JpcHRpb24sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJsb29wLXN0ZXAtcm93IGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICA8IS0tIElubGluZSBFZGl0IE1vZGU6IHN0b3AgcHJvcGFnYXRpb24gc28gZHJvcGRvd24vc2VsZWN0IGludGVyYWN0aW9ucyBkb24ndCBidWJibGUgYW5kIGNvbGxhcHNlIHRoZSBzdGVwIG9yIHN0YXJ0IGRyYWcgLS0+XG4gIDxkaXYgKm5nSWY9XCJpc0VkaXRpbmdcIiBjbGFzcz1cImNxYS1weS0yLjUgY3FhLXB4LTQgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtanVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWZsZXgtZ3JvdyBjcWEtZmxleC13cmFwIGNxYS1taW4tdy0wXCI+XG4gICAgICAgIDwhLS0gTG9vcCBUeXBlIExhYmVsIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxQzM5OEVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgICAgICB7eyBnZXRMb29wVHlwZUxhYmVsKCkgfX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGT1IgTE9PUCBpbmxpbmUgZWRpdDogY3FhLWR5bmFtaWMtc2VsZWN0IChzYW1lIHVzYWdlIGFzIGRlZmF1bHQgc3RvcmllcykgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgICAgICAgICA8IS0tIEZpcnN0IHNlbGVjdDogd2lkdGggMjE2LjI1cHgsIGhlaWdodCAzNnB4LCBnYXAgNHB4LCBvcGFjaXR5IDEgLS0+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwiZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImVkaXRGb3JtXCIgW2NvbmZpZ109XCJ0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwic3RhcnRTdGVwU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cImVuZFN0ZXBTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gV0hJTEUgTE9PUCBpbmxpbmUgZWRpdDogY3FhLWF1dG9jb21wbGV0ZSArIHRlbXBsYXRlIHZhcmlhYmxlcyAoc2FtZSBhcyBjb25kaXRpb24tc3RlcCkgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1doaWxlTG9vcCgpXCI+XG4gICAgICAgICAgPGNxYS1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICpuZ0lmPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwid2hpbGVDb25kaXRpb25BdXRvY29tcGxldGVPcHRpb25zXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ3aGlsZUNvbmRpdGlvbkRpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdjb25kaXRpb24nLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChvcHRpb25TZWxlY3QpPVwib25Db25kaXRpb25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBjb25kaXRpb25cIlxuICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPlxuICAgICAgICAgIDwvY3FhLWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICA8IS0tIFRlbXBsYXRlIHZhcmlhYmxlcyBoaWRkZW4gaW4gd2hpbGUgbG9vcCAtIHVzZSBFZGl0IEluIGRlcHRoIHRvIGNvbmZpZ3VyZSAtLT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBFZGl0IEluIGRlcHRoIGxpbmsgLS0+XG4gICAgICA8YSBocmVmPVwiI1wiICpuZ0lmPVwiaXNXaGlsZUxvb3AoKVwiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVsycHhdIGNxYS1uby11bmRlcmxpbmVcIj5cbiAgICAgICAgRWRpdCBJbiBkZXB0aFxuICAgICAgICA8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTIuMDM4MDkgNi43NDMyOUwyLjYyODA5IDcuMzMzMjlMNS45NjE0MiAzLjk5OTk2TDIuNjI4MDkgMC42NjY2MjZMMi4wMzgwOSAxLjI1NjYzTDQuNzgxNDIgMy45OTk5NkwyLjAzODA5IDYuNzQzMjlaXCJcbiAgICAgICAgICAgIGZpbGw9XCIjM0Y0M0VFXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2E+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgPCEtLSBDYW5jZWwgLyBBcHBseSAtLT5cbiAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQ2FuY2VsJ1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uRWRpdENhbmNlbCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQXBwbHknXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25FZGl0QXBwbHkoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIExvb3AgSGVhZGVyIChub3JtYWwgdmlldyB3aGVuIG5vdCBlZGl0aW5nKSAtLT5cbiAgPGRpdiAqbmdJZj1cIiFpc0VkaXRpbmdcIlxuICAgIFtjbGFzc109XCInc3RlcC1yb3cgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LTIgJyArIChpc0luc2lkZUxvb3AgJiYgaXNJbnNpZGVTdGVwR3JvdXAgPyAnY3FhLXBsLTIwIGNxYS1wci00JyA6IChpc0luc2lkZUxvb3AgfHwgaXNJbnNpZGVTdGVwR3JvdXApID8gJ2NxYS1wbC0xMCBjcWEtcHItNCcgOiAnY3FhLXB4LTQnKVwiXG4gICAgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI0U1RTdFQjtcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICA8IS0tIERyYWcgSGFuZGxlIEljb24gKHdoZW4gaXNSZW9yZGVyIGlzIHRydWUgYW5kIG5vdCBpbnNpZGUgc3RlcCBncm91cCAtIHN0ZXBzIGluc2lkZSBzdGVwIGdyb3VwcyBjYW5ub3QgYmUgcmVvcmRlcmVkKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNSZW9yZGVyICYmICFpc0luc2lkZVN0ZXBHcm91cFwiIGNsYXNzPVwiY3FhLW1yLTIgY3FhLWN1cnNvci1tb3ZlIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtdGV4dC1bIzExMTgyN11cIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBDaGVja2JveCAod2hlbiBpc1Jlb3JkZXIgaXMgZmFsc2UgYW5kIG5vdCBpbnNpZGUgc3RlcCBncm91cCAtIGhpZGUgZm9yIHN0ZXBzIGluc2lkZSBzdGVwIGdyb3VwcykgLS0+XG4gICAgPGxhYmVsICpuZ0lmPVwiIWlzUmVvcmRlciAmJiAhaXNJbnNpZGVTdGVwR3JvdXBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1yZWxhdGl2ZSBjcWEtbXItMlwiPlxuICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWgtNCBjcWEtdy00IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWFwcGVhcmFuY2Utbm9uZSBjcWEtcm91bmRlZCBzaGFkb3cgaG92ZXI6Y3FhLXNoYWRvdy1tZCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1zbGF0ZS0zMDAgY3FhLWZsZXgtc2hyaW5rLTBcIlxuICAgICAgICBbY2xhc3MuY3FhLWJnLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFwiXG4gICAgICAgIGlkPVwiY2hlY2stbG9vcC1zdGVwXCIgLz5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS10ZXh0LXdoaXRlIGNxYS10b3AtMS8yIGNxYS1sZWZ0LTEvMiBjcWEtLXRyYW5zbGF0ZS14LTEvMiBjcWEtLXRyYW5zbGF0ZS15LTEvMiBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0wXT1cIiFzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0xMDBdPVwic2VsZWN0ZWRcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDEyIDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xMCAzLjEyNUw0LjUgOC42MjVMMiA2LjEyNVwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtbWluLXctWzMycHhdXCI+e3sgc3RlcE51bWJlciB9fTwvc3Bhbj5cbiAgICA8IS0tIEV4cGFuZC9Db2xsYXBzZSBJY29uIC0tPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblRvZ2dsZUV4cGFuZGVkKClcIiBjbGFzcz1cImNxYS1wLTBcIj5cbiAgICAgIDxzdmcgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cIiFleHBhbmRlZFwiIGNsYXNzPVwiY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcbiAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTEyIDEwTDggNkw0IDEwXCIgc3Ryb2tlPVwiIzZCNzI4MFwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2J1dHRvbj5cblxuICAgIDwhLS0gTG9vcCBJY29uIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTExLjMzNCAxLjMzMzI1TDE0LjAwMDcgMy45OTk5MkwxMS4zMzQgNi42NjY1OVwiIHN0cm9rZT1cIiMxQzM5OEVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTIgNy4zMzMzM1Y2LjY2NjY3QzIgNS45NTk0MiAyLjI4MDk1IDUuMjgxMTUgMi43ODEwNSA0Ljc4MTA1QzMuMjgxMTUgNC4yODA5NSAzLjk1OTQyIDQgNC42NjY2NyA0SDE0XCJcbiAgICAgICAgICBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNNC42NjY2NyAxNC42NjY2TDIgMTEuOTk5OUw0LjY2NjY3IDkuMzMzMjVcIiBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTE0IDguNjY2NzVWOS4zMzM0MUMxNCAxMC4wNDA3IDEzLjcxOSAxMC43MTg5IDEzLjIxOSAxMS4yMTlDMTIuNzE4OSAxMS43MTkxIDEyLjA0MDYgMTIuMDAwMSAxMS4zMzMzIDEyLjAwMDFIMlwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzFDMzk4RVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImxvb3BUeXBlID09PSAnd2hpbGUnXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMS4zMzQgMS4zMzMyNUwxNC4wMDA3IDMuOTk5OTJMMTEuMzM0IDYuNjY2NTlcIiBzdHJva2U9XCIjNTkxNjhCXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGggZD1cIk0yIDcuMzMzMzNWNi42NjY2N0MyIDUuOTU5NDIgMi4yODA5NSA1LjI4MTE1IDIuNzgxMDUgNC43ODEwNUMzLjI4MTE1IDQuMjgwOTUgMy45NTk0MiA0IDQuNjY2NjcgNEgxNFwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTQuNjY2NjcgMTQuNjY2NkwyIDExLjk5OTlMNC42NjY2NyA5LjMzMzI1XCIgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xNCA4LjY2Njc1VjkuMzMzNDFDMTQgMTAuMDQwNyAxMy43MTkgMTAuNzE4OSAxMy4yMTkgMTEuMjE5QzEyLjcxODkgMTEuNzE5MSAxMi4wNDA2IDEyLjAwMDEgMTEuMzMzMyAxMi4wMDAxSDJcIlxuICAgICAgICAgIHN0cm9rZT1cIiM1OTE2OEJcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBMb29wIFR5cGUgTGFiZWwgLS0+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLW5vbmVcIj5cbiAgICAgIHt7IGdldExvb3BUeXBlTGFiZWwoKSB9fVxuICAgIDwvc3Bhbj5cblxuICAgIDwhLS0gRm9yIExvb3AgRGlzcGxheTogaXRlbXMgZmxvdyBvbiBvbmUgcm93OyBvbmx5IHdyYXAgdG8gbmV4dCBsaW5lIHdoZW4gdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwibG9vcFR5cGUgPT09ICdmb3InICYmIChoYXNUZXN0RGF0YVByb2ZpbGUoKSB8fCBoYXNTdGFydFZhbHVlKCkgfHwgaGFzRW5kVmFsdWUoKSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLXgtMyBjcWEtZ2FwLXktMSBjcWEtbWwtMiBjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICA8c3BhbiAqbmdJZj1cImdldEZvckxvb3BQcm9maWxlRGlzcGxheSgpXCIgY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN10gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtYWN0aW9uLWZvcm1hdFwiIFtpbm5lckhUTUxdPVwiZ2V0Rm9yTG9vcFByb2ZpbGVEaXNwbGF5KCkgfCBjcWFTYWZlSHRtbFwiIChjbGljayk9XCJvbkxvb3BBY3Rpb25DbGljaygkZXZlbnQpXCI+PC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJnZXRGb3JMb29wUmFuZ2VEaXNwbGF5KClcIiBjbGFzcz1cImZvci1sb29wLXJhbmdlLXJvdyBjcWEtdGV4dC1bIzExMTgyN10gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtYWN0aW9uLWZvcm1hdFwiIFtpbm5lckhUTUxdPVwiZ2V0Rm9yTG9vcFJhbmdlRGlzcGxheSgpIHwgY3FhU2FmZUh0bWxcIiAoY2xpY2spPVwib25Mb29wQWN0aW9uQ2xpY2soJGV2ZW50KVwiPjwvc3Bhbj5cbiAgICAgIDxkaXYgKm5nSWY9XCJnZXRMb29wRXZlbnREZXRhaWxzRm9yRGlzcGxheSgpLmxlbmd0aCA+IDBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0yIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0TG9vcEV2ZW50RGV0YWlsc0ZvckRpc3BsYXkoKVwiIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXJvdW5kZWQgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtYmctWyNGM0Y0RjZdIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl1cIiAoY2xpY2spPVwib25Mb29wQWN0aW9uQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXVwiPnt7IGl0ZW0ua2V5IH19Ojwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMTExODI3XSBjcWEtYnJlYWstd29yZHNcIj57eyBpdGVtLnZhbHVlIH19PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gV2hpbGUgTG9vcCBDb25kaXRpb24gKG9ubHkgc2hvdyBpZiBjb25kaXRpb24gZXhpc3RzKSAtIHNhbWUgc3R5bGluZyBhcyBjb25kaXRpb24gc3RlcCAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNXaGlsZUxvb3AoKSAmJiBjb25kaXRpb25cIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1tbC0yIGNxYS1mbGV4LTEgY3FhLWZsZXgtd3JhcFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN10gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtYWN0aW9uLWZvcm1hdFwiIFtpbm5lckhUTUxdPVwiZ2V0Q29uZGl0aW9uRGlzcGxheSgpIHwgY3FhU2FmZUh0bWxcIiAoY2xpY2spPVwib25Mb29wQWN0aW9uQ2xpY2soJGV2ZW50KVwiPjwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwibWF4SXRlcmF0aW9ucyAhPSBudWxsICYmIG1heEl0ZXJhdGlvbnMgPiAwXCIgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtcm91bmRlZCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1iZy1bI0YzRjRGNl0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiIChjbGljayk9XCJvbkxvb3BBY3Rpb25DbGljaygkZXZlbnQpXCIgZGF0YS1rZXk9XCJtYXhJdGVyYXRpb25zXCIgZGF0YS1ldmVudC1rZXk9XCJtYXhJdGVyYXRpb25zXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXVwiPm1heCBpdGVyYXRpb25zOjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN11cIj57eyBtYXhJdGVyYXRpb25zIH19PC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldExvb3BFdmVudERldGFpbHNGb3JEaXNwbGF5KCkubGVuZ3RoID4gMFwiPlxuICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRMb29wRXZlbnREZXRhaWxzRm9yRGlzcGxheSgpXCIgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtcm91bmRlZCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1iZy1bI0YzRjRGNl0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiIChjbGljayk9XCJvbkxvb3BBY3Rpb25DbGljaygkZXZlbnQpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM2QjcyODBdXCI+e3sgaXRlbS5rZXkgfX06PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMxMTE4MjddXCI+e3sgaXRlbS52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLW1sLWF1dG9cIj5cbiAgICAgIDwhLS0gU3RlcHMgU3VtbWFyeSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjcWEtbWwtYXV0byBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTVFNV0gY3FhLXJvdW5kZWQtbGcgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPlxuICAgICAgICB7eyBnZXRTdGVwc1N1bW1hcnkoKSB9fVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVmlldyBEZXRhaWxzIExpbmsgKHNob3cgb25seSBpZiBkZXNjcmlwdGlvbiBpcyBub3QgZW1wdHkpIC0tPlxuICAgICAgPGEgKm5nSWY9XCJjb25maWcuZGVzY3JpcHRpb24gJiYgY29uZmlnLmRlc2NyaXB0aW9uLnRyaW0oKSAhPT0gJydcIiAjdmlld0RldGFpbHNUcmlnZ2VyIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uVmlld0RldGFpbHMoJGV2ZW50KVwiIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1uby11bmRlcmxpbmUgY3FhLW1sLWF1dG9cIj5WaWV3IERldGFpbHM8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz48L2E+XG5cbiAgICAgIDwhLS0gQWN0aW9uIEljb25zOiBFZGl0LCBMaW5rLCBEdXBsaWNhdGUsIERlbGV0ZSAoc2hvdyBvbiBob3ZlcjsgaGlkZGVuIHdoZW4gaW5zaWRlIHN0ZXAtZ3JvdXApIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIiFpc0luc2lkZVN0ZXBHcm91cCAmJiAhaXNSZW9yZGVyXCIgY2xhc3M9XCJzdGVwLWFjdGlvbnMgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB4LVs3cHhdXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkVkaXQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJFZGl0XCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03IDExLjY2NjZIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNOS41NTIwOCAyLjExMjhDOS43ODQzIDEuODgwNTggMTAuMDk5MyAxLjc1MDEyIDEwLjQyNzcgMS43NTAxMkMxMC43NTYxIDEuNzUwMTIgMTEuMDcxIDEuODgwNTggMTEuMzAzMyAyLjExMjhDMTEuNTM1NSAyLjM0NTAyIDExLjY2NTkgMi42NTk5OCAxMS42NjU5IDIuOTg4MzhDMTEuNjY1OSAzLjMxNjc5IDExLjUzNTUgMy42MzE3NSAxMS4zMDMzIDMuODYzOTdMNC4yOTc0MiAxMC44NzA0QzQuMTU4NjQgMTEuMDA5MiAzLjk4NzEgMTEuMTEwNyAzLjc5ODY3IDExLjE2NTZMMi4xMjMzMyAxMS42NTQ0QzIuMDczMTQgMTEuNjY5IDIuMDE5OTMgMTEuNjY5OSAxLjk2OTI4IDExLjY1NjlDMS45MTg2MyAxMS42NDM5IDEuODcyNCAxMS42MTc2IDEuODM1NDMgMTEuNTgwNkMxLjc5ODQ2IDExLjU0MzcgMS43NzIxIDExLjQ5NzQgMS43NTkxMyAxMS40NDY4QzEuNzQ2MTUgMTEuMzk2MSAxLjc0NzAzIDExLjM0MjkgMS43NjE2NyAxMS4yOTI3TDIuMjUwNSA5LjYxNzM4QzIuMzA1NDYgOS40MjkxNiAyLjQwNjk4IDkuMjU3ODMgMi41NDU2NyA5LjExOTIyTDkuNTUyMDggMi4xMTI4WlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25MaW5rKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiTGlua1wiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjOTlBMUFmXSBob3ZlcjpjcWEtdGV4dC1bIzE0NDdFNl1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNNS4wMDA2NSA5LjkxNjcxSDMuNjY3MzJDMi43ODMyNiA5LjkxNjcxIDEuOTM1NDIgOS42MDk0MiAxLjMxMDMgOS4wNjI0NEMwLjY4NTE3NCA4LjUxNTQ1IDAuMzMzOTg0IDcuNzczNTkgMC4zMzM5ODQgNy4wMDAwNEMwLjMzMzk4NCA2LjIyNjQ5IDAuNjg1MTc0IDUuNDg0NjMgMS4zMTAzIDQuOTM3NjVDMS45MzU0MiA0LjM5MDY2IDIuNzgzMjYgNC4wODMzNyAzLjY2NzMyIDQuMDgzMzdINS4wMDA2NVwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk05IDQuMDgzMzdIMTAuMzMzM0MxMS4yMTc0IDQuMDgzMzcgMTIuMDY1MiA0LjM5MDY2IDEyLjY5MDQgNC45Mzc2NUMxMy4zMTU1IDUuNDg0NjMgMTMuNjY2NyA2LjIyNjQ5IDEzLjY2NjcgNy4wMDAwNEMxMy42NjY3IDcuNzczNTkgMTMuMzE1NSA4LjUxNTQ1IDEyLjY5MDQgOS4wNjI0NEMxMi4wNjUyIDkuNjA5NDIgMTEuMjE3NCA5LjkxNjcxIDEwLjMzMzMgOS45MTY3MUg5XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTQuMzMzOTggN0g5LjY2NzMyXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJvbkR1cGxpY2F0ZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0R1cGxpY2F0aW5nXCJcbiAgICAgICAgICBbYXR0ci50aXRsZV09XCJpc0R1cGxpY2F0aW5nID8gJ0R1cGxpY2F0aW5nLi4uJyA6ICdEdXBsaWNhdGUnXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XSBkaXNhYmxlZDpjcWEtb3BhY2l0eS02MCBkaXNhYmxlZDpjcWEtY3Vyc29yLW5vdC1hbGxvd2VkXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgKm5nSWY9XCIhaXNEdXBsaWNhdGluZ1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTEuNjY2IDQuNjY2NjNINS44MzI2OEM1LjE4ODM1IDQuNjY2NjMgNC42NjYwMiA1LjE4ODk2IDQuNjY2MDIgNS44MzMyOVYxMS42NjY2QzQuNjY2MDIgMTIuMzExIDUuMTg4MzUgMTIuODMzMyA1LjgzMjY4IDEyLjgzMzNIMTEuNjY2QzEyLjMxMDMgMTIuODMzMyAxMi44MzI3IDEyLjMxMSAxMi44MzI3IDExLjY2NjZWNS44MzMyOUMxMi44MzI3IDUuMTg4OTYgMTIuMzEwMyA0LjY2NjYzIDExLjY2NiA0LjY2NjYzWlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0yLjMzMjY4IDkuMzMzMjlDMS42OTEwMiA5LjMzMzI5IDEuMTY2MDIgOC44MDgyOSAxLjE2NjAyIDguMTY2NjNWMi4zMzMyOUMxLjE2NjAyIDEuNjkxNjMgMS42OTEwMiAxLjE2NjYzIDIuMzMyNjggMS4xNjY2M0g4LjE2NjAyQzguODA3NjggMS4xNjY2MyA5LjMzMjY4IDEuNjkxNjMgOS4zMzI2OCAyLjMzMzI5XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPHN2ZyAqbmdJZj1cImlzRHVwbGljYXRpbmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1sYWJlbD1cIkR1cGxpY2F0aW5nXCI+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCI2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLW9wYWNpdHk9XCIwLjJcIiBzdHJva2Utd2lkdGg9XCIyXCI+PC9jaXJjbGU+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTE0IDhBNiA2IDAgMCAwIDggMlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+XG4gICAgICAgICAgICAgIDxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9XCJ0cmFuc2Zvcm1cIiB0eXBlPVwicm90YXRlXCIgZnJvbT1cIjAgOCA4XCIgdG89XCIzNjAgOCA4XCIgZHVyPVwiMC44c1wiIHJlcGVhdENvdW50PVwiaW5kZWZpbml0ZVwiLz5cbiAgICAgICAgICAgIDwvcGF0aD5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkRlbGV0ZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkRlbGV0ZVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjZmY2NDY3XSBob3ZlcjpjcWEtdGV4dC1bI0M2MzUzNV1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS43NSAzLjVIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTEuMDgyNyAzLjVWMTEuNjY2N0MxMS4wODI3IDEyLjI1IDEwLjQ5OTMgMTIuODMzMyA5LjkxNjAyIDEyLjgzMzNINC4wODI2OEMzLjQ5OTM1IDEyLjgzMzMgMi45MTYwMiAxMi4yNSAyLjkxNjAyIDExLjY2NjdWMy41XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTQuNjY2MDIgMy40OTk5NlYyLjMzMzI5QzQuNjY2MDIgMS43NDk5NiA1LjI0OTM1IDEuMTY2NjMgNS44MzI2OCAxLjE2NjYzSDguMTY2MDJDOC43NDkzNSAxLjE2NjYzIDkuMzMyNjggMS43NDk5NiA5LjMzMjY4IDIuMzMzMjlWMy40OTk5NlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk01LjgzMzk4IDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk04LjE2NjAyIDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBDcmVhdGVkIERhdGUgKGZyb20gQVBJKSAtIGxhc3Qgc28gYWxpZ25lZCBhY3Jvc3MgYWxsIHN0ZXBzLCBmb3JtYXQ6IDI1IEZlYiAyMDI2IC0tPlxuICAgICAgPHNwYW4gKm5nSWY9XCJjb25maWcuY3JlYXRlZERhdGVcIiBjbGFzcz1cInN0ZXAtZGF0ZSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtbWwtYXV0byBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICB7eyBjb25maWcuY3JlYXRlZERhdGUgfCBkYXRlOidkIE1NTSB5eXl5JyB9fVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEV4cGFuZGVkIENvbnRlbnQgd2l0aCBOZXN0ZWQgU3RlcHMgKHJlbmRlcmVyIGRpc3BhdGNoZXMgYnkgc3RlcCB0eXBlLCBuLWxldmVsIG5lc3RpbmcpIC0tPlxuICA8ZGl2ICpuZ0lmPVwiZXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgIDwhLS0gU1RBUlQgTWFya2VyIChjZW50ZXJlZCB3aXRoIGRlY29yYXRpdmUgbGluZXMpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHktMSBjcWEtcHgtNCBjcWEtYmctWyNEQkVBRkU4MF1cIiBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCAjQkVEQkZGO1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMxQzM5OEVdIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXdoaXRlc3BhY2Utbm93cmFwXCI+e3sgZ2V0U3RhcnRMYWJlbCgpIH19PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMxQzM5OEVdIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgIDxjcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXIgKm5nRm9yPVwibGV0IHN0ZXAgb2YgbmVzdGVkU3RlcHM7IGxldCBpID0gaW5kZXhcIiBbc3RlcF09XCJzdGVwXCIgW2luZGV4XT1cImlcIlxuICAgICAgICBbc2VsZWN0ZWRdPVwiJGFueShzdGVwKS5zZWxlY3RlZFwiXG4gICAgICAgIFtpc05lc3RlZF09XCJ0cnVlXCIgW2lzSW5zaWRlTG9vcF09XCJ0cnVlXCIgW2lzSW5zaWRlU3RlcEdyb3VwXT1cImlzSW5zaWRlU3RlcEdyb3VwXCIgW2lzUmVvcmRlcl09XCJpc1Jlb3JkZXJcIlxuICAgICAgICBbYWRkU3RlcEJldHdlZW5dPVwiYWRkU3RlcEJldHdlZW5cIlxuICAgICAgICBbZGF0YVByb2ZpbGVPcHRpb25zXT1cImRhdGFQcm9maWxlT3B0aW9uc1wiIFtoYXNNb3JlRGF0YVByb2ZpbGVzXT1cImhhc01vcmVEYXRhUHJvZmlsZXNcIiBbaXNMb2FkaW5nRGF0YVByb2ZpbGVzXT1cImlzTG9hZGluZ0RhdGFQcm9maWxlc1wiXG4gICAgICAgIFtuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXT1cIm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNcIlxuICAgICAgICAobmVzdGVkU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2UoJGV2ZW50LnN0ZXAsICRldmVudC5pbmRleClcIlxuICAgICAgICAoYWRkU3RlcCk9XCJvbkFkZFN0ZXAoKVwiIChhZGRTdGVwRm9yTG9vcCk9XCJvbkFkZFN0ZXBGb3JMb29wRnJvbU5lc3RlZCgkZXZlbnQpXCIgKGRlbGV0ZVN0ZXApPVwib25EZWxldGVTdGVwKCRldmVudClcIlxuICAgICAgICAodG9nZ2xlRXhwYW5kZWQpPVwib25OZXN0ZWRUb2dnbGVFeHBhbmRlZCgkZXZlbnQsIHN0ZXAsIGkpXCJcbiAgICAgICAgKGdyb3VwTmFtZUNoYW5nZSk9XCIkYW55KHN0ZXApLmdyb3VwTmFtZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZGVzY3JpcHRpb24gPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChyZXVzYWJsZUNoYW5nZSk9XCIkYW55KHN0ZXApLnJldXNhYmxlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAob3BlbkV4dGVybmFsKT1cIm9uTmVzdGVkT3BlbkV4dGVybmFsKCRldmVudClcIiAoZWRpdCk9XCJvbk5lc3RlZEVkaXQoJGV2ZW50KVwiXG4gICAgICAgIChsaW5rKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChkdXBsaWNhdGUpPVwib25OZXN0ZWREdXBsaWNhdGUoJGV2ZW50LCBzdGVwKVwiIChkZWxldGUpPVwib25EZWxldGVTdGVwKCRldmVudCwgaSlcIlxuICAgICAgICAodmlld0RldGFpbHMpPVwidmlld0RldGFpbHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGJyYW5jaFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGFkZEJyYW5jaCk9XCJvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaCgkYW55KHN0ZXApLCBpKVwiXG4gICAgICAgIChkZWxldGVCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2goJGFueShzdGVwKSwgJGV2ZW50LCBpKVwiXG4gICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChzdGFydFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5zdGFydFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChlbmRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZW5kU3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoZXZlbnRUeXBlQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZXZlbnRUeXBlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAocGFyYW1ldGVyQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChkbmREcm9wSW5ab25lKT1cImRuZERyb3BJblpvbmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0SW5EZXB0aCk9XCJlZGl0SW5EZXB0aC5lbWl0KCRldmVudClcIlxuICAgICAgICAoYWRkU3RlcEJldHdlZW5DbGljayk9XCJhZGRTdGVwQmV0d2VlbkNsaWNrLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgPC9jcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImlzUmVvcmRlclwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIG5lc3RlZC1zdGVwLWRyb3AtbGlzdFwiXG4gICAgICAgICBbc3R5bGUubWluLWhlaWdodC5weF09XCJuZXN0ZWRTdGVwcy5sZW5ndGggPT09IDAgPyA1MiA6IG51bGxcIlxuICAgICAgICAgW2RuZERyb3B6b25lXT1cIlsnc3RlcCddXCJcbiAgICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgIGRuZERyYWdvdmVyQ2xhc3M9XCJkbmREcmFnb3ZlclwiXG4gICAgICAgICAoZG5kRHJvcCk9XCJvbkRuZERyb3AoJGV2ZW50KVwiPlxuICAgICAgPGRpdiBkbmRQbGFjZWhvbGRlclJlZiBjbGFzcz1cInN0ZXAtZHJhZy1wbGFjZWhvbGRlci1uZXN0ZWQgY3FhLW15LTEgY3FhLW1pbi1oLVs1MHB4XSBjcWEtYm9yZGVyLTIgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzNGNDNFRV0gY3FhLXJvdW5kZWQgY3FhLWJnLVtyZ2JhKDYzLDY3LDIzOCwwLjA4KV0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LXhzXCI+RHJvcCBoZXJlPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdGVwIG9mIG5lc3RlZFN0ZXBzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJuZXN0ZWQtc3RlcC1kcmFnLWl0ZW1cIlxuICAgICAgICAgICBbZG5kRHJhZ2dhYmxlXT1cInN0ZXBcIlxuICAgICAgICAgICBkbmRFZmZlY3RBbGxvd2VkPVwibW92ZVwiXG4gICAgICAgICAgIGRuZFR5cGU9XCJzdGVwXCI+XG4gICAgICAgIDxjcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXIgW3N0ZXBdPVwic3RlcFwiIFtpbmRleF09XCJpXCJcbiAgICAgICAgICBbc2VsZWN0ZWRdPVwiJGFueShzdGVwKS5zZWxlY3RlZFwiXG4gICAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIiBbaXNJbnNpZGVMb29wXT1cInRydWVcIiBbaXNJbnNpZGVTdGVwR3JvdXBdPVwiaXNJbnNpZGVTdGVwR3JvdXBcIiBbaXNSZW9yZGVyXT1cImlzUmVvcmRlclwiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuQWJvdmVdPVwiYWRkU3RlcEJldHdlZW5BYm92ZVwiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuQmVsb3ddPVwiYWRkU3RlcEJldHdlZW5CZWxvd1wiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuXT1cImFkZFN0ZXBCZXR3ZWVuXCJcbiAgICAgICAgICBbZGF0YVByb2ZpbGVPcHRpb25zXT1cImRhdGFQcm9maWxlT3B0aW9uc1wiIFtoYXNNb3JlRGF0YVByb2ZpbGVzXT1cImhhc01vcmVEYXRhUHJvZmlsZXNcIiBbaXNMb2FkaW5nRGF0YVByb2ZpbGVzXT1cImlzTG9hZGluZ0RhdGFQcm9maWxlc1wiXG4gICAgICAgICAgW25hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNdPVwibmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc1wiXG4gICAgICAgICAgKG5lc3RlZFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKCRldmVudC5zdGVwLCAkZXZlbnQuaW5kZXgpXCJcbiAgICAgICAgICAoYWRkU3RlcCk9XCJvbkFkZFN0ZXAoKVwiIChhZGRTdGVwRm9yTG9vcCk9XCJvbkFkZFN0ZXBGb3JMb29wRnJvbU5lc3RlZCgkZXZlbnQpXCIgKGRlbGV0ZVN0ZXApPVwib25EZWxldGVTdGVwKCRldmVudClcIlxuICAgICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChncm91cE5hbWVDaGFuZ2UpPVwiJGFueShzdGVwKS5ncm91cE5hbWUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZGVzY3JpcHRpb24gPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKG9wZW5FeHRlcm5hbCk9XCJvbk5lc3RlZE9wZW5FeHRlcm5hbCgkZXZlbnQpXCIgKGVkaXQpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAobGluayk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZHVwbGljYXRlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChkZWxldGUpPVwib25EZWxldGVTdGVwKCRldmVudCwgaSlcIlxuICAgICAgICAgICh2aWV3RGV0YWlscyk9XCJ2aWV3RGV0YWlscy5lbWl0KCRldmVudClcIlxuICAgICAgICAgIChjb25kaXRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5jb25kaXRpb24gPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGJyYW5jaFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGFkZEJyYW5jaCk9XCJvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaCgkYW55KHN0ZXApLCBpKVwiXG4gICAgICAgICAgKGRlbGV0ZUJyYW5jaCk9XCJvbk5lc3RlZENvbmRpdGlvbkRlbGV0ZUJyYW5jaCgkYW55KHN0ZXApLCAkZXZlbnQsIGkpXCJcbiAgICAgICAgICAodGVzdERhdGFQcm9maWxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkudGVzdERhdGFQcm9maWxlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChzdGFydFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5zdGFydFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGVuZFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5lbmRTdGVwID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChtYXhJdGVyYXRpb25zQ2hhbmdlKT1cIiRhbnkoc3RlcCkubWF4SXRlcmF0aW9ucyA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZXZlbnRUeXBlQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZXZlbnRUeXBlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChwYXJhbWV0ZXJDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuc2VsZWN0ZWQgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChsb2FkTW9yZURhdGFQcm9maWxlcyk9XCJsb2FkTW9yZURhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAoc2VhcmNoRGF0YVByb2ZpbGVzKT1cInNlYXJjaERhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAoZG5kRHJvcEluWm9uZSk9XCJkbmREcm9wSW5ab25lLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChjbGlja0FjdGlvbik9XCJjbGlja0FjdGlvbi5lbWl0KCRldmVudClcIlxuICAgICAgICAoZWRpdEluRGVwdGgpPVwiZWRpdEluRGVwdGguZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGFkZFN0ZXBCZXR3ZWVuQ2xpY2spPVwiYWRkU3RlcEJldHdlZW5DbGljay5lbWl0KCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRW1wdHkgbG9vcDogc2hvdyBwbHVzIGljb24gb24gaG92ZXIgd2hlbiBleHBhbmRlZCBhbmQgbm8gc3RlcHMuXG4gICAgICAgICBXaGVuIHJlbmRlcmVkIGluc2lkZSBhIHN0ZXAgZ3JvdXAgb3Igd2hlbiByZW9yZGVyaW5nLCBoaWRlIHRoaXMgQWRkIGJ1dHRvbiBlbnRpcmVseS4gLS0+XG4gICAgPGRpdiAqbmdJZj1cIm5lc3RlZFN0ZXBzLmxlbmd0aCA9PT0gMCAmJiAhaXNJbnNpZGVTdGVwR3JvdXAgJiYgIWlzUmVvcmRlclwiIGNsYXNzPVwibG9vcC1zdGVwLWVtcHR5IGNxYS1taW4taC1bNTJweF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXBsLTQgY3FhLXByLTRcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkFkZFN0ZXBFbXB0eSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiQWRkIHN0ZXBcIlxuICAgICAgICBjbGFzcz1cImxvb3Atc3RlcC1lbXB0eS1hZGRcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHJlY3QgeD1cIjFcIiB5PVwiMVwiIHdpZHRoPVwiMjEuMTgyMlwiIGhlaWdodD1cIjIyXCIgcng9XCIxMC41OTExXCIgZmlsbD1cIndoaXRlXCIgLz5cbiAgICAgICAgICA8cmVjdCB4PVwiMVwiIHk9XCIxXCIgd2lkdGg9XCIyMS4xODIyXCIgaGVpZ2h0PVwiMjJcIiByeD1cIjEwLjU5MTFcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIC8+XG4gICAgICAgICAgPHBhdGggZD1cIk04LjUgMTJIMTUuNVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgOC41VjE1LjVcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRU5EIE1hcmtlciAoY2VudGVyZWQgd2l0aCBkZWNvcmF0aXZlIGxpbmVzKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LTEgY3FhLXB4LTQgY3FhLWJnLVsjREJFQUZFODBdXCIgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgI0JFREJGRjtcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtc2VsZi1zdHJldGNoIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjMUMzOThFXSBjcWEtb3BhY2l0eS00MFwiIHN0eWxlPVwibWluLXdpZHRoOiAyMHB4O1wiPjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMxQzM5OEVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS13aGl0ZXNwYWNlLW5vd3JhcFwiPnt7IGdldEVuZExhYmVsKCkgfX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXNlbGYtc3RyZXRjaCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzFDMzk4RV0gY3FhLW9wYWNpdHktNDBcIiBzdHlsZT1cIm1pbi13aWR0aDogMjBweDtcIj48L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19
|
|
1338
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvbG9vcC1zdGVwL2xvb3Atc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2xvb3Atc3RlcC9sb29wLXN0ZXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsU0FBUyxFQUFpQyxNQUFNLGVBQWUsQ0FBQztBQUNuSixPQUFPLEVBQTBCLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JFLE9BQU8sRUFBK0csU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEssT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7QUFLckUsTUFBTSxzQkFBc0IsR0FBRzs7Ozs7Ozs7Ozs7Ozs7OztDQWdCOUIsQ0FBQztBQUVGLE1BQU0sNEJBQTRCLEdBQUc7Ozs7Ozs7Ozs7Q0FVcEMsQ0FBQztBQVdGLE1BQU0sT0FBTyx5QkFBeUI7SUEwSHBDLFlBQ1UsRUFBZSxFQUNmLEdBQXNCO1FBRHRCLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXpIdkIsYUFBUSxHQUFvQixLQUFLLENBQUM7UUFTbEMsZ0JBQVcsR0FBeUIsRUFBRSxDQUFDO1FBQ3ZDLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFDekIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGtCQUFh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ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERuZERyb3BFdmVudCB9IGZyb20gJ25neC1kcmFnLWRyb3AnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9vcFN0ZXBDb25maWcsIFRlc3RDYXNlU3RlcENvbmZpZywgTm9ybWFsU3RlcENvbmZpZywgQ29uZGl0aW9uU3RlcENvbmZpZywgU3RlcEdyb3VwQ29uZmlnLCBDb25kaXRpb25CcmFuY2gsIFN0ZXBUeXBlcyB9IGZyb20gJy4uL3Rlc3QtY2FzZS1zdGVwLm1vZGVscyc7XG5pbXBvcnQgeyBTVEVQX1JPV19BQ1RJT05TX1NUWUxFUyB9IGZyb20gJy4uL3N0ZXAtcm93LWFjdGlvbnMuc3R5bGVzJztcbmltcG9ydCB7IERhdGFQcm9maWxlT3B0aW9uIH0gZnJvbSAnLi4vLi4vc3RlcC1idWlsZGVyL3N0ZXAtYnVpbGRlci1sb29wL3N0ZXAtYnVpbGRlci1sb29wLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBWaWV3RGV0YWlsc1BheWxvYWQgfSBmcm9tICcuLi9zdGVwLWRldGFpbHMtbW9kYWwvc3RlcC1kZXRhaWxzLW1vZGFsLWRhdGEnO1xuaW1wb3J0IHsgQ3FhQXV0b2NvbXBsZXRlT3B0aW9uIH0gZnJvbSAnLi4vLi4vYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5tb2RlbCc7XG5cbmNvbnN0IExPT1BfU1RFUF9FTVBUWV9TVFlMRVMgPSBgXG4gIC8qIEVtcHR5IGxvb3A6IHBsdXMgaWNvbiBhbHdheXMgdmlzaWJsZSB3aGVuIGV4cGFuZGVkIGFuZCBubyBzdGVwcyAqL1xuICAubG9vcC1zdGVwLWVtcHR5IHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG4gIC5sb29wLXN0ZXAtZW1wdHktYWRkIHtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlcjogMDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgY29sb3I6ICMzRjQzRUU7XG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cyBlYXNlO1xuICB9XG4gIC5sb29wLXN0ZXAtZW1wdHktYWRkOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAwLjk7XG4gIH1cbmA7XG5cbmNvbnN0IExPT1BfU1RFUF9GT1JfRElTUExBWV9TVFlMRVMgPSBgXG4gIC5mb3ItbG9vcC1yYW5nZS1yb3cge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiAwLjVyZW07XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICB9XG4gIC5mb3ItbG9vcC1yYW5nZS1yb3cgLmZvci1sb29wLXJhbmdlLXBhcnQgKyAuZm9yLWxvb3AtcmFuZ2UtcGFydCB7XG4gICAgbWFyZ2luLWxlZnQ6IDAuMjVyZW07XG4gIH1cbmA7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtdGVzdC1jYXNlLWxvb3Atc3RlcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9sb29wLXN0ZXAuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIHN0eWxlczogW1xuICAgIFNURVBfUk9XX0FDVElPTlNfU1RZTEVTLFxuICAgIExPT1BfU1RFUF9FTVBUWV9TVFlMRVMsXG4gICAgTE9PUF9TVEVQX0ZPUl9ESVNQTEFZX1NUWUxFUyxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdENhc2VMb29wU3RlcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29uZmlnITogTG9vcFN0ZXBDb25maWc7XG4gIEBJbnB1dCgpIGlkITogc3RyaW5nO1xuICBASW5wdXQoKSBsb29wVHlwZTogJ2ZvcicgfCAnd2hpbGUnID0gJ2Zvcic7XG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXIhOiBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBBcnJheSBpbmRleCBmcm9tIHBhcmVudCByZW5kZXJlciAtIHVzZSB0aGlzIGZvciBlZGl0SW5EZXB0aCBpbnN0ZWFkIG9mIHN0ZXBOdW1iZXIgKHN0ZXBOdW1iZXIgXCIxMC4zXCIgcGFyc2VzIHRvIDEwKSAqL1xuICBASW5wdXQoKSBpbmRleD86IG51bWJlcjtcbiAgQElucHV0KCkgY29uZGl0aW9uPzogc3RyaW5nO1xuICBASW5wdXQoKSBtYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuICBASW5wdXQoKSB0ZXN0RGF0YVByb2ZpbGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0YXJ0U3RlcD86IG51bWJlcjtcbiAgQElucHV0KCkgZW5kU3RlcD86IG51bWJlcjtcbiAgQElucHV0KCkgbmVzdGVkU3RlcHM6IFRlc3RDYXNlU3RlcENvbmZpZ1tdID0gW107XG4gIEBJbnB1dCgpIGV4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgaXNOZXN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNJbnNpZGVMb29wOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzSW5zaWRlU3RlcEdyb3VwOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzUmVvcmRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0R1cGxpY2F0aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciB0aGUgZGF0YSBwcm9maWxlIGRyb3Bkb3duIC0gYWNjZXB0cyBEYXRhUHJvZmlsZU9wdGlvbiBvYmplY3RzICovXG4gIEBJbnB1dCgpIGRhdGFQcm9maWxlT3B0aW9uczogRGF0YVByb2ZpbGVPcHRpb25bXSA9IFtdO1xuICAvKiogSW5kaWNhdGVzIGlmIG1vcmUgZGF0YSBwcm9maWxlcyBhcmUgYXZhaWxhYmxlIGZvciBsb2FkaW5nICovXG4gIEBJbnB1dCgpIGhhc01vcmVEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIExvYWRpbmcgc3RhdGUgZm9yIGRhdGEgcHJvZmlsZXMgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciBuYXR1cmFsIHRleHQgYWN0aW9ucyAoZm9yIHdoaWxlIGxvb3AgY29uZGl0aW9uKSAqL1xuICBASW5wdXQoKSBuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAvKiogRnVuY3Rpb24gdG8gcHJvY2VzcyB0ZW1wbGF0ZSB2YXJpYWJsZXMgZm9yIHdoaWxlIGNvbmRpdGlvbiAoc2FtZSBhcyBjb25kaXRpb24tc3RlcCkgKi9cbiAgQElucHV0KCkgc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXM6ICh0ZW1wbGF0ZTogYW55KSA9PiBhbnlbXSA9ICgpID0+IFtdO1xuICAvKiogU2hvdyBcIkFkZCBTdGVwIEJldHdlZW5cIiBidXR0b24gYWJvdmUgbmVzdGVkIHN0ZXBzICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBCZXR3ZWVuQWJvdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFNob3cgXCJBZGQgU3RlcCBCZXR3ZWVuXCIgYnV0dG9uIGJlbG93IG5lc3RlZCBzdGVwcyAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbkJlbG93OiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYWRkU3RlcEJldHdlZW5BYm92ZSBhbmQgYWRkU3RlcEJldHdlZW5CZWxvdyBpbnN0ZWFkLiBJZiBzZXQsIGFwcGxpZXMgdG8gYm90aCBidXR0b25zLiAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlZGl0YWJsZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgQE91dHB1dCgpIHRvZ2dsZUV4cGFuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7Y29uZmlnOiBMb29wU3RlcENvbmZpZywgZXhwYW5kZWQ6IGJvb2xlYW59PigpO1xuICBAT3V0cHV0KCkgdGVzdERhdGFQcm9maWxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBzdGFydFN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGVuZFN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGNvbmRpdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgbWF4SXRlcmF0aW9uc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgbmVzdGVkU3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXIgfT4oKTtcbiAgLyoqIEVtaXRzIHZvaWQgd2hlbiBhZGQgaXMgZnJvbSBuZXN0ZWQgY29udGVudDsgZW1pdHMgeyBsb29wU3RlcENvbmZpZyB9IHdoZW4gZW1wdHktc3RhdGUgYWRkIGlzIGNsaWNrZWQgKHNhbWUgYmVoYXZpb3VyIGFzIGFkZC1zdGVwLWJldHdlZW4pLiAqL1xuICBAT3V0cHV0KCkgYWRkU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZCB8IHsgbG9vcFN0ZXBDb25maWc6IExvb3BTdGVwQ29uZmlnIH0+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBkdXBsaWNhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBtb3JlT3B0aW9ucyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHZpZXdEZXRhaWxzID0gbmV3IEV2ZW50RW1pdHRlcjxWaWV3RGV0YWlsc1BheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSBlZGl0SW5EZXB0aCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXI7IHRlbXBsYXRlT3ZlcnJpZGU/OiBhbnkgfT4oKTtcbiAgQE91dHB1dCgpIGVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBkbmREcm9wSW5ab25lID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBEbmREcm9wRXZlbnQ7IHRhcmdldExpc3Q6IFRlc3RDYXNlU3RlcENvbmZpZ1tdIH0+KCk7XG4gIC8qKiBFbWl0IHdoZW4gbW9yZSBkYXRhIHByb2ZpbGVzIG5lZWQgdG8gYmUgbG9hZGVkICovXG4gIEBPdXRwdXQoKSBsb2FkTW9yZURhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdCB3aGVuIGRhdGEgcHJvZmlsZSBzZWFyY2ggcXVlcnkgY2hhbmdlcyAqL1xuICBAT3V0cHV0KCkgc2VhcmNoRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0IHdoZW4gc3RlcCBpcyB1cGRhdGVkIChBcHBseSBidXR0b24gY2xpY2tlZCBpbiBlZGl0IG1vZGUpICovXG4gIEBPdXRwdXQoKSBzdGVwVXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxMb29wU3RlcENvbmZpZz4oKTtcbiAgLyoqIFJlLWVtaXQgd2hlbiBhIG5lc3RlZCBzdGVwIChlLmcuIG5vcm1hbC1zdGVwKSBlbWl0cyBjbGlja0FjdGlvbiAoZS5nLiBlbGVtZW50L2xhYmVsIGNsaWNrIGZvciBwb3B1cCkgKi9cbiAgQE91dHB1dCgpIGNsaWNrQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBNb3VzZUV2ZW50OyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcgfT4oKTtcbiAgLyoqIFJlLWVtaXQgYWRkU3RlcEJldHdlZW5DbGljayBmcm9tIG5lc3RlZCByZW5kZXJlcnMgKi9cbiAgQE91dHB1dCgpIGFkZFN0ZXBCZXR3ZWVuQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHtzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGluZGV4OiBudW1iZXIsIHBvc2l0aW9uOiAnQUJPVkUnIHwgJ0JFTE9XJ30+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGVCcmFuY2ggPSBuZXcgRXZlbnRFbWl0dGVyPENvbmRpdGlvbkJyYW5jaD4oKTtcbiAgLyoqIFJlLWVtaXQgd2hlbiBuZXN0ZWQgc3RlcCBncm91cCBlbWl0cyBvcGVuRXh0ZXJuYWwgKHJlZGlyZWN0IHRvIHN0ZXAgZ3JvdXAgaW4gbmV3IHRhYikgKi9cbiAgQE91dHB1dCgpIG9wZW5FeHRlcm5hbCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcgfT4oKTtcblxuICBvbkRuZERyb3AoZXZlbnQ6IERuZERyb3BFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZG5kRHJvcEluWm9uZS5lbWl0KHsgZXZlbnQsIHRhcmdldExpc3Q6IHRoaXMubmVzdGVkU3RlcHMgfSk7XG4gIH1cblxuICAvKiogRW1pdCBjbGlja0FjdGlvbiB3aGVuIHVzZXIgY2xpY2tzIG9uIGxvb3AgZGlzcGxheSBiYWRnZXMgKGVsZW1lbnQsIHRlc3RfZGF0YSwgZXRjLikgc28gcGFyZW50IGNhbiBvcGVuIGVkaXQgbW9kYWxzICovXG4gIG9uTG9vcEFjdGlvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jbGlja0FjdGlvbi5lbWl0KHsgZXZlbnQsIHN0ZXA6IHRoaXMuY29uZmlnIH0pO1xuICB9XG5cbiAgLyoqIEV4cG9zZSBnbG9iYWwgY29uc3RydWN0b3JzIGZvciB0ZW1wbGF0ZSAoQW5ndWxhciB0ZW1wbGF0ZXMgZG9uJ3QgaGF2ZSBTdHJpbmcvTnVtYmVyKSAqL1xuICByZWFkb25seSBzdHJpbmdGbiA9IFN0cmluZztcbiAgcmVhZG9ubHkgbnVtYmVyRm4gPSBOdW1iZXI7XG5cbiAgLyoqIFdoZW4gdHJ1ZSwgaGVhZGVyIHNob3dzIGlubGluZSBlZGl0IGZvcm0gKGRyb3Bkb3ducywgaW5wdXRzLCBDYW5jZWwvQXBwbHkpICovXG4gIGlzRWRpdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBGb3JtIGZvciBlZGl0IG1vZGU7IGJvdW5kIHRvIGNxYS1keW5hbWljLXNlbGVjdCAoc2FtZSBwYXR0ZXJuIGFzIGRlZmF1bHQgc3RvcmllcykgKi9cbiAgZWRpdEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIENhY2hlZCBzZWxlY3QgY29uZmlncyAoc3RhYmxlIHJlZnMgdG8gYXZvaWQgY2hhbmdlLWRldGVjdGlvbiBsb29wcykgKi9cbiAgZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgdGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBzdGFydFN0ZXBTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGVuZFN0ZXBTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGNvbmRpdGlvblNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgLyoqIFdoaWxlIGxvb3A6IGNvbmZpZyBmb3IgYXV0b2NvbXBsZXRlIG9wdGlvbnMgKFdISUxFX0NPTkRJVElPTiBvbmx5KSAqL1xuICB3aGlsZUNvbmRpdGlvblNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuICAvKiogU2VsZWN0ZWQgdGVtcGxhdGUgZm9yIHdoaWxlIGNvbmRpdGlvbiAoc2FtZSBwYXR0ZXJuIGFzIGNvbmRpdGlvbi1zdGVwKSAqL1xuICBzZWxlY3RlZFRlbXBsYXRlOiBhbnkgPSBudWxsO1xuICAvKiogVGVtcGxhdGUgdmFyaWFibGVzIGZvciB3aGlsZSBjb25kaXRpb24gKi9cbiAgdGVtcGxhdGVWYXJpYWJsZXM6IGFueVtdID0gW107XG4gIC8qKiBGb3JtIGdyb3VwIGZvciB0ZW1wbGF0ZSB2YXJpYWJsZXMgKi9cbiAgdGVtcGxhdGVWYXJpYWJsZXNGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBEZWZhdWx0IG1heCBmb3IgTG9vcCBTdGFydCAvIEVuZCB3aGVuIG5vIHByb2ZpbGUgc2VsZWN0ZWQgKG9wdGlvbnMgMS4uMTApICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfTE9PUF9PUFRJT05TX01BWCA9IDEwO1xuXG4gIEBWaWV3Q2hpbGQoJ3ZpZXdEZXRhaWxzVHJpZ2dlcicsIHsgc3RhdGljOiBmYWxzZSB9KSB2aWV3RGV0YWlsc1RyaWdnZXI/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAvKiogTG9jYWwgY29weSBvZiB2YWx1ZXMgd2hpbGUgZWRpdGluZyAoZm9yIENhbmNlbCByZXZlcnQpICovXG4gIHByaXZhdGUgZWRpdFNuYXBzaG90OiB7XG4gICAgdGVzdERhdGFQcm9maWxlPzogc3RyaW5nO1xuICAgIHN0YXJ0U3RlcD86IG51bWJlcjtcbiAgICBlbmRTdGVwPzogbnVtYmVyO1xuICAgIGNvbmRpdGlvbj86IHN0cmluZztcbiAgICBtYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuICAgIHNlbGVjdGVkVGVtcGxhdGU/OiBhbnk7XG4gICAgdGVtcGxhdGVWYXJpYWJsZXM/OiBhbnlbXTtcbiAgICBjb25kaXRpb25UZW1wbGF0ZUZvcm1WYWx1ZT86IGFueTtcbiAgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmlkID0gdGhpcy5jb25maWcuaWQ7XG4gICAgICB0aGlzLmxvb3BUeXBlID0gdGhpcy5jb25maWcubG9vcFR5cGU7XG4gICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLmNvbmZpZy5zdGVwTnVtYmVyO1xuICAgICAgdGhpcy5jb25kaXRpb24gPSB0aGlzLmNvbmZpZy5jb25kaXRpb247XG4gICAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB0aGlzLmNvbmZpZy5tYXhJdGVyYXRpb25zO1xuICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLmdldFN0b3JlZFRlc3REYXRhUHJvZmlsZUxhYmVsKCk7XG4gICAgICB0aGlzLnN0YXJ0U3RlcCA9IHRoaXMuY29uZmlnLnN0YXJ0U3RlcDtcbiAgICAgIHRoaXMuZW5kU3RlcCA9IHRoaXMuY29uZmlnLmVuZFN0ZXA7XG4gICAgICB0aGlzLm5lc3RlZFN0ZXBzID0gdGhpcy5jb25maWcubmVzdGVkU3RlcHMgfHwgW107XG4gICAgICB0aGlzLmV4cGFuZGVkID0gdGhpcy5jb25maWcuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLmV4cGFuZGVkIDogdHJ1ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSAodGhpcy5jb25maWcgYXMgYW55KS5zZWxlY3RlZCB8fCBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5idWlsZEVkaXRGb3JtKCk7XG4gICAgdGhpcy5idWlsZFNlbGVjdENvbmZpZ3MoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10gJiYgdGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSAodGhpcy5jb25maWcgYXMgYW55KS5zZWxlY3RlZCB8fCBmYWxzZTtcbiAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGhpcy5nZXRTdG9yZWRUZXN0RGF0YVByb2ZpbGVMYWJlbCgpO1xuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTtcbiAgICAgIH1cbiAgICAgIC8vIEZPUiBsb29wOiB3aGVuIHN0ZXAgY29uZmlnIGhhcyBmb3JMb29wVGVzdERhdGFJZC9mb3JMb29wU3RhcnRJbmRleC9mb3JMb29wRW5kSW5kZXgsIHN5bmMgZm9ybSBhbmQgcmVmcmVzaCBzZWxlY3QgY29uZmlncyBzbyBkcm9wZG93bnMgc2hvdyBzZWxlY3RlZFxuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRm9yTG9vcFNlbGVjdENvbmZpZ3NTZWxlY3RlZFZhbHVlcygpO1xuICAgICAgICBpZiAodGhpcy5lZGl0Rm9ybSkgdGhpcy5zeW5jRm9yTG9vcEVkaXRGb3JtRnJvbUNvbmZpZygpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydkYXRhUHJvZmlsZU9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlRGF0YVByb2ZpbGVzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRGF0YVByb2ZpbGVzJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk7XG4gICAgICAvLyBXaGVuIGRhdGEgcHJvZmlsZXMgbG9hZCBpbiBlZGl0IG1vZGUsIHN5bmMgZm9ybSB2YWx1ZSBzbyBkcm9wZG93biBzaG93cyBzZWxlY3RlZCAoZm9yTG9vcFRlc3REYXRhSWQgb3IgdGVzdERhdGFQcm9maWxlKVxuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InICYmIHRoaXMuZWRpdEZvcm0gJiYgdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgICAgIGlmIChjZmc/LmZvckxvb3BUZXN0RGF0YUlkICE9IG51bGwgfHwgdGhpcy50ZXN0RGF0YVByb2ZpbGUpIHRoaXMuc3luY0Zvckxvb3BFZGl0Rm9ybUZyb21Db25maWcoKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvblNlbGVjdENvbmZpZygpO1xuICAgICAgLy8gV2hlbiBvcHRpb25zIGxvYWQsIHBvcHVsYXRlIGNvbmRpdGlvbiArIHRlbXBsYXRlIGZyb20gbmF0dXJhbFRleHRBY3Rpb25JZCAoc2FtZSBhcyBjb25kaXRpb24tc3RlcClcbiAgICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnICYmIHRoaXMuZWRpdEZvcm0gJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogRGVyaXZlIGZvck9wdGlvblR5cGUgZm9yIEZPUiBsb29wIGZyb20gY29uZmlnIHNvIGRyb3Bkb3duIHNob3dzIGV4aXN0aW5nIHNlbGVjdGlvbiAqL1xuICBwcml2YXRlIGdldEZvck9wdGlvblR5cGVGcm9tQ29uZmlnKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGhhc1Rlc3REYXRhSWQgPSBjZmc/LmZvckxvb3BUZXN0RGF0YUlkICE9IG51bGwgfHwgY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8udGVzdERhdGFJZCAhPSBudWxsO1xuICAgIGlmIChoYXNUZXN0RGF0YUlkIHx8IHRoaXMudGVzdERhdGFQcm9maWxlKSByZXR1cm4gJ3Rlc3QtZGF0YSc7XG4gICAgY29uc3QgaGFzRml4ZWQgPSBjZmc/LmZvckxvb3BTdGFydEluZGV4ICE9IG51bGwgfHwgY2ZnPy5mb3JMb29wRW5kSW5kZXggIT0gbnVsbFxuICAgICAgfHwgY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFN0YXJ0SW5kZXggIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wRW5kSW5kZXggIT0gbnVsbFxuICAgICAgfHwgY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnN0YXJ0SW5kZXggIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uZW5kSW5kZXggIT0gbnVsbDtcbiAgICBpZiAodGhpcy5zdGFydFN0ZXAgIT0gbnVsbCB8fCB0aGlzLmVuZFN0ZXAgIT0gbnVsbCB8fCBoYXNGaXhlZCkgcmV0dXJuICdmaXhlZCc7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogVGVzdCBEYXRhIFByb2ZpbGUgZHJvcGRvd24gdmFsdWU6IHByZWZlciBmb3JMb29wVGVzdERhdGFJZCBmcm9tIGNvbmZpZyAob3IgZGF0YU1hcEpzb24vZGF0YU1hcEJlYW4pLiBVc2Ugb3B0aW9uLmlkIHdoZW4gb3B0aW9ucyBsb2FkZWQgc28gdHlwZSBtYXRjaGVzIHNlbGVjdC4gKi9cbiAgcHJpdmF0ZSBnZXRUZXN0RGF0YVByb2ZpbGVGb3JtVmFsdWUoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50Rm9ybVZhbHVlID0gdGhpcy5lZGl0Rm9ybT8uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKT8udmFsdWU7XG4gICAgaWYgKGN1cnJlbnRGb3JtVmFsdWUgIT09IG51bGwgJiYgY3VycmVudEZvcm1WYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGN1cnJlbnRGb3JtVmFsdWUgIT09ICcnKSB7XG4gICAgICByZXR1cm4gY3VycmVudEZvcm1WYWx1ZSBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgfVxuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBpZEZyb21Db25maWcgPSBjZmc/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy50ZXN0RGF0YUlkO1xuICAgIC8vIFdoZW4gd2UgaGF2ZSBvcHRpb25zLCByZXNvbHZlIGJ5IGlkIHNvIGZvcm0gdmFsdWUgbWF0Y2hlcyBvcHRpb24uaWQgKHN0cmljdCBlcXVhbGl0eSBpbiBkeW5hbWljLXNlbGVjdClcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgJiYgdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgaWYgKGlkRnJvbUNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgICAgICBvID0+IG8uaWQgPT09IGlkRnJvbUNvbmZpZyB8fCBTdHJpbmcoby5pZCkgPT09IFN0cmluZyhpZEZyb21Db25maWcpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoLmlkO1xuICAgICAgICByZXR1cm4gaWRGcm9tQ29uZmlnIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZXN0RGF0YVByb2ZpbGUgPz8gJyc7XG4gICAgICBpZiAodmFsdWUgIT09ICcnKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgICAgICBvID0+IG8ubmFtZSA9PT0gdmFsdWUgfHwgU3RyaW5nKG8uaWQpID09PSBTdHJpbmcodmFsdWUpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoLmlkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICB9XG4gICAgaWYgKGlkRnJvbUNvbmZpZyAhPSBudWxsKSByZXR1cm4gaWRGcm9tQ29uZmlnIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICByZXR1cm4gKHRoaXMudGVzdERhdGFQcm9maWxlID8/ICcnKSBhcyBzdHJpbmcgfCBudW1iZXI7XG4gIH1cblxuICAvKiogTG9vcCBTdGFydCBkcm9wZG93biB2YWx1ZTogcHJlZmVyIGZvckxvb3BTdGFydEluZGV4IGZyb20gY29uZmlnIChvciBkYXRhTWFwSnNvbi9kYXRhTWFwQmVhbiksIGVsc2Ugc3RhcnRTdGVwICovXG4gIHByaXZhdGUgZ2V0TG9vcFN0YXJ0Rm9ybVZhbHVlKCk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGN1cnJlbnRGb3JtVmFsdWUgPSB0aGlzLmVkaXRGb3JtPy5nZXQoJ3N0YXJ0U3RlcCcpPy52YWx1ZTtcbiAgICBpZiAoY3VycmVudEZvcm1WYWx1ZSAhPT0gbnVsbCAmJiBjdXJyZW50Rm9ybVZhbHVlICE9PSB1bmRlZmluZWQpIHJldHVybiBOdW1iZXIoY3VycmVudEZvcm1WYWx1ZSk7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHYgPSBjZmc/LmZvckxvb3BTdGFydEluZGV4ID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BTdGFydEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5zdGFydEluZGV4O1xuICAgIGlmICh2ICE9IG51bGwpIHJldHVybiBOdW1iZXIodik7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRTdGVwID8/IG51bGw7XG4gIH1cblxuICAvKiogTG9vcCBFbmQgZHJvcGRvd24gdmFsdWU6IHByZWZlciBmb3JMb29wRW5kSW5kZXggZnJvbSBjb25maWcgKG9yIGRhdGFNYXBKc29uL2RhdGFNYXBCZWFuKSwgZWxzZSBlbmRTdGVwICovXG4gIHByaXZhdGUgZ2V0TG9vcEVuZEZvcm1WYWx1ZSgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBjdXJyZW50Rm9ybVZhbHVlID0gdGhpcy5lZGl0Rm9ybT8uZ2V0KCdlbmRTdGVwJyk/LnZhbHVlO1xuICAgIGlmIChjdXJyZW50Rm9ybVZhbHVlICE9PSBudWxsICYmIGN1cnJlbnRGb3JtVmFsdWUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIE51bWJlcihjdXJyZW50Rm9ybVZhbHVlKTtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgdiA9IGNmZz8uZm9yTG9vcEVuZEluZGV4ID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BFbmRJbmRleCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uZW5kSW5kZXg7XG4gICAgaWYgKHYgIT0gbnVsbCkgcmV0dXJuIE51bWJlcih2KTtcbiAgICByZXR1cm4gdGhpcy5lbmRTdGVwID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRWRpdEZvcm0oKTogdm9pZCB7XG4gICAgLy8gRm9yIHdoaWxlIGxvb3A6IGlmIGNvbmZpZyBoYXMgbmF0dXJhbFRleHRBY3Rpb25JZCBhbmQgb3B0aW9ucyBhcmUgYWxyZWFkeSBsb2FkZWQsIHVzZSB0aGVtIGZvciBpbml0aWFsIGNvbmRpdGlvbiArIHRlbXBsYXRlXG4gICAgbGV0IGNvbmRpdGlvblZhbHVlID0gdGhpcy5jb25kaXRpb24gPz8gJyc7XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIGNvbnN0IHBvcHVsYXRlZCA9IHRoaXMucG9wdWxhdGVXaGlsZUNvbmRpdGlvbkZyb21OYXR1cmFsVGV4dEFjdGlvbklkKCk7XG4gICAgICBpZiAocG9wdWxhdGVkPy5jb25kaXRpb24gIT0gbnVsbCkge1xuICAgICAgICBjb25kaXRpb25WYWx1ZSA9IHBvcHVsYXRlZC5jb25kaXRpb247XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEZvciBGT1IgbG9vcDogaW5pdGlhbCBmb3JtIHZhbHVlcyBzbyBkcm9wZG93bnMgc2hvdyBleGlzdGluZyBzZWxlY3Rpb24gKGZvck9wdGlvblR5cGUsIGZvckxvb3BUZXN0RGF0YUlkL3Rlc3REYXRhUHJvZmlsZSwgZm9yTG9vcFN0YXJ0SW5kZXgvZm9yTG9vcEVuZEluZGV4KVxuICAgIGNvbnN0IGZvck9wdGlvblR5cGUgPSB0aGlzLmdldEZvck9wdGlvblR5cGVGcm9tQ29uZmlnKCk7XG4gICAgY29uc3QgdGVzdERhdGFQcm9maWxlVmFsdWUgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0VGVzdERhdGFQcm9maWxlRm9ybVZhbHVlKCkgOiAodGhpcy50ZXN0RGF0YVByb2ZpbGUgPz8gJycpO1xuICAgIGNvbnN0IGxvb3BTdGFydFZhbHVlID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldExvb3BTdGFydEZvcm1WYWx1ZSgpIDogKHRoaXMuc3RhcnRTdGVwID8/IG51bGwpO1xuICAgIGNvbnN0IGxvb3BFbmRWYWx1ZSA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gdGhpcy5nZXRMb29wRW5kRm9ybVZhbHVlKCkgOiAodGhpcy5lbmRTdGVwID8/IG51bGwpO1xuICAgIHRoaXMuZWRpdEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGZvck9wdGlvblR5cGU6IFtmb3JPcHRpb25UeXBlIGFzIHN0cmluZyB8IG51bGxdLFxuICAgICAgdGVzdERhdGFQcm9maWxlOiBbdGVzdERhdGFQcm9maWxlVmFsdWVdLFxuICAgICAgc3RhcnRTdGVwOiBbbG9vcFN0YXJ0VmFsdWUgYXMgbnVtYmVyIHwgbnVsbF0sXG4gICAgICBlbmRTdGVwOiBbbG9vcEVuZFZhbHVlIGFzIG51bWJlciB8IG51bGxdLFxuICAgICAgY29uZGl0aW9uOiBbY29uZGl0aW9uVmFsdWVdLFxuICAgICAgbWF4SXRlcmF0aW9uczogW3RoaXMubWF4SXRlcmF0aW9ucyA/PyA1XSxcbiAgICB9KTtcbiAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQb3B1bGF0ZSBjb25kaXRpb24sIHNlbGVjdGVkVGVtcGxhdGUgYW5kIHRlbXBsYXRlIHZhcmlhYmxlcyBmcm9tIGNvbmZpZy5uYXR1cmFsVGV4dEFjdGlvbklkIHdoZW4gb3B0aW9ucyBhcmUgYXZhaWxhYmxlLlxuICAgKiBSZXR1cm5zIHsgY29uZGl0aW9uIH0gaWYgYSBtYXRjaCB3YXMgZm91bmQgc28gYnVpbGRFZGl0Rm9ybSBjYW4gc2V0IGluaXRpYWwgZm9ybSB2YWx1ZS5cbiAgICovXG4gIHByaXZhdGUgcG9wdWxhdGVXaGlsZUNvbmRpdGlvbkZyb21OYXR1cmFsVGV4dEFjdGlvbklkKCk6IHsgY29uZGl0aW9uOiBzdHJpbmcgfSB8IG51bGwge1xuICAgIGNvbnN0IGNvbmZpZ1dpdGhJZCA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBpZiAoIWNvbmZpZ1dpdGhJZD8ubmF0dXJhbFRleHRBY3Rpb25JZCB8fCAhdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXMgYW55W10pLmZpbmQoXG4gICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQpXG4gICAgKTtcbiAgICBpZiAoIW1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbmF0dXJhbFRleHQgPSBtYXRjaGluZ09wdGlvbi5uYXR1cmFsVGV4dCA/PyBtYXRjaGluZ09wdGlvbi5uYW1lID8/IG1hdGNoaW5nT3B0aW9uLnZhbHVlID8/ICcnO1xuICAgIGlmICghbmF0dXJhbFRleHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNvbmRpdGlvbiA9IG5hdHVyYWxUZXh0O1xuICAgIGNvbnN0IGZ1bGxUZW1wbGF0ZSA9IG1hdGNoaW5nT3B0aW9uLnRlbXBsYXRlIHx8IG1hdGNoaW5nT3B0aW9uO1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICBpZiAoZnVsbFRlbXBsYXRlPy52YXJpYWJsZXMpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKGZ1bGxUZW1wbGF0ZSkgfHwgW107XG4gICAgICB0aGlzLmJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHJldHVybiB7IGNvbmRpdGlvbjogbmF0dXJhbFRleHQgfTtcbiAgfVxuXG4gIC8qKiBSZWJ1aWxkIGNvbmRpdGlvbiArIHRlbXBsYXRlIHN0YXRlIHdoZW4gbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyBsb2FkIG9yIGNvbmZpZyBjaGFuZ2VzIChzYW1lIGFzIGNvbmRpdGlvbi1zdGVwKS4gKi9cbiAgcHJpdmF0ZSByZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRGb3JtIHx8IHRoaXMubG9vcFR5cGUgIT09ICd3aGlsZScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnV2l0aElkID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGlmICghY29uZmlnV2l0aElkPy5uYXR1cmFsVGV4dEFjdGlvbklkIHx8ICF0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXMgYW55W10pLmZpbmQoXG4gICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQpXG4gICAgKTtcbiAgICBpZiAoIW1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gbWF0Y2hpbmdPcHRpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdPcHRpb24ubmFtZSA/PyBtYXRjaGluZ09wdGlvbi52YWx1ZSA/PyAnJztcbiAgICBpZiAobmF0dXJhbFRleHQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdjb25kaXRpb24nKT8udmFsdWUgPz8gJyc7XG4gICAgICBpZiAoIWN1cnJlbnRWYWx1ZSB8fCBjdXJyZW50VmFsdWUgIT09IG5hdHVyYWxUZXh0KSB7XG4gICAgICAgIHRoaXMuZWRpdEZvcm0uZ2V0KCdjb25kaXRpb24nKT8uc2V0VmFsdWUobmF0dXJhbFRleHQpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25kaXRpb24gPSBuYXR1cmFsVGV4dDtcbiAgICB9XG4gICAgY29uc3QgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gZnVsbFRlbXBsYXRlO1xuICAgIGlmIChmdWxsVGVtcGxhdGU/LnZhcmlhYmxlcykge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMoZnVsbFRlbXBsYXRlKSB8fCBbXTtcbiAgICAgIHRoaXMuYnVpbGRUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IFtdO1xuICAgIH1cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogQnVpbGQgc2VsZWN0IGNvbmZpZ3Mgb25jZSAoc2FtZSBvcHRpb24gc2hhcGUgYXMgZGVmYXVsdCBzdG9yaWVzOiBpZCArIG5hbWUpOyBGT1IgbG9vcCBhZGRzIHNlbGVjdGVkVmFsdWUgZnJvbSBzdGVwICovXG4gIHByaXZhdGUgYnVpbGRTZWxlY3RDb25maWdzKCk6IHZvaWQge1xuICAgIHRoaXMuZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2Zvck9wdGlvblR5cGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3Qgb3B0aW9uJyxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGlkOiAndGVzdC1kYXRhJywgdmFsdWU6ICd0ZXN0LWRhdGEnLCBuYW1lOiAnVGVzdCBEYXRhIFByb2ZpbGUnLCBsYWJlbDogJ1Rlc3QgRGF0YSBQcm9maWxlJyB9LFxuICAgICAgICB7IGlkOiAnZml4ZWQnLCB2YWx1ZTogJ2ZpeGVkJywgbmFtZTogJ0ZpeGVkIGNvdW50JywgbGFiZWw6ICdGaXhlZCBjb3VudCcgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZVRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IHN0YXJ0VmFsID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldExvb3BTdGFydEZvcm1WYWx1ZSgpIDogbnVsbDtcbiAgICBjb25zdCBlbmRWYWwgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0TG9vcEVuZEZvcm1WYWx1ZSgpIDogbnVsbDtcbiAgICB0aGlzLnN0YXJ0U3RlcFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3N0YXJ0U3RlcCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ0xvb3AgU3RhcnQnLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiB0aGlzLmdldExvb3BTdGFydFNlbGVjdE9wdGlvbnMoKSxcbiAgICAgIC4uLihzdGFydFZhbCAhPSBudWxsICYmIHsgc2VsZWN0ZWRWYWx1ZTogc3RhcnRWYWwgfSksXG4gICAgfTtcbiAgICB0aGlzLmVuZFN0ZXBTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdlbmRTdGVwJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnTG9vcCBFbmQnLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiB0aGlzLmdldExvb3BFbmRTZWxlY3RPcHRpb25zKCksXG4gICAgICAuLi4oZW5kVmFsICE9IG51bGwgJiYgeyBzZWxlY3RlZFZhbHVlOiBlbmRWYWwgfSksXG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvblNlbGVjdENvbmZpZygpO1xuICB9XG5cbiAgLyoqIFVwZGF0ZSBjb25kaXRpb24gc2VsZWN0IGNvbmZpZyB3aXRoIG5hdHVyYWwgdGV4dCBhY3Rpb25zIG9wdGlvbnMgKGxlZ2FjeSBtYXQtc2VsZWN0KSAqL1xuICBwcml2YXRlIHVwZGF0ZUNvbmRpdGlvblNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvblNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2NvbmRpdGlvbicsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBjb25kaXRpb24nLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSxcbiAgICB9O1xuICAgIHRoaXMudXBkYXRlV2hpbGVDb25kaXRpb25TZWxlY3RDb25maWcoKTtcbiAgfVxuXG4gIC8qKiBXaGlsZSBsb29wOiBvbmx5IHNob3cgb3B0aW9ucyB3aXRoIHN0ZXBBY3Rpb25UeXBlID09PSBcIldISUxFX0xPT1BcIiAqL1xuICBwcml2YXRlIHVwZGF0ZVdoaWxlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbHRlcmVkT3B0aW9ucyA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgfHwgW10pLmZpbHRlcigob3B0aW9uOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBvcHRpb24uc3RlcEFjdGlvblR5cGUgPT09ICdXSElMRV9MT09QJztcbiAgICB9KTtcbiAgICB0aGlzLndoaWxlQ29uZGl0aW9uU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnY29uZGl0aW9uJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGNvbmRpdGlvbicsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgb3B0aW9uczogZmlsdGVyZWRPcHRpb25zLFxuICAgIH07XG4gIH1cblxuICAvKiogT3B0aW9ucyBmb3IgdGhlIHdoaWxlIGNvbmRpdGlvbiBhdXRvY29tcGxldGUgKFdISUxFX0xPT1AgbmF0dXJhbCB0ZXh0IGFjdGlvbnMgb25seSkgKi9cbiAgZ2V0IHdoaWxlQ29uZGl0aW9uQXV0b2NvbXBsZXRlT3B0aW9ucygpOiAoQ3FhQXV0b2NvbXBsZXRlT3B0aW9uICYgeyB0ZW1wbGF0ZT86IGFueSB9KVtdIHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy53aGlsZUNvbmRpdGlvblNlbGVjdENvbmZpZz8ub3B0aW9ucyA/PyBbXTtcbiAgICByZXR1cm4gb3B0cy5tYXAoKG9wdGlvbjogYW55KSA9PiB7XG4gICAgICBjb25zdCBuYXR1cmFsVGV4dCA9IG9wdGlvbi5uYXR1cmFsVGV4dCA/PyBvcHRpb24ubmFtZSA/PyBvcHRpb24udmFsdWUgPz8gU3RyaW5nKG9wdGlvbi5pZCA/PyAnJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogbmF0dXJhbFRleHQsXG4gICAgICAgIGxhYmVsOiBuYXR1cmFsVGV4dCxcbiAgICAgICAgdGVtcGxhdGU6IG9wdGlvbi50ZW1wbGF0ZSB8fCBvcHRpb24sXG4gICAgICB9IGFzIENxYUF1dG9jb21wbGV0ZU9wdGlvbiAmIHsgdGVtcGxhdGU/OiBhbnkgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBEaXNwbGF5IHZhbHVlIGZvciB3aGlsZSBjb25kaXRpb24gYXV0b2NvbXBsZXRlOiBzaG93IG5hdHVyYWwgdGV4dCBmcm9tIG9wdGlvbiBtYXRjaGluZyBuYXR1cmFsVGV4dEFjdGlvbklkIHdoZW4gYXZhaWxhYmxlIChpbmNsdWRpbmcgd2hlbiBmb3JtIGlzIGVtcHR5IG9uIG9wZW4pLCBlbHNlIGZvcm0gdmFsdWUuIFdoZW4gdXNlciBoYXMgc2VsZWN0ZWQgYSBkaWZmZXJlbnQgb3B0aW9uLCBzaG93IGZvcm0gdmFsdWUuICovXG4gIGdldCB3aGlsZUNvbmRpdGlvbkRpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbmZpZ1dpdGhJZCA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvbicpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBpc0Zvcm1IdG1sID0gZm9ybVZhbHVlICYmIChTdHJpbmcoZm9ybVZhbHVlKS5pbmNsdWRlcygnPCcpIHx8IFN0cmluZyhmb3JtVmFsdWUpLmluY2x1ZGVzKCc+JykpO1xuICAgIGlmIChjb25maWdXaXRoSWQ/Lm5hdHVyYWxUZXh0QWN0aW9uSWQgIT0gbnVsbCAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSAodGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIGFzIGFueVtdKS5maW5kKFxuICAgICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQpXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gbWF0Y2hpbmdPcHRpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdPcHRpb24ubmFtZSA/PyBtYXRjaGluZ09wdGlvbi52YWx1ZSA/PyAnJztcbiAgICAgICAgaWYgKG5hdHVyYWxUZXh0KSB7XG4gICAgICAgICAgY29uc3QgbmF0dXJhbFRleHRTdHIgPSBTdHJpbmcobmF0dXJhbFRleHQpO1xuICAgICAgICAgIC8vIFNob3cgc2VsZWN0ZWQ6IHdoZW4gZm9ybSBpcyBlbXB0eSAoaW5pdGlhbCBvcGVuKSwgb3IgZm9ybSBtYXRjaGVzIHRoaXMgb3B0aW9uLCBvciBmb3JtIGhhcyBIVE1MLiBPbmx5IHVzZSBmb3JtIHZhbHVlIHdoZW4gdXNlciBwaWNrZWQgYSBkaWZmZXJlbnQgb3B0aW9uLlxuICAgICAgICAgIGlmICghZm9ybVZhbHVlIHx8IGZvcm1WYWx1ZSA9PT0gbmF0dXJhbFRleHRTdHIgfHwgaXNGb3JtSHRtbCkgcmV0dXJuIG5hdHVyYWxUZXh0U3RyO1xuICAgICAgICAgIHJldHVybiBmb3JtVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRm9ybUh0bWwpIHJldHVybiAnJztcbiAgICByZXR1cm4gZm9ybVZhbHVlO1xuICB9XG5cbiAgb25Db25kaXRpb25TZWxlY3Qob3B0aW9uOiBDcWFBdXRvY29tcGxldGVPcHRpb24gJiB7IHRlbXBsYXRlPzogYW55IH0pOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvbicpPy5zZXRWYWx1ZShvcHRpb24udmFsdWUpO1xuICAgIGNvbnN0IG1hdGNoaW5nVGVtcGxhdGUgPSBvcHRpb24udGVtcGxhdGU7XG4gICAgbGV0IGZ1bGxUZW1wbGF0ZSA9IG1hdGNoaW5nVGVtcGxhdGU7XG4gICAgaWYgKCFmdWxsVGVtcGxhdGUgfHwgIWZ1bGxUZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSkuZmluZChcbiAgICAgICAgKG9wdDogYW55KSA9PiBvcHQubmF0dXJhbFRleHQgPT09IG9wdGlvbi52YWx1ZSB8fCBvcHQubmFtZSA9PT0gb3B0aW9uLnZhbHVlIHx8IG9wdC52YWx1ZSA9PT0gb3B0aW9uLnZhbHVlXG4gICAgICApIGFzIGFueTtcbiAgICAgIGZ1bGxUZW1wbGF0ZSA9IG1hdGNoaW5nT3B0aW9uPy50ZW1wbGF0ZSB8fCBtYXRjaGluZ09wdGlvbjtcbiAgICB9XG4gICAgaWYgKGZ1bGxUZW1wbGF0ZSAmJiBmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBmdWxsVGVtcGxhdGU7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpIHx8IFtdO1xuICAgICAgdGhpcy5idWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBudWxsO1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IFtdO1xuICAgICAgaWYgKCF0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgICAgfVxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgICAvLyBBdXRvLW9wZW4gRWRpdCBJbiBkZXB0aCB3aGVuIHVzZXIgc2VsZWN0cyBhIGNvbmRpdGlvbiBmcm9tIHRoZSBhdXRvY29tcGxldGUuXG4gICAgLy8gUGFzcyBmdWxsVGVtcGxhdGUgc28gdGhlIG1vZGFsIHNob3dzIHRoZSBuZXdseSBzZWxlY3RlZCB0ZW1wbGF0ZSwgbm90IHRoZSBvbGQgc3RlcCB0ZW1wbGF0ZS5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMub25FZGl0SW5EZXB0aChmdWxsVGVtcGxhdGUpLCAxMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyh0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0ucmVtb3ZlQ29udHJvbChrZXkpO1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbmZpZ1dpdGhEYXRhID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGV4aXN0aW5nRGF0YSA9IGNvbmZpZ1dpdGhEYXRhLnRlbXBsYXRlVmFyaWFibGVzRGF0YSB8fCB7fTtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgbGV0IGRlZmF1bHRWYWx1ZTogYW55O1xuICAgICAgaWYgKGV4aXN0aW5nRGF0YS5oYXNPd25Qcm9wZXJ0eSh2YXJpYWJsZS5uYW1lKSkge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBleGlzdGluZ0RhdGFbdmFyaWFibGUubmFtZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbidcbiAgICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicgJiYgdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlID09PSAndHJ1ZScgfHwgZGVmYXVsdFZhbHVlID09PSAnMSc7XG4gICAgICB9XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5hZGRDb250cm9sKHZhcmlhYmxlLm5hbWUsIG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFNlbGVjdENvbmZpZ0ZvclZhcmlhYmxlKHZhcmlhYmxlOiBhbnkpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gKHZhcmlhYmxlLm9wdGlvbnMgfHwgW10pLm1hcCgob3B0OiBzdHJpbmcpID0+ICh7XG4gICAgICBpZDogb3B0LFxuICAgICAgdmFsdWU6IG9wdCxcbiAgICAgIG5hbWU6IG9wdCxcbiAgICAgIGxhYmVsOiBvcHRcbiAgICB9KSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogdmFyaWFibGUubmFtZSxcbiAgICAgIHBsYWNlaG9sZGVyOiBgU2VsZWN0ICR7dmFyaWFibGUubGFiZWx9YCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqIFVwZGF0ZSB0ZXN0IGRhdGEgcHJvZmlsZSBzZWxlY3QgY29uZmlnIHdpdGggY3VycmVudCBvcHRpb25zIGFuZCBzZWxlY3RlZFZhbHVlIChmb3JMb29wVGVzdERhdGFJZCkuIEVuc3VyZSBzZWxlY3RlZCBpZCBpcyBpbiBvcHRpb25zIHNvIG1hdC1zZWxlY3QgY2FuIGRpc3BsYXkgaXQuICovXG4gIHByaXZhdGUgdXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGxldCBvcHRpb25zID0gdGhpcy5jb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zKTtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgZm9yTG9vcFRlc3REYXRhSWQgPSBjZmc/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy50ZXN0RGF0YUlkO1xuICAgIGNvbnN0IHNlbGVjdGVkVmFsID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldFRlc3REYXRhUHJvZmlsZUZvcm1WYWx1ZSgpIDogdW5kZWZpbmVkO1xuICAgIC8vIEtlZXAgdGhlIHNlbGVjdGVkIHByb2ZpbGUgdmlzaWJsZSBieSBsYWJlbCBldmVuIHdoZW4gc2VydmVyLXNlYXJjaCByZXBsYWNlcyB0aGUgb3B0aW9uIGxpc3QuXG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlSWQgPSBzZWxlY3RlZFZhbCA/PyBmb3JMb29wVGVzdERhdGFJZDtcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgJiYgc2VsZWN0ZWRQcm9maWxlSWQgIT0gbnVsbCAmJiBzZWxlY3RlZFByb2ZpbGVJZCAhPT0gJycpIHtcbiAgICAgIGNvbnN0IGlkU3RyID0gU3RyaW5nKHNlbGVjdGVkUHJvZmlsZUlkKTtcbiAgICAgIGNvbnN0IGFscmVhZHlJbkxpc3QgPSBvcHRpb25zLnNvbWUoKG86IFNlbGVjdE9wdGlvbikgPT4gU3RyaW5nKG8uaWQgPz8gby52YWx1ZSkgPT09IGlkU3RyKTtcbiAgICAgIGlmICghYWxyZWFkeUluTGlzdCkge1xuICAgICAgICBjb25zdCBkaXNwbGF5TmFtZSA9IHRoaXMucmVzb2x2ZVRlc3REYXRhUHJvZmlsZU5hbWUoc2VsZWN0ZWRQcm9maWxlSWQpIHx8IHRoaXMucmVzb2x2ZVRlc3REYXRhUHJvZmlsZU5hbWUodGhpcy50ZXN0RGF0YVByb2ZpbGUpIHx8ICdTZWxlY3RlZCBwcm9maWxlJztcbiAgICAgICAgb3B0aW9ucyA9IFt7IGlkOiBzZWxlY3RlZFByb2ZpbGVJZCwgdmFsdWU6IHNlbGVjdGVkUHJvZmlsZUlkLCBuYW1lOiBkaXNwbGF5TmFtZSwgbGFiZWw6IGRpc3BsYXlOYW1lIH0sIC4uLm9wdGlvbnNdO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3Rlc3REYXRhUHJvZmlsZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1Rlc3RkYXRhcHJvZmlsZScsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgaW5pdGlhbEZldGNoT25PcGVuOiB0cnVlLFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlRGF0YVByb2ZpbGVzLFxuICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ0RhdGFQcm9maWxlcyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICAuLi4oc2VsZWN0ZWRWYWwgIT09IHVuZGVmaW5lZCAmJiBzZWxlY3RlZFZhbCAhPT0gJycgJiYgeyBzZWxlY3RlZFZhbHVlOiBzZWxlY3RlZFZhbCB9KSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uRGF0YVByb2ZpbGVDaGFuZ2UodmFsdWUpO1xuICAgICAgfSxcbiAgICAgIG9uU2VhcmNoOiAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm9uU2VhcmNoRGF0YVByb2ZpbGVzKHF1ZXJ5KTtcbiAgICAgIH0sXG4gICAgICBvbkxvYWRNb3JlOiAocXVlcnk/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5vbkxvYWRNb3JlRGF0YVByb2ZpbGVzKHF1ZXJ5IHx8ICcnKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgTG9vcCBTdGFydCAvIExvb3AgRW5kIHNlbGVjdCBjb25maWdzIHdpdGggc2VsZWN0ZWRWYWx1ZSAoZm9yTG9vcFN0YXJ0SW5kZXgsIGZvckxvb3BFbmRJbmRleCkgc28gZHJvcGRvd25zIHNob3cgc2VsZWN0ZWQgKi9cbiAgcHJpdmF0ZSB1cGRhdGVTdGFydEVuZFN0ZXBTZWxlY3RDb25maWdzU2VsZWN0ZWRWYWx1ZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgIT09ICdmb3InKSByZXR1cm47XG4gICAgY29uc3Qgc3RhcnRWYWwgPSB0aGlzLmdldExvb3BTdGFydEZvcm1WYWx1ZSgpO1xuICAgIGNvbnN0IGVuZFZhbCA9IHRoaXMuZ2V0TG9vcEVuZEZvcm1WYWx1ZSgpO1xuICAgIHRoaXMuc3RhcnRTdGVwU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5zdGFydFN0ZXBTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zOiB0aGlzLmdldExvb3BTdGFydFNlbGVjdE9wdGlvbnMoKSxcbiAgICAgIC4uLihzdGFydFZhbCAhPSBudWxsICYmIHsgc2VsZWN0ZWRWYWx1ZTogc3RhcnRWYWwgfSksXG4gICAgfTtcbiAgICB0aGlzLmVuZFN0ZXBTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmVuZFN0ZXBTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zOiB0aGlzLmdldExvb3BFbmRTZWxlY3RPcHRpb25zKCksXG4gICAgICAuLi4oZW5kVmFsICE9IG51bGwgJiYgeyBzZWxlY3RlZFZhbHVlOiBlbmRWYWwgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgYWxsIEZPUiBsb29wIHNlbGVjdCBjb25maWdzICh0ZXN0RGF0YVByb2ZpbGUsIHN0YXJ0U3RlcCwgZW5kU3RlcCkgd2l0aCBzZWxlY3RlZFZhbHVlIGZyb20gc3RlcCBzbyBkcm9wZG93bnMgc2hvdyBzZWxlY3RlZCAqL1xuICBwcml2YXRlIHVwZGF0ZUZvckxvb3BTZWxlY3RDb25maWdzU2VsZWN0ZWRWYWx1ZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgIT09ICdmb3InKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGVUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLnVwZGF0ZVN0YXJ0RW5kU3RlcFNlbGVjdENvbmZpZ3NTZWxlY3RlZFZhbHVlcygpO1xuICB9XG5cbiAgLyoqIENvbnZlcnQgRGF0YVByb2ZpbGVPcHRpb25bXSB0byBTZWxlY3RPcHRpb25bXSAqL1xuICBwcml2YXRlIGNvbnZlcnREYXRhUHJvZmlsZU9wdGlvbnNUb1NlbGVjdE9wdGlvbnMob3B0aW9uczogRGF0YVByb2ZpbGVPcHRpb25bXSk6IFNlbGVjdE9wdGlvbltdIHtcbiAgICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgICBpZDogb3B0aW9uLmlkLFxuICAgICAgdmFsdWU6IG9wdGlvbi5pZCxcbiAgICAgIG5hbWU6IG9wdGlvbi5uYW1lLFxuICAgICAgbGFiZWw6IG9wdGlvbi5uYW1lXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqIEJlc3Qta25vd24gcGVyc2lzdGVkIGxhYmVsIGZvciB0aGUgc2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGUsIGV2ZW4gd2hlbiBjdXJyZW50IHNlYXJjaCByZXN1bHRzIGV4Y2x1ZGUgaXQuICovXG4gIHByaXZhdGUgZ2V0U3RvcmVkVGVzdERhdGFQcm9maWxlTGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gW1xuICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUsXG4gICAgICB0aGlzLmNvbmZpZz8udGVzdERhdGFQcm9maWxlLFxuICAgICAgKHRoaXMuY29uZmlnIGFzIGFueSk/LnRlc3REYXRhPy5uYW1lLFxuICAgICAgdGhpcy5jb25maWc/LmFjdGlvbixcbiAgICBdO1xuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY2FuZGlkYXRlICE9IG51bGwgPyBTdHJpbmcoY2FuZGlkYXRlKS50cmltKCkgOiAnJztcbiAgICAgIGlmICghdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgaWYgKHZhbHVlID09PSAnVGVzdCBEYXRhIHByb2ZpbGUnKSBjb250aW51ZTtcbiAgICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkgY29udGludWU7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGEgZGF0YSBwcm9maWxlIGlkL3ZhbHVlIGJhY2sgdG8gdGhlIGRpc3BsYXkgbmFtZSB1c2VkIGJ5IHRoZSBkcm9wZG93biB0cmlnZ2VyLiAqL1xuICBwcml2YXRlIHJlc29sdmVUZXN0RGF0YVByb2ZpbGVOYW1lKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycpIHJldHVybiAnJztcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICBvcHRpb24gPT4gb3B0aW9uLmlkID09PSB2YWx1ZSB8fCBTdHJpbmcob3B0aW9uLmlkKSA9PT0gU3RyaW5nKHZhbHVlKSB8fCBvcHRpb24ubmFtZSA9PT0gdmFsdWVcbiAgICApO1xuICAgIGlmIChtYXRjaD8ubmFtZSkgcmV0dXJuIG1hdGNoLm5hbWU7XG4gICAgY29uc3Qgc3RvcmVkTGFiZWwgPSB0aGlzLmdldFN0b3JlZFRlc3REYXRhUHJvZmlsZUxhYmVsKCk7XG4gICAgaWYgKHN0b3JlZExhYmVsKSByZXR1cm4gc3RvcmVkTGFiZWw7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICAvKiogRGF0YSBsZW5ndGggKE4pIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGU7IDAgaWYgbm9uZSBzZWxlY3RlZCBvciBub3QgZm91bmQuICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRQcm9maWxlRGF0YUxlbmd0aCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHByb2ZpbGVJZCA9IHRoaXMuZWRpdEZvcm0/LmdldCgndGVzdERhdGFQcm9maWxlJyk/LnZhbHVlID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5mb3JMb29wVGVzdERhdGFJZCA/PyAodGhpcy5jb25maWcgYXMgYW55KT8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnRlc3REYXRhSWQ7XG4gICAgaWYgKHByb2ZpbGVJZCA9PSBudWxsIHx8ICF0aGlzLmRhdGFQcm9maWxlT3B0aW9ucz8ubGVuZ3RoKSByZXR1cm4gMDtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAobzogRGF0YVByb2ZpbGVPcHRpb24pID0+IFN0cmluZyhvLmlkKSA9PT0gU3RyaW5nKHByb2ZpbGVJZCkgfHwgby5pZCA9PT0gcHJvZmlsZUlkXG4gICAgKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDtcbiAgICBjb25zdCBsZW4gPSAobWF0Y2guZGF0YSAmJiBBcnJheS5pc0FycmF5KG1hdGNoLmRhdGEpID8gbWF0Y2guZGF0YS5sZW5ndGggOiAwKSB8fCAobWF0Y2guZGF0YUxlbmd0aCA/PyAwKTtcbiAgICByZXR1cm4gdHlwZW9mIGxlbiA9PT0gJ251bWJlcicgPyBsZW4gOiAwO1xuICB9XG5cbiAgLyoqIExvb3AgU3RhcnQvRW5kIG9wdGlvbnM6IDEgdG8gTiBiYXNlZCBvbiBzZWxlY3RlZCBkYXRhIHByb2ZpbGUncyBkYXRhIGFycmF5IGxlbmd0aDsgZmFsbHMgYmFjayB0byAxLi4xMCBpZiBubyBwcm9maWxlLiAqL1xuICBnZXRMb29wU3RlcE9wdGlvbnMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IE4gPSB0aGlzLmdldFNlbGVjdGVkUHJvZmlsZURhdGFMZW5ndGgoKTtcbiAgICBjb25zdCBtYXggPSBOID4gMCA/IE4gOiBUZXN0Q2FzZUxvb3BTdGVwQ29tcG9uZW50LkRFRkFVTFRfTE9PUF9PUFRJT05TX01BWDtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogbWF4IH0sIChfLCBpKSA9PiBpICsgMSk7XG4gIH1cblxuICAvKiogU2VudGluZWwgdmFsdWUgZm9yIFwiU3RhcnRcIiAvIFwiRW5kXCIgb3B0aW9ucyAoc2FtZSBhcyBvbGQgVUkpLiAqL1xuICBzdGF0aWMgcmVhZG9ubHkgTE9PUF9JTkRFWF9TVEFSVCA9IC0xO1xuICBzdGF0aWMgcmVhZG9ubHkgTE9PUF9JTkRFWF9FTkQgPSAtMTtcblxuICAvKiogTG9vcCBTdGFydC9FbmQgc2VsZWN0IG9wdGlvbnM6IHNhbWUgaW5kaWNlcyBhcyBnZXRMb29wU3RlcE9wdGlvbnMoKSwgd2l0aCBsYWJlbCBcIm5hbWUgKGluZGV4KVwiIHdoZW4gcHJvZmlsZSBkYXRhIGhhcyByb3cgbmFtZXMsIGVsc2UgXCJTdGVwIChpbmRleClcIi4gKi9cbiAgcHJpdmF0ZSBnZXRMb29wU3RlcFNlbGVjdE9wdGlvbnMoKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIGNvbnN0IGluZGljZXMgPSB0aGlzLmdldExvb3BTdGVwT3B0aW9ucygpO1xuICAgIHJldHVybiBpbmRpY2VzLm1hcCgobikgPT4ge1xuICAgICAgY29uc3Qgcm93TmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KG4pO1xuICAgICAgY29uc3QgbGFiZWwgPSByb3dOYW1lID8gYCR7cm93TmFtZX0gKCR7bn0pYCA6IGBTdGVwICgke259KWA7XG4gICAgICByZXR1cm4geyBpZDogbiwgdmFsdWU6IG4sIG5hbWU6IGxhYmVsLCBsYWJlbCB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIExvb3AgU3RhcnQgZHJvcGRvd24gb3B0aW9uczogXCJTdGFydFwiICh2YWx1ZSAtMSkgZmlyc3QsIHRoZW4gZGF0YSByb3dzLiBTYW1lIHZhbHVlcyBhcyBvbGQgVUkuICovXG4gIHByaXZhdGUgZ2V0TG9vcFN0YXJ0U2VsZWN0T3B0aW9ucygpOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgY29uc3Qgc3RhcnRPcHRpb246IFNlbGVjdE9wdGlvbiA9IHtcbiAgICAgIGlkOiBUZXN0Q2FzZUxvb3BTdGVwQ29tcG9uZW50LkxPT1BfSU5ERVhfU1RBUlQsXG4gICAgICB2YWx1ZTogVGVzdENhc2VMb29wU3RlcENvbXBvbmVudC5MT09QX0lOREVYX1NUQVJULFxuICAgICAgbmFtZTogJ1N0YXJ0JyxcbiAgICAgIGxhYmVsOiAnU3RhcnQnLFxuICAgIH07XG4gICAgcmV0dXJuIFtzdGFydE9wdGlvbiwgLi4udGhpcy5nZXRMb29wU3RlcFNlbGVjdE9wdGlvbnMoKV07XG4gIH1cblxuICAvKiogTG9vcCBFbmQgZHJvcGRvd24gb3B0aW9uczogZGF0YSByb3dzIGZpcnN0LCB0aGVuIFwiRW5kXCIgKHZhbHVlIC0xKSBsYXN0LiBTYW1lIHZhbHVlcyBhcyBvbGQgVUkuICovXG4gIHByaXZhdGUgZ2V0TG9vcEVuZFNlbGVjdE9wdGlvbnMoKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIGNvbnN0IGVuZE9wdGlvbjogU2VsZWN0T3B0aW9uID0ge1xuICAgICAgaWQ6IFRlc3RDYXNlTG9vcFN0ZXBDb21wb25lbnQuTE9PUF9JTkRFWF9FTkQsXG4gICAgICB2YWx1ZTogVGVzdENhc2VMb29wU3RlcENvbXBvbmVudC5MT09QX0lOREVYX0VORCxcbiAgICAgIG5hbWU6ICdFbmQnLFxuICAgICAgbGFiZWw6ICdFbmQnLFxuICAgIH07XG4gICAgcmV0dXJuIFsuLi50aGlzLmdldExvb3BTdGVwU2VsZWN0T3B0aW9ucygpLCBlbmRPcHRpb25dO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBkYXRhIHByb2ZpbGUgc2VsZWN0aW9uOiB1cGRhdGUgZGlzcGxheSBhbmQgcmVzZXQgc3RhcnQvZW5kIGxpa2UgdGhlIG9sZCBVSS4gKi9cbiAgcHJpdmF0ZSBvbkRhdGFQcm9maWxlQ2hhbmdlKHByb2ZpbGVJZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRlc3REYXRhUHJvZmlsZUNoYW5nZShwcm9maWxlSWQpO1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXJ0VmFsID0gVGVzdENhc2VMb29wU3RlcENvbXBvbmVudC5MT09QX0lOREVYX1NUQVJUO1xuICAgIGNvbnN0IGVuZFZhbCA9IFRlc3RDYXNlTG9vcFN0ZXBDb21wb25lbnQuTE9PUF9JTkRFWF9FTkQ7XG4gICAgaWYgKHRoaXMuZWRpdEZvcm0pIHtcbiAgICAgIHRoaXMuZWRpdEZvcm0uZ2V0KCdzdGFydFN0ZXAnKT8uc2V0VmFsdWUoc3RhcnRWYWwpO1xuICAgICAgdGhpcy5lZGl0Rm9ybS5nZXQoJ2VuZFN0ZXAnKT8uc2V0VmFsdWUoZW5kVmFsKTtcbiAgICB9XG4gICAgdGhpcy5zdGFydFN0ZXAgPSBzdGFydFZhbDtcbiAgICB0aGlzLmVuZFN0ZXAgPSBlbmRWYWw7XG4gICAgdGhpcy51cGRhdGVTdGFydEVuZFN0ZXBTZWxlY3RDb25maWdzU2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogSGFuZGxlIHNlYXJjaCBmb3IgZGF0YSBwcm9maWxlcyAqL1xuICBwcml2YXRlIG9uU2VhcmNoRGF0YVByb2ZpbGVzKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaERhdGFQcm9maWxlcy5lbWl0KHF1ZXJ5KTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgbG9hZCBtb3JlIGRhdGEgcHJvZmlsZXMgKi9cbiAgcHJpdmF0ZSBvbkxvYWRNb3JlRGF0YVByb2ZpbGVzKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQocXVlcnkpO1xuICB9XG5cbiAgb25FZGl0Rm9ybUZpZWxkQ2hhbmdlKGNvbnRyb2xOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtLmdldChjb250cm9sTmFtZSk/LnNldFZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIGdldExvb3BUeXBlTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyAnRk9SIExPT1AnIDogJ1dISUxFIExPT1AnO1xuICB9XG5cbiAgaXNXaGlsZUxvb3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZSc7XG4gIH1cblxuICBpc0Zvckxvb3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9vcFR5cGUgPT09ICdmb3InO1xuICB9XG5cbiAgZ2V0U3RhcnRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdTVEFSVCBGT1InIDogJ1NUQVJUIFdISUxFJztcbiAgfVxuXG4gIGdldEVuZExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gJ0VORCBGT1InIDogJ0VORCBXSElMRSc7XG4gIH1cblxuICAvKiogUmVzb2x2ZSBkaXNwbGF5IHN0YXJ0IGluZGV4OiBwcmVmZXIgZm9yTG9vcFN0YXJ0SW5kZXggZnJvbSBzdGVwIChvciBkYXRhTWFwSnNvbi9kYXRhTWFwQmVhbiksIGVsc2Ugc3RhcnRTdGVwLCBlbHNlIGZyb20gbmVzdGVkIHN0ZXBzICovXG4gIHByaXZhdGUgZ2V0RGlzcGxheVN0YXJ0SW5kZXgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgdiA9IGNmZz8uZm9yTG9vcFN0YXJ0SW5kZXggPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFN0YXJ0SW5kZXggPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnN0YXJ0SW5kZXg7XG4gICAgaWYgKHYgIT0gbnVsbCkgcmV0dXJuIE51bWJlcih2KTtcbiAgICBpZiAodGhpcy5zdGFydFN0ZXAgIT0gbnVsbCkgcmV0dXJuIHRoaXMuc3RhcnRTdGVwO1xuICAgIHJldHVybiB0aGlzLm5lc3RlZFN0ZXBzWzBdPy5zdGVwTnVtYmVyIGFzIG51bWJlciB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGRpc3BsYXkgZW5kIGluZGV4OiBwcmVmZXIgZm9yTG9vcEVuZEluZGV4IGZyb20gc3RlcCAob3IgZGF0YU1hcEpzb24vZGF0YU1hcEJlYW4pLCBlbHNlIGVuZFN0ZXAsIGVsc2UgZnJvbSBuZXN0ZWQgc3RlcHMgKi9cbiAgcHJpdmF0ZSBnZXREaXNwbGF5RW5kSW5kZXgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgdiA9IGNmZz8uZm9yTG9vcEVuZEluZGV4ID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BFbmRJbmRleCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uZW5kSW5kZXg7XG4gICAgaWYgKHYgIT0gbnVsbCkgcmV0dXJuIE51bWJlcih2KTtcbiAgICBpZiAodGhpcy5lbmRTdGVwICE9IG51bGwpIHJldHVybiB0aGlzLmVuZFN0ZXA7XG4gICAgY29uc3QgbGFzdCA9IHRoaXMubmVzdGVkU3RlcHNbdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gbGFzdD8uc3RlcE51bWJlciBhcyBudW1iZXIgfCB1bmRlZmluZWQgPz8gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gIH1cblxuICAvKiogUmVzb2x2ZSBkaXNwbGF5IHByb2ZpbGUgbmFtZTogbWFwIGZvckxvb3BUZXN0RGF0YUlkIHRvIHByb2ZpbGUgbmFtZSBmcm9tIGRhdGFQcm9maWxlT3B0aW9ucywgZWxzZSB1c2UgdGVzdERhdGFQcm9maWxlICovXG4gIHByaXZhdGUgZ2V0RGlzcGxheVRlc3REYXRhUHJvZmlsZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgaWQgPSBjZmc/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy50ZXN0RGF0YUlkO1xuICAgIGlmIChpZCAhPSBudWxsICYmIHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgICAgbyA9PiBvLmlkID09PSBpZCB8fCBTdHJpbmcoby5pZCkgPT09IFN0cmluZyhpZClcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaC5uYW1lO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZXN0RGF0YVByb2ZpbGUgPz8gJyc7XG4gIH1cblxuICAvKiogR2V0IHRoZSBzZWxlY3RlZCBkYXRhIHByb2ZpbGUgKGJ5IGZvckxvb3BUZXN0RGF0YUlkIG9yIGZvcm0gdmFsdWUpLCBvciBudWxsLiAqL1xuICBwcml2YXRlIGdldFNlbGVjdGVkRGF0YVByb2ZpbGUoKTogRGF0YVByb2ZpbGVPcHRpb24gfCBudWxsIHtcbiAgICBjb25zdCBwcm9maWxlSWQgPSB0aGlzLmVkaXRGb3JtPy5nZXQoJ3Rlc3REYXRhUHJvZmlsZScpPy52YWx1ZSA/PyAodGhpcy5jb25maWcgYXMgYW55KT8uZm9yTG9vcFRlc3REYXRhSWQgPz8gKHRoaXMuY29uZmlnIGFzIGFueSk/LmRhdGFNYXBKc29uPy5mb3JMb29wVGVzdERhdGFJZCA/PyAodGhpcy5jb25maWcgYXMgYW55KT8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy50ZXN0RGF0YUlkO1xuICAgIGlmIChwcm9maWxlSWQgPT0gbnVsbCB8fCAhdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnM/Lmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5maW5kKFxuICAgICAgKG86IERhdGFQcm9maWxlT3B0aW9uKSA9PiBTdHJpbmcoby5pZCkgPT09IFN0cmluZyhwcm9maWxlSWQpIHx8IG8uaWQgPT09IHByb2ZpbGVJZFxuICAgICk7XG4gICAgcmV0dXJuIG1hdGNoID8/IG51bGw7XG4gIH1cblxuICAvKiogR2V0IGRpc3BsYXkgbmFtZSBmb3IgYSAxLWJhc2VkIHJvdyBpbmRleCBmcm9tIHRoZSBzZWxlY3RlZCBwcm9maWxlJ3MgZGF0YSBhcnJheSAoZGF0YVtpbmRleC0xXS5uYW1lKS4gUmV0dXJucyBudWxsIGlmIG5vIG5hbWUuICovXG4gIHByaXZhdGUgZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KG9uZUJhc2VkSW5kZXg6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLmdldFNlbGVjdGVkRGF0YVByb2ZpbGUoKTtcbiAgICBpZiAoIXByb2ZpbGU/LmRhdGEgfHwgIUFycmF5LmlzQXJyYXkocHJvZmlsZS5kYXRhKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaWR4ID0gb25lQmFzZWRJbmRleCAtIDE7XG4gICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHByb2ZpbGUuZGF0YS5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJvdyA9IHByb2ZpbGUuZGF0YVtpZHhdO1xuICAgIHJldHVybiByb3cgJiYgKHJvdy5uYW1lICE9IG51bGwgPyBTdHJpbmcocm93Lm5hbWUpIDogbnVsbCk7XG4gIH1cblxuICAvKiogV2hldGhlciB0ZXN0IGRhdGEgcHJvZmlsZSBpcyBzZXQgKHNvIHdlIGNhbiBzaG93L2hpZGUgdGhlIGNoaXApICovXG4gIGhhc1Rlc3REYXRhUHJvZmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXREaXNwbGF5VGVzdERhdGFQcm9maWxlTmFtZSgpLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogV2hldGhlciBzdGFydCB2YWx1ZSBpcyBleHBsaWNpdGx5IHNldCAoY29uZmlnIG9yIHN0YXJ0U3RlcCBpbnB1dCksIG5vdCBpbmZlcnJlZCBmcm9tIG5lc3RlZCBzdGVwcyAqL1xuICBoYXNTdGFydFZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB2ID0gY2ZnPy5mb3JMb29wU3RhcnRJbmRleCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wU3RhcnRJbmRleCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uc3RhcnRJbmRleDtcbiAgICBpZiAodiAhPSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5zdGFydFN0ZXAgIT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgZW5kIHZhbHVlIGlzIGV4cGxpY2l0bHkgc2V0IChjb25maWcgb3IgZW5kU3RlcCBpbnB1dCksIG5vdCBpbmZlcnJlZCBmcm9tIG5lc3RlZCBzdGVwcyAqL1xuICBoYXNFbmRWYWx1ZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgdiA9IGNmZz8uZm9yTG9vcEVuZEluZGV4ID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BFbmRJbmRleCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uZW5kSW5kZXg7XG4gICAgaWYgKHYgIT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuZW5kU3RlcCAhPSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRTdGVwc1N1bW1hcnkoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnMCBzdGVwcyc7XG4gICAgfVxuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgY29uc3QgZmlyc3RTdGVwTnVtID0gKHRoaXMubmVzdGVkU3RlcHNbMF0gYXMgYW55KT8uc3RlcE51bWJlciA/PyAxO1xuICAgIGNvbnN0IGxhc3RTdGVwTnVtID0gKHRoaXMubmVzdGVkU3RlcHNbY291bnQgLSAxXSBhcyBhbnkpPy5zdGVwTnVtYmVyID8/IGNvdW50O1xuICAgIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGBTdGVwcyAke2ZpcnN0U3RlcE51bX0gKDEgc3RlcClgO1xuICAgIH1cbiAgICByZXR1cm4gYFN0ZXBzICR7Zmlyc3RTdGVwTnVtfS0ke2xhc3RTdGVwTnVtfSAoJHtjb3VudH0gc3RlcHMpYDtcbiAgfVxuXG4gIGdldFN0YXJ0U3RlcExhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmdldERpc3BsYXlTdGFydEluZGV4KCk7XG4gICAgaWYgKHN0YXJ0ID09IG51bGwpIHJldHVybiBgU3RhcnQ6ICR7dGhpcy5uZXN0ZWRTdGVwc1swXT8uc3RlcE51bWJlciA/PyAxfWA7XG4gICAgLy8gSWYgc3RhcnQgaXMgLTEsIHVzZXIgc2VsZWN0ZWQgXCJTdGFydFwiIG9wdGlvbiwganVzdCByZXR1cm4gXCJTdGFydFwiXG4gICAgaWYgKHN0YXJ0ID09PSAtMSkgcmV0dXJuICdTdGFydCc7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KHN0YXJ0KTtcbiAgICByZXR1cm4gbmFtZSAhPSBudWxsID8gYFN0YXJ0OiAke25hbWV9YCA6IGBTdGFydDogJHtzdGFydH1gO1xuICB9XG5cbiAgZ2V0RW5kU3RlcExhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZW5kID0gdGhpcy5nZXREaXNwbGF5RW5kSW5kZXgoKTtcbiAgICBpZiAoZW5kID09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRFbmQgPSB0aGlzLm5lc3RlZFN0ZXBzW3RoaXMubmVzdGVkU3RlcHMubGVuZ3RoIC0gMV0/LnN0ZXBOdW1iZXIgPz8gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYEVuZDogJHtkZWZhdWx0RW5kfWA7XG4gICAgfVxuICAgIC8vIElmIGVuZCBpcyAtMSwgdXNlciBzZWxlY3RlZCBcIkVuZFwiIG9wdGlvbiwganVzdCByZXR1cm4gXCJFbmRcIlxuICAgIGlmIChlbmQgPT09IC0xKSByZXR1cm4gJ0VuZCc7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KGVuZCk7XG4gICAgcmV0dXJuIG5hbWUgIT0gbnVsbCA/IGBFbmQ6ICR7bmFtZX1gIDogYEVuZDogJHtlbmR9YDtcbiAgfVxuXG4gIGdldFRlc3REYXRhUHJvZmlsZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGlzcGxheVRlc3REYXRhUHJvZmlsZU5hbWUoKTtcbiAgICBpZiAobmFtZSkgcmV0dXJuIGBUZXN0IERhdGEgcHJvZmlsZTogJHtuYW1lfWA7XG4gICAgcmV0dXJuICdUZXN0IERhdGEgcHJvZmlsZSc7XG4gIH1cblxuICAvKiogVGVzdCBEYXRhIHByb2ZpbGUgcGFydCBvbmx5IC0gZm9yIHZlcnRpY2FsIHN0YWNrIGxheW91dCAocm93IDEpICovXG4gIGdldEZvckxvb3BQcm9maWxlRGlzcGxheSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBpZiAoY2ZnPy5mb3JMb29wRGlzcGxheUh0bWwpIHtcbiAgICAgIGNvbnN0IG0gPSBjZmcuZm9yTG9vcERpc3BsYXlIdG1sLm1hdGNoKC9UZXN0IERhdGEgcHJvZmlsZTpcXHMqKDxbXj5dKz5bXjxdKjxcXC9bXj5dKz4pLyk7XG4gICAgICBpZiAobSkgcmV0dXJuIGBUZXN0IERhdGEgcHJvZmlsZTogJHttWzFdfWA7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNUZXN0RGF0YVByb2ZpbGUoKSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldERpc3BsYXlUZXN0RGF0YVByb2ZpbGVOYW1lKCk7XG4gICAgcmV0dXJuIGBUZXN0IERhdGEgcHJvZmlsZTogPHNwYW4gZGF0YS1rZXk9XCJ0ZXN0LWRhdGFcIiBkYXRhLWV2ZW50LWtleT1cInRlc3REYXRhUHJvZmlsZVwiIGNsYXNzPVwidGVzdF9kYXRhXCI+JHt0aGlzLmVzY2FwZUZvckxvb3BIdG1sKG5hbWUpfTwvc3Bhbj5gO1xuICB9XG5cbiAgLyoqIFN0YXJ0IGFuZCBFbmQgcGFydHMgb25seSAtIGZvciB2ZXJ0aWNhbCBzdGFjayBsYXlvdXQgKHJvdyAyLCBzdGF5cyB0b2dldGhlcikgKi9cbiAgZ2V0Rm9yTG9vcFJhbmdlRGlzcGxheSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5oYXNTdGFydFZhbHVlKCkpIHtcbiAgICAgIGNvbnN0IGZ1bGwgPSB0aGlzLmdldFN0YXJ0U3RlcExhYmVsKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZ1bGwucmVwbGFjZSgvXlN0YXJ0OlxccyovLCAnJyk7XG4gICAgICBwYXJ0cy5wdXNoKGA8c3BhbiBjbGFzcz1cImZvci1sb29wLXJhbmdlLXBhcnRcIj5TdGFydDogPHNwYW4gZGF0YS1rZXk9XCJ0ZXN0LWRhdGFcIiBkYXRhLWV2ZW50LWtleT1cImZvckxvb3BTdGFydEluZGV4XCIgY2xhc3M9XCJ0ZXN0X2RhdGFcIj4ke3RoaXMuZXNjYXBlRm9yTG9vcEh0bWwodmFsdWUpfTwvc3Bhbj48L3NwYW4+YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0VuZFZhbHVlKCkpIHtcbiAgICAgIGNvbnN0IGZ1bGwgPSB0aGlzLmdldEVuZFN0ZXBMYWJlbCgpO1xuICAgICAgY29uc3QgdmFsdWUgPSBmdWxsLnJlcGxhY2UoL15FbmQ6XFxzKi8sICcnKTtcbiAgICAgIHBhcnRzLnB1c2goYDxzcGFuIGNsYXNzPVwiZm9yLWxvb3AtcmFuZ2UtcGFydFwiPkVuZDogPHNwYW4gZGF0YS1rZXk9XCJ0ZXN0LWRhdGFcIiBkYXRhLWV2ZW50LWtleT1cImZvckxvb3BFbmRJbmRleFwiIGNsYXNzPVwidGVzdF9kYXRhXCI+JHt0aGlzLmVzY2FwZUZvckxvb3BIdG1sKHZhbHVlKX08L3NwYW4+PC9zcGFuPmApO1xuICAgIH1cbiAgICBpZiAoY2ZnPy5mb3JMb29wRGlzcGxheUh0bWwgJiYgcGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBzdGFydE1hdGNoID0gY2ZnLmZvckxvb3BEaXNwbGF5SHRtbC5tYXRjaCgvU3RhcnQ6XFxzKjxbXj5dKj4oW148XSopPC8pO1xuICAgICAgY29uc3QgZW5kTWF0Y2ggPSBjZmcuZm9yTG9vcERpc3BsYXlIdG1sLm1hdGNoKC9FbmQ6XFxzKjxbXj5dKj4oW148XSopPC8pO1xuICAgICAgaWYgKHN0YXJ0TWF0Y2gpIHBhcnRzLnB1c2goYDxzcGFuIGNsYXNzPVwiZm9yLWxvb3AtcmFuZ2UtcGFydFwiPlN0YXJ0OiA8c3BhbiBjbGFzcz1cInRlc3RfZGF0YVwiPiR7c3RhcnRNYXRjaFsxXX08L3NwYW4+PC9zcGFuPmApO1xuICAgICAgaWYgKGVuZE1hdGNoKSBwYXJ0cy5wdXNoKGA8c3BhbiBjbGFzcz1cImZvci1sb29wLXJhbmdlLXBhcnRcIj5FbmQ6IDxzcGFuIGNsYXNzPVwidGVzdF9kYXRhXCI+JHtlbmRNYXRjaFsxXX08L3NwYW4+PC9zcGFuPmApO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbignJyk7XG4gIH1cblxuICBwcml2YXRlIGVzY2FwZUZvckxvb3BIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnRleHRDb250ZW50ID0gdGV4dDtcbiAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgfVxuXG4gIC8qKiBGdWxsIGRpc3BsYXkgZm9yIHdoaWxlIGxvb3A6IHN1YnN0aXR1dGVzICN7dmFyaWFibGV9IHdpdGggSFRNTCBiYWRnZXMgKGVsZW1lbnQvdGVzdF9kYXRhKSBzbyBjbGlja3Mgb3BlbiBwb3B1cCAtIG1heCBpdGVyYXRpb25zIHNob3duIGFzIHNlcGFyYXRlIGJhZGdlICovXG4gIGdldENvbmRpdGlvbkRpc3BsYXkoKTogc3RyaW5nIHtcbiAgICBsZXQgYmFzZSA9IHRoaXMuY29uZGl0aW9uIHx8ICdlbGVtZW50IFwiLm5vdGlmaWNhdGlvbi1iYWRnZVwiIGV4aXN0cyc7XG4gICAgY29uc3Qgd2l0aFdoaWxlID0gYmFzZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ3doaWxlICcpID8gYmFzZSA6IGBXaGlsZSAke2Jhc2V9YDtcbiAgICAvLyBTdHJpcCAobWF4IE4gaXRlcmF0aW9ucykgZnJvbSB0ZXh0IC0gc2hvd24gYXMgYmFkZ2UgaW5zdGVhZFxuICAgIGNvbnN0IHJlc3VsdCA9IHdpdGhXaGlsZS5yZXBsYWNlKC9cXHMqXFwobWF4XFxzK1xcZCtcXHMraXRlcmF0aW9uc1xcKVxccyokL2ksICcnKS50cmltKCk7XG4gICAgcmV0dXJuIHRoaXMuc3Vic3RpdHV0ZVRlbXBsYXRlVmFyaWFibGVzVG9IdG1sKHJlc3VsdCk7XG4gIH1cblxuICAvKiogU3Vic3RpdHV0ZXMgI3t2YXJpYWJsZX0gcGxhY2Vob2xkZXJzIHdpdGggSFRNTCBiYWRnZSBzcGFucyB1c2luZyBjb25maWcuZXZlbnQgLSBlbmFibGVzIGNsaWNrLXRvLWVkaXQgcG9wdXAgbGlrZSBjb25kaXRpb24gc3RlcCAqL1xuICBwcml2YXRlIHN1YnN0aXR1dGVUZW1wbGF0ZVZhcmlhYmxlc1RvSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCB8fCB0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycpIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGV2ID0gKHRoaXMuY29uZmlnIGFzIGFueSk/LmV2ZW50ID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy50ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgPz8ge307XG4gICAgaWYgKHR5cGVvZiBldiAhPT0gJ29iamVjdCcgfHwgZXYgPT09IG51bGwpIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGVzY2FwZSA9ICh2OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZGl2LnRleHRDb250ZW50ID0gdjtcbiAgICAgIHJldHVybiBkaXYuaW5uZXJIVE1MO1xuICAgIH07XG4gICAgY29uc3QgZWxlbWVudFZhcnMgPSBbJ2xhYmVsJywgJ2Rlc2NyaXB0aW9uJywgJ2VsZW1lbnQnLCAnc2VsZWN0b3InLCAnYWlfdGFzaycsICdxdWVyeScsICdjdXN0b21fY29kZSddO1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhcnMgPSBbJ2F0dHJpYnV0ZSddO1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcI1xceyhbXn1dKylcXH0vZywgKF8sIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBldltrZXldO1xuICAgICAgY29uc3QgZGlzcGxheVZhbCA9IHZhbCAhPSBudWxsICYmIHZhbCAhPT0gJycgPyBTdHJpbmcodmFsKSA6IGtleTtcbiAgICAgIGNvbnN0IGVzY2FwZWQgPSBlc2NhcGUoZGlzcGxheVZhbCk7XG4gICAgICBpZiAoZWxlbWVudFZhcnMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gYDxzcGFuIGRhdGEta2V5PVwiJHtrZXl9XCIgZGF0YS1ldmVudC1rZXk9XCIke2tleX1cIiBjbGFzcz1cImVsZW1lbnRcIj4ke2VzY2FwZWR9PC9zcGFuPmA7XG4gICAgICB9XG4gICAgICBpZiAoYXR0cmlidXRlVmFycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBgPHNwYW4gZGF0YS1rZXk9XCIke2tleX1cIiBkYXRhLWV2ZW50LWtleT1cIiR7a2V5fVwiIGNsYXNzPVwiYXR0cmlidXRlXCI+JHtlc2NhcGVkfTwvc3Bhbj5gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGA8c3BhbiBkYXRhLWtleT1cIiR7a2V5fVwiIGRhdGEtZXZlbnQta2V5PVwiJHtrZXl9XCIgY2xhc3M9XCJ0ZXN0X2RhdGFcIj4ke2VzY2FwZWR9PC9zcGFuPmA7XG4gICAgfSk7XG4gIH1cblxuICAvKiogRXZlbnQga2V5LXZhbHVlIHBhaXJzIGZvciBkaXNwbGF5IChlLmcuIHNlbGVjdG9yLCBlbGVtZW50KSAtIHNhbWUgYXMgY29uZGl0aW9uIHN0ZXAgZ2V0QnJhbmNoRXZlbnREZXRhaWxzRm9yRGlzcGxheSAqL1xuICBnZXRMb29wRXZlbnREZXRhaWxzRm9yRGlzcGxheSgpOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgZXZlbnQgPSB0aGlzLmNvbmZpZz8uZXZlbnQ7XG4gICAgaWYgKCFldmVudCB8fCB0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGV2ZW50KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+IGtleSAhPT0gJ2N1c3RvbUV2ZW50JylcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogdmFsdWUgIT0gbnVsbCA/IFN0cmluZyh2YWx1ZSkgOiAnJ1xuICAgICAgfSkpO1xuICB9XG5cbiAgb25Ub2dnbGVFeHBhbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuZXhwYW5kZWQ7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZC5lbWl0KHtjb25maWc6dGhpcy5jb25maWcsIGV4cGFuZGVkOnRoaXMuZXhwYW5kZWR9KTtcbiAgfVxuXG4gIG9uVGVzdERhdGFQcm9maWxlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IHRoaXMucmVzb2x2ZVRlc3REYXRhUHJvZmlsZU5hbWUodmFsdWUpO1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gZGlzcGxheU5hbWU7XG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVDaGFuZ2UuZW1pdChkaXNwbGF5TmFtZSk7XG4gIH1cblxuICBvblN0YXJ0U3RlcENoYW5nZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydFN0ZXAgPSB2YWx1ZTtcbiAgICB0aGlzLnN0YXJ0U3RlcENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uRW5kU3RlcENoYW5nZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lbmRTdGVwID0gdmFsdWU7XG4gICAgdGhpcy5lbmRTdGVwQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25Db25kaXRpb25DaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29uZGl0aW9uID0gdmFsdWU7XG4gICAgdGhpcy5jb25kaXRpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbk1heEl0ZXJhdGlvbnNDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubWF4SXRlcmF0aW9ucyA9IHZhbHVlO1xuICAgIHRoaXMubWF4SXRlcmF0aW9uc0NoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uTmVzdGVkU3RlcENoYW5nZShzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5lc3RlZFN0ZXBDaGFuZ2UuZW1pdCh7IHN0ZXAsIGluZGV4IH0pO1xuICB9XG5cbiAgLyoqIFJlLWVtaXQgb3BlbkV4dGVybmFsIGZyb20gbmVzdGVkIHN0ZXAgZ3JvdXAgc28gcmVkaXJlY3Qgd29ya3MgZm9yIHN0ZXAgZ3JvdXBzIGluc2lkZSBsb29wcy4gKi9cbiAgb25OZXN0ZWRPcGVuRXh0ZXJuYWwocGF5bG9hZDogeyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcgfSk6IHZvaWQge1xuICAgIGlmIChwYXlsb2FkPy5zdGVwKSB7XG4gICAgICB0aGlzLm9wZW5FeHRlcm5hbC5lbWl0KHBheWxvYWQpO1xuICAgIH1cbiAgfVxuXG4gIG9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoZXZlbnQ6IGJvb2xlYW4gfCB7Y29uZmlnOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufSwgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gSGFuZGxlIGJvdGggYm9vbGVhbiBhbmQgb2JqZWN0IGZvcm1hdHNcbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0JyAmJiBldmVudCAhPT0gbnVsbCAmJiAnZXhwYW5kZWQnIGluIGV2ZW50KSB7XG4gICAgICAvLyBPYmplY3QgZm9ybWF0IGZyb20gc3RlcC1ncm91cDoge2NvbmZpZywgZXhwYW5kZWR9XG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQuZXhwYW5kZWQ7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgZXZlbnQncyBjb25maWcgaXMgYSBzdGVwLWdyb3VwIChub3QgdGhlIGN1cnJlbnQgc3RlcClcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBuZXN0ZWQgc3RlcC1ncm91cCBldmVudHMgYnViYmxlIHVwIGNvcnJlY3RseSBldmVuIHdoZW4gY29uZGl0aW9uIHN0ZXAgaXMgaW5zaWRlIGxvb3Agc3RlcFxuICAgICAgaWYgKHRoaXMuaXNTdGVwR3JvdXAoZXZlbnQuY29uZmlnKSkge1xuICAgICAgICAvLyBSZS1lbWl0IHRoZSB0b2dnbGVFeHBhbmRlZCBldmVudCB3aXRoIHRoZSBvYmplY3QgZm9ybWF0LCBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCBjb25maWdcbiAgICAgICAgLy8gQ2FzdCB0byBzYXRpc2Z5IFR5cGVTY3JpcHQgLSB0aGUgcmVuZGVyZXIgYWNjZXB0cyBUZXN0Q2FzZVN0ZXBDb25maWcgd2hpY2ggaW5jbHVkZXMgU3RlcEdyb3VwQ29uZmlnXG4gICAgICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQuZW1pdCh7Y29uZmlnOiBldmVudC5jb25maWcgYXMgYW55IGFzIExvb3BTdGVwQ29uZmlnLCBleHBhbmRlZDogZXZlbnQuZXhwYW5kZWR9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQm9vbGVhbiBmb3JtYXQgZnJvbSBvdGhlciBzdGVwIHR5cGVzXG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQgYXMgYm9vbGVhbjtcbiAgICB9XG4gICAgdGhpcy5vbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaW5kZXgpO1xuICB9XG5cbiAgb25BZGRTdGVwKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkU3RlcC5lbWl0KCk7XG4gIH1cblxuICAvKiogUmUtZW1pdCBhZGRTdGVwRm9yTG9vcCBmcm9tIG5lc3RlZCBsb29wIHNvIE4tbGV2ZWwgbmVzdGluZyB3b3JrcyAoZW1wdHktc3RhdGUgYWRkIHN0ZXApLiAqL1xuICBvbkFkZFN0ZXBGb3JMb29wRnJvbU5lc3RlZChldmVudDogeyBsb29wU3RlcENvbmZpZzogTG9vcFN0ZXBDb25maWcgfSk6IHZvaWQge1xuICAgIGlmIChldmVudD8ubG9vcFN0ZXBDb25maWcpIHtcbiAgICAgIHRoaXMuYWRkU3RlcC5lbWl0KHsgbG9vcFN0ZXBDb25maWc6IGV2ZW50Lmxvb3BTdGVwQ29uZmlnIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZFN0ZXAuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxsZWQgZnJvbSBlbXB0eS1zdGF0ZSBwbHVzIG9ubHk7IHNhbWUgYmVoYXZpb3VyIGFzIGFkZC1zdGVwLWJldHdlZW4gKHBhcmVudElkID0gbG9vcCBzdGVwIGlkLCBwb3NpdGlvbiA9IHBhcmVudCArIDEpLiAqL1xuICBvbkFkZFN0ZXBFbXB0eSgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZFN0ZXAuZW1pdCh7IGxvb3BTdGVwQ29uZmlnOiB0aGlzLmNvbmZpZyB9KTtcbiAgfVxuXG4gIG9uRGVsZXRlU3RlcChwYXlsb2FkT3JJbmRleDogYW55LCBpbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGlkeCA9IHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicgPyBpbmRleCA6IHBheWxvYWRPckluZGV4O1xuICAgIGNvbnN0IHBheWxvYWQgPSB0eXBlb2YgaW5kZXggPT09ICdudW1iZXInID8gcGF5bG9hZE9ySW5kZXggOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5kZWxldGVTdGVwLmVtaXQoaWR4KTtcbiAgICBpZiAocGF5bG9hZD8uc3RlcCkgdGhpcy5kZWxldGUuZW1pdChwYXlsb2FkKTtcbiAgfVxuXG4gIC8qKiBSZS1lbWl0IGVkaXQgZnJvbSBuZXN0ZWQgc3RlcCBzbyB0aGUgcG9ydGFsIGNhbiBvcGVuIGVkaXQgbW9kYWwgKHNhbWUgYXMgcm9vdCBsZXZlbCkuICovXG4gIG9uTmVzdGVkRWRpdChldmVudDogeyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGlmIChldmVudD8uc3RlcCAhPSBudWxsKSB0aGlzLmVkaXQuZW1pdChldmVudCBhcyBhbnkpO1xuICB9XG5cbiAgLyoqIFJlLWVtaXQgZHVwbGljYXRlIGZyb20gbmVzdGVkIHN0ZXAgc28gdGhlIHBvcnRhbCBjYW4gZHVwbGljYXRlIChzYW1lIGFzIHJvb3QgbGV2ZWwpLiAqL1xuICBvbk5lc3RlZER1cGxpY2F0ZShldmVudDogYW55LCBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmR1cGxpY2F0ZS5lbWl0KChldmVudCAmJiBldmVudC5zdGVwICE9IG51bGwpID8gZXZlbnQgOiB7IHN0ZXAgfSBhcyBhbnkpO1xuICB9XG5cbiAgaXNOb3JtYWxTdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgTm9ybWFsU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdldmVudFR5cGUnIGluIHN0ZXA7XG4gIH1cblxuICBpc0xvb3BTdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgTG9vcFN0ZXBDb25maWcge1xuICAgIHJldHVybiAnbG9vcFR5cGUnIGluIHN0ZXA7XG4gIH1cblxuICBpc0NvbmRpdGlvblN0ZXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBDb25kaXRpb25TdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2NvbmRpdGlvbicgaW4gc3RlcCAmJiAnYnJhbmNoZXMnIGluIHN0ZXA7XG4gIH1cblxuICBpc1N0ZXBHcm91cChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIFN0ZXBHcm91cENvbmZpZyB7XG4gICAgcmV0dXJuICdncm91cE5hbWUnIGluIHN0ZXA7XG4gIH1cblxuICBvbkFkZEJyYW5jaCgpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBjb25kaXRpb24gc3RlcHNcbiAgfVxuXG4gIG9uRGVsZXRlQnJhbmNoKGJyYW5jaDogYW55KTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgY29uZGl0aW9uIHN0ZXBzXG4gIH1cblxuICBvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaChuZXN0ZWRTdGVwOiBDb25kaXRpb25TdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQWRkIGEgbmV3IGJyYW5jaCB0byB0aGUgbmVzdGVkIGNvbmRpdGlvbiBzdGVwXG4gICAgaWYgKCFuZXN0ZWRTdGVwLmJyYW5jaGVzKSB7XG4gICAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzID0gW107XG4gICAgfVxuICAgIGNvbnN0IG5ld0JyYW5jaDogQ29uZGl0aW9uQnJhbmNoID0ge1xuICAgICAgdHlwZTogbmVzdGVkU3RlcC5icmFuY2hlcy5sZW5ndGggPT09IDAgPyAnaWYnIDogJ2Vsc2UnLFxuICAgICAgbGFiZWw6IG5lc3RlZFN0ZXAuYnJhbmNoZXMubGVuZ3RoID09PSAwID8gJ0lGIFRSVUUnIDogJ0VMU0UnLCBcbiAgICAgIHN0ZXBUeXBlOiBTdGVwVHlwZXMuQ09ORElUSU9OX0lGLFxuICAgICAgbmVzdGVkU3RlcHM6IFtdXG4gICAgfTtcbiAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzLnB1c2gobmV3QnJhbmNoKTtcbiAgICB0aGlzLm9uTmVzdGVkU3RlcENoYW5nZShuZXN0ZWRTdGVwLCBpbmRleCk7XG4gIH1cblxuICBvbk5lc3RlZENvbmRpdGlvbkRlbGV0ZUJyYW5jaChuZXN0ZWRTdGVwOiBDb25kaXRpb25TdGVwQ29uZmlnLCBicmFuY2g6IGFueSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFJlLWVtaXQgZGVsZXRlQnJhbmNoIHNvIHN0ZXAtbGlzdCBjYW4gb3BlbiBkZWxldGUgbW9kYWwgYW5kIGNhbGwgQVBJXG4gICAgdGhpcy5kZWxldGVCcmFuY2guZW1pdChicmFuY2gpO1xuICB9XG5cbiAgb25PcGVuRXh0ZXJuYWwoKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgc3RlcCBncm91cHNcbiAgfVxuXG4gIC8qKiBTeW5jIEZPUiBsb29wIGVkaXQgZm9ybSBzbyBkcm9wZG93bnMgc2hvdyBleGlzdGluZyBjb25maWcgKGZvck9wdGlvblR5cGUsIGZvckxvb3BUZXN0RGF0YUlkL3Rlc3REYXRhUHJvZmlsZSwgZm9yTG9vcFN0YXJ0SW5kZXgvZm9yTG9vcEVuZEluZGV4KSAqL1xuICBwcml2YXRlIHN5bmNGb3JMb29wRWRpdEZvcm1Gcm9tQ29uZmlnKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0Rm9ybSB8fCB0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuO1xuICAgIGNvbnN0IHRlc3REYXRhVmFsID0gdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVGb3JtVmFsdWUoKTtcbiAgICBjb25zdCBzdGFydFZhbCA9IHRoaXMuZ2V0TG9vcFN0YXJ0Rm9ybVZhbHVlKCk7XG4gICAgY29uc3QgZW5kVmFsID0gdGhpcy5nZXRMb29wRW5kRm9ybVZhbHVlKCk7XG4gICAgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIGZvck9wdGlvblR5cGU6IHRoaXMuZ2V0Rm9yT3B0aW9uVHlwZUZyb21Db25maWcoKSA/PyBudWxsLFxuICAgICAgdGVzdERhdGFQcm9maWxlOiB0ZXN0RGF0YVZhbCxcbiAgICAgIHN0YXJ0U3RlcDogc3RhcnRWYWwsXG4gICAgICBlbmRTdGVwOiBlbmRWYWwsXG4gICAgfSk7XG4gICAgLy8gRXhwbGljaXRseSBzZXQgZWFjaCBjb250cm9sIHNvIG1hdC1zZWxlY3QgcGlja3MgdXAgdGhlIHZhbHVlIChwYXRjaFZhbHVlIGNhbiBiZSBpZ25vcmVkIGJ5IGNoaWxkIGluIHNvbWUgdGltaW5nIGNhc2VzKVxuICAgIGNvbnN0IHRlc3REYXRhQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKTtcbiAgICBjb25zdCBzdGFydEN0cmwgPSB0aGlzLmVkaXRGb3JtLmdldCgnc3RhcnRTdGVwJyk7XG4gICAgY29uc3QgZW5kQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdlbmRTdGVwJyk7XG4gICAgaWYgKHRlc3REYXRhQ3RybCAmJiB0ZXN0RGF0YVZhbCAhPT0gdW5kZWZpbmVkICYmIHRlc3REYXRhVmFsICE9PSAnJykgdGVzdERhdGFDdHJsLnNldFZhbHVlKHRlc3REYXRhVmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgaWYgKHN0YXJ0Q3RybCAmJiBzdGFydFZhbCAhPSBudWxsKSBzdGFydEN0cmwuc2V0VmFsdWUoc3RhcnRWYWwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICBpZiAoZW5kQ3RybCAmJiBlbmRWYWwgIT0gbnVsbCkgZW5kQ3RybC5zZXRWYWx1ZShlbmRWYWwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBvbkVkaXQoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0U25hcHNob3QgPSB7XG4gICAgICB0ZXN0RGF0YVByb2ZpbGU6IHRoaXMudGVzdERhdGFQcm9maWxlLFxuICAgICAgc3RhcnRTdGVwOiB0aGlzLnN0YXJ0U3RlcCxcbiAgICAgIGVuZFN0ZXA6IHRoaXMuZW5kU3RlcCxcbiAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24sXG4gICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMsXG4gICAgICBzZWxlY3RlZFRlbXBsYXRlOiB0aGlzLnNlbGVjdGVkVGVtcGxhdGUsXG4gICAgICB0ZW1wbGF0ZVZhcmlhYmxlczogdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA/IFsuLi50aGlzLnRlbXBsYXRlVmFyaWFibGVzXSA6IFtdLFxuICAgICAgY29uZGl0aW9uVGVtcGxhdGVGb3JtVmFsdWU6IHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID8geyAuLi50aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS52YWx1ZSB9IDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgLy8gRk9SIGxvb3A6IHJlZnJlc2ggc2VsZWN0IGNvbmZpZ3MgKHNvIFRlc3QgRGF0YSBQcm9maWxlIG9wdGlvbnMgaW5jbHVkZSBzZWxlY3RlZCBpZCBpZiBuZWVkZWQpIHRoZW4gc3luYyBmb3JtIHNvIGRyb3Bkb3ducyBzaG93IHNlbGVjdGVkXG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZvckxvb3BTZWxlY3RDb25maWdzU2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICAgIHRoaXMuc3luY0Zvckxvb3BFZGl0Rm9ybUZyb21Db25maWcoKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnN5bmNGb3JMb29wRWRpdEZvcm1Gcm9tQ29uZmlnKCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICB0ZXN0RGF0YVByb2ZpbGU6IHRoaXMudGVzdERhdGFQcm9maWxlID8/ICcnLFxuICAgICAgICBzdGFydFN0ZXA6IHRoaXMuc3RhcnRTdGVwID8/IG51bGwsXG4gICAgICAgIGVuZFN0ZXA6IHRoaXMuZW5kU3RlcCA/PyBudWxsLFxuICAgICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uID8/ICcnLFxuICAgICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgLy8gV2hlbiBuYXR1cmFsVGV4dEFjdGlvbklkIGV4aXN0cywgcG9wdWxhdGUgY29uZGl0aW9uIGFuZCBzZWxlY3RlZCB0ZW1wbGF0ZSBmcm9tIG9wdGlvbnMgc28gYXV0b2NvbXBsZXRlIHNob3dzIHNlbGVjdGVkIHRlbXBsYXRlXG4gICAgICBjb25zdCBjb25maWdXaXRoSWQgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgICBpZiAoY29uZmlnV2l0aElkPy5uYXR1cmFsVGV4dEFjdGlvbklkICE9IG51bGwgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25kaXRpb24gfHwgY29uZmlnV2l0aElkPy50ZW1wbGF0ZVZhcmlhYmxlc0RhdGEpIHtcbiAgICAgICAgLy8gRmFsbGJhY2s6IG1hdGNoIGJ5IGNvbmRpdGlvbiB0ZXh0IHdoZW4gbmF0dXJhbFRleHRBY3Rpb25JZCBub3Qgc2V0XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblN0ciA9IHRoaXMuY29uZGl0aW9uIHx8IGNvbmZpZ1dpdGhJZD8uY29uZGl0aW9uIHx8ICcnO1xuICAgICAgICBpZiAoY29uZGl0aW9uU3RyICYmICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgfHwgW10pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXMgYW55W10pLmZpbmQoXG4gICAgICAgICAgICAob3B0OiBhbnkpID0+IChvcHQubmF0dXJhbFRleHQgfHwgb3B0Lm5hbWUgfHwgb3B0LnZhbHVlKSA9PT0gY29uZGl0aW9uU3RyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbj8udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgICAgICAgaWYgKGZ1bGxUZW1wbGF0ZSAmJiBmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBmdWxsVGVtcGxhdGU7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy5idWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgY29uZGl0aW9uOiB0aGlzLmNvbmRpdGlvbiA/PyAnJyxcbiAgICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zID8/IDUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5pc0VkaXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZWRpdC5lbWl0KCk7XG4gIH1cblxuICBvbkVkaXRBcHBseSgpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5lZGl0Rm9ybS52YWx1ZTtcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSA9IHYudGVzdERhdGFQcm9maWxlID8/ICcnO1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdi5zdGFydFN0ZXAgPz8gdW5kZWZpbmVkO1xuICAgIHRoaXMuZW5kU3RlcCA9IHYuZW5kU3RlcCA/PyB1bmRlZmluZWQ7XG4gICAgdGhpcy5jb25kaXRpb24gPSB2LmNvbmRpdGlvbiA/PyAnJztcbiAgICBjb25zdCBtYXhWYWwgPSB2Lm1heEl0ZXJhdGlvbnM7XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdHlwZW9mIG1heFZhbCA9PT0gJ251bWJlcicgPyBtYXhWYWwgOiAobWF4VmFsICE9IG51bGwgJiYgbWF4VmFsICE9PSAnJyA/IE51bWJlcihtYXhWYWwpIDogdW5kZWZpbmVkKTtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBzZWxlY3RlZCBkYXRhIHByb2ZpbGUgb3B0aW9uIHRvIGdldCBib3RoIElEIGFuZCBuYW1lXG4gICAgbGV0IHRlc3REYXRhUHJvZmlsZUlkOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRlc3REYXRhUHJvZmlsZU5hbWU6IHN0cmluZyA9ICcnO1xuICAgIFxuICAgIGlmICh0ZXN0RGF0YVByb2ZpbGVWYWx1ZSAmJiB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgZm9ybSB2YWx1ZSBtaWdodCBiZSBJRCAobnVtYmVyKSBvciBuYW1lIChzdHJpbmcpXG4gICAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5maW5kKFxuICAgICAgICBvcHRpb24gPT4gb3B0aW9uLmlkID09PSBOdW1iZXIodGVzdERhdGFQcm9maWxlVmFsdWUpIHx8IG9wdGlvbi5uYW1lID09PSB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSB8fCBTdHJpbmcob3B0aW9uLmlkKSA9PT0gU3RyaW5nKHRlc3REYXRhUHJvZmlsZVZhbHVlKVxuICAgICAgKTtcbiAgICAgIGlmIChzZWxlY3RlZFByb2ZpbGUpIHtcbiAgICAgICAgdGVzdERhdGFQcm9maWxlSWQgPSBzZWxlY3RlZFByb2ZpbGUuaWQ7XG4gICAgICAgIHRlc3REYXRhUHJvZmlsZU5hbWUgPSBzZWxlY3RlZFByb2ZpbGUubmFtZTtcbiAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0ZXN0RGF0YVByb2ZpbGVOYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgbm90IGZvdW5kLCB1c2UgdGhlIHZhbHVlIGFzLWlzIChtaWdodCBiZSBJRCBvciBuYW1lKVxuICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZVZhbHVlO1xuICAgICAgICB0ZXN0RGF0YVByb2ZpbGVJZCA9IE51bWJlcih0ZXN0RGF0YVByb2ZpbGVWYWx1ZSkgfHwgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZVZhbHVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBXaGlsZSBsb29wOiBidWlsZCB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgYW5kIG5hdHVyYWxUZXh0QWN0aW9uSWQgZnJvbSBzZWxlY3RlZCB0ZW1wbGF0ZSAoc2FtZSBhcyBjb25kaXRpb24tc3RlcClcbiAgICBsZXQgdGVtcGxhdGVWYXJpYWJsZXNEYXRhOiBhbnk7XG4gICAgbGV0IG5hdHVyYWxUZXh0QWN0aW9uSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJyAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzPy5sZW5ndGgpIHtcbiAgICAgIHRlbXBsYXRlVmFyaWFibGVzRGF0YSA9IHt9O1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgdGVtcGxhdGVWYXJpYWJsZXNEYXRhW3ZhcmlhYmxlLm5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZT8uaWQgIT0gbnVsbCkge1xuICAgICAgICBuYXR1cmFsVGV4dEFjdGlvbklkID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlLmlkO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUgY29uZmlnIHdpdGggbmV3IHZhbHVlcyAoaW5jbHVkZSB0ZXN0RGF0YVByb2ZpbGVJZCwgdGVtcGxhdGVWYXJpYWJsZXNEYXRhLCBuYXR1cmFsVGV4dEFjdGlvbklkIGZvciB3aGlsZTsgZm9yTG9vcFRlc3REYXRhSWQsIGZvckxvb3BTdGFydEluZGV4L2Zvckxvb3BFbmRJbmRleCBmb3IgZm9yKVxuICAgIGNvbnN0IHVwZGF0ZWRDb25maWc6IExvb3BTdGVwQ29uZmlnICYgeyB0ZXN0RGF0YVByb2ZpbGVJZD86IHN0cmluZyB8IG51bWJlcjsgdGVtcGxhdGVWYXJpYWJsZXNEYXRhPzogYW55OyBuYXR1cmFsVGV4dEFjdGlvbklkPzogbnVtYmVyIH0gPSB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGhpcy50ZXN0RGF0YVByb2ZpbGUsXG4gICAgICB0ZXN0RGF0YVByb2ZpbGVJZDogdGVzdERhdGFQcm9maWxlSWQsIC8vIEFkZCBJRCBmb3IgQVBJIGNhbGxcbiAgICAgIHN0YXJ0U3RlcDogdGhpcy5zdGFydFN0ZXAsXG4gICAgICBlbmRTdGVwOiB0aGlzLmVuZFN0ZXAsXG4gICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uLFxuICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zLFxuICAgICAgLi4uKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScgJiYgT2JqZWN0LmtleXModGVtcGxhdGVWYXJpYWJsZXNEYXRhIHx8IHt9KS5sZW5ndGggPiAwICYmIHsgdGVtcGxhdGVWYXJpYWJsZXNEYXRhIH0pLFxuICAgICAgLi4uKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScgJiYgbmF0dXJhbFRleHRBY3Rpb25JZCAhPSBudWxsICYmIHsgbmF0dXJhbFRleHRBY3Rpb25JZCB9KSxcbiAgICAgIC4uLih0aGlzLmxvb3BUeXBlID09PSAnZm9yJyAmJiB0ZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmIHsgZm9yTG9vcFRlc3REYXRhSWQ6IE51bWJlcih0ZXN0RGF0YVByb2ZpbGVJZCkgfSksXG4gICAgICAuLi4odGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgJiYgdGhpcy5zdGFydFN0ZXAgIT0gbnVsbCAmJiB7IGZvckxvb3BTdGFydEluZGV4OiB0aGlzLnN0YXJ0U3RlcCB9KSxcbiAgICAgIC4uLih0aGlzLmxvb3BUeXBlID09PSAnZm9yJyAmJiB0aGlzLmVuZFN0ZXAgIT0gbnVsbCAmJiB7IGZvckxvb3BFbmRJbmRleDogdGhpcy5lbmRTdGVwIH0pLFxuICAgIH07XG4gICAgXG4gICAgLy8gRW1pdCBpbmRpdmlkdWFsIGNoYW5nZSBldmVudHNcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZUNoYW5nZS5lbWl0KHRoaXMudGVzdERhdGFQcm9maWxlKTtcbiAgICB0aGlzLnN0YXJ0U3RlcENoYW5nZS5lbWl0KHRoaXMuc3RhcnRTdGVwID8/IDEpO1xuICAgIHRoaXMuZW5kU3RlcENoYW5nZS5lbWl0KHRoaXMuZW5kU3RlcCA/PyAxKTtcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgdGhpcy5jb25kaXRpb25DaGFuZ2UuZW1pdCh0aGlzLmNvbmRpdGlvbik7XG4gICAgICB0aGlzLm1heEl0ZXJhdGlvbnNDaGFuZ2UuZW1pdCh0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVtaXQgc3RlcCB1cGRhdGUgZXZlbnQgd2l0aCBmdWxsIGNvbmZpZ1xuICAgIGNvbnNvbGUubG9nKCdMb29wLXN0ZXA6IEVtaXR0aW5nIHN0ZXBVcGRhdGUgZXZlbnQnLCB1cGRhdGVkQ29uZmlnKTtcbiAgICB0aGlzLnN0ZXBVcGRhdGUuZW1pdCh1cGRhdGVkQ29uZmlnKTtcbiAgICBcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25FZGl0Q2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGhpcy5lZGl0U25hcHNob3QudGVzdERhdGFQcm9maWxlO1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdGhpcy5lZGl0U25hcHNob3Quc3RhcnRTdGVwO1xuICAgIHRoaXMuZW5kU3RlcCA9IHRoaXMuZWRpdFNuYXBzaG90LmVuZFN0ZXA7XG4gICAgdGhpcy5jb25kaXRpb24gPSB0aGlzLmVkaXRTbmFwc2hvdC5jb25kaXRpb247XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdGhpcy5lZGl0U25hcHNob3QubWF4SXRlcmF0aW9ucztcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSB0aGlzLmVkaXRTbmFwc2hvdC5zZWxlY3RlZFRlbXBsYXRlO1xuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLmVkaXRTbmFwc2hvdC50ZW1wbGF0ZVZhcmlhYmxlcyB8fCBbXTtcbiAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gJiYgdGhpcy5lZGl0U25hcHNob3QuY29uZGl0aW9uVGVtcGxhdGVGb3JtVmFsdWUpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtLnBhdGNoVmFsdWUodGhpcy5lZGl0U25hcHNob3QuY29uZGl0aW9uVGVtcGxhdGVGb3JtVmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25FZGl0SW5EZXB0aCh0ZW1wbGF0ZU92ZXJyaWRlPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5tb3JlT3B0aW9ucy5lbWl0KCk7XG4gICAgLy8gVXNlIHJlbmRlcmVyJ3MgaW5kZXggd2hlbiBhdmFpbGFibGUgKGNvcnJlY3QgZm9yIHN0cnVjdHVyYWwgc3RlcHMpLiBzdGVwTnVtYmVyIFwiMTAuM1wiIHBhcnNlcyB0byAxMCAtIHdyb25nLlxuICAgIGNvbnN0IGluZGV4ID0gdHlwZW9mIHRoaXMuaW5kZXggPT09ICdudW1iZXInXG4gICAgICA/IHRoaXMuaW5kZXhcbiAgICAgIDogKHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdudW1iZXInID8gdGhpcy5zdGVwTnVtYmVyIDogKHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQodGhpcy5zdGVwTnVtYmVyLCAxMCkgOiAwKSk7XG4gICAgY29uc3QgcGF5bG9hZDogeyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXI7IHRlbXBsYXRlT3ZlcnJpZGU/OiBhbnkgfSA9IHtcbiAgICAgIHN0ZXA6IHRoaXMuY29uZmlnIGFzIFRlc3RDYXNlU3RlcENvbmZpZyxcbiAgICAgIGluZGV4OiBpc05hTihpbmRleCBhcyBudW1iZXIpID8gMCA6IChpbmRleCBhcyBudW1iZXIpLFxuICAgIH07XG4gICAgaWYgKHRlbXBsYXRlT3ZlcnJpZGUpIHtcbiAgICAgIHBheWxvYWQudGVtcGxhdGVPdmVycmlkZSA9IHRlbXBsYXRlT3ZlcnJpZGU7XG4gICAgfVxuICAgIHRoaXMuZWRpdEluRGVwdGguZW1pdChwYXlsb2FkKTtcbiAgfVxuXG4gIG9uTGluaygpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBzdGVwIGdyb3Vwc1xuICB9XG5cbiAgb25EdXBsaWNhdGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEdXBsaWNhdGluZykgcmV0dXJuO1xuICAgIHRoaXMuZHVwbGljYXRlLmVtaXQoKTtcbiAgfVxuXG4gIG9uRGVsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlLmVtaXQoKTtcbiAgfVxuXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gY2hlY2tlZDtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KGNoZWNrZWQpO1xuICB9XG5cbiAgb25Nb3JlT3B0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLm1vcmVPcHRpb25zLmVtaXQoKTtcbiAgfVxuXG4gIG9uVmlld0RldGFpbHMoZXZlbnQ/OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIFxuICAgIGlmICghdGhpcy5jb25maWcuZGVzY3JpcHRpb24gfHwgdGhpcy5jb25maWcuZGVzY3JpcHRpb24udHJpbSgpID09PSAnJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudCkge1xuICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdGT1IgTE9PUCBEZXRhaWxzJyA6ICdXSElMRSBMT09QIERldGFpbHMnO1xuICAgICAgdGhpcy52aWV3RGV0YWlscy5lbWl0KHtcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRpdGxlLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5jb25maWcuZGVzY3JpcHRpb24sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJsb29wLXN0ZXAtcm93IGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICA8IS0tIElubGluZSBFZGl0IE1vZGU6IHN0b3AgcHJvcGFnYXRpb24gc28gZHJvcGRvd24vc2VsZWN0IGludGVyYWN0aW9ucyBkb24ndCBidWJibGUgYW5kIGNvbGxhcHNlIHRoZSBzdGVwIG9yIHN0YXJ0IGRyYWcgLS0+XG4gIDxkaXYgKm5nSWY9XCJpc0VkaXRpbmdcIiBjbGFzcz1cImNxYS1weS0yLjUgY3FhLXB4LTQgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtanVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWZsZXgtZ3JvdyBjcWEtZmxleC13cmFwIGNxYS1taW4tdy0wXCI+XG4gICAgICAgIDwhLS0gTG9vcCBUeXBlIExhYmVsIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxQzM5OEVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgICAgICB7eyBnZXRMb29wVHlwZUxhYmVsKCkgfX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGT1IgTE9PUCBpbmxpbmUgZWRpdDogY3FhLWR5bmFtaWMtc2VsZWN0IChzYW1lIHVzYWdlIGFzIGRlZmF1bHQgc3RvcmllcykgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgICAgICAgICA8IS0tIEZpcnN0IHNlbGVjdDogd2lkdGggMjE2LjI1cHgsIGhlaWdodCAzNnB4LCBnYXAgNHB4LCBvcGFjaXR5IDEgLS0+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwiZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImVkaXRGb3JtXCIgW2NvbmZpZ109XCJ0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwic3RhcnRTdGVwU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cImVuZFN0ZXBTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gV0hJTEUgTE9PUCBpbmxpbmUgZWRpdDogY3FhLWF1dG9jb21wbGV0ZSArIHRlbXBsYXRlIHZhcmlhYmxlcyAoc2FtZSBhcyBjb25kaXRpb24tc3RlcCkgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1doaWxlTG9vcCgpXCI+XG4gICAgICAgICAgPGNxYS1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICpuZ0lmPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwid2hpbGVDb25kaXRpb25BdXRvY29tcGxldGVPcHRpb25zXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ3aGlsZUNvbmRpdGlvbkRpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdjb25kaXRpb24nLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChvcHRpb25TZWxlY3QpPVwib25Db25kaXRpb25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBjb25kaXRpb25cIlxuICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPlxuICAgICAgICAgIDwvY3FhLWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICA8IS0tIFRlbXBsYXRlIHZhcmlhYmxlcyBoaWRkZW4gaW4gd2hpbGUgbG9vcCAtIHVzZSBFZGl0IEluIGRlcHRoIHRvIGNvbmZpZ3VyZSAtLT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBFZGl0IEluIGRlcHRoIGxpbmsgLS0+XG4gICAgICA8YSBocmVmPVwiI1wiICpuZ0lmPVwiaXNXaGlsZUxvb3AoKVwiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVsycHhdIGNxYS1uby11bmRlcmxpbmVcIj5cbiAgICAgICAgRWRpdCBJbiBkZXB0aFxuICAgICAgICA8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTIuMDM4MDkgNi43NDMyOUwyLjYyODA5IDcuMzMzMjlMNS45NjE0MiAzLjk5OTk2TDIuNjI4MDkgMC42NjY2MjZMMi4wMzgwOSAxLjI1NjYzTDQuNzgxNDIgMy45OTk5NkwyLjAzODA5IDYuNzQzMjlaXCJcbiAgICAgICAgICAgIGZpbGw9XCIjM0Y0M0VFXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2E+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgPCEtLSBDYW5jZWwgLyBBcHBseSAtLT5cbiAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQ2FuY2VsJ1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uRWRpdENhbmNlbCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQXBwbHknXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25FZGl0QXBwbHkoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIExvb3AgSGVhZGVyIChub3JtYWwgdmlldyB3aGVuIG5vdCBlZGl0aW5nKSAtLT5cbiAgPGRpdiAqbmdJZj1cIiFpc0VkaXRpbmdcIlxuICAgIFtjbGFzc109XCInc3RlcC1yb3cgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LTIgJyArIChpc0luc2lkZUxvb3AgJiYgaXNJbnNpZGVTdGVwR3JvdXAgPyAnY3FhLXBsLTIwIGNxYS1wci00JyA6IChpc0luc2lkZUxvb3AgfHwgaXNJbnNpZGVTdGVwR3JvdXApID8gJ2NxYS1wbC0xMCBjcWEtcHItNCcgOiAnY3FhLXB4LTQnKVwiXG4gICAgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI0U1RTdFQjtcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICA8IS0tIERyYWcgSGFuZGxlIEljb24gKHdoZW4gaXNSZW9yZGVyIGlzIHRydWUgYW5kIG5vdCBpbnNpZGUgc3RlcCBncm91cCAtIHN0ZXBzIGluc2lkZSBzdGVwIGdyb3VwcyBjYW5ub3QgYmUgcmVvcmRlcmVkKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNSZW9yZGVyICYmICFpc0luc2lkZVN0ZXBHcm91cFwiIGNsYXNzPVwiY3FhLW1yLTIgY3FhLWN1cnNvci1tb3ZlIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtdGV4dC1bIzExMTgyN11cIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBDaGVja2JveCAod2hlbiBpc1Jlb3JkZXIgaXMgZmFsc2UgYW5kIG5vdCBpbnNpZGUgc3RlcCBncm91cCAtIGhpZGUgZm9yIHN0ZXBzIGluc2lkZSBzdGVwIGdyb3VwcykgLS0+XG4gICAgPGxhYmVsICpuZ0lmPVwiZWRpdGFibGUgJiYgIWlzUmVvcmRlciAmJiAhaXNJbnNpZGVTdGVwR3JvdXBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1yZWxhdGl2ZSBjcWEtbXItMlwiPlxuICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWgtNCBjcWEtdy00IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWFwcGVhcmFuY2Utbm9uZSBjcWEtcm91bmRlZCBzaGFkb3cgaG92ZXI6Y3FhLXNoYWRvdy1tZCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1zbGF0ZS0zMDAgY3FhLWZsZXgtc2hyaW5rLTBcIlxuICAgICAgICBbY2xhc3MuY3FhLWJnLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFwiXG4gICAgICAgIGlkPVwiY2hlY2stbG9vcC1zdGVwXCIgLz5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS10ZXh0LXdoaXRlIGNxYS10b3AtMS8yIGNxYS1sZWZ0LTEvMiBjcWEtLXRyYW5zbGF0ZS14LTEvMiBjcWEtLXRyYW5zbGF0ZS15LTEvMiBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0wXT1cIiFzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0xMDBdPVwic2VsZWN0ZWRcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDEyIDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xMCAzLjEyNUw0LjUgOC42MjVMMiA2LjEyNVwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtbWluLXctWzMycHhdXCI+e3sgc3RlcE51bWJlciB9fTwvc3Bhbj5cbiAgICA8IS0tIEV4cGFuZC9Db2xsYXBzZSBJY29uIC0tPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblRvZ2dsZUV4cGFuZGVkKClcIiBjbGFzcz1cImNxYS1wLTBcIj5cbiAgICAgIDxzdmcgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cIiFleHBhbmRlZFwiIGNsYXNzPVwiY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcbiAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTEyIDEwTDggNkw0IDEwXCIgc3Ryb2tlPVwiIzZCNzI4MFwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2J1dHRvbj5cblxuICAgIDwhLS0gTG9vcCBJY29uIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTExLjMzNCAxLjMzMzI1TDE0LjAwMDcgMy45OTk5MkwxMS4zMzQgNi42NjY1OVwiIHN0cm9rZT1cIiMxQzM5OEVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTIgNy4zMzMzM1Y2LjY2NjY3QzIgNS45NTk0MiAyLjI4MDk1IDUuMjgxMTUgMi43ODEwNSA0Ljc4MTA1QzMuMjgxMTUgNC4yODA5NSAzLjk1OTQyIDQgNC42NjY2NyA0SDE0XCJcbiAgICAgICAgICBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNNC42NjY2NyAxNC42NjY2TDIgMTEuOTk5OUw0LjY2NjY3IDkuMzMzMjVcIiBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTE0IDguNjY2NzVWOS4zMzM0MUMxNCAxMC4wNDA3IDEzLjcxOSAxMC43MTg5IDEzLjIxOSAxMS4yMTlDMTIuNzE4OSAxMS43MTkxIDEyLjA0MDYgMTIuMDAwMSAxMS4zMzMzIDEyLjAwMDFIMlwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzFDMzk4RVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImxvb3BUeXBlID09PSAnd2hpbGUnXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMS4zMzQgMS4zMzMyNUwxNC4wMDA3IDMuOTk5OTJMMTEuMzM0IDYuNjY2NTlcIiBzdHJva2U9XCIjNTkxNjhCXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGggZD1cIk0yIDcuMzMzMzNWNi42NjY2N0MyIDUuOTU5NDIgMi4yODA5NSA1LjI4MTE1IDIuNzgxMDUgNC43ODEwNUMzLjI4MTE1IDQuMjgwOTUgMy45NTk0MiA0IDQuNjY2NjcgNEgxNFwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTQuNjY2NjcgMTQuNjY2NkwyIDExLjk5OTlMNC42NjY2NyA5LjMzMzI1XCIgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xNCA4LjY2Njc1VjkuMzMzNDFDMTQgMTAuMDQwNyAxMy43MTkgMTAuNzE4OSAxMy4yMTkgMTEuMjE5QzEyLjcxODkgMTEuNzE5MSAxMi4wNDA2IDEyLjAwMDEgMTEuMzMzMyAxMi4wMDAxSDJcIlxuICAgICAgICAgIHN0cm9rZT1cIiM1OTE2OEJcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBMb29wIFR5cGUgTGFiZWwgLS0+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLW5vbmVcIj5cbiAgICAgIHt7IGdldExvb3BUeXBlTGFiZWwoKSB9fVxuICAgIDwvc3Bhbj5cblxuICAgIDwhLS0gRm9yIExvb3AgRGlzcGxheTogaXRlbXMgZmxvdyBvbiBvbmUgcm93OyBvbmx5IHdyYXAgdG8gbmV4dCBsaW5lIHdoZW4gdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwibG9vcFR5cGUgPT09ICdmb3InICYmIChoYXNUZXN0RGF0YVByb2ZpbGUoKSB8fCBoYXNTdGFydFZhbHVlKCkgfHwgaGFzRW5kVmFsdWUoKSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLXgtMyBjcWEtZ2FwLXktMSBjcWEtbWwtMiBjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICA8c3BhbiAqbmdJZj1cImdldEZvckxvb3BQcm9maWxlRGlzcGxheSgpXCIgY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN10gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtYWN0aW9uLWZvcm1hdFwiIFtpbm5lckhUTUxdPVwiZ2V0Rm9yTG9vcFByb2ZpbGVEaXNwbGF5KCkgfCBjcWFTYWZlSHRtbFwiIChjbGljayk9XCJvbkxvb3BBY3Rpb25DbGljaygkZXZlbnQpXCI+PC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJnZXRGb3JMb29wUmFuZ2VEaXNwbGF5KClcIiBjbGFzcz1cImZvci1sb29wLXJhbmdlLXJvdyBjcWEtdGV4dC1bIzExMTgyN10gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtYWN0aW9uLWZvcm1hdFwiIFtpbm5lckhUTUxdPVwiZ2V0Rm9yTG9vcFJhbmdlRGlzcGxheSgpIHwgY3FhU2FmZUh0bWxcIiAoY2xpY2spPVwib25Mb29wQWN0aW9uQ2xpY2soJGV2ZW50KVwiPjwvc3Bhbj5cbiAgICAgIDxkaXYgKm5nSWY9XCJnZXRMb29wRXZlbnREZXRhaWxzRm9yRGlzcGxheSgpLmxlbmd0aCA+IDBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0yIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0TG9vcEV2ZW50RGV0YWlsc0ZvckRpc3BsYXkoKVwiIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXJvdW5kZWQgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtYmctWyNGM0Y0RjZdIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl1cIiAoY2xpY2spPVwib25Mb29wQWN0aW9uQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXVwiPnt7IGl0ZW0ua2V5IH19Ojwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMTExODI3XSBjcWEtYnJlYWstd29yZHNcIj57eyBpdGVtLnZhbHVlIH19PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gV2hpbGUgTG9vcCBDb25kaXRpb24gKG9ubHkgc2hvdyBpZiBjb25kaXRpb24gZXhpc3RzKSAtIHNhbWUgc3R5bGluZyBhcyBjb25kaXRpb24gc3RlcCAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNXaGlsZUxvb3AoKSAmJiBjb25kaXRpb25cIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1tbC0yIGNxYS1mbGV4LTEgY3FhLWZsZXgtd3JhcFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN10gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtYWN0aW9uLWZvcm1hdFwiIFtpbm5lckhUTUxdPVwiZ2V0Q29uZGl0aW9uRGlzcGxheSgpIHwgY3FhU2FmZUh0bWxcIiAoY2xpY2spPVwib25Mb29wQWN0aW9uQ2xpY2soJGV2ZW50KVwiPjwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwibWF4SXRlcmF0aW9ucyAhPSBudWxsICYmIG1heEl0ZXJhdGlvbnMgPiAwXCIgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtcm91bmRlZCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1iZy1bI0YzRjRGNl0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiIChjbGljayk9XCJvbkxvb3BBY3Rpb25DbGljaygkZXZlbnQpXCIgZGF0YS1rZXk9XCJtYXhJdGVyYXRpb25zXCIgZGF0YS1ldmVudC1rZXk9XCJtYXhJdGVyYXRpb25zXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXVwiPm1heCBpdGVyYXRpb25zOjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN11cIj57eyBtYXhJdGVyYXRpb25zIH19PC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldExvb3BFdmVudERldGFpbHNGb3JEaXNwbGF5KCkubGVuZ3RoID4gMFwiPlxuICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRMb29wRXZlbnREZXRhaWxzRm9yRGlzcGxheSgpXCIgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtcm91bmRlZCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1iZy1bI0YzRjRGNl0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiIChjbGljayk9XCJvbkxvb3BBY3Rpb25DbGljaygkZXZlbnQpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM2QjcyODBdXCI+e3sgaXRlbS5rZXkgfX06PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMxMTE4MjddXCI+e3sgaXRlbS52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLW1sLWF1dG9cIj5cbiAgICAgIDwhLS0gU3RlcHMgU3VtbWFyeSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjcWEtbWwtYXV0byBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTVFNV0gY3FhLXJvdW5kZWQtbGcgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPlxuICAgICAgICB7eyBnZXRTdGVwc1N1bW1hcnkoKSB9fVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVmlldyBEZXRhaWxzIExpbmsgKHNob3cgb25seSBpZiBkZXNjcmlwdGlvbiBpcyBub3QgZW1wdHkpIC0tPlxuICAgICAgPGEgKm5nSWY9XCJjb25maWcuZGVzY3JpcHRpb24gJiYgY29uZmlnLmRlc2NyaXB0aW9uLnRyaW0oKSAhPT0gJydcIiAjdmlld0RldGFpbHNUcmlnZ2VyIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uVmlld0RldGFpbHMoJGV2ZW50KVwiIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1uby11bmRlcmxpbmUgY3FhLW1sLWF1dG9cIj5WaWV3IERldGFpbHM8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz48L2E+XG5cbiAgICAgIDwhLS0gQWN0aW9uIEljb25zOiBFZGl0LCBMaW5rLCBEdXBsaWNhdGUsIERlbGV0ZSAoc2hvdyBvbiBob3ZlcjsgaGlkZGVuIHdoZW4gaW5zaWRlIHN0ZXAtZ3JvdXApIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImVkaXRhYmxlICYmICFpc0luc2lkZVN0ZXBHcm91cCAmJiAhaXNSZW9yZGVyXCIgY2xhc3M9XCJzdGVwLWFjdGlvbnMgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB4LVs3cHhdXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkVkaXQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJFZGl0XCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03IDExLjY2NjZIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNOS41NTIwOCAyLjExMjhDOS43ODQzIDEuODgwNTggMTAuMDk5MyAxLjc1MDEyIDEwLjQyNzcgMS43NTAxMkMxMC43NTYxIDEuNzUwMTIgMTEuMDcxIDEuODgwNTggMTEuMzAzMyAyLjExMjhDMTEuNTM1NSAyLjM0NTAyIDExLjY2NTkgMi42NTk5OCAxMS42NjU5IDIuOTg4MzhDMTEuNjY1OSAzLjMxNjc5IDExLjUzNTUgMy42MzE3NSAxMS4zMDMzIDMuODYzOTdMNC4yOTc0MiAxMC44NzA0QzQuMTU4NjQgMTEuMDA5MiAzLjk4NzEgMTEuMTEwNyAzLjc5ODY3IDExLjE2NTZMMi4xMjMzMyAxMS42NTQ0QzIuMDczMTQgMTEuNjY5IDIuMDE5OTMgMTEuNjY5OSAxLjk2OTI4IDExLjY1NjlDMS45MTg2MyAxMS42NDM5IDEuODcyNCAxMS42MTc2IDEuODM1NDMgMTEuNTgwNkMxLjc5ODQ2IDExLjU0MzcgMS43NzIxIDExLjQ5NzQgMS43NTkxMyAxMS40NDY4QzEuNzQ2MTUgMTEuMzk2MSAxLjc0NzAzIDExLjM0MjkgMS43NjE2NyAxMS4yOTI3TDIuMjUwNSA5LjYxNzM4QzIuMzA1NDYgOS40MjkxNiAyLjQwNjk4IDkuMjU3ODMgMi41NDU2NyA5LjExOTIyTDkuNTUyMDggMi4xMTI4WlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25MaW5rKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiTGlua1wiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjOTlBMUFmXSBob3ZlcjpjcWEtdGV4dC1bIzE0NDdFNl1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNNS4wMDA2NSA5LjkxNjcxSDMuNjY3MzJDMi43ODMyNiA5LjkxNjcxIDEuOTM1NDIgOS42MDk0MiAxLjMxMDMgOS4wNjI0NEMwLjY4NTE3NCA4LjUxNTQ1IDAuMzMzOTg0IDcuNzczNTkgMC4zMzM5ODQgNy4wMDAwNEMwLjMzMzk4NCA2LjIyNjQ5IDAuNjg1MTc0IDUuNDg0NjMgMS4zMTAzIDQuOTM3NjVDMS45MzU0MiA0LjM5MDY2IDIuNzgzMjYgNC4wODMzNyAzLjY2NzMyIDQuMDgzMzdINS4wMDA2NVwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk05IDQuMDgzMzdIMTAuMzMzM0MxMS4yMTc0IDQuMDgzMzcgMTIuMDY1MiA0LjM5MDY2IDEyLjY5MDQgNC45Mzc2NUMxMy4zMTU1IDUuNDg0NjMgMTMuNjY2NyA2LjIyNjQ5IDEzLjY2NjcgNy4wMDAwNEMxMy42NjY3IDcuNzczNTkgMTMuMzE1NSA4LjUxNTQ1IDEyLjY5MDQgOS4wNjI0NEMxMi4wNjUyIDkuNjA5NDIgMTEuMjE3NCA5LjkxNjcxIDEwLjMzMzMgOS45MTY3MUg5XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTQuMzMzOTggN0g5LjY2NzMyXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJvbkR1cGxpY2F0ZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0R1cGxpY2F0aW5nXCJcbiAgICAgICAgICBbYXR0ci50aXRsZV09XCJpc0R1cGxpY2F0aW5nID8gJ0R1cGxpY2F0aW5nLi4uJyA6ICdEdXBsaWNhdGUnXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XSBkaXNhYmxlZDpjcWEtb3BhY2l0eS02MCBkaXNhYmxlZDpjcWEtY3Vyc29yLW5vdC1hbGxvd2VkXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgKm5nSWY9XCIhaXNEdXBsaWNhdGluZ1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTEuNjY2IDQuNjY2NjNINS44MzI2OEM1LjE4ODM1IDQuNjY2NjMgNC42NjYwMiA1LjE4ODk2IDQuNjY2MDIgNS44MzMyOVYxMS42NjY2QzQuNjY2MDIgMTIuMzExIDUuMTg4MzUgMTIuODMzMyA1LjgzMjY4IDEyLjgzMzNIMTEuNjY2QzEyLjMxMDMgMTIuODMzMyAxMi44MzI3IDEyLjMxMSAxMi44MzI3IDExLjY2NjZWNS44MzMyOUMxMi44MzI3IDUuMTg4OTYgMTIuMzEwMyA0LjY2NjYzIDExLjY2NiA0LjY2NjYzWlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0yLjMzMjY4IDkuMzMzMjlDMS42OTEwMiA5LjMzMzI5IDEuMTY2MDIgOC44MDgyOSAxLjE2NjAyIDguMTY2NjNWMi4zMzMyOUMxLjE2NjAyIDEuNjkxNjMgMS42OTEwMiAxLjE2NjYzIDIuMzMyNjggMS4xNjY2M0g4LjE2NjAyQzguODA3NjggMS4xNjY2MyA5LjMzMjY4IDEuNjkxNjMgOS4zMzI2OCAyLjMzMzI5XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPHN2ZyAqbmdJZj1cImlzRHVwbGljYXRpbmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1sYWJlbD1cIkR1cGxpY2F0aW5nXCI+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCI2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLW9wYWNpdHk9XCIwLjJcIiBzdHJva2Utd2lkdGg9XCIyXCI+PC9jaXJjbGU+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTE0IDhBNiA2IDAgMCAwIDggMlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+XG4gICAgICAgICAgICAgIDxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9XCJ0cmFuc2Zvcm1cIiB0eXBlPVwicm90YXRlXCIgZnJvbT1cIjAgOCA4XCIgdG89XCIzNjAgOCA4XCIgZHVyPVwiMC44c1wiIHJlcGVhdENvdW50PVwiaW5kZWZpbml0ZVwiLz5cbiAgICAgICAgICAgIDwvcGF0aD5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkRlbGV0ZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkRlbGV0ZVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjZmY2NDY3XSBob3ZlcjpjcWEtdGV4dC1bI0M2MzUzNV1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS43NSAzLjVIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTEuMDgyNyAzLjVWMTEuNjY2N0MxMS4wODI3IDEyLjI1IDEwLjQ5OTMgMTIuODMzMyA5LjkxNjAyIDEyLjgzMzNINC4wODI2OEMzLjQ5OTM1IDEyLjgzMzMgMi45MTYwMiAxMi4yNSAyLjkxNjAyIDExLjY2NjdWMy41XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTQuNjY2MDIgMy40OTk5NlYyLjMzMzI5QzQuNjY2MDIgMS43NDk5NiA1LjI0OTM1IDEuMTY2NjMgNS44MzI2OCAxLjE2NjYzSDguMTY2MDJDOC43NDkzNSAxLjE2NjYzIDkuMzMyNjggMS43NDk5NiA5LjMzMjY4IDIuMzMzMjlWMy40OTk5NlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk01LjgzMzk4IDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk04LjE2NjAyIDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBDcmVhdGVkIERhdGUgKGZyb20gQVBJKSAtIGxhc3Qgc28gYWxpZ25lZCBhY3Jvc3MgYWxsIHN0ZXBzLCBmb3JtYXQ6IDI1IEZlYiAyMDI2IC0tPlxuICAgICAgPHNwYW4gKm5nSWY9XCJjb25maWcuY3JlYXRlZERhdGVcIiBjbGFzcz1cInN0ZXAtZGF0ZSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtbWwtYXV0byBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICB7eyBjb25maWcuY3JlYXRlZERhdGUgfCBkYXRlOidkIE1NTSB5eXl5JyB9fVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEV4cGFuZGVkIENvbnRlbnQgd2l0aCBOZXN0ZWQgU3RlcHMgKHJlbmRlcmVyIGRpc3BhdGNoZXMgYnkgc3RlcCB0eXBlLCBuLWxldmVsIG5lc3RpbmcpIC0tPlxuICA8ZGl2ICpuZ0lmPVwiZXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgIDwhLS0gU1RBUlQgTWFya2VyIChjZW50ZXJlZCB3aXRoIGRlY29yYXRpdmUgbGluZXMpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHktMSBjcWEtcHgtNCBjcWEtYmctWyNEQkVBRkU4MF1cIiBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCAjQkVEQkZGO1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMxQzM5OEVdIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXdoaXRlc3BhY2Utbm93cmFwXCI+e3sgZ2V0U3RhcnRMYWJlbCgpIH19PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMxQzM5OEVdIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgIDxjcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXIgKm5nRm9yPVwibGV0IHN0ZXAgb2YgbmVzdGVkU3RlcHM7IGxldCBpID0gaW5kZXhcIiBbc3RlcF09XCJzdGVwXCIgW2luZGV4XT1cImlcIlxuICAgICAgICBbc2VsZWN0ZWRdPVwiJGFueShzdGVwKS5zZWxlY3RlZFwiXG4gICAgICAgIFtpc05lc3RlZF09XCJ0cnVlXCIgW2lzSW5zaWRlTG9vcF09XCJ0cnVlXCIgW2lzSW5zaWRlU3RlcEdyb3VwXT1cImlzSW5zaWRlU3RlcEdyb3VwXCIgW2lzUmVvcmRlcl09XCJpc1Jlb3JkZXJcIlxuICAgICAgICBbYWRkU3RlcEJldHdlZW5dPVwiYWRkU3RlcEJldHdlZW5cIlxuICAgICAgICAgIFtlZGl0YWJsZV09XCJlZGl0YWJsZVwiXG4gICAgICAgIFtkYXRhUHJvZmlsZU9wdGlvbnNdPVwiZGF0YVByb2ZpbGVPcHRpb25zXCIgW2hhc01vcmVEYXRhUHJvZmlsZXNdPVwiaGFzTW9yZURhdGFQcm9maWxlc1wiIFtpc0xvYWRpbmdEYXRhUHJvZmlsZXNdPVwiaXNMb2FkaW5nRGF0YVByb2ZpbGVzXCJcbiAgICAgICAgW25hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNdPVwibmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc1wiXG4gICAgICAgIChuZXN0ZWRTdGVwQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZSgkZXZlbnQuc3RlcCwgJGV2ZW50LmluZGV4KVwiXG4gICAgICAgIChhZGRTdGVwKT1cIm9uQWRkU3RlcCgpXCIgKGFkZFN0ZXBGb3JMb29wKT1cIm9uQWRkU3RlcEZvckxvb3BGcm9tTmVzdGVkKCRldmVudClcIiAoZGVsZXRlU3RlcCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50KVwiXG4gICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgc3RlcCwgaSlcIlxuICAgICAgICAoZ3JvdXBOYW1lQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZ3JvdXBOYW1lID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoZGVzY3JpcHRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5kZXNjcmlwdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChvcGVuRXh0ZXJuYWwpPVwib25OZXN0ZWRPcGVuRXh0ZXJuYWwoJGV2ZW50KVwiIChlZGl0KT1cIm9uTmVzdGVkRWRpdCgkZXZlbnQpXCJcbiAgICAgICAgKGxpbmspPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGR1cGxpY2F0ZSk9XCJvbk5lc3RlZER1cGxpY2F0ZSgkZXZlbnQsIHN0ZXApXCIgKGRlbGV0ZSk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50LCBpKVwiXG4gICAgICAgICh2aWV3RGV0YWlscyk9XCJ2aWV3RGV0YWlscy5lbWl0KCRldmVudClcIlxuICAgICAgICAoY29uZGl0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuY29uZGl0aW9uID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoYnJhbmNoU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCksIGkpXCJcbiAgICAgICAgKGRlbGV0ZUJyYW5jaCk9XCJvbk5lc3RlZENvbmRpdGlvbkRlbGV0ZUJyYW5jaCgkYW55KHN0ZXApLCAkZXZlbnQsIGkpXCJcbiAgICAgICAgKHRlc3REYXRhUHJvZmlsZUNoYW5nZSk9XCIkYW55KHN0ZXApLnRlc3REYXRhUHJvZmlsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHN0YXJ0U3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLnN0YXJ0U3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGVuZFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5lbmRTdGVwID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAobWF4SXRlcmF0aW9uc0NoYW5nZSk9XCIkYW55KHN0ZXApLm1heEl0ZXJhdGlvbnMgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChldmVudFR5cGVDaGFuZ2UpPVwiJGFueShzdGVwKS5ldmVudFR5cGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChwYXJhbWV0ZXJDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLnNlbGVjdGVkID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAobG9hZE1vcmVEYXRhUHJvZmlsZXMpPVwibG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKHNlYXJjaERhdGFQcm9maWxlcyk9XCJzZWFyY2hEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGRuZERyb3BJblpvbmUpPVwiZG5kRHJvcEluWm9uZS5lbWl0KCRldmVudClcIlxuICAgICAgICAoY2xpY2tBY3Rpb24pPVwiY2xpY2tBY3Rpb24uZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGVkaXRJbkRlcHRoKT1cImVkaXRJbkRlcHRoLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChhZGRTdGVwQmV0d2VlbkNsaWNrKT1cImFkZFN0ZXBCZXR3ZWVuQ2xpY2suZW1pdCgkZXZlbnQpXCI+XG4gICAgICA8L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgbmVzdGVkLXN0ZXAtZHJvcC1saXN0XCJcbiAgICAgICAgIFtzdHlsZS5taW4taGVpZ2h0LnB4XT1cIm5lc3RlZFN0ZXBzLmxlbmd0aCA9PT0gMCA/IDUyIDogbnVsbFwiXG4gICAgICAgICBbZG5kRHJvcHpvbmVdPVwiWydzdGVwJ11cIlxuICAgICAgICAgZG5kRWZmZWN0QWxsb3dlZD1cIm1vdmVcIlxuICAgICAgICAgZG5kRHJhZ292ZXJDbGFzcz1cImRuZERyYWdvdmVyXCJcbiAgICAgICAgIChkbmREcm9wKT1cIm9uRG5kRHJvcCgkZXZlbnQpXCI+XG4gICAgICA8ZGl2IGRuZFBsYWNlaG9sZGVyUmVmIGNsYXNzPVwic3RlcC1kcmFnLXBsYWNlaG9sZGVyLW5lc3RlZCBjcWEtbXktMSBjcWEtbWluLWgtWzUwcHhdIGNxYS1ib3JkZXItMiBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjM0Y0M0VFXSBjcWEtcm91bmRlZCBjcWEtYmctW3JnYmEoNjMsNjcsMjM4LDAuMDgpXSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQteHNcIj5Ecm9wIGhlcmU8L2Rpdj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHN0ZXAgb2YgbmVzdGVkU3RlcHM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cIm5lc3RlZC1zdGVwLWRyYWctaXRlbVwiXG4gICAgICAgICAgIFtkbmREcmFnZ2FibGVdPVwic3RlcFwiXG4gICAgICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgICAgZG5kVHlwZT1cInN0ZXBcIj5cbiAgICAgICAgPGNxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlciBbc3RlcF09XCJzdGVwXCIgW2luZGV4XT1cImlcIlxuICAgICAgICAgIFtzZWxlY3RlZF09XCIkYW55KHN0ZXApLnNlbGVjdGVkXCJcbiAgICAgICAgICBbaXNOZXN0ZWRdPVwidHJ1ZVwiIFtpc0luc2lkZUxvb3BdPVwidHJ1ZVwiIFtpc0luc2lkZVN0ZXBHcm91cF09XCJpc0luc2lkZVN0ZXBHcm91cFwiIFtpc1Jlb3JkZXJdPVwiaXNSZW9yZGVyXCJcbiAgICAgICAgICBbYWRkU3RlcEJldHdlZW5BYm92ZV09XCJhZGRTdGVwQmV0d2VlbkFib3ZlXCJcbiAgICAgICAgICBbYWRkU3RlcEJldHdlZW5CZWxvd109XCJhZGRTdGVwQmV0d2VlbkJlbG93XCJcbiAgICAgICAgICBbYWRkU3RlcEJldHdlZW5dPVwiYWRkU3RlcEJldHdlZW5cIlxuICAgICAgICAgIFtlZGl0YWJsZV09XCJlZGl0YWJsZVwiXG4gICAgICAgICAgW2RhdGFQcm9maWxlT3B0aW9uc109XCJkYXRhUHJvZmlsZU9wdGlvbnNcIiBbaGFzTW9yZURhdGFQcm9maWxlc109XCJoYXNNb3JlRGF0YVByb2ZpbGVzXCIgW2lzTG9hZGluZ0RhdGFQcm9maWxlc109XCJpc0xvYWRpbmdEYXRhUHJvZmlsZXNcIlxuICAgICAgICAgIFtuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXT1cIm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNcIlxuICAgICAgICAgIChuZXN0ZWRTdGVwQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZSgkZXZlbnQuc3RlcCwgJGV2ZW50LmluZGV4KVwiXG4gICAgICAgICAgKGFkZFN0ZXApPVwib25BZGRTdGVwKClcIiAoYWRkU3RlcEZvckxvb3ApPVwib25BZGRTdGVwRm9yTG9vcEZyb21OZXN0ZWQoJGV2ZW50KVwiIChkZWxldGVTdGVwKT1cIm9uRGVsZXRlU3RlcCgkZXZlbnQpXCJcbiAgICAgICAgICAodG9nZ2xlRXhwYW5kZWQpPVwib25OZXN0ZWRUb2dnbGVFeHBhbmRlZCgkZXZlbnQsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZ3JvdXBOYW1lQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZ3JvdXBOYW1lID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmRlc2NyaXB0aW9uID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChyZXVzYWJsZUNoYW5nZSk9XCIkYW55KHN0ZXApLnJldXNhYmxlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChvcGVuRXh0ZXJuYWwpPVwib25OZXN0ZWRPcGVuRXh0ZXJuYWwoJGV2ZW50KVwiIChlZGl0KT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGxpbmspPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGR1cGxpY2F0ZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZGVsZXRlKT1cIm9uRGVsZXRlU3RlcCgkZXZlbnQsIGkpXCJcbiAgICAgICAgICAodmlld0RldGFpbHMpPVwidmlld0RldGFpbHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoY29uZGl0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuY29uZGl0aW9uID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChicmFuY2hTdGVwQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChhZGRCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2goJGFueShzdGVwKSwgaSlcIlxuICAgICAgICAgIChkZWxldGVCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2goJGFueShzdGVwKSwgJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKHRlc3REYXRhUHJvZmlsZUNoYW5nZSk9XCIkYW55KHN0ZXApLnRlc3REYXRhUHJvZmlsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoc3RhcnRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuc3RhcnRTdGVwID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChlbmRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZW5kU3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAobWF4SXRlcmF0aW9uc0NoYW5nZSk9XCIkYW55KHN0ZXApLm1heEl0ZXJhdGlvbnMgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGV2ZW50VHlwZUNoYW5nZSk9XCIkYW55KHN0ZXApLmV2ZW50VHlwZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAocGFyYW1ldGVyQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLnNlbGVjdGVkID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAobG9hZE1vcmVEYXRhUHJvZmlsZXMpPVwibG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKHNlYXJjaERhdGFQcm9maWxlcyk9XCJzZWFyY2hEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGRuZERyb3BJblpvbmUpPVwiZG5kRHJvcEluWm9uZS5lbWl0KCRldmVudClcIlxuICAgICAgICAoY2xpY2tBY3Rpb24pPVwiY2xpY2tBY3Rpb24uZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGVkaXRJbkRlcHRoKT1cImVkaXRJbkRlcHRoLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChhZGRTdGVwQmV0d2VlbkNsaWNrKT1cImFkZFN0ZXBCZXR3ZWVuQ2xpY2suZW1pdCgkZXZlbnQpXCI+XG4gICAgICAgIDwvY3FhLXRlc3QtY2FzZS1kZXRhaWxzLXJlbmRlcmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEVtcHR5IGxvb3A6IHNob3cgcGx1cyBpY29uIG9uIGhvdmVyIHdoZW4gZXhwYW5kZWQgYW5kIG5vIHN0ZXBzLlxuICAgICAgICAgV2hlbiByZW5kZXJlZCBpbnNpZGUgYSBzdGVwIGdyb3VwIG9yIHdoZW4gcmVvcmRlcmluZywgaGlkZSB0aGlzIEFkZCBidXR0b24gZW50aXJlbHkuIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJuZXN0ZWRTdGVwcy5sZW5ndGggPT09IDAgJiYgZWRpdGFibGUgJiYgIWlzSW5zaWRlU3RlcEdyb3VwICYmICFpc1Jlb3JkZXJcIiBjbGFzcz1cImxvb3Atc3RlcC1lbXB0eSBjcWEtbWluLWgtWzUycHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wbC00IGNxYS1wci00XCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25BZGRTdGVwRW1wdHkoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkFkZCBzdGVwXCJcbiAgICAgICAgY2xhc3M9XCJsb29wLXN0ZXAtZW1wdHktYWRkXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxyZWN0IHg9XCIxXCIgeT1cIjFcIiB3aWR0aD1cIjIxLjE4MjJcIiBoZWlnaHQ9XCIyMlwiIHJ4PVwiMTAuNTkxMVwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgPHJlY3QgeD1cIjFcIiB5PVwiMVwiIHdpZHRoPVwiMjEuMTgyMlwiIGhlaWdodD1cIjIyXCIgcng9XCIxMC41OTExXCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS13aWR0aD1cIjJcIiAvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNOC41IDEySDE1LjVcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTEyIDguNVYxNS41XCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEVORCBNYXJrZXIgKGNlbnRlcmVkIHdpdGggZGVjb3JhdGl2ZSBsaW5lcykgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weS0xIGNxYS1weC00IGNxYS1iZy1bI0RCRUFGRTgwXVwiIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkICNCRURCRkY7XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXNlbGYtc3RyZXRjaCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzFDMzk4RV0gY3FhLW9wYWNpdHktNDBcIiBzdHlsZT1cIm1pbi13aWR0aDogMjBweDtcIj48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMUMzOThFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtd2hpdGVzcGFjZS1ub3dyYXBcIj57eyBnZXRFbmRMYWJlbCgpIH19PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMxQzM5OEVdIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|