@cqa-lib/cqa-ui 1.1.544 → 1.1.545

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.
@@ -63,6 +63,8 @@ export class TestCaseDetailsComponent {
63
63
  /** Forwarded to `cqa-api-mocking-card` — gates the "Mocked / progress / percent" block. */
64
64
  this.apiMockingShowProgress = false;
65
65
  this.apiMockingConfigureButtonLabel = 'Configure';
66
+ /** Viewport dropdown options per category from the API. Forwarded to edit mode. */
67
+ this.viewportCategoryOptions = {};
66
68
  /** Labels to filter out from metadata for step groups */
67
69
  this.stepGroupExcludedMetadataLabels = ['priority', 'type'];
68
70
  /** When true, description (view mode) is expanded; when false, clamped to 4 lines with Read more */
@@ -175,10 +177,10 @@ export class TestCaseDetailsComponent {
175
177
  }
176
178
  }
177
179
  TestCaseDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
178
- TestCaseDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseDetailsComponent, selector: "cqa-test-case-details", inputs: { editing: "editing", startInEditMode: "startInEditMode", descriptionTitle: "descriptionTitle", descriptionContent: "descriptionContent", enableMarkdown: "enableMarkdown", showEditButton: "showEditButton", metadataItems: "metadataItems", labels: "labels", configTitle: "configTitle", configSections: "configSections", configSectionsRow2: "configSectionsRow2", platform: "platform", isStepGroup: "isStepGroup", selectConfigOverrides: "selectConfigOverrides", isSaving: "isSaving", showApiMockingCard: "showApiMockingCard", apiMockingTitle: "apiMockingTitle", apiMockingStatusLabel: "apiMockingStatusLabel", apiMockingCaptureLabel: "apiMockingCaptureLabel", apiMockingRenewLabel: "apiMockingRenewLabel", apiMockingCaptureHint: "apiMockingCaptureHint", apiMockingRenewHint: "apiMockingRenewHint", apiMockingRestoreMock: "apiMockingRestoreMock", apiMockingStoreMock: "apiMockingStoreMock", apiMockingMockedApisCount: "apiMockingMockedApisCount", apiMockingTotalApisCount: "apiMockingTotalApisCount", apiMockingProgressPercent: "apiMockingProgressPercent", apiMockingShowProgress: "apiMockingShowProgress", apiMockingSummaryText: "apiMockingSummaryText", apiMockingPercentText: "apiMockingPercentText", apiMockingConfigureButtonLabel: "apiMockingConfigureButtonLabel", orgLevelTestCaseTimeout: "orgLevelTestCaseTimeout" }, outputs: { editDescription: "editDescription", cancel: "cancel", saveChanges: "saveChanges", metadataLinkClick: "metadataLinkClick", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange", labelAdded: "labelAdded", configureApiMocking: "configureApiMocking", apiMockingRestoreMockChange: "apiMockingRestoreMockChange", apiMockingStoreMockChange: "apiMockingStoreMockChange" }, usesOnChanges: true, ngImport: i0, template: "<!-- Edit mode: show edit form (Figma design) -->\n<cqa-test-case-details-edit\n *ngIf=\"isEditing\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [enableMarkdown]=\"enableMarkdown\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n [isStepGroup]=\"isStepGroup\"\n [isSaving]=\"isSaving\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n [showApiMockingCard]=\"showApiMockingCard\"\n [apiMockingTitle]=\"apiMockingTitle\"\n [apiMockingStatusLabel]=\"apiMockingStatusLabel\"\n [apiMockingCaptureLabel]=\"apiMockingCaptureLabel\"\n [apiMockingCaptureHint]=\"apiMockingCaptureHint\"\n [apiMockingRenewLabel]=\"apiMockingRenewLabel\"\n [apiMockingRenewHint]=\"apiMockingRenewHint\"\n [apiMockingRestoreMock]=\"apiMockingRestoreMock\"\n [apiMockingStoreMock]=\"apiMockingStoreMock\"\n [apiMockingMockedApisCount]=\"apiMockingMockedApisCount\"\n [apiMockingTotalApisCount]=\"apiMockingTotalApisCount\"\n [apiMockingProgressPercent]=\"apiMockingProgressPercent\"\n [apiMockingShowProgress]=\"apiMockingShowProgress\"\n [apiMockingSummaryText]=\"apiMockingSummaryText\"\n [apiMockingPercentText]=\"apiMockingPercentText\"\n [orgLevelTestCaseTimeout]=\"orgLevelTestCaseTimeout\"\n (save)=\"onSaveChanges($event)\"\n (cancel)=\"onCancelEdit()\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (labelAdded)=\"labelAdded.emit($event)\"\n (apiMockingRestoreMockChange)=\"apiMockingRestoreMockChange.emit($event)\"\n (apiMockingStoreMockChange)=\"apiMockingStoreMockChange.emit($event)\"\n (configureApiMocking)=\"configureApiMocking.emit()\">\n</cqa-test-case-details-edit>\n\n<!-- View mode: read-only details -->\n<div *ngIf=\"!isEditing\" class=\"cqa-self-stretch cqa-py-4 cqa-px-0 cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <!-- Description Section -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-between cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <button\n *ngIf=\"showEditButton\"\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-rounded !cqa-border !cqa-border-solid !cqa-border-[#D1D5DB] cqa-text-[#6B7280] cqa-text-xs cqa-font-semibold cqa-cursor-pointer cqa-transition-all hover:cqa-text-[#374151] hover:!cqa-border-[#9CA3AF] hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onEditClick()\">\n <mat-icon class=\"!cqa-w-[14px] !cqa-h-[14px] !cqa-text-[14px]\">edit</mat-icon>\n <span>Edit</span>\n </button>\n </div>\n <div *ngIf=\"descriptionContent\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-1\">\n <div\n *ngIf=\"enableMarkdown\"\n class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-prose cqa-prose-sm cqa-max-w-none\"\n [style]=\"(!descriptionExpanded && showDescriptionReadMore) ? 'display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;' : ''\"\n [innerHTML]=\"descriptionContent\"></div>\n <div\n *ngIf=\"!enableMarkdown\"\n class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal\"\n [style]=\"(!descriptionExpanded && showDescriptionReadMore) ? 'display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;' : ''\">{{ descriptionContent }}</div>\n <button\n *ngIf=\"showDescriptionReadMore\"\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-xs cqa-font-medium hover:cqa-underline cqa-cursor-pointer cqa-bg-transparent cqa-border-none cqa-p-0 cqa-self-start focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"toggleDescriptionExpand()\">\n {{ descriptionExpanded ? 'Read less' : 'Read more' }}\n </button>\n </div>\n </div>\n\n <!-- Metadata Section -->\n <div *ngIf=\"filteredMetadataItems.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-2 cqa-gap-x-0 cqa-gap-y-4\">\n <ng-container *ngFor=\"let item of filteredMetadataItems; trackBy: trackByMetadataLabel\">\n <div class=\"cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-0.5\">\n <div class=\"cqa-text-[#6B7280] cqa-text-xs cqa-leading-[15px] cqa-font-medium\">{{ item.label }}</div>\n <div\n class=\"cqa-flex cqa-justify-start cqa-items-center cqa-gap-[5px] cqa-min-w-0 cqa-w-full cqa-text-left cqa-text-[#0A0A0A] cqa-border cqa-border-[#F5F5F5]\">\n <mat-icon *ngIf=\"item.icon && (!item.iconLibrary || item.iconLibrary === 'mat')\" class=\"cqa-text-[#6B7280] cqa-text-sm cqa-w-4 cqa-h-4\">\n {{ item.icon }}\n </mat-icon>\n <span *ngIf=\"item.statusColor\" class=\"cqa-w-[10px] cqa-h-[10px] cqa-rounded-full cqa-flex-shrink-0\" [ngClass]=\"getStatusDotClass(item)\"></span>\n <a\n *ngIf=\"item.link\"\n href=\"javascript:void(0)\"\n class=\"cqa-text-[#2563EB] cqa-text-xs cqa-leading-[12px] cqa-font-normal hover:cqa-underline cqa-cursor-pointer cqa-block cqa-truncate cqa-min-w-0\"\n (click)=\"onMetadataLinkClick(item); $event.preventDefault()\">\n {{ item.value }}\n </a>\n <span *ngIf=\"!item.link\" class=\"cqa-text-xs cqa-leading-[12px] cqa-font-normal cqa-align-middle\" [ngClass]=\"getValueTextClass(item)\">\n {{ item.value }}\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Labels (Figma: Labels title, cqa-badge chips with tag icon) -->\n <div *ngIf=\"labels.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2 cqa-text-sm cqa-leading-[19.6px]\">\n <span class=\"cqa-text-[#111827] cqa-text-sm cqa-font-medium cqa-leading-5\">Labels</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <cqa-badge\n *ngFor=\"let label of labels\"\n [label]=\"label\"\n icon=\"label\"\n variant=\"outline\"\n size=\"small\"\n backgroundColor=\"#ffffff\"\n textColor=\"#475569\"\n borderColor=\"#E2E8F0\"\n iconColor=\"#94A3B8\">\n </cqa-badge>\n </div>\n </div>\n\n <!-- Configuration Section -->\n <div *ngIf=\"configSections.length || configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-start cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ configTitle }}</span>\n </div>\n </div>\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-1 cqa-gap-2.5\">\n <ng-container *ngFor=\"let section of configSections; trackBy: trackByConfigTitle\">\n <cqa-configuration-card\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </ng-container>\n </div>\n <div *ngIf=\"configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <cqa-configuration-card\n *ngFor=\"let section of configSectionsRow2; trackBy: trackByConfigTitle\"\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </div>\n </div>\n <!-- API Mocking Card (read-only) -->\n <cqa-api-mocking-card\n *ngIf=\"showApiMockingCard\"\n style=\"width: 100%;\"\n [title]=\"apiMockingTitle\"\n [statusLabel]=\"apiMockingStatusLabel\"\n [captureLabel]=\"apiMockingCaptureLabel\"\n [renewLabel]=\"apiMockingRenewLabel\"\n [restoreMock]=\"apiMockingRestoreMock\"\n [storeMock]=\"apiMockingStoreMock\"\n [mockedApisCount]=\"apiMockingMockedApisCount\"\n [totalApisCount]=\"apiMockingTotalApisCount\"\n [progressPercent]=\"apiMockingProgressPercent\"\n [showProgress]=\"apiMockingShowProgress\"\n [summaryText]=\"apiMockingSummaryText\"\n [percentText]=\"apiMockingPercentText\"\n [configureButtonLabel]=\"apiMockingConfigureButtonLabel\"\n [editing]=\"false\"\n (configure)=\"configureApiMocking.emit()\">\n </cqa-api-mocking-card>\n </div>\n </div>\n</div>\n", components: [{ type: i1.TestCaseDetailsEditComponent, selector: "cqa-test-case-details-edit", inputs: ["descriptionTitle", "descriptionContent", "enableMarkdown", "metadataItems", "labels", "configTitle", "configSections", "configSectionsRow2", "isSaving", "prerequisiteCaseOptions", "platform", "isStepGroup", "selectConfigOverrides", "showApiMockingCard", "apiMockingTitle", "apiMockingStatusLabel", "apiMockingCaptureLabel", "apiMockingCaptureHint", "apiMockingRenewLabel", "apiMockingRenewHint", "apiMockingRestoreMock", "apiMockingStoreMock", "apiMockingMockedApisCount", "apiMockingTotalApisCount", "apiMockingProgressPercent", "apiMockingShowProgress", "apiMockingSummaryText", "apiMockingPercentText", "orgLevelTestCaseTimeout"], outputs: ["save", "cancel", "selectSearch", "selectLoadMore", "selectOpened", "selectionChange", "labelAdded", "apiMockingRestoreMockChange", "apiMockingStoreMockChange", "configureApiMocking"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i4.ConfigurationCardComponent, selector: "cqa-configuration-card", inputs: ["icon", "title", "data"] }, { type: i5.ApiMockingCardComponent, selector: "cqa-api-mocking-card", inputs: ["title", "statusLabel", "captureLabel", "captureHint", "renewLabel", "renewHint", "restoreMock", "storeMock", "mockedApisCount", "totalApisCount", "progressPercent", "summaryText", "percentText", "configureButtonLabel", "editing", "showProgress", "noDataHint"], outputs: ["configure", "restoreMockChange", "storeMockChange"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
180
+ TestCaseDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseDetailsComponent, selector: "cqa-test-case-details", inputs: { editing: "editing", startInEditMode: "startInEditMode", descriptionTitle: "descriptionTitle", descriptionContent: "descriptionContent", enableMarkdown: "enableMarkdown", showEditButton: "showEditButton", metadataItems: "metadataItems", labels: "labels", configTitle: "configTitle", configSections: "configSections", configSectionsRow2: "configSectionsRow2", platform: "platform", isStepGroup: "isStepGroup", selectConfigOverrides: "selectConfigOverrides", isSaving: "isSaving", showApiMockingCard: "showApiMockingCard", apiMockingTitle: "apiMockingTitle", apiMockingStatusLabel: "apiMockingStatusLabel", apiMockingCaptureLabel: "apiMockingCaptureLabel", apiMockingRenewLabel: "apiMockingRenewLabel", apiMockingCaptureHint: "apiMockingCaptureHint", apiMockingRenewHint: "apiMockingRenewHint", apiMockingRestoreMock: "apiMockingRestoreMock", apiMockingStoreMock: "apiMockingStoreMock", apiMockingMockedApisCount: "apiMockingMockedApisCount", apiMockingTotalApisCount: "apiMockingTotalApisCount", apiMockingProgressPercent: "apiMockingProgressPercent", apiMockingShowProgress: "apiMockingShowProgress", apiMockingSummaryText: "apiMockingSummaryText", apiMockingPercentText: "apiMockingPercentText", apiMockingConfigureButtonLabel: "apiMockingConfigureButtonLabel", orgLevelTestCaseTimeout: "orgLevelTestCaseTimeout", viewportCategoryOptions: "viewportCategoryOptions" }, outputs: { editDescription: "editDescription", cancel: "cancel", saveChanges: "saveChanges", metadataLinkClick: "metadataLinkClick", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange", labelAdded: "labelAdded", configureApiMocking: "configureApiMocking", apiMockingRestoreMockChange: "apiMockingRestoreMockChange", apiMockingStoreMockChange: "apiMockingStoreMockChange" }, usesOnChanges: true, ngImport: i0, template: "<!-- Edit mode: show edit form (Figma design) -->\n<cqa-test-case-details-edit\n *ngIf=\"isEditing\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [enableMarkdown]=\"enableMarkdown\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n [isStepGroup]=\"isStepGroup\"\n [isSaving]=\"isSaving\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n [showApiMockingCard]=\"showApiMockingCard\"\n [apiMockingTitle]=\"apiMockingTitle\"\n [apiMockingStatusLabel]=\"apiMockingStatusLabel\"\n [apiMockingCaptureLabel]=\"apiMockingCaptureLabel\"\n [apiMockingCaptureHint]=\"apiMockingCaptureHint\"\n [apiMockingRenewLabel]=\"apiMockingRenewLabel\"\n [apiMockingRenewHint]=\"apiMockingRenewHint\"\n [apiMockingRestoreMock]=\"apiMockingRestoreMock\"\n [apiMockingStoreMock]=\"apiMockingStoreMock\"\n [apiMockingMockedApisCount]=\"apiMockingMockedApisCount\"\n [apiMockingTotalApisCount]=\"apiMockingTotalApisCount\"\n [apiMockingProgressPercent]=\"apiMockingProgressPercent\"\n [apiMockingShowProgress]=\"apiMockingShowProgress\"\n [apiMockingSummaryText]=\"apiMockingSummaryText\"\n [apiMockingPercentText]=\"apiMockingPercentText\"\n [orgLevelTestCaseTimeout]=\"orgLevelTestCaseTimeout\"\n [viewportCategoryOptions]=\"viewportCategoryOptions\"\n (save)=\"onSaveChanges($event)\"\n (cancel)=\"onCancelEdit()\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (labelAdded)=\"labelAdded.emit($event)\"\n (apiMockingRestoreMockChange)=\"apiMockingRestoreMockChange.emit($event)\"\n (apiMockingStoreMockChange)=\"apiMockingStoreMockChange.emit($event)\"\n (configureApiMocking)=\"configureApiMocking.emit()\">\n</cqa-test-case-details-edit>\n\n<!-- View mode: read-only details -->\n<div *ngIf=\"!isEditing\" class=\"cqa-self-stretch cqa-py-4 cqa-px-0 cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <!-- Description Section -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-between cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <button\n *ngIf=\"showEditButton\"\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-rounded !cqa-border !cqa-border-solid !cqa-border-[#D1D5DB] cqa-text-[#6B7280] cqa-text-xs cqa-font-semibold cqa-cursor-pointer cqa-transition-all hover:cqa-text-[#374151] hover:!cqa-border-[#9CA3AF] hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onEditClick()\">\n <mat-icon class=\"!cqa-w-[14px] !cqa-h-[14px] !cqa-text-[14px]\">edit</mat-icon>\n <span>Edit</span>\n </button>\n </div>\n <div *ngIf=\"descriptionContent\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-1\">\n <div\n *ngIf=\"enableMarkdown\"\n class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-prose cqa-prose-sm cqa-max-w-none\"\n [style]=\"(!descriptionExpanded && showDescriptionReadMore) ? 'display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;' : ''\"\n [innerHTML]=\"descriptionContent\"></div>\n <div\n *ngIf=\"!enableMarkdown\"\n class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal\"\n [style]=\"(!descriptionExpanded && showDescriptionReadMore) ? 'display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;' : ''\">{{ descriptionContent }}</div>\n <button\n *ngIf=\"showDescriptionReadMore\"\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-xs cqa-font-medium hover:cqa-underline cqa-cursor-pointer cqa-bg-transparent cqa-border-none cqa-p-0 cqa-self-start focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"toggleDescriptionExpand()\">\n {{ descriptionExpanded ? 'Read less' : 'Read more' }}\n </button>\n </div>\n </div>\n\n <!-- Metadata Section -->\n <div *ngIf=\"filteredMetadataItems.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-2 cqa-gap-x-0 cqa-gap-y-4\">\n <ng-container *ngFor=\"let item of filteredMetadataItems; trackBy: trackByMetadataLabel\">\n <div class=\"cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-0.5\">\n <div class=\"cqa-text-[#6B7280] cqa-text-xs cqa-leading-[15px] cqa-font-medium\">{{ item.label }}</div>\n <div\n class=\"cqa-flex cqa-justify-start cqa-items-center cqa-gap-[5px] cqa-min-w-0 cqa-w-full cqa-text-left cqa-text-[#0A0A0A] cqa-border cqa-border-[#F5F5F5]\">\n <mat-icon *ngIf=\"item.icon && (!item.iconLibrary || item.iconLibrary === 'mat')\" class=\"cqa-text-[#6B7280] cqa-text-sm cqa-w-4 cqa-h-4\">\n {{ item.icon }}\n </mat-icon>\n <span *ngIf=\"item.statusColor\" class=\"cqa-w-[10px] cqa-h-[10px] cqa-rounded-full cqa-flex-shrink-0\" [ngClass]=\"getStatusDotClass(item)\"></span>\n <a\n *ngIf=\"item.link\"\n href=\"javascript:void(0)\"\n class=\"cqa-text-[#2563EB] cqa-text-xs cqa-leading-[12px] cqa-font-normal hover:cqa-underline cqa-cursor-pointer cqa-block cqa-truncate cqa-min-w-0\"\n (click)=\"onMetadataLinkClick(item); $event.preventDefault()\">\n {{ item.value }}\n </a>\n <span *ngIf=\"!item.link\" class=\"cqa-text-xs cqa-leading-[12px] cqa-font-normal cqa-align-middle\" [ngClass]=\"getValueTextClass(item)\">\n {{ item.value }}\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Labels (Figma: Labels title, cqa-badge chips with tag icon) -->\n <div *ngIf=\"labels.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2 cqa-text-sm cqa-leading-[19.6px]\">\n <span class=\"cqa-text-[#111827] cqa-text-sm cqa-font-medium cqa-leading-5\">Labels</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <cqa-badge\n *ngFor=\"let label of labels\"\n [label]=\"label\"\n icon=\"label\"\n variant=\"outline\"\n size=\"small\"\n backgroundColor=\"#ffffff\"\n textColor=\"#475569\"\n borderColor=\"#E2E8F0\"\n iconColor=\"#94A3B8\">\n </cqa-badge>\n </div>\n </div>\n\n <!-- Configuration Section -->\n <div *ngIf=\"configSections.length || configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-start cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ configTitle }}</span>\n </div>\n </div>\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-1 cqa-gap-2.5\">\n <ng-container *ngFor=\"let section of configSections; trackBy: trackByConfigTitle\">\n <cqa-configuration-card\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </ng-container>\n </div>\n <div *ngIf=\"configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <cqa-configuration-card\n *ngFor=\"let section of configSectionsRow2; trackBy: trackByConfigTitle\"\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </div>\n </div>\n <!-- API Mocking Card (read-only) -->\n <cqa-api-mocking-card\n *ngIf=\"showApiMockingCard\"\n style=\"width: 100%;\"\n [title]=\"apiMockingTitle\"\n [statusLabel]=\"apiMockingStatusLabel\"\n [captureLabel]=\"apiMockingCaptureLabel\"\n [renewLabel]=\"apiMockingRenewLabel\"\n [restoreMock]=\"apiMockingRestoreMock\"\n [storeMock]=\"apiMockingStoreMock\"\n [mockedApisCount]=\"apiMockingMockedApisCount\"\n [totalApisCount]=\"apiMockingTotalApisCount\"\n [progressPercent]=\"apiMockingProgressPercent\"\n [showProgress]=\"apiMockingShowProgress\"\n [summaryText]=\"apiMockingSummaryText\"\n [percentText]=\"apiMockingPercentText\"\n [configureButtonLabel]=\"apiMockingConfigureButtonLabel\"\n [editing]=\"false\"\n (configure)=\"configureApiMocking.emit()\">\n </cqa-api-mocking-card>\n </div>\n </div>\n</div>\n", components: [{ type: i1.TestCaseDetailsEditComponent, selector: "cqa-test-case-details-edit", inputs: ["descriptionTitle", "descriptionContent", "enableMarkdown", "metadataItems", "labels", "configTitle", "configSections", "configSectionsRow2", "isSaving", "prerequisiteCaseOptions", "platform", "isStepGroup", "selectConfigOverrides", "showApiMockingCard", "apiMockingTitle", "apiMockingStatusLabel", "apiMockingCaptureLabel", "apiMockingCaptureHint", "apiMockingRenewLabel", "apiMockingRenewHint", "apiMockingRestoreMock", "apiMockingStoreMock", "apiMockingMockedApisCount", "apiMockingTotalApisCount", "apiMockingProgressPercent", "apiMockingShowProgress", "apiMockingSummaryText", "apiMockingPercentText", "orgLevelTestCaseTimeout", "viewportCategoryOptions"], outputs: ["save", "cancel", "selectSearch", "selectLoadMore", "selectOpened", "selectionChange", "labelAdded", "apiMockingRestoreMockChange", "apiMockingStoreMockChange", "configureApiMocking"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i4.ConfigurationCardComponent, selector: "cqa-configuration-card", inputs: ["icon", "title", "data"] }, { type: i5.ApiMockingCardComponent, selector: "cqa-api-mocking-card", inputs: ["title", "statusLabel", "captureLabel", "captureHint", "renewLabel", "renewHint", "restoreMock", "storeMock", "mockedApisCount", "totalApisCount", "progressPercent", "summaryText", "percentText", "configureButtonLabel", "editing", "showProgress", "noDataHint"], outputs: ["configure", "restoreMockChange", "storeMockChange"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
179
181
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsComponent, decorators: [{
180
182
  type: Component,
181
- args: [{ selector: 'cqa-test-case-details', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Edit mode: show edit form (Figma design) -->\n<cqa-test-case-details-edit\n *ngIf=\"isEditing\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [enableMarkdown]=\"enableMarkdown\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n [isStepGroup]=\"isStepGroup\"\n [isSaving]=\"isSaving\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n [showApiMockingCard]=\"showApiMockingCard\"\n [apiMockingTitle]=\"apiMockingTitle\"\n [apiMockingStatusLabel]=\"apiMockingStatusLabel\"\n [apiMockingCaptureLabel]=\"apiMockingCaptureLabel\"\n [apiMockingCaptureHint]=\"apiMockingCaptureHint\"\n [apiMockingRenewLabel]=\"apiMockingRenewLabel\"\n [apiMockingRenewHint]=\"apiMockingRenewHint\"\n [apiMockingRestoreMock]=\"apiMockingRestoreMock\"\n [apiMockingStoreMock]=\"apiMockingStoreMock\"\n [apiMockingMockedApisCount]=\"apiMockingMockedApisCount\"\n [apiMockingTotalApisCount]=\"apiMockingTotalApisCount\"\n [apiMockingProgressPercent]=\"apiMockingProgressPercent\"\n [apiMockingShowProgress]=\"apiMockingShowProgress\"\n [apiMockingSummaryText]=\"apiMockingSummaryText\"\n [apiMockingPercentText]=\"apiMockingPercentText\"\n [orgLevelTestCaseTimeout]=\"orgLevelTestCaseTimeout\"\n (save)=\"onSaveChanges($event)\"\n (cancel)=\"onCancelEdit()\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (labelAdded)=\"labelAdded.emit($event)\"\n (apiMockingRestoreMockChange)=\"apiMockingRestoreMockChange.emit($event)\"\n (apiMockingStoreMockChange)=\"apiMockingStoreMockChange.emit($event)\"\n (configureApiMocking)=\"configureApiMocking.emit()\">\n</cqa-test-case-details-edit>\n\n<!-- View mode: read-only details -->\n<div *ngIf=\"!isEditing\" class=\"cqa-self-stretch cqa-py-4 cqa-px-0 cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <!-- Description Section -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-between cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <button\n *ngIf=\"showEditButton\"\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-rounded !cqa-border !cqa-border-solid !cqa-border-[#D1D5DB] cqa-text-[#6B7280] cqa-text-xs cqa-font-semibold cqa-cursor-pointer cqa-transition-all hover:cqa-text-[#374151] hover:!cqa-border-[#9CA3AF] hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onEditClick()\">\n <mat-icon class=\"!cqa-w-[14px] !cqa-h-[14px] !cqa-text-[14px]\">edit</mat-icon>\n <span>Edit</span>\n </button>\n </div>\n <div *ngIf=\"descriptionContent\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-1\">\n <div\n *ngIf=\"enableMarkdown\"\n class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-prose cqa-prose-sm cqa-max-w-none\"\n [style]=\"(!descriptionExpanded && showDescriptionReadMore) ? 'display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;' : ''\"\n [innerHTML]=\"descriptionContent\"></div>\n <div\n *ngIf=\"!enableMarkdown\"\n class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal\"\n [style]=\"(!descriptionExpanded && showDescriptionReadMore) ? 'display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;' : ''\">{{ descriptionContent }}</div>\n <button\n *ngIf=\"showDescriptionReadMore\"\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-xs cqa-font-medium hover:cqa-underline cqa-cursor-pointer cqa-bg-transparent cqa-border-none cqa-p-0 cqa-self-start focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"toggleDescriptionExpand()\">\n {{ descriptionExpanded ? 'Read less' : 'Read more' }}\n </button>\n </div>\n </div>\n\n <!-- Metadata Section -->\n <div *ngIf=\"filteredMetadataItems.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-2 cqa-gap-x-0 cqa-gap-y-4\">\n <ng-container *ngFor=\"let item of filteredMetadataItems; trackBy: trackByMetadataLabel\">\n <div class=\"cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-0.5\">\n <div class=\"cqa-text-[#6B7280] cqa-text-xs cqa-leading-[15px] cqa-font-medium\">{{ item.label }}</div>\n <div\n class=\"cqa-flex cqa-justify-start cqa-items-center cqa-gap-[5px] cqa-min-w-0 cqa-w-full cqa-text-left cqa-text-[#0A0A0A] cqa-border cqa-border-[#F5F5F5]\">\n <mat-icon *ngIf=\"item.icon && (!item.iconLibrary || item.iconLibrary === 'mat')\" class=\"cqa-text-[#6B7280] cqa-text-sm cqa-w-4 cqa-h-4\">\n {{ item.icon }}\n </mat-icon>\n <span *ngIf=\"item.statusColor\" class=\"cqa-w-[10px] cqa-h-[10px] cqa-rounded-full cqa-flex-shrink-0\" [ngClass]=\"getStatusDotClass(item)\"></span>\n <a\n *ngIf=\"item.link\"\n href=\"javascript:void(0)\"\n class=\"cqa-text-[#2563EB] cqa-text-xs cqa-leading-[12px] cqa-font-normal hover:cqa-underline cqa-cursor-pointer cqa-block cqa-truncate cqa-min-w-0\"\n (click)=\"onMetadataLinkClick(item); $event.preventDefault()\">\n {{ item.value }}\n </a>\n <span *ngIf=\"!item.link\" class=\"cqa-text-xs cqa-leading-[12px] cqa-font-normal cqa-align-middle\" [ngClass]=\"getValueTextClass(item)\">\n {{ item.value }}\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Labels (Figma: Labels title, cqa-badge chips with tag icon) -->\n <div *ngIf=\"labels.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2 cqa-text-sm cqa-leading-[19.6px]\">\n <span class=\"cqa-text-[#111827] cqa-text-sm cqa-font-medium cqa-leading-5\">Labels</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <cqa-badge\n *ngFor=\"let label of labels\"\n [label]=\"label\"\n icon=\"label\"\n variant=\"outline\"\n size=\"small\"\n backgroundColor=\"#ffffff\"\n textColor=\"#475569\"\n borderColor=\"#E2E8F0\"\n iconColor=\"#94A3B8\">\n </cqa-badge>\n </div>\n </div>\n\n <!-- Configuration Section -->\n <div *ngIf=\"configSections.length || configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-start cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ configTitle }}</span>\n </div>\n </div>\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-1 cqa-gap-2.5\">\n <ng-container *ngFor=\"let section of configSections; trackBy: trackByConfigTitle\">\n <cqa-configuration-card\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </ng-container>\n </div>\n <div *ngIf=\"configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <cqa-configuration-card\n *ngFor=\"let section of configSectionsRow2; trackBy: trackByConfigTitle\"\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </div>\n </div>\n <!-- API Mocking Card (read-only) -->\n <cqa-api-mocking-card\n *ngIf=\"showApiMockingCard\"\n style=\"width: 100%;\"\n [title]=\"apiMockingTitle\"\n [statusLabel]=\"apiMockingStatusLabel\"\n [captureLabel]=\"apiMockingCaptureLabel\"\n [renewLabel]=\"apiMockingRenewLabel\"\n [restoreMock]=\"apiMockingRestoreMock\"\n [storeMock]=\"apiMockingStoreMock\"\n [mockedApisCount]=\"apiMockingMockedApisCount\"\n [totalApisCount]=\"apiMockingTotalApisCount\"\n [progressPercent]=\"apiMockingProgressPercent\"\n [showProgress]=\"apiMockingShowProgress\"\n [summaryText]=\"apiMockingSummaryText\"\n [percentText]=\"apiMockingPercentText\"\n [configureButtonLabel]=\"apiMockingConfigureButtonLabel\"\n [editing]=\"false\"\n (configure)=\"configureApiMocking.emit()\">\n </cqa-api-mocking-card>\n </div>\n </div>\n</div>\n", styles: [] }]
183
+ args: [{ selector: 'cqa-test-case-details', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Edit mode: show edit form (Figma design) -->\n<cqa-test-case-details-edit\n *ngIf=\"isEditing\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [enableMarkdown]=\"enableMarkdown\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n [isStepGroup]=\"isStepGroup\"\n [isSaving]=\"isSaving\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n [showApiMockingCard]=\"showApiMockingCard\"\n [apiMockingTitle]=\"apiMockingTitle\"\n [apiMockingStatusLabel]=\"apiMockingStatusLabel\"\n [apiMockingCaptureLabel]=\"apiMockingCaptureLabel\"\n [apiMockingCaptureHint]=\"apiMockingCaptureHint\"\n [apiMockingRenewLabel]=\"apiMockingRenewLabel\"\n [apiMockingRenewHint]=\"apiMockingRenewHint\"\n [apiMockingRestoreMock]=\"apiMockingRestoreMock\"\n [apiMockingStoreMock]=\"apiMockingStoreMock\"\n [apiMockingMockedApisCount]=\"apiMockingMockedApisCount\"\n [apiMockingTotalApisCount]=\"apiMockingTotalApisCount\"\n [apiMockingProgressPercent]=\"apiMockingProgressPercent\"\n [apiMockingShowProgress]=\"apiMockingShowProgress\"\n [apiMockingSummaryText]=\"apiMockingSummaryText\"\n [apiMockingPercentText]=\"apiMockingPercentText\"\n [orgLevelTestCaseTimeout]=\"orgLevelTestCaseTimeout\"\n [viewportCategoryOptions]=\"viewportCategoryOptions\"\n (save)=\"onSaveChanges($event)\"\n (cancel)=\"onCancelEdit()\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (labelAdded)=\"labelAdded.emit($event)\"\n (apiMockingRestoreMockChange)=\"apiMockingRestoreMockChange.emit($event)\"\n (apiMockingStoreMockChange)=\"apiMockingStoreMockChange.emit($event)\"\n (configureApiMocking)=\"configureApiMocking.emit()\">\n</cqa-test-case-details-edit>\n\n<!-- View mode: read-only details -->\n<div *ngIf=\"!isEditing\" class=\"cqa-self-stretch cqa-py-4 cqa-px-0 cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <!-- Description Section -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-between cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <button\n *ngIf=\"showEditButton\"\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-rounded !cqa-border !cqa-border-solid !cqa-border-[#D1D5DB] cqa-text-[#6B7280] cqa-text-xs cqa-font-semibold cqa-cursor-pointer cqa-transition-all hover:cqa-text-[#374151] hover:!cqa-border-[#9CA3AF] hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onEditClick()\">\n <mat-icon class=\"!cqa-w-[14px] !cqa-h-[14px] !cqa-text-[14px]\">edit</mat-icon>\n <span>Edit</span>\n </button>\n </div>\n <div *ngIf=\"descriptionContent\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-1\">\n <div\n *ngIf=\"enableMarkdown\"\n class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-prose cqa-prose-sm cqa-max-w-none\"\n [style]=\"(!descriptionExpanded && showDescriptionReadMore) ? 'display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;' : ''\"\n [innerHTML]=\"descriptionContent\"></div>\n <div\n *ngIf=\"!enableMarkdown\"\n class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal\"\n [style]=\"(!descriptionExpanded && showDescriptionReadMore) ? 'display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;' : ''\">{{ descriptionContent }}</div>\n <button\n *ngIf=\"showDescriptionReadMore\"\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-xs cqa-font-medium hover:cqa-underline cqa-cursor-pointer cqa-bg-transparent cqa-border-none cqa-p-0 cqa-self-start focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"toggleDescriptionExpand()\">\n {{ descriptionExpanded ? 'Read less' : 'Read more' }}\n </button>\n </div>\n </div>\n\n <!-- Metadata Section -->\n <div *ngIf=\"filteredMetadataItems.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-2 cqa-gap-x-0 cqa-gap-y-4\">\n <ng-container *ngFor=\"let item of filteredMetadataItems; trackBy: trackByMetadataLabel\">\n <div class=\"cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-0.5\">\n <div class=\"cqa-text-[#6B7280] cqa-text-xs cqa-leading-[15px] cqa-font-medium\">{{ item.label }}</div>\n <div\n class=\"cqa-flex cqa-justify-start cqa-items-center cqa-gap-[5px] cqa-min-w-0 cqa-w-full cqa-text-left cqa-text-[#0A0A0A] cqa-border cqa-border-[#F5F5F5]\">\n <mat-icon *ngIf=\"item.icon && (!item.iconLibrary || item.iconLibrary === 'mat')\" class=\"cqa-text-[#6B7280] cqa-text-sm cqa-w-4 cqa-h-4\">\n {{ item.icon }}\n </mat-icon>\n <span *ngIf=\"item.statusColor\" class=\"cqa-w-[10px] cqa-h-[10px] cqa-rounded-full cqa-flex-shrink-0\" [ngClass]=\"getStatusDotClass(item)\"></span>\n <a\n *ngIf=\"item.link\"\n href=\"javascript:void(0)\"\n class=\"cqa-text-[#2563EB] cqa-text-xs cqa-leading-[12px] cqa-font-normal hover:cqa-underline cqa-cursor-pointer cqa-block cqa-truncate cqa-min-w-0\"\n (click)=\"onMetadataLinkClick(item); $event.preventDefault()\">\n {{ item.value }}\n </a>\n <span *ngIf=\"!item.link\" class=\"cqa-text-xs cqa-leading-[12px] cqa-font-normal cqa-align-middle\" [ngClass]=\"getValueTextClass(item)\">\n {{ item.value }}\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Labels (Figma: Labels title, cqa-badge chips with tag icon) -->\n <div *ngIf=\"labels.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2 cqa-text-sm cqa-leading-[19.6px]\">\n <span class=\"cqa-text-[#111827] cqa-text-sm cqa-font-medium cqa-leading-5\">Labels</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <cqa-badge\n *ngFor=\"let label of labels\"\n [label]=\"label\"\n icon=\"label\"\n variant=\"outline\"\n size=\"small\"\n backgroundColor=\"#ffffff\"\n textColor=\"#475569\"\n borderColor=\"#E2E8F0\"\n iconColor=\"#94A3B8\">\n </cqa-badge>\n </div>\n </div>\n\n <!-- Configuration Section -->\n <div *ngIf=\"configSections.length || configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-start cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ configTitle }}</span>\n </div>\n </div>\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-1 cqa-gap-2.5\">\n <ng-container *ngFor=\"let section of configSections; trackBy: trackByConfigTitle\">\n <cqa-configuration-card\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </ng-container>\n </div>\n <div *ngIf=\"configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <cqa-configuration-card\n *ngFor=\"let section of configSectionsRow2; trackBy: trackByConfigTitle\"\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </div>\n </div>\n <!-- API Mocking Card (read-only) -->\n <cqa-api-mocking-card\n *ngIf=\"showApiMockingCard\"\n style=\"width: 100%;\"\n [title]=\"apiMockingTitle\"\n [statusLabel]=\"apiMockingStatusLabel\"\n [captureLabel]=\"apiMockingCaptureLabel\"\n [renewLabel]=\"apiMockingRenewLabel\"\n [restoreMock]=\"apiMockingRestoreMock\"\n [storeMock]=\"apiMockingStoreMock\"\n [mockedApisCount]=\"apiMockingMockedApisCount\"\n [totalApisCount]=\"apiMockingTotalApisCount\"\n [progressPercent]=\"apiMockingProgressPercent\"\n [showProgress]=\"apiMockingShowProgress\"\n [summaryText]=\"apiMockingSummaryText\"\n [percentText]=\"apiMockingPercentText\"\n [configureButtonLabel]=\"apiMockingConfigureButtonLabel\"\n [editing]=\"false\"\n (configure)=\"configureApiMocking.emit()\">\n </cqa-api-mocking-card>\n </div>\n </div>\n</div>\n", styles: [] }]
182
184
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { editing: [{
183
185
  type: Input
184
186
  }], startInEditMode: [{
@@ -243,6 +245,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
243
245
  type: Input
244
246
  }], orgLevelTestCaseTimeout: [{
245
247
  type: Input
248
+ }], viewportCategoryOptions: [{
249
+ type: Input
246
250
  }], editDescription: [{
247
251
  type: Output
248
252
  }], cancel: [{
@@ -268,4 +272,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
268
272
  }], apiMockingStoreMockChange: [{
269
273
  type: Output
270
274
  }] } });
271
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYXNlLWRldGFpbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy90ZXN0LWNhc2UtZGV0YWlscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osdUJBQXVCLEdBS3hCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQWdCdkIsTUFBTSxPQUFPLHdCQUF3QjtJQWVuQyxZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQWQxQywyREFBMkQ7UUFDbkQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUt6Qiw0REFBNEQ7UUFDbkQsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFvQmpDLGdDQUFnQztRQUN2QixxQkFBZ0IsR0FBRyxhQUFhLENBQUM7UUFFMUMsK0JBQStCO1FBQ3RCLHVCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUVqQyxzRkFBc0Y7UUFDN0UsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFaEMsZ0VBQWdFO1FBQ3ZELG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBRWhDLDZGQUE2RjtRQUNwRixrQkFBYSxHQUFrQyxFQUFFLENBQUM7UUFFM0QscURBQXFEO1FBQzVDLFdBQU0sR0FBYSxFQUFFLENBQUM7UUFFL0Isa0NBQWtDO1FBQ3pCLGdCQUFXLEdBQUcsZUFBZSxDQUFDO1FBRXZDLGdFQUFnRTtRQUN2RCxtQkFBYyxHQUFtQyxFQUFFLENBQUM7UUFFN0QsMEZBQTBGO1FBQ2pGLHVCQUFrQixHQUFtQyxFQUFFLENBQUM7UUFDakUsdUZBQXVGO1FBQzlFLGFBQVEsR0FBcUIsS0FBSyxDQUFDO1FB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LEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyw4QkFBOEI7c0JBQXRDLEtBQUs7Z0JBR0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQW9DSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUVHLDJCQUEyQjtzQkFBcEMsTUFBTTtnQkFFRyx5QkFBeUI7c0JBQWxDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBPbkluaXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uLFxuICBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW0sXG59IGZyb20gJy4vdGVzdC1jYXNlLWRldGFpbHMubW9kZWxzJztcbmltcG9ydCB7XG4gIFRlc3RDYXNlRGV0YWlsc0VkaXRGb3JtRGF0YSxcbiAgU2VsZWN0Q29uZmlnT3ZlcnJpZGVzLFxufSBmcm9tICcuL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtdGVzdC1jYXNlLWRldGFpbHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVzdC1jYXNlLWRldGFpbHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdENhc2VEZXRhaWxzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKiogSW50ZXJuYWwgZWRpdGluZyBzdGF0ZSB3aGVuIG5vdCBjb250cm9sbGVkIGJ5IHBhcmVudCAqL1xuICBwcml2YXRlIF9lZGl0aW5nID0gZmFsc2U7XG5cbiAgLyoqIFdoZW4gcHJvdmlkZWQgYnkgcGFyZW50LCB1c2UgdGhpcyBpbnN0ZWFkIG9mIGludGVybmFsIHN0YXRlIChmaXhlcyBTdG9yeWJvb2sgZXZlbnQgZmxvdykuICovXG4gIEBJbnB1dCgpIGVkaXRpbmc/OiBib29sZWFuO1xuXG4gIC8qKiBXaGVuIHRydWUsIHN0YXJ0IGluIGVkaXQgbW9kZSAodXNlZnVsIGZvciBTdG9yeWJvb2spLiAqL1xuICBASW5wdXQoKSBzdGFydEluRWRpdE1vZGUgPSBmYWxzZTtcblxuICAvKiogUmVzb2x2ZWQgZWRpdGluZyBzdGF0ZTogcGFyZW50LWNvbnRyb2xsZWQgb3IgaW50ZXJuYWwgKi9cbiAgZ2V0IGlzRWRpdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0aW5nICE9PSB1bmRlZmluZWQgPyB0aGlzLmVkaXRpbmcgOiB0aGlzLl9lZGl0aW5nO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXJ0SW5FZGl0TW9kZSkge1xuICAgICAgdGhpcy5fZWRpdGluZyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydkZXNjcmlwdGlvbkNvbnRlbnQnXSkge1xuICAgICAgdGhpcy5kZXNjcmlwdGlvbkV4cGFuZGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIC8qKiBEZXNjcmlwdGlvbiBzZWN0aW9uIHRpdGxlICovXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uVGl0bGUgPSAnRGVzY3JpcHRpb24nO1xuXG4gIC8qKiBEZXNjcmlwdGlvbiB0ZXh0IGNvbnRlbnQgKi9cbiAgQElucHV0KCkgZGVzY3JpcHRpb25Db250ZW50ID0gJyc7XG5cbiAgLyoqIFdoZW4gdHJ1ZSwgZGVzY3JpcHRpb24gc3VwcG9ydHMgcmljaCB0ZXh0IChIVE1MKS4gUmVuZGVycyBhcyBIVE1MIGluIHZpZXcgbW9kZS4gKi9cbiAgQElucHV0KCkgZW5hYmxlTWFya2Rvd24gPSBmYWxzZTtcblxuICAvKiogV2hldGhlciB0byBzaG93IHRoZSBFZGl0IGJ1dHRvbiBpbiB0aGUgRGVzY3JpcHRpb24gaGVhZGVyICovXG4gIEBJbnB1dCgpIHNob3dFZGl0QnV0dG9uID0gZmFsc2U7XG5cbiAgLyoqIE1ldGFkYXRhIGl0ZW1zIChjcmVhdGVkT24sIHN0YXR1cywgcHJpb3JpdHksIGVudmlyb25tZW50LCB2ZXJzaW9uLCB0ZXN0UGxhbk5hbWUsIGV0Yy4pICovXG4gIEBJbnB1dCgpIG1ldGFkYXRhSXRlbXM6IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbVtdID0gW107XG5cbiAgLyoqIExhYmVscy90YWdzIChlLmcuIEF1dG9tYXRpb24sIEFQSSwgU0RLLCBVSS9VWCkgKi9cbiAgQElucHV0KCkgbGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKiBDb25maWd1cmF0aW9uIHNlY3Rpb24gdGl0bGUgKi9cbiAgQElucHV0KCkgY29uZmlnVGl0bGUgPSAnQ29uZmlndXJhdGlvbic7XG5cbiAgLyoqIENvbmZpZ3VyYXRpb24gc2VjdGlvbnMgKGUuZy4gRXhlY3V0aW9uLCBBSSBDb25maWd1cmF0aW9uKSAqL1xuICBASW5wdXQoKSBjb25maWdTZWN0aW9uczogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdID0gW107XG5cbiAgLyoqIE9wdGlvbmFsIGNvbmZpZyBzZWN0aW9ucyBkaXNwbGF5ZWQgaW4gYSAyLWNvbHVtbiByb3cgKGUuZy4gV2FpdHMgJiBSZXRyaWVzLCBEZXZpY2UpICovXG4gIEBJbnB1dCgpIGNvbmZpZ1NlY3Rpb25zUm93MjogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdID0gW107XG4gIC8qKiBQbGF0Zm9ybTogJ3dlYicgb3IgJ21vYmlsZScuIERlZmF1bHRzIHRvICd3ZWInLiBVc2VkIGZvciBEZXZpY2UgU2V0dGluZ3MgZmllbGRzLiAqL1xuICBASW5wdXQoKSBwbGF0Zm9ybTogJ3dlYicgfCAnbW9iaWxlJyA9ICd3ZWInO1xuXG4gIC8qKiBXaGVuIHRydWUsIGZpbHRlcnMgb3V0IFByaW9yaXR5IGFuZCBUeXBlIGZyb20gbWV0YWRhdGEgKHN0ZXAgZ3JvdXBzIGRvbid0IGhhdmUgdGhlc2UpLiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgQElucHV0KCkgaXNTdGVwR3JvdXAgPSBmYWxzZTtcblxuICAvKiogT3ZlcnJpZGUgY29uZmlnIHBlciBzZWxlY3QgZm9yIEFQSS1kcml2ZW4gb3B0aW9ucywgc2VydmVyIHNlYXJjaCwgbG9hZCBtb3JlLiAqL1xuICBASW5wdXQoKSBzZWxlY3RDb25maWdPdmVycmlkZXM6IFNlbGVjdENvbmZpZ092ZXJyaWRlcyA9IHt9O1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgc2F2aW5nIGNoYW5nZXMuICovXG4gIEBJbnB1dCgpIGlzU2F2aW5nID0gZmFsc2U7XG5cbiAgLy8g4pSA4pSAIEFQSSBNb2NraW5nIGNhcmQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8qKiBXaGVuIHRydWUsIHJlbmRlciB0aGUgQVBJIE1vY2tpbmcgY2FyZCBiZWxvdyB0aGUgY29uZmlndXJhdGlvbiBzZWN0aW9uLiAqL1xuICBASW5wdXQoKSBzaG93QXBpTW9ja2luZ0NhcmQgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBpTW9ja2luZ1RpdGxlID0gJ0FQSSBNb2NraW5nJztcbiAgQElucHV0KCkgYXBpTW9ja2luZ1N0YXR1c0xhYmVsID0gJ05vdCBjb25maWd1cmVkJztcbiAgQElucHV0KCkgYXBpTW9ja2luZ0NhcHR1cmVMYWJlbCA9ICdVc2UgbW9jayBBUEkgcmVzcG9uc2VzJztcbiAgQElucHV0KCkgYXBpTW9ja2luZ1JlbmV3TGFiZWwgPSAnUmVuZXcgYW5kIHN0b3JlIEFQSSByZXNwb25zZXMnO1xuICBASW5wdXQoKSBhcGlNb2NraW5nQ2FwdHVyZUhpbnQgPSAnVXNlcyBzdG9yZWQgcmVzcG9uc2VzIG9uIG5leHQgcnVuLiBUdXJuIG9uIGFmdGVyIGNhcHR1cmUgY29tcGxldGVzLic7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdSZW5ld0hpbnQgPSAnUmUtY2FwdHVyZXMgZnJlc2ggcmVzcG9uc2VzIG9uIG5leHQgcnVuLiBUdXJucyBvZmYgVXNlIG1vY2suJztcbiAgLyoqXG4gICAqIFNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBBUEkgbW9ja2luZyBjYXJkJ3MgZHVhbCB0b2dnbGUgc3RhdGUuXG4gICAqICAgdHJ1ZSAg4oaSIFJlbmV3IEFQSSByZXNwb25zZXMgT04sICBDYXB0dXJlIEFQSSByZXNwb25zZXMgT0ZGXG4gICAqICAgZmFsc2Ug4oaSIFJlbmV3IEFQSSByZXNwb25zZXMgT0ZGLCBDYXB0dXJlIEFQSSByZXNwb25zZXMgT05cbiAgICogVGhlIHR3byBsZWdhY3kgYCpDYXB0dXJlRW5hYmxlZGAgLyBgKlJlbmV3RW5hYmxlZGAgaW5wdXRzIGFyZSBubyBsb25nZXIgdXNlZC5cbiAgICovXG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdSZXN0b3JlTW9jayA9IGZhbHNlO1xuICAvKiogXCJSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlc1wiIOKAlCBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgYXBpTW9ja2luZ1Jlc3RvcmVNb2NrYCB3aGVuIHRydWUuICovXG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdTdG9yZU1vY2sgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBpTW9ja2luZ01vY2tlZEFwaXNDb3VudCA9IDA7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdUb3RhbEFwaXNDb3VudCA9IDA7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdQcm9ncmVzc1BlcmNlbnQgPSAwO1xuICAvKiogRm9yd2FyZGVkIHRvIGBjcWEtYXBpLW1vY2tpbmctY2FyZGAg4oCUIGdhdGVzIHRoZSBcIk1vY2tlZCAvIHByb2dyZXNzIC8gcGVyY2VudFwiIGJsb2NrLiAqL1xuICBASW5wdXQoKSBhcGlNb2NraW5nU2hvd1Byb2dyZXNzID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdTdW1tYXJ5VGV4dD86IHN0cmluZztcbiAgQElucHV0KCkgYXBpTW9ja2luZ1BlcmNlbnRUZXh0Pzogc3RyaW5nO1xuICBASW5wdXQoKSBhcGlNb2NraW5nQ29uZmlndXJlQnV0dG9uTGFiZWwgPSAnQ29uZmlndXJlJztcblxuICAvKiogT3JnLWxldmVsIGRlZmF1bHQgZm9yIFRlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKS4gRm9yd2FyZGVkIHRvIGVkaXQgbW9kZSB0byB0b2dnbGUgdGhlIFwiT1JHIGxldmVsXCIvXCJDdXN0b21cIiBiYWRnZS4gKi9cbiAgQElucHV0KCkgb3JnTGV2ZWxUZXN0Q2FzZVRpbWVvdXQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsO1xuXG4gIC8qKiBMYWJlbHMgdG8gZmlsdGVyIG91dCBmcm9tIG1ldGFkYXRhIGZvciBzdGVwIGdyb3VwcyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN0ZXBHcm91cEV4Y2x1ZGVkTWV0YWRhdGFMYWJlbHMgPSBbJ3ByaW9yaXR5JywgJ3R5cGUnXTtcblxuICAvKiogV2hlbiB0cnVlLCBkZXNjcmlwdGlvbiAodmlldyBtb2RlKSBpcyBleHBhbmRlZDsgd2hlbiBmYWxzZSwgY2xhbXBlZCB0byA0IGxpbmVzIHdpdGggUmVhZCBtb3JlICovXG4gIGRlc2NyaXB0aW9uRXhwYW5kZWQgPSBmYWxzZTtcblxuICAvKiogUm91Z2hseSA0IGxpbmVzIG9mIHRleHQ7IHNob3cgUmVhZCBtb3JlIHdoZW4gZGVzY3JpcHRpb24gZXhjZWVkcyB0aGlzICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzY3JpcHRpb25SZWFkTW9yZVRocmVzaG9sZCA9IDI4MDtcblxuICBnZXQgc2hvd0Rlc2NyaXB0aW9uUmVhZE1vcmUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmF3ID0gdGhpcy5kZXNjcmlwdGlvbkNvbnRlbnQgPz8gJyc7XG4gICAgY29uc3QgdGV4dCA9IHRoaXMuZW5hYmxlTWFya2Rvd24gPyByYXcucmVwbGFjZSgvPFtePl0qPi9nLCAnICcpLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCkgOiByYXc7XG4gICAgaWYgKHRleHQubGVuZ3RoID4gdGhpcy5kZXNjcmlwdGlvblJlYWRNb3JlVGhyZXNob2xkKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBbHNvIHNob3cgd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIDQgbGluZXMgKG5ld2xpbmVzIG9yIDxicj4pXG4gICAgY29uc3Qgd2l0aEJyQXNOZXdsaW5lID0gcmF3LnJlcGxhY2UoLzxiclxccypcXC8/Pi9naSwgJ1xcbicpO1xuICAgIGNvbnN0IGxpbmVDb3VudCA9IHdpdGhCckFzTmV3bGluZS5zcGxpdCgvXFxyP1xcbi8pLmxlbmd0aDtcbiAgICByZXR1cm4gbGluZUNvdW50ID4gNDtcbiAgfVxuXG4gIHRvZ2dsZURlc2NyaXB0aW9uRXhwYW5kKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzY3JpcHRpb25FeHBhbmRlZCA9ICF0aGlzLmRlc2NyaXB0aW9uRXhwYW5kZWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogRmlsdGVyZWQgbWV0YWRhdGEgaXRlbXMgLSBleGNsdWRlcyBQcmlvcml0eSBhbmQgVHlwZSBmb3Igc3RlcCBncm91cHMgKi9cbiAgZ2V0IGZpbHRlcmVkTWV0YWRhdGFJdGVtcygpOiBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW1bXSB7XG4gICAgaWYgKCF0aGlzLmlzU3RlcEdyb3VwKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiAhdGhpcy5zdGVwR3JvdXBFeGNsdWRlZE1ldGFkYXRhTGFiZWxzLmluY2x1ZGVzKGl0ZW0ubGFiZWw/LnRvTG93ZXJDYXNlKCkgPz8gJycpXG4gICAgKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBlZGl0RGVzY3JpcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzYXZlQ2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhPigpO1xuICBAT3V0cHV0KCkgbWV0YWRhdGFMaW5rQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0TG9hZE1vcmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdE9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZyB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9PigpO1xuICBAT3V0cHV0KCkgbGFiZWxBZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgY29uZmlndXJlQXBpTW9ja2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEZpcmVkIHdoZW4gdGhlIHVzZXIgZmxpcHMgdGhlIFVzZS1tb2NrIHRvZ2dsZSDigJQgZW1pdHMgdGhlIG5ldyBgcmVzdG9yZU1vY2tgIHZhbHVlLiAqL1xuICBAT3V0cHV0KCkgYXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAvKiogRmlyZWQgd2hlbiB0aGUgdXNlciBmbGlwcyB0aGUgUmVuZXctYW5kLXN0b3JlIHRvZ2dsZSDigJQgZW1pdHMgdGhlIG5ldyBgc3RvcmVNb2NrYCB2YWx1ZS4gKi9cbiAgQE91dHB1dCgpIGFwaU1vY2tpbmdTdG9yZU1vY2tDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgb25FZGl0Q2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWRpdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9lZGl0aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgdGhpcy5lZGl0RGVzY3JpcHRpb24uZW1pdCgpO1xuICB9XG5cbiAgb25TYXZlQ2hhbmdlcyhkYXRhOiBUZXN0Q2FzZURldGFpbHNFZGl0Rm9ybURhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZGl0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2VkaXRpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuc2F2ZUNoYW5nZXMuZW1pdChkYXRhKTtcbiAgfVxuXG4gIG9uQ2FuY2VsRWRpdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgaWYgKHRoaXMuZWRpdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9lZGl0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHRyYWNrQnlDb25maWdUaXRsZShfaTogbnVtYmVyLCBzZWN0aW9uOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2VjdGlvbi50aXRsZTtcbiAgfVxuXG4gIHRyYWNrQnlNZXRhZGF0YUxhYmVsKF9pOiBudW1iZXIsIGl0ZW06IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0ubGFiZWw7XG4gIH1cblxuXG4gIG9uTWV0YWRhdGFMaW5rQ2xpY2soaXRlbTogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtKTogdm9pZCB7XG4gICAgaWYgKGl0ZW0ubGluaykge1xuICAgICAgdGhpcy5tZXRhZGF0YUxpbmtDbGljay5lbWl0KGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXR1c0RvdENsYXNzKGl0ZW06IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSk6IHN0cmluZyB7XG4gICAgaWYgKCFpdGVtLnN0YXR1c0NvbG9yKSByZXR1cm4gJyc7XG4gICAgc3dpdGNoIChpdGVtLnN0YXR1c0NvbG9yKSB7XG4gICAgICBjYXNlICd5ZWxsb3cnOlxuICAgICAgICByZXR1cm4gJ2NxYS1iZy1bI0VBQjMwOF0nO1xuICAgICAgY2FzZSAncmVkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtYmctWyNEQzI2MjZdJztcbiAgICAgIGNhc2UgJ2dyZWVuJzpcbiAgICAgICAgcmV0dXJuICdjcWEtYmctWyMxNkEzNEFdJztcbiAgICAgIGNhc2UgJ2dyYXknOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdjcWEtYmctWyM5NEEzQjhdJztcbiAgICB9XG4gIH1cblxuICAvKiogVGV4dCBjb2xvciBmb3IgbWV0YWRhdGEgdmFsdWUgKGUuZy4gcmVkIGZvciBjcml0aWNhbCBwcmlvcml0eSkgKi9cbiAgZ2V0VmFsdWVUZXh0Q2xhc3MoaXRlbTogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtKTogc3RyaW5nIHtcbiAgICBpZiAoaXRlbS5zdGF0dXNDb2xvciA9PT0gJ3JlZCcpIHtcbiAgICAgIHJldHVybiAnY3FhLXRleHQtWyNEQzI2MjZdJztcbiAgICB9XG4gICAgcmV0dXJuICdjcWEtdGV4dC1bIzExMTgyN10nO1xuICB9XG59XG4iLCI8IS0tIEVkaXQgbW9kZTogc2hvdyBlZGl0IGZvcm0gKEZpZ21hIGRlc2lnbikgLS0+XG48Y3FhLXRlc3QtY2FzZS1kZXRhaWxzLWVkaXRcbiAgKm5nSWY9XCJpc0VkaXRpbmdcIlxuICBbZGVzY3JpcHRpb25UaXRsZV09XCJkZXNjcmlwdGlvblRpdGxlXCJcbiAgW2Rlc2NyaXB0aW9uQ29udGVudF09XCJkZXNjcmlwdGlvbkNvbnRlbnRcIlxuICBbZW5hYmxlTWFya2Rvd25dPVwiZW5hYmxlTWFya2Rvd25cIlxuICBbbWV0YWRhdGFJdGVtc109XCJtZXRhZGF0YUl0ZW1zXCJcbiAgW2xhYmVsc109XCJsYWJlbHNcIlxuICBbY29uZmlnVGl0bGVdPVwiY29uZmlnVGl0bGVcIlxuICBbY29uZmlnU2VjdGlvbnNdPVwiY29uZmlnU2VjdGlvbnNcIlxuICBbY29uZmlnU2VjdGlvbnNSb3cyXT1cImNvbmZpZ1NlY3Rpb25zUm93MlwiXG4gIFtwbGF0Zm9ybV09XCJwbGF0Zm9ybVwiXG4gIFtpc1N0ZXBHcm91cF09XCJpc1N0ZXBHcm91cFwiXG4gIFtpc1NhdmluZ109XCJpc1NhdmluZ1wiXG4gIFtzZWxlY3RDb25maWdPdmVycmlkZXNdPVwic2VsZWN0Q29uZmlnT3ZlcnJpZGVzXCJcbiAgW3Nob3dBcGlNb2NraW5nQ2FyZF09XCJzaG93QXBpTW9ja2luZ0NhcmRcIlxuICBbYXBpTW9ja2luZ1RpdGxlXT1cImFwaU1vY2tpbmdUaXRsZVwiXG4gIFthcGlNb2NraW5nU3RhdHVzTGFiZWxdPVwiYXBpTW9ja2luZ1N0YXR1c0xhYmVsXCJcbiAgW2FwaU1vY2tpbmdDYXB0dXJlTGFiZWxdPVwiYXBpTW9ja2luZ0NhcHR1cmVMYWJlbFwiXG4gIFthcGlNb2NraW5nQ2FwdHVyZUhpbnRdPVwiYXBpTW9ja2luZ0NhcHR1cmVIaW50XCJcbiAgW2FwaU1vY2tpbmdSZW5ld0xhYmVsXT1cImFwaU1vY2tpbmdSZW5ld0xhYmVsXCJcbiAgW2FwaU1vY2tpbmdSZW5ld0hpbnRdPVwiYXBpTW9ja2luZ1JlbmV3SGludFwiXG4gIFthcGlNb2NraW5nUmVzdG9yZU1vY2tdPVwiYXBpTW9ja2luZ1Jlc3RvcmVNb2NrXCJcbiAgW2FwaU1vY2tpbmdTdG9yZU1vY2tdPVwiYXBpTW9ja2luZ1N0b3JlTW9ja1wiXG4gIFthcGlNb2NraW5nTW9ja2VkQXBpc0NvdW50XT1cImFwaU1vY2tpbmdNb2NrZWRBcGlzQ291bnRcIlxuICBbYXBpTW9ja2luZ1RvdGFsQXBpc0NvdW50XT1cImFwaU1vY2tpbmdUb3RhbEFwaXNDb3VudFwiXG4gIFthcGlNb2NraW5nUHJvZ3Jlc3NQZXJjZW50XT1cImFwaU1vY2tpbmdQcm9ncmVzc1BlcmNlbnRcIlxuICBbYXBpTW9ja2luZ1Nob3dQcm9ncmVzc109XCJhcGlNb2NraW5nU2hvd1Byb2dyZXNzXCJcbiAgW2FwaU1vY2tpbmdTdW1tYXJ5VGV4dF09XCJhcGlNb2NraW5nU3VtbWFyeVRleHRcIlxuICBbYXBpTW9ja2luZ1BlcmNlbnRUZXh0XT1cImFwaU1vY2tpbmdQZXJjZW50VGV4dFwiXG4gIFtvcmdMZXZlbFRlc3RDYXNlVGltZW91dF09XCJvcmdMZXZlbFRlc3RDYXNlVGltZW91dFwiXG4gIChzYXZlKT1cIm9uU2F2ZUNoYW5nZXMoJGV2ZW50KVwiXG4gIChjYW5jZWwpPVwib25DYW5jZWxFZGl0KClcIlxuICAoc2VsZWN0U2VhcmNoKT1cInNlbGVjdFNlYXJjaC5lbWl0KCRldmVudClcIlxuICAoc2VsZWN0TG9hZE1vcmUpPVwic2VsZWN0TG9hZE1vcmUuZW1pdCgkZXZlbnQpXCJcbiAgKHNlbGVjdE9wZW5lZCk9XCJzZWxlY3RPcGVuZWQuZW1pdCgkZXZlbnQpXCJcbiAgKHNlbGVjdGlvbkNoYW5nZSk9XCJzZWxlY3Rpb25DaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgKGxhYmVsQWRkZWQpPVwibGFiZWxBZGRlZC5lbWl0KCRldmVudClcIlxuICAoYXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlKT1cImFwaU1vY2tpbmdSZXN0b3JlTW9ja0NoYW5nZS5lbWl0KCRldmVudClcIlxuICAoYXBpTW9ja2luZ1N0b3JlTW9ja0NoYW5nZSk9XCJhcGlNb2NraW5nU3RvcmVNb2NrQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gIChjb25maWd1cmVBcGlNb2NraW5nKT1cImNvbmZpZ3VyZUFwaU1vY2tpbmcuZW1pdCgpXCI+XG48L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1lZGl0PlxuXG48IS0tIFZpZXcgbW9kZTogcmVhZC1vbmx5IGRldGFpbHMgLS0+XG48ZGl2ICpuZ0lmPVwiIWlzRWRpdGluZ1wiIGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtcHktNCBjcWEtcHgtMCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtNCBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XVwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtNCBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XVwiPlxuICAgIDwhLS0gRGVzY3JpcHRpb24gU2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtMi41XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPmRlc2NyaXB0aW9uPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTkuNnB4XVwiPnt7IGRlc2NyaXB0aW9uVGl0bGUgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93RWRpdEJ1dHRvblwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtcHgtMi41IGNxYS1weS0xIGNxYS1yb3VuZGVkICFjcWEtYm9yZGVyICFjcWEtYm9yZGVyLXNvbGlkICFjcWEtYm9yZGVyLVsjRDFENURCXSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQteHMgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWFsbCBob3ZlcjpjcWEtdGV4dC1bIzM3NDE1MV0gaG92ZXI6IWNxYS1ib3JkZXItWyM5Q0EzQUZdIGhvdmVyOmNxYS1iZy1bI0Y5RkFGQl0gZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLTIgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1bIzNGNDNFRV0gZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1vZmZzZXQtMlwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdENsaWNrKClcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctWzE0cHhdICFjcWEtaC1bMTRweF0gIWNxYS10ZXh0LVsxNHB4XVwiPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICAgIDxzcGFuPkVkaXQ8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZGVzY3JpcHRpb25Db250ZW50XCIgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtc3RhcnQgY3FhLWdhcC0xXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cImVuYWJsZU1hcmtkb3duXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLXRleHQtWyMxMTE4MjddIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtcHJvc2UgY3FhLXByb3NlLXNtIGNxYS1tYXgtdy1ub25lXCJcbiAgICAgICAgICBbc3R5bGVdPVwiKCFkZXNjcmlwdGlvbkV4cGFuZGVkICYmIHNob3dEZXNjcmlwdGlvblJlYWRNb3JlKSA/ICdkaXNwbGF5OiAtd2Via2l0LWJveDsgLXdlYmtpdC1saW5lLWNsYW1wOiA0OyBsaW5lLWNsYW1wOiA0OyAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsOyBvdmVyZmxvdzogaGlkZGVuOycgOiAnJ1wiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJkZXNjcmlwdGlvbkNvbnRlbnRcIj48L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwiIWVuYWJsZU1hcmtkb3duXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLXRleHQtWyMxMTE4MjddIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW5vcm1hbFwiXG4gICAgICAgICAgW3N0eWxlXT1cIighZGVzY3JpcHRpb25FeHBhbmRlZCAmJiBzaG93RGVzY3JpcHRpb25SZWFkTW9yZSkgPyAnZGlzcGxheTogLXdlYmtpdC1ib3g7IC13ZWJraXQtbGluZS1jbGFtcDogNDsgbGluZS1jbGFtcDogNDsgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDsgb3ZlcmZsb3c6IGhpZGRlbjsnIDogJydcIj57eyBkZXNjcmlwdGlvbkNvbnRlbnQgfX08L2Rpdj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd0Rlc2NyaXB0aW9uUmVhZE1vcmVcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bSBob3ZlcjpjcWEtdW5kZXJsaW5lIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLXNlbGYtc3RhcnQgZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLTIgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1bIzNGNDNFRV0gZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1vZmZzZXQtMlwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURlc2NyaXB0aW9uRXhwYW5kKClcIj5cbiAgICAgICAgICB7eyBkZXNjcmlwdGlvbkV4cGFuZGVkID8gJ1JlYWQgbGVzcycgOiAnUmVhZCBtb3JlJyB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBNZXRhZGF0YSBTZWN0aW9uIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJlZE1ldGFkYXRhSXRlbXMubGVuZ3RoXCIgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtc3RhcnQgY3FhLWdhcC0yLjVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1ncmlkIGNxYS1ncmlkLWNvbHMtMiBjcWEtZ2FwLXgtMCBjcWEtZ2FwLXktNFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkTWV0YWRhdGFJdGVtczsgdHJhY2tCeTogdHJhY2tCeU1ldGFkYXRhTGFiZWxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1pdGVtcy1zdGFydCBjcWEtZ2FwLTAuNVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC14cyBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtXCI+e3sgaXRlbS5sYWJlbCB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bNXB4XSBjcWEtbWluLXctMCBjcWEtdy1mdWxsIGNxYS10ZXh0LWxlZnQgY3FhLXRleHQtWyMwQTBBMEFdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0Y1RjVGNV1cIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiaXRlbS5pY29uICYmICghaXRlbS5pY29uTGlicmFyeSB8fCBpdGVtLmljb25MaWJyYXJ5ID09PSAnbWF0JylcIiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1zbSBjcWEtdy00IGNxYS1oLTRcIj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLmljb24gfX1cbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtLnN0YXR1c0NvbG9yXCIgY2xhc3M9XCJjcWEtdy1bMTBweF0gY3FhLWgtWzEwcHhdIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWZsZXgtc2hyaW5rLTBcIiBbbmdDbGFzc109XCJnZXRTdGF0dXNEb3RDbGFzcyhpdGVtKVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0ubGlua1wiXG4gICAgICAgICAgICAgICAgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzI1NjNFQl0gY3FhLXRleHQteHMgY3FhLWxlYWRpbmctWzEycHhdIGNxYS1mb250LW5vcm1hbCBob3ZlcjpjcWEtdW5kZXJsaW5lIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtYmxvY2sgY3FhLXRydW5jYXRlIGNxYS1taW4tdy0wXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25NZXRhZGF0YUxpbmtDbGljayhpdGVtKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLnZhbHVlIH19XG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXRlbS5saW5rXCIgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS1hbGlnbi1taWRkbGVcIiBbbmdDbGFzc109XCJnZXRWYWx1ZVRleHRDbGFzcyhpdGVtKVwiPlxuICAgICAgICAgICAgICAgIHt7IGl0ZW0udmFsdWUgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIExhYmVscyAoRmlnbWE6IExhYmVscyB0aXRsZSwgY3FhLWJhZGdlIGNoaXBzIHdpdGggdGFnIGljb24pIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJsYWJlbHMubGVuZ3RoXCIgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtc3RhcnQgY3FhLWdhcC0yIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMTExODI3XSBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLWxlYWRpbmctNVwiPkxhYmVsczwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC13cmFwIGNxYS1nYXAtMlwiPlxuICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGxhYmVsIG9mIGxhYmVsc1wiXG4gICAgICAgICAgW2xhYmVsXT1cImxhYmVsXCJcbiAgICAgICAgICBpY29uPVwibGFiZWxcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lXCJcbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcj1cIiNmZmZmZmZcIlxuICAgICAgICAgIHRleHRDb2xvcj1cIiM0NzU1NjlcIlxuICAgICAgICAgIGJvcmRlckNvbG9yPVwiI0UyRThGMFwiXG4gICAgICAgICAgaWNvbkNvbG9yPVwiIzk0QTNCOFwiPlxuICAgICAgICA8L2NxYS1iYWRnZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDb25maWd1cmF0aW9uIFNlY3Rpb24gLS0+XG4gICAgPGRpdiAqbmdJZj1cImNvbmZpZ1NlY3Rpb25zLmxlbmd0aCB8fCBjb25maWdTZWN0aW9uc1JvdzIubGVuZ3RoXCIgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtc3RhcnQgY3FhLWdhcC0yLjVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPnNldHRpbmdzPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTkuNnB4XVwiPnt7IGNvbmZpZ1RpdGxlIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1pdGVtcy1zdGFydCBjcWEtZ2FwLTIuNVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtZ3JpZCBjcWEtZ3JpZC1jb2xzLTEgY3FhLWdhcC0yLjVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZWN0aW9uIG9mIGNvbmZpZ1NlY3Rpb25zOyB0cmFja0J5OiB0cmFja0J5Q29uZmlnVGl0bGVcIj5cbiAgICAgICAgICAgIDxjcWEtY29uZmlndXJhdGlvbi1jYXJkXG4gICAgICAgICAgICAgIFtpY29uXT1cInNlY3Rpb24uaWNvbiB8fCAndHVuZSdcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwic2VjdGlvbi50aXRsZVwiXG4gICAgICAgICAgICAgIFtkYXRhXT1cInNlY3Rpb24uaXRlbXNcIj5cbiAgICAgICAgICAgIDwvY3FhLWNvbmZpZ3VyYXRpb24tY2FyZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJjb25maWdTZWN0aW9uc1JvdzIubGVuZ3RoXCIgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTQgY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF1cIj5cbiAgICAgICAgICA8Y3FhLWNvbmZpZ3VyYXRpb24tY2FyZFxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHNlY3Rpb24gb2YgY29uZmlnU2VjdGlvbnNSb3cyOyB0cmFja0J5OiB0cmFja0J5Q29uZmlnVGl0bGVcIlxuICAgICAgICAgICAgW2ljb25dPVwic2VjdGlvbi5pY29uIHx8ICd0dW5lJ1wiXG4gICAgICAgICAgICBbdGl0bGVdPVwic2VjdGlvbi50aXRsZVwiXG4gICAgICAgICAgICBbZGF0YV09XCJzZWN0aW9uLml0ZW1zXCI+XG4gICAgICAgICAgPC9jcWEtY29uZmlndXJhdGlvbi1jYXJkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBBUEkgTW9ja2luZyBDYXJkIChyZWFkLW9ubHkpIC0tPlxuICAgICAgPGNxYS1hcGktbW9ja2luZy1jYXJkXG4gICAgICAgICpuZ0lmPVwic2hvd0FwaU1vY2tpbmdDYXJkXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIlxuICAgICAgICBbdGl0bGVdPVwiYXBpTW9ja2luZ1RpdGxlXCJcbiAgICAgICAgW3N0YXR1c0xhYmVsXT1cImFwaU1vY2tpbmdTdGF0dXNMYWJlbFwiXG4gICAgICAgIFtjYXB0dXJlTGFiZWxdPVwiYXBpTW9ja2luZ0NhcHR1cmVMYWJlbFwiXG4gICAgICAgIFtyZW5ld0xhYmVsXT1cImFwaU1vY2tpbmdSZW5ld0xhYmVsXCJcbiAgICAgICAgW3Jlc3RvcmVNb2NrXT1cImFwaU1vY2tpbmdSZXN0b3JlTW9ja1wiXG4gICAgICAgIFtzdG9yZU1vY2tdPVwiYXBpTW9ja2luZ1N0b3JlTW9ja1wiXG4gICAgICAgIFttb2NrZWRBcGlzQ291bnRdPVwiYXBpTW9ja2luZ01vY2tlZEFwaXNDb3VudFwiXG4gICAgICAgIFt0b3RhbEFwaXNDb3VudF09XCJhcGlNb2NraW5nVG90YWxBcGlzQ291bnRcIlxuICAgICAgICBbcHJvZ3Jlc3NQZXJjZW50XT1cImFwaU1vY2tpbmdQcm9ncmVzc1BlcmNlbnRcIlxuICAgICAgICBbc2hvd1Byb2dyZXNzXT1cImFwaU1vY2tpbmdTaG93UHJvZ3Jlc3NcIlxuICAgICAgICBbc3VtbWFyeVRleHRdPVwiYXBpTW9ja2luZ1N1bW1hcnlUZXh0XCJcbiAgICAgICAgW3BlcmNlbnRUZXh0XT1cImFwaU1vY2tpbmdQZXJjZW50VGV4dFwiXG4gICAgICAgIFtjb25maWd1cmVCdXR0b25MYWJlbF09XCJhcGlNb2NraW5nQ29uZmlndXJlQnV0dG9uTGFiZWxcIlxuICAgICAgICBbZWRpdGluZ109XCJmYWxzZVwiXG4gICAgICAgIChjb25maWd1cmUpPVwiY29uZmlndXJlQXBpTW9ja2luZy5lbWl0KClcIj5cbiAgICAgIDwvY3FhLWFwaS1tb2NraW5nLWNhcmQ+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
275
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYXNlLWRldGFpbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy90ZXN0LWNhc2UtZGV0YWlscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osdUJBQXVCLEdBS3hCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQWdCdkIsTUFBTSxPQUFPLHdCQUF3QjtJQWVuQyxZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQWQxQywyREFBMkQ7UUFDbkQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUt6Qiw0REFBNEQ7UUFDbkQsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFvQmpDLGdDQUFnQztRQUN2QixxQkFBZ0IsR0FBRyxhQUFhLENBQUM7UUFFMUMsK0JBQStCO1FBQ3RCLHVCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUVqQyxzRkFBc0Y7UUFDN0UsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFaEMsZ0VBQWdFO1FBQ3ZELG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBRWhDLDZGQUE2RjtRQUNwRixrQkFBYSxHQUFrQyxFQUFFLENBQUM7UUFFM0QscURBQXFEO1FBQzVDLFdBQU0sR0FBYSxFQUFFLENBQUM7UUFFL0Isa0NBQWtDO1FBQ3pCLGdCQUFXLEdBQUcsZUFBZSxDQUFDO1FBRXZDLGdFQUFnRTtRQUN2RCxtQkFBYyxHQUFtQyxFQUFFLENBQUM7UUFFN0QsMEZBQTBGO1FBQ2pGLHVCQUFrQixHQUFtQyxFQUFFLENBQUM7UUFDakUsdUZBQXVGO1FBQzlFLGFBQVEsR0FBcUIsS0FBSyxDQUFDO1FB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QUNHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFFRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyw4QkFBOEI7c0JBQXRDLEtBQUs7Z0JBR0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUdHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFvQ0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFFRywyQkFBMkI7c0JBQXBDLE1BQU07Z0JBRUcseUJBQXlCO3NCQUFsQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgT25Jbml0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbixcbiAgVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtLFxufSBmcm9tICcuL3Rlc3QtY2FzZS1kZXRhaWxzLm1vZGVscyc7XG5pbXBvcnQge1xuICBUZXN0Q2FzZURldGFpbHNFZGl0Rm9ybURhdGEsXG4gIFNlbGVjdENvbmZpZ092ZXJyaWRlcyxcbn0gZnJvbSAnLi90ZXN0LWNhc2UtZGV0YWlscy1lZGl0L3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXRlc3QtY2FzZS1kZXRhaWxzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rlc3QtY2FzZS1kZXRhaWxzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRlc3RDYXNlRGV0YWlsc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgLyoqIEludGVybmFsIGVkaXRpbmcgc3RhdGUgd2hlbiBub3QgY29udHJvbGxlZCBieSBwYXJlbnQgKi9cbiAgcHJpdmF0ZSBfZWRpdGluZyA9IGZhbHNlO1xuXG4gIC8qKiBXaGVuIHByb3ZpZGVkIGJ5IHBhcmVudCwgdXNlIHRoaXMgaW5zdGVhZCBvZiBpbnRlcm5hbCBzdGF0ZSAoZml4ZXMgU3Rvcnlib29rIGV2ZW50IGZsb3cpLiAqL1xuICBASW5wdXQoKSBlZGl0aW5nPzogYm9vbGVhbjtcblxuICAvKiogV2hlbiB0cnVlLCBzdGFydCBpbiBlZGl0IG1vZGUgKHVzZWZ1bCBmb3IgU3Rvcnlib29rKS4gKi9cbiAgQElucHV0KCkgc3RhcnRJbkVkaXRNb2RlID0gZmFsc2U7XG5cbiAgLyoqIFJlc29sdmVkIGVkaXRpbmcgc3RhdGU6IHBhcmVudC1jb250cm9sbGVkIG9yIGludGVybmFsICovXG4gIGdldCBpc0VkaXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGluZyAhPT0gdW5kZWZpbmVkID8gdGhpcy5lZGl0aW5nIDogdGhpcy5fZWRpdGluZztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGFydEluRWRpdE1vZGUpIHtcbiAgICAgIHRoaXMuX2VkaXRpbmcgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZGVzY3JpcHRpb25Db250ZW50J10pIHtcbiAgICAgIHRoaXMuZGVzY3JpcHRpb25FeHBhbmRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICAvKiogRGVzY3JpcHRpb24gc2VjdGlvbiB0aXRsZSAqL1xuICBASW5wdXQoKSBkZXNjcmlwdGlvblRpdGxlID0gJ0Rlc2NyaXB0aW9uJztcblxuICAvKiogRGVzY3JpcHRpb24gdGV4dCBjb250ZW50ICovXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uQ29udGVudCA9ICcnO1xuXG4gIC8qKiBXaGVuIHRydWUsIGRlc2NyaXB0aW9uIHN1cHBvcnRzIHJpY2ggdGV4dCAoSFRNTCkuIFJlbmRlcnMgYXMgSFRNTCBpbiB2aWV3IG1vZGUuICovXG4gIEBJbnB1dCgpIGVuYWJsZU1hcmtkb3duID0gZmFsc2U7XG5cbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgRWRpdCBidXR0b24gaW4gdGhlIERlc2NyaXB0aW9uIGhlYWRlciAqL1xuICBASW5wdXQoKSBzaG93RWRpdEJ1dHRvbiA9IGZhbHNlO1xuXG4gIC8qKiBNZXRhZGF0YSBpdGVtcyAoY3JlYXRlZE9uLCBzdGF0dXMsIHByaW9yaXR5LCBlbnZpcm9ubWVudCwgdmVyc2lvbiwgdGVzdFBsYW5OYW1lLCBldGMuKSAqL1xuICBASW5wdXQoKSBtZXRhZGF0YUl0ZW1zOiBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW1bXSA9IFtdO1xuXG4gIC8qKiBMYWJlbHMvdGFncyAoZS5nLiBBdXRvbWF0aW9uLCBBUEksIFNESywgVUkvVVgpICovXG4gIEBJbnB1dCgpIGxhYmVsczogc3RyaW5nW10gPSBbXTtcblxuICAvKiogQ29uZmlndXJhdGlvbiBzZWN0aW9uIHRpdGxlICovXG4gIEBJbnB1dCgpIGNvbmZpZ1RpdGxlID0gJ0NvbmZpZ3VyYXRpb24nO1xuXG4gIC8qKiBDb25maWd1cmF0aW9uIHNlY3Rpb25zIChlLmcuIEV4ZWN1dGlvbiwgQUkgQ29uZmlndXJhdGlvbikgKi9cbiAgQElucHV0KCkgY29uZmlnU2VjdGlvbnM6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSA9IFtdO1xuXG4gIC8qKiBPcHRpb25hbCBjb25maWcgc2VjdGlvbnMgZGlzcGxheWVkIGluIGEgMi1jb2x1bW4gcm93IChlLmcuIFdhaXRzICYgUmV0cmllcywgRGV2aWNlKSAqL1xuICBASW5wdXQoKSBjb25maWdTZWN0aW9uc1JvdzI6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSA9IFtdO1xuICAvKiogUGxhdGZvcm06ICd3ZWInIG9yICdtb2JpbGUnLiBEZWZhdWx0cyB0byAnd2ViJy4gVXNlZCBmb3IgRGV2aWNlIFNldHRpbmdzIGZpZWxkcy4gKi9cbiAgQElucHV0KCkgcGxhdGZvcm06ICd3ZWInIHwgJ21vYmlsZScgPSAnd2ViJztcblxuICAvKiogV2hlbiB0cnVlLCBmaWx0ZXJzIG91dCBQcmlvcml0eSBhbmQgVHlwZSBmcm9tIG1ldGFkYXRhIChzdGVwIGdyb3VwcyBkb24ndCBoYXZlIHRoZXNlKS4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIEBJbnB1dCgpIGlzU3RlcEdyb3VwID0gZmFsc2U7XG5cbiAgLyoqIE92ZXJyaWRlIGNvbmZpZyBwZXIgc2VsZWN0IGZvciBBUEktZHJpdmVuIG9wdGlvbnMsIHNlcnZlciBzZWFyY2gsIGxvYWQgbW9yZS4gKi9cbiAgQElucHV0KCkgc2VsZWN0Q29uZmlnT3ZlcnJpZGVzOiBTZWxlY3RDb25maWdPdmVycmlkZXMgPSB7fTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIHNhdmluZyBjaGFuZ2VzLiAqL1xuICBASW5wdXQoKSBpc1NhdmluZyA9IGZhbHNlO1xuXG4gIC8vIOKUgOKUgCBBUEkgTW9ja2luZyBjYXJkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvKiogV2hlbiB0cnVlLCByZW5kZXIgdGhlIEFQSSBNb2NraW5nIGNhcmQgYmVsb3cgdGhlIGNvbmZpZ3VyYXRpb24gc2VjdGlvbi4gKi9cbiAgQElucHV0KCkgc2hvd0FwaU1vY2tpbmdDYXJkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdUaXRsZSA9ICdBUEkgTW9ja2luZyc7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdTdGF0dXNMYWJlbCA9ICdOb3QgY29uZmlndXJlZCc7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdDYXB0dXJlTGFiZWwgPSAnVXNlIG1vY2sgQVBJIHJlc3BvbnNlcyc7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdSZW5ld0xhYmVsID0gJ1JlbmV3IGFuZCBzdG9yZSBBUEkgcmVzcG9uc2VzJztcbiAgQElucHV0KCkgYXBpTW9ja2luZ0NhcHR1cmVIaW50ID0gJ1VzZXMgc3RvcmVkIHJlc3BvbnNlcyBvbiBuZXh0IHJ1bi4gVHVybiBvbiBhZnRlciBjYXB0dXJlIGNvbXBsZXRlcy4nO1xuICBASW5wdXQoKSBhcGlNb2NraW5nUmVuZXdIaW50ID0gJ1JlLWNhcHR1cmVzIGZyZXNoIHJlc3BvbnNlcyBvbiBuZXh0IHJ1bi4gVHVybnMgb2ZmIFVzZSBtb2NrLic7XG4gIC8qKlxuICAgKiBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgQVBJIG1vY2tpbmcgY2FyZCdzIGR1YWwgdG9nZ2xlIHN0YXRlLlxuICAgKiAgIHRydWUgIOKGkiBSZW5ldyBBUEkgcmVzcG9uc2VzIE9OLCAgQ2FwdHVyZSBBUEkgcmVzcG9uc2VzIE9GRlxuICAgKiAgIGZhbHNlIOKGkiBSZW5ldyBBUEkgcmVzcG9uc2VzIE9GRiwgQ2FwdHVyZSBBUEkgcmVzcG9uc2VzIE9OXG4gICAqIFRoZSB0d28gbGVnYWN5IGAqQ2FwdHVyZUVuYWJsZWRgIC8gYCpSZW5ld0VuYWJsZWRgIGlucHV0cyBhcmUgbm8gbG9uZ2VyIHVzZWQuXG4gICAqL1xuICBASW5wdXQoKSBhcGlNb2NraW5nUmVzdG9yZU1vY2sgPSBmYWxzZTtcbiAgLyoqIFwiUmVuZXcgYW5kIHN0b3JlIEFQSSByZXNwb25zZXNcIiDigJQgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGFwaU1vY2tpbmdSZXN0b3JlTW9ja2Agd2hlbiB0cnVlLiAqL1xuICBASW5wdXQoKSBhcGlNb2NraW5nU3RvcmVNb2NrID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdNb2NrZWRBcGlzQ291bnQgPSAwO1xuICBASW5wdXQoKSBhcGlNb2NraW5nVG90YWxBcGlzQ291bnQgPSAwO1xuICBASW5wdXQoKSBhcGlNb2NraW5nUHJvZ3Jlc3NQZXJjZW50ID0gMDtcbiAgLyoqIEZvcndhcmRlZCB0byBgY3FhLWFwaS1tb2NraW5nLWNhcmRgIOKAlCBnYXRlcyB0aGUgXCJNb2NrZWQgLyBwcm9ncmVzcyAvIHBlcmNlbnRcIiBibG9jay4gKi9cbiAgQElucHV0KCkgYXBpTW9ja2luZ1Nob3dQcm9ncmVzcyA9IGZhbHNlO1xuICBASW5wdXQoKSBhcGlNb2NraW5nU3VtbWFyeVRleHQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdQZXJjZW50VGV4dD86IHN0cmluZztcbiAgQElucHV0KCkgYXBpTW9ja2luZ0NvbmZpZ3VyZUJ1dHRvbkxhYmVsID0gJ0NvbmZpZ3VyZSc7XG5cbiAgLyoqIE9yZy1sZXZlbCBkZWZhdWx0IGZvciBUZXN0IENhc2UgVGltZW91dCAobWludXRlcykuIEZvcndhcmRlZCB0byBlZGl0IG1vZGUgdG8gdG9nZ2xlIHRoZSBcIk9SRyBsZXZlbFwiL1wiQ3VzdG9tXCIgYmFkZ2UuICovXG4gIEBJbnB1dCgpIG9yZ0xldmVsVGVzdENhc2VUaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbDtcblxuICAvKiogVmlld3BvcnQgZHJvcGRvd24gb3B0aW9ucyBwZXIgY2F0ZWdvcnkgZnJvbSB0aGUgQVBJLiBGb3J3YXJkZWQgdG8gZWRpdCBtb2RlLiAqL1xuICBASW5wdXQoKSB2aWV3cG9ydENhdGVnb3J5T3B0aW9uczogeyBERVNLVE9QPzogYW55W10sIExBUFRPUD86IGFueVtdLCBUQUJMRVQ/OiBhbnlbXSwgTU9CSUxFPzogYW55W10gfSA9IHt9O1xuXG4gIC8qKiBMYWJlbHMgdG8gZmlsdGVyIG91dCBmcm9tIG1ldGFkYXRhIGZvciBzdGVwIGdyb3VwcyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN0ZXBHcm91cEV4Y2x1ZGVkTWV0YWRhdGFMYWJlbHMgPSBbJ3ByaW9yaXR5JywgJ3R5cGUnXTtcblxuICAvKiogV2hlbiB0cnVlLCBkZXNjcmlwdGlvbiAodmlldyBtb2RlKSBpcyBleHBhbmRlZDsgd2hlbiBmYWxzZSwgY2xhbXBlZCB0byA0IGxpbmVzIHdpdGggUmVhZCBtb3JlICovXG4gIGRlc2NyaXB0aW9uRXhwYW5kZWQgPSBmYWxzZTtcblxuICAvKiogUm91Z2hseSA0IGxpbmVzIG9mIHRleHQ7IHNob3cgUmVhZCBtb3JlIHdoZW4gZGVzY3JpcHRpb24gZXhjZWVkcyB0aGlzICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzY3JpcHRpb25SZWFkTW9yZVRocmVzaG9sZCA9IDI4MDtcblxuICBnZXQgc2hvd0Rlc2NyaXB0aW9uUmVhZE1vcmUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmF3ID0gdGhpcy5kZXNjcmlwdGlvbkNvbnRlbnQgPz8gJyc7XG4gICAgY29uc3QgdGV4dCA9IHRoaXMuZW5hYmxlTWFya2Rvd24gPyByYXcucmVwbGFjZSgvPFtePl0qPi9nLCAnICcpLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCkgOiByYXc7XG4gICAgaWYgKHRleHQubGVuZ3RoID4gdGhpcy5kZXNjcmlwdGlvblJlYWRNb3JlVGhyZXNob2xkKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBbHNvIHNob3cgd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIDQgbGluZXMgKG5ld2xpbmVzIG9yIDxicj4pXG4gICAgY29uc3Qgd2l0aEJyQXNOZXdsaW5lID0gcmF3LnJlcGxhY2UoLzxiclxccypcXC8/Pi9naSwgJ1xcbicpO1xuICAgIGNvbnN0IGxpbmVDb3VudCA9IHdpdGhCckFzTmV3bGluZS5zcGxpdCgvXFxyP1xcbi8pLmxlbmd0aDtcbiAgICByZXR1cm4gbGluZUNvdW50ID4gNDtcbiAgfVxuXG4gIHRvZ2dsZURlc2NyaXB0aW9uRXhwYW5kKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzY3JpcHRpb25FeHBhbmRlZCA9ICF0aGlzLmRlc2NyaXB0aW9uRXhwYW5kZWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogRmlsdGVyZWQgbWV0YWRhdGEgaXRlbXMgLSBleGNsdWRlcyBQcmlvcml0eSBhbmQgVHlwZSBmb3Igc3RlcCBncm91cHMgKi9cbiAgZ2V0IGZpbHRlcmVkTWV0YWRhdGFJdGVtcygpOiBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW1bXSB7XG4gICAgaWYgKCF0aGlzLmlzU3RlcEdyb3VwKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiAhdGhpcy5zdGVwR3JvdXBFeGNsdWRlZE1ldGFkYXRhTGFiZWxzLmluY2x1ZGVzKGl0ZW0ubGFiZWw/LnRvTG93ZXJDYXNlKCkgPz8gJycpXG4gICAgKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBlZGl0RGVzY3JpcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzYXZlQ2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhPigpO1xuICBAT3V0cHV0KCkgbWV0YWRhdGFMaW5rQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0TG9hZE1vcmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdE9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZyB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9PigpO1xuICBAT3V0cHV0KCkgbGFiZWxBZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgY29uZmlndXJlQXBpTW9ja2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEZpcmVkIHdoZW4gdGhlIHVzZXIgZmxpcHMgdGhlIFVzZS1tb2NrIHRvZ2dsZSDigJQgZW1pdHMgdGhlIG5ldyBgcmVzdG9yZU1vY2tgIHZhbHVlLiAqL1xuICBAT3V0cHV0KCkgYXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAvKiogRmlyZWQgd2hlbiB0aGUgdXNlciBmbGlwcyB0aGUgUmVuZXctYW5kLXN0b3JlIHRvZ2dsZSDigJQgZW1pdHMgdGhlIG5ldyBgc3RvcmVNb2NrYCB2YWx1ZS4gKi9cbiAgQE91dHB1dCgpIGFwaU1vY2tpbmdTdG9yZU1vY2tDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgb25FZGl0Q2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWRpdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9lZGl0aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgdGhpcy5lZGl0RGVzY3JpcHRpb24uZW1pdCgpO1xuICB9XG5cbiAgb25TYXZlQ2hhbmdlcyhkYXRhOiBUZXN0Q2FzZURldGFpbHNFZGl0Rm9ybURhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZGl0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2VkaXRpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuc2F2ZUNoYW5nZXMuZW1pdChkYXRhKTtcbiAgfVxuXG4gIG9uQ2FuY2VsRWRpdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgaWYgKHRoaXMuZWRpdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9lZGl0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHRyYWNrQnlDb25maWdUaXRsZShfaTogbnVtYmVyLCBzZWN0aW9uOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2VjdGlvbi50aXRsZTtcbiAgfVxuXG4gIHRyYWNrQnlNZXRhZGF0YUxhYmVsKF9pOiBudW1iZXIsIGl0ZW06IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0ubGFiZWw7XG4gIH1cblxuXG4gIG9uTWV0YWRhdGFMaW5rQ2xpY2soaXRlbTogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtKTogdm9pZCB7XG4gICAgaWYgKGl0ZW0ubGluaykge1xuICAgICAgdGhpcy5tZXRhZGF0YUxpbmtDbGljay5lbWl0KGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXR1c0RvdENsYXNzKGl0ZW06IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSk6IHN0cmluZyB7XG4gICAgaWYgKCFpdGVtLnN0YXR1c0NvbG9yKSByZXR1cm4gJyc7XG4gICAgc3dpdGNoIChpdGVtLnN0YXR1c0NvbG9yKSB7XG4gICAgICBjYXNlICd5ZWxsb3cnOlxuICAgICAgICByZXR1cm4gJ2NxYS1iZy1bI0VBQjMwOF0nO1xuICAgICAgY2FzZSAncmVkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtYmctWyNEQzI2MjZdJztcbiAgICAgIGNhc2UgJ2dyZWVuJzpcbiAgICAgICAgcmV0dXJuICdjcWEtYmctWyMxNkEzNEFdJztcbiAgICAgIGNhc2UgJ2dyYXknOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdjcWEtYmctWyM5NEEzQjhdJztcbiAgICB9XG4gIH1cblxuICAvKiogVGV4dCBjb2xvciBmb3IgbWV0YWRhdGEgdmFsdWUgKGUuZy4gcmVkIGZvciBjcml0aWNhbCBwcmlvcml0eSkgKi9cbiAgZ2V0VmFsdWVUZXh0Q2xhc3MoaXRlbTogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtKTogc3RyaW5nIHtcbiAgICBpZiAoaXRlbS5zdGF0dXNDb2xvciA9PT0gJ3JlZCcpIHtcbiAgICAgIHJldHVybiAnY3FhLXRleHQtWyNEQzI2MjZdJztcbiAgICB9XG4gICAgcmV0dXJuICdjcWEtdGV4dC1bIzExMTgyN10nO1xuICB9XG59XG4iLCI8IS0tIEVkaXQgbW9kZTogc2hvdyBlZGl0IGZvcm0gKEZpZ21hIGRlc2lnbikgLS0+XG48Y3FhLXRlc3QtY2FzZS1kZXRhaWxzLWVkaXRcbiAgKm5nSWY9XCJpc0VkaXRpbmdcIlxuICBbZGVzY3JpcHRpb25UaXRsZV09XCJkZXNjcmlwdGlvblRpdGxlXCJcbiAgW2Rlc2NyaXB0aW9uQ29udGVudF09XCJkZXNjcmlwdGlvbkNvbnRlbnRcIlxuICBbZW5hYmxlTWFya2Rvd25dPVwiZW5hYmxlTWFya2Rvd25cIlxuICBbbWV0YWRhdGFJdGVtc109XCJtZXRhZGF0YUl0ZW1zXCJcbiAgW2xhYmVsc109XCJsYWJlbHNcIlxuICBbY29uZmlnVGl0bGVdPVwiY29uZmlnVGl0bGVcIlxuICBbY29uZmlnU2VjdGlvbnNdPVwiY29uZmlnU2VjdGlvbnNcIlxuICBbY29uZmlnU2VjdGlvbnNSb3cyXT1cImNvbmZpZ1NlY3Rpb25zUm93MlwiXG4gIFtwbGF0Zm9ybV09XCJwbGF0Zm9ybVwiXG4gIFtpc1N0ZXBHcm91cF09XCJpc1N0ZXBHcm91cFwiXG4gIFtpc1NhdmluZ109XCJpc1NhdmluZ1wiXG4gIFtzZWxlY3RDb25maWdPdmVycmlkZXNdPVwic2VsZWN0Q29uZmlnT3ZlcnJpZGVzXCJcbiAgW3Nob3dBcGlNb2NraW5nQ2FyZF09XCJzaG93QXBpTW9ja2luZ0NhcmRcIlxuICBbYXBpTW9ja2luZ1RpdGxlXT1cImFwaU1vY2tpbmdUaXRsZVwiXG4gIFthcGlNb2NraW5nU3RhdHVzTGFiZWxdPVwiYXBpTW9ja2luZ1N0YXR1c0xhYmVsXCJcbiAgW2FwaU1vY2tpbmdDYXB0dXJlTGFiZWxdPVwiYXBpTW9ja2luZ0NhcHR1cmVMYWJlbFwiXG4gIFthcGlNb2NraW5nQ2FwdHVyZUhpbnRdPVwiYXBpTW9ja2luZ0NhcHR1cmVIaW50XCJcbiAgW2FwaU1vY2tpbmdSZW5ld0xhYmVsXT1cImFwaU1vY2tpbmdSZW5ld0xhYmVsXCJcbiAgW2FwaU1vY2tpbmdSZW5ld0hpbnRdPVwiYXBpTW9ja2luZ1JlbmV3SGludFwiXG4gIFthcGlNb2NraW5nUmVzdG9yZU1vY2tdPVwiYXBpTW9ja2luZ1Jlc3RvcmVNb2NrXCJcbiAgW2FwaU1vY2tpbmdTdG9yZU1vY2tdPVwiYXBpTW9ja2luZ1N0b3JlTW9ja1wiXG4gIFthcGlNb2NraW5nTW9ja2VkQXBpc0NvdW50XT1cImFwaU1vY2tpbmdNb2NrZWRBcGlzQ291bnRcIlxuICBbYXBpTW9ja2luZ1RvdGFsQXBpc0NvdW50XT1cImFwaU1vY2tpbmdUb3RhbEFwaXNDb3VudFwiXG4gIFthcGlNb2NraW5nUHJvZ3Jlc3NQZXJjZW50XT1cImFwaU1vY2tpbmdQcm9ncmVzc1BlcmNlbnRcIlxuICBbYXBpTW9ja2luZ1Nob3dQcm9ncmVzc109XCJhcGlNb2NraW5nU2hvd1Byb2dyZXNzXCJcbiAgW2FwaU1vY2tpbmdTdW1tYXJ5VGV4dF09XCJhcGlNb2NraW5nU3VtbWFyeVRleHRcIlxuICBbYXBpTW9ja2luZ1BlcmNlbnRUZXh0XT1cImFwaU1vY2tpbmdQZXJjZW50VGV4dFwiXG4gIFtvcmdMZXZlbFRlc3RDYXNlVGltZW91dF09XCJvcmdMZXZlbFRlc3RDYXNlVGltZW91dFwiXG4gIFt2aWV3cG9ydENhdGVnb3J5T3B0aW9uc109XCJ2aWV3cG9ydENhdGVnb3J5T3B0aW9uc1wiXG4gIChzYXZlKT1cIm9uU2F2ZUNoYW5nZXMoJGV2ZW50KVwiXG4gIChjYW5jZWwpPVwib25DYW5jZWxFZGl0KClcIlxuICAoc2VsZWN0U2VhcmNoKT1cInNlbGVjdFNlYXJjaC5lbWl0KCRldmVudClcIlxuICAoc2VsZWN0TG9hZE1vcmUpPVwic2VsZWN0TG9hZE1vcmUuZW1pdCgkZXZlbnQpXCJcbiAgKHNlbGVjdE9wZW5lZCk9XCJzZWxlY3RPcGVuZWQuZW1pdCgkZXZlbnQpXCJcbiAgKHNlbGVjdGlvbkNoYW5nZSk9XCJzZWxlY3Rpb25DaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgKGxhYmVsQWRkZWQpPVwibGFiZWxBZGRlZC5lbWl0KCRldmVudClcIlxuICAoYXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlKT1cImFwaU1vY2tpbmdSZXN0b3JlTW9ja0NoYW5nZS5lbWl0KCRldmVudClcIlxuICAoYXBpTW9ja2luZ1N0b3JlTW9ja0NoYW5nZSk9XCJhcGlNb2NraW5nU3RvcmVNb2NrQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gIChjb25maWd1cmVBcGlNb2NraW5nKT1cImNvbmZpZ3VyZUFwaU1vY2tpbmcuZW1pdCgpXCI+XG48L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1lZGl0PlxuXG48IS0tIFZpZXcgbW9kZTogcmVhZC1vbmx5IGRldGFpbHMgLS0+XG48ZGl2ICpuZ0lmPVwiIWlzRWRpdGluZ1wiIGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtcHktNCBjcWEtcHgtMCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtNCBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XVwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtNCBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XVwiPlxuICAgIDwhLS0gRGVzY3JpcHRpb24gU2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtMi41XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPmRlc2NyaXB0aW9uPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTkuNnB4XVwiPnt7IGRlc2NyaXB0aW9uVGl0bGUgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93RWRpdEJ1dHRvblwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtcHgtMi41IGNxYS1weS0xIGNxYS1yb3VuZGVkICFjcWEtYm9yZGVyICFjcWEtYm9yZGVyLXNvbGlkICFjcWEtYm9yZGVyLVsjRDFENURCXSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQteHMgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWFsbCBob3ZlcjpjcWEtdGV4dC1bIzM3NDE1MV0gaG92ZXI6IWNxYS1ib3JkZXItWyM5Q0EzQUZdIGhvdmVyOmNxYS1iZy1bI0Y5RkFGQl0gZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLTIgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1bIzNGNDNFRV0gZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1vZmZzZXQtMlwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdENsaWNrKClcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctWzE0cHhdICFjcWEtaC1bMTRweF0gIWNxYS10ZXh0LVsxNHB4XVwiPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICAgIDxzcGFuPkVkaXQ8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZGVzY3JpcHRpb25Db250ZW50XCIgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtc3RhcnQgY3FhLWdhcC0xXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cImVuYWJsZU1hcmtkb3duXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLXRleHQtWyMxMTE4MjddIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtcHJvc2UgY3FhLXByb3NlLXNtIGNxYS1tYXgtdy1ub25lXCJcbiAgICAgICAgICBbc3R5bGVdPVwiKCFkZXNjcmlwdGlvbkV4cGFuZGVkICYmIHNob3dEZXNjcmlwdGlvblJlYWRNb3JlKSA/ICdkaXNwbGF5OiAtd2Via2l0LWJveDsgLXdlYmtpdC1saW5lLWNsYW1wOiA0OyBsaW5lLWNsYW1wOiA0OyAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsOyBvdmVyZmxvdzogaGlkZGVuOycgOiAnJ1wiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJkZXNjcmlwdGlvbkNvbnRlbnRcIj48L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwiIWVuYWJsZU1hcmtkb3duXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLXRleHQtWyMxMTE4MjddIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW5vcm1hbFwiXG4gICAgICAgICAgW3N0eWxlXT1cIighZGVzY3JpcHRpb25FeHBhbmRlZCAmJiBzaG93RGVzY3JpcHRpb25SZWFkTW9yZSkgPyAnZGlzcGxheTogLXdlYmtpdC1ib3g7IC13ZWJraXQtbGluZS1jbGFtcDogNDsgbGluZS1jbGFtcDogNDsgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDsgb3ZlcmZsb3c6IGhpZGRlbjsnIDogJydcIj57eyBkZXNjcmlwdGlvbkNvbnRlbnQgfX08L2Rpdj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd0Rlc2NyaXB0aW9uUmVhZE1vcmVcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bSBob3ZlcjpjcWEtdW5kZXJsaW5lIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLXNlbGYtc3RhcnQgZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLTIgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1bIzNGNDNFRV0gZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1vZmZzZXQtMlwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURlc2NyaXB0aW9uRXhwYW5kKClcIj5cbiAgICAgICAgICB7eyBkZXNjcmlwdGlvbkV4cGFuZGVkID8gJ1JlYWQgbGVzcycgOiAnUmVhZCBtb3JlJyB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBNZXRhZGF0YSBTZWN0aW9uIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJlZE1ldGFkYXRhSXRlbXMubGVuZ3RoXCIgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtc3RhcnQgY3FhLWdhcC0yLjVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1ncmlkIGNxYS1ncmlkLWNvbHMtMiBjcWEtZ2FwLXgtMCBjcWEtZ2FwLXktNFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkTWV0YWRhdGFJdGVtczsgdHJhY2tCeTogdHJhY2tCeU1ldGFkYXRhTGFiZWxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1pdGVtcy1zdGFydCBjcWEtZ2FwLTAuNVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC14cyBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtXCI+e3sgaXRlbS5sYWJlbCB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bNXB4XSBjcWEtbWluLXctMCBjcWEtdy1mdWxsIGNxYS10ZXh0LWxlZnQgY3FhLXRleHQtWyMwQTBBMEFdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0Y1RjVGNV1cIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiaXRlbS5pY29uICYmICghaXRlbS5pY29uTGlicmFyeSB8fCBpdGVtLmljb25MaWJyYXJ5ID09PSAnbWF0JylcIiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1zbSBjcWEtdy00IGNxYS1oLTRcIj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLmljb24gfX1cbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtLnN0YXR1c0NvbG9yXCIgY2xhc3M9XCJjcWEtdy1bMTBweF0gY3FhLWgtWzEwcHhdIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWZsZXgtc2hyaW5rLTBcIiBbbmdDbGFzc109XCJnZXRTdGF0dXNEb3RDbGFzcyhpdGVtKVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0ubGlua1wiXG4gICAgICAgICAgICAgICAgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzI1NjNFQl0gY3FhLXRleHQteHMgY3FhLWxlYWRpbmctWzEycHhdIGNxYS1mb250LW5vcm1hbCBob3ZlcjpjcWEtdW5kZXJsaW5lIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtYmxvY2sgY3FhLXRydW5jYXRlIGNxYS1taW4tdy0wXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25NZXRhZGF0YUxpbmtDbGljayhpdGVtKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLnZhbHVlIH19XG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXRlbS5saW5rXCIgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS1hbGlnbi1taWRkbGVcIiBbbmdDbGFzc109XCJnZXRWYWx1ZVRleHRDbGFzcyhpdGVtKVwiPlxuICAgICAgICAgICAgICAgIHt7IGl0ZW0udmFsdWUgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIExhYmVscyAoRmlnbWE6IExhYmVscyB0aXRsZSwgY3FhLWJhZGdlIGNoaXBzIHdpdGggdGFnIGljb24pIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJsYWJlbHMubGVuZ3RoXCIgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtc3RhcnQgY3FhLWdhcC0yIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMTExODI3XSBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLWxlYWRpbmctNVwiPkxhYmVsczwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC13cmFwIGNxYS1nYXAtMlwiPlxuICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGxhYmVsIG9mIGxhYmVsc1wiXG4gICAgICAgICAgW2xhYmVsXT1cImxhYmVsXCJcbiAgICAgICAgICBpY29uPVwibGFiZWxcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lXCJcbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcj1cIiNmZmZmZmZcIlxuICAgICAgICAgIHRleHRDb2xvcj1cIiM0NzU1NjlcIlxuICAgICAgICAgIGJvcmRlckNvbG9yPVwiI0UyRThGMFwiXG4gICAgICAgICAgaWNvbkNvbG9yPVwiIzk0QTNCOFwiPlxuICAgICAgICA8L2NxYS1iYWRnZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDb25maWd1cmF0aW9uIFNlY3Rpb24gLS0+XG4gICAgPGRpdiAqbmdJZj1cImNvbmZpZ1NlY3Rpb25zLmxlbmd0aCB8fCBjb25maWdTZWN0aW9uc1JvdzIubGVuZ3RoXCIgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtc3RhcnQgY3FhLWdhcC0yLjVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPnNldHRpbmdzPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTkuNnB4XVwiPnt7IGNvbmZpZ1RpdGxlIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1pdGVtcy1zdGFydCBjcWEtZ2FwLTIuNVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtZ3JpZCBjcWEtZ3JpZC1jb2xzLTEgY3FhLWdhcC0yLjVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZWN0aW9uIG9mIGNvbmZpZ1NlY3Rpb25zOyB0cmFja0J5OiB0cmFja0J5Q29uZmlnVGl0bGVcIj5cbiAgICAgICAgICAgIDxjcWEtY29uZmlndXJhdGlvbi1jYXJkXG4gICAgICAgICAgICAgIFtpY29uXT1cInNlY3Rpb24uaWNvbiB8fCAndHVuZSdcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwic2VjdGlvbi50aXRsZVwiXG4gICAgICAgICAgICAgIFtkYXRhXT1cInNlY3Rpb24uaXRlbXNcIj5cbiAgICAgICAgICAgIDwvY3FhLWNvbmZpZ3VyYXRpb24tY2FyZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJjb25maWdTZWN0aW9uc1JvdzIubGVuZ3RoXCIgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTQgY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF1cIj5cbiAgICAgICAgICA8Y3FhLWNvbmZpZ3VyYXRpb24tY2FyZFxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHNlY3Rpb24gb2YgY29uZmlnU2VjdGlvbnNSb3cyOyB0cmFja0J5OiB0cmFja0J5Q29uZmlnVGl0bGVcIlxuICAgICAgICAgICAgW2ljb25dPVwic2VjdGlvbi5pY29uIHx8ICd0dW5lJ1wiXG4gICAgICAgICAgICBbdGl0bGVdPVwic2VjdGlvbi50aXRsZVwiXG4gICAgICAgICAgICBbZGF0YV09XCJzZWN0aW9uLml0ZW1zXCI+XG4gICAgICAgICAgPC9jcWEtY29uZmlndXJhdGlvbi1jYXJkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBBUEkgTW9ja2luZyBDYXJkIChyZWFkLW9ubHkpIC0tPlxuICAgICAgPGNxYS1hcGktbW9ja2luZy1jYXJkXG4gICAgICAgICpuZ0lmPVwic2hvd0FwaU1vY2tpbmdDYXJkXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIlxuICAgICAgICBbdGl0bGVdPVwiYXBpTW9ja2luZ1RpdGxlXCJcbiAgICAgICAgW3N0YXR1c0xhYmVsXT1cImFwaU1vY2tpbmdTdGF0dXNMYWJlbFwiXG4gICAgICAgIFtjYXB0dXJlTGFiZWxdPVwiYXBpTW9ja2luZ0NhcHR1cmVMYWJlbFwiXG4gICAgICAgIFtyZW5ld0xhYmVsXT1cImFwaU1vY2tpbmdSZW5ld0xhYmVsXCJcbiAgICAgICAgW3Jlc3RvcmVNb2NrXT1cImFwaU1vY2tpbmdSZXN0b3JlTW9ja1wiXG4gICAgICAgIFtzdG9yZU1vY2tdPVwiYXBpTW9ja2luZ1N0b3JlTW9ja1wiXG4gICAgICAgIFttb2NrZWRBcGlzQ291bnRdPVwiYXBpTW9ja2luZ01vY2tlZEFwaXNDb3VudFwiXG4gICAgICAgIFt0b3RhbEFwaXNDb3VudF09XCJhcGlNb2NraW5nVG90YWxBcGlzQ291bnRcIlxuICAgICAgICBbcHJvZ3Jlc3NQZXJjZW50XT1cImFwaU1vY2tpbmdQcm9ncmVzc1BlcmNlbnRcIlxuICAgICAgICBbc2hvd1Byb2dyZXNzXT1cImFwaU1vY2tpbmdTaG93UHJvZ3Jlc3NcIlxuICAgICAgICBbc3VtbWFyeVRleHRdPVwiYXBpTW9ja2luZ1N1bW1hcnlUZXh0XCJcbiAgICAgICAgW3BlcmNlbnRUZXh0XT1cImFwaU1vY2tpbmdQZXJjZW50VGV4dFwiXG4gICAgICAgIFtjb25maWd1cmVCdXR0b25MYWJlbF09XCJhcGlNb2NraW5nQ29uZmlndXJlQnV0dG9uTGFiZWxcIlxuICAgICAgICBbZWRpdGluZ109XCJmYWxzZVwiXG4gICAgICAgIChjb25maWd1cmUpPVwiY29uZmlndXJlQXBpTW9ja2luZy5lbWl0KClcIj5cbiAgICAgIDwvY3FhLWFwaS1tb2NraW5nLWNhcmQ+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=