@cqa-lib/cqa-ui 1.1.235 → 1.1.236
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/test-case-details/condition-step/condition-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/scroll-step/scroll-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/step-group/step-group.component.mjs +3 -3
- package/fesm2015/cqa-lib-cqa-ui.mjs +8 -8
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +8 -8
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -455,10 +455,10 @@ export class TestCaseLoopStepComponent {
|
|
|
455
455
|
}
|
|
456
456
|
}
|
|
457
457
|
TestCaseLoopStepComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseLoopStepComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
458
|
-
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", condition: "condition", maxIterations: "maxIterations", testDataProfile: "testDataProfile", startStep: "startStep", endStep: "endStep", nestedSteps: "nestedSteps", expanded: "expanded", isNested: "isNested", isInsideLoop: "isInsideLoop", isReorder: "isReorder", selected: "selected", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", naturalTextActionsOptions: "naturalTextActionsOptions", 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" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "viewDetailsTrigger", first: true, predicate: ["viewDetailsTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: Frame 2147224910 - flex row, 1056\u00D736, gap 12px, flex-none -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 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\">\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 -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"conditionSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" (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\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 ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\">\n <!-- Drag Handle Icon (when isReorder is true) -->\n <div *ngIf=\"isReorder\" 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) -->\n <label *ngIf=\"!isReorder\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative\">\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 <!-- 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 Controls -->\n <div *ngIf=\"loopType === 'for'\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2\">\n <!-- Test Data Profile Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"testDataProfile\" [class.cqa-text-primary]=\"testDataProfile\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getTestDataProfileLabel() }}\n </button>\n\n <!-- Start Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"startStep\" [class.cqa-text-primary]=\"startStep\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getStartStepLabel() }}\n </button>\n\n <!-- End Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"endStep\" [class.cqa-text-primary]=\"endStep\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getEndStepLabel() }}\n </button>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1\">\n <span class=\"cqa-text-gray-700 cqa-text-sm\">\n While\n </span>\n <span class=\"cqa-text-gray-900 cqa-text-sm\" [innerHTML]=\"getConditionDisplay()\"></span>\n </div>\n\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) -->\n <div 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 type=\"button\" (click)=\"onDuplicate(); $event.stopPropagation()\" title=\"Duplicate\"\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=\"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 </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 </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 <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\" [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()\" (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)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep(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 [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\" [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()\" (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)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep(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 <!-- END Marker -->\n <div\n [class]=\"'cqa-pl-4 cqa-py-1 cqa-bg-[#DBEAFE80] cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium'\"\n style=\"border-top: 1px solid #BEDBFF;\">\n {{ getEndLabel() }}\n </div>\n </div>\n</div>", styles: [".step-actions{opacity:0;transition:opacity .15s ease}.step-row:hover .step-actions{opacity:1}\n"], components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i4.TestCaseDetailsRendererComponent, selector: "cqa-test-case-details-renderer", inputs: ["step", "index", "isNested", "isInsideLoop", "branch", "isReorder", "selected", "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", "deleteStepWithBranch", "addBranch", "addElse", "deleteBranch", "testDataProfileChange", "startStepChange", "endStepChange", "maxIterationsChange", "eventTypeChange", "parameterChange", "clickAction", "dndDropInZone", "loadMoreDataProfiles", "searchDataProfiles", "stepUpdate", "addStepBetweenClick", "editInDepth"] }], directives: [{ type: i5.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: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i6.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i6.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }] });
|
|
458
|
+
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", condition: "condition", maxIterations: "maxIterations", testDataProfile: "testDataProfile", startStep: "startStep", endStep: "endStep", nestedSteps: "nestedSteps", expanded: "expanded", isNested: "isNested", isInsideLoop: "isInsideLoop", isReorder: "isReorder", selected: "selected", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", naturalTextActionsOptions: "naturalTextActionsOptions", 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" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "viewDetailsTrigger", first: true, predicate: ["viewDetailsTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: Frame 2147224910 - flex row, 1056\u00D736, gap 12px, flex-none -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 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\">\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 -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"conditionSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" (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\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 ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\">\n <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true) -->\n <div *ngIf=\"isReorder\" 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) -->\n <label *ngIf=\"!isReorder\" 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 Controls -->\n <div *ngIf=\"loopType === 'for'\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2\">\n <!-- Test Data Profile Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"testDataProfile\" [class.cqa-text-primary]=\"testDataProfile\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getTestDataProfileLabel() }}\n </button>\n\n <!-- Start Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"startStep\" [class.cqa-text-primary]=\"startStep\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getStartStepLabel() }}\n </button>\n\n <!-- End Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"endStep\" [class.cqa-text-primary]=\"endStep\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getEndStepLabel() }}\n </button>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1\">\n <span class=\"cqa-text-gray-700 cqa-text-sm\">\n While\n </span>\n <span class=\"cqa-text-gray-900 cqa-text-sm\" [innerHTML]=\"getConditionDisplay()\"></span>\n </div>\n\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) -->\n <div 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 type=\"button\" (click)=\"onDuplicate(); $event.stopPropagation()\" title=\"Duplicate\"\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=\"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 </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 </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 <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\" [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()\" (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)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep(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 [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\" [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()\" (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)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep(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 <!-- END Marker -->\n <div\n [class]=\"'cqa-pl-4 cqa-py-1 cqa-bg-[#DBEAFE80] cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium'\"\n style=\"border-top: 1px solid #BEDBFF;\">\n {{ getEndLabel() }}\n </div>\n </div>\n</div>", styles: [".step-actions{opacity:0;transition:opacity .15s ease}.step-row:hover .step-actions{opacity:1}\n"], components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i4.TestCaseDetailsRendererComponent, selector: "cqa-test-case-details-renderer", inputs: ["step", "index", "isNested", "isInsideLoop", "branch", "isReorder", "selected", "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", "deleteStepWithBranch", "addBranch", "addElse", "deleteBranch", "testDataProfileChange", "startStepChange", "endStepChange", "maxIterationsChange", "eventTypeChange", "parameterChange", "clickAction", "dndDropInZone", "loadMoreDataProfiles", "searchDataProfiles", "stepUpdate", "addStepBetweenClick", "editInDepth"] }], directives: [{ type: i5.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: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i6.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i6.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }] });
|
|
459
459
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseLoopStepComponent, decorators: [{
|
|
460
460
|
type: Component,
|
|
461
|
-
args: [{ selector: 'cqa-test-case-loop-step', host: { class: 'cqa-ui-root' }, styles: [STEP_ROW_ACTIONS_STYLES], template: "<div class=\"cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: Frame 2147224910 - flex row, 1056\u00D736, gap 12px, flex-none -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 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\">\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 -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"conditionSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" (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\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 ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\">\n <!-- Drag Handle Icon (when isReorder is true) -->\n <div *ngIf=\"isReorder\" 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) -->\n <label *ngIf=\"!isReorder\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative\">\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 <!-- 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 Controls -->\n <div *ngIf=\"loopType === 'for'\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2\">\n <!-- Test Data Profile Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"testDataProfile\" [class.cqa-text-primary]=\"testDataProfile\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getTestDataProfileLabel() }}\n </button>\n\n <!-- Start Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"startStep\" [class.cqa-text-primary]=\"startStep\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getStartStepLabel() }}\n </button>\n\n <!-- End Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"endStep\" [class.cqa-text-primary]=\"endStep\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getEndStepLabel() }}\n </button>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1\">\n <span class=\"cqa-text-gray-700 cqa-text-sm\">\n While\n </span>\n <span class=\"cqa-text-gray-900 cqa-text-sm\" [innerHTML]=\"getConditionDisplay()\"></span>\n </div>\n\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) -->\n <div 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 type=\"button\" (click)=\"onDuplicate(); $event.stopPropagation()\" title=\"Duplicate\"\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=\"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 </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 </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 <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\" [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()\" (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)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep(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 [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\" [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()\" (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)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep(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 <!-- END Marker -->\n <div\n [class]=\"'cqa-pl-4 cqa-py-1 cqa-bg-[#DBEAFE80] cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium'\"\n style=\"border-top: 1px solid #BEDBFF;\">\n {{ getEndLabel() }}\n </div>\n </div>\n</div>" }]
|
|
461
|
+
args: [{ selector: 'cqa-test-case-loop-step', host: { class: 'cqa-ui-root' }, styles: [STEP_ROW_ACTIONS_STYLES], template: "<div class=\"cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: Frame 2147224910 - flex row, 1056\u00D736, gap 12px, flex-none -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 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\">\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 -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"conditionSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" (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\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 ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\">\n <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true) -->\n <div *ngIf=\"isReorder\" 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) -->\n <label *ngIf=\"!isReorder\" 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 Controls -->\n <div *ngIf=\"loopType === 'for'\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2\">\n <!-- Test Data Profile Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"testDataProfile\" [class.cqa-text-primary]=\"testDataProfile\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getTestDataProfileLabel() }}\n </button>\n\n <!-- Start Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"startStep\" [class.cqa-text-primary]=\"startStep\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getStartStepLabel() }}\n </button>\n\n <!-- End Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"endStep\" [class.cqa-text-primary]=\"endStep\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getEndStepLabel() }}\n </button>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1\">\n <span class=\"cqa-text-gray-700 cqa-text-sm\">\n While\n </span>\n <span class=\"cqa-text-gray-900 cqa-text-sm\" [innerHTML]=\"getConditionDisplay()\"></span>\n </div>\n\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) -->\n <div 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 type=\"button\" (click)=\"onDuplicate(); $event.stopPropagation()\" title=\"Duplicate\"\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=\"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 </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 </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 <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\" [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()\" (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)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep(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 [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\" [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()\" (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)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep(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 <!-- END Marker -->\n <div\n [class]=\"'cqa-pl-4 cqa-py-1 cqa-bg-[#DBEAFE80] cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium'\"\n style=\"border-top: 1px solid #BEDBFF;\">\n {{ getEndLabel() }}\n </div>\n </div>\n</div>" }]
|
|
462
462
|
}], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { config: [{
|
|
463
463
|
type: Input
|
|
464
464
|
}], id: [{
|
|
@@ -551,4 +551,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
551
551
|
type: ViewChild,
|
|
552
552
|
args: ['viewDetailsTrigger', { static: false }]
|
|
553
553
|
}] } });
|
|
554
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvbG9vcC1zdGVwL2xvb3Atc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2xvb3Atc3RlcC9sb29wLXN0ZXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsU0FBUyxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBSWhJLE9BQU8sRUFBK0csU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEssT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7O0FBVXJFLE1BQU0sT0FBTyx5QkFBeUI7SUE4RnBDLFlBQ1UsRUFBZTtRQUFmLE9BQUUsR0FBRixFQUFFLENBQWE7UUE1RmhCLGFBQVEsR0FBb0IsS0FBSyxDQUFDO1FBT2xDLGdCQUFXLEdBQXlCLEVBQUUsQ0FBQztRQUN2QyxhQUFRLEdBQVksSUFBSSxDQUFDO1FBQ3pCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQ25DLGdGQUFnRjtRQUN2RSx1QkFBa0IsR0FBd0IsRUFBRSxDQUFDO1FBQ3RELGdFQUFnRTtRQUN2RCx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFDOUMsc0NBQXNDO1FBQzdCLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUNoRCxrRUFBa0U7UUFDekQsOEJBQXlCLEdBQW1CLEVBQUUsQ0FBQztRQUN4RCx3REFBd0Q7UUFDL0Msd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQzlDLHdE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QTNCLEtBQUs7Z0JBRUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsb0JBQW9CO3NCQUE3QixNQUFNO2dCQUVHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFFRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBMEI2QyxrQkFBa0I7c0JBQXJFLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEbmREcm9wRXZlbnQgfSBmcm9tICduZ3gtZHJhZy1kcm9wJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IExvb3BTdGVwQ29uZmlnLCBUZXN0Q2FzZVN0ZXBDb25maWcsIE5vcm1hbFN0ZXBDb25maWcsIENvbmRpdGlvblN0ZXBDb25maWcsIFN0ZXBHcm91cENvbmZpZywgQ29uZGl0aW9uQnJhbmNoLCBTdGVwVHlwZXMgfSBmcm9tICcuLi90ZXN0LWNhc2Utc3RlcC5tb2RlbHMnO1xuaW1wb3J0IHsgU1RFUF9ST1dfQUNUSU9OU19TVFlMRVMgfSBmcm9tICcuLi9zdGVwLXJvdy1hY3Rpb25zLnN0eWxlcyc7XG5pbXBvcnQgeyBEYXRhUHJvZmlsZU9wdGlvbiB9IGZyb20gJy4uLy4uL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItbG9vcC9zdGVwLWJ1aWxkZXItbG9vcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVmlld0RldGFpbHNQYXlsb2FkIH0gZnJvbSAnLi4vc3RlcC1kZXRhaWxzLW1vZGFsL3N0ZXAtZGV0YWlscy1tb2RhbC1kYXRhJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXRlc3QtY2FzZS1sb29wLXN0ZXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vbG9vcC1zdGVwLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBzdHlsZXM6IFtTVEVQX1JPV19BQ1RJT05TX1NUWUxFU10sXG59KVxuZXhwb3J0IGNsYXNzIFRlc3RDYXNlTG9vcFN0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IExvb3BTdGVwQ29uZmlnO1xuICBASW5wdXQoKSBpZCE6IHN0cmluZztcbiAgQElucHV0KCkgbG9vcFR5cGU6ICdmb3InIHwgJ3doaWxlJyA9ICdmb3InO1xuICBASW5wdXQoKSBzdGVwTnVtYmVyITogbnVtYmVyIHwgc3RyaW5nO1xuICBASW5wdXQoKSBjb25kaXRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHRlc3REYXRhUHJvZmlsZT86IHN0cmluZztcbiAgQElucHV0KCkgc3RhcnRTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBlbmRTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBuZXN0ZWRTdGVwczogVGVzdENhc2VTdGVwQ29uZmlnW10gPSBbXTtcbiAgQElucHV0KCkgZXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBpc05lc3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0luc2lkZUxvb3A6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNSZW9yZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciB0aGUgZGF0YSBwcm9maWxlIGRyb3Bkb3duIC0gYWNjZXB0cyBEYXRhUHJvZmlsZU9wdGlvbiBvYmplY3RzICovXG4gIEBJbnB1dCgpIGRhdGFQcm9maWxlT3B0aW9uczogRGF0YVByb2ZpbGVPcHRpb25bXSA9IFtdO1xuICAvKiogSW5kaWNhdGVzIGlmIG1vcmUgZGF0YSBwcm9maWxlcyBhcmUgYXZhaWxhYmxlIGZvciBsb2FkaW5nICovXG4gIEBJbnB1dCgpIGhhc01vcmVEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIExvYWRpbmcgc3RhdGUgZm9yIGRhdGEgcHJvZmlsZXMgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciBuYXR1cmFsIHRleHQgYWN0aW9ucyAoZm9yIHdoaWxlIGxvb3AgY29uZGl0aW9uKSAqL1xuICBASW5wdXQoKSBuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAvKiogU2hvdyBcIkFkZCBTdGVwIEJldHdlZW5cIiBidXR0b24gYWJvdmUgbmVzdGVkIHN0ZXBzICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBCZXR3ZWVuQWJvdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFNob3cgXCJBZGQgU3RlcCBCZXR3ZWVuXCIgYnV0dG9uIGJlbG93IG5lc3RlZCBzdGVwcyAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbkJlbG93OiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYWRkU3RlcEJldHdlZW5BYm92ZSBhbmQgYWRkU3RlcEJldHdlZW5CZWxvdyBpbnN0ZWFkLiBJZiBzZXQsIGFwcGxpZXMgdG8gYm90aCBidXR0b25zLiAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSB0b2dnbGVFeHBhbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e2NvbmZpZzogTG9vcFN0ZXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufT4oKTtcbiAgQE91dHB1dCgpIHRlc3REYXRhUHJvZmlsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgc3RhcnRTdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBlbmRTdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBjb25kaXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIG1heEl0ZXJhdGlvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIG5lc3RlZFN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBhZGRTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZGVsZXRlU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgZHVwbGljYXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbW9yZU9wdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB2aWV3RGV0YWlscyA9IG5ldyBFdmVudEVtaXR0ZXI8Vmlld0RldGFpbHNQYXlsb2FkPigpO1xuICBAT3V0cHV0KCkgZWRpdEluRGVwdGggPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBlZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZG5kRHJvcEluWm9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogRG5kRHJvcEV2ZW50OyB0YXJnZXRMaXN0OiBUZXN0Q2FzZVN0ZXBDb25maWdbXSB9PigpO1xuICAvKiogRW1pdCB3aGVuIG1vcmUgZGF0YSBwcm9maWxlcyBuZWVkIHRvIGJlIGxvYWRlZCAqL1xuICBAT3V0cHV0KCkgbG9hZE1vcmVEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXQgd2hlbiBkYXRhIHByb2ZpbGUgc2VhcmNoIHF1ZXJ5IGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIHNlYXJjaERhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdCB3aGVuIHN0ZXAgaXMgdXBkYXRlZCAoQXBwbHkgYnV0dG9uIGNsaWNrZWQgaW4gZWRpdCBtb2RlKSAqL1xuICBAT3V0cHV0KCkgc3RlcFVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8TG9vcFN0ZXBDb25maWc+KCk7XG4gIC8qKiBSZS1lbWl0IHdoZW4gYSBuZXN0ZWQgc3RlcCAoZS5nLiBub3JtYWwtc3RlcCkgZW1pdHMgY2xpY2tBY3Rpb24gKGUuZy4gZWxlbWVudC9sYWJlbCBjbGljayBmb3IgcG9wdXApICovXG4gIEBPdXRwdXQoKSBjbGlja0FjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudDsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnIH0+KCk7XG4gIC8qKiBSZS1lbWl0IGFkZFN0ZXBCZXR3ZWVuQ2xpY2sgZnJvbSBuZXN0ZWQgcmVuZGVyZXJzICovXG4gIEBPdXRwdXQoKSBhZGRTdGVwQmV0d2VlbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7c3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyLCBwb3NpdGlvbjogJ0FCT1ZFJyB8ICdCRUxPVyd9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIG9uRG5kRHJvcChldmVudDogRG5kRHJvcEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5kbmREcm9wSW5ab25lLmVtaXQoeyBldmVudCwgdGFyZ2V0TGlzdDogdGhpcy5uZXN0ZWRTdGVwcyB9KTtcbiAgfVxuXG4gIC8qKiBFeHBvc2UgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgdGVtcGxhdGUgKEFuZ3VsYXIgdGVtcGxhdGVzIGRvbid0IGhhdmUgU3RyaW5nL051bWJlcikgKi9cbiAgcmVhZG9ubHkgc3RyaW5nRm4gPSBTdHJpbmc7XG4gIHJlYWRvbmx5IG51bWJlckZuID0gTnVtYmVyO1xuXG4gIC8qKiBXaGVuIHRydWUsIGhlYWRlciBzaG93cyBpbmxpbmUgZWRpdCBmb3JtIChkcm9wZG93bnMsIGlucHV0cywgQ2FuY2VsL0FwcGx5KSAqL1xuICBpc0VkaXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogRm9ybSBmb3IgZWRpdCBtb2RlOyBib3VuZCB0byBjcWEtZHluYW1pYy1zZWxlY3QgKHNhbWUgcGF0dGVybiBhcyBkZWZhdWx0IHN0b3JpZXMpICovXG4gIGVkaXRGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBDYWNoZWQgc2VsZWN0IGNvbmZpZ3MgKHN0YWJsZSByZWZzIHRvIGF2b2lkIGNoYW5nZS1kZXRlY3Rpb24gbG9vcHMpICovXG4gIGZvck9wdGlvblR5cGVTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIHRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgc3RhcnRTdGVwU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBlbmRTdGVwU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBjb25kaXRpb25TZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG5cbiAgLyoqIE9wdGlvbnMgZm9yIExvb3AgU3RhcnQgLyBMb29wIEVuZCBkcm9wZG93bnMgKDEtMTApICovXG4gIGxvb3BTdGVwT3B0aW9uczogbnVtYmVyW10gPSBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdO1xuXG4gIEBWaWV3Q2hpbGQoJ3ZpZXdEZXRhaWxzVHJpZ2dlcicsIHsgc3RhdGljOiBmYWxzZSB9KSB2aWV3RGV0YWlsc1RyaWdnZXI/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAvKiogTG9jYWwgY29weSBvZiB2YWx1ZXMgd2hpbGUgZWRpdGluZyAoZm9yIENhbmNlbCByZXZlcnQpICovXG4gIHByaXZhdGUgZWRpdFNuYXBzaG90OiB7XG4gICAgdGVzdERhdGFQcm9maWxlPzogc3RyaW5nO1xuICAgIHN0YXJ0U3RlcD86IG51bWJlcjtcbiAgICBlbmRTdGVwPzogbnVtYmVyO1xuICAgIGNvbmRpdGlvbj86IHN0cmluZztcbiAgICBtYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXJcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5pZCA9IHRoaXMuY29uZmlnLmlkO1xuICAgICAgdGhpcy5sb29wVHlwZSA9IHRoaXMuY29uZmlnLmxvb3BUeXBlO1xuICAgICAgdGhpcy5zdGVwTnVtYmVyID0gdGhpcy5jb25maWcuc3RlcE51bWJlcjtcbiAgICAgIHRoaXMuY29uZGl0aW9uID0gdGhpcy5jb25maWcuY29uZGl0aW9uO1xuICAgICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdGhpcy5jb25maWcubWF4SXRlcmF0aW9ucztcbiAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGhpcy5jb25maWcudGVzdERhdGFQcm9maWxlO1xuICAgICAgdGhpcy5zdGFydFN0ZXAgPSB0aGlzLmNvbmZpZy5zdGFydFN0ZXA7XG4gICAgICB0aGlzLmVuZFN0ZXAgPSB0aGlzLmNvbmZpZy5lbmRTdGVwO1xuICAgICAgdGhpcy5uZXN0ZWRTdGVwcyA9IHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzIHx8IFtdO1xuICAgICAgdGhpcy5leHBhbmRlZCA9IHRoaXMuY29uZmlnLmV4cGFuZGVkICE9PSB1bmRlZmluZWQgPyB0aGlzLmNvbmZpZy5leHBhbmRlZCA6IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gKHRoaXMuY29uZmlnIGFzIGFueSkuc2VsZWN0ZWQgfHwgZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuYnVpbGRFZGl0Rm9ybSgpO1xuICAgIHRoaXMuYnVpbGRTZWxlY3RDb25maWdzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZyddICYmIHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gKHRoaXMuY29uZmlnIGFzIGFueSkuc2VsZWN0ZWQgfHwgZmFsc2U7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydkYXRhUHJvZmlsZU9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlRGF0YVByb2ZpbGVzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRGF0YVByb2ZpbGVzJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyduYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEVkaXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGZvck9wdGlvblR5cGU6IFtudWxsIGFzIHN0cmluZyB8IG51bGxdLFxuICAgICAgdGVzdERhdGFQcm9maWxlOiBbdGhpcy50ZXN0RGF0YVByb2ZpbGUgPz8gJyddLFxuICAgICAgc3RhcnRTdGVwOiBbdGhpcy5zdGFydFN0ZXAgPz8gbnVsbCBhcyBudW1iZXIgfCBudWxsXSxcbiAgICAgIGVuZFN0ZXA6IFt0aGlzLmVuZFN0ZXAgPz8gbnVsbCBhcyBudW1iZXIgfCBudWxsXSxcbiAgICAgIGNvbmRpdGlvbjogW3RoaXMuY29uZGl0aW9uID8/ICcnXSxcbiAgICAgIG1heEl0ZXJhdGlvbnM6IFt0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNV0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQnVpbGQgc2VsZWN0IGNvbmZpZ3Mgb25jZSAoc2FtZSBvcHRpb24gc2hhcGUgYXMgZGVmYXVsdCBzdG9yaWVzOiBpZCArIG5hbWUpICovXG4gIHByaXZhdGUgYnVpbGRTZWxlY3RDb25maWdzKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXBPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IHRoaXMubG9vcFN0ZXBPcHRpb25zLm1hcCgobikgPT4gKHtcbiAgICAgIGlkOiBuLFxuICAgICAgdmFsdWU6IG4sXG4gICAgICBuYW1lOiBTdHJpbmcobiksXG4gICAgICBsYWJlbDogU3RyaW5nKG4pLFxuICAgIH0pKTtcbiAgICB0aGlzLmZvck9wdGlvblR5cGVTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdmb3JPcHRpb25UeXBlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IG9wdGlvbicsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBpZDogJ3Rlc3QtZGF0YScsIHZhbHVlOiAndGVzdC1kYXRhJywgbmFtZTogJ1Rlc3QgRGF0YSBQcm9maWxlJywgbGFiZWw6ICdUZXN0IERhdGEgUHJvZmlsZScgfSxcbiAgICAgICAgeyBpZDogJ2ZpeGVkJywgdmFsdWU6ICdmaXhlZCcsIG5hbWU6ICdGaXhlZCBjb3VudCcsIGxhYmVsOiAnRml4ZWQgY291bnQnIH0sXG4gICAgICBdLFxuICAgIH07XG4gICAgdGhpcy51cGRhdGVUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLnN0YXJ0U3RlcFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3N0YXJ0U3RlcCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ0xvb3AgU3RhcnQnLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBzdGVwT3B0aW9ucy5tYXAoKG8pID0+ICh7IC4uLm8gfSkpLFxuICAgIH07XG4gICAgdGhpcy5lbmRTdGVwU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnZW5kU3RlcCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ0xvb3AgRW5kJyxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogc3RlcE9wdGlvbnMubWFwKChvKSA9PiAoeyAuLi5vIH0pKSxcbiAgICB9O1xuICAgIHRoaXMudXBkYXRlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk7XG4gIH1cblxuICAvKiogVXBkYXRlIGNvbmRpdGlvbiBzZWxlY3QgY29uZmlnIHdpdGggbmF0dXJhbCB0ZXh0IGFjdGlvbnMgb3B0aW9ucyAqL1xuICBwcml2YXRlIHVwZGF0ZUNvbmRpdGlvblNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvblNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2NvbmRpdGlvbicsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBjb25kaXRpb24nLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFVwZGF0ZSB0ZXN0IGRhdGEgcHJvZmlsZSBzZWxlY3QgY29uZmlnIHdpdGggY3VycmVudCBvcHRpb25zIGFuZCBjYWxsYmFja3MgKi9cbiAgcHJpdmF0ZSB1cGRhdGVUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICd0ZXN0RGF0YVByb2ZpbGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdUZXN0ZGF0YXByb2ZpbGUnLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZURhdGFQcm9maWxlcyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdEYXRhUHJvZmlsZXMsXG4gICAgICBvcHRpb25zOiB0aGlzLmNvbnZlcnREYXRhUHJvZmlsZU9wdGlvbnNUb1NlbGVjdE9wdGlvbnModGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMpLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25EYXRhUHJvZmlsZUNoYW5nZSh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMub25TZWFyY2hEYXRhUHJvZmlsZXMocXVlcnkpO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6IChxdWVyeT86IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm9uTG9hZE1vcmVEYXRhUHJvZmlsZXMocXVlcnkgfHwgJycpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIENvbnZlcnQgRGF0YVByb2ZpbGVPcHRpb25bXSB0byBTZWxlY3RPcHRpb25bXSAqL1xuICBwcml2YXRlIGNvbnZlcnREYXRhUHJvZmlsZU9wdGlvbnNUb1NlbGVjdE9wdGlvbnMob3B0aW9uczogRGF0YVByb2ZpbGVPcHRpb25bXSk6IFNlbGVjdE9wdGlvbltdIHtcbiAgICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgICBpZDogb3B0aW9uLmlkLFxuICAgICAgdmFsdWU6IG9wdGlvbi5pZCxcbiAgICAgIG5hbWU6IG9wdGlvbi5uYW1lLFxuICAgICAgbGFiZWw6IG9wdGlvbi5uYW1lXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBkYXRhIHByb2ZpbGUgc2VsZWN0aW9uICovXG4gIHByaXZhdGUgb25EYXRhUHJvZmlsZUNoYW5nZShwcm9maWxlSWQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25UZXN0RGF0YVByb2ZpbGVDaGFuZ2UocHJvZmlsZUlkKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgc2VhcmNoIGZvciBkYXRhIHByb2ZpbGVzICovXG4gIHByaXZhdGUgb25TZWFyY2hEYXRhUHJvZmlsZXMocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQocXVlcnkpO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBsb2FkIG1vcmUgZGF0YSBwcm9maWxlcyAqL1xuICBwcml2YXRlIG9uTG9hZE1vcmVEYXRhUHJvZmlsZXMocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSk7XG4gIH1cblxuICBvbkVkaXRGb3JtRmllbGRDaGFuZ2UoY29udHJvbE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KGNvbnRyb2xOYW1lKT8uc2V0VmFsdWUodmFsdWUpO1xuICB9XG5cbiAgZ2V0TG9vcFR5cGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdGT1IgTE9PUCcgOiAnV0hJTEUgTE9PUCc7XG4gIH1cblxuICBpc1doaWxlTG9vcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJztcbiAgfVxuXG4gIGlzRm9yTG9vcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ2Zvcic7XG4gIH1cblxuICBnZXRFbmRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdFTkQgRk9SJyA6ICdFTkQgV0hJTEUnO1xuICB9XG5cbiAgZ2V0U3RlcHNTdW1tYXJ5KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJzAgc3RlcHMnO1xuICAgIH1cbiAgICBjb25zdCBzdGFydCA9IHRoaXMuc3RhcnRTdGVwIHx8IHRoaXMubmVzdGVkU3RlcHNbMF0/LnN0ZXBOdW1iZXIgfHwgMTtcbiAgICBjb25zdCBlbmQgPSB0aGlzLmVuZFN0ZXAgfHwgdGhpcy5uZXN0ZWRTdGVwc1t0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCAtIDFdPy5zdGVwTnVtYmVyIHx8IHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoO1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgcmV0dXJuIGBTdGVwcyAke3N0YXJ0fS0ke2VuZH0gKCR7Y291bnR9IHN0ZXAke2NvdW50ICE9PSAxID8gJ3MnIDogJyd9KWA7XG4gIH1cblxuICBnZXRTdGFydFN0ZXBMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnN0YXJ0U3RlcCkge1xuICAgICAgcmV0dXJuIGBTdGFydDogJHt0aGlzLnN0YXJ0U3RlcH1gO1xuICAgIH1cbiAgICBjb25zdCBkZWZhdWx0U3RhcnQgPSB0aGlzLm5lc3RlZFN0ZXBzWzBdPy5zdGVwTnVtYmVyIHx8IDE7XG4gICAgcmV0dXJuIGBTdGFydDogJHtkZWZhdWx0U3RhcnR9YDtcbiAgfVxuXG4gIGdldEVuZFN0ZXBMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmVuZFN0ZXApIHtcbiAgICAgIHJldHVybiBgRW5kOiAke3RoaXMuZW5kU3RlcH1gO1xuICAgIH1cbiAgICBjb25zdCBkZWZhdWx0RW5kID0gdGhpcy5uZXN0ZWRTdGVwc1t0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCAtIDFdPy5zdGVwTnVtYmVyIHx8IHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoO1xuICAgIHJldHVybiBgRW5kOiAke2RlZmF1bHRFbmR9YDtcbiAgfVxuXG4gIGdldFRlc3REYXRhUHJvZmlsZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudGVzdERhdGFQcm9maWxlKSB7XG4gICAgICByZXR1cm4gYFRlc3QgRGF0YSBwcm9maWxlOiAke3RoaXMudGVzdERhdGFQcm9maWxlfWA7XG4gICAgfVxuICAgIHJldHVybiAnVGVzdCBEYXRhIHByb2ZpbGUnO1xuICB9XG5cbiAgZ2V0Q29uZGl0aW9uRGlzcGxheSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbiB8fCAnZWxlbWVudCBcIi5ub3RpZmljYXRpb24tYmFkZ2VcIiBleGlzdHMnO1xuICB9XG5cbiAgb25Ub2dnbGVFeHBhbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuZXhwYW5kZWQ7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZC5lbWl0KHtjb25maWc6dGhpcy5jb25maWcsIGV4cGFuZGVkOnRoaXMuZXhwYW5kZWR9KTtcbiAgfVxuXG4gIG9uVGVzdERhdGFQcm9maWxlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHZhbHVlO1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25TdGFydFN0ZXBDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdmFsdWU7XG4gICAgdGhpcy5zdGFydFN0ZXBDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbkVuZFN0ZXBDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZW5kU3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuZW5kU3RlcENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uQ29uZGl0aW9uQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuY29uZGl0aW9uQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25NYXhJdGVyYXRpb25zQ2hhbmdlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB2YWx1ZTtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnNDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZXN0ZWRTdGVwQ2hhbmdlLmVtaXQoeyBzdGVwLCBpbmRleCB9KTtcbiAgfVxuXG4gIG9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoZXZlbnQ6IGJvb2xlYW4gfCB7Y29uZmlnOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufSwgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gSGFuZGxlIGJvdGggYm9vbGVhbiBhbmQgb2JqZWN0IGZvcm1hdHNcbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0JyAmJiBldmVudCAhPT0gbnVsbCAmJiAnZXhwYW5kZWQnIGluIGV2ZW50KSB7XG4gICAgICAvLyBPYmplY3QgZm9ybWF0IGZyb20gc3RlcC1ncm91cDoge2NvbmZpZywgZXhwYW5kZWR9XG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQuZXhwYW5kZWQ7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgZXZlbnQncyBjb25maWcgaXMgYSBzdGVwLWdyb3VwIChub3QgdGhlIGN1cnJlbnQgc3RlcClcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBuZXN0ZWQgc3RlcC1ncm91cCBldmVudHMgYnViYmxlIHVwIGNvcnJlY3RseSBldmVuIHdoZW4gY29uZGl0aW9uIHN0ZXAgaXMgaW5zaWRlIGxvb3Agc3RlcFxuICAgICAgaWYgKHRoaXMuaXNTdGVwR3JvdXAoZXZlbnQuY29uZmlnKSkge1xuICAgICAgICAvLyBSZS1lbWl0IHRoZSB0b2dnbGVFeHBhbmRlZCBldmVudCB3aXRoIHRoZSBvYmplY3QgZm9ybWF0LCBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCBjb25maWdcbiAgICAgICAgLy8gQ2FzdCB0byBzYXRpc2Z5IFR5cGVTY3JpcHQgLSB0aGUgcmVuZGVyZXIgYWNjZXB0cyBUZXN0Q2FzZVN0ZXBDb25maWcgd2hpY2ggaW5jbHVkZXMgU3RlcEdyb3VwQ29uZmlnXG4gICAgICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQuZW1pdCh7Y29uZmlnOiBldmVudC5jb25maWcgYXMgYW55IGFzIExvb3BTdGVwQ29uZmlnLCBleHBhbmRlZDogZXZlbnQuZXhwYW5kZWR9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQm9vbGVhbiBmb3JtYXQgZnJvbSBvdGhlciBzdGVwIHR5cGVzXG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQgYXMgYm9vbGVhbjtcbiAgICB9XG4gICAgdGhpcy5vbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaW5kZXgpO1xuICB9XG5cbiAgb25BZGRTdGVwKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkU3RlcC5lbWl0KCk7XG4gIH1cblxuICBvbkRlbGV0ZVN0ZXAoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlU3RlcC5lbWl0KGluZGV4KTtcbiAgfVxuXG4gIGlzTm9ybWFsU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIE5vcm1hbFN0ZXBDb25maWcge1xuICAgIHJldHVybiAnZXZlbnRUeXBlJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNMb29wU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIExvb3BTdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2xvb3BUeXBlJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNDb25kaXRpb25TdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgQ29uZGl0aW9uU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdjb25kaXRpb24nIGluIHN0ZXAgJiYgJ2JyYW5jaGVzJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNTdGVwR3JvdXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBTdGVwR3JvdXBDb25maWcge1xuICAgIHJldHVybiAnZ3JvdXBOYW1lJyBpbiBzdGVwO1xuICB9XG5cbiAgb25BZGRCcmFuY2goKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgY29uZGl0aW9uIHN0ZXBzXG4gIH1cblxuICBvbkRlbGV0ZUJyYW5jaChicmFuY2g6IGFueSk6IHZvaWQge1xuICAgIC8vIE5vdCB1c2VkIGluIGxvb3Agc3RlcCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIGNvbmRpdGlvbiBzdGVwc1xuICB9XG5cbiAgb25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2gobmVzdGVkU3RlcDogQ29uZGl0aW9uU3RlcENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEFkZCBhIG5ldyBicmFuY2ggdG8gdGhlIG5lc3RlZCBjb25kaXRpb24gc3RlcFxuICAgIGlmICghbmVzdGVkU3RlcC5icmFuY2hlcykge1xuICAgICAgbmVzdGVkU3RlcC5icmFuY2hlcyA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBuZXdCcmFuY2g6IENvbmRpdGlvbkJyYW5jaCA9IHtcbiAgICAgIHR5cGU6IG5lc3RlZFN0ZXAuYnJhbmNoZXMubGVuZ3RoID09PSAwID8gJ2lmJyA6ICdlbHNlJyxcbiAgICAgIGxhYmVsOiBuZXN0ZWRTdGVwLmJyYW5jaGVzLmxlbmd0aCA9PT0gMCA/ICdJRiBUUlVFJyA6ICdFTFNFJywgXG4gICAgICBzdGVwVHlwZTogU3RlcFR5cGVzLkNPTkRJVElPTl9JRixcbiAgICAgIG5lc3RlZFN0ZXBzOiBbXVxuICAgIH07XG4gICAgbmVzdGVkU3RlcC5icmFuY2hlcy5wdXNoKG5ld0JyYW5jaCk7XG4gICAgdGhpcy5vbk5lc3RlZFN0ZXBDaGFuZ2UobmVzdGVkU3RlcCwgaW5kZXgpO1xuICB9XG5cbiAgb25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2gobmVzdGVkU3RlcDogQ29uZGl0aW9uU3RlcENvbmZpZywgYnJhbmNoOiBhbnksIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBEZWxldGUgYSBicmFuY2ggZnJvbSB0aGUgbmVzdGVkIGNvbmRpdGlvbiBzdGVwXG4gICAgaWYgKG5lc3RlZFN0ZXAuYnJhbmNoZXMpIHtcbiAgICAgIGNvbnN0IGJyYW5jaEluZGV4ID0gbmVzdGVkU3RlcC5icmFuY2hlcy5pbmRleE9mKGJyYW5jaCk7XG4gICAgICBpZiAoYnJhbmNoSW5kZXggPiAtMSkge1xuICAgICAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzLnNwbGljZShicmFuY2hJbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25OZXN0ZWRTdGVwQ2hhbmdlKG5lc3RlZFN0ZXAsIGluZGV4KTtcbiAgfVxuXG4gIG9uT3BlbkV4dGVybmFsKCk6IHZvaWQge1xuICAgIC8vIE5vdCB1c2VkIGluIGxvb3Agc3RlcCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIHN0ZXAgZ3JvdXBzXG4gIH1cblxuICBvbkVkaXQoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0U25hcHNob3QgPSB7XG4gICAgICB0ZXN0RGF0YVByb2ZpbGU6IHRoaXMudGVzdERhdGFQcm9maWxlLFxuICAgICAgc3RhcnRTdGVwOiB0aGlzLnN0YXJ0U3RlcCxcbiAgICAgIGVuZFN0ZXA6IHRoaXMuZW5kU3RlcCxcbiAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24sXG4gICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMsXG4gICAgfTtcbiAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgZm9yT3B0aW9uVHlwZTogbnVsbCxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGhpcy50ZXN0RGF0YVByb2ZpbGUgPz8gJycsXG4gICAgICBzdGFydFN0ZXA6IHRoaXMuc3RhcnRTdGVwID8/IG51bGwsXG4gICAgICBlbmRTdGVwOiB0aGlzLmVuZFN0ZXAgPz8gbnVsbCxcbiAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24gPz8gJycsXG4gICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNSxcbiAgICB9KTtcbiAgICB0aGlzLmlzRWRpdGluZyA9IHRydWU7XG4gICAgdGhpcy5lZGl0LmVtaXQoKTtcbiAgfVxuXG4gIG9uRWRpdEFwcGx5KCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLmVkaXRGb3JtLnZhbHVlO1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbHVlID0gdi50ZXN0RGF0YVByb2ZpbGUgPz8gJyc7XG4gICAgdGhpcy5zdGFydFN0ZXAgPSB2LnN0YXJ0U3RlcCA/PyB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbmRTdGVwID0gdi5lbmRTdGVwID8/IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHYuY29uZGl0aW9uID8/ICcnO1xuICAgIGNvbnN0IG1heFZhbCA9IHYubWF4SXRlcmF0aW9ucztcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB0eXBlb2YgbWF4VmFsID09PSAnbnVtYmVyJyA/IG1heFZhbCA6IChtYXhWYWwgIT0gbnVsbCAmJiBtYXhWYWwgIT09ICcnID8gTnVtYmVyKG1heFZhbCkgOiB1bmRlZmluZWQpO1xuICAgIFxuICAgIC8vIEZpbmQgdGhlIHNlbGVjdGVkIGRhdGEgcHJvZmlsZSBvcHRpb24gdG8gZ2V0IGJvdGggSUQgYW5kIG5hbWVcbiAgICBsZXQgdGVzdERhdGFQcm9maWxlSWQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdGVzdERhdGFQcm9maWxlTmFtZTogc3RyaW5nID0gJyc7XG4gICAgXG4gICAgaWYgKHRlc3REYXRhUHJvZmlsZVZhbHVlICYmIHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFRoZSBmb3JtIHZhbHVlIG1pZ2h0IGJlIElEIChudW1iZXIpIG9yIG5hbWUgKHN0cmluZylcbiAgICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZSA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAgIG9wdGlvbiA9PiBvcHRpb24uaWQgPT09IE51bWJlcih0ZXN0RGF0YVByb2ZpbGVWYWx1ZSkgfHwgb3B0aW9uLm5hbWUgPT09IHRlc3REYXRhUHJvZmlsZVZhbHVlIHx8IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcodGVzdERhdGFQcm9maWxlVmFsdWUpXG4gICAgICApO1xuICAgICAgaWYgKHNlbGVjdGVkUHJvZmlsZSkge1xuICAgICAgICB0ZXN0RGF0YVByb2ZpbGVJZCA9IHNlbGVjdGVkUHJvZmlsZS5pZDtcbiAgICAgICAgdGVzdERhdGFQcm9maWxlTmFtZSA9IHNlbGVjdGVkUHJvZmlsZS5uYW1lO1xuICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZU5hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBub3QgZm91bmQsIHVzZSB0aGUgdmFsdWUgYXMtaXMgKG1pZ2h0IGJlIElEIG9yIG5hbWUpXG4gICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGVzdERhdGFQcm9maWxlVmFsdWU7XG4gICAgICAgIHRlc3REYXRhUHJvZmlsZUlkID0gTnVtYmVyKHRlc3REYXRhUHJvZmlsZVZhbHVlKSB8fCB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGVzdERhdGFQcm9maWxlVmFsdWU7XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSBjb25maWcgd2l0aCBuZXcgdmFsdWVzIChpbmNsdWRlIHRlc3REYXRhUHJvZmlsZUlkIGFzIGFkZGl0aW9uYWwgcHJvcGVydHkpXG4gICAgY29uc3QgdXBkYXRlZENvbmZpZzogTG9vcFN0ZXBDb25maWcgJiB7IHRlc3REYXRhUHJvZmlsZUlkPzogc3RyaW5nIHwgbnVtYmVyIH0gPSB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGhpcy50ZXN0RGF0YVByb2ZpbGUsXG4gICAgICB0ZXN0RGF0YVByb2ZpbGVJZDogdGVzdERhdGFQcm9maWxlSWQsIC8vIEFkZCBJRCBmb3IgQVBJIGNhbGxcbiAgICAgIHN0YXJ0U3RlcDogdGhpcy5zdGFydFN0ZXAsXG4gICAgICBlbmRTdGVwOiB0aGlzLmVuZFN0ZXAsXG4gICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uLFxuICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zLFxuICAgIH07XG4gICAgXG4gICAgLy8gRW1pdCBpbmRpdmlkdWFsIGNoYW5nZSBldmVudHNcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZUNoYW5nZS5lbWl0KHRoaXMudGVzdERhdGFQcm9maWxlKTtcbiAgICB0aGlzLnN0YXJ0U3RlcENoYW5nZS5lbWl0KHRoaXMuc3RhcnRTdGVwID8/IDEpO1xuICAgIHRoaXMuZW5kU3RlcENoYW5nZS5lbWl0KHRoaXMuZW5kU3RlcCA/PyAxKTtcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgdGhpcy5jb25kaXRpb25DaGFuZ2UuZW1pdCh0aGlzLmNvbmRpdGlvbik7XG4gICAgICB0aGlzLm1heEl0ZXJhdGlvbnNDaGFuZ2UuZW1pdCh0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVtaXQgc3RlcCB1cGRhdGUgZXZlbnQgd2l0aCBmdWxsIGNvbmZpZ1xuICAgIGNvbnNvbGUubG9nKCdMb29wLXN0ZXA6IEVtaXR0aW5nIHN0ZXBVcGRhdGUgZXZlbnQnLCB1cGRhdGVkQ29uZmlnKTtcbiAgICB0aGlzLnN0ZXBVcGRhdGUuZW1pdCh1cGRhdGVkQ29uZmlnKTtcbiAgICBcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25FZGl0Q2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGhpcy5lZGl0U25hcHNob3QudGVzdERhdGFQcm9maWxlO1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdGhpcy5lZGl0U25hcHNob3Quc3RhcnRTdGVwO1xuICAgIHRoaXMuZW5kU3RlcCA9IHRoaXMuZWRpdFNuYXBzaG90LmVuZFN0ZXA7XG4gICAgdGhpcy5jb25kaXRpb24gPSB0aGlzLmVkaXRTbmFwc2hvdC5jb25kaXRpb247XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdGhpcy5lZGl0U25hcHNob3QubWF4SXRlcmF0aW9ucztcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25FZGl0SW5EZXB0aCgpOiB2b2lkIHtcbiAgICB0aGlzLm1vcmVPcHRpb25zLmVtaXQoKTtcbiAgICBjb25zdCBpbmRleCA9IHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdudW1iZXInID8gdGhpcy5zdGVwTnVtYmVyIDogKHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQodGhpcy5zdGVwTnVtYmVyLCAxMCkgOiAwKTtcbiAgICB0aGlzLmVkaXRJbkRlcHRoLmVtaXQoeyBzdGVwOiB0aGlzLmNvbmZpZyBhcyBUZXN0Q2FzZVN0ZXBDb25maWcsIGluZGV4OiBpc05hTihpbmRleCkgPyAwIDogaW5kZXggfSk7XG4gIH1cblxuICBvbkxpbmsoKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgc3RlcCBncm91cHNcbiAgfVxuXG4gIG9uRHVwbGljYXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZHVwbGljYXRlLmVtaXQoKTtcbiAgfVxuXG4gIG9uRGVsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlLmVtaXQoKTtcbiAgfVxuXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gY2hlY2tlZDtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KGNoZWNrZWQpO1xuICB9XG5cbiAgb25Nb3JlT3B0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLm1vcmVPcHRpb25zLmVtaXQoKTtcbiAgfVxuXG4gIG9uVmlld0RldGFpbHMoZXZlbnQ/OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIFxuICAgIGlmICghdGhpcy5jb25maWcuZGVzY3JpcHRpb24gfHwgdGhpcy5jb25maWcuZGVzY3JpcHRpb24udHJpbSgpID09PSAnJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudCkge1xuICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdGT1IgTE9PUCBEZXRhaWxzJyA6ICdXSElMRSBMT09QIERldGFpbHMnO1xuICAgICAgdGhpcy52aWV3RGV0YWlscy5lbWl0KHtcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRpdGxlLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5jb25maWcuZGVzY3JpcHRpb24sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgPCEtLSBJbmxpbmUgRWRpdCBNb2RlOiBGcmFtZSAyMTQ3MjI0OTEwIC0gZmxleCByb3csIDEwNTbDlzM2LCBnYXAgMTJweCwgZmxleC1ub25lIC0tPlxuICA8ZGl2ICpuZ0lmPVwiaXNFZGl0aW5nXCIgY2xhc3M9XCJjcWEtcHktMi41IGNxYS1weC00IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1qdXN0aWZ5LWJldHdlZW5cIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWZsZXgtZ3Jvd1wiPlxuICAgICAgPCEtLSBMb29wIFR5cGUgTGFiZWwgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxQzM5OEVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgICAge3sgZ2V0TG9vcFR5cGVMYWJlbCgpIH19XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBGT1IgTE9PUCBpbmxpbmUgZWRpdDogY3FhLWR5bmFtaWMtc2VsZWN0IChzYW1lIHVzYWdlIGFzIGRlZmF1bHQgc3RvcmllcykgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9vcFR5cGUgPT09ICdmb3InXCI+XG4gICAgICAgIDwhLS0gRmlyc3Qgc2VsZWN0OiB3aWR0aCAyMTYuMjVweCwgaGVpZ2h0IDM2cHgsIGdhcCA0cHgsIG9wYWNpdHkgMSAtLT5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwiZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cInRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cInN0YXJ0U3RlcFNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cImVuZFN0ZXBTZWxlY3RDb25maWdcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gV0hJTEUgTE9PUCBpbmxpbmUgZWRpdCAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1doaWxlTG9vcCgpXCI+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cImNvbmRpdGlvblNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBFZGl0IEluIGRlcHRoIGxpbmsgLS0+XG4gICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVsycHhdIGNxYS1uby11bmRlcmxpbmVcIj5cbiAgICAgICAgRWRpdCBJbiBkZXB0aFxuICAgICAgICA8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTIuMDM4MDkgNi43NDMyOUwyLjYyODA5IDcuMzMzMjlMNS45NjE0MiAzLjk5OTk2TDIuNjI4MDkgMC42NjY2MjZMMi4wMzgwOSAxLjI1NjYzTDQuNzgxNDIgMy45OTk5NkwyLjAzODA5IDYuNzQzMjlaXCJcbiAgICAgICAgICAgIGZpbGw9XCIjM0Y0M0VFXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2E+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNVwiPlxuICAgICAgPCEtLSBDYW5jZWwgLyBBcHBseSAtLT5cbiAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQ2FuY2VsJ1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uRWRpdENhbmNlbCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQXBwbHknXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25FZGl0QXBwbHkoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMb29wIEhlYWRlciAobm9ybWFsIHZpZXcgd2hlbiBub3QgZWRpdGluZykgLS0+XG4gIDxkaXYgKm5nSWY9XCIhaXNFZGl0aW5nXCJcbiAgICBbY2xhc3NdPVwiJ3N0ZXAtcm93IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weS0yICcgKyAoaXNJbnNpZGVMb29wID8gJ2NxYS1wbC0xMCBjcWEtcHItNCcgOiAnY3FhLXB4LTQnKVwiPlxuICAgIDwhLS0gRHJhZyBIYW5kbGUgSWNvbiAod2hlbiBpc1Jlb3JkZXIgaXMgdHJ1ZSkgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzUmVvcmRlclwiIGNsYXNzPVwiY3FhLW1yLTIgY3FhLWN1cnNvci1tb3ZlIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtdGV4dC1bIzExMTgyN11cIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBDaGVja2JveCAod2hlbiBpc1Jlb3JkZXIgaXMgZmFsc2UpIC0tPlxuICAgIDxsYWJlbCAqbmdJZj1cIiFpc1Jlb3JkZXJcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1yZWxhdGl2ZVwiPlxuICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWgtNCBjcWEtdy00IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWFwcGVhcmFuY2Utbm9uZSBjcWEtcm91bmRlZCBzaGFkb3cgaG92ZXI6Y3FhLXNoYWRvdy1tZCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1zbGF0ZS0zMDAgY3FhLWZsZXgtc2hyaW5rLTBcIlxuICAgICAgICBbY2xhc3MuY3FhLWJnLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFwiXG4gICAgICAgIGlkPVwiY2hlY2stbG9vcC1zdGVwXCIgLz5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS10ZXh0LXdoaXRlIGNxYS10b3AtMS8yIGNxYS1sZWZ0LTEvMiBjcWEtLXRyYW5zbGF0ZS14LTEvMiBjcWEtLXRyYW5zbGF0ZS15LTEvMiBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0wXT1cIiFzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0xMDBdPVwic2VsZWN0ZWRcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDEyIDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xMCAzLjEyNUw0LjUgOC42MjVMMiA2LjEyNVwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbGFiZWw+XG4gICAgPCEtLSBFeHBhbmQvQ29sbGFwc2UgSWNvbiAtLT5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25Ub2dnbGVFeHBhbmRlZCgpXCIgY2xhc3M9XCJjcWEtcC0wXCI+XG4gICAgICA8c3ZnIFtjbGFzcy5jcWEtcm90YXRlLTE4MF09XCIhZXhwYW5kZWRcIiBjbGFzcz1cImNxYS10cmFuc2l0aW9uLXRyYW5zZm9ybVwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXG4gICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMiAxMEw4IDZMNCAxMFwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9idXR0b24+XG5cbiAgICA8IS0tIExvb3AgSWNvbiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwibG9vcFR5cGUgPT09ICdmb3InXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMS4zMzQgMS4zMzMyNUwxNC4wMDA3IDMuOTk5OTJMMTEuMzM0IDYuNjY2NTlcIiBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGggZD1cIk0yIDcuMzMzMzNWNi42NjY2N0MyIDUuOTU5NDIgMi4yODA5NSA1LjI4MTE1IDIuNzgxMDUgNC43ODEwNUMzLjI4MTE1IDQuMjgwOTUgMy45NTk0MiA0IDQuNjY2NjcgNEgxNFwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzFDMzk4RVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTQuNjY2NjcgMTQuNjY2NkwyIDExLjk5OTlMNC42NjY2NyA5LjMzMzI1XCIgc3Ryb2tlPVwiIzFDMzk4RVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xNCA4LjY2Njc1VjkuMzMzNDFDMTQgMTAuMDQwNyAxMy43MTkgMTAuNzE4OSAxMy4yMTkgMTEuMjE5QzEyLjcxODkgMTEuNzE5MSAxMi4wNDA2IDEyLjAwMDEgMTEuMzMzMyAxMi4wMDAxSDJcIlxuICAgICAgICAgIHN0cm9rZT1cIiMxQzM5OEVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ3doaWxlJ1wiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNMTEuMzM0IDEuMzMzMjVMMTQuMDAwNyAzLjk5OTkyTDExLjMzNCA2LjY2NjU5XCIgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNMiA3LjMzMzMzVjYuNjY2NjdDMiA1Ljk1OTQyIDIuMjgwOTUgNS4yODExNSAyLjc4MTA1IDQuNzgxMDVDMy4yODExNSA0LjI4MDk1IDMuOTU5NDIgNCA0LjY2NjY3IDRIMTRcIlxuICAgICAgICAgIHN0cm9rZT1cIiM1OTE2OEJcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGggZD1cIk00LjY2NjY3IDE0LjY2NjZMMiAxMS45OTk5TDQuNjY2NjcgOS4zMzMyNVwiIHN0cm9rZT1cIiM1OTE2OEJcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNMTQgOC42NjY3NVY5LjMzMzQxQzE0IDEwLjA0MDcgMTMuNzE5IDEwLjcxODkgMTMuMjE5IDExLjIxOUMxMi43MTg5IDExLjcxOTEgMTIuMDQwNiAxMi4wMDAxIDExLjMzMzMgMTIuMDAwMUgyXCJcbiAgICAgICAgICBzdHJva2U9XCIjNTkxNjhCXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTG9vcCBUeXBlIExhYmVsIC0tPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxQzM5OEVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1ub25lXCI+XG4gICAgICB7eyBnZXRMb29wVHlwZUxhYmVsKCkgfX1cbiAgICA8L3NwYW4+XG5cbiAgICA8IS0tIEZvciBMb29wIENvbnRyb2xzIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1tbC0yXCI+XG4gICAgICA8IS0tIFRlc3QgRGF0YSBQcm9maWxlIEJ1dHRvbiAtLT5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtjbGFzcy5jcWEtYmctcHJpbWFyeS0xMDBdPVwidGVzdERhdGFQcm9maWxlXCIgW2NsYXNzLmNxYS10ZXh0LXByaW1hcnldPVwidGVzdERhdGFQcm9maWxlXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcHktMC41IGNxYS1weC0yIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE3cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjOEE4Q0Y0XSBjcWEtcm91bmRlZCBjcWEtYmctWyNEOEQ5RkNdXCI+XG4gICAgICAgIHt7IGdldFRlc3REYXRhUHJvZmlsZUxhYmVsKCkgfX1cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8IS0tIFN0YXJ0IEJ1dHRvbiAtLT5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtjbGFzcy5jcWEtYmctcHJpbWFyeS0xMDBdPVwic3RhcnRTdGVwXCIgW2NsYXNzLmNxYS10ZXh0LXByaW1hcnldPVwic3RhcnRTdGVwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcHktMC41IGNxYS1weC0yIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE3cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjOEE4Q0Y0XSBjcWEtcm91bmRlZCBjcWEtYmctWyNEOEQ5RkNdXCI+XG4gICAgICAgIHt7IGdldFN0YXJ0U3RlcExhYmVsKCkgfX1cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8IS0tIEVuZCBCdXR0b24gLS0+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBbY2xhc3MuY3FhLWJnLXByaW1hcnktMTAwXT1cImVuZFN0ZXBcIiBbY2xhc3MuY3FhLXRleHQtcHJpbWFyeV09XCJlbmRTdGVwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcHktMC41IGNxYS1weC0yIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE3cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjOEE4Q0Y0XSBjcWEtcm91bmRlZCBjcWEtYmctWyNEOEQ5RkNdXCI+XG4gICAgICAgIHt7IGdldEVuZFN0ZXBMYWJlbCgpIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gV2hpbGUgTG9vcCBDb25kaXRpb24gKG9ubHkgc2hvdyBpZiBjb25kaXRpb24gZXhpc3RzKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNXaGlsZUxvb3AoKSAmJiBjb25kaXRpb25cIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1tbC0yIGNxYS1mbGV4LTFcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtZ3JheS03MDAgY3FhLXRleHQtc21cIj5cbiAgICAgICAgV2hpbGVcbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtZ3JheS05MDAgY3FhLXRleHQtc21cIiBbaW5uZXJIVE1MXT1cImdldENvbmRpdGlvbkRpc3BsYXkoKVwiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU3RlcHMgU3VtbWFyeSAtLT5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImNxYS1tbC1hdXRvIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFNUU1XSBjcWEtcm91bmRlZC1sZyBjcWEtcHktMC41IGNxYS1weC0yIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdXCI+XG4gICAgICB7eyBnZXRTdGVwc1N1bW1hcnkoKSB9fVxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBWaWV3IERldGFpbHMgTGluayAoc2hvdyBvbmx5IGlmIGRlc2NyaXB0aW9uIGlzIG5vdCBlbXB0eSkgLS0+XG4gICAgPGEgKm5nSWY9XCJjb25maWcuZGVzY3JpcHRpb24gJiYgY29uZmlnLmRlc2NyaXB0aW9uLnRyaW0oKSAhPT0gJydcIiAjdmlld0RldGFpbHNUcmlnZ2VyIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uVmlld0RldGFpbHMoJGV2ZW50KVwiIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1uby11bmRlcmxpbmUgY3FhLW1sLWF1dG9cIj5WaWV3IERldGFpbHM8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz48L2E+XG5cbiAgICA8IS0tIEFjdGlvbiBJY29uczogRWRpdCwgTGluaywgRHVwbGljYXRlLCBEZWxldGUgKHNob3cgb24gaG92ZXIpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJzdGVwLWFjdGlvbnMgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB4LVs3cHhdXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25FZGl0KCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRWRpdFwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5QTFBZl0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNyAxMS42NjY2SDEyLjI1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTkuNTUyMDggMi4xMTI4QzkuNzg0MyAxLjg4MDU4IDEwLjA5OTMgMS43NTAxMiAxMC40Mjc3IDEuNzUwMTJDMTAuNzU2MSAxLjc1MDEyIDExLjA3MSAxLjg4MDU4IDExLjMwMzMgMi4xMTI4QzExLjUzNTUgMi4zNDUwMiAxMS42NjU5IDIuNjU5OTggMTEuNjY1OSAyLjk4ODM4QzExLjY2NTkgMy4zMTY3OSAxMS41MzU1IDMuNjMxNzUgMTEuMzAzMyAzLjg2Mzk3TDQuMjk3NDIgMTAuODcwNEM0LjE1ODY0IDExLjAwOTIgMy45ODcxIDExLjExMDcgMy43OTg2NyAxMS4xNjU2TDIuMTIzMzMgMTEuNjU0NEMyLjA3MzE0IDExLjY2OSAyLjAxOTkzIDExLjY2OTkgMS45NjkyOCAxMS42NTY5QzEuOTE4NjMgMTEuNjQzOSAxLjg3MjQgMTEuNjE3NiAxLjgzNTQzIDExLjU4MDZDMS43OTg0NiAxMS41NDM3IDEuNzcyMSAxMS40OTc0IDEuNzU5MTMgMTEuNDQ2OEMxLjc0NjE1IDExLjM5NjEgMS43NDcwMyAxMS4zNDI5IDEuNzYxNjcgMTEuMjkyN0wyLjI1MDUgOS42MTczOEMyLjMwNTQ2IDkuNDI5MTYgMi40MDY5OCA5LjI1NzgzIDIuNTQ1NjcgOS4xMTkyMkw5LjU1MjA4IDIuMTEyOFpcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25MaW5rKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiTGlua1wiXG4gICAgICAgIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5QTFBZl0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTUuMDAwNjUgOS45MTY3MUgzLjY2NzMyQzIuNzgzMjYgOS45MTY3MSAxLjkzNTQyIDkuNjA5NDIgMS4zMTAzIDkuMDYyNDRDMC42ODUxNzQgOC41MTU0NSAwLjMzMzk4NCA3Ljc3MzU5IDAuMzMzOTg0IDcuMDAwMDRDMC4zMzM5ODQgNi4yMjY0OSAwLjY4NTE3NCA1LjQ4NDYzIDEuMzEwMyA0LjkzNzY1QzEuOTM1NDIgNC4zOTA2NiAyLjc4MzI2IDQuMDgzMzcgMy42NjczMiA0LjA4MzM3SDUuMDAwNjVcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNOSA0LjA4MzM3SDEwLjMzMzNDMTEuMjE3NCA0LjA4MzM3IDEyLjA2NTIgNC4zOTA2NiAxMi42OTA0IDQuOTM3NjVDMTMuMzE1NSA1LjQ4NDYzIDEzLjY2NjcgNi4yMjY0OSAxMy42NjY3IDcuMDAwMDRDMTMuNjY2NyA3Ljc3MzU5IDEzLjMxNTUgOC41MTU0NSAxMi42OTA0IDkuMDYyNDRDMTIuMDY1MiA5LjYwOTQyIDExLjIxNzQgOS45MTY3MSAxMC4zMzMzIDkuOTE2NzFIOVwiXG4gICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTQuMzMzOTggN0g5LjY2NzMyXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRHVwbGljYXRlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRHVwbGljYXRlXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjOTlBMUFmXSBob3ZlcjpjcWEtdGV4dC1bIzE0NDdFNl1cIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNMTEuNjY2IDQuNjY2NjNINS44MzI2OEM1LjE4ODM1IDQuNjY2NjMgNC42NjYwMiA1LjE4ODk2IDQuNjY2MDIgNS44MzMyOVYxMS42NjY2QzQuNjY2MDIgMTIuMzExIDUuMTg4MzUgMTIuODMzMyA1LjgzMjY4IDEyLjgzMzNIMTEuNjY2QzEyLjMxMDMgMTIuODMzMyAxMi44MzI3IDEyLjMxMSAxMi44MzI3IDExLjY2NjZWNS44MzMyOUMxMi44MzI3IDUuMTg4OTYgMTIuMzEwMyA0LjY2NjYzIDExLjY2NiA0LjY2NjYzWlwiXG4gICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0yLjMzMjY4IDkuMzMzMjlDMS42OTEwMiA5LjMzMzI5IDEuMTY2MDIgOC44MDgyOSAxLjE2NjAyIDguMTY2NjNWMi4zMzMyOUMxLjE2NjAyIDEuNjkxNjMgMS42OTEwMiAxLjE2NjYzIDIuMzMyNjggMS4xNjY2M0g4LjE2NjAyQzguODA3NjggMS4xNjY2MyA5LjMzMjY4IDEuNjkxNjMgOS4zMzI2OCAyLjMzMzI5XCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRGVsZXRlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRGVsZXRlXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjZmY2NDY3XSBob3ZlcjpjcWEtdGV4dC1bI0M2MzUzNV1cIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHBhdGggZD1cIk0xLjc1IDMuNUgxMi4yNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0xMS4wODI3IDMuNVYxMS42NjY3QzExLjA4MjcgMTIuMjUgMTAuNDk5MyAxMi44MzMzIDkuOTE2MDIgMTIuODMzM0g0LjA4MjY4QzMuNDk5MzUgMTIuODMzMyAyLjkxNjAyIDEyLjI1IDIuOTE2MDIgMTEuNjY2N1YzLjVcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNNC42NjYwMiAzLjQ5OTk2VjIuMzMzMjlDNC42NjYwMiAxLjc0OTk2IDUuMjQ5MzUgMS4xNjY2MyA1LjgzMjY4IDEuMTY2NjNIOC4xNjYwMkM4Ljc0OTM1IDEuMTY2NjMgOS4zMzI2OCAxLjc0OTk2IDkuMzMyNjggMi4zMzMyOVYzLjQ5OTk2XCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNS44MzM5OCA2LjQxNjYzVjkuOTE2NjNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPHBhdGggZD1cIk04LjE2NjAyIDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBFeHBhbmRlZCBDb250ZW50IHdpdGggTmVzdGVkIFN0ZXBzIChyZW5kZXJlciBkaXNwYXRjaGVzIGJ5IHN0ZXAgdHlwZSwgbi1sZXZlbCBuZXN0aW5nKSAtLT5cbiAgPGRpdiAqbmdJZj1cImV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzUmVvcmRlclwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgICA8Y3FhLXRlc3QtY2FzZS1kZXRhaWxzLXJlbmRlcmVyICpuZ0Zvcj1cImxldCBzdGVwIG9mIG5lc3RlZFN0ZXBzOyBsZXQgaSA9IGluZGV4XCIgW3N0ZXBdPVwic3RlcFwiIFtpbmRleF09XCJpXCJcbiAgICAgICAgW3NlbGVjdGVkXT1cIiRhbnkoc3RlcCkuc2VsZWN0ZWRcIlxuICAgICAgICBbaXNOZXN0ZWRdPVwidHJ1ZVwiIFtpc0luc2lkZUxvb3BdPVwidHJ1ZVwiIFtpc1Jlb3JkZXJdPVwiaXNSZW9yZGVyXCJcbiAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuXT1cImFkZFN0ZXBCZXR3ZWVuXCJcbiAgICAgICAgW2RhdGFQcm9maWxlT3B0aW9uc109XCJkYXRhUHJvZmlsZU9wdGlvbnNcIiBbaGFzTW9yZURhdGFQcm9maWxlc109XCJoYXNNb3JlRGF0YVByb2ZpbGVzXCIgW2lzTG9hZGluZ0RhdGFQcm9maWxlc109XCJpc0xvYWRpbmdEYXRhUHJvZmlsZXNcIlxuICAgICAgICBbbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc109XCJuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXCJcbiAgICAgICAgKG5lc3RlZFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKCRldmVudC5zdGVwLCAkZXZlbnQuaW5kZXgpXCJcbiAgICAgICAgKGFkZFN0ZXApPVwib25BZGRTdGVwKClcIiAoZGVsZXRlU3RlcCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50KVwiXG4gICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgc3RlcCwgaSlcIlxuICAgICAgICAoZ3JvdXBOYW1lQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZ3JvdXBOYW1lID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoZGVzY3JpcHRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5kZXNjcmlwdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChvcGVuRXh0ZXJuYWwpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGVkaXQpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGxpbmspPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGR1cGxpY2F0ZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZGVsZXRlKT1cIm9uRGVsZXRlU3RlcChpKVwiXG4gICAgICAgICh2aWV3RGV0YWlscyk9XCJ2aWV3RGV0YWlscy5lbWl0KCRldmVudClcIlxuICAgICAgICAoY29uZGl0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuY29uZGl0aW9uID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoYnJhbmNoU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCksIGkpXCJcbiAgICAgICAgKGRlbGV0ZUJyYW5jaCk9XCJvbk5lc3RlZENvbmRpdGlvbkRlbGV0ZUJyYW5jaCgkYW55KHN0ZXApLCAkZXZlbnQsIGkpXCJcbiAgICAgICAgKHRlc3REYXRhUHJvZmlsZUNoYW5nZSk9XCIkYW55KHN0ZXApLnRlc3REYXRhUHJvZmlsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHN0YXJ0U3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLnN0YXJ0U3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGVuZFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5lbmRTdGVwID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAobWF4SXRlcmF0aW9uc0NoYW5nZSk9XCIkYW55KHN0ZXApLm1heEl0ZXJhdGlvbnMgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChldmVudFR5cGVDaGFuZ2UpPVwiJGFueShzdGVwKS5ldmVudFR5cGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChwYXJhbWV0ZXJDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLnNlbGVjdGVkID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAobG9hZE1vcmVEYXRhUHJvZmlsZXMpPVwibG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKHNlYXJjaERhdGFQcm9maWxlcyk9XCJzZWFyY2hEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGRuZERyb3BJblpvbmUpPVwiZG5kRHJvcEluWm9uZS5lbWl0KCRldmVudClcIlxuICAgICAgICAoY2xpY2tBY3Rpb24pPVwiY2xpY2tBY3Rpb24uZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGVkaXRJbkRlcHRoKT1cImVkaXRJbkRlcHRoLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChhZGRTdGVwQmV0d2VlbkNsaWNrKT1cImFkZFN0ZXBCZXR3ZWVuQ2xpY2suZW1pdCgkZXZlbnQpXCI+XG4gICAgICA8L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgbmVzdGVkLXN0ZXAtZHJvcC1saXN0XCJcbiAgICAgICAgIFtkbmREcm9wem9uZV09XCJbJ3N0ZXAnXVwiXG4gICAgICAgICBkbmRFZmZlY3RBbGxvd2VkPVwibW92ZVwiXG4gICAgICAgICBkbmREcmFnb3ZlckNsYXNzPVwiZG5kRHJhZ292ZXJcIlxuICAgICAgICAgKGRuZERyb3ApPVwib25EbmREcm9wKCRldmVudClcIj5cbiAgICAgIDxkaXYgZG5kUGxhY2Vob2xkZXJSZWYgY2xhc3M9XCJzdGVwLWRyYWctcGxhY2Vob2xkZXItbmVzdGVkIGNxYS1teS0xIGNxYS1taW4taC1bNTBweF0gY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMzRjQzRUVdIGNxYS1yb3VuZGVkIGNxYS1iZy1bcmdiYSg2Myw2NywyMzgsMC4wOCldIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC14c1wiPkRyb3AgaGVyZTwvZGl2PlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3RlcCBvZiBuZXN0ZWRTdGVwczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwibmVzdGVkLXN0ZXAtZHJhZy1pdGVtXCJcbiAgICAgICAgICAgW2RuZERyYWdnYWJsZV09XCJzdGVwXCJcbiAgICAgICAgICAgZG5kRWZmZWN0QWxsb3dlZD1cIm1vdmVcIlxuICAgICAgICAgICBkbmRUeXBlPVwic3RlcFwiPlxuICAgICAgICA8Y3FhLXRlc3QtY2FzZS1kZXRhaWxzLXJlbmRlcmVyIFtzdGVwXT1cInN0ZXBcIiBbaW5kZXhdPVwiaVwiXG4gICAgICAgICAgW3NlbGVjdGVkXT1cIiRhbnkoc3RlcCkuc2VsZWN0ZWRcIlxuICAgICAgICAgIFtpc05lc3RlZF09XCJ0cnVlXCIgW2lzSW5zaWRlTG9vcF09XCJ0cnVlXCIgW2lzUmVvcmRlcl09XCJpc1Jlb3JkZXJcIlxuICAgICAgICAgIFthZGRTdGVwQmV0d2VlbkFib3ZlXT1cImFkZFN0ZXBCZXR3ZWVuQWJvdmVcIlxuICAgICAgICAgIFthZGRTdGVwQmV0d2VlbkJlbG93XT1cImFkZFN0ZXBCZXR3ZWVuQmVsb3dcIlxuICAgICAgICAgIFthZGRTdGVwQmV0d2Vlbl09XCJhZGRTdGVwQmV0d2VlblwiXG4gICAgICAgICAgW2RhdGFQcm9maWxlT3B0aW9uc109XCJkYXRhUHJvZmlsZU9wdGlvbnNcIiBbaGFzTW9yZURhdGFQcm9maWxlc109XCJoYXNNb3JlRGF0YVByb2ZpbGVzXCIgW2lzTG9hZGluZ0RhdGFQcm9maWxlc109XCJpc0xvYWRpbmdEYXRhUHJvZmlsZXNcIlxuICAgICAgICAgIFtuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXT1cIm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNcIlxuICAgICAgICAgIChuZXN0ZWRTdGVwQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZSgkZXZlbnQuc3RlcCwgJGV2ZW50LmluZGV4KVwiXG4gICAgICAgICAgKGFkZFN0ZXApPVwib25BZGRTdGVwKClcIiAoZGVsZXRlU3RlcCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50KVwiXG4gICAgICAgICAgKHRvZ2dsZUV4cGFuZGVkKT1cIm9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoJGV2ZW50LCBzdGVwLCBpKVwiXG4gICAgICAgICAgKGdyb3VwTmFtZUNoYW5nZSk9XCIkYW55KHN0ZXApLmdyb3VwTmFtZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZGVzY3JpcHRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5kZXNjcmlwdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAocmV1c2FibGVDaGFuZ2UpPVwiJGFueShzdGVwKS5yZXVzYWJsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAob3BlbkV4dGVybmFsKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChlZGl0KT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGxpbmspPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGR1cGxpY2F0ZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZGVsZXRlKT1cIm9uRGVsZXRlU3RlcChpKVwiXG4gICAgICAgICAgKHZpZXdEZXRhaWxzKT1cInZpZXdEZXRhaWxzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoYnJhbmNoU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCksIGkpXCJcbiAgICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCwgaSlcIlxuICAgICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHN0YXJ0U3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLnN0YXJ0U3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZW5kU3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLmVuZFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChldmVudFR5cGVDaGFuZ2UpPVwiJGFueShzdGVwKS5ldmVudFR5cGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHBhcmFtZXRlckNoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChkbmREcm9wSW5ab25lKT1cImRuZERyb3BJblpvbmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0SW5EZXB0aCk9XCJlZGl0SW5EZXB0aC5lbWl0KCRldmVudClcIlxuICAgICAgICAoYWRkU3RlcEJldHdlZW5DbGljayk9XCJhZGRTdGVwQmV0d2VlbkNsaWNrLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFTkQgTWFya2VyIC0tPlxuICAgIDxkaXZcbiAgICAgIFtjbGFzc109XCInY3FhLXBsLTQgY3FhLXB5LTEgY3FhLWJnLVsjREJFQUZFODBdIGNxYS10ZXh0LVsjMUMzOThFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSdcIlxuICAgICAgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgI0JFREJGRjtcIj5cbiAgICAgIHt7IGdldEVuZExhYmVsKCkgfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
554
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvbG9vcC1zdGVwL2xvb3Atc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2xvb3Atc3RlcC9sb29wLXN0ZXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsU0FBUyxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBSWhJLE9BQU8sRUFBK0csU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEssT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7O0FBVXJFLE1BQU0sT0FBTyx5QkFBeUI7SUE4RnBDLFlBQ1UsRUFBZTtRQUFmLE9BQUUsR0FBRixFQUFFLENBQWE7UUE1RmhCLGFBQVEsR0FBb0IsS0FBSyxDQUFDO1FBT2xDLGdCQUFXLEdBQXlCLEVBQUUsQ0FBQztRQUN2QyxhQUFRLEdBQVksSUFBSSxDQUFDO1FBQ3pCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQ25DLGdGQUFnRjtRQUN2RSx1QkFBa0IsR0FBd0IsRUFBRSxDQUFDO1FBQ3RELGdFQUFnRTtRQUN2RCx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFDOUMsc0NBQXNDO1FBQzdCLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUNoRCxrRUFBa0U7UUFDekQsOEJBQXlCLEdBQW1CLEVBQUUsQ0FBQztRQUN4RCx3REFBd0Q7UUFDL0Msd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQzlDLHdE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QTNCLEtBQUs7Z0JBRUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsb0JBQW9CO3NCQUE3QixNQUFNO2dCQUVHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFFRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBMEI2QyxrQkFBa0I7c0JBQXJFLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEbmREcm9wRXZlbnQgfSBmcm9tICduZ3gtZHJhZy1kcm9wJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IExvb3BTdGVwQ29uZmlnLCBUZXN0Q2FzZVN0ZXBDb25maWcsIE5vcm1hbFN0ZXBDb25maWcsIENvbmRpdGlvblN0ZXBDb25maWcsIFN0ZXBHcm91cENvbmZpZywgQ29uZGl0aW9uQnJhbmNoLCBTdGVwVHlwZXMgfSBmcm9tICcuLi90ZXN0LWNhc2Utc3RlcC5tb2RlbHMnO1xuaW1wb3J0IHsgU1RFUF9ST1dfQUNUSU9OU19TVFlMRVMgfSBmcm9tICcuLi9zdGVwLXJvdy1hY3Rpb25zLnN0eWxlcyc7XG5pbXBvcnQgeyBEYXRhUHJvZmlsZU9wdGlvbiB9IGZyb20gJy4uLy4uL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItbG9vcC9zdGVwLWJ1aWxkZXItbG9vcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVmlld0RldGFpbHNQYXlsb2FkIH0gZnJvbSAnLi4vc3RlcC1kZXRhaWxzLW1vZGFsL3N0ZXAtZGV0YWlscy1tb2RhbC1kYXRhJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXRlc3QtY2FzZS1sb29wLXN0ZXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vbG9vcC1zdGVwLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBzdHlsZXM6IFtTVEVQX1JPV19BQ1RJT05TX1NUWUxFU10sXG59KVxuZXhwb3J0IGNsYXNzIFRlc3RDYXNlTG9vcFN0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IExvb3BTdGVwQ29uZmlnO1xuICBASW5wdXQoKSBpZCE6IHN0cmluZztcbiAgQElucHV0KCkgbG9vcFR5cGU6ICdmb3InIHwgJ3doaWxlJyA9ICdmb3InO1xuICBASW5wdXQoKSBzdGVwTnVtYmVyITogbnVtYmVyIHwgc3RyaW5nO1xuICBASW5wdXQoKSBjb25kaXRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHRlc3REYXRhUHJvZmlsZT86IHN0cmluZztcbiAgQElucHV0KCkgc3RhcnRTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBlbmRTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBuZXN0ZWRTdGVwczogVGVzdENhc2VTdGVwQ29uZmlnW10gPSBbXTtcbiAgQElucHV0KCkgZXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBpc05lc3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0luc2lkZUxvb3A6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNSZW9yZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciB0aGUgZGF0YSBwcm9maWxlIGRyb3Bkb3duIC0gYWNjZXB0cyBEYXRhUHJvZmlsZU9wdGlvbiBvYmplY3RzICovXG4gIEBJbnB1dCgpIGRhdGFQcm9maWxlT3B0aW9uczogRGF0YVByb2ZpbGVPcHRpb25bXSA9IFtdO1xuICAvKiogSW5kaWNhdGVzIGlmIG1vcmUgZGF0YSBwcm9maWxlcyBhcmUgYXZhaWxhYmxlIGZvciBsb2FkaW5nICovXG4gIEBJbnB1dCgpIGhhc01vcmVEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIExvYWRpbmcgc3RhdGUgZm9yIGRhdGEgcHJvZmlsZXMgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciBuYXR1cmFsIHRleHQgYWN0aW9ucyAoZm9yIHdoaWxlIGxvb3AgY29uZGl0aW9uKSAqL1xuICBASW5wdXQoKSBuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAvKiogU2hvdyBcIkFkZCBTdGVwIEJldHdlZW5cIiBidXR0b24gYWJvdmUgbmVzdGVkIHN0ZXBzICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBCZXR3ZWVuQWJvdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFNob3cgXCJBZGQgU3RlcCBCZXR3ZWVuXCIgYnV0dG9uIGJlbG93IG5lc3RlZCBzdGVwcyAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbkJlbG93OiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYWRkU3RlcEJldHdlZW5BYm92ZSBhbmQgYWRkU3RlcEJldHdlZW5CZWxvdyBpbnN0ZWFkLiBJZiBzZXQsIGFwcGxpZXMgdG8gYm90aCBidXR0b25zLiAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSB0b2dnbGVFeHBhbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e2NvbmZpZzogTG9vcFN0ZXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufT4oKTtcbiAgQE91dHB1dCgpIHRlc3REYXRhUHJvZmlsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgc3RhcnRTdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBlbmRTdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBjb25kaXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIG1heEl0ZXJhdGlvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIG5lc3RlZFN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBhZGRTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZGVsZXRlU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgZHVwbGljYXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbW9yZU9wdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB2aWV3RGV0YWlscyA9IG5ldyBFdmVudEVtaXR0ZXI8Vmlld0RldGFpbHNQYXlsb2FkPigpO1xuICBAT3V0cHV0KCkgZWRpdEluRGVwdGggPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBlZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZG5kRHJvcEluWm9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogRG5kRHJvcEV2ZW50OyB0YXJnZXRMaXN0OiBUZXN0Q2FzZVN0ZXBDb25maWdbXSB9PigpO1xuICAvKiogRW1pdCB3aGVuIG1vcmUgZGF0YSBwcm9maWxlcyBuZWVkIHRvIGJlIGxvYWRlZCAqL1xuICBAT3V0cHV0KCkgbG9hZE1vcmVEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXQgd2hlbiBkYXRhIHByb2ZpbGUgc2VhcmNoIHF1ZXJ5IGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIHNlYXJjaERhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdCB3aGVuIHN0ZXAgaXMgdXBkYXRlZCAoQXBwbHkgYnV0dG9uIGNsaWNrZWQgaW4gZWRpdCBtb2RlKSAqL1xuICBAT3V0cHV0KCkgc3RlcFVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8TG9vcFN0ZXBDb25maWc+KCk7XG4gIC8qKiBSZS1lbWl0IHdoZW4gYSBuZXN0ZWQgc3RlcCAoZS5nLiBub3JtYWwtc3RlcCkgZW1pdHMgY2xpY2tBY3Rpb24gKGUuZy4gZWxlbWVudC9sYWJlbCBjbGljayBmb3IgcG9wdXApICovXG4gIEBPdXRwdXQoKSBjbGlja0FjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudDsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnIH0+KCk7XG4gIC8qKiBSZS1lbWl0IGFkZFN0ZXBCZXR3ZWVuQ2xpY2sgZnJvbSBuZXN0ZWQgcmVuZGVyZXJzICovXG4gIEBPdXRwdXQoKSBhZGRTdGVwQmV0d2VlbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7c3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyLCBwb3NpdGlvbjogJ0FCT1ZFJyB8ICdCRUxPVyd9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIG9uRG5kRHJvcChldmVudDogRG5kRHJvcEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5kbmREcm9wSW5ab25lLmVtaXQoeyBldmVudCwgdGFyZ2V0TGlzdDogdGhpcy5uZXN0ZWRTdGVwcyB9KTtcbiAgfVxuXG4gIC8qKiBFeHBvc2UgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgdGVtcGxhdGUgKEFuZ3VsYXIgdGVtcGxhdGVzIGRvbid0IGhhdmUgU3RyaW5nL051bWJlcikgKi9cbiAgcmVhZG9ubHkgc3RyaW5nRm4gPSBTdHJpbmc7XG4gIHJlYWRvbmx5IG51bWJlckZuID0gTnVtYmVyO1xuXG4gIC8qKiBXaGVuIHRydWUsIGhlYWRlciBzaG93cyBpbmxpbmUgZWRpdCBmb3JtIChkcm9wZG93bnMsIGlucHV0cywgQ2FuY2VsL0FwcGx5KSAqL1xuICBpc0VkaXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogRm9ybSBmb3IgZWRpdCBtb2RlOyBib3VuZCB0byBjcWEtZHluYW1pYy1zZWxlY3QgKHNhbWUgcGF0dGVybiBhcyBkZWZhdWx0IHN0b3JpZXMpICovXG4gIGVkaXRGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBDYWNoZWQgc2VsZWN0IGNvbmZpZ3MgKHN0YWJsZSByZWZzIHRvIGF2b2lkIGNoYW5nZS1kZXRlY3Rpb24gbG9vcHMpICovXG4gIGZvck9wdGlvblR5cGVTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIHRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgc3RhcnRTdGVwU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBlbmRTdGVwU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBjb25kaXRpb25TZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG5cbiAgLyoqIE9wdGlvbnMgZm9yIExvb3AgU3RhcnQgLyBMb29wIEVuZCBkcm9wZG93bnMgKDEtMTApICovXG4gIGxvb3BTdGVwT3B0aW9uczogbnVtYmVyW10gPSBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdO1xuXG4gIEBWaWV3Q2hpbGQoJ3ZpZXdEZXRhaWxzVHJpZ2dlcicsIHsgc3RhdGljOiBmYWxzZSB9KSB2aWV3RGV0YWlsc1RyaWdnZXI/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAvKiogTG9jYWwgY29weSBvZiB2YWx1ZXMgd2hpbGUgZWRpdGluZyAoZm9yIENhbmNlbCByZXZlcnQpICovXG4gIHByaXZhdGUgZWRpdFNuYXBzaG90OiB7XG4gICAgdGVzdERhdGFQcm9maWxlPzogc3RyaW5nO1xuICAgIHN0YXJ0U3RlcD86IG51bWJlcjtcbiAgICBlbmRTdGVwPzogbnVtYmVyO1xuICAgIGNvbmRpdGlvbj86IHN0cmluZztcbiAgICBtYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXJcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5pZCA9IHRoaXMuY29uZmlnLmlkO1xuICAgICAgdGhpcy5sb29wVHlwZSA9IHRoaXMuY29uZmlnLmxvb3BUeXBlO1xuICAgICAgdGhpcy5zdGVwTnVtYmVyID0gdGhpcy5jb25maWcuc3RlcE51bWJlcjtcbiAgICAgIHRoaXMuY29uZGl0aW9uID0gdGhpcy5jb25maWcuY29uZGl0aW9uO1xuICAgICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdGhpcy5jb25maWcubWF4SXRlcmF0aW9ucztcbiAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGhpcy5jb25maWcudGVzdERhdGFQcm9maWxlO1xuICAgICAgdGhpcy5zdGFydFN0ZXAgPSB0aGlzLmNvbmZpZy5zdGFydFN0ZXA7XG4gICAgICB0aGlzLmVuZFN0ZXAgPSB0aGlzLmNvbmZpZy5lbmRTdGVwO1xuICAgICAgdGhpcy5uZXN0ZWRTdGVwcyA9IHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzIHx8IFtdO1xuICAgICAgdGhpcy5leHBhbmRlZCA9IHRoaXMuY29uZmlnLmV4cGFuZGVkICE9PSB1bmRlZmluZWQgPyB0aGlzLmNvbmZpZy5leHBhbmRlZCA6IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gKHRoaXMuY29uZmlnIGFzIGFueSkuc2VsZWN0ZWQgfHwgZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuYnVpbGRFZGl0Rm9ybSgpO1xuICAgIHRoaXMuYnVpbGRTZWxlY3RDb25maWdzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZyddICYmIHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gKHRoaXMuY29uZmlnIGFzIGFueSkuc2VsZWN0ZWQgfHwgZmFsc2U7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydkYXRhUHJvZmlsZU9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlRGF0YVByb2ZpbGVzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRGF0YVByb2ZpbGVzJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyduYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEVkaXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGZvck9wdGlvblR5cGU6IFtudWxsIGFzIHN0cmluZyB8IG51bGxdLFxuICAgICAgdGVzdERhdGFQcm9maWxlOiBbdGhpcy50ZXN0RGF0YVByb2ZpbGUgPz8gJyddLFxuICAgICAgc3RhcnRTdGVwOiBbdGhpcy5zdGFydFN0ZXAgPz8gbnVsbCBhcyBudW1iZXIgfCBudWxsXSxcbiAgICAgIGVuZFN0ZXA6IFt0aGlzLmVuZFN0ZXAgPz8gbnVsbCBhcyBudW1iZXIgfCBudWxsXSxcbiAgICAgIGNvbmRpdGlvbjogW3RoaXMuY29uZGl0aW9uID8/ICcnXSxcbiAgICAgIG1heEl0ZXJhdGlvbnM6IFt0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNV0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQnVpbGQgc2VsZWN0IGNvbmZpZ3Mgb25jZSAoc2FtZSBvcHRpb24gc2hhcGUgYXMgZGVmYXVsdCBzdG9yaWVzOiBpZCArIG5hbWUpICovXG4gIHByaXZhdGUgYnVpbGRTZWxlY3RDb25maWdzKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXBPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IHRoaXMubG9vcFN0ZXBPcHRpb25zLm1hcCgobikgPT4gKHtcbiAgICAgIGlkOiBuLFxuICAgICAgdmFsdWU6IG4sXG4gICAgICBuYW1lOiBTdHJpbmcobiksXG4gICAgICBsYWJlbDogU3RyaW5nKG4pLFxuICAgIH0pKTtcbiAgICB0aGlzLmZvck9wdGlvblR5cGVTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdmb3JPcHRpb25UeXBlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IG9wdGlvbicsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBpZDogJ3Rlc3QtZGF0YScsIHZhbHVlOiAndGVzdC1kYXRhJywgbmFtZTogJ1Rlc3QgRGF0YSBQcm9maWxlJywgbGFiZWw6ICdUZXN0IERhdGEgUHJvZmlsZScgfSxcbiAgICAgICAgeyBpZDogJ2ZpeGVkJywgdmFsdWU6ICdmaXhlZCcsIG5hbWU6ICdGaXhlZCBjb3VudCcsIGxhYmVsOiAnRml4ZWQgY291bnQnIH0sXG4gICAgICBdLFxuICAgIH07XG4gICAgdGhpcy51cGRhdGVUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLnN0YXJ0U3RlcFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3N0YXJ0U3RlcCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ0xvb3AgU3RhcnQnLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBzdGVwT3B0aW9ucy5tYXAoKG8pID0+ICh7IC4uLm8gfSkpLFxuICAgIH07XG4gICAgdGhpcy5lbmRTdGVwU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnZW5kU3RlcCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ0xvb3AgRW5kJyxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogc3RlcE9wdGlvbnMubWFwKChvKSA9PiAoeyAuLi5vIH0pKSxcbiAgICB9O1xuICAgIHRoaXMudXBkYXRlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk7XG4gIH1cblxuICAvKiogVXBkYXRlIGNvbmRpdGlvbiBzZWxlY3QgY29uZmlnIHdpdGggbmF0dXJhbCB0ZXh0IGFjdGlvbnMgb3B0aW9ucyAqL1xuICBwcml2YXRlIHVwZGF0ZUNvbmRpdGlvblNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvblNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2NvbmRpdGlvbicsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBjb25kaXRpb24nLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFVwZGF0ZSB0ZXN0IGRhdGEgcHJvZmlsZSBzZWxlY3QgY29uZmlnIHdpdGggY3VycmVudCBvcHRpb25zIGFuZCBjYWxsYmFja3MgKi9cbiAgcHJpdmF0ZSB1cGRhdGVUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICd0ZXN0RGF0YVByb2ZpbGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdUZXN0ZGF0YXByb2ZpbGUnLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZURhdGFQcm9maWxlcyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdEYXRhUHJvZmlsZXMsXG4gICAgICBvcHRpb25zOiB0aGlzLmNvbnZlcnREYXRhUHJvZmlsZU9wdGlvbnNUb1NlbGVjdE9wdGlvbnModGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMpLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25EYXRhUHJvZmlsZUNoYW5nZSh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMub25TZWFyY2hEYXRhUHJvZmlsZXMocXVlcnkpO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6IChxdWVyeT86IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm9uTG9hZE1vcmVEYXRhUHJvZmlsZXMocXVlcnkgfHwgJycpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIENvbnZlcnQgRGF0YVByb2ZpbGVPcHRpb25bXSB0byBTZWxlY3RPcHRpb25bXSAqL1xuICBwcml2YXRlIGNvbnZlcnREYXRhUHJvZmlsZU9wdGlvbnNUb1NlbGVjdE9wdGlvbnMob3B0aW9uczogRGF0YVByb2ZpbGVPcHRpb25bXSk6IFNlbGVjdE9wdGlvbltdIHtcbiAgICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgICBpZDogb3B0aW9uLmlkLFxuICAgICAgdmFsdWU6IG9wdGlvbi5pZCxcbiAgICAgIG5hbWU6IG9wdGlvbi5uYW1lLFxuICAgICAgbGFiZWw6IG9wdGlvbi5uYW1lXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBkYXRhIHByb2ZpbGUgc2VsZWN0aW9uICovXG4gIHByaXZhdGUgb25EYXRhUHJvZmlsZUNoYW5nZShwcm9maWxlSWQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25UZXN0RGF0YVByb2ZpbGVDaGFuZ2UocHJvZmlsZUlkKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgc2VhcmNoIGZvciBkYXRhIHByb2ZpbGVzICovXG4gIHByaXZhdGUgb25TZWFyY2hEYXRhUHJvZmlsZXMocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQocXVlcnkpO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBsb2FkIG1vcmUgZGF0YSBwcm9maWxlcyAqL1xuICBwcml2YXRlIG9uTG9hZE1vcmVEYXRhUHJvZmlsZXMocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSk7XG4gIH1cblxuICBvbkVkaXRGb3JtRmllbGRDaGFuZ2UoY29udHJvbE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KGNvbnRyb2xOYW1lKT8uc2V0VmFsdWUodmFsdWUpO1xuICB9XG5cbiAgZ2V0TG9vcFR5cGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdGT1IgTE9PUCcgOiAnV0hJTEUgTE9PUCc7XG4gIH1cblxuICBpc1doaWxlTG9vcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJztcbiAgfVxuXG4gIGlzRm9yTG9vcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ2Zvcic7XG4gIH1cblxuICBnZXRFbmRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdFTkQgRk9SJyA6ICdFTkQgV0hJTEUnO1xuICB9XG5cbiAgZ2V0U3RlcHNTdW1tYXJ5KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJzAgc3RlcHMnO1xuICAgIH1cbiAgICBjb25zdCBzdGFydCA9IHRoaXMuc3RhcnRTdGVwIHx8IHRoaXMubmVzdGVkU3RlcHNbMF0/LnN0ZXBOdW1iZXIgfHwgMTtcbiAgICBjb25zdCBlbmQgPSB0aGlzLmVuZFN0ZXAgfHwgdGhpcy5uZXN0ZWRTdGVwc1t0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCAtIDFdPy5zdGVwTnVtYmVyIHx8IHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoO1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgcmV0dXJuIGBTdGVwcyAke3N0YXJ0fS0ke2VuZH0gKCR7Y291bnR9IHN0ZXAke2NvdW50ICE9PSAxID8gJ3MnIDogJyd9KWA7XG4gIH1cblxuICBnZXRTdGFydFN0ZXBMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnN0YXJ0U3RlcCkge1xuICAgICAgcmV0dXJuIGBTdGFydDogJHt0aGlzLnN0YXJ0U3RlcH1gO1xuICAgIH1cbiAgICBjb25zdCBkZWZhdWx0U3RhcnQgPSB0aGlzLm5lc3RlZFN0ZXBzWzBdPy5zdGVwTnVtYmVyIHx8IDE7XG4gICAgcmV0dXJuIGBTdGFydDogJHtkZWZhdWx0U3RhcnR9YDtcbiAgfVxuXG4gIGdldEVuZFN0ZXBMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmVuZFN0ZXApIHtcbiAgICAgIHJldHVybiBgRW5kOiAke3RoaXMuZW5kU3RlcH1gO1xuICAgIH1cbiAgICBjb25zdCBkZWZhdWx0RW5kID0gdGhpcy5uZXN0ZWRTdGVwc1t0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCAtIDFdPy5zdGVwTnVtYmVyIHx8IHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoO1xuICAgIHJldHVybiBgRW5kOiAke2RlZmF1bHRFbmR9YDtcbiAgfVxuXG4gIGdldFRlc3REYXRhUHJvZmlsZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudGVzdERhdGFQcm9maWxlKSB7XG4gICAgICByZXR1cm4gYFRlc3QgRGF0YSBwcm9maWxlOiAke3RoaXMudGVzdERhdGFQcm9maWxlfWA7XG4gICAgfVxuICAgIHJldHVybiAnVGVzdCBEYXRhIHByb2ZpbGUnO1xuICB9XG5cbiAgZ2V0Q29uZGl0aW9uRGlzcGxheSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbiB8fCAnZWxlbWVudCBcIi5ub3RpZmljYXRpb24tYmFkZ2VcIiBleGlzdHMnO1xuICB9XG5cbiAgb25Ub2dnbGVFeHBhbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuZXhwYW5kZWQ7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZC5lbWl0KHtjb25maWc6dGhpcy5jb25maWcsIGV4cGFuZGVkOnRoaXMuZXhwYW5kZWR9KTtcbiAgfVxuXG4gIG9uVGVzdERhdGFQcm9maWxlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHZhbHVlO1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25TdGFydFN0ZXBDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdmFsdWU7XG4gICAgdGhpcy5zdGFydFN0ZXBDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbkVuZFN0ZXBDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZW5kU3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuZW5kU3RlcENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uQ29uZGl0aW9uQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuY29uZGl0aW9uQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25NYXhJdGVyYXRpb25zQ2hhbmdlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB2YWx1ZTtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnNDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZXN0ZWRTdGVwQ2hhbmdlLmVtaXQoeyBzdGVwLCBpbmRleCB9KTtcbiAgfVxuXG4gIG9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoZXZlbnQ6IGJvb2xlYW4gfCB7Y29uZmlnOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufSwgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gSGFuZGxlIGJvdGggYm9vbGVhbiBhbmQgb2JqZWN0IGZvcm1hdHNcbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0JyAmJiBldmVudCAhPT0gbnVsbCAmJiAnZXhwYW5kZWQnIGluIGV2ZW50KSB7XG4gICAgICAvLyBPYmplY3QgZm9ybWF0IGZyb20gc3RlcC1ncm91cDoge2NvbmZpZywgZXhwYW5kZWR9XG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQuZXhwYW5kZWQ7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgZXZlbnQncyBjb25maWcgaXMgYSBzdGVwLWdyb3VwIChub3QgdGhlIGN1cnJlbnQgc3RlcClcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBuZXN0ZWQgc3RlcC1ncm91cCBldmVudHMgYnViYmxlIHVwIGNvcnJlY3RseSBldmVuIHdoZW4gY29uZGl0aW9uIHN0ZXAgaXMgaW5zaWRlIGxvb3Agc3RlcFxuICAgICAgaWYgKHRoaXMuaXNTdGVwR3JvdXAoZXZlbnQuY29uZmlnKSkge1xuICAgICAgICAvLyBSZS1lbWl0IHRoZSB0b2dnbGVFeHBhbmRlZCBldmVudCB3aXRoIHRoZSBvYmplY3QgZm9ybWF0LCBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCBjb25maWdcbiAgICAgICAgLy8gQ2FzdCB0byBzYXRpc2Z5IFR5cGVTY3JpcHQgLSB0aGUgcmVuZGVyZXIgYWNjZXB0cyBUZXN0Q2FzZVN0ZXBDb25maWcgd2hpY2ggaW5jbHVkZXMgU3RlcEdyb3VwQ29uZmlnXG4gICAgICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQuZW1pdCh7Y29uZmlnOiBldmVudC5jb25maWcgYXMgYW55IGFzIExvb3BTdGVwQ29uZmlnLCBleHBhbmRlZDogZXZlbnQuZXhwYW5kZWR9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQm9vbGVhbiBmb3JtYXQgZnJvbSBvdGhlciBzdGVwIHR5cGVzXG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQgYXMgYm9vbGVhbjtcbiAgICB9XG4gICAgdGhpcy5vbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaW5kZXgpO1xuICB9XG5cbiAgb25BZGRTdGVwKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkU3RlcC5lbWl0KCk7XG4gIH1cblxuICBvbkRlbGV0ZVN0ZXAoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlU3RlcC5lbWl0KGluZGV4KTtcbiAgfVxuXG4gIGlzTm9ybWFsU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIE5vcm1hbFN0ZXBDb25maWcge1xuICAgIHJldHVybiAnZXZlbnRUeXBlJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNMb29wU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIExvb3BTdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2xvb3BUeXBlJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNDb25kaXRpb25TdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgQ29uZGl0aW9uU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdjb25kaXRpb24nIGluIHN0ZXAgJiYgJ2JyYW5jaGVzJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNTdGVwR3JvdXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBTdGVwR3JvdXBDb25maWcge1xuICAgIHJldHVybiAnZ3JvdXBOYW1lJyBpbiBzdGVwO1xuICB9XG5cbiAgb25BZGRCcmFuY2goKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgY29uZGl0aW9uIHN0ZXBzXG4gIH1cblxuICBvbkRlbGV0ZUJyYW5jaChicmFuY2g6IGFueSk6IHZvaWQge1xuICAgIC8vIE5vdCB1c2VkIGluIGxvb3Agc3RlcCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIGNvbmRpdGlvbiBzdGVwc1xuICB9XG5cbiAgb25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2gobmVzdGVkU3RlcDogQ29uZGl0aW9uU3RlcENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEFkZCBhIG5ldyBicmFuY2ggdG8gdGhlIG5lc3RlZCBjb25kaXRpb24gc3RlcFxuICAgIGlmICghbmVzdGVkU3RlcC5icmFuY2hlcykge1xuICAgICAgbmVzdGVkU3RlcC5icmFuY2hlcyA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBuZXdCcmFuY2g6IENvbmRpdGlvbkJyYW5jaCA9IHtcbiAgICAgIHR5cGU6IG5lc3RlZFN0ZXAuYnJhbmNoZXMubGVuZ3RoID09PSAwID8gJ2lmJyA6ICdlbHNlJyxcbiAgICAgIGxhYmVsOiBuZXN0ZWRTdGVwLmJyYW5jaGVzLmxlbmd0aCA9PT0gMCA/ICdJRiBUUlVFJyA6ICdFTFNFJywgXG4gICAgICBzdGVwVHlwZTogU3RlcFR5cGVzLkNPTkRJVElPTl9JRixcbiAgICAgIG5lc3RlZFN0ZXBzOiBbXVxuICAgIH07XG4gICAgbmVzdGVkU3RlcC5icmFuY2hlcy5wdXNoKG5ld0JyYW5jaCk7XG4gICAgdGhpcy5vbk5lc3RlZFN0ZXBDaGFuZ2UobmVzdGVkU3RlcCwgaW5kZXgpO1xuICB9XG5cbiAgb25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2gobmVzdGVkU3RlcDogQ29uZGl0aW9uU3RlcENvbmZpZywgYnJhbmNoOiBhbnksIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBEZWxldGUgYSBicmFuY2ggZnJvbSB0aGUgbmVzdGVkIGNvbmRpdGlvbiBzdGVwXG4gICAgaWYgKG5lc3RlZFN0ZXAuYnJhbmNoZXMpIHtcbiAgICAgIGNvbnN0IGJyYW5jaEluZGV4ID0gbmVzdGVkU3RlcC5icmFuY2hlcy5pbmRleE9mKGJyYW5jaCk7XG4gICAgICBpZiAoYnJhbmNoSW5kZXggPiAtMSkge1xuICAgICAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzLnNwbGljZShicmFuY2hJbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25OZXN0ZWRTdGVwQ2hhbmdlKG5lc3RlZFN0ZXAsIGluZGV4KTtcbiAgfVxuXG4gIG9uT3BlbkV4dGVybmFsKCk6IHZvaWQge1xuICAgIC8vIE5vdCB1c2VkIGluIGxvb3Agc3RlcCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIHN0ZXAgZ3JvdXBzXG4gIH1cblxuICBvbkVkaXQoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0U25hcHNob3QgPSB7XG4gICAgICB0ZXN0RGF0YVByb2ZpbGU6IHRoaXMudGVzdERhdGFQcm9maWxlLFxuICAgICAgc3RhcnRTdGVwOiB0aGlzLnN0YXJ0U3RlcCxcbiAgICAgIGVuZFN0ZXA6IHRoaXMuZW5kU3RlcCxcbiAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24sXG4gICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMsXG4gICAgfTtcbiAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgZm9yT3B0aW9uVHlwZTogbnVsbCxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGhpcy50ZXN0RGF0YVByb2ZpbGUgPz8gJycsXG4gICAgICBzdGFydFN0ZXA6IHRoaXMuc3RhcnRTdGVwID8/IG51bGwsXG4gICAgICBlbmRTdGVwOiB0aGlzLmVuZFN0ZXAgPz8gbnVsbCxcbiAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24gPz8gJycsXG4gICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNSxcbiAgICB9KTtcbiAgICB0aGlzLmlzRWRpdGluZyA9IHRydWU7XG4gICAgdGhpcy5lZGl0LmVtaXQoKTtcbiAgfVxuXG4gIG9uRWRpdEFwcGx5KCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLmVkaXRGb3JtLnZhbHVlO1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbHVlID0gdi50ZXN0RGF0YVByb2ZpbGUgPz8gJyc7XG4gICAgdGhpcy5zdGFydFN0ZXAgPSB2LnN0YXJ0U3RlcCA/PyB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbmRTdGVwID0gdi5lbmRTdGVwID8/IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHYuY29uZGl0aW9uID8/ICcnO1xuICAgIGNvbnN0IG1heFZhbCA9IHYubWF4SXRlcmF0aW9ucztcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB0eXBlb2YgbWF4VmFsID09PSAnbnVtYmVyJyA/IG1heFZhbCA6IChtYXhWYWwgIT0gbnVsbCAmJiBtYXhWYWwgIT09ICcnID8gTnVtYmVyKG1heFZhbCkgOiB1bmRlZmluZWQpO1xuICAgIFxuICAgIC8vIEZpbmQgdGhlIHNlbGVjdGVkIGRhdGEgcHJvZmlsZSBvcHRpb24gdG8gZ2V0IGJvdGggSUQgYW5kIG5hbWVcbiAgICBsZXQgdGVzdERhdGFQcm9maWxlSWQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdGVzdERhdGFQcm9maWxlTmFtZTogc3RyaW5nID0gJyc7XG4gICAgXG4gICAgaWYgKHRlc3REYXRhUHJvZmlsZVZhbHVlICYmIHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFRoZSBmb3JtIHZhbHVlIG1pZ2h0IGJlIElEIChudW1iZXIpIG9yIG5hbWUgKHN0cmluZylcbiAgICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZSA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAgIG9wdGlvbiA9PiBvcHRpb24uaWQgPT09IE51bWJlcih0ZXN0RGF0YVByb2ZpbGVWYWx1ZSkgfHwgb3B0aW9uLm5hbWUgPT09IHRlc3REYXRhUHJvZmlsZVZhbHVlIHx8IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcodGVzdERhdGFQcm9maWxlVmFsdWUpXG4gICAgICApO1xuICAgICAgaWYgKHNlbGVjdGVkUHJvZmlsZSkge1xuICAgICAgICB0ZXN0RGF0YVByb2ZpbGVJZCA9IHNlbGVjdGVkUHJvZmlsZS5pZDtcbiAgICAgICAgdGVzdERhdGFQcm9maWxlTmFtZSA9IHNlbGVjdGVkUHJvZmlsZS5uYW1lO1xuICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZU5hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBub3QgZm91bmQsIHVzZSB0aGUgdmFsdWUgYXMtaXMgKG1pZ2h0IGJlIElEIG9yIG5hbWUpXG4gICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGVzdERhdGFQcm9maWxlVmFsdWU7XG4gICAgICAgIHRlc3REYXRhUHJvZmlsZUlkID0gTnVtYmVyKHRlc3REYXRhUHJvZmlsZVZhbHVlKSB8fCB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGVzdERhdGFQcm9maWxlVmFsdWU7XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSBjb25maWcgd2l0aCBuZXcgdmFsdWVzIChpbmNsdWRlIHRlc3REYXRhUHJvZmlsZUlkIGFzIGFkZGl0aW9uYWwgcHJvcGVydHkpXG4gICAgY29uc3QgdXBkYXRlZENvbmZpZzogTG9vcFN0ZXBDb25maWcgJiB7IHRlc3REYXRhUHJvZmlsZUlkPzogc3RyaW5nIHwgbnVtYmVyIH0gPSB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGhpcy50ZXN0RGF0YVByb2ZpbGUsXG4gICAgICB0ZXN0RGF0YVByb2ZpbGVJZDogdGVzdERhdGFQcm9maWxlSWQsIC8vIEFkZCBJRCBmb3IgQVBJIGNhbGxcbiAgICAgIHN0YXJ0U3RlcDogdGhpcy5zdGFydFN0ZXAsXG4gICAgICBlbmRTdGVwOiB0aGlzLmVuZFN0ZXAsXG4gICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uLFxuICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zLFxuICAgIH07XG4gICAgXG4gICAgLy8gRW1pdCBpbmRpdmlkdWFsIGNoYW5nZSBldmVudHNcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZUNoYW5nZS5lbWl0KHRoaXMudGVzdERhdGFQcm9maWxlKTtcbiAgICB0aGlzLnN0YXJ0U3RlcENoYW5nZS5lbWl0KHRoaXMuc3RhcnRTdGVwID8/IDEpO1xuICAgIHRoaXMuZW5kU3RlcENoYW5nZS5lbWl0KHRoaXMuZW5kU3RlcCA/PyAxKTtcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgdGhpcy5jb25kaXRpb25DaGFuZ2UuZW1pdCh0aGlzLmNvbmRpdGlvbik7XG4gICAgICB0aGlzLm1heEl0ZXJhdGlvbnNDaGFuZ2UuZW1pdCh0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVtaXQgc3RlcCB1cGRhdGUgZXZlbnQgd2l0aCBmdWxsIGNvbmZpZ1xuICAgIGNvbnNvbGUubG9nKCdMb29wLXN0ZXA6IEVtaXR0aW5nIHN0ZXBVcGRhdGUgZXZlbnQnLCB1cGRhdGVkQ29uZmlnKTtcbiAgICB0aGlzLnN0ZXBVcGRhdGUuZW1pdCh1cGRhdGVkQ29uZmlnKTtcbiAgICBcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25FZGl0Q2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGhpcy5lZGl0U25hcHNob3QudGVzdERhdGFQcm9maWxlO1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdGhpcy5lZGl0U25hcHNob3Quc3RhcnRTdGVwO1xuICAgIHRoaXMuZW5kU3RlcCA9IHRoaXMuZWRpdFNuYXBzaG90LmVuZFN0ZXA7XG4gICAgdGhpcy5jb25kaXRpb24gPSB0aGlzLmVkaXRTbmFwc2hvdC5jb25kaXRpb247XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdGhpcy5lZGl0U25hcHNob3QubWF4SXRlcmF0aW9ucztcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25FZGl0SW5EZXB0aCgpOiB2b2lkIHtcbiAgICB0aGlzLm1vcmVPcHRpb25zLmVtaXQoKTtcbiAgICBjb25zdCBpbmRleCA9IHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdudW1iZXInID8gdGhpcy5zdGVwTnVtYmVyIDogKHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQodGhpcy5zdGVwTnVtYmVyLCAxMCkgOiAwKTtcbiAgICB0aGlzLmVkaXRJbkRlcHRoLmVtaXQoeyBzdGVwOiB0aGlzLmNvbmZpZyBhcyBUZXN0Q2FzZVN0ZXBDb25maWcsIGluZGV4OiBpc05hTihpbmRleCkgPyAwIDogaW5kZXggfSk7XG4gIH1cblxuICBvbkxpbmsoKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgc3RlcCBncm91cHNcbiAgfVxuXG4gIG9uRHVwbGljYXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZHVwbGljYXRlLmVtaXQoKTtcbiAgfVxuXG4gIG9uRGVsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlLmVtaXQoKTtcbiAgfVxuXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gY2hlY2tlZDtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KGNoZWNrZWQpO1xuICB9XG5cbiAgb25Nb3JlT3B0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLm1vcmVPcHRpb25zLmVtaXQoKTtcbiAgfVxuXG4gIG9uVmlld0RldGFpbHMoZXZlbnQ/OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIFxuICAgIGlmICghdGhpcy5jb25maWcuZGVzY3JpcHRpb24gfHwgdGhpcy5jb25maWcuZGVzY3JpcHRpb24udHJpbSgpID09PSAnJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudCkge1xuICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdGT1IgTE9PUCBEZXRhaWxzJyA6ICdXSElMRSBMT09QIERldGFpbHMnO1xuICAgICAgdGhpcy52aWV3RGV0YWlscy5lbWl0KHtcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRpdGxlLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5jb25maWcuZGVzY3JpcHRpb24sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgPCEtLSBJbmxpbmUgRWRpdCBNb2RlOiBGcmFtZSAyMTQ3MjI0OTEwIC0gZmxleCByb3csIDEwNTbDlzM2LCBnYXAgMTJweCwgZmxleC1ub25lIC0tPlxuICA8ZGl2ICpuZ0lmPVwiaXNFZGl0aW5nXCIgY2xhc3M9XCJjcWEtcHktMi41IGNxYS1weC00IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1qdXN0aWZ5LWJldHdlZW5cIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWZsZXgtZ3Jvd1wiPlxuICAgICAgPCEtLSBMb29wIFR5cGUgTGFiZWwgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxQzM5OEVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgICAge3sgZ2V0TG9vcFR5cGVMYWJlbCgpIH19XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBGT1IgTE9PUCBpbmxpbmUgZWRpdDogY3FhLWR5bmFtaWMtc2VsZWN0IChzYW1lIHVzYWdlIGFzIGRlZmF1bHQgc3RvcmllcykgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9vcFR5cGUgPT09ICdmb3InXCI+XG4gICAgICAgIDwhLS0gRmlyc3Qgc2VsZWN0OiB3aWR0aCAyMTYuMjVweCwgaGVpZ2h0IDM2cHgsIGdhcCA0cHgsIG9wYWNpdHkgMSAtLT5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwiZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cInRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cInN0YXJ0U3RlcFNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cImVuZFN0ZXBTZWxlY3RDb25maWdcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gV0hJTEUgTE9PUCBpbmxpbmUgZWRpdCAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1doaWxlTG9vcCgpXCI+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cImNvbmRpdGlvblNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBFZGl0IEluIGRlcHRoIGxpbmsgLS0+XG4gICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVsycHhdIGNxYS1uby11bmRlcmxpbmVcIj5cbiAgICAgICAgRWRpdCBJbiBkZXB0aFxuICAgICAgICA8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTIuMDM4MDkgNi43NDMyOUwyLjYyODA5IDcuMzMzMjlMNS45NjE0MiAzLjk5OTk2TDIuNjI4MDkgMC42NjY2MjZMMi4wMzgwOSAxLjI1NjYzTDQuNzgxNDIgMy45OTk5NkwyLjAzODA5IDYuNzQzMjlaXCJcbiAgICAgICAgICAgIGZpbGw9XCIjM0Y0M0VFXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2E+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNVwiPlxuICAgICAgPCEtLSBDYW5jZWwgLyBBcHBseSAtLT5cbiAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQ2FuY2VsJ1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uRWRpdENhbmNlbCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQXBwbHknXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25FZGl0QXBwbHkoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMb29wIEhlYWRlciAobm9ybWFsIHZpZXcgd2hlbiBub3QgZWRpdGluZykgLS0+XG4gIDxkaXYgKm5nSWY9XCIhaXNFZGl0aW5nXCJcbiAgICBbY2xhc3NdPVwiJ3N0ZXAtcm93IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weS0yICcgKyAoaXNJbnNpZGVMb29wID8gJ2NxYS1wbC0xMCBjcWEtcHItNCcgOiAnY3FhLXB4LTQnKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgIDwhLS0gRHJhZyBIYW5kbGUgSWNvbiAod2hlbiBpc1Jlb3JkZXIgaXMgdHJ1ZSkgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzUmVvcmRlclwiIGNsYXNzPVwiY3FhLW1yLTIgY3FhLWN1cnNvci1tb3ZlIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtdGV4dC1bIzExMTgyN11cIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBDaGVja2JveCAod2hlbiBpc1Jlb3JkZXIgaXMgZmFsc2UpIC0tPlxuICAgIDxsYWJlbCAqbmdJZj1cIiFpc1Jlb3JkZXJcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1yZWxhdGl2ZSBjcWEtbXItMlwiPlxuICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWgtNCBjcWEtdy00IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWFwcGVhcmFuY2Utbm9uZSBjcWEtcm91bmRlZCBzaGFkb3cgaG92ZXI6Y3FhLXNoYWRvdy1tZCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1zbGF0ZS0zMDAgY3FhLWZsZXgtc2hyaW5rLTBcIlxuICAgICAgICBbY2xhc3MuY3FhLWJnLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFwiXG4gICAgICAgIGlkPVwiY2hlY2stbG9vcC1zdGVwXCIgLz5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS10ZXh0LXdoaXRlIGNxYS10b3AtMS8yIGNxYS1sZWZ0LTEvMiBjcWEtLXRyYW5zbGF0ZS14LTEvMiBjcWEtLXRyYW5zbGF0ZS15LTEvMiBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0wXT1cIiFzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0xMDBdPVwic2VsZWN0ZWRcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDEyIDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xMCAzLjEyNUw0LjUgOC42MjVMMiA2LjEyNVwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtbWluLXctWzMycHhdXCI+e3sgc3RlcE51bWJlciB9fTwvc3Bhbj5cbiAgICA8IS0tIEV4cGFuZC9Db2xsYXBzZSBJY29uIC0tPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblRvZ2dsZUV4cGFuZGVkKClcIiBjbGFzcz1cImNxYS1wLTBcIj5cbiAgICAgIDxzdmcgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cIiFleHBhbmRlZFwiIGNsYXNzPVwiY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcbiAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTEyIDEwTDggNkw0IDEwXCIgc3Ryb2tlPVwiIzZCNzI4MFwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2J1dHRvbj5cblxuICAgIDwhLS0gTG9vcCBJY29uIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTExLjMzNCAxLjMzMzI1TDE0LjAwMDcgMy45OTk5MkwxMS4zMzQgNi42NjY1OVwiIHN0cm9rZT1cIiMxQzM5OEVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTIgNy4zMzMzM1Y2LjY2NjY3QzIgNS45NTk0MiAyLjI4MDk1IDUuMjgxMTUgMi43ODEwNSA0Ljc4MTA1QzMuMjgxMTUgNC4yODA5NSAzLjk1OTQyIDQgNC42NjY2NyA0SDE0XCJcbiAgICAgICAgICBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNNC42NjY2NyAxNC42NjY2TDIgMTEuOTk5OUw0LjY2NjY3IDkuMzMzMjVcIiBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTE0IDguNjY2NzVWOS4zMzM0MUMxNCAxMC4wNDA3IDEzLjcxOSAxMC43MTg5IDEzLjIxOSAxMS4yMTlDMTIuNzE4OSAxMS43MTkxIDEyLjA0MDYgMTIuMDAwMSAxMS4zMzMzIDEyLjAwMDFIMlwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzFDMzk4RVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImxvb3BUeXBlID09PSAnd2hpbGUnXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMS4zMzQgMS4zMzMyNUwxNC4wMDA3IDMuOTk5OTJMMTEuMzM0IDYuNjY2NTlcIiBzdHJva2U9XCIjNTkxNjhCXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGggZD1cIk0yIDcuMzMzMzNWNi42NjY2N0MyIDUuOTU5NDIgMi4yODA5NSA1LjI4MTE1IDIuNzgxMDUgNC43ODEwNUMzLjI4MTE1IDQuMjgwOTUgMy45NTk0MiA0IDQuNjY2NjcgNEgxNFwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTQuNjY2NjcgMTQuNjY2NkwyIDExLjk5OTlMNC42NjY2NyA5LjMzMzI1XCIgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xNCA4LjY2Njc1VjkuMzMzNDFDMTQgMTAuMDQwNyAxMy43MTkgMTAuNzE4OSAxMy4yMTkgMTEuMjE5QzEyLjcxODkgMTEuNzE5MSAxMi4wNDA2IDEyLjAwMDEgMTEuMzMzMyAxMi4wMDAxSDJcIlxuICAgICAgICAgIHN0cm9rZT1cIiM1OTE2OEJcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBMb29wIFR5cGUgTGFiZWwgLS0+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLW5vbmVcIj5cbiAgICAgIHt7IGdldExvb3BUeXBlTGFiZWwoKSB9fVxuICAgIDwvc3Bhbj5cblxuICAgIDwhLS0gRm9yIExvb3AgQ29udHJvbHMgLS0+XG4gICAgPGRpdiAqbmdJZj1cImxvb3BUeXBlID09PSAnZm9yJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1sLTJcIj5cbiAgICAgIDwhLS0gVGVzdCBEYXRhIFByb2ZpbGUgQnV0dG9uIC0tPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2NsYXNzLmNxYS1iZy1wcmltYXJ5LTEwMF09XCJ0ZXN0RGF0YVByb2ZpbGVcIiBbY2xhc3MuY3FhLXRleHQtcHJpbWFyeV09XCJ0ZXN0RGF0YVByb2ZpbGVcIlxuICAgICAgICBjbGFzcz1cImNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMTdweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyM4QThDRjRdIGNxYS1yb3VuZGVkIGNxYS1iZy1bI0Q4RDlGQ11cIj5cbiAgICAgICAge3sgZ2V0VGVzdERhdGFQcm9maWxlTGFiZWwoKSB9fVxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDwhLS0gU3RhcnQgQnV0dG9uIC0tPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2NsYXNzLmNxYS1iZy1wcmltYXJ5LTEwMF09XCJzdGFydFN0ZXBcIiBbY2xhc3MuY3FhLXRleHQtcHJpbWFyeV09XCJzdGFydFN0ZXBcIlxuICAgICAgICBjbGFzcz1cImNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMTdweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyM4QThDRjRdIGNxYS1yb3VuZGVkIGNxYS1iZy1bI0Q4RDlGQ11cIj5cbiAgICAgICAge3sgZ2V0U3RhcnRTdGVwTGFiZWwoKSB9fVxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDwhLS0gRW5kIEJ1dHRvbiAtLT5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtjbGFzcy5jcWEtYmctcHJpbWFyeS0xMDBdPVwiZW5kU3RlcFwiIFtjbGFzcy5jcWEtdGV4dC1wcmltYXJ5XT1cImVuZFN0ZXBcIlxuICAgICAgICBjbGFzcz1cImNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMTdweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyM4QThDRjRdIGNxYS1yb3VuZGVkIGNxYS1iZy1bI0Q4RDlGQ11cIj5cbiAgICAgICAge3sgZ2V0RW5kU3RlcExhYmVsKCkgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBXaGlsZSBMb29wIENvbmRpdGlvbiAob25seSBzaG93IGlmIGNvbmRpdGlvbiBleGlzdHMpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc1doaWxlTG9vcCgpICYmIGNvbmRpdGlvblwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1sLTIgY3FhLWZsZXgtMVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1ncmF5LTcwMCBjcWEtdGV4dC1zbVwiPlxuICAgICAgICBXaGlsZVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1ncmF5LTkwMCBjcWEtdGV4dC1zbVwiIFtpbm5lckhUTUxdPVwiZ2V0Q29uZGl0aW9uRGlzcGxheSgpXCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdGVwcyBTdW1tYXJ5IC0tPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY3FhLW1sLWF1dG8gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdIGNxYS1yb3VuZGVkLWxnIGNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMwQTBBMEFdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgIHt7IGdldFN0ZXBzU3VtbWFyeSgpIH19XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFZpZXcgRGV0YWlscyBMaW5rIChzaG93IG9ubHkgaWYgZGVzY3JpcHRpb24gaXMgbm90IGVtcHR5KSAtLT5cbiAgICA8YSAqbmdJZj1cImNvbmZpZy5kZXNjcmlwdGlvbiAmJiBjb25maWcuZGVzY3JpcHRpb24udHJpbSgpICE9PSAnJ1wiICN2aWV3RGV0YWlsc1RyaWdnZXIgaHJlZj1cIiNcIiAoY2xpY2spPVwib25WaWV3RGV0YWlscygkZXZlbnQpXCIgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW5vLXVuZGVybGluZSBjcWEtbWwtYXV0b1wiPlZpZXcgRGV0YWlsczxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiOFwiIHZpZXdCb3g9XCIwIDAgOCA4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0yLjAzODA5IDYuNzQzMjlMMi42MjgwOSA3LjMzMzI5TDUuOTYxNDIgMy45OTk5NkwyLjYyODA5IDAuNjY2NjI2TDIuMDM4MDkgMS4yNTY2M0w0Ljc4MTQyIDMuOTk5OTZMMi4wMzgwOSA2Ljc0MzI5WlwiIGZpbGw9XCIjM0Y0M0VFXCIvPjwvc3ZnPjwvYT5cblxuICAgIDwhLS0gQWN0aW9uIEljb25zOiBFZGl0LCBMaW5rLCBEdXBsaWNhdGUsIERlbGV0ZSAoc2hvdyBvbiBob3ZlcikgLS0+XG4gICAgPGRpdiBjbGFzcz1cInN0ZXAtYWN0aW9ucyBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHgtWzdweF1cIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkVkaXQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJFZGl0XCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjOTlBMUFmXSBob3ZlcjpjcWEtdGV4dC1bIzE0NDdFNl1cIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHBhdGggZD1cIk03IDExLjY2NjZIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNOS41NTIwOCAyLjExMjhDOS43ODQzIDEuODgwNTggMTAuMDk5MyAxLjc1MDEyIDEwLjQyNzcgMS43NTAxMkMxMC43NTYxIDEuNzUwMTIgMTEuMDcxIDEuODgwNTggMTEuMzAzMyAyLjExMjhDMTEuNTM1NSAyLjM0NTAyIDExLjY2NTkgMi42NTk5OCAxMS42NjU5IDIuOTg4MzhDMTEuNjY1OSAzLjMxNjc5IDExLjUzNTUgMy42MzE3NSAxMS4zMDMzIDMuODYzOTdMNC4yOTc0MiAxMC44NzA0QzQuMTU4NjQgMTEuMDA5MiAzLjk4NzEgMTEuMTEwNyAzLjc5ODY3IDExLjE2NTZMMi4xMjMzMyAxMS42NTQ0QzIuMDczMTQgMTEuNjY5IDIuMDE5OTMgMTEuNjY5OSAxLjk2OTI4IDExLjY1NjlDMS45MTg2MyAxMS42NDM5IDEuODcyNCAxMS42MTc2IDEuODM1NDMgMTEuNTgwNkMxLjc5ODQ2IDExLjU0MzcgMS43NzIxIDExLjQ5NzQgMS43NTkxMyAxMS40NDY4QzEuNzQ2MTUgMTEuMzk2MSAxLjc0NzAzIDExLjM0MjkgMS43NjE2NyAxMS4yOTI3TDIuMjUwNSA5LjYxNzM4QzIuMzA1NDYgOS40MjkxNiAyLjQwNjk4IDkuMjU3ODMgMi41NDU2NyA5LjExOTIyTDkuNTUyMDggMi4xMTI4WlwiXG4gICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkxpbmsoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJMaW5rXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjOTlBMUFmXSBob3ZlcjpjcWEtdGV4dC1bIzE0NDdFNl1cIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNNS4wMDA2NSA5LjkxNjcxSDMuNjY3MzJDMi43ODMyNiA5LjkxNjcxIDEuOTM1NDIgOS42MDk0MiAxLjMxMDMgOS4wNjI0NEMwLjY4NTE3NCA4LjUxNTQ1IDAuMzMzOTg0IDcuNzczNTkgMC4zMzM5ODQgNy4wMDAwNEMwLjMzMzk4NCA2LjIyNjQ5IDAuNjg1MTc0IDUuNDg0NjMgMS4zMTAzIDQuOTM3NjVDMS45MzU0MiA0LjM5MDY2IDIuNzgzMjYgNC4wODMzNyAzLjY2NzMyIDQuMDgzMzdINS4wMDA2NVwiXG4gICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk05IDQuMDgzMzdIMTAuMzMzM0MxMS4yMTc0IDQuMDgzMzcgMTIuMDY1MiA0LjM5MDY2IDEyLjY5MDQgNC45Mzc2NUMxMy4zMTU1IDUuNDg0NjMgMTMuNjY2NyA2LjIyNjQ5IDEzLjY2NjcgNy4wMDAwNEMxMy42NjY3IDcuNzczNTkgMTMuMzE1NSA4LjUxNTQ1IDEyLjY5MDQgOS4wNjI0NEMxMi4wNjUyIDkuNjA5NDIgMTEuMjE3NCA5LjkxNjcxIDEwLjMzMzMgOS45MTY3MUg5XCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNC4zMzM5OCA3SDkuNjY3MzJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25EdXBsaWNhdGUoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJEdXBsaWNhdGVcIlxuICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0xMS42NjYgNC42NjY2M0g1LjgzMjY4QzUuMTg4MzUgNC42NjY2MyA0LjY2NjAyIDUuMTg4OTYgNC42NjYwMiA1LjgzMzI5VjExLjY2NjZDNC42NjYwMiAxMi4zMTEgNS4xODgzNSAxMi44MzMzIDUuODMyNjggMTIuODMzM0gxMS42NjZDMTIuMzEwMyAxMi44MzMzIDEyLjgzMjcgMTIuMzExIDEyLjgzMjcgMTEuNjY2NlY1LjgzMzI5QzEyLjgzMjcgNS4xODg5NiAxMi4zMTAzIDQuNjY2NjMgMTEuNjY2IDQuNjY2NjNaXCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTIuMzMyNjggOS4zMzMyOUMxLjY5MTAyIDkuMzMzMjkgMS4xNjYwMiA4LjgwODI5IDEuMTY2MDIgOC4xNjY2M1YyLjMzMzI5QzEuMTY2MDIgMS42OTE2MyAxLjY5MTAyIDEuMTY2NjMgMi4zMzI2OCAxLjE2NjYzSDguMTY2MDJDOC44MDc2OCAxLjE2NjYzIDkuMzMyNjggMS42OTE2MyA5LjMzMjY4IDIuMzMzMjlcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25EZWxldGUoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJEZWxldGVcIlxuICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyNmZjY0NjddIGhvdmVyOmNxYS10ZXh0LVsjQzYzNTM1XVwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTEuNzUgMy41SDEyLjI1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTExLjA4MjcgMy41VjExLjY2NjdDMTEuMDgyNyAxMi4yNSAxMC40OTkzIDEyLjgzMzMgOS45MTYwMiAxMi44MzMzSDQuMDgyNjhDMy40OTkzNSAxMi44MzMzIDIuOTE2MDIgMTIuMjUgMi45MTYwMiAxMS42NjY3VjMuNVwiXG4gICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk00LjY2NjAyIDMuNDk5OTZWMi4zMzMyOUM0LjY2NjAyIDEuNzQ5OTYgNS4yNDkzNSAxLjE2NjYzIDUuODMyNjggMS4xNjY2M0g4LjE2NjAyQzguNzQ5MzUgMS4xNjY2MyA5LjMzMjY4IDEuNzQ5OTYgOS4zMzI2OCAyLjMzMzI5VjMuNDk5OTZcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPHBhdGggZD1cIk01LjgzMzk4IDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTguMTY2MDIgNi40MTY2M1Y5LjkxNjYzXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEV4cGFuZGVkIENvbnRlbnQgd2l0aCBOZXN0ZWQgU3RlcHMgKHJlbmRlcmVyIGRpc3BhdGNoZXMgYnkgc3RlcCB0eXBlLCBuLWxldmVsIG5lc3RpbmcpIC0tPlxuICA8ZGl2ICpuZ0lmPVwiZXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgIDxkaXYgKm5nSWY9XCIhaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgIDxjcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXIgKm5nRm9yPVwibGV0IHN0ZXAgb2YgbmVzdGVkU3RlcHM7IGxldCBpID0gaW5kZXhcIiBbc3RlcF09XCJzdGVwXCIgW2luZGV4XT1cImlcIlxuICAgICAgICBbc2VsZWN0ZWRdPVwiJGFueShzdGVwKS5zZWxlY3RlZFwiXG4gICAgICAgIFtpc05lc3RlZF09XCJ0cnVlXCIgW2lzSW5zaWRlTG9vcF09XCJ0cnVlXCIgW2lzUmVvcmRlcl09XCJpc1Jlb3JkZXJcIlxuICAgICAgICBbYWRkU3RlcEJldHdlZW5dPVwiYWRkU3RlcEJldHdlZW5cIlxuICAgICAgICBbZGF0YVByb2ZpbGVPcHRpb25zXT1cImRhdGFQcm9maWxlT3B0aW9uc1wiIFtoYXNNb3JlRGF0YVByb2ZpbGVzXT1cImhhc01vcmVEYXRhUHJvZmlsZXNcIiBbaXNMb2FkaW5nRGF0YVByb2ZpbGVzXT1cImlzTG9hZGluZ0RhdGFQcm9maWxlc1wiXG4gICAgICAgIFtuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXT1cIm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNcIlxuICAgICAgICAobmVzdGVkU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2UoJGV2ZW50LnN0ZXAsICRldmVudC5pbmRleClcIlxuICAgICAgICAoYWRkU3RlcCk9XCJvbkFkZFN0ZXAoKVwiIChkZWxldGVTdGVwKT1cIm9uRGVsZXRlU3RlcCgkZXZlbnQpXCJcbiAgICAgICAgKHRvZ2dsZUV4cGFuZGVkKT1cIm9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoJGV2ZW50LCBzdGVwLCBpKVwiXG4gICAgICAgIChncm91cE5hbWVDaGFuZ2UpPVwiJGFueShzdGVwKS5ncm91cE5hbWUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmRlc2NyaXB0aW9uID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAocmV1c2FibGVDaGFuZ2UpPVwiJGFueShzdGVwKS5yZXVzYWJsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKG9wZW5FeHRlcm5hbCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZWRpdCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAobGluayk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZHVwbGljYXRlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChkZWxldGUpPVwib25EZWxldGVTdGVwKGkpXCJcbiAgICAgICAgKHZpZXdEZXRhaWxzKT1cInZpZXdEZXRhaWxzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChjb25kaXRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5jb25kaXRpb24gPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChicmFuY2hTdGVwQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChhZGRCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2goJGFueShzdGVwKSwgaSlcIlxuICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCwgaSlcIlxuICAgICAgICAodGVzdERhdGFQcm9maWxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkudGVzdERhdGFQcm9maWxlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoc3RhcnRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuc3RhcnRTdGVwID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoZW5kU3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLmVuZFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChtYXhJdGVyYXRpb25zQ2hhbmdlKT1cIiRhbnkoc3RlcCkubWF4SXRlcmF0aW9ucyA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGV2ZW50VHlwZUNoYW5nZSk9XCIkYW55KHN0ZXApLmV2ZW50VHlwZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHBhcmFtZXRlckNoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuc2VsZWN0ZWQgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChsb2FkTW9yZURhdGFQcm9maWxlcyk9XCJsb2FkTW9yZURhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAoc2VhcmNoRGF0YVByb2ZpbGVzKT1cInNlYXJjaERhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAoZG5kRHJvcEluWm9uZSk9XCJkbmREcm9wSW5ab25lLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChjbGlja0FjdGlvbik9XCJjbGlja0FjdGlvbi5lbWl0KCRldmVudClcIlxuICAgICAgICAoZWRpdEluRGVwdGgpPVwiZWRpdEluRGVwdGguZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGFkZFN0ZXBCZXR3ZWVuQ2xpY2spPVwiYWRkU3RlcEJldHdlZW5DbGljay5lbWl0KCRldmVudClcIj5cbiAgICAgIDwvY3FhLXRlc3QtY2FzZS1kZXRhaWxzLXJlbmRlcmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJpc1Jlb3JkZXJcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBuZXN0ZWQtc3RlcC1kcm9wLWxpc3RcIlxuICAgICAgICAgW2RuZERyb3B6b25lXT1cIlsnc3RlcCddXCJcbiAgICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgIGRuZERyYWdvdmVyQ2xhc3M9XCJkbmREcmFnb3ZlclwiXG4gICAgICAgICAoZG5kRHJvcCk9XCJvbkRuZERyb3AoJGV2ZW50KVwiPlxuICAgICAgPGRpdiBkbmRQbGFjZWhvbGRlclJlZiBjbGFzcz1cInN0ZXAtZHJhZy1wbGFjZWhvbGRlci1uZXN0ZWQgY3FhLW15LTEgY3FhLW1pbi1oLVs1MHB4XSBjcWEtYm9yZGVyLTIgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzNGNDNFRV0gY3FhLXJvdW5kZWQgY3FhLWJnLVtyZ2JhKDYzLDY3LDIzOCwwLjA4KV0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LXhzXCI+RHJvcCBoZXJlPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdGVwIG9mIG5lc3RlZFN0ZXBzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJuZXN0ZWQtc3RlcC1kcmFnLWl0ZW1cIlxuICAgICAgICAgICBbZG5kRHJhZ2dhYmxlXT1cInN0ZXBcIlxuICAgICAgICAgICBkbmRFZmZlY3RBbGxvd2VkPVwibW92ZVwiXG4gICAgICAgICAgIGRuZFR5cGU9XCJzdGVwXCI+XG4gICAgICAgIDxjcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXIgW3N0ZXBdPVwic3RlcFwiIFtpbmRleF09XCJpXCJcbiAgICAgICAgICBbc2VsZWN0ZWRdPVwiJGFueShzdGVwKS5zZWxlY3RlZFwiXG4gICAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIiBbaXNJbnNpZGVMb29wXT1cInRydWVcIiBbaXNSZW9yZGVyXT1cImlzUmVvcmRlclwiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuQWJvdmVdPVwiYWRkU3RlcEJldHdlZW5BYm92ZVwiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuQmVsb3ddPVwiYWRkU3RlcEJldHdlZW5CZWxvd1wiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuXT1cImFkZFN0ZXBCZXR3ZWVuXCJcbiAgICAgICAgICBbZGF0YVByb2ZpbGVPcHRpb25zXT1cImRhdGFQcm9maWxlT3B0aW9uc1wiIFtoYXNNb3JlRGF0YVByb2ZpbGVzXT1cImhhc01vcmVEYXRhUHJvZmlsZXNcIiBbaXNMb2FkaW5nRGF0YVByb2ZpbGVzXT1cImlzTG9hZGluZ0RhdGFQcm9maWxlc1wiXG4gICAgICAgICAgW25hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNdPVwibmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc1wiXG4gICAgICAgICAgKG5lc3RlZFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKCRldmVudC5zdGVwLCAkZXZlbnQuaW5kZXgpXCJcbiAgICAgICAgICAoYWRkU3RlcCk9XCJvbkFkZFN0ZXAoKVwiIChkZWxldGVTdGVwKT1cIm9uRGVsZXRlU3RlcCgkZXZlbnQpXCJcbiAgICAgICAgICAodG9nZ2xlRXhwYW5kZWQpPVwib25OZXN0ZWRUb2dnbGVFeHBhbmRlZCgkZXZlbnQsIHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZ3JvdXBOYW1lQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZ3JvdXBOYW1lID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmRlc2NyaXB0aW9uID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChyZXVzYWJsZUNoYW5nZSk9XCIkYW55KHN0ZXApLnJldXNhYmxlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChvcGVuRXh0ZXJuYWwpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGVkaXQpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAobGluayk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZHVwbGljYXRlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChkZWxldGUpPVwib25EZWxldGVTdGVwKGkpXCJcbiAgICAgICAgICAodmlld0RldGFpbHMpPVwidmlld0RldGFpbHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoY29uZGl0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuY29uZGl0aW9uID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChicmFuY2hTdGVwQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChhZGRCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2goJGFueShzdGVwKSwgaSlcIlxuICAgICAgICAgIChkZWxldGVCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2goJGFueShzdGVwKSwgJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKHRlc3REYXRhUHJvZmlsZUNoYW5nZSk9XCIkYW55KHN0ZXApLnRlc3REYXRhUHJvZmlsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoc3RhcnRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuc3RhcnRTdGVwID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChlbmRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZW5kU3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAobWF4SXRlcmF0aW9uc0NoYW5nZSk9XCIkYW55KHN0ZXApLm1heEl0ZXJhdGlvbnMgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGV2ZW50VHlwZUNoYW5nZSk9XCIkYW55KHN0ZXApLmV2ZW50VHlwZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAocGFyYW1ldGVyQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLnNlbGVjdGVkID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAobG9hZE1vcmVEYXRhUHJvZmlsZXMpPVwibG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKHNlYXJjaERhdGFQcm9maWxlcyk9XCJzZWFyY2hEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGRuZERyb3BJblpvbmUpPVwiZG5kRHJvcEluWm9uZS5lbWl0KCRldmVudClcIlxuICAgICAgICAoY2xpY2tBY3Rpb24pPVwiY2xpY2tBY3Rpb24uZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGVkaXRJbkRlcHRoKT1cImVkaXRJbkRlcHRoLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChhZGRTdGVwQmV0d2VlbkNsaWNrKT1cImFkZFN0ZXBCZXR3ZWVuQ2xpY2suZW1pdCgkZXZlbnQpXCI+XG4gICAgICAgIDwvY3FhLXRlc3QtY2FzZS1kZXRhaWxzLXJlbmRlcmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEVORCBNYXJrZXIgLS0+XG4gICAgPGRpdlxuICAgICAgW2NsYXNzXT1cIidjcWEtcGwtNCBjcWEtcHktMSBjcWEtYmctWyNEQkVBRkU4MF0gY3FhLXRleHQtWyMxQzM5OEVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtJ1wiXG4gICAgICBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCAjQkVEQkZGO1wiPlxuICAgICAge3sgZ2V0RW5kTGFiZWwoKSB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|