tango-app-ui-store-builder 1.2.10 → 1.2.12
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/esm2022/lib/components/chips-input/chips-input.component.mjs +101 -0
- package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.mjs +2 -2
- package/esm2022/lib/components/create-fixture/create-fixture.component.mjs +66 -25
- package/esm2022/lib/components/create-vm/create-vm.component.mjs +2 -2
- package/esm2022/lib/components/fixture-template/template-basic-details/template-basic-details.component.mjs +1 -1
- package/esm2022/lib/components/fixture-template/template-products/template-products.component.mjs +15 -5
- package/esm2022/lib/components/fixture-template/template-vms/template-vms.component.mjs +31 -12
- package/esm2022/lib/components/fixture-template-table/popups/create-fixture-template/create-fixture-template.component.mjs +1 -1
- package/esm2022/lib/components/look-plano-collection/look-plano-collection.component.mjs +156 -0
- package/esm2022/lib/components/look-plano-collection-form/look-plano-collection-form.component.mjs +1204 -0
- package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +1 -1
- package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +1 -1
- package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +1 -1
- package/esm2022/lib/components/manage-store-plano/template-products/template-products.component.mjs +2 -2
- package/esm2022/lib/components/manage-store-plano/template-vms/template-vms.component.mjs +2 -2
- package/esm2022/lib/components/manage-store-plano/verification-feedback/zone-editable-fixture/zone-editable-fixture.component.mjs +1 -1
- package/esm2022/lib/components/multiselect-chip-dropdown/multiselect-chip-dropdown.component.mjs +27 -4
- package/esm2022/lib/components/onboard-store-plano/create-planogram/create-planogram.component.mjs +2 -2
- package/esm2022/lib/components/onboard-store-plano/onboard-store-plano.component.mjs +1 -1
- package/esm2022/lib/components/plano-library/fixture-library/popups/create-fixture-modal/create-fixture-modal.component.mjs +1 -1
- package/esm2022/lib/components/plano-tools/delete-floor/delete-floor.component.mjs +3 -3
- package/esm2022/lib/components/plano-tools/move-bucket/move-bucket.component.mjs +1 -1
- package/esm2022/lib/components/plano-tools/swap-template/swap-template.component.mjs +1 -1
- package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +1 -1
- package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +1 -1
- package/esm2022/lib/components/popups/publish-plano-modal/publish-plano-modal.component.mjs +1 -1
- package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +22 -3
- package/esm2022/lib/components/searchable-select/searchable-select.component.mjs +265 -0
- package/esm2022/lib/components/store-plano/store-plano.component.mjs +1 -1
- package/esm2022/lib/interfaces/fixture-library.interface.mjs +1 -1
- package/esm2022/lib/services/store-builder.service.mjs +28 -3
- package/esm2022/lib/tango-store-builder-routing.module.mjs +11 -1
- package/esm2022/lib/tango-store-builder.module.mjs +23 -4
- package/fesm2022/tango-app-ui-store-builder.mjs +1914 -69
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/chips-input/chips-input.component.d.ts +35 -0
- package/lib/components/create-fixture/create-fixture.component.d.ts +3 -0
- package/lib/components/fixture-template/template-products/template-products.component.d.ts +9 -1
- package/lib/components/fixture-template/template-vms/template-vms.component.d.ts +9 -1
- package/lib/components/look-plano-collection/look-plano-collection.component.d.ts +53 -0
- package/lib/components/look-plano-collection-form/look-plano-collection-form.component.d.ts +237 -0
- package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +4 -4
- package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +5 -5
- package/lib/components/multiselect-chip-dropdown/multiselect-chip-dropdown.component.d.ts +12 -1
- package/lib/components/reactive-select/reactive-select.component.d.ts +12 -1
- package/lib/components/searchable-select/searchable-select.component.d.ts +56 -0
- package/lib/interfaces/fixture-library.interface.d.ts +1 -0
- package/lib/services/store-builder.service.d.ts +7 -1
- package/lib/tango-store-builder.module.d.ts +39 -34
- package/package.json +1 -1
|
@@ -129,19 +129,25 @@ export class CreateFixtureComponent {
|
|
|
129
129
|
});
|
|
130
130
|
}
|
|
131
131
|
initializeForm() {
|
|
132
|
-
|
|
132
|
+
// Default floor fixtures created before sub-type existed to 'panel'.
|
|
133
|
+
if (this.fixtureDetails.fixtureType === "floor" && !this.fixtureDetails.fixtureSubType) {
|
|
134
|
+
this.fixtureDetails.fixtureSubType = "panel";
|
|
135
|
+
}
|
|
136
|
+
if (this.isShelfStructure()) {
|
|
133
137
|
this.initWallFixtureForm();
|
|
134
138
|
}
|
|
135
139
|
else {
|
|
136
140
|
this.initFloorPanelFixtureForm();
|
|
137
141
|
}
|
|
138
142
|
if (this.isEditMode) {
|
|
139
|
-
if (
|
|
140
|
-
this.
|
|
141
|
-
|
|
142
|
-
this.
|
|
143
|
-
|
|
144
|
-
this.
|
|
143
|
+
if (this.isShelfStructure()) {
|
|
144
|
+
if (!this.fixtureDetails.header?.isEnabled)
|
|
145
|
+
this.toggleSection("header");
|
|
146
|
+
if (!this.fixtureDetails.footer?.isEnabled)
|
|
147
|
+
this.toggleSection("footer");
|
|
148
|
+
if (!this.fixtureDetails.isBodyEnabled)
|
|
149
|
+
this.toggleSection("body");
|
|
150
|
+
}
|
|
145
151
|
}
|
|
146
152
|
else {
|
|
147
153
|
this.wallFixtureForm?.disable({ emitEvent: false });
|
|
@@ -151,8 +157,43 @@ export class CreateFixtureComponent {
|
|
|
151
157
|
this.isFooterEnabled = this.fixtureDetails.footer?.isEnabled ?? false;
|
|
152
158
|
}
|
|
153
159
|
}
|
|
160
|
+
isShelfStructure() {
|
|
161
|
+
return (this.fixtureDetails.fixtureType === "wall" ||
|
|
162
|
+
(this.fixtureDetails.fixtureType === "floor" &&
|
|
163
|
+
this.fixtureDetails.fixtureSubType === "shelf"));
|
|
164
|
+
}
|
|
165
|
+
isPanelStructure() {
|
|
166
|
+
return (this.fixtureDetails.fixtureType === "floor" &&
|
|
167
|
+
this.fixtureDetails.fixtureSubType !== "shelf");
|
|
168
|
+
}
|
|
169
|
+
onFloorSubTypeChange(subType) {
|
|
170
|
+
if (!this.isEditMode)
|
|
171
|
+
return;
|
|
172
|
+
if (this.fixtureDetails.fixtureSubType === subType)
|
|
173
|
+
return;
|
|
174
|
+
const basicDetails = this.getForm()?.get("basicDetails")?.value;
|
|
175
|
+
this.fixtureDetails.fixtureSubType = subType;
|
|
176
|
+
this.fixtureDetails.shelfConfig = [];
|
|
177
|
+
if (subType === "shelf") {
|
|
178
|
+
this.initWallFixtureForm();
|
|
179
|
+
this.shelfArray.clear();
|
|
180
|
+
this.addShelf();
|
|
181
|
+
this.isHeaderEnabled = true;
|
|
182
|
+
this.isBodyEnabled = true;
|
|
183
|
+
this.isFooterEnabled = true;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
this.initFloorPanelFixtureForm();
|
|
187
|
+
this.panelArray.clear();
|
|
188
|
+
this.addPanel();
|
|
189
|
+
}
|
|
190
|
+
if (basicDetails) {
|
|
191
|
+
this.getForm()?.get("basicDetails")?.patchValue(basicDetails);
|
|
192
|
+
}
|
|
193
|
+
this.getForm()?.markAsDirty();
|
|
194
|
+
}
|
|
154
195
|
getForm() {
|
|
155
|
-
return this.
|
|
196
|
+
return this.isShelfStructure()
|
|
156
197
|
? this.wallFixtureForm
|
|
157
198
|
: this.floorFixtureForm;
|
|
158
199
|
}
|
|
@@ -163,18 +204,15 @@ export class CreateFixtureComponent {
|
|
|
163
204
|
return this.floorFixtureForm.get("panel");
|
|
164
205
|
}
|
|
165
206
|
get totalProductCapacity() {
|
|
166
|
-
const formArray = this.
|
|
207
|
+
const formArray = this.isShelfStructure()
|
|
167
208
|
? this.shelfArray
|
|
168
209
|
: this.panelArray;
|
|
169
210
|
return formArray.controls.reduce((total, item) => {
|
|
170
211
|
const count = item.get("productCapacity")?.value || 0;
|
|
171
212
|
const isTray = item.get("type")?.value === "tray";
|
|
172
213
|
const rows = item.get("noOfRows")?.value || 1;
|
|
173
|
-
//
|
|
174
|
-
return (total +
|
|
175
|
-
(isTray || this.fixtureDetails.fixtureType === "floor"
|
|
176
|
-
? count * rows
|
|
177
|
-
: count));
|
|
214
|
+
// Panel structure (and tray rows) multiply capacity by the number of rows.
|
|
215
|
+
return (total + (isTray || this.isPanelStructure() ? count * rows : count));
|
|
178
216
|
}, 0);
|
|
179
217
|
}
|
|
180
218
|
initWallFixtureForm() {
|
|
@@ -365,13 +403,14 @@ export class CreateFixtureComponent {
|
|
|
365
403
|
}
|
|
366
404
|
mapFormToApi(form, status) {
|
|
367
405
|
const formValue = form.value;
|
|
368
|
-
const formArray = this.
|
|
406
|
+
const formArray = this.isShelfStructure()
|
|
369
407
|
? this.shelfArray
|
|
370
408
|
: this.panelArray;
|
|
371
409
|
return {
|
|
372
410
|
status: status,
|
|
373
411
|
clientId: this.clientId,
|
|
374
412
|
fixtureCategory: this.fixtureDetails.fixtureCategory,
|
|
413
|
+
fixtureSubType: this.fixtureDetails.fixtureSubType,
|
|
375
414
|
fixtureCapacity: this.totalProductCapacity,
|
|
376
415
|
fixtureLength: {
|
|
377
416
|
value: formValue.basicDetails.length,
|
|
@@ -419,7 +458,7 @@ export class CreateFixtureComponent {
|
|
|
419
458
|
return false;
|
|
420
459
|
}
|
|
421
460
|
if (status === "complete") {
|
|
422
|
-
const formArray = this.
|
|
461
|
+
const formArray = this.isShelfStructure()
|
|
423
462
|
? this.shelfArray
|
|
424
463
|
: this.panelArray;
|
|
425
464
|
const missingZone = formArray.controls.some((c) => !c.value.zone);
|
|
@@ -568,12 +607,14 @@ export class CreateFixtureComponent {
|
|
|
568
607
|
this.isEditMode = true;
|
|
569
608
|
this.floorFixtureForm?.enable({ emitEvent: false });
|
|
570
609
|
this.wallFixtureForm?.enable({ emitEvent: false });
|
|
571
|
-
if (
|
|
572
|
-
this.
|
|
573
|
-
|
|
574
|
-
this.
|
|
575
|
-
|
|
576
|
-
this.
|
|
610
|
+
if (this.isShelfStructure()) {
|
|
611
|
+
if (!this.fixtureDetails.header?.isEnabled)
|
|
612
|
+
this.toggleSectionForm("header");
|
|
613
|
+
if (!this.fixtureDetails.footer?.isEnabled)
|
|
614
|
+
this.toggleSectionForm("footer");
|
|
615
|
+
if (!this.fixtureDetails.isBodyEnabled)
|
|
616
|
+
this.toggleSectionForm("body");
|
|
617
|
+
}
|
|
577
618
|
this.router.navigate([], {
|
|
578
619
|
relativeTo: this.route,
|
|
579
620
|
replaceUrl: true,
|
|
@@ -586,7 +627,7 @@ export class CreateFixtureComponent {
|
|
|
586
627
|
this.destroy$.complete();
|
|
587
628
|
}
|
|
588
629
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreateFixtureComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.FormBuilder }, { token: i3.StoreBuilderService }, { token: i4.ToastService }, { token: i1.Router }, { token: i5.NgbModal }, { token: i6.PageInfoService }, { token: i6.GlobalStateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
589
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CreateFixtureComponent, isStandalone: true, selector: "lib-create-fixture", ngImport: i0, template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <h2 class=\"m-0 ellipsis\" style=\"max-width: calc(100vw - 860px)\"\r\n [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\">\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\"\r\n [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div *ngIf=\"!isEditMode\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n <li>\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.width')?.touched &&\r\n wallFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.length')?.touched &&\r\n wallFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n Header height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n At least one shelf is required.\r\n </small>\r\n </div>\r\n\r\n <datalist id=\"wallZoneOptions\">\r\n <option *ngFor=\"let zone of wallZones\" [value]=\"zone.value\"></option>\r\n </datalist>\r\n\r\n <div *ngIf=\"shelfArray?.length\"\r\n class=\"d-flex justify-content-end mb-3\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\"\r\n [disabled]=\"!isEditMode\"\r\n (click)=\"autoAssignWallZones()\">\r\n Auto-zone shelves\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"shelfTypes\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <div class=\"mt-3\">\r\n <label class=\"mb-1\">Zone</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"zone\"\r\n list=\"wallZoneOptions\"\r\n placeholder=\"e.g. Top, Mid, Bottom\" />\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\"\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly'\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly' && shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n Footer height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n class=\"d-flex justify-content-center w-100\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header Preview -->\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n </div>\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex w-100 gap-5 shelfContainer\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='tray'){\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n TRAY {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }@else {\r\n <div class=\"block shelf\" [class.vmonly-placeholder]=\"item.get('type')?.value ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n {{item.get('type')?.value ==='vmonly' ? 'VM ONLY': 'SHELF'}} {{ i + 1 }} <b\r\n class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #emptyFixture>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.width')?.touched &&\r\n floorFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.length')?.touched &&\r\n floorFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addPanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n At least one panel is required.\r\n </small>\r\n </div>\r\n\r\n <datalist id=\"floorZoneOptions\">\r\n <option *ngFor=\"let zone of floorZones\" [value]=\"zone.value\"></option>\r\n </datalist>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(i)\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"\">\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n Panel name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n Panel name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mt-3\">\r\n <label class=\"mb-1\">Zone</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"zone\"\r\n list=\"floorZoneOptions\"\r\n placeholder=\"e.g. All, Top, Mid, Bottom\" />\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n\r\n <div class=\"shelfContainer\">\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\" />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #noPanel>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;max-width:345px;min-width:234px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .shelfContainer .block{border:1px solid #98a2b3;border-top:none}.wall-viewport .body-block .shelfContainer:first-child .block{border-top:1px solid #98a2b3}.wall-viewport .body-block .block{padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .vmonly-placeholder{background-image:repeating-linear-gradient(45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px),repeating-linear-gradient(-45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px)}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.draft{background:#f2f4f7;color:#667085}.indicator.draft path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.allocationPending{background:#fef0c7;color:#f79009}.indicator.allocationPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}.restrict-interaction{-webkit-user-select:none;user-select:none;pointer-events:none}.btn .spinner{height:22px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:4px;stroke:#071437;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport{max-width:590px;width:100%;min-width:480px;align-items:start}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .wall-viewport .header-info{margin-top:0}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:454px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:60px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"], dependencies: [{ kind: "component", type: CounterInputComponent, selector: "counter-input", inputs: ["step", "placeholder", "max"], outputs: ["onIncrement", "onDecrement"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: TimeAgoPipe, name: "timeAgo" }, { kind: "ngmodule", type: NgbAccordionModule }, { kind: "directive", type: i5.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i5.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i5.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i5.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i5.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i5.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
630
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CreateFixtureComponent, isStandalone: true, selector: "lib-create-fixture", ngImport: i0, template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <h2 class=\"m-0 ellipsis\" style=\"max-width: calc(100vw - 860px)\"\r\n [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\">\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\"\r\n [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div *ngIf=\"!isEditMode\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n <li>\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shelf-structured fixture (Wall, or Floor with shelf sub-type) -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"isShelfStructure()\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mt-4\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <label class=\"form-label mb-2\">Sub-type</label>\r\n <div class=\"d-flex gap-4\">\r\n <div class=\"form-check\">\r\n <input type=\"radio\" class=\"form-check-input\" id=\"subTypePanelShelf\" name=\"floorSubType\"\r\n [checked]=\"fixtureDetails.fixtureSubType === 'panel'\"\r\n [disabled]=\"!isEditMode\"\r\n (change)=\"onFloorSubTypeChange('panel')\" />\r\n <label class=\"form-check-label\" for=\"subTypePanelShelf\">Panel</label>\r\n </div>\r\n <div class=\"form-check\">\r\n <input type=\"radio\" class=\"form-check-input\" id=\"subTypeShelfShelf\" name=\"floorSubType\"\r\n [checked]=\"fixtureDetails.fixtureSubType === 'shelf'\"\r\n [disabled]=\"!isEditMode\"\r\n (change)=\"onFloorSubTypeChange('shelf')\" />\r\n <label class=\"form-check-label\" for=\"subTypeShelfShelf\">Shelf</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.width')?.touched &&\r\n wallFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.length')?.touched &&\r\n wallFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n Header height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n At least one shelf is required.\r\n </small>\r\n </div>\r\n\r\n <datalist id=\"wallZoneOptions\">\r\n <option *ngFor=\"let zone of wallZones\" [value]=\"zone.value\"></option>\r\n </datalist>\r\n\r\n <div *ngIf=\"shelfArray?.length\"\r\n class=\"d-flex justify-content-end mb-3\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\"\r\n [disabled]=\"!isEditMode\"\r\n (click)=\"autoAssignWallZones()\">\r\n Auto-zone shelves\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"shelfTypes\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <div class=\"mt-3\">\r\n <label class=\"mb-1\">Zone</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"zone\"\r\n list=\"wallZoneOptions\"\r\n placeholder=\"e.g. Top, Mid, Bottom\" />\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\"\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly'\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly' && shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n Footer height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n class=\"d-flex justify-content-center w-100\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header Preview -->\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n </div>\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex w-100 gap-5 shelfContainer\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='tray'){\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n TRAY {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }@else {\r\n <div class=\"block shelf\" [class.vmonly-placeholder]=\"item.get('type')?.value ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n {{item.get('type')?.value ==='vmonly' ? 'VM ONLY': 'SHELF'}} {{ i + 1 }} <b\r\n class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #emptyFixture>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor panel-structured fixture -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"isPanelStructure()\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mt-4\">\r\n <label class=\"form-label mb-2\">Sub-type</label>\r\n <div class=\"d-flex gap-4\">\r\n <div class=\"form-check\">\r\n <input type=\"radio\" class=\"form-check-input\" id=\"subTypePanelPanel\" name=\"floorSubType\"\r\n [checked]=\"fixtureDetails.fixtureSubType === 'panel'\"\r\n [disabled]=\"!isEditMode\"\r\n (change)=\"onFloorSubTypeChange('panel')\" />\r\n <label class=\"form-check-label\" for=\"subTypePanelPanel\">Panel</label>\r\n </div>\r\n <div class=\"form-check\">\r\n <input type=\"radio\" class=\"form-check-input\" id=\"subTypeShelfPanel\" name=\"floorSubType\"\r\n [checked]=\"fixtureDetails.fixtureSubType === 'shelf'\"\r\n [disabled]=\"!isEditMode\"\r\n (change)=\"onFloorSubTypeChange('shelf')\" />\r\n <label class=\"form-check-label\" for=\"subTypeShelfPanel\">Shelf</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.width')?.touched &&\r\n floorFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.length')?.touched &&\r\n floorFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addPanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n At least one panel is required.\r\n </small>\r\n </div>\r\n\r\n <datalist id=\"floorZoneOptions\">\r\n <option *ngFor=\"let zone of floorZones\" [value]=\"zone.value\"></option>\r\n </datalist>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(i)\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"\">\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n Panel name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n Panel name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mt-3\">\r\n <label class=\"mb-1\">Zone</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"zone\"\r\n list=\"floorZoneOptions\"\r\n placeholder=\"e.g. All, Top, Mid, Bottom\" />\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n\r\n <div class=\"shelfContainer\">\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\" />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #noPanel>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;max-width:345px;min-width:234px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .shelfContainer .block{border:1px solid #98a2b3;border-top:none}.wall-viewport .body-block .shelfContainer:first-child .block{border-top:1px solid #98a2b3}.wall-viewport .body-block .block{padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .vmonly-placeholder{background-image:repeating-linear-gradient(45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px),repeating-linear-gradient(-45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px)}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.draft{background:#f2f4f7;color:#667085}.indicator.draft path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.allocationPending{background:#fef0c7;color:#f79009}.indicator.allocationPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}.restrict-interaction{-webkit-user-select:none;user-select:none;pointer-events:none}.btn .spinner{height:22px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:4px;stroke:#071437;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport{max-width:590px;width:100%;min-width:480px;align-items:start}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .wall-viewport .header-info{margin-top:0}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:454px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:60px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"], dependencies: [{ kind: "component", type: CounterInputComponent, selector: "counter-input", inputs: ["step", "placeholder", "max"], outputs: ["onIncrement", "onDecrement"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: TimeAgoPipe, name: "timeAgo" }, { kind: "ngmodule", type: NgbAccordionModule }, { kind: "directive", type: i5.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i5.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i5.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i5.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i5.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i5.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel", "disabled"], outputs: ["actionClick"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
590
631
|
}
|
|
591
632
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreateFixtureComponent, decorators: [{
|
|
592
633
|
type: Component,
|
|
@@ -600,6 +641,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
600
641
|
NgbAccordionModule,
|
|
601
642
|
ReactiveSelectComponent,
|
|
602
643
|
RouterLink,
|
|
603
|
-
], template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <h2 class=\"m-0 ellipsis\" style=\"max-width: calc(100vw - 860px)\"\r\n [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\">\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\"\r\n [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div *ngIf=\"!isEditMode\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n <li>\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.width')?.touched &&\r\n wallFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.length')?.touched &&\r\n wallFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n Header height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n At least one shelf is required.\r\n </small>\r\n </div>\r\n\r\n <datalist id=\"wallZoneOptions\">\r\n <option *ngFor=\"let zone of wallZones\" [value]=\"zone.value\"></option>\r\n </datalist>\r\n\r\n <div *ngIf=\"shelfArray?.length\"\r\n class=\"d-flex justify-content-end mb-3\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\"\r\n [disabled]=\"!isEditMode\"\r\n (click)=\"autoAssignWallZones()\">\r\n Auto-zone shelves\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"shelfTypes\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <div class=\"mt-3\">\r\n <label class=\"mb-1\">Zone</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"zone\"\r\n list=\"wallZoneOptions\"\r\n placeholder=\"e.g. Top, Mid, Bottom\" />\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\"\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly'\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly' && shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n Footer height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n class=\"d-flex justify-content-center w-100\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header Preview -->\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n </div>\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex w-100 gap-5 shelfContainer\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='tray'){\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n TRAY {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }@else {\r\n <div class=\"block shelf\" [class.vmonly-placeholder]=\"item.get('type')?.value ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n {{item.get('type')?.value ==='vmonly' ? 'VM ONLY': 'SHELF'}} {{ i + 1 }} <b\r\n class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #emptyFixture>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.width')?.touched &&\r\n floorFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.length')?.touched &&\r\n floorFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addPanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n At least one panel is required.\r\n </small>\r\n </div>\r\n\r\n <datalist id=\"floorZoneOptions\">\r\n <option *ngFor=\"let zone of floorZones\" [value]=\"zone.value\"></option>\r\n </datalist>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(i)\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"\">\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n Panel name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n Panel name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mt-3\">\r\n <label class=\"mb-1\">Zone</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"zone\"\r\n list=\"floorZoneOptions\"\r\n placeholder=\"e.g. All, Top, Mid, Bottom\" />\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n\r\n <div class=\"shelfContainer\">\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\" />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #noPanel>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;max-width:345px;min-width:234px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .shelfContainer .block{border:1px solid #98a2b3;border-top:none}.wall-viewport .body-block .shelfContainer:first-child .block{border-top:1px solid #98a2b3}.wall-viewport .body-block .block{padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .vmonly-placeholder{background-image:repeating-linear-gradient(45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px),repeating-linear-gradient(-45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px)}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.draft{background:#f2f4f7;color:#667085}.indicator.draft path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.allocationPending{background:#fef0c7;color:#f79009}.indicator.allocationPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}.restrict-interaction{-webkit-user-select:none;user-select:none;pointer-events:none}.btn .spinner{height:22px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:4px;stroke:#071437;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport{max-width:590px;width:100%;min-width:480px;align-items:start}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .wall-viewport .header-info{margin-top:0}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:454px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:60px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"] }]
|
|
644
|
+
], template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <h2 class=\"m-0 ellipsis\" style=\"max-width: calc(100vw - 860px)\"\r\n [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\">\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\"\r\n [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div *ngIf=\"!isEditMode\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n <li>\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shelf-structured fixture (Wall, or Floor with shelf sub-type) -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"isShelfStructure()\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mt-4\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <label class=\"form-label mb-2\">Sub-type</label>\r\n <div class=\"d-flex gap-4\">\r\n <div class=\"form-check\">\r\n <input type=\"radio\" class=\"form-check-input\" id=\"subTypePanelShelf\" name=\"floorSubType\"\r\n [checked]=\"fixtureDetails.fixtureSubType === 'panel'\"\r\n [disabled]=\"!isEditMode\"\r\n (change)=\"onFloorSubTypeChange('panel')\" />\r\n <label class=\"form-check-label\" for=\"subTypePanelShelf\">Panel</label>\r\n </div>\r\n <div class=\"form-check\">\r\n <input type=\"radio\" class=\"form-check-input\" id=\"subTypeShelfShelf\" name=\"floorSubType\"\r\n [checked]=\"fixtureDetails.fixtureSubType === 'shelf'\"\r\n [disabled]=\"!isEditMode\"\r\n (change)=\"onFloorSubTypeChange('shelf')\" />\r\n <label class=\"form-check-label\" for=\"subTypeShelfShelf\">Shelf</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.width')?.touched &&\r\n wallFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.length')?.touched &&\r\n wallFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n Header height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n At least one shelf is required.\r\n </small>\r\n </div>\r\n\r\n <datalist id=\"wallZoneOptions\">\r\n <option *ngFor=\"let zone of wallZones\" [value]=\"zone.value\"></option>\r\n </datalist>\r\n\r\n <div *ngIf=\"shelfArray?.length\"\r\n class=\"d-flex justify-content-end mb-3\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\"\r\n [disabled]=\"!isEditMode\"\r\n (click)=\"autoAssignWallZones()\">\r\n Auto-zone shelves\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"shelfTypes\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <div class=\"mt-3\">\r\n <label class=\"mb-1\">Zone</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"zone\"\r\n list=\"wallZoneOptions\"\r\n placeholder=\"e.g. Top, Mid, Bottom\" />\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\"\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly'\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly' && shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n Footer height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n class=\"d-flex justify-content-center w-100\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header Preview -->\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n </div>\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex w-100 gap-5 shelfContainer\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='tray'){\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n TRAY {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }@else {\r\n <div class=\"block shelf\" [class.vmonly-placeholder]=\"item.get('type')?.value ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n {{item.get('type')?.value ==='vmonly' ? 'VM ONLY': 'SHELF'}} {{ i + 1 }} <b\r\n class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #emptyFixture>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor panel-structured fixture -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"isPanelStructure()\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mt-4\">\r\n <label class=\"form-label mb-2\">Sub-type</label>\r\n <div class=\"d-flex gap-4\">\r\n <div class=\"form-check\">\r\n <input type=\"radio\" class=\"form-check-input\" id=\"subTypePanelPanel\" name=\"floorSubType\"\r\n [checked]=\"fixtureDetails.fixtureSubType === 'panel'\"\r\n [disabled]=\"!isEditMode\"\r\n (change)=\"onFloorSubTypeChange('panel')\" />\r\n <label class=\"form-check-label\" for=\"subTypePanelPanel\">Panel</label>\r\n </div>\r\n <div class=\"form-check\">\r\n <input type=\"radio\" class=\"form-check-input\" id=\"subTypeShelfPanel\" name=\"floorSubType\"\r\n [checked]=\"fixtureDetails.fixtureSubType === 'shelf'\"\r\n [disabled]=\"!isEditMode\"\r\n (change)=\"onFloorSubTypeChange('shelf')\" />\r\n <label class=\"form-check-label\" for=\"subTypeShelfPanel\">Shelf</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.width')?.touched &&\r\n floorFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.length')?.touched &&\r\n floorFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addPanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n At least one panel is required.\r\n </small>\r\n </div>\r\n\r\n <datalist id=\"floorZoneOptions\">\r\n <option *ngFor=\"let zone of floorZones\" [value]=\"zone.value\"></option>\r\n </datalist>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(i)\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"\">\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n Panel name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n Panel name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mt-3\">\r\n <label class=\"mb-1\">Zone</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"zone\"\r\n list=\"floorZoneOptions\"\r\n placeholder=\"e.g. All, Top, Mid, Bottom\" />\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n\r\n <div class=\"shelfContainer\">\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\" />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #noPanel>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;max-width:345px;min-width:234px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .shelfContainer .block{border:1px solid #98a2b3;border-top:none}.wall-viewport .body-block .shelfContainer:first-child .block{border-top:1px solid #98a2b3}.wall-viewport .body-block .block{padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .vmonly-placeholder{background-image:repeating-linear-gradient(45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px),repeating-linear-gradient(-45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px)}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.draft{background:#f2f4f7;color:#667085}.indicator.draft path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.allocationPending{background:#fef0c7;color:#f79009}.indicator.allocationPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}.restrict-interaction{-webkit-user-select:none;user-select:none;pointer-events:none}.btn .spinner{height:22px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:4px;stroke:#071437;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport{max-width:590px;width:100%;min-width:480px;align-items:start}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .wall-viewport .header-info{margin-top:0}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:454px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:60px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"] }]
|
|
604
645
|
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.FormBuilder }, { type: i3.StoreBuilderService }, { type: i4.ToastService }, { type: i1.Router }, { type: i5.NgbModal }, { type: i6.PageInfoService }, { type: i6.GlobalStateService }] });
|
|
605
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUlMLFVBQVUsRUFDVixXQUFXLEVBQ1gsbUJBQW1CLEdBQ3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsa0JBQWtCLEVBRWxCLFVBQVUsR0FDWCxNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFDTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixjQUFjLEVBQ2QsR0FBRyxFQUNILE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFRZCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUMxRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUVwRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUUzRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFD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O3dCQUNuQixZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsa0JBQWtCO3dCQUNsQix1QkFBdUI7d0JBQ3ZCLFVBQVU7cUJBQ1giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtR3JvdXAsXHJcbiAgRm9ybUFycmF5LFxyXG4gIFZhbGlkYXRvcnMsXHJcbiAgRm9ybXNNb2R1bGUsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciwgUm91dGVyTGluayB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHtcclxuICBOZ2JBY2NvcmRpb25Nb2R1bGUsXHJcbiAgTmdiTW9kYWwsXHJcbiAgTmdiVG9vbHRpcCxcclxufSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IHtcclxuICBkZWJvdW5jZVRpbWUsXHJcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXHJcbiAgZmlsdGVyLFxyXG4gIGZpcnN0VmFsdWVGcm9tLFxyXG4gIG1hcCxcclxuICBTdWJqZWN0LFxyXG4gIHRha2VVbnRpbCxcclxufSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLXNoYXJlZFwiO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZVwiO1xyXG5pbXBvcnQge1xyXG4gIEZpeHR1cmVMaWJyYXJ5RGV0YWlscyxcclxuICBGaXh0dXJlTGlicmFyeVNoZWxmQ29uZmlnLFxyXG59IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL2ZpeHR1cmUtbGlicmFyeS5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25JRiB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL3BsYW5vLWdlbmVyYWwuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IENvbXBsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4uL3BvcHVwcy9jb21wbGV0ZS1jb25maXJtYXRpb24vY29tcGxldGUtY29uZmlybWF0aW9uLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQgfSBmcm9tIFwiLi4vcG9wdXBzL2RlbGV0ZS1jb25maXJtYXRpb24vZGVsZXRlLWNvbmZpcm1hdGlvbi5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRXhpdENvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9wb3B1cHMvZXhpdC1jb25maXJtYXRpb24vZXhpdC1jb25maXJtYXRpb24uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENhbkV4aXRHdWFyZCB9IGZyb20gXCIuLi8uLi9mdW5jdGlvbnMvZXhpdC5ndWFyZFwiO1xyXG5pbXBvcnQgeyBDYW5ub3RQZXJmb3JtQ29tcG9uZW50IH0gZnJvbSBcIi4uL3BvcHVwcy9jYW5ub3QtcGVyZm9ybS9jYW5ub3QtcGVyZm9ybS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlLCBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLWdsb2JhbFwiO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7IFRpbWVBZ29QaXBlIH0gZnJvbSBcIi4uLy4uL3BpcGVzL3RpbWUtYWdvLnBpcGVcIjtcclxuaW1wb3J0IHsgQ291bnRlcklucHV0Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NvdW50ZXItaW5wdXQvY291bnRlci1pbnB1dC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQgfSBmcm9tIFwiLi4vcmVhY3RpdmUtc2VsZWN0L3JlYWN0aXZlLXNlbGVjdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgZ2VuZXJhbFZhbGlkYXRvciB9IGZyb20gXCIuLi8uLi9mdW5jdGlvbnMvcGxhbm8uZnVuY3Rpb25cIjtcclxuaW1wb3J0IHsgV0FMTF9aT05FUywgRkxPT1JfWk9ORVMgfSBmcm9tIFwiLi4vLi4vZGF0YS9maXh0dXJlLXRlbXBsYXRlLmRhdGFcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImxpYi1jcmVhdGUtZml4dHVyZVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybDogXCIuL2NyZWF0ZS1maXh0dXJlLmNvbXBvbmVudC5zY3NzXCIsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb3VudGVySW5wdXRDb21wb25lbnQsXHJcbiAgICBOZ2JUb29sdGlwLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgVGltZUFnb1BpcGUsXHJcbiAgICBOZ2JBY2NvcmRpb25Nb2R1bGUsXHJcbiAgICBSZWFjdGl2ZVNlbGVjdENvbXBvbmVudCxcclxuICAgIFJvdXRlckxpbmssXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENyZWF0ZUZpeHR1cmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ2FuRXhpdEd1YXJkIHtcclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG5cclxuICB3YWxsRml4dHVyZUZvcm06IEZvcm1Hcm91cDtcclxuICBmbG9vckZpeHR1cmVGb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIGlzUGFnZUxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBmaXh0dXJlRGV0YWlsczogRml4dHVyZUxpYnJhcnlEZXRhaWxzID0ge307XHJcbiAgaXNFZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpc0hlYWRlckVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzRm9vdGVyRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNCb2R5RW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGNhbkdvQmFjazogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICByZWFkb25seSBzaGVsZlR5cGVzOiBEcm9wZG93bklGW10gPSBbXHJcbiAgICB7IGxhYmVsOiBcIlNoZWxmXCIsIHZhbHVlOiBcInNoZWxmXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiVHJheVwiLCB2YWx1ZTogXCJ0cmF5XCIgfSxcclxuICAgIHsgbGFiZWw6IFwiVk0gT25seVwiLCB2YWx1ZTogXCJ2bW9ubHlcIiB9LFxyXG4gIF07XHJcblxyXG4gIHJlYWRvbmx5IHdhbGxab25lczogRHJvcGRvd25JRltdID0gV0FMTF9aT05FUztcclxuICByZWFkb25seSBmbG9vclpvbmVzOiBEcm9wZG93bklGW10gPSBGTE9PUl9aT05FUztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgc3RvcmVCdWlsZGVyU2VydmljZTogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIG5nYk1vZGFsOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgcGFnZUluZm86IFBhZ2VJbmZvU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zZXRQYWdlRGF0YSgpO1xyXG4gICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM7XHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLl9pZCA9IHBhcmFtc1tcImZpeHR1cmVJZFwiXSA/PyBcIlwiO1xyXG5cclxuICAgIHRoaXMuaXNFZGl0TW9kZSA9IHBhcmFtc1tcImlzRWRpdFwiXSA9PSBcInRydWVcIjtcclxuXHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuX2lkKSB7XHJcbiAgICAgIHRoaXMuY2FuR29CYWNrID0gdHJ1ZTtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL21hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlc1wiXSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdldENsaWVudElkKCk7XHJcblxyXG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHBhcmFtcykgPT4gcGFyYW1zW1wiZml4dHVyZUlkXCJdKSxcclxuICAgICAgICBmaWx0ZXIoKGlkKSA9PiAhIWlkKSxcclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jIChpZCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5nZXRGaXh0dXJlTGlicmFyeURldGFpbHMoaWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgbGV0IGRldGFpbHMgPSByZXMuZGF0YTtcclxuICAgICAgICAgICAgaWYgKGRldGFpbHMpIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzID0ge1xyXG4gICAgICAgICAgICAgICAgLi4uZGV0YWlscyxcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm0oKTtcclxuICAgICAgICAgICAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLmNhbkdvQmFjayA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgICAgICAgIGVycj8uZXJyb3I/LmVycm9yID8/IFwiRmFpbGVkIHRvIGZldGNoIGZpeHR1cmUgZGV0YWlsc1wiLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy8gdGhpcy5pc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKFwiQ3JlYXRlIEZpeHR1cmVcIik7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldEJyZWFkY3J1bWJzKFtcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlBsYW5vZ3JhbVwiLFxyXG4gICAgICAgIHBhdGg6IFwiL21hbmFnZS9wbGFub2dyYW0vbWFuYWdlLXBsYW5vZ3JhbXNcIixcclxuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgaXNTZXBhcmF0b3I6IGZhbHNlLFxyXG4gICAgICB9LFxyXG4gICAgICB7IHRpdGxlOiBcIlwiLCBwYXRoOiBcIlwiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogXCJMaWJyYXJ5XCIsXHJcbiAgICAgICAgcGF0aDogXCIvbWFuYWdlL3BsYW5vZ3JhbS9saWJyYXJ5L2ZpeHR1cmVzXCIsXHJcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGlzU2VwYXJhdG9yOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAgeyB0aXRsZTogXCJcIiwgcGF0aDogXCJcIiwgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogdHJ1ZSB9LFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBnZXRDbGllbnRJZCgpIHtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLCAvLyBTdWJzY3JpcHRpb24gd2lsbCBiZSBjYW5jZWxsZWQgb24gY29tcG9uZW50IGRlc3Ryb3kuXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDIwMCksIC8vIFRvIGF2b2lkIGltbWVkaWF0ZSBmcmVxdWVudCBjYWxscy5cclxuICAgICAgICBmaWx0ZXIoKGRhdGEpID0+ICEhZGF0YSksIC8vIEZpbHRlcmluZyBudWxsL3VuZGVmaW5lZC5cclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCAvLyBFbWl0dGluZyBvbmx5IGRpZmZlcmVudCB2YWx1ZXMuIChJZ25vcmVzIHNhbWUgY2xpZW50SWQpLlxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhPy5jbGllbnQpIHtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBoZWFkZXJEYXRhID0gSlNPTi5wYXJzZShcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGhlYWRlckRhdGE/LmNsaWVudDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZUZvcm0oKSB7XHJcbiAgICBpZiAodGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgdGhpcy5pbml0V2FsbEZpeHR1cmVGb3JtKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmluaXRGbG9vclBhbmVsRml4dHVyZUZvcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlKSB7XHJcbiAgICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5oZWFkZXI/LmlzRW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uKFwiaGVhZGVyXCIpO1xyXG4gICAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuZm9vdGVyPy5pc0VuYWJsZWQpIHRoaXMudG9nZ2xlU2VjdGlvbihcImZvb3RlclwiKTtcclxuICAgICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLmlzQm9keUVuYWJsZWQpIHRoaXMudG9nZ2xlU2VjdGlvbihcImJvZHlcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLndhbGxGaXh0dXJlRm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblxyXG4gICAgICB0aGlzLmlzSGVhZGVyRW5hYmxlZCA9IHRoaXMuZml4dHVyZURldGFpbHMuaGVhZGVyPy5pc0VuYWJsZWQgPz8gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNCb2R5RW5hYmxlZCA9IHRoaXMuZml4dHVyZURldGFpbHMuaXNCb2R5RW5hYmxlZCA/PyBmYWxzZTtcclxuICAgICAgdGhpcy5pc0Zvb3RlckVuYWJsZWQgPSB0aGlzLmZpeHR1cmVEZXRhaWxzLmZvb3Rlcj8uaXNFbmFibGVkID8/IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybSgpIHtcclxuICAgIHJldHVybiB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSBcIndhbGxcIlxyXG4gICAgICA/IHRoaXMud2FsbEZpeHR1cmVGb3JtXHJcbiAgICAgIDogdGhpcy5mbG9vckZpeHR1cmVGb3JtO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNoZWxmQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLndhbGxGaXh0dXJlRm9ybS5nZXQoXCJib2R5LnNoZWxmXCIpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldCBwYW5lbEFycmF5KCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5mbG9vckZpeHR1cmVGb3JtLmdldChcInBhbmVsXCIpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldCB0b3RhbFByb2R1Y3RDYXBhY2l0eSgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgZm9ybUFycmF5ID1cclxuICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCJcclxuICAgICAgICA/IHRoaXMuc2hlbGZBcnJheVxyXG4gICAgICAgIDogdGhpcy5wYW5lbEFycmF5O1xyXG5cclxuICAgIHJldHVybiBmb3JtQXJyYXkuY29udHJvbHMucmVkdWNlKCh0b3RhbCwgaXRlbSkgPT4ge1xyXG4gICAgICBjb25zdCBjb3VudCA9IGl0ZW0uZ2V0KFwicHJvZHVjdENhcGFjaXR5XCIpPy52YWx1ZSB8fCAwO1xyXG4gICAgICBjb25zdCBpc1RyYXkgPSBpdGVtLmdldChcInR5cGVcIik/LnZhbHVlID09PSBcInRyYXlcIjtcclxuICAgICAgY29uc3Qgcm93cyA9IGl0ZW0uZ2V0KFwibm9PZlJvd3NcIik/LnZhbHVlIHx8IDE7XHJcblxyXG4gICAgICAvLyBJZiB0aGUgZml4dHVyZSBpcyBhIGZsb29yIHBhbmVsIG9yIHRyYXksIHdlIG5lZWQgdG8gbXVsdGlwbHkgdGhlIHByb2R1Y3QgY2FwYWNpdHkgYnkgdGhlIG51bWJlciBvZiByb3dzXHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgdG90YWwgK1xyXG4gICAgICAgIChpc1RyYXkgfHwgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gXCJmbG9vclwiXHJcbiAgICAgICAgICA/IGNvdW50ICogcm93c1xyXG4gICAgICAgICAgOiBjb3VudClcclxuICAgICAgKTtcclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgaW5pdFdhbGxGaXh0dXJlRm9ybSgpIHtcclxuICAgIHRoaXMud2FsbEZpeHR1cmVGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGJhc2ljRGV0YWlsczogdGhpcy5nZXRCYXNpY0RldGFpbHNGb3JtR3JvdXAoKSxcclxuICAgICAgaGVhZGVyOiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICBoZWlnaHQ6IFt0aGlzLmZpeHR1cmVEZXRhaWxzPy5oZWFkZXI/LmhlaWdodD8udmFsdWUgPz8gMzAwXSxcclxuICAgICAgfSksXHJcbiAgICAgIGJvZHk6IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIHNoZWxmOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgfSksXHJcbiAgICAgIGZvb3RlcjogdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgaGVpZ2h0OiBbdGhpcy5maXh0dXJlRGV0YWlscz8uZm9vdGVyPy5oZWlnaHQ/LnZhbHVlID8/IDMwMF0sXHJcbiAgICAgIH0pLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5maXh0dXJlRGV0YWlscy5zaGVsZkNvbmZpZz8uZm9yRWFjaCgocykgPT4gdGhpcy5hZGRTaGVsZihzKSk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnNoZWxmQ29uZmlnPy5sZW5ndGggPT09IDAgJiZcclxuICAgICAgIXRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5XHJcbiAgICApIHtcclxuICAgICAgdGhpcy5hZGRTaGVsZigpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMud2FsbEZpeHR1cmVGb3JtXHJcbiAgICAgIC5nZXQoXCJiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5XCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeSA9IHZhbHVlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLndhbGxGaXh0dXJlRm9ybVxyXG4gICAgICAuZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGgpIHtcclxuICAgICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGluaXRGbG9vclBhbmVsRml4dHVyZUZvcm0oKSB7XHJcbiAgICB0aGlzLmZsb29yRml4dHVyZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgYmFzaWNEZXRhaWxzOiB0aGlzLmdldEJhc2ljRGV0YWlsc0Zvcm1Hcm91cCgpLFxyXG4gICAgICBwYW5lbDogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnNoZWxmQ29uZmlnPy5mb3JFYWNoKChzKSA9PiB0aGlzLmFkZFBhbmVsKHMpKTtcclxuXHJcbiAgICB0aGlzLmZsb29yRml4dHVyZUZvcm1cclxuICAgICAgLmdldChcImJhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnlcIilcclxuICAgICAgPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ID0gdmFsdWU7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybVxyXG4gICAgICAuZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGgpIHtcclxuICAgICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEJhc2ljRGV0YWlsc0Zvcm1Hcm91cCgpIHtcclxuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgZml4dHVyZUNhdGVnb3J5OiBbXHJcbiAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscz8uZml4dHVyZUNhdGVnb3J5IHx8IFwiVW50aXRsZWRcIixcclxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgZ2VuZXJhbFZhbGlkYXRvcigpXSxcclxuICAgICAgXSxcclxuICAgICAgd2lkdGg6IFtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzPy5maXh0dXJlV2lkdGg/LnZhbHVlID8/IDYsXHJcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDAuNSldLFxyXG4gICAgICBdLFxyXG4gICAgICBsZW5ndGg6IFtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy52YWx1ZSA/PyAxMixcclxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMC41KV0sXHJcbiAgICAgIF0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFkZFNoZWxmKHNoZWxmPzogYW55KSB7XHJcbiAgICBjb25zdCBzaGVsZkdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHR5cGU6IFtzaGVsZj8uc2hlbGZUeXBlID8/IFwic2hlbGZcIl0sXHJcbiAgICAgIHByb2R1Y3RDYXBhY2l0eTogW3NoZWxmPy5wcm9kdWN0UGVyU2hlbGYgPz8gNl0sXHJcbiAgICAgIG5vT2ZSb3dzOiBbc2hlbGY/LnRyYXlSb3dzID8/IDFdLFxyXG4gICAgICB6b25lOiBbc2hlbGY/LnpvbmUgPz8gbnVsbF0sXHJcbiAgICB9KTtcclxuICAgIHRoaXMudXBkYXRlUHJvZHVjdFBlclNoZWxmTWluVmFsaWRhdG9yKFxyXG4gICAgICBzaGVsZkdyb3VwLFxyXG4gICAgICBzaGVsZkdyb3VwLmdldChcInR5cGVcIik/LnZhbHVlLFxyXG4gICAgKTtcclxuICAgIHRoaXMuc2V0dXBTaGVsZlR5cGVMaXN0ZW5lcihzaGVsZkdyb3VwKTtcclxuICAgIHRoaXMuc2hlbGZBcnJheS5wdXNoKHNoZWxmR3JvdXApO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUHJvZHVjdFBlclNoZWxmTWluVmFsaWRhdG9yKHNoZWxmR3JvdXA6IEZvcm1Hcm91cCwgc2hlbGZUeXBlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHByb2R1Y3RQZXJTaGVsZkNvbnRyb2wgPSBzaGVsZkdyb3VwLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKTtcclxuICAgIGNvbnN0IG1pblZhbHVlID0gc2hlbGZUeXBlID09PSBcInZtb25seVwiID8gMCA6IDE7XHJcblxyXG4gICAgcHJvZHVjdFBlclNoZWxmQ29udHJvbD8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5taW4obWluVmFsdWUpXSk7XHJcbiAgICBwcm9kdWN0UGVyU2hlbGZDb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIC8vICB3ZSBuZWVkIHRvIHNldHVwIGEgbGlzdGVuZXIgdG8gdGhlIHR5cGUgb2YgdGhlIHNoZWxmIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBub09mUm93cyBmaWVsZFxyXG4gIHNldHVwU2hlbGZUeXBlTGlzdGVuZXIoc2hlbGZHcm91cDogRm9ybUdyb3VwKSB7XHJcbiAgICBsZXQgcHJldmlvdXNUeXBlID0gc2hlbGZHcm91cC5nZXQoXCJ0eXBlXCIpPy52YWx1ZTtcclxuICAgIHNoZWxmR3JvdXAuZ2V0KFwidHlwZVwiKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodHlwZSkgPT4ge1xyXG4gICAgICBjb25zdCBwcm9kdWN0UGVyU2hlbGZDb250cm9sID0gc2hlbGZHcm91cC5nZXQoXCJwcm9kdWN0Q2FwYWNpdHlcIik7XHJcbiAgICAgIGlmICh0eXBlID09PSBcInZtb25seVwiKSB7XHJcbiAgICAgICAgcHJvZHVjdFBlclNoZWxmQ29udHJvbD8uc2V0VmFsdWUoMCk7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNUeXBlID09PSBcInZtb25seVwiKSB7XHJcbiAgICAgICAgcHJvZHVjdFBlclNoZWxmQ29udHJvbD8uc2V0VmFsdWUoMSk7XHJcbiAgICAgIH1cclxuICAgICAgcHJldmlvdXNUeXBlID0gdHlwZTtcclxuXHJcbiAgICAgIHRoaXMudXBkYXRlUHJvZHVjdFBlclNoZWxmTWluVmFsaWRhdG9yKHNoZWxmR3JvdXAsIHR5cGUpO1xyXG4gICAgICBjb25zdCBub09mUm93c0NvbnRyb2wgPSBzaGVsZkdyb3VwLmdldChcIm5vT2ZSb3dzXCIpO1xyXG4gICAgICBpZiAodHlwZSA9PT0gXCJ0cmF5XCIpIHtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LnNldFZhbGlkYXRvcnMoW1xyXG4gICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgIFZhbGlkYXRvcnMubWluKDEpLFxyXG4gICAgICAgIF0pO1xyXG4gICAgICAgIG5vT2ZSb3dzQ29udHJvbD8uc2V0VmFsdWUoMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbm9PZlJvd3NDb250cm9sPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIG5vT2ZSb3dzQ29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBJZiBpbmRleCBpcyBub3QgZ2l2ZW4sIGxhc3Qgc2hlbGYgc2hvdWxkIGJlIHJlbW92ZWRcclxuICByZW1vdmVTaGVsZihpbmRleDogbnVtYmVyID0gdGhpcy5zaGVsZkFycmF5LmNvbnRyb2xzLmxlbmd0aCAtIDEpIHtcclxuICAgIGlmICh0aGlzLnNoZWxmQXJyYXkuY29udHJvbHMubGVuZ3RoID09IDEpIHJldHVybjtcclxuICAgIHRoaXMuc2hlbGZBcnJheS5yZW1vdmVBdChpbmRleCk7XHJcbiAgfVxyXG5cclxuICBhZGRQYW5lbChwYW5lbD86IEZpeHR1cmVMaWJyYXJ5U2hlbGZDb25maWcpIHtcclxuICAgIGNvbnN0IHBhbmVsR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcGFuZWxOYW1lOiBbcGFuZWw/LmxhYmVsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgZ2VuZXJhbFZhbGlkYXRvcigpXV0sXHJcbiAgICAgIHByb2R1Y3RDYXBhY2l0eTogW1xyXG4gICAgICAgIHBhbmVsPy5wcm9kdWN0UGVyU2hlbGYgPz8gNixcclxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMCldLFxyXG4gICAgICBdLFxyXG4gICAgICBub09mUm93czogW1xyXG4gICAgICAgIHBhbmVsPy50cmF5Um93cyA/PyA1LFxyXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxKV0sXHJcbiAgICAgIF0sXHJcbiAgICAgIHpvbmU6IFsocGFuZWwgYXMgYW55KT8uem9uZSA/PyBcIkFsbFwiXSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucGFuZWxBcnJheS5wdXNoKHBhbmVsR3JvdXApO1xyXG4gIH1cclxuXHJcbiAgYXV0b0Fzc2lnbldhbGxab25lcygpIHtcclxuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSByZXR1cm47XHJcbiAgICBjb25zdCBzaGVsZkNvdW50ID0gdGhpcy5zaGVsZkFycmF5LmNvbnRyb2xzLmxlbmd0aDtcclxuICAgIGlmIChzaGVsZkNvdW50ID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgc2hlbHZlc1BlclpvbmUgPSBNYXRoLmZsb29yKHNoZWxmQ291bnQgLyAzKTtcclxuICAgIGNvbnN0IHJlbWFpbmRlciA9IHNoZWxmQ291bnQgJSAzO1xyXG4gICAgY29uc3QgdG9wQ291bnQgPSBzaGVsdmVzUGVyWm9uZSArIChyZW1haW5kZXIgPj0gMSA/IDEgOiAwKTtcclxuICAgIGNvbnN0IG1pZENvdW50ID0gc2hlbHZlc1BlclpvbmUgKyAocmVtYWluZGVyID49IDIgPyAxIDogMCk7XHJcblxyXG4gICAgdGhpcy5zaGVsZkFycmF5LmNvbnRyb2xzLmZvckVhY2goKHNoZWxmLCBpbmRleCkgPT4ge1xyXG4gICAgICBsZXQgem9uZTogc3RyaW5nO1xyXG4gICAgICBpZiAoaW5kZXggPCB0b3BDb3VudCkgem9uZSA9IFwiVG9wXCI7XHJcbiAgICAgIGVsc2UgaWYgKGluZGV4IDwgdG9wQ291bnQgKyBtaWRDb3VudCkgem9uZSA9IFwiTWlkXCI7XHJcbiAgICAgIGVsc2Ugem9uZSA9IFwiQm90dG9tXCI7XHJcbiAgICAgIHNoZWxmLmdldChcInpvbmVcIik/LnNldFZhbHVlKHpvbmUpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLndhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gSWYgaW5kZXggaXMgbm90IGdpdmVuLCBsYXN0IHBhbmVsIHNob3VsZCBiZSByZW1vdmVkXHJcbiAgcmVtb3ZlUGFuZWwoaW5kZXg6IG51bWJlciA9IHRoaXMucGFuZWxBcnJheS5jb250cm9scy5sZW5ndGggLSAxKSB7XHJcbiAgICBpZiAodGhpcy5wYW5lbEFycmF5LmNvbnRyb2xzLmxlbmd0aCA9PSAxKSByZXR1cm47XHJcbiAgICB0aGlzLnBhbmVsQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VjdGlvbihzZWN0aW9uOiBcImhlYWRlclwiIHwgXCJib2R5XCIgfCBcImZvb3RlclwiKSB7XHJcbiAgICB0aGlzLnRvZ2dsZVNlY3Rpb25Gb3JtKHNlY3Rpb24pO1xyXG4gICAgdGhpcy50b2dnbGVTZWN0aW9uQ2hlY2tCb3goc2VjdGlvbik7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWN0aW9uRm9ybShzZWN0aW9uOiBcImhlYWRlclwiIHwgXCJib2R5XCIgfCBcImZvb3RlclwiKSB7XHJcbiAgICBjb25zdCBmb3JtID0gdGhpcy5nZXRGb3JtKCk7XHJcbiAgICBjb25zdCBncm91cCA9IGZvcm0uZ2V0KHNlY3Rpb24pO1xyXG4gICAgaWYgKGdyb3VwKSB7XHJcbiAgICAgIGdyb3VwLmVuYWJsZWRcclxuICAgICAgICA/IGdyb3VwLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pXHJcbiAgICAgICAgOiBncm91cC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VjdGlvbkNoZWNrQm94KHNlY3Rpb246IFwiaGVhZGVyXCIgfCBcImJvZHlcIiB8IFwiZm9vdGVyXCIpIHtcclxuICAgIHN3aXRjaCAoc2VjdGlvbikge1xyXG4gICAgICBjYXNlIFwiaGVhZGVyXCI6XHJcbiAgICAgICAgdGhpcy5pc0hlYWRlckVuYWJsZWQgPSAhdGhpcy5pc0hlYWRlckVuYWJsZWQ7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJib2R5XCI6XHJcbiAgICAgICAgdGhpcy5pc0JvZHlFbmFibGVkID0gIXRoaXMuaXNCb2R5RW5hYmxlZDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImZvb3RlclwiOlxyXG4gICAgICAgIHRoaXMuaXNGb290ZXJFbmFibGVkID0gIXRoaXMuaXNGb290ZXJFbmFibGVkO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbWFwRm9ybVRvQXBpKGZvcm06IEZvcm1Hcm91cCwgc3RhdHVzOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgY29uc3QgZm9ybVZhbHVlID0gZm9ybS52YWx1ZTtcclxuICAgIGNvbnN0IGZvcm1BcnJheSA9XHJcbiAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09IFwid2FsbFwiXHJcbiAgICAgICAgPyB0aGlzLnNoZWxmQXJyYXlcclxuICAgICAgICA6IHRoaXMucGFuZWxBcnJheTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgIGZpeHR1cmVDYXRlZ29yeTogdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnksXHJcbiAgICAgIGZpeHR1cmVDYXBhY2l0eTogdGhpcy50b3RhbFByb2R1Y3RDYXBhY2l0eSxcclxuICAgICAgZml4dHVyZUxlbmd0aDoge1xyXG4gICAgICAgIHZhbHVlOiBmb3JtVmFsdWUuYmFzaWNEZXRhaWxzLmxlbmd0aCxcclxuICAgICAgICB1bml0OiBcImZ0XCIsXHJcbiAgICAgIH0sXHJcbiAgICAgIGZpeHR1cmVXaWR0aDoge1xyXG4gICAgICAgIHZhbHVlOiBmb3JtVmFsdWUuYmFzaWNEZXRhaWxzLndpZHRoLFxyXG4gICAgICAgIHVuaXQ6IFwiZnRcIixcclxuICAgICAgfSxcclxuICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgaGVpZ2h0OiB7XHJcbiAgICAgICAgICB2YWx1ZTogZm9ybS5nZXQoXCJoZWFkZXIuaGVpZ2h0XCIpPy52YWx1ZSxcclxuICAgICAgICAgIHVuaXQ6IFwibW1cIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIGxhYmVsOiBcIlwiLFxyXG4gICAgICAgIGlzRW5hYmxlZDogIWZvcm0uZ2V0KFwiaGVhZGVyXCIpPy5kaXNhYmxlZCxcclxuICAgICAgfSxcclxuICAgICAgZm9vdGVyOiB7XHJcbiAgICAgICAgaGVpZ2h0OiB7XHJcbiAgICAgICAgICB2YWx1ZTogZm9ybS5nZXQoXCJmb290ZXIuaGVpZ2h0XCIpPy52YWx1ZSxcclxuICAgICAgICAgIHVuaXQ6IFwibW1cIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIGxhYmVsOiBcIlwiLFxyXG4gICAgICAgIGlzRW5hYmxlZDogIWZvcm0uZ2V0KFwiZm9vdGVyXCIpPy5kaXNhYmxlZCxcclxuICAgICAgfSxcclxuICAgICAgaXNCb2R5RW5hYmxlZDogIWZvcm0uZ2V0KFwiYm9keVwiKT8uZGlzYWJsZWQsXHJcbiAgICAgIHNoZWxmQ29uZmlnOiBmb3JtQXJyYXkuY29udHJvbHMubWFwKChlLCBpKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHNoZWxmTnVtYmVyOiBpICsgMSxcclxuICAgICAgICAgIHNoZWxmVHlwZTogZT8udmFsdWU/LnR5cGUgPz8gXCJ0cmF5XCIsXHJcbiAgICAgICAgICBwcm9kdWN0UGVyU2hlbGY6IGUudmFsdWUucHJvZHVjdENhcGFjaXR5LFxyXG4gICAgICAgICAgdHJheVJvd3M6IGU/LnZhbHVlPy5ub09mUm93cyA/PyAxLFxyXG4gICAgICAgICAgbGFiZWw6IGU/LnZhbHVlPy5wYW5lbE5hbWUgPz8gXCJcIixcclxuICAgICAgICAgIHpvbmU6IGU/LnZhbHVlPy56b25lID8/IG51bGwsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TdWJtaXQoc3RhdHVzOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmdldEZvcm0oKTtcclxuXHJcbiAgICAgIGlmIChmb3JtLmludmFsaWQpIHtcclxuICAgICAgICBmb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXCJGb3JtIGlzIGludmFsaWRcIik7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc3RhdHVzID09PSBcImNvbXBsZXRlXCIpIHtcclxuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPVxyXG4gICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCJcclxuICAgICAgICAgICAgPyB0aGlzLnNoZWxmQXJyYXlcclxuICAgICAgICAgICAgOiB0aGlzLnBhbmVsQXJyYXk7XHJcbiAgICAgICAgY29uc3QgbWlzc2luZ1pvbmUgPSBmb3JtQXJyYXkuY29udHJvbHMuc29tZSgoYykgPT4gIWMudmFsdWUuem9uZSk7XHJcbiAgICAgICAgaWYgKG1pc3Npbmdab25lKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICAgIFwiRWFjaCBzaGVsZiBtdXN0IGhhdmUgYSB6b25lIGJlZm9yZSBjb21wbGV0aW5nLlwiLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuY29uZmlybUNvbXBsZXRpb24oKSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgdHJhbnNmb3JtZWREYXRhID0gdGhpcy5tYXBGb3JtVG9BcGkoZm9ybSwgc3RhdHVzKTtcclxuXHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVMaWJyYXJ5KFxyXG4gICAgICAgICAgdHJhbnNmb3JtZWREYXRhLFxyXG4gICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscz8uX2lkISxcclxuICAgICAgICApLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHJlcyAmJiByZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnN0YXR1cyA9IHN0YXR1cztcclxuICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChyZXMubWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5jYW5Hb0JhY2sgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIm1hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlc1wiXSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChcclxuICAgICAgICBlcnI/LmVycm9yPy5lcnJvciA/PyBcIkZhaWxlZCB0byBzYXZlIEZpeHR1cmUgZGV0YWlsc1wiLFxyXG4gICAgICApO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gdXBkYXRlRml4dHVyZUxpYnJhcnkgZXJyOlwiLCBlcnIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVMaWJyYXJ5KHRyYW5zZm9ybWVkRGF0YSwgdGhpcy5maXh0dXJlRGV0YWlscz8uX2lkISkuc3Vic2NyaWJlKHtcclxuICAgIC8vICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAvLyAgICAgaWYgKHJlcz8uc3RhdHVzID09PSAnc3VjY2VzcycpIHtcclxuICAgIC8vICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgLy8gICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLm1lc3NhZ2UpO1xyXG4gICAgLy8gICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydtYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXMnXSk7XHJcbiAgICAvLyAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAvLyAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yID8/IFwiRmFpbGVkIHRvIHNhdmUgRml4dHVyZSBkZXRhaWxzXCIpO1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwiQEAgfiB1cGRhdGVGaXh0dXJlTGlicmFyeSBlcnI6XCIsIGVycik7XHJcbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FuRGVhY3RpdmF0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh0aGlzLmNhbkdvQmFjaykgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Rm9ybSgpO1xyXG5cclxuICAgIGlmIChmb3JtLmRpcnR5KSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybUV4aXQoKTtcclxuXHJcbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vblN1Ym1pdChcImRyYWZ0XCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1FeGl0KCk6IFByb21pc2U8Ym9vbGVhbiB8IG51bGw+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKEV4aXRDb25maXJtYXRpb25Db21wb25lbnQsIHtcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09IFwib2tcIik7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1Db21wbGV0aW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQ29tcGxldGVDb25maXJtYXRpb25Db21wb25lbnQsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gXCJDb21wbGV0ZSBmaXh0dXJlXCI7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9XHJcbiAgICAgIFwiRml4dHVyZSBpcyBub3cgcmVhZHkgYW5kIGF2YWlsYWJsZSB0byBjcmVhdGUgYXMgdGVtcGxhdGUuXCI7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5ub3RlID1cclxuICAgICAgXCJZb3UgY2FuJ3QgZWRpdCBpdCBvbmNlIGFzc2lnbmVkIHRvIHRoZSB0ZW1wbGF0ZS5cIjtcclxuXHJcbiAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSBcIm9rXCIpO1xyXG4gIH1cclxuXHJcbiAgb25EdXBsaWNhdGUoKSB7XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2VcclxuICAgICAgLmR1cGxpY2F0ZUZpeHR1cmVMaWJyYXJ5KHtcclxuICAgICAgICBmaXh0dXJlSWQ6IHRoaXMuZml4dHVyZURldGFpbHMuX2lkLFxyXG4gICAgICB9KVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLmRhdGEubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FuR29CYWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL21hbmFnZS9wbGFub2dyYW0vY3JlYXRlLWxpYnJhcnktZml4dHVyZVwiXSwge1xyXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IGZpeHR1cmVJZDogcmVzPy5kYXRhPy5pZCB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICAgIGVycj8uZXJyb3I/LmVycm9yIHx8IFwiRmFpbGVkIHRvIGR1cGxpY2F0ZSBGaXh0dXJlXCIsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJAQCB+IGR1cGxpY2F0ZUZpeHR1cmVMaWJyYXJ5IGVycjpcIiwgZXJyKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1EZWxldGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSBcIkRlbGV0ZSBmaXh0dXJlXCI7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9XHJcbiAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGZpeHR1cmUgP1wiO1xyXG5cclxuICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09IFwib2tcIik7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkRlbGV0ZSgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLnRlbXBsYXRlSWQpIHtcclxuICAgICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQ2Fubm90UGVyZm9ybUNvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9KTtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSBgQ2Fu4oCZdCBkZWxldGUgZml4dHVyZSFgO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9IGBTaW5jZSB0aGlzIGZpeHR1cmUgaXMgbGl2ZSBpbiBcIiR7dGhpcy5maXh0dXJlRGV0YWlscy50ZW1wbGF0ZUlkfSB0ZW1wbGF0ZXMsXCIgZGVsZXRpbmcgaXMgbm90IGFsbG93ZWQuYDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghKGF3YWl0IHRoaXMuY29uZmlybURlbGV0aW9uKCkpKSByZXR1cm47XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2VcclxuICAgICAgLmRlbGV0ZUZpeHR1cmVMaWJyYXJ5KHsgZml4dHVyZUlkOiB0aGlzLmZpeHR1cmVEZXRhaWxzLl9pZCB9KVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLmNhbkdvQmFjayA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIm1hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlc1wiXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgICAgICBlcnI/LmVycm9yPy5lcnJvciB8fCBcIkZhaWxlZCB0byBkZWxldGUgRml4dHVyZVwiLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBkZWxldGVGaXh0dXJlTGlicmFyeSBlcnI6XCIsIGVycik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrRWRpdCgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLnRlbXBsYXRlSWQpIHtcclxuICAgICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQ2Fubm90UGVyZm9ybUNvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9KTtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSBgQ2Fu4oCZdCBlZGl0IGZpeHR1cmUhYDtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGVzY3JpcHRpb24gPSBgU2luY2UgdGhpcyBmaXh0dXJlIGlzIGxpdmUgaW4gXCIke3RoaXMuZml4dHVyZURldGFpbHMudGVtcGxhdGVJZH0gdGVtcGxhdGVzLFwiIGVkaXRpbmcgaXMgbm90IGFsbG93ZWQuYDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNFZGl0TW9kZSA9IHRydWU7XHJcbiAgICB0aGlzLmZsb29yRml4dHVyZUZvcm0/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLndhbGxGaXh0dXJlRm9ybT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuaGVhZGVyPy5pc0VuYWJsZWQpXHJcbiAgICAgIHRoaXMudG9nZ2xlU2VjdGlvbkZvcm0oXCJoZWFkZXJcIik7XHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuZm9vdGVyPy5pc0VuYWJsZWQpXHJcbiAgICAgIHRoaXMudG9nZ2xlU2VjdGlvbkZvcm0oXCJmb290ZXJcIik7XHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuaXNCb2R5RW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uRm9ybShcImJvZHlcIik7XHJcblxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcclxuICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcclxuICAgICAgcXVlcnlQYXJhbXM6IHsgaXNFZGl0OiB0cnVlIH0sXHJcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIixcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPHNlY3Rpb24gaWQ9XCJidWlsZC1maXh0dXJlXCIgKm5nSWY9XCIhaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDwhLS0gSGVhZGVyIHNlY3Rpb24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50cy1jZW50ZXIgZ2FwLTVcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgcC0zXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXNcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuODMzNCA5Ljk5OTg0SDQuMTY2NzVNNC4xNjY3NSA5Ljk5OTg0TDEwLjAwMDEgMTUuODMzMk00LjE2Njc1IDkuOTk5ODRMMTAuMDAwMSA0LjE2NjVcIlxyXG4gICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8aDIgY2xhc3M9XCJtLTAgZWxsaXBzaXNcIiBzdHlsZT1cIm1heC13aWR0aDogY2FsYygxMDB2dyAtIDg2MHB4KVwiXHJcbiAgICAgICAgW25nYlRvb2x0aXBdPVwiZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ICsgJyAtICcgKyBmaXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGg/LnZhbHVlICsgJ2Z0J1wiPlxyXG4gICAgICAgIHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeSB9fSAtIHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udmFsdWUgfX1cclxuICAgICAgICB7eyBmaXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGg/LnVuaXQgfHwgXCJmdFwiIH19XHJcbiAgICAgIDwvaDI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZSBkcmFmdFwiPnt7IGZpeHR1cmVEZXRhaWxzLnN0YXR1cyB8IHRpdGxlY2FzZSB9fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnRzLWNlbnRlciBnYXAtNVwiPlxyXG4gICAgICA8cCBjbGFzcz1cIm0tMCB0ZXh0LW5vd3JhcFwiICpuZ0lmPVwiZml4dHVyZURldGFpbHM/LnVwZGF0ZWRBdFwiXHJcbiAgICAgICAgW25nYlRvb2x0aXBdPVwiZml4dHVyZURldGFpbHMudXBkYXRlZEF0IHwgZGF0ZSA6ICdtZWRpdW0nXCI+XHJcbiAgICAgICAgTGFzdCB1cGRhdGU6IHt7IGZpeHR1cmVEZXRhaWxzLnVwZGF0ZWRBdCB8IHRpbWVBZ28gfX1cclxuICAgICAgPC9wPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCIgKGNsaWNrKT1cIm9uQ2xpY2tFZGl0KClcIj5cclxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzEzMjJfNTMyNSlcIj5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0xNC4xNjY3IDIuNDk5OTNDMTQuMzg1NiAyLjI4MTA2IDE0LjY0NTUgMi4xMDc0NCAxNC45MzE0IDEuOTg4OTlDMTUuMjE3NCAxLjg3MDU0IDE1LjUyMzkgMS44MDk1NyAxNS44MzM0IDEuODA5NTdDMTYuMTQyOSAxLjgwOTU3IDE2LjQ0OTQgMS44NzA1NCAxNi43MzU0IDEuOTg4OTlDMTcuMDIxNCAyLjEwNzQ0IDE3LjI4MTIgMi4yODEwNiAxNy41MDAxIDIuNDk5OTNDMTcuNzE5IDIuNzE4OCAxNy44OTI2IDIuOTc4NjMgMTguMDExIDMuMjY0NkMxOC4xMjk1IDMuNTUwNTcgMTguMTkwNCAzLjg1NzA2IDE4LjE5MDQgNC4xNjY1OUMxOC4xOTA0IDQuNDc2MTIgMTguMTI5NSA0Ljc4MjYyIDE4LjAxMSA1LjA2ODU5QzE3Ljg5MjYgNS4zNTQ1NSAxNy43MTkgNS42MTQzOSAxNy41MDAxIDUuODMzMjZMNi4yNTAwOCAxNy4wODMzTDEuNjY2NzUgMTguMzMzM0wyLjkxNjc1IDEzLjc0OTlMMTQuMTY2NyAyLjQ5OTkzWlwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTMyMl81MzI1XCI+XHJcbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgRWRpdFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJpc0VkaXRNb2RlXCIgY2xhc3M9XCJkLWZsZXggZ2FwLTUganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB0ZXh0LW5vd3JhcFwiIChjbGljayk9XCJvblN1Ym1pdCgnZHJhZnQnKVwiPlNhdmUgYXMgZHJhZnQ8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LW5vd3JhcFwiIChjbGljayk9XCJvblN1Ym1pdCgnY29tcGxldGUnKVwiPkNvbXBsZXRlPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscz8uX2lkXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBwLTNcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSAxMkMxMSAxMi41NTIzIDExLjQ0NzcgMTMgMTIgMTNDMTIuNTUyMyAxMyAxMyAxMi41NTIzIDEzIDEyQzEzIDExLjQ0NzcgMTIuNTUyMyAxMSAxMiAxMUMxMS40NDc3IDExIDExIDExLjQ0NzcgMTEgMTJaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSAxOUMxMSAxOS41NTIzIDExLjQ0NzcgMjAgMTIgMjBDMTIuNTUyMyAyMCAxMyAxOS41NTIzIDEzIDE5QzEzIDE4LjQ0NzcgMTIuNTUyMyAxOCAxMiAxOEMxMS40NDc3IDE4IDExIDE4LjQ0NzcgMTEgMTlaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSA1QzExIDUuNTUyMjggMTEuNDQ3NyA2IDEyIDZDMTIuNTUyMyA2IDEzIDUuNTUyMjggMTMgNUMxMyA0LjQ0NzcyIDEyLjU1MjMgNCAxMiA0QzExLjQ0NzcgNCAxMSA0LjQ0NzcyIDExIDVaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPlxyXG4gICAgICAgICAgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvbkR1cGxpY2F0ZSgpXCIgKm5nSWY9XCIhaXNFZGl0TW9kZVwiPkR1cGxpY2F0ZTwvYT48L2xpPlxyXG4gICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gY3Vyc29yLXBvaW50ZXIgdGV4dC1kYW5nZXJcIiAoY2xpY2spPVwib25EZWxldGUoKVwiPiBEZWxldGUgPC9hPlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFdhbGwgdHlwZSBmaXh0dXJlIGNyZWF0aW9uIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgZ2FwLTQgYnVpbGRlclwiICpuZ0lmPVwiZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiPlxyXG4gICAgPCEtLSBXYWxsIEZpeHR1cmUgRm9ybSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbFwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxoMj5GaXh0dXJlIERldGFpbHM8L2gyPlxyXG4gICAgICAgIDxwPkNvbmZpZ3VyZSB5b3VyIGZpeHR1cmUgZGV0YWlscyBoZXJlPC9wPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwid2FsbEZpeHR1cmVGb3JtXCI+XHJcbiAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbiAjYWNjb3JkaW9uPVwibmdiQWNjb3JkaW9uXCI+XHJcbiAgICAgICAgICAgIDwhLS0gQmFzaWMgRGV0YWlscyAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiZGV0YWlsc1wiIFtjb2xsYXBzZWRdPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+QkFTSUMgREVUQUlMUzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiBmb3JtR3JvdXBOYW1lPVwiYmFzaWNEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZml4dHVyZUNhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5GaXh0dXJlIG5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZml4dHVyZUNhdGVnb3J5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ2F0ZWdvcnlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaW52YWxpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4dHVyZSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeHR1cmUgbmFtZSBjYW5ub3QgYmUgb25seSB3aGl0ZXNwYWNlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbGxvd2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIk92ZXJhbGwgd2lkdGggKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udW5pdCB8fCBcImZ0XCIpICsgXCIpXCIgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cIndpZHRoXCIgW3N0ZXBdPVwiMC41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8uaW52YWxpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyYWxsIHdpZHRoIGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIk92ZXJhbGwgaGVpZ2h0IChcIiArIChmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwibGVuZ3RoXCIgW3N0ZXBdPVwiMC41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmFsbCBoZWlnaHQgY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXNIZWFkZXJFbmFibGVkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWN0aW9uKCdoZWFkZXInKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbXMtNFwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+SEVBREVSPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCIgZm9ybUdyb3VwTmFtZT1cImhlYWRlclwiIFtjbGFzcy5kaXNhYmxlZF09XCIhaXNIZWFkZXJFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIkhlaWdodCAoXCIgKyAoZml4dHVyZURldGFpbHMuaGVhZGVyPy5oZWlnaHQ/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwiaGVpZ2h0XCIgW3N0ZXBdPVwiMC41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdoZWFkZXIuaGVpZ2h0Jyk/LnRvdWNoZWQgJiYgd2FsbEZpeHR1cmVGb3JtLmdldCgnaGVhZGVyLmhlaWdodCcpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdoZWFkZXIuaGVpZ2h0Jyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlciBoZWlnaHQgY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQm9keSBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJib2R5XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbZGlzYWJsZWRdPVwiIWlzRWRpdE1vZGVcIiBbY2hlY2tlZF09XCJpc0JvZHlFbmFibGVkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWN0aW9uKCdib2R5Jyk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1zLTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlciBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPkJPRFk8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiBmb3JtR3JvdXBOYW1lPVwiYm9keVwiIFtjbGFzcy5kaXNhYmxlZF09XCIhaXNCb2R5RW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5ObyBvZiBzaGVsdmVzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1jb250YWluZXJcIiBbY2xhc3MuZGlzYWJsZS1jb3VudGVyXT1cIiFpc0VkaXRNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHJvbGU9XCJidXR0b25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE1IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgKGNsaWNrKT1cInJlbW92ZVNoZWxmKCk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy43NjI5NCA3SDExLjkyOTZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc2hlbGZBcnJheS5sZW5ndGggfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHJvbGU9XCJidXR0b25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE1IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgKGNsaWNrKT1cImFkZFNoZWxmKCk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4xNTM4OSAyLjkxNjVWMTEuMDgzMk0zLjA3MDU2IDYuOTk5ODRIMTEuMjM3MlwiIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwic2hlbGZBcnJheS5sZW5ndGggPCAxICYmIGlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBBdCBsZWFzdCBvbmUgc2hlbGYgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGF0YWxpc3QgaWQ9XCJ3YWxsWm9uZU9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgem9uZSBvZiB3YWxsWm9uZXNcIiBbdmFsdWVdPVwiem9uZS52YWx1ZVwiPjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kYXRhbGlzdD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hlbGZBcnJheT8ubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHRleHQtbm93cmFwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRWRpdE1vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhdXRvQXNzaWduV2FsbFpvbmVzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRvLXpvbmUgc2hlbHZlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaGVsZkFycmF5Py5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwic2hlbGZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzaGVsZiBvZiBzaGVsZkFycmF5Py5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcnJheS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJzaGVsZi10aXRsZVwiPlNoZWxmIHt7IGkgKyAxIH19PC9oNj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVTaGVsZihpKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE4IDZMNiAxOE02IDZMMTggMThcIiBzdHJva2U9XCIjOThBMkIzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJzaGVsZlR5cGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1iLTFcIj5ab25lPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ6b25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0PVwid2FsbFpvbmVPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gVG9wLCBNaWQsIEJvdHRvbVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hlbGYuZ2V0KCd0eXBlJyk/LnZhbHVlID09PSAndHJheSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+Tm8gb2Ygcm93czwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJub09mUm93c1wiIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaGVsZi5nZXQoJ25vT2ZSb3dzJyk/LnRvdWNoZWQgJiYgc2hlbGYuZ2V0KCdub09mUm93cycpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInNoZWxmLmdldCgnbm9PZlJvd3MnKT8uaGFzRXJyb3IoJ21pbicpXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGF0IGxlYXN0IDEgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaGVsZi5nZXQoJ3R5cGUnKT8udmFsdWUgIT09ICd2bW9ubHknXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Qcm9kdWN0IGNhcGFjaXR5IGZvciBlYWNoIHJvdzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RDYXBhY2l0eVwiIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaGVsZi5nZXQoJ3R5cGUnKT8udmFsdWUgIT09ICd2bW9ubHknICYmIHNoZWxmLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnRvdWNoZWQgJiYgc2hlbGYuZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8uZXJyb3JzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzaGVsZi5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0IGNhcGFjaXR5IGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEZvb3RlciBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJmb290ZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiIFtjaGVja2VkXT1cImlzRm9vdGVyRW5hYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VjdGlvbignZm9vdGVyJyk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1zLTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlciBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPkZPT1RFUjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJmb290ZXJcIiBbY2xhc3MuZGlzYWJsZWRdPVwiIWlzRm9vdGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgXCJIZWlnaHQgKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZvb3Rlcj8uaGVpZ2h0Py51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cImhlaWdodFwiIFtzdGVwXT1cIjAuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnZm9vdGVyLmhlaWdodCcpPy50b3VjaGVkICYmIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Zvb3Rlci5oZWlnaHQnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnZm9vdGVyLmhlaWdodCcpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBGb290ZXIgaGVpZ2h0IGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBXYWxsIEZpeHR1cmUgUHJldmlldyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbC04XCI+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IGNhbGMoNzV2aCAtIDEyMHB4KTsgb3ZlcmZsb3cteTogYXV0b1wiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0JvZHlFbmFibGVkIHx8IGlzSGVhZGVyRW5hYmxlZCB8fCBpc0Zvb3RlckVuYWJsZWQ7IGVsc2UgZW1wdHlGaXh0dXJlXCJcclxuICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/LnZhbHVlIGFzIGxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAge3sgbGVuZ3RoIH19IHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0XCI+XHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIFByZXZpZXcgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgICAgICAgICAgICBkaW1lbnNpb25BcnJvd3M7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LnZhbHVlXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBnYXAtNVwiICpuZ0lmPVwiaXNIZWFkZXJFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYmxvY2tcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWluZm9cIj5cclxuICAgICAgICAgICAgICAgIDxwPkhFQURFUjwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEJvZHkgUHJldmlldyAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktYmxvY2tcIiAqbmdJZj1cImlzQm9keUVuYWJsZWQgJiYgc2hlbGZBcnJheS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBnYXAtNSBzaGVsZkNvbnRhaW5lclwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNoZWxmQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgIEBpZihpdGVtLmdldCgndHlwZScpPy52YWx1ZSA9PT0ndHJheScpe1xyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdub09mUm93cycpPy52YWx1ZSlcIiBjbGFzcz1cInRyYXkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnZhbHVlKVwiIGNsYXNzPVwicHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgVFJBWSB7eyBpICsgMSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxiIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5nZXQoXCJwcm9kdWN0Q2FwYWNpdHlcIik/LnZhbHVlICogKGl0ZW0uZ2V0KFwibm9PZlJvd3NcIik/LnZhbHVlID8/IDEpIH19PC9iPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJibG9jayBzaGVsZlwiIFtjbGFzcy52bW9ubHktcGxhY2Vob2xkZXJdPVwiaXRlbS5nZXQoJ3R5cGUnKT8udmFsdWUgPT09J3Ztb25seSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udmFsdWUpXCIgY2xhc3M9XCJwcm9kdWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uZ2V0KCd0eXBlJyk/LnZhbHVlID09PSd2bW9ubHknID8gICdWTSBPTkxZJzogJ1NIRUxGJ319IHt7IGkgKyAxIH19IDxiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOiB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgfX08L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEZvb3RlciBQcmV2aWV3IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC01XCIgKm5nSWY9XCJpc0Zvb3RlckVuYWJsZWRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlciBmb290ZXItYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbS0wIGgtMTAwIGdhcC0zIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgc3ViLWZvb3RlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIHN1Yi1mb290ZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXItaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgPHA+Rk9PVEVSPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlGaXh0dXJlPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW4gaC0xMDBcIj5cclxuICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFtYWludGV4dCBtdC0zXCI+UHJldmlldyByZXF1aXJlcyBoZWFkZXIsIGZvb3Rlciwgb3IgYm9keSBibG9jayBlbmFibGVkLjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhc3VidGV4dFwiPlBsZWFzZSBlbmFibGUgZWl0aGVyIHRoZSBoZWFkZXIsIGZvb3Rlciwgb3IgYm9keSB0byB2aWV3IHRoZSBwcmV2aWV3Li48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBJbmZvIENhcmRzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC0yXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyBzaGVsZkFycmF5Lmxlbmd0aCB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5ObyBvZiBTaGVsdmVzPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgdG90YWxQcm9kdWN0Q2FwYWNpdHkgfX08L2gzPlxyXG4gICAgICAgICAgPHA+UHJvZHVjdCBDYXBhY2l0eTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGluZm8tY2FyZFwiPlxyXG4gICAgICAgICAgPGgzPnt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlIHwgdGl0bGVjYXNlIH19IGZpeHR1cmU8L2gzPlxyXG4gICAgICAgICAgPHA+VHlwZTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGluZm8tY2FyZFwiPlxyXG4gICAgICAgICAgPGgzPlxyXG4gICAgICAgICAgICB7eyB3YWxsRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpPy52YWx1ZSB9fSB4XHJcbiAgICAgICAgICAgIHt7IHdhbGxGaXh0dXJlRm9ybS5nZXQoXCJiYXNpY0RldGFpbHMubGVuZ3RoXCIpPy52YWx1ZSB9fSBmZWV0XHJcbiAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgPHA+T3ZlcmFsbCBEaW1lbnNpb248L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gRmxvb3IgdHlwZSBmaXh0dXJlIGNyZWF0aW9uIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgZ2FwLTQgYnVpbGRlclwiICpuZ0lmPVwiZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09ICdmbG9vcidcIj5cclxuICAgIDwhLS0gRmxvb3IgUGFuZWwgRm9ybSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbFwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxoMj5GaXh0dXJlIERldGFpbHM8L2gyPlxyXG4gICAgICAgIDxwPlRoZSBzZXR0aW5ncyBhcmUgcHJlLWNvbmZpZ3VyZWQgYW5kIGNhbm5vdCBiZSBlZGl0ZWQ8L3A+XHJcbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmbG9vckZpeHR1cmVGb3JtXCI+XHJcbiAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbiAjYWNjb3JkaW9uPVwibmdiQWNjb3JkaW9uXCI+XHJcbiAgICAgICAgICAgIDwhLS0gQmFzaWMgRGV0YWlscyAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiZGV0YWlsc1wiIFtjb2xsYXBzZWRdPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+QkFTSUMgREVUQUlMUzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiBmb3JtR3JvdXBOYW1lPVwiYmFzaWNEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZml4dHVyZUNhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5GaXh0dXJlIG5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZml4dHVyZUNhdGVnb3J5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ2F0ZWdvcnlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4dHVyZSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXh0dXJlIG5hbWUgY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCB3aWR0aCAoXCIgKyAoZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwid2lkdGhcIiBbc3RlcF09XCIwLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LmludmFsaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyYWxsIHdpZHRoIGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCBsZW5ndGggKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJsZW5ndGhcIiBbc3RlcF09XCIwLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8uaW52YWxpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyYWxsIGhlaWdodCBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBQYW5lbCBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJwYW5lbFwiPlxyXG4gICAgICAgICAgICAgIDxoMiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkFjY29yZGlvbkJ1dHRvbj5QQU5FTDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5ObyBvZiBwYW5lbHM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1jb250YWluZXJcIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHJvbGU9XCJidXR0b25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE1IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIChjbGljayk9XCJyZW1vdmVQYW5lbCgpOyBmbG9vckZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy43NjI5NCA3SDExLjkyOTZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHBhbmVsQXJyYXkubGVuZ3RoIH19PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHJvbGU9XCJidXR0b25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE1IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIChjbGljayk9XCJhZGRQYW5lbCgpOyBmbG9vckZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4xNTM4OSAyLjkxNjVWMTEuMDgzMk0zLjA3MDU2IDYuOTk5ODRIMTEuMjM3MlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbEFycmF5Lmxlbmd0aCA8IDEgJiYgaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBBdCBsZWFzdCBvbmUgcGFuZWwgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGF0YWxpc3QgaWQ9XCJmbG9vclpvbmVPcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB6b25lIG9mIGZsb29yWm9uZXNcIiBbdmFsdWVdPVwiem9uZS52YWx1ZVwiPjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGF0YWxpc3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYW5lbEFycmF5Py5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInBhbmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHBhbmVsIG9mIHBhbmVsQXJyYXk/LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcnJheS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cInNoZWxmLXRpdGxlXCI+UGFuZWwge3sgaSArIDEgfX08L2g2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgKGNsaWNrKT1cInJlbW92ZVBhbmVsKGkpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE4IDZMNiAxOE02IDZMMTggMThcIiBzdHJva2U9XCIjOThBMkIzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicGFuZWxOYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwicGFuZWxOYW1lXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYW5lbC5nZXQoJ3BhbmVsTmFtZScpPy50b3VjaGVkICYmIHBhbmVsLmdldCgncGFuZWxOYW1lJyk/LmVycm9yc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwicGFuZWwuZ2V0KCdwYW5lbE5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lbCBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwicGFuZWwuZ2V0KCdwYW5lbE5hbWUnKT8uaGFzRXJyb3IoJ3doaXRlc3BhY2UnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhbmVsIG5hbWUgY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInBhbmVsLmdldCgncGFuZWxOYW1lJyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYWxsb3dlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWItMVwiPlpvbmU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ6b25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdD1cImZsb29yWm9uZU9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gQWxsLCBUb3AsIE1pZCwgQm90dG9tXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHJvd3M8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwibm9PZlJvd3NcIiBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFuZWwuZ2V0KCdub09mUm93cycpPy50b3VjaGVkICYmIHBhbmVsLmdldCgnbm9PZlJvd3MnKT8uZXJyb3JzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwicGFuZWwuZ2V0KCdub09mUm93cycpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSBhdCBsZWFzdCAxIHJvdy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Qcm9kdWN0IGNhcGFjaXR5IGZvciBlYWNoIHJvdzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0Q2FwYWNpdHlcIiBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicGFuZWwuZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udG91Y2hlZCAmJiBwYW5lbC5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbC5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdCBjYXBhY2l0eSBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBGbG9vciBQYW5lbCBQcmV2aWV3IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sLThcIj5cclxuICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogY2FsYyg3NXZoIC0gMTIwcHgpOyBvdmVyZmxvdy15OiBhdXRvXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInBhbmVsQXJyYXkuY29udHJvbHMubGVuZ3RoOyBlbHNlIG5vUGFuZWxcIiBjbGFzcz1cImZsb29yLXBhbmVsLXZpZXdwb3J0IHctMTAwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcGFuZWxBcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZC1mbGV4IGdhcC01XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWRpbWVuc2lvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/LnZhbHVlIGFzIGxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGxlbmd0aCB9fSB7eyBmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIiB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBkb3duXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25BcnJvd3M7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udmFsdWVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIFwiPjwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGVsZkNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdub09mUm93cycpPy52YWx1ZSlcIiBjbGFzcz1cInBhbmVsIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy52YWx1ZSlcIiBjbGFzcz1cInByb2R1Y3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgUEFORUwge3sgaSArIDEgfX1cclxuICAgICAgICAgICAgICAgIDxiIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOlxyXG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgKiAoaXRlbS5nZXQoXCJub09mUm93c1wiKT8udmFsdWUgPz8gMSkgfX08L2I+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTUgbXQtNVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDI0cHhcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDY0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDUzMCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk01MjIuNjUzIDAuMjkyODkzQzUyMi4yNjMgLTAuMDk3NjMxNSA1MjEuNjMgLTAuMDk3NjMxNCA1MjEuMjM5IDAuMjkyODkzTDUxNC44NzUgNi42NTY4NUM1MTQuNDg1IDcuMDQ3MzggNTE0LjQ4NSA3LjY4MDU0IDUxNC44NzUgOC4wNzEwN0M1MTUuMjY2IDguNDYxNTkgNTE1Ljg5OSA4LjQ2MTU5IDUxNi4yODkgOC4wNzEwN0w1MjEuOTQ2IDIuNDE0MjFMNTI3LjYwMyA4LjA3MTA3QzUyNy45OTQgOC40NjE1OSA1MjguNjI3IDguNDYxNTkgNTI5LjAxNyA4LjA3MTA3QzUyOS40MDggNy42ODA1NCA1MjkuNDA4IDcuMDQ3MzggNTI5LjAxNyA2LjY1Njg1TDUyMi42NTMgMC4yOTI4OTNaTTUyMi45NDYgMTRMNTIyLjk0NiAxTDUyMC45NDYgMUw1MjAuOTQ2IDE0TDUyMi45NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0zOTQuMTUzIDAuMjkyODkzQzM5My43NjMgLTAuMDk3NjMxNSAzOTMuMTMgLTAuMDk3NjMxNCAzOTIuNzM5IDAuMjkyODkzTDM4Ni4zNzUgNi42NTY4NUMzODUuOTg1IDcuMDQ3MzggMzg1Ljk4NSA3LjY4MDU0IDM4Ni4zNzUgOC4wNzEwN0MzODYuNzY2IDguNDYxNTkgMzg3LjM5OSA4LjQ2MTU5IDM4Ny43ODkgOC4wNzEwN0wzOTMuNDQ2IDIuNDE0MjFMMzk5LjEwMyA4LjA3MTA3QzM5OS40OTQgOC40NjE1OSA0MDAuMTI3IDguNDYxNTkgNDAwLjUxNyA4LjA3MTA3QzQwMC45MDggNy42ODA1NCA0MDAuOTA4IDcuMDQ3MzggNDAwLjUxNyA2LjY1Njg1TDM5NC4xNTMgMC4yOTI4OTNaTTM5NC40NDYgMTRMMzk0LjQ0NiAxTDM5Mi40NDYgMUwzOTIuNDQ2IDE0TDM5NC40NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0yNjUuNjUzIDAuMjkyODkzQzI2NS4yNjMgLTAuMDk3NjMxNSAyNjQuNjMgLTAuMDk3NjMxNCAyNjQuMjM5IDAuMjkyODkzTDI1Ny44NzUgNi42NTY4NUMyNTcuNDg1IDcuMDQ3MzggMjU3LjQ4NSA3LjY4MDU0IDI1Ny44NzUgOC4wNzEwN0MyNTguMjY2IDguNDYxNTkgMjU4Ljg5OSA4LjQ2MTU5IDI1OS4yODkgOC4wNzEwN0wyNjQuOTQ2IDIuNDE0MjFMMjcwLjYwMyA4LjA3MTA3QzI3MC45OTQgOC40NjE1OSAyNzEuNjI3IDguNDYxNTkgMjcyLjAxNyA4LjA3MTA3QzI3Mi40MDggNy42ODA1NCAyNzIuNDA4IDcuMDQ3MzggMjcyLjAxNyA2LjY1Njg1TDI2NS42NTMgMC4yOTI4OTNaTTI2NS45NDYgMTRMMjY1Ljk0NiAxTDI2My45NDYgMUwyNjMuOTQ2IDE0TDI2NS45NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0xMzcuMTUzIDAuMjkyODkzQzEzNi43NjMgLTAuMDk3NjMxNSAxMzYuMTMgLTAuMDk3NjMxNCAxMzUuNzM5IDAuMjkyODkzTDEyOS4zNzUgNi42NTY4NUMxMjguOTg1IDcuMDQ3MzggMTI4Ljk4NSA3LjY4MDU0IDEyOS4zNzUgOC4wNzEwN0MxMjkuNzY2IDguNDYxNTkgMTMwLjM5OSA4LjQ2MTU5IDEzMC43ODkgOC4wNzEwN0wxMzYuNDQ2IDIuNDE0MjFMMTQyLjEwMyA4LjA3MTA3QzE0Mi40OTQgOC40NjE1OSAxNDMuMTI3IDguNDYxNTkgMTQzLjUxNyA4LjA3MTA3QzE0My45MDggNy42ODA1NCAxNDMuOTA4IDcuMDQ3MzggMTQzLjUxNyA2LjY1Njg1TDEzNy4xNTMgMC4yOTI4OTNaTTEzNy40NDYgMTRMMTM3LjQ0NiAxTDEzNS40NDYgMUwxMzUuNDQ2IDE0TDEzNy40NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk04LjY1MzQgMC4yOTI4OTNDOC4yNjI4NyAtMC4wOTc2MzE1IDcuNjI5NzEgLTAuMDk3NjMxNCA3LjIzOTE4IDAuMjkyODkzTDAuODc1MjIxIDYuNjU2ODVDMC40ODQ2OTcgNy4wNDczOCAwLjQ4NDY5NyA3LjY4MDU0IDAuODc1MjIxIDguMDcxMDdDMS4yNjU3NSA4LjQ2MTU5IDEuODk4OTEgOC40NjE1OSAyLjI4OTQzIDguMDcxMDdMNy45NDYyOSAyLjQxNDIxTDEzLjYwMzEgOC4wNzEwN0MxMy45OTM3IDguNDYxNTkgMTQuNjI2OCA4LjQ2MTU5IDE1LjAxNzQgOC4wNzEwN0MxNS40MDc5IDcuNjgwNTQgMTUuNDA3OSA3LjA0NzM4IDE1LjAxNzQgNi42NTY4NUw4LjY1MzQgMC4yOTI4OTNaTTguOTQ2MjkgMTRMOC45NDYyOSAxTDYuOTQ2MjkgMUw2Ljk0NjI5IDE0TDguOTQ2MjkgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNTdcIiBoZWlnaHQ9XCI0M1wiIHZpZXdCb3g9XCIwIDAgNTcgNDNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMC40Mzk2OTcgMzEuODA4N0MwLjQzOTY5NyAyNi44NjQgNC40NDgyIDIyLjg1NTUgOS4zOTI5NCAyMi44NTU1SDQ3LjQ2ODFDNTIuNDIzIDIyLjg1NTUgNTYuNDM5NyAyNi44NzIyIDU2LjQzOTcgMzEuODI3QzU2LjQzOTcgMzcuMzI1NSA1MS41MzczIDQxLjQ5OTQgNDYuMDc2NSA0MC44NTcxQzMzLjYzMTggMzkuMzkzNSAyMy43MjY3IDM5LjMyMDYgMTAuODE4NiA0MC44Mzc2QzUuMzU1NDIgNDEuNDc5NiAwLjQzOTY5NyAzNy4zMDk1IDAuNDM5Njk3IDMxLjgwODdaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxRDI5MzlcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjI4LjQ0MDhcIiBjeT1cIjE2LjU3MTRcIiByPVwiMTUuMDcxNFwiIGZpbGw9XCIjMUQyOTM5XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIzXCIgLz5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub1BhbmVsPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW4gaC0xMDBcIj5cclxuICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFtYWludGV4dCBtdC0zXCI+QWRkIGEgcGFuZWwgdG8gc2VlIHlvdXIgcHJldmlldy48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YXN1YnRleHRcIj5UbyBzZWUgeW91ciBwcmV2aWV3LCBwbGVhc2UgYWRkIGF0IGxlYXN0IG9uZSBwYW5lbC48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBJbmZvIENhcmRzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC0yXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyBwYW5lbEFycmF5Lmxlbmd0aCB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5ObyBvZiBQYW5lbHM8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyB0b3RhbFByb2R1Y3RDYXBhY2l0eSB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5Qcm9kdWN0IENhcGFjaXR5PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgfCB0aXRsZWNhc2UgfX0gZml4dHVyZTwvaDM+XHJcbiAgICAgICAgICA8cD5UeXBlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgIHt7IGZsb29yRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpPy52YWx1ZSB9fSB4XHJcbiAgICAgICAgICAgIHt7IGZsb29yRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLmxlbmd0aFwiKT8udmFsdWUgfX1cclxuICAgICAgICAgICAge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX1cclxuICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICA8cD5PdmVyYWxsIERpbWVuc2lvbjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG5cclxuPHNlY3Rpb24gaWQ9XCJidWlsZC1maXh0dXJlLXNrZWxldG9uXCIgKm5nSWY9XCJpc1BhZ2VMb2FkaW5nXCI+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcbjwhLS0gQ29tbW9uIGRpbWVuc2lvbiBhcnJvd3MgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZGltZW5zaW9uQXJyb3dzIGxldC1sYWJlbD1cImxhYmVsXCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cclxuICA8ZGl2IGNsYXNzPVwiaG9yaXpvbnRhbC1kaW1lbnNpb25cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBsZWZ0XCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cInZhbHVlXCI+e3sgdmFsdWUgfX0ge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyByaWdodFwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|
|
646
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUlMLFVBQVUsRUFDVixXQUFXLEVBQ1gsbUJBQW1CLEdBQ3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsa0JBQWtCLEVBRWxCLFVBQVUsR0FDWCxNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFDTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixjQUFjLEVBQ2QsR0FBRyxFQUNILE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFRZCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUMxRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUVwRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUUzRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFD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QUU7WUFDN0IsbUJBQW1CLEVBQUUsT0FBTztTQUM3QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQXJyQlUsc0JBQXNCOzRGQUF0QixzQkFBc0IsOEVDN0RuQyxzdThDQTJ5QmMsK3ZjRHp2QlYscUJBQXFCLDJJQUNyQixVQUFVLDBUQUNWLFdBQVcsdzJCQUNYLG1CQUFtQiw2aEJBQ25CLFlBQVksa2hCQUNaLFdBQVcsK0NBQ1gsa0JBQWtCLDYxQkFDbEIsdUJBQXVCLHFPQUN2QixVQUFVOzs0RkFHRCxzQkFBc0I7a0JBakJsQyxTQUFTOytCQUNFLG9CQUFvQixjQUdsQixJQUFJLFdBQ1A7d0JBQ1AscUJBQXFCO3dCQUNyQixVQUFVO3dCQUNWLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsa0JBQWtCO3dCQUNsQix1QkFBdUI7d0JBQ3ZCLFVBQVU7cUJBQ1giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtR3JvdXAsXHJcbiAgRm9ybUFycmF5LFxyXG4gIFZhbGlkYXRvcnMsXHJcbiAgRm9ybXNNb2R1bGUsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciwgUm91dGVyTGluayB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHtcclxuICBOZ2JBY2NvcmRpb25Nb2R1bGUsXHJcbiAgTmdiTW9kYWwsXHJcbiAgTmdiVG9vbHRpcCxcclxufSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IHtcclxuICBkZWJvdW5jZVRpbWUsXHJcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXHJcbiAgZmlsdGVyLFxyXG4gIGZpcnN0VmFsdWVGcm9tLFxyXG4gIG1hcCxcclxuICBTdWJqZWN0LFxyXG4gIHRha2VVbnRpbCxcclxufSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLXNoYXJlZFwiO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZVwiO1xyXG5pbXBvcnQge1xyXG4gIEZpeHR1cmVMaWJyYXJ5RGV0YWlscyxcclxuICBGaXh0dXJlTGlicmFyeVNoZWxmQ29uZmlnLFxyXG59IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL2ZpeHR1cmUtbGlicmFyeS5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25JRiB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL3BsYW5vLWdlbmVyYWwuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IENvbXBsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4uL3BvcHVwcy9jb21wbGV0ZS1jb25maXJtYXRpb24vY29tcGxldGUtY29uZmlybWF0aW9uLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQgfSBmcm9tIFwiLi4vcG9wdXBzL2RlbGV0ZS1jb25maXJtYXRpb24vZGVsZXRlLWNvbmZpcm1hdGlvbi5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRXhpdENvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9wb3B1cHMvZXhpdC1jb25maXJtYXRpb24vZXhpdC1jb25maXJtYXRpb24uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENhbkV4aXRHdWFyZCB9IGZyb20gXCIuLi8uLi9mdW5jdGlvbnMvZXhpdC5ndWFyZFwiO1xyXG5pbXBvcnQgeyBDYW5ub3RQZXJmb3JtQ29tcG9uZW50IH0gZnJvbSBcIi4uL3BvcHVwcy9jYW5ub3QtcGVyZm9ybS9jYW5ub3QtcGVyZm9ybS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlLCBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLWdsb2JhbFwiO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7IFRpbWVBZ29QaXBlIH0gZnJvbSBcIi4uLy4uL3BpcGVzL3RpbWUtYWdvLnBpcGVcIjtcclxuaW1wb3J0IHsgQ291bnRlcklucHV0Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NvdW50ZXItaW5wdXQvY291bnRlci1pbnB1dC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQgfSBmcm9tIFwiLi4vcmVhY3RpdmUtc2VsZWN0L3JlYWN0aXZlLXNlbGVjdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgZ2VuZXJhbFZhbGlkYXRvciB9IGZyb20gXCIuLi8uLi9mdW5jdGlvbnMvcGxhbm8uZnVuY3Rpb25cIjtcclxuaW1wb3J0IHsgV0FMTF9aT05FUywgRkxPT1JfWk9ORVMgfSBmcm9tIFwiLi4vLi4vZGF0YS9maXh0dXJlLXRlbXBsYXRlLmRhdGFcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImxpYi1jcmVhdGUtZml4dHVyZVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybDogXCIuL2NyZWF0ZS1maXh0dXJlLmNvbXBvbmVudC5zY3NzXCIsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb3VudGVySW5wdXRDb21wb25lbnQsXHJcbiAgICBOZ2JUb29sdGlwLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgVGltZUFnb1BpcGUsXHJcbiAgICBOZ2JBY2NvcmRpb25Nb2R1bGUsXHJcbiAgICBSZWFjdGl2ZVNlbGVjdENvbXBvbmVudCxcclxuICAgIFJvdXRlckxpbmssXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENyZWF0ZUZpeHR1cmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ2FuRXhpdEd1YXJkIHtcclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG5cclxuICB3YWxsRml4dHVyZUZvcm06IEZvcm1Hcm91cDtcclxuICBmbG9vckZpeHR1cmVGb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIGlzUGFnZUxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBmaXh0dXJlRGV0YWlsczogRml4dHVyZUxpYnJhcnlEZXRhaWxzID0ge307XHJcbiAgaXNFZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpc0hlYWRlckVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzRm9vdGVyRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNCb2R5RW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGNhbkdvQmFjazogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICByZWFkb25seSBzaGVsZlR5cGVzOiBEcm9wZG93bklGW10gPSBbXHJcbiAgICB7IGxhYmVsOiBcIlNoZWxmXCIsIHZhbHVlOiBcInNoZWxmXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiVHJheVwiLCB2YWx1ZTogXCJ0cmF5XCIgfSxcclxuICAgIHsgbGFiZWw6IFwiVk0gT25seVwiLCB2YWx1ZTogXCJ2bW9ubHlcIiB9LFxyXG4gIF07XHJcblxyXG4gIHJlYWRvbmx5IHdhbGxab25lczogRHJvcGRvd25JRltdID0gV0FMTF9aT05FUztcclxuICByZWFkb25seSBmbG9vclpvbmVzOiBEcm9wZG93bklGW10gPSBGTE9PUl9aT05FUztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgc3RvcmVCdWlsZGVyU2VydmljZTogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIG5nYk1vZGFsOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgcGFnZUluZm86IFBhZ2VJbmZvU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zZXRQYWdlRGF0YSgpO1xyXG4gICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM7XHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLl9pZCA9IHBhcmFtc1tcImZpeHR1cmVJZFwiXSA/PyBcIlwiO1xyXG5cclxuICAgIHRoaXMuaXNFZGl0TW9kZSA9IHBhcmFtc1tcImlzRWRpdFwiXSA9PSBcInRydWVcIjtcclxuXHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuX2lkKSB7XHJcbiAgICAgIHRoaXMuY2FuR29CYWNrID0gdHJ1ZTtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL21hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlc1wiXSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdldENsaWVudElkKCk7XHJcblxyXG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHBhcmFtcykgPT4gcGFyYW1zW1wiZml4dHVyZUlkXCJdKSxcclxuICAgICAgICBmaWx0ZXIoKGlkKSA9PiAhIWlkKSxcclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jIChpZCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5nZXRGaXh0dXJlTGlicmFyeURldGFpbHMoaWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgbGV0IGRldGFpbHMgPSByZXMuZGF0YTtcclxuICAgICAgICAgICAgaWYgKGRldGFpbHMpIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzID0ge1xyXG4gICAgICAgICAgICAgICAgLi4uZGV0YWlscyxcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm0oKTtcclxuICAgICAgICAgICAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLmNhbkdvQmFjayA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgICAgICAgIGVycj8uZXJyb3I/LmVycm9yID8/IFwiRmFpbGVkIHRvIGZldGNoIGZpeHR1cmUgZGV0YWlsc1wiLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy8gdGhpcy5pc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKFwiQ3JlYXRlIEZpeHR1cmVcIik7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldEJyZWFkY3J1bWJzKFtcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlBsYW5vZ3JhbVwiLFxyXG4gICAgICAgIHBhdGg6IFwiL21hbmFnZS9wbGFub2dyYW0vbWFuYWdlLXBsYW5vZ3JhbXNcIixcclxuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgaXNTZXBhcmF0b3I6IGZhbHNlLFxyXG4gICAgICB9LFxyXG4gICAgICB7IHRpdGxlOiBcIlwiLCBwYXRoOiBcIlwiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogXCJMaWJyYXJ5XCIsXHJcbiAgICAgICAgcGF0aDogXCIvbWFuYWdlL3BsYW5vZ3JhbS9saWJyYXJ5L2ZpeHR1cmVzXCIsXHJcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGlzU2VwYXJhdG9yOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAgeyB0aXRsZTogXCJcIiwgcGF0aDogXCJcIiwgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogdHJ1ZSB9LFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBnZXRDbGllbnRJZCgpIHtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLCAvLyBTdWJzY3JpcHRpb24gd2lsbCBiZSBjYW5jZWxsZWQgb24gY29tcG9uZW50IGRlc3Ryb3kuXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDIwMCksIC8vIFRvIGF2b2lkIGltbWVkaWF0ZSBmcmVxdWVudCBjYWxscy5cclxuICAgICAgICBmaWx0ZXIoKGRhdGEpID0+ICEhZGF0YSksIC8vIEZpbHRlcmluZyBudWxsL3VuZGVmaW5lZC5cclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCAvLyBFbWl0dGluZyBvbmx5IGRpZmZlcmVudCB2YWx1ZXMuIChJZ25vcmVzIHNhbWUgY2xpZW50SWQpLlxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhPy5jbGllbnQpIHtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBoZWFkZXJEYXRhID0gSlNPTi5wYXJzZShcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGhlYWRlckRhdGE/LmNsaWVudDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZUZvcm0oKSB7XHJcbiAgICAvLyBEZWZhdWx0IGZsb29yIGZpeHR1cmVzIGNyZWF0ZWQgYmVmb3JlIHN1Yi10eXBlIGV4aXN0ZWQgdG8gJ3BhbmVsJy5cclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSBcImZsb29yXCIgJiYgIXRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVN1YlR5cGUpIHtcclxuICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlU3ViVHlwZSA9IFwicGFuZWxcIjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc1NoZWxmU3RydWN0dXJlKCkpIHtcclxuICAgICAgdGhpcy5pbml0V2FsbEZpeHR1cmVGb3JtKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmluaXRGbG9vclBhbmVsRml4dHVyZUZvcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzU2hlbGZTdHJ1Y3R1cmUoKSkge1xyXG4gICAgICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5oZWFkZXI/LmlzRW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uKFwiaGVhZGVyXCIpO1xyXG4gICAgICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5mb290ZXI/LmlzRW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uKFwiZm9vdGVyXCIpO1xyXG4gICAgICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5pc0JvZHlFbmFibGVkKSB0aGlzLnRvZ2dsZVNlY3Rpb24oXCJib2R5XCIpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLndhbGxGaXh0dXJlRm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblxyXG4gICAgICB0aGlzLmlzSGVhZGVyRW5hYmxlZCA9IHRoaXMuZml4dHVyZURldGFpbHMuaGVhZGVyPy5pc0VuYWJsZWQgPz8gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNCb2R5RW5hYmxlZCA9IHRoaXMuZml4dHVyZURldGFpbHMuaXNCb2R5RW5hYmxlZCA/PyBmYWxzZTtcclxuICAgICAgdGhpcy5pc0Zvb3RlckVuYWJsZWQgPSB0aGlzLmZpeHR1cmVEZXRhaWxzLmZvb3Rlcj8uaXNFbmFibGVkID8/IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNTaGVsZlN0cnVjdHVyZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09IFwid2FsbFwiIHx8XHJcbiAgICAgICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSBcImZsb29yXCIgJiZcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVTdWJUeXBlID09PSBcInNoZWxmXCIpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgaXNQYW5lbFN0cnVjdHVyZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09IFwiZmxvb3JcIiAmJlxyXG4gICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVTdWJUeXBlICE9PSBcInNoZWxmXCJcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvbkZsb29yU3ViVHlwZUNoYW5nZShzdWJUeXBlOiBcInBhbmVsXCIgfCBcInNoZWxmXCIpIHtcclxuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlU3ViVHlwZSA9PT0gc3ViVHlwZSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGJhc2ljRGV0YWlscyA9IHRoaXMuZ2V0Rm9ybSgpPy5nZXQoXCJiYXNpY0RldGFpbHNcIik/LnZhbHVlO1xyXG4gICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlU3ViVHlwZSA9IHN1YlR5cGU7XHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnNoZWxmQ29uZmlnID0gW107XHJcblxyXG4gICAgaWYgKHN1YlR5cGUgPT09IFwic2hlbGZcIikge1xyXG4gICAgICB0aGlzLmluaXRXYWxsRml4dHVyZUZvcm0oKTtcclxuICAgICAgdGhpcy5zaGVsZkFycmF5LmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuYWRkU2hlbGYoKTtcclxuICAgICAgdGhpcy5pc0hlYWRlckVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmlzQm9keUVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmlzRm9vdGVyRW5hYmxlZCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmluaXRGbG9vclBhbmVsRml4dHVyZUZvcm0oKTtcclxuICAgICAgdGhpcy5wYW5lbEFycmF5LmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuYWRkUGFuZWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYmFzaWNEZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMuZ2V0Rm9ybSgpPy5nZXQoXCJiYXNpY0RldGFpbHNcIik/LnBhdGNoVmFsdWUoYmFzaWNEZXRhaWxzKTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2V0Rm9ybSgpPy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybSgpIHtcclxuICAgIHJldHVybiB0aGlzLmlzU2hlbGZTdHJ1Y3R1cmUoKVxyXG4gICAgICA/IHRoaXMud2FsbEZpeHR1cmVGb3JtXHJcbiAgICAgIDogdGhpcy5mbG9vckZpeHR1cmVGb3JtO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNoZWxmQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLndhbGxGaXh0dXJlRm9ybS5nZXQoXCJib2R5LnNoZWxmXCIpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldCBwYW5lbEFycmF5KCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5mbG9vckZpeHR1cmVGb3JtLmdldChcInBhbmVsXCIpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldCB0b3RhbFByb2R1Y3RDYXBhY2l0eSgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5pc1NoZWxmU3RydWN0dXJlKClcclxuICAgICAgPyB0aGlzLnNoZWxmQXJyYXlcclxuICAgICAgOiB0aGlzLnBhbmVsQXJyYXk7XHJcblxyXG4gICAgcmV0dXJuIGZvcm1BcnJheS5jb250cm9scy5yZWR1Y2UoKHRvdGFsLCBpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvdW50ID0gaXRlbS5nZXQoXCJwcm9kdWN0Q2FwYWNpdHlcIik/LnZhbHVlIHx8IDA7XHJcbiAgICAgIGNvbnN0IGlzVHJheSA9IGl0ZW0uZ2V0KFwidHlwZVwiKT8udmFsdWUgPT09IFwidHJheVwiO1xyXG4gICAgICBjb25zdCByb3dzID0gaXRlbS5nZXQoXCJub09mUm93c1wiKT8udmFsdWUgfHwgMTtcclxuXHJcbiAgICAgIC8vIFBhbmVsIHN0cnVjdHVyZSAoYW5kIHRyYXkgcm93cykgbXVsdGlwbHkgY2FwYWNpdHkgYnkgdGhlIG51bWJlciBvZiByb3dzLlxyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIHRvdGFsICsgKGlzVHJheSB8fCB0aGlzLmlzUGFuZWxTdHJ1Y3R1cmUoKSA/IGNvdW50ICogcm93cyA6IGNvdW50KVxyXG4gICAgICApO1xyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICBpbml0V2FsbEZpeHR1cmVGb3JtKCkge1xyXG4gICAgdGhpcy53YWxsRml4dHVyZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgYmFzaWNEZXRhaWxzOiB0aGlzLmdldEJhc2ljRGV0YWlsc0Zvcm1Hcm91cCgpLFxyXG4gICAgICBoZWFkZXI6IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIGhlaWdodDogW3RoaXMuZml4dHVyZURldGFpbHM/LmhlYWRlcj8uaGVpZ2h0Py52YWx1ZSA/PyAzMDBdLFxyXG4gICAgICB9KSxcclxuICAgICAgYm9keTogdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgc2hlbGY6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICB9KSxcclxuICAgICAgZm9vdGVyOiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICBoZWlnaHQ6IFt0aGlzLmZpeHR1cmVEZXRhaWxzPy5mb290ZXI/LmhlaWdodD8udmFsdWUgPz8gMzAwXSxcclxuICAgICAgfSksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnNoZWxmQ29uZmlnPy5mb3JFYWNoKChzKSA9PiB0aGlzLmFkZFNoZWxmKHMpKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuc2hlbGZDb25maWc/Lmxlbmd0aCA9PT0gMCAmJlxyXG4gICAgICAhdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnlcclxuICAgICkge1xyXG4gICAgICB0aGlzLmFkZFNoZWxmKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy53YWxsRml4dHVyZUZvcm1cclxuICAgICAgLmdldChcImJhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnlcIilcclxuICAgICAgPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ID0gdmFsdWU7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMud2FsbEZpeHR1cmVGb3JtXHJcbiAgICAgIC5nZXQoXCJiYXNpY0RldGFpbHMud2lkdGhcIilcclxuICAgICAgPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aCkge1xyXG4gICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGgudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdEZsb29yUGFuZWxGaXh0dXJlRm9ybSgpIHtcclxuICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBiYXNpY0RldGFpbHM6IHRoaXMuZ2V0QmFzaWNEZXRhaWxzRm9ybUdyb3VwKCksXHJcbiAgICAgIHBhbmVsOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZml4dHVyZURldGFpbHMuc2hlbGZDb25maWc/LmZvckVhY2goKHMpID0+IHRoaXMuYWRkUGFuZWwocykpO1xyXG5cclxuICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybVxyXG4gICAgICAuZ2V0KFwiYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeVwiKVxyXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnkgPSB2YWx1ZTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5mbG9vckZpeHR1cmVGb3JtXHJcbiAgICAgIC5nZXQoXCJiYXNpY0RldGFpbHMud2lkdGhcIilcclxuICAgICAgPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aCkge1xyXG4gICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGgudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QmFzaWNEZXRhaWxzRm9ybUdyb3VwKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBmaXh0dXJlQ2F0ZWdvcnk6IFtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzPy5maXh0dXJlQ2F0ZWdvcnkgfHwgXCJVbnRpdGxlZFwiLFxyXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBnZW5lcmFsVmFsaWRhdG9yKCldLFxyXG4gICAgICBdLFxyXG4gICAgICB3aWR0aDogW1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udmFsdWUgPz8gNixcclxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMC41KV0sXHJcbiAgICAgIF0sXHJcbiAgICAgIGxlbmd0aDogW1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHM/LmZpeHR1cmVMZW5ndGg/LnZhbHVlID8/IDEyLFxyXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwLjUpXSxcclxuICAgICAgXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkU2hlbGYoc2hlbGY/OiBhbnkpIHtcclxuICAgIGNvbnN0IHNoZWxmR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdHlwZTogW3NoZWxmPy5zaGVsZlR5cGUgPz8gXCJzaGVsZlwiXSxcclxuICAgICAgcHJvZHVjdENhcGFjaXR5OiBbc2hlbGY/LnByb2R1Y3RQZXJTaGVsZiA/PyA2XSxcclxuICAgICAgbm9PZlJvd3M6IFtzaGVsZj8udHJheVJvd3MgPz8gMV0sXHJcbiAgICAgIHpvbmU6IFtzaGVsZj8uem9uZSA/PyBudWxsXSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy51cGRhdGVQcm9kdWN0UGVyU2hlbGZNaW5WYWxpZGF0b3IoXHJcbiAgICAgIHNoZWxmR3JvdXAsXHJcbiAgICAgIHNoZWxmR3JvdXAuZ2V0KFwidHlwZVwiKT8udmFsdWUsXHJcbiAgICApO1xyXG4gICAgdGhpcy5zZXR1cFNoZWxmVHlwZUxpc3RlbmVyKHNoZWxmR3JvdXApO1xyXG4gICAgdGhpcy5zaGVsZkFycmF5LnB1c2goc2hlbGZHcm91cCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQcm9kdWN0UGVyU2hlbGZNaW5WYWxpZGF0b3Ioc2hlbGZHcm91cDogRm9ybUdyb3VwLCBzaGVsZlR5cGU6IHN0cmluZykge1xyXG4gICAgY29uc3QgcHJvZHVjdFBlclNoZWxmQ29udHJvbCA9IHNoZWxmR3JvdXAuZ2V0KFwicHJvZHVjdENhcGFjaXR5XCIpO1xyXG4gICAgY29uc3QgbWluVmFsdWUgPSBzaGVsZlR5cGUgPT09IFwidm1vbmx5XCIgPyAwIDogMTtcclxuXHJcbiAgICBwcm9kdWN0UGVyU2hlbGZDb250cm9sPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLm1pbihtaW5WYWx1ZSldKTtcclxuICAgIHByb2R1Y3RQZXJTaGVsZkNvbnRyb2w/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gIHdlIG5lZWQgdG8gc2V0dXAgYSBsaXN0ZW5lciB0byB0aGUgdHlwZSBvZiB0aGUgc2hlbGYgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIG5vT2ZSb3dzIGZpZWxkXHJcbiAgc2V0dXBTaGVsZlR5cGVMaXN0ZW5lcihzaGVsZkdyb3VwOiBGb3JtR3JvdXApIHtcclxuICAgIGxldCBwcmV2aW91c1R5cGUgPSBzaGVsZkdyb3VwLmdldChcInR5cGVcIik/LnZhbHVlO1xyXG4gICAgc2hlbGZHcm91cC5nZXQoXCJ0eXBlXCIpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh0eXBlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHByb2R1Y3RQZXJTaGVsZkNvbnRyb2wgPSBzaGVsZkdyb3VwLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKTtcclxuICAgICAgaWYgKHR5cGUgPT09IFwidm1vbmx5XCIpIHtcclxuICAgICAgICBwcm9kdWN0UGVyU2hlbGZDb250cm9sPy5zZXRWYWx1ZSgwKTtcclxuICAgICAgfSBlbHNlIGlmIChwcmV2aW91c1R5cGUgPT09IFwidm1vbmx5XCIpIHtcclxuICAgICAgICBwcm9kdWN0UGVyU2hlbGZDb250cm9sPy5zZXRWYWx1ZSgxKTtcclxuICAgICAgfVxyXG4gICAgICBwcmV2aW91c1R5cGUgPSB0eXBlO1xyXG5cclxuICAgICAgdGhpcy51cGRhdGVQcm9kdWN0UGVyU2hlbGZNaW5WYWxpZGF0b3Ioc2hlbGZHcm91cCwgdHlwZSk7XHJcbiAgICAgIGNvbnN0IG5vT2ZSb3dzQ29udHJvbCA9IHNoZWxmR3JvdXAuZ2V0KFwibm9PZlJvd3NcIik7XHJcbiAgICAgIGlmICh0eXBlID09PSBcInRyYXlcIikge1xyXG4gICAgICAgIG5vT2ZSb3dzQ29udHJvbD8uc2V0VmFsaWRhdG9ycyhbXHJcbiAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgICAgVmFsaWRhdG9ycy5taW4oMSksXHJcbiAgICAgICAgXSk7XHJcbiAgICAgICAgbm9PZlJvd3NDb250cm9sPy5zZXRWYWx1ZSgxKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIG5vT2ZSb3dzQ29udHJvbD8uc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgIH1cclxuICAgICAgbm9PZlJvd3NDb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIElmIGluZGV4IGlzIG5vdCBnaXZlbiwgbGFzdCBzaGVsZiBzaG91bGQgYmUgcmVtb3ZlZFxyXG4gIHJlbW92ZVNoZWxmKGluZGV4OiBudW1iZXIgPSB0aGlzLnNoZWxmQXJyYXkuY29udHJvbHMubGVuZ3RoIC0gMSkge1xyXG4gICAgaWYgKHRoaXMuc2hlbGZBcnJheS5jb250cm9scy5sZW5ndGggPT0gMSkgcmV0dXJuO1xyXG4gICAgdGhpcy5zaGVsZkFycmF5LnJlbW92ZUF0KGluZGV4KTtcclxuICB9XHJcblxyXG4gIGFkZFBhbmVsKHBhbmVsPzogRml4dHVyZUxpYnJhcnlTaGVsZkNvbmZpZykge1xyXG4gICAgY29uc3QgcGFuZWxHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBwYW5lbE5hbWU6IFtwYW5lbD8ubGFiZWwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBnZW5lcmFsVmFsaWRhdG9yKCldXSxcclxuICAgICAgcHJvZHVjdENhcGFjaXR5OiBbXHJcbiAgICAgICAgcGFuZWw/LnByb2R1Y3RQZXJTaGVsZiA/PyA2LFxyXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwKV0sXHJcbiAgICAgIF0sXHJcbiAgICAgIG5vT2ZSb3dzOiBbXHJcbiAgICAgICAgcGFuZWw/LnRyYXlSb3dzID8/IDUsXHJcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDEpXSxcclxuICAgICAgXSxcclxuICAgICAgem9uZTogWyhwYW5lbCBhcyBhbnkpPy56b25lID8/IFwiQWxsXCJdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5wYW5lbEFycmF5LnB1c2gocGFuZWxHcm91cCk7XHJcbiAgfVxyXG5cclxuICBhdXRvQXNzaWduV2FsbFpvbmVzKCkge1xyXG4gICAgaWYgKCF0aGlzLmlzRWRpdE1vZGUpIHJldHVybjtcclxuICAgIGNvbnN0IHNoZWxmQ291bnQgPSB0aGlzLnNoZWxmQXJyYXkuY29udHJvbHMubGVuZ3RoO1xyXG4gICAgaWYgKHNoZWxmQ291bnQgPT09IDApIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBzaGVsdmVzUGVyWm9uZSA9IE1hdGguZmxvb3Ioc2hlbGZDb3VudCAvIDMpO1xyXG4gICAgY29uc3QgcmVtYWluZGVyID0gc2hlbGZDb3VudCAlIDM7XHJcbiAgICBjb25zdCB0b3BDb3VudCA9IHNoZWx2ZXNQZXJab25lICsgKHJlbWFpbmRlciA+PSAxID8gMSA6IDApO1xyXG4gICAgY29uc3QgbWlkQ291bnQgPSBzaGVsdmVzUGVyWm9uZSArIChyZW1haW5kZXIgPj0gMiA/IDEgOiAwKTtcclxuXHJcbiAgICB0aGlzLnNoZWxmQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoc2hlbGYsIGluZGV4KSA9PiB7XHJcbiAgICAgIGxldCB6b25lOiBzdHJpbmc7XHJcbiAgICAgIGlmIChpbmRleCA8IHRvcENvdW50KSB6b25lID0gXCJUb3BcIjtcclxuICAgICAgZWxzZSBpZiAoaW5kZXggPCB0b3BDb3VudCArIG1pZENvdW50KSB6b25lID0gXCJNaWRcIjtcclxuICAgICAgZWxzZSB6b25lID0gXCJCb3R0b21cIjtcclxuICAgICAgc2hlbGYuZ2V0KFwiem9uZVwiKT8uc2V0VmFsdWUoem9uZSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMud2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICAvLyBJZiBpbmRleCBpcyBub3QgZ2l2ZW4sIGxhc3QgcGFuZWwgc2hvdWxkIGJlIHJlbW92ZWRcclxuICByZW1vdmVQYW5lbChpbmRleDogbnVtYmVyID0gdGhpcy5wYW5lbEFycmF5LmNvbnRyb2xzLmxlbmd0aCAtIDEpIHtcclxuICAgIGlmICh0aGlzLnBhbmVsQXJyYXkuY29udHJvbHMubGVuZ3RoID09IDEpIHJldHVybjtcclxuICAgIHRoaXMucGFuZWxBcnJheS5yZW1vdmVBdChpbmRleCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWN0aW9uKHNlY3Rpb246IFwiaGVhZGVyXCIgfCBcImJvZHlcIiB8IFwiZm9vdGVyXCIpIHtcclxuICAgIHRoaXMudG9nZ2xlU2VjdGlvbkZvcm0oc2VjdGlvbik7XHJcbiAgICB0aGlzLnRvZ2dsZVNlY3Rpb25DaGVja0JveChzZWN0aW9uKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb25Gb3JtKHNlY3Rpb246IFwiaGVhZGVyXCIgfCBcImJvZHlcIiB8IFwiZm9vdGVyXCIpIHtcclxuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmdldEZvcm0oKTtcclxuICAgIGNvbnN0IGdyb3VwID0gZm9ybS5nZXQoc2VjdGlvbik7XHJcbiAgICBpZiAoZ3JvdXApIHtcclxuICAgICAgZ3JvdXAuZW5hYmxlZFxyXG4gICAgICAgID8gZ3JvdXAuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSlcclxuICAgICAgICA6IGdyb3VwLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWN0aW9uQ2hlY2tCb3goc2VjdGlvbjogXCJoZWFkZXJcIiB8IFwiYm9keVwiIHwgXCJmb290ZXJcIikge1xyXG4gICAgc3dpdGNoIChzZWN0aW9uKSB7XHJcbiAgICAgIGNhc2UgXCJoZWFkZXJcIjpcclxuICAgICAgICB0aGlzLmlzSGVhZGVyRW5hYmxlZCA9ICF0aGlzLmlzSGVhZGVyRW5hYmxlZDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImJvZHlcIjpcclxuICAgICAgICB0aGlzLmlzQm9keUVuYWJsZWQgPSAhdGhpcy5pc0JvZHlFbmFibGVkO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiZm9vdGVyXCI6XHJcbiAgICAgICAgdGhpcy5pc0Zvb3RlckVuYWJsZWQgPSAhdGhpcy5pc0Zvb3RlckVuYWJsZWQ7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtYXBGb3JtVG9BcGkoZm9ybTogRm9ybUdyb3VwLCBzdGF0dXM6IHN0cmluZyk6IGFueSB7XHJcbiAgICBjb25zdCBmb3JtVmFsdWUgPSBmb3JtLnZhbHVlO1xyXG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5pc1NoZWxmU3RydWN0dXJlKClcclxuICAgICAgPyB0aGlzLnNoZWxmQXJyYXlcclxuICAgICAgOiB0aGlzLnBhbmVsQXJyYXk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICBmaXh0dXJlQ2F0ZWdvcnk6IHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5LFxyXG4gICAgICBmaXh0dXJlU3ViVHlwZTogdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlU3ViVHlwZSxcclxuICAgICAgZml4dHVyZUNhcGFjaXR5OiB0aGlzLnRvdGFsUHJvZHVjdENhcGFjaXR5LFxyXG4gICAgICBmaXh0dXJlTGVuZ3RoOiB7XHJcbiAgICAgICAgdmFsdWU6IGZvcm1WYWx1ZS5iYXNpY0RldGFpbHMubGVuZ3RoLFxyXG4gICAgICAgIHVuaXQ6IFwiZnRcIixcclxuICAgICAgfSxcclxuICAgICAgZml4dHVyZVdpZHRoOiB7XHJcbiAgICAgICAgdmFsdWU6IGZvcm1WYWx1ZS5iYXNpY0RldGFpbHMud2lkdGgsXHJcbiAgICAgICAgdW5pdDogXCJmdFwiLFxyXG4gICAgICB9LFxyXG4gICAgICBoZWFkZXI6IHtcclxuICAgICAgICBoZWlnaHQ6IHtcclxuICAgICAgICAgIHZhbHVlOiBmb3JtLmdldChcImhlYWRlci5oZWlnaHRcIik/LnZhbHVlLFxyXG4gICAgICAgICAgdW5pdDogXCJtbVwiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbGFiZWw6IFwiXCIsXHJcbiAgICAgICAgaXNFbmFibGVkOiAhZm9ybS5nZXQoXCJoZWFkZXJcIik/LmRpc2FibGVkLFxyXG4gICAgICB9LFxyXG4gICAgICBmb290ZXI6IHtcclxuICAgICAgICBoZWlnaHQ6IHtcclxuICAgICAgICAgIHZhbHVlOiBmb3JtLmdldChcImZvb3Rlci5oZWlnaHRcIik/LnZhbHVlLFxyXG4gICAgICAgICAgdW5pdDogXCJtbVwiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbGFiZWw6IFwiXCIsXHJcbiAgICAgICAgaXNFbmFibGVkOiAhZm9ybS5nZXQoXCJmb290ZXJcIik/LmRpc2FibGVkLFxyXG4gICAgICB9LFxyXG4gICAgICBpc0JvZHlFbmFibGVkOiAhZm9ybS5nZXQoXCJib2R5XCIpPy5kaXNhYmxlZCxcclxuICAgICAgc2hlbGZDb25maWc6IGZvcm1BcnJheS5jb250cm9scy5tYXAoKGUsIGkpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgc2hlbGZOdW1iZXI6IGkgKyAxLFxyXG4gICAgICAgICAgc2hlbGZUeXBlOiBlPy52YWx1ZT8udHlwZSA/PyBcInRyYXlcIixcclxuICAgICAgICAgIHByb2R1Y3RQZXJTaGVsZjogZS52YWx1ZS5wcm9kdWN0Q2FwYWNpdHksXHJcbiAgICAgICAgICB0cmF5Um93czogZT8udmFsdWU/Lm5vT2ZSb3dzID8/IDEsXHJcbiAgICAgICAgICBsYWJlbDogZT8udmFsdWU/LnBhbmVsTmFtZSA/PyBcIlwiLFxyXG4gICAgICAgICAgem9uZTogZT8udmFsdWU/LnpvbmUgPz8gbnVsbCxcclxuICAgICAgICB9O1xyXG4gICAgICB9KSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBhc3luYyBvblN1Ym1pdChzdGF0dXM6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Rm9ybSgpO1xyXG5cclxuICAgICAgaWYgKGZvcm0uaW52YWxpZCkge1xyXG4gICAgICAgIGZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChcIkZvcm0gaXMgaW52YWxpZFwiKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzdGF0dXMgPT09IFwiY29tcGxldGVcIikge1xyXG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuaXNTaGVsZlN0cnVjdHVyZSgpXHJcbiAgICAgICAgICA/IHRoaXMuc2hlbGZBcnJheVxyXG4gICAgICAgICAgOiB0aGlzLnBhbmVsQXJyYXk7XHJcbiAgICAgICAgY29uc3QgbWlzc2luZ1pvbmUgPSBmb3JtQXJyYXkuY29udHJvbHMuc29tZSgoYykgPT4gIWMudmFsdWUuem9uZSk7XHJcbiAgICAgICAgaWYgKG1pc3Npbmdab25lKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICAgIFwiRWFjaCBzaGVsZiBtdXN0IGhhdmUgYSB6b25lIGJlZm9yZSBjb21wbGV0aW5nLlwiLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuY29uZmlybUNvbXBsZXRpb24oKSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgdHJhbnNmb3JtZWREYXRhID0gdGhpcy5tYXBGb3JtVG9BcGkoZm9ybSwgc3RhdHVzKTtcclxuXHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVMaWJyYXJ5KFxyXG4gICAgICAgICAgdHJhbnNmb3JtZWREYXRhLFxyXG4gICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscz8uX2lkISxcclxuICAgICAgICApLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHJlcyAmJiByZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnN0YXR1cyA9IHN0YXR1cztcclxuICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChyZXMubWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5jYW5Hb0JhY2sgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIm1hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlc1wiXSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChcclxuICAgICAgICBlcnI/LmVycm9yPy5lcnJvciA/PyBcIkZhaWxlZCB0byBzYXZlIEZpeHR1cmUgZGV0YWlsc1wiLFxyXG4gICAgICApO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gdXBkYXRlRml4dHVyZUxpYnJhcnkgZXJyOlwiLCBlcnIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVMaWJyYXJ5KHRyYW5zZm9ybWVkRGF0YSwgdGhpcy5maXh0dXJlRGV0YWlscz8uX2lkISkuc3Vic2NyaWJlKHtcclxuICAgIC8vICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAvLyAgICAgaWYgKHJlcz8uc3RhdHVzID09PSAnc3VjY2VzcycpIHtcclxuICAgIC8vICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgLy8gICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLm1lc3NhZ2UpO1xyXG4gICAgLy8gICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydtYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXMnXSk7XHJcbiAgICAvLyAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAvLyAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yID8/IFwiRmFpbGVkIHRvIHNhdmUgRml4dHVyZSBkZXRhaWxzXCIpO1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwiQEAgfiB1cGRhdGVGaXh0dXJlTGlicmFyeSBlcnI6XCIsIGVycik7XHJcbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FuRGVhY3RpdmF0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh0aGlzLmNhbkdvQmFjaykgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Rm9ybSgpO1xyXG5cclxuICAgIGlmIChmb3JtLmRpcnR5KSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybUV4aXQoKTtcclxuXHJcbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vblN1Ym1pdChcImRyYWZ0XCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1FeGl0KCk6IFByb21pc2U8Ym9vbGVhbiB8IG51bGw+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKEV4aXRDb25maXJtYXRpb25Db21wb25lbnQsIHtcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09IFwib2tcIik7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1Db21wbGV0aW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQ29tcGxldGVDb25maXJtYXRpb25Db21wb25lbnQsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gXCJDb21wbGV0ZSBmaXh0dXJlXCI7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9XHJcbiAgICAgIFwiRml4dHVyZSBpcyBub3cgcmVhZHkgYW5kIGF2YWlsYWJsZSB0byBjcmVhdGUgYXMgdGVtcGxhdGUuXCI7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5ub3RlID1cclxuICAgICAgXCJZb3UgY2FuJ3QgZWRpdCBpdCBvbmNlIGFzc2lnbmVkIHRvIHRoZSB0ZW1wbGF0ZS5cIjtcclxuXHJcbiAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSBcIm9rXCIpO1xyXG4gIH1cclxuXHJcbiAgb25EdXBsaWNhdGUoKSB7XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2VcclxuICAgICAgLmR1cGxpY2F0ZUZpeHR1cmVMaWJyYXJ5KHtcclxuICAgICAgICBmaXh0dXJlSWQ6IHRoaXMuZml4dHVyZURldGFpbHMuX2lkLFxyXG4gICAgICB9KVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLmRhdGEubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FuR29CYWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL21hbmFnZS9wbGFub2dyYW0vY3JlYXRlLWxpYnJhcnktZml4dHVyZVwiXSwge1xyXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IGZpeHR1cmVJZDogcmVzPy5kYXRhPy5pZCB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICAgIGVycj8uZXJyb3I/LmVycm9yIHx8IFwiRmFpbGVkIHRvIGR1cGxpY2F0ZSBGaXh0dXJlXCIsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJAQCB+IGR1cGxpY2F0ZUZpeHR1cmVMaWJyYXJ5IGVycjpcIiwgZXJyKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1EZWxldGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSBcIkRlbGV0ZSBmaXh0dXJlXCI7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9XHJcbiAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGZpeHR1cmUgP1wiO1xyXG5cclxuICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09IFwib2tcIik7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkRlbGV0ZSgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLnRlbXBsYXRlSWQpIHtcclxuICAgICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQ2Fubm90UGVyZm9ybUNvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9KTtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSBgQ2Fu4oCZdCBkZWxldGUgZml4dHVyZSFgO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9IGBTaW5jZSB0aGlzIGZpeHR1cmUgaXMgbGl2ZSBpbiBcIiR7dGhpcy5maXh0dXJlRGV0YWlscy50ZW1wbGF0ZUlkfSB0ZW1wbGF0ZXMsXCIgZGVsZXRpbmcgaXMgbm90IGFsbG93ZWQuYDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghKGF3YWl0IHRoaXMuY29uZmlybURlbGV0aW9uKCkpKSByZXR1cm47XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2VcclxuICAgICAgLmRlbGV0ZUZpeHR1cmVMaWJyYXJ5KHsgZml4dHVyZUlkOiB0aGlzLmZpeHR1cmVEZXRhaWxzLl9pZCB9KVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLmNhbkdvQmFjayA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIm1hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlc1wiXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgICAgICBlcnI/LmVycm9yPy5lcnJvciB8fCBcIkZhaWxlZCB0byBkZWxldGUgRml4dHVyZVwiLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBkZWxldGVGaXh0dXJlTGlicmFyeSBlcnI6XCIsIGVycik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrRWRpdCgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLnRlbXBsYXRlSWQpIHtcclxuICAgICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQ2Fubm90UGVyZm9ybUNvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9KTtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSBgQ2Fu4oCZdCBlZGl0IGZpeHR1cmUhYDtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGVzY3JpcHRpb24gPSBgU2luY2UgdGhpcyBmaXh0dXJlIGlzIGxpdmUgaW4gXCIke3RoaXMuZml4dHVyZURldGFpbHMudGVtcGxhdGVJZH0gdGVtcGxhdGVzLFwiIGVkaXRpbmcgaXMgbm90IGFsbG93ZWQuYDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNFZGl0TW9kZSA9IHRydWU7XHJcbiAgICB0aGlzLmZsb29yRml4dHVyZUZvcm0/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLndhbGxGaXh0dXJlRm9ybT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5pc1NoZWxmU3RydWN0dXJlKCkpIHtcclxuICAgICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLmhlYWRlcj8uaXNFbmFibGVkKVxyXG4gICAgICAgIHRoaXMudG9nZ2xlU2VjdGlvbkZvcm0oXCJoZWFkZXJcIik7XHJcbiAgICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5mb290ZXI/LmlzRW5hYmxlZClcclxuICAgICAgICB0aGlzLnRvZ2dsZVNlY3Rpb25Gb3JtKFwiZm9vdGVyXCIpO1xyXG4gICAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuaXNCb2R5RW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uRm9ybShcImJvZHlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcclxuICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcclxuICAgICAgcXVlcnlQYXJhbXM6IHsgaXNFZGl0OiB0cnVlIH0sXHJcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIixcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPHNlY3Rpb24gaWQ9XCJidWlsZC1maXh0dXJlXCIgKm5nSWY9XCIhaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDwhLS0gSGVhZGVyIHNlY3Rpb24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50cy1jZW50ZXIgZ2FwLTVcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgcC0zXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXNcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuODMzNCA5Ljk5OTg0SDQuMTY2NzVNNC4xNjY3NSA5Ljk5OTg0TDEwLjAwMDEgMTUuODMzMk00LjE2Njc1IDkuOTk5ODRMMTAuMDAwMSA0LjE2NjVcIlxyXG4gICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8aDIgY2xhc3M9XCJtLTAgZWxsaXBzaXNcIiBzdHlsZT1cIm1heC13aWR0aDogY2FsYygxMDB2dyAtIDg2MHB4KVwiXHJcbiAgICAgICAgW25nYlRvb2x0aXBdPVwiZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ICsgJyAtICcgKyBmaXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGg/LnZhbHVlICsgJ2Z0J1wiPlxyXG4gICAgICAgIHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeSB9fSAtIHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udmFsdWUgfX1cclxuICAgICAgICB7eyBmaXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGg/LnVuaXQgfHwgXCJmdFwiIH19XHJcbiAgICAgIDwvaDI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZSBkcmFmdFwiPnt7IGZpeHR1cmVEZXRhaWxzLnN0YXR1cyB8IHRpdGxlY2FzZSB9fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnRzLWNlbnRlciBnYXAtNVwiPlxyXG4gICAgICA8cCBjbGFzcz1cIm0tMCB0ZXh0LW5vd3JhcFwiICpuZ0lmPVwiZml4dHVyZURldGFpbHM/LnVwZGF0ZWRBdFwiXHJcbiAgICAgICAgW25nYlRvb2x0aXBdPVwiZml4dHVyZURldGFpbHMudXBkYXRlZEF0IHwgZGF0ZSA6ICdtZWRpdW0nXCI+XHJcbiAgICAgICAgTGFzdCB1cGRhdGU6IHt7IGZpeHR1cmVEZXRhaWxzLnVwZGF0ZWRBdCB8IHRpbWVBZ28gfX1cclxuICAgICAgPC9wPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCIgKGNsaWNrKT1cIm9uQ2xpY2tFZGl0KClcIj5cclxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzEzMjJfNTMyNSlcIj5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0xNC4xNjY3IDIuNDk5OTNDMTQuMzg1NiAyLjI4MTA2IDE0LjY0NTUgMi4xMDc0NCAxNC45MzE0IDEuOTg4OTlDMTUuMjE3NCAxLjg3MDU0IDE1LjUyMzkgMS44MDk1NyAxNS44MzM0IDEuODA5NTdDMTYuMTQyOSAxLjgwOTU3IDE2LjQ0OTQgMS44NzA1NCAxNi43MzU0IDEuOTg4OTlDMTcuMDIxNCAyLjEwNzQ0IDE3LjI4MTIgMi4yODEwNiAxNy41MDAxIDIuNDk5OTNDMTcuNzE5IDIuNzE4OCAxNy44OTI2IDIuOTc4NjMgMTguMDExIDMuMjY0NkMxOC4xMjk1IDMuNTUwNTcgMTguMTkwNCAzLjg1NzA2IDE4LjE5MDQgNC4xNjY1OUMxOC4xOTA0IDQuNDc2MTIgMTguMTI5NSA0Ljc4MjYyIDE4LjAxMSA1LjA2ODU5QzE3Ljg5MjYgNS4zNTQ1NSAxNy43MTkgNS42MTQzOSAxNy41MDAxIDUuODMzMjZMNi4yNTAwOCAxNy4wODMzTDEuNjY2NzUgMTguMzMzM0wyLjkxNjc1IDEzLjc0OTlMMTQuMTY2NyAyLjQ5OTkzWlwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTMyMl81MzI1XCI+XHJcbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgRWRpdFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJpc0VkaXRNb2RlXCIgY2xhc3M9XCJkLWZsZXggZ2FwLTUganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB0ZXh0LW5vd3JhcFwiIChjbGljayk9XCJvblN1Ym1pdCgnZHJhZnQnKVwiPlNhdmUgYXMgZHJhZnQ8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LW5vd3JhcFwiIChjbGljayk9XCJvblN1Ym1pdCgnY29tcGxldGUnKVwiPkNvbXBsZXRlPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscz8uX2lkXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBwLTNcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSAxMkMxMSAxMi41NTIzIDExLjQ0NzcgMTMgMTIgMTNDMTIuNTUyMyAxMyAxMyAxMi41NTIzIDEzIDEyQzEzIDExLjQ0NzcgMTIuNTUyMyAxMSAxMiAxMUMxMS40NDc3IDExIDExIDExLjQ0NzcgMTEgMTJaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSAxOUMxMSAxOS41NTIzIDExLjQ0NzcgMjAgMTIgMjBDMTIuNTUyMyAyMCAxMyAxOS41NTIzIDEzIDE5QzEzIDE4LjQ0NzcgMTIuNTUyMyAxOCAxMiAxOEMxMS40NDc3IDE4IDExIDE4LjQ0NzcgMTEgMTlaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSA1QzExIDUuNTUyMjggMTEuNDQ3NyA2IDEyIDZDMTIuNTUyMyA2IDEzIDUuNTUyMjggMTMgNUMxMyA0LjQ0NzcyIDEyLjU1MjMgNCAxMiA0QzExLjQ0NzcgNCAxMSA0LjQ0NzcyIDExIDVaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPlxyXG4gICAgICAgICAgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvbkR1cGxpY2F0ZSgpXCIgKm5nSWY9XCIhaXNFZGl0TW9kZVwiPkR1cGxpY2F0ZTwvYT48L2xpPlxyXG4gICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gY3Vyc29yLXBvaW50ZXIgdGV4dC1kYW5nZXJcIiAoY2xpY2spPVwib25EZWxldGUoKVwiPiBEZWxldGUgPC9hPlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFNoZWxmLXN0cnVjdHVyZWQgZml4dHVyZSAoV2FsbCwgb3IgRmxvb3Igd2l0aCBzaGVsZiBzdWItdHlwZSkgLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBnYXAtNCBidWlsZGVyXCIgKm5nSWY9XCJpc1NoZWxmU3RydWN0dXJlKClcIj5cclxuICAgIDwhLS0gV2FsbCBGaXh0dXJlIEZvcm0gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29scyBjb2xcIj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8aDI+Rml4dHVyZSBEZXRhaWxzPC9oMj5cclxuICAgICAgICA8cD5Db25maWd1cmUgeW91ciBmaXh0dXJlIGRldGFpbHMgaGVyZTwvcD5cclxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cIndhbGxGaXh0dXJlRm9ybVwiPlxyXG4gICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb24gI2FjY29yZGlvbj1cIm5nYkFjY29yZGlvblwiPlxyXG4gICAgICAgICAgICA8IS0tIEJhc2ljIERldGFpbHMgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImRldGFpbHNcIiBbY29sbGFwc2VkXT1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlcj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPkJBU0lDIERFVEFJTFM8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCIgZm9ybUdyb3VwTmFtZT1cImJhc2ljRGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZpeHR1cmVDYXRlZ29yeVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+Rml4dHVyZSBuYW1lPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImZpeHR1cmVDYXRlZ29yeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZml4dHVyZUNhdGVnb3J5XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LmludmFsaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeHR1cmUgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXh0dXJlIG5hbWUgY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5oYXNFcnJvcigndHJpbVNwYWNlcycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYWxsb3dlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ2Zsb29yJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTJcIj5TdWItdHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIGlkPVwic3ViVHlwZVBhbmVsU2hlbGZcIiBuYW1lPVwiZmxvb3JTdWJUeXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZml4dHVyZURldGFpbHMuZml4dHVyZVN1YlR5cGUgPT09ICdwYW5lbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRWRpdE1vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmxvb3JTdWJUeXBlQ2hhbmdlKCdwYW5lbCcpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJzdWJUeXBlUGFuZWxTaGVsZlwiPlBhbmVsPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIGlkPVwic3ViVHlwZVNoZWxmU2hlbGZcIiBuYW1lPVwiZmxvb3JTdWJUeXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZml4dHVyZURldGFpbHMuZml4dHVyZVN1YlR5cGUgPT09ICdzaGVsZidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRWRpdE1vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmxvb3JTdWJUeXBlQ2hhbmdlKCdzaGVsZicpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJzdWJUeXBlU2hlbGZTaGVsZlwiPlNoZWxmPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCB3aWR0aCAoXCIgKyAoZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwid2lkdGhcIiBbc3RlcF09XCIwLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJhbGwgd2lkdGggY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCBoZWlnaHQgKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJsZW5ndGhcIiBbc3RlcF09XCIwLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/LmludmFsaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyYWxsIGhlaWdodCBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBIZWFkZXIgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc0hlYWRlckVuYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlY3Rpb24oJ2hlYWRlcicpOyB3YWxsRml4dHVyZUZvcm0ubWFya0FzRGlydHkoKVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtcy00XCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0VkaXRNb2RlXCIgLz5cclxuICAgICAgICAgICAgICAgIDxoMiBuZ2JBY2NvcmRpb25IZWFkZXIgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkFjY29yZGlvbkJ1dHRvbj5IRUFERVI8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiBmb3JtR3JvdXBOYW1lPVwiaGVhZGVyXCIgW2NsYXNzLmRpc2FibGVkXT1cIiFpc0hlYWRlckVuYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiSGVpZ2h0IChcIiArIChmaXh0dXJlRGV0YWlscy5oZWFkZXI/LmhlaWdodD8udW5pdCB8fCBcImZ0XCIpICsgXCIpXCIgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJoZWlnaHRcIiBbc3RlcF09XCIwLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2hlYWRlci5oZWlnaHQnKT8udG91Y2hlZCAmJiB3YWxsRml4dHVyZUZvcm0uZ2V0KCdoZWFkZXIuaGVpZ2h0Jyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2hlYWRlci5oZWlnaHQnKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyIGhlaWdodCBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBCb2R5IFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImJvZHlcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiIFtjaGVja2VkXT1cImlzQm9keUVuYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlY3Rpb24oJ2JvZHknKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbXMtNFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+Qk9EWTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJib2R5XCIgW2NsYXNzLmRpc2FibGVkXT1cIiFpc0JvZHlFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHNoZWx2ZXM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWNvbnRhaW5lclwiIFtjbGFzcy5kaXNhYmxlLWNvdW50ZXJdPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgcm9sZT1cImJ1dHRvblwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTUgMTRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiAoY2xpY2spPVwicmVtb3ZlU2hlbGYoKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjc2Mjk0IDdIMTEuOTI5NlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBzaGVsZkFycmF5Lmxlbmd0aCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgcm9sZT1cImJ1dHRvblwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTUgMTRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiAoY2xpY2spPVwiYWRkU2hlbGYoKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjE1Mzg5IDIuOTE2NVYxMS4wODMyTTMuMDcwNTYgNi45OTk4NEgxMS4yMzcyXCIgc3Ryb2tlPVwiIzY2NzA4NVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzaGVsZkFycmF5Lmxlbmd0aCA8IDEgJiYgaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBzaGVsZiBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkYXRhbGlzdCBpZD1cIndhbGxab25lT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB6b25lIG9mIHdhbGxab25lc1wiIFt2YWx1ZV09XCJ6b25lLnZhbHVlXCI+PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2RhdGFsaXN0PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaGVsZkFycmF5Py5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgdGV4dC1ub3dyYXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImF1dG9Bc3NpZ25XYWxsWm9uZXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG8tem9uZSBzaGVsdmVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNoZWxmQXJyYXk/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJzaGVsZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNoZWxmIG9mIHNoZWxmQXJyYXk/LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFycmF5LWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cInNoZWxmLXRpdGxlXCI+U2hlbGYge3sgaSArIDEgfX08L2g2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVNoZWxmKGkpOyB3YWxsRml4dHVyZUZvcm0ubWFya0FzRGlydHkoKVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTggNkw2IDE4TTYgNkwxOCAxOFwiIHN0cm9rZT1cIiM5OEEyQjNcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cInNoZWxmVHlwZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWItMVwiPlpvbmU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInpvbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q9XCJ3YWxsWm9uZU9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBUb3AsIE1pZCwgQm90dG9tXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaGVsZi5nZXQoJ3R5cGUnKT8udmFsdWUgPT09ICd0cmF5J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5ObyBvZiByb3dzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cIm5vT2ZSb3dzXCIgW3N0ZXBdPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNoZWxmLmdldCgnbm9PZlJvd3MnKT8udG91Y2hlZCAmJiBzaGVsZi5nZXQoJ25vT2ZSb3dzJyk/LmVycm9yc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwic2hlbGYuZ2V0KCdub09mUm93cycpPy5oYXNFcnJvcignbWluJylcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgYXQgbGVhc3QgMSByb3cuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNoZWxmLmdldCgndHlwZScpPy52YWx1ZSAhPT0gJ3Ztb25seSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlByb2R1Y3QgY2FwYWNpdHkgZm9yIGVhY2ggcm93PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdENhcGFjaXR5XCIgW3N0ZXBdPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNoZWxmLmdldCgndHlwZScpPy52YWx1ZSAhPT0gJ3Ztb25seScgJiYgc2hlbGYuZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udG91Y2hlZCAmJiBzaGVsZi5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInNoZWxmLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2R1Y3QgY2FwYWNpdHkgY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRm9vdGVyIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImZvb3RlclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2Rpc2FibGVkXT1cIiFpc0VkaXRNb2RlXCIgW2NoZWNrZWRdPVwiaXNGb290ZXJFbmFibGVkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWN0aW9uKCdmb290ZXInKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbXMtNFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+Rk9PVEVSPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCIgZm9ybUdyb3VwTmFtZT1cImZvb3RlclwiIFtjbGFzcy5kaXNhYmxlZF09XCIhaXNGb290ZXJFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIkhlaWdodCAoXCIgKyAoZml4dHVyZURldGFpbHMuZm9vdGVyPy5oZWlnaHQ/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwiaGVpZ2h0XCIgW3N0ZXBdPVwiMC41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdmb290ZXIuaGVpZ2h0Jyk/LnRvdWNoZWQgJiYgd2FsbEZpeHR1cmVGb3JtLmdldCgnZm9vdGVyLmhlaWdodCcpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdmb290ZXIuaGVpZ2h0Jyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEZvb3RlciBoZWlnaHQgY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZm9ybT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFdhbGwgRml4dHVyZSBQcmV2aWV3IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sLThcIj5cclxuICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogY2FsYyg3NXZoIC0gMTIwcHgpOyBvdmVyZmxvdy15OiBhdXRvXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImlzQm9keUVuYWJsZWQgfHwgaXNIZWFkZXJFbmFibGVkIHx8IGlzRm9vdGVyRW5hYmxlZDsgZWxzZSBlbXB0eUZpeHR1cmVcIlxyXG4gICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciB3LTEwMFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWRpbWVuc2lvblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgdXBcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpbmVcIj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8udmFsdWUgYXMgbGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBsZW5ndGggfX0ge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgZG93blwiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIndhbGwtdmlld3BvcnRcIj5cclxuICAgICAgICAgICAgPCEtLSBIZWFkZXIgUHJldmlldyAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiXHJcbiAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbkFycm93cztcclxuICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udmFsdWVcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC01XCIgKm5nSWY9XCJpc0hlYWRlckVuYWJsZWRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1ibG9ja1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgPHA+SEVBREVSPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQm9keSBQcmV2aWV3IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS1ibG9ja1wiICpuZ0lmPVwiaXNCb2R5RW5hYmxlZCAmJiBzaGVsZkFycmF5Lmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC01IHNoZWxmQ29udGFpbmVyXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2hlbGZBcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgQGlmKGl0ZW0uZ2V0KCd0eXBlJyk/LnZhbHVlID09PSd0cmF5Jyl7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5nZXQoJ25vT2ZSb3dzJyk/LnZhbHVlKVwiIGNsYXNzPVwidHJheSBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udmFsdWUpXCIgY2xhc3M9XCJwcm9kdWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib2R5LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICBUUkFZIHt7IGkgKyAxIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPGIgY2xhc3M9XCJtcy0zXCI+UHJvZHVjdHM6XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgKiAoaXRlbS5nZXQoXCJub09mUm93c1wiKT8udmFsdWUgPz8gMSkgfX08L2I+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJsb2NrIHNoZWxmXCIgW2NsYXNzLnZtb25seS1wbGFjZWhvbGRlcl09XCJpdGVtLmdldCgndHlwZScpPy52YWx1ZSA9PT0ndm1vbmx5J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy52YWx1ZSlcIiBjbGFzcz1cInByb2R1Y3RcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib2R5LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS5nZXQoJ3R5cGUnKT8udmFsdWUgPT09J3Ztb25seScgPyAgJ1ZNIE9OTFknOiAnU0hFTEYnfX0ge3sgaSArIDEgfX0gPGJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtcy0zXCI+UHJvZHVjdHM6IHt7IGl0ZW0uZ2V0KFwicHJvZHVjdENhcGFjaXR5XCIpPy52YWx1ZSB9fTwvYj5cclxuICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRm9vdGVyIFByZXZpZXcgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTVcIiAqbmdJZj1cImlzRm9vdGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyIGZvb3Rlci1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTAgaC0xMDAgZ2FwLTMgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBzdWItZm9vdGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgc3ViLWZvb3RlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICA8cD5GT09URVI8L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eUZpeHR1cmU+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtbiBoLTEwMFwiPlxyXG4gICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyY1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YW1haW50ZXh0IG10LTNcIj5QcmV2aWV3IHJlcXVpcmVzIGhlYWRlciwgZm9vdGVyLCBvciBib2R5IGJsb2NrIGVuYWJsZWQuPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFzdWJ0ZXh0XCI+UGxlYXNlIGVuYWJsZSBlaXRoZXIgdGhlIGhlYWRlciwgZm9vdGVyLCBvciBib2R5IHRvIHZpZXcgdGhlIHByZXZpZXcuLjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIEluZm8gQ2FyZHMgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGluZm8tY2FyZFwiPlxyXG4gICAgICAgICAgPGgzPnt7IHNoZWxmQXJyYXkubGVuZ3RoIH19PC9oMz5cclxuICAgICAgICAgIDxwPk5vIG9mIFNoZWx2ZXM8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyB0b3RhbFByb2R1Y3RDYXBhY2l0eSB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5Qcm9kdWN0IENhcGFjaXR5PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgfCB0aXRsZWNhc2UgfX0gZml4dHVyZTwvaDM+XHJcbiAgICAgICAgICA8cD5UeXBlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgIHt7IHdhbGxGaXh0dXJlRm9ybS5nZXQoXCJiYXNpY0RldGFpbHMud2lkdGhcIik/LnZhbHVlIH19IHhcclxuICAgICAgICAgICAge3sgd2FsbEZpeHR1cmVGb3JtLmdldChcImJhc2ljRGV0YWlscy5sZW5ndGhcIik/LnZhbHVlIH19IGZlZXRcclxuICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICA8cD5PdmVyYWxsIERpbWVuc2lvbjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBGbG9vciBwYW5lbC1zdHJ1Y3R1cmVkIGZpeHR1cmUgLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBnYXAtNCBidWlsZGVyXCIgKm5nSWY9XCJpc1BhbmVsU3RydWN0dXJlKClcIj5cclxuICAgIDwhLS0gRmxvb3IgUGFuZWwgRm9ybSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbFwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxoMj5GaXh0dXJlIERldGFpbHM8L2gyPlxyXG4gICAgICAgIDxwPlRoZSBzZXR0aW5ncyBhcmUgcHJlLWNvbmZpZ3VyZWQgYW5kIGNhbm5vdCBiZSBlZGl0ZWQ8L3A+XHJcbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmbG9vckZpeHR1cmVGb3JtXCI+XHJcbiAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbiAjYWNjb3JkaW9uPVwibmdiQWNjb3JkaW9uXCI+XHJcbiAgICAgICAgICAgIDwhLS0gQmFzaWMgRGV0YWlscyAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiZGV0YWlsc1wiIFtjb2xsYXBzZWRdPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+QkFTSUMgREVUQUlMUzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiBmb3JtR3JvdXBOYW1lPVwiYmFzaWNEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZml4dHVyZUNhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5GaXh0dXJlIG5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZml4dHVyZUNhdGVnb3J5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ2F0ZWdvcnlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4dHVyZSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXh0dXJlIG5hbWUgY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTJcIj5TdWItdHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIGlkPVwic3ViVHlwZVBhbmVsUGFuZWxcIiBuYW1lPVwiZmxvb3JTdWJUeXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZml4dHVyZURldGFpbHMuZml4dHVyZVN1YlR5cGUgPT09ICdwYW5lbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRWRpdE1vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmxvb3JTdWJUeXBlQ2hhbmdlKCdwYW5lbCcpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJzdWJUeXBlUGFuZWxQYW5lbFwiPlBhbmVsPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIGlkPVwic3ViVHlwZVNoZWxmUGFuZWxcIiBuYW1lPVwiZmxvb3JTdWJUeXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZml4dHVyZURldGFpbHMuZml4dHVyZVN1YlR5cGUgPT09ICdzaGVsZidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRWRpdE1vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmxvb3JTdWJUeXBlQ2hhbmdlKCdzaGVsZicpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJzdWJUeXBlU2hlbGZQYW5lbFwiPlNoZWxmPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCB3aWR0aCAoXCIgKyAoZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwid2lkdGhcIiBbc3RlcF09XCIwLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LmludmFsaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyYWxsIHdpZHRoIGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCBsZW5ndGggKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJsZW5ndGhcIiBbc3RlcF09XCIwLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8uaW52YWxpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyYWxsIGhlaWdodCBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBQYW5lbCBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJwYW5lbFwiPlxyXG4gICAgICAgICAgICAgIDxoMiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkFjY29yZGlvbkJ1dHRvbj5QQU5FTDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5ObyBvZiBwYW5lbHM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1jb250YWluZXJcIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHJvbGU9XCJidXR0b25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE1IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIChjbGljayk9XCJyZW1vdmVQYW5lbCgpOyBmbG9vckZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy43NjI5NCA3SDExLjkyOTZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHBhbmVsQXJyYXkubGVuZ3RoIH19PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHJvbGU9XCJidXR0b25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE1IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIChjbGljayk9XCJhZGRQYW5lbCgpOyBmbG9vckZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4xNTM4OSAyLjkxNjVWMTEuMDgzMk0zLjA3MDU2IDYuOTk5ODRIMTEuMjM3MlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbEFycmF5Lmxlbmd0aCA8IDEgJiYgaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBBdCBsZWFzdCBvbmUgcGFuZWwgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGF0YWxpc3QgaWQ9XCJmbG9vclpvbmVPcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB6b25lIG9mIGZsb29yWm9uZXNcIiBbdmFsdWVdPVwiem9uZS52YWx1ZVwiPjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGF0YWxpc3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYW5lbEFycmF5Py5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInBhbmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHBhbmVsIG9mIHBhbmVsQXJyYXk/LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcnJheS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cInNoZWxmLXRpdGxlXCI+UGFuZWwge3sgaSArIDEgfX08L2g2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgKGNsaWNrKT1cInJlbW92ZVBhbmVsKGkpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE4IDZMNiAxOE02IDZMMTggMThcIiBzdHJva2U9XCIjOThBMkIzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicGFuZWxOYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwicGFuZWxOYW1lXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYW5lbC5nZXQoJ3BhbmVsTmFtZScpPy50b3VjaGVkICYmIHBhbmVsLmdldCgncGFuZWxOYW1lJyk/LmVycm9yc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwicGFuZWwuZ2V0KCdwYW5lbE5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lbCBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwicGFuZWwuZ2V0KCdwYW5lbE5hbWUnKT8uaGFzRXJyb3IoJ3doaXRlc3BhY2UnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhbmVsIG5hbWUgY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInBhbmVsLmdldCgncGFuZWxOYW1lJyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYWxsb3dlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWItMVwiPlpvbmU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ6b25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdD1cImZsb29yWm9uZU9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gQWxsLCBUb3AsIE1pZCwgQm90dG9tXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHJvd3M8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwibm9PZlJvd3NcIiBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFuZWwuZ2V0KCdub09mUm93cycpPy50b3VjaGVkICYmIHBhbmVsLmdldCgnbm9PZlJvd3MnKT8uZXJyb3JzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwicGFuZWwuZ2V0KCdub09mUm93cycpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSBhdCBsZWFzdCAxIHJvdy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Qcm9kdWN0IGNhcGFjaXR5IGZvciBlYWNoIHJvdzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0Q2FwYWNpdHlcIiBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicGFuZWwuZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udG91Y2hlZCAmJiBwYW5lbC5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbC5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdCBjYXBhY2l0eSBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBGbG9vciBQYW5lbCBQcmV2aWV3IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sLThcIj5cclxuICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogY2FsYyg3NXZoIC0gMTIwcHgpOyBvdmVyZmxvdy15OiBhdXRvXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInBhbmVsQXJyYXkuY29udHJvbHMubGVuZ3RoOyBlbHNlIG5vUGFuZWxcIiBjbGFzcz1cImZsb29yLXBhbmVsLXZpZXdwb3J0IHctMTAwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcGFuZWxBcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZC1mbGV4IGdhcC01XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWRpbWVuc2lvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/LnZhbHVlIGFzIGxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGxlbmd0aCB9fSB7eyBmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIiB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBkb3duXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25BcnJvd3M7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udmFsdWVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIFwiPjwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGVsZkNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdub09mUm93cycpPy52YWx1ZSlcIiBjbGFzcz1cInBhbmVsIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy52YWx1ZSlcIiBjbGFzcz1cInByb2R1Y3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgUEFORUwge3sgaSArIDEgfX1cclxuICAgICAgICAgICAgICAgIDxiIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOlxyXG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgKiAoaXRlbS5nZXQoXCJub09mUm93c1wiKT8udmFsdWUgPz8gMSkgfX08L2I+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTUgbXQtNVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDI0cHhcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDY0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDUzMCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk01MjIuNjUzIDAuMjkyODkzQzUyMi4yNjMgLTAuMDk3NjMxNSA1MjEuNjMgLTAuMDk3NjMxNCA1MjEuMjM5IDAuMjkyODkzTDUxNC44NzUgNi42NTY4NUM1MTQuNDg1IDcuMDQ3MzggNTE0LjQ4NSA3LjY4MDU0IDUxNC44NzUgOC4wNzEwN0M1MTUuMjY2IDguNDYxNTkgNTE1Ljg5OSA4LjQ2MTU5IDUxNi4yODkgOC4wNzEwN0w1MjEuOTQ2IDIuNDE0MjFMNTI3LjYwMyA4LjA3MTA3QzUyNy45OTQgOC40NjE1OSA1MjguNjI3IDguNDYxNTkgNTI5LjAxNyA4LjA3MTA3QzUyOS40MDggNy42ODA1NCA1MjkuNDA4IDcuMDQ3MzggNTI5LjAxNyA2LjY1Njg1TDUyMi42NTMgMC4yOTI4OTNaTTUyMi45NDYgMTRMNTIyLjk0NiAxTDUyMC45NDYgMUw1MjAuOTQ2IDE0TDUyMi45NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0zOTQuMTUzIDAuMjkyODkzQzM5My43NjMgLTAuMDk3NjMxNSAzOTMuMTMgLTAuMDk3NjMxNCAzOTIuNzM5IDAuMjkyODkzTDM4Ni4zNzUgNi42NTY4NUMzODUuOTg1IDcuMDQ3MzggMzg1Ljk4NSA3LjY4MDU0IDM4Ni4zNzUgOC4wNzEwN0MzODYuNzY2IDguNDYxNTkgMzg3LjM5OSA4LjQ2MTU5IDM4Ny43ODkgOC4wNzEwN0wzOTMuNDQ2IDIuNDE0MjFMMzk5LjEwMyA4LjA3MTA3QzM5OS40OTQgOC40NjE1OSA0MDAuMTI3IDguNDYxNTkgNDAwLjUxNyA4LjA3MTA3QzQwMC45MDggNy42ODA1NCA0MDAuOTA4IDcuMDQ3MzggNDAwLjUxNyA2LjY1Njg1TDM5NC4xNTMgMC4yOTI4OTNaTTM5NC40NDYgMTRMMzk0LjQ0NiAxTDM5Mi40NDYgMUwzOTIuNDQ2IDE0TDM5NC40NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0yNjUuNjUzIDAuMjkyODkzQzI2NS4yNjMgLTAuMDk3NjMxNSAyNjQuNjMgLTAuMDk3NjMxNCAyNjQuMjM5IDAuMjkyODkzTDI1Ny44NzUgNi42NTY4NUMyNTcuNDg1IDcuMDQ3MzggMjU3LjQ4NSA3LjY4MDU0IDI1Ny44NzUgOC4wNzEwN0MyNTguMjY2IDguNDYxNTkgMjU4Ljg5OSA4LjQ2MTU5IDI1OS4yODkgOC4wNzEwN0wyNjQuOTQ2IDIuNDE0MjFMMjcwLjYwMyA4LjA3MTA3QzI3MC45OTQgOC40NjE1OSAyNzEuNjI3IDguNDYxNTkgMjcyLjAxNyA4LjA3MTA3QzI3Mi40MDggNy42ODA1NCAyNzIuNDA4IDcuMDQ3MzggMjcyLjAxNyA2LjY1Njg1TDI2NS42NTMgMC4yOTI4OTNaTTI2NS45NDYgMTRMMjY1Ljk0NiAxTDI2My45NDYgMUwyNjMuOTQ2IDE0TDI2NS45NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0xMzcuMTUzIDAuMjkyODkzQzEzNi43NjMgLTAuMDk3NjMxNSAxMzYuMTMgLTAuMDk3NjMxNCAxMzUuNzM5IDAuMjkyODkzTDEyOS4zNzUgNi42NTY4NUMxMjguOTg1IDcuMDQ3MzggMTI4Ljk4NSA3LjY4MDU0IDEyOS4zNzUgOC4wNzEwN0MxMjkuNzY2IDguNDYxNTkgMTMwLjM5OSA4LjQ2MTU5IDEzMC43ODkgOC4wNzEwN0wxMzYuNDQ2IDIuNDE0MjFMMTQyLjEwMyA4LjA3MTA3QzE0Mi40OTQgOC40NjE1OSAxNDMuMTI3IDguNDYxNTkgMTQzLjUxNyA4LjA3MTA3QzE0My45MDggNy42ODA1NCAxNDMuOTA4IDcuMDQ3MzggMTQzLjUxNyA2LjY1Njg1TDEzNy4xNTMgMC4yOTI4OTNaTTEzNy40NDYgMTRMMTM3LjQ0NiAxTDEzNS40NDYgMUwxMzUuNDQ2IDE0TDEzNy40NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk04LjY1MzQgMC4yOTI4OTNDOC4yNjI4NyAtMC4wOTc2MzE1IDcuNjI5NzEgLTAuMDk3NjMxNCA3LjIzOTE4IDAuMjkyODkzTDAuODc1MjIxIDYuNjU2ODVDMC40ODQ2OTcgNy4wNDczOCAwLjQ4NDY5NyA3LjY4MDU0IDAuODc1MjIxIDguMDcxMDdDMS4yNjU3NSA4LjQ2MTU5IDEuODk4OTEgOC40NjE1OSAyLjI4OTQzIDguMDcxMDdMNy45NDYyOSAyLjQxNDIxTDEzLjYwMzEgOC4wNzEwN0MxMy45OTM3IDguNDYxNTkgMTQuNjI2OCA4LjQ2MTU5IDE1LjAxNzQgOC4wNzEwN0MxNS40MDc5IDcuNjgwNTQgMTUuNDA3OSA3LjA0NzM4IDE1LjAxNzQgNi42NTY4NUw4LjY1MzQgMC4yOTI4OTNaTTguOTQ2MjkgMTRMOC45NDYyOSAxTDYuOTQ2MjkgMUw2Ljk0NjI5IDE0TDguOTQ2MjkgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNTdcIiBoZWlnaHQ9XCI0M1wiIHZpZXdCb3g9XCIwIDAgNTcgNDNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMC40Mzk2OTcgMzEuODA4N0MwLjQzOTY5NyAyNi44NjQgNC40NDgyIDIyLjg1NTUgOS4zOTI5NCAyMi44NTU1SDQ3LjQ2ODFDNTIuNDIzIDIyLjg1NTUgNTYuNDM5NyAyNi44NzIyIDU2LjQzOTcgMzEuODI3QzU2LjQzOTcgMzcuMzI1NSA1MS41MzczIDQxLjQ5OTQgNDYuMDc2NSA0MC44NTcxQzMzLjYzMTggMzkuMzkzNSAyMy43MjY3IDM5LjMyMDYgMTAuODE4NiA0MC44Mzc2QzUuMzU1NDIgNDEuNDc5NiAwLjQzOTY5NyAzNy4zMDk1IDAuNDM5Njk3IDMxLjgwODdaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxRDI5MzlcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjI4LjQ0MDhcIiBjeT1cIjE2LjU3MTRcIiByPVwiMTUuMDcxNFwiIGZpbGw9XCIjMUQyOTM5XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIzXCIgLz5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub1BhbmVsPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW4gaC0xMDBcIj5cclxuICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFtYWludGV4dCBtdC0zXCI+QWRkIGEgcGFuZWwgdG8gc2VlIHlvdXIgcHJldmlldy48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YXN1YnRleHRcIj5UbyBzZWUgeW91ciBwcmV2aWV3LCBwbGVhc2UgYWRkIGF0IGxlYXN0IG9uZSBwYW5lbC48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBJbmZvIENhcmRzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC0yXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyBwYW5lbEFycmF5Lmxlbmd0aCB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5ObyBvZiBQYW5lbHM8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyB0b3RhbFByb2R1Y3RDYXBhY2l0eSB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5Qcm9kdWN0IENhcGFjaXR5PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgfCB0aXRsZWNhc2UgfX0gZml4dHVyZTwvaDM+XHJcbiAgICAgICAgICA8cD5UeXBlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgIHt7IGZsb29yRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpPy52YWx1ZSB9fSB4XHJcbiAgICAgICAgICAgIHt7IGZsb29yRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLmxlbmd0aFwiKT8udmFsdWUgfX1cclxuICAgICAgICAgICAge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX1cclxuICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICA8cD5PdmVyYWxsIERpbWVuc2lvbjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG5cclxuPHNlY3Rpb24gaWQ9XCJidWlsZC1maXh0dXJlLXNrZWxldG9uXCIgKm5nSWY9XCJpc1BhZ2VMb2FkaW5nXCI+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcbjwhLS0gQ29tbW9uIGRpbWVuc2lvbiBhcnJvd3MgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZGltZW5zaW9uQXJyb3dzIGxldC1sYWJlbD1cImxhYmVsXCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cclxuICA8ZGl2IGNsYXNzPVwiaG9yaXpvbnRhbC1kaW1lbnNpb25cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBsZWZ0XCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cInZhbHVlXCI+e3sgdmFsdWUgfX0ge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyByaWdodFwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|