@cqa-lib/cqa-ui 1.1.387 → 1.1.389

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.
@@ -124,6 +124,14 @@ export class AddPrerequisiteCasesSectionComponent {
124
124
  }
125
125
  this.cdr.markForCheck();
126
126
  }
127
+ /** True when the row at the given index has a selected value */
128
+ rowHasValue(index) {
129
+ if (!this.form || !this.rows.length || index < 0 || index >= this.rows.length)
130
+ return false;
131
+ const row = this.rows[index];
132
+ const val = this.form.get(row.key)?.value;
133
+ return val != null && val !== '';
134
+ }
127
135
  /** True when every row has a non-empty value (no placeholders) */
128
136
  allRowsHaveValues() {
129
137
  if (!this.form || !this.rows.length)
@@ -169,10 +177,10 @@ export class AddPrerequisiteCasesSectionComponent {
169
177
  }
170
178
  }
171
179
  AddPrerequisiteCasesSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AddPrerequisiteCasesSectionComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
172
- AddPrerequisiteCasesSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: AddPrerequisiteCasesSectionComponent, selector: "cqa-add-prerequisite-cases-section", inputs: { expanded: "expanded", form: "form", rows: "rows", options: "options", getSelectConfig: "getSelectConfig", label: "label", infoTooltip: "infoTooltip", addAnotherText: "addAnotherText", updateText: "updateText", cancelText: "cancelText", addTriggerText: "addTriggerText", hideAddPrerequisite: "hideAddPrerequisite", updateDisabled: "updateDisabled", isUpdating: "isUpdating", enableServerSearch: "enableServerSearch", hasMoreOptions: "hasMoreOptions", isLoadingOptions: "isLoadingOptions", selectFirstValidationMessage: "selectFirstValidationMessage" }, outputs: { expandedChange: "expandedChange", addRow: "addRow", removeRow: "removeRow", rowsReordered: "rowsReordered", update: "update", cancel: "cancel", selectionChange: "selectionChange", searchOptions: "searchOptions", loadMoreOptions: "loadMoreOptions", prerequisitesChange: "prerequisitesChange" }, host: { classAttribute: "cqa-ui-root cqa-add-prerequisite-cases-section-host" }, queries: [{ propertyName: "selectBodyTpl", first: true, predicate: ["selectBody"], descendants: true, read: TemplateRef }], ngImport: i0, template: "<!-- Add Prerequisite trigger - only when collapsed and no rows (user must click to expand); hide when parent has prerequisites -->\n<ng-container *ngIf=\"rows.length === 0 && !expanded && !hideAddPrerequisite\">\n <div\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#D8D9FC] cqa-rounded-lg cqa-p-1 cqa-mt-4 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-center cqa-gap-2 cqa-w-full cqa-hover:cqa-border-[#9999ee] cqa-hover:cqa-bg-[#f8f8ff] cqa-active:cqa-border-[#7c7ce0] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"onAddPrerequisiteClick()\">\n <mat-icon class=\"cqa-text-[12px] cqa-w-[12px] cqa-h-[12px] cqa-text-[#3F43EE]\">add</mat-icon>\n <span class=\"cqa-font-regular cqa-font-inter cqa-text-sm cqa-text-[#3F43EE]\">{{ addTriggerText }}</span>\n </div>\n</ng-container>\n\n<!-- Collapsed summary when we have rows but expanded=false -->\n<ng-container *ngIf=\"rows.length > 0 && !expanded\">\n <div\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#D8D9FC] cqa-rounded-lg cqa-p-1.5 cqa-mt-4 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-between cqa-min-h-[27px] cqa-hover:cqa-border-[#9ca3af] cqa-hover:cqa-bg-[#f9fafb] cqa-active:cqa-border-[#6366f1] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"toggleExpanded(true)\">\n <span class=\"cqa-text-[#4a5565] cqa-font-normal cqa-font-inter cqa-text-xs\">{{ rows.length }} prerequisite{{ rows.length !== 1 ? 's' : '' }}</span>\n <mat-icon class=\"cqa-text-[14px] cqa-w-[14px] cqa-h-[14px] cqa-text-[#4a5565]\">expand_more</mat-icon>\n </div>\n</ng-container>\n\n<!-- Expanded form - when expanded=true (with or without rows; no Add Prerequisite trigger) -->\n<ng-container *ngIf=\"expanded\">\n <div class=\"cqa-p-3 cqa-bg-white cqa-border cqa-border-[#e5e7eb] cqa-rounded-lg\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-mb-3\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0 cqa-leading-none\">{{ label }}</label>\n <mat-icon class=\"cqa-inline-flex cqa-mt-1 cqa-items-center cqa-justify-center cqa-w-4 cqa-h-4 cqa-text-sm cqa-text-[#6b7280] cqa-cursor-help cqa-flex-shrink-0\" [matTooltip]=\"infoTooltip\" matTooltipPosition=\"above\" matTooltipShowDelay=\"300\">info</mat-icon>\n <button\n type=\"button\"\n class=\"cqa-ml-auto cqa-flex cqa-items-center cqa-justify-center cqa-w-7 cqa-h-7 cqa-p-0 cqa-bg-transparent cqa-border-none cqa-rounded-md cqa-text-[#6b7280] cqa-cursor-pointer cqa-hover:cqa-bg-[#f3f4f6] cqa-hover:cqa-text-[#374151]\"\n (click)=\"toggleExpanded(false)\"\n matTooltip=\"Close\">\n <mat-icon class=\"cqa-text-xl cqa-w-5 cqa-h-5\">expand_less</mat-icon>\n </button>\n </div>\n\n <div\n class=\"prerequisite-drop-list cqa-flex cqa-flex-col cqa-gap-2 cqa-mb-3\"\n [dndDropzone]=\"['prerequisite-row']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"prerequisite-drag-placeholder\">Drop here</div>\n <div\n *ngFor=\"let row of rows; let i = index; trackBy: trackByKey\"\n class=\"prerequisite-drag-item cqa-flex cqa-items-center cqa-gap-2\"\n [dndDraggable]=\"row\"\n [dndDisableIf]=\"rows.length <= 1\"\n dndEffectAllowed=\"move\"\n dndType=\"prerequisite-row\">\n <!-- 9-dot grid drag handle (only when multiple rows to reorder) -->\n <div *ngIf=\"rows.length > 1\" dndHandle class=\"cqa-flex cqa-flex-shrink-0 cqa-items-center cqa-justify-center cqa-cursor-grab cqa-text-[#6B7280] cqa-hover:cqa-text-[#111827] active:cqa-cursor-grabbing\" matTooltip=\"Drag to reorder\">\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\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <!-- Custom template (e.g. parent-provided cqa-dynamic-select) -->\n <ng-container *ngIf=\"selectBodyTpl\">\n <ng-container\n *ngTemplateOutlet=\"selectBodyTpl; context: {\n $implicit: row,\n index: i,\n form: form,\n config: getConfig(i)\n }\">\n </ng-container>\n </ng-container>\n <!-- Default: built-in cqa-dynamic-select -->\n <cqa-dynamic-select\n *ngIf=\"!selectBodyTpl && form\"\n [form]=\"form\"\n [config]=\"getConfig(i)\"\n (selectionChange)=\"onSelectionChange($event, i)\">\n </cqa-dynamic-select>\n </div>\n\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-min-w-[32px] cqa-bg-transparent cqa-border-none cqa-rounded-md cqa-text-[#6b7280] cqa-cursor-pointer cqa-p-0 cqa-hover:cqa-bg-[#f3f4f6] cqa-hover:cqa-text-[#374151]\"\n (click)=\"onRemoveRow(i)\"\n matTooltip=\"Cancel\">\n <mat-icon class=\"cqa-text-lg cqa-w-[18px] cqa-h-[18px]\">close</mat-icon>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"showAddAnotherValidation && !allRowsHaveValues()\" class=\"cqa-text-xs cqa-text-[#dc2626] cqa-mb-2\">\n {{ selectFirstValidationMessage }}\n </div>\n <!-- Add Prerequisite button only in empty state; hide when parent has prerequisites (e.g. collapsing after update) -->\n <div\n *ngIf=\"rows.length === 0 && !hideAddPrerequisite\"\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#ccccff] cqa-rounded-lg cqa-p-3 cqa-mb-3 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-center cqa-gap-2 cqa-min-h-[40px] cqa-w-full cqa-hover:cqa-border-[#9999ee] cqa-hover:cqa-bg-[#f8f8ff] cqa-active:cqa-border-[#7c7ce0] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"onAddRow()\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px] cqa-text-[#3b82f6]\">add</mat-icon>\n <span class=\"cqa-font-medium cqa-font-inter cqa-text-sm cqa-text-[#3b82f6]\">{{ addTriggerText }}</span>\n </div>\n <!-- Add Another link when we already have at least one row -->\n <button\n *ngIf=\"rows.length > 0 && !hideAddPrerequisite\"\n type=\"button\"\n class=\"cqa-mb-3 cqa-flex cqa-items-center cqa-gap-2 cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer cqa-font-inter cqa-text-sm cqa-text-[#4242DB] cqa-hover:cqa-underline\"\n (click)=\"onAddRow()\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px]\">add</mat-icon>\n <span>{{ addAnotherText }}</span>\n </button>\n <div class=\"cqa-flex cqa-gap-3 cqa-justify-end\">\n <button\n type=\"button\"\n class=\"cqa-py-2.5 cqa-px-4 cqa-bg-white cqa-text-[#374151] cqa-border cqa-border-[#d1d5db] cqa-rounded-md cqa-text-sm cqa-font-semibold cqa-cursor-pointer cqa-hover:cqa-bg-[#f9fafb]\"\n (click)=\"onCancel()\">\n {{ cancelText }}\n </button>\n <button\n type=\"button\"\n class=\"cqa-py-2.5 cqa-px-4 cqa-rounded-md cqa-text-sm cqa-font-semibold cqa-border-none cqa-cursor-pointer disabled:cqa-opacity-50 disabled:cqa-cursor-not-allowed cqa-bg-[#1a56db] cqa-text-white cqa-hover:cqa-bg-[#1647b8] disabled:cqa-bg-[#1a56db] cqa-flex cqa-items-center cqa-justify-center cqa-gap-2\"\n [style.pointer-events]=\"isUpdating ? 'none' : 'auto'\"\n [style.cursor]=\"isUpdating ? 'not-allowed' : 'pointer'\"\n [disabled]=\"isUpdateDisabled()\"\n (click)=\"onUpdate()\">\n <mat-spinner *ngIf=\"isUpdating\" diameter=\"16\" class=\"cqa-inline-block update-spinner-white\"></mat-spinner>\n <span>{{ updateText }}</span>\n </button>\n </div>\n </div>\n</ng-container>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i6.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i6.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }, { type: i6.DndHandleDirective, selector: "[dndHandle]" }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
180
+ AddPrerequisiteCasesSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: AddPrerequisiteCasesSectionComponent, selector: "cqa-add-prerequisite-cases-section", inputs: { expanded: "expanded", form: "form", rows: "rows", options: "options", getSelectConfig: "getSelectConfig", label: "label", infoTooltip: "infoTooltip", addAnotherText: "addAnotherText", updateText: "updateText", cancelText: "cancelText", addTriggerText: "addTriggerText", hideAddPrerequisite: "hideAddPrerequisite", updateDisabled: "updateDisabled", isUpdating: "isUpdating", enableServerSearch: "enableServerSearch", hasMoreOptions: "hasMoreOptions", isLoadingOptions: "isLoadingOptions", selectFirstValidationMessage: "selectFirstValidationMessage" }, outputs: { expandedChange: "expandedChange", addRow: "addRow", removeRow: "removeRow", rowsReordered: "rowsReordered", update: "update", cancel: "cancel", selectionChange: "selectionChange", searchOptions: "searchOptions", loadMoreOptions: "loadMoreOptions", prerequisitesChange: "prerequisitesChange" }, host: { classAttribute: "cqa-ui-root cqa-add-prerequisite-cases-section-host" }, queries: [{ propertyName: "selectBodyTpl", first: true, predicate: ["selectBody"], descendants: true, read: TemplateRef }], ngImport: i0, template: "<!-- Add Prerequisite trigger - only when collapsed and no rows (user must click to expand); hide when parent has prerequisites -->\n<ng-container *ngIf=\"rows.length === 0 && !expanded && !hideAddPrerequisite\">\n <div\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#D8D9FC] cqa-rounded-lg cqa-p-1 cqa-mt-4 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-center cqa-gap-2 cqa-w-full cqa-hover:cqa-border-[#9999ee] cqa-hover:cqa-bg-[#f8f8ff] cqa-active:cqa-border-[#7c7ce0] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"onAddPrerequisiteClick()\">\n <mat-icon class=\"cqa-text-[12px] cqa-w-[12px] cqa-h-[12px] cqa-text-[#3F43EE]\">add</mat-icon>\n <span class=\"cqa-font-regular cqa-font-inter cqa-text-sm cqa-text-[#3F43EE]\">{{ addTriggerText }}</span>\n </div>\n</ng-container>\n\n<!-- Collapsed summary when we have rows but expanded=false -->\n<ng-container *ngIf=\"rows.length > 0 && !expanded\">\n <div\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#D8D9FC] cqa-rounded-lg cqa-p-1.5 cqa-mt-4 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-between cqa-min-h-[27px] cqa-hover:cqa-border-[#9ca3af] cqa-hover:cqa-bg-[#f9fafb] cqa-active:cqa-border-[#6366f1] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"toggleExpanded(true)\">\n <span class=\"cqa-text-[#4a5565] cqa-font-normal cqa-font-inter cqa-text-xs\">{{ rows.length }} prerequisite{{ rows.length !== 1 ? 's' : '' }}</span>\n <mat-icon class=\"cqa-text-[14px] cqa-w-[14px] cqa-h-[14px] cqa-text-[#4a5565]\">expand_more</mat-icon>\n </div>\n</ng-container>\n\n<!-- Expanded form - when expanded=true (with or without rows; no Add Prerequisite trigger) -->\n<ng-container *ngIf=\"expanded\">\n <div class=\"cqa-p-3 cqa-bg-white cqa-border cqa-border-[#e5e7eb] cqa-rounded-lg\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-mb-3\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0 cqa-leading-none\">{{ label }}</label>\n <mat-icon class=\"cqa-inline-flex cqa-mt-1 cqa-items-center cqa-justify-center cqa-w-4 cqa-h-4 cqa-text-sm cqa-text-[#6b7280] cqa-cursor-help cqa-flex-shrink-0\" [matTooltip]=\"infoTooltip\" matTooltipPosition=\"above\" matTooltipShowDelay=\"300\">info</mat-icon>\n <button\n type=\"button\"\n class=\"cqa-ml-auto cqa-flex cqa-items-center cqa-justify-center cqa-w-7 cqa-h-7 cqa-p-0 cqa-bg-transparent cqa-border-none cqa-rounded-md cqa-text-[#6b7280] cqa-cursor-pointer cqa-hover:cqa-bg-[#f3f4f6] cqa-hover:cqa-text-[#374151]\"\n (click)=\"toggleExpanded(false)\"\n matTooltip=\"Close\">\n <mat-icon class=\"cqa-text-xl cqa-w-5 cqa-h-5\">expand_less</mat-icon>\n </button>\n </div>\n\n <div\n class=\"prerequisite-drop-list cqa-flex cqa-flex-col cqa-gap-2 cqa-mb-3\"\n [dndDropzone]=\"['prerequisite-row']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"prerequisite-drag-placeholder\">Drop here</div>\n <div\n *ngFor=\"let row of rows; let i = index; trackBy: trackByKey\"\n class=\"prerequisite-drag-item cqa-flex cqa-items-center cqa-gap-2\"\n [dndDraggable]=\"row\"\n [dndDisableIf]=\"rows.length <= 1\"\n dndEffectAllowed=\"move\"\n dndType=\"prerequisite-row\">\n <!-- 9-dot grid drag handle (only when multiple rows to reorder) -->\n <div *ngIf=\"rows.length > 1\" dndHandle class=\"cqa-flex cqa-flex-shrink-0 cqa-items-center cqa-justify-center cqa-cursor-grab cqa-text-[#6B7280] cqa-hover:cqa-text-[#111827] active:cqa-cursor-grabbing\" matTooltip=\"Drag to reorder\">\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\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <!-- Custom template (e.g. parent-provided cqa-dynamic-select) -->\n <ng-container *ngIf=\"selectBodyTpl\">\n <ng-container\n *ngTemplateOutlet=\"selectBodyTpl; context: {\n $implicit: row,\n index: i,\n form: form,\n config: getConfig(i)\n }\">\n </ng-container>\n </ng-container>\n <!-- Default: built-in cqa-dynamic-select -->\n <cqa-dynamic-select\n *ngIf=\"!selectBodyTpl && form\"\n [form]=\"form\"\n [config]=\"getConfig(i)\"\n (selectionChange)=\"onSelectionChange($event, i)\">\n </cqa-dynamic-select>\n </div>\n\n <button\n *ngIf=\"rowHasValue(i)\"\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-min-w-[32px] cqa-bg-transparent cqa-border-none cqa-rounded-md cqa-text-[#6b7280] cqa-cursor-pointer cqa-p-0 cqa-hover:cqa-bg-[#f3f4f6] cqa-hover:cqa-text-[#374151]\"\n (click)=\"onRemoveRow(i)\"\n matTooltip=\"Remove Prerequisite\">\n <mat-icon class=\"cqa-text-lg cqa-w-[18px] cqa-h-[18px]\">close</mat-icon>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"showAddAnotherValidation && !allRowsHaveValues()\" class=\"cqa-text-xs cqa-text-[#dc2626] cqa-mb-2\">\n {{ selectFirstValidationMessage }}\n </div>\n <!-- Add Prerequisite button only in empty state; hide when parent has prerequisites (e.g. collapsing after update) -->\n <div\n *ngIf=\"rows.length === 0 && !hideAddPrerequisite\"\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#ccccff] cqa-rounded-lg cqa-p-3 cqa-mb-3 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-center cqa-gap-2 cqa-min-h-[40px] cqa-w-full cqa-hover:cqa-border-[#9999ee] cqa-hover:cqa-bg-[#f8f8ff] cqa-active:cqa-border-[#7c7ce0] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"onAddRow()\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px] cqa-text-[#3b82f6]\">add</mat-icon>\n <span class=\"cqa-font-medium cqa-font-inter cqa-text-sm cqa-text-[#3b82f6]\">{{ addTriggerText }}</span>\n </div>\n <!-- Add Another link when we already have at least one row -->\n <button\n *ngIf=\"rows.length > 0 && !hideAddPrerequisite\"\n type=\"button\"\n class=\"cqa-mb-3 cqa-flex cqa-items-center cqa-gap-2 cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer cqa-font-inter cqa-text-sm cqa-text-[#4242DB] cqa-hover:cqa-underline\"\n (click)=\"onAddRow()\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px]\">add</mat-icon>\n <span>{{ addAnotherText }}</span>\n </button>\n <div class=\"cqa-flex cqa-gap-3 cqa-justify-end\">\n <button\n type=\"button\"\n class=\"cqa-py-2.5 cqa-px-4 cqa-bg-white cqa-text-[#374151] cqa-border cqa-border-[#d1d5db] cqa-rounded-md cqa-text-sm cqa-font-semibold cqa-cursor-pointer cqa-hover:cqa-bg-[#f9fafb]\"\n (click)=\"onCancel()\">\n {{ cancelText }}\n </button>\n <button\n type=\"button\"\n class=\"cqa-py-2.5 cqa-px-4 cqa-rounded-md cqa-text-sm cqa-font-semibold cqa-border-none cqa-cursor-pointer disabled:cqa-opacity-50 disabled:cqa-cursor-not-allowed cqa-bg-[#1a56db] cqa-text-white cqa-hover:cqa-bg-[#1647b8] disabled:cqa-bg-[#1a56db] cqa-flex cqa-items-center cqa-justify-center cqa-gap-2\"\n [style.pointer-events]=\"isUpdating ? 'none' : 'auto'\"\n [style.cursor]=\"isUpdating ? 'not-allowed' : 'pointer'\"\n [disabled]=\"isUpdateDisabled()\"\n (click)=\"onUpdate()\">\n <mat-spinner *ngIf=\"isUpdating\" diameter=\"16\" class=\"cqa-inline-block update-spinner-white\"></mat-spinner>\n <span>{{ updateText }}</span>\n </button>\n </div>\n </div>\n</ng-container>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i6.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i6.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }, { type: i6.DndHandleDirective, selector: "[dndHandle]" }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
173
181
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AddPrerequisiteCasesSectionComponent, decorators: [{
174
182
  type: Component,
175
- args: [{ selector: 'cqa-add-prerequisite-cases-section', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'cqa-ui-root cqa-add-prerequisite-cases-section-host' }, template: "<!-- Add Prerequisite trigger - only when collapsed and no rows (user must click to expand); hide when parent has prerequisites -->\n<ng-container *ngIf=\"rows.length === 0 && !expanded && !hideAddPrerequisite\">\n <div\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#D8D9FC] cqa-rounded-lg cqa-p-1 cqa-mt-4 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-center cqa-gap-2 cqa-w-full cqa-hover:cqa-border-[#9999ee] cqa-hover:cqa-bg-[#f8f8ff] cqa-active:cqa-border-[#7c7ce0] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"onAddPrerequisiteClick()\">\n <mat-icon class=\"cqa-text-[12px] cqa-w-[12px] cqa-h-[12px] cqa-text-[#3F43EE]\">add</mat-icon>\n <span class=\"cqa-font-regular cqa-font-inter cqa-text-sm cqa-text-[#3F43EE]\">{{ addTriggerText }}</span>\n </div>\n</ng-container>\n\n<!-- Collapsed summary when we have rows but expanded=false -->\n<ng-container *ngIf=\"rows.length > 0 && !expanded\">\n <div\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#D8D9FC] cqa-rounded-lg cqa-p-1.5 cqa-mt-4 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-between cqa-min-h-[27px] cqa-hover:cqa-border-[#9ca3af] cqa-hover:cqa-bg-[#f9fafb] cqa-active:cqa-border-[#6366f1] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"toggleExpanded(true)\">\n <span class=\"cqa-text-[#4a5565] cqa-font-normal cqa-font-inter cqa-text-xs\">{{ rows.length }} prerequisite{{ rows.length !== 1 ? 's' : '' }}</span>\n <mat-icon class=\"cqa-text-[14px] cqa-w-[14px] cqa-h-[14px] cqa-text-[#4a5565]\">expand_more</mat-icon>\n </div>\n</ng-container>\n\n<!-- Expanded form - when expanded=true (with or without rows; no Add Prerequisite trigger) -->\n<ng-container *ngIf=\"expanded\">\n <div class=\"cqa-p-3 cqa-bg-white cqa-border cqa-border-[#e5e7eb] cqa-rounded-lg\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-mb-3\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0 cqa-leading-none\">{{ label }}</label>\n <mat-icon class=\"cqa-inline-flex cqa-mt-1 cqa-items-center cqa-justify-center cqa-w-4 cqa-h-4 cqa-text-sm cqa-text-[#6b7280] cqa-cursor-help cqa-flex-shrink-0\" [matTooltip]=\"infoTooltip\" matTooltipPosition=\"above\" matTooltipShowDelay=\"300\">info</mat-icon>\n <button\n type=\"button\"\n class=\"cqa-ml-auto cqa-flex cqa-items-center cqa-justify-center cqa-w-7 cqa-h-7 cqa-p-0 cqa-bg-transparent cqa-border-none cqa-rounded-md cqa-text-[#6b7280] cqa-cursor-pointer cqa-hover:cqa-bg-[#f3f4f6] cqa-hover:cqa-text-[#374151]\"\n (click)=\"toggleExpanded(false)\"\n matTooltip=\"Close\">\n <mat-icon class=\"cqa-text-xl cqa-w-5 cqa-h-5\">expand_less</mat-icon>\n </button>\n </div>\n\n <div\n class=\"prerequisite-drop-list cqa-flex cqa-flex-col cqa-gap-2 cqa-mb-3\"\n [dndDropzone]=\"['prerequisite-row']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"prerequisite-drag-placeholder\">Drop here</div>\n <div\n *ngFor=\"let row of rows; let i = index; trackBy: trackByKey\"\n class=\"prerequisite-drag-item cqa-flex cqa-items-center cqa-gap-2\"\n [dndDraggable]=\"row\"\n [dndDisableIf]=\"rows.length <= 1\"\n dndEffectAllowed=\"move\"\n dndType=\"prerequisite-row\">\n <!-- 9-dot grid drag handle (only when multiple rows to reorder) -->\n <div *ngIf=\"rows.length > 1\" dndHandle class=\"cqa-flex cqa-flex-shrink-0 cqa-items-center cqa-justify-center cqa-cursor-grab cqa-text-[#6B7280] cqa-hover:cqa-text-[#111827] active:cqa-cursor-grabbing\" matTooltip=\"Drag to reorder\">\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\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <!-- Custom template (e.g. parent-provided cqa-dynamic-select) -->\n <ng-container *ngIf=\"selectBodyTpl\">\n <ng-container\n *ngTemplateOutlet=\"selectBodyTpl; context: {\n $implicit: row,\n index: i,\n form: form,\n config: getConfig(i)\n }\">\n </ng-container>\n </ng-container>\n <!-- Default: built-in cqa-dynamic-select -->\n <cqa-dynamic-select\n *ngIf=\"!selectBodyTpl && form\"\n [form]=\"form\"\n [config]=\"getConfig(i)\"\n (selectionChange)=\"onSelectionChange($event, i)\">\n </cqa-dynamic-select>\n </div>\n\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-min-w-[32px] cqa-bg-transparent cqa-border-none cqa-rounded-md cqa-text-[#6b7280] cqa-cursor-pointer cqa-p-0 cqa-hover:cqa-bg-[#f3f4f6] cqa-hover:cqa-text-[#374151]\"\n (click)=\"onRemoveRow(i)\"\n matTooltip=\"Cancel\">\n <mat-icon class=\"cqa-text-lg cqa-w-[18px] cqa-h-[18px]\">close</mat-icon>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"showAddAnotherValidation && !allRowsHaveValues()\" class=\"cqa-text-xs cqa-text-[#dc2626] cqa-mb-2\">\n {{ selectFirstValidationMessage }}\n </div>\n <!-- Add Prerequisite button only in empty state; hide when parent has prerequisites (e.g. collapsing after update) -->\n <div\n *ngIf=\"rows.length === 0 && !hideAddPrerequisite\"\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#ccccff] cqa-rounded-lg cqa-p-3 cqa-mb-3 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-center cqa-gap-2 cqa-min-h-[40px] cqa-w-full cqa-hover:cqa-border-[#9999ee] cqa-hover:cqa-bg-[#f8f8ff] cqa-active:cqa-border-[#7c7ce0] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"onAddRow()\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px] cqa-text-[#3b82f6]\">add</mat-icon>\n <span class=\"cqa-font-medium cqa-font-inter cqa-text-sm cqa-text-[#3b82f6]\">{{ addTriggerText }}</span>\n </div>\n <!-- Add Another link when we already have at least one row -->\n <button\n *ngIf=\"rows.length > 0 && !hideAddPrerequisite\"\n type=\"button\"\n class=\"cqa-mb-3 cqa-flex cqa-items-center cqa-gap-2 cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer cqa-font-inter cqa-text-sm cqa-text-[#4242DB] cqa-hover:cqa-underline\"\n (click)=\"onAddRow()\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px]\">add</mat-icon>\n <span>{{ addAnotherText }}</span>\n </button>\n <div class=\"cqa-flex cqa-gap-3 cqa-justify-end\">\n <button\n type=\"button\"\n class=\"cqa-py-2.5 cqa-px-4 cqa-bg-white cqa-text-[#374151] cqa-border cqa-border-[#d1d5db] cqa-rounded-md cqa-text-sm cqa-font-semibold cqa-cursor-pointer cqa-hover:cqa-bg-[#f9fafb]\"\n (click)=\"onCancel()\">\n {{ cancelText }}\n </button>\n <button\n type=\"button\"\n class=\"cqa-py-2.5 cqa-px-4 cqa-rounded-md cqa-text-sm cqa-font-semibold cqa-border-none cqa-cursor-pointer disabled:cqa-opacity-50 disabled:cqa-cursor-not-allowed cqa-bg-[#1a56db] cqa-text-white cqa-hover:cqa-bg-[#1647b8] disabled:cqa-bg-[#1a56db] cqa-flex cqa-items-center cqa-justify-center cqa-gap-2\"\n [style.pointer-events]=\"isUpdating ? 'none' : 'auto'\"\n [style.cursor]=\"isUpdating ? 'not-allowed' : 'pointer'\"\n [disabled]=\"isUpdateDisabled()\"\n (click)=\"onUpdate()\">\n <mat-spinner *ngIf=\"isUpdating\" diameter=\"16\" class=\"cqa-inline-block update-spinner-white\"></mat-spinner>\n <span>{{ updateText }}</span>\n </button>\n </div>\n </div>\n</ng-container>\n", styles: [] }]
183
+ args: [{ selector: 'cqa-add-prerequisite-cases-section', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'cqa-ui-root cqa-add-prerequisite-cases-section-host' }, template: "<!-- Add Prerequisite trigger - only when collapsed and no rows (user must click to expand); hide when parent has prerequisites -->\n<ng-container *ngIf=\"rows.length === 0 && !expanded && !hideAddPrerequisite\">\n <div\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#D8D9FC] cqa-rounded-lg cqa-p-1 cqa-mt-4 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-center cqa-gap-2 cqa-w-full cqa-hover:cqa-border-[#9999ee] cqa-hover:cqa-bg-[#f8f8ff] cqa-active:cqa-border-[#7c7ce0] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"onAddPrerequisiteClick()\">\n <mat-icon class=\"cqa-text-[12px] cqa-w-[12px] cqa-h-[12px] cqa-text-[#3F43EE]\">add</mat-icon>\n <span class=\"cqa-font-regular cqa-font-inter cqa-text-sm cqa-text-[#3F43EE]\">{{ addTriggerText }}</span>\n </div>\n</ng-container>\n\n<!-- Collapsed summary when we have rows but expanded=false -->\n<ng-container *ngIf=\"rows.length > 0 && !expanded\">\n <div\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#D8D9FC] cqa-rounded-lg cqa-p-1.5 cqa-mt-4 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-between cqa-min-h-[27px] cqa-hover:cqa-border-[#9ca3af] cqa-hover:cqa-bg-[#f9fafb] cqa-active:cqa-border-[#6366f1] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"toggleExpanded(true)\">\n <span class=\"cqa-text-[#4a5565] cqa-font-normal cqa-font-inter cqa-text-xs\">{{ rows.length }} prerequisite{{ rows.length !== 1 ? 's' : '' }}</span>\n <mat-icon class=\"cqa-text-[14px] cqa-w-[14px] cqa-h-[14px] cqa-text-[#4a5565]\">expand_more</mat-icon>\n </div>\n</ng-container>\n\n<!-- Expanded form - when expanded=true (with or without rows; no Add Prerequisite trigger) -->\n<ng-container *ngIf=\"expanded\">\n <div class=\"cqa-p-3 cqa-bg-white cqa-border cqa-border-[#e5e7eb] cqa-rounded-lg\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-mb-3\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0 cqa-leading-none\">{{ label }}</label>\n <mat-icon class=\"cqa-inline-flex cqa-mt-1 cqa-items-center cqa-justify-center cqa-w-4 cqa-h-4 cqa-text-sm cqa-text-[#6b7280] cqa-cursor-help cqa-flex-shrink-0\" [matTooltip]=\"infoTooltip\" matTooltipPosition=\"above\" matTooltipShowDelay=\"300\">info</mat-icon>\n <button\n type=\"button\"\n class=\"cqa-ml-auto cqa-flex cqa-items-center cqa-justify-center cqa-w-7 cqa-h-7 cqa-p-0 cqa-bg-transparent cqa-border-none cqa-rounded-md cqa-text-[#6b7280] cqa-cursor-pointer cqa-hover:cqa-bg-[#f3f4f6] cqa-hover:cqa-text-[#374151]\"\n (click)=\"toggleExpanded(false)\"\n matTooltip=\"Close\">\n <mat-icon class=\"cqa-text-xl cqa-w-5 cqa-h-5\">expand_less</mat-icon>\n </button>\n </div>\n\n <div\n class=\"prerequisite-drop-list cqa-flex cqa-flex-col cqa-gap-2 cqa-mb-3\"\n [dndDropzone]=\"['prerequisite-row']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"prerequisite-drag-placeholder\">Drop here</div>\n <div\n *ngFor=\"let row of rows; let i = index; trackBy: trackByKey\"\n class=\"prerequisite-drag-item cqa-flex cqa-items-center cqa-gap-2\"\n [dndDraggable]=\"row\"\n [dndDisableIf]=\"rows.length <= 1\"\n dndEffectAllowed=\"move\"\n dndType=\"prerequisite-row\">\n <!-- 9-dot grid drag handle (only when multiple rows to reorder) -->\n <div *ngIf=\"rows.length > 1\" dndHandle class=\"cqa-flex cqa-flex-shrink-0 cqa-items-center cqa-justify-center cqa-cursor-grab cqa-text-[#6B7280] cqa-hover:cqa-text-[#111827] active:cqa-cursor-grabbing\" matTooltip=\"Drag to reorder\">\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\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <!-- Custom template (e.g. parent-provided cqa-dynamic-select) -->\n <ng-container *ngIf=\"selectBodyTpl\">\n <ng-container\n *ngTemplateOutlet=\"selectBodyTpl; context: {\n $implicit: row,\n index: i,\n form: form,\n config: getConfig(i)\n }\">\n </ng-container>\n </ng-container>\n <!-- Default: built-in cqa-dynamic-select -->\n <cqa-dynamic-select\n *ngIf=\"!selectBodyTpl && form\"\n [form]=\"form\"\n [config]=\"getConfig(i)\"\n (selectionChange)=\"onSelectionChange($event, i)\">\n </cqa-dynamic-select>\n </div>\n\n <button\n *ngIf=\"rowHasValue(i)\"\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-min-w-[32px] cqa-bg-transparent cqa-border-none cqa-rounded-md cqa-text-[#6b7280] cqa-cursor-pointer cqa-p-0 cqa-hover:cqa-bg-[#f3f4f6] cqa-hover:cqa-text-[#374151]\"\n (click)=\"onRemoveRow(i)\"\n matTooltip=\"Remove Prerequisite\">\n <mat-icon class=\"cqa-text-lg cqa-w-[18px] cqa-h-[18px]\">close</mat-icon>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"showAddAnotherValidation && !allRowsHaveValues()\" class=\"cqa-text-xs cqa-text-[#dc2626] cqa-mb-2\">\n {{ selectFirstValidationMessage }}\n </div>\n <!-- Add Prerequisite button only in empty state; hide when parent has prerequisites (e.g. collapsing after update) -->\n <div\n *ngIf=\"rows.length === 0 && !hideAddPrerequisite\"\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#ccccff] cqa-rounded-lg cqa-p-3 cqa-mb-3 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-center cqa-gap-2 cqa-min-h-[40px] cqa-w-full cqa-hover:cqa-border-[#9999ee] cqa-hover:cqa-bg-[#f8f8ff] cqa-active:cqa-border-[#7c7ce0] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"onAddRow()\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px] cqa-text-[#3b82f6]\">add</mat-icon>\n <span class=\"cqa-font-medium cqa-font-inter cqa-text-sm cqa-text-[#3b82f6]\">{{ addTriggerText }}</span>\n </div>\n <!-- Add Another link when we already have at least one row -->\n <button\n *ngIf=\"rows.length > 0 && !hideAddPrerequisite\"\n type=\"button\"\n class=\"cqa-mb-3 cqa-flex cqa-items-center cqa-gap-2 cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer cqa-font-inter cqa-text-sm cqa-text-[#4242DB] cqa-hover:cqa-underline\"\n (click)=\"onAddRow()\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px]\">add</mat-icon>\n <span>{{ addAnotherText }}</span>\n </button>\n <div class=\"cqa-flex cqa-gap-3 cqa-justify-end\">\n <button\n type=\"button\"\n class=\"cqa-py-2.5 cqa-px-4 cqa-bg-white cqa-text-[#374151] cqa-border cqa-border-[#d1d5db] cqa-rounded-md cqa-text-sm cqa-font-semibold cqa-cursor-pointer cqa-hover:cqa-bg-[#f9fafb]\"\n (click)=\"onCancel()\">\n {{ cancelText }}\n </button>\n <button\n type=\"button\"\n class=\"cqa-py-2.5 cqa-px-4 cqa-rounded-md cqa-text-sm cqa-font-semibold cqa-border-none cqa-cursor-pointer disabled:cqa-opacity-50 disabled:cqa-cursor-not-allowed cqa-bg-[#1a56db] cqa-text-white cqa-hover:cqa-bg-[#1647b8] disabled:cqa-bg-[#1a56db] cqa-flex cqa-items-center cqa-justify-center cqa-gap-2\"\n [style.pointer-events]=\"isUpdating ? 'none' : 'auto'\"\n [style.cursor]=\"isUpdating ? 'not-allowed' : 'pointer'\"\n [disabled]=\"isUpdateDisabled()\"\n (click)=\"onUpdate()\">\n <mat-spinner *ngIf=\"isUpdating\" diameter=\"16\" class=\"cqa-inline-block update-spinner-white\"></mat-spinner>\n <span>{{ updateText }}</span>\n </button>\n </div>\n </div>\n</ng-container>\n", styles: [] }]
176
184
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { expanded: [{
177
185
  type: Input
178
186
  }], form: [{
@@ -233,4 +241,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
233
241
  }], prerequisitesChange: [{
234
242
  type: Output
235
243
  }] } });
236
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXByZXJlcXVpc2l0ZS1jYXNlcy1zZWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWRkLXByZXJlcXVpc2l0ZS1jYXNlcy1zZWN0aW9uL2FkZC1wcmVyZXF1aXNpdGUtY2FzZXMtc2VjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2FkZC1wcmVyZXF1aXNpdGUtY2FzZXMtc2VjdGlvbi9hZGQtcHJlcmVxdWlzaXRlLWNhc2VzLXNlY3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWix1QkFBdUIsRUFDdkIsWUFBWSxFQUNaLFdBQVcsR0FFWixNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFzQnZCLE1BQU0sT0FBTyxvQ0FBb0M7SUF5Ri9DLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBeEYxQyx5REFBeUQ7UUFDaEQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUsxQix1REFBdUQ7UUFDOUMsU0FBSSxHQUFzQixFQUFFLENBQUM7UUFFdEM7OztXQUdHO1FBQ00sWUFBTyxHQUFtQixFQUFFLENBQUM7UUFVdEMsZ0RBQWdEO1FBQ3ZDLFVBQUssR0FBRyxvQkFBb0IsQ0FBQztRQUV0QyxnQ0FBZ0M7UUFDdkIsZ0JBQVcsR0FBRyxpRUFBaUUsQ0FBQztRQUV6Rix3Q0FBd0M7UUFDL0IsbUJBQWMsR0FBRyxhQUFhLENBQUM7UUFFeEMsaUNBQWlDO1FBQ3hCLGVBQVUsR0FBRyxRQUFRLENBQUM7UUFFL0IsaUNBQWlDO1FBQ3hCLGVBQVUsR0FBRyxRQUFRLENBQUM7UUFFL0IsMkNBQTJDO1FBQ2xDLG1CQUFjLEdBQUcsa0JBQWtCLENBQUM7UUFFN0MscUlBQXFJO1FBQzVILHdCQUFtQixHQUFHLEtBQUssQ0FB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QUs7Z0JBR0csS0FBSztzQkFBYixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHRyw0QkFBNEI7c0JBQXBDLEtBQUs7Z0JBRzZDLGFBQWE7c0JBQS9ELFlBQVk7dUJBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFPdkMsY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLE1BQU07c0JBQWYsTUFBTTtnQkFFRyxNQUFNO3NCQUFmLE1BQU07Z0JBRUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLGVBQWU7c0JBQXhCLE1BQU07Z0JBRUcsbUJBQW1CO3NCQUE1QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb250ZW50Q2hpbGQsXG4gIFRlbXBsYXRlUmVmLFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEbmREcm9wRXZlbnQgfSBmcm9tICduZ3gtZHJhZy1kcm9wJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBQcmVyZXF1aXNpdGVSb3cge1xuICBrZXk6IHN0cmluZztcbn1cblxuLyoqIEVtaXR0ZWQgd2hlbiBhbnkgcHJlcmVxdWlzaXRlIHNlbGVjdCBjaGFuZ2VzIC0gY29udGFpbnMgYWxsIGN1cnJlbnQgc2VsZWN0aW9ucyAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVyZXF1aXNpdGVTZWxlY3Rpb24ge1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IHVua25vd247XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1hZGQtcHJlcmVxdWlzaXRlLWNhc2VzLXNlY3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vYWRkLXByZXJlcXVpc2l0ZS1jYXNlcy1zZWN0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCBjcWEtYWRkLXByZXJlcXVpc2l0ZS1jYXNlcy1zZWN0aW9uLWhvc3QnIH0sXG59KVxuZXhwb3J0IGNsYXNzIEFkZFByZXJlcXVpc2l0ZUNhc2VzU2VjdGlvbkNvbXBvbmVudCB7XG4gIC8qKiBXaGV0aGVyIHRoZSBzZWN0aW9uIGlzIGV4cGFuZGVkIChzaG93aW5nIHRoZSBmb3JtKSAqL1xuICBASW5wdXQoKSBleHBhbmRlZCA9IGZhbHNlO1xuXG4gIC8qKiBGb3JtIGdyb3VwIGNvbnRhaW5pbmcgY29udHJvbHMgZm9yIGVhY2ggcm93IChrZXllZCBieSByb3cua2V5KSAqL1xuICBASW5wdXQoKSBmb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBBcnJheSBvZiByb3cgZGVzY3JpcHRvcnMsIGVhY2ggd2l0aCBhIHVuaXF1ZSBrZXkgKi9cbiAgQElucHV0KCkgcm93czogUHJlcmVxdWlzaXRlUm93W10gPSBbXTtcblxuICAvKipcbiAgICogUHJlcmVxdWlzaXRlIG9wdGlvbnMgZnJvbSBBUEkgKGUuZy4gdGVzdCBjYXNlcyB0byBjaG9vc2UgZnJvbSkuXG4gICAqIFBhc3NlZCB0byBnZXRTZWxlY3RDb25maWcgd2hlbiBidWlsZGluZyB0aGUgY29uZmlnIGZvciBlYWNoIHJvdy5cbiAgICovXG4gIEBJbnB1dCgpIG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW107XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgZHluYW1pYyBzZWxlY3QgY29uZmlnIGZvciBhIGdpdmVuIHJvdyBpbmRleC5cbiAgICogUmVjZWl2ZXMgb3B0aW9uYWwgb3B0aW9ucyAoZnJvbSB0aGlzLm9wdGlvbnMgd2hlbiBwcm92aWRlZCkuXG4gICAqIEVhY2ggcm93IGNhbiBoYXZlIGRpZmZlcmVudCBvcHRpb25zLiBUbyBhdm9pZCBkdXBsaWNhdGVzLCBleGNsdWRlIG9wdGlvbnNcbiAgICogYWxyZWFkeSBzZWxlY3RlZCBpbiBvdGhlciByb3dzIChrZWVwIGN1cnJlbnQgcm93J3Mgc2VsZWN0aW9uIHNvIGl0IGRpc3BsYXlzKS5cbiAgICovXG4gIEBJbnB1dCgpIGdldFNlbGVjdENvbmZpZyE6IChpbmRleDogbnVtYmVyLCBvcHRpb25zPzogU2VsZWN0T3B0aW9uW10pID0+IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuICAvKiogU2VjdGlvbiBsYWJlbCAoZS5nLiBcIlByZXJlcXVpc2l0ZSBDYXNlc1wiKSAqL1xuICBASW5wdXQoKSBsYWJlbCA9ICdQcmVyZXF1aXNpdGUgQ2FzZXMnO1xuXG4gIC8qKiBUb29sdGlwIGZvciB0aGUgaW5mbyBpY29uICovXG4gIEBJbnB1dCgpIGluZm9Ub29sdGlwID0gJ0FkZCBwcmVyZXF1aXNpdGUgdGVzdCBjYXNlcyB0aGF0IG11c3QgcnVuIGJlZm9yZSB0aGlzIHRlc3QgY2FzZSc7XG5cbiAgLyoqIFRleHQgZm9yIHRoZSBcIkFkZCBBbm90aGVyXCIgYnV0dG9uICovXG4gIEBJbnB1dCgpIGFkZEFub3RoZXJUZXh0ID0gJ0FkZCBBbm90aGVyJztcblxuICAvKiogVGV4dCBmb3IgdGhlIFVwZGF0ZSBidXR0b24gKi9cbiAgQElucHV0KCkgdXBkYXRlVGV4dCA9ICdVcGRhdGUnO1xuXG4gIC8qKiBUZXh0IGZvciB0aGUgQ2FuY2VsIGJ1dHRvbiAqL1xuICBASW5wdXQoKSBjYW5jZWxUZXh0ID0gJ0NhbmNlbCc7XG5cbiAgLyoqIFRleHQgZm9yIHRoZSBjb2xsYXBzZWQgXCJBZGRcIiB0cmlnZ2VyICovXG4gIEBJbnB1dCgpIGFkZFRyaWdnZXJUZXh0ID0gJ0FkZCBQcmVyZXF1aXNpdGUnO1xuXG4gIC8qKiBXaGVuIHRydWUsIGhpZGUgQWRkIFByZXJlcXVpc2l0ZSBidXR0b24gZXZlbiBpZiByb3dzIGFyZSBlbXB0eSAoZS5nLiB3aGVuIGNvbGxhcHNpbmcgYWZ0ZXIgdXBkYXRlIHdpdGggZXhpc3RpbmcgcHJlcmVxdWlzaXRlcykgKi9cbiAgQElucHV0KCkgaGlkZUFkZFByZXJlcXVpc2l0ZSA9IGZhbHNlO1xuXG4gIC8qKiBXaGVuIHByb3ZpZGVkLCBjb250cm9scyBVcGRhdGUgYnV0dG9uIGRpc2FibGVkIHN0YXRlLiBVc2UgZm9yIGRpcnR5LXN0YXRlIHZhbGlkYXRpb24gKGVuYWJsZSB3aGVuIGZvcm0gY2hhbmdlZCkuIFdoZW4gdW5kZWZpbmVkLCBmYWxscyBiYWNrIHRvICFhbGxSb3dzSGF2ZVZhbHVlcygpLiAqL1xuICBASW5wdXQoKSB1cGRhdGVEaXNhYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKiogV2hlbiB0cnVlLCBVcGRhdGUgYnV0dG9uIGlzIGRpc2FibGVkIGFuZCBzaG93cyBhIGxvYWRlciAoQVBJIGluIHByb2dyZXNzKSAqL1xuICBASW5wdXQoKSBpc1VwZGF0aW5nID0gZmFsc2U7XG5cbiAgLyoqIFdoZW4gdHJ1ZSwgcHJlcmVxdWlzaXRlIGRyb3Bkb3duIHVzZXMgc2VydmVyLXNpZGUgc2VhcmNoIGFuZCBsb2FkIG1vcmUgKGVtaXQgc2VhcmNoT3B0aW9ucyAvIGxvYWRNb3JlT3B0aW9ucykuICovXG4gIEBJbnB1dCgpIGVuYWJsZVNlcnZlclNlYXJjaCA9IGZhbHNlO1xuICAvKiogUGVyLXJvdzogd2hldGhlciBtb3JlIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgbG9hZCBtb3JlLiBLZXkgPSByb3cgaW5kZXguICovXG4gIEBJbnB1dCgpIGhhc01vcmVPcHRpb25zOiBSZWNvcmQ8bnVtYmVyLCBib29sZWFuPiA9IHt9O1xuICAvKiogUGVyLXJvdzogdHJ1ZSB3aGlsZSBvcHRpb25zIGFyZSBsb2FkaW5nIGZvciB0aGF0IGRyb3Bkb3duLiBLZXkgPSByb3cgaW5kZXguICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ09wdGlvbnM6IFJlY29yZDxudW1iZXIsIGJvb2xlYW4+ID0ge307XG5cbiAgLyoqIFZhbGlkYXRpb24gbWVzc2FnZSBzaG93biB3aGVuIEFkZCBBbm90aGVyL1VwZGF0ZSBhcmUgZGlzYWJsZWQgKG5vdCBhbGwgcm93cyBoYXZlIHZhbHVlcykgKi9cbiAgQElucHV0KCkgc2VsZWN0Rmlyc3RWYWxpZGF0aW9uTWVzc2FnZSA9ICdQbGVhc2Ugc2VsZWN0IGEgcHJlcmVxdWlzaXRlIGZvciBlYWNoIHJvdyBmaXJzdCwgdGhlbiBjbGljayBBZGQgQW5vdGhlci4nO1xuXG4gIC8qKiBPcHRpb25hbCBjdXN0b20gdGVtcGxhdGUgZm9yIHRoZSBzZWxlY3Qgc2xvdC4gVXNlIG5nLXRlbXBsYXRlICNzZWxlY3RCb2R5IHdpdGggbGV0LXJvdywgbGV0LWluZGV4LCBsZXQtZm9ybSwgbGV0LWNvbmZpZy4gKi9cbiAgQENvbnRlbnRDaGlsZCgnc2VsZWN0Qm9keScsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgc2VsZWN0Qm9keVRwbD86IFRlbXBsYXRlUmVmPHtcbiAgICAkaW1wbGljaXQ6IFByZXJlcXVpc2l0ZVJvdztcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIGZvcm06IEZvcm1Hcm91cDtcbiAgICBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgfT47XG5cbiAgQE91dHB1dCgpIGV4cGFuZGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgYWRkUm93ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVtb3ZlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSByb3dzUmVvcmRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxQcmVyZXF1aXNpdGVSb3dbXT4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiBVcGRhdGUgYnV0dG9uIGlzIGNsaWNrZWQgKi9cbiAgQE91dHB1dCgpIHVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiBDYW5jZWwgYnV0dG9uIGlzIGNsaWNrZWQgKi9cbiAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIHNpbmdsZSByb3cncyBzZWxlY3Rpb24gY2hhbmdlcyAqL1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93bjsgaW5kZXg6IG51bWJlciB9PigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgc2VhcmNoZXMgaW4gcHJlcmVxdWlzaXRlIGRyb3Bkb3duIChzZXJ2ZXIgc2VhcmNoKS4gUGFyZW50IHNob3VsZCBmZXRjaCBvcHRpb25zIGFuZCB1cGRhdGUgb3B0aW9ucyBpbnB1dC4gKi9cbiAgQE91dHB1dCgpIHNlYXJjaE9wdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaW5kZXg6IG51bWJlcjsgcXVlcnk6IHN0cmluZyB9PigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgb3B0aW9ucy4gUGFyZW50IHNob3VsZCBhcHBlbmQgdG8gb3B0aW9ucyBhbmQgc2V0IGhhc01vcmVPcHRpb25zLiAqL1xuICBAT3V0cHV0KCkgbG9hZE1vcmVPcHRpb25zID0gbmV3IEV2ZW50RW1pdHRlcjx7IGluZGV4OiBudW1iZXI7IHF1ZXJ5OiBzdHJpbmcgfT4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiBhbnkgc2VsZWN0IGNoYW5nZXMgLSByZXR1cm5zIGFsbCBjdXJyZW50IHByZXJlcXVpc2l0ZSBzZWxlY3Rpb25zIGluIG9yZGVyICovXG4gIEBPdXRwdXQoKSBwcmVyZXF1aXNpdGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQcmVyZXF1aXNpdGVTZWxlY3Rpb25bXT4oKTtcblxuICAvKiogU2V0IHRvIHRydWUgd2hlbiB1c2VyIGNsaWNrcyBBZGQgQW5vdGhlciB3aGlsZSBpbnZhbGlkIC0gc2hvd3MgdmFsaWRhdGlvbiBtZXNzYWdlICovXG4gIHNob3dBZGRBbm90aGVyVmFsaWRhdGlvbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICB0b2dnbGVFeHBhbmRlZChzaG93OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZCA9IHNob3c7XG4gICAgdGhpcy5leHBhbmRlZENoYW5nZS5lbWl0KHNob3cpO1xuICB9XG5cbiAgLyoqIENhbGxlZCB3aGVuIHVzZXIgY2xpY2tzIFwiQWRkIFByZXJlcXVpc2l0ZVwiIHdpdGggbm8gcm93cyAtIGV4cGFuZHMgYW5kIGFkZHMgZmlyc3Qgcm93ICovXG4gIG9uQWRkUHJlcmVxdWlzaXRlQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZCh0cnVlKTtcbiAgICB0aGlzLmFkZFJvdy5lbWl0KCk7XG4gIH1cblxuICBvbkFkZFJvdygpOiB2b2lkIHtcbiAgICAvLyBBbGxvdyBhZGRpbmcgZmlyc3Qgcm93IHdoZW4gZW1wdHkgKG5vIHZhbGlkYXRpb24gbmVlZGVkKVxuICAgIGlmICh0aGlzLnJvd3MubGVuZ3RoID4gMCAmJiAhdGhpcy5hbGxSb3dzSGF2ZVZhbHVlcygpKSB7XG4gICAgICB0aGlzLnNob3dBZGRBbm90aGVyVmFsaWRhdGlvbiA9IHRydWU7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zaG93QWRkQW5vdGhlclZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLmFkZFJvdy5lbWl0KCk7XG4gIH1cblxuICBvblJlbW92ZVJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVSb3cuZW1pdChpbmRleCk7XG4gIH1cblxuICBvbkRuZERyb3AoZXZlbnQ6IERuZERyb3BFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5kYXRhID09IG51bGwgfHwgZXZlbnQuaW5kZXggPT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IGRyb3BSb3cgPSBldmVudC5kYXRhIGFzIFByZXJlcXVpc2l0ZVJvdztcbiAgICBsZXQgZHJvcEluZGV4ID0gZXZlbnQuaW5kZXg7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5yb3dzLmZpbmRJbmRleCgocikgPT4gci5rZXkgPT09IGRyb3BSb3cua2V5KTtcbiAgICBpZiAoY3VycmVudEluZGV4IDwgMCkgcmV0dXJuO1xuICAgIGlmIChjdXJyZW50SW5kZXggPT09IGRyb3BJbmRleCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3Um93cyA9IFsuLi50aGlzLnJvd3NdO1xuICAgIG5ld1Jvd3Muc3BsaWNlKGN1cnJlbnRJbmRleCwgMSk7XG4gICAgLy8gSWYgbW92aW5nIGZvcndhcmQsIGRyb3BJbmRleCBzaGlmdHMgYWZ0ZXIgcmVtb3ZhbFxuICAgIGlmIChjdXJyZW50SW5kZXggPCBkcm9wSW5kZXgpIHtcbiAgICAgIGRyb3BJbmRleC0tO1xuICAgIH1cbiAgICBuZXdSb3dzLnNwbGljZShkcm9wSW5kZXgsIDAsIGRyb3BSb3cpO1xuICAgIHRoaXMucm93c1Jlb3JkZXJlZC5lbWl0KG5ld1Jvd3MpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgdHJhY2tCeUtleShfaTogbnVtYmVyLCByb3c6IFByZXJlcXVpc2l0ZVJvdyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJvdy5rZXk7XG4gIH1cblxuICBvblVwZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1VwZGF0aW5nKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGUuZW1pdCgpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHsgLi4uZXZlbnQsIGluZGV4IH0pO1xuICAgIHRoaXMuZW1pdEFsbFByZXJlcXVpc2l0ZXMoKTtcbiAgICBpZiAodGhpcy5hbGxSb3dzSGF2ZVZhbHVlcygpKSB7XG4gICAgICB0aGlzLnNob3dBZGRBbm90aGVyVmFsaWRhdGlvbiA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gZXZlcnkgcm93IGhhcyBhIG5vbi1lbXB0eSB2YWx1ZSAobm8gcGxhY2Vob2xkZXJzKSAqL1xuICBhbGxSb3dzSGF2ZVZhbHVlcygpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZm9ybSB8fCAhdGhpcy5yb3dzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnJvd3MuZXZlcnkoKHJvdykgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdGhpcy5mb3JtLmdldChyb3cua2V5KT8udmFsdWU7XG4gICAgICByZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsICE9PSAnJztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDb21wdXRlZCBkaXNhYmxlZCBzdGF0ZSBmb3IgVXBkYXRlIGJ1dHRvbi4gV2hlbiBpc1VwZGF0aW5nIHdlIGRvIG5vdCBkaXNhYmxlIChzaG93IGxvYWRlciBvbmx5KTsgdXNlIHVwZGF0ZURpc2FibGVkIGZvciBvdGhlciBjYXNlcy4gKi9cbiAgaXNVcGRhdGVEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy51cGRhdGVEaXNhYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVEaXNhYmxlZDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIEVtaXRzIGFsbCBjdXJyZW50IHByZXJlcXVpc2l0ZSBzZWxlY3Rpb25zIChrZXkgKyB2YWx1ZSkgaW4gcm93IG9yZGVyICovXG4gIHByaXZhdGUgZW1pdEFsbFByZXJlcXVpc2l0ZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZvcm0gfHwgIXRoaXMucm93cy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBzZWxlY3Rpb25zOiBQcmVyZXF1aXNpdGVTZWxlY3Rpb25bXSA9IHRoaXMucm93cy5tYXAoKHJvdykgPT4gKHtcbiAgICAgIGtleTogcm93LmtleSxcbiAgICAgIHZhbHVlOiB0aGlzLmZvcm0uZ2V0KHJvdy5rZXkpPy52YWx1ZSA/PyBudWxsLFxuICAgIH0pKTtcbiAgICB0aGlzLnByZXJlcXVpc2l0ZXNDaGFuZ2UuZW1pdChzZWxlY3Rpb25zKTtcbiAgfVxuXG4gIGdldENvbmZpZyhpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRpb25zPy5sZW5ndGggPyB0aGlzLm9wdGlvbnMgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMuZ2V0U2VsZWN0Q29uZmlnPy4oaW5kZXgsIG9wdHMpID8/IHsga2V5OiBgcm93XyR7aW5kZXh9YCwgb3B0aW9uczogdGhpcy5vcHRpb25zID8/IFtdIH07XG4gICAgaWYgKHRoaXMuZW5hYmxlU2VydmVyU2VhcmNoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICAgIGluaXRpYWxGZXRjaE9uT3BlbjogdHJ1ZSxcbiAgICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlT3B0aW9uc1tpbmRleF0gPz8gZmFsc2UsXG4gICAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdPcHRpb25zW2luZGV4XSA/PyBmYWxzZSxcbiAgICAgICAgb25TZWFyY2g6IChxKSA9PiB0aGlzLnNlYXJjaE9wdGlvbnMuZW1pdCh7IGluZGV4LCBxdWVyeTogcSA/PyAnJyB9KSxcbiAgICAgICAgb25Mb2FkTW9yZTogKHEpID0+IHRoaXMubG9hZE1vcmVPcHRpb25zLmVtaXQoeyBpbmRleCwgcXVlcnk6IHEgPz8gJycgfSksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbiAgfVxufVxuIiwiPCEtLSBBZGQgUHJlcmVxdWlzaXRlIHRyaWdnZXIgLSBvbmx5IHdoZW4gY29sbGFwc2VkIGFuZCBubyByb3dzICh1c2VyIG11c3QgY2xpY2sgdG8gZXhwYW5kKTsgaGlkZSB3aGVuIHBhcmVudCBoYXMgcHJlcmVxdWlzaXRlcyAtLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJyb3dzLmxlbmd0aCA9PT0gMCAmJiAhZXhwYW5kZWQgJiYgIWhpZGVBZGRQcmVyZXF1aXNpdGVcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyNEOEQ5RkNdIGNxYS1yb3VuZGVkLWxnIGNxYS1wLTEgY3FhLW10LTQgY3FhLWJnLXdoaXRlIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWR1cmF0aW9uLTIwMCBjcWEtZWFzZS1pbi1vdXQgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWdhcC0yICBjcWEtdy1mdWxsIGNxYS1ob3ZlcjpjcWEtYm9yZGVyLVsjOTk5OWVlXSBjcWEtaG92ZXI6Y3FhLWJnLVsjZjhmOGZmXSBjcWEtYWN0aXZlOmNxYS1ib3JkZXItWyM3YzdjZTBdIGNxYS1hY3RpdmU6Y3FhLWJnLVsjZWZmNmZmXVwiXG4gICAgKGNsaWNrKT1cIm9uQWRkUHJlcmVxdWlzaXRlQ2xpY2soKVwiPlxuICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdy1bMTJweF0gY3FhLWgtWzEycHhdIGNxYS10ZXh0LVsjM0Y0M0VFXVwiPmFkZDwvbWF0LWljb24+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1yZWd1bGFyIGNxYS1mb250LWludGVyIGNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjM0Y0M0VFXVwiPnt7IGFkZFRyaWdnZXJUZXh0IH19PC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIENvbGxhcHNlZCBzdW1tYXJ5IHdoZW4gd2UgaGF2ZSByb3dzIGJ1dCBleHBhbmRlZD1mYWxzZSAtLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJyb3dzLmxlbmd0aCA+IDAgJiYgIWV4cGFuZGVkXCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cImNxYS1ib3JkZXItMiBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjRDhEOUZDXSBjcWEtcm91bmRlZC1sZyBjcWEtcC0xLjUgY3FhLW10LTQgY3FhLWJnLXdoaXRlIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWR1cmF0aW9uLTIwMCBjcWEtZWFzZS1pbi1vdXQgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1taW4taC1bMjdweF0gY3FhLWhvdmVyOmNxYS1ib3JkZXItWyM5Y2EzYWZdIGNxYS1ob3ZlcjpjcWEtYmctWyNmOWZhZmJdIGNxYS1hY3RpdmU6Y3FhLWJvcmRlci1bIzYzNjZmMV0gY3FhLWFjdGl2ZTpjcWEtYmctWyNlZmY2ZmZdXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlRXhwYW5kZWQodHJ1ZSlcIj5cbiAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNGE1NTY1XSBjcWEtZm9udC1ub3JtYWwgY3FhLWZvbnQtaW50ZXIgY3FhLXRleHQteHNcIj57eyByb3dzLmxlbmd0aCB9fSBwcmVyZXF1aXNpdGV7eyByb3dzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnIH19PC9zcGFuPlxuICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsxNHB4XSBjcWEtdy1bMTRweF0gY3FhLWgtWzE0cHhdIGNxYS10ZXh0LVsjNGE1NTY1XVwiPmV4cGFuZF9tb3JlPC9tYXQtaWNvbj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPCEtLSBFeHBhbmRlZCBmb3JtIC0gd2hlbiBleHBhbmRlZD10cnVlICh3aXRoIG9yIHdpdGhvdXQgcm93czsgbm8gQWRkIFByZXJlcXVpc2l0ZSB0cmlnZ2VyKSAtLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJleHBhbmRlZFwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXAtMyBjcWEtYmctd2hpdGUgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjZTVlN2ViXSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1tYi0zXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1tLTAgY3FhLWxlYWRpbmctbm9uZVwiPnt7IGxhYmVsIH19PC9sYWJlbD5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtbXQtMSBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy00IGNxYS1oLTQgY3FhLXRleHQtc20gY3FhLXRleHQtWyM2YjcyODBdIGNxYS1jdXJzb3ItaGVscCBjcWEtZmxleC1zaHJpbmstMFwiIFttYXRUb29sdGlwXT1cImluZm9Ub29sdGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiMzAwXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNxYS1tbC1hdXRvIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTcgY3FhLWgtNyBjcWEtcC0wIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXJvdW5kZWQtbWQgY3FhLXRleHQtWyM2YjcyODBdIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtaG92ZXI6Y3FhLWJnLVsjZjNmNGY2XSBjcWEtaG92ZXI6Y3FhLXRleHQtWyMzNzQxNTFdXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUV4cGFuZGVkKGZhbHNlKVwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJDbG9zZVwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5leHBhbmRfbGVzczwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwicHJlcmVxdWlzaXRlLWRyb3AtbGlzdCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1tYi0zXCJcbiAgICAgIFtkbmREcm9wem9uZV09XCJbJ3ByZXJlcXVpc2l0ZS1yb3cnXVwiXG4gICAgICBkbmRFZmZlY3RBbGxvd2VkPVwibW92ZVwiXG4gICAgICBkbmREcmFnb3ZlckNsYXNzPVwiZG5kRHJhZ292ZXJcIlxuICAgICAgKGRuZERyb3ApPVwib25EbmREcm9wKCRldmVudClcIj5cbiAgICAgIDxkaXYgZG5kUGxhY2Vob2xkZXJSZWYgY2xhc3M9XCJwcmVyZXF1aXNpdGUtZHJhZy1wbGFjZWhvbGRlclwiPkRyb3AgaGVyZTwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdGb3I9XCJsZXQgcm93IG9mIHJvd3M7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlLZXlcIlxuICAgICAgICBjbGFzcz1cInByZXJlcXVpc2l0ZS1kcmFnLWl0ZW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIlxuICAgICAgICBbZG5kRHJhZ2dhYmxlXT1cInJvd1wiXG4gICAgICAgIFtkbmREaXNhYmxlSWZdPVwicm93cy5sZW5ndGggPD0gMVwiXG4gICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgZG5kVHlwZT1cInByZXJlcXVpc2l0ZS1yb3dcIj5cbiAgICAgICAgPCEtLSA5LWRvdCBncmlkIGRyYWcgaGFuZGxlIChvbmx5IHdoZW4gbXVsdGlwbGUgcm93cyB0byByZW9yZGVyKSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cInJvd3MubGVuZ3RoID4gMVwiIGRuZEhhbmRsZSBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXNocmluay0wIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1jdXJzb3ItZ3JhYiBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLWhvdmVyOmNxYS10ZXh0LVsjMTExODI3XSBhY3RpdmU6Y3FhLWN1cnNvci1ncmFiYmluZ1wiIG1hdFRvb2x0aXA9XCJEcmFnIHRvIHJlb3JkZXJcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgIDwhLS0gQ3VzdG9tIHRlbXBsYXRlIChlLmcuIHBhcmVudC1wcm92aWRlZCBjcWEtZHluYW1pYy1zZWxlY3QpIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0Qm9keVRwbFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VsZWN0Qm9keVRwbDsgY29udGV4dDoge1xuICAgICAgICAgICAgICAkaW1wbGljaXQ6IHJvdyxcbiAgICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICAgIGZvcm06IGZvcm0sXG4gICAgICAgICAgICAgIGNvbmZpZzogZ2V0Q29uZmlnKGkpXG4gICAgICAgICAgICB9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIERlZmF1bHQ6IGJ1aWx0LWluIGNxYS1keW5hbWljLXNlbGVjdCAtLT5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICpuZ0lmPVwiIXNlbGVjdEJvZHlUcGwgJiYgZm9ybVwiXG4gICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWcoaSlcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTggY3FhLWgtOCBjcWEtbWluLXctWzMycHhdIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXJvdW5kZWQtbWQgY3FhLXRleHQtWyM2YjcyODBdIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtcC0wIGNxYS1ob3ZlcjpjcWEtYmctWyNmM2Y0ZjZdIGNxYS1ob3ZlcjpjcWEtdGV4dC1bIzM3NDE1MV1cIlxuICAgICAgICAoY2xpY2spPVwib25SZW1vdmVSb3coaSlcIlxuICAgICAgICBtYXRUb29sdGlwPVwiQ2FuY2VsXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LWxnIGNxYS13LVsxOHB4XSBjcWEtaC1bMThweF1cIj5jbG9zZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJzaG93QWRkQW5vdGhlclZhbGlkYXRpb24gJiYgIWFsbFJvd3NIYXZlVmFsdWVzKClcIiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjZGMyNjI2XSBjcWEtbWItMlwiPlxuICAgICAge3sgc2VsZWN0Rmlyc3RWYWxpZGF0aW9uTWVzc2FnZSB9fVxuICAgIDwvZGl2PlxuICAgIDwhLS0gQWRkIFByZXJlcXVpc2l0ZSBidXR0b24gb25seSBpbiBlbXB0eSBzdGF0ZTsgaGlkZSB3aGVuIHBhcmVudCBoYXMgcHJlcmVxdWlzaXRlcyAoZS5nLiBjb2xsYXBzaW5nIGFmdGVyIHVwZGF0ZSkgLS0+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJyb3dzLmxlbmd0aCA9PT0gMCAmJiAhaGlkZUFkZFByZXJlcXVpc2l0ZVwiXG4gICAgICBjbGFzcz1cImNxYS1ib3JkZXItMiBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjY2NjY2ZmXSBjcWEtcm91bmRlZC1sZyBjcWEtcC0zIGNxYS1tYi0zIGNxYS1iZy13aGl0ZSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tYWxsIGNxYS1kdXJhdGlvbi0yMDAgY3FhLWVhc2UtaW4tb3V0IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1nYXAtMiBjcWEtbWluLWgtWzQwcHhdIGNxYS13LWZ1bGwgY3FhLWhvdmVyOmNxYS1ib3JkZXItWyM5OTk5ZWVdIGNxYS1ob3ZlcjpjcWEtYmctWyNmOGY4ZmZdIGNxYS1hY3RpdmU6Y3FhLWJvcmRlci1bIzdjN2NlMF0gY3FhLWFjdGl2ZTpjcWEtYmctWyNlZmY2ZmZdXCJcbiAgICAgIChjbGljayk9XCJvbkFkZFJvdygpXCI+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bMThweF0gY3FhLXctWzE4cHhdIGNxYS1oLVsxOHB4XSBjcWEtdGV4dC1bIzNiODJmNl1cIj5hZGQ8L21hdC1pY29uPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1tZWRpdW0gY3FhLWZvbnQtaW50ZXIgY3FhLXRleHQtc20gY3FhLXRleHQtWyMzYjgyZjZdXCI+e3sgYWRkVHJpZ2dlclRleHQgfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBBZGQgQW5vdGhlciBsaW5rIHdoZW4gd2UgYWxyZWFkeSBoYXZlIGF0IGxlYXN0IG9uZSByb3cgLS0+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJyb3dzLmxlbmd0aCA+IDAgJiYgIWhpZGVBZGRQcmVyZXF1aXNpdGVcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImNxYS1tYi0zIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXAtMCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWZvbnQtaW50ZXIgY3FhLXRleHQtc20gY3FhLXRleHQtWyM0MjQyREJdIGNxYS1ob3ZlcjpjcWEtdW5kZXJsaW5lXCJcbiAgICAgIChjbGljayk9XCJvbkFkZFJvdygpXCI+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bMThweF0gY3FhLXctWzE4cHhdIGNxYS1oLVsxOHB4XVwiPmFkZDwvbWF0LWljb24+XG4gICAgICA8c3Bhbj57eyBhZGRBbm90aGVyVGV4dCB9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC0zIGNxYS1qdXN0aWZ5LWVuZFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcHktMi41IGNxYS1weC00IGNxYS1iZy13aGl0ZSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjZDFkNWRiXSBjcWEtcm91bmRlZC1tZCBjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWhvdmVyOmNxYS1iZy1bI2Y5ZmFmYl1cIlxuICAgICAgICAoY2xpY2spPVwib25DYW5jZWwoKVwiPlxuICAgICAgICB7eyBjYW5jZWxUZXh0IH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXB5LTIuNSBjcWEtcHgtNCBjcWEtcm91bmRlZC1tZCBjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGRpc2FibGVkOmNxYS1vcGFjaXR5LTUwIGRpc2FibGVkOmNxYS1jdXJzb3Itbm90LWFsbG93ZWQgY3FhLWJnLVsjMWE1NmRiXSBjcWEtdGV4dC13aGl0ZSBjcWEtaG92ZXI6Y3FhLWJnLVsjMTY0N2I4XSBkaXNhYmxlZDpjcWEtYmctWyMxYTU2ZGJdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1nYXAtMlwiXG4gICAgICAgIFtzdHlsZS5wb2ludGVyLWV2ZW50c109XCJpc1VwZGF0aW5nID8gJ25vbmUnIDogJ2F1dG8nXCJcbiAgICAgICAgW3N0eWxlLmN1cnNvcl09XCJpc1VwZGF0aW5nID8gJ25vdC1hbGxvd2VkJyA6ICdwb2ludGVyJ1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc1VwZGF0ZURpc2FibGVkKClcIlxuICAgICAgICAoY2xpY2spPVwib25VcGRhdGUoKVwiPlxuICAgICAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCJpc1VwZGF0aW5nXCIgZGlhbWV0ZXI9XCIxNlwiIGNsYXNzPVwiY3FhLWlubGluZS1ibG9jayB1cGRhdGUtc3Bpbm5lci13aGl0ZVwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgIDxzcGFuPnt7IHVwZGF0ZVRleHQgfX08L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXByZXJlcXVpc2l0ZS1jYXNlcy1zZWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWRkLXByZXJlcXVpc2l0ZS1jYXNlcy1zZWN0aW9uL2FkZC1wcmVyZXF1aXNpdGUtY2FzZXMtc2VjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2FkZC1wcmVyZXF1aXNpdGUtY2FzZXMtc2VjdGlvbi9hZGQtcHJlcmVxdWlzaXRlLWNhc2VzLXNlY3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWix1QkFBdUIsRUFDdkIsWUFBWSxFQUNaLFdBQVcsR0FFWixNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFzQnZCLE1BQU0sT0FBTyxvQ0FBb0M7SUF5Ri9DLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBeEYxQyx5REFBeUQ7UUFDaEQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUsxQix1REFBdUQ7UUFDOUMsU0FBSSxHQUFzQixFQUFFLENBQUM7UUFFdEM7OztXQUdHO1FBQ00sWUFBTyxHQUFtQixFQUFFLENBQUM7UUFVdEMsZ0RBQWdEO1FBQ3ZDLFVBQUssR0FBRyxvQkFBb0IsQ0FBQztRQUV0QyxnQ0FBZ0M7UUFDdkIsZ0JBQVcsR0FBRyxpRUFBaUUsQ0FBQztRQUV6Rix3Q0FBd0M7UUFDL0IsbUJBQWMsR0FBRyxhQUFhLENBQUM7UUFFeEMsaUNBQWlDO1FBQ3hCLGVBQVUsR0FBRyxRQUFRLENBQUM7UUFFL0IsaUNBQWlDO1FBQ3hCLGVBQVUsR0FBRyxRQUFRLENBQUM7UUFFL0IsMkNBQTJDO1FBQ2xDLG1CQUFjLEdBQUcsa0JBQWtCLENBQUM7UUFFN0MscUlBQXFJO1FBQzVILHdCQUFtQixHQUFHLEtBQUssQ0FB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QUFlO3NCQUF4QixNQUFNO2dCQUVHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbnRlbnRDaGlsZCxcbiAgVGVtcGxhdGVSZWYsXG4gIENoYW5nZURldGVjdG9yUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERuZERyb3BFdmVudCB9IGZyb20gJ25neC1kcmFnLWRyb3AnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByZXJlcXVpc2l0ZVJvdyB7XG4gIGtleTogc3RyaW5nO1xufVxuXG4vKiogRW1pdHRlZCB3aGVuIGFueSBwcmVyZXF1aXNpdGUgc2VsZWN0IGNoYW5nZXMgLSBjb250YWlucyBhbGwgY3VycmVudCBzZWxlY3Rpb25zICovXG5leHBvcnQgaW50ZXJmYWNlIFByZXJlcXVpc2l0ZVNlbGVjdGlvbiB7XG4gIGtleTogc3RyaW5nO1xuICB2YWx1ZTogdW5rbm93bjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWFkZC1wcmVyZXF1aXNpdGUtY2FzZXMtc2VjdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9hZGQtcHJlcmVxdWlzaXRlLWNhc2VzLXNlY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290IGNxYS1hZGQtcHJlcmVxdWlzaXRlLWNhc2VzLXNlY3Rpb24taG9zdCcgfSxcbn0pXG5leHBvcnQgY2xhc3MgQWRkUHJlcmVxdWlzaXRlQ2FzZXNTZWN0aW9uQ29tcG9uZW50IHtcbiAgLyoqIFdoZXRoZXIgdGhlIHNlY3Rpb24gaXMgZXhwYW5kZWQgKHNob3dpbmcgdGhlIGZvcm0pICovXG4gIEBJbnB1dCgpIGV4cGFuZGVkID0gZmFsc2U7XG5cbiAgLyoqIEZvcm0gZ3JvdXAgY29udGFpbmluZyBjb250cm9scyBmb3IgZWFjaCByb3cgKGtleWVkIGJ5IHJvdy5rZXkpICovXG4gIEBJbnB1dCgpIGZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIEFycmF5IG9mIHJvdyBkZXNjcmlwdG9ycywgZWFjaCB3aXRoIGEgdW5pcXVlIGtleSAqL1xuICBASW5wdXQoKSByb3dzOiBQcmVyZXF1aXNpdGVSb3dbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBQcmVyZXF1aXNpdGUgb3B0aW9ucyBmcm9tIEFQSSAoZS5nLiB0ZXN0IGNhc2VzIHRvIGNob29zZSBmcm9tKS5cbiAgICogUGFzc2VkIHRvIGdldFNlbGVjdENvbmZpZyB3aGVuIGJ1aWxkaW5nIHRoZSBjb25maWcgZm9yIGVhY2ggcm93LlxuICAgKi9cbiAgQElucHV0KCkgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gdG8gZ2V0IHRoZSBkeW5hbWljIHNlbGVjdCBjb25maWcgZm9yIGEgZ2l2ZW4gcm93IGluZGV4LlxuICAgKiBSZWNlaXZlcyBvcHRpb25hbCBvcHRpb25zIChmcm9tIHRoaXMub3B0aW9ucyB3aGVuIHByb3ZpZGVkKS5cbiAgICogRWFjaCByb3cgY2FuIGhhdmUgZGlmZmVyZW50IG9wdGlvbnMuIFRvIGF2b2lkIGR1cGxpY2F0ZXMsIGV4Y2x1ZGUgb3B0aW9uc1xuICAgKiBhbHJlYWR5IHNlbGVjdGVkIGluIG90aGVyIHJvd3MgKGtlZXAgY3VycmVudCByb3cncyBzZWxlY3Rpb24gc28gaXQgZGlzcGxheXMpLlxuICAgKi9cbiAgQElucHV0KCkgZ2V0U2VsZWN0Q29uZmlnITogKGluZGV4OiBudW1iZXIsIG9wdGlvbnM/OiBTZWxlY3RPcHRpb25bXSkgPT4gRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuXG4gIC8qKiBTZWN0aW9uIGxhYmVsIChlLmcuIFwiUHJlcmVxdWlzaXRlIENhc2VzXCIpICovXG4gIEBJbnB1dCgpIGxhYmVsID0gJ1ByZXJlcXVpc2l0ZSBDYXNlcyc7XG5cbiAgLyoqIFRvb2x0aXAgZm9yIHRoZSBpbmZvIGljb24gKi9cbiAgQElucHV0KCkgaW5mb1Rvb2x0aXAgPSAnQWRkIHByZXJlcXVpc2l0ZSB0ZXN0IGNhc2VzIHRoYXQgbXVzdCBydW4gYmVmb3JlIHRoaXMgdGVzdCBjYXNlJztcblxuICAvKiogVGV4dCBmb3IgdGhlIFwiQWRkIEFub3RoZXJcIiBidXR0b24gKi9cbiAgQElucHV0KCkgYWRkQW5vdGhlclRleHQgPSAnQWRkIEFub3RoZXInO1xuXG4gIC8qKiBUZXh0IGZvciB0aGUgVXBkYXRlIGJ1dHRvbiAqL1xuICBASW5wdXQoKSB1cGRhdGVUZXh0ID0gJ1VwZGF0ZSc7XG5cbiAgLyoqIFRleHQgZm9yIHRoZSBDYW5jZWwgYnV0dG9uICovXG4gIEBJbnB1dCgpIGNhbmNlbFRleHQgPSAnQ2FuY2VsJztcblxuICAvKiogVGV4dCBmb3IgdGhlIGNvbGxhcHNlZCBcIkFkZFwiIHRyaWdnZXIgKi9cbiAgQElucHV0KCkgYWRkVHJpZ2dlclRleHQgPSAnQWRkIFByZXJlcXVpc2l0ZSc7XG5cbiAgLyoqIFdoZW4gdHJ1ZSwgaGlkZSBBZGQgUHJlcmVxdWlzaXRlIGJ1dHRvbiBldmVuIGlmIHJvd3MgYXJlIGVtcHR5IChlLmcuIHdoZW4gY29sbGFwc2luZyBhZnRlciB1cGRhdGUgd2l0aCBleGlzdGluZyBwcmVyZXF1aXNpdGVzKSAqL1xuICBASW5wdXQoKSBoaWRlQWRkUHJlcmVxdWlzaXRlID0gZmFsc2U7XG5cbiAgLyoqIFdoZW4gcHJvdmlkZWQsIGNvbnRyb2xzIFVwZGF0ZSBidXR0b24gZGlzYWJsZWQgc3RhdGUuIFVzZSBmb3IgZGlydHktc3RhdGUgdmFsaWRhdGlvbiAoZW5hYmxlIHdoZW4gZm9ybSBjaGFuZ2VkKS4gV2hlbiB1bmRlZmluZWQsIGZhbGxzIGJhY2sgdG8gIWFsbFJvd3NIYXZlVmFsdWVzKCkuICovXG4gIEBJbnB1dCgpIHVwZGF0ZURpc2FibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKiBXaGVuIHRydWUsIFVwZGF0ZSBidXR0b24gaXMgZGlzYWJsZWQgYW5kIHNob3dzIGEgbG9hZGVyIChBUEkgaW4gcHJvZ3Jlc3MpICovXG4gIEBJbnB1dCgpIGlzVXBkYXRpbmcgPSBmYWxzZTtcblxuICAvKiogV2hlbiB0cnVlLCBwcmVyZXF1aXNpdGUgZHJvcGRvd24gdXNlcyBzZXJ2ZXItc2lkZSBzZWFyY2ggYW5kIGxvYWQgbW9yZSAoZW1pdCBzZWFyY2hPcHRpb25zIC8gbG9hZE1vcmVPcHRpb25zKS4gKi9cbiAgQElucHV0KCkgZW5hYmxlU2VydmVyU2VhcmNoID0gZmFsc2U7XG4gIC8qKiBQZXItcm93OiB3aGV0aGVyIG1vcmUgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBsb2FkIG1vcmUuIEtleSA9IHJvdyBpbmRleC4gKi9cbiAgQElucHV0KCkgaGFzTW9yZU9wdGlvbnM6IFJlY29yZDxudW1iZXIsIGJvb2xlYW4+ID0ge307XG4gIC8qKiBQZXItcm93OiB0cnVlIHdoaWxlIG9wdGlvbnMgYXJlIGxvYWRpbmcgZm9yIHRoYXQgZHJvcGRvd24uIEtleSA9IHJvdyBpbmRleC4gKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nT3B0aW9uczogUmVjb3JkPG51bWJlciwgYm9vbGVhbj4gPSB7fTtcblxuICAvKiogVmFsaWRhdGlvbiBtZXNzYWdlIHNob3duIHdoZW4gQWRkIEFub3RoZXIvVXBkYXRlIGFyZSBkaXNhYmxlZCAobm90IGFsbCByb3dzIGhhdmUgdmFsdWVzKSAqL1xuICBASW5wdXQoKSBzZWxlY3RGaXJzdFZhbGlkYXRpb25NZXNzYWdlID0gJ1BsZWFzZSBzZWxlY3QgYSBwcmVyZXF1aXNpdGUgZm9yIGVhY2ggcm93IGZpcnN0LCB0aGVuIGNsaWNrIEFkZCBBbm90aGVyLic7XG5cbiAgLyoqIE9wdGlvbmFsIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgdGhlIHNlbGVjdCBzbG90LiBVc2UgbmctdGVtcGxhdGUgI3NlbGVjdEJvZHkgd2l0aCBsZXQtcm93LCBsZXQtaW5kZXgsIGxldC1mb3JtLCBsZXQtY29uZmlnLiAqL1xuICBAQ29udGVudENoaWxkKCdzZWxlY3RCb2R5JywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBzZWxlY3RCb2R5VHBsPzogVGVtcGxhdGVSZWY8e1xuICAgICRpbXBsaWNpdDogUHJlcmVxdWlzaXRlUm93O1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgZm9ybTogRm9ybUdyb3VwO1xuICAgIGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICB9PjtcblxuICBAT3V0cHV0KCkgZXhwYW5kZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBhZGRSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSByZW1vdmVSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHJvd3NSZW9yZGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFByZXJlcXVpc2l0ZVJvd1tdPigpO1xuICAvKiogRW1pdHRlZCB3aGVuIFVwZGF0ZSBidXR0b24gaXMgY2xpY2tlZCAqL1xuICBAT3V0cHV0KCkgdXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHRlZCB3aGVuIENhbmNlbCBidXR0b24gaXMgY2xpY2tlZCAqL1xuICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHRlZCB3aGVuIGEgc2luZ2xlIHJvdydzIHNlbGVjdGlvbiBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duOyBpbmRleDogbnVtYmVyIH0+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBzZWFyY2hlcyBpbiBwcmVyZXF1aXNpdGUgZHJvcGRvd24gKHNlcnZlciBzZWFyY2gpLiBQYXJlbnQgc2hvdWxkIGZldGNoIG9wdGlvbnMgYW5kIHVwZGF0ZSBvcHRpb25zIGlucHV0LiAqL1xuICBAT3V0cHV0KCkgc2VhcmNoT3B0aW9ucyA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpbmRleDogbnVtYmVyOyBxdWVyeTogc3RyaW5nIH0+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBvcHRpb25zLiBQYXJlbnQgc2hvdWxkIGFwcGVuZCB0byBvcHRpb25zIGFuZCBzZXQgaGFzTW9yZU9wdGlvbnMuICovXG4gIEBPdXRwdXQoKSBsb2FkTW9yZU9wdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaW5kZXg6IG51bWJlcjsgcXVlcnk6IHN0cmluZyB9PigpO1xuICAvKiogRW1pdHRlZCB3aGVuIGFueSBzZWxlY3QgY2hhbmdlcyAtIHJldHVybnMgYWxsIGN1cnJlbnQgcHJlcmVxdWlzaXRlIHNlbGVjdGlvbnMgaW4gb3JkZXIgKi9cbiAgQE91dHB1dCgpIHByZXJlcXVpc2l0ZXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFByZXJlcXVpc2l0ZVNlbGVjdGlvbltdPigpO1xuXG4gIC8qKiBTZXQgdG8gdHJ1ZSB3aGVuIHVzZXIgY2xpY2tzIEFkZCBBbm90aGVyIHdoaWxlIGludmFsaWQgLSBzaG93cyB2YWxpZGF0aW9uIG1lc3NhZ2UgKi9cbiAgc2hvd0FkZEFub3RoZXJWYWxpZGF0aW9uID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIHRvZ2dsZUV4cGFuZGVkKHNob3c6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gc2hvdztcbiAgICB0aGlzLmV4cGFuZGVkQ2hhbmdlLmVtaXQoc2hvdyk7XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBjbGlja3MgXCJBZGQgUHJlcmVxdWlzaXRlXCIgd2l0aCBubyByb3dzIC0gZXhwYW5kcyBhbmQgYWRkcyBmaXJzdCByb3cgKi9cbiAgb25BZGRQcmVyZXF1aXNpdGVDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkKHRydWUpO1xuICAgIHRoaXMuYWRkUm93LmVtaXQoKTtcbiAgfVxuXG4gIG9uQWRkUm93KCk6IHZvaWQge1xuICAgIC8vIEFsbG93IGFkZGluZyBmaXJzdCByb3cgd2hlbiBlbXB0eSAobm8gdmFsaWRhdGlvbiBuZWVkZWQpXG4gICAgaWYgKHRoaXMucm93cy5sZW5ndGggPiAwICYmICF0aGlzLmFsbFJvd3NIYXZlVmFsdWVzKCkpIHtcbiAgICAgIHRoaXMuc2hvd0FkZEFub3RoZXJWYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNob3dBZGRBbm90aGVyVmFsaWRhdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuYWRkUm93LmVtaXQoKTtcbiAgfVxuXG4gIG9uUmVtb3ZlUm93KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZVJvdy5lbWl0KGluZGV4KTtcbiAgfVxuXG4gIG9uRG5kRHJvcChldmVudDogRG5kRHJvcEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmRhdGEgPT0gbnVsbCB8fCBldmVudC5pbmRleCA9PSBudWxsKSByZXR1cm47XG4gICAgY29uc3QgZHJvcFJvdyA9IGV2ZW50LmRhdGEgYXMgUHJlcmVxdWlzaXRlUm93O1xuICAgIGxldCBkcm9wSW5kZXggPSBldmVudC5pbmRleDtcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLnJvd3MuZmluZEluZGV4KChyKSA9PiByLmtleSA9PT0gZHJvcFJvdy5rZXkpO1xuICAgIGlmIChjdXJyZW50SW5kZXggPCAwKSByZXR1cm47XG4gICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gZHJvcEluZGV4KSByZXR1cm47XG5cbiAgICBjb25zdCBuZXdSb3dzID0gWy4uLnRoaXMucm93c107XG4gICAgbmV3Um93cy5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcbiAgICAvLyBJZiBtb3ZpbmcgZm9yd2FyZCwgZHJvcEluZGV4IHNoaWZ0cyBhZnRlciByZW1vdmFsXG4gICAgaWYgKGN1cnJlbnRJbmRleCA8IGRyb3BJbmRleCkge1xuICAgICAgZHJvcEluZGV4LS07XG4gICAgfVxuICAgIG5ld1Jvd3Muc3BsaWNlKGRyb3BJbmRleCwgMCwgZHJvcFJvdyk7XG4gICAgdGhpcy5yb3dzUmVvcmRlcmVkLmVtaXQobmV3Um93cyk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICB0cmFja0J5S2V5KF9pOiBudW1iZXIsIHJvdzogUHJlcmVxdWlzaXRlUm93KTogc3RyaW5nIHtcbiAgICByZXR1cm4gcm93LmtleTtcbiAgfVxuXG4gIG9uVXBkYXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzVXBkYXRpbmcpIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZS5lbWl0KCk7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gIH1cblxuICBvblNlbGVjdGlvbkNoYW5nZShldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoeyAuLi5ldmVudCwgaW5kZXggfSk7XG4gICAgdGhpcy5lbWl0QWxsUHJlcmVxdWlzaXRlcygpO1xuICAgIGlmICh0aGlzLmFsbFJvd3NIYXZlVmFsdWVzKCkpIHtcbiAgICAgIHRoaXMuc2hvd0FkZEFub3RoZXJWYWxpZGF0aW9uID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiB0aGUgcm93IGF0IHRoZSBnaXZlbiBpbmRleCBoYXMgYSBzZWxlY3RlZCB2YWx1ZSAqL1xuICByb3dIYXNWYWx1ZShpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmZvcm0gfHwgIXRoaXMucm93cy5sZW5ndGggfHwgaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucm93cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByb3cgPSB0aGlzLnJvd3NbaW5kZXhdO1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuZm9ybS5nZXQocm93LmtleSk/LnZhbHVlO1xuICAgIHJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwgIT09ICcnO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBldmVyeSByb3cgaGFzIGEgbm9uLWVtcHR5IHZhbHVlIChubyBwbGFjZWhvbGRlcnMpICovXG4gIGFsbFJvd3NIYXZlVmFsdWVzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5mb3JtIHx8ICF0aGlzLnJvd3MubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucm93cy5ldmVyeSgocm93KSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLmZvcm0uZ2V0KHJvdy5rZXkpPy52YWx1ZTtcbiAgICAgIHJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwgIT09ICcnO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIENvbXB1dGVkIGRpc2FibGVkIHN0YXRlIGZvciBVcGRhdGUgYnV0dG9uLiBXaGVuIGlzVXBkYXRpbmcgd2UgZG8gbm90IGRpc2FibGUgKHNob3cgbG9hZGVyIG9ubHkpOyB1c2UgdXBkYXRlRGlzYWJsZWQgZm9yIG90aGVyIGNhc2VzLiAqL1xuICBpc1VwZGF0ZURpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnVwZGF0ZURpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZURpc2FibGVkO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogRW1pdHMgYWxsIGN1cnJlbnQgcHJlcmVxdWlzaXRlIHNlbGVjdGlvbnMgKGtleSArIHZhbHVlKSBpbiByb3cgb3JkZXIgKi9cbiAgcHJpdmF0ZSBlbWl0QWxsUHJlcmVxdWlzaXRlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZm9ybSB8fCAhdGhpcy5yb3dzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHNlbGVjdGlvbnM6IFByZXJlcXVpc2l0ZVNlbGVjdGlvbltdID0gdGhpcy5yb3dzLm1hcCgocm93KSA9PiAoe1xuICAgICAga2V5OiByb3cua2V5LFxuICAgICAgdmFsdWU6IHRoaXMuZm9ybS5nZXQocm93LmtleSk/LnZhbHVlID8/IG51bGwsXG4gICAgfSkpO1xuICAgIHRoaXMucHJlcmVxdWlzaXRlc0NoYW5nZS5lbWl0KHNlbGVjdGlvbnMpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM/Lmxlbmd0aCA/IHRoaXMub3B0aW9ucyA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBiYXNlID0gdGhpcy5nZXRTZWxlY3RDb25maWc/LihpbmRleCwgb3B0cykgPz8geyBrZXk6IGByb3dfJHtpbmRleH1gLCBvcHRpb25zOiB0aGlzLm9wdGlvbnMgPz8gW10gfTtcbiAgICBpZiAodGhpcy5lbmFibGVTZXJ2ZXJTZWFyY2gpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgICAgaW5pdGlhbEZldGNoT25PcGVuOiB0cnVlLFxuICAgICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVPcHRpb25zW2luZGV4XSA/PyBmYWxzZSxcbiAgICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ09wdGlvbnNbaW5kZXhdID8/IGZhbHNlLFxuICAgICAgICBvblNlYXJjaDogKHEpID0+IHRoaXMuc2VhcmNoT3B0aW9ucy5lbWl0KHsgaW5kZXgsIHF1ZXJ5OiBxID8/ICcnIH0pLFxuICAgICAgICBvbkxvYWRNb3JlOiAocSkgPT4gdGhpcy5sb2FkTW9yZU9wdGlvbnMuZW1pdCh7IGluZGV4LCBxdWVyeTogcSA/PyAnJyB9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBiYXNlO1xuICB9XG59XG4iLCI8IS0tIEFkZCBQcmVyZXF1aXNpdGUgdHJpZ2dlciAtIG9ubHkgd2hlbiBjb2xsYXBzZWQgYW5kIG5vIHJvd3MgKHVzZXIgbXVzdCBjbGljayB0byBleHBhbmQpOyBoaWRlIHdoZW4gcGFyZW50IGhhcyBwcmVyZXF1aXNpdGVzIC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd3MubGVuZ3RoID09PSAwICYmICFleHBhbmRlZCAmJiAhaGlkZUFkZFByZXJlcXVpc2l0ZVwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjcWEtYm9yZGVyLTIgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bI0Q4RDlGQ10gY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtbXQtNCBjcWEtYmctd2hpdGUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWFsbCBjcWEtZHVyYXRpb24tMjAwIGNxYS1lYXNlLWluLW91dCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtZ2FwLTIgIGNxYS13LWZ1bGwgY3FhLWhvdmVyOmNxYS1ib3JkZXItWyM5OTk5ZWVdIGNxYS1ob3ZlcjpjcWEtYmctWyNmOGY4ZmZdIGNxYS1hY3RpdmU6Y3FhLWJvcmRlci1bIzdjN2NlMF0gY3FhLWFjdGl2ZTpjcWEtYmctWyNlZmY2ZmZdXCJcbiAgICAoY2xpY2spPVwib25BZGRQcmVyZXF1aXNpdGVDbGljaygpXCI+XG4gICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS13LVsxMnB4XSBjcWEtaC1bMTJweF0gY3FhLXRleHQtWyMzRjQzRUVdXCI+YWRkPC9tYXQtaWNvbj5cbiAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LXJlZ3VsYXIgY3FhLWZvbnQtaW50ZXIgY3FhLXRleHQtc20gY3FhLXRleHQtWyMzRjQzRUVdXCI+e3sgYWRkVHJpZ2dlclRleHQgfX08L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjwhLS0gQ29sbGFwc2VkIHN1bW1hcnkgd2hlbiB3ZSBoYXZlIHJvd3MgYnV0IGV4cGFuZGVkPWZhbHNlIC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd3MubGVuZ3RoID4gMCAmJiAhZXhwYW5kZWRcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyNEOEQ5RkNdIGNxYS1yb3VuZGVkLWxnIGNxYS1wLTEuNSBjcWEtbXQtNCBjcWEtYmctd2hpdGUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWFsbCBjcWEtZHVyYXRpb24tMjAwIGNxYS1lYXNlLWluLW91dCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1pbi1oLVsyN3B4XSBjcWEtaG92ZXI6Y3FhLWJvcmRlci1bIzljYTNhZl0gY3FhLWhvdmVyOmNxYS1iZy1bI2Y5ZmFmYl0gY3FhLWFjdGl2ZTpjcWEtYm9yZGVyLVsjNjM2NmYxXSBjcWEtYWN0aXZlOmNxYS1iZy1bI2VmZjZmZl1cIlxuICAgIChjbGljayk9XCJ0b2dnbGVFeHBhbmRlZCh0cnVlKVwiPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM0YTU1NjVdIGNxYS1mb250LW5vcm1hbCBjcWEtZm9udC1pbnRlciBjcWEtdGV4dC14c1wiPnt7IHJvd3MubGVuZ3RoIH19IHByZXJlcXVpc2l0ZXt7IHJvd3MubGVuZ3RoICE9PSAxID8gJ3MnIDogJycgfX08L3NwYW4+XG4gICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWzE0cHhdIGNxYS13LVsxNHB4XSBjcWEtaC1bMTRweF0gY3FhLXRleHQtWyM0YTU1NjVdXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIEV4cGFuZGVkIGZvcm0gLSB3aGVuIGV4cGFuZGVkPXRydWUgKHdpdGggb3Igd2l0aG91dCByb3dzOyBubyBBZGQgUHJlcmVxdWlzaXRlIHRyaWdnZXIpIC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4cGFuZGVkXCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtcC0zIGNxYS1iZy13aGl0ZSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNlNWU3ZWJdIGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLW1iLTNcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW0tMCBjcWEtbGVhZGluZy1ub25lXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1tdC0xIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTQgY3FhLWgtNCBjcWEtdGV4dC1zbSBjcWEtdGV4dC1bIzZiNzI4MF0gY3FhLWN1cnNvci1oZWxwIGNxYS1mbGV4LXNocmluay0wXCIgW21hdFRvb2x0aXBdPVwiaW5mb1Rvb2x0aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIG1hdFRvb2x0aXBTaG93RGVsYXk9XCIzMDBcIj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLW1sLWF1dG8gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctNyBjcWEtaC03IGNxYS1wLTAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcm91bmRlZC1tZCBjcWEtdGV4dC1bIzZiNzI4MF0gY3FhLWN1cnNvci1wb2ludGVyIGNxYS1ob3ZlcjpjcWEtYmctWyNmM2Y0ZjZdIGNxYS1ob3ZlcjpjcWEtdGV4dC1bIzM3NDE1MV1cIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlRXhwYW5kZWQoZmFsc2UpXCJcbiAgICAgICAgbWF0VG9vbHRpcD1cIkNsb3NlXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LXhsIGNxYS13LTUgY3FhLWgtNVwiPmV4cGFuZF9sZXNzPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJwcmVyZXF1aXNpdGUtZHJvcC1saXN0IGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLW1iLTNcIlxuICAgICAgW2RuZERyb3B6b25lXT1cIlsncHJlcmVxdWlzaXRlLXJvdyddXCJcbiAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgIGRuZERyYWdvdmVyQ2xhc3M9XCJkbmREcmFnb3ZlclwiXG4gICAgICAoZG5kRHJvcCk9XCJvbkRuZERyb3AoJGV2ZW50KVwiPlxuICAgICAgPGRpdiBkbmRQbGFjZWhvbGRlclJlZiBjbGFzcz1cInByZXJlcXVpc2l0ZS1kcmFnLXBsYWNlaG9sZGVyXCI+RHJvcCBoZXJlPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2Ygcm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUtleVwiXG4gICAgICAgIGNsYXNzPVwicHJlcmVxdWlzaXRlLWRyYWctaXRlbSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiXG4gICAgICAgIFtkbmREcmFnZ2FibGVdPVwicm93XCJcbiAgICAgICAgW2RuZERpc2FibGVJZl09XCJyb3dzLmxlbmd0aCA8PSAxXCJcbiAgICAgICAgZG5kRWZmZWN0QWxsb3dlZD1cIm1vdmVcIlxuICAgICAgICBkbmRUeXBlPVwicHJlcmVxdWlzaXRlLXJvd1wiPlxuICAgICAgICA8IS0tIDktZG90IGdyaWQgZHJhZyBoYW5kbGUgKG9ubHkgd2hlbiBtdWx0aXBsZSByb3dzIHRvIHJlb3JkZXIpIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwicm93cy5sZW5ndGggPiAxXCIgZG5kSGFuZGxlIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWN1cnNvci1ncmFiIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtaG92ZXI6Y3FhLXRleHQtWyMxMTE4MjddIGFjdGl2ZTpjcWEtY3Vyc29yLWdyYWJiaW5nXCIgbWF0VG9vbHRpcD1cIkRyYWcgdG8gcmVvcmRlclwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgPCEtLSBDdXN0b20gdGVtcGxhdGUgKGUuZy4gcGFyZW50LXByb3ZpZGVkIGNxYS1keW5hbWljLXNlbGVjdCkgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RCb2R5VHBsXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3RCb2R5VHBsOyBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICRpbXBsaWNpdDogcm93LFxuICAgICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgICAgZm9ybTogZm9ybSxcbiAgICAgICAgICAgICAgY29uZmlnOiBnZXRDb25maWcoaSlcbiAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gRGVmYXVsdDogYnVpbHQtaW4gY3FhLWR5bmFtaWMtc2VsZWN0IC0tPlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgKm5nSWY9XCIhc2VsZWN0Qm9keVRwbCAmJiBmb3JtXCJcbiAgICAgICAgICBbZm9ybV09XCJmb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZyhpKVwiXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQsIGkpXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJyb3dIYXNWYWx1ZShpKVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTggY3FhLWgtOCBjcWEtbWluLXctWzMycHhdIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXJvdW5kZWQtbWQgY3FhLXRleHQtWyM2YjcyODBdIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtcC0wIGNxYS1ob3ZlcjpjcWEtYmctWyNmM2Y0ZjZdIGNxYS1ob3ZlcjpjcWEtdGV4dC1bIzM3NDE1MV1cIlxuICAgICAgICAoY2xpY2spPVwib25SZW1vdmVSb3coaSlcIlxuICAgICAgICBtYXRUb29sdGlwPVwiUmVtb3ZlIFByZXJlcXVpc2l0ZVwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1sZyBjcWEtdy1bMThweF0gY3FhLWgtWzE4cHhdXCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0FkZEFub3RoZXJWYWxpZGF0aW9uICYmICFhbGxSb3dzSGF2ZVZhbHVlcygpXCIgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bI2RjMjYyNl0gY3FhLW1iLTJcIj5cbiAgICAgIHt7IHNlbGVjdEZpcnN0VmFsaWRhdGlvbk1lc3NhZ2UgfX1cbiAgICA8L2Rpdj5cbiAgICA8IS0tIEFkZCBQcmVyZXF1aXNpdGUgYnV0dG9uIG9ubHkgaW4gZW1wdHkgc3RhdGU7IGhpZGUgd2hlbiBwYXJlbnQgaGFzIHByZXJlcXVpc2l0ZXMgKGUuZy4gY29sbGFwc2luZyBhZnRlciB1cGRhdGUpIC0tPlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwicm93cy5sZW5ndGggPT09IDAgJiYgIWhpZGVBZGRQcmVyZXF1aXNpdGVcIlxuICAgICAgY2xhc3M9XCJjcWEtYm9yZGVyLTIgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bI2NjY2NmZl0gY3FhLXJvdW5kZWQtbGcgY3FhLXAtMyBjcWEtbWItMyBjcWEtYmctd2hpdGUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWFsbCBjcWEtZHVyYXRpb24tMjAwIGNxYS1lYXNlLWluLW91dCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1pbi1oLVs0MHB4XSBjcWEtdy1mdWxsIGNxYS1ob3ZlcjpjcWEtYm9yZGVyLVsjOTk5OWVlXSBjcWEtaG92ZXI6Y3FhLWJnLVsjZjhmOGZmXSBjcWEtYWN0aXZlOmNxYS1ib3JkZXItWyM3YzdjZTBdIGNxYS1hY3RpdmU6Y3FhLWJnLVsjZWZmNmZmXVwiXG4gICAgICAoY2xpY2spPVwib25BZGRSb3coKVwiPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWzE4cHhdIGNxYS13LVsxOHB4XSBjcWEtaC1bMThweF0gY3FhLXRleHQtWyMzYjgyZjZdXCI+YWRkPC9tYXQtaWNvbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtbWVkaXVtIGNxYS1mb250LWludGVyIGNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjM2I4MmY2XVwiPnt7IGFkZFRyaWdnZXJUZXh0IH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gQWRkIEFub3RoZXIgbGluayB3aGVuIHdlIGFscmVhZHkgaGF2ZSBhdCBsZWFzdCBvbmUgcm93IC0tPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwicm93cy5sZW5ndGggPiAwICYmICFoaWRlQWRkUHJlcmVxdWlzaXRlXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJjcWEtbWItMyBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1mb250LWludGVyIGNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjNDI0MkRCXSBjcWEtaG92ZXI6Y3FhLXVuZGVybGluZVwiXG4gICAgICAoY2xpY2spPVwib25BZGRSb3coKVwiPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWzE4cHhdIGNxYS13LVsxOHB4XSBjcWEtaC1bMThweF1cIj5hZGQ8L21hdC1pY29uPlxuICAgICAgPHNwYW4+e3sgYWRkQW5vdGhlclRleHQgfX08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAtMyBjcWEtanVzdGlmeS1lbmRcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXB5LTIuNSBjcWEtcHgtNCBjcWEtYmctd2hpdGUgY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI2QxZDVkYl0gY3FhLXJvdW5kZWQtbWQgY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1ob3ZlcjpjcWEtYmctWyNmOWZhZmJdXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5cbiAgICAgICAge3sgY2FuY2VsVGV4dCB9fVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNxYS1weS0yLjUgY3FhLXB4LTQgY3FhLXJvdW5kZWQtbWQgY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciBkaXNhYmxlZDpjcWEtb3BhY2l0eS01MCBkaXNhYmxlZDpjcWEtY3Vyc29yLW5vdC1hbGxvd2VkIGNxYS1iZy1bIzFhNTZkYl0gY3FhLXRleHQtd2hpdGUgY3FhLWhvdmVyOmNxYS1iZy1bIzE2NDdiOF0gZGlzYWJsZWQ6Y3FhLWJnLVsjMWE1NmRiXSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtZ2FwLTJcIlxuICAgICAgICBbc3R5bGUucG9pbnRlci1ldmVudHNdPVwiaXNVcGRhdGluZyA/ICdub25lJyA6ICdhdXRvJ1wiXG4gICAgICAgIFtzdHlsZS5jdXJzb3JdPVwiaXNVcGRhdGluZyA/ICdub3QtYWxsb3dlZCcgOiAncG9pbnRlcidcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNVcGRhdGVEaXNhYmxlZCgpXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uVXBkYXRlKClcIj5cbiAgICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwiaXNVcGRhdGluZ1wiIGRpYW1ldGVyPVwiMTZcIiBjbGFzcz1cImNxYS1pbmxpbmUtYmxvY2sgdXBkYXRlLXNwaW5uZXItd2hpdGVcIj48L21hdC1zcGlubmVyPlxuICAgICAgICA8c3Bhbj57eyB1cGRhdGVUZXh0IH19PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=