@cqa-lib/cqa-ui 1.1.180 → 1.1.182
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/add-prerequisite-cases-section/add-prerequisite-cases-section.component.mjs +176 -0
- package/esm2020/lib/custom-textarea/custom-textarea.component.mjs +6 -3
- package/esm2020/lib/custom-toggle/custom-toggle.component.mjs +35 -0
- package/esm2020/lib/execution-screen/execution-step.models.mjs +1 -1
- package/esm2020/lib/execution-screen/main-step-collapse/main-step-collapse.component.mjs +36 -4
- package/esm2020/lib/file-upload/file-upload.component.mjs +87 -0
- package/esm2020/lib/item-list/item-list.component.mjs +59 -0
- package/esm2020/lib/item-list/item-list.model.mjs +2 -0
- package/esm2020/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.mjs +136 -0
- package/esm2020/lib/step-builder/step-builder-custom-code/step-builder-custom-code.component.mjs +65 -0
- package/esm2020/lib/step-builder/step-builder-database/step-builder-database.component.mjs +1 -1
- package/esm2020/lib/step-builder/step-builder-document/step-builder-document.component.mjs +241 -0
- package/esm2020/lib/step-builder/step-builder-document-generation-template-step/step-builder-document-generation-template-step.component.mjs +176 -0
- package/esm2020/lib/step-builder/step-builder-record-step/step-builder-record-step.component.mjs +31 -0
- package/esm2020/lib/test-case-details/custom-edit-step/custom-edit-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/element-list/element-list.component.mjs +50 -0
- package/esm2020/lib/test-case-details/element-popup/element-popup-data.mjs +5 -0
- package/esm2020/lib/test-case-details/element-popup/element-popup-ref.mjs +32 -0
- package/esm2020/lib/test-case-details/element-popup/element-popup.component.mjs +272 -0
- package/esm2020/lib/test-case-details/element-popup/element-popup.service.mjs +97 -0
- package/esm2020/lib/test-case-details/normal-step/normal-step.component.mjs +151 -19
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal-data.mjs +5 -0
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal-environment.model.mjs +10 -0
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal-parameter.model.mjs +8 -0
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal-ref.mjs +32 -0
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal.component.mjs +301 -0
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal.service.mjs +97 -0
- package/esm2020/lib/ui-kit.module.mjs +63 -3
- package/esm2020/lib/utils/tw-overlay-container.mjs +9 -4
- package/esm2020/public-api.mjs +20 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +3059 -1020
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +3056 -1043
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/add-prerequisite-cases-section/add-prerequisite-cases-section.component.d.ts +88 -0
- package/lib/custom-textarea/custom-textarea.component.d.ts +2 -1
- package/lib/custom-toggle/custom-toggle.component.d.ts +12 -0
- package/lib/execution-screen/execution-step.models.d.ts +2 -0
- package/lib/execution-screen/main-step-collapse/main-step-collapse.component.d.ts +30 -1
- package/lib/file-upload/file-upload.component.d.ts +26 -0
- package/lib/item-list/item-list.component.d.ts +25 -0
- package/lib/item-list/item-list.model.d.ts +16 -0
- package/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.d.ts +47 -0
- package/lib/step-builder/step-builder-custom-code/step-builder-custom-code.component.d.ts +27 -0
- package/lib/step-builder/step-builder-document/step-builder-document.component.d.ts +81 -0
- package/lib/step-builder/step-builder-document-generation-template-step/step-builder-document-generation-template-step.component.d.ts +55 -0
- package/lib/step-builder/step-builder-record-step/step-builder-record-step.component.d.ts +16 -0
- package/lib/test-case-details/element-list/element-list.component.d.ts +26 -0
- package/lib/test-case-details/element-popup/element-popup-data.d.ts +16 -0
- package/lib/test-case-details/element-popup/element-popup-ref.d.ts +13 -0
- package/lib/test-case-details/element-popup/element-popup.component.d.ts +60 -0
- package/lib/test-case-details/element-popup/element-popup.service.d.ts +23 -0
- package/lib/test-case-details/normal-step/normal-step.component.d.ts +17 -2
- package/lib/test-case-details/test-data-modal/test-data-modal-data.d.ts +31 -0
- package/lib/test-case-details/test-data-modal/test-data-modal-environment.model.d.ts +12 -0
- package/lib/test-case-details/test-data-modal/test-data-modal-parameter.model.d.ts +11 -0
- package/lib/test-case-details/test-data-modal/test-data-modal-ref.d.ts +13 -0
- package/lib/test-case-details/test-data-modal/test-data-modal.component.d.ts +91 -0
- package/lib/test-case-details/test-data-modal/test-data-modal.service.d.ts +23 -0
- package/lib/ui-kit.module.d.ts +99 -87
- package/package.json +1 -1
- package/public-api.d.ts +19 -0
- package/styles.css +1 -1
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { Validators } from '@angular/forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/forms";
|
|
5
|
+
import * as i2 from "../../dynamic-select/dynamic-select-field.component";
|
|
6
|
+
import * as i3 from "../../custom-input/custom-input.component";
|
|
7
|
+
import * as i4 from "../../segment-control/segment-control.component";
|
|
8
|
+
import * as i5 from "../../button/button.component";
|
|
9
|
+
import * as i6 from "@angular/material/checkbox";
|
|
10
|
+
import * as i7 from "@angular/common";
|
|
11
|
+
export class StepBuilderDocumentComponent {
|
|
12
|
+
constructor(fb) {
|
|
13
|
+
this.fb = fb;
|
|
14
|
+
/** Options for document type dropdown */
|
|
15
|
+
this.documentTypeOptions = [];
|
|
16
|
+
/** Options for template dropdown (when "Use Existing Template" is selected) */
|
|
17
|
+
this.templateOptions = [];
|
|
18
|
+
/** Options for value type dropdown in document mapper */
|
|
19
|
+
this.valueTypeOptions = [
|
|
20
|
+
{ id: 'variable', value: 'variable', name: 'Variable', label: 'Variable' },
|
|
21
|
+
{ id: 'static', value: 'static', name: 'Static', label: 'Static' },
|
|
22
|
+
{ id: 'expression', value: 'expression', name: 'Expression', label: 'Expression' },
|
|
23
|
+
{ id: 'reference', value: 'reference', name: 'Reference', label: 'Reference' }
|
|
24
|
+
];
|
|
25
|
+
/** Optional URL for "Need help?" link in Document Mapper section */
|
|
26
|
+
this.mapperHelpUrl = '';
|
|
27
|
+
/** Tooltip text when hovering over "Need help?" (same as custom-edit-step) */
|
|
28
|
+
this.mapperHelpTooltipText = 'Not sure what to do? Click to go to our detailed step creation documentation';
|
|
29
|
+
/** Whether the help tooltip is visible */
|
|
30
|
+
this.showHelpTooltip = false;
|
|
31
|
+
/** Emit when step is created */
|
|
32
|
+
this.createStep = new EventEmitter();
|
|
33
|
+
/** Emit when cancelled */
|
|
34
|
+
this.cancelled = new EventEmitter();
|
|
35
|
+
/** Emit when "Create Template" is clicked (Create New flow). Host can create template via API. */
|
|
36
|
+
this.createTemplate = new EventEmitter();
|
|
37
|
+
this.selectedTemplateSource = 'existing';
|
|
38
|
+
/** Uploaded file when Template Source is "Upload Template" */
|
|
39
|
+
this.uploadedFile = null;
|
|
40
|
+
/** Visual state for drag-and-drop zone */
|
|
41
|
+
this.isDragOver = false;
|
|
42
|
+
this.documentForm = this.fb.group({
|
|
43
|
+
documentType: ['', Validators.required],
|
|
44
|
+
outputVariable: ['', Validators.required],
|
|
45
|
+
templateSource: ['existing'],
|
|
46
|
+
templateId: [null],
|
|
47
|
+
templateName: [''],
|
|
48
|
+
templateDescription: [''],
|
|
49
|
+
mappings: this.fb.array([])
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
ngOnInit() {
|
|
53
|
+
this.selectedTemplateSource = this.documentForm.get('templateSource')?.value || 'existing';
|
|
54
|
+
if (this.mappingsFormArray.length === 0) {
|
|
55
|
+
this.addMapping();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
ngOnChanges(changes) {
|
|
59
|
+
if (changes['documentTypeOptions'] || changes['templateOptions'] || changes['valueTypeOptions']) {
|
|
60
|
+
// Configs are built from inputs in getters; no need to rebuild form
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
get mappingsFormArray() {
|
|
64
|
+
return this.documentForm.get('mappings');
|
|
65
|
+
}
|
|
66
|
+
getDocumentTypeConfig() {
|
|
67
|
+
return {
|
|
68
|
+
key: 'documentType',
|
|
69
|
+
placeholder: 'Select document type',
|
|
70
|
+
multiple: false,
|
|
71
|
+
searchable: false,
|
|
72
|
+
options: this.documentTypeOptions
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
getTemplateSelectConfig() {
|
|
76
|
+
return {
|
|
77
|
+
key: 'templateId',
|
|
78
|
+
placeholder: 'Select Template dropdown',
|
|
79
|
+
multiple: false,
|
|
80
|
+
searchable: false,
|
|
81
|
+
options: this.templateOptions
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
getValueTypeConfig(index) {
|
|
85
|
+
return {
|
|
86
|
+
key: 'valueType',
|
|
87
|
+
placeholder: 'Value Type',
|
|
88
|
+
multiple: false,
|
|
89
|
+
searchable: false,
|
|
90
|
+
options: this.valueTypeOptions,
|
|
91
|
+
onChange: () => { }
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
onTemplateSourceChange(value) {
|
|
95
|
+
this.selectedTemplateSource = value;
|
|
96
|
+
this.documentForm.patchValue({ templateSource: this.selectedTemplateSource });
|
|
97
|
+
if (this.selectedTemplateSource !== 'upload') {
|
|
98
|
+
this.uploadedFile = null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
onCreateTemplate() {
|
|
102
|
+
const name = this.documentForm.get('templateName')?.value?.trim() ?? '';
|
|
103
|
+
const description = this.documentForm.get('templateDescription')?.value?.trim() ?? '';
|
|
104
|
+
this.createTemplate.emit({ templateName: name, templateDescription: description });
|
|
105
|
+
}
|
|
106
|
+
onFileSelected(event) {
|
|
107
|
+
const input = event.target;
|
|
108
|
+
const file = input.files?.[0];
|
|
109
|
+
if (file) {
|
|
110
|
+
this.uploadedFile = file;
|
|
111
|
+
}
|
|
112
|
+
input.value = '';
|
|
113
|
+
}
|
|
114
|
+
onDragOver(event) {
|
|
115
|
+
event.preventDefault();
|
|
116
|
+
event.stopPropagation();
|
|
117
|
+
this.isDragOver = true;
|
|
118
|
+
}
|
|
119
|
+
onDragLeave(event) {
|
|
120
|
+
event.preventDefault();
|
|
121
|
+
event.stopPropagation();
|
|
122
|
+
this.isDragOver = false;
|
|
123
|
+
}
|
|
124
|
+
onDrop(event) {
|
|
125
|
+
event.preventDefault();
|
|
126
|
+
event.stopPropagation();
|
|
127
|
+
this.isDragOver = false;
|
|
128
|
+
const file = event.dataTransfer?.files?.[0];
|
|
129
|
+
if (file && this.isAcceptedTemplateFile(file)) {
|
|
130
|
+
this.uploadedFile = file;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
isAcceptedTemplateFile(file) {
|
|
134
|
+
const accepted = ['.pdf', '.doc', '.docx', '.txt'];
|
|
135
|
+
const name = file.name.toLowerCase();
|
|
136
|
+
return accepted.some(ext => name.endsWith(ext));
|
|
137
|
+
}
|
|
138
|
+
addMapping() {
|
|
139
|
+
const mappingGroup = this.fb.group({
|
|
140
|
+
key: ['', Validators.required],
|
|
141
|
+
valueType: ['variable', Validators.required],
|
|
142
|
+
value: ['', Validators.required],
|
|
143
|
+
enabled: [false]
|
|
144
|
+
});
|
|
145
|
+
this.mappingsFormArray.push(mappingGroup);
|
|
146
|
+
}
|
|
147
|
+
removeMapping(index) {
|
|
148
|
+
this.mappingsFormArray.removeAt(index);
|
|
149
|
+
}
|
|
150
|
+
getMappingFormGroup(index) {
|
|
151
|
+
return this.mappingsFormArray.at(index);
|
|
152
|
+
}
|
|
153
|
+
/** True when every mapping row has enabled === true */
|
|
154
|
+
get allMappingsSelected() {
|
|
155
|
+
const len = this.mappingsFormArray.length;
|
|
156
|
+
if (len === 0)
|
|
157
|
+
return false;
|
|
158
|
+
for (let i = 0; i < len; i++) {
|
|
159
|
+
if (!this.getMappingFormGroup(i).get('enabled')?.value)
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
/** True when at least one mapping row has enabled === true (for header indeterminate) */
|
|
165
|
+
get someMappingsSelected() {
|
|
166
|
+
for (let i = 0; i < this.mappingsFormArray.length; i++) {
|
|
167
|
+
if (this.getMappingFormGroup(i).get('enabled')?.value)
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
onSelectAllMappings(checked) {
|
|
173
|
+
this.mappingsFormArray.controls.forEach((_, i) => {
|
|
174
|
+
this.getMappingFormGroup(i).get('enabled')?.setValue(checked);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
onCancel() {
|
|
178
|
+
this.cancelled.emit();
|
|
179
|
+
}
|
|
180
|
+
onCreateStep() {
|
|
181
|
+
if (this.selectedTemplateSource === 'upload' && !this.uploadedFile) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (this.selectedTemplateSource === 'createNew') {
|
|
185
|
+
const name = this.documentForm.get('templateName')?.value?.trim();
|
|
186
|
+
const desc = this.documentForm.get('templateDescription')?.value?.trim();
|
|
187
|
+
if (!name || !desc)
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
if (this.documentForm.valid) {
|
|
191
|
+
const formValue = this.documentForm.value;
|
|
192
|
+
const stepData = {
|
|
193
|
+
documentType: formValue.documentType,
|
|
194
|
+
outputVariable: formValue.outputVariable,
|
|
195
|
+
templateSource: this.selectedTemplateSource,
|
|
196
|
+
templateId: formValue.templateId || undefined,
|
|
197
|
+
...(this.selectedTemplateSource === 'upload' && this.uploadedFile && { uploadedFile: this.uploadedFile }),
|
|
198
|
+
...(this.selectedTemplateSource === 'createNew' && {
|
|
199
|
+
templateName: (formValue.templateName ?? '').trim(),
|
|
200
|
+
templateDescription: (formValue.templateDescription ?? '').trim()
|
|
201
|
+
}),
|
|
202
|
+
mappings: (formValue.mappings || []).map((m) => ({
|
|
203
|
+
key: m.key || '',
|
|
204
|
+
valueType: m.valueType || 'variable',
|
|
205
|
+
value: m.value || '',
|
|
206
|
+
enabled: m.enabled ?? false
|
|
207
|
+
}))
|
|
208
|
+
};
|
|
209
|
+
this.createStep.emit(stepData);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
onMapperHelpClick(event) {
|
|
213
|
+
if (this.mapperHelpUrl) {
|
|
214
|
+
event.preventDefault();
|
|
215
|
+
window.open(this.mapperHelpUrl, '_blank');
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
StepBuilderDocumentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderDocumentComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
220
|
+
StepBuilderDocumentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderDocumentComponent, selector: "cqa-step-builder-document", inputs: { documentTypeOptions: "documentTypeOptions", templateOptions: "templateOptions", valueTypeOptions: "valueTypeOptions", mapperHelpUrl: "mapperHelpUrl", mapperHelpTooltipText: "mapperHelpTooltipText" }, outputs: { createStep: "createStep", cancelled: "cancelled", createTemplate: "createTemplate" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root cqa-block cqa-w-full cqa-min-w-0 cqa-step-builder-document\">\n <div\n class=\"cqa-flex cqa-flex-col cqa-w-full cqa-min-w-0 cqa-h-full cqa-bg-white cqa-border cqa-box-border cqa-max-w-full cqa-opacity-100\">\n <!-- Content area: padding 16px, gap 12px between sections (no flex-1 to avoid gap above footer) -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-shrink-0 cqa-overflow-y-auto cqa-p-4 cqa-gap-3\">\n <!-- Header: Document Generation Template Step (left-aligned, Inter 600 12px line-height 100%) -->\n <h2\n class=\"cqa-text-[12px] cqa-leading-[100%] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-text-left cqa-flex-shrink-0 cqa-align-middle\">\n Document Generation Template Step\n </h2>\n\n <!-- Document Type and Output Variable Row (gap 12px between columns) -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)] \">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Document Type <span class=\"cqa-text-red-500\">*</span>\n </label>\n <div class=\"document-type-select\">\n <cqa-dynamic-select\n [form]=\"documentForm\"\n [config]=\"getDocumentTypeConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Choose the file format you want to generate.\n </p>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Output Variable <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"Input\"\n [value]=\"documentForm.get('outputVariable')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('outputVariable')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Stores the generated file so it can be used in later steps.\n </p>\n </div>\n </div>\n\n <!-- Template Source Section: label left, tabs right on same row -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-shrink-0 cqa-gap-3\">\n \n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-4\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0 cqa-flex-shrink-0\">\n Template Source\n </label>\n <cqa-segment-control\n class=\"cqa-flex-shrink-0\"\n [segments]=\"[\n { label: 'Use Existing Template', value: 'existing' },\n { label: 'Upload Template', value: 'upload' },\n { label: 'Create New', value: 'createNew' }\n ]\"\n [value]=\"selectedTemplateSource\"\n (valueChange)=\"onTemplateSourceChange($event)\">\n </cqa-segment-control>\n </div>\n <div class=\"document-type-select\" *ngIf=\"selectedTemplateSource === 'existing'\">\n <cqa-dynamic-select\n [form]=\"documentForm\"\n [config]=\"getTemplateSelectConfig()\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Upload Template: CQA drag-and-drop zone (minimal, white, centered) -->\n <div *ngIf=\"selectedTemplateSource === 'upload'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0\">\n Attachment <span class=\"cqa-text-red-500\">*</span>\n </label>\n <input\n #fileInput\n type=\"file\"\n accept=\".pdf,.doc,.docx,.txt\"\n class=\"cqa-hidden\"\n (change)=\"onFileSelected($event)\">\n <div\n class=\"cqa-w-full cqa-min-h-[140px] cqa-rounded cqa-border-2 cqa-border-dashed cqa-border-gray-300 cqa-bg-white cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-3 cqa-p-6 cqa-cursor-pointer cqa-transition-colors\"\n [class.cqa-ring-2]=\"isDragOver\"\n [class.cqa-ring-[#3F43EE]]=\"isDragOver\"\n [class.cqa-ring-inset]=\"isDragOver\"\n (click)=\"fileInput.click()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n role=\"button\"\n tabindex=\"0\"\n (keydown.enter)=\"fileInput.click()\"\n (keydown.space)=\"fileInput.click()\"\n aria-label=\"Upload template file\">\n <!-- Upload icon: arrow in folder/box (dark gray) -->\n <svg class=\"cqa-w-8 cqa-h-8 cqa-font-bold\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/>\n <polyline points=\"17 8 12 3 7 8\"/>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/>\n </svg>\n <p class=\"cqa-text-base cqa-text-[#374151] cqa-m-0 cqa-text-center cqa-font-bold\">\n Drag and drop files here or <span class=\"cqa-text-[#3F43EE] cqa-font-medium hover:cqa-underline\">browse</span>\n </p>\n <p class=\"cqa-text-sm cqa-text-[#6B7280] cqa-m-0\">\n PDF, DOC, or TXT files\n </p>\n </div>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-m-0\">\n Choose the file format you want to generate.\n </p>\n </div>\n <!-- Create New: Template Name, Template Description, Create Template button -->\n <div *ngIf=\"selectedTemplateSource === 'createNew'\" class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-3\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(50%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Template Name <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"PDF Document (.pdf)\"\n [value]=\"documentForm.get('templateName')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('templateName')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(50%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Template Description <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"PDF Document (.pdf)\"\n [value]=\"documentForm.get('templateDescription')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('templateDescription')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </div>\n <div class=\"cqa-flex cqa-justify-end\">\n <cqa-button\n variant=\"filled\"\n btnSize=\"lg\"\n text=\"Create Template\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#3F43EE] cqa-bg-[#3F43EE]'\"\n (clicked)=\"onCreateTemplate()\">\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Document Mapper Section: title + subtitle left, Need help? right (CQA table below) -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-shrink-0 cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <h3 class=\"cqa-text-base cqa-font-semibold cqa-text-[#111827] cqa-text-[14px] cqa-m-0 cqa-leading-tight\">\n Document Mapper\n </h3>\n <p class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5\">\n Map placeholders to dynamic values.\n </p>\n </div>\n <div class=\"cqa-relative cqa-inline-flex cqa-flex-shrink-0\"\n (mouseenter)=\"showHelpTooltip = true\"\n (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"mapperHelpUrl\"\n href=\"#\"\n (click)=\"onMapperHelpClick($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#help-icon-clip-doc)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"help-icon-clip-doc\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!mapperHelpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default cqa-text-[#374151]\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#help-icon-clip-doc-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"help-icon-clip-doc-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <div *ngIf=\"showHelpTooltip\" class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-top-[-24px] cqa-left-[-203px]\" role=\"tooltip\">\n <div class=\"cqa-text-white cqa-text-center cqa-whitespace-nowrap cqa-w-[306px] cqa-min-h-5 cqa-rounded-[6px] cqa-opacity-100 cqa-px-2 cqa-py-1 cqa-bg-[#0A0A0A] cqa-leading-5 cqa-text-[8px]\">\n {{ mapperHelpTooltipText }}\n </div>\n </div>\n </div>\n </div>\n <!-- Table or empty state: same container, header always visible -->\n <div class=\"cqa-rounded-lg cqa-overflow-hidden cqa-bg-white cqa-shadow-sm cqa-border cqa-border-solid cqa-border-gray-200\">\n <table class=\"cqa-w-full\">\n <thead>\n <tr class=\"cqa-items-center cqa-bg-[#D8D9FC4D]\">\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-w-[40px] cqa-border-b cqa-border-gray-200\">\n <mat-checkbox [checked]=\"allMappingsSelected\"\n [indeterminate]=\"someMappingsSelected && !allMappingsSelected\"\n (change)=\"onSelectAllMappings($event.checked)\"\n color=\"primary\"\n aria-label=\"Select all mappings\">\n </mat-checkbox>\n </th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200\">Key</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200 cqa-w-[120px]\">Value Type</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200\">Value</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200 cqa-w-[48px]\">\n <span class=\"cqa-sr-only\">Delete</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"cqa-w-full\">\n <!-- Empty state when no mappings -->\n <tr *ngIf=\"mappingsFormArray.length === 0\">\n <td colspan=\"5\" class=\"cqa-p-0 cqa-align-middle cqa-border-b cqa-border-gray-200\">\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-12 cqa-px-4 cqa-bg-white\">\n <p class=\"cqa-text-sm cqa-text-[#6B7280] cqa-m-0 cqa-mb-4\">Start mapping placeholders to values.</p>\n <button\n type=\"button\"\n class=\"cqa-rounded-lg cqa-px-4 cqa-py-2.5 cqa-text-sm cqa-font-semibold cqa-text-white cqa-bg-[#4F46E5] cqa-border-none cqa-cursor-pointer hover:cqa-opacity-90 cqa-transition-opacity\"\n (click)=\"addMapping()\">\n Add first mapping\n </button>\n </div>\n </td>\n </tr>\n <!-- Data rows when there are mappings -->\n <tr *ngFor=\"let mapping of mappingsFormArray.controls; let i = index\"\n class=\"cqa-bg-white hover:cqa-bg-[#F9FAFB]\">\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-middle cqa-border-b cqa-border-gray-200\">\n <mat-checkbox [checked]=\"getMappingFormGroup(i).get('enabled')?.value\"\n (change)=\"getMappingFormGroup(i).get('enabled')?.setValue($event.checked)\"\n color=\"primary\"\n aria-label=\"Enable mapping\">\n </mat-checkbox>\n </td>\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-middle cqa-border-b cqa-border-gray-200 \">\n <cqa-custom-input\n [placeholder]=\"'Key'\"\n [value]=\"getMappingFormGroup(i).get('key')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"getMappingFormGroup(i).get('key')?.setValue($event)\">\n </cqa-custom-input>\n </td>\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-middle cqa-border-b cqa-border-gray-200\">\n <div class=\"document-type-select\">\n <cqa-dynamic-select\n [form]=\"getMappingFormGroup(i)\"\n [config]=\"getValueTypeConfig(i)\">\n </cqa-dynamic-select>\n </div>\n </td>\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-middle cqa-border-b cqa-border-gray-200\">\n <cqa-custom-input\n [placeholder]=\"'Value'\"\n [value]=\"getMappingFormGroup(i).get('value')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"getMappingFormGroup(i).get('value')?.setValue($event)\">\n </cqa-custom-input>\n </td>\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-middle cqa-border-b cqa-border-gray-200\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded cqa-text-[#E57373] cqa-transition-colors cqa-border-none cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80\"\n (click)=\"removeMapping(i)\"\n [attr.aria-label]=\"'Delete mapping'\">\n <svg class=\"cqa-w-5 cqa-h-5 cqa-flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 6h18M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2m3 0v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6h14z\"/>\n <path d=\"M10 11v6M14 11v6\"/>\n </svg>\n </button>\n </td>\n </tr>\n </tbody>\n \n </table>\n <div class=\"cqa-flex cqa-justify-end\" *ngIf=\"mappingsFormArray.length > 0\">\n <button\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-3\"\n (click)=\"addMapping()\">\n + Add Mapping\n </button>\n </div>\n </div>\n <!-- <div class=\"cqa-flex cqa-justify-end\" *ngIf=\"mappingsFormArray.length > 0\">\n <button\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0\"\n (click)=\"addMapping()\">\n + Add Mapping\n </button>\n </div> -->\n </div>\n </div>\n \n\n <!-- Divider above footer -->\n <div class=\"cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full\" role=\"presentation\"></div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-items-stretch cqa-w-full cqa-p-4 cqa-gap-3\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n btnSize=\"lg\"\n text=\"Cancel\"\n [fullWidth]=\"true\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"filled\"\n btnSize=\"lg\"\n text=\"Create Step\"\n [fullWidth]=\"true\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#3F43EE]'\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n </div>\n</div>\n", components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore"] }, { type: i3.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i4.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor"], outputs: ["valueChange"] }, { type: i5.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
221
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderDocumentComponent, decorators: [{
|
|
222
|
+
type: Component,
|
|
223
|
+
args: [{ selector: 'cqa-step-builder-document', template: "<div class=\"cqa-ui-root cqa-block cqa-w-full cqa-min-w-0 cqa-step-builder-document\">\n <div\n class=\"cqa-flex cqa-flex-col cqa-w-full cqa-min-w-0 cqa-h-full cqa-bg-white cqa-border cqa-box-border cqa-max-w-full cqa-opacity-100\">\n <!-- Content area: padding 16px, gap 12px between sections (no flex-1 to avoid gap above footer) -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-shrink-0 cqa-overflow-y-auto cqa-p-4 cqa-gap-3\">\n <!-- Header: Document Generation Template Step (left-aligned, Inter 600 12px line-height 100%) -->\n <h2\n class=\"cqa-text-[12px] cqa-leading-[100%] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-text-left cqa-flex-shrink-0 cqa-align-middle\">\n Document Generation Template Step\n </h2>\n\n <!-- Document Type and Output Variable Row (gap 12px between columns) -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)] \">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Document Type <span class=\"cqa-text-red-500\">*</span>\n </label>\n <div class=\"document-type-select\">\n <cqa-dynamic-select\n [form]=\"documentForm\"\n [config]=\"getDocumentTypeConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Choose the file format you want to generate.\n </p>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Output Variable <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"Input\"\n [value]=\"documentForm.get('outputVariable')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('outputVariable')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Stores the generated file so it can be used in later steps.\n </p>\n </div>\n </div>\n\n <!-- Template Source Section: label left, tabs right on same row -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-shrink-0 cqa-gap-3\">\n \n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-4\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0 cqa-flex-shrink-0\">\n Template Source\n </label>\n <cqa-segment-control\n class=\"cqa-flex-shrink-0\"\n [segments]=\"[\n { label: 'Use Existing Template', value: 'existing' },\n { label: 'Upload Template', value: 'upload' },\n { label: 'Create New', value: 'createNew' }\n ]\"\n [value]=\"selectedTemplateSource\"\n (valueChange)=\"onTemplateSourceChange($event)\">\n </cqa-segment-control>\n </div>\n <div class=\"document-type-select\" *ngIf=\"selectedTemplateSource === 'existing'\">\n <cqa-dynamic-select\n [form]=\"documentForm\"\n [config]=\"getTemplateSelectConfig()\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Upload Template: CQA drag-and-drop zone (minimal, white, centered) -->\n <div *ngIf=\"selectedTemplateSource === 'upload'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0\">\n Attachment <span class=\"cqa-text-red-500\">*</span>\n </label>\n <input\n #fileInput\n type=\"file\"\n accept=\".pdf,.doc,.docx,.txt\"\n class=\"cqa-hidden\"\n (change)=\"onFileSelected($event)\">\n <div\n class=\"cqa-w-full cqa-min-h-[140px] cqa-rounded cqa-border-2 cqa-border-dashed cqa-border-gray-300 cqa-bg-white cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-3 cqa-p-6 cqa-cursor-pointer cqa-transition-colors\"\n [class.cqa-ring-2]=\"isDragOver\"\n [class.cqa-ring-[#3F43EE]]=\"isDragOver\"\n [class.cqa-ring-inset]=\"isDragOver\"\n (click)=\"fileInput.click()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n role=\"button\"\n tabindex=\"0\"\n (keydown.enter)=\"fileInput.click()\"\n (keydown.space)=\"fileInput.click()\"\n aria-label=\"Upload template file\">\n <!-- Upload icon: arrow in folder/box (dark gray) -->\n <svg class=\"cqa-w-8 cqa-h-8 cqa-font-bold\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/>\n <polyline points=\"17 8 12 3 7 8\"/>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/>\n </svg>\n <p class=\"cqa-text-base cqa-text-[#374151] cqa-m-0 cqa-text-center cqa-font-bold\">\n Drag and drop files here or <span class=\"cqa-text-[#3F43EE] cqa-font-medium hover:cqa-underline\">browse</span>\n </p>\n <p class=\"cqa-text-sm cqa-text-[#6B7280] cqa-m-0\">\n PDF, DOC, or TXT files\n </p>\n </div>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-m-0\">\n Choose the file format you want to generate.\n </p>\n </div>\n <!-- Create New: Template Name, Template Description, Create Template button -->\n <div *ngIf=\"selectedTemplateSource === 'createNew'\" class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-3\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(50%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Template Name <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"PDF Document (.pdf)\"\n [value]=\"documentForm.get('templateName')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('templateName')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(50%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Template Description <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"PDF Document (.pdf)\"\n [value]=\"documentForm.get('templateDescription')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('templateDescription')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </div>\n <div class=\"cqa-flex cqa-justify-end\">\n <cqa-button\n variant=\"filled\"\n btnSize=\"lg\"\n text=\"Create Template\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#3F43EE] cqa-bg-[#3F43EE]'\"\n (clicked)=\"onCreateTemplate()\">\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Document Mapper Section: title + subtitle left, Need help? right (CQA table below) -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-shrink-0 cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <h3 class=\"cqa-text-base cqa-font-semibold cqa-text-[#111827] cqa-text-[14px] cqa-m-0 cqa-leading-tight\">\n Document Mapper\n </h3>\n <p class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5\">\n Map placeholders to dynamic values.\n </p>\n </div>\n <div class=\"cqa-relative cqa-inline-flex cqa-flex-shrink-0\"\n (mouseenter)=\"showHelpTooltip = true\"\n (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"mapperHelpUrl\"\n href=\"#\"\n (click)=\"onMapperHelpClick($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#help-icon-clip-doc)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"help-icon-clip-doc\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!mapperHelpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default cqa-text-[#374151]\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#help-icon-clip-doc-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"help-icon-clip-doc-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <div *ngIf=\"showHelpTooltip\" class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-top-[-24px] cqa-left-[-203px]\" role=\"tooltip\">\n <div class=\"cqa-text-white cqa-text-center cqa-whitespace-nowrap cqa-w-[306px] cqa-min-h-5 cqa-rounded-[6px] cqa-opacity-100 cqa-px-2 cqa-py-1 cqa-bg-[#0A0A0A] cqa-leading-5 cqa-text-[8px]\">\n {{ mapperHelpTooltipText }}\n </div>\n </div>\n </div>\n </div>\n <!-- Table or empty state: same container, header always visible -->\n <div class=\"cqa-rounded-lg cqa-overflow-hidden cqa-bg-white cqa-shadow-sm cqa-border cqa-border-solid cqa-border-gray-200\">\n <table class=\"cqa-w-full\">\n <thead>\n <tr class=\"cqa-items-center cqa-bg-[#D8D9FC4D]\">\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-w-[40px] cqa-border-b cqa-border-gray-200\">\n <mat-checkbox [checked]=\"allMappingsSelected\"\n [indeterminate]=\"someMappingsSelected && !allMappingsSelected\"\n (change)=\"onSelectAllMappings($event.checked)\"\n color=\"primary\"\n aria-label=\"Select all mappings\">\n </mat-checkbox>\n </th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200\">Key</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200 cqa-w-[120px]\">Value Type</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200\">Value</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200 cqa-w-[48px]\">\n <span class=\"cqa-sr-only\">Delete</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"cqa-w-full\">\n <!-- Empty state when no mappings -->\n <tr *ngIf=\"mappingsFormArray.length === 0\">\n <td colspan=\"5\" class=\"cqa-p-0 cqa-align-middle cqa-border-b cqa-border-gray-200\">\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-12 cqa-px-4 cqa-bg-white\">\n <p class=\"cqa-text-sm cqa-text-[#6B7280] cqa-m-0 cqa-mb-4\">Start mapping placeholders to values.</p>\n <button\n type=\"button\"\n class=\"cqa-rounded-lg cqa-px-4 cqa-py-2.5 cqa-text-sm cqa-font-semibold cqa-text-white cqa-bg-[#4F46E5] cqa-border-none cqa-cursor-pointer hover:cqa-opacity-90 cqa-transition-opacity\"\n (click)=\"addMapping()\">\n Add first mapping\n </button>\n </div>\n </td>\n </tr>\n <!-- Data rows when there are mappings -->\n <tr *ngFor=\"let mapping of mappingsFormArray.controls; let i = index\"\n class=\"cqa-bg-white hover:cqa-bg-[#F9FAFB]\">\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-middle cqa-border-b cqa-border-gray-200\">\n <mat-checkbox [checked]=\"getMappingFormGroup(i).get('enabled')?.value\"\n (change)=\"getMappingFormGroup(i).get('enabled')?.setValue($event.checked)\"\n color=\"primary\"\n aria-label=\"Enable mapping\">\n </mat-checkbox>\n </td>\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-middle cqa-border-b cqa-border-gray-200 \">\n <cqa-custom-input\n [placeholder]=\"'Key'\"\n [value]=\"getMappingFormGroup(i).get('key')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"getMappingFormGroup(i).get('key')?.setValue($event)\">\n </cqa-custom-input>\n </td>\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-middle cqa-border-b cqa-border-gray-200\">\n <div class=\"document-type-select\">\n <cqa-dynamic-select\n [form]=\"getMappingFormGroup(i)\"\n [config]=\"getValueTypeConfig(i)\">\n </cqa-dynamic-select>\n </div>\n </td>\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-middle cqa-border-b cqa-border-gray-200\">\n <cqa-custom-input\n [placeholder]=\"'Value'\"\n [value]=\"getMappingFormGroup(i).get('value')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"getMappingFormGroup(i).get('value')?.setValue($event)\">\n </cqa-custom-input>\n </td>\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-middle cqa-border-b cqa-border-gray-200\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded cqa-text-[#E57373] cqa-transition-colors cqa-border-none cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80\"\n (click)=\"removeMapping(i)\"\n [attr.aria-label]=\"'Delete mapping'\">\n <svg class=\"cqa-w-5 cqa-h-5 cqa-flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 6h18M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2m3 0v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6h14z\"/>\n <path d=\"M10 11v6M14 11v6\"/>\n </svg>\n </button>\n </td>\n </tr>\n </tbody>\n \n </table>\n <div class=\"cqa-flex cqa-justify-end\" *ngIf=\"mappingsFormArray.length > 0\">\n <button\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-3\"\n (click)=\"addMapping()\">\n + Add Mapping\n </button>\n </div>\n </div>\n <!-- <div class=\"cqa-flex cqa-justify-end\" *ngIf=\"mappingsFormArray.length > 0\">\n <button\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0\"\n (click)=\"addMapping()\">\n + Add Mapping\n </button>\n </div> -->\n </div>\n </div>\n \n\n <!-- Divider above footer -->\n <div class=\"cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full\" role=\"presentation\"></div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-items-stretch cqa-w-full cqa-p-4 cqa-gap-3\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n btnSize=\"lg\"\n text=\"Cancel\"\n [fullWidth]=\"true\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"filled\"\n btnSize=\"lg\"\n text=\"Create Step\"\n [fullWidth]=\"true\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#3F43EE]'\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n </div>\n</div>\n" }]
|
|
224
|
+
}], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { documentTypeOptions: [{
|
|
225
|
+
type: Input
|
|
226
|
+
}], templateOptions: [{
|
|
227
|
+
type: Input
|
|
228
|
+
}], valueTypeOptions: [{
|
|
229
|
+
type: Input
|
|
230
|
+
}], mapperHelpUrl: [{
|
|
231
|
+
type: Input
|
|
232
|
+
}], mapperHelpTooltipText: [{
|
|
233
|
+
type: Input
|
|
234
|
+
}], createStep: [{
|
|
235
|
+
type: Output
|
|
236
|
+
}], cancelled: [{
|
|
237
|
+
type: Output
|
|
238
|
+
}], createTemplate: [{
|
|
239
|
+
type: Output
|
|
240
|
+
}] } });
|
|
241
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWRvY3VtZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3RlcC1idWlsZGVyL3N0ZXAtYnVpbGRlci1kb2N1bWVudC9zdGVwLWJ1aWxkZXItZG9jdW1lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWRvY3VtZW50L3N0ZXAtYnVpbGRlci1kb2N1bWVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQWtELFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7QUE4QjVGLE1BQU0sT0FBTyw0QkFBNEI7SUF3Q3ZDLFlBQW9CLEVBQWU7UUFBZixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBdkNuQyx5Q0FBeUM7UUFDaEMsd0JBQW1CLEdBQW1CLEVBQUUsQ0FBQztRQUVsRCwrRUFBK0U7UUFDdEUsb0JBQWUsR0FBbUIsRUFBRSxDQUFDO1FBRTlDLHlEQUF5RDtRQUNoRCxxQkFBZ0IsR0FBbUI7WUFDMUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO1lBQzFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtZQUNsRSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUU7WUFDbEYsRUFBRSxFQUFF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MkJBQTJCO2tHQUs1QixtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBR0csZUFBZTtzQkFBdkIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBUUcsYUFBYTtzQkFBckIsS0FBSztnQkFHRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBTUksVUFBVTtzQkFBbkIsTUFBTTtnQkFHRyxTQUFTO3NCQUFsQixNQUFNO2dCQUdHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5cbmV4cG9ydCB0eXBlIFRlbXBsYXRlU291cmNlVHlwZSA9ICdleGlzdGluZycgfCAndXBsb2FkJyB8ICdjcmVhdGVOZXcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50TWFwcGluZ1JvdyB7XG4gIGtleTogc3RyaW5nO1xuICB2YWx1ZVR5cGU6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRGb3JtRGF0YSB7XG4gIGRvY3VtZW50VHlwZTogc3RyaW5nO1xuICBvdXRwdXRWYXJpYWJsZTogc3RyaW5nO1xuICB0ZW1wbGF0ZVNvdXJjZTogVGVtcGxhdGVTb3VyY2VUeXBlO1xuICB0ZW1wbGF0ZUlkPzogc3RyaW5nO1xuICAvKiogVXBsb2FkZWQgdGVtcGxhdGUgZmlsZSB3aGVuIHRlbXBsYXRlU291cmNlIGlzICd1cGxvYWQnICovXG4gIHVwbG9hZGVkRmlsZT86IEZpbGU7XG4gIC8qKiBUZW1wbGF0ZSBuYW1lIHdoZW4gdGVtcGxhdGVTb3VyY2UgaXMgJ2NyZWF0ZU5ldycgKi9cbiAgdGVtcGxhdGVOYW1lPzogc3RyaW5nO1xuICAvKiogVGVtcGxhdGUgZGVzY3JpcHRpb24gd2hlbiB0ZW1wbGF0ZVNvdXJjZSBpcyAnY3JlYXRlTmV3JyAqL1xuICB0ZW1wbGF0ZURlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBtYXBwaW5nczogRG9jdW1lbnRNYXBwaW5nUm93W107XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zdGVwLWJ1aWxkZXItZG9jdW1lbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1idWlsZGVyLWRvY3VtZW50LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBTdGVwQnVpbGRlckRvY3VtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKiogT3B0aW9ucyBmb3IgZG9jdW1lbnQgdHlwZSBkcm9wZG93biAqL1xuICBASW5wdXQoKSBkb2N1bWVudFR5cGVPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuXG4gIC8qKiBPcHRpb25zIGZvciB0ZW1wbGF0ZSBkcm9wZG93biAod2hlbiBcIlVzZSBFeGlzdGluZyBUZW1wbGF0ZVwiIGlzIHNlbGVjdGVkKSAqL1xuICBASW5wdXQoKSB0ZW1wbGF0ZU9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW107XG5cbiAgLyoqIE9wdGlvbnMgZm9yIHZhbHVlIHR5cGUgZHJvcGRvd24gaW4gZG9jdW1lbnQgbWFwcGVyICovXG4gIEBJbnB1dCgpIHZhbHVlVHlwZU9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICd2YXJpYWJsZScsIHZhbHVlOiAndmFyaWFibGUnLCBuYW1lOiAnVmFyaWFibGUnLCBsYWJlbDogJ1ZhcmlhYmxlJyB9LFxuICAgIHsgaWQ6ICdzdGF0aWMnLCB2YWx1ZTogJ3N0YXRpYycsIG5hbWU6ICdTdGF0aWMnLCBsYWJlbDogJ1N0YXRpYycgfSxcbiAgICB7IGlkOiAnZXhwcmVzc2lvbicsIHZhbHVlOiAnZXhwcmVzc2lvbicsIG5hbWU6ICdFeHByZXNzaW9uJywgbGFiZWw6ICdFeHByZXNzaW9uJyB9LFxuICAgIHsgaWQ6ICdyZWZlcmVuY2UnLCB2YWx1ZTogJ3JlZmVyZW5jZScsIG5hbWU6ICdSZWZlcmVuY2UnLCBsYWJlbDogJ1JlZmVyZW5jZScgfVxuICBdO1xuXG4gIC8qKiBPcHRpb25hbCBVUkwgZm9yIFwiTmVlZCBoZWxwP1wiIGxpbmsgaW4gRG9jdW1lbnQgTWFwcGVyIHNlY3Rpb24gKi9cbiAgQElucHV0KCkgbWFwcGVySGVscFVybDogc3RyaW5nID0gJyc7XG5cbiAgLyoqIFRvb2x0aXAgdGV4dCB3aGVuIGhvdmVyaW5nIG92ZXIgXCJOZWVkIGhlbHA/XCIgKHNhbWUgYXMgY3VzdG9tLWVkaXQtc3RlcCkgKi9cbiAgQElucHV0KCkgbWFwcGVySGVscFRvb2x0aXBUZXh0OiBzdHJpbmcgPSAnTm90IHN1cmUgd2hhdCB0byBkbz8gQ2xpY2sgdG8gZ28gdG8gb3VyIGRldGFpbGVkIHN0ZXAgY3JlYXRpb24gZG9jdW1lbnRhdGlvbic7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGhlbHAgdG9vbHRpcCBpcyB2aXNpYmxlICovXG4gIHNob3dIZWxwVG9vbHRpcCA9IGZhbHNlO1xuXG4gIC8qKiBFbWl0IHdoZW4gc3RlcCBpcyBjcmVhdGVkICovXG4gIEBPdXRwdXQoKSBjcmVhdGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxEb2N1bWVudEZvcm1EYXRhPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gY2FuY2VsbGVkICovXG4gIEBPdXRwdXQoKSBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBcIkNyZWF0ZSBUZW1wbGF0ZVwiIGlzIGNsaWNrZWQgKENyZWF0ZSBOZXcgZmxvdykuIEhvc3QgY2FuIGNyZWF0ZSB0ZW1wbGF0ZSB2aWEgQVBJLiAqL1xuICBAT3V0cHV0KCkgY3JlYXRlVGVtcGxhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgdGVtcGxhdGVOYW1lOiBzdHJpbmc7IHRlbXBsYXRlRGVzY3JpcHRpb246IHN0cmluZyB9PigpO1xuXG4gIGRvY3VtZW50Rm9ybTogRm9ybUdyb3VwO1xuICBzZWxlY3RlZFRlbXBsYXRlU291cmNlOiBUZW1wbGF0ZVNvdXJjZVR5cGUgPSAnZXhpc3RpbmcnO1xuICAvKiogVXBsb2FkZWQgZmlsZSB3aGVuIFRlbXBsYXRlIFNvdXJjZSBpcyBcIlVwbG9hZCBUZW1wbGF0ZVwiICovXG4gIHVwbG9hZGVkRmlsZTogRmlsZSB8IG51bGwgPSBudWxsO1xuICAvKiogVmlzdWFsIHN0YXRlIGZvciBkcmFnLWFuZC1kcm9wIHpvbmUgKi9cbiAgaXNEcmFnT3ZlciA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XG4gICAgdGhpcy5kb2N1bWVudEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGRvY3VtZW50VHlwZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIG91dHB1dFZhcmlhYmxlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgdGVtcGxhdGVTb3VyY2U6IFsnZXhpc3RpbmcnXSxcbiAgICAgIHRlbXBsYXRlSWQ6IFtudWxsXSxcbiAgICAgIHRlbXBsYXRlTmFtZTogWycnXSxcbiAgICAgIHRlbXBsYXRlRGVzY3JpcHRpb246IFsnJ10sXG4gICAgICBtYXBwaW5nczogdGhpcy5mYi5hcnJheShbXSlcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZSA9IHRoaXMuZG9jdW1lbnRGb3JtLmdldCgndGVtcGxhdGVTb3VyY2UnKT8udmFsdWUgfHwgJ2V4aXN0aW5nJztcbiAgICBpZiAodGhpcy5tYXBwaW5nc0Zvcm1BcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuYWRkTWFwcGluZygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZG9jdW1lbnRUeXBlT3B0aW9ucyddIHx8IGNoYW5nZXNbJ3RlbXBsYXRlT3B0aW9ucyddIHx8IGNoYW5nZXNbJ3ZhbHVlVHlwZU9wdGlvbnMnXSkge1xuICAgICAgLy8gQ29uZmlncyBhcmUgYnVpbHQgZnJvbSBpbnB1dHMgaW4gZ2V0dGVyczsgbm8gbmVlZCB0byByZWJ1aWxkIGZvcm1cbiAgICB9XG4gIH1cblxuICBnZXQgbWFwcGluZ3NGb3JtQXJyYXkoKTogRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5kb2N1bWVudEZvcm0uZ2V0KCdtYXBwaW5ncycpIGFzIEZvcm1BcnJheTtcbiAgfVxuXG4gIGdldERvY3VtZW50VHlwZUNvbmZpZygpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6ICdkb2N1bWVudFR5cGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgZG9jdW1lbnQgdHlwZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuZG9jdW1lbnRUeXBlT3B0aW9uc1xuICAgIH07XG4gIH1cblxuICBnZXRUZW1wbGF0ZVNlbGVjdENvbmZpZygpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6ICd0ZW1wbGF0ZUlkJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IFRlbXBsYXRlIGRyb3Bkb3duJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGhpcy50ZW1wbGF0ZU9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgZ2V0VmFsdWVUeXBlQ29uZmlnKGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6ICd2YWx1ZVR5cGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdWYWx1ZSBUeXBlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGhpcy52YWx1ZVR5cGVPcHRpb25zLFxuICAgICAgb25DaGFuZ2U6ICgpID0+IHt9XG4gICAgfTtcbiAgfVxuXG4gIG9uVGVtcGxhdGVTb3VyY2VDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZSA9IHZhbHVlIGFzIFRlbXBsYXRlU291cmNlVHlwZTtcbiAgICB0aGlzLmRvY3VtZW50Rm9ybS5wYXRjaFZhbHVlKHsgdGVtcGxhdGVTb3VyY2U6IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZSB9KTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRlbXBsYXRlU291cmNlICE9PSAndXBsb2FkJykge1xuICAgICAgdGhpcy51cGxvYWRlZEZpbGUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG9uQ3JlYXRlVGVtcGxhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZG9jdW1lbnRGb3JtLmdldCgndGVtcGxhdGVOYW1lJyk/LnZhbHVlPy50cmltKCkgPz8gJyc7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLmRvY3VtZW50Rm9ybS5nZXQoJ3RlbXBsYXRlRGVzY3JpcHRpb24nKT8udmFsdWU/LnRyaW0oKSA/PyAnJztcbiAgICB0aGlzLmNyZWF0ZVRlbXBsYXRlLmVtaXQoeyB0ZW1wbGF0ZU5hbWU6IG5hbWUsIHRlbXBsYXRlRGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIH0pO1xuICB9XG5cbiAgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTtcbiAgICBpZiAoZmlsZSkge1xuICAgICAgdGhpcy51cGxvYWRlZEZpbGUgPSBmaWxlO1xuICAgIH1cbiAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICB9XG5cbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlzRHJhZ092ZXIgPSB0cnVlO1xuICB9XG5cbiAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XG4gIH1cblxuICBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXM/LlswXTtcbiAgICBpZiAoZmlsZSAmJiB0aGlzLmlzQWNjZXB0ZWRUZW1wbGF0ZUZpbGUoZmlsZSkpIHtcbiAgICAgIHRoaXMudXBsb2FkZWRGaWxlID0gZmlsZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzQWNjZXB0ZWRUZW1wbGF0ZUZpbGUoZmlsZTogRmlsZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFjY2VwdGVkID0gWycucGRmJywgJy5kb2MnLCAnLmRvY3gnLCAnLnR4dCddO1xuICAgIGNvbnN0IG5hbWUgPSBmaWxlLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gYWNjZXB0ZWQuc29tZShleHQgPT4gbmFtZS5lbmRzV2l0aChleHQpKTtcbiAgfVxuXG4gIGFkZE1hcHBpbmcoKTogdm9pZCB7XG4gICAgY29uc3QgbWFwcGluZ0dyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBrZXk6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB2YWx1ZVR5cGU6IFsndmFyaWFibGUnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHZhbHVlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgZW5hYmxlZDogW2ZhbHNlXVxuICAgIH0pO1xuICAgIHRoaXMubWFwcGluZ3NGb3JtQXJyYXkucHVzaChtYXBwaW5nR3JvdXApO1xuICB9XG5cbiAgcmVtb3ZlTWFwcGluZyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5tYXBwaW5nc0Zvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gIH1cblxuICBnZXRNYXBwaW5nRm9ybUdyb3VwKGluZGV4OiBudW1iZXIpOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLm1hcHBpbmdzRm9ybUFycmF5LmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIGV2ZXJ5IG1hcHBpbmcgcm93IGhhcyBlbmFibGVkID09PSB0cnVlICovXG4gIGdldCBhbGxNYXBwaW5nc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxlbiA9IHRoaXMubWFwcGluZ3NGb3JtQXJyYXkubGVuZ3RoO1xuICAgIGlmIChsZW4gPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuZ2V0TWFwcGluZ0Zvcm1Hcm91cChpKS5nZXQoJ2VuYWJsZWQnKT8udmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIGF0IGxlYXN0IG9uZSBtYXBwaW5nIHJvdyBoYXMgZW5hYmxlZCA9PT0gdHJ1ZSAoZm9yIGhlYWRlciBpbmRldGVybWluYXRlKSAqL1xuICBnZXQgc29tZU1hcHBpbmdzU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1hcHBpbmdzRm9ybUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5nZXRNYXBwaW5nRm9ybUdyb3VwKGkpLmdldCgnZW5hYmxlZCcpPy52YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG9uU2VsZWN0QWxsTWFwcGluZ3MoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMubWFwcGluZ3NGb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoXywgaSkgPT4ge1xuICAgICAgdGhpcy5nZXRNYXBwaW5nRm9ybUdyb3VwKGkpLmdldCgnZW5hYmxlZCcpPy5zZXRWYWx1ZShjaGVja2VkKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoKTtcbiAgfVxuXG4gIG9uQ3JlYXRlU3RlcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRlbXBsYXRlU291cmNlID09PSAndXBsb2FkJyAmJiAhdGhpcy51cGxvYWRlZEZpbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZSA9PT0gJ2NyZWF0ZU5ldycpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmRvY3VtZW50Rm9ybS5nZXQoJ3RlbXBsYXRlTmFtZScpPy52YWx1ZT8udHJpbSgpO1xuICAgICAgY29uc3QgZGVzYyA9IHRoaXMuZG9jdW1lbnRGb3JtLmdldCgndGVtcGxhdGVEZXNjcmlwdGlvbicpPy52YWx1ZT8udHJpbSgpO1xuICAgICAgaWYgKCFuYW1lIHx8ICFkZXNjKSByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmRvY3VtZW50Rm9ybS52YWxpZCkge1xuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5kb2N1bWVudEZvcm0udmFsdWU7XG4gICAgICBjb25zdCBzdGVwRGF0YTogRG9jdW1lbnRGb3JtRGF0YSA9IHtcbiAgICAgICAgZG9jdW1lbnRUeXBlOiBmb3JtVmFsdWUuZG9jdW1lbnRUeXBlLFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogZm9ybVZhbHVlLm91dHB1dFZhcmlhYmxlLFxuICAgICAgICB0ZW1wbGF0ZVNvdXJjZTogdGhpcy5zZWxlY3RlZFRlbXBsYXRlU291cmNlLFxuICAgICAgICB0ZW1wbGF0ZUlkOiBmb3JtVmFsdWUudGVtcGxhdGVJZCB8fCB1bmRlZmluZWQsXG4gICAgICAgIC4uLih0aGlzLnNlbGVjdGVkVGVtcGxhdGVTb3VyY2UgPT09ICd1cGxvYWQnICYmIHRoaXMudXBsb2FkZWRGaWxlICYmIHsgdXBsb2FkZWRGaWxlOiB0aGlzLnVwbG9hZGVkRmlsZSB9KSxcbiAgICAgICAgLi4uKHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZSA9PT0gJ2NyZWF0ZU5ldycgJiYge1xuICAgICAgICAgIHRlbXBsYXRlTmFtZTogKGZvcm1WYWx1ZS50ZW1wbGF0ZU5hbWUgPz8gJycpLnRyaW0oKSxcbiAgICAgICAgICB0ZW1wbGF0ZURlc2NyaXB0aW9uOiAoZm9ybVZhbHVlLnRlbXBsYXRlRGVzY3JpcHRpb24gPz8gJycpLnRyaW0oKVxuICAgICAgICB9KSxcbiAgICAgICAgbWFwcGluZ3M6IChmb3JtVmFsdWUubWFwcGluZ3MgfHwgW10pLm1hcCgobTogYW55KSA9PiAoe1xuICAgICAgICAgIGtleTogbS5rZXkgfHwgJycsXG4gICAgICAgICAgdmFsdWVUeXBlOiBtLnZhbHVlVHlwZSB8fCAndmFyaWFibGUnLFxuICAgICAgICAgIHZhbHVlOiBtLnZhbHVlIHx8ICcnLFxuICAgICAgICAgIGVuYWJsZWQ6IG0uZW5hYmxlZCA/PyBmYWxzZVxuICAgICAgICB9KSlcbiAgICAgIH07XG4gICAgICB0aGlzLmNyZWF0ZVN0ZXAuZW1pdChzdGVwRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgb25NYXBwZXJIZWxwQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWFwcGVySGVscFVybCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHdpbmRvdy5vcGVuKHRoaXMubWFwcGVySGVscFVybCwgJ19ibGFuaycpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290IGNxYS1ibG9jayBjcWEtdy1mdWxsIGNxYS1taW4tdy0wIGNxYS1zdGVwLWJ1aWxkZXItZG9jdW1lbnRcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS13LWZ1bGwgY3FhLW1pbi13LTAgY3FhLWgtZnVsbCBjcWEtYmctd2hpdGUgY3FhLWJvcmRlciBjcWEtYm94LWJvcmRlciBjcWEtbWF4LXctZnVsbCBjcWEtb3BhY2l0eS0xMDBcIj5cbiAgICA8IS0tIENvbnRlbnQgYXJlYTogcGFkZGluZyAxNnB4LCBnYXAgMTJweCBiZXR3ZWVuIHNlY3Rpb25zIChubyBmbGV4LTEgdG8gYXZvaWQgZ2FwIGFib3ZlIGZvb3RlcikgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC1zaHJpbmstMCBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1wLTQgY3FhLWdhcC0zXCI+XG4gIDwhLS0gSGVhZGVyOiBEb2N1bWVudCBHZW5lcmF0aW9uIFRlbXBsYXRlIFN0ZXAgKGxlZnQtYWxpZ25lZCwgSW50ZXIgNjAwIDEycHggbGluZS1oZWlnaHQgMTAwJSkgLS0+XG4gIDxoMlxuICAgIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxMDAlXSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMCBjcWEtdGV4dC1sZWZ0IGNxYS1mbGV4LXNocmluay0wIGNxYS1hbGlnbi1taWRkbGVcIj5cbiAgICBEb2N1bWVudCBHZW5lcmF0aW9uIFRlbXBsYXRlIFN0ZXBcbiAgPC9oMj5cblxuICAgIDwhLS0gRG9jdW1lbnQgVHlwZSBhbmQgT3V0cHV0IFZhcmlhYmxlIFJvdyAoZ2FwIDEycHggYmV0d2VlbiBjb2x1bW5zKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtd3JhcCBjcWEtZmxleC1zaHJpbmstMCBjcWEtZ2FwLTE0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtbWluLXctW2NhbGMoNDUlLTZweCldIFwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1tYi0xLjUgY3FhLWJsb2NrXCI+XG4gICAgICAgICAgRG9jdW1lbnQgVHlwZSA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jdW1lbnQtdHlwZS1zZWxlY3RcIj5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJkb2N1bWVudEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXREb2N1bWVudFR5cGVDb25maWcoKVwiPlxuICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLW10LTEgY3FhLW0tMFwiPlxuICAgICAgICAgIENob29zZSB0aGUgZmlsZSBmb3JtYXQgeW91IHdhbnQgdG8gZ2VuZXJhdGUuXG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTAgY3FhLW1pbi13LVtjYWxjKDQ1JS02cHgpXVwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1tYi0xLjUgY3FhLWJsb2NrXCI+XG4gICAgICAgICAgT3V0cHV0IFZhcmlhYmxlIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJJbnB1dFwiXG4gICAgICAgICAgW3ZhbHVlXT1cImRvY3VtZW50Rm9ybS5nZXQoJ291dHB1dFZhcmlhYmxlJyk/LnZhbHVlXCJcbiAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJkb2N1bWVudEZvcm0uZ2V0KCdvdXRwdXRWYXJpYWJsZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLW10LTEgY3FhLW0tMFwiPlxuICAgICAgICAgIFN0b3JlcyB0aGUgZ2VuZXJhdGVkIGZpbGUgc28gaXQgY2FuIGJlIHVzZWQgaW4gbGF0ZXIgc3RlcHMuXG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBUZW1wbGF0ZSBTb3VyY2UgU2VjdGlvbjogbGFiZWwgbGVmdCwgdGFicyByaWdodCBvbiBzYW1lIHJvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1mbGV4LXNocmluay0wIGNxYS1nYXAtM1wiPlxuICAgICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtNFwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1tLTAgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICBUZW1wbGF0ZSBTb3VyY2VcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCJcbiAgICAgICAgICBbc2VnbWVudHNdPVwiW1xuICAgICAgICAgICAgeyBsYWJlbDogJ1VzZSBFeGlzdGluZyBUZW1wbGF0ZScsIHZhbHVlOiAnZXhpc3RpbmcnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnVXBsb2FkIFRlbXBsYXRlJywgdmFsdWU6ICd1cGxvYWQnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnQ3JlYXRlIE5ldycsIHZhbHVlOiAnY3JlYXRlTmV3JyB9XG4gICAgICAgICAgXVwiXG4gICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkVGVtcGxhdGVTb3VyY2VcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblRlbXBsYXRlU291cmNlQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZG9jdW1lbnQtdHlwZS1zZWxlY3RcIiAqbmdJZj1cInNlbGVjdGVkVGVtcGxhdGVTb3VyY2UgPT09ICdleGlzdGluZydcIj5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImRvY3VtZW50Rm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJnZXRUZW1wbGF0ZVNlbGVjdENvbmZpZygpXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVXBsb2FkIFRlbXBsYXRlOiBDUUEgZHJhZy1hbmQtZHJvcCB6b25lIChtaW5pbWFsLCB3aGl0ZSwgY2VudGVyZWQpIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkVGVtcGxhdGVTb3VyY2UgPT09ICd1cGxvYWQnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtbS0wXCI+XG4gICAgICAgICAgQXR0YWNobWVudCA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAjZmlsZUlucHV0XG4gICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgIGFjY2VwdD1cIi5wZGYsLmRvYywuZG9jeCwudHh0XCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1oaWRkZW5cIlxuICAgICAgICAgIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1taW4taC1bMTQwcHhdIGNxYS1yb3VuZGVkIGNxYS1ib3JkZXItMiBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLWdyYXktMzAwIGNxYS1iZy13aGl0ZSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWdhcC0zIGNxYS1wLTYgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgW2NsYXNzLmNxYS1yaW5nLTJdPVwiaXNEcmFnT3ZlclwiXG4gICAgICAgICAgW2NsYXNzLmNxYS1yaW5nLVsjM0Y0M0VFXV09XCJpc0RyYWdPdmVyXCJcbiAgICAgICAgICBbY2xhc3MuY3FhLXJpbmctaW5zZXRdPVwiaXNEcmFnT3ZlclwiXG4gICAgICAgICAgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCJcbiAgICAgICAgICAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQpXCJcbiAgICAgICAgICAoZHJhZ2xlYXZlKT1cIm9uRHJhZ0xlYXZlKCRldmVudClcIlxuICAgICAgICAgIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQpXCJcbiAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImZpbGVJbnB1dC5jbGljaygpXCJcbiAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIlVwbG9hZCB0ZW1wbGF0ZSBmaWxlXCI+XG4gICAgICAgICAgPCEtLSBVcGxvYWQgaWNvbjogYXJyb3cgaW4gZm9sZGVyL2JveCAoZGFyayBncmF5KSAtLT5cbiAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLXctOCBjcWEtaC04ICBjcWEtZm9udC1ib2xkXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTIxIDE1djRhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ2LTRcIi8+XG4gICAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiMTcgOCAxMiAzIDcgOFwiLz5cbiAgICAgICAgICAgIDxsaW5lIHgxPVwiMTJcIiB5MT1cIjNcIiB4Mj1cIjEyXCIgeTI9XCIxNVwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LWJhc2UgY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1tLTAgY3FhLXRleHQtY2VudGVyIGNxYS1mb250LWJvbGRcIj5cbiAgICAgICAgICAgIERyYWcgYW5kIGRyb3AgZmlsZXMgaGVyZSBvciA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtZm9udC1tZWRpdW0gaG92ZXI6Y3FhLXVuZGVybGluZVwiPmJyb3dzZTwvc3Bhbj5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW0tMFwiPlxuICAgICAgICAgICAgUERGLCBET0MsIG9yIFRYVCBmaWxlc1xuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyMwQTBBMEFdIGNxYS1tLTBcIj5cbiAgICAgICAgICBDaG9vc2UgdGhlIGZpbGUgZm9ybWF0IHlvdSB3YW50IHRvIGdlbmVyYXRlLlxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gQ3JlYXRlIE5ldzogVGVtcGxhdGUgTmFtZSwgVGVtcGxhdGUgRGVzY3JpcHRpb24sIENyZWF0ZSBUZW1wbGF0ZSBidXR0b24gLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZSA9PT0gJ2NyZWF0ZU5ldydcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0zXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTAgY3FhLW1pbi13LVtjYWxjKDUwJS02cHgpXVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtbWItMS41IGNxYS1ibG9ja1wiPlxuICAgICAgICAgICAgICBUZW1wbGF0ZSBOYW1lIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQREYgRG9jdW1lbnQgKC5wZGYpXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImRvY3VtZW50Rm9ybS5nZXQoJ3RlbXBsYXRlTmFtZScpPy52YWx1ZVwiXG4gICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJkb2N1bWVudEZvcm0uZ2V0KCd0ZW1wbGF0ZU5hbWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wIGNxYS1taW4tdy1bY2FsYyg1MCUtNnB4KV1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW1iLTEuNSBjcWEtYmxvY2tcIj5cbiAgICAgICAgICAgICAgVGVtcGxhdGUgRGVzY3JpcHRpb24gPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBERiBEb2N1bWVudCAoLnBkZilcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZG9jdW1lbnRGb3JtLmdldCgndGVtcGxhdGVEZXNjcmlwdGlvbicpPy52YWx1ZVwiXG4gICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJkb2N1bWVudEZvcm0uZ2V0KCd0ZW1wbGF0ZURlc2NyaXB0aW9uJyk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtanVzdGlmeS1lbmRcIj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgdmFyaWFudD1cImZpbGxlZFwiXG4gICAgICAgICAgICBidG5TaXplPVwibGdcIlxuICAgICAgICAgICAgdGV4dD1cIkNyZWF0ZSBUZW1wbGF0ZVwiXG4gICAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0gY3FhLWJvcmRlci1bIzNGNDNFRV0gY3FhLWJnLVsjM0Y0M0VFXSdcIlxuICAgICAgICAgICAgKGNsaWNrZWQpPVwib25DcmVhdGVUZW1wbGF0ZSgpXCI+XG4gICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBEb2N1bWVudCBNYXBwZXIgU2VjdGlvbjogdGl0bGUgKyBzdWJ0aXRsZSBsZWZ0LCBOZWVkIGhlbHA/IHJpZ2h0IChDUUEgdGFibGUgYmVsb3cpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWdhcC0zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0YXJ0IGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC00XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1iYXNlIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtdGV4dC1bMTRweF0gY3FhLW0tMCBjcWEtbGVhZGluZy10aWdodFwiPlxuICAgICAgICAgICAgRG9jdW1lbnQgTWFwcGVyXG4gICAgICAgICAgPC9oMz5cbiAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW0tMCBjcWEtbXQtMC41XCI+XG4gICAgICAgICAgICBNYXAgcGxhY2Vob2xkZXJzIHRvIGR5bmFtaWMgdmFsdWVzLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWlubGluZS1mbGV4IGNxYS1mbGV4LXNocmluay0wXCJcbiAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzaG93SGVscFRvb2x0aXAgPSB0cnVlXCJcbiAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJzaG93SGVscFRvb2x0aXAgPSBmYWxzZVwiPlxuICAgICAgICAgIDxhICpuZ0lmPVwibWFwcGVySGVscFVybFwiXG4gICAgICAgICAgICAgaHJlZj1cIiNcIlxuICAgICAgICAgICAgIChjbGljayk9XCJvbk1hcHBlckhlbHBDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIxcHhdIGNxYS1uby11bmRlcmxpbmUgY3FhLWN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTcgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wIGNxYS10ZXh0LVsjM0Y0M0VFXVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2hlbHAtaWNvbi1jbGlwLWRvYylcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNTAwMzMgMTQuNjY2M0MxMi40MTIzIDE0LjY2NjMgMTUuNTgzNyAxMS42ODE2IDE1LjU4MzcgNy45OTk2N0MxNS41ODM3IDQuMzE3NzggMTIuNDEyMyAxLjMzMzAxIDguNTAwMzMgMS4zMzMwMUM0LjU4ODMxIDEuMzMzMDEgMS40MTY5OSA0LjMxNzc4IDEuNDE2OTkgNy45OTk2N0MxLjQxNjk5IDExLjY4MTYgNC41ODgzMSAxNC42NjYzIDguNTAwMzMgMTQuNjY2M1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjQzODQ4IDYuMDAwMzhDNi42MDUwMSA1LjU1NDgzIDYuOTMzNzEgNS4xNzkxMiA3LjM2NjM2IDQuOTM5OEM3Ljc5OTAxIDQuNzAwNDkgOC4zMDc2OSA0LjYxMzAxIDguODAyMzEgNC42OTI4NUM5LjI5NjkzIDQuNzcyNyA5Ljc0NTU2IDUuMDE0NzMgMTAuMDY4NyA1LjM3NjA3QzEwLjM5MTkgNS43Mzc0IDEwLjU2ODggNi4xOTQ3MyAxMC41NjgxIDYuNjY3MDVDMTAuNTY4MSA4LjAwMDM4IDguNDQzMDYgOC42NjcwNSA4LjQ0MzA2IDguNjY3MDVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjUgMTEuMzMzSDguNTA5NjZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiaGVscC1pY29uLWNsaXAtZG9jXCI+XG4gICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwid2hpdGVcIi8+XG4gICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICBOZWVkIGhlbHAgP1xuICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFtYXBwZXJIZWxwVXJsXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1mb250LVs1MDBdIGNxYS10ZXh0LVsxMHB4XSBjcWEtY3Vyc29yLWRlZmF1bHQgY3FhLXRleHQtWyMzNzQxNTFdXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTcgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wIGNxYS10ZXh0LVsjM0Y0M0VFXVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2hlbHAtaWNvbi1jbGlwLWRvYy1ub2xpbmspXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjUwMDMzIDE0LjY2NjNDMTIuNDEyMyAxNC42NjYzIDE1LjU4MzcgMTEuNjgxNiAxNS41ODM3IDcuOTk5NjdDMTUuNTgzNyA0LjMxNzc4IDEyLjQxMjMgMS4zMzMwMSA4LjUwMDMzIDEuMzMzMDFDNC41ODgzMSAxLjMzMzAxIDEuNDE2OTkgNC4zMTc3OCAxLjQxNjk5IDcuOTk5NjdDMS40MTY5OSAxMS42ODE2IDQuNTg4MzEgMTQuNjY2MyA4LjUwMDMzIDE0LjY2NjNaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi40Mzg0OCA2LjAwMDM4QzYuNjA1MDEgNS41NTQ4MyA2LjkzMzcxIDUuMTc5MTIgNy4zNjYzNiA0LjkzOThDNy43OTkwMSA0LjcwMDQ5IDguMzA3NjkgNC42MTMwMSA4LjgwMjMxIDQuNjkyODVDOS4yOTY5MyA0Ljc3MjcgOS43NDU1NiA1LjAxNDczIDEwLjA2ODcgNS4zNzYwN0MxMC4zOTE5IDUuNzM3NCAxMC41Njg4IDYuMTk0NzMgMTAuNTY4MSA2LjY2NzA1QzEwLjU2ODEgOC4wMDAzOCA4LjQ0MzA2IDguNjY3MDUgOC40NDMwNiA4LjY2NzA1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC41IDExLjMzM0g4LjUwOTY2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImhlbHAtaWNvbi1jbGlwLWRvYy1ub2xpbmtcIj5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiLz5cbiAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIE5lZWQgaGVscCA/XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93SGVscFRvb2x0aXBcIiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtei1bMTAwXSBjcWEtdG9wLVstMjRweF0gY3FhLWxlZnQtWy0yMDNweF1cIiByb2xlPVwidG9vbHRpcFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LXdoaXRlIGNxYS10ZXh0LWNlbnRlciBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLXctWzMwNnB4XSBjcWEtbWluLWgtNSBjcWEtcm91bmRlZC1bNnB4XSBjcWEtb3BhY2l0eS0xMDAgY3FhLXB4LTIgY3FhLXB5LTEgY3FhLWJnLVsjMEEwQTBBXSBjcWEtbGVhZGluZy01IGNxYS10ZXh0LVs4cHhdXCI+XG4gICAgICAgICAgICAgIHt7IG1hcHBlckhlbHBUb29sdGlwVGV4dCB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIFRhYmxlIG9yIGVtcHR5IHN0YXRlOiBzYW1lIGNvbnRhaW5lciwgaGVhZGVyIGFsd2F5cyB2aXNpYmxlIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1yb3VuZGVkLWxnIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLWJnLXdoaXRlIGNxYS1zaGFkb3ctc20gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItZ3JheS0yMDBcIj5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwiY3FhLXctZnVsbFwiPlxuICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgIDx0ciBjbGFzcz1cImNxYS1pdGVtcy1jZW50ZXIgY3FhLWJnLVsjRDhEOUZDNERdXCI+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNxYS1weS1bMTMuMjVweF0gY3FhLXB4LVsxMC41cHhdIGNxYS10ZXh0LXhzIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1sZWZ0IGNxYS13LVs0MHB4XSBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggW2NoZWNrZWRdPVwiYWxsTWFwcGluZ3NTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNvbWVNYXBwaW5nc1NlbGVjdGVkICYmICFhbGxNYXBwaW5nc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdEFsbE1hcHBpbmdzKCRldmVudC5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTZWxlY3QgYWxsIG1hcHBpbmdzXCI+XG4gICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNxYS1weS1bMTMuMjVweF0gY3FhLXB4LVsxMC41cHhdIGNxYS10ZXh0LXhzIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1sZWZ0IGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLWdyYXktMjAwXCI+S2V5PC90aD5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3FhLXB5LVsxMy4yNXB4XSBjcWEtcHgtWzEwLjVweF0gY3FhLXRleHQteHMgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LWxlZnQgY3FhLWJvcmRlci1iIGNxYS1ib3JkZXItZ3JheS0yMDAgY3FhLXctWzEyMHB4XVwiPlZhbHVlIFR5cGU8L3RoPlxuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjcWEtcHktWzEzLjI1cHhdIGNxYS1weC1bMTAuNXB4XSBjcWEtdGV4dC14cyBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtbGVmdCBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlZhbHVlPC90aD5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3FhLXB5LVsxMy4yNXB4XSBjcWEtcHgtWzEwLjVweF0gY3FhLXRleHQteHMgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LWxlZnQgY3FhLWJvcmRlci1iIGNxYS1ib3JkZXItZ3JheS0yMDAgY3FhLXctWzQ4cHhdXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtc3Itb25seVwiPkRlbGV0ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8IS0tIEVtcHR5IHN0YXRlIHdoZW4gbm8gbWFwcGluZ3MgLS0+XG4gICAgICAgICAgICA8dHIgKm5nSWY9XCJtYXBwaW5nc0Zvcm1BcnJheS5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCI1XCIgY2xhc3M9XCJjcWEtcC0wIGNxYS1hbGlnbi1taWRkbGUgY3FhLWJvcmRlci1iIGNxYS1ib3JkZXItZ3JheS0yMDBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1weS0xMiBjcWEtcHgtNCBjcWEtYmctd2hpdGVcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tLTAgY3FhLW1iLTRcIj5TdGFydCBtYXBwaW5nIHBsYWNlaG9sZGVycyB0byB2YWx1ZXMuPC9wPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcm91bmRlZC1sZyBjcWEtcHgtNCBjcWEtcHktMi41IGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LXdoaXRlIGNxYS1iZy1bIzRGNDZFNV0gY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtb3BhY2l0eS05MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE1hcHBpbmcoKVwiPlxuICAgICAgICAgICAgICAgICAgICBBZGQgZmlyc3QgbWFwcGluZ1xuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPCEtLSBEYXRhIHJvd3Mgd2hlbiB0aGVyZSBhcmUgbWFwcGluZ3MgLS0+XG4gICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IG1hcHBpbmcgb2YgbWFwcGluZ3NGb3JtQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXdoaXRlIGhvdmVyOmNxYS1iZy1bI0Y5RkFGQl1cIj5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY3FhLXB4LVsxMC41cHhdIGNxYS1weS1bMTFweF0gY3FhLWFsaWduLW1pZGRsZSBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggW2NoZWNrZWRdPVwiZ2V0TWFwcGluZ0Zvcm1Hcm91cChpKS5nZXQoJ2VuYWJsZWQnKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImdldE1hcHBpbmdGb3JtR3JvdXAoaSkuZ2V0KCdlbmFibGVkJyk/LnNldFZhbHVlKCRldmVudC5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFbmFibGUgbWFwcGluZ1wiPlxuICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjcWEtcHgtWzEwLjVweF0gY3FhLXB5LVsxMXB4XSBjcWEtYWxpZ24tbWlkZGxlIGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLWdyYXktMjAwIFwiPlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0tleSdcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldE1hcHBpbmdGb3JtR3JvdXAoaSkuZ2V0KCdrZXknKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJnZXRNYXBwaW5nRm9ybUdyb3VwKGkpLmdldCgna2V5Jyk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNxYS1weC1bMTAuNXB4XSBjcWEtcHktWzExcHhdIGNxYS1hbGlnbi1taWRkbGUgY3FhLWJvcmRlci1iIGNxYS1ib3JkZXItZ3JheS0yMDBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jdW1lbnQtdHlwZS1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICAgICAgICBbZm9ybV09XCJnZXRNYXBwaW5nRm9ybUdyb3VwKGkpXCJcbiAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiZ2V0VmFsdWVUeXBlQ29uZmlnKGkpXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjcWEtcHgtWzEwLjVweF0gY3FhLXB5LVsxMXB4XSBjcWEtYWxpZ24tbWlkZGxlIGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInVmFsdWUnXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRNYXBwaW5nRm9ybUdyb3VwKGkpLmdldCgndmFsdWUnKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJnZXRNYXBwaW5nRm9ybUdyb3VwKGkpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY3FhLXB4LVsxMC41cHhdIGNxYS1weS1bMTFweF0gY3FhLWFsaWduLW1pZGRsZSBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy05IGNxYS1oLTkgY3FhLXJvdW5kZWQgY3FhLXRleHQtWyNFNTczNzNdIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBjcWEtYm9yZGVyLW5vbmUgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtb3BhY2l0eS04MFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlTWFwcGluZyhpKVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEZWxldGUgbWFwcGluZydcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLWZsZXgtc2hyaW5rLTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDZoMThNOCA2VjRhMiAyIDAgMDEyLTJoNGEyIDIgMCAwMTIgMnYybTMgMHYxNGEyIDIgMCAwMS0yIDJIN2EyIDIgMCAwMS0yLTJWNmgxNHpcIi8+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgMTF2Nk0xNCAxMXY2XCIvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgXG4gICAgICAgIDwvdGFibGU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtanVzdGlmeS1lbmRcIiAqbmdJZj1cIm1hcHBpbmdzRm9ybUFycmF5Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1wLTNcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZE1hcHBpbmcoKVwiPlxuICAgICAgICAgICAgKyBBZGQgTWFwcGluZ1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWp1c3RpZnktZW5kXCIgKm5nSWY9XCJtYXBwaW5nc0Zvcm1BcnJheS5sZW5ndGggPiAwXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtcC0wXCJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkTWFwcGluZygpXCI+XG4gICAgICAgICAgKyBBZGQgTWFwcGluZ1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PiAtLT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIFxuXG4gIDwhLS0gRGl2aWRlciBhYm92ZSBmb290ZXIgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtaC1weCBjcWEtdy1mdWxsXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEFjdGlvbiBCdXR0b25zIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0cmV0Y2ggY3FhLXctZnVsbCBjcWEtcC00IGNxYS1nYXAtM1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgICBidG5TaXplPVwibGdcIlxuICAgICAgICB0ZXh0PVwiQ2FuY2VsXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdIGNxYS1ib3JkZXItWyM0MTQxNDZdJ1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgdmFyaWFudD1cImZpbGxlZFwiXG4gICAgICAgIGJ0blNpemU9XCJsZ1wiXG4gICAgICAgIHRleHQ9XCJDcmVhdGUgU3RlcFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSBjcWEtYm9yZGVyLVsjM0Y0M0VFXSdcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvbkNyZWF0ZVN0ZXAoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|