@cqa-lib/cqa-ui 1.1.368 → 1.1.370

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.
@@ -4,13 +4,18 @@ import * as i1 from "@angular/material/icon";
4
4
  import * as i2 from "../../search-bar/search-bar.component";
5
5
  import * as i3 from "@angular/common";
6
6
  export class JumpToStepModalComponent {
7
- constructor() {
7
+ constructor(cdr) {
8
+ this.cdr = cdr;
8
9
  /** Whether the modal is open */
9
10
  this.isOpen = false;
10
11
  /** Modal title */
11
12
  this.title = 'Jump to Step';
12
- /** List of step items to display */
13
+ /** List of step items to display (legacy; used when combinedTestCases not provided) */
13
14
  this.items = [];
15
+ /** Combined test cases for accordion layout. When provided with stepsMeta, used instead of items. */
16
+ this.combinedTestCases = [];
17
+ /** Pre-computed step metadata (stepNumber, status, etc.) for each step. Required when using combinedTestCases. */
18
+ this.stepsMeta = [];
14
19
  /** Search placeholder text */
15
20
  this.searchPlaceholder = 'Search steps by name or number...';
16
21
  /** Search Empty State text */
@@ -19,8 +24,16 @@ export class JumpToStepModalComponent {
19
24
  this.searchValue = '';
20
25
  /** Whether search is enabled */
21
26
  this.enableSearch = true;
27
+ /** Whether to show prerequisite steps section. Default true. */
28
+ this.showPrerequisites = true;
22
29
  /** Filtered items based on search */
23
30
  this.filteredItems = [];
31
+ /** Prerequisite groups for accordion: each prerequisite test case by name. */
32
+ this.prerequisiteGroups = [];
33
+ /** Filtered non-prerequisite step items. */
34
+ this.filteredStepItems = [];
35
+ /** Expanded prerequisite group names. When empty, all groups are collapsed by default. */
36
+ this.expandedGroupNames = new Set();
24
37
  /** Emitted when modal should be closed */
25
38
  this.onClose = new EventEmitter();
26
39
  /** Emitted when search value changes */
@@ -29,25 +42,134 @@ export class JumpToStepModalComponent {
29
42
  this.onSelect = new EventEmitter();
30
43
  }
31
44
  ngOnChanges(changes) {
32
- if (changes['items'] || changes['searchValue']) {
45
+ if (changes['items'] || changes['combinedTestCases'] || changes['stepsMeta'] || changes['searchValue']) {
33
46
  this.updateFilteredItems();
34
47
  }
35
48
  }
36
49
  updateFilteredItems() {
37
- if (!this.items || this.items.length === 0) {
50
+ if (this.combinedTestCases?.length && this.stepsMeta?.length) {
51
+ this.buildFromCombinedTestCases();
52
+ }
53
+ else if (this.items?.length) {
54
+ this.buildFromItems();
55
+ }
56
+ else {
38
57
  this.filteredItems = [];
39
- return;
58
+ this.prerequisiteGroups = [];
59
+ this.filteredStepItems = [];
60
+ }
61
+ }
62
+ buildFromCombinedTestCases() {
63
+ const metaByStepId = new Map();
64
+ this.stepsMeta.forEach(m => metaByStepId.set(m.stepId, m));
65
+ const searchTerm = (this.searchValue || '').toLowerCase().trim();
66
+ const matchesSearch = (meta) => {
67
+ if (!searchTerm)
68
+ return true;
69
+ return (String(meta.stepNumber).toLowerCase().includes(searchTerm) ||
70
+ (meta.label || '').toLowerCase().includes(searchTerm));
71
+ };
72
+ this.prerequisiteGroups = [];
73
+ this.filteredStepItems = [];
74
+ for (const group of this.combinedTestCases) {
75
+ if (!group?.steps?.length)
76
+ continue;
77
+ const groupName = (group.name || 'Prerequisite').toString();
78
+ const isPrereq = !!group.isPrerequisite;
79
+ const collectSteps = (steps, seen) => {
80
+ const out = [];
81
+ for (const s of steps) {
82
+ if (!s)
83
+ continue;
84
+ const id = s?.id ?? s?.step_id;
85
+ const numId = id != null ? Number(id) : NaN;
86
+ if (!Number.isFinite(numId) || seen.has(numId))
87
+ continue;
88
+ seen.add(numId);
89
+ const meta = metaByStepId.get(numId);
90
+ if (meta && matchesSearch(meta)) {
91
+ out.push({
92
+ id: String(numId),
93
+ stepId: numId,
94
+ stepNumber: meta.stepNumber,
95
+ description: this.stripHtml(meta.label || ('Step ' + meta.stepNumber)),
96
+ status: meta.status,
97
+ isPrerequisite: meta.isPrerequisite,
98
+ groupName: meta.groupName,
99
+ });
100
+ }
101
+ for (const arr of [s.children || [], s.nestedSteps || [], s.steps || []]) {
102
+ if (arr?.length)
103
+ out.push(...collectSteps(arr, seen));
104
+ }
105
+ if (s.branches && Array.isArray(s.branches)) {
106
+ for (const b of s.branches) {
107
+ if (b?.subSteps?.length)
108
+ out.push(...collectSteps(b.subSteps, seen));
109
+ }
110
+ }
111
+ }
112
+ return out;
113
+ };
114
+ const seen = new Set();
115
+ const items = collectSteps(group.steps, seen);
116
+ if (isPrereq && this.showPrerequisites) {
117
+ if (items.length) {
118
+ this.prerequisiteGroups.push({ name: groupName, items });
119
+ }
120
+ }
121
+ else if (!isPrereq) {
122
+ this.filteredStepItems.push(...items);
123
+ }
40
124
  }
41
- if (!this.searchValue || this.searchValue.trim() === '') {
125
+ this.filteredItems = [
126
+ ...this.prerequisiteGroups.reduce((acc, g) => acc.concat(g.items), []),
127
+ ...this.filteredStepItems,
128
+ ];
129
+ }
130
+ buildFromItems() {
131
+ const searchTerm = (this.searchValue || '').toLowerCase().trim();
132
+ if (!searchTerm) {
42
133
  this.filteredItems = [...this.items];
43
- return;
44
134
  }
45
- const searchTerm = this.searchValue.toLowerCase().trim();
46
- this.filteredItems = this.items.filter(item => {
47
- const stepNumberMatch = String(item.stepNumber).toLowerCase().includes(searchTerm);
48
- const descriptionMatch = item.description.toLowerCase().includes(searchTerm);
49
- return stepNumberMatch || descriptionMatch;
135
+ else {
136
+ this.filteredItems = this.items.filter(item => {
137
+ const stepNumberMatch = String(item.stepNumber).toLowerCase().includes(searchTerm);
138
+ const descriptionMatch = (item.description || '').toLowerCase().includes(searchTerm);
139
+ return stepNumberMatch || descriptionMatch;
140
+ });
141
+ }
142
+ const prereqItems = this.filteredItems.filter(i => i.isPrerequisite === true);
143
+ const groups = new Map();
144
+ prereqItems.forEach(item => {
145
+ const name = (item.groupName || 'Prerequisite').toString();
146
+ const existing = groups.get(name);
147
+ if (existing)
148
+ existing.push(item);
149
+ else
150
+ groups.set(name, [item]);
50
151
  });
152
+ this.prerequisiteGroups = Array.from(groups.entries()).map(([name, items]) => ({ name, items }));
153
+ this.filteredStepItems = this.filteredItems.filter(i => i.isPrerequisite !== true);
154
+ }
155
+ stripHtml(html) {
156
+ if (!html)
157
+ return '';
158
+ const div = document.createElement('div');
159
+ div.innerHTML = html;
160
+ return (div.textContent || div.innerText || '').trim();
161
+ }
162
+ isGroupExpanded(name) {
163
+ return this.expandedGroupNames.has(name);
164
+ }
165
+ toggleGroup(name) {
166
+ if (this.expandedGroupNames.has(name)) {
167
+ this.expandedGroupNames.delete(name);
168
+ }
169
+ else {
170
+ this.expandedGroupNames.add(name);
171
+ }
172
+ this.cdr.markForCheck();
51
173
  }
52
174
  onSearchValueChange(value) {
53
175
  this.searchValue = value;
@@ -100,17 +222,21 @@ export class JumpToStepModalComponent {
100
222
  return item.id;
101
223
  }
102
224
  }
103
- JumpToStepModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: JumpToStepModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
104
- JumpToStepModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: JumpToStepModalComponent, selector: "cqa-jump-to-step-modal", inputs: { isOpen: "isOpen", title: "title", items: "items", searchPlaceholder: "searchPlaceholder", searchEmptyStateLabel: "searchEmptyStateLabel", searchValue: "searchValue", enableSearch: "enableSearch" }, outputs: { onClose: "onClose", onSearch: "onSearch", onSelect: "onSelect" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"isOpen\"\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-50 cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-lg cqa-bg-white cqa-shadow-lg cqa-w-full cqa-max-w-[500px] cqa-overflow-hidden cqa-flex cqa-flex-col\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808; max-height: 90vh;\"\n (click)=\"$event.stopPropagation()\">\n\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-6 cqa-pt-6 cqa-pb-4\">\n <h2 class=\"cqa-text-base cqa-font-semibold cqa-text-[#0A0A0A] cqa-leading-[24px] cqa-font-inter\">\n {{ title }}\n </h2>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-6 cqa-h-6 cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer cqa-text-gray-500 hover:cqa-text-gray-700 cqa-transition-colors\"\n (click)=\"handleClose()\"\n aria-label=\"Close modal\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px] !cqa-block !cqa-leading-none\">close</mat-icon>\n </button>\n </div>\n\n\n <!-- Search Bar -->\n <div *ngIf=\"enableSearch\" class=\"cqa-px-6 cqa-pb-4\">\n <cqa-search-bar\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [fullWidth]=\"true\"\n (valueChange)=\"onSearchValueChange($event)\">\n </cqa-search-bar>\n </div>\n\n <!-- Divider below search -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Steps List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-px-6 cqa-pt-2\" style=\"scrollbar-width: thin;\">\n <!-- Empty State -->\n <div *ngIf=\"!hasItems\" class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-12 cqa-text-center\">\n <p class=\"cqa-text-sm cqa-text-gray-500 cqa-font-inter\">\n {{searchEmptyStateLabel || 'No Data found.'}}\n </p>\n </div>\n\n <!-- Steps List -->\n <div *ngIf=\"hasItems\" class=\"cqa-flex cqa-flex-col\">\n <button\n *ngFor=\"let item of filteredItems; trackBy: trackByItemId\"\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-3 cqa-py-3 cqa-w-full cqa-text-left cqa-border-0 cqa-bg-transparent hover:cqa-bg-gray-50 cqa-cursor-pointer cqa-transition-colors cqa-rounded-md cqa-min-w-0\"\n (click)=\"onItemClick(item)\">\n\n <!-- Step Number Badge -->\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-rounded-[6px] cqa-text-xs cqa-font-medium cqa-py-[4px] cqa-px-[10px] cqa-flex-shrink-0 cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-text-[#3F43EE] cqa-bg-[#F8F9FF]\"\n style=\"min-width: 32px;\">\n {{ item.stepNumber }}\n </span>\n\n <!-- Step Description -->\n <span class=\"cqa-flex-1 cqa-text-sm cqa-text-[#0A0A0A] cqa-font-inter cqa-font-normal cqa-leading-[20px] cqa-min-w-0 cqa-truncate\">\n {{ item.description }}\n </span>\n\n <!-- Status Badge -->\n <span class=\"cqa-flex-shrink-0\" [ngClass]=\"getStatusBadgeClasses(item.status)\">\n {{ item.status }}\n </span>\n\n <!-- Right Arrow Icon-->\n <!-- <span class=\"cqa-flex cqa-items-center cqa-justify-center cqa-flex-shrink-0\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 4L10 8L6 12\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span> -->\n </button>\n </div>\n </div>\n\n <!-- Footer -->\n <div *ngIf=\"hasItems\" class=\"cqa-px-6 cqa-pb-5 cqa-pt-3\">\n <p class=\"cqa-text-xs cqa-text-[#6B7280] cqa-font-inter cqa-font-normal\">\n {{ itemsCount }} {{ itemsCount === 1 ? 'step' : 'steps' }} found\n </p>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
225
+ JumpToStepModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: JumpToStepModalComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
226
+ JumpToStepModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: JumpToStepModalComponent, selector: "cqa-jump-to-step-modal", inputs: { isOpen: "isOpen", title: "title", items: "items", combinedTestCases: "combinedTestCases", stepsMeta: "stepsMeta", searchPlaceholder: "searchPlaceholder", searchEmptyStateLabel: "searchEmptyStateLabel", searchValue: "searchValue", enableSearch: "enableSearch", showPrerequisites: "showPrerequisites" }, outputs: { onClose: "onClose", onSearch: "onSearch", onSelect: "onSelect" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"isOpen\"\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-50 cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-lg cqa-bg-white cqa-shadow-lg cqa-w-full cqa-max-w-[500px] cqa-overflow-hidden cqa-flex cqa-flex-col\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808; max-height: 90vh;\"\n (click)=\"$event.stopPropagation()\">\n\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-6 cqa-pt-6 cqa-pb-4\">\n <h2 class=\"cqa-text-base cqa-font-semibold cqa-text-[#0A0A0A] cqa-leading-[24px] cqa-font-inter\">\n {{ title }}\n </h2>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-6 cqa-h-6 cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer cqa-text-gray-500 hover:cqa-text-gray-700 cqa-transition-colors\"\n (click)=\"handleClose()\"\n aria-label=\"Close modal\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px] !cqa-block !cqa-leading-none\">close</mat-icon>\n </button>\n </div>\n\n\n <!-- Search Bar -->\n <div *ngIf=\"enableSearch\" class=\"cqa-px-6 cqa-pb-4\">\n <cqa-search-bar\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [fullWidth]=\"true\"\n (valueChange)=\"onSearchValueChange($event)\">\n </cqa-search-bar>\n </div>\n\n <!-- Divider below search -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Steps List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-px-6 cqa-pt-2\" style=\"scrollbar-width: thin;\">\n <!-- Empty State -->\n <div *ngIf=\"!hasItems\" class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-12 cqa-text-center\">\n <p class=\"cqa-text-sm cqa-text-gray-500 cqa-font-inter\">\n {{searchEmptyStateLabel || 'No Data found.'}}\n </p>\n </div>\n\n <!-- Steps List -->\n <div *ngIf=\"hasItems\" class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n\n <!-- Prerequisite steps: accordion by test case name (styled like cqa-main-step-collapse) -->\n <ng-container *ngIf=\"showPrerequisites && prerequisiteGroups?.length\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-mb-1\">\n <ng-container *ngFor=\"let group of prerequisiteGroups\">\n <div\n class=\"cqa-mt-2 cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2 cqa-cursor-pointer cqa-bg-[#EEF2FF] cqa-rounded-[4px] cqa-border cqa-border-[#C6D2FF] cqa-border-solid cqa-w-full\"\n (click)=\"toggleGroup(group.name)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-w-full\">\n <div>\n <svg [class.cqa-rotate-180]=\"isGroupExpanded(group.name)\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#4F39F6\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span class=\"cqa-font-semibold cqa-text-[14px] cqa-leading-[17px] cqa-text-[#312C85] cqa-flex-1\">\n {{ group.name }}\n </span>\n </div>\n </div>\n <div *ngIf=\"isGroupExpanded(group.name)\" class=\"cqa-mt-2 cqa-flex cqa-flex-col cqa-gap-2 cqa-px-2.5\">\n <button\n *ngFor=\"let item of group.items; trackBy: trackByItemId\"\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-3 cqa-py-3 cqa-w-full cqa-text-left cqa-border-0 cqa-bg-transparent hover:cqa-bg-gray-50 cqa-cursor-pointer cqa-transition-colors cqa-rounded-md cqa-min-w-0\"\n (click)=\"onItemClick(item)\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-rounded-[6px] cqa-text-xs cqa-font-medium cqa-py-[4px] cqa-px-[10px] cqa-flex-shrink-0 cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-text-[#3F43EE] cqa-bg-[#F8F9FF]\"\n style=\"min-width: 32px;\">{{ item.stepNumber }}</span>\n <span class=\"cqa-flex-1 cqa-text-sm cqa-text-[#0A0A0A] cqa-font-inter cqa-font-normal cqa-leading-[20px] cqa-min-w-0 cqa-truncate\">{{ item.description }}</span>\n <span class=\"cqa-flex-shrink-0\" [ngClass]=\"getStatusBadgeClasses(item.status)\">{{ item.status }}</span>\n </button>\n </div>\n </ng-container>\n </div>\n <div *ngIf=\"filteredStepItems?.length\" class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB] cqa-my-1 cqa-mb-2\" role=\"presentation\"></div>\n </ng-container>\n\n <!-- Main test steps section -->\n <ng-container *ngIf=\"filteredStepItems?.length\">\n <div class=\"cqa-mb-1\">\n <span class=\"cqa-text-xs cqa-font-medium cqa-text-[#6B7280] cqa-uppercase cqa-tracking-wide\">\n Test steps\n </span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <button\n *ngFor=\"let item of filteredStepItems; trackBy: trackByItemId\"\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-3 cqa-py-3 cqa-w-full cqa-text-left cqa-border-0 cqa-bg-transparent hover:cqa-bg-gray-50 cqa-cursor-pointer cqa-transition-colors cqa-rounded-md cqa-min-w-0\"\n (click)=\"onItemClick(item)\">\n\n <!-- Step Number Badge -->\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-rounded-[6px] cqa-text-xs cqa-font-medium cqa-py-[4px] cqa-px-[10px] cqa-flex-shrink-0 cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-text-[#3F43EE] cqa-bg-[#F8F9FF]\"\n style=\"min-width: 32px;\">\n {{ item.stepNumber }}\n </span>\n\n <!-- Step Description -->\n <span class=\"cqa-flex-1 cqa-text-sm cqa-text-[#0A0A0A] cqa-font-inter cqa-font-normal cqa-leading-[20px] cqa-min-w-0 cqa-truncate\">\n {{ item.description }}\n </span>\n\n <!-- Status Badge -->\n <span class=\"cqa-flex-shrink-0\" [ngClass]=\"getStatusBadgeClasses(item.status)\">\n {{ item.status }}\n </span>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Footer -->\n <div *ngIf=\"hasItems\" class=\"cqa-px-6 cqa-pb-5 cqa-pt-3\">\n <p class=\"cqa-text-xs cqa-text-[#6B7280] cqa-font-inter cqa-font-normal\">\n {{ itemsCount }} {{ itemsCount === 1 ? 'step' : 'steps' }} found\n </p>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
105
227
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: JumpToStepModalComponent, decorators: [{
106
228
  type: Component,
107
- args: [{ selector: 'cqa-jump-to-step-modal', host: { class: 'cqa-ui-root' }, template: "<div *ngIf=\"isOpen\"\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-50 cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-lg cqa-bg-white cqa-shadow-lg cqa-w-full cqa-max-w-[500px] cqa-overflow-hidden cqa-flex cqa-flex-col\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808; max-height: 90vh;\"\n (click)=\"$event.stopPropagation()\">\n\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-6 cqa-pt-6 cqa-pb-4\">\n <h2 class=\"cqa-text-base cqa-font-semibold cqa-text-[#0A0A0A] cqa-leading-[24px] cqa-font-inter\">\n {{ title }}\n </h2>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-6 cqa-h-6 cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer cqa-text-gray-500 hover:cqa-text-gray-700 cqa-transition-colors\"\n (click)=\"handleClose()\"\n aria-label=\"Close modal\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px] !cqa-block !cqa-leading-none\">close</mat-icon>\n </button>\n </div>\n\n\n <!-- Search Bar -->\n <div *ngIf=\"enableSearch\" class=\"cqa-px-6 cqa-pb-4\">\n <cqa-search-bar\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [fullWidth]=\"true\"\n (valueChange)=\"onSearchValueChange($event)\">\n </cqa-search-bar>\n </div>\n\n <!-- Divider below search -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Steps List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-px-6 cqa-pt-2\" style=\"scrollbar-width: thin;\">\n <!-- Empty State -->\n <div *ngIf=\"!hasItems\" class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-12 cqa-text-center\">\n <p class=\"cqa-text-sm cqa-text-gray-500 cqa-font-inter\">\n {{searchEmptyStateLabel || 'No Data found.'}}\n </p>\n </div>\n\n <!-- Steps List -->\n <div *ngIf=\"hasItems\" class=\"cqa-flex cqa-flex-col\">\n <button\n *ngFor=\"let item of filteredItems; trackBy: trackByItemId\"\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-3 cqa-py-3 cqa-w-full cqa-text-left cqa-border-0 cqa-bg-transparent hover:cqa-bg-gray-50 cqa-cursor-pointer cqa-transition-colors cqa-rounded-md cqa-min-w-0\"\n (click)=\"onItemClick(item)\">\n\n <!-- Step Number Badge -->\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-rounded-[6px] cqa-text-xs cqa-font-medium cqa-py-[4px] cqa-px-[10px] cqa-flex-shrink-0 cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-text-[#3F43EE] cqa-bg-[#F8F9FF]\"\n style=\"min-width: 32px;\">\n {{ item.stepNumber }}\n </span>\n\n <!-- Step Description -->\n <span class=\"cqa-flex-1 cqa-text-sm cqa-text-[#0A0A0A] cqa-font-inter cqa-font-normal cqa-leading-[20px] cqa-min-w-0 cqa-truncate\">\n {{ item.description }}\n </span>\n\n <!-- Status Badge -->\n <span class=\"cqa-flex-shrink-0\" [ngClass]=\"getStatusBadgeClasses(item.status)\">\n {{ item.status }}\n </span>\n\n <!-- Right Arrow Icon-->\n <!-- <span class=\"cqa-flex cqa-items-center cqa-justify-center cqa-flex-shrink-0\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 4L10 8L6 12\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span> -->\n </button>\n </div>\n </div>\n\n <!-- Footer -->\n <div *ngIf=\"hasItems\" class=\"cqa-px-6 cqa-pb-5 cqa-pt-3\">\n <p class=\"cqa-text-xs cqa-text-[#6B7280] cqa-font-inter cqa-font-normal\">\n {{ itemsCount }} {{ itemsCount === 1 ? 'step' : 'steps' }} found\n </p>\n </div>\n </div>\n</div>\n", styles: [] }]
108
- }], propDecorators: { isOpen: [{
229
+ args: [{ selector: 'cqa-jump-to-step-modal', host: { class: 'cqa-ui-root' }, template: "<div *ngIf=\"isOpen\"\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-50 cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-lg cqa-bg-white cqa-shadow-lg cqa-w-full cqa-max-w-[500px] cqa-overflow-hidden cqa-flex cqa-flex-col\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808; max-height: 90vh;\"\n (click)=\"$event.stopPropagation()\">\n\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-6 cqa-pt-6 cqa-pb-4\">\n <h2 class=\"cqa-text-base cqa-font-semibold cqa-text-[#0A0A0A] cqa-leading-[24px] cqa-font-inter\">\n {{ title }}\n </h2>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-6 cqa-h-6 cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer cqa-text-gray-500 hover:cqa-text-gray-700 cqa-transition-colors\"\n (click)=\"handleClose()\"\n aria-label=\"Close modal\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px] !cqa-block !cqa-leading-none\">close</mat-icon>\n </button>\n </div>\n\n\n <!-- Search Bar -->\n <div *ngIf=\"enableSearch\" class=\"cqa-px-6 cqa-pb-4\">\n <cqa-search-bar\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [fullWidth]=\"true\"\n (valueChange)=\"onSearchValueChange($event)\">\n </cqa-search-bar>\n </div>\n\n <!-- Divider below search -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Steps List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-px-6 cqa-pt-2\" style=\"scrollbar-width: thin;\">\n <!-- Empty State -->\n <div *ngIf=\"!hasItems\" class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-12 cqa-text-center\">\n <p class=\"cqa-text-sm cqa-text-gray-500 cqa-font-inter\">\n {{searchEmptyStateLabel || 'No Data found.'}}\n </p>\n </div>\n\n <!-- Steps List -->\n <div *ngIf=\"hasItems\" class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n\n <!-- Prerequisite steps: accordion by test case name (styled like cqa-main-step-collapse) -->\n <ng-container *ngIf=\"showPrerequisites && prerequisiteGroups?.length\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-mb-1\">\n <ng-container *ngFor=\"let group of prerequisiteGroups\">\n <div\n class=\"cqa-mt-2 cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2 cqa-cursor-pointer cqa-bg-[#EEF2FF] cqa-rounded-[4px] cqa-border cqa-border-[#C6D2FF] cqa-border-solid cqa-w-full\"\n (click)=\"toggleGroup(group.name)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-w-full\">\n <div>\n <svg [class.cqa-rotate-180]=\"isGroupExpanded(group.name)\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#4F39F6\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span class=\"cqa-font-semibold cqa-text-[14px] cqa-leading-[17px] cqa-text-[#312C85] cqa-flex-1\">\n {{ group.name }}\n </span>\n </div>\n </div>\n <div *ngIf=\"isGroupExpanded(group.name)\" class=\"cqa-mt-2 cqa-flex cqa-flex-col cqa-gap-2 cqa-px-2.5\">\n <button\n *ngFor=\"let item of group.items; trackBy: trackByItemId\"\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-3 cqa-py-3 cqa-w-full cqa-text-left cqa-border-0 cqa-bg-transparent hover:cqa-bg-gray-50 cqa-cursor-pointer cqa-transition-colors cqa-rounded-md cqa-min-w-0\"\n (click)=\"onItemClick(item)\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-rounded-[6px] cqa-text-xs cqa-font-medium cqa-py-[4px] cqa-px-[10px] cqa-flex-shrink-0 cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-text-[#3F43EE] cqa-bg-[#F8F9FF]\"\n style=\"min-width: 32px;\">{{ item.stepNumber }}</span>\n <span class=\"cqa-flex-1 cqa-text-sm cqa-text-[#0A0A0A] cqa-font-inter cqa-font-normal cqa-leading-[20px] cqa-min-w-0 cqa-truncate\">{{ item.description }}</span>\n <span class=\"cqa-flex-shrink-0\" [ngClass]=\"getStatusBadgeClasses(item.status)\">{{ item.status }}</span>\n </button>\n </div>\n </ng-container>\n </div>\n <div *ngIf=\"filteredStepItems?.length\" class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB] cqa-my-1 cqa-mb-2\" role=\"presentation\"></div>\n </ng-container>\n\n <!-- Main test steps section -->\n <ng-container *ngIf=\"filteredStepItems?.length\">\n <div class=\"cqa-mb-1\">\n <span class=\"cqa-text-xs cqa-font-medium cqa-text-[#6B7280] cqa-uppercase cqa-tracking-wide\">\n Test steps\n </span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <button\n *ngFor=\"let item of filteredStepItems; trackBy: trackByItemId\"\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-3 cqa-py-3 cqa-w-full cqa-text-left cqa-border-0 cqa-bg-transparent hover:cqa-bg-gray-50 cqa-cursor-pointer cqa-transition-colors cqa-rounded-md cqa-min-w-0\"\n (click)=\"onItemClick(item)\">\n\n <!-- Step Number Badge -->\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-rounded-[6px] cqa-text-xs cqa-font-medium cqa-py-[4px] cqa-px-[10px] cqa-flex-shrink-0 cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-text-[#3F43EE] cqa-bg-[#F8F9FF]\"\n style=\"min-width: 32px;\">\n {{ item.stepNumber }}\n </span>\n\n <!-- Step Description -->\n <span class=\"cqa-flex-1 cqa-text-sm cqa-text-[#0A0A0A] cqa-font-inter cqa-font-normal cqa-leading-[20px] cqa-min-w-0 cqa-truncate\">\n {{ item.description }}\n </span>\n\n <!-- Status Badge -->\n <span class=\"cqa-flex-shrink-0\" [ngClass]=\"getStatusBadgeClasses(item.status)\">\n {{ item.status }}\n </span>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Footer -->\n <div *ngIf=\"hasItems\" class=\"cqa-px-6 cqa-pb-5 cqa-pt-3\">\n <p class=\"cqa-text-xs cqa-text-[#6B7280] cqa-font-inter cqa-font-normal\">\n {{ itemsCount }} {{ itemsCount === 1 ? 'step' : 'steps' }} found\n </p>\n </div>\n </div>\n</div>\n", styles: [] }]
230
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { isOpen: [{
109
231
  type: Input
110
232
  }], title: [{
111
233
  type: Input
112
234
  }], items: [{
113
235
  type: Input
236
+ }], combinedTestCases: [{
237
+ type: Input
238
+ }], stepsMeta: [{
239
+ type: Input
114
240
  }], searchPlaceholder: [{
115
241
  type: Input
116
242
  }], searchEmptyStateLabel: [{
@@ -119,6 +245,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
119
245
  type: Input
120
246
  }], enableSearch: [{
121
247
  type: Input
248
+ }], showPrerequisites: [{
249
+ type: Input
122
250
  }], onClose: [{
123
251
  type: Output
124
252
  }], onSearch: [{
@@ -126,4 +254,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
126
254
  }], onSelect: [{
127
255
  type: Output
128
256
  }] } });
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianVtcC10by1zdGVwLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9qdW1wLXRvLXN0ZXAtbW9kYWwvanVtcC10by1zdGVwLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9qdW1wLXRvLXN0ZXAtbW9kYWwvanVtcC10by1zdGVwLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLE1BQU0sZUFBZSxDQUFDOzs7OztBQWtCakcsTUFBTSxPQUFPLHdCQUF3QjtJQU5yQztRQU9FLGdDQUFnQztRQUN2QixXQUFNLEdBQVksS0FBSyxDQUFDO1FBRWpDLGtCQUFrQjtRQUNULFVBQUssR0FBVyxjQUFjLENBQUM7UUFFeEMsb0NBQW9DO1FBQzNCLFVBQUssR0FBcUIsRUFBRSxDQUFDO1FBRXRDLDhCQUE4QjtRQUNyQixzQkFBaUIsR0FBVyxtQ0FBbUMsQ0FBQztRQUV6RSw4QkFBOEI7UUFDckIsMEJBQXFCLEdBQVcsZ0JBQWdCLENBQUM7UUFFMUQsMkJBQTJCO1FBQ2xCLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBRWxDLGdDQUFnQztRQUN2QixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUV0QyxxQ0FBcUM7UUFDckMsa0JBQWEsR0FBcUIsRUFBRSxDQUFDO1FBRXJDLDBDQUEwQztRQUNoQyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUU3Qyx3Q0FBd0M7UUFDOUIsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFaEQsMkNBQTJDO1FBQ2pDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztLQXVGekQ7SUFyRkMsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUM5QyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUM1QjtJQUNILENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3ZELElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQyxPQUFPO1NBQ1I7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDNUMsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbkYsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM3RSxPQUFPLGVBQWUsSUFBSSxnQkFBZ0IsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFhO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBb0I7UUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFpQjtRQUMvQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBcUIsQ0FBQztRQUMzQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBNEIsQ0FBQztRQUV6RCxJQUFJLE1BQU0sS0FBSyxhQUFhLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUMzRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELHFCQUFxQixDQUFDLE1BQXNCO1FBQzFDLE1BQU0sV0FBVyxHQUFHLHlIQUF5SCxDQUFDO1FBRTlJLFFBQVEsTUFBTSxFQUFFO1lBQ2QsS0FBSyxRQUFRO2dCQUNYLE9BQU8sR0FBRyxXQUFXLHNDQUFzQyxDQUFDO1lBQzlELEtBQUssU0FBUztnQkFDWixPQUFPLEdBQUcsV0FBVyxvQ0FBb0MsQ0FBQztZQUM1RCxLQUFLLFNBQVM7Z0JBQ1osT0FBTyxHQUFHLFdBQVcsb0NBQW9DLENBQUM7WUFDNUQsS0FBSyxRQUFRO2dCQUNYLE9BQU8sR0FBRyxXQUFXLGtDQUFrQyxDQUFDO1lBQzFELEtBQUssU0FBUztnQkFDWixPQUFPLEdBQUcsV0FBVyxvQ0FBb0MsQ0FBQztZQUM1RCxLQUFLLFNBQVM7Z0JBQ1osT0FBTyxHQUFHLFdBQVcsb0NBQW9DLENBQUM7WUFDNUQ7Z0JBQ0UsT0FBTyxHQUFHLFdBQVcsb0NBQW9DLENBQUM7U0FDN0Q7SUFDSCxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxnR0FBZ0c7SUFDaEcsT0FBTyxDQUFDLEtBQXNCO1FBQzVCLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQWEsRUFBRSxJQUFvQjtRQUMvQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDakIsQ0FBQzs7cUhBdEhVLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLHlaQ2xCckMsMm1JQXlGQTsyRkR2RWEsd0JBQXdCO2tCQU5wQyxTQUFTOytCQUNFLHdCQUF3QixRQUc1QixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7OEJBSXJCLE1BQU07c0JBQWQsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csS0FBSztzQkFBYixLQUFLO2dCQUdHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFHRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxZQUFZO3NCQUFwQixLQUFLO2dCQU1JLE9BQU87c0JBQWhCLE1BQU07Z0JBR0csUUFBUTtzQkFBakIsTUFBTTtnQkFHRyxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgdHlwZSBTdGVwSXRlbVN0YXR1cyA9ICdwYXNzZWQnIHwgJ2N1cnJlbnQnIHwgJ3BlbmRpbmcnIHwgJ2ZhaWxlZCcgfCAncnVubmluZycgfCAnc2tpcHBlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSnVtcFRvU3RlcEl0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBzdGVwTnVtYmVyOiBzdHJpbmcgfCBudW1iZXI7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHN0YXR1czogU3RlcEl0ZW1TdGF0dXM7XG4gIFtrZXk6IHN0cmluZ106IGFueTsgLy8gQWxsb3cgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1qdW1wLXRvLXN0ZXAtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vanVtcC10by1zdGVwLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9XG59KVxuZXhwb3J0IGNsYXNzIEp1bXBUb1N0ZXBNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKiBXaGV0aGVyIHRoZSBtb2RhbCBpcyBvcGVuICovXG4gIEBJbnB1dCgpIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBNb2RhbCB0aXRsZSAqL1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ0p1bXAgdG8gU3RlcCc7XG5cbiAgLyoqIExpc3Qgb2Ygc3RlcCBpdGVtcyB0byBkaXNwbGF5ICovXG4gIEBJbnB1dCgpIGl0ZW1zOiBKdW1wVG9TdGVwSXRlbVtdID0gW107XG5cbiAgLyoqIFNlYXJjaCBwbGFjZWhvbGRlciB0ZXh0ICovXG4gIEBJbnB1dCgpIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoIHN0ZXBzIGJ5IG5hbWUgb3IgbnVtYmVyLi4uJztcblxuICAvKiogU2VhcmNoIEVtcHR5IFN0YXRlIHRleHQgKi9cbiAgQElucHV0KCkgc2VhcmNoRW1wdHlTdGF0ZUxhYmVsOiBzdHJpbmcgPSAnTm8gc3RlcHMgZm91bmQnO1xuXG4gIC8qKiBDdXJyZW50IHNlYXJjaCB2YWx1ZSAqL1xuICBASW5wdXQoKSBzZWFyY2hWYWx1ZTogc3RyaW5nID0gJyc7XG5cbiAgLyoqIFdoZXRoZXIgc2VhcmNoIGlzIGVuYWJsZWQgKi9cbiAgQElucHV0KCkgZW5hYmxlU2VhcmNoOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKiogRmlsdGVyZWQgaXRlbXMgYmFzZWQgb24gc2VhcmNoICovXG4gIGZpbHRlcmVkSXRlbXM6IEp1bXBUb1N0ZXBJdGVtW10gPSBbXTtcblxuICAvKiogRW1pdHRlZCB3aGVuIG1vZGFsIHNob3VsZCBiZSBjbG9zZWQgKi9cbiAgQE91dHB1dCgpIG9uQ2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiBzZWFyY2ggdmFsdWUgY2hhbmdlcyAqL1xuICBAT3V0cHV0KCkgb25TZWFyY2ggPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIGEgc3RlcCBpdGVtIGlzIHNlbGVjdGVkICovXG4gIEBPdXRwdXQoKSBvblNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8SnVtcFRvU3RlcEl0ZW0+KCk7XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydpdGVtcyddIHx8IGNoYW5nZXNbJ3NlYXJjaFZhbHVlJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWRJdGVtcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmlsdGVyZWRJdGVtcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXRlbXMgfHwgdGhpcy5pdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zZWFyY2hWYWx1ZSB8fCB0aGlzLnNlYXJjaFZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IFsuLi50aGlzLml0ZW1zXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hUZXJtID0gdGhpcy5zZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGNvbnN0IHN0ZXBOdW1iZXJNYXRjaCA9IFN0cmluZyhpdGVtLnN0ZXBOdW1iZXIpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybSk7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbk1hdGNoID0gaXRlbS5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0pO1xuICAgICAgcmV0dXJuIHN0ZXBOdW1iZXJNYXRjaCB8fCBkZXNjcmlwdGlvbk1hdGNoO1xuICAgIH0pO1xuICB9XG5cbiAgb25TZWFyY2hWYWx1ZUNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMub25TZWFyY2guZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbkl0ZW1DbGljayhpdGVtOiBKdW1wVG9TdGVwSXRlbSk6IHZvaWQge1xuICAgIHRoaXMub25TZWxlY3QuZW1pdChpdGVtKTtcbiAgfVxuXG4gIG9uQmFja2Ryb3BDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBcbiAgICBpZiAodGFyZ2V0ID09PSBjdXJyZW50VGFyZ2V0IHx8IHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ21vZGFsLWJhY2tkcm9wJykpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVDbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2xvc2UuZW1pdCgpO1xuICB9XG5cbiAgZ2V0U3RhdHVzQmFkZ2VDbGFzc2VzKHN0YXR1czogU3RlcEl0ZW1TdGF0dXMpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gJ2NxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcm91bmRlZC1bNnB4XSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW0gY3FhLXB5LVs0cHhdIGNxYS1weC0zJztcbiAgICBcbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSAncGFzc2VkJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctZ3JlZW4tMTAwIGNxYS10ZXh0LWdyZWVuLTgwMGA7XG4gICAgICBjYXNlICdjdXJyZW50JzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctYmx1ZS0xMDAgY3FhLXRleHQtYmx1ZS04MDBgO1xuICAgICAgY2FzZSAncGVuZGluZyc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWdyYXktMTAwIGNxYS10ZXh0LWdyYXktODAwYDtcbiAgICAgIGNhc2UgJ2ZhaWxlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLXJlZC0xMDAgY3FhLXRleHQtcmVkLTgwMGA7XG4gICAgICBjYXNlICdydW5uaW5nJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctYmx1ZS0xMDAgY3FhLXRleHQtYmx1ZS04MDBgO1xuICAgICAgY2FzZSAnc2tpcHBlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWdyYXktMTAwIGNxYS10ZXh0LWdyYXktODAwYDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWdyYXktMTAwIGNxYS10ZXh0LWdyYXktODAwYDtcbiAgICB9XG4gIH1cblxuICBnZXQgaGFzSXRlbXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRJdGVtcyAmJiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGdldCBpdGVtc0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRJdGVtcyA/IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggOiAwO1xuICB9XG5cbiAgLyoqIENvbnZlcnQgc3RlcE51bWJlciB0byBzdHJpbmcgZm9yIHRoZSBiYWRnZSBsYWJlbCAoU3RyaW5nKCkgaXMgbm90IGF2YWlsYWJsZSBpbiB0ZW1wbGF0ZXMpICovXG4gIHRvTGFiZWwodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuICcnICsgdmFsdWU7XG4gIH1cblxuICB0cmFja0J5SXRlbUlkKGluZGV4OiBudW1iZXIsIGl0ZW06IEp1bXBUb1N0ZXBJdGVtKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXRlbS5pZDtcbiAgfVxufVxuXG4iLCI8ZGl2ICpuZ0lmPVwiaXNPcGVuXCJcbiAgY2xhc3M9XCJtb2RhbC1iYWNrZHJvcCBjcWEtZml4ZWQgY3FhLWluc2V0LTAgY3FhLWJnLWJsYWNrIGNxYS1iZy1vcGFjaXR5LTUwIGNxYS16LTUwIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIlxuICAoY2xpY2spPVwib25CYWNrZHJvcENsaWNrKCRldmVudClcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLXJvdW5kZWQtbGcgY3FhLWJnLXdoaXRlIGNxYS1zaGFkb3ctbGcgIGNxYS13LWZ1bGwgY3FhLW1heC13LVs1MDBweF0gY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtZmxleCBjcWEtZmxleC1jb2xcIlxuICAgIHN0eWxlPVwiYm94LXNoYWRvdzogMHB4IDhweCA4cHggLTRweCAjMTAxODI4MDg7IG1heC1oZWlnaHQ6IDkwdmg7XCJcbiAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG5cbiAgICA8IS0tIEhlYWRlciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1weC02IGNxYS1wdC02IGNxYS1wYi00XCI+XG4gICAgICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1iYXNlIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtbGVhZGluZy1bMjRweF0gY3FhLWZvbnQtaW50ZXJcIj5cbiAgICAgICAge3sgdGl0bGUgfX1cbiAgICAgIDwvaDI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTYgY3FhLWgtNiBjcWEtcC0wIGNxYS1ib3JkZXItMCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10ZXh0LWdyYXktNTAwIGhvdmVyOmNxYS10ZXh0LWdyYXktNzAwIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgIChjbGljayk9XCJoYW5kbGVDbG9zZSgpXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlIG1vZGFsXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy01ICFjcWEtaC01ICFjcWEtdGV4dC1bMjBweF0gIWNxYS1ibG9jayAhY3FhLWxlYWRpbmctbm9uZVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG5cbiAgICA8IS0tIFNlYXJjaCBCYXIgLS0+XG4gICAgPGRpdiAqbmdJZj1cImVuYWJsZVNlYXJjaFwiIGNsYXNzPVwiY3FhLXB4LTYgY3FhLXBiLTRcIj5cbiAgICAgIDxjcWEtc2VhcmNoLWJhclxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXJcIlxuICAgICAgICBbdmFsdWVdPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25TZWFyY2hWYWx1ZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICA8L2NxYS1zZWFyY2gtYmFyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBEaXZpZGVyIGJlbG93IHNlYXJjaCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLS1teC0yIGNxYS13LVtjYWxjKDEwMCUrMXJlbSldIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWgtcHggY3FhLXctZnVsbCBjcWEtYmctWyNFNUU3RUJdXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdGVwcyBMaXN0IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1vdmVyZmxvdy15LWF1dG8gY3FhLW92ZXJmbG93LXgtaGlkZGVuIGNxYS1weC02IGNxYS1wdC0yXCIgc3R5bGU9XCJzY3JvbGxiYXItd2lkdGg6IHRoaW47XCI+XG4gICAgICA8IS0tIEVtcHR5IFN0YXRlIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIiFoYXNJdGVtc1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1weS0xMiBjcWEtdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1ncmF5LTUwMCBjcWEtZm9udC1pbnRlclwiPlxuICAgICAgICAge3tzZWFyY2hFbXB0eVN0YXRlTGFiZWwgfHwgJ05vIERhdGEgZm91bmQuJ319XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXBzIExpc3QgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaGFzSXRlbXNcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRJdGVtczsgdHJhY2tCeTogdHJhY2tCeUl0ZW1JZFwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHgtMyBjcWEtcHktMyBjcWEtdy1mdWxsIGNxYS10ZXh0LWxlZnQgY3FhLWJvcmRlci0wIGNxYS1iZy10cmFuc3BhcmVudCBob3ZlcjpjcWEtYmctZ3JheS01MCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tY29sb3JzIGNxYS1yb3VuZGVkLW1kIGNxYS1taW4tdy0wXCJcbiAgICAgICAgICAoY2xpY2spPVwib25JdGVtQ2xpY2soaXRlbSlcIj5cblxuICAgICAgICAgIDwhLS0gU3RlcCBOdW1iZXIgQmFkZ2UgLS0+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXJvdW5kZWQtWzZweF0gY3FhLXRleHQteHMgY3FhLWZvbnQtbWVkaXVtIGNxYS1weS1bNHB4XSBjcWEtcHgtWzEwcHhdIGNxYS1mbGV4LXNocmluay0wIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLWJnLVsjRjhGOUZGXVwiXG4gICAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDogMzJweDtcIj5cbiAgICAgICAgICAgIHt7IGl0ZW0uc3RlcE51bWJlciB9fVxuICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgIDwhLS0gU3RlcCBEZXNjcmlwdGlvbiAtLT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXRleHQtc20gY3FhLXRleHQtWyMwQTBBMEFdIGNxYS1mb250LWludGVyIGNxYS1mb250LW5vcm1hbCBjcWEtbGVhZGluZy1bMjBweF0gY3FhLW1pbi13LTAgY3FhLXRydW5jYXRlXCI+XG4gICAgICAgICAgICB7eyBpdGVtLmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgPCEtLSBTdGF0dXMgQmFkZ2UgLS0+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMFwiIFtuZ0NsYXNzXT1cImdldFN0YXR1c0JhZGdlQ2xhc3NlcyhpdGVtLnN0YXR1cylcIj5cbiAgICAgICAgICAgIHt7IGl0ZW0uc3RhdHVzIH19XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgPCEtLSBSaWdodCBBcnJvdyBJY29uLS0+XG4gICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02IDRMMTAgOEw2IDEyXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvc3Bhbj4gLS0+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEZvb3RlciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaGFzSXRlbXNcIiBjbGFzcz1cImNxYS1weC02IGNxYS1wYi01IGNxYS1wdC0zXCI+XG4gICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtZm9udC1pbnRlciBjcWEtZm9udC1ub3JtYWxcIj5cbiAgICAgICAge3sgaXRlbXNDb3VudCB9fSB7eyBpdGVtc0NvdW50ID09PSAxID8gJ3N0ZXAnIDogJ3N0ZXBzJyB9fSBmb3VuZFxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianVtcC10by1zdGVwLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9qdW1wLXRvLXN0ZXAtbW9kYWwvanVtcC10by1zdGVwLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9qdW1wLXRvLXN0ZXAtbW9kYWwvanVtcC10by1zdGVwLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStDLE1BQU0sZUFBZSxDQUFDOzs7OztBQXVDcEgsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQyxZQUE2QixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUVuRCxnQ0FBZ0M7UUFDdkIsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUVqQyxrQkFBa0I7UUFDVCxVQUFLLEdBQVcsY0FBYyxDQUFDO1FBRXhDLHVGQUF1RjtRQUM5RSxVQUFLLEdBQXFCLEVBQUUsQ0FBQztRQUV0QyxxR0FBcUc7UUFDNUYsc0JBQWlCLEdBQTRCLEVBQUUsQ0FBQztRQUV6RCxrSEFBa0g7UUFDekcsY0FBUyxHQUF5QixFQUFFLENBQUM7UUFFOUMsOEJBQThCO1FBQ3JCLHNCQUFpQixHQUFXLG1DQUFtQyxDQUFDO1FBRXpFLDhCQUE4QjtRQUNyQiwwQkFBcUIsR0FBVyxnQkFBZ0IsQ0FBQztRQUUxRCwyQkFBMkI7UUFDbEIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFFbEMsZ0NBQWdDO1FBQ3ZCLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBRXRDLGdFQUFnRTtRQUN2RCxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFFM0MscUNBQXFDO1FBQ3JDLGtCQUFhLEdBQXFCLEVBQUUsQ0FBQztRQUVyQyw4RUFB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LE1BQU07Z0JBR0csUUFBUTtzQkFBakIsTUFBTTtnQkFHRyxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgU3RlcEl0ZW1TdGF0dXMgPSAncGFzc2VkJyB8ICdjdXJyZW50JyB8ICdwZW5kaW5nJyB8ICdmYWlsZWQnIHwgJ3J1bm5pbmcnIHwgJ3NraXBwZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEp1bXBUb1N0ZXBJdGVtIHtcbiAgaWQ6IHN0cmluZztcbiAgc3RlcE51bWJlcjogc3RyaW5nIHwgbnVtYmVyO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBzdGF0dXM6IFN0ZXBJdGVtU3RhdHVzO1xuICAvKiogU3RlcCBpZCBmb3Igc2VsZWN0aW9uLiBXaGVuIG1pc3NpbmcsIGRlcml2ZWQgZnJvbSBpZC4gKi9cbiAgc3RlcElkPzogbnVtYmVyO1xuICAvKiogT3B0aW9uYWwgZmxhZyB0byBpbmRpY2F0ZSB0aGlzIGl0ZW0gcmVwcmVzZW50cyBhIHByZXJlcXVpc2l0ZSBzdGVwLiAqL1xuICBpc1ByZXJlcXVpc2l0ZT86IGJvb2xlYW47XG4gIC8qKiBPcHRpb25hbCBncm91cCBuYW1lIChlLmcuIHByZXJlcXVpc2l0ZSB0ZXN0IGNhc2UgbmFtZSkgZm9yIHZpc3VhbCBncm91cGluZy4gKi9cbiAgZ3JvdXBOYW1lPzogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93IGFkZGl0aW9uYWwgcHJvcGVydGllc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEp1bXBUb1N0ZXBTdGVwTWV0YSB7XG4gIHN0ZXBJZDogbnVtYmVyO1xuICBsYWJlbDogc3RyaW5nO1xuICBzdGVwTnVtYmVyOiBzdHJpbmc7XG4gIHN0YXR1czogU3RlcEl0ZW1TdGF0dXM7XG4gIGlzUHJlcmVxdWlzaXRlPzogYm9vbGVhbjtcbiAgZ3JvdXBOYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbWJpbmVkVGVzdENhc2VHcm91cCB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGlzUHJlcmVxdWlzaXRlPzogYm9vbGVhbjtcbiAgc3RlcHM/OiBhbnlbXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWp1bXAtdG8tc3RlcC1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9qdW1wLXRvLXN0ZXAtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH1cbn0pXG5leHBvcnQgY2xhc3MgSnVtcFRvU3RlcE1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBtb2RhbCBpcyBvcGVuICovXG4gIEBJbnB1dCgpIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBNb2RhbCB0aXRsZSAqL1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ0p1bXAgdG8gU3RlcCc7XG5cbiAgLyoqIExpc3Qgb2Ygc3RlcCBpdGVtcyB0byBkaXNwbGF5IChsZWdhY3k7IHVzZWQgd2hlbiBjb21iaW5lZFRlc3RDYXNlcyBub3QgcHJvdmlkZWQpICovXG4gIEBJbnB1dCgpIGl0ZW1zOiBKdW1wVG9TdGVwSXRlbVtdID0gW107XG5cbiAgLyoqIENvbWJpbmVkIHRlc3QgY2FzZXMgZm9yIGFjY29yZGlvbiBsYXlvdXQuIFdoZW4gcHJvdmlkZWQgd2l0aCBzdGVwc01ldGEsIHVzZWQgaW5zdGVhZCBvZiBpdGVtcy4gKi9cbiAgQElucHV0KCkgY29tYmluZWRUZXN0Q2FzZXM6IENvbWJpbmVkVGVzdENhc2VHcm91cFtdID0gW107XG5cbiAgLyoqIFByZS1jb21wdXRlZCBzdGVwIG1ldGFkYXRhIChzdGVwTnVtYmVyLCBzdGF0dXMsIGV0Yy4pIGZvciBlYWNoIHN0ZXAuIFJlcXVpcmVkIHdoZW4gdXNpbmcgY29tYmluZWRUZXN0Q2FzZXMuICovXG4gIEBJbnB1dCgpIHN0ZXBzTWV0YTogSnVtcFRvU3RlcFN0ZXBNZXRhW10gPSBbXTtcblxuICAvKiogU2VhcmNoIHBsYWNlaG9sZGVyIHRleHQgKi9cbiAgQElucHV0KCkgc2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZyA9ICdTZWFyY2ggc3RlcHMgYnkgbmFtZSBvciBudW1iZXIuLi4nO1xuXG4gIC8qKiBTZWFyY2ggRW1wdHkgU3RhdGUgdGV4dCAqL1xuICBASW5wdXQoKSBzZWFyY2hFbXB0eVN0YXRlTGFiZWw6IHN0cmluZyA9ICdObyBzdGVwcyBmb3VuZCc7XG5cbiAgLyoqIEN1cnJlbnQgc2VhcmNoIHZhbHVlICovXG4gIEBJbnB1dCgpIHNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcblxuICAvKiogV2hldGhlciBzZWFyY2ggaXMgZW5hYmxlZCAqL1xuICBASW5wdXQoKSBlbmFibGVTZWFyY2g6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgcHJlcmVxdWlzaXRlIHN0ZXBzIHNlY3Rpb24uIERlZmF1bHQgdHJ1ZS4gKi9cbiAgQElucHV0KCkgc2hvd1ByZXJlcXVpc2l0ZXM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKiBGaWx0ZXJlZCBpdGVtcyBiYXNlZCBvbiBzZWFyY2ggKi9cbiAgZmlsdGVyZWRJdGVtczogSnVtcFRvU3RlcEl0ZW1bXSA9IFtdO1xuXG4gIC8qKiBQcmVyZXF1aXNpdGUgZ3JvdXBzIGZvciBhY2NvcmRpb246IGVhY2ggcHJlcmVxdWlzaXRlIHRlc3QgY2FzZSBieSBuYW1lLiAqL1xuICBwcmVyZXF1aXNpdGVHcm91cHM6IHsgbmFtZTogc3RyaW5nOyBpdGVtczogSnVtcFRvU3RlcEl0ZW1bXSB9W10gPSBbXTtcblxuICAvKiogRmlsdGVyZWQgbm9uLXByZXJlcXVpc2l0ZSBzdGVwIGl0ZW1zLiAqL1xuICBmaWx0ZXJlZFN0ZXBJdGVtczogSnVtcFRvU3RlcEl0ZW1bXSA9IFtdO1xuXG4gIC8qKiBFeHBhbmRlZCBwcmVyZXF1aXNpdGUgZ3JvdXAgbmFtZXMuIFdoZW4gZW1wdHksIGFsbCBncm91cHMgYXJlIGNvbGxhcHNlZCBieSBkZWZhdWx0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGV4cGFuZGVkR3JvdXBOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gbW9kYWwgc2hvdWxkIGJlIGNsb3NlZCAqL1xuICBAT3V0cHV0KCkgb25DbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIHNlYXJjaCB2YWx1ZSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBvblNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBzdGVwIGl0ZW0gaXMgc2VsZWN0ZWQgKi9cbiAgQE91dHB1dCgpIG9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxKdW1wVG9TdGVwSXRlbT4oKTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2l0ZW1zJ10gfHwgY2hhbmdlc1snY29tYmluZWRUZXN0Q2FzZXMnXSB8fCBjaGFuZ2VzWydzdGVwc01ldGEnXSB8fCBjaGFuZ2VzWydzZWFyY2hWYWx1ZSddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkSXRlbXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpbHRlcmVkSXRlbXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tYmluZWRUZXN0Q2FzZXM/Lmxlbmd0aCAmJiB0aGlzLnN0ZXBzTWV0YT8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmJ1aWxkRnJvbUNvbWJpbmVkVGVzdENhc2VzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYnVpbGRGcm9tSXRlbXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gW107XG4gICAgICB0aGlzLnByZXJlcXVpc2l0ZUdyb3VwcyA9IFtdO1xuICAgICAgdGhpcy5maWx0ZXJlZFN0ZXBJdGVtcyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGcm9tQ29tYmluZWRUZXN0Q2FzZXMoKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YUJ5U3RlcElkID0gbmV3IE1hcDxudW1iZXIsIEp1bXBUb1N0ZXBTdGVwTWV0YT4oKTtcbiAgICB0aGlzLnN0ZXBzTWV0YS5mb3JFYWNoKG0gPT4gbWV0YUJ5U3RlcElkLnNldChtLnN0ZXBJZCwgbSkpO1xuXG4gICAgY29uc3Qgc2VhcmNoVGVybSA9ICh0aGlzLnNlYXJjaFZhbHVlIHx8ICcnKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICBjb25zdCBtYXRjaGVzU2VhcmNoID0gKG1ldGE6IEp1bXBUb1N0ZXBTdGVwTWV0YSk6IGJvb2xlYW4gPT4ge1xuICAgICAgaWYgKCFzZWFyY2hUZXJtKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIFN0cmluZyhtZXRhLnN0ZXBOdW1iZXIpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybSkgfHxcbiAgICAgICAgKG1ldGEubGFiZWwgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybSlcbiAgICAgICk7XG4gICAgfTtcblxuICAgIHRoaXMucHJlcmVxdWlzaXRlR3JvdXBzID0gW107XG4gICAgdGhpcy5maWx0ZXJlZFN0ZXBJdGVtcyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLmNvbWJpbmVkVGVzdENhc2VzKSB7XG4gICAgICBpZiAoIWdyb3VwPy5zdGVwcz8ubGVuZ3RoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZ3JvdXBOYW1lID0gKGdyb3VwLm5hbWUgfHwgJ1ByZXJlcXVpc2l0ZScpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBpc1ByZXJlcSA9ICEhZ3JvdXAuaXNQcmVyZXF1aXNpdGU7XG5cbiAgICAgIGNvbnN0IGNvbGxlY3RTdGVwcyA9IChzdGVwczogYW55W10sIHNlZW46IFNldDxudW1iZXI+KTogSnVtcFRvU3RlcEl0ZW1bXSA9PiB7XG4gICAgICAgIGNvbnN0IG91dDogSnVtcFRvU3RlcEl0ZW1bXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc3RlcHMpIHtcbiAgICAgICAgICBpZiAoIXMpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IGlkID0gcz8uaWQgPz8gcz8uc3RlcF9pZDtcbiAgICAgICAgICBjb25zdCBudW1JZCA9IGlkICE9IG51bGwgPyBOdW1iZXIoaWQpIDogTmFOO1xuICAgICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG51bUlkKSB8fCBzZWVuLmhhcyhudW1JZCkpIGNvbnRpbnVlO1xuICAgICAgICAgIHNlZW4uYWRkKG51bUlkKTtcblxuICAgICAgICAgIGNvbnN0IG1ldGEgPSBtZXRhQnlTdGVwSWQuZ2V0KG51bUlkKTtcbiAgICAgICAgICBpZiAobWV0YSAmJiBtYXRjaGVzU2VhcmNoKG1ldGEpKSB7XG4gICAgICAgICAgICBvdXQucHVzaCh7XG4gICAgICAgICAgICAgIGlkOiBTdHJpbmcobnVtSWQpLFxuICAgICAgICAgICAgICBzdGVwSWQ6IG51bUlkLFxuICAgICAgICAgICAgICBzdGVwTnVtYmVyOiBtZXRhLnN0ZXBOdW1iZXIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnN0cmlwSHRtbChtZXRhLmxhYmVsIHx8ICgnU3RlcCAnICsgbWV0YS5zdGVwTnVtYmVyKSksXG4gICAgICAgICAgICAgIHN0YXR1czogbWV0YS5zdGF0dXMsXG4gICAgICAgICAgICAgIGlzUHJlcmVxdWlzaXRlOiBtZXRhLmlzUHJlcmVxdWlzaXRlLFxuICAgICAgICAgICAgICBncm91cE5hbWU6IG1ldGEuZ3JvdXBOYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCBhcnIgb2YgW3MuY2hpbGRyZW4gfHwgW10sIHMubmVzdGVkU3RlcHMgfHwgW10sIHMuc3RlcHMgfHwgW11dKSB7XG4gICAgICAgICAgICBpZiAoYXJyPy5sZW5ndGgpIG91dC5wdXNoKC4uLmNvbGxlY3RTdGVwcyhhcnIsIHNlZW4pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMuYnJhbmNoZXMgJiYgQXJyYXkuaXNBcnJheShzLmJyYW5jaGVzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBiIG9mIHMuYnJhbmNoZXMpIHtcbiAgICAgICAgICAgICAgaWYgKGI/LnN1YlN0ZXBzPy5sZW5ndGgpIG91dC5wdXNoKC4uLmNvbGxlY3RTdGVwcyhiLnN1YlN0ZXBzLCBzZWVuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgICBjb25zdCBpdGVtcyA9IGNvbGxlY3RTdGVwcyhncm91cC5zdGVwcywgc2Vlbik7XG5cbiAgICAgIGlmIChpc1ByZXJlcSAmJiB0aGlzLnNob3dQcmVyZXF1aXNpdGVzKSB7XG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnByZXJlcXVpc2l0ZUdyb3Vwcy5wdXNoKHsgbmFtZTogZ3JvdXBOYW1lLCBpdGVtcyB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghaXNQcmVyZXEpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZFN0ZXBJdGVtcy5wdXNoKC4uLml0ZW1zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSBbXG4gICAgICAuLi50aGlzLnByZXJlcXVpc2l0ZUdyb3Vwcy5yZWR1Y2U8SnVtcFRvU3RlcEl0ZW1bXT4oKGFjYywgZykgPT4gYWNjLmNvbmNhdChnLml0ZW1zKSwgW10pLFxuICAgICAgLi4udGhpcy5maWx0ZXJlZFN0ZXBJdGVtcyxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZyb21JdGVtcygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWFyY2hUZXJtID0gKHRoaXMuc2VhcmNoVmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGlmICghc2VhcmNoVGVybSkge1xuICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gWy4uLnRoaXMuaXRlbXNdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgY29uc3Qgc3RlcE51bWJlck1hdGNoID0gU3RyaW5nKGl0ZW0uc3RlcE51bWJlcikudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXJtKTtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb25NYXRjaCA9IChpdGVtLmRlc2NyaXB0aW9uIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0pO1xuICAgICAgICByZXR1cm4gc3RlcE51bWJlck1hdGNoIHx8IGRlc2NyaXB0aW9uTWF0Y2g7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVyZXFJdGVtcyA9IHRoaXMuZmlsdGVyZWRJdGVtcy5maWx0ZXIoaSA9PiBpLmlzUHJlcmVxdWlzaXRlID09PSB0cnVlKTtcbiAgICBjb25zdCBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgSnVtcFRvU3RlcEl0ZW1bXT4oKTtcbiAgICBwcmVyZXFJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IChpdGVtLmdyb3VwTmFtZSB8fCAnUHJlcmVxdWlzaXRlJykudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gZ3JvdXBzLmdldChuYW1lKTtcbiAgICAgIGlmIChleGlzdGluZykgZXhpc3RpbmcucHVzaChpdGVtKTtcbiAgICAgIGVsc2UgZ3JvdXBzLnNldChuYW1lLCBbaXRlbV0pO1xuICAgIH0pO1xuICAgIHRoaXMucHJlcmVxdWlzaXRlR3JvdXBzID0gQXJyYXkuZnJvbShncm91cHMuZW50cmllcygpKS5tYXAoKFtuYW1lLCBpdGVtc10pID0+ICh7IG5hbWUsIGl0ZW1zIH0pKTtcbiAgICB0aGlzLmZpbHRlcmVkU3RlcEl0ZW1zID0gdGhpcy5maWx0ZXJlZEl0ZW1zLmZpbHRlcihpID0+IGkuaXNQcmVyZXF1aXNpdGUgIT09IHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdHJpcEh0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWh0bWwpIHJldHVybiAnJztcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcbiAgICByZXR1cm4gKGRpdi50ZXh0Q29udGVudCB8fCBkaXYuaW5uZXJUZXh0IHx8ICcnKS50cmltKCk7XG4gIH1cblxuICBpc0dyb3VwRXhwYW5kZWQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRHcm91cE5hbWVzLmhhcyhuYW1lKTtcbiAgfVxuXG4gIHRvZ2dsZUdyb3VwKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV4cGFuZGVkR3JvdXBOYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRHcm91cE5hbWVzLmRlbGV0ZShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5leHBhbmRlZEdyb3VwTmFtZXMuYWRkKG5hbWUpO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uU2VhcmNoVmFsdWVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLm9uU2VhcmNoLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25JdGVtQ2xpY2soaXRlbTogSnVtcFRvU3RlcEl0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLm9uU2VsZWN0LmVtaXQoaXRlbSk7XG4gIH1cblxuICBvbkJhY2tkcm9wQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgXG4gICAgaWYgKHRhcmdldCA9PT0gY3VycmVudFRhcmdldCB8fCB0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdtb2RhbC1iYWNrZHJvcCcpKSB7XG4gICAgICB0aGlzLmhhbmRsZUNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5vbkNsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIGdldFN0YXR1c0JhZGdlQ2xhc3NlcyhzdGF0dXM6IFN0ZXBJdGVtU3RhdHVzKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9ICdjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXJvdW5kZWQtWzZweF0gY3FhLXRleHQteHMgY3FhLWZvbnQtbWVkaXVtIGNxYS1weS1bNHB4XSBjcWEtcHgtMyc7XG4gICAgXG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgIGNhc2UgJ3Bhc3NlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWdyZWVuLTEwMCBjcWEtdGV4dC1ncmVlbi04MDBgO1xuICAgICAgY2FzZSAnY3VycmVudCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWJsdWUtMTAwIGNxYS10ZXh0LWJsdWUtODAwYDtcbiAgICAgIGNhc2UgJ3BlbmRpbmcnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1ncmF5LTEwMCBjcWEtdGV4dC1ncmF5LTgwMGA7XG4gICAgICBjYXNlICdmYWlsZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1yZWQtMTAwIGNxYS10ZXh0LXJlZC04MDBgO1xuICAgICAgY2FzZSAncnVubmluZyc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWJsdWUtMTAwIGNxYS10ZXh0LWJsdWUtODAwYDtcbiAgICAgIGNhc2UgJ3NraXBwZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1ncmF5LTEwMCBjcWEtdGV4dC1ncmF5LTgwMGA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1ncmF5LTEwMCBjcWEtdGV4dC1ncmF5LTgwMGA7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGhhc0l0ZW1zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkSXRlbXMgJiYgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCA+IDA7XG4gIH1cblxuICBnZXQgaXRlbXNDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkSXRlbXMgPyB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoIDogMDtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IHN0ZXBOdW1iZXIgdG8gc3RyaW5nIGZvciB0aGUgYmFkZ2UgbGFiZWwgKFN0cmluZygpIGlzIG5vdCBhdmFpbGFibGUgaW4gdGVtcGxhdGVzKSAqL1xuICB0b0xhYmVsKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiAnJyArIHZhbHVlO1xuICB9XG5cbiAgdHJhY2tCeUl0ZW1JZChpbmRleDogbnVtYmVyLCBpdGVtOiBKdW1wVG9TdGVwSXRlbSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0uaWQ7XG4gIH1cbn1cblxuIiwiPGRpdiAqbmdJZj1cImlzT3BlblwiXG4gIGNsYXNzPVwibW9kYWwtYmFja2Ryb3AgY3FhLWZpeGVkIGNxYS1pbnNldC0wIGNxYS1iZy1ibGFjayBjcWEtYmctb3BhY2l0eS01MCBjcWEtei01MCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCJcbiAgKGNsaWNrKT1cIm9uQmFja2Ryb3BDbGljaygkZXZlbnQpXCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cImNxYS1yb3VuZGVkLWxnIGNxYS1iZy13aGl0ZSBjcWEtc2hhZG93LWxnICBjcWEtdy1mdWxsIGNxYS1tYXgtdy1bNTAwcHhdIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLWZsZXggY3FhLWZsZXgtY29sXCJcbiAgICBzdHlsZT1cImJveC1zaGFkb3c6IDBweCA4cHggOHB4IC00cHggIzEwMTgyODA4OyBtYXgtaGVpZ2h0OiA5MHZoO1wiXG4gICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuXG4gICAgPCEtLSBIZWFkZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHgtNiBjcWEtcHQtNiBjcWEtcGItNFwiPlxuICAgICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtYmFzZSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLWxlYWRpbmctWzI0cHhdIGNxYS1mb250LWludGVyXCI+XG4gICAgICAgIHt7IHRpdGxlIH19XG4gICAgICA8L2gyPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy02IGNxYS1oLTYgY3FhLXAtMCBjcWEtYm9yZGVyLTAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdGV4dC1ncmF5LTUwMCBob3ZlcjpjcWEtdGV4dC1ncmF5LTcwMCBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xvc2UoKVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZSBtb2RhbFwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNSAhY3FhLWgtNSAhY3FhLXRleHQtWzIwcHhdICFjcWEtYmxvY2sgIWNxYS1sZWFkaW5nLW5vbmVcIj5jbG9zZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuXG4gICAgPCEtLSBTZWFyY2ggQmFyIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJlbmFibGVTZWFyY2hcIiBjbGFzcz1cImNxYS1weC02IGNxYS1wYi00XCI+XG4gICAgICA8Y3FhLXNlYXJjaC1iYXJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgICAgW3ZhbHVlXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VhcmNoVmFsdWVDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgPC9jcWEtc2VhcmNoLWJhcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRGl2aWRlciBiZWxvdyBzZWFyY2ggLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS0tbXgtMiBjcWEtdy1bY2FsYygxMDAlKzFyZW0pXSBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1oLXB4IGNxYS13LWZ1bGwgY3FhLWJnLVsjRTVFN0VCXVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU3RlcHMgTGlzdCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1vdmVyZmxvdy14LWhpZGRlbiBjcWEtcHgtNiBjcWEtcHQtMlwiIHN0eWxlPVwic2Nyb2xsYmFyLXdpZHRoOiB0aGluO1wiPlxuICAgICAgPCEtLSBFbXB0eSBTdGF0ZSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhaGFzSXRlbXNcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcHktMTIgY3FhLXRleHQtY2VudGVyXCI+XG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtZ3JheS01MDAgY3FhLWZvbnQtaW50ZXJcIj5cbiAgICAgICAgIHt7c2VhcmNoRW1wdHlTdGF0ZUxhYmVsIHx8ICdObyBEYXRhIGZvdW5kLid9fVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTdGVwcyBMaXN0IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImhhc0l0ZW1zXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zXCI+XG5cbiAgICAgICAgPCEtLSBQcmVyZXF1aXNpdGUgc3RlcHM6IGFjY29yZGlvbiBieSB0ZXN0IGNhc2UgbmFtZSAoc3R5bGVkIGxpa2UgY3FhLW1haW4tc3RlcC1jb2xsYXBzZSkgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93UHJlcmVxdWlzaXRlcyAmJiBwcmVyZXF1aXNpdGVHcm91cHM/Lmxlbmd0aFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cCBvZiBwcmVyZXF1aXNpdGVHcm91cHNcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW10LTIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMyBjcWEtcHgtMyBjcWEtcHktMiBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWJnLVsjRUVGMkZGXSBjcWEtcm91bmRlZC1bNHB4XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNDNkQyRkZdIGNxYS1ib3JkZXItc29saWQgY3FhLXctZnVsbFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUdyb3VwKGdyb3VwLm5hbWUpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cImlzR3JvdXBFeHBhbmRlZChncm91cC5uYW1lKVwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNEYzOUY2XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMTdweF0gY3FhLXRleHQtWyMzMTJDODVdIGNxYS1mbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZ3JvdXAubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzR3JvdXBFeHBhbmRlZChncm91cC5uYW1lKVwiIGNsYXNzPVwiY3FhLW10LTIgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMiBjcWEtcHgtMi41XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ3JvdXAuaXRlbXM7IHRyYWNrQnk6IHRyYWNrQnlJdGVtSWRcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weC0zIGNxYS1weS0zIGNxYS13LWZ1bGwgY3FhLXRleHQtbGVmdCBjcWEtYm9yZGVyLTAgY3FhLWJnLXRyYW5zcGFyZW50IGhvdmVyOmNxYS1iZy1ncmF5LTUwIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLXJvdW5kZWQtbWQgY3FhLW1pbi13LTBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uSXRlbUNsaWNrKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcm91bmRlZC1bNnB4XSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW0gY3FhLXB5LVs0cHhdIGNxYS1weC1bMTBweF0gY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFMkU4RjBdIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtYmctWyNGOEY5RkZdXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6IDMycHg7XCI+e3sgaXRlbS5zdGVwTnVtYmVyIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtZm9udC1pbnRlciBjcWEtZm9udC1ub3JtYWwgY3FhLWxlYWRpbmctWzIwcHhdIGNxYS1taW4tdy0wIGNxYS10cnVuY2F0ZVwiPnt7IGl0ZW0uZGVzY3JpcHRpb24gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCIgW25nQ2xhc3NdPVwiZ2V0U3RhdHVzQmFkZ2VDbGFzc2VzKGl0ZW0uc3RhdHVzKVwiPnt7IGl0ZW0uc3RhdHVzIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJlZFN0ZXBJdGVtcz8ubGVuZ3RoXCIgY2xhc3M9XCJjcWEtaC1weCBjcWEtdy1mdWxsIGNxYS1iZy1bI0U1RTdFQl0gY3FhLW15LTEgY3FhLW1iLTJcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+PC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gTWFpbiB0ZXN0IHN0ZXBzIHNlY3Rpb24gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJlZFN0ZXBJdGVtcz8ubGVuZ3RoXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1tYi0xXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXVwcGVyY2FzZSBjcWEtdHJhY2tpbmctd2lkZVwiPlxuICAgICAgICAgICAgICBUZXN0IHN0ZXBzXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTFcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRTdGVwSXRlbXM7IHRyYWNrQnk6IHRyYWNrQnlJdGVtSWRcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHgtMyBjcWEtcHktMyBjcWEtdy1mdWxsIGNxYS10ZXh0LWxlZnQgY3FhLWJvcmRlci0wIGNxYS1iZy10cmFuc3BhcmVudCBob3ZlcjpjcWEtYmctZ3JheS01MCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tY29sb3JzIGNxYS1yb3VuZGVkLW1kIGNxYS1taW4tdy0wXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uSXRlbUNsaWNrKGl0ZW0pXCI+XG5cbiAgICAgICAgICAgICAgPCEtLSBTdGVwIE51bWJlciBCYWRnZSAtLT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXJvdW5kZWQtWzZweF0gY3FhLXRleHQteHMgY3FhLWZvbnQtbWVkaXVtIGNxYS1weS1bNHB4XSBjcWEtcHgtWzEwcHhdIGNxYS1mbGV4LXNocmluay0wIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLWJnLVsjRjhGOUZGXVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6IDMycHg7XCI+XG4gICAgICAgICAgICAgICAge3sgaXRlbS5zdGVwTnVtYmVyIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICA8IS0tIFN0ZXAgRGVzY3JpcHRpb24gLS0+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtdGV4dC1zbSBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLWZvbnQtaW50ZXIgY3FhLWZvbnQtbm9ybWFsIGNxYS1sZWFkaW5nLVsyMHB4XSBjcWEtbWluLXctMCBjcWEtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICA8IS0tIFN0YXR1cyBCYWRnZSAtLT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMFwiIFtuZ0NsYXNzXT1cImdldFN0YXR1c0JhZGdlQ2xhc3NlcyhpdGVtLnN0YXR1cylcIj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLnN0YXR1cyB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRm9vdGVyIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJoYXNJdGVtc1wiIGNsYXNzPVwiY3FhLXB4LTYgY3FhLXBiLTUgY3FhLXB0LTNcIj5cbiAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM2QjcyODBdIGNxYS1mb250LWludGVyIGNxYS1mb250LW5vcm1hbFwiPlxuICAgICAgICB7eyBpdGVtc0NvdW50IH19IHt7IGl0ZW1zQ291bnQgPT09IDEgPyAnc3RlcCcgOiAnc3RlcHMnIH19IGZvdW5kXG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=