tango-app-ui-store-builder 1.2.8 → 1.2.10
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/manage-store-plano/manage-store-plano.component.mjs +34 -12
- package/esm2022/lib/components/manage-store-plano/verification-feedback/zone-editable-fixture/zone-editable-fixture.component.mjs +90 -8
- package/esm2022/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.mjs +3 -3
- package/esm2022/lib/components/onboard-store-plano/onboard-store-plano.component.mjs +19 -3
- package/esm2022/lib/components/plano-tools/allow-edit/allow-edit.component.mjs +14 -4
- package/esm2022/lib/components/plano-tools/delete-floor/delete-floor.component.mjs +252 -0
- package/esm2022/lib/components/plano-tools/tools-parent/tools-parent.component.mjs +3 -3
- package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +8 -3
- package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +21 -5
- package/esm2022/lib/components/planogram/plano-table/plano-table.component.mjs +5 -4
- package/esm2022/lib/components/popups/publish-plano-modal/publish-plano-modal.component.mjs +10 -4
- package/esm2022/lib/components/store-plano/store-plano.component.mjs +9 -2
- package/esm2022/lib/interfaces/planogram.interface.mjs +1 -1
- package/esm2022/lib/services/store-builder.service.mjs +12 -3
- package/esm2022/lib/tango-store-builder-routing.module.mjs +6 -1
- package/esm2022/lib/tango-store-builder.module.mjs +4 -1
- package/fesm2022/tango-app-ui-store-builder.mjs +462 -41
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +3 -1
- package/lib/components/manage-store-plano/verification-feedback/zone-editable-fixture/zone-editable-fixture.component.d.ts +14 -1
- package/lib/components/onboard-store-plano/onboard-store-plano.component.d.ts +2 -0
- package/lib/components/plano-tools/allow-edit/allow-edit.component.d.ts +2 -0
- package/lib/components/plano-tools/delete-floor/delete-floor.component.d.ts +85 -0
- package/lib/components/planogram/plano-details-parent/plano-details-parent.component.d.ts +2 -0
- package/lib/components/planogram/plano-overview/plano-overview.component.d.ts +1 -0
- package/lib/components/popups/publish-plano-modal/publish-plano-modal.component.d.ts +2 -0
- package/lib/interfaces/planogram.interface.d.ts +1 -0
- package/lib/services/store-builder.service.d.ts +15 -2
- package/lib/tango-store-builder.module.d.ts +59 -58
- package/package.json +1 -1
|
@@ -3023,9 +3023,25 @@ export class OnboardStorePlanoComponent {
|
|
|
3023
3023
|
this.cd.detectChanges();
|
|
3024
3024
|
this.updateEntranceCoordinates();
|
|
3025
3025
|
}
|
|
3026
|
+
isAddingFixture = false;
|
|
3026
3027
|
async addNewFixture(fixtureType, wallIndex) {
|
|
3027
3028
|
if (this.layoutForm.disabled)
|
|
3028
3029
|
return;
|
|
3030
|
+
// Re-entry guard: getTemplate awaits an HTTP call, and a double-fired click
|
|
3031
|
+
// (or rapid second click) would race past the await with the same
|
|
3032
|
+
// existingFixtures snapshot, computing the same placement and pushing two
|
|
3033
|
+
// fixtures at identical coordinates.
|
|
3034
|
+
if (this.isAddingFixture)
|
|
3035
|
+
return;
|
|
3036
|
+
this.isAddingFixture = true;
|
|
3037
|
+
try {
|
|
3038
|
+
await this.addNewFixtureInternal(fixtureType, wallIndex);
|
|
3039
|
+
}
|
|
3040
|
+
finally {
|
|
3041
|
+
this.isAddingFixture = false;
|
|
3042
|
+
}
|
|
3043
|
+
}
|
|
3044
|
+
async addNewFixtureInternal(fixtureType, wallIndex) {
|
|
3029
3045
|
const template = await this.getTemplate(this.fixtureTemplates[0]._id);
|
|
3030
3046
|
const templateData = template.data;
|
|
3031
3047
|
const fixtureId = `new-${crypto.randomUUID()}`;
|
|
@@ -4215,11 +4231,11 @@ export class OnboardStorePlanoComponent {
|
|
|
4215
4231
|
this.destroy$.complete();
|
|
4216
4232
|
}
|
|
4217
4233
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OnboardStorePlanoComponent, deps: [{ token: i1.StoreBuilderService }, { token: i2.ActivatedRoute }, { token: i3.FormBuilder }, { token: i4.GlobalStateService }, { token: i5.TitleCasePipe }, { token: i6.ToastService }, { token: i7.NgbModal }, { token: i4.PageInfoService }, { token: i5.Location }, { token: i2.Router }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
4218
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OnboardStorePlanoComponent, selector: "lib-onboard-store-plano", host: { listeners: { "window:resize": "onResize()" } }, providers: [TitleCasePipe], viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["baseCanvas"], descendants: true }, { propertyName: "containerRef", first: true, predicate: ["canvasContainer"], descendants: true }, { propertyName: "applyLogicsModalRef", first: true, predicate: ["applyLogics"], descendants: true }, { propertyName: "approveLayoutModalRef", first: true, predicate: ["approveLayoutModal"], descendants: true }, { propertyName: "revertAllocationModalRef", first: true, predicate: ["revertAllocationModal"], descendants: true }, { propertyName: "completeAllocationModalRef", first: true, predicate: ["completeAllocationModal"], descendants: true }, { propertyName: "bodyAccordion", first: true, predicate: ["bodyAccordion"], descendants: true }], ngImport: i0, template: "<section id=\"onboard-plano\">\r\n <!-- Loading State -->\r\n <div *ngIf=\"isPageLoading\" class=\"row\">\r\n <div class=\"col-12 m-0\">\r\n <ng-container *ngTemplateOutlet=\"headerSkeleton\"></ng-container>\r\n </div>\r\n <div class=\"col-3\">\r\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n </div>\r\n <div class=\"col-6\">\r\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n </div>\r\n <div class=\"col-3\">\r\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Content -->\r\n <div [ngClass]=\"{ 'd-none': isPageLoading }\">\r\n <!-- Header Accordion -->\r\n <div id=\"header\" ngbAccordion #accordion=\"ngbAccordion\" class=\"my-4\">\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <div ngbAccordionHeader class=\"d-flex justify-content-between align-items-center px-6 py-3\">\r\n <div class=\"d-flex gap-4 align-items-center\">\r\n <div style=\"margin-left:5px;\" *ngIf=\"planoData?.storeName\">\r\n <h2 class='title'>{{planoData?.storeName}} - Plano</h2>\r\n </div>\r\n <lib-reactive-select *ngIf=\"floorsList.length\" [formControl]=\"selectedFloorId\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorsList\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center gap-4\">\r\n <div *ngIf=\"!editFixture\" class=\"updateClass\">Last Update: {{floorData?.updatedAt}}</div>\r\n\r\n <div class=\"d-flex gap-4 align-items-center\">\r\n <!-- Edit Fixture Mode -->\r\n <ng-container *ngIf=\"editFixture\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\"\r\n (click)=\"onFixturePageCancel()\">\r\n Cancel\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onFixtureSave()\">\r\n Save & Close\r\n </button>\r\n </ng-container>\r\n <button ngbAccordionButton></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div id=\"header\" class=\"row mx-0 gap-3\">\r\n <!-- Plano Completion -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <h3 class=\"d-flex align-items-center gap-2\">\r\n Plano Completion %\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n fill=\"none\" ngbTooltip=\"% of overall planogram completion\">\r\n <g clip-path=\"url(#clip0_1517_129805)\">\r\n <path\r\n d=\"M9 12V9M9 6H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1517_129805\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </h3>\r\n <div class=\"row align-items-center mt-2\">\r\n <div class=\"col-9\">\r\n <div class=\"progress\" style=\"height: 4px\">\r\n <div class=\"progress-bar\" [ngClass]=\"\r\n [25, 50].includes(getProgressValue) ? 'bg-warning' : 'bg-success'\" role=\"progressbar\"\r\n [style]=\"'width:' + getProgressValue + '%'\"\r\n [attr.aria-valuenow]=\"getProgressValue\" aria-valuemin=\"0\"\r\n aria-valuemax=\"100\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-3\">{{ getProgressValue }}%</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Layout -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <h3><b>{{floorData?.floorNumber}}/{{ planoData?.floors?.length }}</b> Layout</h3>\r\n <div class=\"indicator mt-2\"\r\n [ngClass]=\"getStatus === 'allocationPending' ? 'completed' : 'draft'\">\r\n {{ getStatus === 'allocationPending' ? 'Completed' : 'Draft' }}\r\n </div>\r\n </div>\r\n\r\n <!-- Fixtures -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <h3><b>{{ allFixtureInstances.length }}</b> Fixtures</h3>\r\n <div class=\"indicator mt-2\" [ngClass]=\"getStatus\">\r\n {{ getStatusText }}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body -->\r\n <div id=\"body\" class=\"row\">\r\n <!-- Left Column -->\r\n <div\r\n [ngClass]=\"{ 'collapsed-col': isLeftPanelCollapsed, 'col-3': !isLeftPanelCollapsed,'d-none': editFixture }\">\r\n <div class=\"s-card\">\r\n <form [ngClass]=\"{ 'd-none': isLeftPanelCollapsed }\" [formGroup]=\"layoutForm\">\r\n <div ngbAccordion #bodyAccordion=\"ngbAccordion\">\r\n <!-- Walls Section -->\r\n <ng-container *ngIf=\"getFormWalls.controls.length; else addWallAction\">\r\n <ng-container formArrayName=\"walls\">\r\n <ng-container *ngFor=\"let group of getFormWalls.controls; let i = index\">\r\n <div [formGroupName]=\"i\" [ngbAccordionItem]=\"'accordion-wall-' + i\"\r\n class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"me-2 wall-label\">\r\n {{ group.get(\"elementType\")?.value | titlecase }}\r\n {{ group.get(\"elementNumber\")?.value }}\r\n </span>\r\n\r\n @if(layoutForm.enabled){\r\n <span class=\"me-1\" ngbTooltip=\"Rotate this wall.\"\r\n (click)=\"rotateWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M3.73735 8.25011C4.12193 8.24362 4.44377 8.52776 4.49338 8.89998L4.4999 8.98735L4.50262 9.15516C4.58434 11.5741 6.57243 13.5 9 13.5C9.14022 13.5 9.27951 13.4936 9.41756 13.4809L9.21967 13.2803C8.92678 12.9874 8.92678 12.5126 9.21967 12.2197C9.51257 11.9268 9.98744 11.9268 10.2803 12.2197L11.7803 13.7197C12.0732 14.0126 12.0732 14.4874 11.7803 14.7803L10.2803 16.2803C9.98744 16.5732 9.51257 16.5732 9.21967 16.2803C8.92678 15.9874 8.92678 15.5126 9.21967 15.2197L9.45837 14.9827C9.30646 14.9942 9.15359 15 9 15C5.82653 15 3.21665 12.5321 3.0125 9.38289L3.00315 9.19314L3.00011 9.01265C2.99312 8.59849 3.3232 8.25709 3.73735 8.25011ZM8.78033 1.71967C9.0507 1.99003 9.07149 2.41546 8.84272 2.70967L8.78033 2.78033L8.54187 3.01726C8.69371 3.00578 8.8465 3 9 3C12.3137 3 15 5.68629 15 9C15 9.41421 14.6642 9.75 14.25 9.75C13.8358 9.75 13.5 9.41421 13.5 9C13.5 6.51472 11.4853 4.5 9 4.5C8.8597 4.5 8.72034 4.5064 8.58221 4.51909L8.78033 4.71967C9.07323 5.01256 9.07323 5.48744 8.78033 5.78033C8.50997 6.05069 8.08455 6.07149 7.79033 5.84272L7.71967 5.78033L6.21967 4.28033C5.94931 4.00997 5.92851 3.58454 6.15728 3.29033L6.21967 3.21967L7.71967 1.71967C8.01257 1.42678 8.48744 1.42678 8.78033 1.71967Z\"\r\n fill=\"#475467\" stroke=\"#475467\"\r\n stroke-width=\"0.00064\" />\r\n </svg>\r\n </span>\r\n <span class=\"me-1\" ngbTooltip=\"Insert new wall below.\"\r\n (click)=\"addNewWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_62_8)\">\r\n <path\r\n d=\"M9 9.75C11.0707 9.75 12.75 11.4293 12.75 13.5C12.75 15.5708 11.0707 17.25 9 17.25C6.92925 17.25 5.25 15.5708 5.25 13.5C5.25 11.4293 6.92925 9.75 9 9.75ZM9.75 11.25H8.25V12.7493L6.75 12.75V14.25L8.25 14.2493V15.75H9.75V14.2493L11.25 14.25V12.75L9.75 12.7493V11.25ZM15 2.25C15.414 2.25 15.75 2.586 15.75 3V7.5C15.75 7.914 15.414 8.25 15 8.25H3C2.586 8.25 2.25 7.914 2.25 7.5V3C2.25 2.586 2.586 2.25 3 2.25H15ZM3.75 3.75V6.75H14.25V3.75H3.75Z\"\r\n fill=\"#475467\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_62_8\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span class=\"me-1\"\r\n ngbTooltip=\"Remove this wall and its fixtures.\"\r\n (click)=\"deleteWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_63_25)\">\r\n <path\r\n d=\"M10.7094 1.5C11.3551 1.5 11.9283 1.91314 12.1324 2.52565L12.5406 3.75H15C15.4142 3.75 15.75 4.08579 15.75 4.5C15.75 4.9142 15.4142 5.24999 15 5.25L14.9981 5.30344L14.3476 14.4103C14.2635 15.5878 13.2838 16.5 12.1034 16.5H5.89668C4.71624 16.5 3.7365 15.5878 3.6524 14.4103L3.00191 5.30344C3.00062 5.28551 2.99998 5.26769 2.99997 5.25C2.58577 5.24999 2.25 4.9142 2.25 4.5C2.25 4.08579 2.58579 3.75 3 3.75H5.45943L5.86754 2.52565C6.07172 1.91314 6.64493 1.5 7.29057 1.5H10.7094ZM13.4981 5.25H4.50191L5.14858 14.3034C5.17662 14.696 5.5032 15 5.89668 15H12.1034C12.4968 15 12.8234 14.696 12.8514 14.3034L13.4981 5.25ZM7.5 7.5C7.88464 7.5 8.20163 7.78952 8.24495 8.16253L8.25 8.25V12C8.25 12.4142 7.91422 12.75 7.5 12.75C7.11537 12.75 6.79837 12.4605 6.75505 12.0875L6.75 12V8.25C6.75 7.83578 7.08578 7.5 7.5 7.5ZM10.5 7.5C10.9142 7.5 11.25 7.83578 11.25 8.25V12C11.25 12.4142 10.9142 12.75 10.5 12.75C10.0858 12.75 9.75 12.4142 9.75 12V8.25C9.75 7.83578 10.0858 7.5 10.5 7.5ZM10.7094 3H7.29057L7.04057 3.75H10.9595L10.7094 3Z\"\r\n fill=\"#F32B2B\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_63_25\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n }\r\n </div>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <ng-template>\r\n <div style=\"min-height: 50px\" dndDropzone\r\n (dndDrop)=\"onDrop($event, i)\">\r\n <!-- Fixtures -->\r\n <ng-container *ngIf=\"getFormFixtures(i).controls.length\">\r\n <div formArrayName=\"fixtures\">\r\n <ng-container\r\n *ngFor=\"let fixture of getFormFixtures(i).controls; let j = index\">\r\n <div dndDropzone\r\n (dndDrop)=\"onDrop($event, i, j)\"\r\n [formGroupName]=\"j\"\r\n [dndDraggable]=\"{ wallIndex: i, fixtureIndex: j }\"\r\n [dndEffectAllowed]=\"'all'\"\r\n class=\"row g-0 mb-5 fixture-row\"\r\n [class.highlighted-fixture]=\"layoutForm.enabled && highlightedFixtureFormId && fixture.get('_id')?.value === highlightedFixtureFormId\"\r\n [dndDisableDragIf]=\"layoutForm.disabled\">\r\n\r\n <div class=\"col-1\">\r\n <div\r\n class=\"d-flex align-items-center justify-content-center h-100\">\r\n <svg dndDragImageRef\r\n [style]=\"{ cursor: layoutForm.disabled ? 'default' : 'move', opacity: '0.5' }\"\r\n width=\"25px\" viewBox=\"0 0 16 16\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"m 4.496094 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 0 0\"\r\n fill=\"grey\" />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-10\">\r\n <lib-reactive-select\r\n formControlName=\"fixtureConfigId\"\r\n [idField]=\"'_id'\"\r\n [nameField]=\"'name'\"\r\n [data]=\"fixtureTemplates\"\r\n [label]=\"'Fixture ' + (j + 1)\"\r\n [subTextField]=\"'subtext'\"\r\n [search]=\"true\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-1\">\r\n <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n [class.disabled-click]=\"layoutForm.disabled\">\r\n <svg (click)=\"deleteFixture('wall', j, i)\"\r\n style=\"cursor: pointer; margin-bottom: 18px\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\"\r\n stroke=\"#344054\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-end\">\r\n <a class=\"link-btn\"\r\n [class.disabled-click]=\"layoutForm.disabled\"\r\n (click)=\"addNewFixture('wall', i)\">\r\n Add fixture\r\n </a>\r\n </div>\r\n\r\n <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n <!-- Other Elements -->\r\n <ng-container\r\n *ngIf=\"getWallOtherElements(i).controls.length\">\r\n <div formArrayName=\"otherElements\">\r\n <ng-container\r\n *ngFor=\"let fixture of getWallOtherElements(i).controls; let j = index\">\r\n <div [formGroupName]=\"j\" class=\"row g-0 mb-5\">\r\n <div class=\"col-11\">\r\n <label class=\"form-label mb-1\">Element\r\n {{ j + 1 }}</label>\r\n\r\n <!-- Dropdown bound to 'type' -->\r\n <lib-reactive-select [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"otherElementList\"\r\n [id]=\"'elementLabel' + j\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <!-- Show custom text input only when 'Others' is selected -->\r\n <input\r\n *ngIf=\"(fixture.get('type')?.value) === 'Others'\"\r\n type=\"text\"\r\n class=\"form-control mt-2\"\r\n formControlName=\"customName\"\r\n placeholder=\"Enter custom element name\" />\r\n </div>\r\n\r\n <div class=\"col-1\">\r\n <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n [class.disabled-click]=\"layoutForm.disabled\">\r\n <svg (click)=\"removeOtherElement('wall', j, i)\"\r\n style=\"cursor: pointer; margin-bottom: 18px\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\"\r\n stroke=\"#344054\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-end\">\r\n <a class=\"link-btn\"\r\n [class.disabled-click]=\"layoutForm.disabled\"\r\n (click)=\"addNewOtherElements('wall', i)\">\r\n Add element\r\n </a>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #addWallAction>\r\n <button (click)=\"addNewWall(0)\" [class.disabled-click]=\"layoutForm.disabled\"\r\n class=\"btn btn-secondary w-100 p-2\">\r\n Insert new wall\r\n </button>\r\n </ng-template>\r\n\r\n <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n <!-- Floor Section -->\r\n <div [ngbAccordionItem]=\"'accordion-floor'\" class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <span class=\"me-2 wall-label\">Floor</span>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <ng-template>\r\n <div style=\"min-height: 50px\" dndDropzone\r\n (dndDrop)=\"onDrop($event, 'floor')\">\r\n <!-- Floor Fixtures -->\r\n <ng-container *ngIf=\"getFormFloorFixtures.controls.length\">\r\n <div formArrayName=\"floorFixtures\">\r\n <ng-container\r\n *ngFor=\"let fixture of getFormFloorFixtures.controls; let j = index\">\r\n <div dndDropzone (dndDrop)=\"onDrop($event, 'floor', j)\"\r\n [formGroupName]=\"j\"\r\n [dndDraggable]=\"{ wallIndex: 'floor', fixtureIndex: j }\"\r\n [dndEffectAllowed]=\"'all'\"\r\n [dndDisableDragIf]=\"layoutForm.disabled\"\r\n class=\"row g-0 mb-5 fixture-row\"\r\n [class.highlighted-fixture]=\"layoutForm.enabled && highlightedFixtureFormId && fixture.get('_id')?.value === highlightedFixtureFormId\">\r\n\r\n <div class=\"col-1\">\r\n <div\r\n class=\"d-flex align-items-center justify-content-center h-100\">\r\n <svg dndDragImageRef\r\n style=\"cursor: move; opacity: 0.5\"\r\n width=\"25px\" viewBox=\"0 0 16 16\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"m 4.496094 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 0 0\"\r\n fill=\"grey\" />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-10\">\r\n <lib-reactive-select\r\n formControlName=\"fixtureConfigId\"\r\n [idField]=\"'_id'\" [nameField]=\"'name'\"\r\n [data]=\"fixtureTemplates\"\r\n [label]=\"'Fixture ' + (j + 1)\" [search]=\"true\"\r\n [subTextField]=\"'subtext'\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-1\">\r\n <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n [class.disabled-click]=\"layoutForm.disabled\">\r\n <svg (click)=\"deleteFixture('floor', j)\"\r\n style=\"cursor: pointer; margin-bottom: 18px\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"\r\n fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\"\r\n stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-end\">\r\n <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n (click)=\"addNewFixture('floor')\">\r\n Add fixture\r\n </a>\r\n </div>\r\n\r\n <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n <!-- Floor Other Elements -->\r\n <ng-container *ngIf=\"getFormFloorOtherElements.controls.length\">\r\n <div formArrayName=\"floorOtherElements\">\r\n <ng-container\r\n *ngFor=\"let fixture of getFormFloorOtherElements.controls; let j = index\">\r\n <div [formGroupName]=\"j\" class=\"row g-0 mb-5\">\r\n <div class=\"col-11\">\r\n <label class=\"form-label mb-1\">Element\r\n {{ j + 1 }}</label>\r\n\r\n <!-- Dropdown for type -->\r\n <lib-reactive-select [idField]=\"'value'\"\r\n [nameField]=\"'label'\" [data]=\"otherElementList\"\r\n [id]=\"'floorElementLabel' + j\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <!-- Conditional input for custom name -->\r\n <input\r\n *ngIf=\"(fixture.get('type')?.value) === 'Others'\"\r\n type=\"text\" class=\"form-control mt-2\"\r\n formControlName=\"customName\"\r\n placeholder=\"Enter custom element name\" />\r\n </div>\r\n\r\n <div class=\"col-1\">\r\n <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n [class.disabled-click]=\"layoutForm.disabled\">\r\n <svg (click)=\"removeOtherElement('floor', j)\"\r\n style=\"cursor: pointer; margin-bottom: 18px\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"\r\n fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\"\r\n stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-end\">\r\n <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n (click)=\"addNewOtherElements('floor')\">\r\n Add element\r\n </a>\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 <!-- Center Column -->\r\n <div class=\"col overflow-hidden position-relative\" [ngClass]=\"{ 'd-none': editFixture }\">\r\n <div id=\"canvas-card\" class=\"c-card position-relative\" #canvasContainer>\r\n <!-- Canvas View -->\r\n <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n\r\n <div class=\"position-absolute d-flex align-items-center justify-content-end gap-2\"\r\n style=\"top: 24px; right: 26px;width: calc(100% - 50px);\">\r\n <!-- Entrance Button -->\r\n <div *ngIf=\"layoutForm.enabled\" ngbTooltip=\"You can add up to two entrances.\"\r\n [disableTooltip]=\"getEntrances?.length < 2\" class=\"me-auto\">\r\n <button type=\"button\" style=\"padding: 8px 20px !important;\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm \"\r\n [disabled]=\"getEntrances?.length >= 2\" (click)=\"addNewEntrance()\">\r\n Add Entrance\r\n </button>\r\n </div>\r\n\r\n <!-- Cancel edit -->\r\n @if(layoutForm.enabled){\r\n @if(getStatus === 'allocationPending'){\r\n <button type=\"button\" class=\"btn btn-outline bg-white shadow-sm\" (click)=\"cancelEdit()\">\r\n Cancel\r\n </button>\r\n }@else {\r\n <button type=\"button\" class=\"btn btn-text\" (click)=\"cancelEdit()\">\r\n Cancel\r\n </button>\r\n }\r\n }\r\n\r\n <!-- Save -->\r\n @if(layoutForm.enabled){\r\n @if(getStatus === 'draft'){\r\n <button type=\"button\"\r\n class=\"btn btn-outline shadow-sm bg-white d-flex align-items-center gap-2 justify-content-center\"\r\n style=\"min-width: 130px;\"\r\n [disabled]=\"isSavingLayout\" (click)=\"updateLayout(true)\">\r\n <span *ngIf=\"isSavingLayout\" class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\r\n Save as Draft\r\n </button>\r\n }@else{\r\n <button type=\"button\"\r\n style=\"padding: 8px 20px !important;min-width: 90px;\"\r\n class=\"btn btn-primary text-nowrap d-flex align-items-center gap-2 justify-content-center\"\r\n [disabled]=\"isSavingLayout\" (click)=\"updateLayout(true)\">\r\n <span *ngIf=\"isSavingLayout\" class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\r\n Save\r\n </button>\r\n }\r\n }\r\n\r\n <!-- Compact button (CAD layouts only, view mode) \u2014 one-shot:\r\n clicking compacts the layout and drops the user into edit\r\n mode so the change is revertable via Cancel and persistable\r\n via Save / Submit. -->\r\n @if(canShowCompactToggle && layoutForm.disabled){\r\n <button type=\"button\"\r\n class=\"btn btn-outline shadow-sm bg-white d-flex align-items-center gap-2 justify-content-center\"\r\n (click)=\"compactLayout()\"\r\n ngbTooltip=\"Compact layout.\"\r\n container=\"body\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\">\r\n <polyline points=\"4 14 10 14 10 20\"></polyline>\r\n <polyline points=\"20 10 14 10 14 4\"></polyline>\r\n <line x1=\"14\" y1=\"10\" x2=\"21\" y2=\"3\"></line>\r\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"></line>\r\n </svg>\r\n </button>\r\n }\r\n\r\n <!-- Edit Button -->\r\n @if(isEditLayoutAllowed){\r\n <button type=\"button\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n 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\"\r\n 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 }\r\n\r\n <!-- Cancel Button (From allocation) -->\r\n <button *ngIf=\"layoutForm.disabled && isAllocationRun\" type=\"button\"\r\n class=\"btn btn-outline bg-white shadow-sm\" (click)=\"onClickRevertAllocation() \">\r\n Cancel\r\n </button>\r\n\r\n\r\n <!-- Run allocation / Complete -->\r\n @if(isRunAllocationAllowed && layoutForm.disabled && getStatus === 'allocationPending'){\r\n <span\r\n [ngbTooltip]=\"!isAllocationRun ? invalidFixturesTooltip : ''\"\r\n container=\"body\">\r\n <button type=\"button\" style=\"padding: 8px 20px !important;\"\r\n class=\"btn btn-primary text-nowrap\"\r\n [disabled]=\"!isAllocationRun && hasInvalidFixtures\"\r\n (click)=\"onClickRunAllocation()\">\r\n {{ isAllocationRun ? 'Complete Allocation' : 'Run Allocation' }}\r\n </button>\r\n </span>\r\n }\r\n\r\n <button *ngIf=\"getStatus === 'draft'\" type=\"button\" style=\"padding: 8px 20px !important\"\r\n class=\"btn btn-primary text-nowrap\" (click)=\"onClickApproveLayout()\">\r\n Submit for merch allocation\r\n </button>\r\n\r\n <!-- Rotate Button -->\r\n <button type=\"button\" *ngIf=\"layoutForm.disabled\" class=\"btn btn-outline bg-white shadow-sm\"\r\n (click)=\"rotateCanvas(canvas,90)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 26 26\"\r\n fill=\"none\">\r\n <path\r\n d=\"M6.36265 7.17887L7.17625 6.36287L5.90425 5.09207L5.08945 5.90567L6.36265 7.17887ZM15.671 6.36407L19.6379 10.3309L20.9099 9.05769L16.9442 5.09087L15.671 6.36407ZM19.6379 18.8257L18.8243 19.6393L20.0963 20.9101L20.9099 20.0977L19.6379 18.8257ZM10.3295 19.6393L6.36265 15.6725L5.09065 16.9457L9.05626 20.9113L10.3295 19.6393ZM18.8243 19.6393C17.6543 20.8081 16.8407 21.6193 16.1459 22.1497C15.4715 22.6645 15.0155 22.8289 14.5763 22.8289V24.6289C15.5675 24.6289 16.4027 24.2173 17.2367 23.5813C18.0503 22.9609 18.9635 22.0453 20.0963 20.9125L18.8243 19.6393ZM9.05626 20.9113C10.1891 22.0453 11.1023 22.9597 11.9159 23.5813C12.7499 24.2173 13.5851 24.6289 14.5763 24.6289V22.8289C14.1371 22.8289 13.6823 22.6645 13.0067 22.1497C12.3119 21.6193 11.4983 20.8081 10.3295 19.6393L9.05626 20.9113ZM19.6379 10.3309C20.8067 11.4997 21.6179 12.3133 22.1483 13.0081C22.6631 13.6837 22.8275 14.1385 22.8275 14.5777H24.6275C24.6275 13.5865 24.2159 12.7513 23.5799 11.9173C22.9595 11.1037 22.0427 10.1905 20.9099 9.05769L19.6379 10.3309ZM20.9099 20.0977C22.0439 18.9637 22.9583 18.0517 23.5799 17.2381C24.2159 16.4041 24.6275 15.5689 24.6275 14.5777H22.8275C22.8275 15.0169 22.6631 15.4729 22.1483 16.1473C21.6179 16.8421 20.8067 17.6557 19.6379 18.8257L20.9099 20.0977ZM7.17625 6.36287C8.34625 5.19407 9.15985 4.38167 9.85465 3.85127C10.529 3.33647 10.985 3.17327 11.4242 3.17327V1.37207C10.433 1.37207 9.59785 1.78367 8.76385 2.41967C7.94905 3.04127 7.03705 3.95567 5.90425 5.08847L7.17625 6.36287ZM16.9442 5.09087C15.8114 3.95687 14.8982 3.04127 14.0846 2.41967C13.2506 1.78367 12.4154 1.37207 11.4242 1.37207V3.17327C11.8634 3.17327 12.3182 3.33647 12.9938 3.85127C13.6886 4.38167 14.5022 5.19287 15.671 6.36167L16.9442 5.09087ZM5.08945 5.90327C3.95665 7.03607 3.04225 7.94807 2.42065 8.76287C1.78465 9.59687 1.37305 10.4321 1.37305 11.4233H3.17305C3.17305 10.9841 3.33745 10.5281 3.85225 9.85367C4.38265 9.15887 5.19385 8.34527 6.36265 7.17527L5.08945 5.90327ZM6.36265 15.6713C5.19385 14.5013 4.38265 13.6877 3.85225 12.9929C3.33745 12.3185 3.17305 11.8625 3.17305 11.4233H1.37305C1.37305 12.4145 1.78465 13.2497 2.42065 14.0837C3.04225 14.8973 3.95665 15.8105 5.08945 16.9433L6.36265 15.6713Z\"\r\n fill=\"#1D2939\" />\r\n <path\r\n d=\"M23.2 6.9832L25 8.2C25 4.582 22.4056 1.5796 19 1M2.8 19.0168L1 17.8C1 21.418 3.5944 24.4204 7 25\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- Download Button -->\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n (click)=\"downloadCanvas()\">\r\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" stroke=\"#000000\" stroke-width=\"0.24000000000000005\">\r\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n stroke=\"#CCCCCC\" stroke-width=\"0.384\"></g>\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <path\r\n d=\"M12.5535 16.5061C12.4114 16.6615 12.2106 16.75 12 16.75C11.7894 16.75 11.5886 16.6615 11.4465 16.5061L7.44648 12.1311C7.16698 11.8254 7.18822 11.351 7.49392 11.0715C7.79963 10.792 8.27402 10.8132 8.55352 11.1189L11.25 14.0682V3C11.25 2.58579 11.5858 2.25 12 2.25C12.4142 2.25 12.75 2.58579 12.75 3V14.0682L15.4465 11.1189C15.726 10.8132 16.2004 10.792 16.5061 11.0715C16.8118 11.351 16.833 11.8254 16.5535 12.1311L12.5535 16.5061Z\"\r\n fill=\"#1D2939\"></path>\r\n <path\r\n d=\"M3.75 15C3.75 14.5858 3.41422 14.25 3 14.25C2.58579 14.25 2.25 14.5858 2.25 15V15.0549C2.24998 16.4225 2.24996 17.5248 2.36652 18.3918C2.48754 19.2919 2.74643 20.0497 3.34835 20.6516C3.95027 21.2536 4.70814 21.5125 5.60825 21.6335C6.47522 21.75 7.57754 21.75 8.94513 21.75H15.0549C16.4225 21.75 17.5248 21.75 18.3918 21.6335C19.2919 21.5125 20.0497 21.2536 20.6517 20.6516C21.2536 20.0497 21.5125 19.2919 21.6335 18.3918C21.75 17.5248 21.75 16.4225 21.75 15.0549V15C21.75 14.5858 21.4142 14.25 21 14.25C20.5858 14.25 20.25 14.5858 20.25 15C20.25 16.4354 20.2484 17.4365 20.1469 18.1919C20.0482 18.9257 19.8678 19.3142 19.591 19.591C19.3142 19.8678 18.9257 20.0482 18.1919 20.1469C17.4365 20.2484 16.4354 20.25 15 20.25H9C7.56459 20.25 6.56347 20.2484 5.80812 20.1469C5.07435 20.0482 4.68577 19.8678 4.40901 19.591C4.13225 19.3142 3.9518 18.9257 3.85315 18.1919C3.75159 17.4365 3.75 16.4354 3.75 15Z\"\r\n fill=\"#1D2939\"></path>\r\n </g>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Panel Collapse Handlers -->\r\n <div class=\"collapse-handler left\" (click)=\"togglePanel('left')\">\r\n <svg *ngIf=\"!isLeftPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M8.27308 12.636L4.63672 8.99964L8.27308 5.36328M13.364 12.636L9.72763 8.99964L13.364 5.36328\"\r\n stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngIf=\"isLeftPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M9.72692 5.36399L13.3633 9.00036L9.72692 12.6367M4.63601 5.36399L8.27237 9.00036L4.63601 12.6367\"\r\n stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"collapse-handler right\" (click)=\"togglePanel('right')\">\r\n <svg *ngIf=\"isRightPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M8.27308 12.636L4.63672 8.99964L8.27308 5.36328M13.364 12.636L9.72763 8.99964L13.364 5.36328\"\r\n stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngIf=\"!isRightPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M9.72692 5.36399L13.3633 9.00036L9.72692 12.6367M4.63601 5.36399L8.27237 9.00036L4.63601 12.6367\"\r\n stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-- Edit Fixture Body -->\r\n <div class=\"col\" [ngClass]=\"{ 'd-none': !editFixture }\">\r\n <div id=\"edit-body\" class=\"row\">\r\n <ul class=\"mx-3 my-5 nav nav-pills\" role=\"tablist\">\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"submitFixture = false; editFixtureSection = 'basic-details'\"\r\n [ngClass]=\"editFixtureSection === 'basic-details' ? 'active' : ''\" class=\"nav-link\"\r\n role=\"tab\">\r\n Basic details\r\n </a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"submitFixture = false; editFixtureSection = 'products'\"\r\n [ngClass]=\"editFixtureSection === 'products' ? 'active' : ''\" class=\"nav-link\"\r\n role=\"tab\">\r\n Products\r\n </a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"submitFixture = false; editFixtureSection = 'vms'\"\r\n [ngClass]=\"editFixtureSection === 'vms' ? 'active' : ''\" class=\"nav-link\" role=\"tab\">\r\n Visual Merchandise\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n <div class=\"col\">\r\n <ng-container *ngIf=\"editFixtureSection === 'basic-details'\">\r\n <lib-instance-basic-details [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\"\r\n [libraryCategories]=\"libraryCategories\"\r\n [libraryByCategory]=\"libraryByCategory\"\r\n [allowCategoryAndWidthEdit]=\"true\">\r\n </lib-instance-basic-details>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"editFixtureSection === 'products'\">\r\n <lib-instance-products [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\">\r\n </lib-instance-products>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"editFixtureSection === 'vms'\">\r\n <lib-instance-vms [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\">\r\n </lib-instance-vms>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"{ 'collapsed-col': isRightPanelCollapsed, 'col-3': !isRightPanelCollapsed }\"\r\n [style]=\"{'min-width': isRightPanelCollapsed ? '0' : isAllocationRun ?'680px' : '464px' }\">\r\n <ng-container *ngTemplateOutlet=\"fixturePreviewCol\"></ng-container>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n</section>\r\n\r\n<ng-template #fixturePreviewCol>\r\n <div class=\"s-card\" [ngStyle]=\"{'margin-top':editFixture ? '72px' : '0px'}\">\r\n <onboard-fixture [ngClass]=\"{ 'd-none': isRightPanelCollapsed}\"\r\n (onClose)=\"togglePanel('right'); selectedFixtureData = null; removeHighlight();\"\r\n [fixtureData]=\"selectedFixtureData\" [isAllocationRun]=\"isAllocationRun\"\r\n [allFixtures]=\"allFixtureInstances\"></onboard-fixture>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #headerSkeleton>\r\n <div class=\"row m-0 g-0 loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n <div class=\"shimmer w-100 p-4 rounded\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke mt-0 animate title\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #skeletonLoader>\r\n <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n <div class=\"shimmer rounded\">\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 class=\"stroke animate description\"></div>\r\n <br />\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 <br />\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 <br />\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 <br />\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</ng-template>\r\n\r\n<ng-template #applyLogics let-modal>\r\n <div class=\"modal-body\">\r\n <div class=\"d-flex justify-content-start mb-4\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"#DAF1FF\" />\r\n <path\r\n d=\"M20.833 21.6665C18.033 21.6665 17.1164 22.7915 16.8164 23.5332C17.708 23.9165 18.333 24.7998 18.333 25.8332C18.333 26.4962 18.0696 27.1321 17.6008 27.6009C17.1319 28.0698 16.4961 28.3332 15.833 28.3332C15.17 28.3332 14.5341 28.0698 14.0653 27.6009C13.5964 27.1321 13.333 26.4962 13.333 25.8332C13.333 24.7415 14.0247 23.8165 14.9997 23.4748V16.5248C14.5114 16.3535 14.0885 16.0344 13.7899 15.6117C13.4912 15.1891 13.3315 14.684 13.333 14.1665C13.333 13.5035 13.5964 12.8676 14.0653 12.3987C14.5341 11.9299 15.17 11.6665 15.833 11.6665C16.4961 11.6665 17.1319 11.9299 17.6008 12.3987C18.0696 12.8676 18.333 13.5035 18.333 14.1665C18.333 15.2582 17.6414 16.1832 16.6664 16.5248V20.9332C17.3997 20.3915 18.4664 19.9998 19.9997 19.9998C22.2247 19.9998 22.9664 18.8832 23.208 18.1415C22.7521 17.9516 22.3625 17.6311 22.0882 17.2204C21.8139 16.8097 21.6671 16.3271 21.6664 15.8332C21.6664 15.1701 21.9297 14.5342 22.3986 14.0654C22.8674 13.5966 23.5033 13.3332 24.1664 13.3332C24.8294 13.3332 25.4653 13.5966 25.9341 14.0654C26.403 14.5342 26.6664 15.1701 26.6664 15.8332C26.6664 16.9498 25.933 17.9165 24.9247 18.2165C24.708 19.4082 23.8997 21.6665 20.833 21.6665ZM15.833 24.9998C15.612 24.9998 15.4 25.0876 15.2438 25.2439C15.0875 25.4002 14.9997 25.6122 14.9997 25.8332C14.9997 26.0542 15.0875 26.2661 15.2438 26.4224C15.4 26.5787 15.612 26.6665 15.833 26.6665C16.054 26.6665 16.266 26.5787 16.4223 26.4224C16.5786 26.2661 16.6664 26.0542 16.6664 25.8332C16.6664 25.6122 16.5786 25.4002 16.4223 25.2439C16.266 25.0876 16.054 24.9998 15.833 24.9998ZM15.833 13.3332C15.612 13.3332 15.4 13.421 15.2438 13.5772C15.0875 13.7335 14.9997 13.9455 14.9997 14.1665C14.9997 14.3875 15.0875 14.5995 15.2438 14.7558C15.4 14.912 15.612 14.9998 15.833 14.9998C16.054 14.9998 16.266 14.912 16.4223 14.7558C16.5786 14.5995 16.6664 14.3875 16.6664 14.1665C16.6664 13.9455 16.5786 13.7335 16.4223 13.5772C16.266 13.421 16.054 13.3332 15.833 13.3332ZM24.1664 14.9998C23.9453 14.9998 23.7334 15.0876 23.5771 15.2439C23.4208 15.4002 23.333 15.6122 23.333 15.8332C23.333 16.0542 23.4208 16.2661 23.5771 16.4224C23.7334 16.5787 23.9453 16.6665 24.1664 16.6665C24.3874 16.6665 24.5993 16.5787 24.7556 16.4224C24.9119 16.2661 24.9997 16.0542 24.9997 15.8332C24.9997 15.6122 24.9119 15.4002 24.7556 15.2439C24.5993 15.0876 24.3874 14.9998 24.1664 14.9998Z\"\r\n fill=\"#009BF3\" />\r\n </svg>\r\n\r\n </div>\r\n <div>\r\n <h2 class=\"mb-3\">Run Allocation Logic</h2>\r\n <p>This will map all fixtures and apply allocations based on the business-defined logic, then move them to\r\n the verification section. Are you sure you want to continue?</p>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n [disabled]=\"isButtonLoading\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"runAllocation()\" [disabled]=\"isButtonLoading\">\r\n <span *ngIf=\"!isButtonLoading\"> Run allocation Logic</span>\r\n <svg style=\"width: 141px;\" *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #approveLayoutModal let-modal>\r\n <div class=\"modal-body\">\r\n <div>\r\n <h2 class=\"mb-3\">Approve & Submit</h2>\r\n <p>\r\n This will complete the layout and make it ready for allocation. Ensure that all fixture counts and\r\n placements are as per the plan.\r\n </p>\r\n </div>\r\n @if(hasInvalidFixtures) {\r\n <div class=\"d-flex align-items-start gap-2 p-3 mb-3 rounded\"\r\n style=\"background-color: #FFFAEB; border: 1px solid #FEC84B;\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"flex-shrink: 0; margin-top: 1px;\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F59E0B\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <p class=\"mb-0\" style=\"font-size: 13px; color: #92400E;\">\r\n @if(hasInvalidHeaderFixtures) {\r\n <strong>{{invalidHeaderFixtureCount}} fixture{{invalidHeaderFixtureCount === 1 ? '' : 's'}}\r\n {{invalidHeaderFixtureCount === 1 ? 'has' : 'have'}} an unrecognized header.</strong><br/>\r\n }\r\n @if(hasInvalidLibraryFixtures) {\r\n <strong>{{invalidLibraryFixtureCount}} fixture{{invalidLibraryFixtureCount === 1 ? '' : 's'}}\r\n {{invalidLibraryFixtureCount === 1 ? 'does' : 'do'}} not match any library entry.</strong><br/>\r\n }\r\n These are highlighted in red on the layout and must be corrected before the allocation rule can run.\r\n </p>\r\n </div>\r\n }\r\n <div class=\"d-flex justify-content-end gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n [disabled]=\"isButtonLoading\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"approveLayout()\" [disabled]=\"isButtonLoading\">\r\n <span *ngIf=\"!isButtonLoading\">Submit</span>\r\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #revertAllocationModal let-modal>\r\n <div class=\"modal-body\">\r\n <div class=\"d-flex justify-content-start mb-4\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"#FEF3C7\" />\r\n <path\r\n d=\"M20 13.3333V20M20 26.6667H20.0167M28.3333 20C28.3333 24.6024 24.6024 28.3333 20 28.3333C15.3976 28.3333 11.6667 24.6024 11.6667 20C11.6667 15.3976 15.3976 11.6667 20 11.6667C24.6024 11.6667 28.3333 15.3976 28.3333 20Z\"\r\n stroke=\"#F59E0B\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <div>\r\n <h2 class=\"mb-3\">Revert Allocation</h2>\r\n <p>Are you sure you want to revert the allocation? This will restore the state before running allocation.\r\n </p>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n [disabled]=\"isButtonLoading\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"revertAllocation(); modal.close()\"\r\n [disabled]=\"isButtonLoading\">\r\n <span *ngIf=\"!isButtonLoading\">Revert</span>\r\n <svg style=\"width: 141px;\" *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #completeAllocationModal let-modal>\r\n <div class=\"modal-body\">\r\n <div class=\"d-flex justify-content-start mb-4\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"#DAF1FF\" />\r\n <path\r\n d=\"M20.833 21.6665C18.033 21.6665 17.1164 22.7915 16.8164 23.5332C17.708 23.9165 18.333 24.7998 18.333 25.8332C18.333 26.4962 18.0696 27.1321 17.6008 27.6009C17.1319 28.0698 16.4961 28.3332 15.833 28.3332C15.17 28.3332 14.5341 28.0698 14.0653 27.6009C13.5964 27.1321 13.333 26.4962 13.333 25.8332C13.333 24.7415 14.0247 23.8165 14.9997 23.4748V16.5248C14.5114 16.3535 14.0885 16.0344 13.7899 15.6117C13.4912 15.1891 13.3315 14.684 13.333 14.1665C13.333 13.5035 13.5964 12.8676 14.0653 12.3987C14.5341 11.9299 15.17 11.6665 15.833 11.6665C16.4961 11.6665 17.1319 11.9299 17.6008 12.3987C18.0696 12.8676 18.333 13.5035 18.333 14.1665C18.333 15.2582 17.6414 16.1832 16.6664 16.5248V20.9332C17.3997 20.3915 18.4664 19.9998 19.9997 19.9998C22.2247 19.9998 22.9664 18.8832 23.208 18.1415C22.7521 17.9516 22.3625 17.6311 22.0882 17.2204C21.8139 16.8097 21.6671 16.3271 21.6664 15.8332C21.6664 15.1701 21.9297 14.5342 22.3986 14.0654C22.8674 13.5966 23.5033 13.3332 24.1664 13.3332C24.8294 13.3332 25.4653 13.5966 25.9341 14.0654C26.403 14.5342 26.6664 15.1701 26.6664 15.8332C26.6664 16.9498 25.933 17.9165 24.9247 18.2165C24.708 19.4082 23.8997 21.6665 20.833 21.6665ZM15.833 24.9998C15.612 24.9998 15.4 25.0876 15.2438 25.2439C15.0875 25.4002 14.9997 25.6122 14.9997 25.8332C14.9997 26.0542 15.0875 26.2661 15.2438 26.4224C15.4 26.5787 15.612 26.6665 15.833 26.6665C16.054 26.6665 16.266 26.5787 16.4223 26.4224C16.5786 26.2661 16.6664 26.0542 16.6664 25.8332C16.6664 25.6122 16.5786 25.4002 16.4223 25.2439C16.266 25.0876 16.054 24.9998 15.833 24.9998ZM15.833 13.3332C15.612 13.3332 15.4 13.421 15.2438 13.5772C15.0875 13.7335 14.9997 13.9455 14.9997 14.1665C14.9997 14.3875 15.0875 14.5995 15.2438 14.7558C15.4 14.912 15.612 14.9998 15.833 14.9998C16.054 14.9998 16.266 14.912 16.4223 14.7558C16.5786 14.5995 16.6664 14.3875 16.6664 14.1665C16.6664 13.9455 16.5786 13.7335 16.4223 13.5772C16.266 13.421 16.054 13.3332 15.833 13.3332ZM24.1664 14.9998C23.9453 14.9998 23.7334 15.0876 23.5771 15.2439C23.4208 15.4002 23.333 15.6122 23.333 15.8332C23.333 16.0542 23.4208 16.2661 23.5771 16.4224C23.7334 16.5787 23.9453 16.6665 24.1664 16.6665C24.3874 16.6665 24.5993 16.5787 24.7556 16.4224C24.9119 16.2661 24.9997 16.0542 24.9997 15.8332C24.9997 15.6122 24.9119 15.4002 24.7556 15.2439C24.5993 15.0876 24.3874 14.9998 24.1664 14.9998Z\"\r\n fill=\"#009BF3\" />\r\n </svg>\r\n </div>\r\n <div>\r\n <h2 class=\"mb-3\">Save and complete allocation</h2>\r\n <p>You are about to complete the merch allocation process. This will make the store ready for fixture\r\n verification and move it to the verification stage. Are you sure you want to proceed?</p>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n [disabled]=\"isButtonLoading\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"completeAllocation();\" [disabled]=\"isButtonLoading\">\r\n <span *ngIf=\"!isButtonLoading\">Complete allocation</span>\r\n <svg style=\"width: 107px;\" *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </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}#onboard-plano ::ng-deep .backgroundImg{background-color:#f9fafb!important}#onboard-plano ::ng-deep .accordion .accordion-button.backgroundImg:not(.collapsed){background-color:#f9fafb!important}#onboard-plano ::ng-deep .accordion-body{padding:10px 20px 20px}#onboard-plano .s-card{position:relative;box-sizing:border-box;border-radius:8px;background:#fff;padding:20px 16px;height:75dvh;overflow-y:auto;overflow-x:visible}#onboard-plano .c-card{border-radius:8px;background:#fff;padding:20px 16px;height:75dvh;overflow:hidden;width:100%}#onboard-plano .h-card{border-radius:8px;background:#fff;padding:20px 16px;min-height:20dvh}#onboard-plano .wall-label{color:var(--Gray-600, #475467);font-family:Inter;font-size:14px;font-style:normal;font-weight:600}#onboard-plano img{width:100%;height:100%;object-fit:cover;display:block}#onboard-plano #header .title{color:var(--Gray-800, #1d2939);font-size:16px;font-weight:600;line-height:24px;margin:0}#onboard-plano #header .cus-btn{color:#009bf3;background:#eaf8ff;padding:4px 10px;border-radius:16px;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;text-align:center;cursor:pointer}#onboard-plano #header .cus-btn:hover{background:#e2f5ff}#onboard-plano .loader .shimmer{height:100%!important}#onboard-plano .collapse-handler{position:absolute;height:32px;width:32px;display:flex;justify-content:center;align-items:center;border-radius:50%;background:#fff;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808;cursor:pointer;top:12px}#onboard-plano .collapse-handler.right{right:0}#onboard-plano .collapse-handler.left{left:0}#onboard-plano .collapsed-col{transition:all .3s ease;width:40px!important}#onboard-plano [class^=col]{transition:all .3s ease}#onboard-plano #segment-btn .custom-tabs{border-radius:8px;border:1px solid var(--Gray-300, #d0d5dd);overflow:hidden;margin-bottom:24px}#onboard-plano #segment-btn .custom-tabs .nav-link{border-radius:0%;color:#495057;padding:.75rem 1rem;background-color:#fff;text-align:center;border-right:1px solid var(--Gray-300, #d0d5dd);transition:all ease .2s;font-weight:500}#onboard-plano #segment-btn .custom-tabs .nav-link.active{background:var(--Primary-500, #33b5ff);color:#fff}#onboard-plano #segment-btn .nav-tabs .nav-link{border:none;margin:0}#onboard-plano #segment-btn .nav-item{text-align:center}#onboard-plano #segment-btn .nav-item:last-child .nav-link{border:none}#onboard-plano .link-btn{color:#33b5ff;cursor:pointer;font-weight:500}#onboard-plano .link-btn:hover{color:#33b5ff;text-decoration:underline!important}#onboard-plano .btn-red{border-radius:8px!important;border:1px solid #fef3f2!important;background:#fef3f2!important;box-shadow:0 1px 2px #1018280d!important;padding:10px 18px!important;color:#b42318!important;font-size:16px!important;font-weight:600!important}#onboard-plano .updateClass{font-family:Inter;font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#667085}#onboard-plano .fixture-row{border-radius:8px;transition:background-color .2s ease,box-shadow .2s ease}#onboard-plano .fixture-row.highlighted-fixture{background-color:#eaf8ff;box-shadow:0 0 0 2px #33b5ff}.btn .spinner{height:22px;min-width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "component", type: i8.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i7.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i7.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i7.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i7.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i7.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i7.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "directive", type: i9.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }, { kind: "directive", type: i9.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { kind: "directive", type: i9.DndDragImageRefDirective, selector: "[dndDragImageRef]" }, { kind: "component", type: i10.InstanceBasicDetailsComponent, selector: "lib-instance-basic-details", inputs: ["fixtureData", "editMode", "isSubmitted", "revertOnEdit", "zoneEditMode", "libraryCategories", "libraryByCategory", "allowCategoryAndWidthEdit"], outputs: ["submitEvent"] }, { kind: "component", type: i11.InstanceProductsComponent, selector: "lib-instance-products", inputs: ["fixtureData", "editMode", "isSubmitted", "isRollout", "revertOnEdit", "zoneEditMode"], outputs: ["submitEvent"] }, { kind: "component", type: i12.InstanceVmsComponent, selector: "lib-instance-vms", inputs: ["fixtureData", "editMode", "isSubmitted", "isRollout", "revertOnEdit"], outputs: ["submitEvent"] }, { kind: "component", type: i13.OnboardFixtureComponent, selector: "onboard-fixture", inputs: ["fixtureData", "isAllocationRun", "allFixtures"], outputs: ["onClose"] }, { kind: "pipe", type: i5.TitleCasePipe, name: "titlecase" }] });
|
|
4234
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OnboardStorePlanoComponent, selector: "lib-onboard-store-plano", host: { listeners: { "window:resize": "onResize()" } }, providers: [TitleCasePipe], viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["baseCanvas"], descendants: true }, { propertyName: "containerRef", first: true, predicate: ["canvasContainer"], descendants: true }, { propertyName: "applyLogicsModalRef", first: true, predicate: ["applyLogics"], descendants: true }, { propertyName: "approveLayoutModalRef", first: true, predicate: ["approveLayoutModal"], descendants: true }, { propertyName: "revertAllocationModalRef", first: true, predicate: ["revertAllocationModal"], descendants: true }, { propertyName: "completeAllocationModalRef", first: true, predicate: ["completeAllocationModal"], descendants: true }, { propertyName: "bodyAccordion", first: true, predicate: ["bodyAccordion"], descendants: true }], ngImport: i0, template: "<section id=\"onboard-plano\">\r\n <!-- Loading State -->\r\n <div *ngIf=\"isPageLoading\" class=\"row\">\r\n <div class=\"col-12 m-0\">\r\n <ng-container *ngTemplateOutlet=\"headerSkeleton\"></ng-container>\r\n </div>\r\n <div class=\"col-3\">\r\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n </div>\r\n <div class=\"col-6\">\r\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n </div>\r\n <div class=\"col-3\">\r\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Content -->\r\n <div [ngClass]=\"{ 'd-none': isPageLoading }\">\r\n <!-- Header Accordion -->\r\n <div id=\"header\" ngbAccordion #accordion=\"ngbAccordion\" class=\"my-4\">\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <div ngbAccordionHeader class=\"d-flex justify-content-between align-items-center px-6 py-3\">\r\n <div class=\"d-flex gap-4 align-items-center\">\r\n <div style=\"margin-left:5px;\" *ngIf=\"planoData?.storeName\">\r\n <h2 class='title'>{{planoData?.storeName}} - Plano</h2>\r\n </div>\r\n <lib-reactive-select *ngIf=\"floorsList.length\" [formControl]=\"selectedFloorId\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorsList\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center gap-4\">\r\n <div *ngIf=\"!editFixture\" class=\"updateClass\"\r\n [ngbTooltip]=\"floorData?.updatedByName ? 'Updated by ' + floorData.updatedByName : null\">\r\n Last Update: {{ floorData?.lastUpdateIso | date:'d MMM yyyy, hh:mm a' }}\r\n </div>\r\n\r\n <div class=\"d-flex gap-4 align-items-center\">\r\n <!-- Edit Fixture Mode -->\r\n <ng-container *ngIf=\"editFixture\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\"\r\n (click)=\"onFixturePageCancel()\">\r\n Cancel\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onFixtureSave()\">\r\n Save & Close\r\n </button>\r\n </ng-container>\r\n <button ngbAccordionButton></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div id=\"header\" class=\"row mx-0 gap-3\">\r\n <!-- Plano Completion -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <h3 class=\"d-flex align-items-center gap-2\">\r\n Plano Completion %\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n fill=\"none\" ngbTooltip=\"% of overall planogram completion\">\r\n <g clip-path=\"url(#clip0_1517_129805)\">\r\n <path\r\n d=\"M9 12V9M9 6H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1517_129805\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </h3>\r\n <div class=\"row align-items-center mt-2\">\r\n <div class=\"col-9\">\r\n <div class=\"progress\" style=\"height: 4px\">\r\n <div class=\"progress-bar\" [ngClass]=\"\r\n [25, 50].includes(getProgressValue) ? 'bg-warning' : 'bg-success'\" role=\"progressbar\"\r\n [style]=\"'width:' + getProgressValue + '%'\"\r\n [attr.aria-valuenow]=\"getProgressValue\" aria-valuemin=\"0\"\r\n aria-valuemax=\"100\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-3\">{{ getProgressValue }}%</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Layout -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <h3><b>{{floorData?.floorNumber}}/{{ planoData?.floors?.length }}</b> Layout</h3>\r\n <div class=\"indicator mt-2\"\r\n [ngClass]=\"getStatus === 'allocationPending' ? 'completed' : 'draft'\">\r\n {{ getStatus === 'allocationPending' ? 'Completed' : 'Draft' }}\r\n </div>\r\n </div>\r\n\r\n <!-- Fixtures -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <h3><b>{{ allFixtureInstances.length }}</b> Fixtures</h3>\r\n <div class=\"indicator mt-2\" [ngClass]=\"getStatus\">\r\n {{ getStatusText }}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body -->\r\n <div id=\"body\" class=\"row\">\r\n <!-- Left Column -->\r\n <div\r\n [ngClass]=\"{ 'collapsed-col': isLeftPanelCollapsed, 'col-3': !isLeftPanelCollapsed,'d-none': editFixture }\">\r\n <div class=\"s-card\">\r\n <form [ngClass]=\"{ 'd-none': isLeftPanelCollapsed }\" [formGroup]=\"layoutForm\">\r\n <div ngbAccordion #bodyAccordion=\"ngbAccordion\">\r\n <!-- Walls Section -->\r\n <ng-container *ngIf=\"getFormWalls.controls.length; else addWallAction\">\r\n <ng-container formArrayName=\"walls\">\r\n <ng-container *ngFor=\"let group of getFormWalls.controls; let i = index\">\r\n <div [formGroupName]=\"i\" [ngbAccordionItem]=\"'accordion-wall-' + i\"\r\n class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"me-2 wall-label\">\r\n {{ group.get(\"elementType\")?.value | titlecase }}\r\n {{ group.get(\"elementNumber\")?.value }}\r\n </span>\r\n\r\n @if(layoutForm.enabled){\r\n <span class=\"me-1\" ngbTooltip=\"Rotate this wall.\"\r\n (click)=\"rotateWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M3.73735 8.25011C4.12193 8.24362 4.44377 8.52776 4.49338 8.89998L4.4999 8.98735L4.50262 9.15516C4.58434 11.5741 6.57243 13.5 9 13.5C9.14022 13.5 9.27951 13.4936 9.41756 13.4809L9.21967 13.2803C8.92678 12.9874 8.92678 12.5126 9.21967 12.2197C9.51257 11.9268 9.98744 11.9268 10.2803 12.2197L11.7803 13.7197C12.0732 14.0126 12.0732 14.4874 11.7803 14.7803L10.2803 16.2803C9.98744 16.5732 9.51257 16.5732 9.21967 16.2803C8.92678 15.9874 8.92678 15.5126 9.21967 15.2197L9.45837 14.9827C9.30646 14.9942 9.15359 15 9 15C5.82653 15 3.21665 12.5321 3.0125 9.38289L3.00315 9.19314L3.00011 9.01265C2.99312 8.59849 3.3232 8.25709 3.73735 8.25011ZM8.78033 1.71967C9.0507 1.99003 9.07149 2.41546 8.84272 2.70967L8.78033 2.78033L8.54187 3.01726C8.69371 3.00578 8.8465 3 9 3C12.3137 3 15 5.68629 15 9C15 9.41421 14.6642 9.75 14.25 9.75C13.8358 9.75 13.5 9.41421 13.5 9C13.5 6.51472 11.4853 4.5 9 4.5C8.8597 4.5 8.72034 4.5064 8.58221 4.51909L8.78033 4.71967C9.07323 5.01256 9.07323 5.48744 8.78033 5.78033C8.50997 6.05069 8.08455 6.07149 7.79033 5.84272L7.71967 5.78033L6.21967 4.28033C5.94931 4.00997 5.92851 3.58454 6.15728 3.29033L6.21967 3.21967L7.71967 1.71967C8.01257 1.42678 8.48744 1.42678 8.78033 1.71967Z\"\r\n fill=\"#475467\" stroke=\"#475467\"\r\n stroke-width=\"0.00064\" />\r\n </svg>\r\n </span>\r\n <span class=\"me-1\" ngbTooltip=\"Insert new wall below.\"\r\n (click)=\"addNewWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_62_8)\">\r\n <path\r\n d=\"M9 9.75C11.0707 9.75 12.75 11.4293 12.75 13.5C12.75 15.5708 11.0707 17.25 9 17.25C6.92925 17.25 5.25 15.5708 5.25 13.5C5.25 11.4293 6.92925 9.75 9 9.75ZM9.75 11.25H8.25V12.7493L6.75 12.75V14.25L8.25 14.2493V15.75H9.75V14.2493L11.25 14.25V12.75L9.75 12.7493V11.25ZM15 2.25C15.414 2.25 15.75 2.586 15.75 3V7.5C15.75 7.914 15.414 8.25 15 8.25H3C2.586 8.25 2.25 7.914 2.25 7.5V3C2.25 2.586 2.586 2.25 3 2.25H15ZM3.75 3.75V6.75H14.25V3.75H3.75Z\"\r\n fill=\"#475467\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_62_8\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span class=\"me-1\"\r\n ngbTooltip=\"Remove this wall and its fixtures.\"\r\n (click)=\"deleteWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_63_25)\">\r\n <path\r\n d=\"M10.7094 1.5C11.3551 1.5 11.9283 1.91314 12.1324 2.52565L12.5406 3.75H15C15.4142 3.75 15.75 4.08579 15.75 4.5C15.75 4.9142 15.4142 5.24999 15 5.25L14.9981 5.30344L14.3476 14.4103C14.2635 15.5878 13.2838 16.5 12.1034 16.5H5.89668C4.71624 16.5 3.7365 15.5878 3.6524 14.4103L3.00191 5.30344C3.00062 5.28551 2.99998 5.26769 2.99997 5.25C2.58577 5.24999 2.25 4.9142 2.25 4.5C2.25 4.08579 2.58579 3.75 3 3.75H5.45943L5.86754 2.52565C6.07172 1.91314 6.64493 1.5 7.29057 1.5H10.7094ZM13.4981 5.25H4.50191L5.14858 14.3034C5.17662 14.696 5.5032 15 5.89668 15H12.1034C12.4968 15 12.8234 14.696 12.8514 14.3034L13.4981 5.25ZM7.5 7.5C7.88464 7.5 8.20163 7.78952 8.24495 8.16253L8.25 8.25V12C8.25 12.4142 7.91422 12.75 7.5 12.75C7.11537 12.75 6.79837 12.4605 6.75505 12.0875L6.75 12V8.25C6.75 7.83578 7.08578 7.5 7.5 7.5ZM10.5 7.5C10.9142 7.5 11.25 7.83578 11.25 8.25V12C11.25 12.4142 10.9142 12.75 10.5 12.75C10.0858 12.75 9.75 12.4142 9.75 12V8.25C9.75 7.83578 10.0858 7.5 10.5 7.5ZM10.7094 3H7.29057L7.04057 3.75H10.9595L10.7094 3Z\"\r\n fill=\"#F32B2B\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_63_25\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n }\r\n </div>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <ng-template>\r\n <div style=\"min-height: 50px\" dndDropzone\r\n (dndDrop)=\"onDrop($event, i)\">\r\n <!-- Fixtures -->\r\n <ng-container *ngIf=\"getFormFixtures(i).controls.length\">\r\n <div formArrayName=\"fixtures\">\r\n <ng-container\r\n *ngFor=\"let fixture of getFormFixtures(i).controls; let j = index\">\r\n <div dndDropzone\r\n (dndDrop)=\"onDrop($event, i, j)\"\r\n [formGroupName]=\"j\"\r\n [dndDraggable]=\"{ wallIndex: i, fixtureIndex: j }\"\r\n [dndEffectAllowed]=\"'all'\"\r\n class=\"row g-0 mb-5 fixture-row\"\r\n [class.highlighted-fixture]=\"layoutForm.enabled && highlightedFixtureFormId && fixture.get('_id')?.value === highlightedFixtureFormId\"\r\n [dndDisableDragIf]=\"layoutForm.disabled\">\r\n\r\n <div class=\"col-1\">\r\n <div\r\n class=\"d-flex align-items-center justify-content-center h-100\">\r\n <svg dndDragImageRef\r\n [style]=\"{ cursor: layoutForm.disabled ? 'default' : 'move', opacity: '0.5' }\"\r\n width=\"25px\" viewBox=\"0 0 16 16\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"m 4.496094 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 0 0\"\r\n fill=\"grey\" />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-10\">\r\n <lib-reactive-select\r\n formControlName=\"fixtureConfigId\"\r\n [idField]=\"'_id'\"\r\n [nameField]=\"'name'\"\r\n [data]=\"fixtureTemplates\"\r\n [label]=\"'Fixture ' + (j + 1)\"\r\n [subTextField]=\"'subtext'\"\r\n [search]=\"true\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-1\">\r\n <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n [class.disabled-click]=\"layoutForm.disabled\">\r\n <svg (click)=\"deleteFixture('wall', j, i)\"\r\n style=\"cursor: pointer; margin-bottom: 18px\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\"\r\n stroke=\"#344054\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-end\">\r\n <a class=\"link-btn\"\r\n [class.disabled-click]=\"layoutForm.disabled\"\r\n (click)=\"addNewFixture('wall', i)\">\r\n Add fixture\r\n </a>\r\n </div>\r\n\r\n <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n <!-- Other Elements -->\r\n <ng-container\r\n *ngIf=\"getWallOtherElements(i).controls.length\">\r\n <div formArrayName=\"otherElements\">\r\n <ng-container\r\n *ngFor=\"let fixture of getWallOtherElements(i).controls; let j = index\">\r\n <div [formGroupName]=\"j\" class=\"row g-0 mb-5\">\r\n <div class=\"col-11\">\r\n <label class=\"form-label mb-1\">Element\r\n {{ j + 1 }}</label>\r\n\r\n <!-- Dropdown bound to 'type' -->\r\n <lib-reactive-select [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"otherElementList\"\r\n [id]=\"'elementLabel' + j\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <!-- Show custom text input only when 'Others' is selected -->\r\n <input\r\n *ngIf=\"(fixture.get('type')?.value) === 'Others'\"\r\n type=\"text\"\r\n class=\"form-control mt-2\"\r\n formControlName=\"customName\"\r\n placeholder=\"Enter custom element name\" />\r\n </div>\r\n\r\n <div class=\"col-1\">\r\n <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n [class.disabled-click]=\"layoutForm.disabled\">\r\n <svg (click)=\"removeOtherElement('wall', j, i)\"\r\n style=\"cursor: pointer; margin-bottom: 18px\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\"\r\n stroke=\"#344054\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-end\">\r\n <a class=\"link-btn\"\r\n [class.disabled-click]=\"layoutForm.disabled\"\r\n (click)=\"addNewOtherElements('wall', i)\">\r\n Add element\r\n </a>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #addWallAction>\r\n <button (click)=\"addNewWall(0)\" [class.disabled-click]=\"layoutForm.disabled\"\r\n class=\"btn btn-secondary w-100 p-2\">\r\n Insert new wall\r\n </button>\r\n </ng-template>\r\n\r\n <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n <!-- Floor Section -->\r\n <div [ngbAccordionItem]=\"'accordion-floor'\" class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <span class=\"me-2 wall-label\">Floor</span>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <ng-template>\r\n <div style=\"min-height: 50px\" dndDropzone\r\n (dndDrop)=\"onDrop($event, 'floor')\">\r\n <!-- Floor Fixtures -->\r\n <ng-container *ngIf=\"getFormFloorFixtures.controls.length\">\r\n <div formArrayName=\"floorFixtures\">\r\n <ng-container\r\n *ngFor=\"let fixture of getFormFloorFixtures.controls; let j = index\">\r\n <div dndDropzone (dndDrop)=\"onDrop($event, 'floor', j)\"\r\n [formGroupName]=\"j\"\r\n [dndDraggable]=\"{ wallIndex: 'floor', fixtureIndex: j }\"\r\n [dndEffectAllowed]=\"'all'\"\r\n [dndDisableDragIf]=\"layoutForm.disabled\"\r\n class=\"row g-0 mb-5 fixture-row\"\r\n [class.highlighted-fixture]=\"layoutForm.enabled && highlightedFixtureFormId && fixture.get('_id')?.value === highlightedFixtureFormId\">\r\n\r\n <div class=\"col-1\">\r\n <div\r\n class=\"d-flex align-items-center justify-content-center h-100\">\r\n <svg dndDragImageRef\r\n style=\"cursor: move; opacity: 0.5\"\r\n width=\"25px\" viewBox=\"0 0 16 16\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"m 4.496094 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 0 0\"\r\n fill=\"grey\" />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-10\">\r\n <lib-reactive-select\r\n formControlName=\"fixtureConfigId\"\r\n [idField]=\"'_id'\" [nameField]=\"'name'\"\r\n [data]=\"fixtureTemplates\"\r\n [label]=\"'Fixture ' + (j + 1)\" [search]=\"true\"\r\n [subTextField]=\"'subtext'\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-1\">\r\n <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n [class.disabled-click]=\"layoutForm.disabled\">\r\n <svg (click)=\"deleteFixture('floor', j)\"\r\n style=\"cursor: pointer; margin-bottom: 18px\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"\r\n fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\"\r\n stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-end\">\r\n <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n (click)=\"addNewFixture('floor')\">\r\n Add fixture\r\n </a>\r\n </div>\r\n\r\n <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n <!-- Floor Other Elements -->\r\n <ng-container *ngIf=\"getFormFloorOtherElements.controls.length\">\r\n <div formArrayName=\"floorOtherElements\">\r\n <ng-container\r\n *ngFor=\"let fixture of getFormFloorOtherElements.controls; let j = index\">\r\n <div [formGroupName]=\"j\" class=\"row g-0 mb-5\">\r\n <div class=\"col-11\">\r\n <label class=\"form-label mb-1\">Element\r\n {{ j + 1 }}</label>\r\n\r\n <!-- Dropdown for type -->\r\n <lib-reactive-select [idField]=\"'value'\"\r\n [nameField]=\"'label'\" [data]=\"otherElementList\"\r\n [id]=\"'floorElementLabel' + j\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <!-- Conditional input for custom name -->\r\n <input\r\n *ngIf=\"(fixture.get('type')?.value) === 'Others'\"\r\n type=\"text\" class=\"form-control mt-2\"\r\n formControlName=\"customName\"\r\n placeholder=\"Enter custom element name\" />\r\n </div>\r\n\r\n <div class=\"col-1\">\r\n <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n [class.disabled-click]=\"layoutForm.disabled\">\r\n <svg (click)=\"removeOtherElement('floor', j)\"\r\n style=\"cursor: pointer; margin-bottom: 18px\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"\r\n fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\"\r\n stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-end\">\r\n <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n (click)=\"addNewOtherElements('floor')\">\r\n Add element\r\n </a>\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 <!-- Center Column -->\r\n <div class=\"col overflow-hidden position-relative\" [ngClass]=\"{ 'd-none': editFixture }\">\r\n <div id=\"canvas-card\" class=\"c-card position-relative\" #canvasContainer>\r\n <!-- Canvas View -->\r\n <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n\r\n <div class=\"position-absolute d-flex align-items-center justify-content-end gap-2\"\r\n style=\"top: 24px; right: 26px;width: calc(100% - 50px);\">\r\n <!-- Entrance Button -->\r\n <div *ngIf=\"layoutForm.enabled\" ngbTooltip=\"You can add up to two entrances.\"\r\n [disableTooltip]=\"getEntrances?.length < 2\" class=\"me-auto\">\r\n <button type=\"button\" style=\"padding: 8px 20px !important;\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm \"\r\n [disabled]=\"getEntrances?.length >= 2\" (click)=\"addNewEntrance()\">\r\n Add Entrance\r\n </button>\r\n </div>\r\n\r\n <!-- Cancel edit -->\r\n @if(layoutForm.enabled){\r\n @if(getStatus === 'allocationPending'){\r\n <button type=\"button\" class=\"btn btn-outline bg-white shadow-sm\" (click)=\"cancelEdit()\">\r\n Cancel\r\n </button>\r\n }@else {\r\n <button type=\"button\" class=\"btn btn-text\" (click)=\"cancelEdit()\">\r\n Cancel\r\n </button>\r\n }\r\n }\r\n\r\n <!-- Save -->\r\n @if(layoutForm.enabled){\r\n @if(getStatus === 'draft'){\r\n <button type=\"button\"\r\n class=\"btn btn-outline shadow-sm bg-white d-flex align-items-center gap-2 justify-content-center\"\r\n style=\"min-width: 130px;\"\r\n [disabled]=\"isSavingLayout\" (click)=\"updateLayout(true)\">\r\n <span *ngIf=\"isSavingLayout\" class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\r\n Save as Draft\r\n </button>\r\n }@else{\r\n <button type=\"button\"\r\n style=\"padding: 8px 20px !important;min-width: 90px;\"\r\n class=\"btn btn-primary text-nowrap d-flex align-items-center gap-2 justify-content-center\"\r\n [disabled]=\"isSavingLayout\" (click)=\"updateLayout(true)\">\r\n <span *ngIf=\"isSavingLayout\" class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\r\n Save\r\n </button>\r\n }\r\n }\r\n\r\n <!-- Compact button (CAD layouts only, view mode) \u2014 one-shot:\r\n clicking compacts the layout and drops the user into edit\r\n mode so the change is revertable via Cancel and persistable\r\n via Save / Submit. -->\r\n @if(canShowCompactToggle && layoutForm.disabled){\r\n <button type=\"button\"\r\n class=\"btn btn-outline shadow-sm bg-white d-flex align-items-center gap-2 justify-content-center\"\r\n (click)=\"compactLayout()\"\r\n ngbTooltip=\"Compact layout.\"\r\n container=\"body\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\">\r\n <polyline points=\"4 14 10 14 10 20\"></polyline>\r\n <polyline points=\"20 10 14 10 14 4\"></polyline>\r\n <line x1=\"14\" y1=\"10\" x2=\"21\" y2=\"3\"></line>\r\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"></line>\r\n </svg>\r\n </button>\r\n }\r\n\r\n <!-- Edit Button -->\r\n @if(isEditLayoutAllowed){\r\n <button type=\"button\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n 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\"\r\n 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 }\r\n\r\n <!-- Cancel Button (From allocation) -->\r\n <button *ngIf=\"layoutForm.disabled && isAllocationRun\" type=\"button\"\r\n class=\"btn btn-outline bg-white shadow-sm\" (click)=\"onClickRevertAllocation() \">\r\n Cancel\r\n </button>\r\n\r\n\r\n <!-- Run allocation / Complete -->\r\n @if(isRunAllocationAllowed && layoutForm.disabled && getStatus === 'allocationPending'){\r\n <span\r\n [ngbTooltip]=\"!isAllocationRun ? invalidFixturesTooltip : ''\"\r\n container=\"body\">\r\n <button type=\"button\" style=\"padding: 8px 20px !important;\"\r\n class=\"btn btn-primary text-nowrap\"\r\n [disabled]=\"!isAllocationRun && hasInvalidFixtures\"\r\n (click)=\"onClickRunAllocation()\">\r\n {{ isAllocationRun ? 'Complete Allocation' : 'Run Allocation' }}\r\n </button>\r\n </span>\r\n }\r\n\r\n <button *ngIf=\"getStatus === 'draft'\" type=\"button\" style=\"padding: 8px 20px !important\"\r\n class=\"btn btn-primary text-nowrap\" (click)=\"onClickApproveLayout()\">\r\n Submit for merch allocation\r\n </button>\r\n\r\n <!-- Rotate Button -->\r\n <button type=\"button\" *ngIf=\"layoutForm.disabled\" class=\"btn btn-outline bg-white shadow-sm\"\r\n (click)=\"rotateCanvas(canvas,90)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 26 26\"\r\n fill=\"none\">\r\n <path\r\n d=\"M6.36265 7.17887L7.17625 6.36287L5.90425 5.09207L5.08945 5.90567L6.36265 7.17887ZM15.671 6.36407L19.6379 10.3309L20.9099 9.05769L16.9442 5.09087L15.671 6.36407ZM19.6379 18.8257L18.8243 19.6393L20.0963 20.9101L20.9099 20.0977L19.6379 18.8257ZM10.3295 19.6393L6.36265 15.6725L5.09065 16.9457L9.05626 20.9113L10.3295 19.6393ZM18.8243 19.6393C17.6543 20.8081 16.8407 21.6193 16.1459 22.1497C15.4715 22.6645 15.0155 22.8289 14.5763 22.8289V24.6289C15.5675 24.6289 16.4027 24.2173 17.2367 23.5813C18.0503 22.9609 18.9635 22.0453 20.0963 20.9125L18.8243 19.6393ZM9.05626 20.9113C10.1891 22.0453 11.1023 22.9597 11.9159 23.5813C12.7499 24.2173 13.5851 24.6289 14.5763 24.6289V22.8289C14.1371 22.8289 13.6823 22.6645 13.0067 22.1497C12.3119 21.6193 11.4983 20.8081 10.3295 19.6393L9.05626 20.9113ZM19.6379 10.3309C20.8067 11.4997 21.6179 12.3133 22.1483 13.0081C22.6631 13.6837 22.8275 14.1385 22.8275 14.5777H24.6275C24.6275 13.5865 24.2159 12.7513 23.5799 11.9173C22.9595 11.1037 22.0427 10.1905 20.9099 9.05769L19.6379 10.3309ZM20.9099 20.0977C22.0439 18.9637 22.9583 18.0517 23.5799 17.2381C24.2159 16.4041 24.6275 15.5689 24.6275 14.5777H22.8275C22.8275 15.0169 22.6631 15.4729 22.1483 16.1473C21.6179 16.8421 20.8067 17.6557 19.6379 18.8257L20.9099 20.0977ZM7.17625 6.36287C8.34625 5.19407 9.15985 4.38167 9.85465 3.85127C10.529 3.33647 10.985 3.17327 11.4242 3.17327V1.37207C10.433 1.37207 9.59785 1.78367 8.76385 2.41967C7.94905 3.04127 7.03705 3.95567 5.90425 5.08847L7.17625 6.36287ZM16.9442 5.09087C15.8114 3.95687 14.8982 3.04127 14.0846 2.41967C13.2506 1.78367 12.4154 1.37207 11.4242 1.37207V3.17327C11.8634 3.17327 12.3182 3.33647 12.9938 3.85127C13.6886 4.38167 14.5022 5.19287 15.671 6.36167L16.9442 5.09087ZM5.08945 5.90327C3.95665 7.03607 3.04225 7.94807 2.42065 8.76287C1.78465 9.59687 1.37305 10.4321 1.37305 11.4233H3.17305C3.17305 10.9841 3.33745 10.5281 3.85225 9.85367C4.38265 9.15887 5.19385 8.34527 6.36265 7.17527L5.08945 5.90327ZM6.36265 15.6713C5.19385 14.5013 4.38265 13.6877 3.85225 12.9929C3.33745 12.3185 3.17305 11.8625 3.17305 11.4233H1.37305C1.37305 12.4145 1.78465 13.2497 2.42065 14.0837C3.04225 14.8973 3.95665 15.8105 5.08945 16.9433L6.36265 15.6713Z\"\r\n fill=\"#1D2939\" />\r\n <path\r\n d=\"M23.2 6.9832L25 8.2C25 4.582 22.4056 1.5796 19 1M2.8 19.0168L1 17.8C1 21.418 3.5944 24.4204 7 25\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- Download Button -->\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n (click)=\"downloadCanvas()\">\r\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" stroke=\"#000000\" stroke-width=\"0.24000000000000005\">\r\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n stroke=\"#CCCCCC\" stroke-width=\"0.384\"></g>\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <path\r\n d=\"M12.5535 16.5061C12.4114 16.6615 12.2106 16.75 12 16.75C11.7894 16.75 11.5886 16.6615 11.4465 16.5061L7.44648 12.1311C7.16698 11.8254 7.18822 11.351 7.49392 11.0715C7.79963 10.792 8.27402 10.8132 8.55352 11.1189L11.25 14.0682V3C11.25 2.58579 11.5858 2.25 12 2.25C12.4142 2.25 12.75 2.58579 12.75 3V14.0682L15.4465 11.1189C15.726 10.8132 16.2004 10.792 16.5061 11.0715C16.8118 11.351 16.833 11.8254 16.5535 12.1311L12.5535 16.5061Z\"\r\n fill=\"#1D2939\"></path>\r\n <path\r\n d=\"M3.75 15C3.75 14.5858 3.41422 14.25 3 14.25C2.58579 14.25 2.25 14.5858 2.25 15V15.0549C2.24998 16.4225 2.24996 17.5248 2.36652 18.3918C2.48754 19.2919 2.74643 20.0497 3.34835 20.6516C3.95027 21.2536 4.70814 21.5125 5.60825 21.6335C6.47522 21.75 7.57754 21.75 8.94513 21.75H15.0549C16.4225 21.75 17.5248 21.75 18.3918 21.6335C19.2919 21.5125 20.0497 21.2536 20.6517 20.6516C21.2536 20.0497 21.5125 19.2919 21.6335 18.3918C21.75 17.5248 21.75 16.4225 21.75 15.0549V15C21.75 14.5858 21.4142 14.25 21 14.25C20.5858 14.25 20.25 14.5858 20.25 15C20.25 16.4354 20.2484 17.4365 20.1469 18.1919C20.0482 18.9257 19.8678 19.3142 19.591 19.591C19.3142 19.8678 18.9257 20.0482 18.1919 20.1469C17.4365 20.2484 16.4354 20.25 15 20.25H9C7.56459 20.25 6.56347 20.2484 5.80812 20.1469C5.07435 20.0482 4.68577 19.8678 4.40901 19.591C4.13225 19.3142 3.9518 18.9257 3.85315 18.1919C3.75159 17.4365 3.75 16.4354 3.75 15Z\"\r\n fill=\"#1D2939\"></path>\r\n </g>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Panel Collapse Handlers -->\r\n <div class=\"collapse-handler left\" (click)=\"togglePanel('left')\">\r\n <svg *ngIf=\"!isLeftPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M8.27308 12.636L4.63672 8.99964L8.27308 5.36328M13.364 12.636L9.72763 8.99964L13.364 5.36328\"\r\n stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngIf=\"isLeftPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M9.72692 5.36399L13.3633 9.00036L9.72692 12.6367M4.63601 5.36399L8.27237 9.00036L4.63601 12.6367\"\r\n stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"collapse-handler right\" (click)=\"togglePanel('right')\">\r\n <svg *ngIf=\"isRightPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M8.27308 12.636L4.63672 8.99964L8.27308 5.36328M13.364 12.636L9.72763 8.99964L13.364 5.36328\"\r\n stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngIf=\"!isRightPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M9.72692 5.36399L13.3633 9.00036L9.72692 12.6367M4.63601 5.36399L8.27237 9.00036L4.63601 12.6367\"\r\n stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-- Edit Fixture Body -->\r\n <div class=\"col\" [ngClass]=\"{ 'd-none': !editFixture }\">\r\n <div id=\"edit-body\" class=\"row\">\r\n <ul class=\"mx-3 my-5 nav nav-pills\" role=\"tablist\">\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"submitFixture = false; editFixtureSection = 'basic-details'\"\r\n [ngClass]=\"editFixtureSection === 'basic-details' ? 'active' : ''\" class=\"nav-link\"\r\n role=\"tab\">\r\n Basic details\r\n </a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"submitFixture = false; editFixtureSection = 'products'\"\r\n [ngClass]=\"editFixtureSection === 'products' ? 'active' : ''\" class=\"nav-link\"\r\n role=\"tab\">\r\n Products\r\n </a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"submitFixture = false; editFixtureSection = 'vms'\"\r\n [ngClass]=\"editFixtureSection === 'vms' ? 'active' : ''\" class=\"nav-link\" role=\"tab\">\r\n Visual Merchandise\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n <div class=\"col\">\r\n <ng-container *ngIf=\"editFixtureSection === 'basic-details'\">\r\n <lib-instance-basic-details [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\"\r\n [libraryCategories]=\"libraryCategories\"\r\n [libraryByCategory]=\"libraryByCategory\"\r\n [allowCategoryAndWidthEdit]=\"true\">\r\n </lib-instance-basic-details>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"editFixtureSection === 'products'\">\r\n <lib-instance-products [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\">\r\n </lib-instance-products>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"editFixtureSection === 'vms'\">\r\n <lib-instance-vms [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\">\r\n </lib-instance-vms>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"{ 'collapsed-col': isRightPanelCollapsed, 'col-3': !isRightPanelCollapsed }\"\r\n [style]=\"{'min-width': isRightPanelCollapsed ? '0' : isAllocationRun ?'680px' : '464px' }\">\r\n <ng-container *ngTemplateOutlet=\"fixturePreviewCol\"></ng-container>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n</section>\r\n\r\n<ng-template #fixturePreviewCol>\r\n <div class=\"s-card\" [ngStyle]=\"{'margin-top':editFixture ? '72px' : '0px'}\">\r\n <onboard-fixture [ngClass]=\"{ 'd-none': isRightPanelCollapsed}\"\r\n (onClose)=\"togglePanel('right'); selectedFixtureData = null; removeHighlight();\"\r\n [fixtureData]=\"selectedFixtureData\" [isAllocationRun]=\"isAllocationRun\"\r\n [allFixtures]=\"allFixtureInstances\"></onboard-fixture>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #headerSkeleton>\r\n <div class=\"row m-0 g-0 loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n <div class=\"shimmer w-100 p-4 rounded\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke mt-0 animate title\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #skeletonLoader>\r\n <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n <div class=\"shimmer rounded\">\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 class=\"stroke animate description\"></div>\r\n <br />\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 <br />\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 <br />\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 <br />\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</ng-template>\r\n\r\n<ng-template #applyLogics let-modal>\r\n <div class=\"modal-body\">\r\n <div class=\"d-flex justify-content-start mb-4\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"#DAF1FF\" />\r\n <path\r\n d=\"M20.833 21.6665C18.033 21.6665 17.1164 22.7915 16.8164 23.5332C17.708 23.9165 18.333 24.7998 18.333 25.8332C18.333 26.4962 18.0696 27.1321 17.6008 27.6009C17.1319 28.0698 16.4961 28.3332 15.833 28.3332C15.17 28.3332 14.5341 28.0698 14.0653 27.6009C13.5964 27.1321 13.333 26.4962 13.333 25.8332C13.333 24.7415 14.0247 23.8165 14.9997 23.4748V16.5248C14.5114 16.3535 14.0885 16.0344 13.7899 15.6117C13.4912 15.1891 13.3315 14.684 13.333 14.1665C13.333 13.5035 13.5964 12.8676 14.0653 12.3987C14.5341 11.9299 15.17 11.6665 15.833 11.6665C16.4961 11.6665 17.1319 11.9299 17.6008 12.3987C18.0696 12.8676 18.333 13.5035 18.333 14.1665C18.333 15.2582 17.6414 16.1832 16.6664 16.5248V20.9332C17.3997 20.3915 18.4664 19.9998 19.9997 19.9998C22.2247 19.9998 22.9664 18.8832 23.208 18.1415C22.7521 17.9516 22.3625 17.6311 22.0882 17.2204C21.8139 16.8097 21.6671 16.3271 21.6664 15.8332C21.6664 15.1701 21.9297 14.5342 22.3986 14.0654C22.8674 13.5966 23.5033 13.3332 24.1664 13.3332C24.8294 13.3332 25.4653 13.5966 25.9341 14.0654C26.403 14.5342 26.6664 15.1701 26.6664 15.8332C26.6664 16.9498 25.933 17.9165 24.9247 18.2165C24.708 19.4082 23.8997 21.6665 20.833 21.6665ZM15.833 24.9998C15.612 24.9998 15.4 25.0876 15.2438 25.2439C15.0875 25.4002 14.9997 25.6122 14.9997 25.8332C14.9997 26.0542 15.0875 26.2661 15.2438 26.4224C15.4 26.5787 15.612 26.6665 15.833 26.6665C16.054 26.6665 16.266 26.5787 16.4223 26.4224C16.5786 26.2661 16.6664 26.0542 16.6664 25.8332C16.6664 25.6122 16.5786 25.4002 16.4223 25.2439C16.266 25.0876 16.054 24.9998 15.833 24.9998ZM15.833 13.3332C15.612 13.3332 15.4 13.421 15.2438 13.5772C15.0875 13.7335 14.9997 13.9455 14.9997 14.1665C14.9997 14.3875 15.0875 14.5995 15.2438 14.7558C15.4 14.912 15.612 14.9998 15.833 14.9998C16.054 14.9998 16.266 14.912 16.4223 14.7558C16.5786 14.5995 16.6664 14.3875 16.6664 14.1665C16.6664 13.9455 16.5786 13.7335 16.4223 13.5772C16.266 13.421 16.054 13.3332 15.833 13.3332ZM24.1664 14.9998C23.9453 14.9998 23.7334 15.0876 23.5771 15.2439C23.4208 15.4002 23.333 15.6122 23.333 15.8332C23.333 16.0542 23.4208 16.2661 23.5771 16.4224C23.7334 16.5787 23.9453 16.6665 24.1664 16.6665C24.3874 16.6665 24.5993 16.5787 24.7556 16.4224C24.9119 16.2661 24.9997 16.0542 24.9997 15.8332C24.9997 15.6122 24.9119 15.4002 24.7556 15.2439C24.5993 15.0876 24.3874 14.9998 24.1664 14.9998Z\"\r\n fill=\"#009BF3\" />\r\n </svg>\r\n\r\n </div>\r\n <div>\r\n <h2 class=\"mb-3\">Run Allocation Logic</h2>\r\n <p>This will map all fixtures and apply allocations based on the business-defined logic, then move them to\r\n the verification section. Are you sure you want to continue?</p>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n [disabled]=\"isButtonLoading\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"runAllocation()\" [disabled]=\"isButtonLoading\">\r\n <span *ngIf=\"!isButtonLoading\"> Run allocation Logic</span>\r\n <svg style=\"width: 141px;\" *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #approveLayoutModal let-modal>\r\n <div class=\"modal-body\">\r\n <div>\r\n <h2 class=\"mb-3\">Approve & Submit</h2>\r\n <p>\r\n This will complete the layout and make it ready for allocation. Ensure that all fixture counts and\r\n placements are as per the plan.\r\n </p>\r\n </div>\r\n @if(hasInvalidFixtures) {\r\n <div class=\"d-flex align-items-start gap-2 p-3 mb-3 rounded\"\r\n style=\"background-color: #FFFAEB; border: 1px solid #FEC84B;\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"flex-shrink: 0; margin-top: 1px;\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F59E0B\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <p class=\"mb-0\" style=\"font-size: 13px; color: #92400E;\">\r\n @if(hasInvalidHeaderFixtures) {\r\n <strong>{{invalidHeaderFixtureCount}} fixture{{invalidHeaderFixtureCount === 1 ? '' : 's'}}\r\n {{invalidHeaderFixtureCount === 1 ? 'has' : 'have'}} an unrecognized header.</strong><br/>\r\n }\r\n @if(hasInvalidLibraryFixtures) {\r\n <strong>{{invalidLibraryFixtureCount}} fixture{{invalidLibraryFixtureCount === 1 ? '' : 's'}}\r\n {{invalidLibraryFixtureCount === 1 ? 'does' : 'do'}} not match any library entry.</strong><br/>\r\n }\r\n These are highlighted in red on the layout and must be corrected before the allocation rule can run.\r\n </p>\r\n </div>\r\n }\r\n <div class=\"d-flex justify-content-end gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n [disabled]=\"isButtonLoading\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"approveLayout()\" [disabled]=\"isButtonLoading\">\r\n <span *ngIf=\"!isButtonLoading\">Submit</span>\r\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #revertAllocationModal let-modal>\r\n <div class=\"modal-body\">\r\n <div class=\"d-flex justify-content-start mb-4\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"#FEF3C7\" />\r\n <path\r\n d=\"M20 13.3333V20M20 26.6667H20.0167M28.3333 20C28.3333 24.6024 24.6024 28.3333 20 28.3333C15.3976 28.3333 11.6667 24.6024 11.6667 20C11.6667 15.3976 15.3976 11.6667 20 11.6667C24.6024 11.6667 28.3333 15.3976 28.3333 20Z\"\r\n stroke=\"#F59E0B\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <div>\r\n <h2 class=\"mb-3\">Revert Allocation</h2>\r\n <p>Are you sure you want to revert the allocation? This will restore the state before running allocation.\r\n </p>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n [disabled]=\"isButtonLoading\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"revertAllocation(); modal.close()\"\r\n [disabled]=\"isButtonLoading\">\r\n <span *ngIf=\"!isButtonLoading\">Revert</span>\r\n <svg style=\"width: 141px;\" *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #completeAllocationModal let-modal>\r\n <div class=\"modal-body\">\r\n <div class=\"d-flex justify-content-start mb-4\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"#DAF1FF\" />\r\n <path\r\n d=\"M20.833 21.6665C18.033 21.6665 17.1164 22.7915 16.8164 23.5332C17.708 23.9165 18.333 24.7998 18.333 25.8332C18.333 26.4962 18.0696 27.1321 17.6008 27.6009C17.1319 28.0698 16.4961 28.3332 15.833 28.3332C15.17 28.3332 14.5341 28.0698 14.0653 27.6009C13.5964 27.1321 13.333 26.4962 13.333 25.8332C13.333 24.7415 14.0247 23.8165 14.9997 23.4748V16.5248C14.5114 16.3535 14.0885 16.0344 13.7899 15.6117C13.4912 15.1891 13.3315 14.684 13.333 14.1665C13.333 13.5035 13.5964 12.8676 14.0653 12.3987C14.5341 11.9299 15.17 11.6665 15.833 11.6665C16.4961 11.6665 17.1319 11.9299 17.6008 12.3987C18.0696 12.8676 18.333 13.5035 18.333 14.1665C18.333 15.2582 17.6414 16.1832 16.6664 16.5248V20.9332C17.3997 20.3915 18.4664 19.9998 19.9997 19.9998C22.2247 19.9998 22.9664 18.8832 23.208 18.1415C22.7521 17.9516 22.3625 17.6311 22.0882 17.2204C21.8139 16.8097 21.6671 16.3271 21.6664 15.8332C21.6664 15.1701 21.9297 14.5342 22.3986 14.0654C22.8674 13.5966 23.5033 13.3332 24.1664 13.3332C24.8294 13.3332 25.4653 13.5966 25.9341 14.0654C26.403 14.5342 26.6664 15.1701 26.6664 15.8332C26.6664 16.9498 25.933 17.9165 24.9247 18.2165C24.708 19.4082 23.8997 21.6665 20.833 21.6665ZM15.833 24.9998C15.612 24.9998 15.4 25.0876 15.2438 25.2439C15.0875 25.4002 14.9997 25.6122 14.9997 25.8332C14.9997 26.0542 15.0875 26.2661 15.2438 26.4224C15.4 26.5787 15.612 26.6665 15.833 26.6665C16.054 26.6665 16.266 26.5787 16.4223 26.4224C16.5786 26.2661 16.6664 26.0542 16.6664 25.8332C16.6664 25.6122 16.5786 25.4002 16.4223 25.2439C16.266 25.0876 16.054 24.9998 15.833 24.9998ZM15.833 13.3332C15.612 13.3332 15.4 13.421 15.2438 13.5772C15.0875 13.7335 14.9997 13.9455 14.9997 14.1665C14.9997 14.3875 15.0875 14.5995 15.2438 14.7558C15.4 14.912 15.612 14.9998 15.833 14.9998C16.054 14.9998 16.266 14.912 16.4223 14.7558C16.5786 14.5995 16.6664 14.3875 16.6664 14.1665C16.6664 13.9455 16.5786 13.7335 16.4223 13.5772C16.266 13.421 16.054 13.3332 15.833 13.3332ZM24.1664 14.9998C23.9453 14.9998 23.7334 15.0876 23.5771 15.2439C23.4208 15.4002 23.333 15.6122 23.333 15.8332C23.333 16.0542 23.4208 16.2661 23.5771 16.4224C23.7334 16.5787 23.9453 16.6665 24.1664 16.6665C24.3874 16.6665 24.5993 16.5787 24.7556 16.4224C24.9119 16.2661 24.9997 16.0542 24.9997 15.8332C24.9997 15.6122 24.9119 15.4002 24.7556 15.2439C24.5993 15.0876 24.3874 14.9998 24.1664 14.9998Z\"\r\n fill=\"#009BF3\" />\r\n </svg>\r\n </div>\r\n <div>\r\n <h2 class=\"mb-3\">Save and complete allocation</h2>\r\n <p>You are about to complete the merch allocation process. This will make the store ready for fixture\r\n verification and move it to the verification stage. Are you sure you want to proceed?</p>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n [disabled]=\"isButtonLoading\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"completeAllocation();\" [disabled]=\"isButtonLoading\">\r\n <span *ngIf=\"!isButtonLoading\">Complete allocation</span>\r\n <svg style=\"width: 107px;\" *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </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}#onboard-plano ::ng-deep .backgroundImg{background-color:#f9fafb!important}#onboard-plano ::ng-deep .accordion .accordion-button.backgroundImg:not(.collapsed){background-color:#f9fafb!important}#onboard-plano ::ng-deep .accordion-body{padding:10px 20px 20px}#onboard-plano .s-card{position:relative;box-sizing:border-box;border-radius:8px;background:#fff;padding:20px 16px;height:75dvh;overflow-y:auto;overflow-x:visible}#onboard-plano .c-card{border-radius:8px;background:#fff;padding:20px 16px;height:75dvh;overflow:hidden;width:100%}#onboard-plano .h-card{border-radius:8px;background:#fff;padding:20px 16px;min-height:20dvh}#onboard-plano .wall-label{color:var(--Gray-600, #475467);font-family:Inter;font-size:14px;font-style:normal;font-weight:600}#onboard-plano img{width:100%;height:100%;object-fit:cover;display:block}#onboard-plano #header .title{color:var(--Gray-800, #1d2939);font-size:16px;font-weight:600;line-height:24px;margin:0}#onboard-plano #header .cus-btn{color:#009bf3;background:#eaf8ff;padding:4px 10px;border-radius:16px;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;text-align:center;cursor:pointer}#onboard-plano #header .cus-btn:hover{background:#e2f5ff}#onboard-plano .loader .shimmer{height:100%!important}#onboard-plano .collapse-handler{position:absolute;height:32px;width:32px;display:flex;justify-content:center;align-items:center;border-radius:50%;background:#fff;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808;cursor:pointer;top:12px}#onboard-plano .collapse-handler.right{right:0}#onboard-plano .collapse-handler.left{left:0}#onboard-plano .collapsed-col{transition:all .3s ease;width:40px!important}#onboard-plano [class^=col]{transition:all .3s ease}#onboard-plano #segment-btn .custom-tabs{border-radius:8px;border:1px solid var(--Gray-300, #d0d5dd);overflow:hidden;margin-bottom:24px}#onboard-plano #segment-btn .custom-tabs .nav-link{border-radius:0%;color:#495057;padding:.75rem 1rem;background-color:#fff;text-align:center;border-right:1px solid var(--Gray-300, #d0d5dd);transition:all ease .2s;font-weight:500}#onboard-plano #segment-btn .custom-tabs .nav-link.active{background:var(--Primary-500, #33b5ff);color:#fff}#onboard-plano #segment-btn .nav-tabs .nav-link{border:none;margin:0}#onboard-plano #segment-btn .nav-item{text-align:center}#onboard-plano #segment-btn .nav-item:last-child .nav-link{border:none}#onboard-plano .link-btn{color:#33b5ff;cursor:pointer;font-weight:500}#onboard-plano .link-btn:hover{color:#33b5ff;text-decoration:underline!important}#onboard-plano .btn-red{border-radius:8px!important;border:1px solid #fef3f2!important;background:#fef3f2!important;box-shadow:0 1px 2px #1018280d!important;padding:10px 18px!important;color:#b42318!important;font-size:16px!important;font-weight:600!important}#onboard-plano .updateClass{font-family:Inter;font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#667085}#onboard-plano .fixture-row{border-radius:8px;transition:background-color .2s ease,box-shadow .2s ease}#onboard-plano .fixture-row.highlighted-fixture{background-color:#eaf8ff;box-shadow:0 0 0 2px #33b5ff}.btn .spinner{height:22px;min-width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "component", type: i8.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i7.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i7.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i7.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i7.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i7.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i7.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "directive", type: i9.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }, { kind: "directive", type: i9.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { kind: "directive", type: i9.DndDragImageRefDirective, selector: "[dndDragImageRef]" }, { kind: "component", type: i10.InstanceBasicDetailsComponent, selector: "lib-instance-basic-details", inputs: ["fixtureData", "editMode", "isSubmitted", "revertOnEdit", "zoneEditMode", "libraryCategories", "libraryByCategory", "allowCategoryAndWidthEdit"], outputs: ["submitEvent"] }, { kind: "component", type: i11.InstanceProductsComponent, selector: "lib-instance-products", inputs: ["fixtureData", "editMode", "isSubmitted", "isRollout", "revertOnEdit", "zoneEditMode"], outputs: ["submitEvent"] }, { kind: "component", type: i12.InstanceVmsComponent, selector: "lib-instance-vms", inputs: ["fixtureData", "editMode", "isSubmitted", "isRollout", "revertOnEdit"], outputs: ["submitEvent"] }, { kind: "component", type: i13.OnboardFixtureComponent, selector: "onboard-fixture", inputs: ["fixtureData", "isAllocationRun", "allFixtures"], outputs: ["onClose"] }, { kind: "pipe", type: i5.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i5.DatePipe, name: "date" }] });
|
|
4219
4235
|
}
|
|
4220
4236
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OnboardStorePlanoComponent, decorators: [{
|
|
4221
4237
|
type: Component,
|
|
4222
|
-
args: [{ selector: "lib-onboard-store-plano", providers: [TitleCasePipe], template: "<section id=\"onboard-plano\">\r\n <!-- Loading State -->\r\n <div *ngIf=\"isPageLoading\" class=\"row\">\r\n <div class=\"col-12 m-0\">\r\n <ng-container *ngTemplateOutlet=\"headerSkeleton\"></ng-container>\r\n </div>\r\n <div class=\"col-3\">\r\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n </div>\r\n <div class=\"col-6\">\r\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n </div>\r\n <div class=\"col-3\">\r\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Content -->\r\n <div [ngClass]=\"{ 'd-none': isPageLoading }\">\r\n <!-- Header Accordion -->\r\n <div id=\"header\" ngbAccordion #accordion=\"ngbAccordion\" class=\"my-4\">\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <div ngbAccordionHeader class=\"d-flex justify-content-between align-items-center px-6 py-3\">\r\n <div class=\"d-flex gap-4 align-items-center\">\r\n <div style=\"margin-left:5px;\" *ngIf=\"planoData?.storeName\">\r\n <h2 class='title'>{{planoData?.storeName}} - Plano</h2>\r\n </div>\r\n <lib-reactive-select *ngIf=\"floorsList.length\" [formControl]=\"selectedFloorId\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorsList\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center gap-4\">\r\n <div *ngIf=\"!editFixture\" class=\"updateClass\">Last Update: {{floorData?.updatedAt}}</div>\r\n\r\n <div class=\"d-flex gap-4 align-items-center\">\r\n <!-- Edit Fixture Mode -->\r\n <ng-container *ngIf=\"editFixture\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\"\r\n (click)=\"onFixturePageCancel()\">\r\n Cancel\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onFixtureSave()\">\r\n Save & Close\r\n </button>\r\n </ng-container>\r\n <button ngbAccordionButton></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div id=\"header\" class=\"row mx-0 gap-3\">\r\n <!-- Plano Completion -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <h3 class=\"d-flex align-items-center gap-2\">\r\n Plano Completion %\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n fill=\"none\" ngbTooltip=\"% of overall planogram completion\">\r\n <g clip-path=\"url(#clip0_1517_129805)\">\r\n <path\r\n d=\"M9 12V9M9 6H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1517_129805\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </h3>\r\n <div class=\"row align-items-center mt-2\">\r\n <div class=\"col-9\">\r\n <div class=\"progress\" style=\"height: 4px\">\r\n <div class=\"progress-bar\" [ngClass]=\"\r\n [25, 50].includes(getProgressValue) ? 'bg-warning' : 'bg-success'\" role=\"progressbar\"\r\n [style]=\"'width:' + getProgressValue + '%'\"\r\n [attr.aria-valuenow]=\"getProgressValue\" aria-valuemin=\"0\"\r\n aria-valuemax=\"100\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-3\">{{ getProgressValue }}%</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Layout -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <h3><b>{{floorData?.floorNumber}}/{{ planoData?.floors?.length }}</b> Layout</h3>\r\n <div class=\"indicator mt-2\"\r\n [ngClass]=\"getStatus === 'allocationPending' ? 'completed' : 'draft'\">\r\n {{ getStatus === 'allocationPending' ? 'Completed' : 'Draft' }}\r\n </div>\r\n </div>\r\n\r\n <!-- Fixtures -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <h3><b>{{ allFixtureInstances.length }}</b> Fixtures</h3>\r\n <div class=\"indicator mt-2\" [ngClass]=\"getStatus\">\r\n {{ getStatusText }}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body -->\r\n <div id=\"body\" class=\"row\">\r\n <!-- Left Column -->\r\n <div\r\n [ngClass]=\"{ 'collapsed-col': isLeftPanelCollapsed, 'col-3': !isLeftPanelCollapsed,'d-none': editFixture }\">\r\n <div class=\"s-card\">\r\n <form [ngClass]=\"{ 'd-none': isLeftPanelCollapsed }\" [formGroup]=\"layoutForm\">\r\n <div ngbAccordion #bodyAccordion=\"ngbAccordion\">\r\n <!-- Walls Section -->\r\n <ng-container *ngIf=\"getFormWalls.controls.length; else addWallAction\">\r\n <ng-container formArrayName=\"walls\">\r\n <ng-container *ngFor=\"let group of getFormWalls.controls; let i = index\">\r\n <div [formGroupName]=\"i\" [ngbAccordionItem]=\"'accordion-wall-' + i\"\r\n class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"me-2 wall-label\">\r\n {{ group.get(\"elementType\")?.value | titlecase }}\r\n {{ group.get(\"elementNumber\")?.value }}\r\n </span>\r\n\r\n @if(layoutForm.enabled){\r\n <span class=\"me-1\" ngbTooltip=\"Rotate this wall.\"\r\n (click)=\"rotateWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M3.73735 8.25011C4.12193 8.24362 4.44377 8.52776 4.49338 8.89998L4.4999 8.98735L4.50262 9.15516C4.58434 11.5741 6.57243 13.5 9 13.5C9.14022 13.5 9.27951 13.4936 9.41756 13.4809L9.21967 13.2803C8.92678 12.9874 8.92678 12.5126 9.21967 12.2197C9.51257 11.9268 9.98744 11.9268 10.2803 12.2197L11.7803 13.7197C12.0732 14.0126 12.0732 14.4874 11.7803 14.7803L10.2803 16.2803C9.98744 16.5732 9.51257 16.5732 9.21967 16.2803C8.92678 15.9874 8.92678 15.5126 9.21967 15.2197L9.45837 14.9827C9.30646 14.9942 9.15359 15 9 15C5.82653 15 3.21665 12.5321 3.0125 9.38289L3.00315 9.19314L3.00011 9.01265C2.99312 8.59849 3.3232 8.25709 3.73735 8.25011ZM8.78033 1.71967C9.0507 1.99003 9.07149 2.41546 8.84272 2.70967L8.78033 2.78033L8.54187 3.01726C8.69371 3.00578 8.8465 3 9 3C12.3137 3 15 5.68629 15 9C15 9.41421 14.6642 9.75 14.25 9.75C13.8358 9.75 13.5 9.41421 13.5 9C13.5 6.51472 11.4853 4.5 9 4.5C8.8597 4.5 8.72034 4.5064 8.58221 4.51909L8.78033 4.71967C9.07323 5.01256 9.07323 5.48744 8.78033 5.78033C8.50997 6.05069 8.08455 6.07149 7.79033 5.84272L7.71967 5.78033L6.21967 4.28033C5.94931 4.00997 5.92851 3.58454 6.15728 3.29033L6.21967 3.21967L7.71967 1.71967C8.01257 1.42678 8.48744 1.42678 8.78033 1.71967Z\"\r\n fill=\"#475467\" stroke=\"#475467\"\r\n stroke-width=\"0.00064\" />\r\n </svg>\r\n </span>\r\n <span class=\"me-1\" ngbTooltip=\"Insert new wall below.\"\r\n (click)=\"addNewWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_62_8)\">\r\n <path\r\n d=\"M9 9.75C11.0707 9.75 12.75 11.4293 12.75 13.5C12.75 15.5708 11.0707 17.25 9 17.25C6.92925 17.25 5.25 15.5708 5.25 13.5C5.25 11.4293 6.92925 9.75 9 9.75ZM9.75 11.25H8.25V12.7493L6.75 12.75V14.25L8.25 14.2493V15.75H9.75V14.2493L11.25 14.25V12.75L9.75 12.7493V11.25ZM15 2.25C15.414 2.25 15.75 2.586 15.75 3V7.5C15.75 7.914 15.414 8.25 15 8.25H3C2.586 8.25 2.25 7.914 2.25 7.5V3C2.25 2.586 2.586 2.25 3 2.25H15ZM3.75 3.75V6.75H14.25V3.75H3.75Z\"\r\n fill=\"#475467\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_62_8\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span class=\"me-1\"\r\n ngbTooltip=\"Remove this wall and its fixtures.\"\r\n (click)=\"deleteWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_63_25)\">\r\n <path\r\n d=\"M10.7094 1.5C11.3551 1.5 11.9283 1.91314 12.1324 2.52565L12.5406 3.75H15C15.4142 3.75 15.75 4.08579 15.75 4.5C15.75 4.9142 15.4142 5.24999 15 5.25L14.9981 5.30344L14.3476 14.4103C14.2635 15.5878 13.2838 16.5 12.1034 16.5H5.89668C4.71624 16.5 3.7365 15.5878 3.6524 14.4103L3.00191 5.30344C3.00062 5.28551 2.99998 5.26769 2.99997 5.25C2.58577 5.24999 2.25 4.9142 2.25 4.5C2.25 4.08579 2.58579 3.75 3 3.75H5.45943L5.86754 2.52565C6.07172 1.91314 6.64493 1.5 7.29057 1.5H10.7094ZM13.4981 5.25H4.50191L5.14858 14.3034C5.17662 14.696 5.5032 15 5.89668 15H12.1034C12.4968 15 12.8234 14.696 12.8514 14.3034L13.4981 5.25ZM7.5 7.5C7.88464 7.5 8.20163 7.78952 8.24495 8.16253L8.25 8.25V12C8.25 12.4142 7.91422 12.75 7.5 12.75C7.11537 12.75 6.79837 12.4605 6.75505 12.0875L6.75 12V8.25C6.75 7.83578 7.08578 7.5 7.5 7.5ZM10.5 7.5C10.9142 7.5 11.25 7.83578 11.25 8.25V12C11.25 12.4142 10.9142 12.75 10.5 12.75C10.0858 12.75 9.75 12.4142 9.75 12V8.25C9.75 7.83578 10.0858 7.5 10.5 7.5ZM10.7094 3H7.29057L7.04057 3.75H10.9595L10.7094 3Z\"\r\n fill=\"#F32B2B\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_63_25\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n }\r\n </div>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <ng-template>\r\n <div style=\"min-height: 50px\" dndDropzone\r\n (dndDrop)=\"onDrop($event, i)\">\r\n <!-- Fixtures -->\r\n <ng-container *ngIf=\"getFormFixtures(i).controls.length\">\r\n <div formArrayName=\"fixtures\">\r\n <ng-container\r\n *ngFor=\"let fixture of getFormFixtures(i).controls; let j = index\">\r\n <div dndDropzone\r\n (dndDrop)=\"onDrop($event, i, j)\"\r\n [formGroupName]=\"j\"\r\n [dndDraggable]=\"{ wallIndex: i, fixtureIndex: j }\"\r\n [dndEffectAllowed]=\"'all'\"\r\n class=\"row g-0 mb-5 fixture-row\"\r\n [class.highlighted-fixture]=\"layoutForm.enabled && highlightedFixtureFormId && fixture.get('_id')?.value === highlightedFixtureFormId\"\r\n [dndDisableDragIf]=\"layoutForm.disabled\">\r\n\r\n <div class=\"col-1\">\r\n <div\r\n class=\"d-flex align-items-center justify-content-center h-100\">\r\n <svg dndDragImageRef\r\n [style]=\"{ cursor: layoutForm.disabled ? 'default' : 'move', opacity: '0.5' }\"\r\n width=\"25px\" viewBox=\"0 0 16 16\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"m 4.496094 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 0 0\"\r\n fill=\"grey\" />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-10\">\r\n <lib-reactive-select\r\n formControlName=\"fixtureConfigId\"\r\n [idField]=\"'_id'\"\r\n [nameField]=\"'name'\"\r\n [data]=\"fixtureTemplates\"\r\n [label]=\"'Fixture ' + (j + 1)\"\r\n [subTextField]=\"'subtext'\"\r\n [search]=\"true\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-1\">\r\n <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n [class.disabled-click]=\"layoutForm.disabled\">\r\n <svg (click)=\"deleteFixture('wall', j, i)\"\r\n style=\"cursor: pointer; margin-bottom: 18px\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\"\r\n stroke=\"#344054\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-end\">\r\n <a class=\"link-btn\"\r\n [class.disabled-click]=\"layoutForm.disabled\"\r\n (click)=\"addNewFixture('wall', i)\">\r\n Add fixture\r\n </a>\r\n </div>\r\n\r\n <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n <!-- Other Elements -->\r\n <ng-container\r\n *ngIf=\"getWallOtherElements(i).controls.length\">\r\n <div formArrayName=\"otherElements\">\r\n <ng-container\r\n *ngFor=\"let fixture of getWallOtherElements(i).controls; let j = index\">\r\n <div [formGroupName]=\"j\" class=\"row g-0 mb-5\">\r\n <div class=\"col-11\">\r\n <label class=\"form-label mb-1\">Element\r\n {{ j + 1 }}</label>\r\n\r\n <!-- Dropdown bound to 'type' -->\r\n <lib-reactive-select [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"otherElementList\"\r\n [id]=\"'elementLabel' + j\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <!-- Show custom text input only when 'Others' is selected -->\r\n <input\r\n *ngIf=\"(fixture.get('type')?.value) === 'Others'\"\r\n type=\"text\"\r\n class=\"form-control mt-2\"\r\n formControlName=\"customName\"\r\n placeholder=\"Enter custom element name\" />\r\n </div>\r\n\r\n <div class=\"col-1\">\r\n <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n [class.disabled-click]=\"layoutForm.disabled\">\r\n <svg (click)=\"removeOtherElement('wall', j, i)\"\r\n style=\"cursor: pointer; margin-bottom: 18px\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\"\r\n stroke=\"#344054\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-end\">\r\n <a class=\"link-btn\"\r\n [class.disabled-click]=\"layoutForm.disabled\"\r\n (click)=\"addNewOtherElements('wall', i)\">\r\n Add element\r\n </a>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #addWallAction>\r\n <button (click)=\"addNewWall(0)\" [class.disabled-click]=\"layoutForm.disabled\"\r\n class=\"btn btn-secondary w-100 p-2\">\r\n Insert new wall\r\n </button>\r\n </ng-template>\r\n\r\n <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n <!-- Floor Section -->\r\n <div [ngbAccordionItem]=\"'accordion-floor'\" class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <span class=\"me-2 wall-label\">Floor</span>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <ng-template>\r\n <div style=\"min-height: 50px\" dndDropzone\r\n (dndDrop)=\"onDrop($event, 'floor')\">\r\n <!-- Floor Fixtures -->\r\n <ng-container *ngIf=\"getFormFloorFixtures.controls.length\">\r\n <div formArrayName=\"floorFixtures\">\r\n <ng-container\r\n *ngFor=\"let fixture of getFormFloorFixtures.controls; let j = index\">\r\n <div dndDropzone (dndDrop)=\"onDrop($event, 'floor', j)\"\r\n [formGroupName]=\"j\"\r\n [dndDraggable]=\"{ wallIndex: 'floor', fixtureIndex: j }\"\r\n [dndEffectAllowed]=\"'all'\"\r\n [dndDisableDragIf]=\"layoutForm.disabled\"\r\n class=\"row g-0 mb-5 fixture-row\"\r\n [class.highlighted-fixture]=\"layoutForm.enabled && highlightedFixtureFormId && fixture.get('_id')?.value === highlightedFixtureFormId\">\r\n\r\n <div class=\"col-1\">\r\n <div\r\n class=\"d-flex align-items-center justify-content-center h-100\">\r\n <svg dndDragImageRef\r\n style=\"cursor: move; opacity: 0.5\"\r\n width=\"25px\" viewBox=\"0 0 16 16\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"m 4.496094 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 0 0\"\r\n fill=\"grey\" />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-10\">\r\n <lib-reactive-select\r\n formControlName=\"fixtureConfigId\"\r\n [idField]=\"'_id'\" [nameField]=\"'name'\"\r\n [data]=\"fixtureTemplates\"\r\n [label]=\"'Fixture ' + (j + 1)\" [search]=\"true\"\r\n [subTextField]=\"'subtext'\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-1\">\r\n <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n [class.disabled-click]=\"layoutForm.disabled\">\r\n <svg (click)=\"deleteFixture('floor', j)\"\r\n style=\"cursor: pointer; margin-bottom: 18px\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"\r\n fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\"\r\n stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-end\">\r\n <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n (click)=\"addNewFixture('floor')\">\r\n Add fixture\r\n </a>\r\n </div>\r\n\r\n <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n <!-- Floor Other Elements -->\r\n <ng-container *ngIf=\"getFormFloorOtherElements.controls.length\">\r\n <div formArrayName=\"floorOtherElements\">\r\n <ng-container\r\n *ngFor=\"let fixture of getFormFloorOtherElements.controls; let j = index\">\r\n <div [formGroupName]=\"j\" class=\"row g-0 mb-5\">\r\n <div class=\"col-11\">\r\n <label class=\"form-label mb-1\">Element\r\n {{ j + 1 }}</label>\r\n\r\n <!-- Dropdown for type -->\r\n <lib-reactive-select [idField]=\"'value'\"\r\n [nameField]=\"'label'\" [data]=\"otherElementList\"\r\n [id]=\"'floorElementLabel' + j\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <!-- Conditional input for custom name -->\r\n <input\r\n *ngIf=\"(fixture.get('type')?.value) === 'Others'\"\r\n type=\"text\" class=\"form-control mt-2\"\r\n formControlName=\"customName\"\r\n placeholder=\"Enter custom element name\" />\r\n </div>\r\n\r\n <div class=\"col-1\">\r\n <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n [class.disabled-click]=\"layoutForm.disabled\">\r\n <svg (click)=\"removeOtherElement('floor', j)\"\r\n style=\"cursor: pointer; margin-bottom: 18px\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"\r\n fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\"\r\n stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-end\">\r\n <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n (click)=\"addNewOtherElements('floor')\">\r\n Add element\r\n </a>\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 <!-- Center Column -->\r\n <div class=\"col overflow-hidden position-relative\" [ngClass]=\"{ 'd-none': editFixture }\">\r\n <div id=\"canvas-card\" class=\"c-card position-relative\" #canvasContainer>\r\n <!-- Canvas View -->\r\n <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n\r\n <div class=\"position-absolute d-flex align-items-center justify-content-end gap-2\"\r\n style=\"top: 24px; right: 26px;width: calc(100% - 50px);\">\r\n <!-- Entrance Button -->\r\n <div *ngIf=\"layoutForm.enabled\" ngbTooltip=\"You can add up to two entrances.\"\r\n [disableTooltip]=\"getEntrances?.length < 2\" class=\"me-auto\">\r\n <button type=\"button\" style=\"padding: 8px 20px !important;\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm \"\r\n [disabled]=\"getEntrances?.length >= 2\" (click)=\"addNewEntrance()\">\r\n Add Entrance\r\n </button>\r\n </div>\r\n\r\n <!-- Cancel edit -->\r\n @if(layoutForm.enabled){\r\n @if(getStatus === 'allocationPending'){\r\n <button type=\"button\" class=\"btn btn-outline bg-white shadow-sm\" (click)=\"cancelEdit()\">\r\n Cancel\r\n </button>\r\n }@else {\r\n <button type=\"button\" class=\"btn btn-text\" (click)=\"cancelEdit()\">\r\n Cancel\r\n </button>\r\n }\r\n }\r\n\r\n <!-- Save -->\r\n @if(layoutForm.enabled){\r\n @if(getStatus === 'draft'){\r\n <button type=\"button\"\r\n class=\"btn btn-outline shadow-sm bg-white d-flex align-items-center gap-2 justify-content-center\"\r\n style=\"min-width: 130px;\"\r\n [disabled]=\"isSavingLayout\" (click)=\"updateLayout(true)\">\r\n <span *ngIf=\"isSavingLayout\" class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\r\n Save as Draft\r\n </button>\r\n }@else{\r\n <button type=\"button\"\r\n style=\"padding: 8px 20px !important;min-width: 90px;\"\r\n class=\"btn btn-primary text-nowrap d-flex align-items-center gap-2 justify-content-center\"\r\n [disabled]=\"isSavingLayout\" (click)=\"updateLayout(true)\">\r\n <span *ngIf=\"isSavingLayout\" class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\r\n Save\r\n </button>\r\n }\r\n }\r\n\r\n <!-- Compact button (CAD layouts only, view mode) \u2014 one-shot:\r\n clicking compacts the layout and drops the user into edit\r\n mode so the change is revertable via Cancel and persistable\r\n via Save / Submit. -->\r\n @if(canShowCompactToggle && layoutForm.disabled){\r\n <button type=\"button\"\r\n class=\"btn btn-outline shadow-sm bg-white d-flex align-items-center gap-2 justify-content-center\"\r\n (click)=\"compactLayout()\"\r\n ngbTooltip=\"Compact layout.\"\r\n container=\"body\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\">\r\n <polyline points=\"4 14 10 14 10 20\"></polyline>\r\n <polyline points=\"20 10 14 10 14 4\"></polyline>\r\n <line x1=\"14\" y1=\"10\" x2=\"21\" y2=\"3\"></line>\r\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"></line>\r\n </svg>\r\n </button>\r\n }\r\n\r\n <!-- Edit Button -->\r\n @if(isEditLayoutAllowed){\r\n <button type=\"button\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n 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\"\r\n 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 }\r\n\r\n <!-- Cancel Button (From allocation) -->\r\n <button *ngIf=\"layoutForm.disabled && isAllocationRun\" type=\"button\"\r\n class=\"btn btn-outline bg-white shadow-sm\" (click)=\"onClickRevertAllocation() \">\r\n Cancel\r\n </button>\r\n\r\n\r\n <!-- Run allocation / Complete -->\r\n @if(isRunAllocationAllowed && layoutForm.disabled && getStatus === 'allocationPending'){\r\n <span\r\n [ngbTooltip]=\"!isAllocationRun ? invalidFixturesTooltip : ''\"\r\n container=\"body\">\r\n <button type=\"button\" style=\"padding: 8px 20px !important;\"\r\n class=\"btn btn-primary text-nowrap\"\r\n [disabled]=\"!isAllocationRun && hasInvalidFixtures\"\r\n (click)=\"onClickRunAllocation()\">\r\n {{ isAllocationRun ? 'Complete Allocation' : 'Run Allocation' }}\r\n </button>\r\n </span>\r\n }\r\n\r\n <button *ngIf=\"getStatus === 'draft'\" type=\"button\" style=\"padding: 8px 20px !important\"\r\n class=\"btn btn-primary text-nowrap\" (click)=\"onClickApproveLayout()\">\r\n Submit for merch allocation\r\n </button>\r\n\r\n <!-- Rotate Button -->\r\n <button type=\"button\" *ngIf=\"layoutForm.disabled\" class=\"btn btn-outline bg-white shadow-sm\"\r\n (click)=\"rotateCanvas(canvas,90)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 26 26\"\r\n fill=\"none\">\r\n <path\r\n d=\"M6.36265 7.17887L7.17625 6.36287L5.90425 5.09207L5.08945 5.90567L6.36265 7.17887ZM15.671 6.36407L19.6379 10.3309L20.9099 9.05769L16.9442 5.09087L15.671 6.36407ZM19.6379 18.8257L18.8243 19.6393L20.0963 20.9101L20.9099 20.0977L19.6379 18.8257ZM10.3295 19.6393L6.36265 15.6725L5.09065 16.9457L9.05626 20.9113L10.3295 19.6393ZM18.8243 19.6393C17.6543 20.8081 16.8407 21.6193 16.1459 22.1497C15.4715 22.6645 15.0155 22.8289 14.5763 22.8289V24.6289C15.5675 24.6289 16.4027 24.2173 17.2367 23.5813C18.0503 22.9609 18.9635 22.0453 20.0963 20.9125L18.8243 19.6393ZM9.05626 20.9113C10.1891 22.0453 11.1023 22.9597 11.9159 23.5813C12.7499 24.2173 13.5851 24.6289 14.5763 24.6289V22.8289C14.1371 22.8289 13.6823 22.6645 13.0067 22.1497C12.3119 21.6193 11.4983 20.8081 10.3295 19.6393L9.05626 20.9113ZM19.6379 10.3309C20.8067 11.4997 21.6179 12.3133 22.1483 13.0081C22.6631 13.6837 22.8275 14.1385 22.8275 14.5777H24.6275C24.6275 13.5865 24.2159 12.7513 23.5799 11.9173C22.9595 11.1037 22.0427 10.1905 20.9099 9.05769L19.6379 10.3309ZM20.9099 20.0977C22.0439 18.9637 22.9583 18.0517 23.5799 17.2381C24.2159 16.4041 24.6275 15.5689 24.6275 14.5777H22.8275C22.8275 15.0169 22.6631 15.4729 22.1483 16.1473C21.6179 16.8421 20.8067 17.6557 19.6379 18.8257L20.9099 20.0977ZM7.17625 6.36287C8.34625 5.19407 9.15985 4.38167 9.85465 3.85127C10.529 3.33647 10.985 3.17327 11.4242 3.17327V1.37207C10.433 1.37207 9.59785 1.78367 8.76385 2.41967C7.94905 3.04127 7.03705 3.95567 5.90425 5.08847L7.17625 6.36287ZM16.9442 5.09087C15.8114 3.95687 14.8982 3.04127 14.0846 2.41967C13.2506 1.78367 12.4154 1.37207 11.4242 1.37207V3.17327C11.8634 3.17327 12.3182 3.33647 12.9938 3.85127C13.6886 4.38167 14.5022 5.19287 15.671 6.36167L16.9442 5.09087ZM5.08945 5.90327C3.95665 7.03607 3.04225 7.94807 2.42065 8.76287C1.78465 9.59687 1.37305 10.4321 1.37305 11.4233H3.17305C3.17305 10.9841 3.33745 10.5281 3.85225 9.85367C4.38265 9.15887 5.19385 8.34527 6.36265 7.17527L5.08945 5.90327ZM6.36265 15.6713C5.19385 14.5013 4.38265 13.6877 3.85225 12.9929C3.33745 12.3185 3.17305 11.8625 3.17305 11.4233H1.37305C1.37305 12.4145 1.78465 13.2497 2.42065 14.0837C3.04225 14.8973 3.95665 15.8105 5.08945 16.9433L6.36265 15.6713Z\"\r\n fill=\"#1D2939\" />\r\n <path\r\n d=\"M23.2 6.9832L25 8.2C25 4.582 22.4056 1.5796 19 1M2.8 19.0168L1 17.8C1 21.418 3.5944 24.4204 7 25\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- Download Button -->\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n (click)=\"downloadCanvas()\">\r\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" stroke=\"#000000\" stroke-width=\"0.24000000000000005\">\r\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n stroke=\"#CCCCCC\" stroke-width=\"0.384\"></g>\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <path\r\n d=\"M12.5535 16.5061C12.4114 16.6615 12.2106 16.75 12 16.75C11.7894 16.75 11.5886 16.6615 11.4465 16.5061L7.44648 12.1311C7.16698 11.8254 7.18822 11.351 7.49392 11.0715C7.79963 10.792 8.27402 10.8132 8.55352 11.1189L11.25 14.0682V3C11.25 2.58579 11.5858 2.25 12 2.25C12.4142 2.25 12.75 2.58579 12.75 3V14.0682L15.4465 11.1189C15.726 10.8132 16.2004 10.792 16.5061 11.0715C16.8118 11.351 16.833 11.8254 16.5535 12.1311L12.5535 16.5061Z\"\r\n fill=\"#1D2939\"></path>\r\n <path\r\n d=\"M3.75 15C3.75 14.5858 3.41422 14.25 3 14.25C2.58579 14.25 2.25 14.5858 2.25 15V15.0549C2.24998 16.4225 2.24996 17.5248 2.36652 18.3918C2.48754 19.2919 2.74643 20.0497 3.34835 20.6516C3.95027 21.2536 4.70814 21.5125 5.60825 21.6335C6.47522 21.75 7.57754 21.75 8.94513 21.75H15.0549C16.4225 21.75 17.5248 21.75 18.3918 21.6335C19.2919 21.5125 20.0497 21.2536 20.6517 20.6516C21.2536 20.0497 21.5125 19.2919 21.6335 18.3918C21.75 17.5248 21.75 16.4225 21.75 15.0549V15C21.75 14.5858 21.4142 14.25 21 14.25C20.5858 14.25 20.25 14.5858 20.25 15C20.25 16.4354 20.2484 17.4365 20.1469 18.1919C20.0482 18.9257 19.8678 19.3142 19.591 19.591C19.3142 19.8678 18.9257 20.0482 18.1919 20.1469C17.4365 20.2484 16.4354 20.25 15 20.25H9C7.56459 20.25 6.56347 20.2484 5.80812 20.1469C5.07435 20.0482 4.68577 19.8678 4.40901 19.591C4.13225 19.3142 3.9518 18.9257 3.85315 18.1919C3.75159 17.4365 3.75 16.4354 3.75 15Z\"\r\n fill=\"#1D2939\"></path>\r\n </g>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Panel Collapse Handlers -->\r\n <div class=\"collapse-handler left\" (click)=\"togglePanel('left')\">\r\n <svg *ngIf=\"!isLeftPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M8.27308 12.636L4.63672 8.99964L8.27308 5.36328M13.364 12.636L9.72763 8.99964L13.364 5.36328\"\r\n stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngIf=\"isLeftPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M9.72692 5.36399L13.3633 9.00036L9.72692 12.6367M4.63601 5.36399L8.27237 9.00036L4.63601 12.6367\"\r\n stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"collapse-handler right\" (click)=\"togglePanel('right')\">\r\n <svg *ngIf=\"isRightPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M8.27308 12.636L4.63672 8.99964L8.27308 5.36328M13.364 12.636L9.72763 8.99964L13.364 5.36328\"\r\n stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngIf=\"!isRightPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M9.72692 5.36399L13.3633 9.00036L9.72692 12.6367M4.63601 5.36399L8.27237 9.00036L4.63601 12.6367\"\r\n stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-- Edit Fixture Body -->\r\n <div class=\"col\" [ngClass]=\"{ 'd-none': !editFixture }\">\r\n <div id=\"edit-body\" class=\"row\">\r\n <ul class=\"mx-3 my-5 nav nav-pills\" role=\"tablist\">\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"submitFixture = false; editFixtureSection = 'basic-details'\"\r\n [ngClass]=\"editFixtureSection === 'basic-details' ? 'active' : ''\" class=\"nav-link\"\r\n role=\"tab\">\r\n Basic details\r\n </a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"submitFixture = false; editFixtureSection = 'products'\"\r\n [ngClass]=\"editFixtureSection === 'products' ? 'active' : ''\" class=\"nav-link\"\r\n role=\"tab\">\r\n Products\r\n </a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"submitFixture = false; editFixtureSection = 'vms'\"\r\n [ngClass]=\"editFixtureSection === 'vms' ? 'active' : ''\" class=\"nav-link\" role=\"tab\">\r\n Visual Merchandise\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n <div class=\"col\">\r\n <ng-container *ngIf=\"editFixtureSection === 'basic-details'\">\r\n <lib-instance-basic-details [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\"\r\n [libraryCategories]=\"libraryCategories\"\r\n [libraryByCategory]=\"libraryByCategory\"\r\n [allowCategoryAndWidthEdit]=\"true\">\r\n </lib-instance-basic-details>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"editFixtureSection === 'products'\">\r\n <lib-instance-products [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\">\r\n </lib-instance-products>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"editFixtureSection === 'vms'\">\r\n <lib-instance-vms [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\">\r\n </lib-instance-vms>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"{ 'collapsed-col': isRightPanelCollapsed, 'col-3': !isRightPanelCollapsed }\"\r\n [style]=\"{'min-width': isRightPanelCollapsed ? '0' : isAllocationRun ?'680px' : '464px' }\">\r\n <ng-container *ngTemplateOutlet=\"fixturePreviewCol\"></ng-container>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n</section>\r\n\r\n<ng-template #fixturePreviewCol>\r\n <div class=\"s-card\" [ngStyle]=\"{'margin-top':editFixture ? '72px' : '0px'}\">\r\n <onboard-fixture [ngClass]=\"{ 'd-none': isRightPanelCollapsed}\"\r\n (onClose)=\"togglePanel('right'); selectedFixtureData = null; removeHighlight();\"\r\n [fixtureData]=\"selectedFixtureData\" [isAllocationRun]=\"isAllocationRun\"\r\n [allFixtures]=\"allFixtureInstances\"></onboard-fixture>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #headerSkeleton>\r\n <div class=\"row m-0 g-0 loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n <div class=\"shimmer w-100 p-4 rounded\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke mt-0 animate title\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #skeletonLoader>\r\n <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n <div class=\"shimmer rounded\">\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 class=\"stroke animate description\"></div>\r\n <br />\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 <br />\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 <br />\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 <br />\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</ng-template>\r\n\r\n<ng-template #applyLogics let-modal>\r\n <div class=\"modal-body\">\r\n <div class=\"d-flex justify-content-start mb-4\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"#DAF1FF\" />\r\n <path\r\n d=\"M20.833 21.6665C18.033 21.6665 17.1164 22.7915 16.8164 23.5332C17.708 23.9165 18.333 24.7998 18.333 25.8332C18.333 26.4962 18.0696 27.1321 17.6008 27.6009C17.1319 28.0698 16.4961 28.3332 15.833 28.3332C15.17 28.3332 14.5341 28.0698 14.0653 27.6009C13.5964 27.1321 13.333 26.4962 13.333 25.8332C13.333 24.7415 14.0247 23.8165 14.9997 23.4748V16.5248C14.5114 16.3535 14.0885 16.0344 13.7899 15.6117C13.4912 15.1891 13.3315 14.684 13.333 14.1665C13.333 13.5035 13.5964 12.8676 14.0653 12.3987C14.5341 11.9299 15.17 11.6665 15.833 11.6665C16.4961 11.6665 17.1319 11.9299 17.6008 12.3987C18.0696 12.8676 18.333 13.5035 18.333 14.1665C18.333 15.2582 17.6414 16.1832 16.6664 16.5248V20.9332C17.3997 20.3915 18.4664 19.9998 19.9997 19.9998C22.2247 19.9998 22.9664 18.8832 23.208 18.1415C22.7521 17.9516 22.3625 17.6311 22.0882 17.2204C21.8139 16.8097 21.6671 16.3271 21.6664 15.8332C21.6664 15.1701 21.9297 14.5342 22.3986 14.0654C22.8674 13.5966 23.5033 13.3332 24.1664 13.3332C24.8294 13.3332 25.4653 13.5966 25.9341 14.0654C26.403 14.5342 26.6664 15.1701 26.6664 15.8332C26.6664 16.9498 25.933 17.9165 24.9247 18.2165C24.708 19.4082 23.8997 21.6665 20.833 21.6665ZM15.833 24.9998C15.612 24.9998 15.4 25.0876 15.2438 25.2439C15.0875 25.4002 14.9997 25.6122 14.9997 25.8332C14.9997 26.0542 15.0875 26.2661 15.2438 26.4224C15.4 26.5787 15.612 26.6665 15.833 26.6665C16.054 26.6665 16.266 26.5787 16.4223 26.4224C16.5786 26.2661 16.6664 26.0542 16.6664 25.8332C16.6664 25.6122 16.5786 25.4002 16.4223 25.2439C16.266 25.0876 16.054 24.9998 15.833 24.9998ZM15.833 13.3332C15.612 13.3332 15.4 13.421 15.2438 13.5772C15.0875 13.7335 14.9997 13.9455 14.9997 14.1665C14.9997 14.3875 15.0875 14.5995 15.2438 14.7558C15.4 14.912 15.612 14.9998 15.833 14.9998C16.054 14.9998 16.266 14.912 16.4223 14.7558C16.5786 14.5995 16.6664 14.3875 16.6664 14.1665C16.6664 13.9455 16.5786 13.7335 16.4223 13.5772C16.266 13.421 16.054 13.3332 15.833 13.3332ZM24.1664 14.9998C23.9453 14.9998 23.7334 15.0876 23.5771 15.2439C23.4208 15.4002 23.333 15.6122 23.333 15.8332C23.333 16.0542 23.4208 16.2661 23.5771 16.4224C23.7334 16.5787 23.9453 16.6665 24.1664 16.6665C24.3874 16.6665 24.5993 16.5787 24.7556 16.4224C24.9119 16.2661 24.9997 16.0542 24.9997 15.8332C24.9997 15.6122 24.9119 15.4002 24.7556 15.2439C24.5993 15.0876 24.3874 14.9998 24.1664 14.9998Z\"\r\n fill=\"#009BF3\" />\r\n </svg>\r\n\r\n </div>\r\n <div>\r\n <h2 class=\"mb-3\">Run Allocation Logic</h2>\r\n <p>This will map all fixtures and apply allocations based on the business-defined logic, then move them to\r\n the verification section. Are you sure you want to continue?</p>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n [disabled]=\"isButtonLoading\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"runAllocation()\" [disabled]=\"isButtonLoading\">\r\n <span *ngIf=\"!isButtonLoading\"> Run allocation Logic</span>\r\n <svg style=\"width: 141px;\" *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #approveLayoutModal let-modal>\r\n <div class=\"modal-body\">\r\n <div>\r\n <h2 class=\"mb-3\">Approve & Submit</h2>\r\n <p>\r\n This will complete the layout and make it ready for allocation. Ensure that all fixture counts and\r\n placements are as per the plan.\r\n </p>\r\n </div>\r\n @if(hasInvalidFixtures) {\r\n <div class=\"d-flex align-items-start gap-2 p-3 mb-3 rounded\"\r\n style=\"background-color: #FFFAEB; border: 1px solid #FEC84B;\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"flex-shrink: 0; margin-top: 1px;\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F59E0B\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <p class=\"mb-0\" style=\"font-size: 13px; color: #92400E;\">\r\n @if(hasInvalidHeaderFixtures) {\r\n <strong>{{invalidHeaderFixtureCount}} fixture{{invalidHeaderFixtureCount === 1 ? '' : 's'}}\r\n {{invalidHeaderFixtureCount === 1 ? 'has' : 'have'}} an unrecognized header.</strong><br/>\r\n }\r\n @if(hasInvalidLibraryFixtures) {\r\n <strong>{{invalidLibraryFixtureCount}} fixture{{invalidLibraryFixtureCount === 1 ? '' : 's'}}\r\n {{invalidLibraryFixtureCount === 1 ? 'does' : 'do'}} not match any library entry.</strong><br/>\r\n }\r\n These are highlighted in red on the layout and must be corrected before the allocation rule can run.\r\n </p>\r\n </div>\r\n }\r\n <div class=\"d-flex justify-content-end gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n [disabled]=\"isButtonLoading\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"approveLayout()\" [disabled]=\"isButtonLoading\">\r\n <span *ngIf=\"!isButtonLoading\">Submit</span>\r\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #revertAllocationModal let-modal>\r\n <div class=\"modal-body\">\r\n <div class=\"d-flex justify-content-start mb-4\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"#FEF3C7\" />\r\n <path\r\n d=\"M20 13.3333V20M20 26.6667H20.0167M28.3333 20C28.3333 24.6024 24.6024 28.3333 20 28.3333C15.3976 28.3333 11.6667 24.6024 11.6667 20C11.6667 15.3976 15.3976 11.6667 20 11.6667C24.6024 11.6667 28.3333 15.3976 28.3333 20Z\"\r\n stroke=\"#F59E0B\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <div>\r\n <h2 class=\"mb-3\">Revert Allocation</h2>\r\n <p>Are you sure you want to revert the allocation? This will restore the state before running allocation.\r\n </p>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n [disabled]=\"isButtonLoading\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"revertAllocation(); modal.close()\"\r\n [disabled]=\"isButtonLoading\">\r\n <span *ngIf=\"!isButtonLoading\">Revert</span>\r\n <svg style=\"width: 141px;\" *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #completeAllocationModal let-modal>\r\n <div class=\"modal-body\">\r\n <div class=\"d-flex justify-content-start mb-4\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"#DAF1FF\" />\r\n <path\r\n d=\"M20.833 21.6665C18.033 21.6665 17.1164 22.7915 16.8164 23.5332C17.708 23.9165 18.333 24.7998 18.333 25.8332C18.333 26.4962 18.0696 27.1321 17.6008 27.6009C17.1319 28.0698 16.4961 28.3332 15.833 28.3332C15.17 28.3332 14.5341 28.0698 14.0653 27.6009C13.5964 27.1321 13.333 26.4962 13.333 25.8332C13.333 24.7415 14.0247 23.8165 14.9997 23.4748V16.5248C14.5114 16.3535 14.0885 16.0344 13.7899 15.6117C13.4912 15.1891 13.3315 14.684 13.333 14.1665C13.333 13.5035 13.5964 12.8676 14.0653 12.3987C14.5341 11.9299 15.17 11.6665 15.833 11.6665C16.4961 11.6665 17.1319 11.9299 17.6008 12.3987C18.0696 12.8676 18.333 13.5035 18.333 14.1665C18.333 15.2582 17.6414 16.1832 16.6664 16.5248V20.9332C17.3997 20.3915 18.4664 19.9998 19.9997 19.9998C22.2247 19.9998 22.9664 18.8832 23.208 18.1415C22.7521 17.9516 22.3625 17.6311 22.0882 17.2204C21.8139 16.8097 21.6671 16.3271 21.6664 15.8332C21.6664 15.1701 21.9297 14.5342 22.3986 14.0654C22.8674 13.5966 23.5033 13.3332 24.1664 13.3332C24.8294 13.3332 25.4653 13.5966 25.9341 14.0654C26.403 14.5342 26.6664 15.1701 26.6664 15.8332C26.6664 16.9498 25.933 17.9165 24.9247 18.2165C24.708 19.4082 23.8997 21.6665 20.833 21.6665ZM15.833 24.9998C15.612 24.9998 15.4 25.0876 15.2438 25.2439C15.0875 25.4002 14.9997 25.6122 14.9997 25.8332C14.9997 26.0542 15.0875 26.2661 15.2438 26.4224C15.4 26.5787 15.612 26.6665 15.833 26.6665C16.054 26.6665 16.266 26.5787 16.4223 26.4224C16.5786 26.2661 16.6664 26.0542 16.6664 25.8332C16.6664 25.6122 16.5786 25.4002 16.4223 25.2439C16.266 25.0876 16.054 24.9998 15.833 24.9998ZM15.833 13.3332C15.612 13.3332 15.4 13.421 15.2438 13.5772C15.0875 13.7335 14.9997 13.9455 14.9997 14.1665C14.9997 14.3875 15.0875 14.5995 15.2438 14.7558C15.4 14.912 15.612 14.9998 15.833 14.9998C16.054 14.9998 16.266 14.912 16.4223 14.7558C16.5786 14.5995 16.6664 14.3875 16.6664 14.1665C16.6664 13.9455 16.5786 13.7335 16.4223 13.5772C16.266 13.421 16.054 13.3332 15.833 13.3332ZM24.1664 14.9998C23.9453 14.9998 23.7334 15.0876 23.5771 15.2439C23.4208 15.4002 23.333 15.6122 23.333 15.8332C23.333 16.0542 23.4208 16.2661 23.5771 16.4224C23.7334 16.5787 23.9453 16.6665 24.1664 16.6665C24.3874 16.6665 24.5993 16.5787 24.7556 16.4224C24.9119 16.2661 24.9997 16.0542 24.9997 15.8332C24.9997 15.6122 24.9119 15.4002 24.7556 15.2439C24.5993 15.0876 24.3874 14.9998 24.1664 14.9998Z\"\r\n fill=\"#009BF3\" />\r\n </svg>\r\n </div>\r\n <div>\r\n <h2 class=\"mb-3\">Save and complete allocation</h2>\r\n <p>You are about to complete the merch allocation process. This will make the store ready for fixture\r\n verification and move it to the verification stage. Are you sure you want to proceed?</p>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n [disabled]=\"isButtonLoading\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"completeAllocation();\" [disabled]=\"isButtonLoading\">\r\n <span *ngIf=\"!isButtonLoading\">Complete allocation</span>\r\n <svg style=\"width: 107px;\" *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </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}#onboard-plano ::ng-deep .backgroundImg{background-color:#f9fafb!important}#onboard-plano ::ng-deep .accordion .accordion-button.backgroundImg:not(.collapsed){background-color:#f9fafb!important}#onboard-plano ::ng-deep .accordion-body{padding:10px 20px 20px}#onboard-plano .s-card{position:relative;box-sizing:border-box;border-radius:8px;background:#fff;padding:20px 16px;height:75dvh;overflow-y:auto;overflow-x:visible}#onboard-plano .c-card{border-radius:8px;background:#fff;padding:20px 16px;height:75dvh;overflow:hidden;width:100%}#onboard-plano .h-card{border-radius:8px;background:#fff;padding:20px 16px;min-height:20dvh}#onboard-plano .wall-label{color:var(--Gray-600, #475467);font-family:Inter;font-size:14px;font-style:normal;font-weight:600}#onboard-plano img{width:100%;height:100%;object-fit:cover;display:block}#onboard-plano #header .title{color:var(--Gray-800, #1d2939);font-size:16px;font-weight:600;line-height:24px;margin:0}#onboard-plano #header .cus-btn{color:#009bf3;background:#eaf8ff;padding:4px 10px;border-radius:16px;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;text-align:center;cursor:pointer}#onboard-plano #header .cus-btn:hover{background:#e2f5ff}#onboard-plano .loader .shimmer{height:100%!important}#onboard-plano .collapse-handler{position:absolute;height:32px;width:32px;display:flex;justify-content:center;align-items:center;border-radius:50%;background:#fff;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808;cursor:pointer;top:12px}#onboard-plano .collapse-handler.right{right:0}#onboard-plano .collapse-handler.left{left:0}#onboard-plano .collapsed-col{transition:all .3s ease;width:40px!important}#onboard-plano [class^=col]{transition:all .3s ease}#onboard-plano #segment-btn .custom-tabs{border-radius:8px;border:1px solid var(--Gray-300, #d0d5dd);overflow:hidden;margin-bottom:24px}#onboard-plano #segment-btn .custom-tabs .nav-link{border-radius:0%;color:#495057;padding:.75rem 1rem;background-color:#fff;text-align:center;border-right:1px solid var(--Gray-300, #d0d5dd);transition:all ease .2s;font-weight:500}#onboard-plano #segment-btn .custom-tabs .nav-link.active{background:var(--Primary-500, #33b5ff);color:#fff}#onboard-plano #segment-btn .nav-tabs .nav-link{border:none;margin:0}#onboard-plano #segment-btn .nav-item{text-align:center}#onboard-plano #segment-btn .nav-item:last-child .nav-link{border:none}#onboard-plano .link-btn{color:#33b5ff;cursor:pointer;font-weight:500}#onboard-plano .link-btn:hover{color:#33b5ff;text-decoration:underline!important}#onboard-plano .btn-red{border-radius:8px!important;border:1px solid #fef3f2!important;background:#fef3f2!important;box-shadow:0 1px 2px #1018280d!important;padding:10px 18px!important;color:#b42318!important;font-size:16px!important;font-weight:600!important}#onboard-plano .updateClass{font-family:Inter;font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#667085}#onboard-plano .fixture-row{border-radius:8px;transition:background-color .2s ease,box-shadow .2s ease}#onboard-plano .fixture-row.highlighted-fixture{background-color:#eaf8ff;box-shadow:0 0 0 2px #33b5ff}.btn .spinner{height:22px;min-width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
|
|
4238
|
+
args: [{ selector: "lib-onboard-store-plano", providers: [TitleCasePipe], template: "<section id=\"onboard-plano\">\r\n <!-- Loading State -->\r\n <div *ngIf=\"isPageLoading\" class=\"row\">\r\n <div class=\"col-12 m-0\">\r\n <ng-container *ngTemplateOutlet=\"headerSkeleton\"></ng-container>\r\n </div>\r\n <div class=\"col-3\">\r\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n </div>\r\n <div class=\"col-6\">\r\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n </div>\r\n <div class=\"col-3\">\r\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Content -->\r\n <div [ngClass]=\"{ 'd-none': isPageLoading }\">\r\n <!-- Header Accordion -->\r\n <div id=\"header\" ngbAccordion #accordion=\"ngbAccordion\" class=\"my-4\">\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <div ngbAccordionHeader class=\"d-flex justify-content-between align-items-center px-6 py-3\">\r\n <div class=\"d-flex gap-4 align-items-center\">\r\n <div style=\"margin-left:5px;\" *ngIf=\"planoData?.storeName\">\r\n <h2 class='title'>{{planoData?.storeName}} - Plano</h2>\r\n </div>\r\n <lib-reactive-select *ngIf=\"floorsList.length\" [formControl]=\"selectedFloorId\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorsList\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center gap-4\">\r\n <div *ngIf=\"!editFixture\" class=\"updateClass\"\r\n [ngbTooltip]=\"floorData?.updatedByName ? 'Updated by ' + floorData.updatedByName : null\">\r\n Last Update: {{ floorData?.lastUpdateIso | date:'d MMM yyyy, hh:mm a' }}\r\n </div>\r\n\r\n <div class=\"d-flex gap-4 align-items-center\">\r\n <!-- Edit Fixture Mode -->\r\n <ng-container *ngIf=\"editFixture\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\"\r\n (click)=\"onFixturePageCancel()\">\r\n Cancel\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onFixtureSave()\">\r\n Save & Close\r\n </button>\r\n </ng-container>\r\n <button ngbAccordionButton></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div id=\"header\" class=\"row mx-0 gap-3\">\r\n <!-- Plano Completion -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <h3 class=\"d-flex align-items-center gap-2\">\r\n Plano Completion %\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n fill=\"none\" ngbTooltip=\"% of overall planogram completion\">\r\n <g clip-path=\"url(#clip0_1517_129805)\">\r\n <path\r\n d=\"M9 12V9M9 6H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1517_129805\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </h3>\r\n <div class=\"row align-items-center mt-2\">\r\n <div class=\"col-9\">\r\n <div class=\"progress\" style=\"height: 4px\">\r\n <div class=\"progress-bar\" [ngClass]=\"\r\n [25, 50].includes(getProgressValue) ? 'bg-warning' : 'bg-success'\" role=\"progressbar\"\r\n [style]=\"'width:' + getProgressValue + '%'\"\r\n [attr.aria-valuenow]=\"getProgressValue\" aria-valuemin=\"0\"\r\n aria-valuemax=\"100\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-3\">{{ getProgressValue }}%</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Layout -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <h3><b>{{floorData?.floorNumber}}/{{ planoData?.floors?.length }}</b> Layout</h3>\r\n <div class=\"indicator mt-2\"\r\n [ngClass]=\"getStatus === 'allocationPending' ? 'completed' : 'draft'\">\r\n {{ getStatus === 'allocationPending' ? 'Completed' : 'Draft' }}\r\n </div>\r\n </div>\r\n\r\n <!-- Fixtures -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <h3><b>{{ allFixtureInstances.length }}</b> Fixtures</h3>\r\n <div class=\"indicator mt-2\" [ngClass]=\"getStatus\">\r\n {{ getStatusText }}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body -->\r\n <div id=\"body\" class=\"row\">\r\n <!-- Left Column -->\r\n <div\r\n [ngClass]=\"{ 'collapsed-col': isLeftPanelCollapsed, 'col-3': !isLeftPanelCollapsed,'d-none': editFixture }\">\r\n <div class=\"s-card\">\r\n <form [ngClass]=\"{ 'd-none': isLeftPanelCollapsed }\" [formGroup]=\"layoutForm\">\r\n <div ngbAccordion #bodyAccordion=\"ngbAccordion\">\r\n <!-- Walls Section -->\r\n <ng-container *ngIf=\"getFormWalls.controls.length; else addWallAction\">\r\n <ng-container formArrayName=\"walls\">\r\n <ng-container *ngFor=\"let group of getFormWalls.controls; let i = index\">\r\n <div [formGroupName]=\"i\" [ngbAccordionItem]=\"'accordion-wall-' + i\"\r\n class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"me-2 wall-label\">\r\n {{ group.get(\"elementType\")?.value | titlecase }}\r\n {{ group.get(\"elementNumber\")?.value }}\r\n </span>\r\n\r\n @if(layoutForm.enabled){\r\n <span class=\"me-1\" ngbTooltip=\"Rotate this wall.\"\r\n (click)=\"rotateWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M3.73735 8.25011C4.12193 8.24362 4.44377 8.52776 4.49338 8.89998L4.4999 8.98735L4.50262 9.15516C4.58434 11.5741 6.57243 13.5 9 13.5C9.14022 13.5 9.27951 13.4936 9.41756 13.4809L9.21967 13.2803C8.92678 12.9874 8.92678 12.5126 9.21967 12.2197C9.51257 11.9268 9.98744 11.9268 10.2803 12.2197L11.7803 13.7197C12.0732 14.0126 12.0732 14.4874 11.7803 14.7803L10.2803 16.2803C9.98744 16.5732 9.51257 16.5732 9.21967 16.2803C8.92678 15.9874 8.92678 15.5126 9.21967 15.2197L9.45837 14.9827C9.30646 14.9942 9.15359 15 9 15C5.82653 15 3.21665 12.5321 3.0125 9.38289L3.00315 9.19314L3.00011 9.01265C2.99312 8.59849 3.3232 8.25709 3.73735 8.25011ZM8.78033 1.71967C9.0507 1.99003 9.07149 2.41546 8.84272 2.70967L8.78033 2.78033L8.54187 3.01726C8.69371 3.00578 8.8465 3 9 3C12.3137 3 15 5.68629 15 9C15 9.41421 14.6642 9.75 14.25 9.75C13.8358 9.75 13.5 9.41421 13.5 9C13.5 6.51472 11.4853 4.5 9 4.5C8.8597 4.5 8.72034 4.5064 8.58221 4.51909L8.78033 4.71967C9.07323 5.01256 9.07323 5.48744 8.78033 5.78033C8.50997 6.05069 8.08455 6.07149 7.79033 5.84272L7.71967 5.78033L6.21967 4.28033C5.94931 4.00997 5.92851 3.58454 6.15728 3.29033L6.21967 3.21967L7.71967 1.71967C8.01257 1.42678 8.48744 1.42678 8.78033 1.71967Z\"\r\n fill=\"#475467\" stroke=\"#475467\"\r\n stroke-width=\"0.00064\" />\r\n </svg>\r\n </span>\r\n <span class=\"me-1\" ngbTooltip=\"Insert new wall below.\"\r\n (click)=\"addNewWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_62_8)\">\r\n <path\r\n d=\"M9 9.75C11.0707 9.75 12.75 11.4293 12.75 13.5C12.75 15.5708 11.0707 17.25 9 17.25C6.92925 17.25 5.25 15.5708 5.25 13.5C5.25 11.4293 6.92925 9.75 9 9.75ZM9.75 11.25H8.25V12.7493L6.75 12.75V14.25L8.25 14.2493V15.75H9.75V14.2493L11.25 14.25V12.75L9.75 12.7493V11.25ZM15 2.25C15.414 2.25 15.75 2.586 15.75 3V7.5C15.75 7.914 15.414 8.25 15 8.25H3C2.586 8.25 2.25 7.914 2.25 7.5V3C2.25 2.586 2.586 2.25 3 2.25H15ZM3.75 3.75V6.75H14.25V3.75H3.75Z\"\r\n fill=\"#475467\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_62_8\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span class=\"me-1\"\r\n ngbTooltip=\"Remove this wall and its fixtures.\"\r\n (click)=\"deleteWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_63_25)\">\r\n <path\r\n d=\"M10.7094 1.5C11.3551 1.5 11.9283 1.91314 12.1324 2.52565L12.5406 3.75H15C15.4142 3.75 15.75 4.08579 15.75 4.5C15.75 4.9142 15.4142 5.24999 15 5.25L14.9981 5.30344L14.3476 14.4103C14.2635 15.5878 13.2838 16.5 12.1034 16.5H5.89668C4.71624 16.5 3.7365 15.5878 3.6524 14.4103L3.00191 5.30344C3.00062 5.28551 2.99998 5.26769 2.99997 5.25C2.58577 5.24999 2.25 4.9142 2.25 4.5C2.25 4.08579 2.58579 3.75 3 3.75H5.45943L5.86754 2.52565C6.07172 1.91314 6.64493 1.5 7.29057 1.5H10.7094ZM13.4981 5.25H4.50191L5.14858 14.3034C5.17662 14.696 5.5032 15 5.89668 15H12.1034C12.4968 15 12.8234 14.696 12.8514 14.3034L13.4981 5.25ZM7.5 7.5C7.88464 7.5 8.20163 7.78952 8.24495 8.16253L8.25 8.25V12C8.25 12.4142 7.91422 12.75 7.5 12.75C7.11537 12.75 6.79837 12.4605 6.75505 12.0875L6.75 12V8.25C6.75 7.83578 7.08578 7.5 7.5 7.5ZM10.5 7.5C10.9142 7.5 11.25 7.83578 11.25 8.25V12C11.25 12.4142 10.9142 12.75 10.5 12.75C10.0858 12.75 9.75 12.4142 9.75 12V8.25C9.75 7.83578 10.0858 7.5 10.5 7.5ZM10.7094 3H7.29057L7.04057 3.75H10.9595L10.7094 3Z\"\r\n fill=\"#F32B2B\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_63_25\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n }\r\n </div>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <ng-template>\r\n <div style=\"min-height: 50px\" dndDropzone\r\n (dndDrop)=\"onDrop($event, i)\">\r\n <!-- Fixtures -->\r\n <ng-container *ngIf=\"getFormFixtures(i).controls.length\">\r\n <div formArrayName=\"fixtures\">\r\n <ng-container\r\n *ngFor=\"let fixture of getFormFixtures(i).controls; let j = index\">\r\n <div dndDropzone\r\n (dndDrop)=\"onDrop($event, i, j)\"\r\n [formGroupName]=\"j\"\r\n [dndDraggable]=\"{ wallIndex: i, fixtureIndex: j }\"\r\n [dndEffectAllowed]=\"'all'\"\r\n class=\"row g-0 mb-5 fixture-row\"\r\n [class.highlighted-fixture]=\"layoutForm.enabled && highlightedFixtureFormId && fixture.get('_id')?.value === highlightedFixtureFormId\"\r\n [dndDisableDragIf]=\"layoutForm.disabled\">\r\n\r\n <div class=\"col-1\">\r\n <div\r\n class=\"d-flex align-items-center justify-content-center h-100\">\r\n <svg dndDragImageRef\r\n [style]=\"{ cursor: layoutForm.disabled ? 'default' : 'move', opacity: '0.5' }\"\r\n width=\"25px\" viewBox=\"0 0 16 16\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"m 4.496094 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 0 0\"\r\n fill=\"grey\" />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-10\">\r\n <lib-reactive-select\r\n formControlName=\"fixtureConfigId\"\r\n [idField]=\"'_id'\"\r\n [nameField]=\"'name'\"\r\n [data]=\"fixtureTemplates\"\r\n [label]=\"'Fixture ' + (j + 1)\"\r\n [subTextField]=\"'subtext'\"\r\n [search]=\"true\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-1\">\r\n <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n [class.disabled-click]=\"layoutForm.disabled\">\r\n <svg (click)=\"deleteFixture('wall', j, i)\"\r\n style=\"cursor: pointer; margin-bottom: 18px\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\"\r\n stroke=\"#344054\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-end\">\r\n <a class=\"link-btn\"\r\n [class.disabled-click]=\"layoutForm.disabled\"\r\n (click)=\"addNewFixture('wall', i)\">\r\n Add fixture\r\n </a>\r\n </div>\r\n\r\n <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n <!-- Other Elements -->\r\n <ng-container\r\n *ngIf=\"getWallOtherElements(i).controls.length\">\r\n <div formArrayName=\"otherElements\">\r\n <ng-container\r\n *ngFor=\"let fixture of getWallOtherElements(i).controls; let j = index\">\r\n <div [formGroupName]=\"j\" class=\"row g-0 mb-5\">\r\n <div class=\"col-11\">\r\n <label class=\"form-label mb-1\">Element\r\n {{ j + 1 }}</label>\r\n\r\n <!-- Dropdown bound to 'type' -->\r\n <lib-reactive-select [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"otherElementList\"\r\n [id]=\"'elementLabel' + j\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <!-- Show custom text input only when 'Others' is selected -->\r\n <input\r\n *ngIf=\"(fixture.get('type')?.value) === 'Others'\"\r\n type=\"text\"\r\n class=\"form-control mt-2\"\r\n formControlName=\"customName\"\r\n placeholder=\"Enter custom element name\" />\r\n </div>\r\n\r\n <div class=\"col-1\">\r\n <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n [class.disabled-click]=\"layoutForm.disabled\">\r\n <svg (click)=\"removeOtherElement('wall', j, i)\"\r\n style=\"cursor: pointer; margin-bottom: 18px\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\"\r\n stroke=\"#344054\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-end\">\r\n <a class=\"link-btn\"\r\n [class.disabled-click]=\"layoutForm.disabled\"\r\n (click)=\"addNewOtherElements('wall', i)\">\r\n Add element\r\n </a>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #addWallAction>\r\n <button (click)=\"addNewWall(0)\" [class.disabled-click]=\"layoutForm.disabled\"\r\n class=\"btn btn-secondary w-100 p-2\">\r\n Insert new wall\r\n </button>\r\n </ng-template>\r\n\r\n <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n <!-- Floor Section -->\r\n <div [ngbAccordionItem]=\"'accordion-floor'\" class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <span class=\"me-2 wall-label\">Floor</span>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <ng-template>\r\n <div style=\"min-height: 50px\" dndDropzone\r\n (dndDrop)=\"onDrop($event, 'floor')\">\r\n <!-- Floor Fixtures -->\r\n <ng-container *ngIf=\"getFormFloorFixtures.controls.length\">\r\n <div formArrayName=\"floorFixtures\">\r\n <ng-container\r\n *ngFor=\"let fixture of getFormFloorFixtures.controls; let j = index\">\r\n <div dndDropzone (dndDrop)=\"onDrop($event, 'floor', j)\"\r\n [formGroupName]=\"j\"\r\n [dndDraggable]=\"{ wallIndex: 'floor', fixtureIndex: j }\"\r\n [dndEffectAllowed]=\"'all'\"\r\n [dndDisableDragIf]=\"layoutForm.disabled\"\r\n class=\"row g-0 mb-5 fixture-row\"\r\n [class.highlighted-fixture]=\"layoutForm.enabled && highlightedFixtureFormId && fixture.get('_id')?.value === highlightedFixtureFormId\">\r\n\r\n <div class=\"col-1\">\r\n <div\r\n class=\"d-flex align-items-center justify-content-center h-100\">\r\n <svg dndDragImageRef\r\n style=\"cursor: move; opacity: 0.5\"\r\n width=\"25px\" viewBox=\"0 0 16 16\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"m 4.496094 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 0 0\"\r\n fill=\"grey\" />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-10\">\r\n <lib-reactive-select\r\n formControlName=\"fixtureConfigId\"\r\n [idField]=\"'_id'\" [nameField]=\"'name'\"\r\n [data]=\"fixtureTemplates\"\r\n [label]=\"'Fixture ' + (j + 1)\" [search]=\"true\"\r\n [subTextField]=\"'subtext'\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-1\">\r\n <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n [class.disabled-click]=\"layoutForm.disabled\">\r\n <svg (click)=\"deleteFixture('floor', j)\"\r\n style=\"cursor: pointer; margin-bottom: 18px\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"\r\n fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\"\r\n stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-end\">\r\n <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n (click)=\"addNewFixture('floor')\">\r\n Add fixture\r\n </a>\r\n </div>\r\n\r\n <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n <!-- Floor Other Elements -->\r\n <ng-container *ngIf=\"getFormFloorOtherElements.controls.length\">\r\n <div formArrayName=\"floorOtherElements\">\r\n <ng-container\r\n *ngFor=\"let fixture of getFormFloorOtherElements.controls; let j = index\">\r\n <div [formGroupName]=\"j\" class=\"row g-0 mb-5\">\r\n <div class=\"col-11\">\r\n <label class=\"form-label mb-1\">Element\r\n {{ j + 1 }}</label>\r\n\r\n <!-- Dropdown for type -->\r\n <lib-reactive-select [idField]=\"'value'\"\r\n [nameField]=\"'label'\" [data]=\"otherElementList\"\r\n [id]=\"'floorElementLabel' + j\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <!-- Conditional input for custom name -->\r\n <input\r\n *ngIf=\"(fixture.get('type')?.value) === 'Others'\"\r\n type=\"text\" class=\"form-control mt-2\"\r\n formControlName=\"customName\"\r\n placeholder=\"Enter custom element name\" />\r\n </div>\r\n\r\n <div class=\"col-1\">\r\n <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n [class.disabled-click]=\"layoutForm.disabled\">\r\n <svg (click)=\"removeOtherElement('floor', j)\"\r\n style=\"cursor: pointer; margin-bottom: 18px\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"\r\n fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\"\r\n stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-end\">\r\n <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n (click)=\"addNewOtherElements('floor')\">\r\n Add element\r\n </a>\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 <!-- Center Column -->\r\n <div class=\"col overflow-hidden position-relative\" [ngClass]=\"{ 'd-none': editFixture }\">\r\n <div id=\"canvas-card\" class=\"c-card position-relative\" #canvasContainer>\r\n <!-- Canvas View -->\r\n <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n\r\n <div class=\"position-absolute d-flex align-items-center justify-content-end gap-2\"\r\n style=\"top: 24px; right: 26px;width: calc(100% - 50px);\">\r\n <!-- Entrance Button -->\r\n <div *ngIf=\"layoutForm.enabled\" ngbTooltip=\"You can add up to two entrances.\"\r\n [disableTooltip]=\"getEntrances?.length < 2\" class=\"me-auto\">\r\n <button type=\"button\" style=\"padding: 8px 20px !important;\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm \"\r\n [disabled]=\"getEntrances?.length >= 2\" (click)=\"addNewEntrance()\">\r\n Add Entrance\r\n </button>\r\n </div>\r\n\r\n <!-- Cancel edit -->\r\n @if(layoutForm.enabled){\r\n @if(getStatus === 'allocationPending'){\r\n <button type=\"button\" class=\"btn btn-outline bg-white shadow-sm\" (click)=\"cancelEdit()\">\r\n Cancel\r\n </button>\r\n }@else {\r\n <button type=\"button\" class=\"btn btn-text\" (click)=\"cancelEdit()\">\r\n Cancel\r\n </button>\r\n }\r\n }\r\n\r\n <!-- Save -->\r\n @if(layoutForm.enabled){\r\n @if(getStatus === 'draft'){\r\n <button type=\"button\"\r\n class=\"btn btn-outline shadow-sm bg-white d-flex align-items-center gap-2 justify-content-center\"\r\n style=\"min-width: 130px;\"\r\n [disabled]=\"isSavingLayout\" (click)=\"updateLayout(true)\">\r\n <span *ngIf=\"isSavingLayout\" class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\r\n Save as Draft\r\n </button>\r\n }@else{\r\n <button type=\"button\"\r\n style=\"padding: 8px 20px !important;min-width: 90px;\"\r\n class=\"btn btn-primary text-nowrap d-flex align-items-center gap-2 justify-content-center\"\r\n [disabled]=\"isSavingLayout\" (click)=\"updateLayout(true)\">\r\n <span *ngIf=\"isSavingLayout\" class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\r\n Save\r\n </button>\r\n }\r\n }\r\n\r\n <!-- Compact button (CAD layouts only, view mode) \u2014 one-shot:\r\n clicking compacts the layout and drops the user into edit\r\n mode so the change is revertable via Cancel and persistable\r\n via Save / Submit. -->\r\n @if(canShowCompactToggle && layoutForm.disabled){\r\n <button type=\"button\"\r\n class=\"btn btn-outline shadow-sm bg-white d-flex align-items-center gap-2 justify-content-center\"\r\n (click)=\"compactLayout()\"\r\n ngbTooltip=\"Compact layout.\"\r\n container=\"body\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\">\r\n <polyline points=\"4 14 10 14 10 20\"></polyline>\r\n <polyline points=\"20 10 14 10 14 4\"></polyline>\r\n <line x1=\"14\" y1=\"10\" x2=\"21\" y2=\"3\"></line>\r\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"></line>\r\n </svg>\r\n </button>\r\n }\r\n\r\n <!-- Edit Button -->\r\n @if(isEditLayoutAllowed){\r\n <button type=\"button\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n 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\"\r\n 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 }\r\n\r\n <!-- Cancel Button (From allocation) -->\r\n <button *ngIf=\"layoutForm.disabled && isAllocationRun\" type=\"button\"\r\n class=\"btn btn-outline bg-white shadow-sm\" (click)=\"onClickRevertAllocation() \">\r\n Cancel\r\n </button>\r\n\r\n\r\n <!-- Run allocation / Complete -->\r\n @if(isRunAllocationAllowed && layoutForm.disabled && getStatus === 'allocationPending'){\r\n <span\r\n [ngbTooltip]=\"!isAllocationRun ? invalidFixturesTooltip : ''\"\r\n container=\"body\">\r\n <button type=\"button\" style=\"padding: 8px 20px !important;\"\r\n class=\"btn btn-primary text-nowrap\"\r\n [disabled]=\"!isAllocationRun && hasInvalidFixtures\"\r\n (click)=\"onClickRunAllocation()\">\r\n {{ isAllocationRun ? 'Complete Allocation' : 'Run Allocation' }}\r\n </button>\r\n </span>\r\n }\r\n\r\n <button *ngIf=\"getStatus === 'draft'\" type=\"button\" style=\"padding: 8px 20px !important\"\r\n class=\"btn btn-primary text-nowrap\" (click)=\"onClickApproveLayout()\">\r\n Submit for merch allocation\r\n </button>\r\n\r\n <!-- Rotate Button -->\r\n <button type=\"button\" *ngIf=\"layoutForm.disabled\" class=\"btn btn-outline bg-white shadow-sm\"\r\n (click)=\"rotateCanvas(canvas,90)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 26 26\"\r\n fill=\"none\">\r\n <path\r\n d=\"M6.36265 7.17887L7.17625 6.36287L5.90425 5.09207L5.08945 5.90567L6.36265 7.17887ZM15.671 6.36407L19.6379 10.3309L20.9099 9.05769L16.9442 5.09087L15.671 6.36407ZM19.6379 18.8257L18.8243 19.6393L20.0963 20.9101L20.9099 20.0977L19.6379 18.8257ZM10.3295 19.6393L6.36265 15.6725L5.09065 16.9457L9.05626 20.9113L10.3295 19.6393ZM18.8243 19.6393C17.6543 20.8081 16.8407 21.6193 16.1459 22.1497C15.4715 22.6645 15.0155 22.8289 14.5763 22.8289V24.6289C15.5675 24.6289 16.4027 24.2173 17.2367 23.5813C18.0503 22.9609 18.9635 22.0453 20.0963 20.9125L18.8243 19.6393ZM9.05626 20.9113C10.1891 22.0453 11.1023 22.9597 11.9159 23.5813C12.7499 24.2173 13.5851 24.6289 14.5763 24.6289V22.8289C14.1371 22.8289 13.6823 22.6645 13.0067 22.1497C12.3119 21.6193 11.4983 20.8081 10.3295 19.6393L9.05626 20.9113ZM19.6379 10.3309C20.8067 11.4997 21.6179 12.3133 22.1483 13.0081C22.6631 13.6837 22.8275 14.1385 22.8275 14.5777H24.6275C24.6275 13.5865 24.2159 12.7513 23.5799 11.9173C22.9595 11.1037 22.0427 10.1905 20.9099 9.05769L19.6379 10.3309ZM20.9099 20.0977C22.0439 18.9637 22.9583 18.0517 23.5799 17.2381C24.2159 16.4041 24.6275 15.5689 24.6275 14.5777H22.8275C22.8275 15.0169 22.6631 15.4729 22.1483 16.1473C21.6179 16.8421 20.8067 17.6557 19.6379 18.8257L20.9099 20.0977ZM7.17625 6.36287C8.34625 5.19407 9.15985 4.38167 9.85465 3.85127C10.529 3.33647 10.985 3.17327 11.4242 3.17327V1.37207C10.433 1.37207 9.59785 1.78367 8.76385 2.41967C7.94905 3.04127 7.03705 3.95567 5.90425 5.08847L7.17625 6.36287ZM16.9442 5.09087C15.8114 3.95687 14.8982 3.04127 14.0846 2.41967C13.2506 1.78367 12.4154 1.37207 11.4242 1.37207V3.17327C11.8634 3.17327 12.3182 3.33647 12.9938 3.85127C13.6886 4.38167 14.5022 5.19287 15.671 6.36167L16.9442 5.09087ZM5.08945 5.90327C3.95665 7.03607 3.04225 7.94807 2.42065 8.76287C1.78465 9.59687 1.37305 10.4321 1.37305 11.4233H3.17305C3.17305 10.9841 3.33745 10.5281 3.85225 9.85367C4.38265 9.15887 5.19385 8.34527 6.36265 7.17527L5.08945 5.90327ZM6.36265 15.6713C5.19385 14.5013 4.38265 13.6877 3.85225 12.9929C3.33745 12.3185 3.17305 11.8625 3.17305 11.4233H1.37305C1.37305 12.4145 1.78465 13.2497 2.42065 14.0837C3.04225 14.8973 3.95665 15.8105 5.08945 16.9433L6.36265 15.6713Z\"\r\n fill=\"#1D2939\" />\r\n <path\r\n d=\"M23.2 6.9832L25 8.2C25 4.582 22.4056 1.5796 19 1M2.8 19.0168L1 17.8C1 21.418 3.5944 24.4204 7 25\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- Download Button -->\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n (click)=\"downloadCanvas()\">\r\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" stroke=\"#000000\" stroke-width=\"0.24000000000000005\">\r\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n stroke=\"#CCCCCC\" stroke-width=\"0.384\"></g>\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <path\r\n d=\"M12.5535 16.5061C12.4114 16.6615 12.2106 16.75 12 16.75C11.7894 16.75 11.5886 16.6615 11.4465 16.5061L7.44648 12.1311C7.16698 11.8254 7.18822 11.351 7.49392 11.0715C7.79963 10.792 8.27402 10.8132 8.55352 11.1189L11.25 14.0682V3C11.25 2.58579 11.5858 2.25 12 2.25C12.4142 2.25 12.75 2.58579 12.75 3V14.0682L15.4465 11.1189C15.726 10.8132 16.2004 10.792 16.5061 11.0715C16.8118 11.351 16.833 11.8254 16.5535 12.1311L12.5535 16.5061Z\"\r\n fill=\"#1D2939\"></path>\r\n <path\r\n d=\"M3.75 15C3.75 14.5858 3.41422 14.25 3 14.25C2.58579 14.25 2.25 14.5858 2.25 15V15.0549C2.24998 16.4225 2.24996 17.5248 2.36652 18.3918C2.48754 19.2919 2.74643 20.0497 3.34835 20.6516C3.95027 21.2536 4.70814 21.5125 5.60825 21.6335C6.47522 21.75 7.57754 21.75 8.94513 21.75H15.0549C16.4225 21.75 17.5248 21.75 18.3918 21.6335C19.2919 21.5125 20.0497 21.2536 20.6517 20.6516C21.2536 20.0497 21.5125 19.2919 21.6335 18.3918C21.75 17.5248 21.75 16.4225 21.75 15.0549V15C21.75 14.5858 21.4142 14.25 21 14.25C20.5858 14.25 20.25 14.5858 20.25 15C20.25 16.4354 20.2484 17.4365 20.1469 18.1919C20.0482 18.9257 19.8678 19.3142 19.591 19.591C19.3142 19.8678 18.9257 20.0482 18.1919 20.1469C17.4365 20.2484 16.4354 20.25 15 20.25H9C7.56459 20.25 6.56347 20.2484 5.80812 20.1469C5.07435 20.0482 4.68577 19.8678 4.40901 19.591C4.13225 19.3142 3.9518 18.9257 3.85315 18.1919C3.75159 17.4365 3.75 16.4354 3.75 15Z\"\r\n fill=\"#1D2939\"></path>\r\n </g>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Panel Collapse Handlers -->\r\n <div class=\"collapse-handler left\" (click)=\"togglePanel('left')\">\r\n <svg *ngIf=\"!isLeftPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M8.27308 12.636L4.63672 8.99964L8.27308 5.36328M13.364 12.636L9.72763 8.99964L13.364 5.36328\"\r\n stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngIf=\"isLeftPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M9.72692 5.36399L13.3633 9.00036L9.72692 12.6367M4.63601 5.36399L8.27237 9.00036L4.63601 12.6367\"\r\n stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"collapse-handler right\" (click)=\"togglePanel('right')\">\r\n <svg *ngIf=\"isRightPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M8.27308 12.636L4.63672 8.99964L8.27308 5.36328M13.364 12.636L9.72763 8.99964L13.364 5.36328\"\r\n stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngIf=\"!isRightPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M9.72692 5.36399L13.3633 9.00036L9.72692 12.6367M4.63601 5.36399L8.27237 9.00036L4.63601 12.6367\"\r\n stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-- Edit Fixture Body -->\r\n <div class=\"col\" [ngClass]=\"{ 'd-none': !editFixture }\">\r\n <div id=\"edit-body\" class=\"row\">\r\n <ul class=\"mx-3 my-5 nav nav-pills\" role=\"tablist\">\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"submitFixture = false; editFixtureSection = 'basic-details'\"\r\n [ngClass]=\"editFixtureSection === 'basic-details' ? 'active' : ''\" class=\"nav-link\"\r\n role=\"tab\">\r\n Basic details\r\n </a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"submitFixture = false; editFixtureSection = 'products'\"\r\n [ngClass]=\"editFixtureSection === 'products' ? 'active' : ''\" class=\"nav-link\"\r\n role=\"tab\">\r\n Products\r\n </a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"submitFixture = false; editFixtureSection = 'vms'\"\r\n [ngClass]=\"editFixtureSection === 'vms' ? 'active' : ''\" class=\"nav-link\" role=\"tab\">\r\n Visual Merchandise\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n <div class=\"col\">\r\n <ng-container *ngIf=\"editFixtureSection === 'basic-details'\">\r\n <lib-instance-basic-details [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\"\r\n [libraryCategories]=\"libraryCategories\"\r\n [libraryByCategory]=\"libraryByCategory\"\r\n [allowCategoryAndWidthEdit]=\"true\">\r\n </lib-instance-basic-details>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"editFixtureSection === 'products'\">\r\n <lib-instance-products [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\">\r\n </lib-instance-products>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"editFixtureSection === 'vms'\">\r\n <lib-instance-vms [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\">\r\n </lib-instance-vms>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"{ 'collapsed-col': isRightPanelCollapsed, 'col-3': !isRightPanelCollapsed }\"\r\n [style]=\"{'min-width': isRightPanelCollapsed ? '0' : isAllocationRun ?'680px' : '464px' }\">\r\n <ng-container *ngTemplateOutlet=\"fixturePreviewCol\"></ng-container>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n</section>\r\n\r\n<ng-template #fixturePreviewCol>\r\n <div class=\"s-card\" [ngStyle]=\"{'margin-top':editFixture ? '72px' : '0px'}\">\r\n <onboard-fixture [ngClass]=\"{ 'd-none': isRightPanelCollapsed}\"\r\n (onClose)=\"togglePanel('right'); selectedFixtureData = null; removeHighlight();\"\r\n [fixtureData]=\"selectedFixtureData\" [isAllocationRun]=\"isAllocationRun\"\r\n [allFixtures]=\"allFixtureInstances\"></onboard-fixture>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #headerSkeleton>\r\n <div class=\"row m-0 g-0 loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n <div class=\"shimmer w-100 p-4 rounded\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke mt-0 animate title\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #skeletonLoader>\r\n <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n <div class=\"shimmer rounded\">\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 class=\"stroke animate description\"></div>\r\n <br />\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 <br />\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 <br />\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 <br />\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</ng-template>\r\n\r\n<ng-template #applyLogics let-modal>\r\n <div class=\"modal-body\">\r\n <div class=\"d-flex justify-content-start mb-4\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"#DAF1FF\" />\r\n <path\r\n d=\"M20.833 21.6665C18.033 21.6665 17.1164 22.7915 16.8164 23.5332C17.708 23.9165 18.333 24.7998 18.333 25.8332C18.333 26.4962 18.0696 27.1321 17.6008 27.6009C17.1319 28.0698 16.4961 28.3332 15.833 28.3332C15.17 28.3332 14.5341 28.0698 14.0653 27.6009C13.5964 27.1321 13.333 26.4962 13.333 25.8332C13.333 24.7415 14.0247 23.8165 14.9997 23.4748V16.5248C14.5114 16.3535 14.0885 16.0344 13.7899 15.6117C13.4912 15.1891 13.3315 14.684 13.333 14.1665C13.333 13.5035 13.5964 12.8676 14.0653 12.3987C14.5341 11.9299 15.17 11.6665 15.833 11.6665C16.4961 11.6665 17.1319 11.9299 17.6008 12.3987C18.0696 12.8676 18.333 13.5035 18.333 14.1665C18.333 15.2582 17.6414 16.1832 16.6664 16.5248V20.9332C17.3997 20.3915 18.4664 19.9998 19.9997 19.9998C22.2247 19.9998 22.9664 18.8832 23.208 18.1415C22.7521 17.9516 22.3625 17.6311 22.0882 17.2204C21.8139 16.8097 21.6671 16.3271 21.6664 15.8332C21.6664 15.1701 21.9297 14.5342 22.3986 14.0654C22.8674 13.5966 23.5033 13.3332 24.1664 13.3332C24.8294 13.3332 25.4653 13.5966 25.9341 14.0654C26.403 14.5342 26.6664 15.1701 26.6664 15.8332C26.6664 16.9498 25.933 17.9165 24.9247 18.2165C24.708 19.4082 23.8997 21.6665 20.833 21.6665ZM15.833 24.9998C15.612 24.9998 15.4 25.0876 15.2438 25.2439C15.0875 25.4002 14.9997 25.6122 14.9997 25.8332C14.9997 26.0542 15.0875 26.2661 15.2438 26.4224C15.4 26.5787 15.612 26.6665 15.833 26.6665C16.054 26.6665 16.266 26.5787 16.4223 26.4224C16.5786 26.2661 16.6664 26.0542 16.6664 25.8332C16.6664 25.6122 16.5786 25.4002 16.4223 25.2439C16.266 25.0876 16.054 24.9998 15.833 24.9998ZM15.833 13.3332C15.612 13.3332 15.4 13.421 15.2438 13.5772C15.0875 13.7335 14.9997 13.9455 14.9997 14.1665C14.9997 14.3875 15.0875 14.5995 15.2438 14.7558C15.4 14.912 15.612 14.9998 15.833 14.9998C16.054 14.9998 16.266 14.912 16.4223 14.7558C16.5786 14.5995 16.6664 14.3875 16.6664 14.1665C16.6664 13.9455 16.5786 13.7335 16.4223 13.5772C16.266 13.421 16.054 13.3332 15.833 13.3332ZM24.1664 14.9998C23.9453 14.9998 23.7334 15.0876 23.5771 15.2439C23.4208 15.4002 23.333 15.6122 23.333 15.8332C23.333 16.0542 23.4208 16.2661 23.5771 16.4224C23.7334 16.5787 23.9453 16.6665 24.1664 16.6665C24.3874 16.6665 24.5993 16.5787 24.7556 16.4224C24.9119 16.2661 24.9997 16.0542 24.9997 15.8332C24.9997 15.6122 24.9119 15.4002 24.7556 15.2439C24.5993 15.0876 24.3874 14.9998 24.1664 14.9998Z\"\r\n fill=\"#009BF3\" />\r\n </svg>\r\n\r\n </div>\r\n <div>\r\n <h2 class=\"mb-3\">Run Allocation Logic</h2>\r\n <p>This will map all fixtures and apply allocations based on the business-defined logic, then move them to\r\n the verification section. Are you sure you want to continue?</p>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n [disabled]=\"isButtonLoading\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"runAllocation()\" [disabled]=\"isButtonLoading\">\r\n <span *ngIf=\"!isButtonLoading\"> Run allocation Logic</span>\r\n <svg style=\"width: 141px;\" *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #approveLayoutModal let-modal>\r\n <div class=\"modal-body\">\r\n <div>\r\n <h2 class=\"mb-3\">Approve & Submit</h2>\r\n <p>\r\n This will complete the layout and make it ready for allocation. Ensure that all fixture counts and\r\n placements are as per the plan.\r\n </p>\r\n </div>\r\n @if(hasInvalidFixtures) {\r\n <div class=\"d-flex align-items-start gap-2 p-3 mb-3 rounded\"\r\n style=\"background-color: #FFFAEB; border: 1px solid #FEC84B;\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"flex-shrink: 0; margin-top: 1px;\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F59E0B\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <p class=\"mb-0\" style=\"font-size: 13px; color: #92400E;\">\r\n @if(hasInvalidHeaderFixtures) {\r\n <strong>{{invalidHeaderFixtureCount}} fixture{{invalidHeaderFixtureCount === 1 ? '' : 's'}}\r\n {{invalidHeaderFixtureCount === 1 ? 'has' : 'have'}} an unrecognized header.</strong><br/>\r\n }\r\n @if(hasInvalidLibraryFixtures) {\r\n <strong>{{invalidLibraryFixtureCount}} fixture{{invalidLibraryFixtureCount === 1 ? '' : 's'}}\r\n {{invalidLibraryFixtureCount === 1 ? 'does' : 'do'}} not match any library entry.</strong><br/>\r\n }\r\n These are highlighted in red on the layout and must be corrected before the allocation rule can run.\r\n </p>\r\n </div>\r\n }\r\n <div class=\"d-flex justify-content-end gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n [disabled]=\"isButtonLoading\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"approveLayout()\" [disabled]=\"isButtonLoading\">\r\n <span *ngIf=\"!isButtonLoading\">Submit</span>\r\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #revertAllocationModal let-modal>\r\n <div class=\"modal-body\">\r\n <div class=\"d-flex justify-content-start mb-4\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"#FEF3C7\" />\r\n <path\r\n d=\"M20 13.3333V20M20 26.6667H20.0167M28.3333 20C28.3333 24.6024 24.6024 28.3333 20 28.3333C15.3976 28.3333 11.6667 24.6024 11.6667 20C11.6667 15.3976 15.3976 11.6667 20 11.6667C24.6024 11.6667 28.3333 15.3976 28.3333 20Z\"\r\n stroke=\"#F59E0B\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <div>\r\n <h2 class=\"mb-3\">Revert Allocation</h2>\r\n <p>Are you sure you want to revert the allocation? This will restore the state before running allocation.\r\n </p>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n [disabled]=\"isButtonLoading\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"revertAllocation(); modal.close()\"\r\n [disabled]=\"isButtonLoading\">\r\n <span *ngIf=\"!isButtonLoading\">Revert</span>\r\n <svg style=\"width: 141px;\" *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #completeAllocationModal let-modal>\r\n <div class=\"modal-body\">\r\n <div class=\"d-flex justify-content-start mb-4\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"#DAF1FF\" />\r\n <path\r\n d=\"M20.833 21.6665C18.033 21.6665 17.1164 22.7915 16.8164 23.5332C17.708 23.9165 18.333 24.7998 18.333 25.8332C18.333 26.4962 18.0696 27.1321 17.6008 27.6009C17.1319 28.0698 16.4961 28.3332 15.833 28.3332C15.17 28.3332 14.5341 28.0698 14.0653 27.6009C13.5964 27.1321 13.333 26.4962 13.333 25.8332C13.333 24.7415 14.0247 23.8165 14.9997 23.4748V16.5248C14.5114 16.3535 14.0885 16.0344 13.7899 15.6117C13.4912 15.1891 13.3315 14.684 13.333 14.1665C13.333 13.5035 13.5964 12.8676 14.0653 12.3987C14.5341 11.9299 15.17 11.6665 15.833 11.6665C16.4961 11.6665 17.1319 11.9299 17.6008 12.3987C18.0696 12.8676 18.333 13.5035 18.333 14.1665C18.333 15.2582 17.6414 16.1832 16.6664 16.5248V20.9332C17.3997 20.3915 18.4664 19.9998 19.9997 19.9998C22.2247 19.9998 22.9664 18.8832 23.208 18.1415C22.7521 17.9516 22.3625 17.6311 22.0882 17.2204C21.8139 16.8097 21.6671 16.3271 21.6664 15.8332C21.6664 15.1701 21.9297 14.5342 22.3986 14.0654C22.8674 13.5966 23.5033 13.3332 24.1664 13.3332C24.8294 13.3332 25.4653 13.5966 25.9341 14.0654C26.403 14.5342 26.6664 15.1701 26.6664 15.8332C26.6664 16.9498 25.933 17.9165 24.9247 18.2165C24.708 19.4082 23.8997 21.6665 20.833 21.6665ZM15.833 24.9998C15.612 24.9998 15.4 25.0876 15.2438 25.2439C15.0875 25.4002 14.9997 25.6122 14.9997 25.8332C14.9997 26.0542 15.0875 26.2661 15.2438 26.4224C15.4 26.5787 15.612 26.6665 15.833 26.6665C16.054 26.6665 16.266 26.5787 16.4223 26.4224C16.5786 26.2661 16.6664 26.0542 16.6664 25.8332C16.6664 25.6122 16.5786 25.4002 16.4223 25.2439C16.266 25.0876 16.054 24.9998 15.833 24.9998ZM15.833 13.3332C15.612 13.3332 15.4 13.421 15.2438 13.5772C15.0875 13.7335 14.9997 13.9455 14.9997 14.1665C14.9997 14.3875 15.0875 14.5995 15.2438 14.7558C15.4 14.912 15.612 14.9998 15.833 14.9998C16.054 14.9998 16.266 14.912 16.4223 14.7558C16.5786 14.5995 16.6664 14.3875 16.6664 14.1665C16.6664 13.9455 16.5786 13.7335 16.4223 13.5772C16.266 13.421 16.054 13.3332 15.833 13.3332ZM24.1664 14.9998C23.9453 14.9998 23.7334 15.0876 23.5771 15.2439C23.4208 15.4002 23.333 15.6122 23.333 15.8332C23.333 16.0542 23.4208 16.2661 23.5771 16.4224C23.7334 16.5787 23.9453 16.6665 24.1664 16.6665C24.3874 16.6665 24.5993 16.5787 24.7556 16.4224C24.9119 16.2661 24.9997 16.0542 24.9997 15.8332C24.9997 15.6122 24.9119 15.4002 24.7556 15.2439C24.5993 15.0876 24.3874 14.9998 24.1664 14.9998Z\"\r\n fill=\"#009BF3\" />\r\n </svg>\r\n </div>\r\n <div>\r\n <h2 class=\"mb-3\">Save and complete allocation</h2>\r\n <p>You are about to complete the merch allocation process. This will make the store ready for fixture\r\n verification and move it to the verification stage. Are you sure you want to proceed?</p>\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n [disabled]=\"isButtonLoading\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"completeAllocation();\" [disabled]=\"isButtonLoading\">\r\n <span *ngIf=\"!isButtonLoading\">Complete allocation</span>\r\n <svg style=\"width: 107px;\" *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </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}#onboard-plano ::ng-deep .backgroundImg{background-color:#f9fafb!important}#onboard-plano ::ng-deep .accordion .accordion-button.backgroundImg:not(.collapsed){background-color:#f9fafb!important}#onboard-plano ::ng-deep .accordion-body{padding:10px 20px 20px}#onboard-plano .s-card{position:relative;box-sizing:border-box;border-radius:8px;background:#fff;padding:20px 16px;height:75dvh;overflow-y:auto;overflow-x:visible}#onboard-plano .c-card{border-radius:8px;background:#fff;padding:20px 16px;height:75dvh;overflow:hidden;width:100%}#onboard-plano .h-card{border-radius:8px;background:#fff;padding:20px 16px;min-height:20dvh}#onboard-plano .wall-label{color:var(--Gray-600, #475467);font-family:Inter;font-size:14px;font-style:normal;font-weight:600}#onboard-plano img{width:100%;height:100%;object-fit:cover;display:block}#onboard-plano #header .title{color:var(--Gray-800, #1d2939);font-size:16px;font-weight:600;line-height:24px;margin:0}#onboard-plano #header .cus-btn{color:#009bf3;background:#eaf8ff;padding:4px 10px;border-radius:16px;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;text-align:center;cursor:pointer}#onboard-plano #header .cus-btn:hover{background:#e2f5ff}#onboard-plano .loader .shimmer{height:100%!important}#onboard-plano .collapse-handler{position:absolute;height:32px;width:32px;display:flex;justify-content:center;align-items:center;border-radius:50%;background:#fff;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808;cursor:pointer;top:12px}#onboard-plano .collapse-handler.right{right:0}#onboard-plano .collapse-handler.left{left:0}#onboard-plano .collapsed-col{transition:all .3s ease;width:40px!important}#onboard-plano [class^=col]{transition:all .3s ease}#onboard-plano #segment-btn .custom-tabs{border-radius:8px;border:1px solid var(--Gray-300, #d0d5dd);overflow:hidden;margin-bottom:24px}#onboard-plano #segment-btn .custom-tabs .nav-link{border-radius:0%;color:#495057;padding:.75rem 1rem;background-color:#fff;text-align:center;border-right:1px solid var(--Gray-300, #d0d5dd);transition:all ease .2s;font-weight:500}#onboard-plano #segment-btn .custom-tabs .nav-link.active{background:var(--Primary-500, #33b5ff);color:#fff}#onboard-plano #segment-btn .nav-tabs .nav-link{border:none;margin:0}#onboard-plano #segment-btn .nav-item{text-align:center}#onboard-plano #segment-btn .nav-item:last-child .nav-link{border:none}#onboard-plano .link-btn{color:#33b5ff;cursor:pointer;font-weight:500}#onboard-plano .link-btn:hover{color:#33b5ff;text-decoration:underline!important}#onboard-plano .btn-red{border-radius:8px!important;border:1px solid #fef3f2!important;background:#fef3f2!important;box-shadow:0 1px 2px #1018280d!important;padding:10px 18px!important;color:#b42318!important;font-size:16px!important;font-weight:600!important}#onboard-plano .updateClass{font-family:Inter;font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#667085}#onboard-plano .fixture-row{border-radius:8px;transition:background-color .2s ease,box-shadow .2s ease}#onboard-plano .fixture-row.highlighted-fixture{background-color:#eaf8ff;box-shadow:0 0 0 2px #33b5ff}.btn .spinner{height:22px;min-width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
|
|
4223
4239
|
}], ctorParameters: () => [{ type: i1.StoreBuilderService }, { type: i2.ActivatedRoute }, { type: i3.FormBuilder }, { type: i4.GlobalStateService }, { type: i5.TitleCasePipe }, { type: i6.ToastService }, { type: i7.NgbModal }, { type: i4.PageInfoService }, { type: i5.Location }, { type: i2.Router }, { type: i0.ChangeDetectorRef }], propDecorators: { canvasRef: [{
|
|
4224
4240
|
type: ViewChild,
|
|
4225
4241
|
args: ["baseCanvas"]
|
|
@@ -4245,4 +4261,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
4245
4261
|
type: HostListener,
|
|
4246
4262
|
args: ["window:resize"]
|
|
4247
4263
|
}] } });
|
|
4248
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25ib2FyZC1zdG9yZS1wbGFuby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9vbmJvYXJkLXN0b3JlLXBsYW5vL29uYm9hcmQtc3RvcmUtcGxhbm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvb25ib2FyZC1zdG9yZS1wbGFuby9vbmJvYXJkLXN0b3JlLXBsYW5vLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBRVQsWUFBWSxFQUlaLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQVksYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFMUQsT0FBTyxFQUdMLFdBQVcsRUFFWCxVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUl4QixPQUFPLEVBQ0wsT0FBTyxFQUVQLFlBQVksRUFDWixjQUFjLEVBQ2QsU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLE1BQU0sQ0FBQztBQUdkLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBTWpDLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVFQUF1RSxDQUFDO0FBQ3hILE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBRTFHLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixHQUNqQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFRdkUsTUFBTSxPQUFPLDBCQUEwQjtJQXdKM0I7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lB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OlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuaW1wb3J0IHsgTG9jYXRpb24sIFRpdGxlQ2FzZVBpcGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gIEZvcm1BcnJheSxcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtR3JvdXAsXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuXHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gIFN1YmplY3QsXHJcbiAgU3Vic2NyaXB0aW9uLFxyXG4gIGRlYm91bmNlVGltZSxcclxuICBmaXJzdFZhbHVlRnJvbSxcclxuICBmcm9tRXZlbnQsXHJcbiAgdGFrZVVudGlsLFxyXG59IGZyb20gXCJyeGpzXCI7XHJcblxyXG5pbXBvcnQgeyBOZ2JBY2NvcmRpb25EaXJlY3RpdmUsIE5nYk1vZGFsIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCAqIGFzIGZhYnJpYyBmcm9tIFwiZmFicmljXCI7XHJcblxyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UsIFBhZ2VJbmZvU2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktZ2xvYmFsXCI7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktc2hhcmVkXCI7XHJcblxyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBMYXlvdXRFZGl0Q29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4uL3BvcHVwcy9sYXlvdXQtZWRpdC1jb25maXJtYXRpb24vbGF5b3V0LWVkaXQtY29uZmlybWF0aW9uLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQgfSBmcm9tIFwiLi4vcG9wdXBzL2RlbGV0ZS1jb25maXJtYXRpb24vZGVsZXRlLWNvbmZpcm1hdGlvbi5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25JRiB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL3BsYW5vLWdlbmVyYWwuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7XHJcbiAgREVGQVVMVF9DT01QQUNUSU9OX0NPTkZJRyxcclxuICBjb21wYWN0Rmxvb3JEZXN0cnVjdGl2ZSxcclxuICBnZXRGbG9vckJvdW5kc0Z0LFxyXG59IGZyb20gXCIuL3V0aWxzL2F4aXMtY29tcGFjdGlvblwiO1xyXG5pbXBvcnQgeyBnZXRGaXh0dXJlQ2FudmFzTGFiZWwgfSBmcm9tIFwiLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJsaWItb25ib2FyZC1zdG9yZS1wbGFub1wiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vb25ib2FyZC1zdG9yZS1wbGFuby5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vb25ib2FyZC1zdG9yZS1wbGFuby5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIHByb3ZpZGVyczogW1RpdGxlQ2FzZVBpcGVdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgT25ib2FyZFN0b3JlUGxhbm9Db21wb25lbnRcclxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25Jbml0XHJcbntcclxuICBAVmlld0NoaWxkKFwiYmFzZUNhbnZhc1wiKVxyXG4gIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoXCJjYW52YXNDb250YWluZXJcIikgY29udGFpbmVyUmVmITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZChcImFwcGx5TG9naWNzXCIpIGFwcGx5TG9naWNzTW9kYWxSZWYhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoXCJhcHByb3ZlTGF5b3V0TW9kYWxcIikgYXBwcm92ZUxheW91dE1vZGFsUmVmITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKFwicmV2ZXJ0QWxsb2NhdGlvbk1vZGFsXCIpXHJcbiAgcmV2ZXJ0QWxsb2NhdGlvbk1vZGFsUmVmITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKFwiY29tcGxldGVBbGxvY2F0aW9uTW9kYWxcIilcclxuICBjb21wbGV0ZUFsbG9jYXRpb25Nb2RhbFJlZiE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZChcImJvZHlBY2NvcmRpb25cIikgYm9keUFjY29yZGlvbj86IE5nYkFjY29yZGlvbkRpcmVjdGl2ZTtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpyZXNpemVcIilcclxuICBvblJlc2l6ZSgpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlc2l6ZUNhbnZhcygpO1xyXG4gICAgfSwgMzAwKTtcclxuICB9XHJcblxyXG4gIGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuXHJcbiAgY2FudmFzITogZmFicmljLkNhbnZhcztcclxuICB6b29tTGV2ZWw6IG51bWJlciA9IDE7XHJcbiAgd2FsbFRoaWNrbmVzcyA9IDMwO1xyXG4gIHZlcnRpY2FsTWFyZ2luID0gKDEuMjUgLyAxMDApICogdGhpcy50b1BpeGVscygxNTI0LCBcIm1tXCIpO1xyXG5cclxuICBsYXlvdXRGb3JtOiBGb3JtR3JvdXA7XHJcbiAgc2VsZWN0ZWRGbG9vcklkID0gbmV3IEZvcm1Db250cm9sKFwiXCIpO1xyXG4gIGZsb29yc0xpc3Q6IERyb3Bkb3duSUZbXVtdID0gW107XHJcbiAgZml4dHVyZUNvbmZpZ1N1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcbiAgZml4dHVyZVRlbXBsYXRlSWRTdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG4gIG90aGVyRWxlbWVudHNTdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG5cclxuICBwbGFub0RhdGE6IGFueTtcclxuXHJcbiAgZmxvb3JEYXRhOiBhbnk7XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxGbG9vckRhdGE6IGFueTsgLy8gdXNlZCB0byByb2xsYmFjayB0byBvcmlnaW5hbCBsYXlvdXQgc3RhdGUgb24gY2xpY2sgY2FuY2VsIHdoaWxlIGVkaXRpbmcuXHJcblxyXG4gIC8qKlxyXG4gICAqIENvbXBhY3QgaXMgYSBvbmUtc2hvdCBhY3Rpb24sIG5vdCBhIHRvZ2dsZS4gQ2xpY2tpbmcgaXQgY29tcGFjdHMgdGhlXHJcbiAgICogbGF5b3V0IGRlc3RydWN0aXZlbHkgYW5kIGRyb3BzIHRoZSB1c2VyIGludG8gZWRpdCBtb2RlIHNvIHRoZSBjaGFuZ2VcclxuICAgKiBzaG93cyB1cCBhcyBhbiB1bnNhdmVkIGVkaXQgKHJldmVydGFibGUgdmlhIENhbmNlbCwgcGVyc2lzdGFibGUgdmlhXHJcbiAgICogU2F2ZSAvIFN1Ym1pdCkuIElmIG5vIGNvbXBhY3Rpb24gaXMgcG9zc2libGUgd2Uga2VlcCB0aGUgdXNlciBpbiB2aWV3XHJcbiAgICogbW9kZSBhbmQgc3VyZmFjZSB0aGUgcmVhc29uIHZpYSB0b2FzdCDigJQgbm8gc2lsZW50IG5vLW9wcy5cclxuICAgKi9cclxuICBjb21wYWN0TGF5b3V0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmZsb29yRGF0YSkgcmV0dXJuO1xyXG4gICAgY29uc3QgYmVmb3JlID0gZ2V0Rmxvb3JCb3VuZHNGdCh0aGlzLmZsb29yRGF0YSk7XHJcbiAgICBjb25zdCBjb21wYWN0ZWQgPSBjb21wYWN0Rmxvb3JEZXN0cnVjdGl2ZShcclxuICAgICAgdGhpcy5mbG9vckRhdGEsXHJcbiAgICAgIERFRkFVTFRfQ09NUEFDVElPTl9DT05GSUcsXHJcbiAgICApO1xyXG4gICAgY29uc3QgYWZ0ZXIgPSBnZXRGbG9vckJvdW5kc0Z0KGNvbXBhY3RlZCk7XHJcbiAgICBjb25zdCB3aWR0aFNocmluayA9IChiZWZvcmUubWF4WCAtIGJlZm9yZS5taW5YKSAtIChhZnRlci5tYXhYIC0gYWZ0ZXIubWluWCk7XHJcbiAgICBjb25zdCBoZWlnaHRTaHJpbmsgPSAoYmVmb3JlLm1heFkgLSBiZWZvcmUubWluWSkgLSAoYWZ0ZXIubWF4WSAtIGFmdGVyLm1pblkpO1xyXG4gICAgaWYgKHdpZHRoU2hyaW5rIDwgMC41ICYmIGhlaWdodFNocmluayA8IDAuNSkge1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRXYXJuaW5nVG9hc3QoXHJcbiAgICAgICAgXCJMYXlvdXQgaXMgYWxyZWFkeSBjb21wYWN0IOKAlCBubyBmdXJ0aGVyIGNvbXBhY3Rpb24gcG9zc2libGVcIixcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbiA9IGNvbXBhY3RlZC5sYXlvdXRQb2x5Z29uO1xyXG4gICAgdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZSA9IGNvbXBhY3RlZC5jZW50ZXJGaXh0dXJlO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29tcGFjdGVkLm90aGVyRWxlbWVudHMpKSB7XHJcbiAgICAgIHRoaXMuZmxvb3JEYXRhLm90aGVyRWxlbWVudHMgPSBjb21wYWN0ZWQub3RoZXJFbGVtZW50cztcclxuICAgIH1cclxuICAgIHRoaXMucmVvcmRlckZpeHR1cmUodGhpcy5mbG9vckRhdGEpO1xyXG4gICAgLy8gRHJvcCBpbnRvIGVkaXQgbW9kZSBzbyB0aGUgY29tcGFjdGlvbiBsaXZlcyBhcyBhbiB1bnNhdmVkIGVkaXQg4oCUXHJcbiAgICAvLyBDYW5jZWwgd2lsbCByZWZldGNoIGFuZCByZXZlcnQgaXQsIFNhdmUgLyBTdWJtaXQgd2lsbCBwZXJzaXN0IGl0LlxyXG4gICAgdGhpcy50b2dnbGVQYW5lbChcInJpZ2h0XCIsIHRydWUpO1xyXG4gICAgdGhpcy50b2dnbGVQYW5lbChcImxlZnRcIiwgZmFsc2UpO1xyXG4gICAgdGhpcy5jcmVhdGVGb3JtKCk7XHJcbiAgICB0aGlzLmxheW91dEZvcm0uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIHRoaXMucmVuZGVyRmxvb3IodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgY2FuU2hvd0NvbXBhY3RUb2dnbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLmZsb29yRGF0YT8uX2lkICYmIHRoaXMuZ2V0U3RhdHVzID09PSBcImRyYWZ0XCI7XHJcbiAgfVxyXG5cclxuICBjZG5Vcmw6IHN0cmluZztcclxuICBmaXh0dXJlVGVtcGxhdGVzOiBhbnlbXSA9IFtdO1xyXG4gIGFsbEZpeHR1cmVzOiBhbnlbXSA9IFtdOyAvLyBhbGwgZml4dHVyZXMgaW5jbHVkaW5nIHRoZSBtYXN0ZXIgdGVtcGxhdGVzIGZvciB0cmVlIHZpZXdcclxuICAvLyBhbGxGaXh0dXJlSW5zdGFuY2VzOiBhbnlbXSA9IFtdOyAvLyBvbmx5IHRoZSBsYXlvdXQgZml4dHVyZXMgaW5zdGFuY2VzLlxyXG4gIHN0b3JlRmVlZGJhY2s6IGFueTtcclxuXHJcbiAgc2VsZWN0ZWRGaXh0dXJlOiBhbnk7XHJcbiAgc2VsZWN0ZWRGaXh0dXJlRGF0YTogYW55O1xyXG4gIGVkaXRGaXh0dXJlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZWRpdEZpeHR1cmVTZWN0aW9uOiBcImJhc2ljLWRldGFpbHNcIiB8IFwicHJvZHVjdHNcIiB8IFwidm1zXCIgPSBcImJhc2ljLWRldGFpbHNcIjtcclxuICBzdWJtaXRGaXh0dXJlID0gZmFsc2U7XHJcblxyXG4gIGhpZ2hsaWdodGVkRml4dHVyZUZvcm1JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGxheW91dE1ldHJpY3MgPSB7XHJcbiAgICBhbGxTdG9yZTogMCxcclxuICAgIGFsbG9jYXRpb25QZW5kaW5nOiAwLFxyXG4gICAgZHJhZnQ6IDAsXHJcbiAgfTtcclxuXHJcbiAgaXNQYWdlTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNSaWdodFBhbmVsQ29sbGFwc2VkOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0xlZnRQYW5lbENvbGxhcHNlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGRpc2FibGVFZGl0OiBib29sZWFuID0gdHJ1ZTtcclxuICBpc1NhdmluZ0xheW91dDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpc0FsbG9jYXRpb25SdW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBmbG9vckRhdGFCZWZvcmVBbGxvY2F0aW9uOiBhbnkgPSBudWxsO1xyXG5cclxuICBvdGhlckVsZW1lbnRMaXN0OiBEcm9wZG93bklGW10gPSBbXHJcbiAgICB7IGxhYmVsOiBcIlBPUyBDb3VudGVyXCIsIHZhbHVlOiBcIlBPUyBDb3VudGVyXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiRGlzY3Vzc2lvbiBUYWJsZVwiLCB2YWx1ZTogXCJEaXNjdXNzaW9uIFRhYmxlXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiTWlycm9yXCIsIHZhbHVlOiBcIk1pcnJvclwiIH0sXHJcbiAgICB7IGxhYmVsOiBcIk90aGVyc1wiLCB2YWx1ZTogXCJPdGhlcnNcIiB9LFxyXG4gIF07XHJcbiAgc3RvcmVMaXN0OiBhbnkgPSBbXTtcclxuICBzZWxlY3RlZFN0b3JlTmFtZTogYW55O1xyXG5cclxuICBwcml2YXRlIGFjdGl2ZUhpZ2hsaWdodDogZmFicmljLlJlY3QgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGNhbmNlbEhpZ2hsaWdodEJsaW5rID0gZmFsc2U7XHJcblxyXG4gIGlzQnV0dG9uTG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICBsYXlvdXRCb3VuZHM6IGFueTtcclxuXHJcbiAgaXNSdW5BbGxvY2F0aW9uQWxsb3dlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpdm1BbGlhc0tleXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xyXG4gIGZpeHR1cmVMaWJyYXJ5QnlXaWR0aDogTWFwPG51bWJlciwgU2V0PHN0cmluZz4+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBsaWJyYXJ5Q2F0ZWdvcmllczogc3RyaW5nW10gPSBbXTtcclxuICBsaWJyYXJ5QnlDYXRlZ29yeTogTWFwPHN0cmluZywgU2V0PG51bWJlcj4+ID0gbmV3IE1hcCgpO1xyXG5cclxuICAvLyBGbGlwcGVkIHRvIHRydWUgYnkgYW55IGxheW91dC1sZXZlbCBtdXRhdGlvbiAoYWRkIC8gZGVsZXRlIC8gbW92ZSAvIHRlbXBsYXRlXHJcbiAgLy8gY2hhbmdlKS4gUmVzZXQgdG8gZmFsc2Ugb24gc3VjY2Vzc2Z1bCBzYXZlLiBHYXRlcyB0aGUgcGVyLWZpeHR1cmUgZWRpdCBpY29uXHJcbiAgLy8gc28gdGhlIHVzZXIgbXVzdCBzYXZlIGxheW91dCBjaGFuZ2VzIGZpcnN0LlxyXG4gIGxheW91dEhhc1Vuc2F2ZWRDaGFuZ2VzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHJlc3RyaWN0ZWRVc2Vyczogc3RyaW5nW10gPSBbXHJcbiAgICBcIm1hdGhldy5yaGVhQGxlbnNrYXJ0LmNvbVwiLFxyXG4gICAgXCJzYXdyYW4uc2luZ2hAZGVhbHNrYXJ0LmluXCIsXHJcbiAgICBcImFiaGluYXYua3Jpc2huYUBsZW5za2FydC5pblwiLFxyXG4gICAgXCJzdWRoYUB0YW5nb3RlY2guY28uaW5cIixcclxuICAgIC8vIFwiZ29waW5hdGhAdGFuZ290ZWNoLmNvLmluXCJcclxuICBdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRpdGxlQ2FzZTogVGl0bGVDYXNlUGlwZSxcclxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXHJcbiAgICBwcml2YXRlIHBhZ2VJbmZvOiBQYWdlSW5mb1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICApIHtcclxuICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG5cclxuICAgIHRoaXMuZ3MuZW52aXJvbm1lbnQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICBpZiAoZSkgdGhpcy5jZG5VcmwgPSBlLnBsYW5vZ3JhbUNETjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNldFBhZ2VEYXRhKCk7XHJcblxyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKGRhdGEpID0+IHtcclxuICAgICAgICBpZiAoZGF0YT8uY2xpZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaGVhZGVyRGF0YSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhd2FpdCB0aGlzLmdldFZtc0xpc3QoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XHJcbiAgICAgICAgaWYgKHBhcmFtcz8ucGxhbm9JZCkge1xyXG4gICAgICAgICAgdGhpcy5nZXRTdG9yZUZpeHR1cmVzKHBhcmFtcz8ucGxhbm9JZCk7XHJcbiAgICAgICAgICBpZiAocGFyYW1zPy5mbG9vcklkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhID0geyBfaWQ6IHBhcmFtcz8uZmxvb3JJZCB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3RvcmVkVXNlckluZm8gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInVzZXItaW5mb1wiKTtcclxuICAgICAgICBjb25zdCB1c2VyRGF0YSA9IHN0b3JlZFVzZXJJbmZvID8gSlNPTi5wYXJzZShzdG9yZWRVc2VySW5mbykgOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IGlzTm9uUmVzdHJpY3RlZFVzZXIgPVxyXG4gICAgICAgICAgISF1c2VyRGF0YSAmJiAhdGhpcy5yZXN0cmljdGVkVXNlcnMuaW5jbHVkZXModXNlckRhdGE/LmVtYWlsKTtcclxuICAgICAgICBjb25zdCBpc0FsbG9jYXRpb25PdmVycmlkZUVuYWJsZWQgPSBwYXJhbXM/LmFsbG9jYXRpb24gPT09IFwidHJ1ZVwiO1xyXG5cclxuICAgICAgICBpZiAoaXNOb25SZXN0cmljdGVkVXNlciB8fCBpc0FsbG9jYXRpb25PdmVycmlkZUVuYWJsZWQpIHtcclxuICAgICAgICAgIHRoaXMuaXNSdW5BbGxvY2F0aW9uQWxsb3dlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkRmxvb3JJZC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGFzeW5jIChpZCkgPT4ge1xyXG4gICAgICBjb25zdCBjbGlja2VkRmxvb3IgPSB0aGlzLnBsYW5vRGF0YT8uZmxvb3JzPy5maW5kKFxyXG4gICAgICAgIChmOiBhbnkpID0+IGYuX2lkID09PSBpZCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChjbGlja2VkRmxvb3Iuc3RhdHVzID09PSBcImNvbXBsZXRlZFwiKSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChcclxuICAgICAgICAgIGBtYW5hZ2UvcGxhbm9ncmFtL21hbmFnZS1wbGFub2dyYW0/cGxhbm9JZD0ke2NsaWNrZWRGbG9vci5wbGFub0lkfSZmbG9vcklkPSR7Y2xpY2tlZEZsb29yLl9pZH1gLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mbG9vckRhdGEgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5pc0xlZnRQYW5lbENvbGxhcHNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc1JpZ2h0UGFuZWxDb2xsYXBzZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLmZsb29yRGF0YSA9IGNsaWNrZWRGbG9vcjtcclxuICAgICAgICB0aGlzLnJlbmRlckZsb29yKCk7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRGb3JtLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIGNvbnN0IG5ld1BhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XHJcbiAgICAgICAgbmV3UGFyYW1zLnNldChcInBsYW5vSWRcIiwgdGhpcy5mbG9vckRhdGEucGxhbm9JZCk7XHJcbiAgICAgICAgbmV3UGFyYW1zLnNldChcImZsb29ySWRcIiwgdGhpcy5mbG9vckRhdGEuX2lkKTtcclxuXHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbi5yZXBsYWNlU3RhdGUoXHJcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsXHJcbiAgICAgICAgICBuZXdQYXJhbXMudG9TdHJpbmcoKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vcklkLnNldFZhbHVlKHRoaXMuZmxvb3JEYXRhLl9pZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbnZhcyA9IG5ldyBmYWJyaWMuQ2FudmFzKHRoaXMuY2FudmFzUmVmPy5uYXRpdmVFbGVtZW50LCB7XHJcbiAgICAgIHNlbGVjdGlvbkZ1bGx5Q29udGFpbmVkOiB0cnVlLFxyXG4gICAgICBwZXJQaXhlbFRhcmdldEZpbmQ6IHRydWUsXHJcbiAgICAgIHRhcmdldEZpbmRUb2xlcmFuY2U6IDUsXHJcbiAgICB9KTtcclxuXHJcbiAgICBmcm9tRXZlbnQodGhpcy5jYW52YXMgYXMgYW55LCBcIm9iamVjdDptb2RpZmllZFwiKVxyXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTAwKSlcclxuICAgICAgLnN1YnNjcmliZShhc3luYyAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbW92ZWRPYmo6IGFueSA9IGUudGFyZ2V0O1xyXG5cclxuICAgICAgICBpZiAoIW1vdmVkT2JqKSByZXR1cm47XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmxheW91dEZvcm0/LmVuYWJsZWQpIHtcclxuICAgICAgICAgIHRoaXMubGF5b3V0SGFzVW5zYXZlZENoYW5nZXMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1vdmVkT2JqPy50eXBlID09PSBcImFjdGl2ZVNlbGVjdGlvblwiKSB7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5R3JvdXBUcmFuc2Zvcm0obW92ZWRPYmopO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYWN0aW9uID0gZS50cmFuc2Zvcm0/LmFjdGlvbjtcclxuXHJcbiAgICAgICAgY29uc3QgaXNSZXNpemUgPVxyXG4gICAgICAgICAgYWN0aW9uID09PSBcInNjYWxlXCIgfHwgYWN0aW9uID09PSBcInNjYWxlWFwiIHx8IGFjdGlvbiA9PT0gXCJzY2FsZVlcIjtcclxuXHJcbiAgICAgICAgaWYgKGlzUmVzaXplKSB7XHJcbiAgICAgICAgICBjb25zdCB0eXBlID0gbW92ZWRPYmo/Lm9ialR5cGUgPz8gXCJncm91cFwiO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHg6IG1vdmVkT2JqLmxlZnQsXHJcbiAgICAgICAgICAgIHk6IG1vdmVkT2JqLnRvcCxcclxuICAgICAgICAgICAgd2lkdGg6IG1vdmVkT2JqLmdldFNjYWxlZFdpZHRoKCksXHJcbiAgICAgICAgICAgIGhlaWdodDogbW92ZWRPYmouZ2V0U2NhbGVkSGVpZ2h0KCksXHJcbiAgICAgICAgICAgIGFuZ2xlOiBtb3ZlZE9iai5hbmdsZSxcclxuICAgICAgICAgICAgZWxlbWVudERhdGE6IG1vdmVkT2JqLmRhdGEsXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwid2FsbFwiOiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXMucmVtb3ZlKG1vdmVkT2JqKTtcclxuICAgICAgICAgICAgICB1cGRhdGVkQ29uZmlnLmVsZW1lbnREYXRhLmFuZ2xlID0gdXBkYXRlZENvbmZpZy5hbmdsZTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgbmV3V2FsbCA9IGF3YWl0IHRoaXMuZHJhd1dhbGwoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhcyxcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWRDb25maWcueCxcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWRDb25maWcueSxcclxuICAgICAgICAgICAgICAgIHRoaXMud2FsbFRoaWNrbmVzcyxcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWRDb25maWcud2lkdGggLSAwLjI3LFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy5lbGVtZW50RGF0YSxcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAobmV3V2FsbCBhcyBhbnkpLm9ialR5cGUgPSBcIndhbGxcIjtcclxuICAgICAgICAgICAgICAobmV3V2FsbCBhcyBhbnkpLmRhdGEgPSB1cGRhdGVkQ29uZmlnLmVsZW1lbnREYXRhO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmNhbnZhcy5zZXRBY3RpdmVPYmplY3QobmV3V2FsbCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNhc2UgXCJvdGhlcnNcIjoge1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FudmFzLnJlbW92ZShtb3ZlZE9iaik7XHJcbiAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy5lbGVtZW50RGF0YS5yZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlID1cclxuICAgICAgICAgICAgICAgIHVwZGF0ZWRDb25maWcuYW5nbGU7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IG5ld090aGVyID0gdGhpcy5kcmF3T3RoZXJFbGVtZW50c1dpdGhMYWJlbChcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy54LFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy55LFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy5hbmdsZSxcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWRDb25maWcud2lkdGggLSAyLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy5oZWlnaHQgLSAyLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy5lbGVtZW50RGF0YSxcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAobmV3T3RoZXIgYXMgYW55KS5vYmpUeXBlID0gXCJvdGhlcnNcIjtcclxuICAgICAgICAgICAgICAobmV3T3RoZXIgYXMgYW55KS5kYXRhID0gdXBkYXRlZENvbmZpZy5lbGVtZW50RGF0YTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXMuc2V0QWN0aXZlT2JqZWN0KG5ld090aGVyKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2FzZSBcImVudHJhbmNlXCI6IHtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2FzZSBcImZpeHR1cmVcIjoge1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlV2FsbENvb3JkaW5hdGVzKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVGaXh0dXJlQ29vcmRpbmF0ZXMoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZU90aGVyRWxlbWVudHNDb29yZGluYXRlcygpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRW50cmFuY2VDb29yZGluYXRlcygpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldHVwWm9vbUhhbmRsZXJzKCk7XHJcblxyXG4gICAgdGhpcy5saXN0ZW5Ub0RlbGV0ZUtleSgpO1xyXG4gICAgdGhpcy50b2dnbGVQYW5lbChcImxlZnRcIiwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGVBbGxQb3NpdGlvbnMoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZVdhbGxDb29yZGluYXRlcygpO1xyXG4gICAgdGhpcy51cGRhdGVGaXh0dXJlQ29vcmRpbmF0ZXMoKTtcclxuICAgIHRoaXMudXBkYXRlT3RoZXJFbGVtZW50c0Nvb3JkaW5hdGVzKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUVudHJhbmNlQ29vcmRpbmF0ZXMoKTtcclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5jYWRMYXlvdXQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGFwcGx5R3JvdXBUcmFuc2Zvcm0oc2VsZWN0aW9uOiBmYWJyaWMuQWN0aXZlU2VsZWN0aW9uKSB7XHJcbiAgICBjb25zdCBtYXRyaXggPSBzZWxlY3Rpb24uY2FsY1RyYW5zZm9ybU1hdHJpeCgpO1xyXG5cclxuICAgIHNlbGVjdGlvbi5nZXRPYmplY3RzKCkuZm9yRWFjaCgob2JqOiBhbnkpID0+IHtcclxuICAgICAgY29uc3Qgb2JqTWF0cml4ID0gb2JqLmNhbGNUcmFuc2Zvcm1NYXRyaXgoKTtcclxuICAgICAgY29uc3QgZmluYWxNYXRyaXggPSBmYWJyaWMudXRpbC5tdWx0aXBseVRyYW5zZm9ybU1hdHJpY2VzKFxyXG4gICAgICAgIG1hdHJpeCxcclxuICAgICAgICBvYmpNYXRyaXgsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBjb25zdCBwb2ludCA9IG5ldyBmYWJyaWMuUG9pbnQoMCwgMCkudHJhbnNmb3JtKGZpbmFsTWF0cml4KTtcclxuXHJcbiAgICAgIG9iai5zZXQoe1xyXG4gICAgICAgIGxlZnQ6IHBvaW50LngsXHJcbiAgICAgICAgdG9wOiBwb2ludC55LFxyXG4gICAgICAgIGFuZ2xlOiBzZWxlY3Rpb24uYW5nbGUgKyAob2JqLmFuZ2xlID8/IDApLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIG9iai5zZXRDb29yZHMoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFVuZ3JvdXAgYWZ0ZXIgYXBwbHlpbmcgdHJhbnNmb3JtXHJcbiAgICB0aGlzLmNhbnZhcy5kaXNjYXJkQWN0aXZlT2JqZWN0KCk7XHJcbiAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgfVxyXG5cclxuICByZXNpemVDYW52YXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5jYW52YXMuc2V0RGltZW5zaW9ucyh7XHJcbiAgICAgIHdpZHRoOiBjb250YWluZXIuY2xpZW50V2lkdGggLSA1MCxcclxuXHJcbiAgICAgIGhlaWdodDogY29udGFpbmVyLmNsaWVudEhlaWdodCAtIDQwLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgfVxyXG5cclxuICBzZXR1cFpvb21IYW5kbGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMuY2FudmFzLm9uKFwibW91c2U6d2hlZWxcIiwgKG9wdDogZmFicmljLlRFdmVudDxXaGVlbEV2ZW50PikgPT4ge1xyXG4gICAgICBjb25zdCBlID0gb3B0LmU7XHJcblxyXG4gICAgICBpZiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkge1xyXG4gICAgICAgIC8vIHRoaXMuaXNVc2VySW50ZXJhY3RlZFdpdGhDYW52YXMgPSB0cnVlO1xyXG4gICAgICAgIGNvbnN0IGRlbHRhID0gZS5kZWx0YVk7XHJcbiAgICAgICAgbGV0IHpvb20gPSB0aGlzLmNhbnZhcy5nZXRab29tKCk7XHJcbiAgICAgICAgem9vbSAqPSAwLjk5NSAqKiBkZWx0YTtcclxuXHJcbiAgICAgICAgem9vbSA9IE1hdGgubWF4KDAuMDUsIE1hdGgubWluKHpvb20sIDUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5jYW52YXMuem9vbVRvUG9pbnQoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHg6IGUub2Zmc2V0WCxcclxuICAgICAgICAgICAgeTogZS5vZmZzZXRZLFxyXG4gICAgICAgICAgfSBhcyBmYWJyaWMuUG9pbnQsXHJcbiAgICAgICAgICB6b29tLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG4gICAgbGV0IGxhc3RQb3NYID0gMDtcclxuICAgIGxldCBsYXN0UG9zWSA9IDA7XHJcblxyXG4gICAgdGhpcy5jYW52YXMub24oXCJtb3VzZTpkb3duXCIsIChvcHQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIW9wdC50YXJnZXQpIHtcclxuICAgICAgICBpc0RyYWdnaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNhbnZhcy5zZWxlY3Rpb24gPSBmYWxzZTtcclxuICAgICAgICBjb25zdCBlID0gb3B0LmU7XHJcbiAgICAgICAgbGFzdFBvc1ggPSBlLmNsaWVudFg7XHJcbiAgICAgICAgbGFzdFBvc1kgPSBlLmNsaWVudFk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FudmFzLm9uKFwibW91c2U6bW92ZVwiLCAob3B0OiBhbnkpID0+IHtcclxuICAgICAgaWYgKGlzRHJhZ2dpbmcgJiYgdGhpcy5jYW52YXMudmlld3BvcnRUcmFuc2Zvcm0pIHtcclxuICAgICAgICAvLyB0aGlzLmlzVXNlckludGVyYWN0ZWRXaXRoQ2FudmFzID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBlID0gb3B0LmU7XHJcbiAgICAgICAgY29uc3QgdnB0ID0gdGhpcy5jYW52YXMudmlld3BvcnRUcmFuc2Zvcm07XHJcbiAgICAgICAgdnB0WzRdICs9IGUuY2xpZW50WCAtIGxhc3RQb3NYO1xyXG4gICAgICAgIHZwdFs1XSArPSBlLmNsaWVudFkgLSBsYXN0UG9zWTtcclxuICAgICAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgICAgICAgbGFzdFBvc1ggPSBlLmNsaWVudFg7XHJcbiAgICAgICAgbGFzdFBvc1kgPSBlLmNsaWVudFk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FudmFzLm9uKFwibW91c2U6dXBcIiwgKCkgPT4ge1xyXG4gICAgICBpc0RyYWdnaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2FudmFzLnNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldFBhZ2VEYXRhKCkge1xyXG4gICAgdGhpcy5wYWdlSW5mby5zZXRUaXRsZShcIkNyZWF0ZSBTdG9yZSBQbGFub1wiKTtcclxuICAgIHRoaXMucGFnZUluZm8uc2V0QnJlYWRjcnVtYnMoW1xyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiUGxhbm9ncmFtXCIsXHJcbiAgICAgICAgcGF0aDogXCIvbWFuYWdlL3BsYW5vZ3JhbS9tYW5hZ2UtcGxhbm9ncmFtcy9vbmJvYXJkXCIsXHJcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGlzU2VwYXJhdG9yOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlwiLFxyXG4gICAgICAgIHBhdGg6IFwiXCIsXHJcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGlzU2VwYXJhdG9yOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBvbkZpeHR1cmVTYXZlKCkge1xyXG4gICAgdGhpcy5zdWJtaXRGaXh0dXJlID0gdHJ1ZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnN1Ym1pdEZpeHR1cmUgPSBmYWxzZTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkZpeHR1cmVQYWdlQ2FuY2VsKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhID0gbnVsbDtcclxuICAgIHRoaXMuZWRpdEZpeHR1cmVTZWN0aW9uID0gXCJiYXNpYy1kZXRhaWxzXCI7XHJcbiAgICB0aGlzLmVkaXRGaXh0dXJlID0gZmFsc2U7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlckZsb29yKGZhbHNlKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5yZXNpemVDYW52YXMoKTtcclxuICAgICAgdGhpcy5maXRDYW52YXNUb0xheW91dEFuaW1hdGVkKCk7XHJcbiAgICB9LCAzMDApO1xyXG4gIH1cclxuXHJcbiAgb25GaXh0dXJlU3VibWl0KGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICghZXZlbnQgJiYgIXRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgIGlmIChldmVudD8uc2hlbGYgJiYgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhPy5zaGVsZkNvbmZpZykge1xyXG4gICAgICBldmVudC5zaGVsZiA9IGV2ZW50LnNoZWxmLm1hcCgoc2hlbGY6IGFueSwgaW5kZXg6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBmaW5kU2hlbGYgPSB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEuc2hlbGZDb25maWcuZmluZChcclxuICAgICAgICAgIChlbGU6IGFueSkgPT4gZWxlLnNoZWxmTnVtYmVyID09IGluZGV4ICsgMSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChmaW5kU2hlbGYpIHtcclxuICAgICAgICAgIHNoZWxmID0geyAuLi5maW5kU2hlbGYsIC4uLnNoZWxmIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBkZXRhaWxzID1cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnW1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YS5zaGVsZkNvbmZpZy5sZW5ndGggLSAxXHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgICBkZXRhaWxzLnNoZWxmTnVtYmVyID0gaW5kZXggKyAxO1xyXG4gICAgICAgICAgc2hlbGYgPSB7IC4uLmRldGFpbHMsIC4uLnNoZWxmIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzaGVsZjtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGFbXCJzaGVsZkNvbmZpZ1wiXSA9IGV2ZW50Py5zaGVsZjtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhW1wiZGVzY3JpcHRpb25cIl0gPSBldmVudD8uZGVzY3JpcHRpb24gPz8gXCJcIjtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhW1widGVtcGxhdGVHcm91cE5hbWVcIl0gPVxyXG4gICAgICAgIGV2ZW50Py50ZW1wbGF0ZUdyb3VwTmFtZSA/PyBcIlwiO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEuaGVhZGVyLmxhYmVsID0gZXZlbnQ/LmhlYWRlckxhYmVsID8/IFwiXCI7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YS5mb290ZXIubGFiZWwgPSBldmVudD8uZm9vdGVyTGFiZWwgPz8gXCJcIjtcclxuXHJcbiAgICAgIHRoaXMudmFsaWRhdGVGaXh0dXJlcygpO1xyXG4gICAgICB0aGlzLnJlbmRlckZsb29yKGZhbHNlKTtcclxuICAgIH0gZWxzZSBpZiAoZXZlbnQ/LnNlY3Rpb24pIHtcclxuICAgICAgZXZlbnQuc2VjdGlvbi5mb3JFYWNoKChzZWM6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBudW1iZXIgPSBzZWM/LnNoZWx2ZXM/Lm1hcCgoZWxlOiBhbnkpID0+XHJcbiAgICAgICAgICBwYXJzZUludChlbGUuc3BsaXQoXCIgXCIpWzFdKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YT8uc2hlbGZDb25maWcuZm9yRWFjaCgoc2hlbGY6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKG51bWJlci5pbmNsdWRlcyhzaGVsZi5zaGVsZk51bWJlcikpIHtcclxuICAgICAgICAgICAgc2hlbGYuem9uZSA9IHNlYy56b25lO1xyXG4gICAgICAgICAgICBzaGVsZi5wcm9kdWN0QnJhbmROYW1lID0gc2VjLnByb2R1Y3RCcmFuZE5hbWU7XHJcbiAgICAgICAgICAgIHNoZWxmLnByb2R1Y3RDYXRlZ29yeSA9IHNlYy5wcm9kdWN0Q2F0ZWdvcnk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChldmVudD8udm1Db25maWcgJiYgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhPy52bUNvbmZpZykge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGFbXCJ2bUNvbmZpZ1wiXSA9IGV2ZW50Py52bUNvbmZpZztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChldmVudCkge1xyXG4gICAgICAgIC8vIHRoaXMuZ2V0Vm1zTGlzdCgpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5lZGl0Rml4dHVyZVNlY3Rpb24gPSBcImJhc2ljLWRldGFpbHNcIjtcclxuICAgICAgICB0aGlzLmVkaXRGaXh0dXJlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5nZXRTdG9yZUZpeHR1cmVzKHRoaXMucGxhbm9EYXRhPy5faWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVQYW5lbChzaWRlOiBcImxlZnRcIiB8IFwicmlnaHRcIiwgYWN0aW9uPzogYm9vbGVhbikge1xyXG4gICAgaWYgKHNpZGUgPT09IFwibGVmdFwiKSB7XHJcbiAgICAgIHRoaXMuaXNMZWZ0UGFuZWxDb2xsYXBzZWQgPSBhY3Rpb24gPz8gIXRoaXMuaXNMZWZ0UGFuZWxDb2xsYXBzZWQ7XHJcbiAgICAgIGlmICghdGhpcy5pc0xlZnRQYW5lbENvbGxhcHNlZCkgdGhpcy5pc1JpZ2h0UGFuZWxDb2xsYXBzZWQgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pc1JpZ2h0UGFuZWxDb2xsYXBzZWQgPSBhY3Rpb24gPz8gIXRoaXMuaXNSaWdodFBhbmVsQ29sbGFwc2VkO1xyXG4gICAgICBpZiAoIXRoaXMuaXNSaWdodFBhbmVsQ29sbGFwc2VkKSB0aGlzLmlzTGVmdFBhbmVsQ29sbGFwc2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5yZXNpemVDYW52YXMoKTtcclxuICAgICAgdGhpcy5maXRDYW52YXNUb0xheW91dEFuaW1hdGVkKCk7XHJcbiAgICB9LCA0MDApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0VGVtcGxhdGUoZml4dHVyZUNvbmZpZ0lkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgdGhpcy5hcGlTZXJ2aWNlLmdldEZpeHR1cmVUZW1wbGF0ZShmaXh0dXJlQ29uZmlnSWQpLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHRyYW5zZmVyQXJyYXlJdGVtPFQgPSBhbnk+KFxyXG4gICAgY3VycmVudEFycmF5OiBUW10sXHJcbiAgICB0YXJnZXRBcnJheTogVFtdLFxyXG4gICAgY3VycmVudEluZGV4OiBudW1iZXIsXHJcbiAgICB0YXJnZXRJbmRleDogbnVtYmVyLFxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgZnJvbSA9IE1hdGgubWF4KDAsIE1hdGgubWluKGN1cnJlbnRBcnJheS5sZW5ndGggLSAxLCBjdXJyZW50SW5kZXgpKTtcclxuICAgIGNvbnN0IHRvID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGFyZ2V0QXJyYXkubGVuZ3RoLCB0YXJnZXRJbmRleCkpO1xyXG5cclxuICAgIGlmIChjdXJyZW50QXJyYXkubGVuZ3RoKSB7XHJcbiAgICAgIHRhcmdldEFycmF5LnNwbGljZSh0bywgMCwgY3VycmVudEFycmF5LnNwbGljZShmcm9tLCAxKVswXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW9yZGVyRml4dHVyZShmbG9vckRhdGE6IGFueSkge1xyXG4gICAgLy8gV2FsbHNcclxuICAgIGZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZWxlbWVudC5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICBsZXQgd2FsbEFzc29jaWF0ZWRJbmRleCA9IDE7XHJcblxyXG4gICAgICAgIGVsZW1lbnQuZml4dHVyZXMuZm9yRWFjaCgoZml4dHVyZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBmaXh0dXJlLmFzc29jaWF0ZWRFbGVtZW50VHlwZSA9IFwid2FsbFwiO1xyXG4gICAgICAgICAgZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudE51bWJlciA9IGVsZW1lbnQuZWxlbWVudE51bWJlcjtcclxuICAgICAgICAgIGZpeHR1cmUuZml4dHVyZVR5cGUgPSBcIndhbGxcIjtcclxuXHJcbiAgICAgICAgICBpZiAoIWZpeHR1cmUuZ2hvc3QpIHtcclxuICAgICAgICAgICAgLy8gZml4dHVyZS5maXh0dXJlTnVtYmVyID0gZml4dHVyZU51bWJlcisrO1xyXG4gICAgICAgICAgICBmaXh0dXJlLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlciA9IHdhbGxBc3NvY2lhdGVkSW5kZXgrKztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZpeHR1cmUuZml4dHVyZU51bWJlciA9IG51bGw7XHJcbiAgICAgICAgICAgIGZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gQ2VudGVyIGZsb29yIGZpeHR1cmVzXHJcbiAgICBsZXQgZmxvb3JBc3NvY2lhdGVkSW5kZXggPSAxO1xyXG4gICAgZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUuZm9yRWFjaCgoZml4dHVyZTogYW55KSA9PiB7XHJcbiAgICAgIGZpeHR1cmUuZml4dHVyZVR5cGUgPSBcImZsb29yXCI7XHJcblxyXG4gICAgICBpZiAoIWZpeHR1cmUuZ2hvc3QpIHtcclxuICAgICAgICAvLyBmaXh0dXJlLmZpeHR1cmVOdW1iZXIgPSBmaXh0dXJlTnVtYmVyKys7XHJcbiAgICAgICAgZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIgPSBmbG9vckFzc29jaWF0ZWRJbmRleCsrO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpeHR1cmUuZml4dHVyZU51bWJlciA9IG51bGw7XHJcbiAgICAgICAgZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEVsZW1lbnRWYWx1ZShncm91cDogYW55KSB7XHJcbiAgICByZXR1cm4gZ3JvdXAuZ2V0KFwiZWxlbWVudE51bWJlclwiKT8udmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFdhbGxCeU51bWJlcihlbGVtZW50TnVtYmVyOiBudW1iZXIpOiBhbnkgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuZmxvb3JEYXRhPy5sYXlvdXRQb2x5Z29uPy5maW5kKFxyXG4gICAgICAodzogYW55KSA9PiB3LmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiB3LmVsZW1lbnROdW1iZXIgPT09IGVsZW1lbnROdW1iZXIsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcm91bmRUb1R3byhudW06IG51bWJlcikge1xyXG4gICAgcmV0dXJuIE1hdGgucm91bmQobnVtICogMTAwKSAvIDEwMDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFN0b3JlRml4dHVyZXMoc3RvcmVJZDogc3RyaW5nLCBlbmFibGU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodCgpO1xyXG4gICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy5maXh0dXJlVGVtcGxhdGVzLmxlbmd0aCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmdldEZpeHR1cmVUZW1wbGF0ZXMoKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlID0gbnVsbDtcclxuICAgIHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAuZ2V0U3RvcmVGaXh0dXJlcyh7IGlkOiBbc3RvcmVJZF0gfSlcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiBhc3luYyAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICghcmVzPy5kYXRhPy5bMF0/LmZsb29ycz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnBsYW5vRGF0YSA9IHN0cnVjdHVyZWRDbG9uZShyZXMuZGF0YVswXSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5mbG9vckRhdGE/Ll9pZCkge1xyXG4gICAgICAgICAgICB0aGlzLmZsb29yRGF0YSA9IHN0cnVjdHVyZWRDbG9uZShcclxuICAgICAgICAgICAgICByZXMuZGF0YVswXS5mbG9vcnMuZmluZChcclxuICAgICAgICAgICAgICAgIChmbG9vcjogYW55KSA9PiBmbG9vcj8uX2lkID09PSB0aGlzLmZsb29yRGF0YT8uX2lkLFxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZsb29yRGF0YSA9IHN0cnVjdHVyZWRDbG9uZShyZXMuZGF0YVswXS5mbG9vcnNbMF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5mbG9vcnNMaXN0ID0gdGhpcy5wbGFub0RhdGEuZmxvb3JzLm1hcCgoZjogYW55KSA9PiAoe1xyXG4gICAgICAgICAgICBsYWJlbDogZi5mbG9vck51bSxcclxuICAgICAgICAgICAgdmFsdWU6IGYuX2lkLFxyXG4gICAgICAgICAgICAvLyBkaXNhYmxlZDogZi5zdGF0dXMgPT09IFwiY29tcGxldGVkXCIsXHJcbiAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5leHRyYWN0QWxsRml4dHVyZXModGhpcy5mbG9vckRhdGEpO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZsb29ySWQuc2V0VmFsdWUodGhpcy5mbG9vckRhdGEuX2lkLCB7XHJcbiAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0aGlzLmRpc2FibGVFZGl0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKCF0aGlzLml2bUFsaWFzS2V5cy5zaXplIHx8ICF0aGlzLmZpeHR1cmVMaWJyYXJ5QnlXaWR0aC5zaXplKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgICAgICAgICB0aGlzLml2bUFsaWFzS2V5cy5zaXplID8gUHJvbWlzZS5yZXNvbHZlKCkgOiB0aGlzLmZldGNoSXZtQWxpYXMoKSxcclxuICAgICAgICAgICAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5QnlXaWR0aC5zaXplXHJcbiAgICAgICAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZSgpXHJcbiAgICAgICAgICAgICAgICA6IHRoaXMuZmV0Y2hGaXh0dXJlTGlicmFyeUtleXMoKSxcclxuICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlRml4dHVyZXMoKTtcclxuXHJcbiAgICAgICAgICB0aGlzLnJlbmRlckZsb29yKCk7XHJcblxyXG4gICAgICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAoZW5hYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Rm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gZmV0Y2ggcGxhbm9cIik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBleHRyYWN0QWxsRml4dHVyZXMoZmxvb3JEYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGV4dHJhY3RlZEZpeHR1cmUgPSBbXHJcbiAgICAgIC4uLihmbG9vckRhdGE/Lm1hc3RlclRlbXBsYXRlcyA/PyBbXSksXHJcbiAgICAgIC4uLihmbG9vckRhdGE/LmNlbnRlckZpeHR1cmUgPz8gW10pLFxyXG4gICAgXTtcclxuXHJcbiAgICBmbG9vckRhdGE/LmxheW91dFBvbHlnb24/LmZvckVhY2goKGxwOiBhbnkpID0+IHtcclxuICAgICAgZXh0cmFjdGVkRml4dHVyZS5wdXNoKC4uLihscC5maXh0dXJlcyA/PyBbXSkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hbGxGaXh0dXJlcyA9IGV4dHJhY3RlZEZpeHR1cmU7XHJcblxyXG4gICAgLy8gdGhpcy5hbGxGaXh0dXJlSW5zdGFuY2VzID0gW1xyXG4gICAgLy8gICAuLi50aGlzLmZsb29yRGF0YSEubGF5b3V0UG9seWdvbi5mbGF0TWFwKChlOiBhbnkpID0+IGU/LmZpeHR1cmVzID8/IFtdKSxcclxuICAgIC8vICAgLi4uKHRoaXMuZmxvb3JEYXRhPy5jZW50ZXJGaXh0dXJlID8/IFtdKSxcclxuICAgIC8vIF07XHJcbiAgfVxyXG5cclxuICBnZXQgYWxsRml4dHVyZUluc3RhbmNlcygpIHtcclxuICAgIGNvbnN0IGFsbEZpeHR1cmVzID0gW1xyXG4gICAgICAuLi4odGhpcy5mbG9vckRhdGE/LmxheW91dFBvbHlnb24/LmZsYXRNYXAoXHJcbiAgICAgICAgKGU6IGFueSkgPT4gZT8uZml4dHVyZXMgPz8gW10sXHJcbiAgICAgICkgPz8gW10pLFxyXG4gICAgICAuLi4odGhpcy5mbG9vckRhdGE/LmNlbnRlckZpeHR1cmUgPz8gW10pLFxyXG4gICAgXTtcclxuXHJcbiAgICBjb25zdCBzZWVuRml4dHVyZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgIGNvbnN0IHVuaXF1ZUZpeHR1cmVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIGFsbEZpeHR1cmVzLmZvckVhY2goKGZpeHR1cmU6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWZpeHR1cmUpIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IGZpeHR1cmVJZCA9IGZpeHR1cmUuX2lkO1xyXG5cclxuICAgICAgaWYgKCFzZWVuRml4dHVyZXMuaGFzKGZpeHR1cmVJZCkpIHtcclxuICAgICAgICBzZWVuRml4dHVyZXMuYWRkKGZpeHR1cmVJZCk7XHJcbiAgICAgICAgdW5pcXVlRml4dHVyZXMucHVzaChmaXh0dXJlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHVuaXF1ZUZpeHR1cmVzO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmV0Y2hJdm1BbGlhcygpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5hcGlTZXJ2aWNlLmdldEl2bUNvbnZlcnNpb25BbGlhcygpLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAocmVzPy5kYXRhICYmIHR5cGVvZiByZXMuZGF0YSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgIHRoaXMuaXZtQWxpYXNLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhyZXMuZGF0YSkpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgLy8gc2lsZW50bHkgZmFpbCDigJQgdmFsaWRhdGlvbiBza2lwcGVkIGlmIGFsaWFzIHVuYXZhaWxhYmxlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBmZXRjaEZpeHR1cmVMaWJyYXJ5S2V5cygpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5hcGlTZXJ2aWNlLmdldEZpeHR1cmVMaWJOYW1lTGlzdCh0aGlzLmNsaWVudElkLCBcIm5vbi1kcmFmdFwiKSxcclxuICAgICAgKTtcclxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlcz8uZGF0YSkpIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IGdyb3VwZWQgPSBuZXcgTWFwPG51bWJlciwgU2V0PHN0cmluZz4+KCk7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3J5U2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgIGNvbnN0IGJ5Q2F0ZWdvcnkgPSBuZXcgTWFwPHN0cmluZywgU2V0PG51bWJlcj4+KCk7XHJcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByZXMuZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IGl0ZW0/LmZpeHR1cmVOYW1lO1xyXG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiB8fCAhbmFtZS5sZW5ndGgpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAvLyBCYWNrZW5kIGZvcm1hdDogXCI8Y2F0ZWdvcnk+IC0gPHZhbHVlPjx1bml0PlwiIGUuZy4gXCJFdXJvIENlbnRlciAtIDRmdFwiLlxyXG4gICAgICAgIC8vIFNwbGl0IG9uIHRoZSBMQVNUIFwiIC0gXCIgc28gY2F0ZWdvcmllcyBjb250YWluaW5nIGh5cGhlbnMgYXJlIHByZXNlcnZlZC5cclxuICAgICAgICBjb25zdCBzZXBJZHggPSBuYW1lLmxhc3RJbmRleE9mKFwiIC0gXCIpO1xyXG4gICAgICAgIGlmIChzZXBJZHggPCAwKSBjb250aW51ZTtcclxuICAgICAgICBjb25zdCBjYXRlZ29yeVJhdyA9IG5hbWUuc2xpY2UoMCwgc2VwSWR4KTtcclxuICAgICAgICBjb25zdCB3aWR0aFBhcnQgPSBuYW1lLnNsaWNlKHNlcElkeCArIDMpO1xyXG4gICAgICAgIGNvbnN0IHdpZHRoTWF0Y2ggPSB3aWR0aFBhcnQubWF0Y2goL14oXFxkKyg/OlxcLlxcZCspPykvKTtcclxuICAgICAgICBpZiAoIXdpZHRoTWF0Y2gpIGNvbnRpbnVlO1xyXG4gICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VGbG9hdCh3aWR0aE1hdGNoWzFdKTtcclxuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHdpZHRoKSkgY29udGludWU7XHJcblxyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZUZvck1hdGNoKGNhdGVnb3J5UmF3KTtcclxuICAgICAgICBpZiAoIW5vcm1hbGl6ZWQpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBpZiAoIWdyb3VwZWQuaGFzKHdpZHRoKSkgZ3JvdXBlZC5zZXQod2lkdGgsIG5ldyBTZXQ8c3RyaW5nPigpKTtcclxuICAgICAgICBncm91cGVkLmdldCh3aWR0aCkhLmFkZChub3JtYWxpemVkKTtcclxuICAgICAgICBjYXRlZ29yeVNldC5hZGQoY2F0ZWdvcnlSYXcpO1xyXG4gICAgICAgIGlmICghYnlDYXRlZ29yeS5oYXMoY2F0ZWdvcnlSYXcpKSBieUNhdGVnb3J5LnNldChjYXRlZ29yeVJhdywgbmV3IFNldDxudW1iZXI+KCkpO1xyXG4gICAgICAgIGJ5Q2F0ZWdvcnkuZ2V0KGNhdGVnb3J5UmF3KSEuYWRkKHdpZHRoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5QnlXaWR0aCA9IGdyb3VwZWQ7XHJcbiAgICAgIHRoaXMubGlicmFyeUNhdGVnb3JpZXMgPSBBcnJheS5mcm9tKGNhdGVnb3J5U2V0KS5zb3J0KCk7XHJcbiAgICAgIHRoaXMubGlicmFyeUJ5Q2F0ZWdvcnkgPSBieUNhdGVnb3J5O1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIC8vIHNpbGVudGx5IGZhaWwg4oCUIGxpYnJhcnkgdmFsaWRhdGlvbiBza2lwcGVkIGlmIHVuYXZhaWxhYmxlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBOb3JtYWxpemUgYSBjYXRlZ29yeSBzdHJpbmcgZm9yIG1hdGNoaW5nOiBsb3dlcmNhc2UgKyBzdHJpcCBldmVyeXRoaW5nXHJcbiAgLy8gZXhjZXB0IGEtei4gU3BhY2VzLCBwdW5jdHVhdGlvbiwgYW5kIGRpZ2l0cyBhbGwgZHJvcHBlZC4gRGlnaXRzIGluXHJcbiAgLy8gY2F0ZWdvcnkgbmFtZXMgYXJlIG5vaXNlIChDQUQgbW9kZWwgY29kZXMgbGlrZSBcIjEwMTBcIi9cIjEyMDBcIiwgdmVuZG9yXHJcbiAgLy8gc2l6ZSBzdWZmaXhlcykg4oCUIHRoZSByZWFsIHdpZHRoIGNvbWVzIGZyb20gZml4dHVyZVdpZHRoLnZhbHVlLlxyXG4gIHByaXZhdGUgbm9ybWFsaXplRm9yTWF0Y2goc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKHR5cGVvZiBzdHIgIT09IFwic3RyaW5nXCIpIHJldHVybiBcIlwiO1xyXG4gICAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16XS9nLCBcIlwiKTtcclxuICB9XHJcblxyXG4gIC8vIERhbWVyYXUtTGV2ZW5zaHRlaW4gZWRpdCBkaXN0YW5jZTogY291bnRzIGluc2VydGlvbnMsIGRlbGV0aW9ucyxcclxuICAvLyBzdWJzdGl0dXRpb25zLCBhbmQgYWRqYWNlbnQtY2hhciB0cmFuc3Bvc2l0aW9ucyAoYSBzd2FwIGxpa2VcclxuICAvLyBcImh5YmlyZFwiPC0+XCJoeWJyaWRcIiBpcyAxIGVkaXQsIG5vdCAyKS5cclxuICBwcml2YXRlIGRhbWVyYXVMZXZlbnNodGVpbkRpc3RhbmNlKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGlmIChhID09PSBiKSByZXR1cm4gMDtcclxuICAgIGNvbnN0IGFMZW4gPSBhLmxlbmd0aDtcclxuICAgIGNvbnN0IGJMZW4gPSBiLmxlbmd0aDtcclxuICAgIGlmICghYUxlbikgcmV0dXJuIGJMZW47XHJcbiAgICBpZiAoIWJMZW4pIHJldHVybiBhTGVuO1xyXG5cclxuICAgIGNvbnN0IG1hdHJpeDogbnVtYmVyW11bXSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGFMZW4gKyAxIH0sICgpID0+XHJcbiAgICAgIG5ldyBBcnJheShiTGVuICsgMSkuZmlsbCgwKSxcclxuICAgICk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBhTGVuOyBpKyspIG1hdHJpeFtpXVswXSA9IGk7XHJcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8PSBiTGVuOyBqKyspIG1hdHJpeFswXVtqXSA9IGo7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gYUxlbjsgaSsrKSB7XHJcbiAgICAgIGZvciAobGV0IGogPSAxOyBqIDw9IGJMZW47IGorKykge1xyXG4gICAgICAgIGNvbnN0IGNvc3QgPSBhW2kgLSAxXSA9PT0gYltqIC0gMV0gPyAwIDogMTtcclxuICAgICAgICBtYXRyaXhbaV1bal0gPSBNYXRoLm1pbihcclxuICAgICAgICAgIG1hdHJpeFtpIC0gMV1bal0gKyAxLFxyXG4gICAgICAgICAgbWF0cml4W2ldW2ogLSAxXSArIDEsXHJcbiAgICAgICAgICBtYXRyaXhbaSAtIDFdW2ogLSAxXSArIGNvc3QsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBpID4gMSAmJlxyXG4gICAgICAgICAgaiA+IDEgJiZcclxuICAgICAgICAgIGFbaSAtIDFdID09PSBiW2ogLSAyXSAmJlxyXG4gICAgICAgICAgYVtpIC0gMl0gPT09IGJbaiAtIDFdXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBtYXRyaXhbaV1bal0gPSBNYXRoLm1pbihtYXRyaXhbaV1bal0sIG1hdHJpeFtpIC0gMl1baiAtIDJdICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWF0cml4W2FMZW5dW2JMZW5dO1xyXG4gIH1cclxuXHJcbiAgLy8gU2ltaWxhcml0eSByYXRpbyBpbiBbMCwgMV0gYWZ0ZXIgbm9ybWFsaXphdGlvbi4gMS4wID0gaWRlbnRpY2FsLlxyXG4gIHByaXZhdGUgc2ltaWxhcml0eVJhdGlvKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IG5vcm1BID0gdGhpcy5ub3JtYWxpemVGb3JNYXRjaChhKTtcclxuICAgIGNvbnN0IG5vcm1CID0gdGhpcy5ub3JtYWxpemVGb3JNYXRjaChiKTtcclxuICAgIGlmICghbm9ybUEgfHwgIW5vcm1CKSByZXR1cm4gMDtcclxuICAgIGlmIChub3JtQSA9PT0gbm9ybUIpIHJldHVybiAxO1xyXG4gICAgY29uc3QgZGlzdGFuY2UgPSB0aGlzLmRhbWVyYXVMZXZlbnNodGVpbkRpc3RhbmNlKG5vcm1BLCBub3JtQik7XHJcbiAgICBjb25zdCBtYXhMZW4gPSBNYXRoLm1heChub3JtQS5sZW5ndGgsIG5vcm1CLmxlbmd0aCk7XHJcbiAgICByZXR1cm4gMSAtIGRpc3RhbmNlIC8gbWF4TGVuO1xyXG4gIH1cclxuXHJcbiAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmaXh0dXJlJ3MgKGNhdGVnb3J5LCB3aWR0aCkgaGFzIGEgbGlicmFyeSBtYXRjaC5cclxuICAvLyBXaWR0aCBtdXN0IGVxdWFsIGV4YWN0bHk7IGNhdGVnb3J5IHBhc3NlcyBpZiBpdCdzIGFuIGV4YWN0IG5vcm1hbGl6ZWRcclxuICAvLyBtYXRjaCBPUiBhIGZ1enp5IG1hdGNoID49IDgwJSBhZ2FpbnN0IGFueSBsaWJyYXJ5IGNhdGVnb3J5IGF0IHRoYXQgd2lkdGguXHJcbiAgcHJpdmF0ZSBpc0xpYnJhcnlNYXRjaChmaXh0dXJlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHdpZHRoID0gZml4dHVyZT8uZml4dHVyZVdpZHRoPy52YWx1ZTtcclxuICAgIGlmICh3aWR0aCA9PSBudWxsKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gdGhpcy5maXh0dXJlTGlicmFyeUJ5V2lkdGguZ2V0KHdpZHRoKTtcclxuICAgIGlmICghY2FuZGlkYXRlcyB8fCBjYW5kaWRhdGVzLnNpemUgPT09IDApIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBmaXh0dXJlQ2F0ID0gdGhpcy5ub3JtYWxpemVGb3JNYXRjaChmaXh0dXJlPy5maXh0dXJlQ2F0ZWdvcnkgPz8gXCJcIik7XHJcbiAgICBpZiAoIWZpeHR1cmVDYXQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoY2FuZGlkYXRlcy5oYXMoZml4dHVyZUNhdCkpIHJldHVybiB0cnVlO1xyXG5cclxuICAgIGZvciAoY29uc3QgbGliQ2F0IG9mIGNhbmRpZGF0ZXMpIHtcclxuICAgICAgaWYgKHRoaXMuc2ltaWxhcml0eVJhdGlvKGZpeHR1cmVDYXQsIGxpYkNhdCkgPj0gMC44KSByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlRml4dHVyZXMoKSB7XHJcbiAgICBjb25zdCBoYXNJdm0gPSB0aGlzLml2bUFsaWFzS2V5cy5zaXplID4gMDtcclxuICAgIGNvbnN0IGhhc0xpYiA9IHRoaXMuZml4dHVyZUxpYnJhcnlCeVdpZHRoLnNpemUgPiAwO1xyXG4gICAgaWYgKCFoYXNJdm0gJiYgIWhhc0xpYikgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuYWxsRml4dHVyZUluc3RhbmNlcy5mb3JFYWNoKChmaXh0dXJlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGZpeHR1cmUuZml4dHVyZU5hbWUgPT09IFwic3BhY2VcIikgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKGhhc0l2bSkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckxhYmVsOiBzdHJpbmcgPSBmaXh0dXJlPy5oZWFkZXI/LmxhYmVsID8/IFwiXCI7XHJcbiAgICAgICAgZml4dHVyZS5oZWFkZXJJbnZhbGlkID1cclxuICAgICAgICAgICFoZWFkZXJMYWJlbCB8fCAhdGhpcy5pdm1BbGlhc0tleXMuaGFzKGhlYWRlckxhYmVsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGhhc0xpYikge1xyXG4gICAgICAgIGZpeHR1cmUubGlicmFyeUludmFsaWQgPSAhdGhpcy5pc0xpYnJhcnlNYXRjaChmaXh0dXJlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgaGFzSW52YWxpZEhlYWRlckZpeHR1cmVzKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLml2bUFsaWFzS2V5cy5zaXplKSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy5hbGxGaXh0dXJlSW5zdGFuY2VzLnNvbWUoXHJcbiAgICAgIChmOiBhbnkpID0+IGYuZml4dHVyZU5hbWUgIT09IFwic3BhY2VcIiAmJiBmLmhlYWRlckludmFsaWQsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGludmFsaWRIZWFkZXJGaXh0dXJlQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmFsbEZpeHR1cmVJbnN0YW5jZXMuZmlsdGVyKFxyXG4gICAgICAoZjogYW55KSA9PiBmLmZpeHR1cmVOYW1lICE9PSBcInNwYWNlXCIgJiYgZi5oZWFkZXJJbnZhbGlkLFxyXG4gICAgKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXQgaGFzSW52YWxpZExpYnJhcnlGaXh0dXJlcygpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5maXh0dXJlTGlicmFyeUJ5V2lkdGguc2l6ZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHRoaXMuYWxsRml4dHVyZUluc3RhbmNlcy5zb21lKFxyXG4gICAgICAoZjogYW55KSA9PiBmLmZpeHR1cmVOYW1lICE9PSBcInNwYWNlXCIgJiYgZi5saWJyYXJ5SW52YWxpZCxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXQgaW52YWxpZExpYnJhcnlGaXh0dXJlQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmFsbEZpeHR1cmVJbnN0YW5jZXMuZmlsdGVyKFxyXG4gICAgICAoZjogYW55KSA9PiBmLmZpeHR1cmVOYW1lICE9PSBcInNwYWNlXCIgJiYgZi5saWJyYXJ5SW52YWxpZCxcclxuICAgICkubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0ludmFsaWRGaXh0dXJlcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmhhc0ludmFsaWRIZWFkZXJGaXh0dXJlcyB8fCB0aGlzLmhhc0ludmFsaWRMaWJyYXJ5Rml4dHVyZXM7XHJcbiAgfVxyXG5cclxuICBnZXQgaW52YWxpZEZpeHR1cmVzVG9vbHRpcCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmhhc0ludmFsaWRGaXh0dXJlcykgcmV0dXJuIFwiXCI7XHJcblxyXG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBoZWFkZXJDb3VudCA9IHRoaXMuaW52YWxpZEhlYWRlckZpeHR1cmVDb3VudDtcclxuICAgIGNvbnN0IGxpYkNvdW50ID0gdGhpcy5pbnZhbGlkTGlicmFyeUZpeHR1cmVDb3VudDtcclxuXHJcbiAgICBpZiAoaGVhZGVyQ291bnQgPiAwKSB7XHJcbiAgICAgIHBhcnRzLnB1c2goXHJcbiAgICAgICAgYCR7aGVhZGVyQ291bnR9IGZpeHR1cmUke2hlYWRlckNvdW50ID09PSAxID8gXCJcIiA6IFwic1wifSBgICtcclxuICAgICAgICAgIGAke2hlYWRlckNvdW50ID09PSAxID8gXCJoYXNcIiA6IFwiaGF2ZVwifSB1bnJlY29nbml6ZWQgaGVhZGVycy5gLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKGxpYkNvdW50ID4gMCkge1xyXG4gICAgICBwYXJ0cy5wdXNoKFxyXG4gICAgICAgIGAke2xpYkNvdW50fSBmaXh0dXJlJHtsaWJDb3VudCA9PT0gMSA/IFwiXCIgOiBcInNcIn0gYCArXHJcbiAgICAgICAgICBgJHtsaWJDb3VudCA9PT0gMSA/IFwiZG9lc1wiIDogXCJkb1wifSBub3QgbWF0Y2ggYW55IGxpYnJhcnkgZW50cnkuYCxcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHBhcnRzLnB1c2goXCJGaXggdGhlbSB0byBydW4gYWxsb2NhdGlvblwiKTtcclxuICAgIHJldHVybiBwYXJ0cy5qb2luKFwiIFwiKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0VkaXRMYXlvdXRBbGxvd2VkKCkge1xyXG4gICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlZCAmJiAhdGhpcy5pc0FsbG9jYXRpb25SdW4pIHtcclxuICAgICAgaWYgKHRoaXMuZ2V0U3RhdHVzID09PSBcImRyYWZ0XCIpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuZ2V0U3RhdHVzID09PSBcImFsbG9jYXRpb25QZW5kaW5nXCIgJiZcclxuICAgICAgICB0aGlzLmlzUnVuQWxsb2NhdGlvbkFsbG93ZWRcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHJlbmRlckZsb29yKHVwZGF0ZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgIHRoaXMuZHJhd0luaXRpYWxDb250ZW50KCk7XHJcbiAgICBpZiAodXBkYXRlKSB7XHJcbiAgICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG5cclxuICAgICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5mb3JFYWNoKCh3YWxsOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAod2FsbC5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICAgIGNvbnN0IHdhbGxJdGVtID0gdGhpcy5wYXRjaFdhbGxFbGVtZW50cyh7XHJcbiAgICAgICAgICAgIGVsZW1lbnRUeXBlOiB3YWxsLmVsZW1lbnRUeXBlLFxyXG4gICAgICAgICAgICBlbGVtZW50TnVtYmVyOiB3YWxsLmVsZW1lbnROdW1iZXIsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB3YWxsLmZpeHR1cmVzLmZvckVhY2goKGZpeHR1cmU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZml4dHVyZT8uZml4dHVyZU5hbWUgPT09IFwic3BhY2VcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlR3JvdXAgPSB0aGlzLnBhdGNoRml4dHVyZSh7XHJcbiAgICAgICAgICAgICAgZml4dHVyZU5hbWU6IGZpeHR1cmUuZml4dHVyZU5hbWUsXHJcbiAgICAgICAgICAgICAgZml4dHVyZUNvbmZpZ0lkOiBmaXh0dXJlLmZpeHR1cmVDb25maWdJZCxcclxuICAgICAgICAgICAgICBfaWQ6IGZpeHR1cmUuX2lkLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgKHdhbGxJdGVtLmdldChcImZpeHR1cmVzXCIpIGFzIEZvcm1BcnJheSkucHVzaChmaXh0dXJlR3JvdXApO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgd2FsbC5vdGhlckVsZW1lbnRzPy5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICAgIHR5cGU6IFtcclxuICAgICAgICAgICAgICAgIHRoaXMub3RoZXJFbGVtZW50TGlzdC5zb21lKChvKSA9PiBvLnZhbHVlID09PSBlbGUuZml4dHVyZU5hbWUpXHJcbiAgICAgICAgICAgICAgICAgID8gZWxlLmZpeHR1cmVOYW1lXHJcbiAgICAgICAgICAgICAgICAgIDogXCJPdGhlcnNcIixcclxuICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgIGN1c3RvbU5hbWU6IFtcclxuICAgICAgICAgICAgICAgIHRoaXMub3RoZXJFbGVtZW50TGlzdC5zb21lKChvKSA9PiBvLnZhbHVlID09PSBlbGUuZml4dHVyZU5hbWUpXHJcbiAgICAgICAgICAgICAgICAgID8gXCJcIlxyXG4gICAgICAgICAgICAgICAgICA6IGVsZS5maXh0dXJlTmFtZSxcclxuICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgKHdhbGxJdGVtLmdldChcIm90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5KS5wdXNoKGVsZUdyb3VwKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuZ2V0Rm9ybVdhbGxzLnB1c2god2FsbEl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5mbG9vckRhdGE/LmNlbnRlckZpeHR1cmU/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuZmxvb3JEYXRhPy5jZW50ZXJGaXh0dXJlLmZvckVhY2goKGZpeHR1cmU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZml4dHVyZUdyb3VwID0gdGhpcy5wYXRjaEZpeHR1cmUoe1xyXG4gICAgICAgICAgICBmaXh0dXJlTmFtZTogZml4dHVyZS5maXh0dXJlTmFtZSxcclxuICAgICAgICAgICAgZml4dHVyZUNvbmZpZ0lkOiBmaXh0dXJlLmZpeHR1cmVDb25maWdJZCxcclxuICAgICAgICAgICAgX2lkOiBmaXh0dXJlLl9pZCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vckZpeHR1cmVzXCIpIGFzIEZvcm1BcnJheSkucHVzaChcclxuICAgICAgICAgICAgZml4dHVyZUdyb3VwLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuZmxvb3JEYXRhPy5vdGhlckVsZW1lbnRzPy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmZsb29yRGF0YT8ub3RoZXJFbGVtZW50cz8uZm9yRWFjaCgoZWxlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGVsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIHR5cGU6IFtcclxuICAgICAgICAgICAgICB0aGlzLm90aGVyRWxlbWVudExpc3Quc29tZSgobykgPT4gby52YWx1ZSA9PT0gZWxlLmZpeHR1cmVOYW1lKVxyXG4gICAgICAgICAgICAgICAgPyBlbGUuZml4dHVyZU5hbWVcclxuICAgICAgICAgICAgICAgIDogXCJPdGhlcnNcIixcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgY3VzdG9tTmFtZTogW1xyXG4gICAgICAgICAgICAgIHRoaXMub3RoZXJFbGVtZW50TGlzdC5zb21lKChvKSA9PiBvLnZhbHVlID09PSBlbGUuZml4dHVyZU5hbWUpXHJcbiAgICAgICAgICAgICAgICA/IFwiXCJcclxuICAgICAgICAgICAgICAgIDogZWxlLmZpeHR1cmVOYW1lLFxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vck90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5KS5wdXNoKFxyXG4gICAgICAgICAgICBlbGVHcm91cCxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN1YnNjcmliZVRvRml4dHVyZUNvbmZpZ0lkQ2hhbmdlcygpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVUb090aGVyRWxlbWVudHNDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBkcmF3SW5pdGlhbENvbnRlbnQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmNhbnZhcy5jbGVhcigpO1xyXG4gICAgdGhpcy5yZW9yZGVyRml4dHVyZSh0aGlzLmZsb29yRGF0YSk7XHJcbiAgICBhd2FpdCB0aGlzLmRyYXdMYXlvdXRFbGVtZW50cygpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlc2l6ZUNhbnZhcygpO1xyXG4gICAgICB0aGlzLmZpdENhbnZhc1RvTGF5b3V0QW5pbWF0ZWQoKTtcclxuICAgIH0sIDMwMCk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVBbGxQb3NpdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RnVsbExheW91dEJvdW5kcygpIHtcclxuICAgIGNvbnN0IG9iamVjdHMgPSB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCk7XHJcbiAgICBpZiAoIW9iamVjdHMubGVuZ3RoKSByZXR1cm4geyBsZWZ0OiAwLCB0b3A6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcclxuXHJcbiAgICBsZXQgbWluWCA9IEluZmluaXR5LFxyXG4gICAgICBtaW5ZID0gSW5maW5pdHksXHJcbiAgICAgIG1heFggPSAtSW5maW5pdHksXHJcbiAgICAgIG1heFkgPSAtSW5maW5pdHk7XHJcblxyXG4gICAgZm9yIChjb25zdCBvYmogb2Ygb2JqZWN0cykge1xyXG4gICAgICBjb25zdCByZWN0ID0gb2JqLmdldEJvdW5kaW5nUmVjdCgpO1xyXG4gICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgcmVjdC5sZWZ0KTtcclxuICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIHJlY3QudG9wKTtcclxuICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHJlY3QubGVmdCArIHJlY3Qud2lkdGgpO1xyXG4gICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgcmVjdC50b3AgKyByZWN0LmhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGVmdDogbWluWCxcclxuICAgICAgdG9wOiBtaW5ZLFxyXG4gICAgICB3aWR0aDogbWF4WCAtIG1pblgsXHJcbiAgICAgIGhlaWdodDogbWF4WSAtIG1pblksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaXRDYW52YXNUb0xheW91dEFuaW1hdGVkKGR1cmF0aW9uID0gNDAwKSB7XHJcbiAgICBpZiAoIXRoaXMuY2FudmFzKSByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5lbmFibGVkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5nZXRGdWxsTGF5b3V0Qm91bmRzKCk7XHJcbiAgICBpZiAoIWJvdW5kcy53aWR0aCB8fCAhYm91bmRzLmhlaWdodCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGNhbnZhc1cgPSB0aGlzLmNhbnZhcy5nZXRXaWR0aCgpO1xyXG4gICAgY29uc3QgY2FudmFzSCA9IHRoaXMuY2FudmFzLmdldEhlaWdodCgpO1xyXG5cclxuICAgIC8vIEZpbmFsIHpvb20gdG8gZml0ICh3aXRoIHBhZGRpbmcpXHJcbiAgICBjb25zdCBzY2FsZVggPSBjYW52YXNXIC8gYm91bmRzLndpZHRoO1xyXG4gICAgY29uc3Qgc2NhbGVZID0gY2FudmFzSCAvIGJvdW5kcy5oZWlnaHQ7XHJcbiAgICBjb25zdCB0YXJnZXRab29tID0gTWF0aC5taW4oc2NhbGVYLCBzY2FsZVkpICogMC45OyAvLyBwYWRkaW5nIDEwJVxyXG5cclxuICAgIC8vIERlc2lyZWQgdmlld3BvcnQgb2Zmc2V0IHRvIGNlbnRlciBsYXlvdXRcclxuICAgIGNvbnN0IHRhcmdldFZwdCA9IFtcclxuICAgICAgLi4uKHRoaXMuY2FudmFzLnZpZXdwb3J0VHJhbnNmb3JtIHx8IFsxLCAwLCAwLCAxLCAwLCAwXSksXHJcbiAgICBdIGFzIGZhYnJpYy5UTWF0MkQ7XHJcblxyXG4gICAgdGFyZ2V0VnB0WzBdID0gdGFyZ2V0Wm9vbTsgLy8gc2NhbGVYXHJcbiAgICB0YXJnZXRWcHRbM10gPSB0YXJnZXRab29tOyAvLyBzY2FsZVlcclxuXHJcbiAgICBjb25zdCBleHRyYVRvcFBhZGRpbmdQeCA9IDI0O1xyXG4gICAgdGFyZ2V0VnB0WzRdID0gY2FudmFzVyAvIDIgLSAoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLyAyKSAqIHRhcmdldFpvb207IC8vIGNlbnRlciBYXHJcbiAgICB0YXJnZXRWcHRbNV0gPVxyXG4gICAgICBjYW52YXNIIC8gMiAtXHJcbiAgICAgIChib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCAvIDIpICogdGFyZ2V0Wm9vbSArXHJcbiAgICAgIGV4dHJhVG9wUGFkZGluZ1B4OyAvLyBjZW50ZXIgWSArIGV4dHJhIHRvcCBwYWRkaW5nXHJcblxyXG4gICAgLy8gQ3VycmVudCB2aWV3cG9ydCAoc3RhcnRpbmcgcG9pbnQgb2YgYW5pbWF0aW9uKVxyXG4gICAgY29uc3Qgc3RhcnRWcHQgPSBbLi4udGhpcy5jYW52YXMudmlld3BvcnRUcmFuc2Zvcm0hXSBhcyBmYWJyaWMuVE1hdDJEO1xyXG5cclxuICAgIGZhYnJpYy51dGlsLmFuaW1hdGUoe1xyXG4gICAgICBzdGFydFZhbHVlOiAwLFxyXG4gICAgICBlbmRWYWx1ZTogMSxcclxuICAgICAgZHVyYXRpb24sXHJcbiAgICAgIGVhc2luZzogZmFicmljLnV0aWwuZWFzZS5lYXNlT3V0Q3ViaWMsXHJcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZwdCA9IHRoaXMuY2FudmFzLnZpZXdwb3J0VHJhbnNmb3JtITtcclxuXHJcbiAgICAgICAgLy8gSW50ZXJwb2xhdGUgbWF0cml4IHZhbHVlc1xyXG4gICAgICAgIHZwdFswXSA9IHN0YXJ0VnB0WzBdICsgKHRhcmdldFZwdFswXSAtIHN0YXJ0VnB0WzBdKSAqIHZhbHVlO1xyXG4gICAgICAgIHZwdFszXSA9IHN0YXJ0VnB0WzNdICsgKHRhcmdldFZwdFszXSAtIHN0YXJ0VnB0WzNdKSAqIHZhbHVlO1xyXG4gICAgICAgIHZwdFs0XSA9IHN0YXJ0VnB0WzRdICsgKHRhcmdldFZwdFs0XSAtIHN0YXJ0VnB0WzRdKSAqIHZhbHVlO1xyXG4gICAgICAgIHZwdFs1XSA9IHN0YXJ0VnB0WzVdICsgKHRhcmdldFZwdFs1XSAtIHN0YXJ0VnB0WzVdKSAqIHZhbHVlO1xyXG5cclxuICAgICAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRyYXdMYXlvdXRFbGVtZW50cygpIHtcclxuICAgIGNvbnN0IGZsb29yID0gdGhpcy5mbG9vckRhdGE7XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZmxvb3IubGF5b3V0UG9seWdvbi5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IGZsb29yLmxheW91dFBvbHlnb25baW5kZXhdO1xyXG5cclxuICAgICAgZWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uID8/PSB7XHJcbiAgICAgICAgeDogMCxcclxuICAgICAgICB5OiAwLFxyXG4gICAgICAgIHVuaXQ6IFwiZnRcIixcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHggPSB0aGlzLnRvUGl4ZWxzKGVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi54LCBlbGVtZW50LnVuaXQpO1xyXG4gICAgICBjb25zdCB5ID0gdGhpcy50b1BpeGVscyhlbGVtZW50LnJlbGF0aXZlUG9zaXRpb24ueSwgZWxlbWVudC51bml0KTtcclxuXHJcbiAgICAgIGlmIChlbGVtZW50LmVsZW1lbnRUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMud2FsbFRoaWNrbmVzcztcclxuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLnRvUGl4ZWxzKGVsZW1lbnQuZGlzdGFuY2UsIGVsZW1lbnQudW5pdCk7XHJcbiAgICAgICAgaWYgKHdpZHRoIDwgaGVpZ2h0KSB3aWR0aCA9IHRoaXMud2FsbFRoaWNrbmVzcyArIDE7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5kcmF3V2FsbCh0aGlzLmNhbnZhcywgeCwgeSwgaGVpZ2h0LCB3aWR0aCwgZWxlbWVudCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5lbGVtZW50VHlwZSA9PT0gXCJlbnRyYW5jZVwiKSB7XHJcbiAgICAgICAgY29uc3QgYXJyb3dXaWR0aCA9IDgwO1xyXG4gICAgICAgIGNvbnN0IGFycm93SGVpZ2h0ID0gNzU7XHJcbiAgICAgICAgY29uc3QgYXJyb3dCYXNlID0gNDA7XHJcbiAgICAgICAgdGhpcy5kcmF3RW50cmFuY2UoXHJcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcclxuICAgICAgICAgIHgsXHJcbiAgICAgICAgICB5LFxyXG4gICAgICAgICAgYXJyb3dXaWR0aCxcclxuICAgICAgICAgIGFycm93SGVpZ2h0LFxyXG4gICAgICAgICAgYXJyb3dCYXNlLFxyXG4gICAgICAgICAgZWxlbWVudCxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRm9yIGNhZCBsYXlvdXRzIG9ubHkuXHJcbiAgICB0aGlzLmxheW91dEJvdW5kcyA9IHRoaXMuZ2V0RnVsbExheW91dEJvdW5kcygpO1xyXG5cclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBmbG9vci5sYXlvdXRQb2x5Z29uLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBlbGVtZW50ID0gZmxvb3IubGF5b3V0UG9seWdvbltpbmRleF07XHJcbiAgICAgIGlmIChlbGVtZW50LmVsZW1lbnRUeXBlICE9PSBcIndhbGxcIikgY29udGludWU7XHJcblxyXG4gICAgICBjb25zdCBmaXh0dXJlR3JvdXBzOiBmYWJyaWMuR3JvdXBbXSA9IFtdO1xyXG5cclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50Py5maXh0dXJlcz8ubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBjb25zdCBmaXh0dXJlID0gZWxlbWVudC5maXh0dXJlc1tqXTtcclxuXHJcbiAgICAgICAgY29uc3QgZml4dHVyZUhlaWdodCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgICBmaXh0dXJlLmZpeHR1cmVTdGF0aWNMZW5ndGgudmFsdWUsXHJcbiAgICAgICAgICBmaXh0dXJlLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IGZpeHR1cmVXaWR0aCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgICBmaXh0dXJlLmZpeHR1cmVTdGF0aWNXaWR0aC52YWx1ZSxcclxuICAgICAgICAgIGZpeHR1cmUuZml4dHVyZVN0YXRpY1dpZHRoLnVuaXQsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IHggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLngsXHJcbiAgICAgICAgICBmaXh0dXJlLnJlbGF0aXZlUG9zaXRpb24udW5pdCxcclxuICAgICAgICApO1xyXG4gICAgICAgIGxldCB5ID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgIGZpeHR1cmUucmVsYXRpdmVQb3NpdGlvbi55LFxyXG4gICAgICAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLnVuaXQsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gb3ZlcnJpZGUgdGhlIGZpeHR1cmUgcG9zaXRpb24gZm9yIGluaXRpYWwgY2FkIGxheW91dHMuXHJcbiAgICAgICAgLy8gaWYgKHRoaXMuZmxvb3JEYXRhPy5jYWRMYXlvdXQpIHtcclxuICAgICAgICAvLyAgIGNvbnN0IGJhc2VYID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICAvLyAgICAgZWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLngsXHJcbiAgICAgICAgLy8gICAgIGVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi51bml0LFxyXG4gICAgICAgIC8vICAgKTtcclxuXHJcbiAgICAgICAgLy8gICBjb25zdCBiYXNlWSA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgLy8gICAgIGVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi55LFxyXG4gICAgICAgIC8vICAgICBlbGVtZW50LnJlbGF0aXZlUG9zaXRpb24udW5pdCxcclxuICAgICAgICAvLyAgICk7XHJcbiAgICAgICAgLy8gICBjb25zdCBzdGFydEJ1ZmZlciA9IDQwO1xyXG4gICAgICAgIC8vICAgY29uc3Qgc3BhY2luZyA9IDEzNjtcclxuICAgICAgICAvLyAgIGNvbnN0IG9mZnNldCA9IHN0YXJ0QnVmZmVyICsgc3BhY2luZyAqIGo7XHJcblxyXG4gICAgICAgIC8vICAgY29uc3QgYW5nbGVSYWQgPSBmYWJyaWMudXRpbC5kZWdyZWVzVG9SYWRpYW5zKGVsZW1lbnQuYW5nbGUpO1xyXG5cclxuICAgICAgICAvLyAgIGNvbnN0IGRpclggPSBNYXRoLmNvcyhhbmdsZVJhZCk7XHJcbiAgICAgICAgLy8gICBjb25zdCBkaXJZID0gTWF0aC5zaW4oYW5nbGVSYWQpO1xyXG5cclxuICAgICAgICAvLyAgIGNvbnN0IG5vcm1hbE9mZnNldCA9IHRoaXMud2FsbFRoaWNrbmVzcztcclxuXHJcbiAgICAgICAgLy8gICBjb25zdCBub3JtWCA9IE1hdGguY29zKGFuZ2xlUmFkICsgTWF0aC5QSSAvIDIpICogbm9ybWFsT2Zmc2V0O1xyXG4gICAgICAgIC8vICAgY29uc3Qgbm9ybVkgPSBNYXRoLnNpbihhbmdsZVJhZCArIE1hdGguUEkgLyAyKSAqIG5vcm1hbE9mZnNldDtcclxuXHJcbiAgICAgICAgLy8gICB4ID0gYmFzZVggKyBkaXJYICogb2Zmc2V0ICsgbm9ybVg7XHJcbiAgICAgICAgLy8gICB5ID0gYmFzZVkgKyBkaXJZICogb2Zmc2V0ICsgbm9ybVk7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBjb25zdCBmaXh0dXJlT2JqID0gYXdhaXQgdGhpcy5kcmF3Rml4dHVyZShcclxuICAgICAgICAgIHRoaXMuY2FudmFzLFxyXG4gICAgICAgICAgeCxcclxuICAgICAgICAgIHksXHJcbiAgICAgICAgICBmaXh0dXJlSGVpZ2h0LFxyXG4gICAgICAgICAgZml4dHVyZVdpZHRoLFxyXG4gICAgICAgICAgZml4dHVyZSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGZpeHR1cmVHcm91cHMucHVzaChmaXh0dXJlT2JqIGFzIGZhYnJpYy5Hcm91cCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWxlbWVudD8ub3RoZXJFbGVtZW50cz8ubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBjb25zdCBvdGhlckVsZW1lbnQgPSBlbGVtZW50Lm90aGVyRWxlbWVudHNbal07XHJcbiAgICAgICAgY29uc3QgeCA9IHRoaXMudG9QaXhlbHMob3RoZXJFbGVtZW50LnJlbGF0aXZlUG9zaXRpb24ueCwgXCJmdFwiKTtcclxuICAgICAgICBjb25zdCB5ID0gdGhpcy50b1BpeGVscyhvdGhlckVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi55LCBcImZ0XCIpO1xyXG4gICAgICAgIGNvbnN0IGEgPSBvdGhlckVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi5hbmdsZTtcclxuICAgICAgICBjb25zdCBoID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgIG90aGVyRWxlbWVudC5maXh0dXJlU3RhdGljTGVuZ3RoLnZhbHVlLFxyXG4gICAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IHcgPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNXaWR0aC52YWx1ZSxcclxuICAgICAgICAgIG90aGVyRWxlbWVudC5maXh0dXJlU3RhdGljV2lkdGgudW5pdCxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLmRyYXdPdGhlckVsZW1lbnRzV2l0aExhYmVsKFxyXG4gICAgICAgICAgdGhpcy5jYW52YXMsXHJcbiAgICAgICAgICB4LFxyXG4gICAgICAgICAgeSxcclxuICAgICAgICAgIGEsXHJcbiAgICAgICAgICB3LFxyXG4gICAgICAgICAgaCxcclxuICAgICAgICAgIG90aGVyRWxlbWVudCxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLy9JZiBDQUQgbGF5b3V0XHJcbiAgICAvLyBpZiAodGhpcy5mbG9vckRhdGE/LmNhZExheW91dCAmJiB0aGlzLmZsb29yRGF0YT8uY2VudGVyRml4dHVyZT8ubGVuZ3RoKSB7XHJcbiAgICAvLyAgIGNvbnN0IGZpeHR1cmVzID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZTtcclxuXHJcbiAgICAvLyAgIGNvbnN0IGxheW91dFBvbHlnb24gPSB0aGlzLmJ1aWxkTGF5b3V0UG9seWdvbkZyb21XYWxscygpO1xyXG4gICAgLy8gICBjb25zdCBvY2N1cGllZFJlY3RzID0gdGhpcy5nZXRPY2N1cGllZFJlY3RzKCk7XHJcblxyXG4gICAgLy8gICBjb25zdCBmaXh0dXJlV2lkdGhQeCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAvLyAgICAgZml4dHVyZXNbMF0uZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlLFxyXG4gICAgLy8gICAgIGZpeHR1cmVzWzBdLmZpeHR1cmVTdGF0aWNXaWR0aC51bml0LFxyXG4gICAgLy8gICApO1xyXG5cclxuICAgIC8vICAgY29uc3QgZml4dHVyZUhlaWdodFB4ID0gdGhpcy50b1BpeGVscyhcclxuICAgIC8vICAgICBmaXh0dXJlc1swXS5maXh0dXJlU3RhdGljTGVuZ3RoLnZhbHVlLFxyXG4gICAgLy8gICAgIGZpeHR1cmVzWzBdLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgIC8vICAgKTtcclxuXHJcbiAgICAvLyAgIGNvbnN0IHRvdGFsID0gZml4dHVyZXMubGVuZ3RoO1xyXG5cclxuICAgIC8vICAgY29uc3QgbWF4Um93cyA9IDI7XHJcbiAgICAvLyAgIGNvbnN0IHJvd3MgPSBNYXRoLm1pbihtYXhSb3dzLCB0b3RhbCk7XHJcbiAgICAvLyAgIGNvbnN0IGNvbHVtbnMgPSBNYXRoLmNlaWwodG90YWwgLyByb3dzKTtcclxuXHJcbiAgICAvLyAgIGNvbnN0IGdyaWRXaWR0aCA9IGNvbHVtbnMgKiBmaXh0dXJlV2lkdGhQeDtcclxuICAgIC8vICAgY29uc3QgZ3JpZEhlaWdodCA9IHJvd3MgKiBmaXh0dXJlSGVpZ2h0UHg7XHJcblxyXG4gICAgLy8gICBjb25zdCBib3VuZHMgPSB0aGlzLmdldEZ1bGxMYXlvdXRCb3VuZHMoKTtcclxuICAgIC8vICAgY29uc3QgY2VudGVyWCA9IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC8gMjtcclxuICAgIC8vICAgY29uc3QgY2VudGVyWSA9IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC8gMjtcclxuXHJcbiAgICAvLyAgIGNvbnN0IGlzSW5zaWRlUG9seWdvbiA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4ge1xyXG4gICAgLy8gICAgIHJldHVybiAoXHJcbiAgICAvLyAgICAgICB0aGlzLmlzUG9pbnRJbnNpZGVQb2x5Z29uKHsgeCwgeSB9LCBsYXlvdXRQb2x5Z29uKSAmJlxyXG4gICAgLy8gICAgICAgdGhpcy5pc1BvaW50SW5zaWRlUG9seWdvbih7IHg6IHggKyBncmlkV2lkdGgsIHkgfSwgbGF5b3V0UG9seWdvbikgJiZcclxuICAgIC8vICAgICAgIHRoaXMuaXNQb2ludEluc2lkZVBvbHlnb24oeyB4LCB5OiB5ICsgZ3JpZEhlaWdodCB9LCBsYXlvdXRQb2x5Z29uKSAmJlxyXG4gICAgLy8gICAgICAgdGhpcy5pc1BvaW50SW5zaWRlUG9seWdvbihcclxuICAgIC8vICAgICAgICAgeyB4OiB4ICsgZ3JpZFdpZHRoLCB5OiB5ICsgZ3JpZEhlaWdodCB9LFxyXG4gICAgLy8gICAgICAgICBsYXlvdXRQb2x5Z29uLFxyXG4gICAgLy8gICAgICAgKVxyXG4gICAgLy8gICAgICk7XHJcbiAgICAvLyAgIH07XHJcblxyXG4gICAgLy8gICBjb25zdCBvdmVybGFwc09jY3VwaWVkID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiB7XHJcbiAgICAvLyAgICAgY29uc3QgZ3JpZFJlY3QgPSB7IHgsIHksIHc6IGdyaWRXaWR0aCwgaDogZ3JpZEhlaWdodCB9O1xyXG5cclxuICAgIC8vICAgICBmb3IgKGNvbnN0IG9jYyBvZiBvY2N1cGllZFJlY3RzKSB7XHJcbiAgICAvLyAgICAgICBpZiAodGhpcy5yZWN0c092ZXJsYXAoZ3JpZFJlY3QsIG9jYykpIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyAgIH07XHJcblxyXG4gICAgLy8gICBjb25zdCBmaW5kQmVzdFBvc2l0aW9uID0gKG1vZGU6IFwic3RyaWN0XCIgfCBcInJlbGF4ZWRcIikgPT4ge1xyXG4gICAgLy8gICAgIGxldCBiZXN0U2NvcmUgPSAtSW5maW5pdHk7XHJcbiAgICAvLyAgICAgbGV0IGJlc3RQb3M6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8vICAgICBjb25zdCBzdGVwID0gZml4dHVyZVdpZHRoUHggLyAyO1xyXG5cclxuICAgIC8vICAgICBmb3IgKFxyXG4gICAgLy8gICAgICAgbGV0IHkgPSBib3VuZHMudG9wO1xyXG4gICAgLy8gICAgICAgeSA8PSBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCAtIGdyaWRIZWlnaHQ7XHJcbiAgICAvLyAgICAgICB5ICs9IHN0ZXBcclxuICAgIC8vICAgICApIHtcclxuICAgIC8vICAgICAgIGZvciAoXHJcbiAgICAvLyAgICAgICAgIGxldCB4ID0gYm91bmRzLmxlZnQ7XHJcbiAgICAvLyAgICAgICAgIHggPD0gYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLSBncmlkV2lkdGg7XHJcbiAgICAvLyAgICAgICAgIHggKz0gc3RlcFxyXG4gICAgLy8gICAgICAgKSB7XHJcbiAgICAvLyAgICAgICAgIGlmICghaXNJbnNpZGVQb2x5Z29uKHgsIHkpKSBjb250aW51ZTtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmIChtb2RlID09PSBcInN0cmljdFwiICYmIG92ZXJsYXBzT2NjdXBpZWQoeCwgeSkpIGNvbnRpbnVlO1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgZ3JpZFJlY3QgPSB7IHgsIHksIHc6IGdyaWRXaWR0aCwgaDogZ3JpZEhlaWdodCB9O1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgZW1wdHlNYXJnaW4gPSB0aGlzLmNvbXB1dGVFbXB0eU1hcmdpbihcclxuICAgIC8vICAgICAgICAgICBncmlkUmVjdCxcclxuICAgIC8vICAgICAgICAgICBib3VuZHMsXHJcbiAgICAvLyAgICAgICAgICAgb2NjdXBpZWRSZWN0cyxcclxuICAgIC8vICAgICAgICAgKTtcclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGR4ID0gY2VudGVyWCAtICh4ICsgZ3JpZFdpZHRoIC8gMik7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGR5ID0gY2VudGVyWSAtICh5ICsgZ3JpZEhlaWdodCAvIDIpO1xyXG4gICAgLy8gICAgICAgICBjb25zdCBjZW50ZXJQZW5hbHR5ID0gZHggKiBkeCArIGR5ICogZHk7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBzY29yZSA9IGVtcHR5TWFyZ2luICogMTAwMCAtIGNlbnRlclBlbmFsdHkgKiAwLjAwMTtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmIChzY29yZSA+IGJlc3RTY29yZSkge1xyXG4gICAgLy8gICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlO1xyXG4gICAgLy8gICAgICAgICAgIGJlc3RQb3MgPSB7IHgsIHkgfTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgcmV0dXJuIGJlc3RQb3M7XHJcbiAgICAvLyAgIH07XHJcblxyXG4gICAgLy8gICBsZXQgYmVzdFBvcyA9IGZpbmRCZXN0UG9zaXRpb24oXCJzdHJpY3RcIik7XHJcblxyXG4gICAgLy8gICBpZiAoIWJlc3RQb3MpIHtcclxuICAgIC8vICAgICBjb25zb2xlLndhcm4oXCJTdHJpY3QgcGxhY2VtZW50IGZhaWxlZC4gVHJ5aW5nIHJlbGF4ZWQgbW9kZS4uLlwiKTtcclxuICAgIC8vICAgICBiZXN0UG9zID0gZmluZEJlc3RQb3NpdGlvbihcInJlbGF4ZWRcIik7XHJcbiAgICAvLyAgIH1cclxuXHJcbiAgICAvLyAgIGlmICghYmVzdFBvcykge1xyXG4gICAgLy8gICAgIGNvbnNvbGUud2FybihcIlJlbGF4ZWQgcGxhY2VtZW50IGZhaWxlZC4gRmFsbGluZyBiYWNrIHRvIGNlbnRlci5cIik7XHJcbiAgICAvLyAgICAgYmVzdFBvcyA9IHtcclxuICAgIC8vICAgICAgIHg6IGNlbnRlclggLSBncmlkV2lkdGggLyAyLFxyXG4gICAgLy8gICAgICAgeTogY2VudGVyWSAtIGdyaWRIZWlnaHQgLyAyLFxyXG4gICAgLy8gICAgIH07XHJcbiAgICAvLyAgIH1cclxuXHJcbiAgICAvLyAgIGZpeHR1cmVzLmZvckVhY2goKGZpeHR1cmU6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgLy8gICAgIC8vIE4tc2hhcGUgdHJhdmVyc2FsOiBjb2wgZmlsbHMgbGVmdC10by1yaWdodCwgZWFjaCBjb2x1bW4gZmlsbHMgYm90dG9tIHJvdyBmaXJzdCB0aGVuIHRvcCByb3dcclxuICAgIC8vICAgICBjb25zdCBjb2wgPSBNYXRoLmZsb29yKGluZGV4IC8gMik7XHJcbiAgICAvLyAgICAgY29uc3Qgcm93ID0gaW5kZXggJSAyID09PSAwID8gMSA6IDA7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IHggPSBiZXN0UG9zIS54ICsgY29sICogZml4dHVyZVdpZHRoUHg7XHJcbiAgICAvLyAgICAgY29uc3QgeSA9IGJlc3RQb3MhLnkgKyByb3cgKiBmaXh0dXJlSGVpZ2h0UHg7XHJcblxyXG4gICAgLy8gICAgIGZpeHR1cmUucmVsYXRpdmVQb3NpdGlvbi54ID0gdGhpcy5mcm9tUGl4ZWxzKHgsIFwiZnRcIik7XHJcbiAgICAvLyAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLnkgPSB0aGlzLmZyb21QaXhlbHMoeSwgXCJmdFwiKTtcclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmZsb29yRGF0YT8uY2FkTGF5b3V0ICYmXHJcbiAgICAgIHRoaXMuZmxvb3JEYXRhPy5jZW50ZXJGaXh0dXJlPy5sZW5ndGhcclxuICAgICkge1xyXG4gICAgICB0aGlzLmNvbXBhY3RDZW50ZXJGaXh0dXJlcyh0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZsb29yPy5jZW50ZXJGaXh0dXJlPy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBmaXh0dXJlID0gZmxvb3IuY2VudGVyRml4dHVyZVtpXTtcclxuXHJcbiAgICAgIGNvbnN0IGZpeHR1cmVIZWlnaHQgPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgIGZpeHR1cmUuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSxcclxuICAgICAgICBmaXh0dXJlLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IGZpeHR1cmVXaWR0aCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgZml4dHVyZS5maXh0dXJlU3RhdGljV2lkdGgudmFsdWUsXHJcbiAgICAgICAgZml4dHVyZS5maXh0dXJlU3RhdGljV2lkdGgudW5pdCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IHggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgIGZpeHR1cmUucmVsYXRpdmVQb3NpdGlvbi54LFxyXG4gICAgICAgIGZpeHR1cmUucmVsYXRpdmVQb3NpdGlvbi51bml0LFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgeSA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLnksXHJcbiAgICAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLnVuaXQsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLmRyYXdGaXh0dXJlKFxyXG4gICAgICAgIHRoaXMuY2FudmFzLFxyXG4gICAgICAgIHgsXHJcbiAgICAgICAgeSxcclxuICAgICAgICBmaXh0dXJlSGVpZ2h0LFxyXG4gICAgICAgIGZpeHR1cmVXaWR0aCxcclxuICAgICAgICBmaXh0dXJlLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZmxvb3I/Lm90aGVyRWxlbWVudHM/Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgIGNvbnN0IG90aGVyRWxlbWVudCA9IGZsb29yLm90aGVyRWxlbWVudHNbal07XHJcbiAgICAgIGNvbnN0IHggPSB0aGlzLnRvUGl4ZWxzKG90aGVyRWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLngsIFwiZnRcIik7XHJcbiAgICAgIGNvbnN0IHkgPSB0aGlzLnRvUGl4ZWxzKG90aGVyRWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLnksIFwiZnRcIik7XHJcbiAgICAgIGNvbnN0IGEgPSBvdGhlckVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi5hbmdsZTtcclxuICAgICAgY29uc3QgaCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNMZW5ndGgudmFsdWUsXHJcbiAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgdyA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNXaWR0aC52YWx1ZSxcclxuICAgICAgICBvdGhlckVsZW1lbnQuZml4dHVyZVN0YXRpY1dpZHRoLnVuaXQsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLmRyYXdPdGhlckVsZW1lbnRzV2l0aExhYmVsKHRoaXMuY2FudmFzLCB4LCB5LCBhLCB3LCBoLCBvdGhlckVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgY29tcGFjdENlbnRlckZpeHR1cmVzKGZpeHR1cmVzOiBhbnlbXSkge1xyXG4gICAgaWYgKCFmaXh0dXJlcz8ubGVuZ3RoKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgR0FQX0ZBQ1RPUiA9IDAuMzsgLy8gNzAlIHJlZHVjdGlvblxyXG5cclxuICAgIGNvbnN0IGl0ZW1zID0gZml4dHVyZXMubWFwKChmKSA9PiB7XHJcbiAgICAgIGNvbnN0IHcgPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgIGYuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlLFxyXG4gICAgICAgIGYuZml4dHVyZVN0YXRpY1dpZHRoLnVuaXQsXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgIGYuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSxcclxuICAgICAgICBmLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IHggPSB0aGlzLnRvUGl4ZWxzKGYucmVsYXRpdmVQb3NpdGlvbi54LCBmLnJlbGF0aXZlUG9zaXRpb24udW5pdCk7XHJcbiAgICAgIGNvbnN0IHkgPSB0aGlzLnRvUGl4ZWxzKGYucmVsYXRpdmVQb3NpdGlvbi55LCBmLnJlbGF0aXZlUG9zaXRpb24udW5pdCk7XHJcblxyXG4gICAgICByZXR1cm4geyBmLCB4LCB5LCB3LCBoIH07XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDwn5GJIENhcHR1cmUgb3JpZ2luYWwgY2VudGVyXHJcbiAgICBjb25zdCBnZXRCb3VuZHMgPSAobGlzdDphbnkpID0+IHtcclxuICAgICAgY29uc3QgbWluWCA9IE1hdGgubWluKC4uLmxpc3QubWFwKChpOmFueSkgPT4gaS54KSk7XHJcbiAgICAgIGNvbnN0IG1pblkgPSBNYXRoLm1pbiguLi5saXN0Lm1hcCgoaTphbnkpID0+IGkueSkpO1xyXG4gICAgICBjb25zdCBtYXhYID0gTWF0aC5tYXgoLi4ubGlzdC5tYXAoKGk6YW55KSA9PiBpLnggKyBpLncpKTtcclxuICAgICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KC4uLmxpc3QubWFwKChpOmFueSkgPT4gaS55ICsgaS5oKSk7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIG1pblgsXHJcbiAgICAgICAgbWluWSxcclxuICAgICAgICB3aWR0aDogbWF4WCAtIG1pblgsXHJcbiAgICAgICAgaGVpZ2h0OiBtYXhZIC0gbWluWSxcclxuICAgICAgICBjZW50ZXJYOiBtaW5YICsgKG1heFggLSBtaW5YKSAvIDIsXHJcbiAgICAgICAgY2VudGVyWTogbWluWSArIChtYXhZIC0gbWluWSkgLyAyLFxyXG4gICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBvcmlnaW5hbEJvdW5kcyA9IGdldEJvdW5kcyhpdGVtcyk7XHJcblxyXG4gICAgLy8gU1RFUCAxOiBncm91cCByb3dzXHJcbiAgICBjb25zdCByb3dUaHJlc2hvbGQgPSBNYXRoLm1pbiguLi5pdGVtcy5tYXAoKGkpID0+IGkuaCkpIC8gMjtcclxuXHJcbiAgICBjb25zdCByb3dzOiBhbnlbXVtdID0gW107XHJcbiAgICBpdGVtcy5zb3J0KChhLCBiKSA9PiBhLnkgLSBiLnkpO1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICBsZXQgcGxhY2VkID0gZmFsc2U7XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XHJcbiAgICAgICAgaWYgKE1hdGguYWJzKHJvd1swXS55IC0gaXRlbS55KSA8IHJvd1RocmVzaG9sZCkge1xyXG4gICAgICAgICAgcm93LnB1c2goaXRlbSk7XHJcbiAgICAgICAgICBwbGFjZWQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXBsYWNlZCkgcm93cy5wdXNoKFtpdGVtXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHJvdy5zb3J0KChhLCBiKSA9PiBhLnggLSBiLngpKTtcclxuXHJcbiAgICAvLyBTVEVQIDI6IGhvcml6b250YWwgY29tcGFjdGlvbiAoc2NhbGVkIGdhcHMpXHJcbiAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJvdy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHByZXYgPSByb3dbaSAtIDFdO1xyXG4gICAgICAgIGNvbnN0IGN1cnIgPSByb3dbaV07XHJcblxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsR2FwID0gY3Vyci54IC0gKHByZXYueCArIHByZXYudyk7XHJcblxyXG4gICAgICAgIGlmIChvcmlnaW5hbEdhcCA+IDApIHtcclxuICAgICAgICAgIGNvbnN0IG5ld0dhcCA9IG9yaWdpbmFsR2FwICogR0FQX0ZBQ1RPUjtcclxuICAgICAgICAgIGN1cnIueCA9IHByZXYueCArIHByZXYudyArIG5ld0dhcDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFNURVAgMzogdmVydGljYWwgY29tcGFjdGlvbiAoc2NhbGVkIGdhcHMpXHJcbiAgICBmb3IgKGxldCByID0gMTsgciA8IHJvd3MubGVuZ3RoOyByKyspIHtcclxuICAgICAgY29uc3QgcHJldlJvdyA9IHJvd3NbciAtIDFdO1xyXG4gICAgICBjb25zdCBjdXJyUm93ID0gcm93c1tyXTtcclxuXHJcbiAgICAgIGNvbnN0IHByZXZCb3R0b20gPSBNYXRoLm1heCguLi5wcmV2Um93Lm1hcCgoaSkgPT4gaS55ICsgaS5oKSk7XHJcbiAgICAgIGNvbnN0IGN1cnJUb3AgPSBNYXRoLm1pbiguLi5jdXJyUm93Lm1hcCgoaSkgPT4gaS55KSk7XHJcblxyXG4gICAgICBjb25zdCBvcmlnaW5hbEdhcCA9IGN1cnJUb3AgLSBwcmV2Qm90dG9tO1xyXG5cclxuICAgICAgaWYgKG9yaWdpbmFsR2FwID4gMCkge1xyXG4gICAgICAgIGNvbnN0IG5ld0dhcCA9IG9yaWdpbmFsR2FwICogR0FQX0ZBQ1RPUjtcclxuICAgICAgICBjb25zdCBzaGlmdCA9IG9yaWdpbmFsR2FwIC0gbmV3R2FwO1xyXG5cclxuICAgICAgICBjdXJyUm93LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGl0ZW0ueSAtPSBzaGlmdDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFNURVAgNDogcmVzdG9yZSBjZW50ZXJcclxuICAgIGNvbnN0IG5ld0JvdW5kcyA9IGdldEJvdW5kcyhpdGVtcyk7XHJcblxyXG4gICAgY29uc3QgZHggPSBvcmlnaW5hbEJvdW5kcy5jZW50ZXJYIC0gbmV3Qm91bmRzLmNlbnRlclg7XHJcbiAgICBjb25zdCBkeSA9IG9yaWdpbmFsQm91bmRzLmNlbnRlclkgLSBuZXdCb3VuZHMuY2VudGVyWTtcclxuXHJcbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0ueCArPSBkeDtcclxuICAgICAgaXRlbS55ICs9IGR5O1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gU1RFUCA1OiB3cml0ZSBiYWNrXHJcbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0uZi5yZWxhdGl2ZVBvc2l0aW9uLnggPSB0aGlzLmZyb21QaXhlbHMoaXRlbS54LCBcImZ0XCIpO1xyXG4gICAgICBpdGVtLmYucmVsYXRpdmVQb3NpdGlvbi55ID0gdGhpcy5mcm9tUGl4ZWxzKGl0ZW0ueSwgXCJmdFwiKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgaXNQb2ludEluc2lkZVBvbHlnb24oXHJcbiAgICBwb2ludDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9LFxyXG4gICAgcG9seWdvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9W10sXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaW5zaWRlID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSBwb2x5Z29uLmxlbmd0aCAtIDE7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaiA9IGkrKykge1xyXG4gICAgICBjb25zdCB4aSA9IHBvbHlnb25baV0ueCxcclxuICAgICAgICB5aSA9IHBvbHlnb25baV0ueTtcclxuICAgICAgY29uc3QgeGogPSBwb2x5Z29uW2pdLngsXHJcbiAgICAgICAgeWogPSBwb2x5Z29uW2pdLnk7XHJcblxyXG4gICAgICBjb25zdCBpbnRlcnNlY3QgPVxyXG4gICAgICAgIHlpID4gcG9pbnQueSAhPT0geWogPiBwb2ludC55ICYmXHJcbiAgICAgICAgcG9pbnQueCA8ICgoeGogLSB4aSkgKiAocG9pbnQueSAtIHlpKSkgLyAoeWogLSB5aSkgKyB4aTtcclxuXHJcbiAgICAgIGlmIChpbnRlcnNlY3QpIGluc2lkZSA9ICFpbnNpZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGluc2lkZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0T2NjdXBpZWRSZWN0cygpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuY2FudmFzLmdldE9iamVjdHMoKS5tYXAoKG9iaikgPT4ge1xyXG4gICAgICBjb25zdCByID0gb2JqLmdldEJvdW5kaW5nUmVjdCgpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHg6IHIubGVmdCxcclxuICAgICAgICB5OiByLnRvcCxcclxuICAgICAgICB3OiByLndpZHRoLFxyXG4gICAgICAgIGg6IHIuaGVpZ2h0LFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlY3RzT3ZlcmxhcChcclxuICAgIGE6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sXHJcbiAgICBiOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9LFxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEoXHJcbiAgICAgIGEueCArIGEudyA8PSBiLnggfHxcclxuICAgICAgYS54ID49IGIueCArIGIudyB8fFxyXG4gICAgICBhLnkgKyBhLmggPD0gYi55IHx8XHJcbiAgICAgIGEueSA+PSBiLnkgKyBiLmhcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXB1dGVFbXB0eU1hcmdpbihcclxuICAgIGdyaWRSZWN0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9LFxyXG4gICAgYm91bmRzOiB7IGxlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0sXHJcbiAgICBvY2N1cGllZFJlY3RzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9W10sXHJcbiAgKTogbnVtYmVyIHtcclxuICAgIGxldCBtaW5NYXJnaW4gPSBJbmZpbml0eTtcclxuXHJcbiAgICAvLyBkaXN0YW5jZSB0byBsYXlvdXQgYm91bmRzXHJcbiAgICBtaW5NYXJnaW4gPSBNYXRoLm1pbihcclxuICAgICAgbWluTWFyZ2luLFxyXG4gICAgICBncmlkUmVjdC54IC0gYm91bmRzLmxlZnQsXHJcbiAgICAgIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC0gKGdyaWRSZWN0LnggKyBncmlkUmVjdC53KSxcclxuICAgICAgZ3JpZFJlY3QueSAtIGJvdW5kcy50b3AsXHJcbiAgICAgIGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC0gKGdyaWRSZWN0LnkgKyBncmlkUmVjdC5oKSxcclxuICAgICk7XHJcblxyXG4gICAgLy8gZGlzdGFuY2UgdG8gb3RoZXIgb2JqZWN0c1xyXG4gICAgZm9yIChjb25zdCBvY2Mgb2Ygb2NjdXBpZWRSZWN0cykge1xyXG4gICAgICAvLyBob3Jpem9udGFsIGdhcFxyXG4gICAgICBpZiAob2NjLnkgPCBncmlkUmVjdC55ICsgZ3JpZFJlY3QuaCAmJiBvY2MueSArIG9jYy5oID4gZ3JpZFJlY3QueSkge1xyXG4gICAgICAgIGlmIChvY2MueCArIG9jYy53IDw9IGdyaWRSZWN0LngpIHtcclxuICAgICAgICAgIG1pbk1hcmdpbiA9IE1hdGgubWluKG1pbk1hcmdpbiwgZ3JpZFJlY3QueCAtIChvY2MueCArIG9jYy53KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChvY2MueCA+PSBncmlkUmVjdC54ICsgZ3JpZFJlY3Qudykge1xyXG4gICAgICAgICAgbWluTWFyZ2luID0gTWF0aC5taW4obWluTWFyZ2luLCBvY2MueCAtIChncmlkUmVjdC54ICsgZ3JpZFJlY3QudykpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gdmVydGljYWwgZ2FwXHJcbiAgICAgIGlmIChvY2MueCA8IGdyaWRSZWN0LnggKyBncmlkUmVjdC53ICYmIG9jYy54ICsgb2NjLncgPiBncmlkUmVjdC54KSB7XHJcbiAgICAgICAgaWYgKG9jYy55ICsgb2NjLmggPD0gZ3JpZFJlY3QueSkge1xyXG4gICAgICAgICAgbWluTWFyZ2luID0gTWF0aC5taW4obWluTWFyZ2luLCBncmlkUmVjdC55IC0gKG9jYy55ICsgb2NjLmgpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG9jYy55ID49IGdyaWRSZWN0LnkgKyBncmlkUmVjdC5oKSB7XHJcbiAgICAgICAgICBtaW5NYXJnaW4gPSBNYXRoLm1pbihtaW5NYXJnaW4sIG9jYy55IC0gKGdyaWRSZWN0LnkgKyBncmlkUmVjdC5oKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1pbk1hcmdpbjtcclxuICB9XHJcblxyXG4gIGRyYXdGaXh0dXJlUm93TGFiZWwodGV4dDogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlcikge1xyXG4gICAgY29uc3QgbGFiZWwgPSBuZXcgZmFicmljLlRleHQodGV4dCwge1xyXG4gICAgICBsZWZ0OiB4LFxyXG4gICAgICB0b3A6IHksXHJcbiAgICAgIGZvbnRTaXplOiAxNCxcclxuICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICBmb250V2VpZ2h0OiBcIjYwMFwiLFxyXG4gICAgICBmaWxsOiBcIiMzMzNcIixcclxuICAgICAgb3JpZ2luWDogXCJsZWZ0XCIsXHJcbiAgICAgIG9yaWdpblk6IFwiYm90dG9tXCIsXHJcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FudmFzLmFkZChsYWJlbCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBkcmF3V2FsbChcclxuICAgIGNhbnZhczogZmFicmljLkNhbnZhcyxcclxuICAgIHg6IG51bWJlcixcclxuICAgIHk6IG51bWJlcixcclxuICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgd2lkdGg6IG51bWJlcixcclxuICAgIGVsZW1lbnREYXRhOiBhbnksXHJcbiAgKSB7XHJcbiAgICBjb25zdCByYWRpdXMgPSA1O1xyXG4gICAgY29uc3QgZmlsbENvbG9yID0gXCIjRjZGQ0ZGXCI7XHJcbiAgICBjb25zdCBzdHJva2VDb2xvciA9IFwiI0QwRDVERFwiO1xyXG4gICAgY29uc3QgbGFiZWxDb2xvciA9IFwiIzAwOUJGM1wiO1xyXG4gICAgbGV0IHRleHQgPSBgJHt0aGlzLnRpdGxlQ2FzZS50cmFuc2Zvcm0oZWxlbWVudERhdGEuZWxlbWVudFR5cGUpfSAke1xyXG4gICAgICBlbGVtZW50RGF0YS5lbGVtZW50TnVtYmVyXHJcbiAgICB9YDtcclxuXHJcbiAgICBjb25zdCB3YWxsID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgbGVmdDogMCxcclxuICAgICAgdG9wOiAwLFxyXG4gICAgICB3aWR0aCxcclxuICAgICAgaGVpZ2h0LFxyXG4gICAgICByeDogcmFkaXVzLFxyXG4gICAgICByeTogcmFkaXVzLFxyXG4gICAgICBmaWxsOiBmaWxsQ29sb3IsXHJcbiAgICAgIHN0cm9rZTogc3Ryb2tlQ29sb3IsXHJcbiAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgc3Ryb2tlVW5pZm9ybTogdHJ1ZSxcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGNlbnRlclggPSB3aWR0aCAvIDI7XHJcbiAgICBjb25zdCBjZW50ZXJZID0gaGVpZ2h0IC8gMjtcclxuICAgIGNvbnN0IGlzVmVydGljYWwgPSBoZWlnaHQgPiB3aWR0aDtcclxuXHJcbiAgICBjb25zdCBsYWJlbCA9IG5ldyBmYWJyaWMuRmFicmljVGV4dCh0ZXh0LCB7XHJcbiAgICAgIGxlZnQ6IGNlbnRlclgsXHJcbiAgICAgIHRvcDogY2VudGVyWSxcclxuICAgICAgZm9udFNpemU6IDEwLFxyXG4gICAgICBmb250RmFtaWx5OiBcIkludGVyXCIsXHJcbiAgICAgIGZvbnRXZWlnaHQ6IFwiNTAwXCIsXHJcbiAgICAgIGZpbGw6IGxhYmVsQ29sb3IsXHJcbiAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgIGFuZ2xlOiBpc1ZlcnRpY2FsID8gLTkwIDogMCxcclxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBhcnJvd0hlYWQgPSA1O1xyXG4gICAgY29uc3QgZWxlbWVudHM6IGZhYnJpYy5PYmplY3RbXSA9IFt3YWxsLCBsYWJlbF07XHJcblxyXG4gICAgaWYgKGlzVmVydGljYWwpIHtcclxuICAgICAgY29uc3QgdGV4dFdpZHRoID0gbGFiZWwud2lkdGggfHwgMDtcclxuICAgICAgY29uc3QgdG9wQXJyb3dZID0gNTtcclxuICAgICAgY29uc3QgdG9wQXJyb3dFbmRZID0gY2VudGVyWSAtIHRleHRXaWR0aCAvIDIgLSA1O1xyXG5cclxuICAgICAgaWYgKHRvcEFycm93RW5kWSA+IHRvcEFycm93WSArIGFycm93SGVhZCkge1xyXG4gICAgICAgIGVsZW1lbnRzLnB1c2goXHJcbiAgICAgICAgICBuZXcgZmFicmljLkxpbmUoW2NlbnRlclgsIHRvcEFycm93WSwgY2VudGVyWCwgdG9wQXJyb3dFbmRZXSwge1xyXG4gICAgICAgICAgICBzdHJva2U6IGxhYmVsQ29sb3IsXHJcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAxLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgbmV3IGZhYnJpYy5UcmlhbmdsZSh7XHJcbiAgICAgICAgICAgIGxlZnQ6IGNlbnRlclgsXHJcbiAgICAgICAgICAgIHRvcDogdG9wQXJyb3dZLFxyXG4gICAgICAgICAgICB3aWR0aDogYXJyb3dIZWFkLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGFycm93SGVhZCxcclxuICAgICAgICAgICAgYW5nbGU6IDAsXHJcbiAgICAgICAgICAgIGZpbGw6IGxhYmVsQ29sb3IsXHJcbiAgICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgIG9yaWdpblk6IFwiYm90dG9tXCIsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgYm90dG9tQXJyb3dTdGFydFkgPSBjZW50ZXJZICsgdGV4dFdpZHRoIC8gMiArIDU7XHJcbiAgICAgIGNvbnN0IGJvdHRvbUFycm93RW5kWSA9IGhlaWdodCAtIDU7XHJcblxyXG4gICAgICBpZiAoYm90dG9tQXJyb3dFbmRZID4gYm90dG9tQXJyb3dTdGFydFkgKyBhcnJvd0hlYWQpIHtcclxuICAgICAgICBlbGVtZW50cy5wdXNoKFxyXG4gICAgICAgICAgbmV3IGZhYnJpYy5MaW5lKFxyXG4gICAgICAgICAgICBbY2VudGVyWCwgYm90dG9tQXJyb3dTdGFydFksIGNlbnRlclgsIGJvdHRvbUFycm93RW5kWV0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBzdHJva2U6IGxhYmVsQ29sb3IsXHJcbiAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXHJcbiAgICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgbmV3IGZhYnJpYy5UcmlhbmdsZSh7XHJcbiAgICAgICAgICAgIGxlZnQ6IGNlbnRlclgsXHJcbiAgICAgICAgICAgIHRvcDogYm90dG9tQXJyb3dFbmRZLFxyXG4gICAgICAgICAgICB3aWR0aDogYXJyb3dIZWFkLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGFycm93SGVhZCxcclxuICAgICAgICAgICAgYW5nbGU6IDE4MCxcclxuICAgICAgICAgICAgZmlsbDogbGFiZWxDb2xvcixcclxuICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgb3JpZ2luWTogXCJ0b3BcIixcclxuICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCB0ZXh0V2lkdGggPSBsYWJlbC53aWR0aCB8fCAwO1xyXG4gICAgICBjb25zdCBsZWZ0QXJyb3dTdGFydFggPSA1O1xyXG4gICAgICBjb25zdCBsZWZ0QXJyb3dFbmRYID0gY2VudGVyWCAtIHRleHRXaWR0aCAvIDIgLSA1O1xyXG5cclxuICAgICAgaWYgKGxlZnRBcnJvd0VuZFggPiBsZWZ0QXJyb3dTdGFydFggKyBhcnJvd0hlYWQpIHtcclxuICAgICAgICBlbGVtZW50cy5wdXNoKFxyXG4gICAgICAgICAgbmV3IGZhYnJpYy5MaW5lKFtsZWZ0QXJyb3dTdGFydFgsIGNlbnRlclksIGxlZnRBcnJvd0VuZFgsIGNlbnRlclldLCB7XHJcbiAgICAgICAgICAgIHN0cm9rZTogbGFiZWxDb2xvcixcclxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBuZXcgZmFicmljLlRyaWFuZ2xlKHtcclxuICAgICAgICAgICAgbGVmdDogbGVmdEFycm93U3RhcnRYLFxyXG4gICAgICAgICAgICB0b3A6IGNlbnRlclksXHJcbiAgICAgICAgICAgIHdpZHRoOiBhcnJvd0hlYWQsXHJcbiAgICAgICAgICAgIGhlaWdodDogYXJyb3dIZWFkLFxyXG4gICAgICAgICAgICBhbmdsZTogLTkwLFxyXG4gICAgICAgICAgICBmaWxsOiBsYWJlbENvbG9yLFxyXG4gICAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHJpZ2h0QXJyb3dTdGFydFggPSBjZW50ZXJYICsgdGV4dFdpZHRoIC8gMiArIDU7XHJcbiAgICAgIGNvbnN0IHJpZ2h0QXJyb3dFbmRYID0gd2lkdGggLSA1O1xyXG5cclxuICAgICAgaWYgKHJpZ2h0QXJyb3dFbmRYID4gcmlnaHRBcnJvd1N0YXJ0WCArIGFycm93SGVhZCkge1xyXG4gICAgICAgIGVsZW1lbnRzLnB1c2goXHJcbiAgICAgICAgICBuZXcgZmFicmljLkxpbmUoXHJcbiAgICAgICAgICAgIFtyaWdodEFycm93U3RhcnRYLCBjZW50ZXJZLCByaWdodEFycm93RW5kWCwgY2VudGVyWV0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBzdHJva2U6IGxhYmVsQ29sb3IsXHJcbiAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXHJcbiAgICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgbmV3IGZhYnJpYy5UcmlhbmdsZSh7XHJcbiAgICAgICAgICAgIGxlZnQ6IHJpZ2h0QXJyb3dFbmRYLFxyXG4gICAgICAgICAgICB0b3A6IGNlbnRlclksXHJcbiAgICAgICAgICAgIHdpZHRoOiBhcnJvd0hlYWQsXHJcbiAgICAgICAgICAgIGhlaWdodDogYXJyb3dIZWFkLFxyXG4gICAgICAgICAgICBhbmdsZTogOTAsXHJcbiAgICAgICAgICAgIGZpbGw6IGxhYmVsQ29sb3IsXHJcbiAgICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGxvY2tTdmdTdHJpbmcgPSBgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICA8cGF0aCBkPVwiTTcgMTFWN0M3IDUuNjczOTIgNy41MjY3OCA0LjQwMjE1IDguNDY0NDcgMy40NjQ0N0M5LjQwMjE1IDIuNTI2NzggMTAuNjczOSAyIDEyIDJDMTMuMzI2MSAyIDE0LjU5NzkgMi41MjY3OCAxNS41MzU1IDMuNDY0NDdDMTYuNDczMiA0LjQwMjE1IDE3IDUuNjczOTIgMTcgN1YxMU01IDExSDE5QzIwLjEwNDYgMTEgMjEgMTEuODk1NCAyMSAxM1YyMEMyMSAyMS4xMDQ2IDIwLjEwNDYgMjIgMTkgMjJINUMzLjg5NTQzIDIyIDMgMjEuMTA0NiAzIDIwVjEzQzMgMTEuODk1NCAzLjg5NTQzIDExIDUgMTFaXCIgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICA8L3N2Zz5gO1xyXG5cclxuICAgIGxldCBsb2FkZWRTVkc6IGFueSA9IGF3YWl0IGZhYnJpYy5sb2FkU1ZHRnJvbVN0cmluZyhsb2NrU3ZnU3RyaW5nKTtcclxuXHJcbiAgICBsZXQgbG9ja1N2ZyA9IGZhYnJpYy51dGlsLmdyb3VwU1ZHRWxlbWVudHMoXHJcbiAgICAgIGxvYWRlZFNWRy5vYmplY3RzLFxyXG4gICAgICBsb2FkZWRTVkcub3B0aW9ucyxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3Qgd2FsbENlbnRlclggPSB3aWR0aCAvIDI7XHJcbiAgICBjb25zdCB3YWxsQ2VudGVyWSA9IGhlaWdodCAvIDI7XHJcblxyXG4gICAgbG9ja1N2Zy5zY2FsZVRvV2lkdGgoMjApO1xyXG4gICAgbG9ja1N2Zy5zY2FsZVRvSGVpZ2h0KDIwKTtcclxuXHJcbiAgICBpZiAoaXNWZXJ0aWNhbCkge1xyXG4gICAgICBsb2NrU3ZnLnNldCh7XHJcbiAgICAgICAgbGVmdDogd2FsbENlbnRlclgsXHJcbiAgICAgICAgdG9wOiB3YWxsQ2VudGVyWSxcclxuICAgICAgICBhbmdsZTogLTkwLFxyXG4gICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsb2NrU3ZnLnNldCh7XHJcbiAgICAgICAgbGVmdDogd2FsbENlbnRlclgsXHJcbiAgICAgICAgdG9wOiB3YWxsQ2VudGVyWSxcclxuICAgICAgICBhbmdsZTogMCxcclxuICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxvY2tTdmcuc2V0KHtcclxuICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICBldmVudGVkOiB0cnVlLFxyXG4gICAgICBob3ZlckN1cnNvcjogXCJwb2ludGVyXCIsXHJcbiAgICB9KTtcclxuXHJcbiAgICBsb2NrU3ZnLm9uKFwibW91c2Vkb3duXCIsIChvcHQpID0+IHtcclxuICAgICAgaWYgKG9wdCAmJiBvcHQuZSAmJiBvcHQuZS5zdG9wUHJvcGFnYXRpb24pIHtcclxuICAgICAgICBvcHQuZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5sYXlvdXRGb3JtLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICAgIGVsZW1lbnREYXRhLmlzTG9ja2VkID0gIWVsZW1lbnREYXRhPy5pc0xvY2tlZDtcclxuICAgICAgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBlbGVtZW50cy5wdXNoKGxvY2tTdmcpO1xyXG5cclxuICAgIGxldCBtb2RDZW50ZXJYID0geDtcclxuICAgIGxldCBtb2RDZW50ZXJZID0geTtcclxuICAgIGxldCBhbmdsZSA9IGVsZW1lbnREYXRhLmFuZ2xlO1xyXG5cclxuICAgIGNvbnN0IGdyb3VwID0gbmV3IGZhYnJpYy5Hcm91cChlbGVtZW50cywge1xyXG4gICAgICBsZWZ0OiBtb2RDZW50ZXJYLFxyXG4gICAgICB0b3A6IG1vZENlbnRlclksXHJcbiAgICAgIGhhc0NvbnRyb2xzOiB0cnVlLFxyXG4gICAgICBsb2NrU2NhbGluZ1g6IGlzVmVydGljYWwsXHJcbiAgICAgIGxvY2tTY2FsaW5nWTogIWlzVmVydGljYWwsXHJcbiAgICAgIHNlbGVjdGFibGU6IHRoaXMubGF5b3V0Rm9ybS5lbmFibGVkLFxyXG4gICAgICBldmVudGVkOiB0cnVlLFxyXG4gICAgICBob3ZlckN1cnNvcjogXCJwb2ludGVyXCIsXHJcbiAgICAgIGFuZ2xlOiBhbmdsZSxcclxuICAgICAgc3ViVGFyZ2V0Q2hlY2s6IHRydWUsXHJcbiAgICB9KSBhcyBmYWJyaWMuR3JvdXAgJiB7XHJcbiAgICAgIG9ialR5cGU6IHN0cmluZztcclxuICAgICAgZGF0YTogYW55O1xyXG4gICAgfTtcclxuXHJcbiAgICBncm91cC5vYmpUeXBlID0gZWxlbWVudERhdGEuZWxlbWVudFR5cGU7XHJcbiAgICBncm91cC5kYXRhID0gZWxlbWVudERhdGE7XHJcblxyXG4gICAgY2FudmFzLmFkZChncm91cCk7XHJcblxyXG4gICAgLy8gSWYgbmV3bHkgYWRkZWQsIGZvY3VzIGl0IG9uY2VcclxuICAgIGlmICgoZWxlbWVudERhdGEgYXMgYW55KT8ubmV3QWRkZWQpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmNhbnZhcy5zZXRBY3RpdmVPYmplY3QoZ3JvdXApO1xyXG4gICAgICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICAgICAgfSBjYXRjaCB7fVxyXG4gICAgICBkZWxldGUgKGVsZW1lbnREYXRhIGFzIGFueSkubmV3QWRkZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGdyb3VwO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZHJhd0ZpeHR1cmUoXHJcbiAgICBjYW52YXM6IGZhYnJpYy5DYW52YXMsXHJcbiAgICB4OiBudW1iZXIsXHJcbiAgICB5OiBudW1iZXIsXHJcbiAgICBoZWlnaHQ6IG51bWJlcixcclxuICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICBmaXh0dXJlRGF0YTogYW55LFxyXG4gICkge1xyXG4gICAgY29uc3QgYWN0dWFsU2hlbHZlcyA9XHJcbiAgICAgIGZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnPy5maWx0ZXIoKHM6IGFueSkgPT4gcy5zaGVsZlR5cGUgIT0gXCJ2bW9ubHlcIikgPz9cclxuICAgICAgW107XHJcblxyXG4gICAgbGV0IGZpeHR1cmVDb2xvcjogYW55O1xyXG5cclxuICAgIGlmIChmaXh0dXJlRGF0YS5maXh0dXJlTmFtZSA9PT0gXCJzcGFjZVwiKSByZXR1cm47XHJcblxyXG4gICAgLy8gUmVzb2x2ZSB0aGUgYW5nbGUgdGhlIGZpeHR1cmUgZ3JvdXAgd2lsbCByZW5kZXIgYXQuIEZvciBmaXJzdC1yZW5kZXIgb2YgYVxyXG4gICAgLy8gQ0FELXVwbG9hZGVkIGxheW91dCwgdGhlIHdhbGwgYW5nbGUgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aCAob3RoZXJ3aXNlIHdlXHJcbiAgICAvLyBob25vciB0aGUgZml4dHVyZSdzIG93biBzYXZlZCBhbmdsZSkuIFdoZW4gdGhhdCBhbmdsZSBsaWVzIGluIHRoZVxyXG4gICAgLy8gdXBzaWRlLWRvd24gcmFuZ2UgKDkwwrAsIDI3MMKwKSwgd2UgZmxpcCB0aGUgZml4dHVyZSBib2R5IDE4MMKwIGluIHBsYWNlIHNvXHJcbiAgICAvLyBpdCByZW5kZXJzIGNhbm9uaWNhbCAoaGVhZGVyIGF0IHRvcCwgc3RvcmFnZSBhdCBib3R0b20pLiBUaGUgYm9keSBmbGlwXHJcbiAgICAvLyBhbHNvIGJyaW5ncyB0aGUgdGV4dCB1cHJpZ2h0IGFzIGEgc2lkZSBlZmZlY3QsIHNvIG5vIHBlci10ZXh0IHJvdGF0aW9uXHJcbiAgICAvLyBpcyBuZWVkZWQuIFRyYWRlLW9mZjogb24gZmxpcHBlZCB3YWxscyB0aGUgc3RvcmFnZSBib3ggZW5kcyB1cCB2aXN1YWxseVxyXG4gICAgLy8gdG91Y2hpbmcgdGhlIHdhbGwgaW5zdGVhZCBvZiB0aGUgaGVhZGVyLlxyXG4gICAgbGV0IGFuZ2xlID0gZml4dHVyZURhdGE/LnJlbGF0aXZlUG9zaXRpb24/LmFuZ2xlID8/IDA7XHJcbiAgICBpZiAodGhpcy5mbG9vckRhdGEuY2FkTGF5b3V0ICYmIGZpeHR1cmVEYXRhLmZpeHR1cmVUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICBjb25zdCB3YWxsRGF0YSA9IHRoaXMuZ2V0V2FsbEJ5TnVtYmVyKFxyXG4gICAgICAgIGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50TnVtYmVyLFxyXG4gICAgICApO1xyXG4gICAgICBhbmdsZSA9IHdhbGxEYXRhPy5hbmdsZSA/PyAwO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm9ybUFuZ2xlID0gKCgoKGFuZ2xlIGFzIG51bWJlcikgJSAzNjApICsgMzYwKSAlIDM2MCk7XHJcbiAgICBjb25zdCBzaG91bGRGbGlwQm9keSA9XHJcbiAgICAgIHRoaXMuZmxvb3JEYXRhLmNhZExheW91dCAmJlxyXG4gICAgICBmaXh0dXJlRGF0YS5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCIgJiZcclxuICAgICAgbm9ybUFuZ2xlID4gOTAgJiZcclxuICAgICAgbm9ybUFuZ2xlIDwgMjcwO1xyXG5cclxuICAgIC8vIFRvIHJvdGF0ZSB0aGUgYm9keSAxODDCsCB3aGlsZSBrZWVwaW5nIHRoZSBzYW1lIG9uLWNhbnZhcyByZWdpb24sIHNoaWZ0XHJcbiAgICAvLyB0aGUgYW5jaG9yIGJ5IFIob3JpZ2luYWxBbmdsZSnCtyh3aWR0aCwgaGVpZ2h0KSDigJQgdGhhdCdzIHRoZSBjYW52YXNcclxuICAgIC8vIHBvc2l0aW9uIG9mIHRoZSB1bi1yb3RhdGVkIGJib3gncyBib3R0b20tcmlnaHQgY29ybmVyIHJlbGF0aXZlIHRvIHRoZVxyXG4gICAgLy8gYW5jaG9yIOKAlCBhbmQgYWRkIDE4MMKwIHRvIHRoZSByb3RhdGlvbi4gZmFicmljIHN0aWxsIHBpdm90cyBhcm91bmRcclxuICAgIC8vIHRvcC1sZWZ0IG9mIHRoZSB1bi1yb3RhdGVkIGJib3ggYXQgdGhlIG5ldyBhbmNob3IuXHJcbiAgICBsZXQgcmVuZGVyWCA9IHg7XHJcbiAgICBsZXQgcmVuZGVyWSA9IHk7XHJcbiAgICBsZXQgcmVuZGVyQW5nbGUgPSBhbmdsZSBhcyBudW1iZXI7XHJcbiAgICBpZiAoc2hvdWxkRmxpcEJvZHkpIHtcclxuICAgICAgY29uc3QgcmFkID0gKChhbmdsZSBhcyBudW1iZXIpICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICAgIGNvbnN0IGNvc0EgPSBNYXRoLmNvcyhyYWQpO1xyXG4gICAgICBjb25zdCBzaW5BID0gTWF0aC5zaW4ocmFkKTtcclxuICAgICAgcmVuZGVyWCA9IHggKyBjb3NBICogd2lkdGggLSBzaW5BICogaGVpZ2h0O1xyXG4gICAgICByZW5kZXJZID0geSArIHNpbkEgKiB3aWR0aCArIGNvc0EgKiBoZWlnaHQ7XHJcbiAgICAgIHJlbmRlckFuZ2xlID0gKGFuZ2xlIGFzIG51bWJlcikgKyAxODA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmFkaXVzID0gNTtcclxuICAgIGNvbnN0IG1haW5Db250YWluZXIgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICBsZWZ0OiB4LFxyXG4gICAgICB0b3A6IHksXHJcbiAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXHJcbiAgICAgIHJ4OiByYWRpdXMsXHJcbiAgICAgIHJ5OiByYWRpdXMsXHJcbiAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5ID8/IFwiIzUxQzFGRlwiLFxyXG4gICAgICBzdHJva2VXaWR0aDogMC4yNyxcclxuICAgICAgZmlsbDogXCJ3aGl0ZVwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgdG9wV2lkdGggPSB3aWR0aCAvIDEuMDU7XHJcbiAgICBjb25zdCB0b3BIZWlnaHQgPSAoMTUgLyAxMDApICogaGVpZ2h0O1xyXG4gICAgY29uc3QgdG9wWCA9IHggKyAod2lkdGggLSB0b3BXaWR0aCkgLyAyO1xyXG4gICAgY29uc3QgdG9wWSA9IHkgKyB0aGlzLnZlcnRpY2FsTWFyZ2luO1xyXG5cclxuICAgIGNvbnN0IHRvcENvbnRhaW5lciA9IG5ldyBmYWJyaWMuUmVjdCh7XHJcbiAgICAgIGxlZnQ6IHRvcFgsXHJcbiAgICAgIHRvcDogdG9wWSxcclxuICAgICAgd2lkdGg6IHRvcFdpZHRoLFxyXG4gICAgICBoZWlnaHQ6IHRvcEhlaWdodCxcclxuICAgICAgcng6IHJhZGl1cyxcclxuICAgICAgcnk6IHJhZGl1cyxcclxuICAgICAgc3Ryb2tlOiBmaXh0dXJlQ29sb3I/LnByaW1hcnkgPz8gXCIjNTFDMUZGXCIsXHJcbiAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICBmaWxsOiBcIndoaXRlXCIsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBpbm5lckJveEhlaWdodCA9IHRvcEhlaWdodCAvIDI7XHJcbiAgICBjb25zdCBpbm5lclRvcEJveCA9IG5ldyBmYWJyaWMuUGF0aChcclxuICAgICAgYE0gJHt0b3BYICsgcmFkaXVzfSAke3RvcFl9IFxyXG4gICAgICAgICBMICR7dG9wWCArIHRvcFdpZHRoIC0gcmFkaXVzfSAke3RvcFl9IFxyXG4gICAgICAgICBRICR7dG9wWCArIHRvcFdpZHRofSAke3RvcFl9ICR7dG9wWCArIHRvcFdpZHRofSAke3RvcFkgKyByYWRpdXN9IFxyXG4gICAgICAgICBMICR7dG9wWCArIHRvcFdpZHRofSAke3RvcFkgKyBpbm5lckJveEhlaWdodH0gXHJcbiAgICAgICAgIEwgJHt0b3BYfSAke3RvcFkgKyBpbm5lckJveEhlaWdodH0gXHJcbiAgICAgICAgIEwgJHt0b3BYfSAke3RvcFkgKyByYWRpdXN9IFxyXG4gICAgICAgICBRICR7dG9wWH0gJHt0b3BZfSAke3RvcFggKyByYWRpdXN9ICR7dG9wWX0gWmAsXHJcbiAgICAgIHtcclxuICAgICAgICBzdHJva2U6IGZpeHR1cmVDb2xvcj8ucHJpbWFyeSA/PyBcIiM1MUMxRkZcIixcclxuICAgICAgICBzdHJva2VXaWR0aDogMC4yNyxcclxuICAgICAgICBmaWxsOiBcInRyYW5zcGFyZW50XCIsXHJcbiAgICAgIH0sXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHRvcEZpZWxkVGV4dCA9XHJcbiAgICAgIChmaXh0dXJlRGF0YS5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCJcclxuICAgICAgICA/IGBXYWxsLSR7Zml4dHVyZURhdGEuYXNzb2NpYXRlZEVsZW1lbnROdW1iZXJ9IC0gYFxyXG4gICAgICAgIDogXCJGbG9vciAtIFwiKSArXHJcbiAgICAgIGBGaXh0dXJlICR7XHJcbiAgICAgICAgZml4dHVyZURhdGEuYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyXHJcbiAgICAgICAgICA/IGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlciArXHJcbiAgICAgICAgICAgIChmaXh0dXJlRGF0YT8uZml4dHVyZU51bWJlclxyXG4gICAgICAgICAgICAgID8gXCIgLSBGWC1cIiArIGZpeHR1cmVEYXRhLmZpeHR1cmVOdW1iZXJcclxuICAgICAgICAgICAgICA6IFwiXCIpXHJcbiAgICAgICAgICA6IFwibmV3XCJcclxuICAgICAgfWA7XHJcblxyXG4gICAgY29uc3QgdG9wVGV4dCA9IG5ldyBmYWJyaWMuVGV4dGJveCh0b3BGaWVsZFRleHQsIHtcclxuICAgICAgbGVmdDogdG9wWCArIHRvcFdpZHRoIC8gMixcclxuICAgICAgdG9wOiB0b3BZICsgaW5uZXJCb3hIZWlnaHQgLyAyLFxyXG4gICAgICBmb250U2l6ZTogNSxcclxuICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICBmb250V2VpZ2h0OiBcIjUwMFwiLFxyXG4gICAgICBmaWxsOiBcIiMxMDE4MjhcIixcclxuICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgd2lkdGg6IHRvcFdpZHRoLFxyXG4gICAgICBoZWlnaHQ6IGlubmVyQm94SGVpZ2h0LFxyXG4gICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzZWNvbmRCb3hZID0gdG9wWSArIGlubmVyQm94SGVpZ2h0O1xyXG5cclxuICAgIGNvbnN0IGlubmVyQm90dG9tQm94ID0gbmV3IGZhYnJpYy5QYXRoKFxyXG4gICAgICBgTSAke3RvcFh9ICR7c2Vjb25kQm94WX0gXHJcbiAgICAgTCAke3RvcFggKyB0b3BXaWR0aH0gJHtzZWNvbmRCb3hZfSBcclxuICAgICBMICR7dG9wWCArIHRvcFdpZHRofSAke3NlY29uZEJveFkgKyBpbm5lckJveEhlaWdodCAtIHJhZGl1c30gXHJcbiAgICAgUSAke3RvcFggKyB0b3BXaWR0aH0gJHtzZWNvbmRCb3hZICsgaW5uZXJCb3hIZWlnaHR9ICR7XHJcbiAgICAgICB0b3BYICsgdG9wV2lkdGggLSByYWRpdXNcclxuICAgICB9ICR7c2Vjb25kQm94WSArIGlubmVyQm94SGVpZ2h0fSBcclxuICAgICBMICR7dG9wWCArIHJhZGl1c30gJHtzZWNvbmRCb3hZICsgaW5uZXJCb3hIZWlnaHR9IFxyXG4gICAgIFEgJHt0b3BYfSAke3NlY29uZEJveFkgKyBpbm5lckJveEhlaWdodH0gJHt0b3BYfSAke1xyXG4gICAgICAgc2Vjb25kQm94WSArIGlubmVyQm94SGVpZ2h0IC0gcmFkaXVzXHJcbiAgICAgfSBcclxuICAgICBMICR7dG9wWH0gJHtzZWNvbmRCb3hZfSBaYCxcclxuICAgICAge1xyXG4gICAgICAgIGZpbGw6IFwiIzM0NDA1NFwiLFxyXG4gICAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5ID8/IFwiIzUxQzFGRlwiLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgZm9udFNpemUgPSA1O1xyXG4gICAgbGV0IGJvdHRvbVRleHQ7XHJcblxyXG4gICAgY29uc3QgdGV4dENvbnRlbnQgPSBnZXRGaXh0dXJlQ2FudmFzTGFiZWwoZml4dHVyZURhdGEpO1xyXG5cclxuICAgIGNvbnN0IGNyZWF0ZUJvdHRvbVRleHQgPSAoZnM6IGFueSkgPT5cclxuICAgICAgbmV3IGZhYnJpYy5UZXh0Ym94KHRleHRDb250ZW50LCB7XHJcbiAgICAgICAgbGVmdDogdG9wWCArIHRvcFdpZHRoIC8gMixcclxuICAgICAgICB0b3A6IHNlY29uZEJveFkgKyBpbm5lckJveEhlaWdodCAvIDIsXHJcbiAgICAgICAgZm9udFNpemU6IGZzLFxyXG4gICAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgICBmb250V2VpZ2h0OiBcIjUwMFwiLFxyXG4gICAgICAgIGZpbGw6IFwiI0ZGRkZGRlwiLFxyXG4gICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgICAgd2lkdGg6IHRvcFdpZHRoLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICBkbyB7XHJcbiAgICAgIGJvdHRvbVRleHQgPSBjcmVhdGVCb3R0b21UZXh0KGZvbnRTaXplKTtcclxuICAgICAgZm9udFNpemUgLT0gMC41O1xyXG4gICAgfSB3aGlsZSAoYm90dG9tVGV4dC5oZWlnaHQgPiBpbm5lckJveEhlaWdodCAmJiBmb250U2l6ZSA+IDIpO1xyXG5cclxuICAgIGNvbnN0IG1pZFdpZHRoID0gd2lkdGggLyAxLjA1O1xyXG4gICAgY29uc3QgbWlkSGVpZ2h0ID0gKDc3IC8gMTAwKSAqIGhlaWdodDtcclxuICAgIGNvbnN0IG1pZFggPSB4ICsgKHdpZHRoIC0gbWlkV2lkdGgpIC8gMjtcclxuICAgIGNvbnN0IG1pZFkgPSB0b3BZICsgdG9wSGVpZ2h0ICsgdGhpcy52ZXJ0aWNhbE1hcmdpbjtcclxuXHJcbiAgICBjb25zdCBtaWRDb250YWluZXIgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICBsZWZ0OiBtaWRYLFxyXG4gICAgICB0b3A6IG1pZFksXHJcbiAgICAgIHdpZHRoOiBtaWRXaWR0aCxcclxuICAgICAgaGVpZ2h0OiBtaWRIZWlnaHQsXHJcbiAgICAgIHJ4OiByYWRpdXMsXHJcbiAgICAgIHJ5OiByYWRpdXMsXHJcbiAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5ID8/IFwiIzUxQzFGRlwiLFxyXG4gICAgICBzdHJva2VXaWR0aDogMC4yNyxcclxuICAgICAgZmlsbDogXCJ3aGl0ZVwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc2hlbGZDb3VudCA9IGZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnPy5sZW5ndGg7XHJcbiAgICBjb25zdCBib3hIZWlnaHQgPSBtaWRIZWlnaHQgLyAoc2hlbGZDb3VudCArIDIpO1xyXG4gICAgY29uc3QgZmlyc3RCb3hZID0gbWlkWTtcclxuXHJcbiAgICBjb25zdCBmaXJzdEJveCA9IG5ldyBmYWJyaWMuUGF0aChcclxuICAgICAgYE0gJHttaWRYICsgcmFkaXVzfSAke2ZpcnN0Qm94WX0gXHJcbiAgICAgICAgIEwgJHttaWRYICsgbWlkV2lkdGggLSByYWRpdXN9ICR7Zmlyc3RCb3hZfSBcclxuICAgICAgICAgUSAke21pZFggKyBtaWRXaWR0aH0gJHtmaXJzdEJveFl9ICR7bWlkWCArIG1pZFdpZHRofSAke1xyXG4gICAgICAgICAgIGZpcnN0Qm94WSArIHJhZGl1c1xyXG4gICAgICAgICB9IFxyXG4gICAgICAgICBMICR7bWlkWCArIG1pZFdpZHRofSAke2ZpcnN0Qm94WSArIGJveEhlaWdodH0gXHJcbiAgICAgICAgIEwgJHttaWRYfSAke2ZpcnN0Qm94WSArIGJveEhlaWdodH0gXHJcbiAgICAgICAgIEwgJHttaWRYfSAke2ZpcnN0Qm94WSArIHJhZGl1c30gXHJcbiAgICAgICAgIFEgJHttaWRYfSAke2ZpcnN0Qm94WX0gJHttaWRYICsgcmFkaXVzfSAke2ZpcnN0Qm94WX0gWmAsXHJcbiAgICAgIHtcclxuICAgICAgICBmaWxsOiBmaXh0dXJlQ29sb3I/LmZpbGxcclxuICAgICAgICAgID8gZml4dHVyZUNvbG9yPy5maWxsXHJcbiAgICAgICAgICA6IChmaXh0dXJlRGF0YS5oZWFkZXJJbnZhbGlkIHx8IGZpeHR1cmVEYXRhLmxpYnJhcnlJbnZhbGlkKVxyXG4gICAgICAgICAgICA/IFwiI0Q5MkQyMFwiXHJcbiAgICAgICAgICAgIDogXCIjRUFGOEZGXCIsXHJcbiAgICAgICAgc3Ryb2tlOiBmaXh0dXJlQ29sb3I/LnByaW1hcnlcclxuICAgICAgICAgID8gZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICA6IChmaXh0dXJlRGF0YS5oZWFkZXJJbnZhbGlkIHx8IGZpeHR1cmVEYXRhLmxpYnJhcnlJbnZhbGlkKVxyXG4gICAgICAgICAgICA/IFwiI0Q5MkQyMFwiXHJcbiAgICAgICAgICAgIDogXCIjNkJDQUZGXCIsXHJcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDAuMjcsXHJcbiAgICAgIH0sXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGZpcnN0Qm94VGV4dCA9IG5ldyBmYWJyaWMuVGV4dGJveChcclxuICAgICAgYCR7Zml4dHVyZURhdGE/LmhlYWRlcj8ubGFiZWwgPyBmaXh0dXJlRGF0YS5oZWFkZXIubGFiZWwgOiBcIlwifWAsXHJcbiAgICAgIHtcclxuICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLyAyLFxyXG4gICAgICAgIHRvcDogZmlyc3RCb3hZICsgYm94SGVpZ2h0IC8gMixcclxuICAgICAgICBmb250U2l6ZTogNyxcclxuICAgICAgICBmb250RmFtaWx5OiBcIkludGVyXCIsXHJcbiAgICAgICAgZm9udFdlaWdodDogXCI2MDBcIixcclxuICAgICAgICBmaWxsOiAoZml4dHVyZURhdGEuaGVhZGVySW52YWxpZCB8fCBmaXh0dXJlRGF0YS5saWJyYXJ5SW52YWxpZCkgPyBcIiNmZmZcIiA6IFwiIzEwMTgyOFwiLFxyXG4gICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICB3aWR0aDogbWlkV2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiBib3hIZWlnaHQsXHJcbiAgICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBzaGVsdmVzID0gW107XHJcbiAgICBjb25zdCBzaGVsZkhlaWdodCA9IG1pZEhlaWdodCAtIDIgKiBib3hIZWlnaHQ7XHJcblxyXG4gICAgaWYgKGZpeHR1cmVEYXRhLnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgPT09IFwiTDFcIikge1xyXG4gICAgICBjb25zdCBib3hZID0gZmlyc3RCb3hZICsgYm94SGVpZ2h0O1xyXG5cclxuICAgICAgY29uc3Qgc2hlbGYgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICAgIGxlZnQ6IG1pZFgsXHJcbiAgICAgICAgdG9wOiBib3hZLFxyXG4gICAgICAgIHdpZHRoOiBtaWRXaWR0aCxcclxuICAgICAgICBoZWlnaHQ6IHNoZWxmSGVpZ2h0LFxyXG4gICAgICAgIC8vIHN0cm9rZTogJyM1MUMxRkYnLFxyXG4gICAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICA/IGZpeHR1cmVDb2xvcj8ucHJpbWFyeVxyXG4gICAgICAgICAgOiAoZml4dHVyZURhdGEuaGVhZGVySW52YWxpZCB8fCBmaXh0dXJlRGF0YS5saWJyYXJ5SW52YWxpZClcclxuICAgICAgICAgICAgPyBcIiNEOTJEMjBcIlxyXG4gICAgICAgICAgICA6IFwiIzUxQzFGRlwiLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICAgIGZpbGw6IFwid2hpdGVcIixcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCB0ZXh0ID0gZml4dHVyZURhdGE/LnByb2R1Y3RCcmFuZE5hbWU/LmpvaW4oXCIgKyBcIikgfHwgXCJcIjtcclxuXHJcbiAgICAgIC8vIFdyYXAgdGV4dCB3aXRoaW4gZml4dHVyZSB3aWR0aCBhbmQgc2hyaW5rIHRvIGZpdCB2ZXJ0aWNhbCBzcGFjZVxyXG4gICAgICBjb25zdCBtYXhUZXh0V2lkdGggPSBtaWRXaWR0aCAqIDAuOTtcclxuICAgICAgY29uc3QgbWF4VGV4dEhlaWdodCA9IHNoZWxmSGVpZ2h0ICogMC44O1xyXG4gICAgICBsZXQgZm9udFNpemVMMSA9IDY7XHJcblxyXG4gICAgICBjb25zdCBjcmVhdGVXcmFwcGVkVGV4dGJveCA9IChmczogbnVtYmVyKSA9PlxyXG4gICAgICAgIG5ldyBmYWJyaWMuVGV4dGJveCh0ZXh0LCB7XHJcbiAgICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLyAyLFxyXG4gICAgICAgICAgdG9wOiBib3hZICsgc2hlbGZIZWlnaHQgLyAyLFxyXG4gICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICB3aWR0aDogbWF4VGV4dFdpZHRoLFxyXG4gICAgICAgICAgZm9udFNpemU6IGZzLFxyXG4gICAgICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICAgICAgZm9udFdlaWdodDogXCI1MDBcIixcclxuICAgICAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcclxuICAgICAgICAgIGZpbGw6IFwiIzMzM1wiLFxyXG4gICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIGxldCB3cmFwcGVkVGV4dCA9IGNyZWF0ZVdyYXBwZWRUZXh0Ym94KGZvbnRTaXplTDEpO1xyXG4gICAgICB3aGlsZSAod3JhcHBlZFRleHQuaGVpZ2h0ID4gbWF4VGV4dEhlaWdodCAmJiBmb250U2l6ZUwxID4gMikge1xyXG4gICAgICAgIGZvbnRTaXplTDEgLT0gMC41O1xyXG4gICAgICAgIHdyYXBwZWRUZXh0ID0gY3JlYXRlV3JhcHBlZFRleHRib3goZm9udFNpemVMMSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHBhZGRpbmcgPSAyO1xyXG4gICAgICBjb25zdCBiYWNrZ3JvdW5kID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLyAyLFxyXG4gICAgICAgIHRvcDogYm94WSArIHNoZWxmSGVpZ2h0IC8gMixcclxuICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgd2lkdGg6IE1hdGgubWluKG1heFRleHRXaWR0aCwgd3JhcHBlZFRleHQud2lkdGghKSArIHBhZGRpbmcsXHJcbiAgICAgICAgaGVpZ2h0OiB3cmFwcGVkVGV4dC5nZXRTY2FsZWRIZWlnaHQoKSArIDIsXHJcbiAgICAgICAgZmlsbDogXCJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSlcIixcclxuICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICByeDogMSxcclxuICAgICAgICByeTogMSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBzaGVsdmVzLnB1c2goc2hlbGYsIGJhY2tncm91bmQsIHdyYXBwZWRUZXh0KTtcclxuICAgIH0gZWxzZSBpZiAoZml4dHVyZURhdGEucHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gXCJMMlwiKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hlbGZDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgYm94WSA9IGZpcnN0Qm94WSArIGJveEhlaWdodCAqIChpICsgMSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNoZWxmID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgICAgIGxlZnQ6IG1pZFgsXHJcbiAgICAgICAgICB0b3A6IGJveFksXHJcbiAgICAgICAgICB3aWR0aDogbWlkV2lkdGgsXHJcbiAgICAgICAgICBoZWlnaHQ6IGJveEhlaWdodCxcclxuICAgICAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICAgID8gZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICAgIDogKGZpeHR1cmVEYXRhLmhlYWRlckludmFsaWQgfHwgZml4dHVyZURhdGEubGlicmFyeUludmFsaWQpXHJcbiAgICAgICAgICAgICAgPyBcIiNEOTJEMjBcIlxyXG4gICAgICAgICAgICAgIDogXCIjNTFDMUZGXCIsXHJcbiAgICAgICAgICBzdHJva2VXaWR0aDogMC4yNyxcclxuICAgICAgICAgIGZpbGw6IFwid2hpdGVcIixcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc2hlbHZlcy5wdXNoKHNoZWxmKTtcclxuXHJcbiAgICAgICAgaWYgKGZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnPy5baV0uc2hlbGZUeXBlID09PSBcInRyYXlcIikge1xyXG4gICAgICAgICAgY29uc3QgdHJheVJvd3MgPSBmaXh0dXJlRGF0YS5zaGVsZkNvbmZpZz8uW2ldLnRyYXlSb3dzIHx8IDE7XHJcbiAgICAgICAgICBjb25zdCByb3dTcGFjaW5nID0gYm94SGVpZ2h0IC8gdHJheVJvd3M7XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgciA9IDE7IHIgPCB0cmF5Um93czsgcisrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVZID0gYm94WSArIHIgKiByb3dTcGFjaW5nO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdHJheUxpbmUgPSBuZXcgZmFicmljLkxpbmUoXHJcbiAgICAgICAgICAgICAgW21pZFgsIGxpbmVZLCBtaWRYICsgbWlkV2lkdGgsIGxpbmVZXSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzdHJva2U6IFwiIzk5OVwiLFxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDAuMixcclxuICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHNoZWx2ZXMucHVzaCh0cmF5TGluZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0ZXh0ID1cclxuICAgICAgICAgIGZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnPy5baV0ucHJvZHVjdEJyYW5kTmFtZT8uam9pbihcIiArIFwiKSB8fCBcIlwiO1xyXG5cclxuICAgICAgICAvLyBMMjogU2luZ2xlLWxpbmUgZWxsaXBzaXMgYWdhaW5zdCBmdWxsIHNoZWxmIHdpZHRoXHJcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbFBhZGRpbmcgPSA2O1xyXG4gICAgICAgIGNvbnN0IG1heFRleHRXaWR0aCA9IE1hdGgubWF4KDAsIG1pZFdpZHRoIC0gaG9yaXpvbnRhbFBhZGRpbmcpO1xyXG4gICAgICAgIGNvbnN0IG1heFRleHRIZWlnaHQgPSBib3hIZWlnaHQgKiAwLjg7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbnRTaXplID0gNTtcclxuXHJcbiAgICAgICAgY29uc3QgbWVhc3VyZSA9ICh0OiBzdHJpbmcpID0+XHJcbiAgICAgICAgICBuZXcgZmFicmljLlRleHQodCwge1xyXG4gICAgICAgICAgICBmb250U2l6ZTogYmFzZUZvbnRTaXplLFxyXG4gICAgICAgICAgICBmb250RmFtaWx5OiBcIkludGVyXCIsXHJcbiAgICAgICAgICAgIGZvbnRXZWlnaHQ6IFwiNTAwXCIsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IGRpc3BsYXlUZXh0ID0gdGV4dDtcclxuICAgICAgICBsZXQgbWVhc3VyZWQgPSBtZWFzdXJlKGRpc3BsYXlUZXh0KTtcclxuXHJcbiAgICAgICAgaWYgKChtZWFzdXJlZC53aWR0aCA/PyAwKSA+IG1heFRleHRXaWR0aCkge1xyXG4gICAgICAgICAgY29uc3QgZWxsaXBzaXMgPSBcIi4uLlwiO1xyXG4gICAgICAgICAgbGV0IGxlZnRJZHggPSAwO1xyXG4gICAgICAgICAgbGV0IHJpZ2h0SWR4ID0gdGV4dC5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgd2hpbGUgKGxlZnRJZHggPCByaWdodElkeCkge1xyXG4gICAgICAgICAgICBjb25zdCBtaWRJZHggPSBNYXRoLmZsb29yKChsZWZ0SWR4ICsgcmlnaHRJZHgpIC8gMik7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHRleHQuc2xpY2UoMCwgbWlkSWR4KSArIGVsbGlwc2lzO1xyXG4gICAgICAgICAgICBtZWFzdXJlZCA9IG1lYXN1cmUoY2FuZGlkYXRlKTtcclxuICAgICAgICAgICAgaWYgKChtZWFzdXJlZC53aWR0aCA/PyAwKSA+IG1heFRleHRXaWR0aCkge1xyXG4gICAgICAgICAgICAgIHJpZ2h0SWR4ID0gbWlkSWR4O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxlZnRJZHggPSBtaWRJZHggKyAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkaXNwbGF5VGV4dCA9IHRleHQuc2xpY2UoMCwgTWF0aC5tYXgoMCwgbGVmdElkeCAtIDEpKSArIGVsbGlwc2lzO1xyXG4gICAgICAgICAgbWVhc3VyZWQgPSBtZWFzdXJlKGRpc3BsYXlUZXh0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGJhY2tncm91bmQgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICAgICAgbGVmdDogbWlkWCArIG1pZFdpZHRoIC8gMixcclxuICAgICAgICAgIHRvcDogYm94WSArIGJveEhlaWdodCAvIDIsXHJcbiAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICAgIHdpZHRoOiBtaWRXaWR0aCxcclxuICAgICAgICAgIGhlaWdodDogTWF0aC5taW4obWF4VGV4dEhlaWdodCwgbWVhc3VyZWQuaGVpZ2h0ID8/IDEwKSArIDIsXHJcbiAgICAgICAgICBmaWxsOiBcInJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KVwiLFxyXG4gICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgIHJ4OiAxLFxyXG4gICAgICAgICAgcnk6IDEsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZpbmFsVGV4dCA9IG5ldyBmYWJyaWMuVGV4dChkaXNwbGF5VGV4dCwge1xyXG4gICAgICAgICAgbGVmdDogbWlkWCArIG1pZFdpZHRoIC8gMixcclxuICAgICAgICAgIHRvcDogYm94WSArIGJveEhlaWdodCAvIDIsXHJcbiAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICAgIGZvbnRTaXplOiBiYXNlRm9udFNpemUsXHJcbiAgICAgICAgICBmb250RmFtaWx5OiBcIkludGVyXCIsXHJcbiAgICAgICAgICBmb250V2VpZ2h0OiBcIjUwMFwiLFxyXG4gICAgICAgICAgZmlsbDogXCIjMzMzXCIsXHJcbiAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzaGVsdmVzLnB1c2goYmFja2dyb3VuZCwgZmluYWxUZXh0KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChmaXh0dXJlRGF0YS5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSBcIkwzXCIpIHtcclxuICAgICAgY29uc3Qgc2VxdWVudGlhbEdyb3VwczogeyB6b25lOiBzdHJpbmc7IHNoZWx2ZXM6IGFueVtdIH1bXSA9IFtdO1xyXG5cclxuICAgICAgbGV0IHByZXZpb3VzWm9uZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IHNoZWxmIG9mIGZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnKSB7XHJcbiAgICAgICAgY29uc3Qgem9uZSA9IHNoZWxmLnpvbmUgfHwgXCJVbmtub3duXCI7XHJcbiAgICAgICAgaWYgKHpvbmUgIT09IHByZXZpb3VzWm9uZSkge1xyXG4gICAgICAgICAgc2VxdWVudGlhbEdyb3Vwcy5wdXNoKHsgem9uZSwgc2hlbHZlczogW3NoZWxmXSB9KTtcclxuICAgICAgICAgIHByZXZpb3VzWm9uZSA9IHpvbmU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNlcXVlbnRpYWxHcm91cHNbc2VxdWVudGlhbEdyb3Vwcy5sZW5ndGggLSAxXS5zaGVsdmVzLnB1c2goc2hlbGYpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGN1cnJlbnRTaGVsZkluZGV4ID0gMDtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2Ygc2VxdWVudGlhbEdyb3Vwcykge1xyXG4gICAgICAgIGNvbnN0IHsgem9uZSwgc2hlbHZlczogc2hlbHZlc0luR3JvdXAgfSA9IGdyb3VwO1xyXG5cclxuICAgICAgICBjb25zdCBncm91cFN0YXJ0SW5kZXggPSBjdXJyZW50U2hlbGZJbmRleDtcclxuICAgICAgICBjb25zdCBncm91cExlbmd0aCA9IHNoZWx2ZXNJbkdyb3VwLmxlbmd0aDtcclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBUb3BZID0gZmlyc3RCb3hZICsgYm94SGVpZ2h0ICogKGdyb3VwU3RhcnRJbmRleCArIDEpO1xyXG4gICAgICAgIGNvbnN0IGdyb3VwQm90dG9tWSA9IGdyb3VwVG9wWSArIGJveEhlaWdodCAqIGdyb3VwTGVuZ3RoO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNoZWx2ZXNJbkdyb3VwLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICBjb25zdCBzaGVsZkRhdGEgPSBzaGVsdmVzSW5Hcm91cFtqXTtcclxuICAgICAgICAgIGNvbnN0IGJveFkgPSBmaXJzdEJveFkgKyBib3hIZWlnaHQgKiAoY3VycmVudFNoZWxmSW5kZXggKyAxKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzaGVsZlJlY3QgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICAgICAgICBsZWZ0OiBtaWRYLFxyXG4gICAgICAgICAgICB0b3A6IGJveFksXHJcbiAgICAgICAgICAgIHdpZHRoOiBtaWRXaWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBib3hIZWlnaHQsXHJcbiAgICAgICAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICAgICAgPyBmaXh0dXJlQ29sb3I/LnByaW1hcnlcclxuICAgICAgICAgICAgICA6IChmaXh0dXJlRGF0YS5oZWFkZXJJbnZhbGlkIHx8IGZpeHR1cmVEYXRhLmxpYnJhcnlJbnZhbGlkKVxyXG4gICAgICAgICAgICAgICAgPyBcIiNEOTJEMjBcIlxyXG4gICAgICAgICAgICAgICAgOiBcIiM1MUMxRkZcIixcclxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDAuMjcsXHJcbiAgICAgICAgICAgIGZpbGw6IFwid2hpdGVcIixcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHNoZWx2ZXMucHVzaChzaGVsZlJlY3QpO1xyXG5cclxuICAgICAgICAgIGlmIChzaGVsZkRhdGEuc2hlbGZUeXBlID09PSBcInRyYXlcIikge1xyXG4gICAgICAgICAgICBjb25zdCB0cmF5Um93cyA9IHNoZWxmRGF0YS50cmF5Um93cyB8fCAwO1xyXG4gICAgICAgICAgICBjb25zdCBwcm9kdWN0UGVyU2hlbGYgPSBzaGVsZkRhdGEucHJvZHVjdFBlclNoZWxmIHx8IDA7XHJcblxyXG4gICAgICAgICAgICBjb25zdCByb3dTcGFjaW5nID0gYm94SGVpZ2h0IC8gdHJheVJvd3M7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtblNwYWNpbmcgPSBtaWRXaWR0aCAvIHByb2R1Y3RQZXJTaGVsZjtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IHIgPSAxOyByIDwgdHJheVJvd3M7IHIrKykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGxpbmVZID0gYm94WSArIHIgKiByb3dTcGFjaW5nO1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCB0cmF5TGluZSA9IG5ldyBmYWJyaWMuTGluZShcclxuICAgICAgICAgICAgICAgIFttaWRYLCBsaW5lWSwgbWlkWCArIG1pZFdpZHRoLCBsaW5lWV0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZTogXCIjOTk5XCIsXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAwLjIsXHJcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgc2hlbHZlcy5wdXNoKHRyYXlMaW5lKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDE7IGMgPCBwcm9kdWN0UGVyU2hlbGY7IGMrKykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGxpbmVYID0gbWlkWCArIGMgKiBjb2x1bW5TcGFjaW5nO1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbExpbmUgPSBuZXcgZmFicmljLkxpbmUoXHJcbiAgICAgICAgICAgICAgICBbbGluZVgsIGJveFksIGxpbmVYLCBib3hZICsgYm94SGVpZ2h0XSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBcIiM5OTlcIixcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDAuMixcclxuICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICBzaGVsdmVzLnB1c2godmVydGljYWxMaW5lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGN1cnJlbnRTaGVsZkluZGV4Kys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBncm91cEJvdHRvbUxpbmUgPSBuZXcgZmFicmljLkxpbmUoXHJcbiAgICAgICAgICBbbWlkWCwgZ3JvdXBCb3R0b21ZLCBtaWRYICsgbWlkV2lkdGgsIGdyb3VwQm90dG9tWV0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICAgICAgPyBmaXh0dXJlQ29sb3I/LnByaW1hcnlcclxuICAgICAgICAgICAgICA6IChmaXh0dXJlRGF0YS5oZWFkZXJJbnZhbGlkIHx8IGZpeHR1cmVEYXRhLmxpYnJhcnlJbnZhbGlkKVxyXG4gICAgICAgICAgICAgICAgPyBcIiNEOTJEMjBcIlxyXG4gICAgICAgICAgICAgICAgOiBcIiM1MUMxRkZcIixcclxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgc2hlbHZlcy5wdXNoKGdyb3VwQm90dG9tTGluZSk7XHJcblxyXG4gICAgICAgIGlmIChmaXh0dXJlRGF0YS5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICAgIGNvbnN0IGxhYmVsUGFkZGluZyA9IDI7XHJcbiAgICAgICAgICBjb25zdCBsYWJlbFRleHQgPSBuZXcgZmFicmljLlRleHRib3goem9uZSwge1xyXG4gICAgICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLSBsYWJlbFBhZGRpbmcsXHJcbiAgICAgICAgICAgIHRvcDogZ3JvdXBCb3R0b21ZLFxyXG4gICAgICAgICAgICBmb250U2l6ZTogNSxcclxuICAgICAgICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICAgICAgICBmb250V2VpZ2h0OiBcIjYwMFwiLFxyXG4gICAgICAgICAgICBmaWxsOiBcIiM3MDcwNzBcIixcclxuICAgICAgICAgICAgb3JpZ2luWDogXCJyaWdodFwiLFxyXG4gICAgICAgICAgICBvcmlnaW5ZOiBcImJvdHRvbVwiLFxyXG4gICAgICAgICAgICB3aWR0aDogbWlkV2lkdGggLyAyLFxyXG4gICAgICAgICAgICB0ZXh0QWxpZ246IFwicmlnaHRcIixcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHNoZWx2ZXMucHVzaChsYWJlbFRleHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBDZW50ZXJYID0gbWlkWCArIG1pZFdpZHRoIC8gMjtcclxuICAgICAgICBjb25zdCBncm91cENlbnRlclkgPSBncm91cFRvcFkgKyAoZ3JvdXBCb3R0b21ZIC0gZ3JvdXBUb3BZKSAvIDI7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25CcmFuZHMgPSBuZXcgU2V0KCk7XHJcblxyXG4gICAgICAgIHNoZWx2ZXNJbkdyb3VwPy5mb3JFYWNoKChzaGVsZikgPT4ge1xyXG4gICAgICAgICAgc2hlbGYucHJvZHVjdEJyYW5kTmFtZT8uZm9yRWFjaCgoYnJhbmQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBzZWN0aW9uQnJhbmRzLmFkZChicmFuZCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKFsuLi5zZWN0aW9uQnJhbmRzXS5sZW5ndGgpIHtcclxuICAgICAgICAgIGNvbnN0IHRleHQgPSBbLi4uc2VjdGlvbkJyYW5kc10uam9pbihcIiArIFwiKTtcclxuICAgICAgICAgIGNvbnN0IHBhZGRpbmcgPSAyO1xyXG4gICAgICAgICAgY29uc3QgbWF4VGV4dFdpZHRoID0gbWlkV2lkdGg7XHJcbiAgICAgICAgICBjb25zdCByZWN0V2lkdGggPSBtaWRXaWR0aCAqIDAuOTtcclxuICAgICAgICAgIGNvbnN0IG1heFRleHRIZWlnaHQgPSAyMDtcclxuXHJcbiAgICAgICAgICBsZXQgZm9udFNpemUgPSA2O1xyXG4gICAgICAgICAgbGV0IHdyYXBwZWRUZXh0O1xyXG5cclxuICAgICAgICAgIGNvbnN0IGNyZWF0ZVRleHRib3ggPSAoZnM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IGZhYnJpYy5UZXh0Ym94KHRleHQsIHtcclxuICAgICAgICAgICAgICBmb250U2l6ZTogZnMsXHJcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IFwiNDAwXCIsXHJcbiAgICAgICAgICAgICAgd2lkdGg6IG1heFRleHRXaWR0aCxcclxuICAgICAgICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICAgIGZpbGw6IFwiIzEwMTgyOFwiLFxyXG4gICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGxlZnQ6IGdyb3VwQ2VudGVyWCxcclxuICAgICAgICAgICAgICB0b3A6IGdyb3VwQ2VudGVyWSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgd3JhcHBlZFRleHQgPSBjcmVhdGVUZXh0Ym94KGZvbnRTaXplKTtcclxuICAgICAgICAgICAgZm9udFNpemUgLT0gMC41O1xyXG4gICAgICAgICAgfSB3aGlsZSAod3JhcHBlZFRleHQuaGVpZ2h0ID4gbWF4VGV4dEhlaWdodCAmJiBmb250U2l6ZSA+IDIpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHJlY3RIZWlnaHQgPSB3cmFwcGVkVGV4dC5nZXRTY2FsZWRIZWlnaHQoKSArIHBhZGRpbmc7XHJcblxyXG4gICAgICAgICAgY29uc3QgZ3JvdXBDZW50ZXJUZXh0ID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgICAgICAgbGVmdDogZ3JvdXBDZW50ZXJYLFxyXG4gICAgICAgICAgICB0b3A6IGdyb3VwQ2VudGVyWSxcclxuICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgd2lkdGg6IHJlY3RXaWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiByZWN0SGVpZ2h0LFxyXG4gICAgICAgICAgICBmaWxsOiBcInJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KVwiLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJ4OiAxLFxyXG4gICAgICAgICAgICByeTogMSxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHNoZWx2ZXMucHVzaChncm91cENlbnRlclRleHQsIHdyYXBwZWRUZXh0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZml4dHVyZURhdGE/LnZtQ29uZmlnPy5sZW5ndGgpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXh0dXJlRGF0YS52bUNvbmZpZy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHZtID0gZml4dHVyZURhdGEudm1Db25maWdbaV07XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB2bS5zdGFydFlQb3NpdGlvbiAtIDE7XHJcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSB2bS5lbmRZUG9zaXRpb24gLSAxO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBzdGFydEluZGV4ID4gZml4dHVyZURhdGE/LnNoZWxmQ29uZmlnLmxlbmd0aCB8fFxyXG4gICAgICAgICAgZW5kSW5kZXggPiBmaXh0dXJlRGF0YT8uc2hlbGZDb25maWcubGVuZ3RoXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIGNvbnN0IHNoZWxmVG9wWSA9IGZpcnN0Qm94WSArIGJveEhlaWdodCAqIChzdGFydEluZGV4ICsgMSk7XHJcbiAgICAgICAgY29uc3Qgc2hlbGZIZWlnaHRTcGFuID0gYm94SGVpZ2h0ICogKGVuZEluZGV4IC0gc3RhcnRJbmRleCArIDEpO1xyXG5cclxuICAgICAgICBsZXQgdm1IZWlnaHRQeDogbnVtYmVyID0gc2hlbGZIZWlnaHRTcGFuO1xyXG4gICAgICAgIGxldCB5OiBudW1iZXIgPSBzaGVsZlRvcFk7XHJcblxyXG4gICAgICAgIGlmICh2bS55Wm9uZSAmJiB2bS55Wm9uZSAhPT0gXCJzdHJldGNoXCIpIHtcclxuICAgICAgICAgIHZtSGVpZ2h0UHggPSBzaGVsZkhlaWdodFNwYW4gLyAzO1xyXG5cclxuICAgICAgICAgIHN3aXRjaCAodm0ueVpvbmUpIHtcclxuICAgICAgICAgICAgY2FzZSBcInRvcFwiOlxyXG4gICAgICAgICAgICAgIHkgPSBzaGVsZlRvcFk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJtaWRkbGVcIjpcclxuICAgICAgICAgICAgICB5ID0gc2hlbGZUb3BZICsgdm1IZWlnaHRQeDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImJvdHRvbVwiOlxyXG4gICAgICAgICAgICAgIHkgPSBzaGVsZlRvcFkgKyAyICogdm1IZWlnaHRQeDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICB5ID0gc2hlbGZUb3BZO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHggPSBtaWRYO1xyXG4gICAgICAgIGxldCB3aWR0aCA9IG1pZFdpZHRoO1xyXG5cclxuICAgICAgICBpZiAoIXZtLnhab25lIHx8IHZtLnhab25lID09PSBcInN0cmV0Y2hcIikge1xyXG4gICAgICAgICAgd2lkdGggPSBtaWRXaWR0aDtcclxuICAgICAgICAgIHggPSBtaWRYO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBzZWN0aW9uV2lkdGggPSBtaWRXaWR0aCAvIDM7XHJcbiAgICAgICAgICBzd2l0Y2ggKHZtLnhab25lKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XHJcbiAgICAgICAgICAgICAgd2lkdGggPSBzZWN0aW9uV2lkdGg7XHJcbiAgICAgICAgICAgICAgeCA9IG1pZFg7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJtaWRkbGVcIjpcclxuICAgICAgICAgICAgICB3aWR0aCA9IHNlY3Rpb25XaWR0aDtcclxuICAgICAgICAgICAgICB4ID0gbWlkWCArIHNlY3Rpb25XaWR0aDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XHJcbiAgICAgICAgICAgICAgd2lkdGggPSBzZWN0aW9uV2lkdGg7XHJcbiAgICAgICAgICAgICAgeCA9IG1pZFggKyAyICogc2VjdGlvbldpZHRoO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIHdpZHRoID0gbWlkV2lkdGg7XHJcbiAgICAgICAgICAgICAgeCA9IG1pZFg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodm0udm1JbWFnZVVybCkge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3Qgdm1JbWFnZTogYW55ID0gYXdhaXQgZmFicmljLkZhYnJpY0ltYWdlLmZyb21VUkwoXHJcbiAgICAgICAgICAgICAgYCR7dGhpcy5jZG5Vcmx9JHt2bS52bUltYWdlVXJsfT92PSR7RGF0ZS5ub3coKX1gLFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNyb3NzT3JpZ2luOiBcImFub255bW91c1wiLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB2bUltYWdlLnNldCh7XHJcbiAgICAgICAgICAgICAgbGVmdDogeCArIHdpZHRoIC8gMixcclxuICAgICAgICAgICAgICB0b3A6IHkgKyB2bUhlaWdodFB4IC8gMixcclxuICAgICAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgc2NhbGVYOiB3aWR0aCAvIHZtSW1hZ2Uud2lkdGghLFxyXG4gICAgICAgICAgICAgIHNjYWxlWTogdm1IZWlnaHRQeCAvIHZtSW1hZ2UuaGVpZ2h0ISxcclxuICAgICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBzaGVsdmVzLnB1c2godm1JbWFnZSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgbG9hZGluZyBpbWFnZSBmb3IgVk06ICR7dm0udm1JbWFnZVVybH1gLCBlcnIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCB2bUJveCA9IG5ldyBmYWJyaWMuUmVjdCh7XHJcbiAgICAgICAgICAgIGxlZnQ6IHgsXHJcbiAgICAgICAgICAgIHRvcDogeSxcclxuICAgICAgICAgICAgd2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogdm1IZWlnaHRQeCxcclxuICAgICAgICAgICAgZmlsbDogZml4dHVyZUNvbG9yPy52bUZpbGwgPz8gXCIjNjkzOEVGXCIsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGxldCBmb250U2l6ZSA9IDU7XHJcbiAgICAgICAgICBsZXQgdm1UZXh0O1xyXG5cclxuICAgICAgICAgIGNvbnN0IGNyZWF0ZVZtVGV4dCA9IChmczogbnVtYmVyKSA9PlxyXG4gICAgICAgICAgICBuZXcgZmFicmljLlRleHRib3godm0udm1OYW1lIHx8IFwiXCIsIHtcclxuICAgICAgICAgICAgICBsZWZ0OiB4ICsgd2lkdGggLyAyLFxyXG4gICAgICAgICAgICAgIHRvcDogeSArIHZtSGVpZ2h0UHggLyAyLFxyXG4gICAgICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgICBmb250U2l6ZTogZnMsXHJcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IFwiNjAwXCIsXHJcbiAgICAgICAgICAgICAgZmlsbDogXCJ3aGl0ZVwiLFxyXG4gICAgICAgICAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgdm1UZXh0ID0gY3JlYXRlVm1UZXh0KGZvbnRTaXplKTtcclxuICAgICAgICAgICAgZm9udFNpemUgLT0gMC41O1xyXG4gICAgICAgICAgfSB3aGlsZSAodm1UZXh0LmhlaWdodCA+IHZtSGVpZ2h0UHggJiYgZm9udFNpemUgPiAyKTtcclxuXHJcbiAgICAgICAgICBzaGVsdmVzLnB1c2godm1Cb3gsIHZtVGV4dCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbGFzdEJveFkgPSBmaXJzdEJveFkgKyBib3hIZWlnaHQgKiAoc2hlbGZDb3VudCArIDEpO1xyXG4gICAgY29uc3QgbGFzdEJveCA9IG5ldyBmYWJyaWMuUGF0aChcclxuICAgICAgYE0gJHttaWRYfSAke2xhc3RCb3hZfSBcclxuICAgICAgICAgTCAke21pZFggKyBtaWRXaWR0aH0gJHtsYXN0Qm94WX0gXHJcbiAgICAgICAgIEwgJHttaWRYICsgbWlkV2lkdGh9ICR7bGFzdEJveFkgKyBib3hIZWlnaHQgLSByYWRpdXN9IFxyXG4gICAgICAgICBRICR7bWlkWCArIG1pZFdpZHRofSAke2xhc3RCb3hZICsgYm94SGVpZ2h0fSAke1xyXG4gICAgICAgICAgIG1pZFggKyBtaWRXaWR0aCAtIHJhZGl1c1xyXG4gICAgICAgICB9ICR7bGFzdEJveFkgKyBib3hIZWlnaHR9IFxyXG4gICAgICAgICBMICR7bWlkWCArIHJhZGl1c30gJHtsYXN0Qm94WSArIGJveEhlaWdodH0gXHJcbiAgICAgICAgIFEgJHttaWRYfSAke2xhc3RCb3hZICsgYm94SGVpZ2h0fSAke21pZFh9ICR7XHJcbiAgICAgICAgICAgbGFzdEJveFkgKyBib3hIZWlnaHQgLSByYWRpdXNcclxuICAgICAgICAgfSBcclxuICAgICAgICAgTCAke21pZFh9ICR7bGFzdEJveFl9IFpgLFxyXG4gICAgICB7XHJcbiAgICAgICAgZmlsbDogZml4dHVyZUNvbG9yPy5maWxsXHJcbiAgICAgICAgICA/IGZpeHR1cmVDb2xvcj8uZmlsbFxyXG4gICAgICAgICAgOiAoZml4dHVyZURhdGEuaGVhZGVySW52YWxpZCB8fCBmaXh0dXJlRGF0YS5saWJyYXJ5SW52YWxpZClcclxuICAgICAgICAgICAgPyBcIiNGRUU0RTJcIlxyXG4gICAgICAgICAgICA6IFwiI0VBRjhGRlwiLFxyXG4gICAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICA/IGZpeHR1cmVDb2xvcj8ucHJpbWFyeVxyXG4gICAgICAgICAgOiAoZml4dHVyZURhdGEuaGVhZGVySW52YWxpZCB8fCBmaXh0dXJlRGF0YS5saWJyYXJ5SW52YWxpZClcclxuICAgICAgICAgICAgPyBcIiNEOTJEMjBcIlxyXG4gICAgICAgICAgICA6IFwiIzZCQ0FGRlwiLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBsYXN0Qm94VGV4dCA9IG5ldyBmYWJyaWMuVGV4dGJveChcclxuICAgICAgYCR7Zml4dHVyZURhdGE/LmZvb3Rlcj8ubGFiZWwgPyBmaXh0dXJlRGF0YS5mb290ZXIubGFiZWwgOiBcIlwifWAsXHJcbiAgICAgIHtcclxuICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLyAyLFxyXG4gICAgICAgIHRvcDogbGFzdEJveFkgKyBib3hIZWlnaHQgLyAyLFxyXG4gICAgICAgIGZvbnRTaXplOiA1LFxyXG4gICAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgICBmb250V2VpZ2h0OiBcIjYwMFwiLFxyXG4gICAgICAgIGZpbGw6IFwiIzEwMTgyOFwiLFxyXG4gICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgICAgd2lkdGg6IG1pZFdpZHRoLFxyXG4gICAgICAgIGhlaWd0aDogYm94SGVpZ2h0LFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBib3R0b21XaWR0aCA9IHdpZHRoIC8gMS4wNTtcclxuICAgIGNvbnN0IGJvdHRvbUhlaWdodCA9ICgzIC8gMTAwKSAqIGhlaWdodDtcclxuICAgIGNvbnN0IGJvdHRvbVggPSB4ICsgKHdpZHRoIC0gYm90dG9tV2lkdGgpIC8gMjtcclxuICAgIGNvbnN0IGJvdHRvbVkgPSBtaWRZICsgbWlkSGVpZ2h0ICsgdGhpcy52ZXJ0aWNhbE1hcmdpbjtcclxuXHJcbiAgICBjb25zdCBib3R0b21Db250YWluZXIgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICBsZWZ0OiBib3R0b21YLFxyXG4gICAgICB0b3A6IGJvdHRvbVksXHJcbiAgICAgIHdpZHRoOiBib3R0b21XaWR0aCxcclxuICAgICAgaGVpZ2h0OiBib3R0b21IZWlnaHQsXHJcbiAgICAgIHJ4OiByYWRpdXMsXHJcbiAgICAgIHJ5OiByYWRpdXMsXHJcbiAgICAgIHN0cm9rZTogXCJ0cmFuc3BhcmVudFwiLFxyXG4gICAgICBmaWxsOiBcInRyYW5zcGFyZW50XCIsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBib3R0b21UZXh0Q29udGVudCA9IG5ldyBmYWJyaWMuVGV4dGJveChcclxuICAgICAgYFNoZWx2ZXMgLSAke2FjdHVhbFNoZWx2ZXMubGVuZ3RofSAuIFByb2R1Y3RzIC0gICR7XHJcbiAgICAgICAgZml4dHVyZURhdGE/LmZpeHR1cmVDYXBhY2l0eSA/PyAwXHJcbiAgICAgIH0gLiBWTSAtICR7Zml4dHVyZURhdGE/LnZtQ29uZmlnPy5sZW5ndGggPz8gMH1gLFxyXG4gICAgICB7XHJcbiAgICAgICAgbGVmdDogYm90dG9tWCArIGJvdHRvbVdpZHRoIC8gMixcclxuICAgICAgICB0b3A6IGJvdHRvbVkgKyBib3R0b21IZWlnaHQgLyAyLFxyXG4gICAgICAgIGZvbnRTaXplOiA1LFxyXG4gICAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgICBmb250V2VpZ2h0OiBcIjUwMFwiLFxyXG4gICAgICAgIGZpbGw6IFwiIzMzM1wiLFxyXG4gICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgICAgd2lkdGg6IGJvdHRvbVdpZHRoLFxyXG4gICAgICAgIGhlaWdodDogYm90dG9tSGVpZ2h0LFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBzdmdTdHJpbmcgPSBgXHJcbiAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgIDxyZWN0IHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHJ4PVwiMTJcIiBmaWxsPVwid2hpdGVcIi8+XHJcbiAgICAgICA8cGF0aCBkPVwiTTE0Ljk5OTggNi42MDAwMUMxNS4xNTc0IDYuNDQyNDMgMTUuMzQ0NSA2LjMxNzQyIDE1LjU1MDQgNi4yMzIxNEMxNS43NTYzIDYuMTQ2ODUgMTUuOTc3IDYuMTAyOTYgMTYuMTk5OCA2LjEwMjk2QzE2LjQyMjcgNi4xMDI5NiAxNi42NDM0IDYuMTQ2ODUgMTYuODQ5MiA2LjIzMjE0QzE3LjA1NTEgNi4zMTc0MiAxNy4yNDIyIDYuNDQyNDMgMTcuMzk5OCA2LjYwMDAxQzE3LjU1NzQgNi43NTc2IDE3LjY4MjQgNi45NDQ2OCAxNy43Njc3IDcuMTUwNThDMTcuODUzIDcuMzU2NDggMTcuODk2OSA3LjU3NzE1IDE3Ljg5NjkgNy44MDAwMUMxNy44OTY5IDguMDIyODggMTcuODUzIDguMjQzNTUgMTcuNzY3NyA4LjQ0OTQ1QzE3LjY4MjQgOC42NTUzNSAxNy41NTc0IDguODQyNDMgMTcuMzk5OCA5LjAwMDAxTDkuMjk5ODIgMTcuMUw1Ljk5OTgyIDE4TDYuODk5ODIgMTQuN0wxNC45OTk4IDYuNjAwMDFaXCIgc3Ryb2tlPVwiIzFEMjkzOVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgIDwvc3ZnPmA7XHJcblxyXG4gICAgbGV0IGxvYWRlZFNWRzogYW55ID0gYXdhaXQgZmFicmljLmxvYWRTVkdGcm9tU3RyaW5nKHN2Z1N0cmluZyk7XHJcblxyXG4gICAgbGV0IGVkaXRTdmcgPSBmYWJyaWMudXRpbC5ncm91cFNWR0VsZW1lbnRzKFxyXG4gICAgICBsb2FkZWRTVkcub2JqZWN0cyxcclxuICAgICAgbG9hZGVkU1ZHLm9wdGlvbnMsXHJcbiAgICApO1xyXG5cclxuICAgIGVkaXRTdmcuc2V0KHtcclxuICAgICAgc2NhbGVYOiAxLFxyXG4gICAgICBzY2FsZVk6IDEsXHJcbiAgICAgIGxlZnQ6IHggKyB3aWR0aCAtIDMwLFxyXG4gICAgICB0b3A6IHkgKyAxNCxcclxuICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICBldmVudGVkOiB0cnVlLCAvLyBhbGxvdyBldmVudHNcclxuICAgICAgaG92ZXJDdXJzb3I6IFwicG9pbnRlclwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgZWRpdFN2Zy5vbihcIm1vdXNlZG93blwiLCAob3B0KSA9PiB7XHJcbiAgICAgIGlmIChvcHQgJiYgb3B0LmUgJiYgb3B0LmUuc3RvcFByb3BhZ2F0aW9uKSB7XHJcbiAgICAgICAgb3B0LmUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKHRoaXMuaGFzVW5zYXZlZExheW91dENoYW5nZXMoKSkge1xyXG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICBcIlNhdmUgeW91ciBsYXlvdXQgY2hhbmdlcyBiZWZvcmUgZWRpdGluZyB0aGUgZml4dHVyZVwiLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZSA9IHtcclxuICAgICAgICBmaXh0dXJlVHlwZTogZml4dHVyZURhdGEuZml4dHVyZVR5cGUsXHJcbiAgICAgICAgd2FsbEluZGV4OiBmaXh0dXJlRGF0YS5hc3NvY2lhdGVkRWxlbWVudE51bWJlcixcclxuICAgICAgICBmaXh0dXJlSW5kZXg6IGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcixcclxuICAgICAgICBmaXh0dXJlSWQ6IGZpeHR1cmVEYXRhLl9pZCxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkRml4dHVyZS5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICBjb25zdCB3YWxsID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5maW5kKFxyXG4gICAgICAgICAgKHdhbGw6IGFueSkgPT4gd2FsbC5lbGVtZW50TnVtYmVyID09PSB0aGlzLnNlbGVjdGVkRml4dHVyZS53YWxsSW5kZXgsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgZml4dHVyZSA9IHdhbGwuZml4dHVyZXMuZmluZChcclxuICAgICAgICAgIChmaXh0dXJlOiBhbnkpID0+IGZpeHR1cmUuX2lkID09PSB0aGlzLnNlbGVjdGVkRml4dHVyZS5maXh0dXJlSWQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEgPSBmaXh0dXJlO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRGaXh0dXJlLmZpeHR1cmVUeXBlID09PSBcImZsb29yXCIpIHtcclxuICAgICAgICBjb25zdCBmaXh0dXJlID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZS5maW5kKFxyXG4gICAgICAgICAgKGZpeHR1cmU6IGFueSkgPT4gZml4dHVyZS5faWQgPT09IHRoaXMuc2VsZWN0ZWRGaXh0dXJlLmZpeHR1cmVJZCxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YSA9IGZpeHR1cmU7XHJcbiAgICAgIH1cclxuICAgICAgZGVsZXRlIHRoaXM/LnNlbGVjdGVkRml4dHVyZURhdGE/LnRhc2tUeXBlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZS5maXh0dXJlRGF0YSA9IHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YTtcclxuICAgICAgdGhpcy5lZGl0Rml4dHVyZSA9IHRydWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBmaXh0dXJlR3JvdXAgPSBuZXcgZmFicmljLkdyb3VwKFxyXG4gICAgICBbXHJcbiAgICAgICAgbWFpbkNvbnRhaW5lcixcclxuICAgICAgICB0b3BDb250YWluZXIsXHJcbiAgICAgICAgaW5uZXJUb3BCb3gsXHJcbiAgICAgICAgdG9wVGV4dCxcclxuICAgICAgICBpbm5lckJvdHRvbUJveCxcclxuICAgICAgICBib3R0b21UZXh0LFxyXG4gICAgICAgIG1pZENvbnRhaW5lcixcclxuICAgICAgICBmaXJzdEJveCxcclxuICAgICAgICBmaXJzdEJveFRleHQsXHJcbiAgICAgICAgLi4uc2hlbHZlcyxcclxuICAgICAgICBsYXN0Qm94LFxyXG4gICAgICAgIGxhc3RCb3hUZXh0LFxyXG4gICAgICAgIGJvdHRvbUNvbnRhaW5lcixcclxuICAgICAgICBib3R0b21UZXh0Q29udGVudCxcclxuICAgICAgICBlZGl0U3ZnLFxyXG4gICAgICBdLFxyXG4gICAgICB7XHJcbiAgICAgICAgbGVmdDogcmVuZGVyWCxcclxuICAgICAgICB0b3A6IHJlbmRlclksXHJcbiAgICAgICAgZXZlbnRlZDogdHJ1ZSxcclxuICAgICAgICBob3ZlckN1cnNvcjogXCJwb2ludGVyXCIsXHJcbiAgICAgICAgc2VsZWN0YWJsZTogdGhpcy5sYXlvdXRGb3JtLmVuYWJsZWQsXHJcbiAgICAgICAgbG9ja1NjYWxpbmdYOiB0cnVlLFxyXG4gICAgICAgIGxvY2tTY2FsaW5nWTogdHJ1ZSxcclxuICAgICAgICBzdWJUYXJnZXRDaGVjazogdHJ1ZSxcclxuICAgICAgICBhbmdsZTogcmVuZGVyQW5nbGUsXHJcbiAgICAgIH0sXHJcbiAgICApIGFzIGZhYnJpYy5Hcm91cCAmIHtcclxuICAgICAgd2FsbEluZGV4OiBudW1iZXI7XHJcbiAgICAgIGZpeHR1cmVJbmRleDogbnVtYmVyO1xyXG4gICAgICBmaXh0dXJlSWQ6IHN0cmluZztcclxuICAgICAgZml4dHVyZVR5cGU6IFwid2FsbFwiIHwgXCJmbG9vclwiO1xyXG4gICAgICBpc3N1ZTogYm9vbGVhbjtcclxuICAgICAgaXNzdWVEYXRhOiBhbnk7XHJcbiAgICAgIHRhc2tUeXBlOiBzdHJpbmc7XHJcbiAgICAgIHZtQ29uZmlnOiBbXTtcclxuICAgICAgb2JqVHlwZTogc3RyaW5nO1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgICFmaXh0dXJlRGF0YT8uaXNzdWUgJiZcclxuICAgICAgIWZpeHR1cmVEYXRhPy51bnNhdmVkQ2hhbmdlcyAmJlxyXG4gICAgICB0aGlzLmxheW91dEZvcm0uZW5hYmxlZFxyXG4gICAgKSB7XHJcbiAgICAgIGZpeHR1cmVHcm91cC5vbihcIm1vdXNlb3ZlclwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZWRpdFN2Zy5zZXQoXCJ2aXNpYmxlXCIsIHRydWUpO1xyXG4gICAgICAgIGNhbnZhcy5yZW5kZXJBbGwoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGZpeHR1cmVHcm91cC5vbihcIm1vdXNlb3V0XCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBlZGl0U3ZnLnNldChcInZpc2libGVcIiwgZmFsc2UpO1xyXG4gICAgICAgIGNhbnZhcy5yZW5kZXJBbGwoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZml4dHVyZUdyb3VwLm9uKFwibW91c2Vkb3duXCIsIChldmVudDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcclxuICAgICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlZCkge1xyXG4gICAgICAgIHRoaXMudG9nZ2xlUGFuZWwoXCJyaWdodFwiLCBmYWxzZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRGaXh0dXJlSW5BY2NvcmRpb24oZml4dHVyZURhdGEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmhpZ2hsaWdodEZpeHR1cmUodGFyZ2V0KTtcclxuICAgICAgdGhpcy5zZWxlY3RGaXh0dXJlT25DYW52YXNDbGljayh0YXJnZXQsIHRydWUpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEgPSBmaXh0dXJlRGF0YTtcclxuICAgIH0pO1xyXG5cclxuICAgIGZpeHR1cmVHcm91cC5maXh0dXJlVHlwZSA9IGZpeHR1cmVEYXRhLmZpeHR1cmVUeXBlO1xyXG4gICAgZml4dHVyZUdyb3VwLndhbGxJbmRleCA9IGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50TnVtYmVyO1xyXG4gICAgZml4dHVyZUdyb3VwLmZpeHR1cmVJbmRleCA9IGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcjtcclxuICAgIGZpeHR1cmVHcm91cC5maXh0dXJlSWQgPSBmaXh0dXJlRGF0YS5faWQ7XHJcbiAgICBmaXh0dXJlR3JvdXAuaXNzdWUgPSBmaXh0dXJlRGF0YS5pc3N1ZTtcclxuICAgIGZpeHR1cmVHcm91cC5pc3N1ZURhdGEgPSBmaXh0dXJlRGF0YS5pc3N1ZURhdGE7XHJcbiAgICBmaXh0dXJlR3JvdXAudGFza1R5cGUgPSBmaXh0dXJlRGF0YS50YXNrVHlwZTtcclxuICAgIGZpeHR1cmVHcm91cC52bUNvbmZpZyA9IGZpeHR1cmVEYXRhLnZtQ29uZmlnO1xyXG4gICAgZml4dHVyZUdyb3VwLm9ialR5cGUgPSBcImZpeHR1cmVcIjtcclxuXHJcbiAgICAvLyB0aGlzLmNhbnZhcy5vbihcIm9iamVjdDptb3ZpbmdcIiwgKGUpID0+IHtcclxuICAgIC8vICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgYW55O1xyXG4gICAgLy8gICBpZiAoIXRhcmdldCB8fCB0YXJnZXQub2JqVHlwZSAhPT0gXCJmaXh0dXJlXCIpIHJldHVybjtcclxuXHJcbiAgICAvLyAgIGNvbnN0IGFuZ2xlRGVnID0gdGFyZ2V0LmFuZ2xlIHx8IDA7XHJcbiAgICAvLyAgIGNvbnN0IGFuZ2xlID0gKGFuZ2xlRGVnICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICAvLyAgIGlmICghdGFyZ2V0Ll9sYXN0TGVmdCkge1xyXG4gICAgLy8gICAgIHRhcmdldC5fbGFzdExlZnQgPSB0YXJnZXQubGVmdDtcclxuICAgIC8vICAgICB0YXJnZXQuX2xhc3RUb3AgPSB0YXJnZXQudG9wO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIGNvbnN0IGR4ID0gdGFyZ2V0LmxlZnQgLSB0YXJnZXQuX2xhc3RMZWZ0O1xyXG4gICAgLy8gICBjb25zdCBkeSA9IHRhcmdldC50b3AgLSB0YXJnZXQuX2xhc3RUb3A7XHJcbiAgICAvLyAgIGNvbnN0IHByb2plY3RlZCA9IGR4ICogTWF0aC5jb3MoYW5nbGUpICsgZHkgKiBNYXRoLnNpbihhbmdsZSk7XHJcbiAgICAvLyAgIHRhcmdldC5sZWZ0ID0gdGFyZ2V0Ll9sYXN0TGVmdCArIHByb2plY3RlZCAqIE1hdGguY29zKGFuZ2xlKTtcclxuICAgIC8vICAgdGFyZ2V0LnRvcCA9IHRhcmdldC5fbGFzdFRvcCArIHByb2plY3RlZCAqIE1hdGguc2luKGFuZ2xlKTtcclxuICAgIC8vICAgdGFyZ2V0Ll9sYXN0TGVmdCA9IHRhcmdldC5sZWZ0O1xyXG4gICAgLy8gICB0YXJnZXQuX2xhc3RUb3AgPSB0YXJnZXQudG9wO1xyXG4gICAgLy8gfSk7XHJcblxyXG4gICAgY2FudmFzLmFkZChmaXh0dXJlR3JvdXApO1xyXG5cclxuICAgIC8vIElmIG5ld2x5IGFkZGVkLCBmb2N1cyBpdCBvbmNlXHJcbiAgICBpZiAoKGZpeHR1cmVEYXRhIGFzIGFueSk/Lm5ld0FkZGVkKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5jYW52YXMuc2V0QWN0aXZlT2JqZWN0KGZpeHR1cmVHcm91cCk7XHJcbiAgICAgICAgdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gICAgICB9IGNhdGNoIHt9XHJcbiAgICAgIGRlbGV0ZSAoZml4dHVyZURhdGEgYXMgYW55KS5uZXdBZGRlZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZml4dHVyZUdyb3VwO1xyXG4gIH1cclxuXHJcbiAgZHJhd0VudHJhbmNlKFxyXG4gICAgY2FudmFzOiBmYWJyaWMuQ2FudmFzLFxyXG4gICAgeDogbnVtYmVyLFxyXG4gICAgeTogbnVtYmVyLFxyXG4gICAgd2lkdGg6IG51bWJlcixcclxuICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgYXJyb3dXaWR0aDogbnVtYmVyLFxyXG4gICAgZWxlbWVudERhdGE6IGFueSxcclxuICApIHtcclxuICAgIGNvbnN0IGJvZHlXaWR0aCA9IHdpZHRoIC0gYXJyb3dXaWR0aDtcclxuICAgIGNvbnN0IGFuZ2xlID0gZWxlbWVudERhdGEuYW5nbGU7XHJcblxyXG4gICAgY29uc3QgcGF0aERhdGEgPSBbXHJcbiAgICAgIGBNIDAgMGAsXHJcbiAgICAgIGBMICR7Ym9keVdpZHRofSAwYCxcclxuICAgICAgYEwgJHtib2R5V2lkdGh9ICR7LWhlaWdodCAvIDJ9YCxcclxuICAgICAgYEwgJHt3aWR0aH0gJHtoZWlnaHQgLyAyfWAsXHJcbiAgICAgIGBMICR7Ym9keVdpZHRofSAke2hlaWdodCArIGhlaWdodCAvIDJ9YCxcclxuICAgICAgYEwgJHtib2R5V2lkdGh9ICR7aGVpZ2h0fWAsXHJcbiAgICAgIGBMIDAgJHtoZWlnaHR9YCxcclxuICAgICAgYFpgLFxyXG4gICAgXS5qb2luKFwiIFwiKTtcclxuXHJcbiAgICBjb25zdCBhcnJvdyA9IG5ldyBmYWJyaWMuUGF0aChwYXRoRGF0YSwge1xyXG4gICAgICBmaWxsOiBcIiMwM0E5RjRcIixcclxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgbWF4VGV4dEhlaWdodCA9IGhlaWdodCAtIDY7XHJcbiAgICBjb25zdCB0ZXh0ID0gbmV3IGZhYnJpYy5UZXh0KFwiRW50cmFuY2VcIiwge1xyXG4gICAgICBmb250RmFtaWx5OiBcIkFyaWFsXCIsXHJcbiAgICAgIGZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxyXG4gICAgICBmaWxsOiBcIndoaXRlXCIsXHJcbiAgICAgIGFuZ2xlOiAtOTAsXHJcbiAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgIGxlZnQ6IDE1LFxyXG4gICAgICB0b3A6IGhlaWdodCAvIDIsXHJcbiAgICAgIGZvbnRTaXplOiAyMCxcclxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgdGV4dEJvdW5kcyA9IHRleHQuZ2V0Qm91bmRpbmdSZWN0KCk7XHJcbiAgICBpZiAodGV4dEJvdW5kcy5oZWlnaHQgPiBtYXhUZXh0SGVpZ2h0KSB7XHJcbiAgICAgIGNvbnN0IHNjYWxlID0gbWF4VGV4dEhlaWdodCAvIHRleHRCb3VuZHMuaGVpZ2h0O1xyXG4gICAgICB0ZXh0LnNldChcImZvbnRTaXplXCIsIHRleHQuZm9udFNpemUhICogc2NhbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdyb3VwID0gbmV3IGZhYnJpYy5Hcm91cChbYXJyb3csIHRleHRdLCB7XHJcbiAgICAgIGxlZnQ6IHgsXHJcbiAgICAgIHRvcDogeSxcclxuICAgICAgc2VsZWN0YWJsZTogdGhpcy5sYXlvdXRGb3JtLmVuYWJsZWQsXHJcbiAgICAgIGxvY2tTY2FsaW5nWDogdHJ1ZSxcclxuICAgICAgbG9ja1NjYWxpbmdZOiB0cnVlLFxyXG4gICAgICBsb2NrU2NhbGluZ0ZsaXA6IHRydWUsXHJcbiAgICAgIGFuZ2xlOiBhbmdsZSxcclxuICAgIH0pIGFzIGZhYnJpYy5Hcm91cCAmIHtcclxuICAgICAgb2JqVHlwZTogc3RyaW5nO1xyXG4gICAgICBkYXRhOiBhbnk7XHJcbiAgICB9O1xyXG5cclxuICAgIGdyb3VwLm9ialR5cGUgPSBlbGVtZW50RGF0YS5lbGVtZW50VHlwZTtcclxuICAgIGdyb3VwLmRhdGEgPSBlbGVtZW50RGF0YTtcclxuXHJcbiAgICBjYW52YXMuYWRkKGdyb3VwKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5kcmF3RW50cmFuY2VEaXNzZWN0aW9uTGluZShjYW52YXMsIGdyb3VwLCB3aWR0aCwgaGVpZ2h0LCBhbmdsZSk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIGRyYXdPdGhlckVsZW1lbnRzV2l0aExhYmVsKFxyXG4gICAgY2FudmFzOiBmYWJyaWMuQ2FudmFzLFxyXG4gICAgeDogbnVtYmVyLFxyXG4gICAgeTogbnVtYmVyLFxyXG4gICAgYTogbnVtYmVyLFxyXG4gICAgd2lkdGg6IG51bWJlcixcclxuICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgZWxlbWVudDogYW55LFxyXG4gICk6IGZhYnJpYy5Hcm91cCB7XHJcbiAgICBjb25zdCByZWN0ID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgd2lkdGgsXHJcbiAgICAgIGhlaWdodCxcclxuICAgICAgcng6IDIsXHJcbiAgICAgIHJ5OiAyLFxyXG4gICAgICBmaWxsOiBcIiNEQUYxRkZcIixcclxuICAgICAgc3Ryb2tlOiBcIiM2QkNBRkZcIixcclxuICAgICAgc3Ryb2tlV2lkdGg6IDIsXHJcbiAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0ZXh0ID0gbmV3IGZhYnJpYy5UZXh0Ym94KGVsZW1lbnQuZml4dHVyZU5hbWUsIHtcclxuICAgICAgd2lkdGg6IHdpZHRoIC0gOCxcclxuICAgICAgZm9udFNpemU6IDE0LFxyXG4gICAgICBmb250RmFtaWx5OiBcIkludGVyXCIsXHJcbiAgICAgIGZvbnRXZWlnaHQ6IFwiNTAwXCIsXHJcbiAgICAgIGZpbGw6IFwiIzEwMTgyOFwiLFxyXG4gICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgIGVkaXRhYmxlOiBmYWxzZSxcclxuICAgICAgc3BsaXRCeUdyYXBoZW1lOiB0cnVlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgdGV4dEJvdW5kcyA9IHRleHQuZ2V0Qm91bmRpbmdSZWN0KCk7XHJcblxyXG4gICAgaWYgKHRleHRCb3VuZHMuaGVpZ2h0ID4gaGVpZ2h0IC0gOCkge1xyXG4gICAgICBjb25zdCBzY2FsZSA9IChoZWlnaHQgLSA4KSAvIHRleHRCb3VuZHMuaGVpZ2h0O1xyXG4gICAgICB0ZXh0LnNldChcImZvbnRTaXplXCIsIHRleHQuZm9udFNpemUhICogc2NhbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdyb3VwID0gbmV3IGZhYnJpYy5Hcm91cChbcmVjdCwgdGV4dF0sIHtcclxuICAgICAgbGVmdDogeCxcclxuICAgICAgdG9wOiB5LFxyXG4gICAgICBhbmdsZTogYSxcclxuICAgICAgc2VsZWN0YWJsZTogdGhpcy5sYXlvdXRGb3JtLmVuYWJsZWQsXHJcbiAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICB9KSBhcyBmYWJyaWMuR3JvdXAgJiB7XHJcbiAgICAgIG9ialR5cGU6IHN0cmluZztcclxuICAgICAgZGF0YTogYW55O1xyXG4gICAgfTtcclxuXHJcbiAgICBncm91cC5vYmpUeXBlID0gXCJvdGhlcnNcIjtcclxuICAgIGdyb3VwLmRhdGEgPSBlbGVtZW50O1xyXG5cclxuICAgIGNhbnZhcy5hZGQoZ3JvdXApO1xyXG5cclxuICAgIGlmICgoZWxlbWVudCBhcyBhbnkpPy5uZXdBZGRlZCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuY2FudmFzLnNldEFjdGl2ZU9iamVjdChncm91cCk7XHJcbiAgICAgICAgdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gICAgICB9IGNhdGNoIHt9XHJcbiAgICAgIGRlbGV0ZSAoZWxlbWVudCBhcyBhbnkpLm5ld0FkZGVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBncm91cDtcclxuICB9XHJcblxyXG4gIGRyYXdCZygpIHtcclxuICAgIGNvbnN0IHdhbGwxID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5maW5kKFxyXG4gICAgICAoZTogYW55KSA9PiBlLmVsZW1lbnROdW1iZXIgPT09IDEgJiYgZS5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIsXHJcbiAgICApO1xyXG4gICAgY29uc3Qgd2FsbDIgPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZpbmQoXHJcbiAgICAgIChlOiBhbnkpID0+IGUuZWxlbWVudE51bWJlciA9PT0gMiAmJiBlLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIixcclxuICAgICk7XHJcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMudG9QaXhlbHMod2FsbDEuZGlzdGFuY2UsIHdhbGwxLnVuaXQpO1xyXG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy50b1BpeGVscyh3YWxsMi5kaXN0YW5jZSwgd2FsbDIudW5pdCk7XHJcblxyXG4gICAgY29uc3QgYmcgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICBsZWZ0OiB0aGlzLndhbGxUaGlja25lc3MsXHJcbiAgICAgIHRvcDogdGhpcy53YWxsVGhpY2tuZXNzLFxyXG4gICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICBmaWxsOiBcIiNlYWVjZjBcIixcclxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYW52YXMuYWRkKGJnKTtcclxuICAgIHRoaXMuY2FudmFzLnJlbW92ZShiZyk7XHJcbiAgICB0aGlzLmNhbnZhcy5pbnNlcnRBdCgwLCBiZyk7XHJcbiAgICB0aGlzLmNhbnZhcy5yZW5kZXJBbGwoKTtcclxuICB9XHJcblxyXG4gIHN1YnNjcmliZVRvRml4dHVyZUNvbmZpZ0lkQ2hhbmdlcygpIHtcclxuICAgIHRoaXMuZml4dHVyZUNvbmZpZ1N1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3ViKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XHJcbiAgICB0aGlzLmZpeHR1cmVDb25maWdTdWJzY3JpcHRpb25zID0gW107XHJcblxyXG4gICAgdGhpcy5nZXRGb3JtV2FsbHMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCwgaSkgPT4ge1xyXG4gICAgICBjb25zdCB3YWxsR3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcclxuICAgICAgY29uc3QgZml4dHVyZXNBcnJheSA9IHdhbGxHcm91cC5nZXQoXCJmaXh0dXJlc1wiKSBhcyBGb3JtQXJyYXk7XHJcblxyXG4gICAgICBmaXh0dXJlc0FycmF5LmNvbnRyb2xzLmZvckVhY2goKGZpeHR1cmVDb250cm9sLCBqKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZml4dHVyZUdyb3VwID0gZml4dHVyZUNvbnRyb2wgYXMgRm9ybUdyb3VwO1xyXG4gICAgICAgIGNvbnN0IHN1YiA9IGZpeHR1cmVHcm91cFxyXG4gICAgICAgICAgLmdldChcImZpeHR1cmVDb25maWdJZFwiKVxyXG4gICAgICAgICAgPy52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChuZXdWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZUZpeHR1cmVUZW1wbGF0ZShuZXdWYWx1ZSwgXCJ3YWxsXCIsIGosIGkpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChzdWIpIHRoaXMuZml4dHVyZUNvbmZpZ1N1YnNjcmlwdGlvbnMucHVzaChzdWIpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZ2V0Rm9ybUZsb29yRml4dHVyZXMuY29udHJvbHMuZm9yRWFjaCgoZml4dHVyZUNvbnRyb2wsIGspID0+IHtcclxuICAgICAgY29uc3QgZml4dHVyZUdyb3VwID0gZml4dHVyZUNvbnRyb2wgYXMgRm9ybUdyb3VwO1xyXG4gICAgICBjb25zdCBzdWIgPSBmaXh0dXJlR3JvdXBcclxuICAgICAgICAuZ2V0KFwiZml4dHVyZUNvbmZpZ0lkXCIpXHJcbiAgICAgICAgPy52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgobmV3VmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMuY2hhbmdlRml4dHVyZVRlbXBsYXRlKG5ld1ZhbHVlLCBcImZsb29yXCIsIGspO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKHN1YikgdGhpcy5maXh0dXJlQ29uZmlnU3Vic2NyaXB0aW9ucy5wdXNoKHN1Yik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHN1YnNjcmliZVRvT3RoZXJFbGVtZW50c0NoYW5nZXMoKSB7XHJcbiAgICB0aGlzLm90aGVyRWxlbWVudHNTdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YikgPT4gc3ViPy51bnN1YnNjcmliZSgpKTtcclxuICAgIHRoaXMub3RoZXJFbGVtZW50c1N1YnNjcmlwdGlvbnMgPSBbXTtcclxuXHJcbiAgICAvLyBXYWxsLWxldmVsIG90aGVyRWxlbWVudHMgbGFiZWwgc3Vic2NyaXB0aW9uc1xyXG4gICAgdGhpcy5nZXRGb3JtV2FsbHMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xyXG4gICAgICBjb25zdCB3YWxsR3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcclxuICAgICAgY29uc3Qgb3RoZXJBcnJheSA9IHdhbGxHcm91cC5nZXQoXCJvdGhlckVsZW1lbnRzXCIpIGFzIEZvcm1BcnJheTtcclxuXHJcbiAgICAgIG90aGVyQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY3RybCwgb3RoZXJJZHgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGVtZW50R3JvdXAgPSBjdHJsIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBjb25zdCB0eXBlQ29udHJvbCA9IGVsZW1lbnRHcm91cC5nZXQoXCJ0eXBlXCIpIGFzIEZvcm1Db250cm9sO1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbU5hbWVDb250cm9sID0gZWxlbWVudEdyb3VwLmdldChcImN1c3RvbU5hbWVcIikgYXMgRm9ybUNvbnRyb2w7XHJcblxyXG4gICAgICAgIGNvbnN0IHdhbGxNZXRhID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5maW5kKFxyXG4gICAgICAgICAgKGVsOiBhbnkpID0+XHJcbiAgICAgICAgICAgIGVsLmVsZW1lbnRUeXBlID09PSB3YWxsR3JvdXAuZ2V0KFwiZWxlbWVudFR5cGVcIik/LnZhbHVlICYmXHJcbiAgICAgICAgICAgIGVsLmVsZW1lbnROdW1iZXIgPT09IHdhbGxHcm91cC5nZXQoXCJlbGVtZW50TnVtYmVyXCIpPy52YWx1ZSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWYgPSB3YWxsTWV0YT8ub3RoZXJFbGVtZW50cz8uW290aGVySWR4XTtcclxuICAgICAgICBpZiAoIWVsZW1lbnRSZWYpIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gd2hlbiB0eXBlIGNoYW5nZXMgKGRyb3Bkb3duKVxyXG4gICAgICAgIGNvbnN0IHN1YlR5cGUgPSB0eXBlQ29udHJvbC52YWx1ZUNoYW5nZXNcclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKHNlbGVjdGVkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgLy8gaWYgdXNlciBwaWNrcyBcIk90aGVyc1wiLCBwcmVmZXIgY3VzdG9tTmFtZSBpZiBwcmVzZW50LCBvdGhlcndpc2Ugc2V0IGZpeHR1cmVOYW1lIHRvIFwiT3RoZXJzXCJcclxuICAgICAgICAgICAgZWxlbWVudFJlZi5maXh0dXJlTmFtZSA9XHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWQgPT09IFwiT3RoZXJzXCJcclxuICAgICAgICAgICAgICAgID8gY3VzdG9tTmFtZUNvbnRyb2w/LnZhbHVlIHx8IFwiT3RoZXJzXCJcclxuICAgICAgICAgICAgICAgIDogc2VsZWN0ZWQ7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FudmFzT3RoZXJFbGVtZW50TGFiZWwoZWxlbWVudFJlZik7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gd2hlbiBjdXN0b21OYW1lIGNoYW5nZXMgKHRleHQgaW5wdXQgdmlzaWJsZSBvbmx5IHdoZW4gdHlwZSA9PT0gJ090aGVycycpXHJcbiAgICAgICAgY29uc3Qgc3ViQ3VzdG9tID0gY3VzdG9tTmFtZUNvbnRyb2wudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChjdXN0b206IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAodHlwZUNvbnRyb2wudmFsdWUgPT09IFwiT3RoZXJzXCIpIHtcclxuICAgICAgICAgICAgICBlbGVtZW50UmVmLmZpeHR1cmVOYW1lID0gY3VzdG9tO1xyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FudmFzT3RoZXJFbGVtZW50TGFiZWwoZWxlbWVudFJlZik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLm90aGVyRWxlbWVudHNTdWJzY3JpcHRpb25zLnB1c2goc3ViVHlwZSwgc3ViQ3VzdG9tKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBGbG9vci1sZXZlbCBvdGhlckVsZW1lbnRzIGxhYmVsIHN1YnNjcmlwdGlvbnNcclxuICAgIHRoaXMuZ2V0Rm9ybUZsb29yT3RoZXJFbGVtZW50cy5jb250cm9scy5mb3JFYWNoKChjdHJsLCBpZHgpID0+IHtcclxuICAgICAgY29uc3QgZWxlbWVudEdyb3VwID0gY3RybCBhcyBGb3JtR3JvdXA7XHJcbiAgICAgIGNvbnN0IHR5cGVDb250cm9sID0gZWxlbWVudEdyb3VwLmdldChcInR5cGVcIikgYXMgRm9ybUNvbnRyb2w7XHJcbiAgICAgIGNvbnN0IGN1c3RvbU5hbWVDb250cm9sID0gZWxlbWVudEdyb3VwLmdldChcImN1c3RvbU5hbWVcIikgYXMgRm9ybUNvbnRyb2w7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnRSZWYgPSB0aGlzLmZsb29yRGF0YT8ub3RoZXJFbGVtZW50cz8uW2lkeF07XHJcbiAgICAgIGlmICghZWxlbWVudFJlZikgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3Qgc3ViVHlwZSA9IHR5cGVDb250cm9sLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChzZWxlY3RlZDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBlbGVtZW50UmVmLmZpeHR1cmVOYW1lID1cclxuICAgICAgICAgICAgc2VsZWN0ZWQgPT09IFwiT3RoZXJzXCJcclxuICAgICAgICAgICAgICA/IGN1c3RvbU5hbWVDb250cm9sPy52YWx1ZSB8fCBcIk90aGVyc1wiXHJcbiAgICAgICAgICAgICAgOiBzZWxlY3RlZDtcclxuICAgICAgICAgIHRoaXMudXBkYXRlQ2FudmFzT3RoZXJFbGVtZW50TGFiZWwoZWxlbWVudFJlZik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBzdWJDdXN0b20gPSBjdXN0b21OYW1lQ29udHJvbC52YWx1ZUNoYW5nZXNcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoY3VzdG9tOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGlmICh0eXBlQ29udHJvbC52YWx1ZSA9PT0gXCJPdGhlcnNcIikge1xyXG4gICAgICAgICAgICBlbGVtZW50UmVmLmZpeHR1cmVOYW1lID0gY3VzdG9tO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbnZhc090aGVyRWxlbWVudExhYmVsKGVsZW1lbnRSZWYpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5vdGhlckVsZW1lbnRzU3Vic2NyaXB0aW9ucy5wdXNoKHN1YlR5cGUsIHN1YkN1c3RvbSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUNhbnZhc090aGVyRWxlbWVudExhYmVsKGVsZW1lbnRSZWY6IGFueSkge1xyXG4gICAgaWYgKCF0aGlzLmNhbnZhcykgcmV0dXJuO1xyXG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmNhbnZhc1xyXG4gICAgICAuZ2V0T2JqZWN0cygpXHJcbiAgICAgIC5maW5kKFxyXG4gICAgICAgIChvYmo6IGFueSkgPT5cclxuICAgICAgICAgIG9iaj8ub2JqVHlwZSA9PT0gXCJvdGhlcnNcIiAmJiBvYmo/LmRhdGEuX2lkID09PSBlbGVtZW50UmVmLl9pZCxcclxuICAgICAgKSBhcyBhbnk7XHJcblxyXG4gICAgaWYgKCFncm91cCkgcmV0dXJuO1xyXG4gICAgZ3JvdXAuZGF0YSA9IGVsZW1lbnRSZWY7XHJcblxyXG4gICAgY29uc3QgdGV4dE9iaiA9IChncm91cC5nZXRPYmplY3RzKCkgfHwgW10pLmZpbmQoXHJcbiAgICAgIChvOiBhbnkpID0+IG8/LnR5cGUgPT09IFwidGV4dFwiIHx8IG8/LnR5cGUgPT09IFwidGV4dGJveFwiLFxyXG4gICAgKSBhcyBmYWJyaWMuVGV4dCB8IGZhYnJpYy5UZXh0Ym94IHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIGlmICh0ZXh0T2JqKSB7XHJcbiAgICAgICh0ZXh0T2JqIGFzIGFueSkuc2V0KHsgdGV4dDogZWxlbWVudFJlZi5maXh0dXJlTmFtZSB9KTtcclxuICAgICAgdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcm90YXRlQ2FudmFzKGNhbnZhczogZmFicmljLkNhbnZhcywgYW5nbGVEZWc6IG51bWJlcikge1xyXG4gICAgaWYgKCFjYW52YXMpIHJldHVybjtcclxuICAgIGNvbnN0IGFsbE9iamVjdHMgPSBjYW52YXMuZ2V0T2JqZWN0cygpO1xyXG4gICAgaWYgKCFhbGxPYmplY3RzIHx8IGFsbE9iamVjdHMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgLy8gQ3JlYXRlIGFuIEFjdGl2ZVNlbGVjdGlvbiBjb250YWluaW5nIGFsbCBvYmplY3RzIG9uIHRoZSBjYW52YXNcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IG5ldyBmYWJyaWMuQWN0aXZlU2VsZWN0aW9uKGFsbE9iamVjdHMgYXMgYW55LCB7IGNhbnZhcyB9KTtcclxuICAgIGNhbnZhcy5zZXRBY3RpdmVPYmplY3Qoc2VsZWN0aW9uKTtcclxuXHJcbiAgICAvLyBSb3RhdGUgdGhlIEFjdGl2ZVNlbGVjdGlvbiBkaXJlY3RseSAod29ya3MgbGlrZSBhIHRlbXBvcmFyeSBncm91cClcclxuICAgIGNvbnN0IGFjdGl2ZTogYW55ID0gY2FudmFzLmdldEFjdGl2ZU9iamVjdCgpO1xyXG4gICAgaWYgKCFhY3RpdmUpIHtcclxuICAgICAgY2FudmFzLmRpc2NhcmRBY3RpdmVPYmplY3QoKTtcclxuICAgICAgY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGN1cnJlbnRBbmdsZSA9IGFjdGl2ZS5hbmdsZSB8fCAwO1xyXG4gICAgYWN0aXZlLnJvdGF0ZShjdXJyZW50QW5nbGUgKyBhbmdsZURlZyk7XHJcbiAgICBhY3RpdmUuc2V0Q29vcmRzKCk7XHJcblxyXG4gICAgLy8gQ2xlYXIgc2VsZWN0aW9uIGJ1dCBrZWVwIHJvdGF0ZWQgcG9zaXRpb25zIG9mIGNoaWxkIG9iamVjdHNcclxuICAgIGNhbnZhcy5kaXNjYXJkQWN0aXZlT2JqZWN0KCk7XHJcbiAgICBjYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Rml4dHVyZU9uQ2FudmFzQ2xpY2sodGFyZ2V0OiBhbnksIGNvbGxhcHNlVGFza0luZm86IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHRhcmdldCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZSA9IHtcclxuICAgICAgICBmaXh0dXJlVHlwZTogdGFyZ2V0LmZpeHR1cmVUeXBlLFxyXG4gICAgICAgIHdhbGxJbmRleDogdGFyZ2V0LndhbGxJbmRleCxcclxuICAgICAgICBmaXh0dXJlSW5kZXg6IHRhcmdldC5maXh0dXJlSW5kZXgsXHJcbiAgICAgICAgZml4dHVyZUlkOiB0YXJnZXQuZml4dHVyZUlkLFxyXG4gICAgICAgIGlzc3VlOiB0YXJnZXQuaXNzdWUsXHJcbiAgICAgICAgaXNzdWVEYXRhOiB0YXJnZXQuaXNzdWVEYXRhLFxyXG4gICAgICAgIHZtQ29uZmlnOiB0YXJnZXQudm1Db25maWcsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRGaXh0dXJlVGVtcGxhdGVzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICB9O1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5hcGlTZXJ2aWNlLmdldEFsbFRlbXBsYXRlcyhwYXlsb2FkKSxcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgZGF0YSA9IHJlcz8uZGF0YTtcclxuXHJcbiAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVzID0gZGF0YS5tYXAoKHQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgX2lkOiB0Ll9pZCxcclxuICAgICAgICAgICAgbmFtZTogdC5maXh0dXJlTmFtZS5pbmNsdWRlcyhcIi1mdFwiKVxyXG4gICAgICAgICAgICAgID8gdC5maXh0dXJlTmFtZVxyXG4gICAgICAgICAgICAgIDogYCR7dC5maXh0dXJlTmFtZX0gLSAke3QuZml4dHVyZVdpZHRoLnZhbHVlfSAke3QuZml4dHVyZVdpZHRoLnVuaXR9YCxcclxuICAgICAgICAgICAgc3VidGV4dDogYCR7dC5wcm9kdWN0QnJhbmROYW1lPy5qb2luKFwiLCBcIil9YCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBmaXh0dXJlIHRlbXBsYXRlczpcIiwgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlRm9ybSgpIHtcclxuICAgIHRoaXMubGF5b3V0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICB3YWxsczogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICAgIGZsb29yRml4dHVyZXM6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBmbG9vck90aGVyRWxlbWVudHM6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZ2V0Rm9ybVdhbGxzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJ3YWxsc1wiKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgZ2V0Rm9ybUZsb29yRml4dHVyZXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sYXlvdXRGb3JtLmdldChcImZsb29yRml4dHVyZXNcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdldEZvcm1GbG9vck90aGVyRWxlbWVudHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sYXlvdXRGb3JtLmdldChcImZsb29yT3RoZXJFbGVtZW50c1wiKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgZ2V0RW50cmFuY2VzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmxvb3JEYXRhPy5sYXlvdXRQb2x5Z29uPy5maWx0ZXIoXHJcbiAgICAgIChlbGU6IGFueSkgPT4gZWxlLmVsZW1lbnRUeXBlID09PSBcImVudHJhbmNlXCIsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0V2FsbE90aGVyRWxlbWVudHMod2FsbEluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiAodGhpcy5sYXlvdXRGb3JtLmdldChcIndhbGxzXCIpIGFzIEZvcm1BcnJheSlcclxuICAgICAgLmF0KHdhbGxJbmRleClcclxuICAgICAgLmdldChcIm90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybUZpeHR1cmVzKHdhbGxJbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJ3YWxsc1wiKSBhcyBGb3JtQXJyYXkpXHJcbiAgICAgIC5hdCh3YWxsSW5kZXgpXHJcbiAgICAgIC5nZXQoXCJmaXh0dXJlc1wiKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBwYXRjaFdhbGxFbGVtZW50cyh7IGVsZW1lbnRUeXBlLCBlbGVtZW50TnVtYmVyIH06IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgZWxlbWVudFR5cGU6IFtlbGVtZW50VHlwZSA/IGVsZW1lbnRUeXBlIDogXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgZWxlbWVudE51bWJlcjogW2VsZW1lbnROdW1iZXIgPyBlbGVtZW50TnVtYmVyIDogMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgZml4dHVyZXM6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBvdGhlckVsZW1lbnRzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGl0ZW07XHJcbiAgfVxyXG5cclxuICBwYXRjaEZpeHR1cmUoeyBmaXh0dXJlTmFtZSwgZml4dHVyZUNvbmZpZ0lkLCBfaWQgfTogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBmaXh0dXJlTmFtZTogW2ZpeHR1cmVOYW1lID8gZml4dHVyZU5hbWUgOiBcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICBmaXh0dXJlQ29uZmlnSWQ6IFtcclxuICAgICAgICBmaXh0dXJlQ29uZmlnSWQgPyBmaXh0dXJlQ29uZmlnSWQgOiBcIlwiLFxyXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgXSxcclxuICAgICAgX2lkOiBbX2lkID8gX2lkIDogXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGl0ZW07XHJcbiAgfVxyXG5cclxuICBhZGRXYWxsU3BhY2Uod2FsbEluZGV4OiBudW1iZXIsIG9wZXJhdGlvbjogXCJpbmNyZW1lbnRcIiB8IFwiZGVjcmVtZW50XCIpIHtcclxuICAgIGlmICh0aGlzLmxheW91dEZvcm0uZGlzYWJsZWQpIHJldHVybjtcclxuICAgIGNvbnN0IGNsaWNrZWRXYWxsTnVtYmVyID0gd2FsbEluZGV4ICsgMTtcclxuICAgIGNvbnN0IG1tVG9GZWV0ID0gMzA1O1xyXG4gICAgY29uc3QgZml4dHVyZUhlaWdodCA9IDE1MjQgLyBtbVRvRmVldDsgLy8gfjUgZnQgKGhvcml6b250YWwgaW5jcmVtZW50KVxyXG4gICAgY29uc3QgZml4dHVyZVdpZHRoID0gMTIyMCAvIG1tVG9GZWV0OyAvLyB+NCBmdCAodmVydGljYWwgaW5jcmVtZW50KVxyXG5cclxuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb247XHJcblxyXG4gICAgY29uc3QgZ2V0V2FsbCA9IChudW06IG51bWJlcikgPT5cclxuICAgICAgbGF5b3V0LmZpbmQoXHJcbiAgICAgICAgKGVsOiBhbnkpID0+IGVsLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiBlbC5lbGVtZW50TnVtYmVyID09PSBudW0sXHJcbiAgICAgICk7XHJcblxyXG4gICAgY29uc3QgYW1vdW50ID0gb3BlcmF0aW9uID09PSBcImluY3JlbWVudFwiID8gMSA6IC0xO1xyXG5cclxuICAgIGNvbnN0IHcxID0gZ2V0V2FsbCgxKTtcclxuICAgIGNvbnN0IHcyID0gZ2V0V2FsbCgyKTtcclxuICAgIGNvbnN0IHczID0gZ2V0V2FsbCgzKTtcclxuICAgIGNvbnN0IHc0ID0gZ2V0V2FsbCg0KTtcclxuICAgIGNvbnN0IHc1ID0gZ2V0V2FsbCg1KTtcclxuICAgIGNvbnN0IGVudHJhbmNlID0gbGF5b3V0LmZpbmQoKGVsOiBhbnkpID0+IGVsLmVsZW1lbnRUeXBlID09PSBcImVudHJhbmNlXCIpO1xyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEhvcml6b250YWwgZ3Jvd3RoICAoV2FsbC0xIC8gV2FsbC0zKVxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgaWYgKGNsaWNrZWRXYWxsTnVtYmVyID09PSAxIHx8IGNsaWNrZWRXYWxsTnVtYmVyID09PSAzKSB7XHJcbiAgICAgIGlmICh3MSkgdzEuZGlzdGFuY2UgKz0gYW1vdW50ICogZml4dHVyZVdpZHRoO1xyXG4gICAgICBpZiAodzMpIHczLmRpc3RhbmNlICs9IGFtb3VudCAqIGZpeHR1cmVXaWR0aDtcclxuXHJcbiAgICAgIGlmICh3Mikge1xyXG4gICAgICAgIHcyLmZpeHR1cmVzLmZvckVhY2goKGZ4OiBhbnkpID0+IHtcclxuICAgICAgICAgIGZ4LnJlbGF0aXZlUG9zaXRpb24ueCA9XHJcbiAgICAgICAgICAgIChmeC5yZWxhdGl2ZVBvc2l0aW9uLnggfHwgMCkgKyBhbW91bnQgKiBmaXh0dXJlV2lkdGg7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBWZXJ0aWNhbCBncm93dGggIChXYWxsLTIgLyBXYWxsLTQgLyBXYWxsLTUpXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBpZiAoXHJcbiAgICAgIGNsaWNrZWRXYWxsTnVtYmVyID09PSAyIHx8XHJcbiAgICAgIGNsaWNrZWRXYWxsTnVtYmVyID09PSA0IHx8XHJcbiAgICAgIGNsaWNrZWRXYWxsTnVtYmVyID09PSA1XHJcbiAgICApIHtcclxuICAgICAgaWYgKHcyKSB3Mi5kaXN0YW5jZSArPSBhbW91bnQgKiBmaXh0dXJlSGVpZ2h0O1xyXG5cclxuICAgICAgaWYgKHczKSB7XHJcbiAgICAgICAgdzMuZml4dHVyZXMuZm9yRWFjaCgoZng6IGFueSkgPT4ge1xyXG4gICAgICAgICAgZngucmVsYXRpdmVQb3NpdGlvbi55ID1cclxuICAgICAgICAgICAgKGZ4LnJlbGF0aXZlUG9zaXRpb24ueSB8fCAwKSArIGFtb3VudCAqIGZpeHR1cmVIZWlnaHQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGVudHJhbmNlWSA9IGVudHJhbmNlPy5kaXN0YW5jZSB8fCAwO1xyXG4gICAgICBjb25zdCBleGlzdGluZ1c0ID0gdzQ/LmRpc3RhbmNlIHx8IDA7XHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nVzUgPSB3NT8uZGlzdGFuY2UgfHwgMDtcclxuXHJcbiAgICAgIC8vIEdyb3cgd2FsbC00IGlmIHdlIGNsaWNrZWQgd2FsbC00IE9SIHdhbGwtMlxyXG4gICAgICBpZiAoKGNsaWNrZWRXYWxsTnVtYmVyID09PSA0IHx8IGNsaWNrZWRXYWxsTnVtYmVyID09PSAyKSAmJiB3NCkge1xyXG4gICAgICAgIHc0LmRpc3RhbmNlID0gdGhpcy5yb3VuZFRvVHdvKGV4aXN0aW5nVzQgKyBhbW91bnQgKiBmaXh0dXJlSGVpZ2h0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gR3JvdyB3YWxsLTUgaWYgd2UgY2xpY2tlZCB3YWxsLTUgT1Igd2FsbC0yXHJcbiAgICAgIGlmICgoY2xpY2tlZFdhbGxOdW1iZXIgPT09IDUgfHwgY2xpY2tlZFdhbGxOdW1iZXIgPT09IDIpICYmIHc1KSB7XHJcbiAgICAgICAgdzUuZGlzdGFuY2UgPSB0aGlzLnJvdW5kVG9Ud28oZXhpc3RpbmdXNSArIGFtb3VudCAqIGZpeHR1cmVIZWlnaHQpO1xyXG5cclxuICAgICAgICBpZiAodzQpIHtcclxuICAgICAgICAgIHc0LmZpeHR1cmVzLmZvckVhY2goKGZ4OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgZngucmVsYXRpdmVQb3NpdGlvbi55ID1cclxuICAgICAgICAgICAgICAoZngucmVsYXRpdmVQb3NpdGlvbi55IHx8IDApICsgYW1vdW50ICogZml4dHVyZUhlaWdodDtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUHJldmVudCBvdmVyZmxvdzogc2hyaW5rIGJhY2sgaWYgdG90YWwgPiB3MiBzaXplXHJcbiAgICAgIGNvbnN0IHRvdGFsVXNlZCA9IGVudHJhbmNlWSArICh3ND8uZGlzdGFuY2UgfHwgMCkgKyAodzU/LmRpc3RhbmNlIHx8IDApO1xyXG4gICAgICBpZiAodG90YWxVc2VkID4gdzIhLmRpc3RhbmNlKSB7XHJcbiAgICAgICAgaWYgKHc1KSB7XHJcbiAgICAgICAgICB3NS5kaXN0YW5jZSA9IHRoaXMucm91bmRUb1R3byhcclxuICAgICAgICAgICAgdzUuZGlzdGFuY2UgLSAodG90YWxVc2VkIC0gdzIhLmRpc3RhbmNlKSxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVGaXh0dXJlKFxyXG4gICAgZml4dHVyZVR5cGU6IFwid2FsbFwiIHwgXCJmbG9vclwiLFxyXG4gICAgZml4dHVyZUluZGV4OiBudW1iZXIsXHJcbiAgICB3YWxsSW5kZXg/OiBudW1iZXIsXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5sYXlvdXRGb3JtLmRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgaWYgKGZpeHR1cmVUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICB0aGlzLmdldEZvcm1GaXh0dXJlcyh3YWxsSW5kZXghKS5yZW1vdmVBdChmaXh0dXJlSW5kZXgpO1xyXG5cclxuICAgICAgY29uc3Qgd2FsbCA9IHRoaXMuZ2V0V2FsbEJ5TnVtYmVyKHdhbGxJbmRleCEgKyAxKTtcclxuICAgICAgaWYgKHdhbGwgJiYgQXJyYXkuaXNBcnJheSh3YWxsLmZpeHR1cmVzKSkge1xyXG4gICAgICAgIHdhbGwuZml4dHVyZXMuc3BsaWNlKGZpeHR1cmVJbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoZml4dHVyZVR5cGUgPT09IFwiZmxvb3JcIikge1xyXG4gICAgICB0aGlzLmdldEZvcm1GbG9vckZpeHR1cmVzLnJlbW92ZUF0KGZpeHR1cmVJbmRleCk7XHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlKSkge1xyXG4gICAgICAgIHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUuc3BsaWNlKGZpeHR1cmVJbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxheW91dEhhc1Vuc2F2ZWRDaGFuZ2VzID0gdHJ1ZTtcclxuICAgIHRoaXMucmVuZGVyRmxvb3IoZmFsc2UpO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVPdGhlckVsZW1lbnQoXHJcbiAgICBlbGVtZW50VHlwZTogXCJ3YWxsXCIgfCBcImZsb29yXCIsXHJcbiAgICBlbGVtZW50SW5kZXg6IG51bWJlcixcclxuICAgIHdhbGxJbmRleD86IG51bWJlcixcclxuICApIHtcclxuICAgIGlmICh0aGlzLmxheW91dEZvcm0uZGlzYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICBpZiAoZWxlbWVudFR5cGUgPT09IFwid2FsbFwiKSB7XHJcbiAgICAgIHRoaXMuZ2V0V2FsbE90aGVyRWxlbWVudHMod2FsbEluZGV4ISkucmVtb3ZlQXQoZWxlbWVudEluZGV4KTtcclxuXHJcbiAgICAgIGNvbnN0IHdhbGwgPSB0aGlzLmdldFdhbGxCeU51bWJlcih3YWxsSW5kZXghICsgMSk7XHJcbiAgICAgIGlmICh3YWxsICYmIEFycmF5LmlzQXJyYXkod2FsbC5vdGhlckVsZW1lbnRzKSkge1xyXG4gICAgICAgIHdhbGwub3RoZXJFbGVtZW50cy5zcGxpY2UoZWxlbWVudEluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gXCJmbG9vclwiKSB7XHJcbiAgICAgIHRoaXMuZ2V0Rm9ybUZsb29yT3RoZXJFbGVtZW50cy5yZW1vdmVBdChlbGVtZW50SW5kZXgpO1xyXG5cclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5mbG9vckRhdGEub3RoZXJFbGVtZW50cykpIHtcclxuICAgICAgICB0aGlzLmZsb29yRGF0YS5vdGhlckVsZW1lbnRzLnNwbGljZShlbGVtZW50SW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sYXlvdXRIYXNVbnNhdmVkQ2hhbmdlcyA9IHRydWU7XHJcbiAgICB0aGlzLnJlbmRlckZsb29yKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIGNoYW5nZUZpeHR1cmVUZW1wbGF0ZShcclxuICAgIGNvbmZpZ0lkOiBzdHJpbmcsXHJcbiAgICBmaXh0dXJlVHlwZTogXCJ3YWxsXCIgfCBcImZsb29yXCIsXHJcbiAgICBmaXh0dXJlSW5kZXg6IG51bWJlcixcclxuICAgIHdhbGxJbmRleD86IG51bWJlcixcclxuICApIHtcclxuICAgIHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAuZ2V0Rml4dHVyZVRlbXBsYXRlKGNvbmZpZ0lkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGZpeHR1cmVUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZURhdGEgPSByZXMuZGF0YTtcclxuICAgICAgICAgICAgY29uc3QgZml4dHVyZUlkID0gYG5ldy0ke2NyeXB0by5yYW5kb21VVUlEKCl9YDtcclxuICAgICAgICAgICAgY29uc3QgZml4dHVyZUdyb3VwID0gdGhpcy5wYXRjaEZpeHR1cmUoe1xyXG4gICAgICAgICAgICAgIGZpeHR1cmVOYW1lOiB0ZW1wbGF0ZURhdGEuZml4dHVyZU5hbWUsXHJcbiAgICAgICAgICAgICAgZml4dHVyZUNvbmZpZ0lkOiB0ZW1wbGF0ZURhdGEuX2lkLFxyXG4gICAgICAgICAgICAgIF9pZDogZml4dHVyZUlkLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5nZXRGb3JtRml4dHVyZXMod2FsbEluZGV4ISkuc2V0Q29udHJvbChcclxuICAgICAgICAgICAgICBmaXh0dXJlSW5kZXgsXHJcbiAgICAgICAgICAgICAgZml4dHVyZUdyb3VwLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlRGF0YSA9IHtcclxuICAgICAgICAgICAgICAuLi50ZW1wbGF0ZURhdGEsXHJcbiAgICAgICAgICAgICAgZml4dHVyZUNvbmZpZ0lkOiB0ZW1wbGF0ZURhdGEuX2lkLFxyXG4gICAgICAgICAgICAgIF9pZDogZml4dHVyZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCB3YWxsUmVmID0gdGhpcy5nZXRXYWxsQnlOdW1iZXIod2FsbEluZGV4ISArIDEpITtcclxuICAgICAgICAgICAgd2FsbFJlZi5maXh0dXJlc1tmaXh0dXJlSW5kZXhdID0ge1xyXG4gICAgICAgICAgICAgIC4uLndhbGxSZWYuZml4dHVyZXNbZml4dHVyZUluZGV4XSxcclxuICAgICAgICAgICAgICAuLi5maXh0dXJlRGF0YSxcclxuICAgICAgICAgICAgICB1bnNhdmVkQ2hhbmdlczogdHJ1ZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRIYXNVbnNhdmVkQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpeHR1cmVUeXBlID09PSBcImZsb29yXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVEYXRhID0gcmVzLmRhdGE7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmVJZCA9IGBuZXctJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmVHcm91cCA9IHRoaXMucGF0Y2hGaXh0dXJlKHtcclxuICAgICAgICAgICAgICBmaXh0dXJlTmFtZTogdGVtcGxhdGVEYXRhLmZpeHR1cmVOYW1lLFxyXG4gICAgICAgICAgICAgIGZpeHR1cmVDb25maWdJZDogdGVtcGxhdGVEYXRhLl9pZCxcclxuICAgICAgICAgICAgICBfaWQ6IGZpeHR1cmVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICh0aGlzLmxheW91dEZvcm0uZ2V0KFwiZmxvb3JGaXh0dXJlc1wiKSBhcyBGb3JtQXJyYXkpLnNldENvbnRyb2woXHJcbiAgICAgICAgICAgICAgZml4dHVyZUluZGV4LFxyXG4gICAgICAgICAgICAgIGZpeHR1cmVHcm91cCxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29uc3QgZml4dHVyZURhdGEgPSB7XHJcbiAgICAgICAgICAgICAgLi4udGVtcGxhdGVEYXRhLFxyXG4gICAgICAgICAgICAgIGZpeHR1cmVDb25maWdJZDogdGVtcGxhdGVEYXRhLl9pZCxcclxuICAgICAgICAgICAgICBfaWQ6IGZpeHR1cmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZVtmaXh0dXJlSW5kZXhdID0ge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmVbZml4dHVyZUluZGV4XSxcclxuICAgICAgICAgICAgICAuLi5maXh0dXJlRGF0YSxcclxuICAgICAgICAgICAgICB1bnNhdmVkQ2hhbmdlczogdHJ1ZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRIYXNVbnNhdmVkQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byBmZXRjaCB0ZW1wbGF0ZXNcIik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkRyb3AoXHJcbiAgICBldmVudDogYW55LFxyXG4gICAgZGVzdGluYXRpb25XYWxsSW5kZXg6IG51bWJlciB8IFwiZmxvb3JcIixcclxuICAgIGRlc3RpbmF0aW9uRml4dHVyZUluZGV4PzogbnVtYmVyLFxyXG4gICkge1xyXG4gICAgY29uc3QgZGF0YSA9IGV2ZW50LmRhdGE7XHJcblxyXG4gICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgY29uc3QgaXNTb3VyY2VGbG9vciA9IGRhdGEud2FsbEluZGV4ID09PSBcImZsb29yXCI7XHJcbiAgICBjb25zdCBpc0Rlc3RpbmF0aW9uRmxvb3IgPSBkZXN0aW5hdGlvbldhbGxJbmRleCA9PT0gXCJmbG9vclwiO1xyXG5cclxuICAgIGNvbnN0IHNvdXJjZUZvcm1BcnJheTogRm9ybUFycmF5ID0gaXNTb3VyY2VGbG9vclxyXG4gICAgICA/IHRoaXMuZ2V0Rm9ybUZsb29yRml4dHVyZXNcclxuICAgICAgOiB0aGlzLmdldEZvcm1GaXh0dXJlcyhkYXRhLndhbGxJbmRleCk7XHJcblxyXG4gICAgY29uc3QgZGVzdGluYXRpb25Gb3JtQXJyYXk6IEZvcm1BcnJheSA9IGlzRGVzdGluYXRpb25GbG9vclxyXG4gICAgICA/IHRoaXMuZ2V0Rm9ybUZsb29yRml4dHVyZXNcclxuICAgICAgOiB0aGlzLmdldEZvcm1GaXh0dXJlcyhkZXN0aW5hdGlvbldhbGxJbmRleCBhcyBudW1iZXIpO1xyXG5cclxuICAgIGNvbnN0IHNvdXJjZVdhbGxNZXRhID0gaXNTb3VyY2VGbG9vclxyXG4gICAgICA/IHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmVcclxuICAgICAgOiAodGhpcy5nZXRXYWxsQnlOdW1iZXIoXHJcbiAgICAgICAgICB0aGlzLmdldEZvcm1XYWxscy5hdChkYXRhLndhbGxJbmRleCkuZ2V0KFwiZWxlbWVudE51bWJlclwiKT8udmFsdWUsXHJcbiAgICAgICAgKT8uZml4dHVyZXMgPz8gW10pO1xyXG5cclxuICAgIGNvbnN0IGRlc3RpbmF0aW9uV2FsbE1ldGEgPSBpc0Rlc3RpbmF0aW9uRmxvb3JcclxuICAgICAgPyB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlXHJcbiAgICAgIDogKHRoaXMuZ2V0V2FsbEJ5TnVtYmVyKFxyXG4gICAgICAgICAgdGhpcy5nZXRGb3JtV2FsbHNcclxuICAgICAgICAgICAgLmF0KGRlc3RpbmF0aW9uV2FsbEluZGV4IGFzIG51bWJlcilcclxuICAgICAgICAgICAgLmdldChcImVsZW1lbnROdW1iZXJcIik/LnZhbHVlLFxyXG4gICAgICAgICk/LmZpeHR1cmVzID8/IFtdKTtcclxuXHJcbiAgICBjb25zdCBzRml4dHVyZUluZGV4ID0gc291cmNlV2FsbE1ldGEuZmluZEluZGV4KFxyXG4gICAgICAoZml4dHVyZTogYW55KSA9PlxyXG4gICAgICAgIGZpeHR1cmUuX2lkID09PVxyXG4gICAgICAgIHNvdXJjZUZvcm1BcnJheS5hdChkYXRhLmZpeHR1cmVJbmRleCk/LmdldChcIl9pZFwiKT8udmFsdWUsXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGRGaXh0dXJlSW5kZXggPVxyXG4gICAgICBkZXN0aW5hdGlvbkZpeHR1cmVJbmRleCAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgPyBkZXN0aW5hdGlvbldhbGxNZXRhLmZpbmRJbmRleChcclxuICAgICAgICAgICAgKGZpeHR1cmU6IGFueSkgPT5cclxuICAgICAgICAgICAgICBmaXh0dXJlLl9pZCA9PT1cclxuICAgICAgICAgICAgICBkZXN0aW5hdGlvbkZvcm1BcnJheS5hdChkZXN0aW5hdGlvbkZpeHR1cmVJbmRleCk/LmdldChcIl9pZFwiKVxyXG4gICAgICAgICAgICAgICAgPy52YWx1ZSxcclxuICAgICAgICAgIClcclxuICAgICAgICA6IGRlc3RpbmF0aW9uRm9ybUFycmF5Lmxlbmd0aDtcclxuXHJcbiAgICBjb25zdCBzUG9zaXRpb24gPSB7XHJcbiAgICAgIGZpeHR1cmVOdW1iZXI6IHNvdXJjZVdhbGxNZXRhW3NGaXh0dXJlSW5kZXhdLmZpeHR1cmVOdW1iZXIsXHJcbiAgICAgIGFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcjpcclxuICAgICAgICBzb3VyY2VXYWxsTWV0YVtzRml4dHVyZUluZGV4XS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIsXHJcbiAgICB9O1xyXG4gICAgY29uc3QgZFBvc2l0aW9uID0ge1xyXG4gICAgICBmaXh0dXJlTnVtYmVyOiBkZXN0aW5hdGlvbldhbGxNZXRhW2RGaXh0dXJlSW5kZXhdLmZpeHR1cmVOdW1iZXIsXHJcbiAgICAgIGFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcjpcclxuICAgICAgICBkZXN0aW5hdGlvbldhbGxNZXRhW2RGaXh0dXJlSW5kZXhdLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcixcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHNvdXJjZVdhbGxNZXRhID09PSBkZXN0aW5hdGlvbldhbGxNZXRhKSB7XHJcbiAgICAgIGRlc3RpbmF0aW9uV2FsbE1ldGFbZEZpeHR1cmVJbmRleF0uZml4dHVyZU51bWJlciA9XHJcbiAgICAgICAgc1Bvc2l0aW9uLmZpeHR1cmVOdW1iZXI7XHJcbiAgICAgIGRlc3RpbmF0aW9uV2FsbE1ldGFbZEZpeHR1cmVJbmRleF0uYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyID1cclxuICAgICAgICBzUG9zaXRpb24uYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyO1xyXG4gICAgICBzb3VyY2VXYWxsTWV0YVtzRml4dHVyZUluZGV4XS5maXh0dXJlTnVtYmVyID0gZFBvc2l0aW9uLmZpeHR1cmVOdW1iZXI7XHJcbiAgICAgIHNvdXJjZVdhbGxNZXRhW3NGaXh0dXJlSW5kZXhdLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlciA9XHJcbiAgICAgICAgZFBvc2l0aW9uLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNvdXJjZVdhbGxNZXRhW3NGaXh0dXJlSW5kZXhdLmZpeHR1cmVOdW1iZXIgPSBkUG9zaXRpb24uZml4dHVyZU51bWJlcjtcclxuICAgICAgc291cmNlV2FsbE1ldGFbc0ZpeHR1cmVJbmRleF0uYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyID1cclxuICAgICAgICBkUG9zaXRpb24uYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudHJhbnNmZXJBcnJheUl0ZW0oXHJcbiAgICAgIHNvdXJjZUZvcm1BcnJheS5jb250cm9scyxcclxuICAgICAgZGVzdGluYXRpb25Gb3JtQXJyYXkuY29udHJvbHMsXHJcbiAgICAgIGRhdGEuZml4dHVyZUluZGV4LFxyXG4gICAgICBkRml4dHVyZUluZGV4LFxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnRyYW5zZmVyQXJyYXlJdGVtKFxyXG4gICAgICBzb3VyY2VXYWxsTWV0YSxcclxuICAgICAgZGVzdGluYXRpb25XYWxsTWV0YSxcclxuICAgICAgc0ZpeHR1cmVJbmRleCxcclxuICAgICAgZEZpeHR1cmVJbmRleCxcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZENhbnZhcygpIHtcclxuICAgIGlmICghdGhpcy5jYW52YXMpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBvcmlnaW5hbFZpZXdwb3J0ID0gW1xyXG4gICAgICAuLi50aGlzLmNhbnZhcy52aWV3cG9ydFRyYW5zZm9ybSEsXHJcbiAgICBdIGFzIGZhYnJpYy5UTWF0MkQ7XHJcblxyXG4gICAgdGhpcy5jYW52YXMuc2V0Vmlld3BvcnRUcmFuc2Zvcm0oWzEsIDAsIDAsIDEsIDAsIDBdKTtcclxuXHJcbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmdldEZ1bGxMYXlvdXRCb3VuZHMoKTtcclxuXHJcbiAgICBjb25zdCBkYXRhVVJMID0gdGhpcy5jYW52YXMudG9EYXRhVVJMKHtcclxuICAgICAgZm9ybWF0OiBcInBuZ1wiLFxyXG4gICAgICBsZWZ0OiBib3VuZHMubGVmdCxcclxuICAgICAgdG9wOiBib3VuZHMudG9wLFxyXG4gICAgICB3aWR0aDogYm91bmRzLndpZHRoLFxyXG4gICAgICBoZWlnaHQ6IGJvdW5kcy5oZWlnaHQsXHJcbiAgICAgIG11bHRpcGxpZXI6IDIsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbnZhcy5zZXRWaWV3cG9ydFRyYW5zZm9ybShvcmlnaW5hbFZpZXdwb3J0KTtcclxuXHJcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICBsaW5rLmhyZWYgPSBkYXRhVVJMO1xyXG4gICAgbGluay5kb3dubG9hZCA9IGAke3RoaXMucGxhbm9EYXRhLnN0b3JlTmFtZX1fJHt0aGlzLmZsb29yRGF0YS5mbG9vck5hbWV9LnBuZ2A7XHJcbiAgICBsaW5rLmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUV4cG9ydExheW91dEJhY2tncm91bmQoKSB7XHJcbiAgICBjb25zdCBwb2ludHMgPSB0aGlzLmJ1aWxkTGF5b3V0UG9seWdvbkZyb21XYWxscygpO1xyXG5cclxuICAgIHJldHVybiBuZXcgZmFicmljLlBvbHlnb24ocG9pbnRzLCB7XHJcbiAgICAgIGZpbGw6IFwiI2VhZWNmMFwiLFxyXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgIG9iamVjdENhY2hpbmc6IGZhbHNlLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkTGF5b3V0UG9seWdvbkZyb21XYWxscygpIHtcclxuICAgIHJldHVybiB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uXHJcbiAgICAgIC5maWx0ZXIoKHc6IGFueSkgPT4gdy5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIpXHJcbiAgICAgIC5tYXAoKHc6IGFueSkgPT4gKHtcclxuICAgICAgICB4OiB0aGlzLnRvUGl4ZWxzKHcucmVsYXRpdmVQb3NpdGlvbi54LCBcImZ0XCIpLFxyXG4gICAgICAgIHk6IHRoaXMudG9QaXhlbHMody5yZWxhdGl2ZVBvc2l0aW9uLnksIFwiZnRcIiksXHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHJvdGF0ZVdhbGwoZWxlTnVtYmVyOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHdhbGwgPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZpbmQoXHJcbiAgICAgIChlbDogYW55KSA9PiBlbC5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIgJiYgZWwuZWxlbWVudE51bWJlciA9PT0gZWxlTnVtYmVyLFxyXG4gICAgKTtcclxuICAgIGlmICh3YWxsLmFuZ2xlICsgOTAgPCAzNjApIHtcclxuICAgICAgd2FsbC5hbmdsZSArPSA5MDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdhbGwuYW5nbGUgPSAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZW5kZXJGbG9vcih0cnVlKTtcclxuICB9XHJcblxyXG4gIGFkZE5ld1dhbGwoZWxlTnVtYmVyOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGdldFdhbGxFbmRQb2ludCA9ICh3YWxsOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgYW5nbGVSYWQgPSAod2FsbC5hbmdsZSAqIE1hdGguUEkpIC8gMTgwO1xyXG4gICAgICBjb25zdCBsZW5ndGggPSB3YWxsLmRpc3RhbmNlO1xyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB4OiB3YWxsLnJlbGF0aXZlUG9zaXRpb24ueCArIGxlbmd0aCAqIE1hdGguY29zKGFuZ2xlUmFkKSxcclxuICAgICAgICB5OiB3YWxsLnJlbGF0aXZlUG9zaXRpb24ueSArIGxlbmd0aCAqIE1hdGguc2luKGFuZ2xlUmFkKSxcclxuICAgICAgICB1bml0OiB3YWxsLnJlbGF0aXZlUG9zaXRpb24udW5pdCxcclxuICAgICAgfTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZpbmRJbmRleChcclxuICAgICAgKHc6IGFueSkgPT4gdy5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIgJiYgdy5lbGVtZW50TnVtYmVyID09PSBlbGVOdW1iZXIsXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChpbmRleCA9PT0gLTEgJiYgZWxlTnVtYmVyICE9PSAwKSByZXR1cm47XHJcblxyXG4gICAgbGV0IHN0YXJ0UG9zaXRpb247XHJcblxyXG4gICAgaWYgKGVsZU51bWJlciA9PT0gMCkge1xyXG4gICAgICBzdGFydFBvc2l0aW9uID0ge1xyXG4gICAgICAgIHg6IDAsXHJcbiAgICAgICAgeTogMCxcclxuICAgICAgICB1bml0OiBcImZ0XCIsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBwcmV2V2FsbCA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb25baW5kZXhdO1xyXG4gICAgICBzdGFydFBvc2l0aW9uID0gZ2V0V2FsbEVuZFBvaW50KHByZXZXYWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBiYXNlV2FsbCA9XHJcbiAgICAgIGVsZU51bWJlciA9PT0gMFxyXG4gICAgICAgID8geyBhbmdsZTogMCwgZGlyZWN0aW9uOiBcInJpZ2h0XCIsIHVuaXQ6IFwiZnRcIiB9XHJcbiAgICAgICAgOiB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uW2luZGV4XTtcclxuXHJcbiAgICBjb25zdCBuZXdXYWxsID0ge1xyXG4gICAgICBlbGVtZW50VHlwZTogXCJ3YWxsXCIsXHJcbiAgICAgIGRpc3RhbmNlOiAxNSxcclxuICAgICAgdW5pdDogYmFzZVdhbGwudW5pdCxcclxuICAgICAgZGlyZWN0aW9uOiBiYXNlV2FsbC5kaXJlY3Rpb24sXHJcbiAgICAgIGFuZ2xlOiBiYXNlV2FsbC5hbmdsZSxcclxuICAgICAgZWxlbWVudE51bWJlcjogZWxlTnVtYmVyICsgMSxcclxuICAgICAgcmVsYXRpdmVQb3NpdGlvbjogc3RhcnRQb3NpdGlvbixcclxuICAgICAgZml4dHVyZXM6IFtdLFxyXG4gICAgICBvdGhlckVsZW1lbnRzOiBbXSxcclxuICAgICAgbmV3QWRkZWQ6IHRydWUsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uc3BsaWNlKFxyXG4gICAgICBlbGVOdW1iZXIgPT09IDAgPyAwIDogaW5kZXggKyAxLFxyXG4gICAgICAwLFxyXG4gICAgICBuZXdXYWxsLFxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVdhbGxFbGVtZW50TnVtYmVyKCk7XHJcbiAgICB0aGlzLnVwZGF0ZVdhbGxDb29yZGluYXRlcygpO1xyXG4gICAgdGhpcy5yZW5kZXJGbG9vcih0cnVlKTtcclxuICB9XHJcblxyXG4gIGFkZE5ld0VudHJhbmNlKCkge1xyXG4gICAgY29uc3QgbGF5b3V0UG9seWdvbiA9IHRoaXMuZmxvb3JEYXRhPy5sYXlvdXRQb2x5Z29uID8/IFtdO1xyXG4gICAgY29uc3QgZWxlTnVtYmVyID1cclxuICAgICAgbGF5b3V0UG9seWdvbi5maWx0ZXIoKGVsZTogYW55KSA9PiBlbGUuZWxlbWVudFR5cGUgPT09IFwiZW50cmFuY2VcIilcclxuICAgICAgICA/Lmxlbmd0aCA/PyAwO1xyXG5cclxuICAgIGNvbnN0IGdhcFB4ID0gMjQ7XHJcbiAgICBjb25zdCBkZWZhdWx0RW50cmFuY2VXaWR0aFB4ID0gODA7XHJcblxyXG4gICAgbGV0IHhGdCA9IDA7XHJcbiAgICBsZXQgeUZ0ID0gMDtcclxuICAgIGxldCBhbmdsZSA9IDA7XHJcbiAgICBsZXQgaXNQb3NpdGlvblJlc29sdmVkID0gZmFsc2U7XHJcblxyXG4gICAgLy8gMSkgSWYgZW50cmFuY2UocykgYWxyZWFkeSBleGlzdCwgcGxhY2UgbmV4dCB0byB0aGUgbGF0ZXN0IG9uZS5cclxuICAgIGNvbnN0IGV4aXN0aW5nRW50cmFuY2VPYmplY3RzID0gKHRoaXMuY2FudmFzPy5nZXRPYmplY3RzKCkgPz8gW10pXHJcbiAgICAgIC5maWx0ZXIoKG9iajogYW55KSA9PiBvYmo/Lm9ialR5cGUgPT09IFwiZW50cmFuY2VcIilcclxuICAgICAgLnNvcnQoXHJcbiAgICAgICAgKGE6IGFueSwgYjogYW55KSA9PlxyXG4gICAgICAgICAgTnVtYmVyKGE/LmRhdGE/LmVsZW1lbnROdW1iZXIgfHwgMCkgLVxyXG4gICAgICAgICAgTnVtYmVyKGI/LmRhdGE/LmVsZW1lbnROdW1iZXIgfHwgMCksXHJcbiAgICAgICk7XHJcblxyXG4gICAgY29uc3QgbGF0ZXN0RW50cmFuY2VPYmogPSBleGlzdGluZ0VudHJhbmNlT2JqZWN0cy5hdCgtMSkgYXMgYW55O1xyXG5cclxuICAgIGlmIChsYXRlc3RFbnRyYW5jZU9iaikge1xyXG4gICAgICBjb25zdCBsZWZ0UHggPSBsYXRlc3RFbnRyYW5jZU9iai5sZWZ0ID8/IDA7XHJcbiAgICAgIGNvbnN0IHRvcFB4ID0gbGF0ZXN0RW50cmFuY2VPYmoudG9wID8/IDA7XHJcbiAgICAgIGNvbnN0IHdpZHRoUHggPVxyXG4gICAgICAgIGxhdGVzdEVudHJhbmNlT2JqLmdldFNjYWxlZFdpZHRoPy4oKSB8fCBkZWZhdWx0RW50cmFuY2VXaWR0aFB4O1xyXG4gICAgICBjb25zdCBhbmNob3JBbmdsZSA9IE51bWJlcihsYXRlc3RFbnRyYW5jZU9iai5hbmdsZSB8fCAwKTtcclxuICAgICAgY29uc3QgYW5nbGVSYWQgPSAoYW5jaG9yQW5nbGUgKiBNYXRoLlBJKSAvIDE4MDtcclxuICAgICAgY29uc3Qgc3RlcFB4ID0gd2lkdGhQeCArIGdhcFB4O1xyXG5cclxuICAgICAgeEZ0ID0gdGhpcy5mcm9tUGl4ZWxzKGxlZnRQeCArIHN0ZXBQeCAqIE1hdGguY29zKGFuZ2xlUmFkKSwgXCJmdFwiKTtcclxuICAgICAgeUZ0ID0gdGhpcy5mcm9tUGl4ZWxzKHRvcFB4ICsgc3RlcFB4ICogTWF0aC5zaW4oYW5nbGVSYWQpLCBcImZ0XCIpO1xyXG4gICAgICBhbmdsZSA9IGFuY2hvckFuZ2xlO1xyXG4gICAgICBpc1Bvc2l0aW9uUmVzb2x2ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghaXNQb3NpdGlvblJlc29sdmVkKSB7XHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW50cmFuY2VzID0gbGF5b3V0UG9seWdvblxyXG4gICAgICAgIC5maWx0ZXIoKGVsZTogYW55KSA9PiBlbGUuZWxlbWVudFR5cGUgPT09IFwiZW50cmFuY2VcIilcclxuICAgICAgICAuc29ydChcclxuICAgICAgICAgIChhOiBhbnksIGI6IGFueSkgPT5cclxuICAgICAgICAgICAgTnVtYmVyKGE/LmVsZW1lbnROdW1iZXIgfHwgMCkgLSBOdW1iZXIoYj8uZWxlbWVudE51bWJlciB8fCAwKSxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgY29uc3QgbGF0ZXN0RW50cmFuY2UgPSBleGlzdGluZ0VudHJhbmNlcy5hdCgtMSk7XHJcbiAgICAgIGlmIChsYXRlc3RFbnRyYW5jZSkge1xyXG4gICAgICAgIGNvbnN0IGFuY2hvckFuZ2xlID0gTnVtYmVyKGxhdGVzdEVudHJhbmNlPy5hbmdsZSB8fCAwKTtcclxuICAgICAgICBjb25zdCBhbmdsZVJhZCA9IChhbmNob3JBbmdsZSAqIE1hdGguUEkpIC8gMTgwO1xyXG4gICAgICAgIGNvbnN0IHN0ZXBGdCA9XHJcbiAgICAgICAgICBOdW1iZXIoXHJcbiAgICAgICAgICAgIGxhdGVzdEVudHJhbmNlPy5kaXN0YW5jZSB8fFxyXG4gICAgICAgICAgICAgIHRoaXMuZnJvbVBpeGVscyhkZWZhdWx0RW50cmFuY2VXaWR0aFB4LCBcImZ0XCIpLFxyXG4gICAgICAgICAgKSArIHRoaXMuZnJvbVBpeGVscyhnYXBQeCwgXCJmdFwiKTtcclxuXHJcbiAgICAgICAgeEZ0ID1cclxuICAgICAgICAgIE51bWJlcihsYXRlc3RFbnRyYW5jZT8ucmVsYXRpdmVQb3NpdGlvbj8ueCB8fCAwKSArXHJcbiAgICAgICAgICBzdGVwRnQgKiBNYXRoLmNvcyhhbmdsZVJhZCk7XHJcbiAgICAgICAgeUZ0ID1cclxuICAgICAgICAgIE51bWJlcihsYXRlc3RFbnRyYW5jZT8ucmVsYXRpdmVQb3NpdGlvbj8ueSB8fCAwKSArXHJcbiAgICAgICAgICBzdGVwRnQgKiBNYXRoLnNpbihhbmdsZVJhZCk7XHJcbiAgICAgICAgYW5nbGUgPSBhbmNob3JBbmdsZTtcclxuICAgICAgICBpc1Bvc2l0aW9uUmVzb2x2ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMikgSWYgbm8gZW50cmFuY2UsIHBsYWNlIG5leHQgdG8gd2FsbC0xLlxyXG4gICAgaWYgKCFpc1Bvc2l0aW9uUmVzb2x2ZWQpIHtcclxuICAgICAgY29uc3Qgd2FsbDEgPSBsYXlvdXRQb2x5Z29uLmZpbmQoXHJcbiAgICAgICAgKGVsZTogYW55KSA9PlxyXG4gICAgICAgICAgZWxlLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiBOdW1iZXIoZWxlLmVsZW1lbnROdW1iZXIpID09PSAxLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHdhbGwxKSB7XHJcbiAgICAgICAgY29uc3Qgd2FsbEFuZ2xlID0gTnVtYmVyKHdhbGwxPy5hbmdsZSB8fCAwKTtcclxuICAgICAgICBjb25zdCB3YWxsQW5nbGVSYWQgPSAod2FsbEFuZ2xlICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICAgICAgY29uc3QgYWxvbmdXYWxsRnQgPSBNYXRoLm1pbihOdW1iZXIod2FsbDE/LmRpc3RhbmNlIHx8IDApIC8gMiwgNCk7XHJcbiAgICAgICAgY29uc3Qgc2lkZU9mZnNldEZ0ID0gMS41O1xyXG4gICAgICAgIGNvbnN0IHdhbGxYID0gTnVtYmVyKHdhbGwxPy5yZWxhdGl2ZVBvc2l0aW9uPy54IHx8IDApO1xyXG4gICAgICAgIGNvbnN0IHdhbGxZID0gTnVtYmVyKHdhbGwxPy5yZWxhdGl2ZVBvc2l0aW9uPy55IHx8IDApO1xyXG5cclxuICAgICAgICB4RnQgPVxyXG4gICAgICAgICAgd2FsbFggK1xyXG4gICAgICAgICAgYWxvbmdXYWxsRnQgKiBNYXRoLmNvcyh3YWxsQW5nbGVSYWQpICtcclxuICAgICAgICAgIHNpZGVPZmZzZXRGdCAqIC1NYXRoLnNpbih3YWxsQW5nbGVSYWQpO1xyXG4gICAgICAgIHlGdCA9XHJcbiAgICAgICAgICB3YWxsWSArXHJcbiAgICAgICAgICBhbG9uZ1dhbGxGdCAqIE1hdGguc2luKHdhbGxBbmdsZVJhZCkgK1xyXG4gICAgICAgICAgc2lkZU9mZnNldEZ0ICogTWF0aC5jb3Mod2FsbEFuZ2xlUmFkKTtcclxuICAgICAgICBhbmdsZSA9IHdhbGxBbmdsZTtcclxuICAgICAgICBpc1Bvc2l0aW9uUmVzb2x2ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMykgSWYgbm8gd2FsbCAoZS5nLiBsYXlvdXRQb2x5Z29uIGlzIGVtcHR5KSwgcGxhY2UgbmV4dCB0byBhbnkgY2FudmFzIG9iamVjdC5cclxuICAgIGlmICghaXNQb3NpdGlvblJlc29sdmVkKSB7XHJcbiAgICAgIGNvbnN0IGFuY2hvck9iaiA9ICh0aGlzLmNhbnZhcz8uZ2V0T2JqZWN0cygpID8/IFtdKS5maW5kKChvYmo6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiAhIW9iaj8ub2JqVHlwZSAmJiBvYmo/LmlzRGlzc2VjdGlvbkxpbmUgIT09IHRydWU7XHJcbiAgICAgIH0pIGFzIGFueTtcclxuXHJcbiAgICAgIGlmIChhbmNob3JPYmopIHtcclxuICAgICAgICBjb25zdCBsZWZ0UHggPSBhbmNob3JPYmoubGVmdCA/PyAwO1xyXG4gICAgICAgIGNvbnN0IHRvcFB4ID0gYW5jaG9yT2JqLnRvcCA/PyAwO1xyXG4gICAgICAgIGNvbnN0IHdpZHRoUHggPSBhbmNob3JPYmouZ2V0U2NhbGVkV2lkdGg/LigpIHx8IGRlZmF1bHRFbnRyYW5jZVdpZHRoUHg7XHJcblxyXG4gICAgICAgIHhGdCA9IHRoaXMuZnJvbVBpeGVscyhsZWZ0UHggKyB3aWR0aFB4ICsgZ2FwUHgsIFwiZnRcIik7XHJcbiAgICAgICAgeUZ0ID0gdGhpcy5mcm9tUGl4ZWxzKHRvcFB4LCBcImZ0XCIpO1xyXG4gICAgICAgIGFuZ2xlID0gTnVtYmVyKGFuY2hvck9iaj8uYW5nbGUgfHwgMCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZXdFbnRyYW5jZSA9IHtcclxuICAgICAgZWxlbWVudFR5cGU6IFwiZW50cmFuY2VcIixcclxuICAgICAgZGlzdGFuY2U6IDYsXHJcbiAgICAgIHVuaXQ6IFwiZnRcIixcclxuICAgICAgZGlyZWN0aW9uOiBcInVwXCIsXHJcbiAgICAgIGFuZ2xlLFxyXG4gICAgICBlbGVtZW50TnVtYmVyOiBlbGVOdW1iZXIgKyAxLFxyXG4gICAgICByZWxhdGl2ZVBvc2l0aW9uOiB7XHJcbiAgICAgICAgeDogeEZ0LFxyXG4gICAgICAgIHk6IHlGdCxcclxuICAgICAgICB1bml0OiBcImZ0XCIsXHJcbiAgICAgIH0sXHJcbiAgICAgIGZpeHR1cmVzOiBbXSxcclxuICAgICAgb3RoZXJFbGVtZW50czogW10sXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24ucHVzaChuZXdFbnRyYW5jZSk7XHJcbiAgICB0aGlzLnJlbmRlckZsb29yKHRydWUpO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUVudHJhbmNlQ29vcmRpbmF0ZXMoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZE5ld0ZpeHR1cmUoZml4dHVyZVR5cGU6IFwid2FsbFwiIHwgXCJmbG9vclwiLCB3YWxsSW5kZXg/OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLmxheW91dEZvcm0uZGlzYWJsZWQpIHJldHVybjtcclxuICAgIGNvbnN0IHRlbXBsYXRlOiBhbnkgPSBhd2FpdCB0aGlzLmdldFRlbXBsYXRlKHRoaXMuZml4dHVyZVRlbXBsYXRlc1swXS5faWQpO1xyXG4gICAgY29uc3QgdGVtcGxhdGVEYXRhID0gdGVtcGxhdGUuZGF0YTtcclxuICAgIGNvbnN0IGZpeHR1cmVJZCA9IGBuZXctJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XHJcbiAgICBjb25zdCBmaXh0dXJlR3JvdXAgPSB0aGlzLnBhdGNoRml4dHVyZSh7XHJcbiAgICAgIGZpeHR1cmVOYW1lOiB0ZW1wbGF0ZURhdGEuZml4dHVyZU5hbWUsXHJcbiAgICAgIGZpeHR1cmVDb25maWdJZDogdGVtcGxhdGVEYXRhLl9pZCxcclxuICAgICAgX2lkOiBmaXh0dXJlSWQsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBmaXh0dXJlRGF0YSA9IHtcclxuICAgICAgLi4udGVtcGxhdGVEYXRhLFxyXG4gICAgICBmaXh0dXJlQ29uZmlnSWQ6IHRlbXBsYXRlRGF0YS5faWQsXHJcbiAgICAgIHJlbGF0aXZlUG9zaXRpb246IHsgeDogMCwgeTogMCwgYW5nbGU6IDAsIHVuaXQ6IFwiZnRcIiB9LFxyXG4gICAgICBfaWQ6IGZpeHR1cmVJZCxcclxuICAgICAgdW5zYXZlZENoYW5nZXM6IHRydWUsXHJcbiAgICAgIG5ld0FkZGVkOiB0cnVlLFxyXG4gICAgfTtcclxuICAgIHRoaXMubGF5b3V0SGFzVW5zYXZlZENoYW5nZXMgPSB0cnVlO1xyXG5cclxuICAgIGlmIChmaXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgY29uc3Qgd2FsbERhdGEgPSB0aGlzLmdldFdhbGxCeU51bWJlcih3YWxsSW5kZXghICsgMSk7XHJcblxyXG4gICAgICBjb25zdCB3ID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICBmaXh0dXJlRGF0YS5maXh0dXJlU3RhdGljV2lkdGgudmFsdWUsXHJcbiAgICAgICAgZml4dHVyZURhdGEuZml4dHVyZVN0YXRpY1dpZHRoLnVuaXQsXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHdwID0gdGhpcy5mcm9tUGl4ZWxzKHcsIFwiZnRcIik7XHJcblxyXG4gICAgICBpZiAod2FsbERhdGEpIHtcclxuICAgICAgICBjb25zdCB4MCA9IHdhbGxEYXRhLnJlbGF0aXZlUG9zaXRpb24ueDtcclxuICAgICAgICBjb25zdCB5MCA9IHdhbGxEYXRhLnJlbGF0aXZlUG9zaXRpb24ueTtcclxuICAgICAgICBjb25zdCBhbmdsZURlZyA9IHdhbGxEYXRhLmFuZ2xlIHx8IDA7XHJcbiAgICAgICAgY29uc3QgYW5nbGVSYWQgPSAoYW5nbGVEZWcgKiBNYXRoLlBJKSAvIDE4MDtcclxuICAgICAgICBjb25zdCBjb3NBID0gTWF0aC5jb3MoYW5nbGVSYWQpO1xyXG4gICAgICAgIGNvbnN0IHNpbkEgPSBNYXRoLnNpbihhbmdsZVJhZCk7XHJcblxyXG4gICAgICAgIC8vIFByb2plY3QgYWxsIGV4aXN0aW5nIGZpeHR1cmVzIG9udG8gdGhlIHdhbGwgYXhpcyB0byBnZXQgb2NjdXBpZWQgcmFuZ2VzIChpbiBmdCkuXHJcbiAgICAgICAgLy8gUHJvamVjdGlvbiByZWNvdmVycyB0IGNvcnJlY3RseSBldmVuIHdpdGggdGhlIDFmdCBwZXJwZW5kaWN1bGFyIG9mZnNldCBhcHBsaWVkXHJcbiAgICAgICAgLy8gZHVyaW5nIHBsYWNlbWVudDogKOKIknNpbkHCt2Nvc0EgKyBjb3NBwrdzaW5BKSBjYW5jZWxzIHRvIDAuXHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdGaXh0dXJlcyA9ICh3YWxsRGF0YS5maXh0dXJlcyB8fCBbXSkuZmlsdGVyKFxyXG4gICAgICAgICAgKGY6IGFueSkgPT4gZi5maXh0dXJlTmFtZSAhPT0gXCJzcGFjZVwiLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IG9jY3VwaWVkOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiA9IGV4aXN0aW5nRml4dHVyZXMubWFwKFxyXG4gICAgICAgICAgKGY6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBmV2lkdGggPSB0aGlzLmZyb21QaXhlbHMoXHJcbiAgICAgICAgICAgICAgdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgICAgICAgIGYuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgZi5maXh0dXJlU3RhdGljV2lkdGgudW5pdCxcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgIFwiZnRcIixcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29uc3QgZkhlaWdodCA9IHRoaXMuZnJvbVBpeGVscyhcclxuICAgICAgICAgICAgICB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgICAgICAgZi5maXh0dXJlU3RhdGljTGVuZ3RoLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgZi5maXh0dXJlU3RhdGljTGVuZ3RoLnVuaXQsXHJcbiAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICBcImZ0XCIsXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAvLyBDQUQtdXBsb2FkZWQgZml4dHVyZXMgb24gaW52ZXJ0ZWQgd2FsbHMgKHdhbGwgYW5nbGUg4oiIICg5MMKwLCAyNzDCsCkpXHJcbiAgICAgICAgICAgIC8vIGhhdmUgdGhlaXIgc2F2ZWQgKHgsIHkpIHNoaWZ0ZWQgYnkgUih3YWxsQW5nbGUpwrcodywgaCkgdG8ga2VlcCB0aGVcclxuICAgICAgICAgICAgLy8gY2Fub25pY2FsIHZpc3VhbCBhZnRlciBhIDE4MMKwIGJvZHkgZmxpcCDigJQgc2VlIGRyYXdGaXh0dXJlLiBUb1xyXG4gICAgICAgICAgICAvLyByZWNvdmVyIHRoZSB3YWxsLWF4aXMgcG9zaXRpb24gdGhlIGdhcC1maW5kZXIgbmVlZHMsIHVuc2hpZnQgYW55XHJcbiAgICAgICAgICAgIC8vIGZpeHR1cmUgd2hvc2Ugc2F2ZWQgYW5nbGUgZGlmZmVycyBmcm9tIHRoZSB3YWxsIGFuZ2xlIGJ5IH4xODDCsC5cclxuICAgICAgICAgICAgY29uc3QgZkFuZ2xlID0gKGYucmVsYXRpdmVQb3NpdGlvbi5hbmdsZSA/PyAwKSBhcyBudW1iZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IGFuZ2xlRGlmZiA9XHJcbiAgICAgICAgICAgICAgKCgoKGZBbmdsZSAtIGFuZ2xlRGVnKSAlIDM2MCkgKyAzNjApICUgMzYwKTtcclxuICAgICAgICAgICAgY29uc3QgaXNGbGlwcGVkID0gTWF0aC5hYnMoYW5nbGVEaWZmIC0gMTgwKSA8IDE7XHJcblxyXG4gICAgICAgICAgICBsZXQgcHJvalggPSBmLnJlbGF0aXZlUG9zaXRpb24ueDtcclxuICAgICAgICAgICAgbGV0IHByb2pZID0gZi5yZWxhdGl2ZVBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgIGlmIChpc0ZsaXBwZWQpIHtcclxuICAgICAgICAgICAgICBwcm9qWCAtPSBjb3NBICogZldpZHRoIC0gc2luQSAqIGZIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgcHJvalkgLT0gc2luQSAqIGZXaWR0aCArIGNvc0EgKiBmSGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0U3RhcnQgPSAocHJvalggLSB4MCkgKiBjb3NBICsgKHByb2pZIC0geTApICogc2luQTtcclxuICAgICAgICAgICAgcmV0dXJuIFtNYXRoLm1heCgwLCB0U3RhcnQpLCBNYXRoLm1heCgwLCB0U3RhcnQpICsgZldpZHRoXSBhcyBbXHJcbiAgICAgICAgICAgICAgbnVtYmVyLFxyXG4gICAgICAgICAgICAgIG51bWJlcixcclxuICAgICAgICAgICAgXTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgb2NjdXBpZWQuc29ydCgoYSwgYikgPT4gYVswXSAtIGJbMF0pO1xyXG5cclxuICAgICAgICAvLyBXYWxrIGZyb20gd2FsbCBzdGFydDsgZmluZCBmaXJzdCBnYXAgdGhhdCBmaXRzIHRoZSBuZXcgZml4dHVyZS5cclxuICAgICAgICAvLyBFUFNJTE9OIGFic29yYnMgZmxvYXRpbmctcG9pbnQgZHJpZnQgZnJvbSByZXBlYXRlZCB1bml0IHJvdW5kLXRyaXBzLlxyXG4gICAgICAgIGNvbnN0IEVQU0lMT04gPSAwLjAwMTtcclxuICAgICAgICBsZXQgcGxhY2VtZW50VDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IGN1cnNvciA9IDA7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgW3JhbmdlU3RhcnQsIHJhbmdlRW5kXSBvZiBvY2N1cGllZCkge1xyXG4gICAgICAgICAgaWYgKHJhbmdlU3RhcnQgLSBjdXJzb3IgPj0gd3AgLSBFUFNJTE9OKSB7XHJcbiAgICAgICAgICAgIHBsYWNlbWVudFQgPSBjdXJzb3I7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY3Vyc29yID0gTWF0aC5tYXgoY3Vyc29yLCByYW5nZUVuZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBObyBnYXAgZm91bmQg4oaSIHBsYWNlIGFmdGVyIGxhc3QgZml4dHVyZS5cclxuICAgICAgICAvLyBPdmVyZmxvdyBiZXlvbmQgd2FsbCBsZW5ndGggaXMgaW50ZW50aW9uYWwgcGVyIHJlcXVpcmVtZW50cy5cclxuICAgICAgICBpZiAocGxhY2VtZW50VCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgcGxhY2VtZW50VCA9IGN1cnNvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZ4ID0geDAgKyBwbGFjZW1lbnRUICogY29zQTtcclxuICAgICAgICBjb25zdCBmeSA9IHkwICsgcGxhY2VtZW50VCAqIHNpbkE7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gMC45O1xyXG4gICAgICAgIGNvbnN0IGZ4X29mZnNldCA9IGZ4ICsgb2Zmc2V0ICogLXNpbkE7XHJcbiAgICAgICAgY29uc3QgZnlfb2Zmc2V0ID0gZnkgKyBvZmZzZXQgKiBjb3NBO1xyXG5cclxuICAgICAgICBmaXh0dXJlRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLnggPSBmeF9vZmZzZXQ7XHJcbiAgICAgICAgZml4dHVyZURhdGEucmVsYXRpdmVQb3NpdGlvbi55ID0gZnlfb2Zmc2V0O1xyXG4gICAgICAgIGZpeHR1cmVEYXRhLnJlbGF0aXZlUG9zaXRpb24uYW5nbGUgPSBhbmdsZURlZztcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIHdhbGwgYW5nbGUgcHV0cyB0aGUgZml4dHVyZSBpbiB0aGUgdXBzaWRlLWRvd24gcmFuZ2UsIGJha2VcclxuICAgICAgICAvLyB0aGUgc2FtZSAxODDCsCBib2R5IGZsaXAgZHJhd0ZpeHR1cmUgYXBwbGllcyBkdXJpbmcgQ0FEIGZpcnN0LXJlbmRlclxyXG4gICAgICAgIC8vIChzaGlmdCBhbmNob3IgYnkgUih3YWxsQW5nbGUpwrcodywgaCkgYW5kIHJvdGF0ZSArMTgwwrApLiBkcmF3Rml4dHVyZSdzXHJcbiAgICAgICAgLy8gb3duIGZsaXAgcGF0aCBpcyBnYXRlZCBvbiBjYWRMYXlvdXQ9dHJ1ZSwgc28gZm9yIGZpeHR1cmVzIGFkZGVkXHJcbiAgICAgICAgLy8gcG9zdC1DQUQgdmlhIHRoZSBzaWRlIHBhbmVsIHdlIGhhdmUgdG8gYmFrZSB0aGUgZmxpcCBoZXJlIOKAlCBpdFxyXG4gICAgICAgIC8vIG1ha2VzIHRoZSBuZXcgZml4dHVyZSBsYW5kIGNhbm9uaWNhbCBpbnN0ZWFkIG9mIHVwc2lkZS1kb3duLlxyXG4gICAgICAgIGNvbnN0IG5vcm1XYWxsQW5nbGUgPSAoKChhbmdsZURlZyAlIDM2MCkgKyAzNjApICUgMzYwKTtcclxuICAgICAgICBpZiAobm9ybVdhbGxBbmdsZSA+IDkwICYmIG5vcm1XYWxsQW5nbGUgPCAyNzApIHtcclxuICAgICAgICAgIGNvbnN0IHdpZHRoRnQgPSB0aGlzLmZyb21QaXhlbHMoXHJcbiAgICAgICAgICAgIHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgICAgICAgZml4dHVyZURhdGEuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlLFxyXG4gICAgICAgICAgICAgIGZpeHR1cmVEYXRhLmZpeHR1cmVTdGF0aWNXaWR0aC51bml0LFxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBcImZ0XCIsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgY29uc3QgaGVpZ2h0RnQgPSB0aGlzLmZyb21QaXhlbHMoXHJcbiAgICAgICAgICAgIHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgICAgICAgZml4dHVyZURhdGEuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSxcclxuICAgICAgICAgICAgICBmaXh0dXJlRGF0YS5maXh0dXJlU3RhdGljTGVuZ3RoLnVuaXQsXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIFwiZnRcIixcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBmaXh0dXJlRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLnggPVxyXG4gICAgICAgICAgICBmeF9vZmZzZXQgKyBjb3NBICogd2lkdGhGdCAtIHNpbkEgKiBoZWlnaHRGdDtcclxuICAgICAgICAgIGZpeHR1cmVEYXRhLnJlbGF0aXZlUG9zaXRpb24ueSA9XHJcbiAgICAgICAgICAgIGZ5X29mZnNldCArIHNpbkEgKiB3aWR0aEZ0ICsgY29zQSAqIGhlaWdodEZ0O1xyXG4gICAgICAgICAgZml4dHVyZURhdGEucmVsYXRpdmVQb3NpdGlvbi5hbmdsZSA9IGFuZ2xlRGVnICsgMTgwO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgKHRoaXMuZ2V0Rm9ybVdhbGxzLmF0KHdhbGxJbmRleCEpLmdldChcImZpeHR1cmVzXCIpIGFzIEZvcm1BcnJheSkucHVzaChcclxuICAgICAgICBmaXh0dXJlR3JvdXAsXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZ2V0V2FsbEJ5TnVtYmVyKHdhbGxJbmRleCEgKyAxKT8uZml4dHVyZXMucHVzaChmaXh0dXJlRGF0YSk7XHJcbiAgICB9IGVsc2UgaWYgKGZpeHR1cmVUeXBlID09PSBcImZsb29yXCIpIHtcclxuICAgICAgY29uc3QgZml4dHVyZVdpZHRoUHggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgIGZpeHR1cmVEYXRhLmZpeHR1cmVTdGF0aWNXaWR0aC52YWx1ZSxcclxuICAgICAgICBmaXh0dXJlRGF0YS5maXh0dXJlU3RhdGljV2lkdGgudW5pdCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IGZpeHR1cmVIZWlnaHRQeCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgZml4dHVyZURhdGEuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSxcclxuICAgICAgICBmaXh0dXJlRGF0YS5maXh0dXJlU3RhdGljTGVuZ3RoLnVuaXQsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyBOLXNoYXBlIGdyaWQgcGxhY2VtZW50OiBjb2wgZmlsbHMgbGVmdC10by1yaWdodCwgZWFjaCBjb2x1bW4gZmlsbHMgYm90dG9tIHJvdyAocm93PTEpIGZpcnN0IHRoZW4gdG9wIHJvdyAocm93PTApXHJcbiAgICAgIGNvbnN0IG5ld0luZGV4ID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZS5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IG5ld0NvbCA9IE1hdGguZmxvb3IobmV3SW5kZXggLyAyKTtcclxuICAgICAgY29uc3QgbmV3Um93ID0gbmV3SW5kZXggJSAyID09PSAwID8gMSA6IDA7XHJcblxyXG4gICAgICBsZXQgZ3JpZE9yaWdpblg6IG51bWJlcjtcclxuICAgICAgbGV0IGdyaWRPcmlnaW5ZOiBudW1iZXI7XHJcblxyXG4gICAgICBpZiAodGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgLy8gUmVjb3ZlciBncmlkIG9yaWdpbiBmcm9tIGZpeHR1cmUgYXQgaW5kZXggMCAoYWx3YXlzIHBsYWNlZCBhdCByb3c9MSwgY29sPTApXHJcbiAgICAgICAgY29uc3QgZjAgPSB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlWzBdO1xyXG4gICAgICAgIGNvbnN0IGYweCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgICBmMC5yZWxhdGl2ZVBvc2l0aW9uLngsXHJcbiAgICAgICAgICBmMC5yZWxhdGl2ZVBvc2l0aW9uLnVuaXQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBmMHkgPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgZjAucmVsYXRpdmVQb3NpdGlvbi55LFxyXG4gICAgICAgICAgZjAucmVsYXRpdmVQb3NpdGlvbi51bml0LFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy8gZjAgaXMgYXQgcm93PTEg4oaSIGdyaWRPcmlnaW5ZID0gZjB5IC0gMSAqIGZpeHR1cmVIZWlnaHRQeDsgY29sPTAg4oaSIGdyaWRPcmlnaW5YID0gZjB4XHJcbiAgICAgICAgZ3JpZE9yaWdpblggPSBmMHg7XHJcbiAgICAgICAgZ3JpZE9yaWdpblkgPSBmMHkgLSBmaXh0dXJlSGVpZ2h0UHg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gTm8gZXhpc3RpbmcgY2VudGVyIGZpeHR1cmVzIOKAlCBmaW5kIGJlc3QgZ3JpZCBvcmlnaW4gdmlhIHBvbHlnb24gc2NhbiAoc2FtZSBhcyBkcmF3TGF5b3V0RWxlbWVudHMpXHJcbiAgICAgICAgY29uc3QgbGF5b3V0UG9seWdvbiA9IHRoaXMuYnVpbGRMYXlvdXRQb2x5Z29uRnJvbVdhbGxzKCk7XHJcbiAgICAgICAgY29uc3Qgb2NjdXBpZWRSZWN0cyA9IHRoaXMuZ2V0T2NjdXBpZWRSZWN0cygpO1xyXG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IHRoaXMuZ2V0RnVsbExheW91dEJvdW5kcygpO1xyXG5cclxuICAgICAgICAvLyBSZXNlcnZlIHNwYWNlIGZvciAyIHJvd3MgYW5kIDEgY29sdW1uIGFzIHRoZSBzdGFydGluZyBncmlkIGZvb3RwcmludFxyXG4gICAgICAgIGNvbnN0IGdyaWRXID0gZml4dHVyZVdpZHRoUHg7XHJcbiAgICAgICAgY29uc3QgZ3JpZEggPSAyICogZml4dHVyZUhlaWdodFB4O1xyXG5cclxuICAgICAgICBjb25zdCBjZW50ZXJYID0gYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLyAyO1xyXG4gICAgICAgIGNvbnN0IGNlbnRlclkgPSBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCAvIDI7XHJcblxyXG4gICAgICAgIGNvbnN0IGZpdHNJblBvbHlnb24gPSAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+XHJcbiAgICAgICAgICB0aGlzLmlzUG9pbnRJbnNpZGVQb2x5Z29uKHsgeCwgeSB9LCBsYXlvdXRQb2x5Z29uKSAmJlxyXG4gICAgICAgICAgdGhpcy5pc1BvaW50SW5zaWRlUG9seWdvbih7IHg6IHggKyBncmlkVywgeSB9LCBsYXlvdXRQb2x5Z29uKSAmJlxyXG4gICAgICAgICAgdGhpcy5pc1BvaW50SW5zaWRlUG9seWdvbih7IHgsIHk6IHkgKyBncmlkSCB9LCBsYXlvdXRQb2x5Z29uKSAmJlxyXG4gICAgICAgICAgdGhpcy5pc1BvaW50SW5zaWRlUG9seWdvbihcclxuICAgICAgICAgICAgeyB4OiB4ICsgZ3JpZFcsIHk6IHkgKyBncmlkSCB9LFxyXG4gICAgICAgICAgICBsYXlvdXRQb2x5Z29uLFxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb3ZlcmxhcHNPY2N1cGllZCA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT5cclxuICAgICAgICAgIG9jY3VwaWVkUmVjdHMuc29tZSgob2NjKSA9PlxyXG4gICAgICAgICAgICB0aGlzLnJlY3RzT3ZlcmxhcCh7IHgsIHksIHc6IGdyaWRXLCBoOiBncmlkSCB9LCBvY2MpLFxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2NhbkZvckJlc3RPcmlnaW4gPSAoc2tpcE92ZXJsYXA6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICAgIGxldCBiZXN0U2NvcmUgPSAtSW5maW5pdHk7XHJcbiAgICAgICAgICBsZXQgYmVzdFBvczogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgICBjb25zdCBzdGVwID0gZml4dHVyZVdpZHRoUHggLyAyO1xyXG5cclxuICAgICAgICAgIGZvciAoXHJcbiAgICAgICAgICAgIGxldCB5ID0gYm91bmRzLnRvcDtcclxuICAgICAgICAgICAgeSA8PSBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCAtIGdyaWRIO1xyXG4gICAgICAgICAgICB5ICs9IHN0ZXBcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBmb3IgKFxyXG4gICAgICAgICAgICAgIGxldCB4ID0gYm91bmRzLmxlZnQ7XHJcbiAgICAgICAgICAgICAgeCA8PSBib3VuZHMubGVmdCArIGJvdW5kcy53aWR0aCAtIGdyaWRXO1xyXG4gICAgICAgICAgICAgIHggKz0gc3RlcFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBpZiAoIWZpdHNJblBvbHlnb24oeCwgeSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgIGlmICghc2tpcE92ZXJsYXAgJiYgb3ZlcmxhcHNPY2N1cGllZCh4LCB5KSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IGdyaWRSZWN0ID0geyB4LCB5LCB3OiBncmlkVywgaDogZ3JpZEggfTtcclxuICAgICAgICAgICAgICBjb25zdCBlbXB0eU1hcmdpbiA9IHRoaXMuY29tcHV0ZUVtcHR5TWFyZ2luKFxyXG4gICAgICAgICAgICAgICAgZ3JpZFJlY3QsXHJcbiAgICAgICAgICAgICAgICBib3VuZHMsXHJcbiAgICAgICAgICAgICAgICBvY2N1cGllZFJlY3RzLFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgY29uc3QgZHggPSBjZW50ZXJYIC0gKHggKyBncmlkVyAvIDIpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGR5ID0gY2VudGVyWSAtICh5ICsgZ3JpZEggLyAyKTtcclxuICAgICAgICAgICAgICBjb25zdCBzY29yZSA9IGVtcHR5TWFyZ2luICogMTAwMCAtIChkeCAqIGR4ICsgZHkgKiBkeSkgKiAwLjAwMTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHNjb3JlID4gYmVzdFNjb3JlKSB7XHJcbiAgICAgICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTtcclxuICAgICAgICAgICAgICAgIGJlc3RQb3MgPSB7IHgsIHkgfTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBiZXN0UG9zO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGJlc3RQb3MgPSBzY2FuRm9yQmVzdE9yaWdpbihmYWxzZSkgPz9cclxuICAgICAgICAgIHNjYW5Gb3JCZXN0T3JpZ2luKHRydWUpID8/IHtcclxuICAgICAgICAgICAgeDogY2VudGVyWCAtIGdyaWRXIC8gMixcclxuICAgICAgICAgICAgeTogY2VudGVyWSAtIGdyaWRIIC8gMixcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgIGdyaWRPcmlnaW5YID0gYmVzdFBvcy54O1xyXG4gICAgICAgIGdyaWRPcmlnaW5ZID0gYmVzdFBvcy55O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB4ID0gZ3JpZE9yaWdpblggKyBuZXdDb2wgKiBmaXh0dXJlV2lkdGhQeDtcclxuICAgICAgY29uc3QgeSA9IGdyaWRPcmlnaW5ZICsgbmV3Um93ICogZml4dHVyZUhlaWdodFB4O1xyXG5cclxuICAgICAgZml4dHVyZURhdGEucmVsYXRpdmVQb3NpdGlvbi54ID0gdGhpcy5mcm9tUGl4ZWxzKHgsIFwiZnRcIik7XHJcbiAgICAgIGZpeHR1cmVEYXRhLnJlbGF0aXZlUG9zaXRpb24ueSA9IHRoaXMuZnJvbVBpeGVscyh5LCBcImZ0XCIpO1xyXG5cclxuICAgICAgKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vckZpeHR1cmVzXCIpIGFzIEZvcm1BcnJheSkucHVzaChmaXh0dXJlR3JvdXApO1xyXG4gICAgICB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlLnB1c2goZml4dHVyZURhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMucmVuZGVyRmxvb3IoZmFsc2UpO1xyXG4gICAgdGhpcy51cGRhdGVGaXh0dXJlQ29vcmRpbmF0ZXMoKTtcclxuICB9XHJcblxyXG4gIGFkZE5ld090aGVyRWxlbWVudHMocG9zVHlwZTogXCJ3YWxsXCIgfCBcImZsb29yXCIsIHdhbGxJbmRleD86IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHBvc0RhdGEgPSB7XHJcbiAgICAgIF9pZDogYG5ldy0ke2NyeXB0by5yYW5kb21VVUlEKCl9YCxcclxuICAgICAgZml4dHVyZU5hbWU6IGBQT1MgQ291bnRlcmAsXHJcbiAgICAgIGZpeHR1cmVUeXBlOiBcIm90aGVyXCIsXHJcbiAgICAgIHJlbGF0aXZlUG9zaXRpb246IHsgeDogMCwgeTogMCwgYW5nbGU6IDAsIHVuaXQ6IFwiZnRcIiB9LFxyXG4gICAgICBmaXh0dXJlU3RhdGljTGVuZ3RoOiB7XHJcbiAgICAgICAgdmFsdWU6IDMsXHJcbiAgICAgICAgdW5pdDogXCJmdFwiLFxyXG4gICAgICB9LFxyXG4gICAgICBmaXh0dXJlU3RhdGljV2lkdGg6IHtcclxuICAgICAgICB2YWx1ZTogNSxcclxuICAgICAgICB1bml0OiBcImZ0XCIsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIGxldCB4ID0gcG9zRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLng7XHJcbiAgICBsZXQgeSA9IHBvc0RhdGEucmVsYXRpdmVQb3NpdGlvbi55O1xyXG4gICAgbGV0IGEgPSBwb3NEYXRhLnJlbGF0aXZlUG9zaXRpb24uYW5nbGU7XHJcblxyXG4gICAgY29uc3QgaCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgIHBvc0RhdGEuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSxcclxuICAgICAgcG9zRGF0YS5maXh0dXJlU3RhdGljTGVuZ3RoLnVuaXQsXHJcbiAgICApO1xyXG4gICAgY29uc3QgdyA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgIHBvc0RhdGEuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlLFxyXG4gICAgICBwb3NEYXRhLmZpeHR1cmVTdGF0aWNXaWR0aC51bml0LFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBuZXdPdGhlckdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHR5cGU6IFtwb3NEYXRhLmZpeHR1cmVOYW1lIHx8IFwiUE9TIENvdW50ZXJcIl0sIC8vIGRlZmF1bHQgc2VsZWN0ZWQgbGFiZWxcclxuICAgICAgY3VzdG9tTmFtZTogW1wiXCJdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHBvc1R5cGUgPT0gXCJ3YWxsXCIpIHtcclxuICAgICAgY29uc3Qgd2FsbERhdGEgPSB0aGlzLmdldFdhbGxCeU51bWJlcih3YWxsSW5kZXghICsgMSk7XHJcbiAgICAgIGlmICh3YWxsRGF0YSkge1xyXG4gICAgICAgIGNvbnN0IHgwID0gd2FsbERhdGEucmVsYXRpdmVQb3NpdGlvbi54O1xyXG4gICAgICAgIGNvbnN0IHkwID0gd2FsbERhdGEucmVsYXRpdmVQb3NpdGlvbi55O1xyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHdhbGxEYXRhLmRpc3RhbmNlO1xyXG4gICAgICAgIGNvbnN0IGFuZ2xlRGVnID0gd2FsbERhdGEuYW5nbGUgfHwgMDtcclxuICAgICAgICBjb25zdCBhbmdsZVJhZCA9IChhbmdsZURlZyAqIE1hdGguUEkpIC8gMTgwO1xyXG5cclxuICAgICAgICBjb25zdCBmeCA9IHgwICsgKGxlbmd0aCAvIDIpICogTWF0aC5jb3MoYW5nbGVSYWQpO1xyXG4gICAgICAgIGNvbnN0IGZ5ID0geTAgKyAobGVuZ3RoIC8gMikgKiBNYXRoLnNpbihhbmdsZVJhZCk7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gMi41O1xyXG4gICAgICAgIGNvbnN0IGZ4X29mZnNldCA9IGZ4ICsgb2Zmc2V0ICogLU1hdGguc2luKGFuZ2xlUmFkKTtcclxuICAgICAgICBjb25zdCBmeV9vZmZzZXQgPSBmeSArIG9mZnNldCAqIE1hdGguY29zKGFuZ2xlUmFkKTtcclxuXHJcbiAgICAgICAgeCA9IHRoaXMudG9QaXhlbHMoZnhfb2Zmc2V0LCBcImZ0XCIpO1xyXG4gICAgICAgIHkgPSB0aGlzLnRvUGl4ZWxzKGZ5X29mZnNldCwgXCJmdFwiKTtcclxuICAgICAgICBhID0gYW5nbGVEZWc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIE9iamVjdC5hc3NpZ24ocG9zRGF0YSwge1xyXG4gICAgICAgIGFzc29jaWF0ZWRFbGVtZW50TnVtYmVyOiB3YWxsSW5kZXghICsgMSxcclxuICAgICAgICBhc3NvY2lhdGVkRWxlbWVudFR5cGU6IFwid2FsbFwiLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgICh0aGlzLmdldEZvcm1XYWxscy5hdCh3YWxsSW5kZXghKS5nZXQoXCJvdGhlckVsZW1lbnRzXCIpIGFzIEZvcm1BcnJheSkucHVzaChcclxuICAgICAgICBuZXdPdGhlckdyb3VwLFxyXG4gICAgICApO1xyXG4gICAgICB3YWxsRGF0YS5vdGhlckVsZW1lbnRzLnB1c2goeyAuLi5wb3NEYXRhLCBuZXdBZGRlZDogdHJ1ZSB9KTtcclxuICAgIH0gZWxzZSBpZiAocG9zVHlwZSA9PT0gXCJmbG9vclwiKSB7XHJcbiAgICAgICh0aGlzLmxheW91dEZvcm0uZ2V0KFwiZmxvb3JPdGhlckVsZW1lbnRzXCIpIGFzIEZvcm1BcnJheSkucHVzaChcclxuICAgICAgICBuZXdPdGhlckdyb3VwLFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmZsb29yRGF0YS5vdGhlckVsZW1lbnRzLnB1c2goeyAuLi5wb3NEYXRhLCBuZXdBZGRlZDogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZWN0R3JvdXAgPSB0aGlzLmRyYXdPdGhlckVsZW1lbnRzV2l0aExhYmVsKFxyXG4gICAgICB0aGlzLmNhbnZhcyxcclxuICAgICAgeCxcclxuICAgICAgeSxcclxuICAgICAgYSxcclxuICAgICAgdyxcclxuICAgICAgaCxcclxuICAgICAgcG9zRGF0YSxcclxuICAgICk7XHJcblxyXG4gICAgLy8gbWFrZSBhY3RpdmVcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuY2FudmFzLnNldEFjdGl2ZU9iamVjdChyZWN0R3JvdXApO1xyXG4gICAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgICB9IGNhdGNoIHt9XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpYmVUb090aGVyRWxlbWVudHNDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLnVwZGF0ZU90aGVyRWxlbWVudHNDb29yZGluYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgZmluZEVtcHR5Q2VudGVyU3BvdChcclxuICAgIG9iamVjdFdpZHRoUHg6IG51bWJlcixcclxuICAgIG9iamVjdEhlaWdodFB4OiBudW1iZXIsXHJcbiAgICB0ZW1wT2NjdXBpZWQ6IHtcclxuICAgICAgeDogbnVtYmVyO1xyXG4gICAgICB5OiBudW1iZXI7XHJcbiAgICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICAgIGhlaWdodDogbnVtYmVyO1xyXG4gICAgfVtdID0gW10sXHJcbiAgKSB7XHJcbiAgICBjb25zdCBvYmplY3RzID0gdGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpO1xyXG4gICAgY29uc3QgQ0VOVEVSX09GRlNFVF9YID0gLTMwMDtcclxuICAgIGNvbnN0IENFTlRFUl9PRkZTRVRfWSA9IDA7XHJcbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmdldEZ1bGxMYXlvdXRCb3VuZHMoKTtcclxuXHJcbiAgICBjb25zdCBjZW50ZXJYID0gYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLyAyICsgQ0VOVEVSX09GRlNFVF9YO1xyXG5cclxuICAgIGNvbnN0IGNlbnRlclkgPSBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCAvIDIgKyBDRU5URVJfT0ZGU0VUX1k7XHJcblxyXG4gICAgLy8gMi4gU3BpcmFsIHNlYXJjaCBwYXJhbWV0ZXJzXHJcbiAgICBjb25zdCBzdGVwID0gMjA7XHJcbiAgICBjb25zdCBtYXhSYWRpdXMgPSBNYXRoLm1heChib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpO1xyXG5cclxuICAgIGZvciAobGV0IHJhZGl1cyA9IDA7IHJhZGl1cyA8IG1heFJhZGl1czsgcmFkaXVzICs9IHN0ZXApIHtcclxuICAgICAgZm9yIChsZXQgYW5nbGUgPSAwOyBhbmdsZSA8IDM2MDsgYW5nbGUgKz0gMzApIHtcclxuICAgICAgICBjb25zdCByYWQgPSAoYW5nbGUgKiBNYXRoLlBJKSAvIDE4MDtcclxuXHJcbiAgICAgICAgLy8g8J+UpyBGSVg6IGNlbnRlciDihpIgdG9wLWxlZnRcclxuICAgICAgICBjb25zdCB4ID0gY2VudGVyWCArIHJhZGl1cyAqIE1hdGguY29zKHJhZCkgLSBvYmplY3RXaWR0aFB4IC8gMjtcclxuICAgICAgICBjb25zdCB5ID0gY2VudGVyWSArIHJhZGl1cyAqIE1hdGguc2luKHJhZCkgLSBvYmplY3RIZWlnaHRQeCAvIDI7XHJcblxyXG4gICAgICAgIGNvbnN0IHRlc3RSZWN0ID0ge1xyXG4gICAgICAgICAgbGVmdDogeCxcclxuICAgICAgICAgIHRvcDogeSxcclxuICAgICAgICAgIHdpZHRoOiBvYmplY3RXaWR0aFB4LFxyXG4gICAgICAgICAgaGVpZ2h0OiBvYmplY3RIZWlnaHRQeCxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyAzLiBDaGVjayBjb2xsaXNpb24gd2l0aCBleGlzdGluZyBjYW52YXMgb2JqZWN0c1xyXG4gICAgICAgIGNvbnN0IGNhbnZhc0NvbGxpc2lvbiA9IG9iamVjdHMuc29tZSgob2JqKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCByZWN0ID0gb2JqLmdldEJvdW5kaW5nUmVjdCgpO1xyXG4gICAgICAgICAgcmV0dXJuICEoXHJcbiAgICAgICAgICAgIHJlY3QubGVmdCA+IHRlc3RSZWN0LmxlZnQgKyB0ZXN0UmVjdC53aWR0aCB8fFxyXG4gICAgICAgICAgICByZWN0LmxlZnQgKyByZWN0LndpZHRoIDwgdGVzdFJlY3QubGVmdCB8fFxyXG4gICAgICAgICAgICByZWN0LnRvcCA+IHRlc3RSZWN0LnRvcCArIHRlc3RSZWN0LmhlaWdodCB8fFxyXG4gICAgICAgICAgICByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IDwgdGVzdFJlY3QudG9wXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoY2FudmFzQ29sbGlzaW9uKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgLy8gNC4gQ2hlY2sgY29sbGlzaW9uIHdpdGggdGVtcCBwbGFjZWQgZml4dHVyZXMgKENBRCBiYXRjaClcclxuICAgICAgICBjb25zdCB0ZW1wQ29sbGlzaW9uID0gdGVtcE9jY3VwaWVkLnNvbWUoKG8pID0+IHtcclxuICAgICAgICAgIHJldHVybiAhKFxyXG4gICAgICAgICAgICBvLnggPiB0ZXN0UmVjdC5sZWZ0ICsgdGVzdFJlY3Qud2lkdGggfHxcclxuICAgICAgICAgICAgby54ICsgby53aWR0aCA8IHRlc3RSZWN0LmxlZnQgfHxcclxuICAgICAgICAgICAgby55ID4gdGVzdFJlY3QudG9wICsgdGVzdFJlY3QuaGVpZ2h0IHx8XHJcbiAgICAgICAgICAgIG8ueSArIG8uaGVpZ2h0IDwgdGVzdFJlY3QudG9wXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodGVtcENvbGxpc2lvbikgY29udGludWU7XHJcblxyXG4gICAgICAgIHJldHVybiB7IHgsIHkgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FuY2VsRWRpdCgpIHtcclxuICAgIHRoaXMuaGlnaGxpZ2h0ZWRGaXh0dXJlRm9ybUlkID0gbnVsbDtcclxuICAgIGF3YWl0IHRoaXMuZ2V0U3RvcmVGaXh0dXJlcyh0aGlzLnBsYW5vRGF0YS5faWQpO1xyXG4gIH1cclxuXHJcbiAgbGlzdGVuVG9EZWxldGVLZXkoKSB7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCAoZSkgPT4ge1xyXG4gICAgICBpZiAoZS5rZXkgPT09IFwiRGVsZXRlXCIgJiYgdGhpcy5sYXlvdXRGb3JtLmVuYWJsZWQpIHtcclxuICAgICAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmNhbnZhcz8uZ2V0QWN0aXZlT2JqZWN0KCkgYXMgYW55O1xyXG5cclxuICAgICAgICBpZiAoYWN0aXZlICYmIChhY3RpdmUgYXMgYW55KS5vYmpUeXBlID09PSBcImVudHJhbmNlXCIpIHtcclxuICAgICAgICAgIHRoaXMuZGVsZXRlRW50cmFuY2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhY3RpdmUgJiYgKGFjdGl2ZSBhcyBhbnkpLm9ialR5cGUgPT09IFwid2FsbFwiKSB7XHJcbiAgICAgICAgICBpZiAoYWN0aXZlPy5kYXRhPy5lbGVtZW50TnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlV2FsbChhY3RpdmU/LmRhdGE/LmVsZW1lbnROdW1iZXIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFjdGl2ZSAmJiAoYWN0aXZlIGFzIGFueSkub2JqVHlwZSA9PT0gXCJmaXh0dXJlXCIpIHtcclxuICAgICAgICAgIGlmIChhY3RpdmU/LmZpeHR1cmVUeXBlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlRml4dHVyZShcclxuICAgICAgICAgICAgICBhY3RpdmU/LmZpeHR1cmVUeXBlLFxyXG4gICAgICAgICAgICAgIGFjdGl2ZT8uZml4dHVyZUluZGV4IC0gMSxcclxuICAgICAgICAgICAgICBhY3RpdmU/LndhbGxJbmRleCAtIDEsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZUVudHJhbmNlKCkge1xyXG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5jYW52YXMuZ2V0QWN0aXZlT2JqZWN0KCkgYXMgYW55O1xyXG5cclxuICAgIGlmIChhY3RpdmUgJiYgYWN0aXZlLm9ialR5cGUgPT09IFwiZW50cmFuY2VcIikge1xyXG4gICAgICBjb25zdCBpID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5maW5kSW5kZXgoXHJcbiAgICAgICAgKGVsOiBhbnkpID0+XHJcbiAgICAgICAgICBlbC5lbGVtZW50VHlwZSA9PT0gXCJlbnRyYW5jZVwiICYmXHJcbiAgICAgICAgICBlbC5lbGVtZW50TnVtYmVyID09PSBhY3RpdmUuZGF0YS5lbGVtZW50TnVtYmVyLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKGkgPj0gMCkge1xyXG4gICAgICAgIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uc3BsaWNlKGksIDEpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyRmxvb3IodHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZGVsZXRlV2FsbChlbGVOdW1iZXI6IG51bWJlcikge1xyXG4gICAgY29uc3Qgd2FsbCA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZmluZChcclxuICAgICAgKGVsZTogYW55KSA9PlxyXG4gICAgICAgIGVsZS5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIgJiYgZWxlLmVsZW1lbnROdW1iZXIgPT09IGVsZU51bWJlcixcclxuICAgICk7XHJcbiAgICBpZiAod2FsbC5maXh0dXJlcy5sZW5ndGggfHwgd2FsbC5vdGhlckVsZW1lbnRzLmxlbmd0aClcclxuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jb25maXJtRGVsZXRlV2FsbCgpKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGkgPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZpbmRJbmRleChcclxuICAgICAgKGVsOiBhbnkpID0+IGVsLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiBlbC5lbGVtZW50TnVtYmVyID09PSBlbGVOdW1iZXIsXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uc3BsaWNlKGksIDEpO1xyXG4gICAgdGhpcy51cGRhdGVXYWxsRWxlbWVudE51bWJlcigpO1xyXG4gICAgdGhpcy5yZW5kZXJGbG9vcih0cnVlKTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlV2FsbEVsZW1lbnROdW1iZXIoKSB7XHJcbiAgICBjb25zdCBvbmx5V2FsbHMgPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uPy5maWx0ZXIoXHJcbiAgICAgIChlbDogYW55KSA9PiBlbC5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIsXHJcbiAgICApO1xyXG5cclxuICAgIG9ubHlXYWxscz8uZm9yRWFjaCgoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGl0ZW0uZWxlbWVudE51bWJlciA9IGluZGV4ICsgMTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9QaXhlbHModmFsdWU6IG51bWJlciwgdW5pdDogc3RyaW5nLCBkcGkgPSAyLjgpIHtcclxuICAgIGxldCBwaXhlbHM6IG51bWJlcjtcclxuXHJcbiAgICBpZiAodW5pdCA9PT0gXCJtbVwiKSB7XHJcbiAgICAgIHBpeGVscyA9ICh2YWx1ZSAvIDI1LjQpICogZHBpO1xyXG4gICAgfSBlbHNlIGlmICh1bml0ID09PSBcImZ0XCIpIHtcclxuICAgICAgcGl4ZWxzID0gdmFsdWUgKiAxMiAqIGRwaTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIHVuaXQuIFVzZSAnbW0nIG9yICdmdCcuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBOdW1iZXIocGl4ZWxzLnRvRml4ZWQoNCkpO1xyXG4gIH1cclxuXHJcbiAgZnJvbVBpeGVscyhwaXhlbHM6IG51bWJlciwgdW5pdDogc3RyaW5nLCBkcGkgPSAyLjgpOiBudW1iZXIge1xyXG4gICAgbGV0IHZhbHVlOiBudW1iZXI7XHJcblxyXG4gICAgLy8gcGl4ZWxzID0gcGl4ZWxzID49IHRoaXMud2FsbFRoaWNrbmVzcyA/IHBpeGVscyAtIHRoaXMud2FsbFRoaWNrbmVzcyA6IHRoaXMud2FsbFRoaWNrbmVzcztcclxuXHJcbiAgICBpZiAodW5pdCA9PT0gXCJtbVwiKSB7XHJcbiAgICAgIHZhbHVlID0gKHBpeGVscyAvIGRwaSkgKiAyNS40O1xyXG4gICAgfSBlbHNlIGlmICh1bml0ID09PSBcImZ0XCIpIHtcclxuICAgICAgdmFsdWUgPSBwaXhlbHMgLyAoMTIgKiBkcGkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgdW5pdC4gVXNlICdtbScgb3IgJ2Z0Jy5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZS50b0ZpeGVkKDQpKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1TYXZlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKExheW91dEVkaXRDb25maXJtYXRpb25Db21wb25lbnQsIHtcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgfSk7XHJcbiAgICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gXCJTYXZlIGFzIGRyYWZ0XCI7XHJcbiAgICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLmRlc2NyaXB0aW9uID1cclxuICAgICAgICBcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBtb3ZlIHRoaXMgYmFjayB0byBEcmFmdD8gVGhpcyB3aWxsIGtlZXAgdGhlIHBsYW5vZ3JhbSBpbiBEcmFmdCBhbmQgbWFrZSBpdCByZWFkeSBmb3IgYWxsb2NhdGlvbiBvbmNlIGFwcHJvdmVkLlwiO1xyXG4gICAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSBcIm9rXCIpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY29uZmlybURlbGV0ZVdhbGwoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7XHJcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSBcIkRlbGV0ZSB3YWxsXCI7XHJcbiAgICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLmRlc2NyaXB0aW9uID1cclxuICAgICAgICBcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyB3YWxsIGFsb25nIHdpdGggaXRzIGFzc29jaWF0ZWQgZml4dHVyZXMgYW5kIGVsZW1lbnRzP1wiO1xyXG5cclxuICAgICAgcmV0dXJuIGF3YWl0IG1vZGVsUmVmLnJlc3VsdC50aGVuPGJvb2xlYW4+KChyZXN1bHQpID0+IHJlc3VsdCA9PT0gXCJva1wiKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUZpeHR1cmVDb29yZGluYXRlcyhmaXh0dXJlcz86IGFueSkge1xyXG4gICAgY29uc3QgZml4dHVyZXNGcm9tQ2FudmFzID1cclxuICAgICAgZml4dHVyZXMgPz9cclxuICAgICAgdGhpcy5jYW52YXNcclxuICAgICAgICAuZ2V0T2JqZWN0cygpXHJcbiAgICAgICAgLmZpbHRlcigob2JqKSA9PiAob2JqIGFzIGFueSkuZml4dHVyZUlkKVxyXG4gICAgICAgIC5tYXAoKG9iaikgPT4gKHtcclxuICAgICAgICAgIGlkOiAob2JqIGFzIGFueSkuZml4dHVyZUlkLFxyXG4gICAgICAgICAgeDogb2JqLmxlZnQsXHJcbiAgICAgICAgICB5OiBvYmoudG9wLFxyXG4gICAgICAgICAgYW5nbGU6IG9iaj8uYW5nbGUgPz8gMCxcclxuICAgICAgICB9KSk7XHJcbiAgICBjb25zdCBwb3NNYXAgPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzRnJvbUNhbnZhcykge1xyXG4gICAgICBwb3NNYXAuc2V0KGZpeHR1cmUuaWQsIHtcclxuICAgICAgICB4OiB0aGlzLmZyb21QaXhlbHMoZml4dHVyZS54LCBcImZ0XCIpLFxyXG4gICAgICAgIHk6IHRoaXMuZnJvbVBpeGVscyhmaXh0dXJlLnksIFwiZnRcIiksXHJcbiAgICAgICAgYW5nbGU6IGZpeHR1cmUuYW5nbGUsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUuZm9yRWFjaCgoY2Y6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBsYXRlc3RGaXh0dXJlUG9zID0gcG9zTWFwLmdldChjZi5faWQpO1xyXG4gICAgICBpZiAobGF0ZXN0Rml4dHVyZVBvcykge1xyXG4gICAgICAgIGNmLnJlbGF0aXZlUG9zaXRpb24ueCA9IGxhdGVzdEZpeHR1cmVQb3MueDtcclxuICAgICAgICBjZi5yZWxhdGl2ZVBvc2l0aW9uLnkgPSBsYXRlc3RGaXh0dXJlUG9zLnk7XHJcbiAgICAgICAgY2YucmVsYXRpdmVQb3NpdGlvbi5hbmdsZSA9IGxhdGVzdEZpeHR1cmVQb3MuYW5nbGU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZm9yRWFjaCgodzogYW55KSA9PiB7XHJcbiAgICAgIHc/LmZpeHR1cmVzPy5mb3JFYWNoKCh3ZjogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGF0ZXN0Rml4dHVyZVBvcyA9IHBvc01hcC5nZXQod2YuX2lkKTtcclxuICAgICAgICBpZiAobGF0ZXN0Rml4dHVyZVBvcykge1xyXG4gICAgICAgICAgd2YucmVsYXRpdmVQb3NpdGlvbi54ID0gbGF0ZXN0Rml4dHVyZVBvcy54O1xyXG4gICAgICAgICAgd2YucmVsYXRpdmVQb3NpdGlvbi55ID0gbGF0ZXN0Rml4dHVyZVBvcy55O1xyXG4gICAgICAgICAgd2YucmVsYXRpdmVQb3NpdGlvbi5hbmdsZSA9IGxhdGVzdEZpeHR1cmVQb3MuYW5nbGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlT3RoZXJFbGVtZW50c0Nvb3JkaW5hdGVzKCkge1xyXG4gICAgY29uc3Qgb3RoZXJzRnJvbUNhbnZhcyA9IHRoaXMuY2FudmFzXHJcbiAgICAgIC5nZXRPYmplY3RzKClcclxuICAgICAgLmZpbHRlcigob2JqKSA9PiAob2JqIGFzIGFueSkub2JqVHlwZSA9PT0gXCJvdGhlcnNcIilcclxuICAgICAgLm1hcCgob2JqKSA9PiAoe1xyXG4gICAgICAgIGlkOiAob2JqIGFzIGFueSkuZGF0YT8uX2lkLFxyXG4gICAgICAgIGxhYmVsOiAob2JqIGFzIGFueSkuZGF0YT8uZml4dHVyZU5hbWUsXHJcbiAgICAgICAgeDogb2JqLmxlZnQsXHJcbiAgICAgICAgeTogb2JqLnRvcCxcclxuICAgICAgICBhbmdsZTogb2JqPy5hbmdsZSA/PyAwLFxyXG4gICAgICAgIHdpZHRoOiB0aGlzLmZyb21QaXhlbHMob2JqLmdldFNjYWxlZFdpZHRoKCkgLSAyLCBcImZ0XCIpLFxyXG4gICAgICAgIGhlaWdodDogdGhpcy5mcm9tUGl4ZWxzKG9iai5nZXRTY2FsZWRIZWlnaHQoKSAtIDIsIFwiZnRcIiksXHJcbiAgICAgIH0pKTtcclxuXHJcbiAgICBjb25zdCBwb3NNYXAgPSBuZXcgTWFwPFxyXG4gICAgICBzdHJpbmcsXHJcbiAgICAgIHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IGFuZ2xlOiBudW1iZXI7IGg6IG51bWJlcjsgdzogbnVtYmVyIH1cclxuICAgID4oKTtcclxuICAgIGZvciAoY29uc3Qgb3RoZXIgb2Ygb3RoZXJzRnJvbUNhbnZhcykge1xyXG4gICAgICBpZiAob3RoZXIuaWQpIHtcclxuICAgICAgICBwb3NNYXAuc2V0KG90aGVyLmlkLCB7XHJcbiAgICAgICAgICB4OiB0aGlzLmZyb21QaXhlbHMob3RoZXIueCwgXCJmdFwiKSxcclxuICAgICAgICAgIHk6IHRoaXMuZnJvbVBpeGVscyhvdGhlci55LCBcImZ0XCIpLFxyXG4gICAgICAgICAgYW5nbGU6IG90aGVyLmFuZ2xlLFxyXG4gICAgICAgICAgaDogb3RoZXIuaGVpZ2h0LFxyXG4gICAgICAgICAgdzogb3RoZXIud2lkdGgsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmZsb29yRGF0YS5vdGhlckVsZW1lbnRzKSkge1xyXG4gICAgICB0aGlzLmZsb29yRGF0YS5vdGhlckVsZW1lbnRzLmZvckVhY2goKGVsOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3RPdGhlcnNQb3MgPSBwb3NNYXAuZ2V0KGVsLl9pZCk7XHJcbiAgICAgICAgaWYgKGxhdGVzdE90aGVyc1Bvcykge1xyXG4gICAgICAgICAgZWwucmVsYXRpdmVQb3NpdGlvbi54ID0gbGF0ZXN0T3RoZXJzUG9zLng7XHJcbiAgICAgICAgICBlbC5yZWxhdGl2ZVBvc2l0aW9uLnkgPSBsYXRlc3RPdGhlcnNQb3MueTtcclxuICAgICAgICAgIGVsLnJlbGF0aXZlUG9zaXRpb24uYW5nbGUgPSBsYXRlc3RPdGhlcnNQb3MuYW5nbGU7XHJcbiAgICAgICAgICBlbC5maXh0dXJlU3RhdGljTGVuZ3RoLnZhbHVlID0gbGF0ZXN0T3RoZXJzUG9zLmg7XHJcbiAgICAgICAgICBlbC5maXh0dXJlU3RhdGljV2lkdGgudmFsdWUgPSBsYXRlc3RPdGhlcnNQb3MudztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZm9yRWFjaCgodzogYW55KSA9PiB7XHJcbiAgICAgIHc/Lm90aGVyRWxlbWVudHM/LmZvckVhY2goKHdmOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3RPdGhlcnNQb3MgPSBwb3NNYXAuZ2V0KHdmLl9pZCk7XHJcbiAgICAgICAgaWYgKGxhdGVzdE90aGVyc1Bvcykge1xyXG4gICAgICAgICAgd2YucmVsYXRpdmVQb3NpdGlvbi54ID0gbGF0ZXN0T3RoZXJzUG9zLng7XHJcbiAgICAgICAgICB3Zi5yZWxhdGl2ZVBvc2l0aW9uLnkgPSBsYXRlc3RPdGhlcnNQb3MueTtcclxuICAgICAgICAgIHdmLnJlbGF0aXZlUG9zaXRpb24uYW5nbGUgPSBsYXRlc3RPdGhlcnNQb3MuYW5nbGU7XHJcbiAgICAgICAgICB3Zi5maXh0dXJlU3RhdGljTGVuZ3RoLnZhbHVlID0gbGF0ZXN0T3RoZXJzUG9zLmg7XHJcbiAgICAgICAgICB3Zi5maXh0dXJlU3RhdGljV2lkdGgudmFsdWUgPSBsYXRlc3RPdGhlcnNQb3MudztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVXYWxsQ29vcmRpbmF0ZXMoKSB7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jYW52YXNcclxuICAgICAgLmdldE9iamVjdHMoKVxyXG4gICAgICAuZmlsdGVyKChvYmopID0+IChvYmogYXMgYW55KS5vYmpUeXBlID09PSBcIndhbGxcIilcclxuICAgICAgLm1hcCgob2JqKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHRvcDogdGhpcy5mcm9tUGl4ZWxzKG9iai50b3AsIFwiZnRcIiksXHJcbiAgICAgICAgICBsZWZ0OiB0aGlzLmZyb21QaXhlbHMob2JqLmxlZnQsIFwiZnRcIiksXHJcbiAgICAgICAgICB3aWR0aDogdGhpcy5mcm9tUGl4ZWxzKG9iai5nZXRTY2FsZWRXaWR0aCgpIC0gMC4yNywgXCJmdFwiKSxcclxuICAgICAgICAgIGhlaWdodDogdGhpcy5mcm9tUGl4ZWxzKG9iai5nZXRTY2FsZWRIZWlnaHQoKSAtIDAuMjcsIFwiZnRcIiksXHJcbiAgICAgICAgICBhbmdsZTogb2JqLmFuZ2xlLFxyXG4gICAgICAgICAgZWxlbWVudERhdGE6IChvYmogYXMgYW55KS5kYXRhLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHBvc01hcCA9IG5ldyBNYXAoKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHdhbGwgb2YgZGF0YSkge1xyXG4gICAgICBwb3NNYXAuc2V0KFxyXG4gICAgICAgIGAke3dhbGwuZWxlbWVudERhdGEuZWxlbWVudFR5cGV9JHt3YWxsLmVsZW1lbnREYXRhLmVsZW1lbnROdW1iZXJ9YCxcclxuICAgICAgICBkYXRhLmZpbmQoXHJcbiAgICAgICAgICAob2JqKSA9PlxyXG4gICAgICAgICAgICBvYmouZWxlbWVudERhdGEuZWxlbWVudFR5cGUgPT09IHdhbGwuZWxlbWVudERhdGEuZWxlbWVudFR5cGUgJiZcclxuICAgICAgICAgICAgb2JqLmVsZW1lbnREYXRhLmVsZW1lbnROdW1iZXIgPT09IHdhbGwuZWxlbWVudERhdGEuZWxlbWVudE51bWJlcixcclxuICAgICAgICApLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZm9yRWFjaCgodzogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHdhbGxQb3MgPSBwb3NNYXAuZ2V0KGAke3cuZWxlbWVudFR5cGV9JHt3LmVsZW1lbnROdW1iZXJ9YCk7XHJcbiAgICAgIGlmICh3YWxsUG9zKSB7XHJcbiAgICAgICAgdy5yZWxhdGl2ZVBvc2l0aW9uLnggPSB3YWxsUG9zLmxlZnQ7XHJcbiAgICAgICAgdy5yZWxhdGl2ZVBvc2l0aW9uLnkgPSB3YWxsUG9zLnRvcDtcclxuICAgICAgICB3LmFuZ2xlID0gd2FsbFBvcy5hbmdsZTtcclxuICAgICAgICB3LmRpc3RhbmNlID0gd2FsbFBvcy53aWR0aDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVFbnRyYW5jZUNvb3JkaW5hdGVzKCkge1xyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY2FudmFzXHJcbiAgICAgIC5nZXRPYmplY3RzKClcclxuICAgICAgLmZpbHRlcigob2JqKSA9PiAob2JqIGFzIGFueSkub2JqVHlwZSA9PT0gXCJlbnRyYW5jZVwiKVxyXG4gICAgICAubWFwKChvYmopID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgdG9wOiB0aGlzLmZyb21QaXhlbHMob2JqLnRvcCwgXCJmdFwiKSxcclxuICAgICAgICAgIGxlZnQ6IHRoaXMuZnJvbVBpeGVscyhvYmoubGVmdCwgXCJmdFwiKSxcclxuICAgICAgICAgIHdpZHRoOiB0aGlzLmZyb21QaXhlbHMob2JqLmdldFNjYWxlZFdpZHRoKCksIFwiZnRcIiksXHJcbiAgICAgICAgICBhbmdsZTogb2JqLmFuZ2xlLFxyXG4gICAgICAgICAgZWxlbWVudERhdGE6IChvYmogYXMgYW55KS5kYXRhLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHBvc01hcCA9IG5ldyBNYXAoKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGVudHJhbmNlIG9mIGRhdGEpIHtcclxuICAgICAgcG9zTWFwLnNldChcclxuICAgICAgICBgJHtlbnRyYW5jZS5lbGVtZW50RGF0YS5lbGVtZW50VHlwZX0ke2VudHJhbmNlLmVsZW1lbnREYXRhLmVsZW1lbnROdW1iZXJ9YCxcclxuICAgICAgICBkYXRhLmZpbmQoXHJcbiAgICAgICAgICAob2JqKSA9PlxyXG4gICAgICAgICAgICBvYmouZWxlbWVudERhdGEuZWxlbWVudFR5cGUgPT09IGVudHJhbmNlLmVsZW1lbnREYXRhLmVsZW1lbnRUeXBlICYmXHJcbiAgICAgICAgICAgIG9iai5lbGVtZW50RGF0YS5lbGVtZW50TnVtYmVyID09PVxyXG4gICAgICAgICAgICAgIGVudHJhbmNlLmVsZW1lbnREYXRhLmVsZW1lbnROdW1iZXIsXHJcbiAgICAgICAgKSxcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKHc6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBlbnRyYW5jZVBvcyA9IHBvc01hcC5nZXQoYCR7dy5lbGVtZW50VHlwZX0ke3cuZWxlbWVudE51bWJlcn1gKTtcclxuICAgICAgaWYgKGVudHJhbmNlUG9zKSB7XHJcbiAgICAgICAgdy5yZWxhdGl2ZVBvc2l0aW9uLnggPSBlbnRyYW5jZVBvcy5sZWZ0O1xyXG4gICAgICAgIHcucmVsYXRpdmVQb3NpdGlvbi55ID0gZW50cmFuY2VQb3MudG9wO1xyXG4gICAgICAgIHcuYW5nbGUgPSBlbnRyYW5jZVBvcy5hbmdsZTtcclxuICAgICAgICB3LmRpc3RhbmNlID0gZW50cmFuY2VQb3Mud2lkdGg7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFVwZGF0ZSBkaXNzZWN0aW9uIGxpbmVzIHdoZW5ldmVyIGVudHJhbmNlIGNvb3JkaW5hdGVzIGNoYW5nZVxyXG4gICAgdGhpcy51cGRhdGVEaXNzZWN0aW9uTGluZXMoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZUxheW91dChlZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAvLyBpZiAoXHJcbiAgICAvLyAgIGVkaXRNb2RlICYmXHJcbiAgICAvLyAgIHRoaXMuZ2V0U3RhdHVzID09PSBcImFsbG9jYXRpb25QZW5kaW5nXCIgJiZcclxuICAgIC8vICAgdXBkYXRlU3RhdHVzID09PSBcImRyYWZ0XCJcclxuICAgIC8vICkge1xyXG4gICAgLy8gICBpZiAoIShhd2FpdCB0aGlzLmNvbmZpcm1TYXZlKCkpKSB7XHJcbiAgICAvLyAgICAgdGhpcy5sYXlvdXRGb3JtLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgLy8gICAgIHRoaXMucmVuZGVyRmxvb3IoZmFsc2UpO1xyXG4gICAgLy8gICAgIHJldHVybjtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgIGVsZW1lbnQuZml4dHVyZXMgPSBlbGVtZW50LmZpeHR1cmVzLmZpbHRlcihcclxuICAgICAgICAoZml4dHVyZTogYW55KSA9PiAhZml4dHVyZT8uZ2hvc3QgJiYgZml4dHVyZS5maXh0dXJlTmFtZSAhPT0gXCJzcGFjZVwiLFxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZVxyXG4gICAgICAuZmlsdGVyKChmaXh0dXJlOiBhbnkpID0+ICFmaXh0dXJlPy5naG9zdClcclxuICAgICAgLm1hcCgoZml4dHVyZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgeyBhc3NvY2lhdGVkRWxlbWVudFR5cGUsIGFzc29jaWF0ZWRFbGVtZW50TnVtYmVyLCAuLi5yZXN0IH0gPVxyXG4gICAgICAgICAgZml4dHVyZTtcclxuICAgICAgICByZXR1cm4gcmVzdDtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLnJlb3JkZXJGaXh0dXJlKHRoaXMuZmxvb3JEYXRhKTtcclxuXHJcbiAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICBmbG9vcklkOiB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgIGRhdGE6IHsgLi4udGhpcy5mbG9vckRhdGEgfSxcclxuICAgICAgZWRpdE1vZGU6IGVkaXRNb2RlLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmlzU2F2aW5nTGF5b3V0ID0gdHJ1ZTtcclxuICAgIHRoaXMuYXBpU2VydmljZS51cGRhdGVTdG9yZVBsYW5vKHBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcclxuICAgICAgICB0aGlzLmdldFN0b3JlRml4dHVyZXModGhpcy5wbGFub0RhdGEuX2lkKTtcclxuICAgICAgICB0aGlzLmlzU2F2aW5nTGF5b3V0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRIYXNVbnNhdmVkQ2hhbmdlcyA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gdXBkYXRlIGxheW91dFwiKTtcclxuICAgICAgICB0aGlzLmlzU2F2aW5nTGF5b3V0ID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQ2xpY2tFZGl0KCkge1xyXG4gICAgdGhpcy50b2dnbGVQYW5lbChcInJpZ2h0XCIsIHRydWUpO1xyXG4gICAgdGhpcy50b2dnbGVQYW5lbChcImxlZnRcIiwgZmFsc2UpO1xyXG5cclxuICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgdGhpcy5sYXlvdXRGb3JtLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkRml4dHVyZUZvcm1JZCA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJGbG9vcigpO1xyXG4gIH1cclxuXHJcbiAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBsYXlvdXQgaGFzIHBlbmRpbmcgY2hhbmdlcyB0aGUgdXNlciBtdXN0IHNhdmUgYmVmb3JlXHJcbiAgLy8gdGhleSBjYW4gZWRpdCBhbiBpbmRpdmlkdWFsIGZpeHR1cmUuIFNldCBieSBhbGwgbGF5b3V0IG11dGF0aW9uIGhhbmRsZXJzXHJcbiAgLy8gKGFkZCAvIGRlbGV0ZSAvIG1vdmUgLyB0ZW1wbGF0ZSBjaGFuZ2UpLCBjbGVhcmVkIG9uIHN1Y2Nlc3NmdWwgc2F2ZS5cclxuICBwcml2YXRlIGhhc1Vuc2F2ZWRMYXlvdXRDaGFuZ2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMubGF5b3V0SGFzVW5zYXZlZENoYW5nZXMpIHJldHVybiB0cnVlO1xyXG4gICAgY29uc3Qgd2FsbEZpeHR1cmVzID0gKHRoaXMuZmxvb3JEYXRhPy5sYXlvdXRQb2x5Z29uID8/IFtdKS5mbGF0TWFwKFxyXG4gICAgICAoZWw6IGFueSkgPT4gZWw/LmZpeHR1cmVzID8/IFtdLFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGZsb29yRml4dHVyZXMgPSB0aGlzLmZsb29yRGF0YT8uY2VudGVyRml4dHVyZSA/PyBbXTtcclxuICAgIHJldHVybiBbLi4ud2FsbEZpeHR1cmVzLCAuLi5mbG9vckZpeHR1cmVzXS5zb21lKFxyXG4gICAgICAoZjogYW55KSA9PiBmPy51bnNhdmVkQ2hhbmdlcyxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXQgZ2V0UHJvZ3Jlc3NWYWx1ZSgpIHtcclxuICAgIGlmICh0aGlzLmdldFN0YXR1cyA9PT0gXCJhbGxvY2F0aW9uUGVuZGluZ1wiKSB7XHJcbiAgICAgIHJldHVybiAyNTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGdldFN0YXR1c1RleHQoKSB7XHJcbiAgICBpZiAodGhpcy5nZXRTdGF0dXMgPT09IFwiYWxsb2NhdGlvblBlbmRpbmdcIikge1xyXG4gICAgICByZXR1cm4gXCJBbGxvY2F0aW9uIHBlbmRpbmdcIjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBcIkRyYWZ0XCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZ2V0U3RhdHVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmxvb3JEYXRhPy5zdGF0dXMgPz8gXCJkcmFmdFwiO1xyXG4gIH1cclxuXHJcbiAgZ2V0RWxlbWVudE51bWJlcihncm91cDogYW55KTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gZ3JvdXAuZ2V0KFwiZWxlbWVudE51bWJlclwiKT8udmFsdWUgPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIGhpZ2hsaWdodEZpeHR1cmUoZ3JvdXA6IGFueSwgYmxpbms6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5lbmFibGVkKSByZXR1cm47XHJcbiAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodCgpO1xyXG4gICAgdGhpcy5jYW5jZWxIaWdobGlnaHRCbGluayA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IGNlbnRlciA9IGdyb3VwLmdldENlbnRlclBvaW50KCk7XHJcblxyXG4gICAgY29uc3QgcmVhbFdpZHRoID0gZ3JvdXAud2lkdGghICogZ3JvdXAuc2NhbGVYITtcclxuICAgIGNvbnN0IHJlYWxIZWlnaHQgPSBncm91cC5oZWlnaHQhICogZ3JvdXAuc2NhbGVZITtcclxuXHJcbiAgICBjb25zdCByZWN0ID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgbGVmdDogY2VudGVyLngsXHJcbiAgICAgIHRvcDogY2VudGVyLnksXHJcbiAgICAgIHdpZHRoOiByZWFsV2lkdGggKyA4LCAvLyBjb25zaXN0ZW50IHBhZGRpbmdcclxuICAgICAgaGVpZ2h0OiByZWFsSGVpZ2h0ICsgOCxcclxuICAgICAgcng6IDUsXHJcbiAgICAgIHJ5OiA1LFxyXG4gICAgICBzdHJva2U6IFwiIzAwYWFmZlwiLFxyXG4gICAgICBzdHJva2VXaWR0aDogMyxcclxuICAgICAgZmlsbDogXCJ0cmFuc3BhcmVudFwiLFxyXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgIGFuZ2xlOiBncm91cC5hbmdsZSB8fCAwLFxyXG4gICAgICBvcGFjaXR5OiBibGluayA/IDAgOiAxLFxyXG4gICAgfSk7XHJcblxyXG4gICAgKHJlY3QgYXMgYW55KS5kYXRhID0geyB0eXBlOiBcImZpeHR1cmUtaGlnaGxpZ2h0XCIgfTtcclxuXHJcbiAgICB0aGlzLmNhbnZhcy5hZGQocmVjdCk7XHJcbiAgICB0aGlzLmNhbnZhcy5tb3ZlT2JqZWN0VG8ocmVjdCwgdGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpLmxlbmd0aCAtIDEpO1xyXG4gICAgdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG5cclxuICAgIHRoaXMuYWN0aXZlSGlnaGxpZ2h0ID0gcmVjdDtcclxuXHJcbiAgICAvLyAtLS0gTm8gYmxpbmtpbmcgbmVlZGVkIC0tLVxyXG4gICAgaWYgKCFibGluaykgcmV0dXJuO1xyXG5cclxuICAgIGxldCBjeWNsZXMgPSAwO1xyXG5cclxuICAgIGNvbnN0IGJsaW5rT25jZSA9ICgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuY2FuY2VsSGlnaGxpZ2h0QmxpbmspIHtcclxuICAgICAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodCgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmVjdC5hbmltYXRlKFxyXG4gICAgICAgIHsgb3BhY2l0eTogMSB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXHJcbiAgICAgICAgICBvbkNoYW5nZTogKCkgPT4gdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpLFxyXG4gICAgICAgICAgb25Db21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYW5jZWxIaWdobGlnaHRCbGluaykge1xyXG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZWN0LmFuaW1hdGUoXHJcbiAgICAgICAgICAgICAgeyBvcGFjaXR5OiAwIH0sXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAoKSA9PiB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCksXHJcbiAgICAgICAgICAgICAgICBvbkNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbmNlbEhpZ2hsaWdodEJsaW5rKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHQoKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgIGN5Y2xlcysrO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoY3ljbGVzIDwgMjApIHtcclxuICAgICAgICAgICAgICAgICAgICBibGlua09uY2UoKTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2FuY2VsSGlnaGxpZ2h0QmxpbmspIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlY3Quc2V0KHsgb3BhY2l0eTogMSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgKTtcclxuICAgIH07XHJcblxyXG4gICAgYmxpbmtPbmNlKCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVIaWdobGlnaHQoKSB7XHJcbiAgICB0aGlzLmNhbmNlbEhpZ2hsaWdodEJsaW5rID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLmNhbnZhcz8uZ2V0T2JqZWN0cygpPy5mb3JFYWNoKChvYmopID0+IHtcclxuICAgICAgaWYgKChvYmogYXMgYW55KS5kYXRhPy50eXBlID09PSBcImZpeHR1cmUtaGlnaGxpZ2h0XCIpIHtcclxuICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmUob2JqKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hY3RpdmVIaWdobGlnaHQgPSBudWxsO1xyXG4gICAgdGhpcy5jYW52YXM/LnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICB9XHJcblxyXG4gIGtlZXBIaWdobGlnaHRPblRvcCA9ICgpID0+IHtcclxuICAgIGlmICghdGhpcy5hY3RpdmVIaWdobGlnaHQpIHJldHVybjtcclxuICAgIGNvbnN0IG9ianMgPSB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCk7XHJcbiAgICB0aGlzLmNhbnZhcy5tb3ZlT2JqZWN0VG8odGhpcy5hY3RpdmVIaWdobGlnaHQsIG9ianMubGVuZ3RoIC0gMSk7XHJcbiAgfTtcclxuXHJcbiAgLy8gSW4gZWRpdCBtb2RlLCB3aGVuIGEgZml4dHVyZSBpcyBjbGlja2VkIG9uIHRoZSBjYW52YXMsIG9wZW4gdGhlIG1hdGNoaW5nXHJcbiAgLy8gYWNjb3JkaW9uIGl0ZW0gaW4gdGhlIGxlZnQgcGFuZWwsIHNjcm9sbCBpdCBpbnRvIHZpZXcgYW5kIGhpZ2hsaWdodCB0aGVcclxuICAvLyBmaXh0dXJlIHJvdyBzbyB0aGUgdXNlciBjYW4gbG9jYXRlIGl0IGluIHRoZSBmb3JtIHF1aWNrbHkuXHJcbiAgaGlnaGxpZ2h0Rml4dHVyZUluQWNjb3JkaW9uKGZpeHR1cmVEYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICghZml4dHVyZURhdGEgfHwgdGhpcy5sYXlvdXRGb3JtLmRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgbGV0IGFjY29yZGlvbkl0ZW1JZDogc3RyaW5nO1xyXG5cclxuICAgIGlmIChmaXh0dXJlRGF0YS5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgY29uc3QgZm9ybUlkeCA9IHRoaXMuZ2V0Rm9ybVdhbGxzLmNvbnRyb2xzLmZpbmRJbmRleChcclxuICAgICAgICAoYykgPT5cclxuICAgICAgICAgIGMuZ2V0KFwiZWxlbWVudE51bWJlclwiKT8udmFsdWUgPT09IGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50TnVtYmVyLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoZm9ybUlkeCA8IDApIHtcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkRml4dHVyZUZvcm1JZCA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGFjY29yZGlvbkl0ZW1JZCA9IGBhY2NvcmRpb24td2FsbC0ke2Zvcm1JZHh9YDtcclxuICAgIH0gZWxzZSBpZiAoZml4dHVyZURhdGEuZml4dHVyZVR5cGUgPT09IFwiZmxvb3JcIikge1xyXG4gICAgICBhY2NvcmRpb25JdGVtSWQgPSBcImFjY29yZGlvbi1mbG9vclwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGlnaGxpZ2h0ZWRGaXh0dXJlRm9ybUlkID0gZml4dHVyZURhdGEuX2lkID8/IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNMZWZ0UGFuZWxDb2xsYXBzZWQpIHtcclxuICAgICAgdGhpcy50b2dnbGVQYW5lbChcImxlZnRcIiwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYm9keUFjY29yZGlvbj8uZXhwYW5kKGFjY29yZGlvbkl0ZW1JZCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYWNjb3JkaW9uSXRlbUlkKTtcclxuICAgICAgZWw/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6IFwic21vb3RoXCIsIGJsb2NrOiBcInN0YXJ0XCIgfSk7XHJcbiAgICB9LCAzNTApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DbGlja0FwcHJvdmVMYXlvdXQoKSB7XHJcbiAgICBpZiAodGhpcy5hbGxGaXh0dXJlSW5zdGFuY2VzLmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgXCJObyBmaXh0dXJlcyBmb3VuZC4gQWRkIGZpeHR1cmVzIHRvIHByb2NlZWRcIixcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuYXBwcm92ZUxheW91dE1vZGFsUmVmLCB7XHJcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgICAgYmFja2Ryb3A6IFwic3RhdGljXCIsXHJcbiAgICAgIH0pLnJlc3VsdDtcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7fVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DbGlja1J1bkFsbG9jYXRpb24oKSB7XHJcbiAgICBpZiAodGhpcy5hbGxGaXh0dXJlSW5zdGFuY2VzLmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgXCJObyBmaXh0dXJlcyBmb3VuZC4gQWRkIGZpeHR1cmVzIHRvIHByb2NlZWRcIixcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5oYXNJbnZhbGlkRml4dHVyZXMpIHtcclxuICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcclxuICAgICAgICBcIlNvbWUgZml4dHVyZXMgaGF2ZSBpbnZhbGlkIGhlYWRlcnMgb3IgbGlicmFyeSBtaXNtYXRjaGVzLiBQbGVhc2UgZml4IGFsbCByZWQgZml4dHVyZXMgYmVmb3JlIHJ1bm5pbmcgYWxsb2NhdGlvbi5cIixcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzQWxsb2NhdGlvblJ1bikge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5jb21wbGV0ZUFsbG9jYXRpb25Nb2RhbFJlZiwge1xyXG4gICAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgICAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICAgICAgICB9KS5yZXN1bHQ7XHJcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7fVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuYXBwbHlMb2dpY3NNb2RhbFJlZiwge1xyXG4gICAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgICAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICAgICAgICB9KS5yZXN1bHQ7XHJcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7fVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DbGlja1JldmVydEFsbG9jYXRpb24oKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMucmV2ZXJ0QWxsb2NhdGlvbk1vZGFsUmVmLCB7XHJcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgICAgYmFja2Ryb3A6IFwic3RhdGljXCIsXHJcbiAgICAgIH0pLnJlc3VsdDtcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7fVxyXG4gIH1cclxuXHJcbiAgcmV2ZXJ0QWxsb2NhdGlvbigpIHtcclxuICAgIGlmICghdGhpcy5mbG9vckRhdGFCZWZvcmVBbGxvY2F0aW9uKSB7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJObyBwcmV2aW91cyBzdGF0ZSBmb3VuZCB0byByZXZlcnRcIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uID0gSlNPTi5wYXJzZShcclxuICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5mbG9vckRhdGFCZWZvcmVBbGxvY2F0aW9uLmxheW91dFBvbHlnb24pLFxyXG4gICAgKTtcclxuICAgIHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUgPSBKU09OLnBhcnNlKFxyXG4gICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmZsb29yRGF0YUJlZm9yZUFsbG9jYXRpb24uY2VudGVyRml4dHVyZSksXHJcbiAgICApO1xyXG4gICAgdGhpcy5mbG9vckRhdGEub3RoZXJFbGVtZW50cyA9IEpTT04ucGFyc2UoXHJcbiAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuZmxvb3JEYXRhQmVmb3JlQWxsb2NhdGlvbi5vdGhlckVsZW1lbnRzKSxcclxuICAgICk7XHJcbiAgICB0aGlzLmZsb29yRGF0YS5zdGF0dXMgPSB0aGlzLmZsb29yRGF0YUJlZm9yZUFsbG9jYXRpb24uc3RhdHVzO1xyXG5cclxuICAgIHRoaXMuaXNBbGxvY2F0aW9uUnVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmZsb29yRGF0YUJlZm9yZUFsbG9jYXRpb24gPSBudWxsO1xyXG5cclxuICAgIHRoaXMuZXh0cmFjdEFsbEZpeHR1cmVzKHRoaXMuZmxvb3JEYXRhKTtcclxuICAgIHRoaXMuZGlzYWJsZUVkaXQgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkRml4dHVyZSA9IG51bGw7XHJcbiAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEgPSBudWxsO1xyXG5cclxuICAgIHRoaXMudG9nZ2xlUGFuZWwoXCJsZWZ0XCIsIGZhbHNlKTtcclxuICAgIHRoaXMudG9nZ2xlUGFuZWwoXCJyaWdodFwiLCBmYWxzZSk7XHJcbiAgICB0aGlzLnJlbmRlckZsb29yKGZhbHNlKTtcclxuXHJcbiAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRTdWNjZXNzVG9hc3QoXCJBbGxvY2F0aW9uIHJldmVydGVkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbXBsZXRlQWxsb2NhdGlvbigpIHtcclxuICAgIHRoaXMuaXNCdXR0b25Mb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBmbG9vcklkID0gdGhpcy5mbG9vckRhdGEuX2lkO1xyXG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlU3RvcmVQbGFubyh7XHJcbiAgICAgICAgICBmbG9vcklkLFxyXG4gICAgICAgICAgb25ib2FyZGluZzogdHJ1ZSxcclxuICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgLi4udGhpcy5mbG9vckRhdGEsXHJcbiAgICAgICAgICAgIC8vIGlzUGxhbm9BcHByb3ZlZDogdHJ1ZSxcclxuICAgICAgICAgICAgc3RhdHVzOiBcImNvbXBsZXRlZFwiLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IHN0b3JlTmFtZSA9IHRoaXMuZmxvb3JEYXRhPy5zdG9yZU5hbWUgfHwgdGhpcy5wbGFub0RhdGE/LnN0b3JlTmFtZTtcclxuICAgICAgdGhpcy5hcGlTZXJ2aWNlLmNyZWF0ZUFuZFN1Ym1pdExheW91dFRhc2soc3RvcmVOYW1lLCB0aGlzLmNsaWVudElkKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiRmFpbGVkIHRvIHN1Ym1pdCBsYXlvdXQgY2hhbmdlcy5cIiksXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KFwiQWxsb2NhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKFxyXG4gICAgICAgIGBtYW5hZ2UvcGxhbm9ncmFtL21hbmFnZS1wbGFub2dyYW0/cGxhbm9JZD0ke3RoaXMuZmxvb3JEYXRhLnBsYW5vSWR9JmZsb29ySWQ9JHt0aGlzLmZsb29yRGF0YS5faWR9YCxcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcImNvbXBsZXRlQWxsb2NhdGlvbiBmYWlsZWQ6XCIsIGVycm9yKTtcclxuICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byBjb21wbGV0ZSBhbGxvY2F0aW9uXCIpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc0J1dHRvbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHJ1bkFsbG9jYXRpb24oKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmlzQnV0dG9uTG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLmZsb29yRGF0YUJlZm9yZUFsbG9jYXRpb24gPSB7XHJcbiAgICAgICAgbGF5b3V0UG9seWdvbjogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uKSksXHJcbiAgICAgICAgY2VudGVyRml4dHVyZTogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlKSksXHJcbiAgICAgICAgb3RoZXJFbGVtZW50czogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmZsb29yRGF0YS5vdGhlckVsZW1lbnRzKSksXHJcbiAgICAgICAgc3RhdHVzOiB0aGlzLmZsb29yRGF0YS5zdGF0dXMsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLnJlb3JkZXJGaXh0dXJlTnVtYmVyQnlEaXNzZWN0aW9uKCk7XHJcblxyXG4gICAgICBjb25zdCBzdG9yZU5hbWUgPSB0aGlzLmZsb29yRGF0YT8uc3RvcmVOYW1lIHx8IHRoaXMucGxhbm9EYXRhPy5zdG9yZU5hbWU7XHJcbiAgICAgIGlmICghc3RvcmVOYW1lKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIlN0b3JlIG5hbWUgaXMgcmVxdWlyZWRcIik7XHJcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSxcclxuICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICAgICAgbGF5b3V0UG9seWdvbjogdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbiB8fCBbXSxcclxuICAgICAgICAgIGNlbnRlckZpeHR1cmU6IHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUgfHwgW10sXHJcbiAgICAgICAgICBvdGhlckVsZW1lbnRzOiB0aGlzLmZsb29yRGF0YS5vdGhlckVsZW1lbnRzIHx8IFtdLFxyXG4gICAgICAgICAgc3RhdHVzOiB0aGlzLmZsb29yRGF0YS5zdGF0dXMgfHwgXCJkcmFmdFwiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3RvcmVOYW1lOiBzdG9yZU5hbWUsIC8vIEFsc28gYWRkIGF0IHJvb3QgbGV2ZWwgYXMgZmFsbGJhY2tcclxuICAgICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgICB0eXBlOiBcIml2bVwiLFxyXG4gICAgICAgIGluaXRpYWw6IHRydWUsXHJcbiAgICAgICAgc29ydDogZmFsc2UsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5hcGlTZXJ2aWNlLnJ1bkFsb2NhdGlvbihwYXlsb2FkKSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5kYXRhKSB7XHJcbiAgICAgICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbiA9XHJcbiAgICAgICAgICByZXNwb25zZS5kYXRhLmxheW91dFBvbHlnb24gfHwgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbjtcclxuICAgICAgICB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlID1cclxuICAgICAgICAgIHJlc3BvbnNlLmRhdGEuY2VudGVyRml4dHVyZSB8fCB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlO1xyXG4gICAgICAgIHRoaXMuZmxvb3JEYXRhLm90aGVyRWxlbWVudHMgPVxyXG4gICAgICAgICAgcmVzcG9uc2UuZGF0YS5vdGhlckVsZW1lbnRzIHx8IHRoaXMuZmxvb3JEYXRhLm90aGVyRWxlbWVudHM7XHJcbiAgICAgICAgdGhpcy5mbG9vckRhdGEuc3RhdHVzID0gcmVzcG9uc2UuZGF0YS5zdGF0dXMgfHwgdGhpcy5mbG9vckRhdGEuc3RhdHVzO1xyXG5cclxuICAgICAgICB0aGlzLmlzQWxsb2NhdGlvblJ1biA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlRWRpdCA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuZXh0cmFjdEFsbEZpeHR1cmVzKHRoaXMuZmxvb3JEYXRhKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEgPSBudWxsO1xyXG4gICAgICAgIHRoaXMucmVuZGVyRmxvb3IoZmFsc2UpO1xyXG5cclxuICAgICAgICB0aGlzLnRvZ2dsZVBhbmVsKFwibGVmdFwiLCB0cnVlKTtcclxuICAgICAgICB0aGlzLnRvZ2dsZVBhbmVsKFwicmlnaHRcIiwgZmFsc2UpO1xyXG5cclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRTdWNjZXNzVG9hc3QoXHJcbiAgICAgICAgICBcIkFsbG9jYXRpb24gbG9naWMgYXBwbGllZCBzdWNjZXNzZnVsbHlcIixcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWxsKCk7XHJcbiAgICAgIHRoaXMuaXNCdXR0b25Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gYXBwbHlJVk1Mb2dpYyBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiRmFpbGVkIHRvIGFwcGx5IGFsbG9jYXRpb24gbG9naWNcIik7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLmlzQnV0dG9uTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYXBwcm92ZUxheW91dCgpIHtcclxuICAgIHRoaXMuaXNCdXR0b25Mb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBmbG9vcklkID0gdGhpcy5mbG9vckRhdGEuX2lkO1xyXG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlU3RvcmVQbGFubyh7XHJcbiAgICAgICAgICBmbG9vcklkLFxyXG4gICAgICAgICAgZGF0YTogeyAuLi50aGlzLmZsb29yRGF0YSwgc3RhdHVzOiBcImFsbG9jYXRpb25QZW5kaW5nXCIgfSxcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMuZmxvb3JEYXRhLmlzUGxhbm9BcHByb3ZlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuZmxvb3JEYXRhLnN0YXR1cyA9IFwiYWxsb2NhdGlvblBlbmRpbmdcIjtcclxuXHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldFN1Y2Nlc3NUb2FzdChcIkxheW91dCBhcHByb3ZlZCBzdWNjZXNzZnVsbHlcIik7XHJcbiAgICAgIHRoaXMubGF5b3V0Rm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIHRoaXMucmVuZGVyRmxvb3IoZmFsc2UpO1xyXG4gICAgICB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWxsKCk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuaXNSdW5BbGxvY2F0aW9uQWxsb3dlZCkge1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoXHJcbiAgICAgICAgICBgL21hbmFnZS9wbGFub2dyYW0vbWFuYWdlLXBsYW5vZ3JhbXMvb25ib2FyZGAsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcImFwcHJvdmVMYXlvdXQgZmFpbGVkOlwiLCBlcnJvcik7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gYXBwcm92ZSBsYXlvdXRcIik7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLmlzQnV0dG9uTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVvcmRlckZpeHR1cmVOdW1iZXJCeURpc3NlY3Rpb24oKSB7XHJcbiAgICBjb25zdCBmbG9vckRhdGEgPSB0aGlzLmZsb29yRGF0YTtcclxuICAgIGlmICghZmxvb3JEYXRhKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgd2FsbEZpeHR1cmVzOiBhbnlbXSA9IFtdO1xyXG4gICAgY29uc3QgZmxvb3JGaXh0dXJlczogYW55W10gPSBbXTtcclxuXHJcbiAgICBmbG9vckRhdGEubGF5b3V0UG9seWdvbi5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgaWYgKGVsZW1lbnQuZWxlbWVudFR5cGUgIT09IFwid2FsbFwiKSByZXR1cm47XHJcbiAgICAgIGVsZW1lbnQuZml4dHVyZXMuZm9yRWFjaCgoZml4dHVyZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFmaXh0dXJlPy5naG9zdCkgd2FsbEZpeHR1cmVzLnB1c2goZml4dHVyZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUuZm9yRWFjaCgoZml4dHVyZTogYW55KSA9PiB7XHJcbiAgICAgIGlmICghZml4dHVyZT8uZ2hvc3QpIGZsb29yRml4dHVyZXMucHVzaChmaXh0dXJlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGRpc3NlY3Rpb25SZWZlcmVuY2UgPSB0aGlzLmdldEVudHJhbmNlRGlzc2VjdGlvblJlZmVyZW5jZShmbG9vckRhdGEpO1xyXG4gICAgY29uc3Qgb3JkZXJlZFdhbGxGaXh0dXJlcyA9IHRoaXMuc29ydEZpeHR1cmVzQnlEaXNzZWN0aW9uUHJpb3JpdHkoXHJcbiAgICAgIHdhbGxGaXh0dXJlcyxcclxuICAgICAgZGlzc2VjdGlvblJlZmVyZW5jZSxcclxuICAgICk7XHJcbiAgICBjb25zdCBvcmRlcmVkRmxvb3JGaXh0dXJlcyA9IHRoaXMuc29ydEZpeHR1cmVzQnlEaXNzZWN0aW9uUHJpb3JpdHkoXHJcbiAgICAgIGZsb29yRml4dHVyZXMsXHJcbiAgICAgIGRpc3NlY3Rpb25SZWZlcmVuY2UsXHJcbiAgICApO1xyXG5cclxuICAgIGxldCBmaXh0dXJlTnVtYmVyID0gMTtcclxuICAgIFsuLi5vcmRlcmVkV2FsbEZpeHR1cmVzLCAuLi5vcmRlcmVkRmxvb3JGaXh0dXJlc10uZm9yRWFjaChcclxuICAgICAgKGZpeHR1cmU6IGFueSkgPT4ge1xyXG4gICAgICAgIGZpeHR1cmUuZml4dHVyZU51bWJlciA9IGZpeHR1cmVOdW1iZXIrKztcclxuICAgICAgfSxcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEVudHJhbmNlRGlzc2VjdGlvblJlZmVyZW5jZShmbG9vckRhdGE6IGFueSk6IHtcclxuICAgIG9yaWdpbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xyXG4gICAgZGlyZWN0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XHJcbiAgfSB8IG51bGwge1xyXG4gICAgY29uc3QgZW50cmFuY2VzID1cclxuICAgICAgZmxvb3JEYXRhPy5sYXlvdXRQb2x5Z29uPy5maWx0ZXIoXHJcbiAgICAgICAgKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudD8uZWxlbWVudFR5cGUgPT09IFwiZW50cmFuY2VcIixcclxuICAgICAgKSA/PyBbXTtcclxuXHJcbiAgICBpZiAoIWVudHJhbmNlcy5sZW5ndGgpIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IHByaW1hcnlFbnRyYW5jZSA9IFsuLi5lbnRyYW5jZXNdLnNvcnQoXHJcbiAgICAgIChhOiBhbnksIGI6IGFueSkgPT5cclxuICAgICAgICAoTnVtYmVyKGE/LmVsZW1lbnROdW1iZXIpIHx8IDApIC0gKE51bWJlcihiPy5lbGVtZW50TnVtYmVyKSB8fCAwKSxcclxuICAgIClbMF07XHJcblxyXG4gICAgY29uc3Qgb3JpZ2luVW5pdCA9IHByaW1hcnlFbnRyYW5jZT8ucmVsYXRpdmVQb3NpdGlvbj8udW5pdCB8fCBcImZ0XCI7XHJcbiAgICBjb25zdCBvcmlnaW4gPSB7XHJcbiAgICAgIHg6IHRoaXMudG9QaXhlbHMocHJpbWFyeUVudHJhbmNlPy5yZWxhdGl2ZVBvc2l0aW9uPy54IHx8IDAsIG9yaWdpblVuaXQpLFxyXG4gICAgICB5OiB0aGlzLnRvUGl4ZWxzKHByaW1hcnlFbnRyYW5jZT8ucmVsYXRpdmVQb3NpdGlvbj8ueSB8fCAwLCBvcmlnaW5Vbml0KSxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgYW5nbGVEZWcgPSBmbG9vckRhdGE/LmNhZExheW91dFxyXG4gICAgICA/IDBcclxuICAgICAgOiBOdW1iZXIoXHJcbiAgICAgICAgICBwcmltYXJ5RW50cmFuY2U/LmFuZ2xlID8/XHJcbiAgICAgICAgICAgIHByaW1hcnlFbnRyYW5jZT8ucmVsYXRpdmVQb3NpdGlvbj8uYW5nbGUgPz9cclxuICAgICAgICAgICAgMCxcclxuICAgICAgICApO1xyXG4gICAgY29uc3QgYW5nbGVSYWQgPSAoYW5nbGVEZWcgKiBNYXRoLlBJKSAvIDE4MDtcclxuXHJcbiAgICBjb25zdCBkaXJlY3Rpb24gPSB7XHJcbiAgICAgIHg6IE1hdGguY29zKGFuZ2xlUmFkKSxcclxuICAgICAgeTogTWF0aC5zaW4oYW5nbGVSYWQpLFxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4geyBvcmlnaW4sIGRpcmVjdGlvbiB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzb3J0Rml4dHVyZXNCeURpc3NlY3Rpb25Qcmlvcml0eShcclxuICAgIGZpeHR1cmVzOiBhbnlbXSxcclxuICAgIGRpc3NlY3Rpb25SZWZlcmVuY2U6IHtcclxuICAgICAgb3JpZ2luOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XHJcbiAgICAgIGRpcmVjdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xyXG4gICAgfSB8IG51bGwsXHJcbiAgKTogYW55W10ge1xyXG4gICAgaWYgKCFmaXh0dXJlcz8ubGVuZ3RoKSByZXR1cm4gW107XHJcblxyXG4gICAgaWYgKCFkaXNzZWN0aW9uUmVmZXJlbmNlKSB7XHJcbiAgICAgIHJldHVybiBbLi4uZml4dHVyZXNdLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudERlbHRhID1cclxuICAgICAgICAgIChOdW1iZXIoYT8uYXNzb2NpYXRlZEVsZW1lbnROdW1iZXIpIHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSAtXHJcbiAgICAgICAgICAoTnVtYmVyKGI/LmFzc29jaWF0ZWRFbGVtZW50TnVtYmVyKSB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7XHJcbiAgICAgICAgaWYgKGVsZW1lbnREZWx0YSAhPT0gMCkgcmV0dXJuIGVsZW1lbnREZWx0YTtcclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIChOdW1iZXIoYT8uYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyKSB8fFxyXG4gICAgICAgICAgICBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikgLVxyXG4gICAgICAgICAgKE51bWJlcihiPy5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIpIHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHsgb3JpZ2luLCBkaXJlY3Rpb24gfSA9IGRpc3NlY3Rpb25SZWZlcmVuY2U7XHJcbiAgICBjb25zdCBzaWRlUmFuayA9IChzaWRlOiBudW1iZXIpID0+IChzaWRlIDwgMCA/IDAgOiBzaWRlID4gMCA/IDEgOiAyKTtcclxuICAgIGNvbnN0IHByb2plY3Rpb25Ub2xlcmFuY2UgPSAyNDsgLy8gcHhcclxuXHJcbiAgICBjb25zdCBwb3NpdGlvbmVkID0gZml4dHVyZXMubWFwKChmaXh0dXJlOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgY29uc3QgZml4dHVyZVBvaW50ID0gdGhpcy5nZXRGaXh0dXJlQW5jaG9yUG9pbnQoZml4dHVyZSk7XHJcbiAgICAgIGNvbnN0IHJlbGF0aXZlWCA9IGZpeHR1cmVQb2ludC54IC0gb3JpZ2luLng7XHJcbiAgICAgIGNvbnN0IHJlbGF0aXZlWSA9IGZpeHR1cmVQb2ludC55IC0gb3JpZ2luLnk7XHJcbiAgICAgIGNvbnN0IGNyb3NzID0gZGlyZWN0aW9uLnggKiByZWxhdGl2ZVkgLSBkaXJlY3Rpb24ueSAqIHJlbGF0aXZlWDtcclxuICAgICAgY29uc3QgZG90ID0gZGlyZWN0aW9uLnggKiByZWxhdGl2ZVggKyBkaXJlY3Rpb24ueSAqIHJlbGF0aXZlWTtcclxuICAgICAgY29uc3Qgc2lkZSA9IE1hdGguYWJzKGNyb3NzKSA8IDFlLTQgPyAwIDogY3Jvc3MgPiAwID8gMSA6IC0xO1xyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBmaXh0dXJlLFxyXG4gICAgICAgIGluZGV4LFxyXG4gICAgICAgIHNpZGUsXHJcbiAgICAgICAgcHJvamVjdGlvbjogZG90LFxyXG4gICAgICAgIGRpc3RhbmNlRnJvbUxpbmU6IE1hdGguYWJzKGNyb3NzKSxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIHBvc2l0aW9uZWQuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICBjb25zdCBzaWRlRGVsdGEgPSBzaWRlUmFuayhhLnNpZGUpIC0gc2lkZVJhbmsoYi5zaWRlKTtcclxuICAgICAgaWYgKHNpZGVEZWx0YSAhPT0gMCkgcmV0dXJuIHNpZGVEZWx0YTtcclxuXHJcbiAgICAgIGNvbnN0IHByb2plY3Rpb25EZWx0YSA9IGEucHJvamVjdGlvbiAtIGIucHJvamVjdGlvbjtcclxuICAgICAgaWYgKE1hdGguYWJzKHByb2plY3Rpb25EZWx0YSkgPiBwcm9qZWN0aW9uVG9sZXJhbmNlKVxyXG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uRGVsdGE7XHJcblxyXG4gICAgICBjb25zdCBsaW5lRGlzdGFuY2VEZWx0YSA9IGIuZGlzdGFuY2VGcm9tTGluZSAtIGEuZGlzdGFuY2VGcm9tTGluZTtcclxuICAgICAgaWYgKE1hdGguYWJzKGxpbmVEaXN0YW5jZURlbHRhKSA+IDFlLTQpIHJldHVybiBsaW5lRGlzdGFuY2VEZWx0YTtcclxuXHJcbiAgICAgIGNvbnN0IGVsZW1lbnREZWx0YSA9XHJcbiAgICAgICAgKE51bWJlcihhLmZpeHR1cmU/LmFzc29jaWF0ZWRFbGVtZW50TnVtYmVyKSB8fFxyXG4gICAgICAgICAgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIC1cclxuICAgICAgICAoTnVtYmVyKGIuZml4dHVyZT8uYXNzb2NpYXRlZEVsZW1lbnROdW1iZXIpIHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTtcclxuICAgICAgaWYgKGVsZW1lbnREZWx0YSAhPT0gMCkgcmV0dXJuIGVsZW1lbnREZWx0YTtcclxuXHJcbiAgICAgIGNvbnN0IGZpeHR1cmVEZWx0YSA9XHJcbiAgICAgICAgKE51bWJlcihhLmZpeHR1cmU/LmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcikgfHxcclxuICAgICAgICAgIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSAtXHJcbiAgICAgICAgKE51bWJlcihiLmZpeHR1cmU/LmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcikgfHxcclxuICAgICAgICAgIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTtcclxuICAgICAgaWYgKGZpeHR1cmVEZWx0YSAhPT0gMCkgcmV0dXJuIGZpeHR1cmVEZWx0YTtcclxuXHJcbiAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBwb3NpdGlvbmVkLm1hcCgoaXRlbSkgPT4gaXRlbS5maXh0dXJlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Rml4dHVyZUFuY2hvclBvaW50KGZpeHR1cmU6IGFueSk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XHJcbiAgICBjb25zdCBwb3NpdGlvblVuaXQgPSBmaXh0dXJlPy5yZWxhdGl2ZVBvc2l0aW9uPy51bml0IHx8IFwiZnRcIjtcclxuICAgIGNvbnN0IHdpZHRoVW5pdCA9IGZpeHR1cmU/LmZpeHR1cmVTdGF0aWNXaWR0aD8udW5pdCB8fCBcImZ0XCI7XHJcbiAgICBjb25zdCBsZW5ndGhVbml0ID0gZml4dHVyZT8uZml4dHVyZVN0YXRpY0xlbmd0aD8udW5pdCB8fCBcImZ0XCI7XHJcblxyXG4gICAgY29uc3QgeCA9IHRoaXMudG9QaXhlbHMoZml4dHVyZT8ucmVsYXRpdmVQb3NpdGlvbj8ueCB8fCAwLCBwb3NpdGlvblVuaXQpO1xyXG4gICAgY29uc3QgeSA9IHRoaXMudG9QaXhlbHMoZml4dHVyZT8ucmVsYXRpdmVQb3NpdGlvbj8ueSB8fCAwLCBwb3NpdGlvblVuaXQpO1xyXG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICBmaXh0dXJlPy5maXh0dXJlU3RhdGljV2lkdGg/LnZhbHVlIHx8IDAsXHJcbiAgICAgIHdpZHRoVW5pdCxcclxuICAgICk7XHJcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICBmaXh0dXJlPy5maXh0dXJlU3RhdGljTGVuZ3RoPy52YWx1ZSB8fCAwLFxyXG4gICAgICBsZW5ndGhVbml0LFxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB4OiB4ICsgd2lkdGggLyAyLFxyXG4gICAgICB5OiB5ICsgaGVpZ2h0IC8gMixcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRyYXdFbnRyYW5jZURpc3NlY3Rpb25MaW5lKFxyXG4gICAgY2FudmFzOiBmYWJyaWMuQ2FudmFzLFxyXG4gICAgYXJyb3dHcm91cDogZmFicmljLkdyb3VwLFxyXG4gICAgYXJyb3dXaWR0aDogbnVtYmVyLFxyXG4gICAgYXJyb3dIZWlnaHQ6IG51bWJlcixcclxuICAgIGFuZ2xlOiBudW1iZXIsXHJcbiAgKSB7XHJcbiAgICAvLyBHZXQgdGhlIGFycm93IHBhdGggZnJvbSB0aGUgZ3JvdXBcclxuICAgIGNvbnN0IG9iamVjdHMgPSBhcnJvd0dyb3VwLmdldE9iamVjdHMoKTtcclxuICAgIGNvbnN0IGFycm93UGF0aCA9IG9iamVjdHMuZmluZCgob2JqKSA9PiBvYmoudHlwZSA9PT0gXCJwYXRoXCIpIGFzIGZhYnJpYy5QYXRoO1xyXG5cclxuICAgIGlmICghYXJyb3dQYXRoKSByZXR1cm47XHJcblxyXG4gICAgLy8gR2V0IHRoZSBncm91cCdzIGJvdW5kaW5nIGJveCB0byBmaW5kIHRoZSBjZW50ZXJcclxuICAgIGNvbnN0IGdyb3VwQm91bmRzID0gYXJyb3dHcm91cC5nZXRCb3VuZGluZ1JlY3QoKTtcclxuXHJcbiAgICAvLyBUaGUgcGF0aCdzIHBvc2l0aW9uIHdpdGhpbiB0aGUgZ3JvdXBcclxuICAgIGNvbnN0IHBhdGhMZWZ0ID0gYXJyb3dQYXRoLmxlZnQgfHwgMDtcclxuXHJcbiAgICAvLyBDYWxjdWxhdGUgdGlwIFg6IHJpZ2h0bW9zdCBwb2ludCBvZiB0aGUgcGF0aFxyXG4gICAgY29uc3QgdGlwSW5Hcm91cFggPSBwYXRoTGVmdCArIGFycm93V2lkdGg7XHJcblxyXG4gICAgY29uc3QgZ3JvdXBDZW50ZXIgPSBhcnJvd0dyb3VwLmdldENlbnRlclBvaW50KCk7XHJcbiAgICBjb25zdCBpbnZNYXRyaXggPSBmYWJyaWMudXRpbC5pbnZlcnRUcmFuc2Zvcm0oXHJcbiAgICAgIGFycm93R3JvdXAuY2FsY1RyYW5zZm9ybU1hdHJpeCgpLFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGdyb3VwQ2VudGVySW5Hcm91cCA9IGZhYnJpYy51dGlsLnRyYW5zZm9ybVBvaW50KFxyXG4gICAgICBncm91cENlbnRlcixcclxuICAgICAgaW52TWF0cml4LFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBVc2UgdGhlIGdyb3VwJ3MgdmVydGljYWwgY2VudGVyIGZvciBZXHJcbiAgICBjb25zdCB0aXBJbkdyb3VwWSA9IGdyb3VwQ2VudGVySW5Hcm91cC55O1xyXG5cclxuICAgIC8vIFRyYW5zZm9ybSBmcm9tIGdyb3VwIGNvb3JkaW5hdGVzIHRvIGNhbnZhcyBjb29yZGluYXRlc1xyXG4gICAgY29uc3QgdGlwUG9pbnQgPSBuZXcgZmFicmljLlBvaW50KHRpcEluR3JvdXBYLCB0aXBJbkdyb3VwWSk7XHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFBvaW50ID0gZmFicmljLnV0aWwudHJhbnNmb3JtUG9pbnQoXHJcbiAgICAgIHRpcFBvaW50LFxyXG4gICAgICBhcnJvd0dyb3VwLmNhbGNUcmFuc2Zvcm1NYXRyaXgoKSxcclxuICAgICk7XHJcbiAgICBjb25zdCB0aXBYID0gdHJhbnNmb3JtZWRQb2ludC54O1xyXG4gICAgY29uc3QgdGlwWSA9IHRyYW5zZm9ybWVkUG9pbnQueTtcclxuXHJcbiAgICAvLyBHZXQgc3RvcmUgYm91bmRzXHJcbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmdldEZ1bGxMYXlvdXRCb3VuZHMoKTtcclxuICAgIGlmICghYm91bmRzLndpZHRoIHx8ICFib3VuZHMuaGVpZ2h0KSByZXR1cm47XHJcblxyXG4gICAgLy8gQ2FsY3VsYXRlIGRpcmVjdGlvbiB2ZWN0b3IgcGFyYWxsZWwgdG8gdGhlIGVudHJhbmNlIChpbiB0aGUgZGlyZWN0aW9uIHRoZSBhcnJvdyBwb2ludHMpXHJcbiAgICBjb25zdCByYWQgPSAoYW5nbGUgKiBNYXRoLlBJKSAvIDE4MDtcclxuICAgIGNvbnN0IGRpcmVjdGlvblggPSBNYXRoLmNvcyhyYWQpO1xyXG4gICAgY29uc3QgZGlyZWN0aW9uWSA9IE1hdGguc2luKHJhZCk7XHJcblxyXG4gICAgLy8gQ2FsY3VsYXRlIGludGVyc2VjdGlvbiBwb2ludHMgd2l0aCBzdG9yZSBib3VuZGFyaWVzIHVzaW5nIGxpbmUtcmVjdGFuZ2xlIGludGVyc2VjdGlvblxyXG4gICAgY29uc3QgaW50ZXJzZWN0aW9uczogQXJyYXk8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9PiA9IFtdO1xyXG5cclxuICAgIC8vIENoZWNrIGludGVyc2VjdGlvbiB3aXRoIGVhY2ggYm91bmRhcnkgZWRnZVxyXG4gICAgY29uc3QgZWRnZXMgPSBbXHJcbiAgICAgIHtcclxuICAgICAgICB4MTogYm91bmRzLmxlZnQsXHJcbiAgICAgICAgeTE6IGJvdW5kcy50b3AsXHJcbiAgICAgICAgeDI6IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoLFxyXG4gICAgICAgIHkyOiBib3VuZHMudG9wLFxyXG4gICAgICB9LCAvLyBUb3BcclxuICAgICAge1xyXG4gICAgICAgIHgxOiBib3VuZHMubGVmdCArIGJvdW5kcy53aWR0aCxcclxuICAgICAgICB5MTogYm91bmRzLnRvcCxcclxuICAgICAgICB4MjogYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGgsXHJcbiAgICAgICAgeTI6IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0LFxyXG4gICAgICB9LCAvLyBSaWdodFxyXG4gICAgICB7XHJcbiAgICAgICAgeDE6IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoLFxyXG4gICAgICAgIHkxOiBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCxcclxuICAgICAgICB4MjogYm91bmRzLmxlZnQsXHJcbiAgICAgICAgeTI6IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0LFxyXG4gICAgICB9LCAvLyBCb3R0b21cclxuICAgICAge1xyXG4gICAgICAgIHgxOiBib3VuZHMubGVmdCxcclxuICAgICAgICB5MTogYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQsXHJcbiAgICAgICAgeDI6IGJvdW5kcy5sZWZ0LFxyXG4gICAgICAgIHkyOiBib3VuZHMudG9wLFxyXG4gICAgICB9LCAvLyBMZWZ0XHJcbiAgICBdO1xyXG5cclxuICAgIC8vIEV4dGVuZCBsaW5lIGluIGJvdGggZGlyZWN0aW9ucyB0byBmaW5kIGludGVyc2VjdGlvbnNcclxuICAgIGNvbnN0IG1heERpc3RhbmNlID0gTWF0aC5tYXgoYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KSAqIDI7XHJcbiAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgZWRnZXMpIHtcclxuICAgICAgY29uc3QgaW50ZXJzZWN0aW9uID0gdGhpcy5saW5lSW50ZXJzZWN0aW9uKFxyXG4gICAgICAgIHRpcFgsXHJcbiAgICAgICAgdGlwWSxcclxuICAgICAgICB0aXBYICsgZGlyZWN0aW9uWCAqIG1heERpc3RhbmNlLFxyXG4gICAgICAgIHRpcFkgKyBkaXJlY3Rpb25ZICogbWF4RGlzdGFuY2UsXHJcbiAgICAgICAgZWRnZS54MSxcclxuICAgICAgICBlZGdlLnkxLFxyXG4gICAgICAgIGVkZ2UueDIsXHJcbiAgICAgICAgZWRnZS55MixcclxuICAgICAgKTtcclxuICAgICAgaWYgKGludGVyc2VjdGlvbikge1xyXG4gICAgICAgIGludGVyc2VjdGlvbnMucHVzaChpbnRlcnNlY3Rpb24pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBpbnRlcnNlY3Rpb25CYWNrID0gdGhpcy5saW5lSW50ZXJzZWN0aW9uKFxyXG4gICAgICAgIHRpcFgsXHJcbiAgICAgICAgdGlwWSxcclxuICAgICAgICB0aXBYIC0gZGlyZWN0aW9uWCAqIG1heERpc3RhbmNlLFxyXG4gICAgICAgIHRpcFkgLSBkaXJlY3Rpb25ZICogbWF4RGlzdGFuY2UsXHJcbiAgICAgICAgZWRnZS54MSxcclxuICAgICAgICBlZGdlLnkxLFxyXG4gICAgICAgIGVkZ2UueDIsXHJcbiAgICAgICAgZWRnZS55MixcclxuICAgICAgKTtcclxuICAgICAgaWYgKGludGVyc2VjdGlvbkJhY2spIHtcclxuICAgICAgICBpbnRlcnNlY3Rpb25zLnB1c2goaW50ZXJzZWN0aW9uQmFjayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoaW50ZXJzZWN0aW9ucy5sZW5ndGggPj0gMikge1xyXG4gICAgICAvLyBGaW5kIHRoZSB0d28gcG9pbnRzIHRoYXQgYXJlIGZhcnRoZXN0IGFwYXJ0ICh0byBkcmF3IHRoZSBmdWxsIGxpbmUgYWNyb3NzIHRoZSBzdG9yZSlcclxuICAgICAgbGV0IG1heERpc3QgPSAwO1xyXG4gICAgICBsZXQgcG9pbnQxID0gaW50ZXJzZWN0aW9uc1swXTtcclxuICAgICAgbGV0IHBvaW50MiA9IGludGVyc2VjdGlvbnNbMV07XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVyc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBpbnRlcnNlY3Rpb25zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICBjb25zdCBkaXN0ID0gTWF0aC5zcXJ0KFxyXG4gICAgICAgICAgICBNYXRoLnBvdyhpbnRlcnNlY3Rpb25zW2ldLnggLSBpbnRlcnNlY3Rpb25zW2pdLngsIDIpICtcclxuICAgICAgICAgICAgICBNYXRoLnBvdyhpbnRlcnNlY3Rpb25zW2ldLnkgLSBpbnRlcnNlY3Rpb25zW2pdLnksIDIpLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmIChkaXN0ID4gbWF4RGlzdCkge1xyXG4gICAgICAgICAgICBtYXhEaXN0ID0gZGlzdDtcclxuICAgICAgICAgICAgcG9pbnQxID0gaW50ZXJzZWN0aW9uc1tpXTtcclxuICAgICAgICAgICAgcG9pbnQyID0gaW50ZXJzZWN0aW9uc1tqXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIERyYXcgdGhlIGxpbmVcclxuICAgICAgY29uc3QgbGluZSA9IG5ldyBmYWJyaWMuTGluZShbcG9pbnQxLngsIHBvaW50MS55LCBwb2ludDIueCwgcG9pbnQyLnldLCB7XHJcbiAgICAgICAgc3Ryb2tlOiBcInRyYW5zcGFyZW50XCIsXHJcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXHJcbiAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgIH0pIGFzIGZhYnJpYy5MaW5lICYgeyBpc0Rpc3NlY3Rpb25MaW5lPzogYm9vbGVhbiB9O1xyXG5cclxuICAgICAgbGluZS5pc0Rpc3NlY3Rpb25MaW5lID0gdHJ1ZTtcclxuXHJcbiAgICAgIGNhbnZhcy5hZGQobGluZSk7XHJcbiAgICAgIGNhbnZhcy5zZW5kT2JqZWN0VG9CYWNrKGxpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsaW5lSW50ZXJzZWN0aW9uKFxyXG4gICAgeDE6IG51bWJlcixcclxuICAgIHkxOiBudW1iZXIsXHJcbiAgICB4MjogbnVtYmVyLFxyXG4gICAgeTI6IG51bWJlcixcclxuICAgIHgzOiBudW1iZXIsXHJcbiAgICB5MzogbnVtYmVyLFxyXG4gICAgeDQ6IG51bWJlcixcclxuICAgIHk0OiBudW1iZXIsXHJcbiAgKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBkZW5vbSA9ICh4MSAtIHgyKSAqICh5MyAtIHk0KSAtICh5MSAtIHkyKSAqICh4MyAtIHg0KTtcclxuICAgIGlmIChNYXRoLmFicyhkZW5vbSkgPCAxZS0xMCkgcmV0dXJuIG51bGw7IC8vIExpbmVzIGFyZSBwYXJhbGxlbFxyXG5cclxuICAgIGNvbnN0IHQgPSAoKHgxIC0geDMpICogKHkzIC0geTQpIC0gKHkxIC0geTMpICogKHgzIC0geDQpKSAvIGRlbm9tO1xyXG4gICAgY29uc3QgdSA9IC0oKHgxIC0geDIpICogKHkxIC0geTMpIC0gKHkxIC0geTIpICogKHgxIC0geDMpKSAvIGRlbm9tO1xyXG5cclxuICAgIC8vIENoZWNrIGlmIGludGVyc2VjdGlvbiBpcyB3aXRoaW4gYm90aCBsaW5lIHNlZ21lbnRzXHJcbiAgICBpZiAodCA+PSAwICYmIHQgPD0gMSAmJiB1ID49IDAgJiYgdSA8PSAxKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgeDogeDEgKyB0ICogKHgyIC0geDEpLFxyXG4gICAgICAgIHk6IHkxICsgdCAqICh5MiAtIHkxKSxcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlRGlzc2VjdGlvbkxpbmVzKCkge1xyXG4gICAgaWYgKCF0aGlzLmNhbnZhcykgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IG9iamVjdHMgPSB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCk7XHJcbiAgICBjb25zdCBkaXNzZWN0aW9uTGluZXMgPSBvYmplY3RzLmZpbHRlcihcclxuICAgICAgKG9iajogYW55KSA9PiBvYmouaXNEaXNzZWN0aW9uTGluZSA9PT0gdHJ1ZSxcclxuICAgICk7XHJcblxyXG4gICAgZGlzc2VjdGlvbkxpbmVzLmZvckVhY2goKGxpbmUpID0+IHtcclxuICAgICAgdGhpcy5jYW52YXM/LnJlbW92ZShsaW5lKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRGlzc2VjdGlvbkxpbmVzKCkge1xyXG4gICAgaWYgKCF0aGlzLmNhbnZhcykgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMucmVtb3ZlRGlzc2VjdGlvbkxpbmVzKCk7XHJcblxyXG4gICAgY29uc3QgZW50cmFuY2VPYmplY3RzID0gdGhpcy5jYW52YXNcclxuICAgICAgLmdldE9iamVjdHMoKVxyXG4gICAgICAuZmlsdGVyKChvYmo6IGFueSkgPT4gb2JqLm9ialR5cGUgPT09IFwiZW50cmFuY2VcIikgYXMgZmFicmljLkdyb3VwW107XHJcblxyXG4gICAgZW50cmFuY2VPYmplY3RzLmZvckVhY2goKGVudHJhbmNlR3JvdXApID0+IHtcclxuICAgICAgY29uc3QgZWxlbWVudERhdGEgPSAoZW50cmFuY2VHcm91cCBhcyBhbnkpLmRhdGE7XHJcbiAgICAgIGlmICghZWxlbWVudERhdGEpIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IHdpZHRoID0gZW50cmFuY2VHcm91cC5nZXRTY2FsZWRXaWR0aCgpIHx8IDgwO1xyXG4gICAgICBjb25zdCBoZWlnaHQgPSBlbnRyYW5jZUdyb3VwLmdldFNjYWxlZEhlaWdodCgpIHx8IDc1O1xyXG4gICAgICBjb25zdCBhbmdsZSA9IGVudHJhbmNlR3JvdXAuYW5nbGUgfHwgMDtcclxuXHJcbiAgICAgIHRoaXMuZHJhd0VudHJhbmNlRGlzc2VjdGlvbkxpbmUoXHJcbiAgICAgICAgdGhpcy5jYW52YXMsXHJcbiAgICAgICAgZW50cmFuY2VHcm91cCxcclxuICAgICAgICB3aWR0aCxcclxuICAgICAgICBoZWlnaHQsXHJcbiAgICAgICAgYW5nbGUsXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPHNlY3Rpb24gaWQ9XCJvbmJvYXJkLXBsYW5vXCI+XHJcbiAgICA8IS0tIExvYWRpbmcgU3RhdGUgLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiaXNQYWdlTG9hZGluZ1wiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtLTBcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlclNrZWxldG9uXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJza2VsZXRvbkxvYWRlclwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2tlbGV0b25Mb2FkZXJcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTNcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNrZWxldG9uTG9hZGVyXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIENvbnRlbnQgLS0+XHJcbiAgICA8ZGl2IFtuZ0NsYXNzXT1cInsgJ2Qtbm9uZSc6IGlzUGFnZUxvYWRpbmcgfVwiPlxyXG4gICAgICAgIDwhLS0gSGVhZGVyIEFjY29yZGlvbiAtLT5cclxuICAgICAgICA8ZGl2IGlkPVwiaGVhZGVyXCIgbmdiQWNjb3JkaW9uICNhY2NvcmRpb249XCJuZ2JBY2NvcmRpb25cIiBjbGFzcz1cIm15LTRcIj5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiZGV0YWlsc1wiIFtjb2xsYXBzZWRdPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBweC02IHB5LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC00IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWxlZnQ6NXB4O1wiICpuZ0lmPVwicGxhbm9EYXRhPy5zdG9yZU5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz0ndGl0bGUnPnt7cGxhbm9EYXRhPy5zdG9yZU5hbWV9fSAtIFBsYW5vPC9oMj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0ICpuZ0lmPVwiZmxvb3JzTGlzdC5sZW5ndGhcIiBbZm9ybUNvbnRyb2xdPVwic2VsZWN0ZWRGbG9vcklkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJmbG9vcnNMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFlZGl0Rml4dHVyZVwiIGNsYXNzPVwidXBkYXRlQ2xhc3NcIj5MYXN0IFVwZGF0ZToge3tmbG9vckRhdGE/LnVwZGF0ZWRBdH19PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC00IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFZGl0IEZpeHR1cmUgTW9kZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0Rml4dHVyZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHRleHQtbm93cmFwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRml4dHVyZVBhZ2VDYW5jZWwoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5jZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LW5vd3JhcFwiIChjbGljayk9XCJvbkZpeHR1cmVTYXZlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSAmIENsb3NlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiaGVhZGVyXCIgY2xhc3M9XCJyb3cgbXgtMCBnYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQbGFubyBDb21wbGV0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImN1cnNvcjogdW5zZXQ7XCIgY2xhc3M9XCJjb2wgZmlsdGVyLXRhYlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbm8gQ29tcGxldGlvbiAlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMTggMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiBuZ2JUb29sdGlwPVwiJSBvZiBvdmVyYWxsIHBsYW5vZ3JhbSBjb21wbGV0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzE1MTdfMTI5ODA1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOSAxMlY5TTkgNkg5LjAwNzVNMTYuNSA5QzE2LjUgMTMuMTQyMSAxMy4xNDIxIDE2LjUgOSAxNi41QzQuODU3ODYgMTYuNSAxLjUgMTMuMTQyMSAxLjUgOUMxLjUgNC44NTc4NiA0Ljg1Nzg2IDEuNSA5IDEuNUMxMy4xNDIxIDEuNSAxNi41IDQuODU3ODYgMTYuNSA5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzE1MTdfMTI5ODA1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCIgc3R5bGU9XCJoZWlnaHQ6IDRweFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBbbmdDbGFzc109XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbMjUsIDUwXS5pbmNsdWRlcyhnZXRQcm9ncmVzc1ZhbHVlKSA/ICdiZy13YXJuaW5nJyA6ICdiZy1zdWNjZXNzJ1wiIHJvbGU9XCJwcm9ncmVzc2JhclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCInd2lkdGg6JyArIGdldFByb2dyZXNzVmFsdWUgKyAnJSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbm93XT1cImdldFByb2dyZXNzVmFsdWVcIiBhcmlhLXZhbHVlbWluPVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtdmFsdWVtYXg9XCIxMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+e3sgZ2V0UHJvZ3Jlc3NWYWx1ZSB9fSU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTGF5b3V0IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImN1cnNvcjogdW5zZXQ7XCIgY2xhc3M9XCJjb2wgZmlsdGVyLXRhYlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz48Yj57e2Zsb29yRGF0YT8uZmxvb3JOdW1iZXJ9fS97eyBwbGFub0RhdGE/LmZsb29ycz8ubGVuZ3RoIH19PC9iPiBMYXlvdXQ8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmRpY2F0b3IgbXQtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldFN0YXR1cyA9PT0gJ2FsbG9jYXRpb25QZW5kaW5nJyA/ICdjb21wbGV0ZWQnIDogJ2RyYWZ0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRTdGF0dXMgPT09ICdhbGxvY2F0aW9uUGVuZGluZycgPyAnQ29tcGxldGVkJyA6ICdEcmFmdCcgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRml4dHVyZXMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY3Vyc29yOiB1bnNldDtcIiBjbGFzcz1cImNvbCBmaWx0ZXItdGFiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPjxiPnt7IGFsbEZpeHR1cmVJbnN0YW5jZXMubGVuZ3RoIH19PC9iPiBGaXh0dXJlczwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZGljYXRvciBtdC0yXCIgW25nQ2xhc3NdPVwiZ2V0U3RhdHVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldFN0YXR1c1RleHQgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQm9keSAtLT5cclxuICAgICAgICA8ZGl2IGlkPVwiYm9keVwiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIDwhLS0gTGVmdCBDb2x1bW4gLS0+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2NvbGxhcHNlZC1jb2wnOiBpc0xlZnRQYW5lbENvbGxhcHNlZCwgJ2NvbC0zJzogIWlzTGVmdFBhbmVsQ29sbGFwc2VkLCdkLW5vbmUnOiBlZGl0Rml4dHVyZSAgfVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInMtY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmb3JtIFtuZ0NsYXNzXT1cInsgJ2Qtbm9uZSc6IGlzTGVmdFBhbmVsQ29sbGFwc2VkIH1cIiBbZm9ybUdyb3VwXT1cImxheW91dEZvcm1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb24gI2JvZHlBY2NvcmRpb249XCJuZ2JBY2NvcmRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gV2FsbHMgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRGb3JtV2FsbHMuY29udHJvbHMubGVuZ3RoOyBlbHNlIGFkZFdhbGxBY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGZvcm1BcnJheU5hbWU9XCJ3YWxsc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cCBvZiBnZXRGb3JtV2FsbHMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIFtuZ2JBY2NvcmRpb25JdGVtXT1cIidhY2NvcmRpb24td2FsbC0nICsgaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiIG5nYkFjY29yZGlvbkhlYWRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYWluaGVhZGluZyBwLTBcIiBuZ2JBY2NvcmRpb25CdXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMiB3YWxsLWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdyb3VwLmdldChcImVsZW1lbnRUeXBlXCIpPy52YWx1ZSB8IHRpdGxlY2FzZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBncm91cC5nZXQoXCJlbGVtZW50TnVtYmVyXCIpPy52YWx1ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGxheW91dEZvcm0uZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMVwiIG5nYlRvb2x0aXA9XCJSb3RhdGUgdGhpcyB3YWxsLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicm90YXRlV2FsbChnZXRFbGVtZW50TnVtYmVyKGdyb3VwKSEpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAxOCAxOFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTMuNzM3MzUgOC4yNTAxMUM0LjEyMTkzIDguMjQzNjIgNC40NDM3NyA4LjUyNzc2IDQuNDkzMzggOC44OTk5OEw0LjQ5OTkgOC45ODczNUw0LjUwMjYyIDkuMTU1MTZDNC41ODQzNCAxMS41NzQxIDYuNTcyNDMgMTMuNSA5IDEzLjVDOS4xNDAyMiAxMy41IDkuMjc5NTEgMTMuNDkzNiA5LjQxNzU2IDEzLjQ4MDlMOS4yMTk2NyAxMy4yODAzQzguOTI2NzggMTIuOTg3NCA4LjkyNjc4IDEyLjUxMjYgOS4yMTk2NyAxMi4yMTk3QzkuNTEyNTcgMTEuOTI2OCA5Ljk4NzQ0IDExLjkyNjggMTAuMjgwMyAxMi4yMTk3TDExLjc4MDMgMTMuNzE5N0MxMi4wNzMyIDE0LjAxMjYgMTIuMDczMiAxNC40ODc0IDExLjc4MDMgMTQuNzgwM0wxMC4yODAzIDE2LjI4MDNDOS45ODc0NCAxNi41NzMyIDkuNTEyNTcgMTYuNTczMiA5LjIxOTY3IDE2LjI4MDNDOC45MjY3OCAxNS45ODc0IDguOTI2NzggMTUuNTEyNiA5LjIxOTY3IDE1LjIxOTdMOS40NTgzNyAxNC45ODI3QzkuMzA2NDYgMTQuOTk0MiA5LjE1MzU5IDE1IDkgMTVDNS44MjY1MyAxNSAzLjIxNjY1IDEyLjUzMjEgMy4wMTI1IDkuMzgyODlMMy4wMDMxNSA5LjE5MzE0TDMuMDAwMTEgOS4wMTI2NUMyLjk5MzEyIDguNTk4NDkgMy4zMjMyIDguMjU3MDkgMy43MzczNSA4LjI1MDExWk04Ljc4MDMzIDEuNzE5NjdDOS4wNTA3IDEuOTkwMDMgOS4wNzE0OSAyLjQxNTQ2IDguODQyNzIgMi43MDk2N0w4Ljc4MDMzIDIuNzgwMzNMOC41NDE4NyAzLjAxNzI2QzguNjkzNzEgMy4wMDU3OCA4Ljg0NjUgMyA5IDNDMTIuMzEzNyAzIDE1IDUuNjg2MjkgMTUgOUMxNSA5LjQxNDIxIDE0LjY2NDIgOS43NSAxNC4yNSA5Ljc1QzEzLjgzNTggOS43NSAxMy41IDkuNDE0MjEgMTMuNSA5QzEzLjUgNi41MTQ3MiAxMS40ODUzIDQuNSA5IDQuNUM4Ljg1OTcgNC41IDguNzIwMzQgNC41MDY0IDguNTgyMjEgNC41MTkwOUw4Ljc4MDMzIDQuNzE5NjdDOS4wNzMyMyA1LjAxMjU2IDkuMDczMjMgNS40ODc0NCA4Ljc4MDMzIDUuNzgwMzNDOC41MDk5NyA2LjA1MDY5IDguMDg0NTUgNi4wNzE0OSA3Ljc5MDMzIDUuODQyNzJMNy43MTk2NyA1Ljc4MDMzTDYuMjE5NjcgNC4yODAzM0M1Ljk0OTMxIDQuMDA5OTcgNS45Mjg1MSAzLjU4NDU0IDYuMTU3MjggMy4yOTAzM0w2LjIxOTY3IDMuMjE5NjdMNy43MTk2NyAxLjcxOTY3QzguMDEyNTcgMS40MjY3OCA4LjQ4NzQ0IDEuNDI2NzggOC43ODAzMyAxLjcxOTY3WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjAuMDAwNjRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0xXCIgbmdiVG9vbHRpcD1cIkluc2VydCBuZXcgd2FsbCBiZWxvdy5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE5ld1dhbGwoZ2V0RWxlbWVudE51bWJlcihncm91cCkhKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNjJfOClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOSA5Ljc1QzExLjA3MDcgOS43NSAxMi43NSAxMS40MjkzIDEyLjc1IDEzLjVDMTIuNzUgMTUuNTcwOCAxMS4wNzA3IDE3LjI1IDkgMTcuMjVDNi45MjkyNSAxNy4yNSA1LjI1IDE1LjU3MDggNS4yNSAxMy41QzUuMjUgMTEuNDI5MyA2LjkyOTI1IDkuNzUgOSA5Ljc1Wk05Ljc1IDExLjI1SDguMjVWMTIuNzQ5M0w2Ljc1IDEyLjc1VjE0LjI1TDguMjUgMTQuMjQ5M1YxNS43NUg5Ljc1VjE0LjI0OTNMMTEuMjUgMTQuMjVWMTIuNzVMOS43NSAxMi43NDkzVjExLjI1Wk0xNSAyLjI1QzE1LjQxNCAyLjI1IDE1Ljc1IDIuNTg2IDE1Ljc1IDNWNy41QzE1Ljc1IDcuOTE0IDE1LjQxNCA4LjI1IDE1IDguMjVIM0MyLjU4NiA4LjI1IDIuMjUgNy45MTQgMi4yNSA3LjVWM0MyLjI1IDIuNTg2IDIuNTg2IDIuMjUgMyAyLjI1SDE1Wk0zLjc1IDMuNzVWNi43NUgxNC4yNVYzLjc1SDMuNzVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzYyXzhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJSZW1vdmUgdGhpcyB3YWxsIGFuZCBpdHMgZml4dHVyZXMuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVXYWxsKGdldEVsZW1lbnROdW1iZXIoZ3JvdXApISk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzYzXzI1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC43MDk0IDEuNUMxMS4zNTUxIDEuNSAxMS45MjgzIDEuOTEzMTQgMTIuMTMyNCAyLjUyNTY1TDEyLjU0MDYgMy43NUgxNUMxNS40MTQyIDMuNzUgMTUuNzUgNC4wODU3OSAxNS43NSA0LjVDMTUuNzUgNC45MTQyIDE1LjQxNDIgNS4yNDk5OSAxNSA1LjI1TDE0Ljk5ODEgNS4zMDM0NEwxNC4zNDc2IDE0LjQxMDNDMTQuMjYzNSAxNS41ODc4IDEzLjI4MzggMTYuNSAxMi4xMDM0IDE2LjVINS44OTY2OEM0LjcxNjI0IDE2LjUgMy43MzY1IDE1LjU4NzggMy42NTI0IDE0LjQxMDNMMy4wMDE5MSA1LjMwMzQ0QzMuMDAwNjIgNS4yODU1MSAyLjk5OTk4IDUuMjY3NjkgMi45OTk5NyA1LjI1QzIuNTg1NzcgNS4yNDk5OSAyLjI1IDQuOTE0MiAyLjI1IDQuNUMyLjI1IDQuMDg1NzkgMi41ODU3OSAzLjc1IDMgMy43NUg1LjQ1OTQzTDUuODY3NTQgMi41MjU2NUM2LjA3MTcyIDEuOTEzMTQgNi42NDQ5MyAxLjUgNy4yOTA1NyAxLjVIMTAuNzA5NFpNMTMuNDk4MSA1LjI1SDQuNTAxOTFMNS4xNDg1OCAxNC4zMDM0QzUuMTc2NjIgMTQuNjk2IDUuNTAzMiAxNSA1Ljg5NjY4IDE1SDEyLjEwMzRDMTIuNDk2OCAxNSAxMi44MjM0IDE0LjY5NiAxMi44NTE0IDE0LjMwMzRMMTMuNDk4MSA1LjI1Wk03LjUgNy41QzcuODg0NjQgNy41IDguMjAxNjMgNy43ODk1MiA4LjI0NDk1IDguMTYyNTNMOC4yNSA4LjI1VjEyQzguMjUgMTIuNDE0MiA3LjkxNDIyIDEyLjc1IDcuNSAxMi43NUM3LjExNTM3IDEyLjc1IDYuNzk4MzcgMTIuNDYwNSA2Ljc1NTA1IDEyLjA4NzVMNi43NSAxMlY4LjI1QzYuNzUgNy44MzU3OCA3LjA4NTc4IDcuNSA3LjUgNy41Wk0xMC41IDcuNUMxMC45MTQyIDcuNSAxMS4yNSA3LjgzNTc4IDExLjI1IDguMjVWMTJDMTEuMjUgMTIuNDE0MiAxMC45MTQyIDEyLjc1IDEwLjUgMTIuNzVDMTAuMDg1OCAxMi43NSA5Ljc1IDEyLjQxNDIgOS43NSAxMlY4LjI1QzkuNzUgNy44MzU3OCAxMC4wODU4IDcuNSAxMC41IDcuNVpNMTAuNzA5NCAzSDcuMjkwNTdMNy4wNDA1NyAzLjc1SDEwLjk1OTVMMTAuNzA5NCAzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0YzMkIyQlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF82M18yNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keSBjbGFzcz1cInBzLTAgcGUtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtaW4taGVpZ2h0OiA1MHB4XCIgZG5kRHJvcHpvbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRuZERyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaXh0dXJlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEZvcm1GaXh0dXJlcyhpKS5jb250cm9scy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cImZpeHR1cmVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZml4dHVyZSBvZiBnZXRGb3JtRml4dHVyZXMoaSkuY29udHJvbHM7IGxldCBqID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkbmREcm9wem9uZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRuZERyb3ApPVwib25Ecm9wKCRldmVudCwgaSwgailcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwialwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZG5kRHJhZ2dhYmxlXT1cInsgd2FsbEluZGV4OiBpLCBmaXh0dXJlSW5kZXg6IGogfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZG5kRWZmZWN0QWxsb3dlZF09XCInYWxsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdyBnLTAgbWItNSBmaXh0dXJlLXJvd1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGlnaGxpZ2h0ZWQtZml4dHVyZV09XCJsYXlvdXRGb3JtLmVuYWJsZWQgJiYgaGlnaGxpZ2h0ZWRGaXh0dXJlRm9ybUlkICYmIGZpeHR1cmUuZ2V0KCdfaWQnKT8udmFsdWUgPT09IGhpZ2hsaWdodGVkRml4dHVyZUZvcm1JZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZG5kRGlzYWJsZURyYWdJZl09XCJsYXlvdXRGb3JtLmRpc2FibGVkXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBoLTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGRuZERyYWdJbWFnZVJlZlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cInsgY3Vyc29yOiBsYXlvdXRGb3JtLmRpc2FibGVkID8gJ2RlZmF1bHQnIDogJ21vdmUnLCBvcGFjaXR5OiAnMC41JyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjVweFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwibSA0LjQ5NjA5NCAwIGMgLTAuODMyMDMyIDAgLTEuNSAwLjY3MTg3NSAtMS41IDEuNSBzIDAuNjY3OTY4IDEuNSAxLjUgMS41IGMgMC44MjgxMjUgMCAxLjUgLTAuNjcxODc1IDEuNSAtMS41IHMgLTAuNjcxODc1IC0xLjUgLTEuNSAtMS41IHogbSA2IDAgYyAtMC44MzIwMzIgMCAtMS41IDAuNjcxODc1IC0xLjUgMS41IHMgMC42Njc5NjggMS41IDEuNSAxLjUgYyAwLjgyODEyNSAwIDEuNSAtMC42NzE4NzUgMS41IC0xLjUgcyAtMC42NzE4NzUgLTEuNSAtMS41IC0xLjUgeiBtIC02IDYgYyAtMC44MzIwMzIgMCAtMS41IDAuNjcxODc1IC0xLjUgMS41IHMgMC42Njc5NjggMS41IDEuNSAxLjUgYyAwLjgyODEyNSAwIDEuNSAtMC42NzE4NzUgMS41IC0xLjUgcyAtMC42NzE4NzUgLTEuNSAtMS41IC0xLjUgeiBtIDYgMCBjIC0wLjgzMjAzMiAwIC0xLjUgMC42NzE4NzUgLTEuNSAxLjUgcyAwLjY2Nzk2OCAxLjUgMS41IDEuNSBjIDAuODI4MTI1IDAgMS41IC0wLjY3MTg3NSAxLjUgLTEuNSBzIC0wLjY3MTg3NSAtMS41IC0xLjUgLTEuNSB6IG0gLTYgNiBjIC0wLjgzMjAzMiAwIC0xLjUgMC42NzE4NzUgLTEuNSAxLjUgcyAwLjY2Nzk2OCAxLjUgMS41IDEuNSBjIDAuODI4MTI1IDAgMS41IC0wLjY3MTg3NSAxLjUgLTEuNSBzIC0wLjY3MTg3NSAtMS41IC0xLjUgLTEuNSB6IG0gNiAwIGMgLTAuODMyMDMyIDAgLTEuNSAwLjY3MTg3NSAtMS41IDEuNSBzIDAuNjY3OTY4IDEuNSAxLjUgMS41IGMgMC44MjgxMjUgMCAxLjUgLTAuNjcxODc1IDEuNSAtMS41IHMgLTAuNjcxODc1IC0xLjUgLTEuNSAtMS41IHogbSAwIDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJncmV5XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZml4dHVyZUNvbmZpZ0lkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkRmllbGRdPVwiJ19pZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZUZpZWxkXT1cIiduYW1lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImZpeHR1cmVUZW1wbGF0ZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0ZpeHR1cmUgJyArIChqICsgMSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3ViVGV4dEZpZWxkXT1cIidzdWJ0ZXh0J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtZW5kIGp1c3RpZnktY29udGVudC1jZW50ZXIgaC0xMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIChjbGljayk9XCJkZWxldGVGaXh0dXJlKCd3YWxsJywgaiwgaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7IG1hcmdpbi1ib3R0b206IDE4cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkgMUwxIDlNMSAxTDkgOVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJsaW5rLWJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cImxheW91dEZvcm0uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROZXdGaXh0dXJlKCd3YWxsJywgaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgZml4dHVyZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxociBzdHlsZT1cImJvcmRlci10b3A6IDFweCBkYXNoZWQgIzAwMDAwMDtcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBPdGhlciBFbGVtZW50cyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRXYWxsT3RoZXJFbGVtZW50cyhpKS5jb250cm9scy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cIm90aGVyRWxlbWVudHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmaXh0dXJlIG9mIGdldFdhbGxPdGhlckVsZW1lbnRzKGkpLmNvbnRyb2xzOyBsZXQgaiA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2Zvcm1Hcm91cE5hbWVdPVwialwiIGNsYXNzPVwicm93IGctMCBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTExXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+RWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBqICsgMSB9fTwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHJvcGRvd24gYm91bmQgdG8gJ3R5cGUnIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IFtpZEZpZWxkXT1cIid2YWx1ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJvdGhlckVsZW1lbnRMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidlbGVtZW50TGFiZWwnICsgalwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2hvdyBjdXN0b20gdGV4dCBpbnB1dCBvbmx5IHdoZW4gJ090aGVycycgaXMgc2VsZWN0ZWQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGZpeHR1cmUuZ2V0KCd0eXBlJyk/LnZhbHVlKSA9PT0gJ090aGVycydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG10LTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjdXN0b21OYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBjdXN0b20gZWxlbWVudCBuYW1lXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtZW5kIGp1c3RpZnktY29udGVudC1jZW50ZXIgaC0xMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIChjbGljayk9XCJyZW1vdmVPdGhlckVsZW1lbnQoJ3dhbGwnLCBqLCBpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgbWFyZ2luLWJvdHRvbTogMThweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAxTDEgOU0xIDFMOSA5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImxpbmstYnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE5ld090aGVyRWxlbWVudHMoJ3dhbGwnLCBpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2FkZFdhbGxBY3Rpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYWRkTmV3V2FsbCgwKVwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJsYXlvdXRGb3JtLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSB3LTEwMCBwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0IG5ldyB3YWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxociBzdHlsZT1cImJvcmRlci10b3A6IDFweCBkYXNoZWQgIzAwMDAwMDtcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRmxvb3IgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nYkFjY29yZGlvbkl0ZW1dPVwiJ2FjY29yZGlvbi1mbG9vcidcIiBjbGFzcz1cIm1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCIgbmdiQWNjb3JkaW9uSGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1haW5oZWFkaW5nIHAtMFwiIG5nYkFjY29yZGlvbkJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMiB3YWxsLWxhYmVsXCI+Rmxvb3I8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5IGNsYXNzPVwicHMtMCBwZS0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1pbi1oZWlnaHQ6IDUwcHhcIiBkbmREcm9wem9uZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG5kRHJvcCk9XCJvbkRyb3AoJGV2ZW50LCAnZmxvb3InKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZsb29yIEZpeHR1cmVzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Rm9ybUZsb29yRml4dHVyZXMuY29udHJvbHMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJmbG9vckZpeHR1cmVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZml4dHVyZSBvZiBnZXRGb3JtRmxvb3JGaXh0dXJlcy5jb250cm9sczsgbGV0IGogPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRuZERyb3B6b25lIChkbmREcm9wKT1cIm9uRHJvcCgkZXZlbnQsICdmbG9vcicsIGopXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RuZERyYWdnYWJsZV09XCJ7IHdhbGxJbmRleDogJ2Zsb29yJywgZml4dHVyZUluZGV4OiBqIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RuZEVmZmVjdEFsbG93ZWRdPVwiJ2FsbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RuZERpc2FibGVEcmFnSWZdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdyBnLTAgbWItNSBmaXh0dXJlLXJvd1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGlnaGxpZ2h0ZWQtZml4dHVyZV09XCJsYXlvdXRGb3JtLmVuYWJsZWQgJiYgaGlnaGxpZ2h0ZWRGaXh0dXJlRm9ybUlkICYmIGZpeHR1cmUuZ2V0KCdfaWQnKT8udmFsdWUgPT09IGhpZ2hsaWdodGVkRml4dHVyZUZvcm1JZFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgaC0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBkbmREcmFnSW1hZ2VSZWZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBtb3ZlOyBvcGFjaXR5OiAwLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyNXB4XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJtIDQuNDk2MDk0IDAgYyAtMC44MzIwMzIgMCAtMS41IDAuNjcxODc1IC0xLjUgMS41IHMgMC42Njc5NjggMS41IDEuNSAxLjUgYyAwLjgyODEyNSAwIDEuNSAtMC42NzE4NzUgMS41IC0xLjUgcyAtMC42NzE4NzUgLTEuNSAtMS41IC0xLjUgeiBtIDYgMCBjIC0wLjgzMjAzMiAwIC0xLjUgMC42NzE4NzUgLTEuNSAxLjUgcyAwLjY2Nzk2OCAxLjUgMS41IDEuNSBjIDAuODI4MTI1IDAgMS41IC0wLjY3MTg3NSAxLjUgLTEuNSBzIC0wLjY3MTg3NSAtMS41IC0xLjUgLTEuNSB6IG0gLTYgNiBjIC0wLjgzMjAzMiAwIC0xLjUgMC42NzE4NzUgLTEuNSAxLjUgcyAwLjY2Nzk2OCAxLjUgMS41IDEuNSBjIDAuODI4MTI1IDAgMS41IC0wLjY3MTg3NSAxLjUgLTEuNSBzIC0wLjY3MTg3NSAtMS41IC0xLjUgLTEuNSB6IG0gNiAwIGMgLTAuODMyMDMyIDAgLTEuNSAwLjY3MTg3NSAtMS41IDEuNSBzIDAuNjY3OTY4IDEuNSAxLjUgMS41IGMgMC44MjgxMjUgMCAxLjUgLTAuNjcxODc1IDEuNSAtMS41IHMgLTAuNjcxODc1IC0xLjUgLTEuNSAtMS41IHogbSAtNiA2IGMgLTAuODMyMDMyIDAgLTEuNSAwLjY3MTg3NSAtMS41IDEuNSBzIDAuNjY3OTY4IDEuNSAxLjUgMS41IGMgMC44MjgxMjUgMCAxLjUgLTAuNjcxODc1IDEuNSAtMS41IHMgLTAuNjcxODc1IC0xLjUgLTEuNSAtMS41IHogbSA2IDAgYyAtMC44MzIwMzIgMCAtMS41IDAuNjcxODc1IC0xLjUgMS41IHMgMC42Njc5NjggMS41IDEuNSAxLjUgYyAwLjgyODEyNSAwIDEuNSAtMC42NzE4NzUgMS41IC0xLjUgcyAtMC42NzE4NzUgLTEuNSAtMS41IC0xLjUgeiBtIDAgMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImdyZXlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ29uZmlnSWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCInX2lkJ1wiIFtuYW1lRmllbGRdPVwiJ25hbWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiZml4dHVyZVRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInRml4dHVyZSAnICsgKGogKyAxKVwiIFtzZWFyY2hdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdWJUZXh0RmllbGRdPVwiJ3N1YnRleHQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1lbmQganVzdGlmeS1jb250ZW50LWNlbnRlciBoLTEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJsYXlvdXRGb3JtLmRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKGNsaWNrKT1cImRlbGV0ZUZpeHR1cmUoJ2Zsb29yJywgailcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7IG1hcmdpbi1ib3R0b206IDE4cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkgMUwxIDlNMSAxTDkgOVwiIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImxpbmstYnRuXCIgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cImxheW91dEZvcm0uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROZXdGaXh0dXJlKCdmbG9vcicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIGZpeHR1cmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHIgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggZGFzaGVkICMwMDAwMDA7XCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRmxvb3IgT3RoZXIgRWxlbWVudHMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRGb3JtRmxvb3JPdGhlckVsZW1lbnRzLmNvbnRyb2xzLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwiZmxvb3JPdGhlckVsZW1lbnRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZml4dHVyZSBvZiBnZXRGb3JtRmxvb3JPdGhlckVsZW1lbnRzLmNvbnRyb2xzOyBsZXQgaiA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2Zvcm1Hcm91cE5hbWVdPVwialwiIGNsYXNzPVwicm93IGctMCBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTExXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+RWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBqICsgMSB9fTwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHJvcGRvd24gZm9yIHR5cGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cIm90aGVyRWxlbWVudExpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2Zsb29yRWxlbWVudExhYmVsJyArIGpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvbmRpdGlvbmFsIGlucHV0IGZvciBjdXN0b20gbmFtZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZml4dHVyZS5nZXQoJ3R5cGUnKT8udmFsdWUpID09PSAnT3RoZXJzJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbXQtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImN1c3RvbU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGN1c3RvbSBlbGVtZW50IG5hbWVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1lbmQganVzdGlmeS1jb250ZW50LWNlbnRlciBoLTEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJsYXlvdXRGb3JtLmRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKGNsaWNrKT1cInJlbW92ZU90aGVyRWxlbWVudCgnZmxvb3InLCBqKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgbWFyZ2luLWJvdHRvbTogMThweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAxTDEgOU0xIDFMOSA5XCIgc3Ryb2tlPVwiIzM0NDA1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGluay1idG5cIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE5ld090aGVyRWxlbWVudHMoJ2Zsb29yJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQ2VudGVyIENvbHVtbiAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBvdmVyZmxvdy1oaWRkZW4gcG9zaXRpb24tcmVsYXRpdmVcIiBbbmdDbGFzc109XCJ7ICdkLW5vbmUnOiBlZGl0Rml4dHVyZSB9XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiY2FudmFzLWNhcmRcIiBjbGFzcz1cImMtY2FyZCBwb3NpdGlvbi1yZWxhdGl2ZVwiICNjYW52YXNDb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBDYW52YXMgVmlldyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8Y2FudmFzIGlkPVwiYmFzZS1jYW52YXNcIiAjYmFzZUNhbnZhcz48L2NhbnZhcz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWVuZCBnYXAtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwidG9wOiAyNHB4OyByaWdodDogMjZweDt3aWR0aDogY2FsYygxMDAlIC0gNTBweCk7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRW50cmFuY2UgQnV0dG9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibGF5b3V0Rm9ybS5lbmFibGVkXCIgbmdiVG9vbHRpcD1cIllvdSBjYW4gYWRkIHVwIHRvIHR3byBlbnRyYW5jZXMuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlVG9vbHRpcF09XCJnZXRFbnRyYW5jZXM/Lmxlbmd0aCA8IDJcIiBjbGFzcz1cIm1lLWF1dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHN0eWxlPVwicGFkZGluZzogOHB4IDIwcHggIWltcG9ydGFudDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTMgYmctd2hpdGUgc2hhZG93LXNtIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdldEVudHJhbmNlcz8ubGVuZ3RoID49IDJcIiAoY2xpY2spPVwiYWRkTmV3RW50cmFuY2UoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBFbnRyYW5jZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYW5jZWwgZWRpdCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGxheW91dEZvcm0uZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0U3RhdHVzID09PSAnYWxsb2NhdGlvblBlbmRpbmcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBiZy13aGl0ZSBzaGFkb3ctc21cIiAoY2xpY2spPVwiY2FuY2VsRWRpdCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbmNlbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tdGV4dFwiIChjbGljayk9XCJjYW5jZWxFZGl0KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuY2VsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2F2ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGxheW91dEZvcm0uZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0U3RhdHVzID09PSAnZHJhZnQnKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBzaGFkb3ctc20gYmctd2hpdGUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6IDEzMHB4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NhdmluZ0xheW91dFwiIChjbGljayk9XCJ1cGRhdGVMYXlvdXQodHJ1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1NhdmluZ0xheW91dFwiIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc21cIiByb2xlPVwic3RhdHVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGFzIERyYWZ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9QGVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiA4cHggMjBweCAhaW1wb3J0YW50O21pbi13aWR0aDogOTBweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LW5vd3JhcCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIGp1c3RpZnktY29udGVudC1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNTYXZpbmdMYXlvdXRcIiAoY2xpY2spPVwidXBkYXRlTGF5b3V0KHRydWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNTYXZpbmdMYXlvdXRcIiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHNwaW5uZXItYm9yZGVyLXNtXCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvbXBhY3QgYnV0dG9uIChDQUQgbGF5b3V0cyBvbmx5LCB2aWV3IG1vZGUpIOKAlCBvbmUtc2hvdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlja2luZyBjb21wYWN0cyB0aGUgbGF5b3V0IGFuZCBkcm9wcyB0aGUgdXNlciBpbnRvIGVkaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIHNvIHRoZSBjaGFuZ2UgaXMgcmV2ZXJ0YWJsZSB2aWEgQ2FuY2VsIGFuZCBwZXJzaXN0YWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBTYXZlIC8gU3VibWl0LiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNhblNob3dDb21wYWN0VG9nZ2xlICYmIGxheW91dEZvcm0uZGlzYWJsZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBzaGFkb3ctc20gYmctd2hpdGUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29tcGFjdExheW91dCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiQ29tcGFjdCBsYXlvdXQuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjQgMTQgMTAgMTQgMTAgMjBcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiMjAgMTAgMTQgMTAgMTQgNFwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5lIHgxPVwiMTRcIiB5MT1cIjEwXCIgeDI9XCIyMVwiIHkyPVwiM1wiPjwvbGluZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmUgeDE9XCIzXCIgeTE9XCIyMVwiIHgyPVwiMTBcIiB5Mj1cIjE0XCI+PC9saW5lPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRWRpdCBCdXR0b24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihpc0VkaXRMYXlvdXRBbGxvd2VkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMyBiZy13aGl0ZSBzaGFkb3ctc21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrRWRpdCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTMyMl81MzI1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE0LjE2NjcgMi40OTk5M0MxNC4zODU2IDIuMjgxMDYgMTQuNjQ1NSAyLjEwNzQ0IDE0LjkzMTQgMS45ODg5OUMxNS4yMTc0IDEuODcwNTQgMTUuNTIzOSAxLjgwOTU3IDE1LjgzMzQgMS44MDk1N0MxNi4xNDI5IDEuODA5NTcgMTYuNDQ5NCAxLjg3MDU0IDE2LjczNTQgMS45ODg5OUMxNy4wMjE0IDIuMTA3NDQgMTcuMjgxMiAyLjI4MTA2IDE3LjUwMDEgMi40OTk5M0MxNy43MTkgMi43MTg4IDE3Ljg5MjYgMi45Nzg2MyAxOC4wMTEgMy4yNjQ2QzE4LjEyOTUgMy41NTA1NyAxOC4xOTA0IDMuODU3MDYgMTguMTkwNCA0LjE2NjU5QzE4LjE5MDQgNC40NzYxMiAxOC4xMjk1IDQuNzgyNjIgMTguMDExIDUuMDY4NTlDMTcuODkyNiA1LjM1NDU1IDE3LjcxOSA1LjYxNDM5IDE3LjUwMDEgNS44MzMyNkw2LjI1MDA4IDE3LjA4MzNMMS42NjY3NSAxOC4zMzMzTDIuOTE2NzUgMTMuNzQ5OUwxNC4xNjY3IDIuNDk5OTNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzEzMjJfNTMyNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2FuY2VsIEJ1dHRvbiAoRnJvbSBhbGxvY2F0aW9uKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImxheW91dEZvcm0uZGlzYWJsZWQgJiYgaXNBbGxvY2F0aW9uUnVuXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBiZy13aGl0ZSBzaGFkb3ctc21cIiAoY2xpY2spPVwib25DbGlja1JldmVydEFsbG9jYXRpb24oKSBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbmNlbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJ1biBhbGxvY2F0aW9uIC8gQ29tcGxldGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihpc1J1bkFsbG9jYXRpb25BbGxvd2VkICYmIGxheW91dEZvcm0uZGlzYWJsZWQgJiYgZ2V0U3RhdHVzID09PSAnYWxsb2NhdGlvblBlbmRpbmcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiIWlzQWxsb2NhdGlvblJ1biA/IGludmFsaWRGaXh0dXJlc1Rvb2x0aXAgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHN0eWxlPVwicGFkZGluZzogOHB4IDIwcHggIWltcG9ydGFudDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LW5vd3JhcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvY2F0aW9uUnVuICYmIGhhc0ludmFsaWRGaXh0dXJlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrUnVuQWxsb2NhdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGlzQWxsb2NhdGlvblJ1biA/ICdDb21wbGV0ZSBBbGxvY2F0aW9uJyA6ICdSdW4gQWxsb2NhdGlvbicgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImdldFN0YXR1cyA9PT0gJ2RyYWZ0J1wiIHR5cGU9XCJidXR0b25cIiBzdHlsZT1cInBhZGRpbmc6IDhweCAyMHB4ICFpbXBvcnRhbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdGV4dC1ub3dyYXBcIiAoY2xpY2spPVwib25DbGlja0FwcHJvdmVMYXlvdXQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VibWl0IGZvciBtZXJjaCBhbGxvY2F0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSb3RhdGUgQnV0dG9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImxheW91dEZvcm0uZGlzYWJsZWRcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBiZy13aGl0ZSBzaGFkb3ctc21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJvdGF0ZUNhbnZhcyhjYW52YXMsOTApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIyXCIgaGVpZ2h0PVwiMjJcIiB2aWV3Qm94PVwiMCAwIDI2IDI2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi4zNjI2NSA3LjE3ODg3TDcuMTc2MjUgNi4zNjI4N0w1LjkwNDI1IDUuMDkyMDdMNS4wODk0NSA1LjkwNTY3TDYuMzYyNjUgNy4xNzg4N1pNMTUuNjcxIDYuMzY0MDdMMTkuNjM3OSAxMC4zMzA5TDIwLjkwOTkgOS4wNTc2OUwxNi45NDQyIDUuMDkwODdMMTUuNjcxIDYuMzY0MDdaTTE5LjYzNzkgMTguODI1N0wxOC44MjQzIDE5LjYzOTNMMjAuMDk2MyAyMC45MTAxTDIwLjkwOTkgMjAuMDk3N0wxOS42Mzc5IDE4LjgyNTdaTTEwLjMyOTUgMTkuNjM5M0w2LjM2MjY1IDE1LjY3MjVMNS4wOTA2NSAxNi45NDU3TDkuMDU2MjYgMjAuOTExM0wxMC4zMjk1IDE5LjYzOTNaTTE4LjgyNDMgMTkuNjM5M0MxNy42NTQzIDIwLjgwODEgMTYuODQwNyAyMS42MTkzIDE2LjE0NTkgMjIuMTQ5N0MxNS40NzE1IDIyLjY2NDUgMTUuMDE1NSAyMi44Mjg5IDE0LjU3NjMgMjIuODI4OVYyNC42Mjg5QzE1LjU2NzUgMjQuNjI4OSAxNi40MDI3IDI0LjIxNzMgMTcuMjM2NyAyMy41ODEzQzE4LjA1MDMgMjIuOTYwOSAxOC45NjM1IDIyLjA0NTMgMjAuMDk2MyAyMC45MTI1TDE4LjgyNDMgMTkuNjM5M1pNOS4wNTYyNiAyMC45MTEzQzEwLjE4OTEgMjIuMDQ1MyAxMS4xMDIzIDIyLjk1OTcgMTEuOTE1OSAyMy41ODEzQzEyLjc0OTkgMjQuMjE3MyAxMy41ODUxIDI0LjYyODkgMTQuNTc2MyAyNC42Mjg5VjIyLjgyODlDMTQuMTM3MSAyMi44Mjg5IDEzLjY4MjMgMjIuNjY0NSAxMy4wMDY3IDIyLjE0OTdDMTIuMzExOSAyMS42MTkzIDExLjQ5ODMgMjAuODA4MSAxMC4zMjk1IDE5LjYzOTNMOS4wNTYyNiAyMC45MTEzWk0xOS42Mzc5IDEwLjMzMDlDMjAuODA2NyAxMS40OTk3IDIxLjYxNzkgMTIuMzEzMyAyMi4xNDgzIDEzLjAwODFDMjIuNjYzMSAxMy42ODM3IDIyLjgyNzUgMTQuMTM4NSAyMi44Mjc1IDE0LjU3NzdIMjQuNjI3NUMyNC42Mjc1IDEzLjU4NjUgMjQuMjE1OSAxMi43NTEzIDIzLjU3OTkgMTEuOTE3M0MyMi45NTk1IDExLjEwMzcgMjIuMDQyNyAxMC4xOTA1IDIwLjkwOTkgOS4wNTc2OUwxOS42Mzc5IDEwLjMzMDlaTTIwLjkwOTkgMjAuMDk3N0MyMi4wNDM5IDE4Ljk2MzcgMjIuOTU4MyAxOC4wNTE3IDIzLjU3OTkgMTcuMjM4MUMyNC4yMTU5IDE2LjQwNDEgMjQuNjI3NSAxNS41Njg5IDI0LjYyNzUgMTQuNTc3N0gyMi44Mjc1QzIyLjgyNzUgMTUuMDE2OSAyMi42NjMxIDE1LjQ3MjkgMjIuMTQ4MyAxNi4xNDczQzIxLjYxNzkgMTYuODQyMSAyMC44MDY3IDE3LjY1NTcgMTkuNjM3OSAxOC44MjU3TDIwLjkwOTkgMjAuMDk3N1pNNy4xNzYyNSA2LjM2Mjg3QzguMzQ2MjUgNS4xOTQwNyA5LjE1OTg1IDQuMzgxNjcgOS44NTQ2NSAzLjg1MTI3QzEwLjUyOSAzLjMzNjQ3IDEwLjk4NSAzLjE3MzI3IDExLjQyNDIgMy4xNzMyN1YxLjM3MjA3QzEwLjQzMyAxLjM3MjA3IDkuNTk3ODUgMS43ODM2NyA4Ljc2Mzg1IDIuNDE5NjdDNy45NDkwNSAzLjA0MTI3IDcuMDM3MDUgMy45NTU2NyA1LjkwNDI1IDUuMDg4NDdMNy4xNzYyNSA2LjM2Mjg3Wk0xNi45NDQyIDUuMDkwODdDMTUuODExNCAzLjk1Njg3IDE0Ljg5ODIgMy4wNDEyNyAxNC4wODQ2IDIuNDE5NjdDMTMuMjUwNiAxLjc4MzY3IDEyLjQxNTQgMS4zNzIwNyAxMS40MjQyIDEuMzcyMDdWMy4xNzMyN0MxMS44NjM0IDMuMTczMjcgMTIuMzE4MiAzLjMzNjQ3IDEyLjk5MzggMy44NTEyN0MxMy42ODg2IDQuMzgxNjcgMTQuNTAyMiA1LjE5Mjg3IDE1LjY3MSA2LjM2MTY3TDE2Ljk0NDIgNS4wOTA4N1pNNS4wODk0NSA1LjkwMzI3QzMuOTU2NjUgNy4wMzYwNyAzLjA0MjI1IDcuOTQ4MDcgMi40MjA2NSA4Ljc2Mjg3QzEuNzg0NjUgOS41OTY4NyAxLjM3MzA1IDEwLjQzMjEgMS4zNzMwNSAxMS40MjMzSDMuMTczMDVDMy4xNzMwNSAxMC45ODQxIDMuMzM3NDUgMTAuNTI4MSAzLjg1MjI1IDkuODUzNjdDNC4zODI2NSA5LjE1ODg3IDUuMTkzODUgOC4zNDUyNyA2LjM2MjY1IDcuMTc1MjdMNS4wODk0NSA1LjkwMzI3Wk02LjM2MjY1IDE1LjY3MTNDNS4xOTM4NSAxNC41MDEzIDQuMzgyNjUgMTMuNjg3NyAzLjg1MjI1IDEyLjk5MjlDMy4zMzc0NSAxMi4zMTg1IDMuMTczMDUgMTEuODYyNSAzLjE3MzA1IDExLjQyMzNIMS4zNzMwNUMxLjM3MzA1IDEyLjQxNDUgMS43ODQ2NSAxMy4yNDk3IDIuNDIwNjUgMTQuMDgzN0MzLjA0MjI1IDE0Ljg5NzMgMy45NTY2NSAxNS44MTA1IDUuMDg5NDUgMTYuOTQzM0w2LjM2MjY1IDE1LjY3MTNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxRDI5MzlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjMuMiA2Ljk4MzJMMjUgOC4yQzI1IDQuNTgyIDIyLjQwNTYgMS41Nzk2IDE5IDFNMi44IDE5LjAxNjhMMSAxNy44QzEgMjEuNDE4IDMuNTk0NCAyNC40MjA0IDcgMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMUQyOTM5XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERvd25sb2FkIEJ1dHRvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMyBiZy13aGl0ZSBzaGFkb3ctc21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkQ2FudmFzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMlwiIGhlaWdodD1cIjIyXCIgdmlld0JveD1cIjAgMCAyNiAyNlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgc3Ryb2tlPVwiIzAwMDAwMFwiIHN0cm9rZS13aWR0aD1cIjAuMjQwMDAwMDAwMDAwMDAwMDVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBpZD1cIlNWR1JlcG9fYmdDYXJyaWVyXCIgc3Ryb2tlLXdpZHRoPVwiMFwiPjwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBpZD1cIlNWR1JlcG9fdHJhY2VyQ2FycmllclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNDQ0NDQ0NcIiBzdHJva2Utd2lkdGg9XCIwLjM4NFwiPjwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBpZD1cIlNWR1JlcG9faWNvbkNhcnJpZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIuNTUzNSAxNi41MDYxQzEyLjQxMTQgMTYuNjYxNSAxMi4yMTA2IDE2Ljc1IDEyIDE2Ljc1QzExLjc4OTQgMTYuNzUgMTEuNTg4NiAxNi42NjE1IDExLjQ0NjUgMTYuNTA2MUw3LjQ0NjQ4IDEyLjEzMTFDNy4xNjY5OCAxMS44MjU0IDcuMTg4MjIgMTEuMzUxIDcuNDkzOTIgMTEuMDcxNUM3Ljc5OTYzIDEwLjc5MiA4LjI3NDAyIDEwLjgxMzIgOC41NTM1MiAxMS4xMTg5TDExLjI1IDE0LjA2ODJWM0MxMS4yNSAyLjU4NTc5IDExLjU4NTggMi4yNSAxMiAyLjI1QzEyLjQxNDIgMi4yNSAxMi43NSAyLjU4NTc5IDEyLjc1IDNWMTQuMDY4MkwxNS40NDY1IDExLjExODlDMTUuNzI2IDEwLjgxMzIgMTYuMjAwNCAxMC43OTIgMTYuNTA2MSAxMS4wNzE1QzE2LjgxMTggMTEuMzUxIDE2LjgzMyAxMS44MjU0IDE2LjU1MzUgMTIuMTMxMUwxMi41NTM1IDE2LjUwNjFaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMUQyOTM5XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zLjc1IDE1QzMuNzUgMTQuNTg1OCAzLjQxNDIyIDE0LjI1IDMgMTQuMjVDMi41ODU3OSAxNC4yNSAyLjI1IDE0LjU4NTggMi4yNSAxNVYxNS4wNTQ5QzIuMjQ5OTggMTYuNDIyNSAyLjI0OTk2IDE3LjUyNDggMi4zNjY1MiAxOC4zOTE4QzIuNDg3NTQgMTkuMjkxOSAyLjc0NjQzIDIwLjA0OTcgMy4zNDgzNSAyMC42NTE2QzMuOTUwMjcgMjEuMjUzNiA0LjcwODE0IDIxLjUxMjUgNS42MDgyNSAyMS42MzM1QzYuNDc1MjIgMjEuNzUgNy41Nzc1NCAyMS43NSA4Ljk0NTEzIDIxLjc1SDE1LjA1NDlDMTYuNDIyNSAyMS43NSAxNy41MjQ4IDIxLjc1IDE4LjM5MTggMjEuNjMzNUMxOS4yOTE5IDIxLjUxMjUgMjAuMDQ5NyAyMS4yNTM2IDIwLjY1MTcgMjAuNjUxNkMyMS4yNTM2IDIwLjA0OTcgMjEuNTEyNSAxOS4yOTE5IDIxLjYzMzUgMTguMzkxOEMyMS43NSAxNy41MjQ4IDIxLjc1IDE2LjQyMjUgMjEuNzUgMTUuMDU0OVYxNUMyMS43NSAxNC41ODU4IDIxLjQxNDIgMTQuMjUgMjEgMTQuMjVDMjAuNTg1OCAxNC4yNSAyMC4yNSAxNC41ODU4IDIwLjI1IDE1QzIwLjI1IDE2LjQzNTQgMjAuMjQ4NCAxNy40MzY1IDIwLjE0NjkgMTguMTkxOUMyMC4wNDgyIDE4LjkyNTcgMTkuODY3OCAxOS4zMTQyIDE5LjU5MSAxOS41OTFDMTkuMzE0MiAxOS44Njc4IDE4LjkyNTcgMjAuMDQ4MiAxOC4xOTE5IDIwLjE0NjlDMTcuNDM2NSAyMC4yNDg0IDE2LjQzNTQgMjAuMjUgMTUgMjAuMjVIOUM3LjU2NDU5IDIwLjI1IDYuNTYzNDcgMjAuMjQ4NCA1LjgwODEyIDIwLjE0NjlDNS4wNzQzNSAyMC4wNDgyIDQuNjg1NzcgMTkuODY3OCA0LjQwOTAxIDE5LjU5MUM0LjEzMjI1IDE5LjMxNDIgMy45NTE4IDE4LjkyNTcgMy44NTMxNSAxOC4xOTE5QzMuNzUxNTkgMTcuNDM2NSAzLjc1IDE2LjQzNTQgMy43NSAxNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxRDI5MzlcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gUGFuZWwgQ29sbGFwc2UgSGFuZGxlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sbGFwc2UtaGFuZGxlciBsZWZ0XCIgKGNsaWNrKT1cInRvZ2dsZVBhbmVsKCdsZWZ0JylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiIWlzTGVmdFBhbmVsQ29sbGFwc2VkXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjI3MzA4IDEyLjYzNkw0LjYzNjcyIDguOTk5NjRMOC4yNzMwOCA1LjM2MzI4TTEzLjM2NCAxMi42MzZMOS43Mjc2MyA4Ljk5OTY0TDEzLjM2NCA1LjM2MzI4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIxLjQ1NDU1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNMZWZ0UGFuZWxDb2xsYXBzZWRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxOCAxOFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkuNzI2OTIgNS4zNjM5OUwxMy4zNjMzIDkuMDAwMzZMOS43MjY5MiAxMi42MzY3TTQuNjM2MDEgNS4zNjM5OUw4LjI3MjM3IDkuMDAwMzZMNC42MzYwMSAxMi42MzY3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIxLjQ1NDU1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xsYXBzZS1oYW5kbGVyIHJpZ2h0XCIgKGNsaWNrKT1cInRvZ2dsZVBhbmVsKCdyaWdodCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzUmlnaHRQYW5lbENvbGxhcHNlZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4yNzMwOCAxMi42MzZMNC42MzY3MiA4Ljk5OTY0TDguMjczMDggNS4zNjMyOE0xMy4zNjQgMTIuNjM2TDkuNzI3NjMgOC45OTk2NEwxMy4zNjQgNS4zNjMyOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMTAxODI4XCIgc3Ryb2tlLXdpZHRoPVwiMS40NTQ1NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc1JpZ2h0UGFuZWxDb2xsYXBzZWRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxOCAxOFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkuNzI2OTIgNS4zNjM5OUwxMy4zNjMzIDkuMDAwMzZMOS43MjY5MiAxMi42MzY3TTQuNjM2MDEgNS4zNjM5OUw4LjI3MjM3IDkuMDAwMzZMNC42MzYwMSAxMi42MzY3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIxLjQ1NDU1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRWRpdCBGaXh0dXJlIEJvZHkgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIiBbbmdDbGFzc109XCJ7ICdkLW5vbmUnOiAhZWRpdEZpeHR1cmUgfVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cImVkaXQtYm9keVwiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibXgtMyBteS01IG5hdiBuYXYtcGlsbHNcIiByb2xlPVwidGFibGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBjdXJzb3ItcG9pbnRlclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIChjbGljayk9XCJzdWJtaXRGaXh0dXJlID0gZmFsc2U7IGVkaXRGaXh0dXJlU2VjdGlvbiA9ICdiYXNpYy1kZXRhaWxzJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZWRpdEZpeHR1cmVTZWN0aW9uID09PSAnYmFzaWMtZGV0YWlscycgPyAnYWN0aXZlJyA6ICcnXCIgY2xhc3M9XCJuYXYtbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRhYlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljIGRldGFpbHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gY3Vyc29yLXBvaW50ZXJcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwic3VibWl0Rml4dHVyZSA9IGZhbHNlOyBlZGl0Rml4dHVyZVNlY3Rpb24gPSAncHJvZHVjdHMnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJlZGl0Rml4dHVyZVNlY3Rpb24gPT09ICdwcm9kdWN0cycgPyAnYWN0aXZlJyA6ICcnXCIgY2xhc3M9XCJuYXYtbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRhYlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2R1Y3RzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtIGN1cnNvci1wb2ludGVyXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cInN1Ym1pdEZpeHR1cmUgPSBmYWxzZTsgZWRpdEZpeHR1cmVTZWN0aW9uID0gJ3ZtcydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImVkaXRGaXh0dXJlU2VjdGlvbiA9PT0gJ3ZtcycgPyAnYWN0aXZlJyA6ICcnXCIgY2xhc3M9XCJuYXYtbGlua1wiIHJvbGU9XCJ0YWJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXN1YWwgTWVyY2hhbmRpc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0Rml4dHVyZVNlY3Rpb24gPT09ICdiYXNpYy1kZXRhaWxzJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1pbnN0YW5jZS1iYXNpYy1kZXRhaWxzIFtmaXh0dXJlRGF0YV09XCJzZWxlY3RlZEZpeHR1cmVEYXRhXCIgW2VkaXRNb2RlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1N1Ym1pdHRlZF09XCJzdWJtaXRGaXh0dXJlXCIgKHN1Ym1pdEV2ZW50KT1cIm9uRml4dHVyZVN1Ym1pdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlicmFyeUNhdGVnb3JpZXNdPVwibGlicmFyeUNhdGVnb3JpZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaWJyYXJ5QnlDYXRlZ29yeV09XCJsaWJyYXJ5QnlDYXRlZ29yeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsbG93Q2F0ZWdvcnlBbmRXaWR0aEVkaXRdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItaW5zdGFuY2UtYmFzaWMtZGV0YWlscz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdEZpeHR1cmVTZWN0aW9uID09PSAncHJvZHVjdHMnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWluc3RhbmNlLXByb2R1Y3RzIFtmaXh0dXJlRGF0YV09XCJzZWxlY3RlZEZpeHR1cmVEYXRhXCIgW2VkaXRNb2RlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1N1Ym1pdHRlZF09XCJzdWJtaXRGaXh0dXJlXCIgKHN1Ym1pdEV2ZW50KT1cIm9uRml4dHVyZVN1Ym1pdCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1pbnN0YW5jZS1wcm9kdWN0cz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdEZpeHR1cmVTZWN0aW9uID09PSAndm1zJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1pbnN0YW5jZS12bXMgW2ZpeHR1cmVEYXRhXT1cInNlbGVjdGVkRml4dHVyZURhdGFcIiBbZWRpdE1vZGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzU3VibWl0dGVkXT1cInN1Ym1pdEZpeHR1cmVcIiAoc3VibWl0RXZlbnQpPVwib25GaXh0dXJlU3VibWl0KCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLWluc3RhbmNlLXZtcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsgJ2NvbGxhcHNlZC1jb2wnOiBpc1JpZ2h0UGFuZWxDb2xsYXBzZWQsICdjb2wtMyc6ICFpc1JpZ2h0UGFuZWxDb2xsYXBzZWQgfVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGVdPVwieydtaW4td2lkdGgnOiBpc1JpZ2h0UGFuZWxDb2xsYXBzZWQgPyAnMCcgOiAgaXNBbGxvY2F0aW9uUnVuID8nNjgwcHgnIDogJzQ2NHB4JyB9XCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZml4dHVyZVByZXZpZXdDb2xcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcblxyXG48bmctdGVtcGxhdGUgI2ZpeHR1cmVQcmV2aWV3Q29sPlxyXG4gICAgPGRpdiBjbGFzcz1cInMtY2FyZFwiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6ZWRpdEZpeHR1cmUgPyAnNzJweCcgOiAnMHB4J31cIj5cclxuICAgICAgICA8b25ib2FyZC1maXh0dXJlIFtuZ0NsYXNzXT1cInsgJ2Qtbm9uZSc6IGlzUmlnaHRQYW5lbENvbGxhcHNlZH1cIlxyXG4gICAgICAgICAgICAob25DbG9zZSk9XCJ0b2dnbGVQYW5lbCgncmlnaHQnKTsgc2VsZWN0ZWRGaXh0dXJlRGF0YSA9IG51bGw7IHJlbW92ZUhpZ2hsaWdodCgpO1wiXHJcbiAgICAgICAgICAgIFtmaXh0dXJlRGF0YV09XCJzZWxlY3RlZEZpeHR1cmVEYXRhXCIgW2lzQWxsb2NhdGlvblJ1bl09XCJpc0FsbG9jYXRpb25SdW5cIlxyXG4gICAgICAgICAgICBbYWxsRml4dHVyZXNdPVwiYWxsRml4dHVyZUluc3RhbmNlc1wiPjwvb25ib2FyZC1maXh0dXJlPlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2hlYWRlclNrZWxldG9uPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBtLTAgZy0wIGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXIgdy0xMDAgcC00IHJvdW5kZWRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgbXQtMCBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjc2tlbGV0b25Mb2FkZXI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXIgcm91bmRlZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2FwcGx5TG9naWNzIGxldC1tb2RhbD5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgbWItNFwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHZpZXdCb3g9XCIwIDAgNDAgNDBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiMjBcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuODMzIDIxLjY2NjVDMTguMDMzIDIxLjY2NjUgMTcuMTE2NCAyMi43OTE1IDE2LjgxNjQgMjMuNTMzMkMxNy43MDggMjMuOTE2NSAxOC4zMzMgMjQuNzk5OCAxOC4zMzMgMjUuODMzMkMxOC4zMzMgMjYuNDk2MiAxOC4wNjk2IDI3LjEzMjEgMTcuNjAwOCAyNy42MDA5QzE3LjEzMTkgMjguMDY5OCAxNi40OTYxIDI4LjMzMzIgMTUuODMzIDI4LjMzMzJDMTUuMTcgMjguMzMzMiAxNC41MzQxIDI4LjA2OTggMTQuMDY1MyAyNy42MDA5QzEzLjU5NjQgMjcuMTMyMSAxMy4zMzMgMjYuNDk2MiAxMy4zMzMgMjUuODMzMkMxMy4zMzMgMjQuNzQxNSAxNC4wMjQ3IDIzLjgxNjUgMTQuOTk5NyAyMy40NzQ4VjE2LjUyNDhDMTQuNTExNCAxNi4zNTM1IDE0LjA4ODUgMTYuMDM0NCAxMy43ODk5IDE1LjYxMTdDMTMuNDkxMiAxNS4xODkxIDEzLjMzMTUgMTQuNjg0IDEzLjMzMyAxNC4xNjY1QzEzLjMzMyAxMy41MDM1IDEzLjU5NjQgMTIuODY3NiAxNC4wNjUzIDEyLjM5ODdDMTQuNTM0MSAxMS45Mjk5IDE1LjE3IDExLjY2NjUgMTUuODMzIDExLjY2NjVDMTYuNDk2MSAxMS42NjY1IDE3LjEzMTkgMTEuOTI5OSAxNy42MDA4IDEyLjM5ODdDMTguMDY5NiAxMi44Njc2IDE4LjMzMyAxMy41MDM1IDE4LjMzMyAxNC4xNjY1QzE4LjMzMyAxNS4yNTgyIDE3LjY0MTQgMTYuMTgzMiAxNi42NjY0IDE2LjUyNDhWMjAuOTMzMkMxNy4zOTk3IDIwLjM5MTUgMTguNDY2NCAxOS45OTk4IDE5Ljk5OTcgMTkuOTk5OEMyMi4yMjQ3IDE5Ljk5OTggMjIuOTY2NCAxOC44ODMyIDIzLjIwOCAxOC4xNDE1QzIyLjc1MjEgMTcuOTUxNiAyMi4zNjI1IDE3LjYzMTEgMjIuMDg4MiAxNy4yMjA0QzIxLjgxMzkgMTYuODA5NyAyMS42NjcxIDE2LjMyNzEgMjEuNjY2NCAxNS44MzMyQzIxLjY2NjQgMTUuMTcwMSAyMS45Mjk3IDE0LjUzNDIgMjIuMzk4NiAxNC4wNjU0QzIyLjg2NzQgMTMuNTk2NiAyMy41MDMzIDEzLjMzMzIgMjQuMTY2NCAxMy4zMzMyQzI0LjgyOTQgMTMuMzMzMiAyNS40NjUzIDEzLjU5NjYgMjUuOTM0MSAxNC4wNjU0QzI2LjQwMyAxNC41MzQyIDI2LjY2NjQgMTUuMTcwMSAyNi42NjY0IDE1LjgzMzJDMjYuNjY2NCAxNi45NDk4IDI1LjkzMyAxNy45MTY1IDI0LjkyNDcgMTguMjE2NUMyNC43MDggMTkuNDA4MiAyMy44OTk3IDIxLjY2NjUgMjAuODMzIDIxLjY2NjVaTTE1LjgzMyAyNC45OTk4QzE1LjYxMiAyNC45OTk4IDE1LjQgMjUuMDg3NiAxNS4yNDM4IDI1LjI0MzlDMTUuMDg3NSAyNS40MDAyIDE0Ljk5OTcgMjUuNjEyMiAxNC45OTk3IDI1LjgzMzJDMTQuOTk5NyAyNi4wNTQyIDE1LjA4NzUgMjYuMjY2MSAxNS4yNDM4IDI2LjQyMjRDMTUuNCAyNi41Nzg3IDE1LjYxMiAyNi42NjY1IDE1LjgzMyAyNi42NjY1QzE2LjA1NCAyNi42NjY1IDE2LjI2NiAyNi41Nzg3IDE2LjQyMjMgMjYuNDIyNEMxNi41Nzg2IDI2LjI2NjEgMTYuNjY2NCAyNi4wNTQyIDE2LjY2NjQgMjUuODMzMkMxNi42NjY0IDI1LjYxMjIgMTYuNTc4NiAyNS40MDAyIDE2LjQyMjMgMjUuMjQzOUMxNi4yNjYgMjUuMDg3NiAxNi4wNTQgMjQuOTk5OCAxNS44MzMgMjQuOTk5OFpNMTUuODMzIDEzLjMzMzJDMTUuNjEyIDEzLjMzMzIgMTUuNCAxMy40MjEgMTUuMjQzOCAxMy41NzcyQzE1LjA4NzUgMTMuNzMzNSAxNC45OTk3IDEzLjk0NTUgMTQuOTk5NyAxNC4xNjY1QzE0Ljk5OTcgMTQuMzg3NSAxNS4wODc1IDE0LjU5OTUgMTUuMjQzOCAxNC43NTU4QzE1LjQgMTQuOTEyIDE1LjYxMiAxNC45OTk4IDE1LjgzMyAxNC45OTk4QzE2LjA1NCAxNC45OTk4IDE2LjI2NiAxNC45MTIgMTYuNDIyMyAxNC43NTU4QzE2LjU3ODYgMTQuNTk5NSAxNi42NjY0IDE0LjM4NzUgMTYuNjY2NCAxNC4xNjY1QzE2LjY2NjQgMTMuOTQ1NSAxNi41Nzg2IDEzLjczMzUgMTYuNDIyMyAxMy41NzcyQzE2LjI2NiAxMy40MjEgMTYuMDU0IDEzLjMzMzIgMTUuODMzIDEzLjMzMzJaTTI0LjE2NjQgMTQuOTk5OEMyMy45NDUzIDE0Ljk5OTggMjMuNzMzNCAxNS4wODc2IDIzLjU3NzEgMTUuMjQzOUMyMy40MjA4IDE1LjQwMDIgMjMuMzMzIDE1LjYxMjIgMjMuMzMzIDE1LjgzMzJDMjMuMzMzIDE2LjA1NDIgMjMuNDIwOCAxNi4yNjYxIDIzLjU3NzEgMTYuNDIyNEMyMy43MzM0IDE2LjU3ODcgMjMuOTQ1MyAxNi42NjY1IDI0LjE2NjQgMTYuNjY2NUMyNC4zODc0IDE2LjY2NjUgMjQuNTk5MyAxNi41Nzg3IDI0Ljc1NTYgMTYuNDIyNEMyNC45MTE5IDE2LjI2NjEgMjQuOTk5NyAxNi4wNTQyIDI0Ljk5OTcgMTUuODMzMkMyNC45OTk3IDE1LjYxMjIgMjQuOTExOSAxNS40MDAyIDI0Ljc1NTYgMTUuMjQzOUMyNC41OTkzIDE1LjA4NzYgMjQuMzg3NCAxNC45OTk4IDI0LjE2NjQgMTQuOTk5OFpcIlxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMDA5QkYzXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1iLTNcIj5SdW4gQWxsb2NhdGlvbiBMb2dpYzwvaDI+XHJcbiAgICAgICAgICAgIDxwPlRoaXMgd2lsbCBtYXAgYWxsIGZpeHR1cmVzIGFuZCBhcHBseSBhbGxvY2F0aW9ucyBiYXNlZCBvbiB0aGUgYnVzaW5lc3MtZGVmaW5lZCBsb2dpYywgdGhlbiBtb3ZlIHRoZW0gdG9cclxuICAgICAgICAgICAgICAgIHRoZSB2ZXJpZmljYXRpb24gc2VjdGlvbi4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlPzwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgZ2FwLTNcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwibW9kYWwuY2xvc2UoKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNCdXR0b25Mb2FkaW5nXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cInJ1bkFsbG9jYXRpb24oKVwiIFtkaXNhYmxlZF09XCJpc0J1dHRvbkxvYWRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQnV0dG9uTG9hZGluZ1wiPiBSdW4gYWxsb2NhdGlvbiBMb2dpYzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzdmcgc3R5bGU9XCJ3aWR0aDogMTQxcHg7XCIgKm5nSWY9XCJpc0J1dHRvbkxvYWRpbmdcIiBjbGFzcz1cInNwaW5uZXJcIiB2aWV3Qm94PVwiMCAwIDUwIDUwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cInBhdGhcIiBjeD1cIjI1XCIgY3k9XCIyNVwiIHI9XCIyMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiNFwiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2FwcHJvdmVMYXlvdXRNb2RhbCBsZXQtbW9kYWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1iLTNcIj5BcHByb3ZlICYgU3VibWl0PC9oMj5cclxuICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICBUaGlzIHdpbGwgY29tcGxldGUgdGhlIGxheW91dCBhbmQgbWFrZSBpdCByZWFkeSBmb3IgYWxsb2NhdGlvbi4gRW5zdXJlIHRoYXQgYWxsIGZpeHR1cmUgY291bnRzIGFuZFxyXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50cyBhcmUgYXMgcGVyIHRoZSBwbGFuLlxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgQGlmKGhhc0ludmFsaWRGaXh0dXJlcykge1xyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IGdhcC0yIHAtMyBtYi0zIHJvdW5kZWRcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGQUVCOyBib3JkZXI6IDFweCBzb2xpZCAjRkVDODRCO1wiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXgtc2hyaW5rOiAwOyBtYXJnaW4tdG9wOiAxcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05Ljk5OTY1IDYuNjY2NjdWMTBNOS45OTk2NSAxMy4zMzMzSDEwLjAwOE04LjU3NDY1IDIuMzgzMzRMMS41MTYzMiAxNC4xNjY3QzEuMzcwNzkgMTQuNDE4NyAxLjI5Mzc5IDE0LjcwNDQgMS4yOTI5OCAxNC45OTU0QzEuMjkyMTYgMTUuMjg2NSAxLjM2NzU2IDE1LjU3MjYgMS41MTE2NyAxNS44MjU0QzEuNjU1NzkgMTYuMDc4MyAxLjg2MzU5IDE2LjI4OSAyLjExNDQxIDE2LjQzNjZDMi4zNjUyMyAxNi41ODQxIDIuNjUwMzIgMTYuNjYzNSAyLjk0MTMyIDE2LjY2NjdIMTcuMDU4QzE3LjM0OSAxNi42NjM1IDE3LjYzNDEgMTYuNTg0MSAxNy44ODQ5IDE2LjQzNjZDMTguMTM1NyAxNi4yODkgMTguMzQzNSAxNi4wNzgzIDE4LjQ4NzYgMTUuODI1NEMxOC42MzE3IDE1LjU3MjYgMTguNzA3MSAxNS4yODY1IDE4LjcwNjMgMTQuOTk1NEMxOC43MDU1IDE0LjcwNDQgMTguNjI4NSAxNC40MTg3IDE4LjQ4MyAxNC4xNjY3TDExLjQyNDcgMi4zODMzNEMxMS4yNzYxIDIuMTM4NDMgMTEuMDY2OSAxLjkzNTk0IDEwLjgxNzMgMS43OTU0MUMxMC41Njc3IDEuNjU0ODggMTAuMjg2MSAxLjU4MTA1IDkuOTk5NjUgMS41ODEwNUM5LjcxMzIxIDEuNTgxMDUgOS40MzE1OSAxLjY1NDg4IDkuMTgxOTkgMS43OTU0MUM4LjkzMjM4IDEuOTM1OTQgOC43MjMyMSAyLjEzODQzIDguNTc0NjUgMi4zODMzNFpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRjU5RTBCXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMFwiIHN0eWxlPVwiZm9udC1zaXplOiAxM3B4OyBjb2xvcjogIzkyNDAwRTtcIj5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoaGFzSW52YWxpZEhlYWRlckZpeHR1cmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3tpbnZhbGlkSGVhZGVyRml4dHVyZUNvdW50fX0gZml4dHVyZXt7aW52YWxpZEhlYWRlckZpeHR1cmVDb3VudCA9PT0gMSA/ICcnIDogJ3MnfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aW52YWxpZEhlYWRlckZpeHR1cmVDb3VudCA9PT0gMSA/ICdoYXMnIDogJ2hhdmUnfX0gYW4gdW5yZWNvZ25pemVkIGhlYWRlci48L3N0cm9uZz48YnIvPlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBAaWYoaGFzSW52YWxpZExpYnJhcnlGaXh0dXJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7aW52YWxpZExpYnJhcnlGaXh0dXJlQ291bnR9fSBmaXh0dXJle3tpbnZhbGlkTGlicmFyeUZpeHR1cmVDb3VudCA9PT0gMSA/ICcnIDogJ3MnfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aW52YWxpZExpYnJhcnlGaXh0dXJlQ291bnQgPT09IDEgPyAnZG9lcycgOiAnZG8nfX0gbm90IG1hdGNoIGFueSBsaWJyYXJ5IGVudHJ5Ljwvc3Ryb25nPjxici8+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFRoZXNlIGFyZSBoaWdobGlnaHRlZCBpbiByZWQgb24gdGhlIGxheW91dCBhbmQgbXVzdCBiZSBjb3JyZWN0ZWQgYmVmb3JlIHRoZSBhbGxvY2F0aW9uIHJ1bGUgY2FuIHJ1bi5cclxuICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBnYXAtM1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJtb2RhbC5jbG9zZSgpXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0J1dHRvbkxvYWRpbmdcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiYXBwcm92ZUxheW91dCgpXCIgW2Rpc2FibGVkXT1cImlzQnV0dG9uTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNCdXR0b25Mb2FkaW5nXCI+U3VibWl0PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzQnV0dG9uTG9hZGluZ1wiIGNsYXNzPVwic3Bpbm5lclwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwicGF0aFwiIGN4PVwiMjVcIiBjeT1cIjI1XCIgcj1cIjIwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCI0XCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjcmV2ZXJ0QWxsb2NhdGlvbk1vZGFsIGxldC1tb2RhbD5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgbWItNFwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHZpZXdCb3g9XCIwIDAgNDAgNDBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiMjBcIiBmaWxsPVwiI0ZFRjNDN1wiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAgMTMuMzMzM1YyME0yMCAyNi42NjY3SDIwLjAxNjdNMjguMzMzMyAyMEMyOC4zMzMzIDI0LjYwMjQgMjQuNjAyNCAyOC4zMzMzIDIwIDI4LjMzMzNDMTUuMzk3NiAyOC4zMzMzIDExLjY2NjcgMjQuNjAyNCAxMS42NjY3IDIwQzExLjY2NjcgMTUuMzk3NiAxNS4zOTc2IDExLjY2NjcgMjAgMTEuNjY2N0MyNC42MDI0IDExLjY2NjcgMjguMzMzMyAxNS4zOTc2IDI4LjMzMzMgMjBaXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRjU5RTBCXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1iLTNcIj5SZXZlcnQgQWxsb2NhdGlvbjwvaDI+XHJcbiAgICAgICAgICAgIDxwPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZXZlcnQgdGhlIGFsbG9jYXRpb24/IFRoaXMgd2lsbCByZXN0b3JlIHRoZSBzdGF0ZSBiZWZvcmUgcnVubmluZyBhbGxvY2F0aW9uLlxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGdhcC0zXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cIm1vZGFsLmNsb3NlKClcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzQnV0dG9uTG9hZGluZ1wiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJyZXZlcnRBbGxvY2F0aW9uKCk7IG1vZGFsLmNsb3NlKClcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzQnV0dG9uTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNCdXR0b25Mb2FkaW5nXCI+UmV2ZXJ0PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyBzdHlsZT1cIndpZHRoOiAxNDFweDtcIiAqbmdJZj1cImlzQnV0dG9uTG9hZGluZ1wiIGNsYXNzPVwic3Bpbm5lclwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwicGF0aFwiIGN4PVwiMjVcIiBjeT1cIjI1XCIgcj1cIjIwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCI0XCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjY29tcGxldGVBbGxvY2F0aW9uTW9kYWwgbGV0LW1vZGFsPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBtYi00XCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgdmlld0JveD1cIjAgMCA0MCA0MFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgcng9XCIyMFwiIGZpbGw9XCIjREFGMUZGXCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC44MzMgMjEuNjY2NUMxOC4wMzMgMjEuNjY2NSAxNy4xMTY0IDIyLjc5MTUgMTYuODE2NCAyMy41MzMyQzE3LjcwOCAyMy45MTY1IDE4LjMzMyAyNC43OTk4IDE4LjMzMyAyNS44MzMyQzE4LjMzMyAyNi40OTYyIDE4LjA2OTYgMjcuMTMyMSAxNy42MDA4IDI3LjYwMDlDMTcuMTMxOSAyOC4wNjk4IDE2LjQ5NjEgMjguMzMzMiAxNS44MzMgMjguMzMzMkMxNS4xNyAyOC4zMzMyIDE0LjUzNDEgMjguMDY5OCAxNC4wNjUzIDI3LjYwMDlDMTMuNTk2NCAyNy4xMzIxIDEzLjMzMyAyNi40OTYyIDEzLjMzMyAyNS44MzMyQzEzLjMzMyAyNC43NDE1IDE0LjAyNDcgMjMuODE2NSAxNC45OTk3IDIzLjQ3NDhWMTYuNTI0OEMxNC41MTE0IDE2LjM1MzUgMTQuMDg4NSAxNi4wMzQ0IDEzLjc4OTkgMTUuNjExN0MxMy40OTEyIDE1LjE4OTEgMTMuMzMxNSAxNC42ODQgMTMuMzMzIDE0LjE2NjVDMTMuMzMzIDEzLjUwMzUgMTMuNTk2NCAxMi44Njc2IDE0LjA2NTMgMTIuMzk4N0MxNC41MzQxIDExLjkyOTkgMTUuMTcgMTEuNjY2NSAxNS44MzMgMTEuNjY2NUMxNi40OTYxIDExLjY2NjUgMTcuMTMxOSAxMS45Mjk5IDE3LjYwMDggMTIuMzk4N0MxOC4wNjk2IDEyLjg2NzYgMTguMzMzIDEzLjUwMzUgMTguMzMzIDE0LjE2NjVDMTguMzMzIDE1LjI1ODIgMTcuNjQxNCAxNi4xODMyIDE2LjY2NjQgMTYuNTI0OFYyMC45MzMyQzE3LjM5OTcgMjAuMzkxNSAxOC40NjY0IDE5Ljk5OTggMTkuOTk5NyAxOS45OTk4QzIyLjIyNDcgMTkuOTk5OCAyMi45NjY0IDE4Ljg4MzIgMjMuMjA4IDE4LjE0MTVDMjIuNzUyMSAxNy45NTE2IDIyLjM2MjUgMTcuNjMxMSAyMi4wODgyIDE3LjIyMDRDMjEuODEzOSAxNi44MDk3IDIxLjY2NzEgMTYuMzI3MSAyMS42NjY0IDE1LjgzMzJDMjEuNjY2NCAxNS4xNzAxIDIxLjkyOTcgMTQuNTM0MiAyMi4zOTg2IDE0LjA2NTRDMjIuODY3NCAxMy41OTY2IDIzLjUwMzMgMTMuMzMzMiAyNC4xNjY0IDEzLjMzMzJDMjQuODI5NCAxMy4zMzMyIDI1LjQ2NTMgMTMuNTk2NiAyNS45MzQxIDE0LjA2NTRDMjYuNDAzIDE0LjUzNDIgMjYuNjY2NCAxNS4xNzAxIDI2LjY2NjQgMTUuODMzMkMyNi42NjY0IDE2Ljk0OTggMjUuOTMzIDE3LjkxNjUgMjQuOTI0NyAxOC4yMTY1QzI0LjcwOCAxOS40MDgyIDIzLjg5OTcgMjEuNjY2NSAyMC44MzMgMjEuNjY2NVpNMTUuODMzIDI0Ljk5OThDMTUuNjEyIDI0Ljk5OTggMTUuNCAyNS4wODc2IDE1LjI0MzggMjUuMjQzOUMxNS4wODc1IDI1LjQwMDIgMTQuOTk5NyAyNS42MTIyIDE0Ljk5OTcgMjUuODMzMkMxNC45OTk3IDI2LjA1NDIgMTUuMDg3NSAyNi4yNjYxIDE1LjI0MzggMjYuNDIyNEMxNS40IDI2LjU3ODcgMTUuNjEyIDI2LjY2NjUgMTUuODMzIDI2LjY2NjVDMTYuMDU0IDI2LjY2NjUgMTYuMjY2IDI2LjU3ODcgMTYuNDIyMyAyNi40MjI0QzE2LjU3ODYgMjYuMjY2MSAxNi42NjY0IDI2LjA1NDIgMTYuNjY2NCAyNS44MzMyQzE2LjY2NjQgMjUuNjEyMiAxNi41Nzg2IDI1LjQwMDIgMTYuNDIyMyAyNS4yNDM5QzE2LjI2NiAyNS4wODc2IDE2LjA1NCAyNC45OTk4IDE1LjgzMyAyNC45OTk4Wk0xNS44MzMgMTMuMzMzMkMxNS42MTIgMTMuMzMzMiAxNS40IDEzLjQyMSAxNS4yNDM4IDEzLjU3NzJDMTUuMDg3NSAxMy43MzM1IDE0Ljk5OTcgMTMuOTQ1NSAxNC45OTk3IDE0LjE2NjVDMTQuOTk5NyAxNC4zODc1IDE1LjA4NzUgMTQuNTk5NSAxNS4yNDM4IDE0Ljc1NThDMTUuNCAxNC45MTIgMTUuNjEyIDE0Ljk5OTggMTUuODMzIDE0Ljk5OThDMTYuMDU0IDE0Ljk5OTggMTYuMjY2IDE0LjkxMiAxNi40MjIzIDE0Ljc1NThDMTYuNTc4NiAxNC41OTk1IDE2LjY2NjQgMTQuMzg3NSAxNi42NjY0IDE0LjE2NjVDMTYuNjY2NCAxMy45NDU1IDE2LjU3ODYgMTMuNzMzNSAxNi40MjIzIDEzLjU3NzJDMTYuMjY2IDEzLjQyMSAxNi4wNTQgMTMuMzMzMiAxNS44MzMgMTMuMzMzMlpNMjQuMTY2NCAxNC45OTk4QzIzLjk0NTMgMTQuOTk5OCAyMy43MzM0IDE1LjA4NzYgMjMuNTc3MSAxNS4yNDM5QzIzLjQyMDggMTUuNDAwMiAyMy4zMzMgMTUuNjEyMiAyMy4zMzMgMTUuODMzMkMyMy4zMzMgMTYuMDU0MiAyMy40MjA4IDE2LjI2NjEgMjMuNTc3MSAxNi40MjI0QzIzLjczMzQgMTYuNTc4NyAyMy45NDUzIDE2LjY2NjUgMjQuMTY2NCAxNi42NjY1QzI0LjM4NzQgMTYuNjY2NSAyNC41OTkzIDE2LjU3ODcgMjQuNzU1NiAxNi40MjI0QzI0LjkxMTkgMTYuMjY2MSAyNC45OTk3IDE2LjA1NDIgMjQuOTk5NyAxNS44MzMyQzI0Ljk5OTcgMTUuNjEyMiAyNC45MTE5IDE1LjQwMDIgMjQuNzU1NiAxNS4yNDM5QzI0LjU5OTMgMTUuMDg3NiAyNC4zODc0IDE0Ljk5OTggMjQuMTY2NCAxNC45OTk4WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMwMDlCRjNcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8aDIgY2xhc3M9XCJtYi0zXCI+U2F2ZSBhbmQgY29tcGxldGUgYWxsb2NhdGlvbjwvaDI+XHJcbiAgICAgICAgICAgIDxwPllvdSBhcmUgYWJvdXQgdG8gY29tcGxldGUgdGhlIG1lcmNoIGFsbG9jYXRpb24gcHJvY2Vzcy4gVGhpcyB3aWxsIG1ha2UgdGhlIHN0b3JlIHJlYWR5IGZvciBmaXh0dXJlXHJcbiAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb24gYW5kIG1vdmUgaXQgdG8gdGhlIHZlcmlmaWNhdGlvbiBzdGFnZS4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHByb2NlZWQ/PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBnYXAtM1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJtb2RhbC5jbG9zZSgpXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0J1dHRvbkxvYWRpbmdcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiY29tcGxldGVBbGxvY2F0aW9uKCk7XCIgW2Rpc2FibGVkXT1cImlzQnV0dG9uTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNCdXR0b25Mb2FkaW5nXCI+Q29tcGxldGUgYWxsb2NhdGlvbjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzdmcgc3R5bGU9XCJ3aWR0aDogMTA3cHg7XCIgKm5nSWY9XCJpc0J1dHRvbkxvYWRpbmdcIiBjbGFzcz1cInNwaW5uZXJcIiB2aWV3Qm94PVwiMCAwIDUwIDUwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cInBhdGhcIiBjeD1cIjI1XCIgY3k9XCIyNVwiIHI9XCIyMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiNFwiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19
|
|
4264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25ib2FyZC1zdG9yZS1wbGFuby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9vbmJvYXJkLXN0b3JlLXBsYW5vL29uYm9hcmQtc3RvcmUtcGxhbm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvb25ib2FyZC1zdG9yZS1wbGFuby9vbmJvYXJkLXN0b3JlLXBsYW5vLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBRVQsWUFBWSxFQUlaLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQVksYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFMUQsT0FBTyxFQUdMLFdBQVcsRUFFWCxVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUl4QixPQUFPLEVBQ0wsT0FBTyxFQUVQLFlBQVksRUFDWixjQUFjLEVBQ2QsU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLE1BQU0sQ0FBQztBQUdkLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBTWpDLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVFQUF1RSxDQUFDO0FBQ3hILE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBRTFHLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixHQUNqQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFRdkUsTUFBTSxPQUFPLDBCQUEwQjtJQXdKM0I7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lB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QUd4QixDQUFDLGFBQWEsQ0FBQzt3V0FNMUIsU0FBUztzQkFEUixTQUFTO3VCQUFDLFlBQVk7Z0JBRU8sWUFBWTtzQkFBekMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBQ0YsbUJBQW1CO3NCQUE1QyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ1MscUJBQXFCO3NCQUFyRCxTQUFTO3VCQUFDLG9CQUFvQjtnQkFFL0Isd0JBQXdCO3NCQUR2QixTQUFTO3VCQUFDLHVCQUF1QjtnQkFHbEMsMEJBQTBCO3NCQUR6QixTQUFTO3VCQUFDLHlCQUF5QjtnQkFFUixhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBRzFCLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuaW1wb3J0IHsgTG9jYXRpb24sIFRpdGxlQ2FzZVBpcGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gIEZvcm1BcnJheSxcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtR3JvdXAsXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuXHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gIFN1YmplY3QsXHJcbiAgU3Vic2NyaXB0aW9uLFxyXG4gIGRlYm91bmNlVGltZSxcclxuICBmaXJzdFZhbHVlRnJvbSxcclxuICBmcm9tRXZlbnQsXHJcbiAgdGFrZVVudGlsLFxyXG59IGZyb20gXCJyeGpzXCI7XHJcblxyXG5pbXBvcnQgeyBOZ2JBY2NvcmRpb25EaXJlY3RpdmUsIE5nYk1vZGFsIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCAqIGFzIGZhYnJpYyBmcm9tIFwiZmFicmljXCI7XHJcblxyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UsIFBhZ2VJbmZvU2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktZ2xvYmFsXCI7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktc2hhcmVkXCI7XHJcblxyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBMYXlvdXRFZGl0Q29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4uL3BvcHVwcy9sYXlvdXQtZWRpdC1jb25maXJtYXRpb24vbGF5b3V0LWVkaXQtY29uZmlybWF0aW9uLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQgfSBmcm9tIFwiLi4vcG9wdXBzL2RlbGV0ZS1jb25maXJtYXRpb24vZGVsZXRlLWNvbmZpcm1hdGlvbi5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25JRiB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL3BsYW5vLWdlbmVyYWwuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7XHJcbiAgREVGQVVMVF9DT01QQUNUSU9OX0NPTkZJRyxcclxuICBjb21wYWN0Rmxvb3JEZXN0cnVjdGl2ZSxcclxuICBnZXRGbG9vckJvdW5kc0Z0LFxyXG59IGZyb20gXCIuL3V0aWxzL2F4aXMtY29tcGFjdGlvblwiO1xyXG5pbXBvcnQgeyBnZXRGaXh0dXJlQ2FudmFzTGFiZWwgfSBmcm9tIFwiLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJsaWItb25ib2FyZC1zdG9yZS1wbGFub1wiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vb25ib2FyZC1zdG9yZS1wbGFuby5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vb25ib2FyZC1zdG9yZS1wbGFuby5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIHByb3ZpZGVyczogW1RpdGxlQ2FzZVBpcGVdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgT25ib2FyZFN0b3JlUGxhbm9Db21wb25lbnRcclxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25Jbml0XHJcbntcclxuICBAVmlld0NoaWxkKFwiYmFzZUNhbnZhc1wiKVxyXG4gIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoXCJjYW52YXNDb250YWluZXJcIikgY29udGFpbmVyUmVmITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZChcImFwcGx5TG9naWNzXCIpIGFwcGx5TG9naWNzTW9kYWxSZWYhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoXCJhcHByb3ZlTGF5b3V0TW9kYWxcIikgYXBwcm92ZUxheW91dE1vZGFsUmVmITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKFwicmV2ZXJ0QWxsb2NhdGlvbk1vZGFsXCIpXHJcbiAgcmV2ZXJ0QWxsb2NhdGlvbk1vZGFsUmVmITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKFwiY29tcGxldGVBbGxvY2F0aW9uTW9kYWxcIilcclxuICBjb21wbGV0ZUFsbG9jYXRpb25Nb2RhbFJlZiE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZChcImJvZHlBY2NvcmRpb25cIikgYm9keUFjY29yZGlvbj86IE5nYkFjY29yZGlvbkRpcmVjdGl2ZTtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpyZXNpemVcIilcclxuICBvblJlc2l6ZSgpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlc2l6ZUNhbnZhcygpO1xyXG4gICAgfSwgMzAwKTtcclxuICB9XHJcblxyXG4gIGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuXHJcbiAgY2FudmFzITogZmFicmljLkNhbnZhcztcclxuICB6b29tTGV2ZWw6IG51bWJlciA9IDE7XHJcbiAgd2FsbFRoaWNrbmVzcyA9IDMwO1xyXG4gIHZlcnRpY2FsTWFyZ2luID0gKDEuMjUgLyAxMDApICogdGhpcy50b1BpeGVscygxNTI0LCBcIm1tXCIpO1xyXG5cclxuICBsYXlvdXRGb3JtOiBGb3JtR3JvdXA7XHJcbiAgc2VsZWN0ZWRGbG9vcklkID0gbmV3IEZvcm1Db250cm9sKFwiXCIpO1xyXG4gIGZsb29yc0xpc3Q6IERyb3Bkb3duSUZbXVtdID0gW107XHJcbiAgZml4dHVyZUNvbmZpZ1N1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcbiAgZml4dHVyZVRlbXBsYXRlSWRTdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG4gIG90aGVyRWxlbWVudHNTdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG5cclxuICBwbGFub0RhdGE6IGFueTtcclxuXHJcbiAgZmxvb3JEYXRhOiBhbnk7XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxGbG9vckRhdGE6IGFueTsgLy8gdXNlZCB0byByb2xsYmFjayB0byBvcmlnaW5hbCBsYXlvdXQgc3RhdGUgb24gY2xpY2sgY2FuY2VsIHdoaWxlIGVkaXRpbmcuXHJcblxyXG4gIC8qKlxyXG4gICAqIENvbXBhY3QgaXMgYSBvbmUtc2hvdCBhY3Rpb24sIG5vdCBhIHRvZ2dsZS4gQ2xpY2tpbmcgaXQgY29tcGFjdHMgdGhlXHJcbiAgICogbGF5b3V0IGRlc3RydWN0aXZlbHkgYW5kIGRyb3BzIHRoZSB1c2VyIGludG8gZWRpdCBtb2RlIHNvIHRoZSBjaGFuZ2VcclxuICAgKiBzaG93cyB1cCBhcyBhbiB1bnNhdmVkIGVkaXQgKHJldmVydGFibGUgdmlhIENhbmNlbCwgcGVyc2lzdGFibGUgdmlhXHJcbiAgICogU2F2ZSAvIFN1Ym1pdCkuIElmIG5vIGNvbXBhY3Rpb24gaXMgcG9zc2libGUgd2Uga2VlcCB0aGUgdXNlciBpbiB2aWV3XHJcbiAgICogbW9kZSBhbmQgc3VyZmFjZSB0aGUgcmVhc29uIHZpYSB0b2FzdCDigJQgbm8gc2lsZW50IG5vLW9wcy5cclxuICAgKi9cclxuICBjb21wYWN0TGF5b3V0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmZsb29yRGF0YSkgcmV0dXJuO1xyXG4gICAgY29uc3QgYmVmb3JlID0gZ2V0Rmxvb3JCb3VuZHNGdCh0aGlzLmZsb29yRGF0YSk7XHJcbiAgICBjb25zdCBjb21wYWN0ZWQgPSBjb21wYWN0Rmxvb3JEZXN0cnVjdGl2ZShcclxuICAgICAgdGhpcy5mbG9vckRhdGEsXHJcbiAgICAgIERFRkFVTFRfQ09NUEFDVElPTl9DT05GSUcsXHJcbiAgICApO1xyXG4gICAgY29uc3QgYWZ0ZXIgPSBnZXRGbG9vckJvdW5kc0Z0KGNvbXBhY3RlZCk7XHJcbiAgICBjb25zdCB3aWR0aFNocmluayA9IChiZWZvcmUubWF4WCAtIGJlZm9yZS5taW5YKSAtIChhZnRlci5tYXhYIC0gYWZ0ZXIubWluWCk7XHJcbiAgICBjb25zdCBoZWlnaHRTaHJpbmsgPSAoYmVmb3JlLm1heFkgLSBiZWZvcmUubWluWSkgLSAoYWZ0ZXIubWF4WSAtIGFmdGVyLm1pblkpO1xyXG4gICAgaWYgKHdpZHRoU2hyaW5rIDwgMC41ICYmIGhlaWdodFNocmluayA8IDAuNSkge1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRXYXJuaW5nVG9hc3QoXHJcbiAgICAgICAgXCJMYXlvdXQgaXMgYWxyZWFkeSBjb21wYWN0IOKAlCBubyBmdXJ0aGVyIGNvbXBhY3Rpb24gcG9zc2libGVcIixcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbiA9IGNvbXBhY3RlZC5sYXlvdXRQb2x5Z29uO1xyXG4gICAgdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZSA9IGNvbXBhY3RlZC5jZW50ZXJGaXh0dXJlO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29tcGFjdGVkLm90aGVyRWxlbWVudHMpKSB7XHJcbiAgICAgIHRoaXMuZmxvb3JEYXRhLm90aGVyRWxlbWVudHMgPSBjb21wYWN0ZWQub3RoZXJFbGVtZW50cztcclxuICAgIH1cclxuICAgIHRoaXMucmVvcmRlckZpeHR1cmUodGhpcy5mbG9vckRhdGEpO1xyXG4gICAgLy8gRHJvcCBpbnRvIGVkaXQgbW9kZSBzbyB0aGUgY29tcGFjdGlvbiBsaXZlcyBhcyBhbiB1bnNhdmVkIGVkaXQg4oCUXHJcbiAgICAvLyBDYW5jZWwgd2lsbCByZWZldGNoIGFuZCByZXZlcnQgaXQsIFNhdmUgLyBTdWJtaXQgd2lsbCBwZXJzaXN0IGl0LlxyXG4gICAgdGhpcy50b2dnbGVQYW5lbChcInJpZ2h0XCIsIHRydWUpO1xyXG4gICAgdGhpcy50b2dnbGVQYW5lbChcImxlZnRcIiwgZmFsc2UpO1xyXG4gICAgdGhpcy5jcmVhdGVGb3JtKCk7XHJcbiAgICB0aGlzLmxheW91dEZvcm0uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIHRoaXMucmVuZGVyRmxvb3IodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgY2FuU2hvd0NvbXBhY3RUb2dnbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLmZsb29yRGF0YT8uX2lkICYmIHRoaXMuZ2V0U3RhdHVzID09PSBcImRyYWZ0XCI7XHJcbiAgfVxyXG5cclxuICBjZG5Vcmw6IHN0cmluZztcclxuICBmaXh0dXJlVGVtcGxhdGVzOiBhbnlbXSA9IFtdO1xyXG4gIGFsbEZpeHR1cmVzOiBhbnlbXSA9IFtdOyAvLyBhbGwgZml4dHVyZXMgaW5jbHVkaW5nIHRoZSBtYXN0ZXIgdGVtcGxhdGVzIGZvciB0cmVlIHZpZXdcclxuICAvLyBhbGxGaXh0dXJlSW5zdGFuY2VzOiBhbnlbXSA9IFtdOyAvLyBvbmx5IHRoZSBsYXlvdXQgZml4dHVyZXMgaW5zdGFuY2VzLlxyXG4gIHN0b3JlRmVlZGJhY2s6IGFueTtcclxuXHJcbiAgc2VsZWN0ZWRGaXh0dXJlOiBhbnk7XHJcbiAgc2VsZWN0ZWRGaXh0dXJlRGF0YTogYW55O1xyXG4gIGVkaXRGaXh0dXJlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZWRpdEZpeHR1cmVTZWN0aW9uOiBcImJhc2ljLWRldGFpbHNcIiB8IFwicHJvZHVjdHNcIiB8IFwidm1zXCIgPSBcImJhc2ljLWRldGFpbHNcIjtcclxuICBzdWJtaXRGaXh0dXJlID0gZmFsc2U7XHJcblxyXG4gIGhpZ2hsaWdodGVkRml4dHVyZUZvcm1JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGxheW91dE1ldHJpY3MgPSB7XHJcbiAgICBhbGxTdG9yZTogMCxcclxuICAgIGFsbG9jYXRpb25QZW5kaW5nOiAwLFxyXG4gICAgZHJhZnQ6IDAsXHJcbiAgfTtcclxuXHJcbiAgaXNQYWdlTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNSaWdodFBhbmVsQ29sbGFwc2VkOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0xlZnRQYW5lbENvbGxhcHNlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGRpc2FibGVFZGl0OiBib29sZWFuID0gdHJ1ZTtcclxuICBpc1NhdmluZ0xheW91dDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpc0FsbG9jYXRpb25SdW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBmbG9vckRhdGFCZWZvcmVBbGxvY2F0aW9uOiBhbnkgPSBudWxsO1xyXG5cclxuICBvdGhlckVsZW1lbnRMaXN0OiBEcm9wZG93bklGW10gPSBbXHJcbiAgICB7IGxhYmVsOiBcIlBPUyBDb3VudGVyXCIsIHZhbHVlOiBcIlBPUyBDb3VudGVyXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiRGlzY3Vzc2lvbiBUYWJsZVwiLCB2YWx1ZTogXCJEaXNjdXNzaW9uIFRhYmxlXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiTWlycm9yXCIsIHZhbHVlOiBcIk1pcnJvclwiIH0sXHJcbiAgICB7IGxhYmVsOiBcIk90aGVyc1wiLCB2YWx1ZTogXCJPdGhlcnNcIiB9LFxyXG4gIF07XHJcbiAgc3RvcmVMaXN0OiBhbnkgPSBbXTtcclxuICBzZWxlY3RlZFN0b3JlTmFtZTogYW55O1xyXG5cclxuICBwcml2YXRlIGFjdGl2ZUhpZ2hsaWdodDogZmFicmljLlJlY3QgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGNhbmNlbEhpZ2hsaWdodEJsaW5rID0gZmFsc2U7XHJcblxyXG4gIGlzQnV0dG9uTG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICBsYXlvdXRCb3VuZHM6IGFueTtcclxuXHJcbiAgaXNSdW5BbGxvY2F0aW9uQWxsb3dlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpdm1BbGlhc0tleXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xyXG4gIGZpeHR1cmVMaWJyYXJ5QnlXaWR0aDogTWFwPG51bWJlciwgU2V0PHN0cmluZz4+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBsaWJyYXJ5Q2F0ZWdvcmllczogc3RyaW5nW10gPSBbXTtcclxuICBsaWJyYXJ5QnlDYXRlZ29yeTogTWFwPHN0cmluZywgU2V0PG51bWJlcj4+ID0gbmV3IE1hcCgpO1xyXG5cclxuICAvLyBGbGlwcGVkIHRvIHRydWUgYnkgYW55IGxheW91dC1sZXZlbCBtdXRhdGlvbiAoYWRkIC8gZGVsZXRlIC8gbW92ZSAvIHRlbXBsYXRlXHJcbiAgLy8gY2hhbmdlKS4gUmVzZXQgdG8gZmFsc2Ugb24gc3VjY2Vzc2Z1bCBzYXZlLiBHYXRlcyB0aGUgcGVyLWZpeHR1cmUgZWRpdCBpY29uXHJcbiAgLy8gc28gdGhlIHVzZXIgbXVzdCBzYXZlIGxheW91dCBjaGFuZ2VzIGZpcnN0LlxyXG4gIGxheW91dEhhc1Vuc2F2ZWRDaGFuZ2VzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHJlc3RyaWN0ZWRVc2Vyczogc3RyaW5nW10gPSBbXHJcbiAgICBcIm1hdGhldy5yaGVhQGxlbnNrYXJ0LmNvbVwiLFxyXG4gICAgXCJzYXdyYW4uc2luZ2hAZGVhbHNrYXJ0LmluXCIsXHJcbiAgICBcImFiaGluYXYua3Jpc2huYUBsZW5za2FydC5pblwiLFxyXG4gICAgXCJzdWRoYUB0YW5nb3RlY2guY28uaW5cIixcclxuICAgIC8vIFwiZ29waW5hdGhAdGFuZ290ZWNoLmNvLmluXCJcclxuICBdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRpdGxlQ2FzZTogVGl0bGVDYXNlUGlwZSxcclxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXHJcbiAgICBwcml2YXRlIHBhZ2VJbmZvOiBQYWdlSW5mb1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICApIHtcclxuICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG5cclxuICAgIHRoaXMuZ3MuZW52aXJvbm1lbnQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICBpZiAoZSkgdGhpcy5jZG5VcmwgPSBlLnBsYW5vZ3JhbUNETjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNldFBhZ2VEYXRhKCk7XHJcblxyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKGRhdGEpID0+IHtcclxuICAgICAgICBpZiAoZGF0YT8uY2xpZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaGVhZGVyRGF0YSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhd2FpdCB0aGlzLmdldFZtc0xpc3QoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XHJcbiAgICAgICAgaWYgKHBhcmFtcz8ucGxhbm9JZCkge1xyXG4gICAgICAgICAgdGhpcy5nZXRTdG9yZUZpeHR1cmVzKHBhcmFtcz8ucGxhbm9JZCk7XHJcbiAgICAgICAgICBpZiAocGFyYW1zPy5mbG9vcklkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhID0geyBfaWQ6IHBhcmFtcz8uZmxvb3JJZCB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3RvcmVkVXNlckluZm8gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInVzZXItaW5mb1wiKTtcclxuICAgICAgICBjb25zdCB1c2VyRGF0YSA9IHN0b3JlZFVzZXJJbmZvID8gSlNPTi5wYXJzZShzdG9yZWRVc2VySW5mbykgOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IGlzTm9uUmVzdHJpY3RlZFVzZXIgPVxyXG4gICAgICAgICAgISF1c2VyRGF0YSAmJiAhdGhpcy5yZXN0cmljdGVkVXNlcnMuaW5jbHVkZXModXNlckRhdGE/LmVtYWlsKTtcclxuICAgICAgICBjb25zdCBpc0FsbG9jYXRpb25PdmVycmlkZUVuYWJsZWQgPSBwYXJhbXM/LmFsbG9jYXRpb24gPT09IFwidHJ1ZVwiO1xyXG5cclxuICAgICAgICBpZiAoaXNOb25SZXN0cmljdGVkVXNlciB8fCBpc0FsbG9jYXRpb25PdmVycmlkZUVuYWJsZWQpIHtcclxuICAgICAgICAgIHRoaXMuaXNSdW5BbGxvY2F0aW9uQWxsb3dlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkRmxvb3JJZC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGFzeW5jIChpZCkgPT4ge1xyXG4gICAgICBjb25zdCBjbGlja2VkRmxvb3IgPSB0aGlzLnBsYW5vRGF0YT8uZmxvb3JzPy5maW5kKFxyXG4gICAgICAgIChmOiBhbnkpID0+IGYuX2lkID09PSBpZCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChjbGlja2VkRmxvb3Iuc3RhdHVzID09PSBcImNvbXBsZXRlZFwiKSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChcclxuICAgICAgICAgIGBtYW5hZ2UvcGxhbm9ncmFtL21hbmFnZS1wbGFub2dyYW0/cGxhbm9JZD0ke2NsaWNrZWRGbG9vci5wbGFub0lkfSZmbG9vcklkPSR7Y2xpY2tlZEZsb29yLl9pZH1gLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mbG9vckRhdGEgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5pc0xlZnRQYW5lbENvbGxhcHNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc1JpZ2h0UGFuZWxDb2xsYXBzZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLmZsb29yRGF0YSA9IGNsaWNrZWRGbG9vcjtcclxuICAgICAgICB0aGlzLnJlbmRlckZsb29yKCk7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRGb3JtLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIGNvbnN0IG5ld1BhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XHJcbiAgICAgICAgbmV3UGFyYW1zLnNldChcInBsYW5vSWRcIiwgdGhpcy5mbG9vckRhdGEucGxhbm9JZCk7XHJcbiAgICAgICAgbmV3UGFyYW1zLnNldChcImZsb29ySWRcIiwgdGhpcy5mbG9vckRhdGEuX2lkKTtcclxuXHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbi5yZXBsYWNlU3RhdGUoXHJcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsXHJcbiAgICAgICAgICBuZXdQYXJhbXMudG9TdHJpbmcoKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vcklkLnNldFZhbHVlKHRoaXMuZmxvb3JEYXRhLl9pZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbnZhcyA9IG5ldyBmYWJyaWMuQ2FudmFzKHRoaXMuY2FudmFzUmVmPy5uYXRpdmVFbGVtZW50LCB7XHJcbiAgICAgIHNlbGVjdGlvbkZ1bGx5Q29udGFpbmVkOiB0cnVlLFxyXG4gICAgICBwZXJQaXhlbFRhcmdldEZpbmQ6IHRydWUsXHJcbiAgICAgIHRhcmdldEZpbmRUb2xlcmFuY2U6IDUsXHJcbiAgICB9KTtcclxuXHJcbiAgICBmcm9tRXZlbnQodGhpcy5jYW52YXMgYXMgYW55LCBcIm9iamVjdDptb2RpZmllZFwiKVxyXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTAwKSlcclxuICAgICAgLnN1YnNjcmliZShhc3luYyAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbW92ZWRPYmo6IGFueSA9IGUudGFyZ2V0O1xyXG5cclxuICAgICAgICBpZiAoIW1vdmVkT2JqKSByZXR1cm47XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmxheW91dEZvcm0/LmVuYWJsZWQpIHtcclxuICAgICAgICAgIHRoaXMubGF5b3V0SGFzVW5zYXZlZENoYW5nZXMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1vdmVkT2JqPy50eXBlID09PSBcImFjdGl2ZVNlbGVjdGlvblwiKSB7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5R3JvdXBUcmFuc2Zvcm0obW92ZWRPYmopO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYWN0aW9uID0gZS50cmFuc2Zvcm0/LmFjdGlvbjtcclxuXHJcbiAgICAgICAgY29uc3QgaXNSZXNpemUgPVxyXG4gICAgICAgICAgYWN0aW9uID09PSBcInNjYWxlXCIgfHwgYWN0aW9uID09PSBcInNjYWxlWFwiIHx8IGFjdGlvbiA9PT0gXCJzY2FsZVlcIjtcclxuXHJcbiAgICAgICAgaWYgKGlzUmVzaXplKSB7XHJcbiAgICAgICAgICBjb25zdCB0eXBlID0gbW92ZWRPYmo/Lm9ialR5cGUgPz8gXCJncm91cFwiO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHg6IG1vdmVkT2JqLmxlZnQsXHJcbiAgICAgICAgICAgIHk6IG1vdmVkT2JqLnRvcCxcclxuICAgICAgICAgICAgd2lkdGg6IG1vdmVkT2JqLmdldFNjYWxlZFdpZHRoKCksXHJcbiAgICAgICAgICAgIGhlaWdodDogbW92ZWRPYmouZ2V0U2NhbGVkSGVpZ2h0KCksXHJcbiAgICAgICAgICAgIGFuZ2xlOiBtb3ZlZE9iai5hbmdsZSxcclxuICAgICAgICAgICAgZWxlbWVudERhdGE6IG1vdmVkT2JqLmRhdGEsXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwid2FsbFwiOiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXMucmVtb3ZlKG1vdmVkT2JqKTtcclxuICAgICAgICAgICAgICB1cGRhdGVkQ29uZmlnLmVsZW1lbnREYXRhLmFuZ2xlID0gdXBkYXRlZENvbmZpZy5hbmdsZTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgbmV3V2FsbCA9IGF3YWl0IHRoaXMuZHJhd1dhbGwoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhcyxcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWRDb25maWcueCxcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWRDb25maWcueSxcclxuICAgICAgICAgICAgICAgIHRoaXMud2FsbFRoaWNrbmVzcyxcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWRDb25maWcud2lkdGggLSAwLjI3LFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy5lbGVtZW50RGF0YSxcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAobmV3V2FsbCBhcyBhbnkpLm9ialR5cGUgPSBcIndhbGxcIjtcclxuICAgICAgICAgICAgICAobmV3V2FsbCBhcyBhbnkpLmRhdGEgPSB1cGRhdGVkQ29uZmlnLmVsZW1lbnREYXRhO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmNhbnZhcy5zZXRBY3RpdmVPYmplY3QobmV3V2FsbCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNhc2UgXCJvdGhlcnNcIjoge1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FudmFzLnJlbW92ZShtb3ZlZE9iaik7XHJcbiAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy5lbGVtZW50RGF0YS5yZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlID1cclxuICAgICAgICAgICAgICAgIHVwZGF0ZWRDb25maWcuYW5nbGU7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IG5ld090aGVyID0gdGhpcy5kcmF3T3RoZXJFbGVtZW50c1dpdGhMYWJlbChcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy54LFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy55LFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy5hbmdsZSxcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWRDb25maWcud2lkdGggLSAyLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy5oZWlnaHQgLSAyLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy5lbGVtZW50RGF0YSxcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAobmV3T3RoZXIgYXMgYW55KS5vYmpUeXBlID0gXCJvdGhlcnNcIjtcclxuICAgICAgICAgICAgICAobmV3T3RoZXIgYXMgYW55KS5kYXRhID0gdXBkYXRlZENvbmZpZy5lbGVtZW50RGF0YTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXMuc2V0QWN0aXZlT2JqZWN0KG5ld090aGVyKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2FzZSBcImVudHJhbmNlXCI6IHtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2FzZSBcImZpeHR1cmVcIjoge1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlV2FsbENvb3JkaW5hdGVzKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVGaXh0dXJlQ29vcmRpbmF0ZXMoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZU90aGVyRWxlbWVudHNDb29yZGluYXRlcygpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRW50cmFuY2VDb29yZGluYXRlcygpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldHVwWm9vbUhhbmRsZXJzKCk7XHJcblxyXG4gICAgdGhpcy5saXN0ZW5Ub0RlbGV0ZUtleSgpO1xyXG4gICAgdGhpcy50b2dnbGVQYW5lbChcImxlZnRcIiwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGVBbGxQb3NpdGlvbnMoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZVdhbGxDb29yZGluYXRlcygpO1xyXG4gICAgdGhpcy51cGRhdGVGaXh0dXJlQ29vcmRpbmF0ZXMoKTtcclxuICAgIHRoaXMudXBkYXRlT3RoZXJFbGVtZW50c0Nvb3JkaW5hdGVzKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUVudHJhbmNlQ29vcmRpbmF0ZXMoKTtcclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5jYWRMYXlvdXQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGFwcGx5R3JvdXBUcmFuc2Zvcm0oc2VsZWN0aW9uOiBmYWJyaWMuQWN0aXZlU2VsZWN0aW9uKSB7XHJcbiAgICBjb25zdCBtYXRyaXggPSBzZWxlY3Rpb24uY2FsY1RyYW5zZm9ybU1hdHJpeCgpO1xyXG5cclxuICAgIHNlbGVjdGlvbi5nZXRPYmplY3RzKCkuZm9yRWFjaCgob2JqOiBhbnkpID0+IHtcclxuICAgICAgY29uc3Qgb2JqTWF0cml4ID0gb2JqLmNhbGNUcmFuc2Zvcm1NYXRyaXgoKTtcclxuICAgICAgY29uc3QgZmluYWxNYXRyaXggPSBmYWJyaWMudXRpbC5tdWx0aXBseVRyYW5zZm9ybU1hdHJpY2VzKFxyXG4gICAgICAgIG1hdHJpeCxcclxuICAgICAgICBvYmpNYXRyaXgsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBjb25zdCBwb2ludCA9IG5ldyBmYWJyaWMuUG9pbnQoMCwgMCkudHJhbnNmb3JtKGZpbmFsTWF0cml4KTtcclxuXHJcbiAgICAgIG9iai5zZXQoe1xyXG4gICAgICAgIGxlZnQ6IHBvaW50LngsXHJcbiAgICAgICAgdG9wOiBwb2ludC55LFxyXG4gICAgICAgIGFuZ2xlOiBzZWxlY3Rpb24uYW5nbGUgKyAob2JqLmFuZ2xlID8/IDApLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIG9iai5zZXRDb29yZHMoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFVuZ3JvdXAgYWZ0ZXIgYXBwbHlpbmcgdHJhbnNmb3JtXHJcbiAgICB0aGlzLmNhbnZhcy5kaXNjYXJkQWN0aXZlT2JqZWN0KCk7XHJcbiAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgfVxyXG5cclxuICByZXNpemVDYW52YXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5jYW52YXMuc2V0RGltZW5zaW9ucyh7XHJcbiAgICAgIHdpZHRoOiBjb250YWluZXIuY2xpZW50V2lkdGggLSA1MCxcclxuXHJcbiAgICAgIGhlaWdodDogY29udGFpbmVyLmNsaWVudEhlaWdodCAtIDQwLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgfVxyXG5cclxuICBzZXR1cFpvb21IYW5kbGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMuY2FudmFzLm9uKFwibW91c2U6d2hlZWxcIiwgKG9wdDogZmFicmljLlRFdmVudDxXaGVlbEV2ZW50PikgPT4ge1xyXG4gICAgICBjb25zdCBlID0gb3B0LmU7XHJcblxyXG4gICAgICBpZiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkge1xyXG4gICAgICAgIC8vIHRoaXMuaXNVc2VySW50ZXJhY3RlZFdpdGhDYW52YXMgPSB0cnVlO1xyXG4gICAgICAgIGNvbnN0IGRlbHRhID0gZS5kZWx0YVk7XHJcbiAgICAgICAgbGV0IHpvb20gPSB0aGlzLmNhbnZhcy5nZXRab29tKCk7XHJcbiAgICAgICAgem9vbSAqPSAwLjk5NSAqKiBkZWx0YTtcclxuXHJcbiAgICAgICAgem9vbSA9IE1hdGgubWF4KDAuMDUsIE1hdGgubWluKHpvb20sIDUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5jYW52YXMuem9vbVRvUG9pbnQoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHg6IGUub2Zmc2V0WCxcclxuICAgICAgICAgICAgeTogZS5vZmZzZXRZLFxyXG4gICAgICAgICAgfSBhcyBmYWJyaWMuUG9pbnQsXHJcbiAgICAgICAgICB6b29tLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG4gICAgbGV0IGxhc3RQb3NYID0gMDtcclxuICAgIGxldCBsYXN0UG9zWSA9IDA7XHJcblxyXG4gICAgdGhpcy5jYW52YXMub24oXCJtb3VzZTpkb3duXCIsIChvcHQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIW9wdC50YXJnZXQpIHtcclxuICAgICAgICBpc0RyYWdnaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNhbnZhcy5zZWxlY3Rpb24gPSBmYWxzZTtcclxuICAgICAgICBjb25zdCBlID0gb3B0LmU7XHJcbiAgICAgICAgbGFzdFBvc1ggPSBlLmNsaWVudFg7XHJcbiAgICAgICAgbGFzdFBvc1kgPSBlLmNsaWVudFk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FudmFzLm9uKFwibW91c2U6bW92ZVwiLCAob3B0OiBhbnkpID0+IHtcclxuICAgICAgaWYgKGlzRHJhZ2dpbmcgJiYgdGhpcy5jYW52YXMudmlld3BvcnRUcmFuc2Zvcm0pIHtcclxuICAgICAgICAvLyB0aGlzLmlzVXNlckludGVyYWN0ZWRXaXRoQ2FudmFzID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBlID0gb3B0LmU7XHJcbiAgICAgICAgY29uc3QgdnB0ID0gdGhpcy5jYW52YXMudmlld3BvcnRUcmFuc2Zvcm07XHJcbiAgICAgICAgdnB0WzRdICs9IGUuY2xpZW50WCAtIGxhc3RQb3NYO1xyXG4gICAgICAgIHZwdFs1XSArPSBlLmNsaWVudFkgLSBsYXN0UG9zWTtcclxuICAgICAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgICAgICAgbGFzdFBvc1ggPSBlLmNsaWVudFg7XHJcbiAgICAgICAgbGFzdFBvc1kgPSBlLmNsaWVudFk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FudmFzLm9uKFwibW91c2U6dXBcIiwgKCkgPT4ge1xyXG4gICAgICBpc0RyYWdnaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2FudmFzLnNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldFBhZ2VEYXRhKCkge1xyXG4gICAgdGhpcy5wYWdlSW5mby5zZXRUaXRsZShcIkNyZWF0ZSBTdG9yZSBQbGFub1wiKTtcclxuICAgIHRoaXMucGFnZUluZm8uc2V0QnJlYWRjcnVtYnMoW1xyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiUGxhbm9ncmFtXCIsXHJcbiAgICAgICAgcGF0aDogXCIvbWFuYWdlL3BsYW5vZ3JhbS9tYW5hZ2UtcGxhbm9ncmFtcy9vbmJvYXJkXCIsXHJcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGlzU2VwYXJhdG9yOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlwiLFxyXG4gICAgICAgIHBhdGg6IFwiXCIsXHJcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGlzU2VwYXJhdG9yOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBvbkZpeHR1cmVTYXZlKCkge1xyXG4gICAgdGhpcy5zdWJtaXRGaXh0dXJlID0gdHJ1ZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnN1Ym1pdEZpeHR1cmUgPSBmYWxzZTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkZpeHR1cmVQYWdlQ2FuY2VsKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhID0gbnVsbDtcclxuICAgIHRoaXMuZWRpdEZpeHR1cmVTZWN0aW9uID0gXCJiYXNpYy1kZXRhaWxzXCI7XHJcbiAgICB0aGlzLmVkaXRGaXh0dXJlID0gZmFsc2U7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlckZsb29yKGZhbHNlKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5yZXNpemVDYW52YXMoKTtcclxuICAgICAgdGhpcy5maXRDYW52YXNUb0xheW91dEFuaW1hdGVkKCk7XHJcbiAgICB9LCAzMDApO1xyXG4gIH1cclxuXHJcbiAgb25GaXh0dXJlU3VibWl0KGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICghZXZlbnQgJiYgIXRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgIGlmIChldmVudD8uc2hlbGYgJiYgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhPy5zaGVsZkNvbmZpZykge1xyXG4gICAgICBldmVudC5zaGVsZiA9IGV2ZW50LnNoZWxmLm1hcCgoc2hlbGY6IGFueSwgaW5kZXg6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBmaW5kU2hlbGYgPSB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEuc2hlbGZDb25maWcuZmluZChcclxuICAgICAgICAgIChlbGU6IGFueSkgPT4gZWxlLnNoZWxmTnVtYmVyID09IGluZGV4ICsgMSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChmaW5kU2hlbGYpIHtcclxuICAgICAgICAgIHNoZWxmID0geyAuLi5maW5kU2hlbGYsIC4uLnNoZWxmIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBkZXRhaWxzID1cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnW1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YS5zaGVsZkNvbmZpZy5sZW5ndGggLSAxXHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgICBkZXRhaWxzLnNoZWxmTnVtYmVyID0gaW5kZXggKyAxO1xyXG4gICAgICAgICAgc2hlbGYgPSB7IC4uLmRldGFpbHMsIC4uLnNoZWxmIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzaGVsZjtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGFbXCJzaGVsZkNvbmZpZ1wiXSA9IGV2ZW50Py5zaGVsZjtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhW1wiZGVzY3JpcHRpb25cIl0gPSBldmVudD8uZGVzY3JpcHRpb24gPz8gXCJcIjtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhW1widGVtcGxhdGVHcm91cE5hbWVcIl0gPVxyXG4gICAgICAgIGV2ZW50Py50ZW1wbGF0ZUdyb3VwTmFtZSA/PyBcIlwiO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEuaGVhZGVyLmxhYmVsID0gZXZlbnQ/LmhlYWRlckxhYmVsID8/IFwiXCI7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YS5mb290ZXIubGFiZWwgPSBldmVudD8uZm9vdGVyTGFiZWwgPz8gXCJcIjtcclxuXHJcbiAgICAgIHRoaXMudmFsaWRhdGVGaXh0dXJlcygpO1xyXG4gICAgICB0aGlzLnJlbmRlckZsb29yKGZhbHNlKTtcclxuICAgIH0gZWxzZSBpZiAoZXZlbnQ/LnNlY3Rpb24pIHtcclxuICAgICAgZXZlbnQuc2VjdGlvbi5mb3JFYWNoKChzZWM6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBudW1iZXIgPSBzZWM/LnNoZWx2ZXM/Lm1hcCgoZWxlOiBhbnkpID0+XHJcbiAgICAgICAgICBwYXJzZUludChlbGUuc3BsaXQoXCIgXCIpWzFdKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YT8uc2hlbGZDb25maWcuZm9yRWFjaCgoc2hlbGY6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKG51bWJlci5pbmNsdWRlcyhzaGVsZi5zaGVsZk51bWJlcikpIHtcclxuICAgICAgICAgICAgc2hlbGYuem9uZSA9IHNlYy56b25lO1xyXG4gICAgICAgICAgICBzaGVsZi5wcm9kdWN0QnJhbmROYW1lID0gc2VjLnByb2R1Y3RCcmFuZE5hbWU7XHJcbiAgICAgICAgICAgIHNoZWxmLnByb2R1Y3RDYXRlZ29yeSA9IHNlYy5wcm9kdWN0Q2F0ZWdvcnk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChldmVudD8udm1Db25maWcgJiYgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhPy52bUNvbmZpZykge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGFbXCJ2bUNvbmZpZ1wiXSA9IGV2ZW50Py52bUNvbmZpZztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChldmVudCkge1xyXG4gICAgICAgIC8vIHRoaXMuZ2V0Vm1zTGlzdCgpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5lZGl0Rml4dHVyZVNlY3Rpb24gPSBcImJhc2ljLWRldGFpbHNcIjtcclxuICAgICAgICB0aGlzLmVkaXRGaXh0dXJlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5nZXRTdG9yZUZpeHR1cmVzKHRoaXMucGxhbm9EYXRhPy5faWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVQYW5lbChzaWRlOiBcImxlZnRcIiB8IFwicmlnaHRcIiwgYWN0aW9uPzogYm9vbGVhbikge1xyXG4gICAgaWYgKHNpZGUgPT09IFwibGVmdFwiKSB7XHJcbiAgICAgIHRoaXMuaXNMZWZ0UGFuZWxDb2xsYXBzZWQgPSBhY3Rpb24gPz8gIXRoaXMuaXNMZWZ0UGFuZWxDb2xsYXBzZWQ7XHJcbiAgICAgIGlmICghdGhpcy5pc0xlZnRQYW5lbENvbGxhcHNlZCkgdGhpcy5pc1JpZ2h0UGFuZWxDb2xsYXBzZWQgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pc1JpZ2h0UGFuZWxDb2xsYXBzZWQgPSBhY3Rpb24gPz8gIXRoaXMuaXNSaWdodFBhbmVsQ29sbGFwc2VkO1xyXG4gICAgICBpZiAoIXRoaXMuaXNSaWdodFBhbmVsQ29sbGFwc2VkKSB0aGlzLmlzTGVmdFBhbmVsQ29sbGFwc2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5yZXNpemVDYW52YXMoKTtcclxuICAgICAgdGhpcy5maXRDYW52YXNUb0xheW91dEFuaW1hdGVkKCk7XHJcbiAgICB9LCA0MDApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0VGVtcGxhdGUoZml4dHVyZUNvbmZpZ0lkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgdGhpcy5hcGlTZXJ2aWNlLmdldEZpeHR1cmVUZW1wbGF0ZShmaXh0dXJlQ29uZmlnSWQpLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHRyYW5zZmVyQXJyYXlJdGVtPFQgPSBhbnk+KFxyXG4gICAgY3VycmVudEFycmF5OiBUW10sXHJcbiAgICB0YXJnZXRBcnJheTogVFtdLFxyXG4gICAgY3VycmVudEluZGV4OiBudW1iZXIsXHJcbiAgICB0YXJnZXRJbmRleDogbnVtYmVyLFxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgZnJvbSA9IE1hdGgubWF4KDAsIE1hdGgubWluKGN1cnJlbnRBcnJheS5sZW5ndGggLSAxLCBjdXJyZW50SW5kZXgpKTtcclxuICAgIGNvbnN0IHRvID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGFyZ2V0QXJyYXkubGVuZ3RoLCB0YXJnZXRJbmRleCkpO1xyXG5cclxuICAgIGlmIChjdXJyZW50QXJyYXkubGVuZ3RoKSB7XHJcbiAgICAgIHRhcmdldEFycmF5LnNwbGljZSh0bywgMCwgY3VycmVudEFycmF5LnNwbGljZShmcm9tLCAxKVswXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW9yZGVyRml4dHVyZShmbG9vckRhdGE6IGFueSkge1xyXG4gICAgLy8gV2FsbHNcclxuICAgIGZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZWxlbWVudC5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICBsZXQgd2FsbEFzc29jaWF0ZWRJbmRleCA9IDE7XHJcblxyXG4gICAgICAgIGVsZW1lbnQuZml4dHVyZXMuZm9yRWFjaCgoZml4dHVyZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBmaXh0dXJlLmFzc29jaWF0ZWRFbGVtZW50VHlwZSA9IFwid2FsbFwiO1xyXG4gICAgICAgICAgZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudE51bWJlciA9IGVsZW1lbnQuZWxlbWVudE51bWJlcjtcclxuICAgICAgICAgIGZpeHR1cmUuZml4dHVyZVR5cGUgPSBcIndhbGxcIjtcclxuXHJcbiAgICAgICAgICBpZiAoIWZpeHR1cmUuZ2hvc3QpIHtcclxuICAgICAgICAgICAgLy8gZml4dHVyZS5maXh0dXJlTnVtYmVyID0gZml4dHVyZU51bWJlcisrO1xyXG4gICAgICAgICAgICBmaXh0dXJlLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlciA9IHdhbGxBc3NvY2lhdGVkSW5kZXgrKztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZpeHR1cmUuZml4dHVyZU51bWJlciA9IG51bGw7XHJcbiAgICAgICAgICAgIGZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gQ2VudGVyIGZsb29yIGZpeHR1cmVzXHJcbiAgICBsZXQgZmxvb3JBc3NvY2lhdGVkSW5kZXggPSAxO1xyXG4gICAgZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUuZm9yRWFjaCgoZml4dHVyZTogYW55KSA9PiB7XHJcbiAgICAgIGZpeHR1cmUuZml4dHVyZVR5cGUgPSBcImZsb29yXCI7XHJcblxyXG4gICAgICBpZiAoIWZpeHR1cmUuZ2hvc3QpIHtcclxuICAgICAgICAvLyBmaXh0dXJlLmZpeHR1cmVOdW1iZXIgPSBmaXh0dXJlTnVtYmVyKys7XHJcbiAgICAgICAgZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIgPSBmbG9vckFzc29jaWF0ZWRJbmRleCsrO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpeHR1cmUuZml4dHVyZU51bWJlciA9IG51bGw7XHJcbiAgICAgICAgZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEVsZW1lbnRWYWx1ZShncm91cDogYW55KSB7XHJcbiAgICByZXR1cm4gZ3JvdXAuZ2V0KFwiZWxlbWVudE51bWJlclwiKT8udmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFdhbGxCeU51bWJlcihlbGVtZW50TnVtYmVyOiBudW1iZXIpOiBhbnkgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuZmxvb3JEYXRhPy5sYXlvdXRQb2x5Z29uPy5maW5kKFxyXG4gICAgICAodzogYW55KSA9PiB3LmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiB3LmVsZW1lbnROdW1iZXIgPT09IGVsZW1lbnROdW1iZXIsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcm91bmRUb1R3byhudW06IG51bWJlcikge1xyXG4gICAgcmV0dXJuIE1hdGgucm91bmQobnVtICogMTAwKSAvIDEwMDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFN0b3JlRml4dHVyZXMoc3RvcmVJZDogc3RyaW5nLCBlbmFibGU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodCgpO1xyXG4gICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy5maXh0dXJlVGVtcGxhdGVzLmxlbmd0aCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmdldEZpeHR1cmVUZW1wbGF0ZXMoKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlID0gbnVsbDtcclxuICAgIHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAuZ2V0U3RvcmVGaXh0dXJlcyh7IGlkOiBbc3RvcmVJZF0gfSlcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiBhc3luYyAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICghcmVzPy5kYXRhPy5bMF0/LmZsb29ycz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnBsYW5vRGF0YSA9IHN0cnVjdHVyZWRDbG9uZShyZXMuZGF0YVswXSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5mbG9vckRhdGE/Ll9pZCkge1xyXG4gICAgICAgICAgICB0aGlzLmZsb29yRGF0YSA9IHN0cnVjdHVyZWRDbG9uZShcclxuICAgICAgICAgICAgICByZXMuZGF0YVswXS5mbG9vcnMuZmluZChcclxuICAgICAgICAgICAgICAgIChmbG9vcjogYW55KSA9PiBmbG9vcj8uX2lkID09PSB0aGlzLmZsb29yRGF0YT8uX2lkLFxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZsb29yRGF0YSA9IHN0cnVjdHVyZWRDbG9uZShyZXMuZGF0YVswXS5mbG9vcnNbMF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5mbG9vcnNMaXN0ID0gdGhpcy5wbGFub0RhdGEuZmxvb3JzLm1hcCgoZjogYW55KSA9PiAoe1xyXG4gICAgICAgICAgICBsYWJlbDogZi5mbG9vck51bSxcclxuICAgICAgICAgICAgdmFsdWU6IGYuX2lkLFxyXG4gICAgICAgICAgICAvLyBkaXNhYmxlZDogZi5zdGF0dXMgPT09IFwiY29tcGxldGVkXCIsXHJcbiAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5leHRyYWN0QWxsRml4dHVyZXModGhpcy5mbG9vckRhdGEpO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZsb29ySWQuc2V0VmFsdWUodGhpcy5mbG9vckRhdGEuX2lkLCB7XHJcbiAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0aGlzLmRpc2FibGVFZGl0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKCF0aGlzLml2bUFsaWFzS2V5cy5zaXplIHx8ICF0aGlzLmZpeHR1cmVMaWJyYXJ5QnlXaWR0aC5zaXplKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgICAgICAgICB0aGlzLml2bUFsaWFzS2V5cy5zaXplID8gUHJvbWlzZS5yZXNvbHZlKCkgOiB0aGlzLmZldGNoSXZtQWxpYXMoKSxcclxuICAgICAgICAgICAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5QnlXaWR0aC5zaXplXHJcbiAgICAgICAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZSgpXHJcbiAgICAgICAgICAgICAgICA6IHRoaXMuZmV0Y2hGaXh0dXJlTGlicmFyeUtleXMoKSxcclxuICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlRml4dHVyZXMoKTtcclxuXHJcbiAgICAgICAgICB0aGlzLnJlbmRlckZsb29yKCk7XHJcblxyXG4gICAgICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAoZW5hYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Rm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gZmV0Y2ggcGxhbm9cIik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBleHRyYWN0QWxsRml4dHVyZXMoZmxvb3JEYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGV4dHJhY3RlZEZpeHR1cmUgPSBbXHJcbiAgICAgIC4uLihmbG9vckRhdGE/Lm1hc3RlclRlbXBsYXRlcyA/PyBbXSksXHJcbiAgICAgIC4uLihmbG9vckRhdGE/LmNlbnRlckZpeHR1cmUgPz8gW10pLFxyXG4gICAgXTtcclxuXHJcbiAgICBmbG9vckRhdGE/LmxheW91dFBvbHlnb24/LmZvckVhY2goKGxwOiBhbnkpID0+IHtcclxuICAgICAgZXh0cmFjdGVkRml4dHVyZS5wdXNoKC4uLihscC5maXh0dXJlcyA/PyBbXSkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hbGxGaXh0dXJlcyA9IGV4dHJhY3RlZEZpeHR1cmU7XHJcblxyXG4gICAgLy8gdGhpcy5hbGxGaXh0dXJlSW5zdGFuY2VzID0gW1xyXG4gICAgLy8gICAuLi50aGlzLmZsb29yRGF0YSEubGF5b3V0UG9seWdvbi5mbGF0TWFwKChlOiBhbnkpID0+IGU/LmZpeHR1cmVzID8/IFtdKSxcclxuICAgIC8vICAgLi4uKHRoaXMuZmxvb3JEYXRhPy5jZW50ZXJGaXh0dXJlID8/IFtdKSxcclxuICAgIC8vIF07XHJcbiAgfVxyXG5cclxuICBnZXQgYWxsRml4dHVyZUluc3RhbmNlcygpIHtcclxuICAgIGNvbnN0IGFsbEZpeHR1cmVzID0gW1xyXG4gICAgICAuLi4odGhpcy5mbG9vckRhdGE/LmxheW91dFBvbHlnb24/LmZsYXRNYXAoXHJcbiAgICAgICAgKGU6IGFueSkgPT4gZT8uZml4dHVyZXMgPz8gW10sXHJcbiAgICAgICkgPz8gW10pLFxyXG4gICAgICAuLi4odGhpcy5mbG9vckRhdGE/LmNlbnRlckZpeHR1cmUgPz8gW10pLFxyXG4gICAgXTtcclxuXHJcbiAgICBjb25zdCBzZWVuRml4dHVyZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgIGNvbnN0IHVuaXF1ZUZpeHR1cmVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIGFsbEZpeHR1cmVzLmZvckVhY2goKGZpeHR1cmU6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWZpeHR1cmUpIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IGZpeHR1cmVJZCA9IGZpeHR1cmUuX2lkO1xyXG5cclxuICAgICAgaWYgKCFzZWVuRml4dHVyZXMuaGFzKGZpeHR1cmVJZCkpIHtcclxuICAgICAgICBzZWVuRml4dHVyZXMuYWRkKGZpeHR1cmVJZCk7XHJcbiAgICAgICAgdW5pcXVlRml4dHVyZXMucHVzaChmaXh0dXJlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHVuaXF1ZUZpeHR1cmVzO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmV0Y2hJdm1BbGlhcygpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5hcGlTZXJ2aWNlLmdldEl2bUNvbnZlcnNpb25BbGlhcygpLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAocmVzPy5kYXRhICYmIHR5cGVvZiByZXMuZGF0YSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgIHRoaXMuaXZtQWxpYXNLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhyZXMuZGF0YSkpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgLy8gc2lsZW50bHkgZmFpbCDigJQgdmFsaWRhdGlvbiBza2lwcGVkIGlmIGFsaWFzIHVuYXZhaWxhYmxlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBmZXRjaEZpeHR1cmVMaWJyYXJ5S2V5cygpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5hcGlTZXJ2aWNlLmdldEZpeHR1cmVMaWJOYW1lTGlzdCh0aGlzLmNsaWVudElkLCBcIm5vbi1kcmFmdFwiKSxcclxuICAgICAgKTtcclxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlcz8uZGF0YSkpIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IGdyb3VwZWQgPSBuZXcgTWFwPG51bWJlciwgU2V0PHN0cmluZz4+KCk7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3J5U2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgIGNvbnN0IGJ5Q2F0ZWdvcnkgPSBuZXcgTWFwPHN0cmluZywgU2V0PG51bWJlcj4+KCk7XHJcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByZXMuZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IGl0ZW0/LmZpeHR1cmVOYW1lO1xyXG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiB8fCAhbmFtZS5sZW5ndGgpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAvLyBCYWNrZW5kIGZvcm1hdDogXCI8Y2F0ZWdvcnk+IC0gPHZhbHVlPjx1bml0PlwiIGUuZy4gXCJFdXJvIENlbnRlciAtIDRmdFwiLlxyXG4gICAgICAgIC8vIFNwbGl0IG9uIHRoZSBMQVNUIFwiIC0gXCIgc28gY2F0ZWdvcmllcyBjb250YWluaW5nIGh5cGhlbnMgYXJlIHByZXNlcnZlZC5cclxuICAgICAgICBjb25zdCBzZXBJZHggPSBuYW1lLmxhc3RJbmRleE9mKFwiIC0gXCIpO1xyXG4gICAgICAgIGlmIChzZXBJZHggPCAwKSBjb250aW51ZTtcclxuICAgICAgICBjb25zdCBjYXRlZ29yeVJhdyA9IG5hbWUuc2xpY2UoMCwgc2VwSWR4KTtcclxuICAgICAgICBjb25zdCB3aWR0aFBhcnQgPSBuYW1lLnNsaWNlKHNlcElkeCArIDMpO1xyXG4gICAgICAgIGNvbnN0IHdpZHRoTWF0Y2ggPSB3aWR0aFBhcnQubWF0Y2goL14oXFxkKyg/OlxcLlxcZCspPykvKTtcclxuICAgICAgICBpZiAoIXdpZHRoTWF0Y2gpIGNvbnRpbnVlO1xyXG4gICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VGbG9hdCh3aWR0aE1hdGNoWzFdKTtcclxuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHdpZHRoKSkgY29udGludWU7XHJcblxyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZUZvck1hdGNoKGNhdGVnb3J5UmF3KTtcclxuICAgICAgICBpZiAoIW5vcm1hbGl6ZWQpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBpZiAoIWdyb3VwZWQuaGFzKHdpZHRoKSkgZ3JvdXBlZC5zZXQod2lkdGgsIG5ldyBTZXQ8c3RyaW5nPigpKTtcclxuICAgICAgICBncm91cGVkLmdldCh3aWR0aCkhLmFkZChub3JtYWxpemVkKTtcclxuICAgICAgICBjYXRlZ29yeVNldC5hZGQoY2F0ZWdvcnlSYXcpO1xyXG4gICAgICAgIGlmICghYnlDYXRlZ29yeS5oYXMoY2F0ZWdvcnlSYXcpKSBieUNhdGVnb3J5LnNldChjYXRlZ29yeVJhdywgbmV3IFNldDxudW1iZXI+KCkpO1xyXG4gICAgICAgIGJ5Q2F0ZWdvcnkuZ2V0KGNhdGVnb3J5UmF3KSEuYWRkKHdpZHRoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5QnlXaWR0aCA9IGdyb3VwZWQ7XHJcbiAgICAgIHRoaXMubGlicmFyeUNhdGVnb3JpZXMgPSBBcnJheS5mcm9tKGNhdGVnb3J5U2V0KS5zb3J0KCk7XHJcbiAgICAgIHRoaXMubGlicmFyeUJ5Q2F0ZWdvcnkgPSBieUNhdGVnb3J5O1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIC8vIHNpbGVudGx5IGZhaWwg4oCUIGxpYnJhcnkgdmFsaWRhdGlvbiBza2lwcGVkIGlmIHVuYXZhaWxhYmxlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBOb3JtYWxpemUgYSBjYXRlZ29yeSBzdHJpbmcgZm9yIG1hdGNoaW5nOiBsb3dlcmNhc2UgKyBzdHJpcCBldmVyeXRoaW5nXHJcbiAgLy8gZXhjZXB0IGEtei4gU3BhY2VzLCBwdW5jdHVhdGlvbiwgYW5kIGRpZ2l0cyBhbGwgZHJvcHBlZC4gRGlnaXRzIGluXHJcbiAgLy8gY2F0ZWdvcnkgbmFtZXMgYXJlIG5vaXNlIChDQUQgbW9kZWwgY29kZXMgbGlrZSBcIjEwMTBcIi9cIjEyMDBcIiwgdmVuZG9yXHJcbiAgLy8gc2l6ZSBzdWZmaXhlcykg4oCUIHRoZSByZWFsIHdpZHRoIGNvbWVzIGZyb20gZml4dHVyZVdpZHRoLnZhbHVlLlxyXG4gIHByaXZhdGUgbm9ybWFsaXplRm9yTWF0Y2goc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKHR5cGVvZiBzdHIgIT09IFwic3RyaW5nXCIpIHJldHVybiBcIlwiO1xyXG4gICAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16XS9nLCBcIlwiKTtcclxuICB9XHJcblxyXG4gIC8vIERhbWVyYXUtTGV2ZW5zaHRlaW4gZWRpdCBkaXN0YW5jZTogY291bnRzIGluc2VydGlvbnMsIGRlbGV0aW9ucyxcclxuICAvLyBzdWJzdGl0dXRpb25zLCBhbmQgYWRqYWNlbnQtY2hhciB0cmFuc3Bvc2l0aW9ucyAoYSBzd2FwIGxpa2VcclxuICAvLyBcImh5YmlyZFwiPC0+XCJoeWJyaWRcIiBpcyAxIGVkaXQsIG5vdCAyKS5cclxuICBwcml2YXRlIGRhbWVyYXVMZXZlbnNodGVpbkRpc3RhbmNlKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGlmIChhID09PSBiKSByZXR1cm4gMDtcclxuICAgIGNvbnN0IGFMZW4gPSBhLmxlbmd0aDtcclxuICAgIGNvbnN0IGJMZW4gPSBiLmxlbmd0aDtcclxuICAgIGlmICghYUxlbikgcmV0dXJuIGJMZW47XHJcbiAgICBpZiAoIWJMZW4pIHJldHVybiBhTGVuO1xyXG5cclxuICAgIGNvbnN0IG1hdHJpeDogbnVtYmVyW11bXSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGFMZW4gKyAxIH0sICgpID0+XHJcbiAgICAgIG5ldyBBcnJheShiTGVuICsgMSkuZmlsbCgwKSxcclxuICAgICk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBhTGVuOyBpKyspIG1hdHJpeFtpXVswXSA9IGk7XHJcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8PSBiTGVuOyBqKyspIG1hdHJpeFswXVtqXSA9IGo7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gYUxlbjsgaSsrKSB7XHJcbiAgICAgIGZvciAobGV0IGogPSAxOyBqIDw9IGJMZW47IGorKykge1xyXG4gICAgICAgIGNvbnN0IGNvc3QgPSBhW2kgLSAxXSA9PT0gYltqIC0gMV0gPyAwIDogMTtcclxuICAgICAgICBtYXRyaXhbaV1bal0gPSBNYXRoLm1pbihcclxuICAgICAgICAgIG1hdHJpeFtpIC0gMV1bal0gKyAxLFxyXG4gICAgICAgICAgbWF0cml4W2ldW2ogLSAxXSArIDEsXHJcbiAgICAgICAgICBtYXRyaXhbaSAtIDFdW2ogLSAxXSArIGNvc3QsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBpID4gMSAmJlxyXG4gICAgICAgICAgaiA+IDEgJiZcclxuICAgICAgICAgIGFbaSAtIDFdID09PSBiW2ogLSAyXSAmJlxyXG4gICAgICAgICAgYVtpIC0gMl0gPT09IGJbaiAtIDFdXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBtYXRyaXhbaV1bal0gPSBNYXRoLm1pbihtYXRyaXhbaV1bal0sIG1hdHJpeFtpIC0gMl1baiAtIDJdICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWF0cml4W2FMZW5dW2JMZW5dO1xyXG4gIH1cclxuXHJcbiAgLy8gU2ltaWxhcml0eSByYXRpbyBpbiBbMCwgMV0gYWZ0ZXIgbm9ybWFsaXphdGlvbi4gMS4wID0gaWRlbnRpY2FsLlxyXG4gIHByaXZhdGUgc2ltaWxhcml0eVJhdGlvKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IG5vcm1BID0gdGhpcy5ub3JtYWxpemVGb3JNYXRjaChhKTtcclxuICAgIGNvbnN0IG5vcm1CID0gdGhpcy5ub3JtYWxpemVGb3JNYXRjaChiKTtcclxuICAgIGlmICghbm9ybUEgfHwgIW5vcm1CKSByZXR1cm4gMDtcclxuICAgIGlmIChub3JtQSA9PT0gbm9ybUIpIHJldHVybiAxO1xyXG4gICAgY29uc3QgZGlzdGFuY2UgPSB0aGlzLmRhbWVyYXVMZXZlbnNodGVpbkRpc3RhbmNlKG5vcm1BLCBub3JtQik7XHJcbiAgICBjb25zdCBtYXhMZW4gPSBNYXRoLm1heChub3JtQS5sZW5ndGgsIG5vcm1CLmxlbmd0aCk7XHJcbiAgICByZXR1cm4gMSAtIGRpc3RhbmNlIC8gbWF4TGVuO1xyXG4gIH1cclxuXHJcbiAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmaXh0dXJlJ3MgKGNhdGVnb3J5LCB3aWR0aCkgaGFzIGEgbGlicmFyeSBtYXRjaC5cclxuICAvLyBXaWR0aCBtdXN0IGVxdWFsIGV4YWN0bHk7IGNhdGVnb3J5IHBhc3NlcyBpZiBpdCdzIGFuIGV4YWN0IG5vcm1hbGl6ZWRcclxuICAvLyBtYXRjaCBPUiBhIGZ1enp5IG1hdGNoID49IDgwJSBhZ2FpbnN0IGFueSBsaWJyYXJ5IGNhdGVnb3J5IGF0IHRoYXQgd2lkdGguXHJcbiAgcHJpdmF0ZSBpc0xpYnJhcnlNYXRjaChmaXh0dXJlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHdpZHRoID0gZml4dHVyZT8uZml4dHVyZVdpZHRoPy52YWx1ZTtcclxuICAgIGlmICh3aWR0aCA9PSBudWxsKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gdGhpcy5maXh0dXJlTGlicmFyeUJ5V2lkdGguZ2V0KHdpZHRoKTtcclxuICAgIGlmICghY2FuZGlkYXRlcyB8fCBjYW5kaWRhdGVzLnNpemUgPT09IDApIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBmaXh0dXJlQ2F0ID0gdGhpcy5ub3JtYWxpemVGb3JNYXRjaChmaXh0dXJlPy5maXh0dXJlQ2F0ZWdvcnkgPz8gXCJcIik7XHJcbiAgICBpZiAoIWZpeHR1cmVDYXQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoY2FuZGlkYXRlcy5oYXMoZml4dHVyZUNhdCkpIHJldHVybiB0cnVlO1xyXG5cclxuICAgIGZvciAoY29uc3QgbGliQ2F0IG9mIGNhbmRpZGF0ZXMpIHtcclxuICAgICAgaWYgKHRoaXMuc2ltaWxhcml0eVJhdGlvKGZpeHR1cmVDYXQsIGxpYkNhdCkgPj0gMC44KSByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlRml4dHVyZXMoKSB7XHJcbiAgICBjb25zdCBoYXNJdm0gPSB0aGlzLml2bUFsaWFzS2V5cy5zaXplID4gMDtcclxuICAgIGNvbnN0IGhhc0xpYiA9IHRoaXMuZml4dHVyZUxpYnJhcnlCeVdpZHRoLnNpemUgPiAwO1xyXG4gICAgaWYgKCFoYXNJdm0gJiYgIWhhc0xpYikgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuYWxsRml4dHVyZUluc3RhbmNlcy5mb3JFYWNoKChmaXh0dXJlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGZpeHR1cmUuZml4dHVyZU5hbWUgPT09IFwic3BhY2VcIikgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKGhhc0l2bSkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckxhYmVsOiBzdHJpbmcgPSBmaXh0dXJlPy5oZWFkZXI/LmxhYmVsID8/IFwiXCI7XHJcbiAgICAgICAgZml4dHVyZS5oZWFkZXJJbnZhbGlkID1cclxuICAgICAgICAgICFoZWFkZXJMYWJlbCB8fCAhdGhpcy5pdm1BbGlhc0tleXMuaGFzKGhlYWRlckxhYmVsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGhhc0xpYikge1xyXG4gICAgICAgIGZpeHR1cmUubGlicmFyeUludmFsaWQgPSAhdGhpcy5pc0xpYnJhcnlNYXRjaChmaXh0dXJlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgaGFzSW52YWxpZEhlYWRlckZpeHR1cmVzKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLml2bUFsaWFzS2V5cy5zaXplKSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy5hbGxGaXh0dXJlSW5zdGFuY2VzLnNvbWUoXHJcbiAgICAgIChmOiBhbnkpID0+IGYuZml4dHVyZU5hbWUgIT09IFwic3BhY2VcIiAmJiBmLmhlYWRlckludmFsaWQsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGludmFsaWRIZWFkZXJGaXh0dXJlQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmFsbEZpeHR1cmVJbnN0YW5jZXMuZmlsdGVyKFxyXG4gICAgICAoZjogYW55KSA9PiBmLmZpeHR1cmVOYW1lICE9PSBcInNwYWNlXCIgJiYgZi5oZWFkZXJJbnZhbGlkLFxyXG4gICAgKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXQgaGFzSW52YWxpZExpYnJhcnlGaXh0dXJlcygpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5maXh0dXJlTGlicmFyeUJ5V2lkdGguc2l6ZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHRoaXMuYWxsRml4dHVyZUluc3RhbmNlcy5zb21lKFxyXG4gICAgICAoZjogYW55KSA9PiBmLmZpeHR1cmVOYW1lICE9PSBcInNwYWNlXCIgJiYgZi5saWJyYXJ5SW52YWxpZCxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXQgaW52YWxpZExpYnJhcnlGaXh0dXJlQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmFsbEZpeHR1cmVJbnN0YW5jZXMuZmlsdGVyKFxyXG4gICAgICAoZjogYW55KSA9PiBmLmZpeHR1cmVOYW1lICE9PSBcInNwYWNlXCIgJiYgZi5saWJyYXJ5SW52YWxpZCxcclxuICAgICkubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0ludmFsaWRGaXh0dXJlcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmhhc0ludmFsaWRIZWFkZXJGaXh0dXJlcyB8fCB0aGlzLmhhc0ludmFsaWRMaWJyYXJ5Rml4dHVyZXM7XHJcbiAgfVxyXG5cclxuICBnZXQgaW52YWxpZEZpeHR1cmVzVG9vbHRpcCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmhhc0ludmFsaWRGaXh0dXJlcykgcmV0dXJuIFwiXCI7XHJcblxyXG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBoZWFkZXJDb3VudCA9IHRoaXMuaW52YWxpZEhlYWRlckZpeHR1cmVDb3VudDtcclxuICAgIGNvbnN0IGxpYkNvdW50ID0gdGhpcy5pbnZhbGlkTGlicmFyeUZpeHR1cmVDb3VudDtcclxuXHJcbiAgICBpZiAoaGVhZGVyQ291bnQgPiAwKSB7XHJcbiAgICAgIHBhcnRzLnB1c2goXHJcbiAgICAgICAgYCR7aGVhZGVyQ291bnR9IGZpeHR1cmUke2hlYWRlckNvdW50ID09PSAxID8gXCJcIiA6IFwic1wifSBgICtcclxuICAgICAgICAgIGAke2hlYWRlckNvdW50ID09PSAxID8gXCJoYXNcIiA6IFwiaGF2ZVwifSB1bnJlY29nbml6ZWQgaGVhZGVycy5gLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKGxpYkNvdW50ID4gMCkge1xyXG4gICAgICBwYXJ0cy5wdXNoKFxyXG4gICAgICAgIGAke2xpYkNvdW50fSBmaXh0dXJlJHtsaWJDb3VudCA9PT0gMSA/IFwiXCIgOiBcInNcIn0gYCArXHJcbiAgICAgICAgICBgJHtsaWJDb3VudCA9PT0gMSA/IFwiZG9lc1wiIDogXCJkb1wifSBub3QgbWF0Y2ggYW55IGxpYnJhcnkgZW50cnkuYCxcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHBhcnRzLnB1c2goXCJGaXggdGhlbSB0byBydW4gYWxsb2NhdGlvblwiKTtcclxuICAgIHJldHVybiBwYXJ0cy5qb2luKFwiIFwiKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0VkaXRMYXlvdXRBbGxvd2VkKCkge1xyXG4gICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlZCAmJiAhdGhpcy5pc0FsbG9jYXRpb25SdW4pIHtcclxuICAgICAgaWYgKHRoaXMuZ2V0U3RhdHVzID09PSBcImRyYWZ0XCIpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuZ2V0U3RhdHVzID09PSBcImFsbG9jYXRpb25QZW5kaW5nXCIgJiZcclxuICAgICAgICB0aGlzLmlzUnVuQWxsb2NhdGlvbkFsbG93ZWRcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHJlbmRlckZsb29yKHVwZGF0ZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgIHRoaXMuZHJhd0luaXRpYWxDb250ZW50KCk7XHJcbiAgICBpZiAodXBkYXRlKSB7XHJcbiAgICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG5cclxuICAgICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5mb3JFYWNoKCh3YWxsOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAod2FsbC5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICAgIGNvbnN0IHdhbGxJdGVtID0gdGhpcy5wYXRjaFdhbGxFbGVtZW50cyh7XHJcbiAgICAgICAgICAgIGVsZW1lbnRUeXBlOiB3YWxsLmVsZW1lbnRUeXBlLFxyXG4gICAgICAgICAgICBlbGVtZW50TnVtYmVyOiB3YWxsLmVsZW1lbnROdW1iZXIsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB3YWxsLmZpeHR1cmVzLmZvckVhY2goKGZpeHR1cmU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZml4dHVyZT8uZml4dHVyZU5hbWUgPT09IFwic3BhY2VcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlR3JvdXAgPSB0aGlzLnBhdGNoRml4dHVyZSh7XHJcbiAgICAgICAgICAgICAgZml4dHVyZU5hbWU6IGZpeHR1cmUuZml4dHVyZU5hbWUsXHJcbiAgICAgICAgICAgICAgZml4dHVyZUNvbmZpZ0lkOiBmaXh0dXJlLmZpeHR1cmVDb25maWdJZCxcclxuICAgICAgICAgICAgICBfaWQ6IGZpeHR1cmUuX2lkLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgKHdhbGxJdGVtLmdldChcImZpeHR1cmVzXCIpIGFzIEZvcm1BcnJheSkucHVzaChmaXh0dXJlR3JvdXApO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgd2FsbC5vdGhlckVsZW1lbnRzPy5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICAgIHR5cGU6IFtcclxuICAgICAgICAgICAgICAgIHRoaXMub3RoZXJFbGVtZW50TGlzdC5zb21lKChvKSA9PiBvLnZhbHVlID09PSBlbGUuZml4dHVyZU5hbWUpXHJcbiAgICAgICAgICAgICAgICAgID8gZWxlLmZpeHR1cmVOYW1lXHJcbiAgICAgICAgICAgICAgICAgIDogXCJPdGhlcnNcIixcclxuICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgIGN1c3RvbU5hbWU6IFtcclxuICAgICAgICAgICAgICAgIHRoaXMub3RoZXJFbGVtZW50TGlzdC5zb21lKChvKSA9PiBvLnZhbHVlID09PSBlbGUuZml4dHVyZU5hbWUpXHJcbiAgICAgICAgICAgICAgICAgID8gXCJcIlxyXG4gICAgICAgICAgICAgICAgICA6IGVsZS5maXh0dXJlTmFtZSxcclxuICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgKHdhbGxJdGVtLmdldChcIm90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5KS5wdXNoKGVsZUdyb3VwKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuZ2V0Rm9ybVdhbGxzLnB1c2god2FsbEl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5mbG9vckRhdGE/LmNlbnRlckZpeHR1cmU/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuZmxvb3JEYXRhPy5jZW50ZXJGaXh0dXJlLmZvckVhY2goKGZpeHR1cmU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZml4dHVyZUdyb3VwID0gdGhpcy5wYXRjaEZpeHR1cmUoe1xyXG4gICAgICAgICAgICBmaXh0dXJlTmFtZTogZml4dHVyZS5maXh0dXJlTmFtZSxcclxuICAgICAgICAgICAgZml4dHVyZUNvbmZpZ0lkOiBmaXh0dXJlLmZpeHR1cmVDb25maWdJZCxcclxuICAgICAgICAgICAgX2lkOiBmaXh0dXJlLl9pZCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vckZpeHR1cmVzXCIpIGFzIEZvcm1BcnJheSkucHVzaChcclxuICAgICAgICAgICAgZml4dHVyZUdyb3VwLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuZmxvb3JEYXRhPy5vdGhlckVsZW1lbnRzPy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmZsb29yRGF0YT8ub3RoZXJFbGVtZW50cz8uZm9yRWFjaCgoZWxlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGVsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIHR5cGU6IFtcclxuICAgICAgICAgICAgICB0aGlzLm90aGVyRWxlbWVudExpc3Quc29tZSgobykgPT4gby52YWx1ZSA9PT0gZWxlLmZpeHR1cmVOYW1lKVxyXG4gICAgICAgICAgICAgICAgPyBlbGUuZml4dHVyZU5hbWVcclxuICAgICAgICAgICAgICAgIDogXCJPdGhlcnNcIixcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgY3VzdG9tTmFtZTogW1xyXG4gICAgICAgICAgICAgIHRoaXMub3RoZXJFbGVtZW50TGlzdC5zb21lKChvKSA9PiBvLnZhbHVlID09PSBlbGUuZml4dHVyZU5hbWUpXHJcbiAgICAgICAgICAgICAgICA/IFwiXCJcclxuICAgICAgICAgICAgICAgIDogZWxlLmZpeHR1cmVOYW1lLFxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vck90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5KS5wdXNoKFxyXG4gICAgICAgICAgICBlbGVHcm91cCxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN1YnNjcmliZVRvRml4dHVyZUNvbmZpZ0lkQ2hhbmdlcygpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVUb090aGVyRWxlbWVudHNDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBkcmF3SW5pdGlhbENvbnRlbnQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmNhbnZhcy5jbGVhcigpO1xyXG4gICAgdGhpcy5yZW9yZGVyRml4dHVyZSh0aGlzLmZsb29yRGF0YSk7XHJcbiAgICBhd2FpdCB0aGlzLmRyYXdMYXlvdXRFbGVtZW50cygpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlc2l6ZUNhbnZhcygpO1xyXG4gICAgICB0aGlzLmZpdENhbnZhc1RvTGF5b3V0QW5pbWF0ZWQoKTtcclxuICAgIH0sIDMwMCk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVBbGxQb3NpdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RnVsbExheW91dEJvdW5kcygpIHtcclxuICAgIGNvbnN0IG9iamVjdHMgPSB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCk7XHJcbiAgICBpZiAoIW9iamVjdHMubGVuZ3RoKSByZXR1cm4geyBsZWZ0OiAwLCB0b3A6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcclxuXHJcbiAgICBsZXQgbWluWCA9IEluZmluaXR5LFxyXG4gICAgICBtaW5ZID0gSW5maW5pdHksXHJcbiAgICAgIG1heFggPSAtSW5maW5pdHksXHJcbiAgICAgIG1heFkgPSAtSW5maW5pdHk7XHJcblxyXG4gICAgZm9yIChjb25zdCBvYmogb2Ygb2JqZWN0cykge1xyXG4gICAgICBjb25zdCByZWN0ID0gb2JqLmdldEJvdW5kaW5nUmVjdCgpO1xyXG4gICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgcmVjdC5sZWZ0KTtcclxuICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIHJlY3QudG9wKTtcclxuICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHJlY3QubGVmdCArIHJlY3Qud2lkdGgpO1xyXG4gICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgcmVjdC50b3AgKyByZWN0LmhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGVmdDogbWluWCxcclxuICAgICAgdG9wOiBtaW5ZLFxyXG4gICAgICB3aWR0aDogbWF4WCAtIG1pblgsXHJcbiAgICAgIGhlaWdodDogbWF4WSAtIG1pblksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaXRDYW52YXNUb0xheW91dEFuaW1hdGVkKGR1cmF0aW9uID0gNDAwKSB7XHJcbiAgICBpZiAoIXRoaXMuY2FudmFzKSByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5lbmFibGVkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5nZXRGdWxsTGF5b3V0Qm91bmRzKCk7XHJcbiAgICBpZiAoIWJvdW5kcy53aWR0aCB8fCAhYm91bmRzLmhlaWdodCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGNhbnZhc1cgPSB0aGlzLmNhbnZhcy5nZXRXaWR0aCgpO1xyXG4gICAgY29uc3QgY2FudmFzSCA9IHRoaXMuY2FudmFzLmdldEhlaWdodCgpO1xyXG5cclxuICAgIC8vIEZpbmFsIHpvb20gdG8gZml0ICh3aXRoIHBhZGRpbmcpXHJcbiAgICBjb25zdCBzY2FsZVggPSBjYW52YXNXIC8gYm91bmRzLndpZHRoO1xyXG4gICAgY29uc3Qgc2NhbGVZID0gY2FudmFzSCAvIGJvdW5kcy5oZWlnaHQ7XHJcbiAgICBjb25zdCB0YXJnZXRab29tID0gTWF0aC5taW4oc2NhbGVYLCBzY2FsZVkpICogMC45OyAvLyBwYWRkaW5nIDEwJVxyXG5cclxuICAgIC8vIERlc2lyZWQgdmlld3BvcnQgb2Zmc2V0IHRvIGNlbnRlciBsYXlvdXRcclxuICAgIGNvbnN0IHRhcmdldFZwdCA9IFtcclxuICAgICAgLi4uKHRoaXMuY2FudmFzLnZpZXdwb3J0VHJhbnNmb3JtIHx8IFsxLCAwLCAwLCAxLCAwLCAwXSksXHJcbiAgICBdIGFzIGZhYnJpYy5UTWF0MkQ7XHJcblxyXG4gICAgdGFyZ2V0VnB0WzBdID0gdGFyZ2V0Wm9vbTsgLy8gc2NhbGVYXHJcbiAgICB0YXJnZXRWcHRbM10gPSB0YXJnZXRab29tOyAvLyBzY2FsZVlcclxuXHJcbiAgICBjb25zdCBleHRyYVRvcFBhZGRpbmdQeCA9IDI0O1xyXG4gICAgdGFyZ2V0VnB0WzRdID0gY2FudmFzVyAvIDIgLSAoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLyAyKSAqIHRhcmdldFpvb207IC8vIGNlbnRlciBYXHJcbiAgICB0YXJnZXRWcHRbNV0gPVxyXG4gICAgICBjYW52YXNIIC8gMiAtXHJcbiAgICAgIChib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCAvIDIpICogdGFyZ2V0Wm9vbSArXHJcbiAgICAgIGV4dHJhVG9wUGFkZGluZ1B4OyAvLyBjZW50ZXIgWSArIGV4dHJhIHRvcCBwYWRkaW5nXHJcblxyXG4gICAgLy8gQ3VycmVudCB2aWV3cG9ydCAoc3RhcnRpbmcgcG9pbnQgb2YgYW5pbWF0aW9uKVxyXG4gICAgY29uc3Qgc3RhcnRWcHQgPSBbLi4udGhpcy5jYW52YXMudmlld3BvcnRUcmFuc2Zvcm0hXSBhcyBmYWJyaWMuVE1hdDJEO1xyXG5cclxuICAgIGZhYnJpYy51dGlsLmFuaW1hdGUoe1xyXG4gICAgICBzdGFydFZhbHVlOiAwLFxyXG4gICAgICBlbmRWYWx1ZTogMSxcclxuICAgICAgZHVyYXRpb24sXHJcbiAgICAgIGVhc2luZzogZmFicmljLnV0aWwuZWFzZS5lYXNlT3V0Q3ViaWMsXHJcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZwdCA9IHRoaXMuY2FudmFzLnZpZXdwb3J0VHJhbnNmb3JtITtcclxuXHJcbiAgICAgICAgLy8gSW50ZXJwb2xhdGUgbWF0cml4IHZhbHVlc1xyXG4gICAgICAgIHZwdFswXSA9IHN0YXJ0VnB0WzBdICsgKHRhcmdldFZwdFswXSAtIHN0YXJ0VnB0WzBdKSAqIHZhbHVlO1xyXG4gICAgICAgIHZwdFszXSA9IHN0YXJ0VnB0WzNdICsgKHRhcmdldFZwdFszXSAtIHN0YXJ0VnB0WzNdKSAqIHZhbHVlO1xyXG4gICAgICAgIHZwdFs0XSA9IHN0YXJ0VnB0WzRdICsgKHRhcmdldFZwdFs0XSAtIHN0YXJ0VnB0WzRdKSAqIHZhbHVlO1xyXG4gICAgICAgIHZwdFs1XSA9IHN0YXJ0VnB0WzVdICsgKHRhcmdldFZwdFs1XSAtIHN0YXJ0VnB0WzVdKSAqIHZhbHVlO1xyXG5cclxuICAgICAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRyYXdMYXlvdXRFbGVtZW50cygpIHtcclxuICAgIGNvbnN0IGZsb29yID0gdGhpcy5mbG9vckRhdGE7XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZmxvb3IubGF5b3V0UG9seWdvbi5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IGZsb29yLmxheW91dFBvbHlnb25baW5kZXhdO1xyXG5cclxuICAgICAgZWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uID8/PSB7XHJcbiAgICAgICAgeDogMCxcclxuICAgICAgICB5OiAwLFxyXG4gICAgICAgIHVuaXQ6IFwiZnRcIixcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHggPSB0aGlzLnRvUGl4ZWxzKGVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi54LCBlbGVtZW50LnVuaXQpO1xyXG4gICAgICBjb25zdCB5ID0gdGhpcy50b1BpeGVscyhlbGVtZW50LnJlbGF0aXZlUG9zaXRpb24ueSwgZWxlbWVudC51bml0KTtcclxuXHJcbiAgICAgIGlmIChlbGVtZW50LmVsZW1lbnRUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMud2FsbFRoaWNrbmVzcztcclxuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLnRvUGl4ZWxzKGVsZW1lbnQuZGlzdGFuY2UsIGVsZW1lbnQudW5pdCk7XHJcbiAgICAgICAgaWYgKHdpZHRoIDwgaGVpZ2h0KSB3aWR0aCA9IHRoaXMud2FsbFRoaWNrbmVzcyArIDE7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5kcmF3V2FsbCh0aGlzLmNhbnZhcywgeCwgeSwgaGVpZ2h0LCB3aWR0aCwgZWxlbWVudCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5lbGVtZW50VHlwZSA9PT0gXCJlbnRyYW5jZVwiKSB7XHJcbiAgICAgICAgY29uc3QgYXJyb3dXaWR0aCA9IDgwO1xyXG4gICAgICAgIGNvbnN0IGFycm93SGVpZ2h0ID0gNzU7XHJcbiAgICAgICAgY29uc3QgYXJyb3dCYXNlID0gNDA7XHJcbiAgICAgICAgdGhpcy5kcmF3RW50cmFuY2UoXHJcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcclxuICAgICAgICAgIHgsXHJcbiAgICAgICAgICB5LFxyXG4gICAgICAgICAgYXJyb3dXaWR0aCxcclxuICAgICAgICAgIGFycm93SGVpZ2h0LFxyXG4gICAgICAgICAgYXJyb3dCYXNlLFxyXG4gICAgICAgICAgZWxlbWVudCxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRm9yIGNhZCBsYXlvdXRzIG9ubHkuXHJcbiAgICB0aGlzLmxheW91dEJvdW5kcyA9IHRoaXMuZ2V0RnVsbExheW91dEJvdW5kcygpO1xyXG5cclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBmbG9vci5sYXlvdXRQb2x5Z29uLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBlbGVtZW50ID0gZmxvb3IubGF5b3V0UG9seWdvbltpbmRleF07XHJcbiAgICAgIGlmIChlbGVtZW50LmVsZW1lbnRUeXBlICE9PSBcIndhbGxcIikgY29udGludWU7XHJcblxyXG4gICAgICBjb25zdCBmaXh0dXJlR3JvdXBzOiBmYWJyaWMuR3JvdXBbXSA9IFtdO1xyXG5cclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50Py5maXh0dXJlcz8ubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBjb25zdCBmaXh0dXJlID0gZWxlbWVudC5maXh0dXJlc1tqXTtcclxuXHJcbiAgICAgICAgY29uc3QgZml4dHVyZUhlaWdodCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgICBmaXh0dXJlLmZpeHR1cmVTdGF0aWNMZW5ndGgudmFsdWUsXHJcbiAgICAgICAgICBmaXh0dXJlLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IGZpeHR1cmVXaWR0aCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgICBmaXh0dXJlLmZpeHR1cmVTdGF0aWNXaWR0aC52YWx1ZSxcclxuICAgICAgICAgIGZpeHR1cmUuZml4dHVyZVN0YXRpY1dpZHRoLnVuaXQsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IHggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLngsXHJcbiAgICAgICAgICBmaXh0dXJlLnJlbGF0aXZlUG9zaXRpb24udW5pdCxcclxuICAgICAgICApO1xyXG4gICAgICAgIGxldCB5ID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgIGZpeHR1cmUucmVsYXRpdmVQb3NpdGlvbi55LFxyXG4gICAgICAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLnVuaXQsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gb3ZlcnJpZGUgdGhlIGZpeHR1cmUgcG9zaXRpb24gZm9yIGluaXRpYWwgY2FkIGxheW91dHMuXHJcbiAgICAgICAgLy8gaWYgKHRoaXMuZmxvb3JEYXRhPy5jYWRMYXlvdXQpIHtcclxuICAgICAgICAvLyAgIGNvbnN0IGJhc2VYID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICAvLyAgICAgZWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLngsXHJcbiAgICAgICAgLy8gICAgIGVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi51bml0LFxyXG4gICAgICAgIC8vICAgKTtcclxuXHJcbiAgICAgICAgLy8gICBjb25zdCBiYXNlWSA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgLy8gICAgIGVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi55LFxyXG4gICAgICAgIC8vICAgICBlbGVtZW50LnJlbGF0aXZlUG9zaXRpb24udW5pdCxcclxuICAgICAgICAvLyAgICk7XHJcbiAgICAgICAgLy8gICBjb25zdCBzdGFydEJ1ZmZlciA9IDQwO1xyXG4gICAgICAgIC8vICAgY29uc3Qgc3BhY2luZyA9IDEzNjtcclxuICAgICAgICAvLyAgIGNvbnN0IG9mZnNldCA9IHN0YXJ0QnVmZmVyICsgc3BhY2luZyAqIGo7XHJcblxyXG4gICAgICAgIC8vICAgY29uc3QgYW5nbGVSYWQgPSBmYWJyaWMudXRpbC5kZWdyZWVzVG9SYWRpYW5zKGVsZW1lbnQuYW5nbGUpO1xyXG5cclxuICAgICAgICAvLyAgIGNvbnN0IGRpclggPSBNYXRoLmNvcyhhbmdsZVJhZCk7XHJcbiAgICAgICAgLy8gICBjb25zdCBkaXJZID0gTWF0aC5zaW4oYW5nbGVSYWQpO1xyXG5cclxuICAgICAgICAvLyAgIGNvbnN0IG5vcm1hbE9mZnNldCA9IHRoaXMud2FsbFRoaWNrbmVzcztcclxuXHJcbiAgICAgICAgLy8gICBjb25zdCBub3JtWCA9IE1hdGguY29zKGFuZ2xlUmFkICsgTWF0aC5QSSAvIDIpICogbm9ybWFsT2Zmc2V0O1xyXG4gICAgICAgIC8vICAgY29uc3Qgbm9ybVkgPSBNYXRoLnNpbihhbmdsZVJhZCArIE1hdGguUEkgLyAyKSAqIG5vcm1hbE9mZnNldDtcclxuXHJcbiAgICAgICAgLy8gICB4ID0gYmFzZVggKyBkaXJYICogb2Zmc2V0ICsgbm9ybVg7XHJcbiAgICAgICAgLy8gICB5ID0gYmFzZVkgKyBkaXJZICogb2Zmc2V0ICsgbm9ybVk7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBjb25zdCBmaXh0dXJlT2JqID0gYXdhaXQgdGhpcy5kcmF3Rml4dHVyZShcclxuICAgICAgICAgIHRoaXMuY2FudmFzLFxyXG4gICAgICAgICAgeCxcclxuICAgICAgICAgIHksXHJcbiAgICAgICAgICBmaXh0dXJlSGVpZ2h0LFxyXG4gICAgICAgICAgZml4dHVyZVdpZHRoLFxyXG4gICAgICAgICAgZml4dHVyZSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGZpeHR1cmVHcm91cHMucHVzaChmaXh0dXJlT2JqIGFzIGZhYnJpYy5Hcm91cCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWxlbWVudD8ub3RoZXJFbGVtZW50cz8ubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBjb25zdCBvdGhlckVsZW1lbnQgPSBlbGVtZW50Lm90aGVyRWxlbWVudHNbal07XHJcbiAgICAgICAgY29uc3QgeCA9IHRoaXMudG9QaXhlbHMob3RoZXJFbGVtZW50LnJlbGF0aXZlUG9zaXRpb24ueCwgXCJmdFwiKTtcclxuICAgICAgICBjb25zdCB5ID0gdGhpcy50b1BpeGVscyhvdGhlckVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi55LCBcImZ0XCIpO1xyXG4gICAgICAgIGNvbnN0IGEgPSBvdGhlckVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi5hbmdsZTtcclxuICAgICAgICBjb25zdCBoID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgIG90aGVyRWxlbWVudC5maXh0dXJlU3RhdGljTGVuZ3RoLnZhbHVlLFxyXG4gICAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IHcgPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNXaWR0aC52YWx1ZSxcclxuICAgICAgICAgIG90aGVyRWxlbWVudC5maXh0dXJlU3RhdGljV2lkdGgudW5pdCxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLmRyYXdPdGhlckVsZW1lbnRzV2l0aExhYmVsKFxyXG4gICAgICAgICAgdGhpcy5jYW52YXMsXHJcbiAgICAgICAgICB4LFxyXG4gICAgICAgICAgeSxcclxuICAgICAgICAgIGEsXHJcbiAgICAgICAgICB3LFxyXG4gICAgICAgICAgaCxcclxuICAgICAgICAgIG90aGVyRWxlbWVudCxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLy9JZiBDQUQgbGF5b3V0XHJcbiAgICAvLyBpZiAodGhpcy5mbG9vckRhdGE/LmNhZExheW91dCAmJiB0aGlzLmZsb29yRGF0YT8uY2VudGVyRml4dHVyZT8ubGVuZ3RoKSB7XHJcbiAgICAvLyAgIGNvbnN0IGZpeHR1cmVzID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZTtcclxuXHJcbiAgICAvLyAgIGNvbnN0IGxheW91dFBvbHlnb24gPSB0aGlzLmJ1aWxkTGF5b3V0UG9seWdvbkZyb21XYWxscygpO1xyXG4gICAgLy8gICBjb25zdCBvY2N1cGllZFJlY3RzID0gdGhpcy5nZXRPY2N1cGllZFJlY3RzKCk7XHJcblxyXG4gICAgLy8gICBjb25zdCBmaXh0dXJlV2lkdGhQeCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAvLyAgICAgZml4dHVyZXNbMF0uZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlLFxyXG4gICAgLy8gICAgIGZpeHR1cmVzWzBdLmZpeHR1cmVTdGF0aWNXaWR0aC51bml0LFxyXG4gICAgLy8gICApO1xyXG5cclxuICAgIC8vICAgY29uc3QgZml4dHVyZUhlaWdodFB4ID0gdGhpcy50b1BpeGVscyhcclxuICAgIC8vICAgICBmaXh0dXJlc1swXS5maXh0dXJlU3RhdGljTGVuZ3RoLnZhbHVlLFxyXG4gICAgLy8gICAgIGZpeHR1cmVzWzBdLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgIC8vICAgKTtcclxuXHJcbiAgICAvLyAgIGNvbnN0IHRvdGFsID0gZml4dHVyZXMubGVuZ3RoO1xyXG5cclxuICAgIC8vICAgY29uc3QgbWF4Um93cyA9IDI7XHJcbiAgICAvLyAgIGNvbnN0IHJvd3MgPSBNYXRoLm1pbihtYXhSb3dzLCB0b3RhbCk7XHJcbiAgICAvLyAgIGNvbnN0IGNvbHVtbnMgPSBNYXRoLmNlaWwodG90YWwgLyByb3dzKTtcclxuXHJcbiAgICAvLyAgIGNvbnN0IGdyaWRXaWR0aCA9IGNvbHVtbnMgKiBmaXh0dXJlV2lkdGhQeDtcclxuICAgIC8vICAgY29uc3QgZ3JpZEhlaWdodCA9IHJvd3MgKiBmaXh0dXJlSGVpZ2h0UHg7XHJcblxyXG4gICAgLy8gICBjb25zdCBib3VuZHMgPSB0aGlzLmdldEZ1bGxMYXlvdXRCb3VuZHMoKTtcclxuICAgIC8vICAgY29uc3QgY2VudGVyWCA9IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC8gMjtcclxuICAgIC8vICAgY29uc3QgY2VudGVyWSA9IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC8gMjtcclxuXHJcbiAgICAvLyAgIGNvbnN0IGlzSW5zaWRlUG9seWdvbiA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4ge1xyXG4gICAgLy8gICAgIHJldHVybiAoXHJcbiAgICAvLyAgICAgICB0aGlzLmlzUG9pbnRJbnNpZGVQb2x5Z29uKHsgeCwgeSB9LCBsYXlvdXRQb2x5Z29uKSAmJlxyXG4gICAgLy8gICAgICAgdGhpcy5pc1BvaW50SW5zaWRlUG9seWdvbih7IHg6IHggKyBncmlkV2lkdGgsIHkgfSwgbGF5b3V0UG9seWdvbikgJiZcclxuICAgIC8vICAgICAgIHRoaXMuaXNQb2ludEluc2lkZVBvbHlnb24oeyB4LCB5OiB5ICsgZ3JpZEhlaWdodCB9LCBsYXlvdXRQb2x5Z29uKSAmJlxyXG4gICAgLy8gICAgICAgdGhpcy5pc1BvaW50SW5zaWRlUG9seWdvbihcclxuICAgIC8vICAgICAgICAgeyB4OiB4ICsgZ3JpZFdpZHRoLCB5OiB5ICsgZ3JpZEhlaWdodCB9LFxyXG4gICAgLy8gICAgICAgICBsYXlvdXRQb2x5Z29uLFxyXG4gICAgLy8gICAgICAgKVxyXG4gICAgLy8gICAgICk7XHJcbiAgICAvLyAgIH07XHJcblxyXG4gICAgLy8gICBjb25zdCBvdmVybGFwc09jY3VwaWVkID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiB7XHJcbiAgICAvLyAgICAgY29uc3QgZ3JpZFJlY3QgPSB7IHgsIHksIHc6IGdyaWRXaWR0aCwgaDogZ3JpZEhlaWdodCB9O1xyXG5cclxuICAgIC8vICAgICBmb3IgKGNvbnN0IG9jYyBvZiBvY2N1cGllZFJlY3RzKSB7XHJcbiAgICAvLyAgICAgICBpZiAodGhpcy5yZWN0c092ZXJsYXAoZ3JpZFJlY3QsIG9jYykpIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyAgIH07XHJcblxyXG4gICAgLy8gICBjb25zdCBmaW5kQmVzdFBvc2l0aW9uID0gKG1vZGU6IFwic3RyaWN0XCIgfCBcInJlbGF4ZWRcIikgPT4ge1xyXG4gICAgLy8gICAgIGxldCBiZXN0U2NvcmUgPSAtSW5maW5pdHk7XHJcbiAgICAvLyAgICAgbGV0IGJlc3RQb3M6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8vICAgICBjb25zdCBzdGVwID0gZml4dHVyZVdpZHRoUHggLyAyO1xyXG5cclxuICAgIC8vICAgICBmb3IgKFxyXG4gICAgLy8gICAgICAgbGV0IHkgPSBib3VuZHMudG9wO1xyXG4gICAgLy8gICAgICAgeSA8PSBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCAtIGdyaWRIZWlnaHQ7XHJcbiAgICAvLyAgICAgICB5ICs9IHN0ZXBcclxuICAgIC8vICAgICApIHtcclxuICAgIC8vICAgICAgIGZvciAoXHJcbiAgICAvLyAgICAgICAgIGxldCB4ID0gYm91bmRzLmxlZnQ7XHJcbiAgICAvLyAgICAgICAgIHggPD0gYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLSBncmlkV2lkdGg7XHJcbiAgICAvLyAgICAgICAgIHggKz0gc3RlcFxyXG4gICAgLy8gICAgICAgKSB7XHJcbiAgICAvLyAgICAgICAgIGlmICghaXNJbnNpZGVQb2x5Z29uKHgsIHkpKSBjb250aW51ZTtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmIChtb2RlID09PSBcInN0cmljdFwiICYmIG92ZXJsYXBzT2NjdXBpZWQoeCwgeSkpIGNvbnRpbnVlO1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgZ3JpZFJlY3QgPSB7IHgsIHksIHc6IGdyaWRXaWR0aCwgaDogZ3JpZEhlaWdodCB9O1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgZW1wdHlNYXJnaW4gPSB0aGlzLmNvbXB1dGVFbXB0eU1hcmdpbihcclxuICAgIC8vICAgICAgICAgICBncmlkUmVjdCxcclxuICAgIC8vICAgICAgICAgICBib3VuZHMsXHJcbiAgICAvLyAgICAgICAgICAgb2NjdXBpZWRSZWN0cyxcclxuICAgIC8vICAgICAgICAgKTtcclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGR4ID0gY2VudGVyWCAtICh4ICsgZ3JpZFdpZHRoIC8gMik7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGR5ID0gY2VudGVyWSAtICh5ICsgZ3JpZEhlaWdodCAvIDIpO1xyXG4gICAgLy8gICAgICAgICBjb25zdCBjZW50ZXJQZW5hbHR5ID0gZHggKiBkeCArIGR5ICogZHk7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBzY29yZSA9IGVtcHR5TWFyZ2luICogMTAwMCAtIGNlbnRlclBlbmFsdHkgKiAwLjAwMTtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmIChzY29yZSA+IGJlc3RTY29yZSkge1xyXG4gICAgLy8gICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlO1xyXG4gICAgLy8gICAgICAgICAgIGJlc3RQb3MgPSB7IHgsIHkgfTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgcmV0dXJuIGJlc3RQb3M7XHJcbiAgICAvLyAgIH07XHJcblxyXG4gICAgLy8gICBsZXQgYmVzdFBvcyA9IGZpbmRCZXN0UG9zaXRpb24oXCJzdHJpY3RcIik7XHJcblxyXG4gICAgLy8gICBpZiAoIWJlc3RQb3MpIHtcclxuICAgIC8vICAgICBjb25zb2xlLndhcm4oXCJTdHJpY3QgcGxhY2VtZW50IGZhaWxlZC4gVHJ5aW5nIHJlbGF4ZWQgbW9kZS4uLlwiKTtcclxuICAgIC8vICAgICBiZXN0UG9zID0gZmluZEJlc3RQb3NpdGlvbihcInJlbGF4ZWRcIik7XHJcbiAgICAvLyAgIH1cclxuXHJcbiAgICAvLyAgIGlmICghYmVzdFBvcykge1xyXG4gICAgLy8gICAgIGNvbnNvbGUud2FybihcIlJlbGF4ZWQgcGxhY2VtZW50IGZhaWxlZC4gRmFsbGluZyBiYWNrIHRvIGNlbnRlci5cIik7XHJcbiAgICAvLyAgICAgYmVzdFBvcyA9IHtcclxuICAgIC8vICAgICAgIHg6IGNlbnRlclggLSBncmlkV2lkdGggLyAyLFxyXG4gICAgLy8gICAgICAgeTogY2VudGVyWSAtIGdyaWRIZWlnaHQgLyAyLFxyXG4gICAgLy8gICAgIH07XHJcbiAgICAvLyAgIH1cclxuXHJcbiAgICAvLyAgIGZpeHR1cmVzLmZvckVhY2goKGZpeHR1cmU6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgLy8gICAgIC8vIE4tc2hhcGUgdHJhdmVyc2FsOiBjb2wgZmlsbHMgbGVmdC10by1yaWdodCwgZWFjaCBjb2x1bW4gZmlsbHMgYm90dG9tIHJvdyBmaXJzdCB0aGVuIHRvcCByb3dcclxuICAgIC8vICAgICBjb25zdCBjb2wgPSBNYXRoLmZsb29yKGluZGV4IC8gMik7XHJcbiAgICAvLyAgICAgY29uc3Qgcm93ID0gaW5kZXggJSAyID09PSAwID8gMSA6IDA7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IHggPSBiZXN0UG9zIS54ICsgY29sICogZml4dHVyZVdpZHRoUHg7XHJcbiAgICAvLyAgICAgY29uc3QgeSA9IGJlc3RQb3MhLnkgKyByb3cgKiBmaXh0dXJlSGVpZ2h0UHg7XHJcblxyXG4gICAgLy8gICAgIGZpeHR1cmUucmVsYXRpdmVQb3NpdGlvbi54ID0gdGhpcy5mcm9tUGl4ZWxzKHgsIFwiZnRcIik7XHJcbiAgICAvLyAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLnkgPSB0aGlzLmZyb21QaXhlbHMoeSwgXCJmdFwiKTtcclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmZsb29yRGF0YT8uY2FkTGF5b3V0ICYmXHJcbiAgICAgIHRoaXMuZmxvb3JEYXRhPy5jZW50ZXJGaXh0dXJlPy5sZW5ndGhcclxuICAgICkge1xyXG4gICAgICB0aGlzLmNvbXBhY3RDZW50ZXJGaXh0dXJlcyh0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZsb29yPy5jZW50ZXJGaXh0dXJlPy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBmaXh0dXJlID0gZmxvb3IuY2VudGVyRml4dHVyZVtpXTtcclxuXHJcbiAgICAgIGNvbnN0IGZpeHR1cmVIZWlnaHQgPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgIGZpeHR1cmUuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSxcclxuICAgICAgICBmaXh0dXJlLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IGZpeHR1cmVXaWR0aCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgZml4dHVyZS5maXh0dXJlU3RhdGljV2lkdGgudmFsdWUsXHJcbiAgICAgICAgZml4dHVyZS5maXh0dXJlU3RhdGljV2lkdGgudW5pdCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IHggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgIGZpeHR1cmUucmVsYXRpdmVQb3NpdGlvbi54LFxyXG4gICAgICAgIGZpeHR1cmUucmVsYXRpdmVQb3NpdGlvbi51bml0LFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgeSA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLnksXHJcbiAgICAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLnVuaXQsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLmRyYXdGaXh0dXJlKFxyXG4gICAgICAgIHRoaXMuY2FudmFzLFxyXG4gICAgICAgIHgsXHJcbiAgICAgICAgeSxcclxuICAgICAgICBmaXh0dXJlSGVpZ2h0LFxyXG4gICAgICAgIGZpeHR1cmVXaWR0aCxcclxuICAgICAgICBmaXh0dXJlLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZmxvb3I/Lm90aGVyRWxlbWVudHM/Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgIGNvbnN0IG90aGVyRWxlbWVudCA9IGZsb29yLm90aGVyRWxlbWVudHNbal07XHJcbiAgICAgIGNvbnN0IHggPSB0aGlzLnRvUGl4ZWxzKG90aGVyRWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLngsIFwiZnRcIik7XHJcbiAgICAgIGNvbnN0IHkgPSB0aGlzLnRvUGl4ZWxzKG90aGVyRWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLnksIFwiZnRcIik7XHJcbiAgICAgIGNvbnN0IGEgPSBvdGhlckVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi5hbmdsZTtcclxuICAgICAgY29uc3QgaCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNMZW5ndGgudmFsdWUsXHJcbiAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgdyA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNXaWR0aC52YWx1ZSxcclxuICAgICAgICBvdGhlckVsZW1lbnQuZml4dHVyZVN0YXRpY1dpZHRoLnVuaXQsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLmRyYXdPdGhlckVsZW1lbnRzV2l0aExhYmVsKHRoaXMuY2FudmFzLCB4LCB5LCBhLCB3LCBoLCBvdGhlckVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgY29tcGFjdENlbnRlckZpeHR1cmVzKGZpeHR1cmVzOiBhbnlbXSkge1xyXG4gICAgaWYgKCFmaXh0dXJlcz8ubGVuZ3RoKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgR0FQX0ZBQ1RPUiA9IDAuMzsgLy8gNzAlIHJlZHVjdGlvblxyXG5cclxuICAgIGNvbnN0IGl0ZW1zID0gZml4dHVyZXMubWFwKChmKSA9PiB7XHJcbiAgICAgIGNvbnN0IHcgPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgIGYuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlLFxyXG4gICAgICAgIGYuZml4dHVyZVN0YXRpY1dpZHRoLnVuaXQsXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgIGYuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSxcclxuICAgICAgICBmLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IHggPSB0aGlzLnRvUGl4ZWxzKGYucmVsYXRpdmVQb3NpdGlvbi54LCBmLnJlbGF0aXZlUG9zaXRpb24udW5pdCk7XHJcbiAgICAgIGNvbnN0IHkgPSB0aGlzLnRvUGl4ZWxzKGYucmVsYXRpdmVQb3NpdGlvbi55LCBmLnJlbGF0aXZlUG9zaXRpb24udW5pdCk7XHJcblxyXG4gICAgICByZXR1cm4geyBmLCB4LCB5LCB3LCBoIH07XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDwn5GJIENhcHR1cmUgb3JpZ2luYWwgY2VudGVyXHJcbiAgICBjb25zdCBnZXRCb3VuZHMgPSAobGlzdDphbnkpID0+IHtcclxuICAgICAgY29uc3QgbWluWCA9IE1hdGgubWluKC4uLmxpc3QubWFwKChpOmFueSkgPT4gaS54KSk7XHJcbiAgICAgIGNvbnN0IG1pblkgPSBNYXRoLm1pbiguLi5saXN0Lm1hcCgoaTphbnkpID0+IGkueSkpO1xyXG4gICAgICBjb25zdCBtYXhYID0gTWF0aC5tYXgoLi4ubGlzdC5tYXAoKGk6YW55KSA9PiBpLnggKyBpLncpKTtcclxuICAgICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KC4uLmxpc3QubWFwKChpOmFueSkgPT4gaS55ICsgaS5oKSk7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIG1pblgsXHJcbiAgICAgICAgbWluWSxcclxuICAgICAgICB3aWR0aDogbWF4WCAtIG1pblgsXHJcbiAgICAgICAgaGVpZ2h0OiBtYXhZIC0gbWluWSxcclxuICAgICAgICBjZW50ZXJYOiBtaW5YICsgKG1heFggLSBtaW5YKSAvIDIsXHJcbiAgICAgICAgY2VudGVyWTogbWluWSArIChtYXhZIC0gbWluWSkgLyAyLFxyXG4gICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBvcmlnaW5hbEJvdW5kcyA9IGdldEJvdW5kcyhpdGVtcyk7XHJcblxyXG4gICAgLy8gU1RFUCAxOiBncm91cCByb3dzXHJcbiAgICBjb25zdCByb3dUaHJlc2hvbGQgPSBNYXRoLm1pbiguLi5pdGVtcy5tYXAoKGkpID0+IGkuaCkpIC8gMjtcclxuXHJcbiAgICBjb25zdCByb3dzOiBhbnlbXVtdID0gW107XHJcbiAgICBpdGVtcy5zb3J0KChhLCBiKSA9PiBhLnkgLSBiLnkpO1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICBsZXQgcGxhY2VkID0gZmFsc2U7XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XHJcbiAgICAgICAgaWYgKE1hdGguYWJzKHJvd1swXS55IC0gaXRlbS55KSA8IHJvd1RocmVzaG9sZCkge1xyXG4gICAgICAgICAgcm93LnB1c2goaXRlbSk7XHJcbiAgICAgICAgICBwbGFjZWQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXBsYWNlZCkgcm93cy5wdXNoKFtpdGVtXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHJvdy5zb3J0KChhLCBiKSA9PiBhLnggLSBiLngpKTtcclxuXHJcbiAgICAvLyBTVEVQIDI6IGhvcml6b250YWwgY29tcGFjdGlvbiAoc2NhbGVkIGdhcHMpXHJcbiAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJvdy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHByZXYgPSByb3dbaSAtIDFdO1xyXG4gICAgICAgIGNvbnN0IGN1cnIgPSByb3dbaV07XHJcblxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsR2FwID0gY3Vyci54IC0gKHByZXYueCArIHByZXYudyk7XHJcblxyXG4gICAgICAgIGlmIChvcmlnaW5hbEdhcCA+IDApIHtcclxuICAgICAgICAgIGNvbnN0IG5ld0dhcCA9IG9yaWdpbmFsR2FwICogR0FQX0ZBQ1RPUjtcclxuICAgICAgICAgIGN1cnIueCA9IHByZXYueCArIHByZXYudyArIG5ld0dhcDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFNURVAgMzogdmVydGljYWwgY29tcGFjdGlvbiAoc2NhbGVkIGdhcHMpXHJcbiAgICBmb3IgKGxldCByID0gMTsgciA8IHJvd3MubGVuZ3RoOyByKyspIHtcclxuICAgICAgY29uc3QgcHJldlJvdyA9IHJvd3NbciAtIDFdO1xyXG4gICAgICBjb25zdCBjdXJyUm93ID0gcm93c1tyXTtcclxuXHJcbiAgICAgIGNvbnN0IHByZXZCb3R0b20gPSBNYXRoLm1heCguLi5wcmV2Um93Lm1hcCgoaSkgPT4gaS55ICsgaS5oKSk7XHJcbiAgICAgIGNvbnN0IGN1cnJUb3AgPSBNYXRoLm1pbiguLi5jdXJyUm93Lm1hcCgoaSkgPT4gaS55KSk7XHJcblxyXG4gICAgICBjb25zdCBvcmlnaW5hbEdhcCA9IGN1cnJUb3AgLSBwcmV2Qm90dG9tO1xyXG5cclxuICAgICAgaWYgKG9yaWdpbmFsR2FwID4gMCkge1xyXG4gICAgICAgIGNvbnN0IG5ld0dhcCA9IG9yaWdpbmFsR2FwICogR0FQX0ZBQ1RPUjtcclxuICAgICAgICBjb25zdCBzaGlmdCA9IG9yaWdpbmFsR2FwIC0gbmV3R2FwO1xyXG5cclxuICAgICAgICBjdXJyUm93LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGl0ZW0ueSAtPSBzaGlmdDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFNURVAgNDogcmVzdG9yZSBjZW50ZXJcclxuICAgIGNvbnN0IG5ld0JvdW5kcyA9IGdldEJvdW5kcyhpdGVtcyk7XHJcblxyXG4gICAgY29uc3QgZHggPSBvcmlnaW5hbEJvdW5kcy5jZW50ZXJYIC0gbmV3Qm91bmRzLmNlbnRlclg7XHJcbiAgICBjb25zdCBkeSA9IG9yaWdpbmFsQm91bmRzLmNlbnRlclkgLSBuZXdCb3VuZHMuY2VudGVyWTtcclxuXHJcbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0ueCArPSBkeDtcclxuICAgICAgaXRlbS55ICs9IGR5O1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gU1RFUCA1OiB3cml0ZSBiYWNrXHJcbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0uZi5yZWxhdGl2ZVBvc2l0aW9uLnggPSB0aGlzLmZyb21QaXhlbHMoaXRlbS54LCBcImZ0XCIpO1xyXG4gICAgICBpdGVtLmYucmVsYXRpdmVQb3NpdGlvbi55ID0gdGhpcy5mcm9tUGl4ZWxzKGl0ZW0ueSwgXCJmdFwiKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgaXNQb2ludEluc2lkZVBvbHlnb24oXHJcbiAgICBwb2ludDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9LFxyXG4gICAgcG9seWdvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9W10sXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaW5zaWRlID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSBwb2x5Z29uLmxlbmd0aCAtIDE7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaiA9IGkrKykge1xyXG4gICAgICBjb25zdCB4aSA9IHBvbHlnb25baV0ueCxcclxuICAgICAgICB5aSA9IHBvbHlnb25baV0ueTtcclxuICAgICAgY29uc3QgeGogPSBwb2x5Z29uW2pdLngsXHJcbiAgICAgICAgeWogPSBwb2x5Z29uW2pdLnk7XHJcblxyXG4gICAgICBjb25zdCBpbnRlcnNlY3QgPVxyXG4gICAgICAgIHlpID4gcG9pbnQueSAhPT0geWogPiBwb2ludC55ICYmXHJcbiAgICAgICAgcG9pbnQueCA8ICgoeGogLSB4aSkgKiAocG9pbnQueSAtIHlpKSkgLyAoeWogLSB5aSkgKyB4aTtcclxuXHJcbiAgICAgIGlmIChpbnRlcnNlY3QpIGluc2lkZSA9ICFpbnNpZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGluc2lkZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0T2NjdXBpZWRSZWN0cygpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuY2FudmFzLmdldE9iamVjdHMoKS5tYXAoKG9iaikgPT4ge1xyXG4gICAgICBjb25zdCByID0gb2JqLmdldEJvdW5kaW5nUmVjdCgpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHg6IHIubGVmdCxcclxuICAgICAgICB5OiByLnRvcCxcclxuICAgICAgICB3OiByLndpZHRoLFxyXG4gICAgICAgIGg6IHIuaGVpZ2h0LFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlY3RzT3ZlcmxhcChcclxuICAgIGE6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sXHJcbiAgICBiOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9LFxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEoXHJcbiAgICAgIGEueCArIGEudyA8PSBiLnggfHxcclxuICAgICAgYS54ID49IGIueCArIGIudyB8fFxyXG4gICAgICBhLnkgKyBhLmggPD0gYi55IHx8XHJcbiAgICAgIGEueSA+PSBiLnkgKyBiLmhcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXB1dGVFbXB0eU1hcmdpbihcclxuICAgIGdyaWRSZWN0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9LFxyXG4gICAgYm91bmRzOiB7IGxlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0sXHJcbiAgICBvY2N1cGllZFJlY3RzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9W10sXHJcbiAgKTogbnVtYmVyIHtcclxuICAgIGxldCBtaW5NYXJnaW4gPSBJbmZpbml0eTtcclxuXHJcbiAgICAvLyBkaXN0YW5jZSB0byBsYXlvdXQgYm91bmRzXHJcbiAgICBtaW5NYXJnaW4gPSBNYXRoLm1pbihcclxuICAgICAgbWluTWFyZ2luLFxyXG4gICAgICBncmlkUmVjdC54IC0gYm91bmRzLmxlZnQsXHJcbiAgICAgIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC0gKGdyaWRSZWN0LnggKyBncmlkUmVjdC53KSxcclxuICAgICAgZ3JpZFJlY3QueSAtIGJvdW5kcy50b3AsXHJcbiAgICAgIGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC0gKGdyaWRSZWN0LnkgKyBncmlkUmVjdC5oKSxcclxuICAgICk7XHJcblxyXG4gICAgLy8gZGlzdGFuY2UgdG8gb3RoZXIgb2JqZWN0c1xyXG4gICAgZm9yIChjb25zdCBvY2Mgb2Ygb2NjdXBpZWRSZWN0cykge1xyXG4gICAgICAvLyBob3Jpem9udGFsIGdhcFxyXG4gICAgICBpZiAob2NjLnkgPCBncmlkUmVjdC55ICsgZ3JpZFJlY3QuaCAmJiBvY2MueSArIG9jYy5oID4gZ3JpZFJlY3QueSkge1xyXG4gICAgICAgIGlmIChvY2MueCArIG9jYy53IDw9IGdyaWRSZWN0LngpIHtcclxuICAgICAgICAgIG1pbk1hcmdpbiA9IE1hdGgubWluKG1pbk1hcmdpbiwgZ3JpZFJlY3QueCAtIChvY2MueCArIG9jYy53KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChvY2MueCA+PSBncmlkUmVjdC54ICsgZ3JpZFJlY3Qudykge1xyXG4gICAgICAgICAgbWluTWFyZ2luID0gTWF0aC5taW4obWluTWFyZ2luLCBvY2MueCAtIChncmlkUmVjdC54ICsgZ3JpZFJlY3QudykpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gdmVydGljYWwgZ2FwXHJcbiAgICAgIGlmIChvY2MueCA8IGdyaWRSZWN0LnggKyBncmlkUmVjdC53ICYmIG9jYy54ICsgb2NjLncgPiBncmlkUmVjdC54KSB7XHJcbiAgICAgICAgaWYgKG9jYy55ICsgb2NjLmggPD0gZ3JpZFJlY3QueSkge1xyXG4gICAgICAgICAgbWluTWFyZ2luID0gTWF0aC5taW4obWluTWFyZ2luLCBncmlkUmVjdC55IC0gKG9jYy55ICsgb2NjLmgpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG9jYy55ID49IGdyaWRSZWN0LnkgKyBncmlkUmVjdC5oKSB7XHJcbiAgICAgICAgICBtaW5NYXJnaW4gPSBNYXRoLm1pbihtaW5NYXJnaW4sIG9jYy55IC0gKGdyaWRSZWN0LnkgKyBncmlkUmVjdC5oKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1pbk1hcmdpbjtcclxuICB9XHJcblxyXG4gIGRyYXdGaXh0dXJlUm93TGFiZWwodGV4dDogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlcikge1xyXG4gICAgY29uc3QgbGFiZWwgPSBuZXcgZmFicmljLlRleHQodGV4dCwge1xyXG4gICAgICBsZWZ0OiB4LFxyXG4gICAgICB0b3A6IHksXHJcbiAgICAgIGZvbnRTaXplOiAxNCxcclxuICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICBmb250V2VpZ2h0OiBcIjYwMFwiLFxyXG4gICAgICBmaWxsOiBcIiMzMzNcIixcclxuICAgICAgb3JpZ2luWDogXCJsZWZ0XCIsXHJcbiAgICAgIG9yaWdpblk6IFwiYm90dG9tXCIsXHJcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FudmFzLmFkZChsYWJlbCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBkcmF3V2FsbChcclxuICAgIGNhbnZhczogZmFicmljLkNhbnZhcyxcclxuICAgIHg6IG51bWJlcixcclxuICAgIHk6IG51bWJlcixcclxuICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgd2lkdGg6IG51bWJlcixcclxuICAgIGVsZW1lbnREYXRhOiBhbnksXHJcbiAgKSB7XHJcbiAgICBjb25zdCByYWRpdXMgPSA1O1xyXG4gICAgY29uc3QgZmlsbENvbG9yID0gXCIjRjZGQ0ZGXCI7XHJcbiAgICBjb25zdCBzdHJva2VDb2xvciA9IFwiI0QwRDVERFwiO1xyXG4gICAgY29uc3QgbGFiZWxDb2xvciA9IFwiIzAwOUJGM1wiO1xyXG4gICAgbGV0IHRleHQgPSBgJHt0aGlzLnRpdGxlQ2FzZS50cmFuc2Zvcm0oZWxlbWVudERhdGEuZWxlbWVudFR5cGUpfSAke1xyXG4gICAgICBlbGVtZW50RGF0YS5lbGVtZW50TnVtYmVyXHJcbiAgICB9YDtcclxuXHJcbiAgICBjb25zdCB3YWxsID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgbGVmdDogMCxcclxuICAgICAgdG9wOiAwLFxyXG4gICAgICB3aWR0aCxcclxuICAgICAgaGVpZ2h0LFxyXG4gICAgICByeDogcmFkaXVzLFxyXG4gICAgICByeTogcmFkaXVzLFxyXG4gICAgICBmaWxsOiBmaWxsQ29sb3IsXHJcbiAgICAgIHN0cm9rZTogc3Ryb2tlQ29sb3IsXHJcbiAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgc3Ryb2tlVW5pZm9ybTogdHJ1ZSxcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGNlbnRlclggPSB3aWR0aCAvIDI7XHJcbiAgICBjb25zdCBjZW50ZXJZID0gaGVpZ2h0IC8gMjtcclxuICAgIGNvbnN0IGlzVmVydGljYWwgPSBoZWlnaHQgPiB3aWR0aDtcclxuXHJcbiAgICBjb25zdCBsYWJlbCA9IG5ldyBmYWJyaWMuRmFicmljVGV4dCh0ZXh0LCB7XHJcbiAgICAgIGxlZnQ6IGNlbnRlclgsXHJcbiAgICAgIHRvcDogY2VudGVyWSxcclxuICAgICAgZm9udFNpemU6IDEwLFxyXG4gICAgICBmb250RmFtaWx5OiBcIkludGVyXCIsXHJcbiAgICAgIGZvbnRXZWlnaHQ6IFwiNTAwXCIsXHJcbiAgICAgIGZpbGw6IGxhYmVsQ29sb3IsXHJcbiAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgIGFuZ2xlOiBpc1ZlcnRpY2FsID8gLTkwIDogMCxcclxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBhcnJvd0hlYWQgPSA1O1xyXG4gICAgY29uc3QgZWxlbWVudHM6IGZhYnJpYy5PYmplY3RbXSA9IFt3YWxsLCBsYWJlbF07XHJcblxyXG4gICAgaWYgKGlzVmVydGljYWwpIHtcclxuICAgICAgY29uc3QgdGV4dFdpZHRoID0gbGFiZWwud2lkdGggfHwgMDtcclxuICAgICAgY29uc3QgdG9wQXJyb3dZID0gNTtcclxuICAgICAgY29uc3QgdG9wQXJyb3dFbmRZID0gY2VudGVyWSAtIHRleHRXaWR0aCAvIDIgLSA1O1xyXG5cclxuICAgICAgaWYgKHRvcEFycm93RW5kWSA+IHRvcEFycm93WSArIGFycm93SGVhZCkge1xyXG4gICAgICAgIGVsZW1lbnRzLnB1c2goXHJcbiAgICAgICAgICBuZXcgZmFicmljLkxpbmUoW2NlbnRlclgsIHRvcEFycm93WSwgY2VudGVyWCwgdG9wQXJyb3dFbmRZXSwge1xyXG4gICAgICAgICAgICBzdHJva2U6IGxhYmVsQ29sb3IsXHJcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAxLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgbmV3IGZhYnJpYy5UcmlhbmdsZSh7XHJcbiAgICAgICAgICAgIGxlZnQ6IGNlbnRlclgsXHJcbiAgICAgICAgICAgIHRvcDogdG9wQXJyb3dZLFxyXG4gICAgICAgICAgICB3aWR0aDogYXJyb3dIZWFkLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGFycm93SGVhZCxcclxuICAgICAgICAgICAgYW5nbGU6IDAsXHJcbiAgICAgICAgICAgIGZpbGw6IGxhYmVsQ29sb3IsXHJcbiAgICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgIG9yaWdpblk6IFwiYm90dG9tXCIsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgYm90dG9tQXJyb3dTdGFydFkgPSBjZW50ZXJZICsgdGV4dFdpZHRoIC8gMiArIDU7XHJcbiAgICAgIGNvbnN0IGJvdHRvbUFycm93RW5kWSA9IGhlaWdodCAtIDU7XHJcblxyXG4gICAgICBpZiAoYm90dG9tQXJyb3dFbmRZID4gYm90dG9tQXJyb3dTdGFydFkgKyBhcnJvd0hlYWQpIHtcclxuICAgICAgICBlbGVtZW50cy5wdXNoKFxyXG4gICAgICAgICAgbmV3IGZhYnJpYy5MaW5lKFxyXG4gICAgICAgICAgICBbY2VudGVyWCwgYm90dG9tQXJyb3dTdGFydFksIGNlbnRlclgsIGJvdHRvbUFycm93RW5kWV0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBzdHJva2U6IGxhYmVsQ29sb3IsXHJcbiAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXHJcbiAgICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgbmV3IGZhYnJpYy5UcmlhbmdsZSh7XHJcbiAgICAgICAgICAgIGxlZnQ6IGNlbnRlclgsXHJcbiAgICAgICAgICAgIHRvcDogYm90dG9tQXJyb3dFbmRZLFxyXG4gICAgICAgICAgICB3aWR0aDogYXJyb3dIZWFkLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGFycm93SGVhZCxcclxuICAgICAgICAgICAgYW5nbGU6IDE4MCxcclxuICAgICAgICAgICAgZmlsbDogbGFiZWxDb2xvcixcclxuICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgb3JpZ2luWTogXCJ0b3BcIixcclxuICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCB0ZXh0V2lkdGggPSBsYWJlbC53aWR0aCB8fCAwO1xyXG4gICAgICBjb25zdCBsZWZ0QXJyb3dTdGFydFggPSA1O1xyXG4gICAgICBjb25zdCBsZWZ0QXJyb3dFbmRYID0gY2VudGVyWCAtIHRleHRXaWR0aCAvIDIgLSA1O1xyXG5cclxuICAgICAgaWYgKGxlZnRBcnJvd0VuZFggPiBsZWZ0QXJyb3dTdGFydFggKyBhcnJvd0hlYWQpIHtcclxuICAgICAgICBlbGVtZW50cy5wdXNoKFxyXG4gICAgICAgICAgbmV3IGZhYnJpYy5MaW5lKFtsZWZ0QXJyb3dTdGFydFgsIGNlbnRlclksIGxlZnRBcnJvd0VuZFgsIGNlbnRlclldLCB7XHJcbiAgICAgICAgICAgIHN0cm9rZTogbGFiZWxDb2xvcixcclxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBuZXcgZmFicmljLlRyaWFuZ2xlKHtcclxuICAgICAgICAgICAgbGVmdDogbGVmdEFycm93U3RhcnRYLFxyXG4gICAgICAgICAgICB0b3A6IGNlbnRlclksXHJcbiAgICAgICAgICAgIHdpZHRoOiBhcnJvd0hlYWQsXHJcbiAgICAgICAgICAgIGhlaWdodDogYXJyb3dIZWFkLFxyXG4gICAgICAgICAgICBhbmdsZTogLTkwLFxyXG4gICAgICAgICAgICBmaWxsOiBsYWJlbENvbG9yLFxyXG4gICAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHJpZ2h0QXJyb3dTdGFydFggPSBjZW50ZXJYICsgdGV4dFdpZHRoIC8gMiArIDU7XHJcbiAgICAgIGNvbnN0IHJpZ2h0QXJyb3dFbmRYID0gd2lkdGggLSA1O1xyXG5cclxuICAgICAgaWYgKHJpZ2h0QXJyb3dFbmRYID4gcmlnaHRBcnJvd1N0YXJ0WCArIGFycm93SGVhZCkge1xyXG4gICAgICAgIGVsZW1lbnRzLnB1c2goXHJcbiAgICAgICAgICBuZXcgZmFicmljLkxpbmUoXHJcbiAgICAgICAgICAgIFtyaWdodEFycm93U3RhcnRYLCBjZW50ZXJZLCByaWdodEFycm93RW5kWCwgY2VudGVyWV0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBzdHJva2U6IGxhYmVsQ29sb3IsXHJcbiAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXHJcbiAgICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgbmV3IGZhYnJpYy5UcmlhbmdsZSh7XHJcbiAgICAgICAgICAgIGxlZnQ6IHJpZ2h0QXJyb3dFbmRYLFxyXG4gICAgICAgICAgICB0b3A6IGNlbnRlclksXHJcbiAgICAgICAgICAgIHdpZHRoOiBhcnJvd0hlYWQsXHJcbiAgICAgICAgICAgIGhlaWdodDogYXJyb3dIZWFkLFxyXG4gICAgICAgICAgICBhbmdsZTogOTAsXHJcbiAgICAgICAgICAgIGZpbGw6IGxhYmVsQ29sb3IsXHJcbiAgICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGxvY2tTdmdTdHJpbmcgPSBgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICA8cGF0aCBkPVwiTTcgMTFWN0M3IDUuNjczOTIgNy41MjY3OCA0LjQwMjE1IDguNDY0NDcgMy40NjQ0N0M5LjQwMjE1IDIuNTI2NzggMTAuNjczOSAyIDEyIDJDMTMuMzI2MSAyIDE0LjU5NzkgMi41MjY3OCAxNS41MzU1IDMuNDY0NDdDMTYuNDczMiA0LjQwMjE1IDE3IDUuNjczOTIgMTcgN1YxMU01IDExSDE5QzIwLjEwNDYgMTEgMjEgMTEuODk1NCAyMSAxM1YyMEMyMSAyMS4xMDQ2IDIwLjEwNDYgMjIgMTkgMjJINUMzLjg5NTQzIDIyIDMgMjEuMTA0NiAzIDIwVjEzQzMgMTEuODk1NCAzLjg5NTQzIDExIDUgMTFaXCIgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICA8L3N2Zz5gO1xyXG5cclxuICAgIGxldCBsb2FkZWRTVkc6IGFueSA9IGF3YWl0IGZhYnJpYy5sb2FkU1ZHRnJvbVN0cmluZyhsb2NrU3ZnU3RyaW5nKTtcclxuXHJcbiAgICBsZXQgbG9ja1N2ZyA9IGZhYnJpYy51dGlsLmdyb3VwU1ZHRWxlbWVudHMoXHJcbiAgICAgIGxvYWRlZFNWRy5vYmplY3RzLFxyXG4gICAgICBsb2FkZWRTVkcub3B0aW9ucyxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3Qgd2FsbENlbnRlclggPSB3aWR0aCAvIDI7XHJcbiAgICBjb25zdCB3YWxsQ2VudGVyWSA9IGhlaWdodCAvIDI7XHJcblxyXG4gICAgbG9ja1N2Zy5zY2FsZVRvV2lkdGgoMjApO1xyXG4gICAgbG9ja1N2Zy5zY2FsZVRvSGVpZ2h0KDIwKTtcclxuXHJcbiAgICBpZiAoaXNWZXJ0aWNhbCkge1xyXG4gICAgICBsb2NrU3ZnLnNldCh7XHJcbiAgICAgICAgbGVmdDogd2FsbENlbnRlclgsXHJcbiAgICAgICAgdG9wOiB3YWxsQ2VudGVyWSxcclxuICAgICAgICBhbmdsZTogLTkwLFxyXG4gICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsb2NrU3ZnLnNldCh7XHJcbiAgICAgICAgbGVmdDogd2FsbENlbnRlclgsXHJcbiAgICAgICAgdG9wOiB3YWxsQ2VudGVyWSxcclxuICAgICAgICBhbmdsZTogMCxcclxuICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxvY2tTdmcuc2V0KHtcclxuICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICBldmVudGVkOiB0cnVlLFxyXG4gICAgICBob3ZlckN1cnNvcjogXCJwb2ludGVyXCIsXHJcbiAgICB9KTtcclxuXHJcbiAgICBsb2NrU3ZnLm9uKFwibW91c2Vkb3duXCIsIChvcHQpID0+IHtcclxuICAgICAgaWYgKG9wdCAmJiBvcHQuZSAmJiBvcHQuZS5zdG9wUHJvcGFnYXRpb24pIHtcclxuICAgICAgICBvcHQuZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5sYXlvdXRGb3JtLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICAgIGVsZW1lbnREYXRhLmlzTG9ja2VkID0gIWVsZW1lbnREYXRhPy5pc0xvY2tlZDtcclxuICAgICAgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBlbGVtZW50cy5wdXNoKGxvY2tTdmcpO1xyXG5cclxuICAgIGxldCBtb2RDZW50ZXJYID0geDtcclxuICAgIGxldCBtb2RDZW50ZXJZID0geTtcclxuICAgIGxldCBhbmdsZSA9IGVsZW1lbnREYXRhLmFuZ2xlO1xyXG5cclxuICAgIGNvbnN0IGdyb3VwID0gbmV3IGZhYnJpYy5Hcm91cChlbGVtZW50cywge1xyXG4gICAgICBsZWZ0OiBtb2RDZW50ZXJYLFxyXG4gICAgICB0b3A6IG1vZENlbnRlclksXHJcbiAgICAgIGhhc0NvbnRyb2xzOiB0cnVlLFxyXG4gICAgICBsb2NrU2NhbGluZ1g6IGlzVmVydGljYWwsXHJcbiAgICAgIGxvY2tTY2FsaW5nWTogIWlzVmVydGljYWwsXHJcbiAgICAgIHNlbGVjdGFibGU6IHRoaXMubGF5b3V0Rm9ybS5lbmFibGVkLFxyXG4gICAgICBldmVudGVkOiB0cnVlLFxyXG4gICAgICBob3ZlckN1cnNvcjogXCJwb2ludGVyXCIsXHJcbiAgICAgIGFuZ2xlOiBhbmdsZSxcclxuICAgICAgc3ViVGFyZ2V0Q2hlY2s6IHRydWUsXHJcbiAgICB9KSBhcyBmYWJyaWMuR3JvdXAgJiB7XHJcbiAgICAgIG9ialR5cGU6IHN0cmluZztcclxuICAgICAgZGF0YTogYW55O1xyXG4gICAgfTtcclxuXHJcbiAgICBncm91cC5vYmpUeXBlID0gZWxlbWVudERhdGEuZWxlbWVudFR5cGU7XHJcbiAgICBncm91cC5kYXRhID0gZWxlbWVudERhdGE7XHJcblxyXG4gICAgY2FudmFzLmFkZChncm91cCk7XHJcblxyXG4gICAgLy8gSWYgbmV3bHkgYWRkZWQsIGZvY3VzIGl0IG9uY2VcclxuICAgIGlmICgoZWxlbWVudERhdGEgYXMgYW55KT8ubmV3QWRkZWQpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmNhbnZhcy5zZXRBY3RpdmVPYmplY3QoZ3JvdXApO1xyXG4gICAgICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICAgICAgfSBjYXRjaCB7fVxyXG4gICAgICBkZWxldGUgKGVsZW1lbnREYXRhIGFzIGFueSkubmV3QWRkZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGdyb3VwO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZHJhd0ZpeHR1cmUoXHJcbiAgICBjYW52YXM6IGZhYnJpYy5DYW52YXMsXHJcbiAgICB4OiBudW1iZXIsXHJcbiAgICB5OiBudW1iZXIsXHJcbiAgICBoZWlnaHQ6IG51bWJlcixcclxuICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICBmaXh0dXJlRGF0YTogYW55LFxyXG4gICkge1xyXG4gICAgY29uc3QgYWN0dWFsU2hlbHZlcyA9XHJcbiAgICAgIGZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnPy5maWx0ZXIoKHM6IGFueSkgPT4gcy5zaGVsZlR5cGUgIT0gXCJ2bW9ubHlcIikgPz9cclxuICAgICAgW107XHJcblxyXG4gICAgbGV0IGZpeHR1cmVDb2xvcjogYW55O1xyXG5cclxuICAgIGlmIChmaXh0dXJlRGF0YS5maXh0dXJlTmFtZSA9PT0gXCJzcGFjZVwiKSByZXR1cm47XHJcblxyXG4gICAgLy8gUmVzb2x2ZSB0aGUgYW5nbGUgdGhlIGZpeHR1cmUgZ3JvdXAgd2lsbCByZW5kZXIgYXQuIEZvciBmaXJzdC1yZW5kZXIgb2YgYVxyXG4gICAgLy8gQ0FELXVwbG9hZGVkIGxheW91dCwgdGhlIHdhbGwgYW5nbGUgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aCAob3RoZXJ3aXNlIHdlXHJcbiAgICAvLyBob25vciB0aGUgZml4dHVyZSdzIG93biBzYXZlZCBhbmdsZSkuIFdoZW4gdGhhdCBhbmdsZSBsaWVzIGluIHRoZVxyXG4gICAgLy8gdXBzaWRlLWRvd24gcmFuZ2UgKDkwwrAsIDI3MMKwKSwgd2UgZmxpcCB0aGUgZml4dHVyZSBib2R5IDE4MMKwIGluIHBsYWNlIHNvXHJcbiAgICAvLyBpdCByZW5kZXJzIGNhbm9uaWNhbCAoaGVhZGVyIGF0IHRvcCwgc3RvcmFnZSBhdCBib3R0b20pLiBUaGUgYm9keSBmbGlwXHJcbiAgICAvLyBhbHNvIGJyaW5ncyB0aGUgdGV4dCB1cHJpZ2h0IGFzIGEgc2lkZSBlZmZlY3QsIHNvIG5vIHBlci10ZXh0IHJvdGF0aW9uXHJcbiAgICAvLyBpcyBuZWVkZWQuIFRyYWRlLW9mZjogb24gZmxpcHBlZCB3YWxscyB0aGUgc3RvcmFnZSBib3ggZW5kcyB1cCB2aXN1YWxseVxyXG4gICAgLy8gdG91Y2hpbmcgdGhlIHdhbGwgaW5zdGVhZCBvZiB0aGUgaGVhZGVyLlxyXG4gICAgbGV0IGFuZ2xlID0gZml4dHVyZURhdGE/LnJlbGF0aXZlUG9zaXRpb24/LmFuZ2xlID8/IDA7XHJcbiAgICBpZiAodGhpcy5mbG9vckRhdGEuY2FkTGF5b3V0ICYmIGZpeHR1cmVEYXRhLmZpeHR1cmVUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICBjb25zdCB3YWxsRGF0YSA9IHRoaXMuZ2V0V2FsbEJ5TnVtYmVyKFxyXG4gICAgICAgIGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50TnVtYmVyLFxyXG4gICAgICApO1xyXG4gICAgICBhbmdsZSA9IHdhbGxEYXRhPy5hbmdsZSA/PyAwO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm9ybUFuZ2xlID0gKCgoKGFuZ2xlIGFzIG51bWJlcikgJSAzNjApICsgMzYwKSAlIDM2MCk7XHJcbiAgICBjb25zdCBzaG91bGRGbGlwQm9keSA9XHJcbiAgICAgIHRoaXMuZmxvb3JEYXRhLmNhZExheW91dCAmJlxyXG4gICAgICBmaXh0dXJlRGF0YS5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCIgJiZcclxuICAgICAgbm9ybUFuZ2xlID4gOTAgJiZcclxuICAgICAgbm9ybUFuZ2xlIDwgMjcwO1xyXG5cclxuICAgIC8vIFRvIHJvdGF0ZSB0aGUgYm9keSAxODDCsCB3aGlsZSBrZWVwaW5nIHRoZSBzYW1lIG9uLWNhbnZhcyByZWdpb24sIHNoaWZ0XHJcbiAgICAvLyB0aGUgYW5jaG9yIGJ5IFIob3JpZ2luYWxBbmdsZSnCtyh3aWR0aCwgaGVpZ2h0KSDigJQgdGhhdCdzIHRoZSBjYW52YXNcclxuICAgIC8vIHBvc2l0aW9uIG9mIHRoZSB1bi1yb3RhdGVkIGJib3gncyBib3R0b20tcmlnaHQgY29ybmVyIHJlbGF0aXZlIHRvIHRoZVxyXG4gICAgLy8gYW5jaG9yIOKAlCBhbmQgYWRkIDE4MMKwIHRvIHRoZSByb3RhdGlvbi4gZmFicmljIHN0aWxsIHBpdm90cyBhcm91bmRcclxuICAgIC8vIHRvcC1sZWZ0IG9mIHRoZSB1bi1yb3RhdGVkIGJib3ggYXQgdGhlIG5ldyBhbmNob3IuXHJcbiAgICBsZXQgcmVuZGVyWCA9IHg7XHJcbiAgICBsZXQgcmVuZGVyWSA9IHk7XHJcbiAgICBsZXQgcmVuZGVyQW5nbGUgPSBhbmdsZSBhcyBudW1iZXI7XHJcbiAgICBpZiAoc2hvdWxkRmxpcEJvZHkpIHtcclxuICAgICAgY29uc3QgcmFkID0gKChhbmdsZSBhcyBudW1iZXIpICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICAgIGNvbnN0IGNvc0EgPSBNYXRoLmNvcyhyYWQpO1xyXG4gICAgICBjb25zdCBzaW5BID0gTWF0aC5zaW4ocmFkKTtcclxuICAgICAgcmVuZGVyWCA9IHggKyBjb3NBICogd2lkdGggLSBzaW5BICogaGVpZ2h0O1xyXG4gICAgICByZW5kZXJZID0geSArIHNpbkEgKiB3aWR0aCArIGNvc0EgKiBoZWlnaHQ7XHJcbiAgICAgIHJlbmRlckFuZ2xlID0gKGFuZ2xlIGFzIG51bWJlcikgKyAxODA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmFkaXVzID0gNTtcclxuICAgIGNvbnN0IG1haW5Db250YWluZXIgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICBsZWZ0OiB4LFxyXG4gICAgICB0b3A6IHksXHJcbiAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXHJcbiAgICAgIHJ4OiByYWRpdXMsXHJcbiAgICAgIHJ5OiByYWRpdXMsXHJcbiAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5ID8/IFwiIzUxQzFGRlwiLFxyXG4gICAgICBzdHJva2VXaWR0aDogMC4yNyxcclxuICAgICAgZmlsbDogXCJ3aGl0ZVwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgdG9wV2lkdGggPSB3aWR0aCAvIDEuMDU7XHJcbiAgICBjb25zdCB0b3BIZWlnaHQgPSAoMTUgLyAxMDApICogaGVpZ2h0O1xyXG4gICAgY29uc3QgdG9wWCA9IHggKyAod2lkdGggLSB0b3BXaWR0aCkgLyAyO1xyXG4gICAgY29uc3QgdG9wWSA9IHkgKyB0aGlzLnZlcnRpY2FsTWFyZ2luO1xyXG5cclxuICAgIGNvbnN0IHRvcENvbnRhaW5lciA9IG5ldyBmYWJyaWMuUmVjdCh7XHJcbiAgICAgIGxlZnQ6IHRvcFgsXHJcbiAgICAgIHRvcDogdG9wWSxcclxuICAgICAgd2lkdGg6IHRvcFdpZHRoLFxyXG4gICAgICBoZWlnaHQ6IHRvcEhlaWdodCxcclxuICAgICAgcng6IHJhZGl1cyxcclxuICAgICAgcnk6IHJhZGl1cyxcclxuICAgICAgc3Ryb2tlOiBmaXh0dXJlQ29sb3I/LnByaW1hcnkgPz8gXCIjNTFDMUZGXCIsXHJcbiAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICBmaWxsOiBcIndoaXRlXCIsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBpbm5lckJveEhlaWdodCA9IHRvcEhlaWdodCAvIDI7XHJcbiAgICBjb25zdCBpbm5lclRvcEJveCA9IG5ldyBmYWJyaWMuUGF0aChcclxuICAgICAgYE0gJHt0b3BYICsgcmFkaXVzfSAke3RvcFl9IFxyXG4gICAgICAgICBMICR7dG9wWCArIHRvcFdpZHRoIC0gcmFkaXVzfSAke3RvcFl9IFxyXG4gICAgICAgICBRICR7dG9wWCArIHRvcFdpZHRofSAke3RvcFl9ICR7dG9wWCArIHRvcFdpZHRofSAke3RvcFkgKyByYWRpdXN9IFxyXG4gICAgICAgICBMICR7dG9wWCArIHRvcFdpZHRofSAke3RvcFkgKyBpbm5lckJveEhlaWdodH0gXHJcbiAgICAgICAgIEwgJHt0b3BYfSAke3RvcFkgKyBpbm5lckJveEhlaWdodH0gXHJcbiAgICAgICAgIEwgJHt0b3BYfSAke3RvcFkgKyByYWRpdXN9IFxyXG4gICAgICAgICBRICR7dG9wWH0gJHt0b3BZfSAke3RvcFggKyByYWRpdXN9ICR7dG9wWX0gWmAsXHJcbiAgICAgIHtcclxuICAgICAgICBzdHJva2U6IGZpeHR1cmVDb2xvcj8ucHJpbWFyeSA/PyBcIiM1MUMxRkZcIixcclxuICAgICAgICBzdHJva2VXaWR0aDogMC4yNyxcclxuICAgICAgICBmaWxsOiBcInRyYW5zcGFyZW50XCIsXHJcbiAgICAgIH0sXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHRvcEZpZWxkVGV4dCA9XHJcbiAgICAgIChmaXh0dXJlRGF0YS5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCJcclxuICAgICAgICA/IGBXYWxsLSR7Zml4dHVyZURhdGEuYXNzb2NpYXRlZEVsZW1lbnROdW1iZXJ9IC0gYFxyXG4gICAgICAgIDogXCJGbG9vciAtIFwiKSArXHJcbiAgICAgIGBGaXh0dXJlICR7XHJcbiAgICAgICAgZml4dHVyZURhdGEuYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyXHJcbiAgICAgICAgICA/IGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlciArXHJcbiAgICAgICAgICAgIChmaXh0dXJlRGF0YT8uZml4dHVyZU51bWJlclxyXG4gICAgICAgICAgICAgID8gXCIgLSBGWC1cIiArIGZpeHR1cmVEYXRhLmZpeHR1cmVOdW1iZXJcclxuICAgICAgICAgICAgICA6IFwiXCIpXHJcbiAgICAgICAgICA6IFwibmV3XCJcclxuICAgICAgfWA7XHJcblxyXG4gICAgY29uc3QgdG9wVGV4dCA9IG5ldyBmYWJyaWMuVGV4dGJveCh0b3BGaWVsZFRleHQsIHtcclxuICAgICAgbGVmdDogdG9wWCArIHRvcFdpZHRoIC8gMixcclxuICAgICAgdG9wOiB0b3BZICsgaW5uZXJCb3hIZWlnaHQgLyAyLFxyXG4gICAgICBmb250U2l6ZTogNSxcclxuICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICBmb250V2VpZ2h0OiBcIjUwMFwiLFxyXG4gICAgICBmaWxsOiBcIiMxMDE4MjhcIixcclxuICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgd2lkdGg6IHRvcFdpZHRoLFxyXG4gICAgICBoZWlnaHQ6IGlubmVyQm94SGVpZ2h0LFxyXG4gICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzZWNvbmRCb3hZID0gdG9wWSArIGlubmVyQm94SGVpZ2h0O1xyXG5cclxuICAgIGNvbnN0IGlubmVyQm90dG9tQm94ID0gbmV3IGZhYnJpYy5QYXRoKFxyXG4gICAgICBgTSAke3RvcFh9ICR7c2Vjb25kQm94WX0gXHJcbiAgICAgTCAke3RvcFggKyB0b3BXaWR0aH0gJHtzZWNvbmRCb3hZfSBcclxuICAgICBMICR7dG9wWCArIHRvcFdpZHRofSAke3NlY29uZEJveFkgKyBpbm5lckJveEhlaWdodCAtIHJhZGl1c30gXHJcbiAgICAgUSAke3RvcFggKyB0b3BXaWR0aH0gJHtzZWNvbmRCb3hZICsgaW5uZXJCb3hIZWlnaHR9ICR7XHJcbiAgICAgICB0b3BYICsgdG9wV2lkdGggLSByYWRpdXNcclxuICAgICB9ICR7c2Vjb25kQm94WSArIGlubmVyQm94SGVpZ2h0fSBcclxuICAgICBMICR7dG9wWCArIHJhZGl1c30gJHtzZWNvbmRCb3hZICsgaW5uZXJCb3hIZWlnaHR9IFxyXG4gICAgIFEgJHt0b3BYfSAke3NlY29uZEJveFkgKyBpbm5lckJveEhlaWdodH0gJHt0b3BYfSAke1xyXG4gICAgICAgc2Vjb25kQm94WSArIGlubmVyQm94SGVpZ2h0IC0gcmFkaXVzXHJcbiAgICAgfSBcclxuICAgICBMICR7dG9wWH0gJHtzZWNvbmRCb3hZfSBaYCxcclxuICAgICAge1xyXG4gICAgICAgIGZpbGw6IFwiIzM0NDA1NFwiLFxyXG4gICAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5ID8/IFwiIzUxQzFGRlwiLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgZm9udFNpemUgPSA1O1xyXG4gICAgbGV0IGJvdHRvbVRleHQ7XHJcblxyXG4gICAgY29uc3QgdGV4dENvbnRlbnQgPSBnZXRGaXh0dXJlQ2FudmFzTGFiZWwoZml4dHVyZURhdGEpO1xyXG5cclxuICAgIGNvbnN0IGNyZWF0ZUJvdHRvbVRleHQgPSAoZnM6IGFueSkgPT5cclxuICAgICAgbmV3IGZhYnJpYy5UZXh0Ym94KHRleHRDb250ZW50LCB7XHJcbiAgICAgICAgbGVmdDogdG9wWCArIHRvcFdpZHRoIC8gMixcclxuICAgICAgICB0b3A6IHNlY29uZEJveFkgKyBpbm5lckJveEhlaWdodCAvIDIsXHJcbiAgICAgICAgZm9udFNpemU6IGZzLFxyXG4gICAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgICBmb250V2VpZ2h0OiBcIjUwMFwiLFxyXG4gICAgICAgIGZpbGw6IFwiI0ZGRkZGRlwiLFxyXG4gICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgICAgd2lkdGg6IHRvcFdpZHRoLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICBkbyB7XHJcbiAgICAgIGJvdHRvbVRleHQgPSBjcmVhdGVCb3R0b21UZXh0KGZvbnRTaXplKTtcclxuICAgICAgZm9udFNpemUgLT0gMC41O1xyXG4gICAgfSB3aGlsZSAoYm90dG9tVGV4dC5oZWlnaHQgPiBpbm5lckJveEhlaWdodCAmJiBmb250U2l6ZSA+IDIpO1xyXG5cclxuICAgIGNvbnN0IG1pZFdpZHRoID0gd2lkdGggLyAxLjA1O1xyXG4gICAgY29uc3QgbWlkSGVpZ2h0ID0gKDc3IC8gMTAwKSAqIGhlaWdodDtcclxuICAgIGNvbnN0IG1pZFggPSB4ICsgKHdpZHRoIC0gbWlkV2lkdGgpIC8gMjtcclxuICAgIGNvbnN0IG1pZFkgPSB0b3BZICsgdG9wSGVpZ2h0ICsgdGhpcy52ZXJ0aWNhbE1hcmdpbjtcclxuXHJcbiAgICBjb25zdCBtaWRDb250YWluZXIgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICBsZWZ0OiBtaWRYLFxyXG4gICAgICB0b3A6IG1pZFksXHJcbiAgICAgIHdpZHRoOiBtaWRXaWR0aCxcclxuICAgICAgaGVpZ2h0OiBtaWRIZWlnaHQsXHJcbiAgICAgIHJ4OiByYWRpdXMsXHJcbiAgICAgIHJ5OiByYWRpdXMsXHJcbiAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5ID8/IFwiIzUxQzFGRlwiLFxyXG4gICAgICBzdHJva2VXaWR0aDogMC4yNyxcclxuICAgICAgZmlsbDogXCJ3aGl0ZVwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc2hlbGZDb3VudCA9IGZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnPy5sZW5ndGg7XHJcbiAgICBjb25zdCBib3hIZWlnaHQgPSBtaWRIZWlnaHQgLyAoc2hlbGZDb3VudCArIDIpO1xyXG4gICAgY29uc3QgZmlyc3RCb3hZID0gbWlkWTtcclxuXHJcbiAgICBjb25zdCBmaXJzdEJveCA9IG5ldyBmYWJyaWMuUGF0aChcclxuICAgICAgYE0gJHttaWRYICsgcmFkaXVzfSAke2ZpcnN0Qm94WX0gXHJcbiAgICAgICAgIEwgJHttaWRYICsgbWlkV2lkdGggLSByYWRpdXN9ICR7Zmlyc3RCb3hZfSBcclxuICAgICAgICAgUSAke21pZFggKyBtaWRXaWR0aH0gJHtmaXJzdEJveFl9ICR7bWlkWCArIG1pZFdpZHRofSAke1xyXG4gICAgICAgICAgIGZpcnN0Qm94WSArIHJhZGl1c1xyXG4gICAgICAgICB9IFxyXG4gICAgICAgICBMICR7bWlkWCArIG1pZFdpZHRofSAke2ZpcnN0Qm94WSArIGJveEhlaWdodH0gXHJcbiAgICAgICAgIEwgJHttaWRYfSAke2ZpcnN0Qm94WSArIGJveEhlaWdodH0gXHJcbiAgICAgICAgIEwgJHttaWRYfSAke2ZpcnN0Qm94WSArIHJhZGl1c30gXHJcbiAgICAgICAgIFEgJHttaWRYfSAke2ZpcnN0Qm94WX0gJHttaWRYICsgcmFkaXVzfSAke2ZpcnN0Qm94WX0gWmAsXHJcbiAgICAgIHtcclxuICAgICAgICBmaWxsOiBmaXh0dXJlQ29sb3I/LmZpbGxcclxuICAgICAgICAgID8gZml4dHVyZUNvbG9yPy5maWxsXHJcbiAgICAgICAgICA6IChmaXh0dXJlRGF0YS5oZWFkZXJJbnZhbGlkIHx8IGZpeHR1cmVEYXRhLmxpYnJhcnlJbnZhbGlkKVxyXG4gICAgICAgICAgICA/IFwiI0Q5MkQyMFwiXHJcbiAgICAgICAgICAgIDogXCIjRUFGOEZGXCIsXHJcbiAgICAgICAgc3Ryb2tlOiBmaXh0dXJlQ29sb3I/LnByaW1hcnlcclxuICAgICAgICAgID8gZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICA6IChmaXh0dXJlRGF0YS5oZWFkZXJJbnZhbGlkIHx8IGZpeHR1cmVEYXRhLmxpYnJhcnlJbnZhbGlkKVxyXG4gICAgICAgICAgICA/IFwiI0Q5MkQyMFwiXHJcbiAgICAgICAgICAgIDogXCIjNkJDQUZGXCIsXHJcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDAuMjcsXHJcbiAgICAgIH0sXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGZpcnN0Qm94VGV4dCA9IG5ldyBmYWJyaWMuVGV4dGJveChcclxuICAgICAgYCR7Zml4dHVyZURhdGE/LmhlYWRlcj8ubGFiZWwgPyBmaXh0dXJlRGF0YS5oZWFkZXIubGFiZWwgOiBcIlwifWAsXHJcbiAgICAgIHtcclxuICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLyAyLFxyXG4gICAgICAgIHRvcDogZmlyc3RCb3hZICsgYm94SGVpZ2h0IC8gMixcclxuICAgICAgICBmb250U2l6ZTogNyxcclxuICAgICAgICBmb250RmFtaWx5OiBcIkludGVyXCIsXHJcbiAgICAgICAgZm9udFdlaWdodDogXCI2MDBcIixcclxuICAgICAgICBmaWxsOiAoZml4dHVyZURhdGEuaGVhZGVySW52YWxpZCB8fCBmaXh0dXJlRGF0YS5saWJyYXJ5SW52YWxpZCkgPyBcIiNmZmZcIiA6IFwiIzEwMTgyOFwiLFxyXG4gICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICB3aWR0aDogbWlkV2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiBib3hIZWlnaHQsXHJcbiAgICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBzaGVsdmVzID0gW107XHJcbiAgICBjb25zdCBzaGVsZkhlaWdodCA9IG1pZEhlaWdodCAtIDIgKiBib3hIZWlnaHQ7XHJcblxyXG4gICAgaWYgKGZpeHR1cmVEYXRhLnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgPT09IFwiTDFcIikge1xyXG4gICAgICBjb25zdCBib3hZID0gZmlyc3RCb3hZICsgYm94SGVpZ2h0O1xyXG5cclxuICAgICAgY29uc3Qgc2hlbGYgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICAgIGxlZnQ6IG1pZFgsXHJcbiAgICAgICAgdG9wOiBib3hZLFxyXG4gICAgICAgIHdpZHRoOiBtaWRXaWR0aCxcclxuICAgICAgICBoZWlnaHQ6IHNoZWxmSGVpZ2h0LFxyXG4gICAgICAgIC8vIHN0cm9rZTogJyM1MUMxRkYnLFxyXG4gICAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICA/IGZpeHR1cmVDb2xvcj8ucHJpbWFyeVxyXG4gICAgICAgICAgOiAoZml4dHVyZURhdGEuaGVhZGVySW52YWxpZCB8fCBmaXh0dXJlRGF0YS5saWJyYXJ5SW52YWxpZClcclxuICAgICAgICAgICAgPyBcIiNEOTJEMjBcIlxyXG4gICAgICAgICAgICA6IFwiIzUxQzFGRlwiLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICAgIGZpbGw6IFwid2hpdGVcIixcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCB0ZXh0ID0gZml4dHVyZURhdGE/LnByb2R1Y3RCcmFuZE5hbWU/LmpvaW4oXCIgKyBcIikgfHwgXCJcIjtcclxuXHJcbiAgICAgIC8vIFdyYXAgdGV4dCB3aXRoaW4gZml4dHVyZSB3aWR0aCBhbmQgc2hyaW5rIHRvIGZpdCB2ZXJ0aWNhbCBzcGFjZVxyXG4gICAgICBjb25zdCBtYXhUZXh0V2lkdGggPSBtaWRXaWR0aCAqIDAuOTtcclxuICAgICAgY29uc3QgbWF4VGV4dEhlaWdodCA9IHNoZWxmSGVpZ2h0ICogMC44O1xyXG4gICAgICBsZXQgZm9udFNpemVMMSA9IDY7XHJcblxyXG4gICAgICBjb25zdCBjcmVhdGVXcmFwcGVkVGV4dGJveCA9IChmczogbnVtYmVyKSA9PlxyXG4gICAgICAgIG5ldyBmYWJyaWMuVGV4dGJveCh0ZXh0LCB7XHJcbiAgICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLyAyLFxyXG4gICAgICAgICAgdG9wOiBib3hZICsgc2hlbGZIZWlnaHQgLyAyLFxyXG4gICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICB3aWR0aDogbWF4VGV4dFdpZHRoLFxyXG4gICAgICAgICAgZm9udFNpemU6IGZzLFxyXG4gICAgICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICAgICAgZm9udFdlaWdodDogXCI1MDBcIixcclxuICAgICAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcclxuICAgICAgICAgIGZpbGw6IFwiIzMzM1wiLFxyXG4gICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIGxldCB3cmFwcGVkVGV4dCA9IGNyZWF0ZVdyYXBwZWRUZXh0Ym94KGZvbnRTaXplTDEpO1xyXG4gICAgICB3aGlsZSAod3JhcHBlZFRleHQuaGVpZ2h0ID4gbWF4VGV4dEhlaWdodCAmJiBmb250U2l6ZUwxID4gMikge1xyXG4gICAgICAgIGZvbnRTaXplTDEgLT0gMC41O1xyXG4gICAgICAgIHdyYXBwZWRUZXh0ID0gY3JlYXRlV3JhcHBlZFRleHRib3goZm9udFNpemVMMSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHBhZGRpbmcgPSAyO1xyXG4gICAgICBjb25zdCBiYWNrZ3JvdW5kID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLyAyLFxyXG4gICAgICAgIHRvcDogYm94WSArIHNoZWxmSGVpZ2h0IC8gMixcclxuICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgd2lkdGg6IE1hdGgubWluKG1heFRleHRXaWR0aCwgd3JhcHBlZFRleHQud2lkdGghKSArIHBhZGRpbmcsXHJcbiAgICAgICAgaGVpZ2h0OiB3cmFwcGVkVGV4dC5nZXRTY2FsZWRIZWlnaHQoKSArIDIsXHJcbiAgICAgICAgZmlsbDogXCJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSlcIixcclxuICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICByeDogMSxcclxuICAgICAgICByeTogMSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBzaGVsdmVzLnB1c2goc2hlbGYsIGJhY2tncm91bmQsIHdyYXBwZWRUZXh0KTtcclxuICAgIH0gZWxzZSBpZiAoZml4dHVyZURhdGEucHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gXCJMMlwiKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hlbGZDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgYm94WSA9IGZpcnN0Qm94WSArIGJveEhlaWdodCAqIChpICsgMSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNoZWxmID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgICAgIGxlZnQ6IG1pZFgsXHJcbiAgICAgICAgICB0b3A6IGJveFksXHJcbiAgICAgICAgICB3aWR0aDogbWlkV2lkdGgsXHJcbiAgICAgICAgICBoZWlnaHQ6IGJveEhlaWdodCxcclxuICAgICAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICAgID8gZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICAgIDogKGZpeHR1cmVEYXRhLmhlYWRlckludmFsaWQgfHwgZml4dHVyZURhdGEubGlicmFyeUludmFsaWQpXHJcbiAgICAgICAgICAgICAgPyBcIiNEOTJEMjBcIlxyXG4gICAgICAgICAgICAgIDogXCIjNTFDMUZGXCIsXHJcbiAgICAgICAgICBzdHJva2VXaWR0aDogMC4yNyxcclxuICAgICAgICAgIGZpbGw6IFwid2hpdGVcIixcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc2hlbHZlcy5wdXNoKHNoZWxmKTtcclxuXHJcbiAgICAgICAgaWYgKGZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnPy5baV0uc2hlbGZUeXBlID09PSBcInRyYXlcIikge1xyXG4gICAgICAgICAgY29uc3QgdHJheVJvd3MgPSBmaXh0dXJlRGF0YS5zaGVsZkNvbmZpZz8uW2ldLnRyYXlSb3dzIHx8IDE7XHJcbiAgICAgICAgICBjb25zdCByb3dTcGFjaW5nID0gYm94SGVpZ2h0IC8gdHJheVJvd3M7XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgciA9IDE7IHIgPCB0cmF5Um93czsgcisrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVZID0gYm94WSArIHIgKiByb3dTcGFjaW5nO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdHJheUxpbmUgPSBuZXcgZmFicmljLkxpbmUoXHJcbiAgICAgICAgICAgICAgW21pZFgsIGxpbmVZLCBtaWRYICsgbWlkV2lkdGgsIGxpbmVZXSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzdHJva2U6IFwiIzk5OVwiLFxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDAuMixcclxuICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHNoZWx2ZXMucHVzaCh0cmF5TGluZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0ZXh0ID1cclxuICAgICAgICAgIGZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnPy5baV0ucHJvZHVjdEJyYW5kTmFtZT8uam9pbihcIiArIFwiKSB8fCBcIlwiO1xyXG5cclxuICAgICAgICAvLyBMMjogU2luZ2xlLWxpbmUgZWxsaXBzaXMgYWdhaW5zdCBmdWxsIHNoZWxmIHdpZHRoXHJcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbFBhZGRpbmcgPSA2O1xyXG4gICAgICAgIGNvbnN0IG1heFRleHRXaWR0aCA9IE1hdGgubWF4KDAsIG1pZFdpZHRoIC0gaG9yaXpvbnRhbFBhZGRpbmcpO1xyXG4gICAgICAgIGNvbnN0IG1heFRleHRIZWlnaHQgPSBib3hIZWlnaHQgKiAwLjg7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbnRTaXplID0gNTtcclxuXHJcbiAgICAgICAgY29uc3QgbWVhc3VyZSA9ICh0OiBzdHJpbmcpID0+XHJcbiAgICAgICAgICBuZXcgZmFicmljLlRleHQodCwge1xyXG4gICAgICAgICAgICBmb250U2l6ZTogYmFzZUZvbnRTaXplLFxyXG4gICAgICAgICAgICBmb250RmFtaWx5OiBcIkludGVyXCIsXHJcbiAgICAgICAgICAgIGZvbnRXZWlnaHQ6IFwiNTAwXCIsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IGRpc3BsYXlUZXh0ID0gdGV4dDtcclxuICAgICAgICBsZXQgbWVhc3VyZWQgPSBtZWFzdXJlKGRpc3BsYXlUZXh0KTtcclxuXHJcbiAgICAgICAgaWYgKChtZWFzdXJlZC53aWR0aCA/PyAwKSA+IG1heFRleHRXaWR0aCkge1xyXG4gICAgICAgICAgY29uc3QgZWxsaXBzaXMgPSBcIi4uLlwiO1xyXG4gICAgICAgICAgbGV0IGxlZnRJZHggPSAwO1xyXG4gICAgICAgICAgbGV0IHJpZ2h0SWR4ID0gdGV4dC5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgd2hpbGUgKGxlZnRJZHggPCByaWdodElkeCkge1xyXG4gICAgICAgICAgICBjb25zdCBtaWRJZHggPSBNYXRoLmZsb29yKChsZWZ0SWR4ICsgcmlnaHRJZHgpIC8gMik7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHRleHQuc2xpY2UoMCwgbWlkSWR4KSArIGVsbGlwc2lzO1xyXG4gICAgICAgICAgICBtZWFzdXJlZCA9IG1lYXN1cmUoY2FuZGlkYXRlKTtcclxuICAgICAgICAgICAgaWYgKChtZWFzdXJlZC53aWR0aCA/PyAwKSA+IG1heFRleHRXaWR0aCkge1xyXG4gICAgICAgICAgICAgIHJpZ2h0SWR4ID0gbWlkSWR4O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxlZnRJZHggPSBtaWRJZHggKyAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkaXNwbGF5VGV4dCA9IHRleHQuc2xpY2UoMCwgTWF0aC5tYXgoMCwgbGVmdElkeCAtIDEpKSArIGVsbGlwc2lzO1xyXG4gICAgICAgICAgbWVhc3VyZWQgPSBtZWFzdXJlKGRpc3BsYXlUZXh0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGJhY2tncm91bmQgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICAgICAgbGVmdDogbWlkWCArIG1pZFdpZHRoIC8gMixcclxuICAgICAgICAgIHRvcDogYm94WSArIGJveEhlaWdodCAvIDIsXHJcbiAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICAgIHdpZHRoOiBtaWRXaWR0aCxcclxuICAgICAgICAgIGhlaWdodDogTWF0aC5taW4obWF4VGV4dEhlaWdodCwgbWVhc3VyZWQuaGVpZ2h0ID8/IDEwKSArIDIsXHJcbiAgICAgICAgICBmaWxsOiBcInJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KVwiLFxyXG4gICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgIHJ4OiAxLFxyXG4gICAgICAgICAgcnk6IDEsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZpbmFsVGV4dCA9IG5ldyBmYWJyaWMuVGV4dChkaXNwbGF5VGV4dCwge1xyXG4gICAgICAgICAgbGVmdDogbWlkWCArIG1pZFdpZHRoIC8gMixcclxuICAgICAgICAgIHRvcDogYm94WSArIGJveEhlaWdodCAvIDIsXHJcbiAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICAgIGZvbnRTaXplOiBiYXNlRm9udFNpemUsXHJcbiAgICAgICAgICBmb250RmFtaWx5OiBcIkludGVyXCIsXHJcbiAgICAgICAgICBmb250V2VpZ2h0OiBcIjUwMFwiLFxyXG4gICAgICAgICAgZmlsbDogXCIjMzMzXCIsXHJcbiAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzaGVsdmVzLnB1c2goYmFja2dyb3VuZCwgZmluYWxUZXh0KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChmaXh0dXJlRGF0YS5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSBcIkwzXCIpIHtcclxuICAgICAgY29uc3Qgc2VxdWVudGlhbEdyb3VwczogeyB6b25lOiBzdHJpbmc7IHNoZWx2ZXM6IGFueVtdIH1bXSA9IFtdO1xyXG5cclxuICAgICAgbGV0IHByZXZpb3VzWm9uZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IHNoZWxmIG9mIGZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnKSB7XHJcbiAgICAgICAgY29uc3Qgem9uZSA9IHNoZWxmLnpvbmUgfHwgXCJVbmtub3duXCI7XHJcbiAgICAgICAgaWYgKHpvbmUgIT09IHByZXZpb3VzWm9uZSkge1xyXG4gICAgICAgICAgc2VxdWVudGlhbEdyb3Vwcy5wdXNoKHsgem9uZSwgc2hlbHZlczogW3NoZWxmXSB9KTtcclxuICAgICAgICAgIHByZXZpb3VzWm9uZSA9IHpvbmU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNlcXVlbnRpYWxHcm91cHNbc2VxdWVudGlhbEdyb3Vwcy5sZW5ndGggLSAxXS5zaGVsdmVzLnB1c2goc2hlbGYpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGN1cnJlbnRTaGVsZkluZGV4ID0gMDtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2Ygc2VxdWVudGlhbEdyb3Vwcykge1xyXG4gICAgICAgIGNvbnN0IHsgem9uZSwgc2hlbHZlczogc2hlbHZlc0luR3JvdXAgfSA9IGdyb3VwO1xyXG5cclxuICAgICAgICBjb25zdCBncm91cFN0YXJ0SW5kZXggPSBjdXJyZW50U2hlbGZJbmRleDtcclxuICAgICAgICBjb25zdCBncm91cExlbmd0aCA9IHNoZWx2ZXNJbkdyb3VwLmxlbmd0aDtcclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBUb3BZID0gZmlyc3RCb3hZICsgYm94SGVpZ2h0ICogKGdyb3VwU3RhcnRJbmRleCArIDEpO1xyXG4gICAgICAgIGNvbnN0IGdyb3VwQm90dG9tWSA9IGdyb3VwVG9wWSArIGJveEhlaWdodCAqIGdyb3VwTGVuZ3RoO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNoZWx2ZXNJbkdyb3VwLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICBjb25zdCBzaGVsZkRhdGEgPSBzaGVsdmVzSW5Hcm91cFtqXTtcclxuICAgICAgICAgIGNvbnN0IGJveFkgPSBmaXJzdEJveFkgKyBib3hIZWlnaHQgKiAoY3VycmVudFNoZWxmSW5kZXggKyAxKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzaGVsZlJlY3QgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICAgICAgICBsZWZ0OiBtaWRYLFxyXG4gICAgICAgICAgICB0b3A6IGJveFksXHJcbiAgICAgICAgICAgIHdpZHRoOiBtaWRXaWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBib3hIZWlnaHQsXHJcbiAgICAgICAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICAgICAgPyBmaXh0dXJlQ29sb3I/LnByaW1hcnlcclxuICAgICAgICAgICAgICA6IChmaXh0dXJlRGF0YS5oZWFkZXJJbnZhbGlkIHx8IGZpeHR1cmVEYXRhLmxpYnJhcnlJbnZhbGlkKVxyXG4gICAgICAgICAgICAgICAgPyBcIiNEOTJEMjBcIlxyXG4gICAgICAgICAgICAgICAgOiBcIiM1MUMxRkZcIixcclxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDAuMjcsXHJcbiAgICAgICAgICAgIGZpbGw6IFwid2hpdGVcIixcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHNoZWx2ZXMucHVzaChzaGVsZlJlY3QpO1xyXG5cclxuICAgICAgICAgIGlmIChzaGVsZkRhdGEuc2hlbGZUeXBlID09PSBcInRyYXlcIikge1xyXG4gICAgICAgICAgICBjb25zdCB0cmF5Um93cyA9IHNoZWxmRGF0YS50cmF5Um93cyB8fCAwO1xyXG4gICAgICAgICAgICBjb25zdCBwcm9kdWN0UGVyU2hlbGYgPSBzaGVsZkRhdGEucHJvZHVjdFBlclNoZWxmIHx8IDA7XHJcblxyXG4gICAgICAgICAgICBjb25zdCByb3dTcGFjaW5nID0gYm94SGVpZ2h0IC8gdHJheVJvd3M7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtblNwYWNpbmcgPSBtaWRXaWR0aCAvIHByb2R1Y3RQZXJTaGVsZjtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IHIgPSAxOyByIDwgdHJheVJvd3M7IHIrKykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGxpbmVZID0gYm94WSArIHIgKiByb3dTcGFjaW5nO1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCB0cmF5TGluZSA9IG5ldyBmYWJyaWMuTGluZShcclxuICAgICAgICAgICAgICAgIFttaWRYLCBsaW5lWSwgbWlkWCArIG1pZFdpZHRoLCBsaW5lWV0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZTogXCIjOTk5XCIsXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAwLjIsXHJcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgc2hlbHZlcy5wdXNoKHRyYXlMaW5lKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDE7IGMgPCBwcm9kdWN0UGVyU2hlbGY7IGMrKykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGxpbmVYID0gbWlkWCArIGMgKiBjb2x1bW5TcGFjaW5nO1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbExpbmUgPSBuZXcgZmFicmljLkxpbmUoXHJcbiAgICAgICAgICAgICAgICBbbGluZVgsIGJveFksIGxpbmVYLCBib3hZICsgYm94SGVpZ2h0XSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBcIiM5OTlcIixcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDAuMixcclxuICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICBzaGVsdmVzLnB1c2godmVydGljYWxMaW5lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGN1cnJlbnRTaGVsZkluZGV4Kys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBncm91cEJvdHRvbUxpbmUgPSBuZXcgZmFicmljLkxpbmUoXHJcbiAgICAgICAgICBbbWlkWCwgZ3JvdXBCb3R0b21ZLCBtaWRYICsgbWlkV2lkdGgsIGdyb3VwQm90dG9tWV0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICAgICAgPyBmaXh0dXJlQ29sb3I/LnByaW1hcnlcclxuICAgICAgICAgICAgICA6IChmaXh0dXJlRGF0YS5oZWFkZXJJbnZhbGlkIHx8IGZpeHR1cmVEYXRhLmxpYnJhcnlJbnZhbGlkKVxyXG4gICAgICAgICAgICAgICAgPyBcIiNEOTJEMjBcIlxyXG4gICAgICAgICAgICAgICAgOiBcIiM1MUMxRkZcIixcclxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgc2hlbHZlcy5wdXNoKGdyb3VwQm90dG9tTGluZSk7XHJcblxyXG4gICAgICAgIGlmIChmaXh0dXJlRGF0YS5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICAgIGNvbnN0IGxhYmVsUGFkZGluZyA9IDI7XHJcbiAgICAgICAgICBjb25zdCBsYWJlbFRleHQgPSBuZXcgZmFicmljLlRleHRib3goem9uZSwge1xyXG4gICAgICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLSBsYWJlbFBhZGRpbmcsXHJcbiAgICAgICAgICAgIHRvcDogZ3JvdXBCb3R0b21ZLFxyXG4gICAgICAgICAgICBmb250U2l6ZTogNSxcclxuICAgICAgICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICAgICAgICBmb250V2VpZ2h0OiBcIjYwMFwiLFxyXG4gICAgICAgICAgICBmaWxsOiBcIiM3MDcwNzBcIixcclxuICAgICAgICAgICAgb3JpZ2luWDogXCJyaWdodFwiLFxyXG4gICAgICAgICAgICBvcmlnaW5ZOiBcImJvdHRvbVwiLFxyXG4gICAgICAgICAgICB3aWR0aDogbWlkV2lkdGggLyAyLFxyXG4gICAgICAgICAgICB0ZXh0QWxpZ246IFwicmlnaHRcIixcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHNoZWx2ZXMucHVzaChsYWJlbFRleHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBDZW50ZXJYID0gbWlkWCArIG1pZFdpZHRoIC8gMjtcclxuICAgICAgICBjb25zdCBncm91cENlbnRlclkgPSBncm91cFRvcFkgKyAoZ3JvdXBCb3R0b21ZIC0gZ3JvdXBUb3BZKSAvIDI7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25CcmFuZHMgPSBuZXcgU2V0KCk7XHJcblxyXG4gICAgICAgIHNoZWx2ZXNJbkdyb3VwPy5mb3JFYWNoKChzaGVsZikgPT4ge1xyXG4gICAgICAgICAgc2hlbGYucHJvZHVjdEJyYW5kTmFtZT8uZm9yRWFjaCgoYnJhbmQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBzZWN0aW9uQnJhbmRzLmFkZChicmFuZCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKFsuLi5zZWN0aW9uQnJhbmRzXS5sZW5ndGgpIHtcclxuICAgICAgICAgIGNvbnN0IHRleHQgPSBbLi4uc2VjdGlvbkJyYW5kc10uam9pbihcIiArIFwiKTtcclxuICAgICAgICAgIGNvbnN0IHBhZGRpbmcgPSAyO1xyXG4gICAgICAgICAgY29uc3QgbWF4VGV4dFdpZHRoID0gbWlkV2lkdGg7XHJcbiAgICAgICAgICBjb25zdCByZWN0V2lkdGggPSBtaWRXaWR0aCAqIDAuOTtcclxuICAgICAgICAgIGNvbnN0IG1heFRleHRIZWlnaHQgPSAyMDtcclxuXHJcbiAgICAgICAgICBsZXQgZm9udFNpemUgPSA2O1xyXG4gICAgICAgICAgbGV0IHdyYXBwZWRUZXh0O1xyXG5cclxuICAgICAgICAgIGNvbnN0IGNyZWF0ZVRleHRib3ggPSAoZnM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IGZhYnJpYy5UZXh0Ym94KHRleHQsIHtcclxuICAgICAgICAgICAgICBmb250U2l6ZTogZnMsXHJcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IFwiNDAwXCIsXHJcbiAgICAgICAgICAgICAgd2lkdGg6IG1heFRleHRXaWR0aCxcclxuICAgICAgICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICAgIGZpbGw6IFwiIzEwMTgyOFwiLFxyXG4gICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGxlZnQ6IGdyb3VwQ2VudGVyWCxcclxuICAgICAgICAgICAgICB0b3A6IGdyb3VwQ2VudGVyWSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgd3JhcHBlZFRleHQgPSBjcmVhdGVUZXh0Ym94KGZvbnRTaXplKTtcclxuICAgICAgICAgICAgZm9udFNpemUgLT0gMC41O1xyXG4gICAgICAgICAgfSB3aGlsZSAod3JhcHBlZFRleHQuaGVpZ2h0ID4gbWF4VGV4dEhlaWdodCAmJiBmb250U2l6ZSA+IDIpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHJlY3RIZWlnaHQgPSB3cmFwcGVkVGV4dC5nZXRTY2FsZWRIZWlnaHQoKSArIHBhZGRpbmc7XHJcblxyXG4gICAgICAgICAgY29uc3QgZ3JvdXBDZW50ZXJUZXh0ID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgICAgICAgbGVmdDogZ3JvdXBDZW50ZXJYLFxyXG4gICAgICAgICAgICB0b3A6IGdyb3VwQ2VudGVyWSxcclxuICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgd2lkdGg6IHJlY3RXaWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiByZWN0SGVpZ2h0LFxyXG4gICAgICAgICAgICBmaWxsOiBcInJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KVwiLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJ4OiAxLFxyXG4gICAgICAgICAgICByeTogMSxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHNoZWx2ZXMucHVzaChncm91cENlbnRlclRleHQsIHdyYXBwZWRUZXh0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZml4dHVyZURhdGE/LnZtQ29uZmlnPy5sZW5ndGgpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXh0dXJlRGF0YS52bUNvbmZpZy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHZtID0gZml4dHVyZURhdGEudm1Db25maWdbaV07XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB2bS5zdGFydFlQb3NpdGlvbiAtIDE7XHJcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSB2bS5lbmRZUG9zaXRpb24gLSAxO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBzdGFydEluZGV4ID4gZml4dHVyZURhdGE/LnNoZWxmQ29uZmlnLmxlbmd0aCB8fFxyXG4gICAgICAgICAgZW5kSW5kZXggPiBmaXh0dXJlRGF0YT8uc2hlbGZDb25maWcubGVuZ3RoXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIGNvbnN0IHNoZWxmVG9wWSA9IGZpcnN0Qm94WSArIGJveEhlaWdodCAqIChzdGFydEluZGV4ICsgMSk7XHJcbiAgICAgICAgY29uc3Qgc2hlbGZIZWlnaHRTcGFuID0gYm94SGVpZ2h0ICogKGVuZEluZGV4IC0gc3RhcnRJbmRleCArIDEpO1xyXG5cclxuICAgICAgICBsZXQgdm1IZWlnaHRQeDogbnVtYmVyID0gc2hlbGZIZWlnaHRTcGFuO1xyXG4gICAgICAgIGxldCB5OiBudW1iZXIgPSBzaGVsZlRvcFk7XHJcblxyXG4gICAgICAgIGlmICh2bS55Wm9uZSAmJiB2bS55Wm9uZSAhPT0gXCJzdHJldGNoXCIpIHtcclxuICAgICAgICAgIHZtSGVpZ2h0UHggPSBzaGVsZkhlaWdodFNwYW4gLyAzO1xyXG5cclxuICAgICAgICAgIHN3aXRjaCAodm0ueVpvbmUpIHtcclxuICAgICAgICAgICAgY2FzZSBcInRvcFwiOlxyXG4gICAgICAgICAgICAgIHkgPSBzaGVsZlRvcFk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJtaWRkbGVcIjpcclxuICAgICAgICAgICAgICB5ID0gc2hlbGZUb3BZICsgdm1IZWlnaHRQeDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImJvdHRvbVwiOlxyXG4gICAgICAgICAgICAgIHkgPSBzaGVsZlRvcFkgKyAyICogdm1IZWlnaHRQeDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICB5ID0gc2hlbGZUb3BZO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHggPSBtaWRYO1xyXG4gICAgICAgIGxldCB3aWR0aCA9IG1pZFdpZHRoO1xyXG5cclxuICAgICAgICBpZiAoIXZtLnhab25lIHx8IHZtLnhab25lID09PSBcInN0cmV0Y2hcIikge1xyXG4gICAgICAgICAgd2lkdGggPSBtaWRXaWR0aDtcclxuICAgICAgICAgIHggPSBtaWRYO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBzZWN0aW9uV2lkdGggPSBtaWRXaWR0aCAvIDM7XHJcbiAgICAgICAgICBzd2l0Y2ggKHZtLnhab25lKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XHJcbiAgICAgICAgICAgICAgd2lkdGggPSBzZWN0aW9uV2lkdGg7XHJcbiAgICAgICAgICAgICAgeCA9IG1pZFg7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJtaWRkbGVcIjpcclxuICAgICAgICAgICAgICB3aWR0aCA9IHNlY3Rpb25XaWR0aDtcclxuICAgICAgICAgICAgICB4ID0gbWlkWCArIHNlY3Rpb25XaWR0aDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XHJcbiAgICAgICAgICAgICAgd2lkdGggPSBzZWN0aW9uV2lkdGg7XHJcbiAgICAgICAgICAgICAgeCA9IG1pZFggKyAyICogc2VjdGlvbldpZHRoO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIHdpZHRoID0gbWlkV2lkdGg7XHJcbiAgICAgICAgICAgICAgeCA9IG1pZFg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodm0udm1JbWFnZVVybCkge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3Qgdm1JbWFnZTogYW55ID0gYXdhaXQgZmFicmljLkZhYnJpY0ltYWdlLmZyb21VUkwoXHJcbiAgICAgICAgICAgICAgYCR7dGhpcy5jZG5Vcmx9JHt2bS52bUltYWdlVXJsfT92PSR7RGF0ZS5ub3coKX1gLFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNyb3NzT3JpZ2luOiBcImFub255bW91c1wiLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB2bUltYWdlLnNldCh7XHJcbiAgICAgICAgICAgICAgbGVmdDogeCArIHdpZHRoIC8gMixcclxuICAgICAgICAgICAgICB0b3A6IHkgKyB2bUhlaWdodFB4IC8gMixcclxuICAgICAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgc2NhbGVYOiB3aWR0aCAvIHZtSW1hZ2Uud2lkdGghLFxyXG4gICAgICAgICAgICAgIHNjYWxlWTogdm1IZWlnaHRQeCAvIHZtSW1hZ2UuaGVpZ2h0ISxcclxuICAgICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBzaGVsdmVzLnB1c2godm1JbWFnZSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgbG9hZGluZyBpbWFnZSBmb3IgVk06ICR7dm0udm1JbWFnZVVybH1gLCBlcnIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCB2bUJveCA9IG5ldyBmYWJyaWMuUmVjdCh7XHJcbiAgICAgICAgICAgIGxlZnQ6IHgsXHJcbiAgICAgICAgICAgIHRvcDogeSxcclxuICAgICAgICAgICAgd2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogdm1IZWlnaHRQeCxcclxuICAgICAgICAgICAgZmlsbDogZml4dHVyZUNvbG9yPy52bUZpbGwgPz8gXCIjNjkzOEVGXCIsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGxldCBmb250U2l6ZSA9IDU7XHJcbiAgICAgICAgICBsZXQgdm1UZXh0O1xyXG5cclxuICAgICAgICAgIGNvbnN0IGNyZWF0ZVZtVGV4dCA9IChmczogbnVtYmVyKSA9PlxyXG4gICAgICAgICAgICBuZXcgZmFicmljLlRleHRib3godm0udm1OYW1lIHx8IFwiXCIsIHtcclxuICAgICAgICAgICAgICBsZWZ0OiB4ICsgd2lkdGggLyAyLFxyXG4gICAgICAgICAgICAgIHRvcDogeSArIHZtSGVpZ2h0UHggLyAyLFxyXG4gICAgICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgICBmb250U2l6ZTogZnMsXHJcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IFwiNjAwXCIsXHJcbiAgICAgICAgICAgICAgZmlsbDogXCJ3aGl0ZVwiLFxyXG4gICAgICAgICAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgdm1UZXh0ID0gY3JlYXRlVm1UZXh0KGZvbnRTaXplKTtcclxuICAgICAgICAgICAgZm9udFNpemUgLT0gMC41O1xyXG4gICAgICAgICAgfSB3aGlsZSAodm1UZXh0LmhlaWdodCA+IHZtSGVpZ2h0UHggJiYgZm9udFNpemUgPiAyKTtcclxuXHJcbiAgICAgICAgICBzaGVsdmVzLnB1c2godm1Cb3gsIHZtVGV4dCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbGFzdEJveFkgPSBmaXJzdEJveFkgKyBib3hIZWlnaHQgKiAoc2hlbGZDb3VudCArIDEpO1xyXG4gICAgY29uc3QgbGFzdEJveCA9IG5ldyBmYWJyaWMuUGF0aChcclxuICAgICAgYE0gJHttaWRYfSAke2xhc3RCb3hZfSBcclxuICAgICAgICAgTCAke21pZFggKyBtaWRXaWR0aH0gJHtsYXN0Qm94WX0gXHJcbiAgICAgICAgIEwgJHttaWRYICsgbWlkV2lkdGh9ICR7bGFzdEJveFkgKyBib3hIZWlnaHQgLSByYWRpdXN9IFxyXG4gICAgICAgICBRICR7bWlkWCArIG1pZFdpZHRofSAke2xhc3RCb3hZICsgYm94SGVpZ2h0fSAke1xyXG4gICAgICAgICAgIG1pZFggKyBtaWRXaWR0aCAtIHJhZGl1c1xyXG4gICAgICAgICB9ICR7bGFzdEJveFkgKyBib3hIZWlnaHR9IFxyXG4gICAgICAgICBMICR7bWlkWCArIHJhZGl1c30gJHtsYXN0Qm94WSArIGJveEhlaWdodH0gXHJcbiAgICAgICAgIFEgJHttaWRYfSAke2xhc3RCb3hZICsgYm94SGVpZ2h0fSAke21pZFh9ICR7XHJcbiAgICAgICAgICAgbGFzdEJveFkgKyBib3hIZWlnaHQgLSByYWRpdXNcclxuICAgICAgICAgfSBcclxuICAgICAgICAgTCAke21pZFh9ICR7bGFzdEJveFl9IFpgLFxyXG4gICAgICB7XHJcbiAgICAgICAgZmlsbDogZml4dHVyZUNvbG9yPy5maWxsXHJcbiAgICAgICAgICA/IGZpeHR1cmVDb2xvcj8uZmlsbFxyXG4gICAgICAgICAgOiAoZml4dHVyZURhdGEuaGVhZGVySW52YWxpZCB8fCBmaXh0dXJlRGF0YS5saWJyYXJ5SW52YWxpZClcclxuICAgICAgICAgICAgPyBcIiNGRUU0RTJcIlxyXG4gICAgICAgICAgICA6IFwiI0VBRjhGRlwiLFxyXG4gICAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICA/IGZpeHR1cmVDb2xvcj8ucHJpbWFyeVxyXG4gICAgICAgICAgOiAoZml4dHVyZURhdGEuaGVhZGVySW52YWxpZCB8fCBmaXh0dXJlRGF0YS5saWJyYXJ5SW52YWxpZClcclxuICAgICAgICAgICAgPyBcIiNEOTJEMjBcIlxyXG4gICAgICAgICAgICA6IFwiIzZCQ0FGRlwiLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBsYXN0Qm94VGV4dCA9IG5ldyBmYWJyaWMuVGV4dGJveChcclxuICAgICAgYCR7Zml4dHVyZURhdGE/LmZvb3Rlcj8ubGFiZWwgPyBmaXh0dXJlRGF0YS5mb290ZXIubGFiZWwgOiBcIlwifWAsXHJcbiAgICAgIHtcclxuICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLyAyLFxyXG4gICAgICAgIHRvcDogbGFzdEJveFkgKyBib3hIZWlnaHQgLyAyLFxyXG4gICAgICAgIGZvbnRTaXplOiA1LFxyXG4gICAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgICBmb250V2VpZ2h0OiBcIjYwMFwiLFxyXG4gICAgICAgIGZpbGw6IFwiIzEwMTgyOFwiLFxyXG4gICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgICAgd2lkdGg6IG1pZFdpZHRoLFxyXG4gICAgICAgIGhlaWd0aDogYm94SGVpZ2h0LFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBib3R0b21XaWR0aCA9IHdpZHRoIC8gMS4wNTtcclxuICAgIGNvbnN0IGJvdHRvbUhlaWdodCA9ICgzIC8gMTAwKSAqIGhlaWdodDtcclxuICAgIGNvbnN0IGJvdHRvbVggPSB4ICsgKHdpZHRoIC0gYm90dG9tV2lkdGgpIC8gMjtcclxuICAgIGNvbnN0IGJvdHRvbVkgPSBtaWRZICsgbWlkSGVpZ2h0ICsgdGhpcy52ZXJ0aWNhbE1hcmdpbjtcclxuXHJcbiAgICBjb25zdCBib3R0b21Db250YWluZXIgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICBsZWZ0OiBib3R0b21YLFxyXG4gICAgICB0b3A6IGJvdHRvbVksXHJcbiAgICAgIHdpZHRoOiBib3R0b21XaWR0aCxcclxuICAgICAgaGVpZ2h0OiBib3R0b21IZWlnaHQsXHJcbiAgICAgIHJ4OiByYWRpdXMsXHJcbiAgICAgIHJ5OiByYWRpdXMsXHJcbiAgICAgIHN0cm9rZTogXCJ0cmFuc3BhcmVudFwiLFxyXG4gICAgICBmaWxsOiBcInRyYW5zcGFyZW50XCIsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBib3R0b21UZXh0Q29udGVudCA9IG5ldyBmYWJyaWMuVGV4dGJveChcclxuICAgICAgYFNoZWx2ZXMgLSAke2FjdHVhbFNoZWx2ZXMubGVuZ3RofSAuIFByb2R1Y3RzIC0gICR7XHJcbiAgICAgICAgZml4dHVyZURhdGE/LmZpeHR1cmVDYXBhY2l0eSA/PyAwXHJcbiAgICAgIH0gLiBWTSAtICR7Zml4dHVyZURhdGE/LnZtQ29uZmlnPy5sZW5ndGggPz8gMH1gLFxyXG4gICAgICB7XHJcbiAgICAgICAgbGVmdDogYm90dG9tWCArIGJvdHRvbVdpZHRoIC8gMixcclxuICAgICAgICB0b3A6IGJvdHRvbVkgKyBib3R0b21IZWlnaHQgLyAyLFxyXG4gICAgICAgIGZvbnRTaXplOiA1LFxyXG4gICAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgICBmb250V2VpZ2h0OiBcIjUwMFwiLFxyXG4gICAgICAgIGZpbGw6IFwiIzMzM1wiLFxyXG4gICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgICAgd2lkdGg6IGJvdHRvbVdpZHRoLFxyXG4gICAgICAgIGhlaWdodDogYm90dG9tSGVpZ2h0LFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBzdmdTdHJpbmcgPSBgXHJcbiAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgIDxyZWN0IHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHJ4PVwiMTJcIiBmaWxsPVwid2hpdGVcIi8+XHJcbiAgICAgICA8cGF0aCBkPVwiTTE0Ljk5OTggNi42MDAwMUMxNS4xNTc0IDYuNDQyNDMgMTUuMzQ0NSA2LjMxNzQyIDE1LjU1MDQgNi4yMzIxNEMxNS43NTYzIDYuMTQ2ODUgMTUuOTc3IDYuMTAyOTYgMTYuMTk5OCA2LjEwMjk2QzE2LjQyMjcgNi4xMDI5NiAxNi42NDM0IDYuMTQ2ODUgMTYuODQ5MiA2LjIzMjE0QzE3LjA1NTEgNi4zMTc0MiAxNy4yNDIyIDYuNDQyNDMgMTcuMzk5OCA2LjYwMDAxQzE3LjU1NzQgNi43NTc2IDE3LjY4MjQgNi45NDQ2OCAxNy43Njc3IDcuMTUwNThDMTcuODUzIDcuMzU2NDggMTcuODk2OSA3LjU3NzE1IDE3Ljg5NjkgNy44MDAwMUMxNy44OTY5IDguMDIyODggMTcuODUzIDguMjQzNTUgMTcuNzY3NyA4LjQ0OTQ1QzE3LjY4MjQgOC42NTUzNSAxNy41NTc0IDguODQyNDMgMTcuMzk5OCA5LjAwMDAxTDkuMjk5ODIgMTcuMUw1Ljk5OTgyIDE4TDYuODk5ODIgMTQuN0wxNC45OTk4IDYuNjAwMDFaXCIgc3Ryb2tlPVwiIzFEMjkzOVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgIDwvc3ZnPmA7XHJcblxyXG4gICAgbGV0IGxvYWRlZFNWRzogYW55ID0gYXdhaXQgZmFicmljLmxvYWRTVkdGcm9tU3RyaW5nKHN2Z1N0cmluZyk7XHJcblxyXG4gICAgbGV0IGVkaXRTdmcgPSBmYWJyaWMudXRpbC5ncm91cFNWR0VsZW1lbnRzKFxyXG4gICAgICBsb2FkZWRTVkcub2JqZWN0cyxcclxuICAgICAgbG9hZGVkU1ZHLm9wdGlvbnMsXHJcbiAgICApO1xyXG5cclxuICAgIGVkaXRTdmcuc2V0KHtcclxuICAgICAgc2NhbGVYOiAxLFxyXG4gICAgICBzY2FsZVk6IDEsXHJcbiAgICAgIGxlZnQ6IHggKyB3aWR0aCAtIDMwLFxyXG4gICAgICB0b3A6IHkgKyAxNCxcclxuICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICBldmVudGVkOiB0cnVlLCAvLyBhbGxvdyBldmVudHNcclxuICAgICAgaG92ZXJDdXJzb3I6IFwicG9pbnRlclwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgZWRpdFN2Zy5vbihcIm1vdXNlZG93blwiLCAob3B0KSA9PiB7XHJcbiAgICAgIGlmIChvcHQgJiYgb3B0LmUgJiYgb3B0LmUuc3RvcFByb3BhZ2F0aW9uKSB7XHJcbiAgICAgICAgb3B0LmUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKHRoaXMuaGFzVW5zYXZlZExheW91dENoYW5nZXMoKSkge1xyXG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICBcIlNhdmUgeW91ciBsYXlvdXQgY2hhbmdlcyBiZWZvcmUgZWRpdGluZyB0aGUgZml4dHVyZVwiLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZSA9IHtcclxuICAgICAgICBmaXh0dXJlVHlwZTogZml4dHVyZURhdGEuZml4dHVyZVR5cGUsXHJcbiAgICAgICAgd2FsbEluZGV4OiBmaXh0dXJlRGF0YS5hc3NvY2lhdGVkRWxlbWVudE51bWJlcixcclxuICAgICAgICBmaXh0dXJlSW5kZXg6IGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcixcclxuICAgICAgICBmaXh0dXJlSWQ6IGZpeHR1cmVEYXRhLl9pZCxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkRml4dHVyZS5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICBjb25zdCB3YWxsID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5maW5kKFxyXG4gICAgICAgICAgKHdhbGw6IGFueSkgPT4gd2FsbC5lbGVtZW50TnVtYmVyID09PSB0aGlzLnNlbGVjdGVkRml4dHVyZS53YWxsSW5kZXgsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgZml4dHVyZSA9IHdhbGwuZml4dHVyZXMuZmluZChcclxuICAgICAgICAgIChmaXh0dXJlOiBhbnkpID0+IGZpeHR1cmUuX2lkID09PSB0aGlzLnNlbGVjdGVkRml4dHVyZS5maXh0dXJlSWQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEgPSBmaXh0dXJlO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRGaXh0dXJlLmZpeHR1cmVUeXBlID09PSBcImZsb29yXCIpIHtcclxuICAgICAgICBjb25zdCBmaXh0dXJlID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZS5maW5kKFxyXG4gICAgICAgICAgKGZpeHR1cmU6IGFueSkgPT4gZml4dHVyZS5faWQgPT09IHRoaXMuc2VsZWN0ZWRGaXh0dXJlLmZpeHR1cmVJZCxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YSA9IGZpeHR1cmU7XHJcbiAgICAgIH1cclxuICAgICAgZGVsZXRlIHRoaXM/LnNlbGVjdGVkRml4dHVyZURhdGE/LnRhc2tUeXBlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZS5maXh0dXJlRGF0YSA9IHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YTtcclxuICAgICAgdGhpcy5lZGl0Rml4dHVyZSA9IHRydWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBmaXh0dXJlR3JvdXAgPSBuZXcgZmFicmljLkdyb3VwKFxyXG4gICAgICBbXHJcbiAgICAgICAgbWFpbkNvbnRhaW5lcixcclxuICAgICAgICB0b3BDb250YWluZXIsXHJcbiAgICAgICAgaW5uZXJUb3BCb3gsXHJcbiAgICAgICAgdG9wVGV4dCxcclxuICAgICAgICBpbm5lckJvdHRvbUJveCxcclxuICAgICAgICBib3R0b21UZXh0LFxyXG4gICAgICAgIG1pZENvbnRhaW5lcixcclxuICAgICAgICBmaXJzdEJveCxcclxuICAgICAgICBmaXJzdEJveFRleHQsXHJcbiAgICAgICAgLi4uc2hlbHZlcyxcclxuICAgICAgICBsYXN0Qm94LFxyXG4gICAgICAgIGxhc3RCb3hUZXh0LFxyXG4gICAgICAgIGJvdHRvbUNvbnRhaW5lcixcclxuICAgICAgICBib3R0b21UZXh0Q29udGVudCxcclxuICAgICAgICBlZGl0U3ZnLFxyXG4gICAgICBdLFxyXG4gICAgICB7XHJcbiAgICAgICAgbGVmdDogcmVuZGVyWCxcclxuICAgICAgICB0b3A6IHJlbmRlclksXHJcbiAgICAgICAgZXZlbnRlZDogdHJ1ZSxcclxuICAgICAgICBob3ZlckN1cnNvcjogXCJwb2ludGVyXCIsXHJcbiAgICAgICAgc2VsZWN0YWJsZTogdGhpcy5sYXlvdXRGb3JtLmVuYWJsZWQsXHJcbiAgICAgICAgbG9ja1NjYWxpbmdYOiB0cnVlLFxyXG4gICAgICAgIGxvY2tTY2FsaW5nWTogdHJ1ZSxcclxuICAgICAgICBzdWJUYXJnZXRDaGVjazogdHJ1ZSxcclxuICAgICAgICBhbmdsZTogcmVuZGVyQW5nbGUsXHJcbiAgICAgIH0sXHJcbiAgICApIGFzIGZhYnJpYy5Hcm91cCAmIHtcclxuICAgICAgd2FsbEluZGV4OiBudW1iZXI7XHJcbiAgICAgIGZpeHR1cmVJbmRleDogbnVtYmVyO1xyXG4gICAgICBmaXh0dXJlSWQ6IHN0cmluZztcclxuICAgICAgZml4dHVyZVR5cGU6IFwid2FsbFwiIHwgXCJmbG9vclwiO1xyXG4gICAgICBpc3N1ZTogYm9vbGVhbjtcclxuICAgICAgaXNzdWVEYXRhOiBhbnk7XHJcbiAgICAgIHRhc2tUeXBlOiBzdHJpbmc7XHJcbiAgICAgIHZtQ29uZmlnOiBbXTtcclxuICAgICAgb2JqVHlwZTogc3RyaW5nO1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgICFmaXh0dXJlRGF0YT8uaXNzdWUgJiZcclxuICAgICAgIWZpeHR1cmVEYXRhPy51bnNhdmVkQ2hhbmdlcyAmJlxyXG4gICAgICB0aGlzLmxheW91dEZvcm0uZW5hYmxlZFxyXG4gICAgKSB7XHJcbiAgICAgIGZpeHR1cmVHcm91cC5vbihcIm1vdXNlb3ZlclwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZWRpdFN2Zy5zZXQoXCJ2aXNpYmxlXCIsIHRydWUpO1xyXG4gICAgICAgIGNhbnZhcy5yZW5kZXJBbGwoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGZpeHR1cmVHcm91cC5vbihcIm1vdXNlb3V0XCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBlZGl0U3ZnLnNldChcInZpc2libGVcIiwgZmFsc2UpO1xyXG4gICAgICAgIGNhbnZhcy5yZW5kZXJBbGwoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZml4dHVyZUdyb3VwLm9uKFwibW91c2Vkb3duXCIsIChldmVudDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcclxuICAgICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlZCkge1xyXG4gICAgICAgIHRoaXMudG9nZ2xlUGFuZWwoXCJyaWdodFwiLCBmYWxzZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRGaXh0dXJlSW5BY2NvcmRpb24oZml4dHVyZURhdGEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmhpZ2hsaWdodEZpeHR1cmUodGFyZ2V0KTtcclxuICAgICAgdGhpcy5zZWxlY3RGaXh0dXJlT25DYW52YXNDbGljayh0YXJnZXQsIHRydWUpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEgPSBmaXh0dXJlRGF0YTtcclxuICAgIH0pO1xyXG5cclxuICAgIGZpeHR1cmVHcm91cC5maXh0dXJlVHlwZSA9IGZpeHR1cmVEYXRhLmZpeHR1cmVUeXBlO1xyXG4gICAgZml4dHVyZUdyb3VwLndhbGxJbmRleCA9IGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50TnVtYmVyO1xyXG4gICAgZml4dHVyZUdyb3VwLmZpeHR1cmVJbmRleCA9IGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcjtcclxuICAgIGZpeHR1cmVHcm91cC5maXh0dXJlSWQgPSBmaXh0dXJlRGF0YS5faWQ7XHJcbiAgICBmaXh0dXJlR3JvdXAuaXNzdWUgPSBmaXh0dXJlRGF0YS5pc3N1ZTtcclxuICAgIGZpeHR1cmVHcm91cC5pc3N1ZURhdGEgPSBmaXh0dXJlRGF0YS5pc3N1ZURhdGE7XHJcbiAgICBmaXh0dXJlR3JvdXAudGFza1R5cGUgPSBmaXh0dXJlRGF0YS50YXNrVHlwZTtcclxuICAgIGZpeHR1cmVHcm91cC52bUNvbmZpZyA9IGZpeHR1cmVEYXRhLnZtQ29uZmlnO1xyXG4gICAgZml4dHVyZUdyb3VwLm9ialR5cGUgPSBcImZpeHR1cmVcIjtcclxuXHJcbiAgICAvLyB0aGlzLmNhbnZhcy5vbihcIm9iamVjdDptb3ZpbmdcIiwgKGUpID0+IHtcclxuICAgIC8vICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgYW55O1xyXG4gICAgLy8gICBpZiAoIXRhcmdldCB8fCB0YXJnZXQub2JqVHlwZSAhPT0gXCJmaXh0dXJlXCIpIHJldHVybjtcclxuXHJcbiAgICAvLyAgIGNvbnN0IGFuZ2xlRGVnID0gdGFyZ2V0LmFuZ2xlIHx8IDA7XHJcbiAgICAvLyAgIGNvbnN0IGFuZ2xlID0gKGFuZ2xlRGVnICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICAvLyAgIGlmICghdGFyZ2V0Ll9sYXN0TGVmdCkge1xyXG4gICAgLy8gICAgIHRhcmdldC5fbGFzdExlZnQgPSB0YXJnZXQubGVmdDtcclxuICAgIC8vICAgICB0YXJnZXQuX2xhc3RUb3AgPSB0YXJnZXQudG9wO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIGNvbnN0IGR4ID0gdGFyZ2V0LmxlZnQgLSB0YXJnZXQuX2xhc3RMZWZ0O1xyXG4gICAgLy8gICBjb25zdCBkeSA9IHRhcmdldC50b3AgLSB0YXJnZXQuX2xhc3RUb3A7XHJcbiAgICAvLyAgIGNvbnN0IHByb2plY3RlZCA9IGR4ICogTWF0aC5jb3MoYW5nbGUpICsgZHkgKiBNYXRoLnNpbihhbmdsZSk7XHJcbiAgICAvLyAgIHRhcmdldC5sZWZ0ID0gdGFyZ2V0Ll9sYXN0TGVmdCArIHByb2plY3RlZCAqIE1hdGguY29zKGFuZ2xlKTtcclxuICAgIC8vICAgdGFyZ2V0LnRvcCA9IHRhcmdldC5fbGFzdFRvcCArIHByb2plY3RlZCAqIE1hdGguc2luKGFuZ2xlKTtcclxuICAgIC8vICAgdGFyZ2V0Ll9sYXN0TGVmdCA9IHRhcmdldC5sZWZ0O1xyXG4gICAgLy8gICB0YXJnZXQuX2xhc3RUb3AgPSB0YXJnZXQudG9wO1xyXG4gICAgLy8gfSk7XHJcblxyXG4gICAgY2FudmFzLmFkZChmaXh0dXJlR3JvdXApO1xyXG5cclxuICAgIC8vIElmIG5ld2x5IGFkZGVkLCBmb2N1cyBpdCBvbmNlXHJcbiAgICBpZiAoKGZpeHR1cmVEYXRhIGFzIGFueSk/Lm5ld0FkZGVkKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5jYW52YXMuc2V0QWN0aXZlT2JqZWN0KGZpeHR1cmVHcm91cCk7XHJcbiAgICAgICAgdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gICAgICB9IGNhdGNoIHt9XHJcbiAgICAgIGRlbGV0ZSAoZml4dHVyZURhdGEgYXMgYW55KS5uZXdBZGRlZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZml4dHVyZUdyb3VwO1xyXG4gIH1cclxuXHJcbiAgZHJhd0VudHJhbmNlKFxyXG4gICAgY2FudmFzOiBmYWJyaWMuQ2FudmFzLFxyXG4gICAgeDogbnVtYmVyLFxyXG4gICAgeTogbnVtYmVyLFxyXG4gICAgd2lkdGg6IG51bWJlcixcclxuICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgYXJyb3dXaWR0aDogbnVtYmVyLFxyXG4gICAgZWxlbWVudERhdGE6IGFueSxcclxuICApIHtcclxuICAgIGNvbnN0IGJvZHlXaWR0aCA9IHdpZHRoIC0gYXJyb3dXaWR0aDtcclxuICAgIGNvbnN0IGFuZ2xlID0gZWxlbWVudERhdGEuYW5nbGU7XHJcblxyXG4gICAgY29uc3QgcGF0aERhdGEgPSBbXHJcbiAgICAgIGBNIDAgMGAsXHJcbiAgICAgIGBMICR7Ym9keVdpZHRofSAwYCxcclxuICAgICAgYEwgJHtib2R5V2lkdGh9ICR7LWhlaWdodCAvIDJ9YCxcclxuICAgICAgYEwgJHt3aWR0aH0gJHtoZWlnaHQgLyAyfWAsXHJcbiAgICAgIGBMICR7Ym9keVdpZHRofSAke2hlaWdodCArIGhlaWdodCAvIDJ9YCxcclxuICAgICAgYEwgJHtib2R5V2lkdGh9ICR7aGVpZ2h0fWAsXHJcbiAgICAgIGBMIDAgJHtoZWlnaHR9YCxcclxuICAgICAgYFpgLFxyXG4gICAgXS5qb2luKFwiIFwiKTtcclxuXHJcbiAgICBjb25zdCBhcnJvdyA9IG5ldyBmYWJyaWMuUGF0aChwYXRoRGF0YSwge1xyXG4gICAgICBmaWxsOiBcIiMwM0E5RjRcIixcclxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgbWF4VGV4dEhlaWdodCA9IGhlaWdodCAtIDY7XHJcbiAgICBjb25zdCB0ZXh0ID0gbmV3IGZhYnJpYy5UZXh0KFwiRW50cmFuY2VcIiwge1xyXG4gICAgICBmb250RmFtaWx5OiBcIkFyaWFsXCIsXHJcbiAgICAgIGZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxyXG4gICAgICBmaWxsOiBcIndoaXRlXCIsXHJcbiAgICAgIGFuZ2xlOiAtOTAsXHJcbiAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgIGxlZnQ6IDE1LFxyXG4gICAgICB0b3A6IGhlaWdodCAvIDIsXHJcbiAgICAgIGZvbnRTaXplOiAyMCxcclxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgdGV4dEJvdW5kcyA9IHRleHQuZ2V0Qm91bmRpbmdSZWN0KCk7XHJcbiAgICBpZiAodGV4dEJvdW5kcy5oZWlnaHQgPiBtYXhUZXh0SGVpZ2h0KSB7XHJcbiAgICAgIGNvbnN0IHNjYWxlID0gbWF4VGV4dEhlaWdodCAvIHRleHRCb3VuZHMuaGVpZ2h0O1xyXG4gICAgICB0ZXh0LnNldChcImZvbnRTaXplXCIsIHRleHQuZm9udFNpemUhICogc2NhbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdyb3VwID0gbmV3IGZhYnJpYy5Hcm91cChbYXJyb3csIHRleHRdLCB7XHJcbiAgICAgIGxlZnQ6IHgsXHJcbiAgICAgIHRvcDogeSxcclxuICAgICAgc2VsZWN0YWJsZTogdGhpcy5sYXlvdXRGb3JtLmVuYWJsZWQsXHJcbiAgICAgIGxvY2tTY2FsaW5nWDogdHJ1ZSxcclxuICAgICAgbG9ja1NjYWxpbmdZOiB0cnVlLFxyXG4gICAgICBsb2NrU2NhbGluZ0ZsaXA6IHRydWUsXHJcbiAgICAgIGFuZ2xlOiBhbmdsZSxcclxuICAgIH0pIGFzIGZhYnJpYy5Hcm91cCAmIHtcclxuICAgICAgb2JqVHlwZTogc3RyaW5nO1xyXG4gICAgICBkYXRhOiBhbnk7XHJcbiAgICB9O1xyXG5cclxuICAgIGdyb3VwLm9ialR5cGUgPSBlbGVtZW50RGF0YS5lbGVtZW50VHlwZTtcclxuICAgIGdyb3VwLmRhdGEgPSBlbGVtZW50RGF0YTtcclxuXHJcbiAgICBjYW52YXMuYWRkKGdyb3VwKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5kcmF3RW50cmFuY2VEaXNzZWN0aW9uTGluZShjYW52YXMsIGdyb3VwLCB3aWR0aCwgaGVpZ2h0LCBhbmdsZSk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIGRyYXdPdGhlckVsZW1lbnRzV2l0aExhYmVsKFxyXG4gICAgY2FudmFzOiBmYWJyaWMuQ2FudmFzLFxyXG4gICAgeDogbnVtYmVyLFxyXG4gICAgeTogbnVtYmVyLFxyXG4gICAgYTogbnVtYmVyLFxyXG4gICAgd2lkdGg6IG51bWJlcixcclxuICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgZWxlbWVudDogYW55LFxyXG4gICk6IGZhYnJpYy5Hcm91cCB7XHJcbiAgICBjb25zdCByZWN0ID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgd2lkdGgsXHJcbiAgICAgIGhlaWdodCxcclxuICAgICAgcng6IDIsXHJcbiAgICAgIHJ5OiAyLFxyXG4gICAgICBmaWxsOiBcIiNEQUYxRkZcIixcclxuICAgICAgc3Ryb2tlOiBcIiM2QkNBRkZcIixcclxuICAgICAgc3Ryb2tlV2lkdGg6IDIsXHJcbiAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0ZXh0ID0gbmV3IGZhYnJpYy5UZXh0Ym94KGVsZW1lbnQuZml4dHVyZU5hbWUsIHtcclxuICAgICAgd2lkdGg6IHdpZHRoIC0gOCxcclxuICAgICAgZm9udFNpemU6IDE0LFxyXG4gICAgICBmb250RmFtaWx5OiBcIkludGVyXCIsXHJcbiAgICAgIGZvbnRXZWlnaHQ6IFwiNTAwXCIsXHJcbiAgICAgIGZpbGw6IFwiIzEwMTgyOFwiLFxyXG4gICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgIGVkaXRhYmxlOiBmYWxzZSxcclxuICAgICAgc3BsaXRCeUdyYXBoZW1lOiB0cnVlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgdGV4dEJvdW5kcyA9IHRleHQuZ2V0Qm91bmRpbmdSZWN0KCk7XHJcblxyXG4gICAgaWYgKHRleHRCb3VuZHMuaGVpZ2h0ID4gaGVpZ2h0IC0gOCkge1xyXG4gICAgICBjb25zdCBzY2FsZSA9IChoZWlnaHQgLSA4KSAvIHRleHRCb3VuZHMuaGVpZ2h0O1xyXG4gICAgICB0ZXh0LnNldChcImZvbnRTaXplXCIsIHRleHQuZm9udFNpemUhICogc2NhbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdyb3VwID0gbmV3IGZhYnJpYy5Hcm91cChbcmVjdCwgdGV4dF0sIHtcclxuICAgICAgbGVmdDogeCxcclxuICAgICAgdG9wOiB5LFxyXG4gICAgICBhbmdsZTogYSxcclxuICAgICAgc2VsZWN0YWJsZTogdGhpcy5sYXlvdXRGb3JtLmVuYWJsZWQsXHJcbiAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICB9KSBhcyBmYWJyaWMuR3JvdXAgJiB7XHJcbiAgICAgIG9ialR5cGU6IHN0cmluZztcclxuICAgICAgZGF0YTogYW55O1xyXG4gICAgfTtcclxuXHJcbiAgICBncm91cC5vYmpUeXBlID0gXCJvdGhlcnNcIjtcclxuICAgIGdyb3VwLmRhdGEgPSBlbGVtZW50O1xyXG5cclxuICAgIGNhbnZhcy5hZGQoZ3JvdXApO1xyXG5cclxuICAgIGlmICgoZWxlbWVudCBhcyBhbnkpPy5uZXdBZGRlZCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuY2FudmFzLnNldEFjdGl2ZU9iamVjdChncm91cCk7XHJcbiAgICAgICAgdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gICAgICB9IGNhdGNoIHt9XHJcbiAgICAgIGRlbGV0ZSAoZWxlbWVudCBhcyBhbnkpLm5ld0FkZGVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBncm91cDtcclxuICB9XHJcblxyXG4gIGRyYXdCZygpIHtcclxuICAgIGNvbnN0IHdhbGwxID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5maW5kKFxyXG4gICAgICAoZTogYW55KSA9PiBlLmVsZW1lbnROdW1iZXIgPT09IDEgJiYgZS5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIsXHJcbiAgICApO1xyXG4gICAgY29uc3Qgd2FsbDIgPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZpbmQoXHJcbiAgICAgIChlOiBhbnkpID0+IGUuZWxlbWVudE51bWJlciA9PT0gMiAmJiBlLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIixcclxuICAgICk7XHJcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMudG9QaXhlbHMod2FsbDEuZGlzdGFuY2UsIHdhbGwxLnVuaXQpO1xyXG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy50b1BpeGVscyh3YWxsMi5kaXN0YW5jZSwgd2FsbDIudW5pdCk7XHJcblxyXG4gICAgY29uc3QgYmcgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICBsZWZ0OiB0aGlzLndhbGxUaGlja25lc3MsXHJcbiAgICAgIHRvcDogdGhpcy53YWxsVGhpY2tuZXNzLFxyXG4gICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICBmaWxsOiBcIiNlYWVjZjBcIixcclxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYW52YXMuYWRkKGJnKTtcclxuICAgIHRoaXMuY2FudmFzLnJlbW92ZShiZyk7XHJcbiAgICB0aGlzLmNhbnZhcy5pbnNlcnRBdCgwLCBiZyk7XHJcbiAgICB0aGlzLmNhbnZhcy5yZW5kZXJBbGwoKTtcclxuICB9XHJcblxyXG4gIHN1YnNjcmliZVRvRml4dHVyZUNvbmZpZ0lkQ2hhbmdlcygpIHtcclxuICAgIHRoaXMuZml4dHVyZUNvbmZpZ1N1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3ViKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XHJcbiAgICB0aGlzLmZpeHR1cmVDb25maWdTdWJzY3JpcHRpb25zID0gW107XHJcblxyXG4gICAgdGhpcy5nZXRGb3JtV2FsbHMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCwgaSkgPT4ge1xyXG4gICAgICBjb25zdCB3YWxsR3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcclxuICAgICAgY29uc3QgZml4dHVyZXNBcnJheSA9IHdhbGxHcm91cC5nZXQoXCJmaXh0dXJlc1wiKSBhcyBGb3JtQXJyYXk7XHJcblxyXG4gICAgICBmaXh0dXJlc0FycmF5LmNvbnRyb2xzLmZvckVhY2goKGZpeHR1cmVDb250cm9sLCBqKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZml4dHVyZUdyb3VwID0gZml4dHVyZUNvbnRyb2wgYXMgRm9ybUdyb3VwO1xyXG4gICAgICAgIGNvbnN0IHN1YiA9IGZpeHR1cmVHcm91cFxyXG4gICAgICAgICAgLmdldChcImZpeHR1cmVDb25maWdJZFwiKVxyXG4gICAgICAgICAgPy52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChuZXdWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZUZpeHR1cmVUZW1wbGF0ZShuZXdWYWx1ZSwgXCJ3YWxsXCIsIGosIGkpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChzdWIpIHRoaXMuZml4dHVyZUNvbmZpZ1N1YnNjcmlwdGlvbnMucHVzaChzdWIpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZ2V0Rm9ybUZsb29yRml4dHVyZXMuY29udHJvbHMuZm9yRWFjaCgoZml4dHVyZUNvbnRyb2wsIGspID0+IHtcclxuICAgICAgY29uc3QgZml4dHVyZUdyb3VwID0gZml4dHVyZUNvbnRyb2wgYXMgRm9ybUdyb3VwO1xyXG4gICAgICBjb25zdCBzdWIgPSBmaXh0dXJlR3JvdXBcclxuICAgICAgICAuZ2V0KFwiZml4dHVyZUNvbmZpZ0lkXCIpXHJcbiAgICAgICAgPy52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgobmV3VmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMuY2hhbmdlRml4dHVyZVRlbXBsYXRlKG5ld1ZhbHVlLCBcImZsb29yXCIsIGspO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKHN1YikgdGhpcy5maXh0dXJlQ29uZmlnU3Vic2NyaXB0aW9ucy5wdXNoKHN1Yik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHN1YnNjcmliZVRvT3RoZXJFbGVtZW50c0NoYW5nZXMoKSB7XHJcbiAgICB0aGlzLm90aGVyRWxlbWVudHNTdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YikgPT4gc3ViPy51bnN1YnNjcmliZSgpKTtcclxuICAgIHRoaXMub3RoZXJFbGVtZW50c1N1YnNjcmlwdGlvbnMgPSBbXTtcclxuXHJcbiAgICAvLyBXYWxsLWxldmVsIG90aGVyRWxlbWVudHMgbGFiZWwgc3Vic2NyaXB0aW9uc1xyXG4gICAgdGhpcy5nZXRGb3JtV2FsbHMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xyXG4gICAgICBjb25zdCB3YWxsR3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcclxuICAgICAgY29uc3Qgb3RoZXJBcnJheSA9IHdhbGxHcm91cC5nZXQoXCJvdGhlckVsZW1lbnRzXCIpIGFzIEZvcm1BcnJheTtcclxuXHJcbiAgICAgIG90aGVyQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY3RybCwgb3RoZXJJZHgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGVtZW50R3JvdXAgPSBjdHJsIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBjb25zdCB0eXBlQ29udHJvbCA9IGVsZW1lbnRHcm91cC5nZXQoXCJ0eXBlXCIpIGFzIEZvcm1Db250cm9sO1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbU5hbWVDb250cm9sID0gZWxlbWVudEdyb3VwLmdldChcImN1c3RvbU5hbWVcIikgYXMgRm9ybUNvbnRyb2w7XHJcblxyXG4gICAgICAgIGNvbnN0IHdhbGxNZXRhID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5maW5kKFxyXG4gICAgICAgICAgKGVsOiBhbnkpID0+XHJcbiAgICAgICAgICAgIGVsLmVsZW1lbnRUeXBlID09PSB3YWxsR3JvdXAuZ2V0KFwiZWxlbWVudFR5cGVcIik/LnZhbHVlICYmXHJcbiAgICAgICAgICAgIGVsLmVsZW1lbnROdW1iZXIgPT09IHdhbGxHcm91cC5nZXQoXCJlbGVtZW50TnVtYmVyXCIpPy52YWx1ZSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWYgPSB3YWxsTWV0YT8ub3RoZXJFbGVtZW50cz8uW290aGVySWR4XTtcclxuICAgICAgICBpZiAoIWVsZW1lbnRSZWYpIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gd2hlbiB0eXBlIGNoYW5nZXMgKGRyb3Bkb3duKVxyXG4gICAgICAgIGNvbnN0IHN1YlR5cGUgPSB0eXBlQ29udHJvbC52YWx1ZUNoYW5nZXNcclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKHNlbGVjdGVkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgLy8gaWYgdXNlciBwaWNrcyBcIk90aGVyc1wiLCBwcmVmZXIgY3VzdG9tTmFtZSBpZiBwcmVzZW50LCBvdGhlcndpc2Ugc2V0IGZpeHR1cmVOYW1lIHRvIFwiT3RoZXJzXCJcclxuICAgICAgICAgICAgZWxlbWVudFJlZi5maXh0dXJlTmFtZSA9XHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWQgPT09IFwiT3RoZXJzXCJcclxuICAgICAgICAgICAgICAgID8gY3VzdG9tTmFtZUNvbnRyb2w/LnZhbHVlIHx8IFwiT3RoZXJzXCJcclxuICAgICAgICAgICAgICAgIDogc2VsZWN0ZWQ7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FudmFzT3RoZXJFbGVtZW50TGFiZWwoZWxlbWVudFJlZik7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gd2hlbiBjdXN0b21OYW1lIGNoYW5nZXMgKHRleHQgaW5wdXQgdmlzaWJsZSBvbmx5IHdoZW4gdHlwZSA9PT0gJ090aGVycycpXHJcbiAgICAgICAgY29uc3Qgc3ViQ3VzdG9tID0gY3VzdG9tTmFtZUNvbnRyb2wudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChjdXN0b206IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAodHlwZUNvbnRyb2wudmFsdWUgPT09IFwiT3RoZXJzXCIpIHtcclxuICAgICAgICAgICAgICBlbGVtZW50UmVmLmZpeHR1cmVOYW1lID0gY3VzdG9tO1xyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FudmFzT3RoZXJFbGVtZW50TGFiZWwoZWxlbWVudFJlZik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLm90aGVyRWxlbWVudHNTdWJzY3JpcHRpb25zLnB1c2goc3ViVHlwZSwgc3ViQ3VzdG9tKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBGbG9vci1sZXZlbCBvdGhlckVsZW1lbnRzIGxhYmVsIHN1YnNjcmlwdGlvbnNcclxuICAgIHRoaXMuZ2V0Rm9ybUZsb29yT3RoZXJFbGVtZW50cy5jb250cm9scy5mb3JFYWNoKChjdHJsLCBpZHgpID0+IHtcclxuICAgICAgY29uc3QgZWxlbWVudEdyb3VwID0gY3RybCBhcyBGb3JtR3JvdXA7XHJcbiAgICAgIGNvbnN0IHR5cGVDb250cm9sID0gZWxlbWVudEdyb3VwLmdldChcInR5cGVcIikgYXMgRm9ybUNvbnRyb2w7XHJcbiAgICAgIGNvbnN0IGN1c3RvbU5hbWVDb250cm9sID0gZWxlbWVudEdyb3VwLmdldChcImN1c3RvbU5hbWVcIikgYXMgRm9ybUNvbnRyb2w7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnRSZWYgPSB0aGlzLmZsb29yRGF0YT8ub3RoZXJFbGVtZW50cz8uW2lkeF07XHJcbiAgICAgIGlmICghZWxlbWVudFJlZikgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3Qgc3ViVHlwZSA9IHR5cGVDb250cm9sLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChzZWxlY3RlZDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBlbGVtZW50UmVmLmZpeHR1cmVOYW1lID1cclxuICAgICAgICAgICAgc2VsZWN0ZWQgPT09IFwiT3RoZXJzXCJcclxuICAgICAgICAgICAgICA/IGN1c3RvbU5hbWVDb250cm9sPy52YWx1ZSB8fCBcIk90aGVyc1wiXHJcbiAgICAgICAgICAgICAgOiBzZWxlY3RlZDtcclxuICAgICAgICAgIHRoaXMudXBkYXRlQ2FudmFzT3RoZXJFbGVtZW50TGFiZWwoZWxlbWVudFJlZik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBzdWJDdXN0b20gPSBjdXN0b21OYW1lQ29udHJvbC52YWx1ZUNoYW5nZXNcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoY3VzdG9tOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGlmICh0eXBlQ29udHJvbC52YWx1ZSA9PT0gXCJPdGhlcnNcIikge1xyXG4gICAgICAgICAgICBlbGVtZW50UmVmLmZpeHR1cmVOYW1lID0gY3VzdG9tO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbnZhc090aGVyRWxlbWVudExhYmVsKGVsZW1lbnRSZWYpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5vdGhlckVsZW1lbnRzU3Vic2NyaXB0aW9ucy5wdXNoKHN1YlR5cGUsIHN1YkN1c3RvbSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUNhbnZhc090aGVyRWxlbWVudExhYmVsKGVsZW1lbnRSZWY6IGFueSkge1xyXG4gICAgaWYgKCF0aGlzLmNhbnZhcykgcmV0dXJuO1xyXG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmNhbnZhc1xyXG4gICAgICAuZ2V0T2JqZWN0cygpXHJcbiAgICAgIC5maW5kKFxyXG4gICAgICAgIChvYmo6IGFueSkgPT5cclxuICAgICAgICAgIG9iaj8ub2JqVHlwZSA9PT0gXCJvdGhlcnNcIiAmJiBvYmo/LmRhdGEuX2lkID09PSBlbGVtZW50UmVmLl9pZCxcclxuICAgICAgKSBhcyBhbnk7XHJcblxyXG4gICAgaWYgKCFncm91cCkgcmV0dXJuO1xyXG4gICAgZ3JvdXAuZGF0YSA9IGVsZW1lbnRSZWY7XHJcblxyXG4gICAgY29uc3QgdGV4dE9iaiA9IChncm91cC5nZXRPYmplY3RzKCkgfHwgW10pLmZpbmQoXHJcbiAgICAgIChvOiBhbnkpID0+IG8/LnR5cGUgPT09IFwidGV4dFwiIHx8IG8/LnR5cGUgPT09IFwidGV4dGJveFwiLFxyXG4gICAgKSBhcyBmYWJyaWMuVGV4dCB8IGZhYnJpYy5UZXh0Ym94IHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIGlmICh0ZXh0T2JqKSB7XHJcbiAgICAgICh0ZXh0T2JqIGFzIGFueSkuc2V0KHsgdGV4dDogZWxlbWVudFJlZi5maXh0dXJlTmFtZSB9KTtcclxuICAgICAgdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcm90YXRlQ2FudmFzKGNhbnZhczogZmFicmljLkNhbnZhcywgYW5nbGVEZWc6IG51bWJlcikge1xyXG4gICAgaWYgKCFjYW52YXMpIHJldHVybjtcclxuICAgIGNvbnN0IGFsbE9iamVjdHMgPSBjYW52YXMuZ2V0T2JqZWN0cygpO1xyXG4gICAgaWYgKCFhbGxPYmplY3RzIHx8IGFsbE9iamVjdHMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgLy8gQ3JlYXRlIGFuIEFjdGl2ZVNlbGVjdGlvbiBjb250YWluaW5nIGFsbCBvYmplY3RzIG9uIHRoZSBjYW52YXNcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IG5ldyBmYWJyaWMuQWN0aXZlU2VsZWN0aW9uKGFsbE9iamVjdHMgYXMgYW55LCB7IGNhbnZhcyB9KTtcclxuICAgIGNhbnZhcy5zZXRBY3RpdmVPYmplY3Qoc2VsZWN0aW9uKTtcclxuXHJcbiAgICAvLyBSb3RhdGUgdGhlIEFjdGl2ZVNlbGVjdGlvbiBkaXJlY3RseSAod29ya3MgbGlrZSBhIHRlbXBvcmFyeSBncm91cClcclxuICAgIGNvbnN0IGFjdGl2ZTogYW55ID0gY2FudmFzLmdldEFjdGl2ZU9iamVjdCgpO1xyXG4gICAgaWYgKCFhY3RpdmUpIHtcclxuICAgICAgY2FudmFzLmRpc2NhcmRBY3RpdmVPYmplY3QoKTtcclxuICAgICAgY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGN1cnJlbnRBbmdsZSA9IGFjdGl2ZS5hbmdsZSB8fCAwO1xyXG4gICAgYWN0aXZlLnJvdGF0ZShjdXJyZW50QW5nbGUgKyBhbmdsZURlZyk7XHJcbiAgICBhY3RpdmUuc2V0Q29vcmRzKCk7XHJcblxyXG4gICAgLy8gQ2xlYXIgc2VsZWN0aW9uIGJ1dCBrZWVwIHJvdGF0ZWQgcG9zaXRpb25zIG9mIGNoaWxkIG9iamVjdHNcclxuICAgIGNhbnZhcy5kaXNjYXJkQWN0aXZlT2JqZWN0KCk7XHJcbiAgICBjYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Rml4dHVyZU9uQ2FudmFzQ2xpY2sodGFyZ2V0OiBhbnksIGNvbGxhcHNlVGFza0luZm86IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHRhcmdldCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZSA9IHtcclxuICAgICAgICBmaXh0dXJlVHlwZTogdGFyZ2V0LmZpeHR1cmVUeXBlLFxyXG4gICAgICAgIHdhbGxJbmRleDogdGFyZ2V0LndhbGxJbmRleCxcclxuICAgICAgICBmaXh0dXJlSW5kZXg6IHRhcmdldC5maXh0dXJlSW5kZXgsXHJcbiAgICAgICAgZml4dHVyZUlkOiB0YXJnZXQuZml4dHVyZUlkLFxyXG4gICAgICAgIGlzc3VlOiB0YXJnZXQuaXNzdWUsXHJcbiAgICAgICAgaXNzdWVEYXRhOiB0YXJnZXQuaXNzdWVEYXRhLFxyXG4gICAgICAgIHZtQ29uZmlnOiB0YXJnZXQudm1Db25maWcsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRGaXh0dXJlVGVtcGxhdGVzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICB9O1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5hcGlTZXJ2aWNlLmdldEFsbFRlbXBsYXRlcyhwYXlsb2FkKSxcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgZGF0YSA9IHJlcz8uZGF0YTtcclxuXHJcbiAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVzID0gZGF0YS5tYXAoKHQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgX2lkOiB0Ll9pZCxcclxuICAgICAgICAgICAgbmFtZTogdC5maXh0dXJlTmFtZS5pbmNsdWRlcyhcIi1mdFwiKVxyXG4gICAgICAgICAgICAgID8gdC5maXh0dXJlTmFtZVxyXG4gICAgICAgICAgICAgIDogYCR7dC5maXh0dXJlTmFtZX0gLSAke3QuZml4dHVyZVdpZHRoLnZhbHVlfSAke3QuZml4dHVyZVdpZHRoLnVuaXR9YCxcclxuICAgICAgICAgICAgc3VidGV4dDogYCR7dC5wcm9kdWN0QnJhbmROYW1lPy5qb2luKFwiLCBcIil9YCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBmaXh0dXJlIHRlbXBsYXRlczpcIiwgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlRm9ybSgpIHtcclxuICAgIHRoaXMubGF5b3V0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICB3YWxsczogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICAgIGZsb29yRml4dHVyZXM6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBmbG9vck90aGVyRWxlbWVudHM6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZ2V0Rm9ybVdhbGxzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJ3YWxsc1wiKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgZ2V0Rm9ybUZsb29yRml4dHVyZXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sYXlvdXRGb3JtLmdldChcImZsb29yRml4dHVyZXNcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdldEZvcm1GbG9vck90aGVyRWxlbWVudHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sYXlvdXRGb3JtLmdldChcImZsb29yT3RoZXJFbGVtZW50c1wiKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgZ2V0RW50cmFuY2VzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmxvb3JEYXRhPy5sYXlvdXRQb2x5Z29uPy5maWx0ZXIoXHJcbiAgICAgIChlbGU6IGFueSkgPT4gZWxlLmVsZW1lbnRUeXBlID09PSBcImVudHJhbmNlXCIsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0V2FsbE90aGVyRWxlbWVudHMod2FsbEluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiAodGhpcy5sYXlvdXRGb3JtLmdldChcIndhbGxzXCIpIGFzIEZvcm1BcnJheSlcclxuICAgICAgLmF0KHdhbGxJbmRleClcclxuICAgICAgLmdldChcIm90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybUZpeHR1cmVzKHdhbGxJbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJ3YWxsc1wiKSBhcyBGb3JtQXJyYXkpXHJcbiAgICAgIC5hdCh3YWxsSW5kZXgpXHJcbiAgICAgIC5nZXQoXCJmaXh0dXJlc1wiKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBwYXRjaFdhbGxFbGVtZW50cyh7IGVsZW1lbnRUeXBlLCBlbGVtZW50TnVtYmVyIH06IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgZWxlbWVudFR5cGU6IFtlbGVtZW50VHlwZSA/IGVsZW1lbnRUeXBlIDogXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgZWxlbWVudE51bWJlcjogW2VsZW1lbnROdW1iZXIgPyBlbGVtZW50TnVtYmVyIDogMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgZml4dHVyZXM6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBvdGhlckVsZW1lbnRzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGl0ZW07XHJcbiAgfVxyXG5cclxuICBwYXRjaEZpeHR1cmUoeyBmaXh0dXJlTmFtZSwgZml4dHVyZUNvbmZpZ0lkLCBfaWQgfTogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBmaXh0dXJlTmFtZTogW2ZpeHR1cmVOYW1lID8gZml4dHVyZU5hbWUgOiBcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICBmaXh0dXJlQ29uZmlnSWQ6IFtcclxuICAgICAgICBmaXh0dXJlQ29uZmlnSWQgPyBmaXh0dXJlQ29uZmlnSWQgOiBcIlwiLFxyXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgXSxcclxuICAgICAgX2lkOiBbX2lkID8gX2lkIDogXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGl0ZW07XHJcbiAgfVxyXG5cclxuICBhZGRXYWxsU3BhY2Uod2FsbEluZGV4OiBudW1iZXIsIG9wZXJhdGlvbjogXCJpbmNyZW1lbnRcIiB8IFwiZGVjcmVtZW50XCIpIHtcclxuICAgIGlmICh0aGlzLmxheW91dEZvcm0uZGlzYWJsZWQpIHJldHVybjtcclxuICAgIGNvbnN0IGNsaWNrZWRXYWxsTnVtYmVyID0gd2FsbEluZGV4ICsgMTtcclxuICAgIGNvbnN0IG1tVG9GZWV0ID0gMzA1O1xyXG4gICAgY29uc3QgZml4dHVyZUhlaWdodCA9IDE1MjQgLyBtbVRvRmVldDsgLy8gfjUgZnQgKGhvcml6b250YWwgaW5jcmVtZW50KVxyXG4gICAgY29uc3QgZml4dHVyZVdpZHRoID0gMTIyMCAvIG1tVG9GZWV0OyAvLyB+NCBmdCAodmVydGljYWwgaW5jcmVtZW50KVxyXG5cclxuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb247XHJcblxyXG4gICAgY29uc3QgZ2V0V2FsbCA9IChudW06IG51bWJlcikgPT5cclxuICAgICAgbGF5b3V0LmZpbmQoXHJcbiAgICAgICAgKGVsOiBhbnkpID0+IGVsLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiBlbC5lbGVtZW50TnVtYmVyID09PSBudW0sXHJcbiAgICAgICk7XHJcblxyXG4gICAgY29uc3QgYW1vdW50ID0gb3BlcmF0aW9uID09PSBcImluY3JlbWVudFwiID8gMSA6IC0xO1xyXG5cclxuICAgIGNvbnN0IHcxID0gZ2V0V2FsbCgxKTtcclxuICAgIGNvbnN0IHcyID0gZ2V0V2FsbCgyKTtcclxuICAgIGNvbnN0IHczID0gZ2V0V2FsbCgzKTtcclxuICAgIGNvbnN0IHc0ID0gZ2V0V2FsbCg0KTtcclxuICAgIGNvbnN0IHc1ID0gZ2V0V2FsbCg1KTtcclxuICAgIGNvbnN0IGVudHJhbmNlID0gbGF5b3V0LmZpbmQoKGVsOiBhbnkpID0+IGVsLmVsZW1lbnRUeXBlID09PSBcImVudHJhbmNlXCIpO1xyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEhvcml6b250YWwgZ3Jvd3RoICAoV2FsbC0xIC8gV2FsbC0zKVxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgaWYgKGNsaWNrZWRXYWxsTnVtYmVyID09PSAxIHx8IGNsaWNrZWRXYWxsTnVtYmVyID09PSAzKSB7XHJcbiAgICAgIGlmICh3MSkgdzEuZGlzdGFuY2UgKz0gYW1vdW50ICogZml4dHVyZVdpZHRoO1xyXG4gICAgICBpZiAodzMpIHczLmRpc3RhbmNlICs9IGFtb3VudCAqIGZpeHR1cmVXaWR0aDtcclxuXHJcbiAgICAgIGlmICh3Mikge1xyXG4gICAgICAgIHcyLmZpeHR1cmVzLmZvckVhY2goKGZ4OiBhbnkpID0+IHtcclxuICAgICAgICAgIGZ4LnJlbGF0aXZlUG9zaXRpb24ueCA9XHJcbiAgICAgICAgICAgIChmeC5yZWxhdGl2ZVBvc2l0aW9uLnggfHwgMCkgKyBhbW91bnQgKiBmaXh0dXJlV2lkdGg7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBWZXJ0aWNhbCBncm93dGggIChXYWxsLTIgLyBXYWxsLTQgLyBXYWxsLTUpXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBpZiAoXHJcbiAgICAgIGNsaWNrZWRXYWxsTnVtYmVyID09PSAyIHx8XHJcbiAgICAgIGNsaWNrZWRXYWxsTnVtYmVyID09PSA0IHx8XHJcbiAgICAgIGNsaWNrZWRXYWxsTnVtYmVyID09PSA1XHJcbiAgICApIHtcclxuICAgICAgaWYgKHcyKSB3Mi5kaXN0YW5jZSArPSBhbW91bnQgKiBmaXh0dXJlSGVpZ2h0O1xyXG5cclxuICAgICAgaWYgKHczKSB7XHJcbiAgICAgICAgdzMuZml4dHVyZXMuZm9yRWFjaCgoZng6IGFueSkgPT4ge1xyXG4gICAgICAgICAgZngucmVsYXRpdmVQb3NpdGlvbi55ID1cclxuICAgICAgICAgICAgKGZ4LnJlbGF0aXZlUG9zaXRpb24ueSB8fCAwKSArIGFtb3VudCAqIGZpeHR1cmVIZWlnaHQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGVudHJhbmNlWSA9IGVudHJhbmNlPy5kaXN0YW5jZSB8fCAwO1xyXG4gICAgICBjb25zdCBleGlzdGluZ1c0ID0gdzQ/LmRpc3RhbmNlIHx8IDA7XHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nVzUgPSB3NT8uZGlzdGFuY2UgfHwgMDtcclxuXHJcbiAgICAgIC8vIEdyb3cgd2FsbC00IGlmIHdlIGNsaWNrZWQgd2FsbC00IE9SIHdhbGwtMlxyXG4gICAgICBpZiAoKGNsaWNrZWRXYWxsTnVtYmVyID09PSA0IHx8IGNsaWNrZWRXYWxsTnVtYmVyID09PSAyKSAmJiB3NCkge1xyXG4gICAgICAgIHc0LmRpc3RhbmNlID0gdGhpcy5yb3VuZFRvVHdvKGV4aXN0aW5nVzQgKyBhbW91bnQgKiBmaXh0dXJlSGVpZ2h0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gR3JvdyB3YWxsLTUgaWYgd2UgY2xpY2tlZCB3YWxsLTUgT1Igd2FsbC0yXHJcbiAgICAgIGlmICgoY2xpY2tlZFdhbGxOdW1iZXIgPT09IDUgfHwgY2xpY2tlZFdhbGxOdW1iZXIgPT09IDIpICYmIHc1KSB7XHJcbiAgICAgICAgdzUuZGlzdGFuY2UgPSB0aGlzLnJvdW5kVG9Ud28oZXhpc3RpbmdXNSArIGFtb3VudCAqIGZpeHR1cmVIZWlnaHQpO1xyXG5cclxuICAgICAgICBpZiAodzQpIHtcclxuICAgICAgICAgIHc0LmZpeHR1cmVzLmZvckVhY2goKGZ4OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgZngucmVsYXRpdmVQb3NpdGlvbi55ID1cclxuICAgICAgICAgICAgICAoZngucmVsYXRpdmVQb3NpdGlvbi55IHx8IDApICsgYW1vdW50ICogZml4dHVyZUhlaWdodDtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUHJldmVudCBvdmVyZmxvdzogc2hyaW5rIGJhY2sgaWYgdG90YWwgPiB3MiBzaXplXHJcbiAgICAgIGNvbnN0IHRvdGFsVXNlZCA9IGVudHJhbmNlWSArICh3ND8uZGlzdGFuY2UgfHwgMCkgKyAodzU/LmRpc3RhbmNlIHx8IDApO1xyXG4gICAgICBpZiAodG90YWxVc2VkID4gdzIhLmRpc3RhbmNlKSB7XHJcbiAgICAgICAgaWYgKHc1KSB7XHJcbiAgICAgICAgICB3NS5kaXN0YW5jZSA9IHRoaXMucm91bmRUb1R3byhcclxuICAgICAgICAgICAgdzUuZGlzdGFuY2UgLSAodG90YWxVc2VkIC0gdzIhLmRpc3RhbmNlKSxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVGaXh0dXJlKFxyXG4gICAgZml4dHVyZVR5cGU6IFwid2FsbFwiIHwgXCJmbG9vclwiLFxyXG4gICAgZml4dHVyZUluZGV4OiBudW1iZXIsXHJcbiAgICB3YWxsSW5kZXg/OiBudW1iZXIsXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5sYXlvdXRGb3JtLmRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgaWYgKGZpeHR1cmVUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICB0aGlzLmdldEZvcm1GaXh0dXJlcyh3YWxsSW5kZXghKS5yZW1vdmVBdChmaXh0dXJlSW5kZXgpO1xyXG5cclxuICAgICAgY29uc3Qgd2FsbCA9IHRoaXMuZ2V0V2FsbEJ5TnVtYmVyKHdhbGxJbmRleCEgKyAxKTtcclxuICAgICAgaWYgKHdhbGwgJiYgQXJyYXkuaXNBcnJheSh3YWxsLmZpeHR1cmVzKSkge1xyXG4gICAgICAgIHdhbGwuZml4dHVyZXMuc3BsaWNlKGZpeHR1cmVJbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoZml4dHVyZVR5cGUgPT09IFwiZmxvb3JcIikge1xyXG4gICAgICB0aGlzLmdldEZvcm1GbG9vckZpeHR1cmVzLnJlbW92ZUF0KGZpeHR1cmVJbmRleCk7XHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlKSkge1xyXG4gICAgICAgIHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUuc3BsaWNlKGZpeHR1cmVJbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxheW91dEhhc1Vuc2F2ZWRDaGFuZ2VzID0gdHJ1ZTtcclxuICAgIHRoaXMucmVuZGVyRmxvb3IoZmFsc2UpO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVPdGhlckVsZW1lbnQoXHJcbiAgICBlbGVtZW50VHlwZTogXCJ3YWxsXCIgfCBcImZsb29yXCIsXHJcbiAgICBlbGVtZW50SW5kZXg6IG51bWJlcixcclxuICAgIHdhbGxJbmRleD86IG51bWJlcixcclxuICApIHtcclxuICAgIGlmICh0aGlzLmxheW91dEZvcm0uZGlzYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICBpZiAoZWxlbWVudFR5cGUgPT09IFwid2FsbFwiKSB7XHJcbiAgICAgIHRoaXMuZ2V0V2FsbE90aGVyRWxlbWVudHMod2FsbEluZGV4ISkucmVtb3ZlQXQoZWxlbWVudEluZGV4KTtcclxuXHJcbiAgICAgIGNvbnN0IHdhbGwgPSB0aGlzLmdldFdhbGxCeU51bWJlcih3YWxsSW5kZXghICsgMSk7XHJcbiAgICAgIGlmICh3YWxsICYmIEFycmF5LmlzQXJyYXkod2FsbC5vdGhlckVsZW1lbnRzKSkge1xyXG4gICAgICAgIHdhbGwub3RoZXJFbGVtZW50cy5zcGxpY2UoZWxlbWVudEluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gXCJmbG9vclwiKSB7XHJcbiAgICAgIHRoaXMuZ2V0Rm9ybUZsb29yT3RoZXJFbGVtZW50cy5yZW1vdmVBdChlbGVtZW50SW5kZXgpO1xyXG5cclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5mbG9vckRhdGEub3RoZXJFbGVtZW50cykpIHtcclxuICAgICAgICB0aGlzLmZsb29yRGF0YS5vdGhlckVsZW1lbnRzLnNwbGljZShlbGVtZW50SW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sYXlvdXRIYXNVbnNhdmVkQ2hhbmdlcyA9IHRydWU7XHJcbiAgICB0aGlzLnJlbmRlckZsb29yKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIGNoYW5nZUZpeHR1cmVUZW1wbGF0ZShcclxuICAgIGNvbmZpZ0lkOiBzdHJpbmcsXHJcbiAgICBmaXh0dXJlVHlwZTogXCJ3YWxsXCIgfCBcImZsb29yXCIsXHJcbiAgICBmaXh0dXJlSW5kZXg6IG51bWJlcixcclxuICAgIHdhbGxJbmRleD86IG51bWJlcixcclxuICApIHtcclxuICAgIHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAuZ2V0Rml4dHVyZVRlbXBsYXRlKGNvbmZpZ0lkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGZpeHR1cmVUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZURhdGEgPSByZXMuZGF0YTtcclxuICAgICAgICAgICAgY29uc3QgZml4dHVyZUlkID0gYG5ldy0ke2NyeXB0by5yYW5kb21VVUlEKCl9YDtcclxuICAgICAgICAgICAgY29uc3QgZml4dHVyZUdyb3VwID0gdGhpcy5wYXRjaEZpeHR1cmUoe1xyXG4gICAgICAgICAgICAgIGZpeHR1cmVOYW1lOiB0ZW1wbGF0ZURhdGEuZml4dHVyZU5hbWUsXHJcbiAgICAgICAgICAgICAgZml4dHVyZUNvbmZpZ0lkOiB0ZW1wbGF0ZURhdGEuX2lkLFxyXG4gICAgICAgICAgICAgIF9pZDogZml4dHVyZUlkLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5nZXRGb3JtRml4dHVyZXMod2FsbEluZGV4ISkuc2V0Q29udHJvbChcclxuICAgICAgICAgICAgICBmaXh0dXJlSW5kZXgsXHJcbiAgICAgICAgICAgICAgZml4dHVyZUdyb3VwLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlRGF0YSA9IHtcclxuICAgICAgICAgICAgICAuLi50ZW1wbGF0ZURhdGEsXHJcbiAgICAgICAgICAgICAgZml4dHVyZUNvbmZpZ0lkOiB0ZW1wbGF0ZURhdGEuX2lkLFxyXG4gICAgICAgICAgICAgIF9pZDogZml4dHVyZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCB3YWxsUmVmID0gdGhpcy5nZXRXYWxsQnlOdW1iZXIod2FsbEluZGV4ISArIDEpITtcclxuICAgICAgICAgICAgd2FsbFJlZi5maXh0dXJlc1tmaXh0dXJlSW5kZXhdID0ge1xyXG4gICAgICAgICAgICAgIC4uLndhbGxSZWYuZml4dHVyZXNbZml4dHVyZUluZGV4XSxcclxuICAgICAgICAgICAgICAuLi5maXh0dXJlRGF0YSxcclxuICAgICAgICAgICAgICB1bnNhdmVkQ2hhbmdlczogdHJ1ZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRIYXNVbnNhdmVkQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpeHR1cmVUeXBlID09PSBcImZsb29yXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVEYXRhID0gcmVzLmRhdGE7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmVJZCA9IGBuZXctJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmVHcm91cCA9IHRoaXMucGF0Y2hGaXh0dXJlKHtcclxuICAgICAgICAgICAgICBmaXh0dXJlTmFtZTogdGVtcGxhdGVEYXRhLmZpeHR1cmVOYW1lLFxyXG4gICAgICAgICAgICAgIGZpeHR1cmVDb25maWdJZDogdGVtcGxhdGVEYXRhLl9pZCxcclxuICAgICAgICAgICAgICBfaWQ6IGZpeHR1cmVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICh0aGlzLmxheW91dEZvcm0uZ2V0KFwiZmxvb3JGaXh0dXJlc1wiKSBhcyBGb3JtQXJyYXkpLnNldENvbnRyb2woXHJcbiAgICAgICAgICAgICAgZml4dHVyZUluZGV4LFxyXG4gICAgICAgICAgICAgIGZpeHR1cmVHcm91cCxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29uc3QgZml4dHVyZURhdGEgPSB7XHJcbiAgICAgICAgICAgICAgLi4udGVtcGxhdGVEYXRhLFxyXG4gICAgICAgICAgICAgIGZpeHR1cmVDb25maWdJZDogdGVtcGxhdGVEYXRhLl9pZCxcclxuICAgICAgICAgICAgICBfaWQ6IGZpeHR1cmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZVtmaXh0dXJlSW5kZXhdID0ge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmVbZml4dHVyZUluZGV4XSxcclxuICAgICAgICAgICAgICAuLi5maXh0dXJlRGF0YSxcclxuICAgICAgICAgICAgICB1bnNhdmVkQ2hhbmdlczogdHJ1ZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRIYXNVbnNhdmVkQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byBmZXRjaCB0ZW1wbGF0ZXNcIik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkRyb3AoXHJcbiAgICBldmVudDogYW55LFxyXG4gICAgZGVzdGluYXRpb25XYWxsSW5kZXg6IG51bWJlciB8IFwiZmxvb3JcIixcclxuICAgIGRlc3RpbmF0aW9uRml4dHVyZUluZGV4PzogbnVtYmVyLFxyXG4gICkge1xyXG4gICAgY29uc3QgZGF0YSA9IGV2ZW50LmRhdGE7XHJcblxyXG4gICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgY29uc3QgaXNTb3VyY2VGbG9vciA9IGRhdGEud2FsbEluZGV4ID09PSBcImZsb29yXCI7XHJcbiAgICBjb25zdCBpc0Rlc3RpbmF0aW9uRmxvb3IgPSBkZXN0aW5hdGlvbldhbGxJbmRleCA9PT0gXCJmbG9vclwiO1xyXG5cclxuICAgIGNvbnN0IHNvdXJjZUZvcm1BcnJheTogRm9ybUFycmF5ID0gaXNTb3VyY2VGbG9vclxyXG4gICAgICA/IHRoaXMuZ2V0Rm9ybUZsb29yRml4dHVyZXNcclxuICAgICAgOiB0aGlzLmdldEZvcm1GaXh0dXJlcyhkYXRhLndhbGxJbmRleCk7XHJcblxyXG4gICAgY29uc3QgZGVzdGluYXRpb25Gb3JtQXJyYXk6IEZvcm1BcnJheSA9IGlzRGVzdGluYXRpb25GbG9vclxyXG4gICAgICA/IHRoaXMuZ2V0Rm9ybUZsb29yRml4dHVyZXNcclxuICAgICAgOiB0aGlzLmdldEZvcm1GaXh0dXJlcyhkZXN0aW5hdGlvbldhbGxJbmRleCBhcyBudW1iZXIpO1xyXG5cclxuICAgIGNvbnN0IHNvdXJjZVdhbGxNZXRhID0gaXNTb3VyY2VGbG9vclxyXG4gICAgICA/IHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmVcclxuICAgICAgOiAodGhpcy5nZXRXYWxsQnlOdW1iZXIoXHJcbiAgICAgICAgICB0aGlzLmdldEZvcm1XYWxscy5hdChkYXRhLndhbGxJbmRleCkuZ2V0KFwiZWxlbWVudE51bWJlclwiKT8udmFsdWUsXHJcbiAgICAgICAgKT8uZml4dHVyZXMgPz8gW10pO1xyXG5cclxuICAgIGNvbnN0IGRlc3RpbmF0aW9uV2FsbE1ldGEgPSBpc0Rlc3RpbmF0aW9uRmxvb3JcclxuICAgICAgPyB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlXHJcbiAgICAgIDogKHRoaXMuZ2V0V2FsbEJ5TnVtYmVyKFxyXG4gICAgICAgICAgdGhpcy5nZXRGb3JtV2FsbHNcclxuICAgICAgICAgICAgLmF0KGRlc3RpbmF0aW9uV2FsbEluZGV4IGFzIG51bWJlcilcclxuICAgICAgICAgICAgLmdldChcImVsZW1lbnROdW1iZXJcIik/LnZhbHVlLFxyXG4gICAgICAgICk/LmZpeHR1cmVzID8/IFtdKTtcclxuXHJcbiAgICBjb25zdCBzRml4dHVyZUluZGV4ID0gc291cmNlV2FsbE1ldGEuZmluZEluZGV4KFxyXG4gICAgICAoZml4dHVyZTogYW55KSA9PlxyXG4gICAgICAgIGZpeHR1cmUuX2lkID09PVxyXG4gICAgICAgIHNvdXJjZUZvcm1BcnJheS5hdChkYXRhLmZpeHR1cmVJbmRleCk/LmdldChcIl9pZFwiKT8udmFsdWUsXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGRGaXh0dXJlSW5kZXggPVxyXG4gICAgICBkZXN0aW5hdGlvbkZpeHR1cmVJbmRleCAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgPyBkZXN0aW5hdGlvbldhbGxNZXRhLmZpbmRJbmRleChcclxuICAgICAgICAgICAgKGZpeHR1cmU6IGFueSkgPT5cclxuICAgICAgICAgICAgICBmaXh0dXJlLl9pZCA9PT1cclxuICAgICAgICAgICAgICBkZXN0aW5hdGlvbkZvcm1BcnJheS5hdChkZXN0aW5hdGlvbkZpeHR1cmVJbmRleCk/LmdldChcIl9pZFwiKVxyXG4gICAgICAgICAgICAgICAgPy52YWx1ZSxcclxuICAgICAgICAgIClcclxuICAgICAgICA6IGRlc3RpbmF0aW9uRm9ybUFycmF5Lmxlbmd0aDtcclxuXHJcbiAgICBjb25zdCBzUG9zaXRpb24gPSB7XHJcbiAgICAgIGZpeHR1cmVOdW1iZXI6IHNvdXJjZVdhbGxNZXRhW3NGaXh0dXJlSW5kZXhdLmZpeHR1cmVOdW1iZXIsXHJcbiAgICAgIGFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcjpcclxuICAgICAgICBzb3VyY2VXYWxsTWV0YVtzRml4dHVyZUluZGV4XS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIsXHJcbiAgICB9O1xyXG4gICAgY29uc3QgZFBvc2l0aW9uID0ge1xyXG4gICAgICBmaXh0dXJlTnVtYmVyOiBkZXN0aW5hdGlvbldhbGxNZXRhW2RGaXh0dXJlSW5kZXhdLmZpeHR1cmVOdW1iZXIsXHJcbiAgICAgIGFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcjpcclxuICAgICAgICBkZXN0aW5hdGlvbldhbGxNZXRhW2RGaXh0dXJlSW5kZXhdLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcixcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHNvdXJjZVdhbGxNZXRhID09PSBkZXN0aW5hdGlvbldhbGxNZXRhKSB7XHJcbiAgICAgIGRlc3RpbmF0aW9uV2FsbE1ldGFbZEZpeHR1cmVJbmRleF0uZml4dHVyZU51bWJlciA9XHJcbiAgICAgICAgc1Bvc2l0aW9uLmZpeHR1cmVOdW1iZXI7XHJcbiAgICAgIGRlc3RpbmF0aW9uV2FsbE1ldGFbZEZpeHR1cmVJbmRleF0uYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyID1cclxuICAgICAgICBzUG9zaXRpb24uYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyO1xyXG4gICAgICBzb3VyY2VXYWxsTWV0YVtzRml4dHVyZUluZGV4XS5maXh0dXJlTnVtYmVyID0gZFBvc2l0aW9uLmZpeHR1cmVOdW1iZXI7XHJcbiAgICAgIHNvdXJjZVdhbGxNZXRhW3NGaXh0dXJlSW5kZXhdLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlciA9XHJcbiAgICAgICAgZFBvc2l0aW9uLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNvdXJjZVdhbGxNZXRhW3NGaXh0dXJlSW5kZXhdLmZpeHR1cmVOdW1iZXIgPSBkUG9zaXRpb24uZml4dHVyZU51bWJlcjtcclxuICAgICAgc291cmNlV2FsbE1ldGFbc0ZpeHR1cmVJbmRleF0uYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyID1cclxuICAgICAgICBkUG9zaXRpb24uYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudHJhbnNmZXJBcnJheUl0ZW0oXHJcbiAgICAgIHNvdXJjZUZvcm1BcnJheS5jb250cm9scyxcclxuICAgICAgZGVzdGluYXRpb25Gb3JtQXJyYXkuY29udHJvbHMsXHJcbiAgICAgIGRhdGEuZml4dHVyZUluZGV4LFxyXG4gICAgICBkRml4dHVyZUluZGV4LFxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnRyYW5zZmVyQXJyYXlJdGVtKFxyXG4gICAgICBzb3VyY2VXYWxsTWV0YSxcclxuICAgICAgZGVzdGluYXRpb25XYWxsTWV0YSxcclxuICAgICAgc0ZpeHR1cmVJbmRleCxcclxuICAgICAgZEZpeHR1cmVJbmRleCxcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZENhbnZhcygpIHtcclxuICAgIGlmICghdGhpcy5jYW52YXMpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBvcmlnaW5hbFZpZXdwb3J0ID0gW1xyXG4gICAgICAuLi50aGlzLmNhbnZhcy52aWV3cG9ydFRyYW5zZm9ybSEsXHJcbiAgICBdIGFzIGZhYnJpYy5UTWF0MkQ7XHJcblxyXG4gICAgdGhpcy5jYW52YXMuc2V0Vmlld3BvcnRUcmFuc2Zvcm0oWzEsIDAsIDAsIDEsIDAsIDBdKTtcclxuXHJcbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmdldEZ1bGxMYXlvdXRCb3VuZHMoKTtcclxuXHJcbiAgICBjb25zdCBkYXRhVVJMID0gdGhpcy5jYW52YXMudG9EYXRhVVJMKHtcclxuICAgICAgZm9ybWF0OiBcInBuZ1wiLFxyXG4gICAgICBsZWZ0OiBib3VuZHMubGVmdCxcclxuICAgICAgdG9wOiBib3VuZHMudG9wLFxyXG4gICAgICB3aWR0aDogYm91bmRzLndpZHRoLFxyXG4gICAgICBoZWlnaHQ6IGJvdW5kcy5oZWlnaHQsXHJcbiAgICAgIG11bHRpcGxpZXI6IDIsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbnZhcy5zZXRWaWV3cG9ydFRyYW5zZm9ybShvcmlnaW5hbFZpZXdwb3J0KTtcclxuXHJcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICBsaW5rLmhyZWYgPSBkYXRhVVJMO1xyXG4gICAgbGluay5kb3dubG9hZCA9IGAke3RoaXMucGxhbm9EYXRhLnN0b3JlTmFtZX1fJHt0aGlzLmZsb29yRGF0YS5mbG9vck5hbWV9LnBuZ2A7XHJcbiAgICBsaW5rLmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUV4cG9ydExheW91dEJhY2tncm91bmQoKSB7XHJcbiAgICBjb25zdCBwb2ludHMgPSB0aGlzLmJ1aWxkTGF5b3V0UG9seWdvbkZyb21XYWxscygpO1xyXG5cclxuICAgIHJldHVybiBuZXcgZmFicmljLlBvbHlnb24ocG9pbnRzLCB7XHJcbiAgICAgIGZpbGw6IFwiI2VhZWNmMFwiLFxyXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgIG9iamVjdENhY2hpbmc6IGZhbHNlLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkTGF5b3V0UG9seWdvbkZyb21XYWxscygpIHtcclxuICAgIHJldHVybiB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uXHJcbiAgICAgIC5maWx0ZXIoKHc6IGFueSkgPT4gdy5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIpXHJcbiAgICAgIC5tYXAoKHc6IGFueSkgPT4gKHtcclxuICAgICAgICB4OiB0aGlzLnRvUGl4ZWxzKHcucmVsYXRpdmVQb3NpdGlvbi54LCBcImZ0XCIpLFxyXG4gICAgICAgIHk6IHRoaXMudG9QaXhlbHMody5yZWxhdGl2ZVBvc2l0aW9uLnksIFwiZnRcIiksXHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHJvdGF0ZVdhbGwoZWxlTnVtYmVyOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHdhbGwgPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZpbmQoXHJcbiAgICAgIChlbDogYW55KSA9PiBlbC5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIgJiYgZWwuZWxlbWVudE51bWJlciA9PT0gZWxlTnVtYmVyLFxyXG4gICAgKTtcclxuICAgIGlmICh3YWxsLmFuZ2xlICsgOTAgPCAzNjApIHtcclxuICAgICAgd2FsbC5hbmdsZSArPSA5MDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdhbGwuYW5nbGUgPSAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZW5kZXJGbG9vcih0cnVlKTtcclxuICB9XHJcblxyXG4gIGFkZE5ld1dhbGwoZWxlTnVtYmVyOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGdldFdhbGxFbmRQb2ludCA9ICh3YWxsOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgYW5nbGVSYWQgPSAod2FsbC5hbmdsZSAqIE1hdGguUEkpIC8gMTgwO1xyXG4gICAgICBjb25zdCBsZW5ndGggPSB3YWxsLmRpc3RhbmNlO1xyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB4OiB3YWxsLnJlbGF0aXZlUG9zaXRpb24ueCArIGxlbmd0aCAqIE1hdGguY29zKGFuZ2xlUmFkKSxcclxuICAgICAgICB5OiB3YWxsLnJlbGF0aXZlUG9zaXRpb24ueSArIGxlbmd0aCAqIE1hdGguc2luKGFuZ2xlUmFkKSxcclxuICAgICAgICB1bml0OiB3YWxsLnJlbGF0aXZlUG9zaXRpb24udW5pdCxcclxuICAgICAgfTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZpbmRJbmRleChcclxuICAgICAgKHc6IGFueSkgPT4gdy5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIgJiYgdy5lbGVtZW50TnVtYmVyID09PSBlbGVOdW1iZXIsXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChpbmRleCA9PT0gLTEgJiYgZWxlTnVtYmVyICE9PSAwKSByZXR1cm47XHJcblxyXG4gICAgbGV0IHN0YXJ0UG9zaXRpb247XHJcblxyXG4gICAgaWYgKGVsZU51bWJlciA9PT0gMCkge1xyXG4gICAgICBzdGFydFBvc2l0aW9uID0ge1xyXG4gICAgICAgIHg6IDAsXHJcbiAgICAgICAgeTogMCxcclxuICAgICAgICB1bml0OiBcImZ0XCIsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBwcmV2V2FsbCA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb25baW5kZXhdO1xyXG4gICAgICBzdGFydFBvc2l0aW9uID0gZ2V0V2FsbEVuZFBvaW50KHByZXZXYWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBiYXNlV2FsbCA9XHJcbiAgICAgIGVsZU51bWJlciA9PT0gMFxyXG4gICAgICAgID8geyBhbmdsZTogMCwgZGlyZWN0aW9uOiBcInJpZ2h0XCIsIHVuaXQ6IFwiZnRcIiB9XHJcbiAgICAgICAgOiB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uW2luZGV4XTtcclxuXHJcbiAgICBjb25zdCBuZXdXYWxsID0ge1xyXG4gICAgICBlbGVtZW50VHlwZTogXCJ3YWxsXCIsXHJcbiAgICAgIGRpc3RhbmNlOiAxNSxcclxuICAgICAgdW5pdDogYmFzZVdhbGwudW5pdCxcclxuICAgICAgZGlyZWN0aW9uOiBiYXNlV2FsbC5kaXJlY3Rpb24sXHJcbiAgICAgIGFuZ2xlOiBiYXNlV2FsbC5hbmdsZSxcclxuICAgICAgZWxlbWVudE51bWJlcjogZWxlTnVtYmVyICsgMSxcclxuICAgICAgcmVsYXRpdmVQb3NpdGlvbjogc3RhcnRQb3NpdGlvbixcclxuICAgICAgZml4dHVyZXM6IFtdLFxyXG4gICAgICBvdGhlckVsZW1lbnRzOiBbXSxcclxuICAgICAgbmV3QWRkZWQ6IHRydWUsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uc3BsaWNlKFxyXG4gICAgICBlbGVOdW1iZXIgPT09IDAgPyAwIDogaW5kZXggKyAxLFxyXG4gICAgICAwLFxyXG4gICAgICBuZXdXYWxsLFxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVdhbGxFbGVtZW50TnVtYmVyKCk7XHJcbiAgICB0aGlzLnVwZGF0ZVdhbGxDb29yZGluYXRlcygpO1xyXG4gICAgdGhpcy5yZW5kZXJGbG9vcih0cnVlKTtcclxuICB9XHJcblxyXG4gIGFkZE5ld0VudHJhbmNlKCkge1xyXG4gICAgY29uc3QgbGF5b3V0UG9seWdvbiA9IHRoaXMuZmxvb3JEYXRhPy5sYXlvdXRQb2x5Z29uID8/IFtdO1xyXG4gICAgY29uc3QgZWxlTnVtYmVyID1cclxuICAgICAgbGF5b3V0UG9seWdvbi5maWx0ZXIoKGVsZTogYW55KSA9PiBlbGUuZWxlbWVudFR5cGUgPT09IFwiZW50cmFuY2VcIilcclxuICAgICAgICA/Lmxlbmd0aCA/PyAwO1xyXG5cclxuICAgIGNvbnN0IGdhcFB4ID0gMjQ7XHJcbiAgICBjb25zdCBkZWZhdWx0RW50cmFuY2VXaWR0aFB4ID0gODA7XHJcblxyXG4gICAgbGV0IHhGdCA9IDA7XHJcbiAgICBsZXQgeUZ0ID0gMDtcclxuICAgIGxldCBhbmdsZSA9IDA7XHJcbiAgICBsZXQgaXNQb3NpdGlvblJlc29sdmVkID0gZmFsc2U7XHJcblxyXG4gICAgLy8gMSkgSWYgZW50cmFuY2UocykgYWxyZWFkeSBleGlzdCwgcGxhY2UgbmV4dCB0byB0aGUgbGF0ZXN0IG9uZS5cclxuICAgIGNvbnN0IGV4aXN0aW5nRW50cmFuY2VPYmplY3RzID0gKHRoaXMuY2FudmFzPy5nZXRPYmplY3RzKCkgPz8gW10pXHJcbiAgICAgIC5maWx0ZXIoKG9iajogYW55KSA9PiBvYmo/Lm9ialR5cGUgPT09IFwiZW50cmFuY2VcIilcclxuICAgICAgLnNvcnQoXHJcbiAgICAgICAgKGE6IGFueSwgYjogYW55KSA9PlxyXG4gICAgICAgICAgTnVtYmVyKGE/LmRhdGE/LmVsZW1lbnROdW1iZXIgfHwgMCkgLVxyXG4gICAgICAgICAgTnVtYmVyKGI/LmRhdGE/LmVsZW1lbnROdW1iZXIgfHwgMCksXHJcbiAgICAgICk7XHJcblxyXG4gICAgY29uc3QgbGF0ZXN0RW50cmFuY2VPYmogPSBleGlzdGluZ0VudHJhbmNlT2JqZWN0cy5hdCgtMSkgYXMgYW55O1xyXG5cclxuICAgIGlmIChsYXRlc3RFbnRyYW5jZU9iaikge1xyXG4gICAgICBjb25zdCBsZWZ0UHggPSBsYXRlc3RFbnRyYW5jZU9iai5sZWZ0ID8/IDA7XHJcbiAgICAgIGNvbnN0IHRvcFB4ID0gbGF0ZXN0RW50cmFuY2VPYmoudG9wID8/IDA7XHJcbiAgICAgIGNvbnN0IHdpZHRoUHggPVxyXG4gICAgICAgIGxhdGVzdEVudHJhbmNlT2JqLmdldFNjYWxlZFdpZHRoPy4oKSB8fCBkZWZhdWx0RW50cmFuY2VXaWR0aFB4O1xyXG4gICAgICBjb25zdCBhbmNob3JBbmdsZSA9IE51bWJlcihsYXRlc3RFbnRyYW5jZU9iai5hbmdsZSB8fCAwKTtcclxuICAgICAgY29uc3QgYW5nbGVSYWQgPSAoYW5jaG9yQW5nbGUgKiBNYXRoLlBJKSAvIDE4MDtcclxuICAgICAgY29uc3Qgc3RlcFB4ID0gd2lkdGhQeCArIGdhcFB4O1xyXG5cclxuICAgICAgeEZ0ID0gdGhpcy5mcm9tUGl4ZWxzKGxlZnRQeCArIHN0ZXBQeCAqIE1hdGguY29zKGFuZ2xlUmFkKSwgXCJmdFwiKTtcclxuICAgICAgeUZ0ID0gdGhpcy5mcm9tUGl4ZWxzKHRvcFB4ICsgc3RlcFB4ICogTWF0aC5zaW4oYW5nbGVSYWQpLCBcImZ0XCIpO1xyXG4gICAgICBhbmdsZSA9IGFuY2hvckFuZ2xlO1xyXG4gICAgICBpc1Bvc2l0aW9uUmVzb2x2ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghaXNQb3NpdGlvblJlc29sdmVkKSB7XHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW50cmFuY2VzID0gbGF5b3V0UG9seWdvblxyXG4gICAgICAgIC5maWx0ZXIoKGVsZTogYW55KSA9PiBlbGUuZWxlbWVudFR5cGUgPT09IFwiZW50cmFuY2VcIilcclxuICAgICAgICAuc29ydChcclxuICAgICAgICAgIChhOiBhbnksIGI6IGFueSkgPT5cclxuICAgICAgICAgICAgTnVtYmVyKGE/LmVsZW1lbnROdW1iZXIgfHwgMCkgLSBOdW1iZXIoYj8uZWxlbWVudE51bWJlciB8fCAwKSxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgY29uc3QgbGF0ZXN0RW50cmFuY2UgPSBleGlzdGluZ0VudHJhbmNlcy5hdCgtMSk7XHJcbiAgICAgIGlmIChsYXRlc3RFbnRyYW5jZSkge1xyXG4gICAgICAgIGNvbnN0IGFuY2hvckFuZ2xlID0gTnVtYmVyKGxhdGVzdEVudHJhbmNlPy5hbmdsZSB8fCAwKTtcclxuICAgICAgICBjb25zdCBhbmdsZVJhZCA9IChhbmNob3JBbmdsZSAqIE1hdGguUEkpIC8gMTgwO1xyXG4gICAgICAgIGNvbnN0IHN0ZXBGdCA9XHJcbiAgICAgICAgICBOdW1iZXIoXHJcbiAgICAgICAgICAgIGxhdGVzdEVudHJhbmNlPy5kaXN0YW5jZSB8fFxyXG4gICAgICAgICAgICAgIHRoaXMuZnJvbVBpeGVscyhkZWZhdWx0RW50cmFuY2VXaWR0aFB4LCBcImZ0XCIpLFxyXG4gICAgICAgICAgKSArIHRoaXMuZnJvbVBpeGVscyhnYXBQeCwgXCJmdFwiKTtcclxuXHJcbiAgICAgICAgeEZ0ID1cclxuICAgICAgICAgIE51bWJlcihsYXRlc3RFbnRyYW5jZT8ucmVsYXRpdmVQb3NpdGlvbj8ueCB8fCAwKSArXHJcbiAgICAgICAgICBzdGVwRnQgKiBNYXRoLmNvcyhhbmdsZVJhZCk7XHJcbiAgICAgICAgeUZ0ID1cclxuICAgICAgICAgIE51bWJlcihsYXRlc3RFbnRyYW5jZT8ucmVsYXRpdmVQb3NpdGlvbj8ueSB8fCAwKSArXHJcbiAgICAgICAgICBzdGVwRnQgKiBNYXRoLnNpbihhbmdsZVJhZCk7XHJcbiAgICAgICAgYW5nbGUgPSBhbmNob3JBbmdsZTtcclxuICAgICAgICBpc1Bvc2l0aW9uUmVzb2x2ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMikgSWYgbm8gZW50cmFuY2UsIHBsYWNlIG5leHQgdG8gd2FsbC0xLlxyXG4gICAgaWYgKCFpc1Bvc2l0aW9uUmVzb2x2ZWQpIHtcclxuICAgICAgY29uc3Qgd2FsbDEgPSBsYXlvdXRQb2x5Z29uLmZpbmQoXHJcbiAgICAgICAgKGVsZTogYW55KSA9PlxyXG4gICAgICAgICAgZWxlLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiBOdW1iZXIoZWxlLmVsZW1lbnROdW1iZXIpID09PSAxLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHdhbGwxKSB7XHJcbiAgICAgICAgY29uc3Qgd2FsbEFuZ2xlID0gTnVtYmVyKHdhbGwxPy5hbmdsZSB8fCAwKTtcclxuICAgICAgICBjb25zdCB3YWxsQW5nbGVSYWQgPSAod2FsbEFuZ2xlICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICAgICAgY29uc3QgYWxvbmdXYWxsRnQgPSBNYXRoLm1pbihOdW1iZXIod2FsbDE/LmRpc3RhbmNlIHx8IDApIC8gMiwgNCk7XHJcbiAgICAgICAgY29uc3Qgc2lkZU9mZnNldEZ0ID0gMS41O1xyXG4gICAgICAgIGNvbnN0IHdhbGxYID0gTnVtYmVyKHdhbGwxPy5yZWxhdGl2ZVBvc2l0aW9uPy54IHx8IDApO1xyXG4gICAgICAgIGNvbnN0IHdhbGxZID0gTnVtYmVyKHdhbGwxPy5yZWxhdGl2ZVBvc2l0aW9uPy55IHx8IDApO1xyXG5cclxuICAgICAgICB4RnQgPVxyXG4gICAgICAgICAgd2FsbFggK1xyXG4gICAgICAgICAgYWxvbmdXYWxsRnQgKiBNYXRoLmNvcyh3YWxsQW5nbGVSYWQpICtcclxuICAgICAgICAgIHNpZGVPZmZzZXRGdCAqIC1NYXRoLnNpbih3YWxsQW5nbGVSYWQpO1xyXG4gICAgICAgIHlGdCA9XHJcbiAgICAgICAgICB3YWxsWSArXHJcbiAgICAgICAgICBhbG9uZ1dhbGxGdCAqIE1hdGguc2luKHdhbGxBbmdsZVJhZCkgK1xyXG4gICAgICAgICAgc2lkZU9mZnNldEZ0ICogTWF0aC5jb3Mod2FsbEFuZ2xlUmFkKTtcclxuICAgICAgICBhbmdsZSA9IHdhbGxBbmdsZTtcclxuICAgICAgICBpc1Bvc2l0aW9uUmVzb2x2ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMykgSWYgbm8gd2FsbCAoZS5nLiBsYXlvdXRQb2x5Z29uIGlzIGVtcHR5KSwgcGxhY2UgbmV4dCB0byBhbnkgY2FudmFzIG9iamVjdC5cclxuICAgIGlmICghaXNQb3NpdGlvblJlc29sdmVkKSB7XHJcbiAgICAgIGNvbnN0IGFuY2hvck9iaiA9ICh0aGlzLmNhbnZhcz8uZ2V0T2JqZWN0cygpID8/IFtdKS5maW5kKChvYmo6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiAhIW9iaj8ub2JqVHlwZSAmJiBvYmo/LmlzRGlzc2VjdGlvbkxpbmUgIT09IHRydWU7XHJcbiAgICAgIH0pIGFzIGFueTtcclxuXHJcbiAgICAgIGlmIChhbmNob3JPYmopIHtcclxuICAgICAgICBjb25zdCBsZWZ0UHggPSBhbmNob3JPYmoubGVmdCA/PyAwO1xyXG4gICAgICAgIGNvbnN0IHRvcFB4ID0gYW5jaG9yT2JqLnRvcCA/PyAwO1xyXG4gICAgICAgIGNvbnN0IHdpZHRoUHggPSBhbmNob3JPYmouZ2V0U2NhbGVkV2lkdGg/LigpIHx8IGRlZmF1bHRFbnRyYW5jZVdpZHRoUHg7XHJcblxyXG4gICAgICAgIHhGdCA9IHRoaXMuZnJvbVBpeGVscyhsZWZ0UHggKyB3aWR0aFB4ICsgZ2FwUHgsIFwiZnRcIik7XHJcbiAgICAgICAgeUZ0ID0gdGhpcy5mcm9tUGl4ZWxzKHRvcFB4LCBcImZ0XCIpO1xyXG4gICAgICAgIGFuZ2xlID0gTnVtYmVyKGFuY2hvck9iaj8uYW5nbGUgfHwgMCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZXdFbnRyYW5jZSA9IHtcclxuICAgICAgZWxlbWVudFR5cGU6IFwiZW50cmFuY2VcIixcclxuICAgICAgZGlzdGFuY2U6IDYsXHJcbiAgICAgIHVuaXQ6IFwiZnRcIixcclxuICAgICAgZGlyZWN0aW9uOiBcInVwXCIsXHJcbiAgICAgIGFuZ2xlLFxyXG4gICAgICBlbGVtZW50TnVtYmVyOiBlbGVOdW1iZXIgKyAxLFxyXG4gICAgICByZWxhdGl2ZVBvc2l0aW9uOiB7XHJcbiAgICAgICAgeDogeEZ0LFxyXG4gICAgICAgIHk6IHlGdCxcclxuICAgICAgICB1bml0OiBcImZ0XCIsXHJcbiAgICAgIH0sXHJcbiAgICAgIGZpeHR1cmVzOiBbXSxcclxuICAgICAgb3RoZXJFbGVtZW50czogW10sXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24ucHVzaChuZXdFbnRyYW5jZSk7XHJcbiAgICB0aGlzLnJlbmRlckZsb29yKHRydWUpO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUVudHJhbmNlQ29vcmRpbmF0ZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNBZGRpbmdGaXh0dXJlID0gZmFsc2U7XHJcblxyXG4gIGFzeW5jIGFkZE5ld0ZpeHR1cmUoZml4dHVyZVR5cGU6IFwid2FsbFwiIHwgXCJmbG9vclwiLCB3YWxsSW5kZXg/OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLmxheW91dEZvcm0uZGlzYWJsZWQpIHJldHVybjtcclxuICAgIC8vIFJlLWVudHJ5IGd1YXJkOiBnZXRUZW1wbGF0ZSBhd2FpdHMgYW4gSFRUUCBjYWxsLCBhbmQgYSBkb3VibGUtZmlyZWQgY2xpY2tcclxuICAgIC8vIChvciByYXBpZCBzZWNvbmQgY2xpY2spIHdvdWxkIHJhY2UgcGFzdCB0aGUgYXdhaXQgd2l0aCB0aGUgc2FtZVxyXG4gICAgLy8gZXhpc3RpbmdGaXh0dXJlcyBzbmFwc2hvdCwgY29tcHV0aW5nIHRoZSBzYW1lIHBsYWNlbWVudCBhbmQgcHVzaGluZyB0d29cclxuICAgIC8vIGZpeHR1cmVzIGF0IGlkZW50aWNhbCBjb29yZGluYXRlcy5cclxuICAgIGlmICh0aGlzLmlzQWRkaW5nRml4dHVyZSkgcmV0dXJuO1xyXG4gICAgdGhpcy5pc0FkZGluZ0ZpeHR1cmUgPSB0cnVlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy5hZGROZXdGaXh0dXJlSW50ZXJuYWwoZml4dHVyZVR5cGUsIHdhbGxJbmRleCk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLmlzQWRkaW5nRml4dHVyZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBhZGROZXdGaXh0dXJlSW50ZXJuYWwoXHJcbiAgICBmaXh0dXJlVHlwZTogXCJ3YWxsXCIgfCBcImZsb29yXCIsXHJcbiAgICB3YWxsSW5kZXg/OiBudW1iZXIsXHJcbiAgKSB7XHJcbiAgICBjb25zdCB0ZW1wbGF0ZTogYW55ID0gYXdhaXQgdGhpcy5nZXRUZW1wbGF0ZSh0aGlzLmZpeHR1cmVUZW1wbGF0ZXNbMF0uX2lkKTtcclxuICAgIGNvbnN0IHRlbXBsYXRlRGF0YSA9IHRlbXBsYXRlLmRhdGE7XHJcbiAgICBjb25zdCBmaXh0dXJlSWQgPSBgbmV3LSR7Y3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xyXG4gICAgY29uc3QgZml4dHVyZUdyb3VwID0gdGhpcy5wYXRjaEZpeHR1cmUoe1xyXG4gICAgICBmaXh0dXJlTmFtZTogdGVtcGxhdGVEYXRhLmZpeHR1cmVOYW1lLFxyXG4gICAgICBmaXh0dXJlQ29uZmlnSWQ6IHRlbXBsYXRlRGF0YS5faWQsXHJcbiAgICAgIF9pZDogZml4dHVyZUlkLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZml4dHVyZURhdGEgPSB7XHJcbiAgICAgIC4uLnRlbXBsYXRlRGF0YSxcclxuICAgICAgZml4dHVyZUNvbmZpZ0lkOiB0ZW1wbGF0ZURhdGEuX2lkLFxyXG4gICAgICByZWxhdGl2ZVBvc2l0aW9uOiB7IHg6IDAsIHk6IDAsIGFuZ2xlOiAwLCB1bml0OiBcImZ0XCIgfSxcclxuICAgICAgX2lkOiBmaXh0dXJlSWQsXHJcbiAgICAgIHVuc2F2ZWRDaGFuZ2VzOiB0cnVlLFxyXG4gICAgICBuZXdBZGRlZDogdHJ1ZSxcclxuICAgIH07XHJcbiAgICB0aGlzLmxheW91dEhhc1Vuc2F2ZWRDaGFuZ2VzID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAoZml4dHVyZVR5cGUgPT09IFwid2FsbFwiKSB7XHJcbiAgICAgIGNvbnN0IHdhbGxEYXRhID0gdGhpcy5nZXRXYWxsQnlOdW1iZXIod2FsbEluZGV4ISArIDEpO1xyXG5cclxuICAgICAgY29uc3QgdyA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgZml4dHVyZURhdGEuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlLFxyXG4gICAgICAgIGZpeHR1cmVEYXRhLmZpeHR1cmVTdGF0aWNXaWR0aC51bml0LFxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCB3cCA9IHRoaXMuZnJvbVBpeGVscyh3LCBcImZ0XCIpO1xyXG5cclxuICAgICAgaWYgKHdhbGxEYXRhKSB7XHJcbiAgICAgICAgY29uc3QgeDAgPSB3YWxsRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLng7XHJcbiAgICAgICAgY29uc3QgeTAgPSB3YWxsRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLnk7XHJcbiAgICAgICAgY29uc3QgYW5nbGVEZWcgPSB3YWxsRGF0YS5hbmdsZSB8fCAwO1xyXG4gICAgICAgIGNvbnN0IGFuZ2xlUmFkID0gKGFuZ2xlRGVnICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICAgICAgY29uc3QgY29zQSA9IE1hdGguY29zKGFuZ2xlUmFkKTtcclxuICAgICAgICBjb25zdCBzaW5BID0gTWF0aC5zaW4oYW5nbGVSYWQpO1xyXG5cclxuICAgICAgICAvLyBQcm9qZWN0IGFsbCBleGlzdGluZyBmaXh0dXJlcyBvbnRvIHRoZSB3YWxsIGF4aXMgdG8gZ2V0IG9jY3VwaWVkIHJhbmdlcyAoaW4gZnQpLlxyXG4gICAgICAgIC8vIFByb2plY3Rpb24gcmVjb3ZlcnMgdCBjb3JyZWN0bHkgZXZlbiB3aXRoIHRoZSAxZnQgcGVycGVuZGljdWxhciBvZmZzZXQgYXBwbGllZFxyXG4gICAgICAgIC8vIGR1cmluZyBwbGFjZW1lbnQ6ICjiiJJzaW5Bwrdjb3NBICsgY29zQcK3c2luQSkgY2FuY2VscyB0byAwLlxyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRml4dHVyZXMgPSAod2FsbERhdGEuZml4dHVyZXMgfHwgW10pLmZpbHRlcihcclxuICAgICAgICAgIChmOiBhbnkpID0+IGYuZml4dHVyZU5hbWUgIT09IFwic3BhY2VcIixcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCBvY2N1cGllZDogQXJyYXk8W251bWJlciwgbnVtYmVyXT4gPSBleGlzdGluZ0ZpeHR1cmVzLm1hcChcclxuICAgICAgICAgIChmOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZldpZHRoID0gdGhpcy5mcm9tUGl4ZWxzKFxyXG4gICAgICAgICAgICAgIHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgICAgICAgICBmLmZpeHR1cmVTdGF0aWNXaWR0aC52YWx1ZSxcclxuICAgICAgICAgICAgICAgIGYuZml4dHVyZVN0YXRpY1dpZHRoLnVuaXQsXHJcbiAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICBcImZ0XCIsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZIZWlnaHQgPSB0aGlzLmZyb21QaXhlbHMoXHJcbiAgICAgICAgICAgICAgdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgICAgICAgIGYuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSxcclxuICAgICAgICAgICAgICAgIGYuZml4dHVyZVN0YXRpY0xlbmd0aC51bml0LFxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgXCJmdFwiLFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgLy8gQ0FELXVwbG9hZGVkIGZpeHR1cmVzIG9uIGludmVydGVkIHdhbGxzICh3YWxsIGFuZ2xlIOKIiCAoOTDCsCwgMjcwwrApKVxyXG4gICAgICAgICAgICAvLyBoYXZlIHRoZWlyIHNhdmVkICh4LCB5KSBzaGlmdGVkIGJ5IFIod2FsbEFuZ2xlKcK3KHcsIGgpIHRvIGtlZXAgdGhlXHJcbiAgICAgICAgICAgIC8vIGNhbm9uaWNhbCB2aXN1YWwgYWZ0ZXIgYSAxODDCsCBib2R5IGZsaXAg4oCUIHNlZSBkcmF3Rml4dHVyZS4gVG9cclxuICAgICAgICAgICAgLy8gcmVjb3ZlciB0aGUgd2FsbC1heGlzIHBvc2l0aW9uIHRoZSBnYXAtZmluZGVyIG5lZWRzLCB1bnNoaWZ0IGFueVxyXG4gICAgICAgICAgICAvLyBmaXh0dXJlIHdob3NlIHNhdmVkIGFuZ2xlIGRpZmZlcnMgZnJvbSB0aGUgd2FsbCBhbmdsZSBieSB+MTgwwrAuXHJcbiAgICAgICAgICAgIGNvbnN0IGZBbmdsZSA9IChmLnJlbGF0aXZlUG9zaXRpb24uYW5nbGUgPz8gMCkgYXMgbnVtYmVyO1xyXG4gICAgICAgICAgICBjb25zdCBhbmdsZURpZmYgPVxyXG4gICAgICAgICAgICAgICgoKChmQW5nbGUgLSBhbmdsZURlZykgJSAzNjApICsgMzYwKSAlIDM2MCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzRmxpcHBlZCA9IE1hdGguYWJzKGFuZ2xlRGlmZiAtIDE4MCkgPCAxO1xyXG5cclxuICAgICAgICAgICAgbGV0IHByb2pYID0gZi5yZWxhdGl2ZVBvc2l0aW9uLng7XHJcbiAgICAgICAgICAgIGxldCBwcm9qWSA9IGYucmVsYXRpdmVQb3NpdGlvbi55O1xyXG4gICAgICAgICAgICBpZiAoaXNGbGlwcGVkKSB7XHJcbiAgICAgICAgICAgICAgcHJvalggLT0gY29zQSAqIGZXaWR0aCAtIHNpbkEgKiBmSGVpZ2h0O1xyXG4gICAgICAgICAgICAgIHByb2pZIC09IHNpbkEgKiBmV2lkdGggKyBjb3NBICogZkhlaWdodDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdFN0YXJ0ID0gKHByb2pYIC0geDApICogY29zQSArIChwcm9qWSAtIHkwKSAqIHNpbkE7XHJcbiAgICAgICAgICAgIHJldHVybiBbTWF0aC5tYXgoMCwgdFN0YXJ0KSwgTWF0aC5tYXgoMCwgdFN0YXJ0KSArIGZXaWR0aF0gYXMgW1xyXG4gICAgICAgICAgICAgIG51bWJlcixcclxuICAgICAgICAgICAgICBudW1iZXIsXHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIG9jY3VwaWVkLnNvcnQoKGEsIGIpID0+IGFbMF0gLSBiWzBdKTtcclxuXHJcbiAgICAgICAgLy8gV2FsayBmcm9tIHdhbGwgc3RhcnQ7IGZpbmQgZmlyc3QgZ2FwIHRoYXQgZml0cyB0aGUgbmV3IGZpeHR1cmUuXHJcbiAgICAgICAgLy8gRVBTSUxPTiBhYnNvcmJzIGZsb2F0aW5nLXBvaW50IGRyaWZ0IGZyb20gcmVwZWF0ZWQgdW5pdCByb3VuZC10cmlwcy5cclxuICAgICAgICBjb25zdCBFUFNJTE9OID0gMC4wMDE7XHJcbiAgICAgICAgbGV0IHBsYWNlbWVudFQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIGxldCBjdXJzb3IgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IFtyYW5nZVN0YXJ0LCByYW5nZUVuZF0gb2Ygb2NjdXBpZWQpIHtcclxuICAgICAgICAgIGlmIChyYW5nZVN0YXJ0IC0gY3Vyc29yID49IHdwIC0gRVBTSUxPTikge1xyXG4gICAgICAgICAgICBwbGFjZW1lbnRUID0gY3Vyc29yO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGN1cnNvciA9IE1hdGgubWF4KGN1cnNvciwgcmFuZ2VFbmQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTm8gZ2FwIGZvdW5kIOKGkiBwbGFjZSBhZnRlciBsYXN0IGZpeHR1cmUuXHJcbiAgICAgICAgLy8gT3ZlcmZsb3cgYmV5b25kIHdhbGwgbGVuZ3RoIGlzIGludGVudGlvbmFsIHBlciByZXF1aXJlbWVudHMuXHJcbiAgICAgICAgaWYgKHBsYWNlbWVudFQgPT09IG51bGwpIHtcclxuICAgICAgICAgIHBsYWNlbWVudFQgPSBjdXJzb3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmeCA9IHgwICsgcGxhY2VtZW50VCAqIGNvc0E7XHJcbiAgICAgICAgY29uc3QgZnkgPSB5MCArIHBsYWNlbWVudFQgKiBzaW5BO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IDAuOTtcclxuICAgICAgICBjb25zdCBmeF9vZmZzZXQgPSBmeCArIG9mZnNldCAqIC1zaW5BO1xyXG4gICAgICAgIGNvbnN0IGZ5X29mZnNldCA9IGZ5ICsgb2Zmc2V0ICogY29zQTtcclxuXHJcbiAgICAgICAgZml4dHVyZURhdGEucmVsYXRpdmVQb3NpdGlvbi54ID0gZnhfb2Zmc2V0O1xyXG4gICAgICAgIGZpeHR1cmVEYXRhLnJlbGF0aXZlUG9zaXRpb24ueSA9IGZ5X29mZnNldDtcclxuICAgICAgICBmaXh0dXJlRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlID0gYW5nbGVEZWc7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSB3YWxsIGFuZ2xlIHB1dHMgdGhlIGZpeHR1cmUgaW4gdGhlIHVwc2lkZS1kb3duIHJhbmdlLCBiYWtlXHJcbiAgICAgICAgLy8gdGhlIHNhbWUgMTgwwrAgYm9keSBmbGlwIGRyYXdGaXh0dXJlIGFwcGxpZXMgZHVyaW5nIENBRCBmaXJzdC1yZW5kZXJcclxuICAgICAgICAvLyAoc2hpZnQgYW5jaG9yIGJ5IFIod2FsbEFuZ2xlKcK3KHcsIGgpIGFuZCByb3RhdGUgKzE4MMKwKS4gZHJhd0ZpeHR1cmUnc1xyXG4gICAgICAgIC8vIG93biBmbGlwIHBhdGggaXMgZ2F0ZWQgb24gY2FkTGF5b3V0PXRydWUsIHNvIGZvciBmaXh0dXJlcyBhZGRlZFxyXG4gICAgICAgIC8vIHBvc3QtQ0FEIHZpYSB0aGUgc2lkZSBwYW5lbCB3ZSBoYXZlIHRvIGJha2UgdGhlIGZsaXAgaGVyZSDigJQgaXRcclxuICAgICAgICAvLyBtYWtlcyB0aGUgbmV3IGZpeHR1cmUgbGFuZCBjYW5vbmljYWwgaW5zdGVhZCBvZiB1cHNpZGUtZG93bi5cclxuICAgICAgICBjb25zdCBub3JtV2FsbEFuZ2xlID0gKCgoYW5nbGVEZWcgJSAzNjApICsgMzYwKSAlIDM2MCk7XHJcbiAgICAgICAgaWYgKG5vcm1XYWxsQW5nbGUgPiA5MCAmJiBub3JtV2FsbEFuZ2xlIDwgMjcwKSB7XHJcbiAgICAgICAgICBjb25zdCB3aWR0aEZ0ID0gdGhpcy5mcm9tUGl4ZWxzKFxyXG4gICAgICAgICAgICB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgICAgIGZpeHR1cmVEYXRhLmZpeHR1cmVTdGF0aWNXaWR0aC52YWx1ZSxcclxuICAgICAgICAgICAgICBmaXh0dXJlRGF0YS5maXh0dXJlU3RhdGljV2lkdGgudW5pdCxcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgXCJmdFwiLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNvbnN0IGhlaWdodEZ0ID0gdGhpcy5mcm9tUGl4ZWxzKFxyXG4gICAgICAgICAgICB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgICAgIGZpeHR1cmVEYXRhLmZpeHR1cmVTdGF0aWNMZW5ndGgudmFsdWUsXHJcbiAgICAgICAgICAgICAgZml4dHVyZURhdGEuZml4dHVyZVN0YXRpY0xlbmd0aC51bml0LFxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBcImZ0XCIsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgZml4dHVyZURhdGEucmVsYXRpdmVQb3NpdGlvbi54ID1cclxuICAgICAgICAgICAgZnhfb2Zmc2V0ICsgY29zQSAqIHdpZHRoRnQgLSBzaW5BICogaGVpZ2h0RnQ7XHJcbiAgICAgICAgICBmaXh0dXJlRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLnkgPVxyXG4gICAgICAgICAgICBmeV9vZmZzZXQgKyBzaW5BICogd2lkdGhGdCArIGNvc0EgKiBoZWlnaHRGdDtcclxuICAgICAgICAgIGZpeHR1cmVEYXRhLnJlbGF0aXZlUG9zaXRpb24uYW5nbGUgPSBhbmdsZURlZyArIDE4MDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICh0aGlzLmdldEZvcm1XYWxscy5hdCh3YWxsSW5kZXghKS5nZXQoXCJmaXh0dXJlc1wiKSBhcyBGb3JtQXJyYXkpLnB1c2goXHJcbiAgICAgICAgZml4dHVyZUdyb3VwLFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmdldFdhbGxCeU51bWJlcih3YWxsSW5kZXghICsgMSk/LmZpeHR1cmVzLnB1c2goZml4dHVyZURhdGEpO1xyXG4gICAgfSBlbHNlIGlmIChmaXh0dXJlVHlwZSA9PT0gXCJmbG9vclwiKSB7XHJcbiAgICAgIGNvbnN0IGZpeHR1cmVXaWR0aFB4ID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICBmaXh0dXJlRGF0YS5maXh0dXJlU3RhdGljV2lkdGgudmFsdWUsXHJcbiAgICAgICAgZml4dHVyZURhdGEuZml4dHVyZVN0YXRpY1dpZHRoLnVuaXQsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBjb25zdCBmaXh0dXJlSGVpZ2h0UHggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgIGZpeHR1cmVEYXRhLmZpeHR1cmVTdGF0aWNMZW5ndGgudmFsdWUsXHJcbiAgICAgICAgZml4dHVyZURhdGEuZml4dHVyZVN0YXRpY0xlbmd0aC51bml0LFxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gTi1zaGFwZSBncmlkIHBsYWNlbWVudDogY29sIGZpbGxzIGxlZnQtdG8tcmlnaHQsIGVhY2ggY29sdW1uIGZpbGxzIGJvdHRvbSByb3cgKHJvdz0xKSBmaXJzdCB0aGVuIHRvcCByb3cgKHJvdz0wKVxyXG4gICAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUubGVuZ3RoO1xyXG4gICAgICBjb25zdCBuZXdDb2wgPSBNYXRoLmZsb29yKG5ld0luZGV4IC8gMik7XHJcbiAgICAgIGNvbnN0IG5ld1JvdyA9IG5ld0luZGV4ICUgMiA9PT0gMCA/IDEgOiAwO1xyXG5cclxuICAgICAgbGV0IGdyaWRPcmlnaW5YOiBudW1iZXI7XHJcbiAgICAgIGxldCBncmlkT3JpZ2luWTogbnVtYmVyO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vIFJlY292ZXIgZ3JpZCBvcmlnaW4gZnJvbSBmaXh0dXJlIGF0IGluZGV4IDAgKGFsd2F5cyBwbGFjZWQgYXQgcm93PTEsIGNvbD0wKVxyXG4gICAgICAgIGNvbnN0IGYwID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZVswXTtcclxuICAgICAgICBjb25zdCBmMHggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgZjAucmVsYXRpdmVQb3NpdGlvbi54LFxyXG4gICAgICAgICAgZjAucmVsYXRpdmVQb3NpdGlvbi51bml0LFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgZjB5ID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgIGYwLnJlbGF0aXZlUG9zaXRpb24ueSxcclxuICAgICAgICAgIGYwLnJlbGF0aXZlUG9zaXRpb24udW5pdCxcclxuICAgICAgICApO1xyXG4gICAgICAgIC8vIGYwIGlzIGF0IHJvdz0xIOKGkiBncmlkT3JpZ2luWSA9IGYweSAtIDEgKiBmaXh0dXJlSGVpZ2h0UHg7IGNvbD0wIOKGkiBncmlkT3JpZ2luWCA9IGYweFxyXG4gICAgICAgIGdyaWRPcmlnaW5YID0gZjB4O1xyXG4gICAgICAgIGdyaWRPcmlnaW5ZID0gZjB5IC0gZml4dHVyZUhlaWdodFB4O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIE5vIGV4aXN0aW5nIGNlbnRlciBmaXh0dXJlcyDigJQgZmluZCBiZXN0IGdyaWQgb3JpZ2luIHZpYSBwb2x5Z29uIHNjYW4gKHNhbWUgYXMgZHJhd0xheW91dEVsZW1lbnRzKVxyXG4gICAgICAgIGNvbnN0IGxheW91dFBvbHlnb24gPSB0aGlzLmJ1aWxkTGF5b3V0UG9seWdvbkZyb21XYWxscygpO1xyXG4gICAgICAgIGNvbnN0IG9jY3VwaWVkUmVjdHMgPSB0aGlzLmdldE9jY3VwaWVkUmVjdHMoKTtcclxuICAgICAgICBjb25zdCBib3VuZHMgPSB0aGlzLmdldEZ1bGxMYXlvdXRCb3VuZHMoKTtcclxuXHJcbiAgICAgICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgMiByb3dzIGFuZCAxIGNvbHVtbiBhcyB0aGUgc3RhcnRpbmcgZ3JpZCBmb290cHJpbnRcclxuICAgICAgICBjb25zdCBncmlkVyA9IGZpeHR1cmVXaWR0aFB4O1xyXG4gICAgICAgIGNvbnN0IGdyaWRIID0gMiAqIGZpeHR1cmVIZWlnaHRQeDtcclxuXHJcbiAgICAgICAgY29uc3QgY2VudGVyWCA9IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC8gMjtcclxuICAgICAgICBjb25zdCBjZW50ZXJZID0gYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgLyAyO1xyXG5cclxuICAgICAgICBjb25zdCBmaXRzSW5Qb2x5Z29uID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PlxyXG4gICAgICAgICAgdGhpcy5pc1BvaW50SW5zaWRlUG9seWdvbih7IHgsIHkgfSwgbGF5b3V0UG9seWdvbikgJiZcclxuICAgICAgICAgIHRoaXMuaXNQb2ludEluc2lkZVBvbHlnb24oeyB4OiB4ICsgZ3JpZFcsIHkgfSwgbGF5b3V0UG9seWdvbikgJiZcclxuICAgICAgICAgIHRoaXMuaXNQb2ludEluc2lkZVBvbHlnb24oeyB4LCB5OiB5ICsgZ3JpZEggfSwgbGF5b3V0UG9seWdvbikgJiZcclxuICAgICAgICAgIHRoaXMuaXNQb2ludEluc2lkZVBvbHlnb24oXHJcbiAgICAgICAgICAgIHsgeDogeCArIGdyaWRXLCB5OiB5ICsgZ3JpZEggfSxcclxuICAgICAgICAgICAgbGF5b3V0UG9seWdvbixcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IG92ZXJsYXBzT2NjdXBpZWQgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+XHJcbiAgICAgICAgICBvY2N1cGllZFJlY3RzLnNvbWUoKG9jYykgPT5cclxuICAgICAgICAgICAgdGhpcy5yZWN0c092ZXJsYXAoeyB4LCB5LCB3OiBncmlkVywgaDogZ3JpZEggfSwgb2NjKSxcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNjYW5Gb3JCZXN0T3JpZ2luID0gKHNraXBPdmVybGFwOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgICBsZXQgYmVzdFNjb3JlID0gLUluZmluaXR5O1xyXG4gICAgICAgICAgbGV0IGJlc3RQb3M6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgICAgY29uc3Qgc3RlcCA9IGZpeHR1cmVXaWR0aFB4IC8gMjtcclxuXHJcbiAgICAgICAgICBmb3IgKFxyXG4gICAgICAgICAgICBsZXQgeSA9IGJvdW5kcy50b3A7XHJcbiAgICAgICAgICAgIHkgPD0gYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgLSBncmlkSDtcclxuICAgICAgICAgICAgeSArPSBzdGVwXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgZm9yIChcclxuICAgICAgICAgICAgICBsZXQgeCA9IGJvdW5kcy5sZWZ0O1xyXG4gICAgICAgICAgICAgIHggPD0gYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLSBncmlkVztcclxuICAgICAgICAgICAgICB4ICs9IHN0ZXBcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFmaXRzSW5Qb2x5Z29uKHgsIHkpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICBpZiAoIXNraXBPdmVybGFwICYmIG92ZXJsYXBzT2NjdXBpZWQoeCwgeSkpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCBncmlkUmVjdCA9IHsgeCwgeSwgdzogZ3JpZFcsIGg6IGdyaWRIIH07XHJcbiAgICAgICAgICAgICAgY29uc3QgZW1wdHlNYXJnaW4gPSB0aGlzLmNvbXB1dGVFbXB0eU1hcmdpbihcclxuICAgICAgICAgICAgICAgIGdyaWRSZWN0LFxyXG4gICAgICAgICAgICAgICAgYm91bmRzLFxyXG4gICAgICAgICAgICAgICAgb2NjdXBpZWRSZWN0cyxcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGR4ID0gY2VudGVyWCAtICh4ICsgZ3JpZFcgLyAyKTtcclxuICAgICAgICAgICAgICBjb25zdCBkeSA9IGNlbnRlclkgLSAoeSArIGdyaWRIIC8gMik7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc2NvcmUgPSBlbXB0eU1hcmdpbiAqIDEwMDAgLSAoZHggKiBkeCArIGR5ICogZHkpICogMC4wMDE7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChzY29yZSA+IGJlc3RTY29yZSkge1xyXG4gICAgICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7XHJcbiAgICAgICAgICAgICAgICBiZXN0UG9zID0geyB4LCB5IH07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gYmVzdFBvcztcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBiZXN0UG9zID0gc2NhbkZvckJlc3RPcmlnaW4oZmFsc2UpID8/XHJcbiAgICAgICAgICBzY2FuRm9yQmVzdE9yaWdpbih0cnVlKSA/PyB7XHJcbiAgICAgICAgICAgIHg6IGNlbnRlclggLSBncmlkVyAvIDIsXHJcbiAgICAgICAgICAgIHk6IGNlbnRlclkgLSBncmlkSCAvIDIsXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICBncmlkT3JpZ2luWCA9IGJlc3RQb3MueDtcclxuICAgICAgICBncmlkT3JpZ2luWSA9IGJlc3RQb3MueTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgeCA9IGdyaWRPcmlnaW5YICsgbmV3Q29sICogZml4dHVyZVdpZHRoUHg7XHJcbiAgICAgIGNvbnN0IHkgPSBncmlkT3JpZ2luWSArIG5ld1JvdyAqIGZpeHR1cmVIZWlnaHRQeDtcclxuXHJcbiAgICAgIGZpeHR1cmVEYXRhLnJlbGF0aXZlUG9zaXRpb24ueCA9IHRoaXMuZnJvbVBpeGVscyh4LCBcImZ0XCIpO1xyXG4gICAgICBmaXh0dXJlRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLnkgPSB0aGlzLmZyb21QaXhlbHMoeSwgXCJmdFwiKTtcclxuXHJcbiAgICAgICh0aGlzLmxheW91dEZvcm0uZ2V0KFwiZmxvb3JGaXh0dXJlc1wiKSBhcyBGb3JtQXJyYXkpLnB1c2goZml4dHVyZUdyb3VwKTtcclxuICAgICAgdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZS5wdXNoKGZpeHR1cmVEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlckZsb29yKGZhbHNlKTtcclxuICAgIHRoaXMudXBkYXRlRml4dHVyZUNvb3JkaW5hdGVzKCk7XHJcbiAgfVxyXG5cclxuICBhZGROZXdPdGhlckVsZW1lbnRzKHBvc1R5cGU6IFwid2FsbFwiIHwgXCJmbG9vclwiLCB3YWxsSW5kZXg/OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLmxheW91dEZvcm0uZGlzYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBwb3NEYXRhID0ge1xyXG4gICAgICBfaWQ6IGBuZXctJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWAsXHJcbiAgICAgIGZpeHR1cmVOYW1lOiBgUE9TIENvdW50ZXJgLFxyXG4gICAgICBmaXh0dXJlVHlwZTogXCJvdGhlclwiLFxyXG4gICAgICByZWxhdGl2ZVBvc2l0aW9uOiB7IHg6IDAsIHk6IDAsIGFuZ2xlOiAwLCB1bml0OiBcImZ0XCIgfSxcclxuICAgICAgZml4dHVyZVN0YXRpY0xlbmd0aDoge1xyXG4gICAgICAgIHZhbHVlOiAzLFxyXG4gICAgICAgIHVuaXQ6IFwiZnRcIixcclxuICAgICAgfSxcclxuICAgICAgZml4dHVyZVN0YXRpY1dpZHRoOiB7XHJcbiAgICAgICAgdmFsdWU6IDUsXHJcbiAgICAgICAgdW5pdDogXCJmdFwiLFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuXHJcbiAgICBsZXQgeCA9IHBvc0RhdGEucmVsYXRpdmVQb3NpdGlvbi54O1xyXG4gICAgbGV0IHkgPSBwb3NEYXRhLnJlbGF0aXZlUG9zaXRpb24ueTtcclxuICAgIGxldCBhID0gcG9zRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlO1xyXG5cclxuICAgIGNvbnN0IGggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICBwb3NEYXRhLmZpeHR1cmVTdGF0aWNMZW5ndGgudmFsdWUsXHJcbiAgICAgIHBvc0RhdGEuZml4dHVyZVN0YXRpY0xlbmd0aC51bml0LFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHcgPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICBwb3NEYXRhLmZpeHR1cmVTdGF0aWNXaWR0aC52YWx1ZSxcclxuICAgICAgcG9zRGF0YS5maXh0dXJlU3RhdGljV2lkdGgudW5pdCxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgbmV3T3RoZXJHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICB0eXBlOiBbcG9zRGF0YS5maXh0dXJlTmFtZSB8fCBcIlBPUyBDb3VudGVyXCJdLCAvLyBkZWZhdWx0IHNlbGVjdGVkIGxhYmVsXHJcbiAgICAgIGN1c3RvbU5hbWU6IFtcIlwiXSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChwb3NUeXBlID09IFwid2FsbFwiKSB7XHJcbiAgICAgIGNvbnN0IHdhbGxEYXRhID0gdGhpcy5nZXRXYWxsQnlOdW1iZXIod2FsbEluZGV4ISArIDEpO1xyXG4gICAgICBpZiAod2FsbERhdGEpIHtcclxuICAgICAgICBjb25zdCB4MCA9IHdhbGxEYXRhLnJlbGF0aXZlUG9zaXRpb24ueDtcclxuICAgICAgICBjb25zdCB5MCA9IHdhbGxEYXRhLnJlbGF0aXZlUG9zaXRpb24ueTtcclxuICAgICAgICBjb25zdCBsZW5ndGggPSB3YWxsRGF0YS5kaXN0YW5jZTtcclxuICAgICAgICBjb25zdCBhbmdsZURlZyA9IHdhbGxEYXRhLmFuZ2xlIHx8IDA7XHJcbiAgICAgICAgY29uc3QgYW5nbGVSYWQgPSAoYW5nbGVEZWcgKiBNYXRoLlBJKSAvIDE4MDtcclxuXHJcbiAgICAgICAgY29uc3QgZnggPSB4MCArIChsZW5ndGggLyAyKSAqIE1hdGguY29zKGFuZ2xlUmFkKTtcclxuICAgICAgICBjb25zdCBmeSA9IHkwICsgKGxlbmd0aCAvIDIpICogTWF0aC5zaW4oYW5nbGVSYWQpO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IDIuNTtcclxuICAgICAgICBjb25zdCBmeF9vZmZzZXQgPSBmeCArIG9mZnNldCAqIC1NYXRoLnNpbihhbmdsZVJhZCk7XHJcbiAgICAgICAgY29uc3QgZnlfb2Zmc2V0ID0gZnkgKyBvZmZzZXQgKiBNYXRoLmNvcyhhbmdsZVJhZCk7XHJcblxyXG4gICAgICAgIHggPSB0aGlzLnRvUGl4ZWxzKGZ4X29mZnNldCwgXCJmdFwiKTtcclxuICAgICAgICB5ID0gdGhpcy50b1BpeGVscyhmeV9vZmZzZXQsIFwiZnRcIik7XHJcbiAgICAgICAgYSA9IGFuZ2xlRGVnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBPYmplY3QuYXNzaWduKHBvc0RhdGEsIHtcclxuICAgICAgICBhc3NvY2lhdGVkRWxlbWVudE51bWJlcjogd2FsbEluZGV4ISArIDEsXHJcbiAgICAgICAgYXNzb2NpYXRlZEVsZW1lbnRUeXBlOiBcIndhbGxcIixcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAodGhpcy5nZXRGb3JtV2FsbHMuYXQod2FsbEluZGV4ISkuZ2V0KFwib3RoZXJFbGVtZW50c1wiKSBhcyBGb3JtQXJyYXkpLnB1c2goXHJcbiAgICAgICAgbmV3T3RoZXJHcm91cCxcclxuICAgICAgKTtcclxuICAgICAgd2FsbERhdGEub3RoZXJFbGVtZW50cy5wdXNoKHsgLi4ucG9zRGF0YSwgbmV3QWRkZWQ6IHRydWUgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHBvc1R5cGUgPT09IFwiZmxvb3JcIikge1xyXG4gICAgICAodGhpcy5sYXlvdXRGb3JtLmdldChcImZsb29yT3RoZXJFbGVtZW50c1wiKSBhcyBGb3JtQXJyYXkpLnB1c2goXHJcbiAgICAgICAgbmV3T3RoZXJHcm91cCxcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5mbG9vckRhdGEub3RoZXJFbGVtZW50cy5wdXNoKHsgLi4ucG9zRGF0YSwgbmV3QWRkZWQ6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVjdEdyb3VwID0gdGhpcy5kcmF3T3RoZXJFbGVtZW50c1dpdGhMYWJlbChcclxuICAgICAgdGhpcy5jYW52YXMsXHJcbiAgICAgIHgsXHJcbiAgICAgIHksXHJcbiAgICAgIGEsXHJcbiAgICAgIHcsXHJcbiAgICAgIGgsXHJcbiAgICAgIHBvc0RhdGEsXHJcbiAgICApO1xyXG5cclxuICAgIC8vIG1ha2UgYWN0aXZlXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmNhbnZhcy5zZXRBY3RpdmVPYmplY3QocmVjdEdyb3VwKTtcclxuICAgICAgdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gICAgfSBjYXRjaCB7fVxyXG5cclxuICAgIHRoaXMuc3Vic2NyaWJlVG9PdGhlckVsZW1lbnRzQ2hhbmdlcygpO1xyXG4gICAgdGhpcy51cGRhdGVPdGhlckVsZW1lbnRzQ29vcmRpbmF0ZXMoKTtcclxuICB9XHJcblxyXG4gIGZpbmRFbXB0eUNlbnRlclNwb3QoXHJcbiAgICBvYmplY3RXaWR0aFB4OiBudW1iZXIsXHJcbiAgICBvYmplY3RIZWlnaHRQeDogbnVtYmVyLFxyXG4gICAgdGVtcE9jY3VwaWVkOiB7XHJcbiAgICAgIHg6IG51bWJlcjtcclxuICAgICAgeTogbnVtYmVyO1xyXG4gICAgICB3aWR0aDogbnVtYmVyO1xyXG4gICAgICBoZWlnaHQ6IG51bWJlcjtcclxuICAgIH1bXSA9IFtdLFxyXG4gICkge1xyXG4gICAgY29uc3Qgb2JqZWN0cyA9IHRoaXMuY2FudmFzLmdldE9iamVjdHMoKTtcclxuICAgIGNvbnN0IENFTlRFUl9PRkZTRVRfWCA9IC0zMDA7XHJcbiAgICBjb25zdCBDRU5URVJfT0ZGU0VUX1kgPSAwO1xyXG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5nZXRGdWxsTGF5b3V0Qm91bmRzKCk7XHJcblxyXG4gICAgY29uc3QgY2VudGVyWCA9IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC8gMiArIENFTlRFUl9PRkZTRVRfWDtcclxuXHJcbiAgICBjb25zdCBjZW50ZXJZID0gYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgLyAyICsgQ0VOVEVSX09GRlNFVF9ZO1xyXG5cclxuICAgIC8vIDIuIFNwaXJhbCBzZWFyY2ggcGFyYW1ldGVyc1xyXG4gICAgY29uc3Qgc3RlcCA9IDIwO1xyXG4gICAgY29uc3QgbWF4UmFkaXVzID0gTWF0aC5tYXgoYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTtcclxuXHJcbiAgICBmb3IgKGxldCByYWRpdXMgPSAwOyByYWRpdXMgPCBtYXhSYWRpdXM7IHJhZGl1cyArPSBzdGVwKSB7XHJcbiAgICAgIGZvciAobGV0IGFuZ2xlID0gMDsgYW5nbGUgPCAzNjA7IGFuZ2xlICs9IDMwKSB7XHJcbiAgICAgICAgY29uc3QgcmFkID0gKGFuZ2xlICogTWF0aC5QSSkgLyAxODA7XHJcblxyXG4gICAgICAgIC8vIPCflKcgRklYOiBjZW50ZXIg4oaSIHRvcC1sZWZ0XHJcbiAgICAgICAgY29uc3QgeCA9IGNlbnRlclggKyByYWRpdXMgKiBNYXRoLmNvcyhyYWQpIC0gb2JqZWN0V2lkdGhQeCAvIDI7XHJcbiAgICAgICAgY29uc3QgeSA9IGNlbnRlclkgKyByYWRpdXMgKiBNYXRoLnNpbihyYWQpIC0gb2JqZWN0SGVpZ2h0UHggLyAyO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXN0UmVjdCA9IHtcclxuICAgICAgICAgIGxlZnQ6IHgsXHJcbiAgICAgICAgICB0b3A6IHksXHJcbiAgICAgICAgICB3aWR0aDogb2JqZWN0V2lkdGhQeCxcclxuICAgICAgICAgIGhlaWdodDogb2JqZWN0SGVpZ2h0UHgsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gMy4gQ2hlY2sgY29sbGlzaW9uIHdpdGggZXhpc3RpbmcgY2FudmFzIG9iamVjdHNcclxuICAgICAgICBjb25zdCBjYW52YXNDb2xsaXNpb24gPSBvYmplY3RzLnNvbWUoKG9iaikgPT4ge1xyXG4gICAgICAgICAgY29uc3QgcmVjdCA9IG9iai5nZXRCb3VuZGluZ1JlY3QoKTtcclxuICAgICAgICAgIHJldHVybiAhKFxyXG4gICAgICAgICAgICByZWN0LmxlZnQgPiB0ZXN0UmVjdC5sZWZ0ICsgdGVzdFJlY3Qud2lkdGggfHxcclxuICAgICAgICAgICAgcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCA8IHRlc3RSZWN0LmxlZnQgfHxcclxuICAgICAgICAgICAgcmVjdC50b3AgPiB0ZXN0UmVjdC50b3AgKyB0ZXN0UmVjdC5oZWlnaHQgfHxcclxuICAgICAgICAgICAgcmVjdC50b3AgKyByZWN0LmhlaWdodCA8IHRlc3RSZWN0LnRvcFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGNhbnZhc0NvbGxpc2lvbikgY29udGludWU7XHJcblxyXG4gICAgICAgIC8vIDQuIENoZWNrIGNvbGxpc2lvbiB3aXRoIHRlbXAgcGxhY2VkIGZpeHR1cmVzIChDQUQgYmF0Y2gpXHJcbiAgICAgICAgY29uc3QgdGVtcENvbGxpc2lvbiA9IHRlbXBPY2N1cGllZC5zb21lKChvKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gIShcclxuICAgICAgICAgICAgby54ID4gdGVzdFJlY3QubGVmdCArIHRlc3RSZWN0LndpZHRoIHx8XHJcbiAgICAgICAgICAgIG8ueCArIG8ud2lkdGggPCB0ZXN0UmVjdC5sZWZ0IHx8XHJcbiAgICAgICAgICAgIG8ueSA+IHRlc3RSZWN0LnRvcCArIHRlc3RSZWN0LmhlaWdodCB8fFxyXG4gICAgICAgICAgICBvLnkgKyBvLmhlaWdodCA8IHRlc3RSZWN0LnRvcFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRlbXBDb2xsaXNpb24pIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICByZXR1cm4geyB4LCB5IH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNhbmNlbEVkaXQoKSB7XHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkRml4dHVyZUZvcm1JZCA9IG51bGw7XHJcbiAgICBhd2FpdCB0aGlzLmdldFN0b3JlRml4dHVyZXModGhpcy5wbGFub0RhdGEuX2lkKTtcclxuICB9XHJcblxyXG4gIGxpc3RlblRvRGVsZXRlS2V5KCkge1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgKGUpID0+IHtcclxuICAgICAgaWYgKGUua2V5ID09PSBcIkRlbGV0ZVwiICYmIHRoaXMubGF5b3V0Rm9ybS5lbmFibGVkKSB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlID0gdGhpcy5jYW52YXM/LmdldEFjdGl2ZU9iamVjdCgpIGFzIGFueTtcclxuXHJcbiAgICAgICAgaWYgKGFjdGl2ZSAmJiAoYWN0aXZlIGFzIGFueSkub2JqVHlwZSA9PT0gXCJlbnRyYW5jZVwiKSB7XHJcbiAgICAgICAgICB0aGlzLmRlbGV0ZUVudHJhbmNlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYWN0aXZlICYmIChhY3RpdmUgYXMgYW55KS5vYmpUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICAgICAgaWYgKGFjdGl2ZT8uZGF0YT8uZWxlbWVudE51bWJlcikge1xyXG4gICAgICAgICAgICB0aGlzLmRlbGV0ZVdhbGwoYWN0aXZlPy5kYXRhPy5lbGVtZW50TnVtYmVyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhY3RpdmUgJiYgKGFjdGl2ZSBhcyBhbnkpLm9ialR5cGUgPT09IFwiZml4dHVyZVwiKSB7XHJcbiAgICAgICAgICBpZiAoYWN0aXZlPy5maXh0dXJlVHlwZSkge1xyXG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUZpeHR1cmUoXHJcbiAgICAgICAgICAgICAgYWN0aXZlPy5maXh0dXJlVHlwZSxcclxuICAgICAgICAgICAgICBhY3RpdmU/LmZpeHR1cmVJbmRleCAtIDEsXHJcbiAgICAgICAgICAgICAgYWN0aXZlPy53YWxsSW5kZXggLSAxLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVFbnRyYW5jZSgpIHtcclxuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuY2FudmFzLmdldEFjdGl2ZU9iamVjdCgpIGFzIGFueTtcclxuXHJcbiAgICBpZiAoYWN0aXZlICYmIGFjdGl2ZS5vYmpUeXBlID09PSBcImVudHJhbmNlXCIpIHtcclxuICAgICAgY29uc3QgaSA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZmluZEluZGV4KFxyXG4gICAgICAgIChlbDogYW55KSA9PlxyXG4gICAgICAgICAgZWwuZWxlbWVudFR5cGUgPT09IFwiZW50cmFuY2VcIiAmJlxyXG4gICAgICAgICAgZWwuZWxlbWVudE51bWJlciA9PT0gYWN0aXZlLmRhdGEuZWxlbWVudE51bWJlcixcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChpID49IDApIHtcclxuICAgICAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLnNwbGljZShpLCAxKTtcclxuICAgICAgICB0aGlzLnJlbmRlckZsb29yKHRydWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGRlbGV0ZVdhbGwoZWxlTnVtYmVyOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHdhbGwgPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZpbmQoXHJcbiAgICAgIChlbGU6IGFueSkgPT5cclxuICAgICAgICBlbGUuZWxlbWVudFR5cGUgPT09IFwid2FsbFwiICYmIGVsZS5lbGVtZW50TnVtYmVyID09PSBlbGVOdW1iZXIsXHJcbiAgICApO1xyXG4gICAgaWYgKHdhbGwuZml4dHVyZXMubGVuZ3RoIHx8IHdhbGwub3RoZXJFbGVtZW50cy5sZW5ndGgpXHJcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY29uZmlybURlbGV0ZVdhbGwoKSkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBpID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5maW5kSW5kZXgoXHJcbiAgICAgIChlbDogYW55KSA9PiBlbC5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIgJiYgZWwuZWxlbWVudE51bWJlciA9PT0gZWxlTnVtYmVyLFxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLnNwbGljZShpLCAxKTtcclxuICAgIHRoaXMudXBkYXRlV2FsbEVsZW1lbnROdW1iZXIoKTtcclxuICAgIHRoaXMucmVuZGVyRmxvb3IodHJ1ZSk7XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVdhbGxFbGVtZW50TnVtYmVyKCkge1xyXG4gICAgY29uc3Qgb25seVdhbGxzID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbj8uZmlsdGVyKFxyXG4gICAgICAoZWw6IGFueSkgPT4gZWwuZWxlbWVudFR5cGUgPT09IFwid2FsbFwiLFxyXG4gICAgKTtcclxuXHJcbiAgICBvbmx5V2FsbHM/LmZvckVhY2goKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICBpdGVtLmVsZW1lbnROdW1iZXIgPSBpbmRleCArIDE7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvUGl4ZWxzKHZhbHVlOiBudW1iZXIsIHVuaXQ6IHN0cmluZywgZHBpID0gMi44KSB7XHJcbiAgICBsZXQgcGl4ZWxzOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKHVuaXQgPT09IFwibW1cIikge1xyXG4gICAgICBwaXhlbHMgPSAodmFsdWUgLyAyNS40KSAqIGRwaTtcclxuICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gXCJmdFwiKSB7XHJcbiAgICAgIHBpeGVscyA9IHZhbHVlICogMTIgKiBkcGk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCB1bml0LiBVc2UgJ21tJyBvciAnZnQnLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTnVtYmVyKHBpeGVscy50b0ZpeGVkKDQpKTtcclxuICB9XHJcblxyXG4gIGZyb21QaXhlbHMocGl4ZWxzOiBudW1iZXIsIHVuaXQ6IHN0cmluZywgZHBpID0gMi44KTogbnVtYmVyIHtcclxuICAgIGxldCB2YWx1ZTogbnVtYmVyO1xyXG5cclxuICAgIC8vIHBpeGVscyA9IHBpeGVscyA+PSB0aGlzLndhbGxUaGlja25lc3MgPyBwaXhlbHMgLSB0aGlzLndhbGxUaGlja25lc3MgOiB0aGlzLndhbGxUaGlja25lc3M7XHJcblxyXG4gICAgaWYgKHVuaXQgPT09IFwibW1cIikge1xyXG4gICAgICB2YWx1ZSA9IChwaXhlbHMgLyBkcGkpICogMjUuNDtcclxuICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gXCJmdFwiKSB7XHJcbiAgICAgIHZhbHVlID0gcGl4ZWxzIC8gKDEyICogZHBpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIHVuaXQuIFVzZSAnbW0nIG9yICdmdCcuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBOdW1iZXIodmFsdWUudG9GaXhlZCg0KSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjb25maXJtU2F2ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihMYXlvdXRFZGl0Q29uZmlybWF0aW9uQ29tcG9uZW50LCB7XHJcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIH0pO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50aXRsZSA9IFwiU2F2ZSBhcyBkcmFmdFwiO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9XHJcbiAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gbW92ZSB0aGlzIGJhY2sgdG8gRHJhZnQ/IFRoaXMgd2lsbCBrZWVwIHRoZSBwbGFub2dyYW0gaW4gRHJhZnQgYW5kIG1ha2UgaXQgcmVhZHkgZm9yIGFsbG9jYXRpb24gb25jZSBhcHByb3ZlZC5cIjtcclxuICAgICAgcmV0dXJuIGF3YWl0IG1vZGVsUmVmLnJlc3VsdC50aGVuPGJvb2xlYW4+KChyZXN1bHQpID0+IHJlc3VsdCA9PT0gXCJva1wiKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1EZWxldGVXYWxsKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gXCJEZWxldGUgd2FsbFwiO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9XHJcbiAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgd2FsbCBhbG9uZyB3aXRoIGl0cyBhc3NvY2lhdGVkIGZpeHR1cmVzIGFuZCBlbGVtZW50cz9cIjtcclxuXHJcbiAgICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09IFwib2tcIik7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGaXh0dXJlQ29vcmRpbmF0ZXMoZml4dHVyZXM/OiBhbnkpIHtcclxuICAgIGNvbnN0IGZpeHR1cmVzRnJvbUNhbnZhcyA9XHJcbiAgICAgIGZpeHR1cmVzID8/XHJcbiAgICAgIHRoaXMuY2FudmFzXHJcbiAgICAgICAgLmdldE9iamVjdHMoKVxyXG4gICAgICAgIC5maWx0ZXIoKG9iaikgPT4gKG9iaiBhcyBhbnkpLmZpeHR1cmVJZClcclxuICAgICAgICAubWFwKChvYmopID0+ICh7XHJcbiAgICAgICAgICBpZDogKG9iaiBhcyBhbnkpLmZpeHR1cmVJZCxcclxuICAgICAgICAgIHg6IG9iai5sZWZ0LFxyXG4gICAgICAgICAgeTogb2JqLnRvcCxcclxuICAgICAgICAgIGFuZ2xlOiBvYmo/LmFuZ2xlID8/IDAsXHJcbiAgICAgICAgfSkpO1xyXG4gICAgY29uc3QgcG9zTWFwID0gbmV3IE1hcCgpO1xyXG5cclxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlc0Zyb21DYW52YXMpIHtcclxuICAgICAgcG9zTWFwLnNldChmaXh0dXJlLmlkLCB7XHJcbiAgICAgICAgeDogdGhpcy5mcm9tUGl4ZWxzKGZpeHR1cmUueCwgXCJmdFwiKSxcclxuICAgICAgICB5OiB0aGlzLmZyb21QaXhlbHMoZml4dHVyZS55LCBcImZ0XCIpLFxyXG4gICAgICAgIGFuZ2xlOiBmaXh0dXJlLmFuZ2xlLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlLmZvckVhY2goKGNmOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgbGF0ZXN0Rml4dHVyZVBvcyA9IHBvc01hcC5nZXQoY2YuX2lkKTtcclxuICAgICAgaWYgKGxhdGVzdEZpeHR1cmVQb3MpIHtcclxuICAgICAgICBjZi5yZWxhdGl2ZVBvc2l0aW9uLnggPSBsYXRlc3RGaXh0dXJlUG9zLng7XHJcbiAgICAgICAgY2YucmVsYXRpdmVQb3NpdGlvbi55ID0gbGF0ZXN0Rml4dHVyZVBvcy55O1xyXG4gICAgICAgIGNmLnJlbGF0aXZlUG9zaXRpb24uYW5nbGUgPSBsYXRlc3RGaXh0dXJlUG9zLmFuZ2xlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKHc6IGFueSkgPT4ge1xyXG4gICAgICB3Py5maXh0dXJlcz8uZm9yRWFjaCgod2Y6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEZpeHR1cmVQb3MgPSBwb3NNYXAuZ2V0KHdmLl9pZCk7XHJcbiAgICAgICAgaWYgKGxhdGVzdEZpeHR1cmVQb3MpIHtcclxuICAgICAgICAgIHdmLnJlbGF0aXZlUG9zaXRpb24ueCA9IGxhdGVzdEZpeHR1cmVQb3MueDtcclxuICAgICAgICAgIHdmLnJlbGF0aXZlUG9zaXRpb24ueSA9IGxhdGVzdEZpeHR1cmVQb3MueTtcclxuICAgICAgICAgIHdmLnJlbGF0aXZlUG9zaXRpb24uYW5nbGUgPSBsYXRlc3RGaXh0dXJlUG9zLmFuZ2xlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZU90aGVyRWxlbWVudHNDb29yZGluYXRlcygpIHtcclxuICAgIGNvbnN0IG90aGVyc0Zyb21DYW52YXMgPSB0aGlzLmNhbnZhc1xyXG4gICAgICAuZ2V0T2JqZWN0cygpXHJcbiAgICAgIC5maWx0ZXIoKG9iaikgPT4gKG9iaiBhcyBhbnkpLm9ialR5cGUgPT09IFwib3RoZXJzXCIpXHJcbiAgICAgIC5tYXAoKG9iaikgPT4gKHtcclxuICAgICAgICBpZDogKG9iaiBhcyBhbnkpLmRhdGE/Ll9pZCxcclxuICAgICAgICBsYWJlbDogKG9iaiBhcyBhbnkpLmRhdGE/LmZpeHR1cmVOYW1lLFxyXG4gICAgICAgIHg6IG9iai5sZWZ0LFxyXG4gICAgICAgIHk6IG9iai50b3AsXHJcbiAgICAgICAgYW5nbGU6IG9iaj8uYW5nbGUgPz8gMCxcclxuICAgICAgICB3aWR0aDogdGhpcy5mcm9tUGl4ZWxzKG9iai5nZXRTY2FsZWRXaWR0aCgpIC0gMiwgXCJmdFwiKSxcclxuICAgICAgICBoZWlnaHQ6IHRoaXMuZnJvbVBpeGVscyhvYmouZ2V0U2NhbGVkSGVpZ2h0KCkgLSAyLCBcImZ0XCIpLFxyXG4gICAgICB9KSk7XHJcblxyXG4gICAgY29uc3QgcG9zTWFwID0gbmV3IE1hcDxcclxuICAgICAgc3RyaW5nLFxyXG4gICAgICB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBhbmdsZTogbnVtYmVyOyBoOiBudW1iZXI7IHc6IG51bWJlciB9XHJcbiAgICA+KCk7XHJcbiAgICBmb3IgKGNvbnN0IG90aGVyIG9mIG90aGVyc0Zyb21DYW52YXMpIHtcclxuICAgICAgaWYgKG90aGVyLmlkKSB7XHJcbiAgICAgICAgcG9zTWFwLnNldChvdGhlci5pZCwge1xyXG4gICAgICAgICAgeDogdGhpcy5mcm9tUGl4ZWxzKG90aGVyLngsIFwiZnRcIiksXHJcbiAgICAgICAgICB5OiB0aGlzLmZyb21QaXhlbHMob3RoZXIueSwgXCJmdFwiKSxcclxuICAgICAgICAgIGFuZ2xlOiBvdGhlci5hbmdsZSxcclxuICAgICAgICAgIGg6IG90aGVyLmhlaWdodCxcclxuICAgICAgICAgIHc6IG90aGVyLndpZHRoLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5mbG9vckRhdGEub3RoZXJFbGVtZW50cykpIHtcclxuICAgICAgdGhpcy5mbG9vckRhdGEub3RoZXJFbGVtZW50cy5mb3JFYWNoKChlbDogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGF0ZXN0T3RoZXJzUG9zID0gcG9zTWFwLmdldChlbC5faWQpO1xyXG4gICAgICAgIGlmIChsYXRlc3RPdGhlcnNQb3MpIHtcclxuICAgICAgICAgIGVsLnJlbGF0aXZlUG9zaXRpb24ueCA9IGxhdGVzdE90aGVyc1Bvcy54O1xyXG4gICAgICAgICAgZWwucmVsYXRpdmVQb3NpdGlvbi55ID0gbGF0ZXN0T3RoZXJzUG9zLnk7XHJcbiAgICAgICAgICBlbC5yZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlID0gbGF0ZXN0T3RoZXJzUG9zLmFuZ2xlO1xyXG4gICAgICAgICAgZWwuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSA9IGxhdGVzdE90aGVyc1Bvcy5oO1xyXG4gICAgICAgICAgZWwuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlID0gbGF0ZXN0T3RoZXJzUG9zLnc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKHc6IGFueSkgPT4ge1xyXG4gICAgICB3Py5vdGhlckVsZW1lbnRzPy5mb3JFYWNoKCh3ZjogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGF0ZXN0T3RoZXJzUG9zID0gcG9zTWFwLmdldCh3Zi5faWQpO1xyXG4gICAgICAgIGlmIChsYXRlc3RPdGhlcnNQb3MpIHtcclxuICAgICAgICAgIHdmLnJlbGF0aXZlUG9zaXRpb24ueCA9IGxhdGVzdE90aGVyc1Bvcy54O1xyXG4gICAgICAgICAgd2YucmVsYXRpdmVQb3NpdGlvbi55ID0gbGF0ZXN0T3RoZXJzUG9zLnk7XHJcbiAgICAgICAgICB3Zi5yZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlID0gbGF0ZXN0T3RoZXJzUG9zLmFuZ2xlO1xyXG4gICAgICAgICAgd2YuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSA9IGxhdGVzdE90aGVyc1Bvcy5oO1xyXG4gICAgICAgICAgd2YuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlID0gbGF0ZXN0T3RoZXJzUG9zLnc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlV2FsbENvb3JkaW5hdGVzKCkge1xyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY2FudmFzXHJcbiAgICAgIC5nZXRPYmplY3RzKClcclxuICAgICAgLmZpbHRlcigob2JqKSA9PiAob2JqIGFzIGFueSkub2JqVHlwZSA9PT0gXCJ3YWxsXCIpXHJcbiAgICAgIC5tYXAoKG9iaikgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICB0b3A6IHRoaXMuZnJvbVBpeGVscyhvYmoudG9wLCBcImZ0XCIpLFxyXG4gICAgICAgICAgbGVmdDogdGhpcy5mcm9tUGl4ZWxzKG9iai5sZWZ0LCBcImZ0XCIpLFxyXG4gICAgICAgICAgd2lkdGg6IHRoaXMuZnJvbVBpeGVscyhvYmouZ2V0U2NhbGVkV2lkdGgoKSAtIDAuMjcsIFwiZnRcIiksXHJcbiAgICAgICAgICBoZWlnaHQ6IHRoaXMuZnJvbVBpeGVscyhvYmouZ2V0U2NhbGVkSGVpZ2h0KCkgLSAwLjI3LCBcImZ0XCIpLFxyXG4gICAgICAgICAgYW5nbGU6IG9iai5hbmdsZSxcclxuICAgICAgICAgIGVsZW1lbnREYXRhOiAob2JqIGFzIGFueSkuZGF0YSxcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBjb25zdCBwb3NNYXAgPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgZm9yIChjb25zdCB3YWxsIG9mIGRhdGEpIHtcclxuICAgICAgcG9zTWFwLnNldChcclxuICAgICAgICBgJHt3YWxsLmVsZW1lbnREYXRhLmVsZW1lbnRUeXBlfSR7d2FsbC5lbGVtZW50RGF0YS5lbGVtZW50TnVtYmVyfWAsXHJcbiAgICAgICAgZGF0YS5maW5kKFxyXG4gICAgICAgICAgKG9iaikgPT5cclxuICAgICAgICAgICAgb2JqLmVsZW1lbnREYXRhLmVsZW1lbnRUeXBlID09PSB3YWxsLmVsZW1lbnREYXRhLmVsZW1lbnRUeXBlICYmXHJcbiAgICAgICAgICAgIG9iai5lbGVtZW50RGF0YS5lbGVtZW50TnVtYmVyID09PSB3YWxsLmVsZW1lbnREYXRhLmVsZW1lbnROdW1iZXIsXHJcbiAgICAgICAgKSxcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKHc6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCB3YWxsUG9zID0gcG9zTWFwLmdldChgJHt3LmVsZW1lbnRUeXBlfSR7dy5lbGVtZW50TnVtYmVyfWApO1xyXG4gICAgICBpZiAod2FsbFBvcykge1xyXG4gICAgICAgIHcucmVsYXRpdmVQb3NpdGlvbi54ID0gd2FsbFBvcy5sZWZ0O1xyXG4gICAgICAgIHcucmVsYXRpdmVQb3NpdGlvbi55ID0gd2FsbFBvcy50b3A7XHJcbiAgICAgICAgdy5hbmdsZSA9IHdhbGxQb3MuYW5nbGU7XHJcbiAgICAgICAgdy5kaXN0YW5jZSA9IHdhbGxQb3Mud2lkdGg7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlRW50cmFuY2VDb29yZGluYXRlcygpIHtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNhbnZhc1xyXG4gICAgICAuZ2V0T2JqZWN0cygpXHJcbiAgICAgIC5maWx0ZXIoKG9iaikgPT4gKG9iaiBhcyBhbnkpLm9ialR5cGUgPT09IFwiZW50cmFuY2VcIilcclxuICAgICAgLm1hcCgob2JqKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHRvcDogdGhpcy5mcm9tUGl4ZWxzKG9iai50b3AsIFwiZnRcIiksXHJcbiAgICAgICAgICBsZWZ0OiB0aGlzLmZyb21QaXhlbHMob2JqLmxlZnQsIFwiZnRcIiksXHJcbiAgICAgICAgICB3aWR0aDogdGhpcy5mcm9tUGl4ZWxzKG9iai5nZXRTY2FsZWRXaWR0aCgpLCBcImZ0XCIpLFxyXG4gICAgICAgICAgYW5nbGU6IG9iai5hbmdsZSxcclxuICAgICAgICAgIGVsZW1lbnREYXRhOiAob2JqIGFzIGFueSkuZGF0YSxcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBjb25zdCBwb3NNYXAgPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgZm9yIChjb25zdCBlbnRyYW5jZSBvZiBkYXRhKSB7XHJcbiAgICAgIHBvc01hcC5zZXQoXHJcbiAgICAgICAgYCR7ZW50cmFuY2UuZWxlbWVudERhdGEuZWxlbWVudFR5cGV9JHtlbnRyYW5jZS5lbGVtZW50RGF0YS5lbGVtZW50TnVtYmVyfWAsXHJcbiAgICAgICAgZGF0YS5maW5kKFxyXG4gICAgICAgICAgKG9iaikgPT5cclxuICAgICAgICAgICAgb2JqLmVsZW1lbnREYXRhLmVsZW1lbnRUeXBlID09PSBlbnRyYW5jZS5lbGVtZW50RGF0YS5lbGVtZW50VHlwZSAmJlxyXG4gICAgICAgICAgICBvYmouZWxlbWVudERhdGEuZWxlbWVudE51bWJlciA9PT1cclxuICAgICAgICAgICAgICBlbnRyYW5jZS5lbGVtZW50RGF0YS5lbGVtZW50TnVtYmVyLFxyXG4gICAgICAgICksXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5mb3JFYWNoKCh3OiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgZW50cmFuY2VQb3MgPSBwb3NNYXAuZ2V0KGAke3cuZWxlbWVudFR5cGV9JHt3LmVsZW1lbnROdW1iZXJ9YCk7XHJcbiAgICAgIGlmIChlbnRyYW5jZVBvcykge1xyXG4gICAgICAgIHcucmVsYXRpdmVQb3NpdGlvbi54ID0gZW50cmFuY2VQb3MubGVmdDtcclxuICAgICAgICB3LnJlbGF0aXZlUG9zaXRpb24ueSA9IGVudHJhbmNlUG9zLnRvcDtcclxuICAgICAgICB3LmFuZ2xlID0gZW50cmFuY2VQb3MuYW5nbGU7XHJcbiAgICAgICAgdy5kaXN0YW5jZSA9IGVudHJhbmNlUG9zLndpZHRoO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBVcGRhdGUgZGlzc2VjdGlvbiBsaW5lcyB3aGVuZXZlciBlbnRyYW5jZSBjb29yZGluYXRlcyBjaGFuZ2VcclxuICAgIHRoaXMudXBkYXRlRGlzc2VjdGlvbkxpbmVzKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGVMYXlvdXQoZWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgLy8gaWYgKFxyXG4gICAgLy8gICBlZGl0TW9kZSAmJlxyXG4gICAgLy8gICB0aGlzLmdldFN0YXR1cyA9PT0gXCJhbGxvY2F0aW9uUGVuZGluZ1wiICYmXHJcbiAgICAvLyAgIHVwZGF0ZVN0YXR1cyA9PT0gXCJkcmFmdFwiXHJcbiAgICAvLyApIHtcclxuICAgIC8vICAgaWYgKCEoYXdhaXQgdGhpcy5jb25maXJtU2F2ZSgpKSkge1xyXG4gICAgLy8gICAgIHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIC8vICAgICB0aGlzLnJlbmRlckZsb29yKGZhbHNlKTtcclxuICAgIC8vICAgICByZXR1cm47XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBlbGVtZW50LmZpeHR1cmVzID0gZWxlbWVudC5maXh0dXJlcy5maWx0ZXIoXHJcbiAgICAgICAgKGZpeHR1cmU6IGFueSkgPT4gIWZpeHR1cmU/Lmdob3N0ICYmIGZpeHR1cmUuZml4dHVyZU5hbWUgIT09IFwic3BhY2VcIixcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZSA9IHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmVcclxuICAgICAgLmZpbHRlcigoZml4dHVyZTogYW55KSA9PiAhZml4dHVyZT8uZ2hvc3QpXHJcbiAgICAgIC5tYXAoKGZpeHR1cmU6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgYXNzb2NpYXRlZEVsZW1lbnRUeXBlLCBhc3NvY2lhdGVkRWxlbWVudE51bWJlciwgLi4ucmVzdCB9ID1cclxuICAgICAgICAgIGZpeHR1cmU7XHJcbiAgICAgICAgcmV0dXJuIHJlc3Q7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5yZW9yZGVyRml4dHVyZSh0aGlzLmZsb29yRGF0YSk7XHJcblxyXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICBkYXRhOiB7IC4uLnRoaXMuZmxvb3JEYXRhIH0sXHJcbiAgICAgIGVkaXRNb2RlOiBlZGl0TW9kZSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5pc1NhdmluZ0xheW91dCA9IHRydWU7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlU3RvcmVQbGFubyhwYXlsb2FkKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JtKCk7XHJcbiAgICAgICAgdGhpcy5nZXRTdG9yZUZpeHR1cmVzKHRoaXMucGxhbm9EYXRhLl9pZCk7XHJcbiAgICAgICAgdGhpcy5pc1NhdmluZ0xheW91dCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubGF5b3V0SGFzVW5zYXZlZENoYW5nZXMgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiRmFpbGVkIHRvIHVwZGF0ZSBsYXlvdXRcIik7XHJcbiAgICAgICAgdGhpcy5pc1NhdmluZ0xheW91dCA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrRWRpdCgpIHtcclxuICAgIHRoaXMudG9nZ2xlUGFuZWwoXCJyaWdodFwiLCB0cnVlKTtcclxuICAgIHRoaXMudG9nZ2xlUGFuZWwoXCJsZWZ0XCIsIGZhbHNlKTtcclxuXHJcbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcclxuICAgIHRoaXMubGF5b3V0Rm9ybS5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgdGhpcy5oaWdobGlnaHRlZEZpeHR1cmVGb3JtSWQgPSBudWxsO1xyXG5cclxuICAgIHRoaXMucmVuZGVyRmxvb3IoKTtcclxuICB9XHJcblxyXG4gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGF5b3V0IGhhcyBwZW5kaW5nIGNoYW5nZXMgdGhlIHVzZXIgbXVzdCBzYXZlIGJlZm9yZVxyXG4gIC8vIHRoZXkgY2FuIGVkaXQgYW4gaW5kaXZpZHVhbCBmaXh0dXJlLiBTZXQgYnkgYWxsIGxheW91dCBtdXRhdGlvbiBoYW5kbGVyc1xyXG4gIC8vIChhZGQgLyBkZWxldGUgLyBtb3ZlIC8gdGVtcGxhdGUgY2hhbmdlKSwgY2xlYXJlZCBvbiBzdWNjZXNzZnVsIHNhdmUuXHJcbiAgcHJpdmF0ZSBoYXNVbnNhdmVkTGF5b3V0Q2hhbmdlcygpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmxheW91dEhhc1Vuc2F2ZWRDaGFuZ2VzKSByZXR1cm4gdHJ1ZTtcclxuICAgIGNvbnN0IHdhbGxGaXh0dXJlcyA9ICh0aGlzLmZsb29yRGF0YT8ubGF5b3V0UG9seWdvbiA/PyBbXSkuZmxhdE1hcChcclxuICAgICAgKGVsOiBhbnkpID0+IGVsPy5maXh0dXJlcyA/PyBbXSxcclxuICAgICk7XHJcbiAgICBjb25zdCBmbG9vckZpeHR1cmVzID0gdGhpcy5mbG9vckRhdGE/LmNlbnRlckZpeHR1cmUgPz8gW107XHJcbiAgICByZXR1cm4gWy4uLndhbGxGaXh0dXJlcywgLi4uZmxvb3JGaXh0dXJlc10uc29tZShcclxuICAgICAgKGY6IGFueSkgPT4gZj8udW5zYXZlZENoYW5nZXMsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdldFByb2dyZXNzVmFsdWUoKSB7XHJcbiAgICBpZiAodGhpcy5nZXRTdGF0dXMgPT09IFwiYWxsb2NhdGlvblBlbmRpbmdcIikge1xyXG4gICAgICByZXR1cm4gMjU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBnZXRTdGF0dXNUZXh0KCkge1xyXG4gICAgaWYgKHRoaXMuZ2V0U3RhdHVzID09PSBcImFsbG9jYXRpb25QZW5kaW5nXCIpIHtcclxuICAgICAgcmV0dXJuIFwiQWxsb2NhdGlvbiBwZW5kaW5nXCI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gXCJEcmFmdFwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGdldFN0YXR1cygpIHtcclxuICAgIHJldHVybiB0aGlzLmZsb29yRGF0YT8uc3RhdHVzID8/IFwiZHJhZnRcIjtcclxuICB9XHJcblxyXG4gIGdldEVsZW1lbnROdW1iZXIoZ3JvdXA6IGFueSk6IG51bWJlciB8IG51bGwge1xyXG4gICAgcmV0dXJuIGdyb3VwLmdldChcImVsZW1lbnROdW1iZXJcIik/LnZhbHVlID8/IG51bGw7XHJcbiAgfVxyXG5cclxuICBoaWdobGlnaHRGaXh0dXJlKGdyb3VwOiBhbnksIGJsaW5rOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGlmICh0aGlzLmxheW91dEZvcm0uZW5hYmxlZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5yZW1vdmVIaWdobGlnaHQoKTtcclxuICAgIHRoaXMuY2FuY2VsSGlnaGxpZ2h0QmxpbmsgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBjZW50ZXIgPSBncm91cC5nZXRDZW50ZXJQb2ludCgpO1xyXG5cclxuICAgIGNvbnN0IHJlYWxXaWR0aCA9IGdyb3VwLndpZHRoISAqIGdyb3VwLnNjYWxlWCE7XHJcbiAgICBjb25zdCByZWFsSGVpZ2h0ID0gZ3JvdXAuaGVpZ2h0ISAqIGdyb3VwLnNjYWxlWSE7XHJcblxyXG4gICAgY29uc3QgcmVjdCA9IG5ldyBmYWJyaWMuUmVjdCh7XHJcbiAgICAgIGxlZnQ6IGNlbnRlci54LFxyXG4gICAgICB0b3A6IGNlbnRlci55LFxyXG4gICAgICB3aWR0aDogcmVhbFdpZHRoICsgOCwgLy8gY29uc2lzdGVudCBwYWRkaW5nXHJcbiAgICAgIGhlaWdodDogcmVhbEhlaWdodCArIDgsXHJcbiAgICAgIHJ4OiA1LFxyXG4gICAgICByeTogNSxcclxuICAgICAgc3Ryb2tlOiBcIiMwMGFhZmZcIixcclxuICAgICAgc3Ryb2tlV2lkdGg6IDMsXHJcbiAgICAgIGZpbGw6IFwidHJhbnNwYXJlbnRcIixcclxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICBhbmdsZTogZ3JvdXAuYW5nbGUgfHwgMCxcclxuICAgICAgb3BhY2l0eTogYmxpbmsgPyAwIDogMSxcclxuICAgIH0pO1xyXG5cclxuICAgIChyZWN0IGFzIGFueSkuZGF0YSA9IHsgdHlwZTogXCJmaXh0dXJlLWhpZ2hsaWdodFwiIH07XHJcblxyXG4gICAgdGhpcy5jYW52YXMuYWRkKHJlY3QpO1xyXG4gICAgdGhpcy5jYW52YXMubW92ZU9iamVjdFRvKHJlY3QsIHRoaXMuY2FudmFzLmdldE9iamVjdHMoKS5sZW5ndGggLSAxKTtcclxuICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuXHJcbiAgICB0aGlzLmFjdGl2ZUhpZ2hsaWdodCA9IHJlY3Q7XHJcblxyXG4gICAgLy8gLS0tIE5vIGJsaW5raW5nIG5lZWRlZCAtLS1cclxuICAgIGlmICghYmxpbmspIHJldHVybjtcclxuXHJcbiAgICBsZXQgY3ljbGVzID0gMDtcclxuXHJcbiAgICBjb25zdCBibGlua09uY2UgPSAoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmNhbmNlbEhpZ2hsaWdodEJsaW5rKSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHQoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJlY3QuYW5pbWF0ZShcclxuICAgICAgICB7IG9wYWNpdHk6IDEgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkdXJhdGlvbjogMjAwLFxyXG4gICAgICAgICAgb25DaGFuZ2U6ICgpID0+IHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKSxcclxuICAgICAgICAgIG9uQ29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2FuY2VsSGlnaGxpZ2h0QmxpbmspIHtcclxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodCgpO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVjdC5hbmltYXRlKFxyXG4gICAgICAgICAgICAgIHsgb3BhY2l0eTogMCB9LFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogKCkgPT4gdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpLFxyXG4gICAgICAgICAgICAgICAgb25Db21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5jZWxIaWdobGlnaHRCbGluaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICBjeWNsZXMrKztcclxuICAgICAgICAgICAgICAgICAgaWYgKGN5Y2xlcyA8IDIwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYmxpbmtPbmNlKCk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhbmNlbEhpZ2hsaWdodEJsaW5rKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZWN0LnNldCh7IG9wYWNpdHk6IDEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG5cclxuICAgIGJsaW5rT25jZSgpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlSGlnaGxpZ2h0KCkge1xyXG4gICAgdGhpcy5jYW5jZWxIaWdobGlnaHRCbGluayA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5jYW52YXM/LmdldE9iamVjdHMoKT8uZm9yRWFjaCgob2JqKSA9PiB7XHJcbiAgICAgIGlmICgob2JqIGFzIGFueSkuZGF0YT8udHlwZSA9PT0gXCJmaXh0dXJlLWhpZ2hsaWdodFwiKSB7XHJcbiAgICAgICAgdGhpcy5jYW52YXMucmVtb3ZlKG9iaik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWN0aXZlSGlnaGxpZ2h0ID0gbnVsbDtcclxuICAgIHRoaXMuY2FudmFzPy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgfVxyXG5cclxuICBrZWVwSGlnaGxpZ2h0T25Ub3AgPSAoKSA9PiB7XHJcbiAgICBpZiAoIXRoaXMuYWN0aXZlSGlnaGxpZ2h0KSByZXR1cm47XHJcbiAgICBjb25zdCBvYmpzID0gdGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpO1xyXG4gICAgdGhpcy5jYW52YXMubW92ZU9iamVjdFRvKHRoaXMuYWN0aXZlSGlnaGxpZ2h0LCBvYmpzLmxlbmd0aCAtIDEpO1xyXG4gIH07XHJcblxyXG4gIC8vIEluIGVkaXQgbW9kZSwgd2hlbiBhIGZpeHR1cmUgaXMgY2xpY2tlZCBvbiB0aGUgY2FudmFzLCBvcGVuIHRoZSBtYXRjaGluZ1xyXG4gIC8vIGFjY29yZGlvbiBpdGVtIGluIHRoZSBsZWZ0IHBhbmVsLCBzY3JvbGwgaXQgaW50byB2aWV3IGFuZCBoaWdobGlnaHQgdGhlXHJcbiAgLy8gZml4dHVyZSByb3cgc28gdGhlIHVzZXIgY2FuIGxvY2F0ZSBpdCBpbiB0aGUgZm9ybSBxdWlja2x5LlxyXG4gIGhpZ2hsaWdodEZpeHR1cmVJbkFjY29yZGlvbihmaXh0dXJlRGF0YTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIWZpeHR1cmVEYXRhIHx8IHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIGxldCBhY2NvcmRpb25JdGVtSWQ6IHN0cmluZztcclxuXHJcbiAgICBpZiAoZml4dHVyZURhdGEuZml4dHVyZVR5cGUgPT09IFwid2FsbFwiKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1JZHggPSB0aGlzLmdldEZvcm1XYWxscy5jb250cm9scy5maW5kSW5kZXgoXHJcbiAgICAgICAgKGMpID0+XHJcbiAgICAgICAgICBjLmdldChcImVsZW1lbnROdW1iZXJcIik/LnZhbHVlID09PSBmaXh0dXJlRGF0YS5hc3NvY2lhdGVkRWxlbWVudE51bWJlcixcclxuICAgICAgKTtcclxuICAgICAgaWYgKGZvcm1JZHggPCAwKSB7XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZEZpeHR1cmVGb3JtSWQgPSBudWxsO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBhY2NvcmRpb25JdGVtSWQgPSBgYWNjb3JkaW9uLXdhbGwtJHtmb3JtSWR4fWA7XHJcbiAgICB9IGVsc2UgaWYgKGZpeHR1cmVEYXRhLmZpeHR1cmVUeXBlID09PSBcImZsb29yXCIpIHtcclxuICAgICAgYWNjb3JkaW9uSXRlbUlkID0gXCJhY2NvcmRpb24tZmxvb3JcIjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmhpZ2hsaWdodGVkRml4dHVyZUZvcm1JZCA9IGZpeHR1cmVEYXRhLl9pZCA/PyBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLmlzTGVmdFBhbmVsQ29sbGFwc2VkKSB7XHJcbiAgICAgIHRoaXMudG9nZ2xlUGFuZWwoXCJsZWZ0XCIsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJvZHlBY2NvcmRpb24/LmV4cGFuZChhY2NvcmRpb25JdGVtSWQpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjY29yZGlvbkl0ZW1JZCk7XHJcbiAgICAgIGVsPy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiBcInNtb290aFwiLCBibG9jazogXCJzdGFydFwiIH0pO1xyXG4gICAgfSwgMzUwKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ2xpY2tBcHByb3ZlTGF5b3V0KCkge1xyXG4gICAgaWYgKHRoaXMuYWxsRml4dHVyZUluc3RhbmNlcy5sZW5ndGggPD0gMCkge1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgIFwiTm8gZml4dHVyZXMgZm91bmQuIEFkZCBmaXh0dXJlcyB0byBwcm9jZWVkXCIsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmFwcHJvdmVMYXlvdXRNb2RhbFJlZiwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICAgIGJhY2tkcm9wOiBcInN0YXRpY1wiLFxyXG4gICAgICB9KS5yZXN1bHQ7XHJcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge31cclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ2xpY2tSdW5BbGxvY2F0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuYWxsRml4dHVyZUluc3RhbmNlcy5sZW5ndGggPD0gMCkge1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgIFwiTm8gZml4dHVyZXMgZm91bmQuIEFkZCBmaXh0dXJlcyB0byBwcm9jZWVkXCIsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaGFzSW52YWxpZEZpeHR1cmVzKSB7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgXCJTb21lIGZpeHR1cmVzIGhhdmUgaW52YWxpZCBoZWFkZXJzIG9yIGxpYnJhcnkgbWlzbWF0Y2hlcy4gUGxlYXNlIGZpeCBhbGwgcmVkIGZpeHR1cmVzIGJlZm9yZSBydW5uaW5nIGFsbG9jYXRpb24uXCIsXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc0FsbG9jYXRpb25SdW4pIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuY29tcGxldGVBbGxvY2F0aW9uTW9kYWxSZWYsIHtcclxuICAgICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICAgICAgYmFja2Ryb3A6IFwic3RhdGljXCIsXHJcbiAgICAgICAgfSkucmVzdWx0O1xyXG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge31cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmFwcGx5TG9naWNzTW9kYWxSZWYsIHtcclxuICAgICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICAgICAgYmFja2Ryb3A6IFwic3RhdGljXCIsXHJcbiAgICAgICAgfSkucmVzdWx0O1xyXG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge31cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ2xpY2tSZXZlcnRBbGxvY2F0aW9uKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLnJldmVydEFsbG9jYXRpb25Nb2RhbFJlZiwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICAgIGJhY2tkcm9wOiBcInN0YXRpY1wiLFxyXG4gICAgICB9KS5yZXN1bHQ7XHJcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge31cclxuICB9XHJcblxyXG4gIHJldmVydEFsbG9jYXRpb24oKSB7XHJcbiAgICBpZiAoIXRoaXMuZmxvb3JEYXRhQmVmb3JlQWxsb2NhdGlvbikge1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiTm8gcHJldmlvdXMgc3RhdGUgZm91bmQgdG8gcmV2ZXJ0XCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbiA9IEpTT04ucGFyc2UoXHJcbiAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuZmxvb3JEYXRhQmVmb3JlQWxsb2NhdGlvbi5sYXlvdXRQb2x5Z29uKSxcclxuICAgICk7XHJcbiAgICB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlID0gSlNPTi5wYXJzZShcclxuICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5mbG9vckRhdGFCZWZvcmVBbGxvY2F0aW9uLmNlbnRlckZpeHR1cmUpLFxyXG4gICAgKTtcclxuICAgIHRoaXMuZmxvb3JEYXRhLm90aGVyRWxlbWVudHMgPSBKU09OLnBhcnNlKFxyXG4gICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmZsb29yRGF0YUJlZm9yZUFsbG9jYXRpb24ub3RoZXJFbGVtZW50cyksXHJcbiAgICApO1xyXG4gICAgdGhpcy5mbG9vckRhdGEuc3RhdHVzID0gdGhpcy5mbG9vckRhdGFCZWZvcmVBbGxvY2F0aW9uLnN0YXR1cztcclxuXHJcbiAgICB0aGlzLmlzQWxsb2NhdGlvblJ1biA9IGZhbHNlO1xyXG4gICAgdGhpcy5mbG9vckRhdGFCZWZvcmVBbGxvY2F0aW9uID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLmV4dHJhY3RBbGxGaXh0dXJlcyh0aGlzLmZsb29yRGF0YSk7XHJcbiAgICB0aGlzLmRpc2FibGVFZGl0ID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEZpeHR1cmUgPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLnRvZ2dsZVBhbmVsKFwibGVmdFwiLCBmYWxzZSk7XHJcbiAgICB0aGlzLnRvZ2dsZVBhbmVsKFwicmlnaHRcIiwgZmFsc2UpO1xyXG4gICAgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcblxyXG4gICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KFwiQWxsb2NhdGlvbiByZXZlcnRlZCBzdWNjZXNzZnVsbHlcIik7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjb21wbGV0ZUFsbG9jYXRpb24oKSB7XHJcbiAgICB0aGlzLmlzQnV0dG9uTG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZmxvb3JJZCA9IHRoaXMuZmxvb3JEYXRhLl9pZDtcclxuICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5hcGlTZXJ2aWNlLnVwZGF0ZVN0b3JlUGxhbm8oe1xyXG4gICAgICAgICAgZmxvb3JJZCxcclxuICAgICAgICAgIG9uYm9hcmRpbmc6IHRydWUsXHJcbiAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZmxvb3JEYXRhLFxyXG4gICAgICAgICAgICAvLyBpc1BsYW5vQXBwcm92ZWQ6IHRydWUsXHJcbiAgICAgICAgICAgIHN0YXR1czogXCJjb21wbGV0ZWRcIixcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBjb25zdCBzdG9yZU5hbWUgPSB0aGlzLmZsb29yRGF0YT8uc3RvcmVOYW1lIHx8IHRoaXMucGxhbm9EYXRhPy5zdG9yZU5hbWU7XHJcbiAgICAgIHRoaXMuYXBpU2VydmljZS5jcmVhdGVBbmRTdWJtaXRMYXlvdXRUYXNrKHN0b3JlTmFtZSwgdGhpcy5jbGllbnRJZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBlcnJvcjogKCkgPT4gdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byBzdWJtaXQgbGF5b3V0IGNoYW5nZXMuXCIpLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldFN1Y2Nlc3NUb2FzdChcIkFsbG9jYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChcclxuICAgICAgICBgbWFuYWdlL3BsYW5vZ3JhbS9tYW5hZ2UtcGxhbm9ncmFtP3BsYW5vSWQ9JHt0aGlzLmZsb29yRGF0YS5wbGFub0lkfSZmbG9vcklkPSR7dGhpcy5mbG9vckRhdGEuX2lkfWAsXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJjb21wbGV0ZUFsbG9jYXRpb24gZmFpbGVkOlwiLCBlcnJvcik7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gY29tcGxldGUgYWxsb2NhdGlvblwiKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNCdXR0b25Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBydW5BbGxvY2F0aW9uKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5pc0J1dHRvbkxvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgdGhpcy5mbG9vckRhdGFCZWZvcmVBbGxvY2F0aW9uID0ge1xyXG4gICAgICAgIGxheW91dFBvbHlnb246IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbikpLFxyXG4gICAgICAgIGNlbnRlckZpeHR1cmU6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZSkpLFxyXG4gICAgICAgIG90aGVyRWxlbWVudHM6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5mbG9vckRhdGEub3RoZXJFbGVtZW50cykpLFxyXG4gICAgICAgIHN0YXR1czogdGhpcy5mbG9vckRhdGEuc3RhdHVzLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5yZW9yZGVyRml4dHVyZU51bWJlckJ5RGlzc2VjdGlvbigpO1xyXG5cclxuICAgICAgY29uc3Qgc3RvcmVOYW1lID0gdGhpcy5mbG9vckRhdGE/LnN0b3JlTmFtZSB8fCB0aGlzLnBsYW5vRGF0YT8uc3RvcmVOYW1lO1xyXG4gICAgICBpZiAoIXN0b3JlTmFtZSkge1xyXG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJTdG9yZSBuYW1lIGlzIHJlcXVpcmVkXCIpO1xyXG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgc3RvcmVOYW1lOiBzdG9yZU5hbWUsXHJcbiAgICAgICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgICAgIGxheW91dFBvbHlnb246IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24gfHwgW10sXHJcbiAgICAgICAgICBjZW50ZXJGaXh0dXJlOiB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlIHx8IFtdLFxyXG4gICAgICAgICAgb3RoZXJFbGVtZW50czogdGhpcy5mbG9vckRhdGEub3RoZXJFbGVtZW50cyB8fCBbXSxcclxuICAgICAgICAgIHN0YXR1czogdGhpcy5mbG9vckRhdGEuc3RhdHVzIHx8IFwiZHJhZnRcIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIHN0b3JlTmFtZTogc3RvcmVOYW1lLCAvLyBBbHNvIGFkZCBhdCByb290IGxldmVsIGFzIGZhbGxiYWNrXHJcbiAgICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgICAgdHlwZTogXCJpdm1cIixcclxuICAgICAgICBpbml0aWFsOiB0cnVlLFxyXG4gICAgICAgIHNvcnQ6IGZhbHNlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuYXBpU2VydmljZS5ydW5BbG9jYXRpb24ocGF5bG9hZCksXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZGF0YSkge1xyXG4gICAgICAgIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24gPVxyXG4gICAgICAgICAgcmVzcG9uc2UuZGF0YS5sYXlvdXRQb2x5Z29uIHx8IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb247XHJcbiAgICAgICAgdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZSA9XHJcbiAgICAgICAgICByZXNwb25zZS5kYXRhLmNlbnRlckZpeHR1cmUgfHwgdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZTtcclxuICAgICAgICB0aGlzLmZsb29yRGF0YS5vdGhlckVsZW1lbnRzID1cclxuICAgICAgICAgIHJlc3BvbnNlLmRhdGEub3RoZXJFbGVtZW50cyB8fCB0aGlzLmZsb29yRGF0YS5vdGhlckVsZW1lbnRzO1xyXG4gICAgICAgIHRoaXMuZmxvb3JEYXRhLnN0YXR1cyA9IHJlc3BvbnNlLmRhdGEuc3RhdHVzIHx8IHRoaXMuZmxvb3JEYXRhLnN0YXR1cztcclxuXHJcbiAgICAgICAgdGhpcy5pc0FsbG9jYXRpb25SdW4gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZUVkaXQgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLmV4dHJhY3RBbGxGaXh0dXJlcyh0aGlzLmZsb29yRGF0YSk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhID0gbnVsbDtcclxuICAgICAgICB0aGlzLnJlbmRlckZsb29yKGZhbHNlKTtcclxuXHJcbiAgICAgICAgdGhpcy50b2dnbGVQYW5lbChcImxlZnRcIiwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy50b2dnbGVQYW5lbChcInJpZ2h0XCIsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KFxyXG4gICAgICAgICAgXCJBbGxvY2F0aW9uIGxvZ2ljIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5XCIsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xyXG4gICAgICB0aGlzLmlzQnV0dG9uTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IGFwcGx5SVZNTG9naWMgW0VSUl06XCIsIGVycm9yKTtcclxuICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byBhcHBseSBhbGxvY2F0aW9uIGxvZ2ljXCIpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc0J1dHRvbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGFwcHJvdmVMYXlvdXQoKSB7XHJcbiAgICB0aGlzLmlzQnV0dG9uTG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZmxvb3JJZCA9IHRoaXMuZmxvb3JEYXRhLl9pZDtcclxuICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5hcGlTZXJ2aWNlLnVwZGF0ZVN0b3JlUGxhbm8oe1xyXG4gICAgICAgICAgZmxvb3JJZCxcclxuICAgICAgICAgIGRhdGE6IHsgLi4udGhpcy5mbG9vckRhdGEsIHN0YXR1czogXCJhbGxvY2F0aW9uUGVuZGluZ1wiIH0sXHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLmZsb29yRGF0YS5pc1BsYW5vQXBwcm92ZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmZsb29yRGF0YS5zdGF0dXMgPSBcImFsbG9jYXRpb25QZW5kaW5nXCI7XHJcblxyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRTdWNjZXNzVG9hc3QoXCJMYXlvdXQgYXBwcm92ZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gICAgICB0aGlzLmxheW91dEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB0aGlzLnJlbmRlckZsb29yKGZhbHNlKTtcclxuICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmlzUnVuQWxsb2NhdGlvbkFsbG93ZWQpIHtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKFxyXG4gICAgICAgICAgYC9tYW5hZ2UvcGxhbm9ncmFtL21hbmFnZS1wbGFub2dyYW1zL29uYm9hcmRgLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJhcHByb3ZlTGF5b3V0IGZhaWxlZDpcIiwgZXJyb3IpO1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiRmFpbGVkIHRvIGFwcHJvdmUgbGF5b3V0XCIpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc0J1dHRvbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlb3JkZXJGaXh0dXJlTnVtYmVyQnlEaXNzZWN0aW9uKCkge1xyXG4gICAgY29uc3QgZmxvb3JEYXRhID0gdGhpcy5mbG9vckRhdGE7XHJcbiAgICBpZiAoIWZsb29yRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHdhbGxGaXh0dXJlczogYW55W10gPSBbXTtcclxuICAgIGNvbnN0IGZsb29yRml4dHVyZXM6IGFueVtdID0gW107XHJcblxyXG4gICAgZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChlbGVtZW50LmVsZW1lbnRUeXBlICE9PSBcIndhbGxcIikgcmV0dXJuO1xyXG4gICAgICBlbGVtZW50LmZpeHR1cmVzLmZvckVhY2goKGZpeHR1cmU6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghZml4dHVyZT8uZ2hvc3QpIHdhbGxGaXh0dXJlcy5wdXNoKGZpeHR1cmUpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGZsb29yRGF0YS5jZW50ZXJGaXh0dXJlLmZvckVhY2goKGZpeHR1cmU6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWZpeHR1cmU/Lmdob3N0KSBmbG9vckZpeHR1cmVzLnB1c2goZml4dHVyZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBkaXNzZWN0aW9uUmVmZXJlbmNlID0gdGhpcy5nZXRFbnRyYW5jZURpc3NlY3Rpb25SZWZlcmVuY2UoZmxvb3JEYXRhKTtcclxuICAgIGNvbnN0IG9yZGVyZWRXYWxsRml4dHVyZXMgPSB0aGlzLnNvcnRGaXh0dXJlc0J5RGlzc2VjdGlvblByaW9yaXR5KFxyXG4gICAgICB3YWxsRml4dHVyZXMsXHJcbiAgICAgIGRpc3NlY3Rpb25SZWZlcmVuY2UsXHJcbiAgICApO1xyXG4gICAgY29uc3Qgb3JkZXJlZEZsb29yRml4dHVyZXMgPSB0aGlzLnNvcnRGaXh0dXJlc0J5RGlzc2VjdGlvblByaW9yaXR5KFxyXG4gICAgICBmbG9vckZpeHR1cmVzLFxyXG4gICAgICBkaXNzZWN0aW9uUmVmZXJlbmNlLFxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgZml4dHVyZU51bWJlciA9IDE7XHJcbiAgICBbLi4ub3JkZXJlZFdhbGxGaXh0dXJlcywgLi4ub3JkZXJlZEZsb29yRml4dHVyZXNdLmZvckVhY2goXHJcbiAgICAgIChmaXh0dXJlOiBhbnkpID0+IHtcclxuICAgICAgICBmaXh0dXJlLmZpeHR1cmVOdW1iZXIgPSBmaXh0dXJlTnVtYmVyKys7XHJcbiAgICAgIH0sXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMucmVuZGVyRmxvb3IoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRFbnRyYW5jZURpc3NlY3Rpb25SZWZlcmVuY2UoZmxvb3JEYXRhOiBhbnkpOiB7XHJcbiAgICBvcmlnaW46IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcclxuICAgIGRpcmVjdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xyXG4gIH0gfCBudWxsIHtcclxuICAgIGNvbnN0IGVudHJhbmNlcyA9XHJcbiAgICAgIGZsb29yRGF0YT8ubGF5b3V0UG9seWdvbj8uZmlsdGVyKFxyXG4gICAgICAgIChlbGVtZW50OiBhbnkpID0+IGVsZW1lbnQ/LmVsZW1lbnRUeXBlID09PSBcImVudHJhbmNlXCIsXHJcbiAgICAgICkgPz8gW107XHJcblxyXG4gICAgaWYgKCFlbnRyYW5jZXMubGVuZ3RoKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBwcmltYXJ5RW50cmFuY2UgPSBbLi4uZW50cmFuY2VzXS5zb3J0KFxyXG4gICAgICAoYTogYW55LCBiOiBhbnkpID0+XHJcbiAgICAgICAgKE51bWJlcihhPy5lbGVtZW50TnVtYmVyKSB8fCAwKSAtIChOdW1iZXIoYj8uZWxlbWVudE51bWJlcikgfHwgMCksXHJcbiAgICApWzBdO1xyXG5cclxuICAgIGNvbnN0IG9yaWdpblVuaXQgPSBwcmltYXJ5RW50cmFuY2U/LnJlbGF0aXZlUG9zaXRpb24/LnVuaXQgfHwgXCJmdFwiO1xyXG4gICAgY29uc3Qgb3JpZ2luID0ge1xyXG4gICAgICB4OiB0aGlzLnRvUGl4ZWxzKHByaW1hcnlFbnRyYW5jZT8ucmVsYXRpdmVQb3NpdGlvbj8ueCB8fCAwLCBvcmlnaW5Vbml0KSxcclxuICAgICAgeTogdGhpcy50b1BpeGVscyhwcmltYXJ5RW50cmFuY2U/LnJlbGF0aXZlUG9zaXRpb24/LnkgfHwgMCwgb3JpZ2luVW5pdCksXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGFuZ2xlRGVnID0gZmxvb3JEYXRhPy5jYWRMYXlvdXRcclxuICAgICAgPyAwXHJcbiAgICAgIDogTnVtYmVyKFxyXG4gICAgICAgICAgcHJpbWFyeUVudHJhbmNlPy5hbmdsZSA/P1xyXG4gICAgICAgICAgICBwcmltYXJ5RW50cmFuY2U/LnJlbGF0aXZlUG9zaXRpb24/LmFuZ2xlID8/XHJcbiAgICAgICAgICAgIDAsXHJcbiAgICAgICAgKTtcclxuICAgIGNvbnN0IGFuZ2xlUmFkID0gKGFuZ2xlRGVnICogTWF0aC5QSSkgLyAxODA7XHJcblxyXG4gICAgY29uc3QgZGlyZWN0aW9uID0ge1xyXG4gICAgICB4OiBNYXRoLmNvcyhhbmdsZVJhZCksXHJcbiAgICAgIHk6IE1hdGguc2luKGFuZ2xlUmFkKSxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHsgb3JpZ2luLCBkaXJlY3Rpb24gfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc29ydEZpeHR1cmVzQnlEaXNzZWN0aW9uUHJpb3JpdHkoXHJcbiAgICBmaXh0dXJlczogYW55W10sXHJcbiAgICBkaXNzZWN0aW9uUmVmZXJlbmNlOiB7XHJcbiAgICAgIG9yaWdpbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xyXG4gICAgICBkaXJlY3Rpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcclxuICAgIH0gfCBudWxsLFxyXG4gICk6IGFueVtdIHtcclxuICAgIGlmICghZml4dHVyZXM/Lmxlbmd0aCkgcmV0dXJuIFtdO1xyXG5cclxuICAgIGlmICghZGlzc2VjdGlvblJlZmVyZW5jZSkge1xyXG4gICAgICByZXR1cm4gWy4uLmZpeHR1cmVzXS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnREZWx0YSA9XHJcbiAgICAgICAgICAoTnVtYmVyKGE/LmFzc29jaWF0ZWRFbGVtZW50TnVtYmVyKSB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikgLVxyXG4gICAgICAgICAgKE51bWJlcihiPy5hc3NvY2lhdGVkRWxlbWVudE51bWJlcikgfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO1xyXG4gICAgICAgIGlmIChlbGVtZW50RGVsdGEgIT09IDApIHJldHVybiBlbGVtZW50RGVsdGE7XHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAoTnVtYmVyKGE/LmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcikgfHxcclxuICAgICAgICAgICAgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIC1cclxuICAgICAgICAgIChOdW1iZXIoYj8uYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyKSB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUilcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7IG9yaWdpbiwgZGlyZWN0aW9uIH0gPSBkaXNzZWN0aW9uUmVmZXJlbmNlO1xyXG4gICAgY29uc3Qgc2lkZVJhbmsgPSAoc2lkZTogbnVtYmVyKSA9PiAoc2lkZSA8IDAgPyAwIDogc2lkZSA+IDAgPyAxIDogMik7XHJcbiAgICBjb25zdCBwcm9qZWN0aW9uVG9sZXJhbmNlID0gMjQ7IC8vIHB4XHJcblxyXG4gICAgY29uc3QgcG9zaXRpb25lZCA9IGZpeHR1cmVzLm1hcCgoZml4dHVyZTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpeHR1cmVQb2ludCA9IHRoaXMuZ2V0Rml4dHVyZUFuY2hvclBvaW50KGZpeHR1cmUpO1xyXG4gICAgICBjb25zdCByZWxhdGl2ZVggPSBmaXh0dXJlUG9pbnQueCAtIG9yaWdpbi54O1xyXG4gICAgICBjb25zdCByZWxhdGl2ZVkgPSBmaXh0dXJlUG9pbnQueSAtIG9yaWdpbi55O1xyXG4gICAgICBjb25zdCBjcm9zcyA9IGRpcmVjdGlvbi54ICogcmVsYXRpdmVZIC0gZGlyZWN0aW9uLnkgKiByZWxhdGl2ZVg7XHJcbiAgICAgIGNvbnN0IGRvdCA9IGRpcmVjdGlvbi54ICogcmVsYXRpdmVYICsgZGlyZWN0aW9uLnkgKiByZWxhdGl2ZVk7XHJcbiAgICAgIGNvbnN0IHNpZGUgPSBNYXRoLmFicyhjcm9zcykgPCAxZS00ID8gMCA6IGNyb3NzID4gMCA/IDEgOiAtMTtcclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZml4dHVyZSxcclxuICAgICAgICBpbmRleCxcclxuICAgICAgICBzaWRlLFxyXG4gICAgICAgIHByb2plY3Rpb246IGRvdCxcclxuICAgICAgICBkaXN0YW5jZUZyb21MaW5lOiBNYXRoLmFicyhjcm9zcyksXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgICBwb3NpdGlvbmVkLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgY29uc3Qgc2lkZURlbHRhID0gc2lkZVJhbmsoYS5zaWRlKSAtIHNpZGVSYW5rKGIuc2lkZSk7XHJcbiAgICAgIGlmIChzaWRlRGVsdGEgIT09IDApIHJldHVybiBzaWRlRGVsdGE7XHJcblxyXG4gICAgICBjb25zdCBwcm9qZWN0aW9uRGVsdGEgPSBhLnByb2plY3Rpb24gLSBiLnByb2plY3Rpb247XHJcbiAgICAgIGlmIChNYXRoLmFicyhwcm9qZWN0aW9uRGVsdGEpID4gcHJvamVjdGlvblRvbGVyYW5jZSlcclxuICAgICAgICByZXR1cm4gcHJvamVjdGlvbkRlbHRhO1xyXG5cclxuICAgICAgY29uc3QgbGluZURpc3RhbmNlRGVsdGEgPSBiLmRpc3RhbmNlRnJvbUxpbmUgLSBhLmRpc3RhbmNlRnJvbUxpbmU7XHJcbiAgICAgIGlmIChNYXRoLmFicyhsaW5lRGlzdGFuY2VEZWx0YSkgPiAxZS00KSByZXR1cm4gbGluZURpc3RhbmNlRGVsdGE7XHJcblxyXG4gICAgICBjb25zdCBlbGVtZW50RGVsdGEgPVxyXG4gICAgICAgIChOdW1iZXIoYS5maXh0dXJlPy5hc3NvY2lhdGVkRWxlbWVudE51bWJlcikgfHxcclxuICAgICAgICAgIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSAtXHJcbiAgICAgICAgKE51bWJlcihiLmZpeHR1cmU/LmFzc29jaWF0ZWRFbGVtZW50TnVtYmVyKSB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7XHJcbiAgICAgIGlmIChlbGVtZW50RGVsdGEgIT09IDApIHJldHVybiBlbGVtZW50RGVsdGE7XHJcblxyXG4gICAgICBjb25zdCBmaXh0dXJlRGVsdGEgPVxyXG4gICAgICAgIChOdW1iZXIoYS5maXh0dXJlPy5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIpIHx8XHJcbiAgICAgICAgICBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikgLVxyXG4gICAgICAgIChOdW1iZXIoYi5maXh0dXJlPy5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIpIHx8XHJcbiAgICAgICAgICBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7XHJcbiAgICAgIGlmIChmaXh0dXJlRGVsdGEgIT09IDApIHJldHVybiBmaXh0dXJlRGVsdGE7XHJcblxyXG4gICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcG9zaXRpb25lZC5tYXAoKGl0ZW0pID0+IGl0ZW0uZml4dHVyZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpeHR1cmVBbmNob3JQb2ludChmaXh0dXJlOiBhbnkpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xyXG4gICAgY29uc3QgcG9zaXRpb25Vbml0ID0gZml4dHVyZT8ucmVsYXRpdmVQb3NpdGlvbj8udW5pdCB8fCBcImZ0XCI7XHJcbiAgICBjb25zdCB3aWR0aFVuaXQgPSBmaXh0dXJlPy5maXh0dXJlU3RhdGljV2lkdGg/LnVuaXQgfHwgXCJmdFwiO1xyXG4gICAgY29uc3QgbGVuZ3RoVW5pdCA9IGZpeHR1cmU/LmZpeHR1cmVTdGF0aWNMZW5ndGg/LnVuaXQgfHwgXCJmdFwiO1xyXG5cclxuICAgIGNvbnN0IHggPSB0aGlzLnRvUGl4ZWxzKGZpeHR1cmU/LnJlbGF0aXZlUG9zaXRpb24/LnggfHwgMCwgcG9zaXRpb25Vbml0KTtcclxuICAgIGNvbnN0IHkgPSB0aGlzLnRvUGl4ZWxzKGZpeHR1cmU/LnJlbGF0aXZlUG9zaXRpb24/LnkgfHwgMCwgcG9zaXRpb25Vbml0KTtcclxuICAgIGNvbnN0IHdpZHRoID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgZml4dHVyZT8uZml4dHVyZVN0YXRpY1dpZHRoPy52YWx1ZSB8fCAwLFxyXG4gICAgICB3aWR0aFVuaXQsXHJcbiAgICApO1xyXG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgZml4dHVyZT8uZml4dHVyZVN0YXRpY0xlbmd0aD8udmFsdWUgfHwgMCxcclxuICAgICAgbGVuZ3RoVW5pdCxcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgeDogeCArIHdpZHRoIC8gMixcclxuICAgICAgeTogeSArIGhlaWdodCAvIDIsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkcmF3RW50cmFuY2VEaXNzZWN0aW9uTGluZShcclxuICAgIGNhbnZhczogZmFicmljLkNhbnZhcyxcclxuICAgIGFycm93R3JvdXA6IGZhYnJpYy5Hcm91cCxcclxuICAgIGFycm93V2lkdGg6IG51bWJlcixcclxuICAgIGFycm93SGVpZ2h0OiBudW1iZXIsXHJcbiAgICBhbmdsZTogbnVtYmVyLFxyXG4gICkge1xyXG4gICAgLy8gR2V0IHRoZSBhcnJvdyBwYXRoIGZyb20gdGhlIGdyb3VwXHJcbiAgICBjb25zdCBvYmplY3RzID0gYXJyb3dHcm91cC5nZXRPYmplY3RzKCk7XHJcbiAgICBjb25zdCBhcnJvd1BhdGggPSBvYmplY3RzLmZpbmQoKG9iaikgPT4gb2JqLnR5cGUgPT09IFwicGF0aFwiKSBhcyBmYWJyaWMuUGF0aDtcclxuXHJcbiAgICBpZiAoIWFycm93UGF0aCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIEdldCB0aGUgZ3JvdXAncyBib3VuZGluZyBib3ggdG8gZmluZCB0aGUgY2VudGVyXHJcbiAgICBjb25zdCBncm91cEJvdW5kcyA9IGFycm93R3JvdXAuZ2V0Qm91bmRpbmdSZWN0KCk7XHJcblxyXG4gICAgLy8gVGhlIHBhdGgncyBwb3NpdGlvbiB3aXRoaW4gdGhlIGdyb3VwXHJcbiAgICBjb25zdCBwYXRoTGVmdCA9IGFycm93UGF0aC5sZWZ0IHx8IDA7XHJcblxyXG4gICAgLy8gQ2FsY3VsYXRlIHRpcCBYOiByaWdodG1vc3QgcG9pbnQgb2YgdGhlIHBhdGhcclxuICAgIGNvbnN0IHRpcEluR3JvdXBYID0gcGF0aExlZnQgKyBhcnJvd1dpZHRoO1xyXG5cclxuICAgIGNvbnN0IGdyb3VwQ2VudGVyID0gYXJyb3dHcm91cC5nZXRDZW50ZXJQb2ludCgpO1xyXG4gICAgY29uc3QgaW52TWF0cml4ID0gZmFicmljLnV0aWwuaW52ZXJ0VHJhbnNmb3JtKFxyXG4gICAgICBhcnJvd0dyb3VwLmNhbGNUcmFuc2Zvcm1NYXRyaXgoKSxcclxuICAgICk7XHJcbiAgICBjb25zdCBncm91cENlbnRlckluR3JvdXAgPSBmYWJyaWMudXRpbC50cmFuc2Zvcm1Qb2ludChcclxuICAgICAgZ3JvdXBDZW50ZXIsXHJcbiAgICAgIGludk1hdHJpeCxcclxuICAgICk7XHJcblxyXG4gICAgLy8gVXNlIHRoZSBncm91cCdzIHZlcnRpY2FsIGNlbnRlciBmb3IgWVxyXG4gICAgY29uc3QgdGlwSW5Hcm91cFkgPSBncm91cENlbnRlckluR3JvdXAueTtcclxuXHJcbiAgICAvLyBUcmFuc2Zvcm0gZnJvbSBncm91cCBjb29yZGluYXRlcyB0byBjYW52YXMgY29vcmRpbmF0ZXNcclxuICAgIGNvbnN0IHRpcFBvaW50ID0gbmV3IGZhYnJpYy5Qb2ludCh0aXBJbkdyb3VwWCwgdGlwSW5Hcm91cFkpO1xyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRQb2ludCA9IGZhYnJpYy51dGlsLnRyYW5zZm9ybVBvaW50KFxyXG4gICAgICB0aXBQb2ludCxcclxuICAgICAgYXJyb3dHcm91cC5jYWxjVHJhbnNmb3JtTWF0cml4KCksXHJcbiAgICApO1xyXG4gICAgY29uc3QgdGlwWCA9IHRyYW5zZm9ybWVkUG9pbnQueDtcclxuICAgIGNvbnN0IHRpcFkgPSB0cmFuc2Zvcm1lZFBvaW50Lnk7XHJcblxyXG4gICAgLy8gR2V0IHN0b3JlIGJvdW5kc1xyXG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5nZXRGdWxsTGF5b3V0Qm91bmRzKCk7XHJcbiAgICBpZiAoIWJvdW5kcy53aWR0aCB8fCAhYm91bmRzLmhlaWdodCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIENhbGN1bGF0ZSBkaXJlY3Rpb24gdmVjdG9yIHBhcmFsbGVsIHRvIHRoZSBlbnRyYW5jZSAoaW4gdGhlIGRpcmVjdGlvbiB0aGUgYXJyb3cgcG9pbnRzKVxyXG4gICAgY29uc3QgcmFkID0gKGFuZ2xlICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICBjb25zdCBkaXJlY3Rpb25YID0gTWF0aC5jb3MocmFkKTtcclxuICAgIGNvbnN0IGRpcmVjdGlvblkgPSBNYXRoLnNpbihyYWQpO1xyXG5cclxuICAgIC8vIENhbGN1bGF0ZSBpbnRlcnNlY3Rpb24gcG9pbnRzIHdpdGggc3RvcmUgYm91bmRhcmllcyB1c2luZyBsaW5lLXJlY3RhbmdsZSBpbnRlcnNlY3Rpb25cclxuICAgIGNvbnN0IGludGVyc2VjdGlvbnM6IEFycmF5PHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfT4gPSBbXTtcclxuXHJcbiAgICAvLyBDaGVjayBpbnRlcnNlY3Rpb24gd2l0aCBlYWNoIGJvdW5kYXJ5IGVkZ2VcclxuICAgIGNvbnN0IGVkZ2VzID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgeDE6IGJvdW5kcy5sZWZ0LFxyXG4gICAgICAgIHkxOiBib3VuZHMudG9wLFxyXG4gICAgICAgIHgyOiBib3VuZHMubGVmdCArIGJvdW5kcy53aWR0aCxcclxuICAgICAgICB5MjogYm91bmRzLnRvcCxcclxuICAgICAgfSwgLy8gVG9wXHJcbiAgICAgIHtcclxuICAgICAgICB4MTogYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGgsXHJcbiAgICAgICAgeTE6IGJvdW5kcy50b3AsXHJcbiAgICAgICAgeDI6IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoLFxyXG4gICAgICAgIHkyOiBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCxcclxuICAgICAgfSwgLy8gUmlnaHRcclxuICAgICAge1xyXG4gICAgICAgIHgxOiBib3VuZHMubGVmdCArIGJvdW5kcy53aWR0aCxcclxuICAgICAgICB5MTogYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQsXHJcbiAgICAgICAgeDI6IGJvdW5kcy5sZWZ0LFxyXG4gICAgICAgIHkyOiBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCxcclxuICAgICAgfSwgLy8gQm90dG9tXHJcbiAgICAgIHtcclxuICAgICAgICB4MTogYm91bmRzLmxlZnQsXHJcbiAgICAgICAgeTE6IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0LFxyXG4gICAgICAgIHgyOiBib3VuZHMubGVmdCxcclxuICAgICAgICB5MjogYm91bmRzLnRvcCxcclxuICAgICAgfSwgLy8gTGVmdFxyXG4gICAgXTtcclxuXHJcbiAgICAvLyBFeHRlbmQgbGluZSBpbiBib3RoIGRpcmVjdGlvbnMgdG8gZmluZCBpbnRlcnNlY3Rpb25zXHJcbiAgICBjb25zdCBtYXhEaXN0YW5jZSA9IE1hdGgubWF4KGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCkgKiAyO1xyXG4gICAgZm9yIChjb25zdCBlZGdlIG9mIGVkZ2VzKSB7XHJcbiAgICAgIGNvbnN0IGludGVyc2VjdGlvbiA9IHRoaXMubGluZUludGVyc2VjdGlvbihcclxuICAgICAgICB0aXBYLFxyXG4gICAgICAgIHRpcFksXHJcbiAgICAgICAgdGlwWCArIGRpcmVjdGlvblggKiBtYXhEaXN0YW5jZSxcclxuICAgICAgICB0aXBZICsgZGlyZWN0aW9uWSAqIG1heERpc3RhbmNlLFxyXG4gICAgICAgIGVkZ2UueDEsXHJcbiAgICAgICAgZWRnZS55MSxcclxuICAgICAgICBlZGdlLngyLFxyXG4gICAgICAgIGVkZ2UueTIsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChpbnRlcnNlY3Rpb24pIHtcclxuICAgICAgICBpbnRlcnNlY3Rpb25zLnB1c2goaW50ZXJzZWN0aW9uKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaW50ZXJzZWN0aW9uQmFjayA9IHRoaXMubGluZUludGVyc2VjdGlvbihcclxuICAgICAgICB0aXBYLFxyXG4gICAgICAgIHRpcFksXHJcbiAgICAgICAgdGlwWCAtIGRpcmVjdGlvblggKiBtYXhEaXN0YW5jZSxcclxuICAgICAgICB0aXBZIC0gZGlyZWN0aW9uWSAqIG1heERpc3RhbmNlLFxyXG4gICAgICAgIGVkZ2UueDEsXHJcbiAgICAgICAgZWRnZS55MSxcclxuICAgICAgICBlZGdlLngyLFxyXG4gICAgICAgIGVkZ2UueTIsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChpbnRlcnNlY3Rpb25CYWNrKSB7XHJcbiAgICAgICAgaW50ZXJzZWN0aW9ucy5wdXNoKGludGVyc2VjdGlvbkJhY2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGludGVyc2VjdGlvbnMubGVuZ3RoID49IDIpIHtcclxuICAgICAgLy8gRmluZCB0aGUgdHdvIHBvaW50cyB0aGF0IGFyZSBmYXJ0aGVzdCBhcGFydCAodG8gZHJhdyB0aGUgZnVsbCBsaW5lIGFjcm9zcyB0aGUgc3RvcmUpXHJcbiAgICAgIGxldCBtYXhEaXN0ID0gMDtcclxuICAgICAgbGV0IHBvaW50MSA9IGludGVyc2VjdGlvbnNbMF07XHJcbiAgICAgIGxldCBwb2ludDIgPSBpbnRlcnNlY3Rpb25zWzFdO1xyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcnNlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgaW50ZXJzZWN0aW9ucy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgY29uc3QgZGlzdCA9IE1hdGguc3FydChcclxuICAgICAgICAgICAgTWF0aC5wb3coaW50ZXJzZWN0aW9uc1tpXS54IC0gaW50ZXJzZWN0aW9uc1tqXS54LCAyKSArXHJcbiAgICAgICAgICAgICAgTWF0aC5wb3coaW50ZXJzZWN0aW9uc1tpXS55IC0gaW50ZXJzZWN0aW9uc1tqXS55LCAyKSxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoZGlzdCA+IG1heERpc3QpIHtcclxuICAgICAgICAgICAgbWF4RGlzdCA9IGRpc3Q7XHJcbiAgICAgICAgICAgIHBvaW50MSA9IGludGVyc2VjdGlvbnNbaV07XHJcbiAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdGlvbnNbal07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBEcmF3IHRoZSBsaW5lXHJcbiAgICAgIGNvbnN0IGxpbmUgPSBuZXcgZmFicmljLkxpbmUoW3BvaW50MS54LCBwb2ludDEueSwgcG9pbnQyLngsIHBvaW50Mi55XSwge1xyXG4gICAgICAgIHN0cm9rZTogXCJ0cmFuc3BhcmVudFwiLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAxLFxyXG4gICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgICB9KSBhcyBmYWJyaWMuTGluZSAmIHsgaXNEaXNzZWN0aW9uTGluZT86IGJvb2xlYW4gfTtcclxuXHJcbiAgICAgIGxpbmUuaXNEaXNzZWN0aW9uTGluZSA9IHRydWU7XHJcblxyXG4gICAgICBjYW52YXMuYWRkKGxpbmUpO1xyXG4gICAgICBjYW52YXMuc2VuZE9iamVjdFRvQmFjayhsaW5lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbGluZUludGVyc2VjdGlvbihcclxuICAgIHgxOiBudW1iZXIsXHJcbiAgICB5MTogbnVtYmVyLFxyXG4gICAgeDI6IG51bWJlcixcclxuICAgIHkyOiBudW1iZXIsXHJcbiAgICB4MzogbnVtYmVyLFxyXG4gICAgeTM6IG51bWJlcixcclxuICAgIHg0OiBudW1iZXIsXHJcbiAgICB5NDogbnVtYmVyLFxyXG4gICk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwge1xyXG4gICAgY29uc3QgZGVub20gPSAoeDEgLSB4MikgKiAoeTMgLSB5NCkgLSAoeTEgLSB5MikgKiAoeDMgLSB4NCk7XHJcbiAgICBpZiAoTWF0aC5hYnMoZGVub20pIDwgMWUtMTApIHJldHVybiBudWxsOyAvLyBMaW5lcyBhcmUgcGFyYWxsZWxcclxuXHJcbiAgICBjb25zdCB0ID0gKCh4MSAtIHgzKSAqICh5MyAtIHk0KSAtICh5MSAtIHkzKSAqICh4MyAtIHg0KSkgLyBkZW5vbTtcclxuICAgIGNvbnN0IHUgPSAtKCh4MSAtIHgyKSAqICh5MSAtIHkzKSAtICh5MSAtIHkyKSAqICh4MSAtIHgzKSkgLyBkZW5vbTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiBpbnRlcnNlY3Rpb24gaXMgd2l0aGluIGJvdGggbGluZSBzZWdtZW50c1xyXG4gICAgaWYgKHQgPj0gMCAmJiB0IDw9IDEgJiYgdSA+PSAwICYmIHUgPD0gMSkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHg6IHgxICsgdCAqICh4MiAtIHgxKSxcclxuICAgICAgICB5OiB5MSArIHQgKiAoeTIgLSB5MSksXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZURpc3NlY3Rpb25MaW5lcygpIHtcclxuICAgIGlmICghdGhpcy5jYW52YXMpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBvYmplY3RzID0gdGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpO1xyXG4gICAgY29uc3QgZGlzc2VjdGlvbkxpbmVzID0gb2JqZWN0cy5maWx0ZXIoXHJcbiAgICAgIChvYmo6IGFueSkgPT4gb2JqLmlzRGlzc2VjdGlvbkxpbmUgPT09IHRydWUsXHJcbiAgICApO1xyXG5cclxuICAgIGRpc3NlY3Rpb25MaW5lcy5mb3JFYWNoKChsaW5lKSA9PiB7XHJcbiAgICAgIHRoaXMuY2FudmFzPy5yZW1vdmUobGluZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZURpc3NlY3Rpb25MaW5lcygpIHtcclxuICAgIGlmICghdGhpcy5jYW52YXMpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnJlbW92ZURpc3NlY3Rpb25MaW5lcygpO1xyXG5cclxuICAgIGNvbnN0IGVudHJhbmNlT2JqZWN0cyA9IHRoaXMuY2FudmFzXHJcbiAgICAgIC5nZXRPYmplY3RzKClcclxuICAgICAgLmZpbHRlcigob2JqOiBhbnkpID0+IG9iai5vYmpUeXBlID09PSBcImVudHJhbmNlXCIpIGFzIGZhYnJpYy5Hcm91cFtdO1xyXG5cclxuICAgIGVudHJhbmNlT2JqZWN0cy5mb3JFYWNoKChlbnRyYW5jZUdyb3VwKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnREYXRhID0gKGVudHJhbmNlR3JvdXAgYXMgYW55KS5kYXRhO1xyXG4gICAgICBpZiAoIWVsZW1lbnREYXRhKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCB3aWR0aCA9IGVudHJhbmNlR3JvdXAuZ2V0U2NhbGVkV2lkdGgoKSB8fCA4MDtcclxuICAgICAgY29uc3QgaGVpZ2h0ID0gZW50cmFuY2VHcm91cC5nZXRTY2FsZWRIZWlnaHQoKSB8fCA3NTtcclxuICAgICAgY29uc3QgYW5nbGUgPSBlbnRyYW5jZUdyb3VwLmFuZ2xlIHx8IDA7XHJcblxyXG4gICAgICB0aGlzLmRyYXdFbnRyYW5jZURpc3NlY3Rpb25MaW5lKFxyXG4gICAgICAgIHRoaXMuY2FudmFzLFxyXG4gICAgICAgIGVudHJhbmNlR3JvdXAsXHJcbiAgICAgICAgd2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0LFxyXG4gICAgICAgIGFuZ2xlLFxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxzZWN0aW9uIGlkPVwib25ib2FyZC1wbGFub1wiPlxyXG4gICAgPCEtLSBMb2FkaW5nIFN0YXRlIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cImlzUGFnZUxvYWRpbmdcIiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbS0wXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJTa2VsZXRvblwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2tlbGV0b25Mb2FkZXJcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNrZWxldG9uTG9hZGVyXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJza2VsZXRvbkxvYWRlclwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBDb250ZW50IC0tPlxyXG4gICAgPGRpdiBbbmdDbGFzc109XCJ7ICdkLW5vbmUnOiBpc1BhZ2VMb2FkaW5nIH1cIj5cclxuICAgICAgICA8IS0tIEhlYWRlciBBY2NvcmRpb24gLS0+XHJcbiAgICAgICAgPGRpdiBpZD1cImhlYWRlclwiIG5nYkFjY29yZGlvbiAjYWNjb3JkaW9uPVwibmdiQWNjb3JkaW9uXCIgY2xhc3M9XCJteS00XCI+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImRldGFpbHNcIiBbY29sbGFwc2VkXT1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkhlYWRlciBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgcHgtNiBweS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtNCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjVweDtcIiAqbmdJZj1cInBsYW5vRGF0YT8uc3RvcmVOYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9J3RpdGxlJz57e3BsYW5vRGF0YT8uc3RvcmVOYW1lfX0gLSBQbGFubzwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCAqbmdJZj1cImZsb29yc0xpc3QubGVuZ3RoXCIgW2Zvcm1Db250cm9sXT1cInNlbGVjdGVkRmxvb3JJZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiZmxvb3JzTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZWRpdEZpeHR1cmVcIiBjbGFzcz1cInVwZGF0ZUNsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cImZsb29yRGF0YT8udXBkYXRlZEJ5TmFtZSA/ICdVcGRhdGVkIGJ5ICcgKyBmbG9vckRhdGEudXBkYXRlZEJ5TmFtZSA6IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3QgVXBkYXRlOiB7eyBmbG9vckRhdGE/Lmxhc3RVcGRhdGVJc28gfCBkYXRlOidkIE1NTSB5eXl5LCBoaDptbSBhJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTQgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVkaXQgRml4dHVyZSBNb2RlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRGaXh0dXJlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgdGV4dC1ub3dyYXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25GaXh0dXJlUGFnZUNhbmNlbCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbmNlbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRleHQtbm93cmFwXCIgKGNsaWNrKT1cIm9uRml4dHVyZVNhdmUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlICYgQ2xvc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJoZWFkZXJcIiBjbGFzcz1cInJvdyBteC0wIGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFBsYW5vIENvbXBsZXRpb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY3Vyc29yOiB1bnNldDtcIiBjbGFzcz1cImNvbCBmaWx0ZXItdGFiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFubyBDb21wbGV0aW9uICVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAxOCAxOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIG5nYlRvb2x0aXA9XCIlIG9mIG92ZXJhbGwgcGxhbm9ncmFtIGNvbXBsZXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTUxN18xMjk4MDUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05IDEyVjlNOSA2SDkuMDA3NU0xNi41IDlDMTYuNSAxMy4xNDIxIDEzLjE0MjEgMTYuNSA5IDE2LjVDNC44NTc4NiAxNi41IDEuNSAxMy4xNDIxIDEuNSA5QzEuNSA0Ljg1Nzg2IDQuODU3ODYgMS41IDkgMS41QzEzLjE0MjEgMS41IDE2LjUgNC44NTc4NiAxNi41IDlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTUxN18xMjk4MDVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyIG10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NcIiBzdHlsZT1cImhlaWdodDogNHB4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIFtuZ0NsYXNzXT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFsyNSwgNTBdLmluY2x1ZGVzKGdldFByb2dyZXNzVmFsdWUpID8gJ2JnLXdhcm5pbmcnIDogJ2JnLXN1Y2Nlc3MnXCIgcm9sZT1cInByb2dyZXNzYmFyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cIid3aWR0aDonICsgZ2V0UHJvZ3Jlc3NWYWx1ZSArICclJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtdmFsdWVub3ddPVwiZ2V0UHJvZ3Jlc3NWYWx1ZVwiIGFyaWEtdmFsdWVtaW49XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS12YWx1ZW1heD1cIjEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTNcIj57eyBnZXRQcm9ncmVzc1ZhbHVlIH19JTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBMYXlvdXQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY3Vyc29yOiB1bnNldDtcIiBjbGFzcz1cImNvbCBmaWx0ZXItdGFiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPjxiPnt7Zmxvb3JEYXRhPy5mbG9vck51bWJlcn19L3t7IHBsYW5vRGF0YT8uZmxvb3JzPy5sZW5ndGggfX08L2I+IExheW91dDwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZGljYXRvciBtdC0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0U3RhdHVzID09PSAnYWxsb2NhdGlvblBlbmRpbmcnID8gJ2NvbXBsZXRlZCcgOiAnZHJhZnQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldFN0YXR1cyA9PT0gJ2FsbG9jYXRpb25QZW5kaW5nJyA/ICdDb21wbGV0ZWQnIDogJ0RyYWZ0JyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaXh0dXJlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjdXJzb3I6IHVuc2V0O1wiIGNsYXNzPVwiY29sIGZpbHRlci10YWJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+PGI+e3sgYWxsRml4dHVyZUluc3RhbmNlcy5sZW5ndGggfX08L2I+IEZpeHR1cmVzPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5kaWNhdG9yIG10LTJcIiBbbmdDbGFzc109XCJnZXRTdGF0dXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0U3RhdHVzVGV4dCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBCb2R5IC0tPlxyXG4gICAgICAgIDxkaXYgaWQ9XCJib2R5XCIgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPCEtLSBMZWZ0IENvbHVtbiAtLT5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnY29sbGFwc2VkLWNvbCc6IGlzTGVmdFBhbmVsQ29sbGFwc2VkLCAnY29sLTMnOiAhaXNMZWZ0UGFuZWxDb2xsYXBzZWQsJ2Qtbm9uZSc6IGVkaXRGaXh0dXJlICB9XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicy1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZvcm0gW25nQ2xhc3NdPVwieyAnZC1ub25lJzogaXNMZWZ0UGFuZWxDb2xsYXBzZWQgfVwiIFtmb3JtR3JvdXBdPVwibGF5b3V0Rm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbiAjYm9keUFjY29yZGlvbj1cIm5nYkFjY29yZGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBXYWxscyBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEZvcm1XYWxscy5jb250cm9scy5sZW5ndGg7IGVsc2UgYWRkV2FsbEFjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgZm9ybUFycmF5TmFtZT1cIndhbGxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGdldEZvcm1XYWxscy5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgW25nYkFjY29yZGlvbkl0ZW1dPVwiJ2FjY29yZGlvbi13YWxsLScgKyBpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCIgbmdiQWNjb3JkaW9uSGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1haW5oZWFkaW5nIHAtMFwiIG5nYkFjY29yZGlvbkJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0yIHdhbGwtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ3JvdXAuZ2V0KFwiZWxlbWVudFR5cGVcIik/LnZhbHVlIHwgdGl0bGVjYXNlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdyb3VwLmdldChcImVsZW1lbnROdW1iZXJcIik/LnZhbHVlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYobGF5b3V0Rm9ybS5lbmFibGVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0xXCIgbmdiVG9vbHRpcD1cIlJvdGF0ZSB0aGlzIHdhbGwuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyb3RhdGVXYWxsKGdldEVsZW1lbnROdW1iZXIoZ3JvdXApISk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMy43MzczNSA4LjI1MDExQzQuMTIxOTMgOC4yNDM2MiA0LjQ0Mzc3IDguNTI3NzYgNC40OTMzOCA4Ljg5OTk4TDQuNDk5OSA4Ljk4NzM1TDQuNTAyNjIgOS4xNTUxNkM0LjU4NDM0IDExLjU3NDEgNi41NzI0MyAxMy41IDkgMTMuNUM5LjE0MDIyIDEzLjUgOS4yNzk1MSAxMy40OTM2IDkuNDE3NTYgMTMuNDgwOUw5LjIxOTY3IDEzLjI4MDNDOC45MjY3OCAxMi45ODc0IDguOTI2NzggMTIuNTEyNiA5LjIxOTY3IDEyLjIxOTdDOS41MTI1NyAxMS45MjY4IDkuOTg3NDQgMTEuOTI2OCAxMC4yODAzIDEyLjIxOTdMMTEuNzgwMyAxMy43MTk3QzEyLjA3MzIgMTQuMDEyNiAxMi4wNzMyIDE0LjQ4NzQgMTEuNzgwMyAxNC43ODAzTDEwLjI4MDMgMTYuMjgwM0M5Ljk4NzQ0IDE2LjU3MzIgOS41MTI1NyAxNi41NzMyIDkuMjE5NjcgMTYuMjgwM0M4LjkyNjc4IDE1Ljk4NzQgOC45MjY3OCAxNS41MTI2IDkuMjE5NjcgMTUuMjE5N0w5LjQ1ODM3IDE0Ljk4MjdDOS4zMDY0NiAxNC45OTQyIDkuMTUzNTkgMTUgOSAxNUM1LjgyNjUzIDE1IDMuMjE2NjUgMTIuNTMyMSAzLjAxMjUgOS4zODI4OUwzLjAwMzE1IDkuMTkzMTRMMy4wMDAxMSA5LjAxMjY1QzIuOTkzMTIgOC41OTg0OSAzLjMyMzIgOC4yNTcwOSAzLjczNzM1IDguMjUwMTFaTTguNzgwMzMgMS43MTk2N0M5LjA1MDcgMS45OTAwMyA5LjA3MTQ5IDIuNDE1NDYgOC44NDI3MiAyLjcwOTY3TDguNzgwMzMgMi43ODAzM0w4LjU0MTg3IDMuMDE3MjZDOC42OTM3MSAzLjAwNTc4IDguODQ2NSAzIDkgM0MxMi4zMTM3IDMgMTUgNS42ODYyOSAxNSA5QzE1IDkuNDE0MjEgMTQuNjY0MiA5Ljc1IDE0LjI1IDkuNzVDMTMuODM1OCA5Ljc1IDEzLjUgOS40MTQyMSAxMy41IDlDMTMuNSA2LjUxNDcyIDExLjQ4NTMgNC41IDkgNC41QzguODU5NyA0LjUgOC43MjAzNCA0LjUwNjQgOC41ODIyMSA0LjUxOTA5TDguNzgwMzMgNC43MTk2N0M5LjA3MzIzIDUuMDEyNTYgOS4wNzMyMyA1LjQ4NzQ0IDguNzgwMzMgNS43ODAzM0M4LjUwOTk3IDYuMDUwNjkgOC4wODQ1NSA2LjA3MTQ5IDcuNzkwMzMgNS44NDI3Mkw3LjcxOTY3IDUuNzgwMzNMNi4yMTk2NyA0LjI4MDMzQzUuOTQ5MzEgNC4wMDk5NyA1LjkyODUxIDMuNTg0NTQgNi4xNTcyOCAzLjI5MDMzTDYuMjE5NjcgMy4yMTk2N0w3LjcxOTY3IDEuNzE5NjdDOC4wMTI1NyAxLjQyNjc4IDguNDg3NDQgMS40MjY3OCA4Ljc4MDMzIDEuNzE5NjdaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiBzdHJva2U9XCIjNDc1NDY3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMC4wMDA2NFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTFcIiBuZ2JUb29sdGlwPVwiSW5zZXJ0IG5ldyB3YWxsIGJlbG93LlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTmV3V2FsbChnZXRFbGVtZW50TnVtYmVyKGdyb3VwKSEpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAxOCAxOFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF82Ml84KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05IDkuNzVDMTEuMDcwNyA5Ljc1IDEyLjc1IDExLjQyOTMgMTIuNzUgMTMuNUMxMi43NSAxNS41NzA4IDExLjA3MDcgMTcuMjUgOSAxNy4yNUM2LjkyOTI1IDE3LjI1IDUuMjUgMTUuNTcwOCA1LjI1IDEzLjVDNS4yNSAxMS40MjkzIDYuOTI5MjUgOS43NSA5IDkuNzVaTTkuNzUgMTEuMjVIOC4yNVYxMi43NDkzTDYuNzUgMTIuNzVWMTQuMjVMOC4yNSAxNC4yNDkzVjE1Ljc1SDkuNzVWMTQuMjQ5M0wxMS4yNSAxNC4yNVYxMi43NUw5Ljc1IDEyLjc0OTNWMTEuMjVaTTE1IDIuMjVDMTUuNDE0IDIuMjUgMTUuNzUgMi41ODYgMTUuNzUgM1Y3LjVDMTUuNzUgNy45MTQgMTUuNDE0IDguMjUgMTUgOC4yNUgzQzIuNTg2IDguMjUgMi4yNSA3LjkxNCAyLjI1IDcuNVYzQzIuMjUgMi41ODYgMi41ODYgMi4yNSAzIDIuMjVIMTVaTTMuNzUgMy43NVY2Ljc1SDE0LjI1VjMuNzVIMy43NVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNjJfOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlJlbW92ZSB0aGlzIHdhbGwgYW5kIGl0cyBmaXh0dXJlcy5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVdhbGwoZ2V0RWxlbWVudE51bWJlcihncm91cCkhKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNjNfMjUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwLjcwOTQgMS41QzExLjM1NTEgMS41IDExLjkyODMgMS45MTMxNCAxMi4xMzI0IDIuNTI1NjVMMTIuNTQwNiAzLjc1SDE1QzE1LjQxNDIgMy43NSAxNS43NSA0LjA4NTc5IDE1Ljc1IDQuNUMxNS43NSA0LjkxNDIgMTUuNDE0MiA1LjI0OTk5IDE1IDUuMjVMMTQuOTk4MSA1LjMwMzQ0TDE0LjM0NzYgMTQuNDEwM0MxNC4yNjM1IDE1LjU4NzggMTMuMjgzOCAxNi41IDEyLjEwMzQgMTYuNUg1Ljg5NjY4QzQuNzE2MjQgMTYuNSAzLjczNjUgMTUuNTg3OCAzLjY1MjQgMTQuNDEwM0wzLjAwMTkxIDUuMzAzNDRDMy4wMDA2MiA1LjI4NTUxIDIuOTk5OTggNS4yNjc2OSAyLjk5OTk3IDUuMjVDMi41ODU3NyA1LjI0OTk5IDIuMjUgNC45MTQyIDIuMjUgNC41QzIuMjUgNC4wODU3OSAyLjU4NTc5IDMuNzUgMyAzLjc1SDUuNDU5NDNMNS44Njc1NCAyLjUyNTY1QzYuMDcxNzIgMS45MTMxNCA2LjY0NDkzIDEuNSA3LjI5MDU3IDEuNUgxMC43MDk0Wk0xMy40OTgxIDUuMjVINC41MDE5MUw1LjE0ODU4IDE0LjMwMzRDNS4xNzY2MiAxNC42OTYgNS41MDMyIDE1IDUuODk2NjggMTVIMTIuMTAzNEMxMi40OTY4IDE1IDEyLjgyMzQgMTQuNjk2IDEyLjg1MTQgMTQuMzAzNEwxMy40OTgxIDUuMjVaTTcuNSA3LjVDNy44ODQ2NCA3LjUgOC4yMDE2MyA3Ljc4OTUyIDguMjQ0OTUgOC4xNjI1M0w4LjI1IDguMjVWMTJDOC4yNSAxMi40MTQyIDcuOTE0MjIgMTIuNzUgNy41IDEyLjc1QzcuMTE1MzcgMTIuNzUgNi43OTgzNyAxMi40NjA1IDYuNzU1MDUgMTIuMDg3NUw2Ljc1IDEyVjguMjVDNi43NSA3LjgzNTc4IDcuMDg1NzggNy41IDcuNSA3LjVaTTEwLjUgNy41QzEwLjkxNDIgNy41IDExLjI1IDcuODM1NzggMTEuMjUgOC4yNVYxMkMxMS4yNSAxMi40MTQyIDEwLjkxNDIgMTIuNzUgMTAuNSAxMi43NUMxMC4wODU4IDEyLjc1IDkuNzUgMTIuNDE0MiA5Ljc1IDEyVjguMjVDOS43NSA3LjgzNTc4IDEwLjA4NTggNy41IDEwLjUgNy41Wk0xMC43MDk0IDNINy4yOTA1N0w3LjA0MDU3IDMuNzVIMTAuOTU5NUwxMC43MDk0IDNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjMyQjJCXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzYzXzI1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5IGNsYXNzPVwicHMtMCBwZS0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1pbi1oZWlnaHQ6IDUwcHhcIiBkbmREcm9wem9uZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG5kRHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZpeHR1cmVzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Rm9ybUZpeHR1cmVzKGkpLmNvbnRyb2xzLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwiZml4dHVyZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmaXh0dXJlIG9mIGdldEZvcm1GaXh0dXJlcyhpKS5jb250cm9sczsgbGV0IGogPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRuZERyb3B6b25lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG5kRHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpLCBqKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJqXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkbmREcmFnZ2FibGVdPVwieyB3YWxsSW5kZXg6IGksIGZpeHR1cmVJbmRleDogaiB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkbmRFZmZlY3RBbGxvd2VkXT1cIidhbGwnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm93IGctMCBtYi01IGZpeHR1cmUtcm93XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oaWdobGlnaHRlZC1maXh0dXJlXT1cImxheW91dEZvcm0uZW5hYmxlZCAmJiBoaWdobGlnaHRlZEZpeHR1cmVGb3JtSWQgJiYgZml4dHVyZS5nZXQoJ19pZCcpPy52YWx1ZSA9PT0gaGlnaGxpZ2h0ZWRGaXh0dXJlRm9ybUlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkbmREaXNhYmxlRHJhZ0lmXT1cImxheW91dEZvcm0uZGlzYWJsZWRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGgtMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgZG5kRHJhZ0ltYWdlUmVmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwieyBjdXJzb3I6IGxheW91dEZvcm0uZGlzYWJsZWQgPyAnZGVmYXVsdCcgOiAnbW92ZScsIG9wYWNpdHk6ICcwLjUnIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyNXB4XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJtIDQuNDk2MDk0IDAgYyAtMC44MzIwMzIgMCAtMS41IDAuNjcxODc1IC0xLjUgMS41IHMgMC42Njc5NjggMS41IDEuNSAxLjUgYyAwLjgyODEyNSAwIDEuNSAtMC42NzE4NzUgMS41IC0xLjUgcyAtMC42NzE4NzUgLTEuNSAtMS41IC0xLjUgeiBtIDYgMCBjIC0wLjgzMjAzMiAwIC0xLjUgMC42NzE4NzUgLTEuNSAxLjUgcyAwLjY2Nzk2OCAxLjUgMS41IDEuNSBjIDAuODI4MTI1IDAgMS41IC0wLjY3MTg3NSAxLjUgLTEuNSBzIC0wLjY3MTg3NSAtMS41IC0xLjUgLTEuNSB6IG0gLTYgNiBjIC0wLjgzMjAzMiAwIC0xLjUgMC42NzE4NzUgLTEuNSAxLjUgcyAwLjY2Nzk2OCAxLjUgMS41IDEuNSBjIDAuODI4MTI1IDAgMS41IC0wLjY3MTg3NSAxLjUgLTEuNSBzIC0wLjY3MTg3NSAtMS41IC0xLjUgLTEuNSB6IG0gNiAwIGMgLTAuODMyMDMyIDAgLTEuNSAwLjY3MTg3NSAtMS41IDEuNSBzIDAuNjY3OTY4IDEuNSAxLjUgMS41IGMgMC44MjgxMjUgMCAxLjUgLTAuNjcxODc1IDEuNSAtMS41IHMgLTAuNjcxODc1IC0xLjUgLTEuNSAtMS41IHogbSAtNiA2IGMgLTAuODMyMDMyIDAgLTEuNSAwLjY3MTg3NSAtMS41IDEuNSBzIDAuNjY3OTY4IDEuNSAxLjUgMS41IGMgMC44MjgxMjUgMCAxLjUgLTAuNjcxODc1IDEuNSAtMS41IHMgLTAuNjcxODc1IC0xLjUgLTEuNSAtMS41IHogbSA2IDAgYyAtMC44MzIwMzIgMCAtMS41IDAuNjcxODc1IC0xLjUgMS41IHMgMC42Njc5NjggMS41IDEuNSAxLjUgYyAwLjgyODEyNSAwIDEuNSAtMC42NzE4NzUgMS41IC0xLjUgcyAtMC42NzE4NzUgLTEuNSAtMS41IC0xLjUgeiBtIDAgMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImdyZXlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ29uZmlnSWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCInX2lkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lRmllbGRdPVwiJ25hbWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiZml4dHVyZVRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInRml4dHVyZSAnICsgKGogKyAxKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdWJUZXh0RmllbGRdPVwiJ3N1YnRleHQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaF09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1lbmQganVzdGlmeS1jb250ZW50LWNlbnRlciBoLTEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJsYXlvdXRGb3JtLmRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKGNsaWNrKT1cImRlbGV0ZUZpeHR1cmUoJ3dhbGwnLCBqLCBpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgbWFyZ2luLWJvdHRvbTogMThweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAxTDEgOU0xIDFMOSA5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImxpbmstYnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE5ld0ZpeHR1cmUoJ3dhbGwnLCBpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBmaXh0dXJlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhyIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IGRhc2hlZCAjMDAwMDAwO1wiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE90aGVyIEVsZW1lbnRzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldFdhbGxPdGhlckVsZW1lbnRzKGkpLmNvbnRyb2xzLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwib3RoZXJFbGVtZW50c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZpeHR1cmUgb2YgZ2V0V2FsbE90aGVyRWxlbWVudHMoaSkuY29udHJvbHM7IGxldCBqID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbZm9ybUdyb3VwTmFtZV09XCJqXCIgY2xhc3M9XCJyb3cgZy0wIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5FbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGogKyAxIH19PC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEcm9wZG93biBib3VuZCB0byAndHlwZScgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cIm90aGVyRWxlbWVudExpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2VsZW1lbnRMYWJlbCcgKyBqXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTaG93IGN1c3RvbSB0ZXh0IGlucHV0IG9ubHkgd2hlbiAnT3RoZXJzJyBpcyBzZWxlY3RlZCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZml4dHVyZS5nZXQoJ3R5cGUnKT8udmFsdWUpID09PSAnT3RoZXJzJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbXQtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImN1c3RvbU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGN1c3RvbSBlbGVtZW50IG5hbWVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1lbmQganVzdGlmeS1jb250ZW50LWNlbnRlciBoLTEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJsYXlvdXRGb3JtLmRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKGNsaWNrKT1cInJlbW92ZU90aGVyRWxlbWVudCgnd2FsbCcsIGosIGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBtYXJnaW4tYm90dG9tOiAxOHB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDFMMSA5TTEgMUw5IDlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGluay1idG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJsYXlvdXRGb3JtLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTmV3T3RoZXJFbGVtZW50cygnd2FsbCcsIGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYWRkV2FsbEFjdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJhZGROZXdXYWxsKDApXCIgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cImxheW91dEZvcm0uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IHctMTAwIHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnQgbmV3IHdhbGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhyIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IGRhc2hlZCAjMDAwMDAwO1wiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGbG9vciBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdiQWNjb3JkaW9uSXRlbV09XCInYWNjb3JkaW9uLWZsb29yJ1wiIGNsYXNzPVwibWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWFpbmhlYWRpbmcgcC0wXCIgbmdiQWNjb3JkaW9uQnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0yIHdhbGwtbGFiZWxcIj5GbG9vcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHkgY2xhc3M9XCJwcy0wIHBlLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWluLWhlaWdodDogNTBweFwiIGRuZERyb3B6b25lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkbmREcm9wKT1cIm9uRHJvcCgkZXZlbnQsICdmbG9vcicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRmxvb3IgRml4dHVyZXMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRGb3JtRmxvb3JGaXh0dXJlcy5jb250cm9scy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cImZsb29yRml4dHVyZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmaXh0dXJlIG9mIGdldEZvcm1GbG9vckZpeHR1cmVzLmNvbnRyb2xzOyBsZXQgaiA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZG5kRHJvcHpvbmUgKGRuZERyb3ApPVwib25Ecm9wKCRldmVudCwgJ2Zsb29yJywgailcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwialwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZG5kRHJhZ2dhYmxlXT1cInsgd2FsbEluZGV4OiAnZmxvb3InLCBmaXh0dXJlSW5kZXg6IGogfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZG5kRWZmZWN0QWxsb3dlZF09XCInYWxsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZG5kRGlzYWJsZURyYWdJZl09XCJsYXlvdXRGb3JtLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm93IGctMCBtYi01IGZpeHR1cmUtcm93XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oaWdobGlnaHRlZC1maXh0dXJlXT1cImxheW91dEZvcm0uZW5hYmxlZCAmJiBoaWdobGlnaHRlZEZpeHR1cmVGb3JtSWQgJiYgZml4dHVyZS5nZXQoJ19pZCcpPy52YWx1ZSA9PT0gaGlnaGxpZ2h0ZWRGaXh0dXJlRm9ybUlkXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBoLTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGRuZERyYWdJbWFnZVJlZlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IG1vdmU7IG9wYWNpdHk6IDAuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI1cHhcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIm0gNC40OTYwOTQgMCBjIC0wLjgzMjAzMiAwIC0xLjUgMC42NzE4NzUgLTEuNSAxLjUgcyAwLjY2Nzk2OCAxLjUgMS41IDEuNSBjIDAuODI4MTI1IDAgMS41IC0wLjY3MTg3NSAxLjUgLTEuNSBzIC0wLjY3MTg3NSAtMS41IC0xLjUgLTEuNSB6IG0gNiAwIGMgLTAuODMyMDMyIDAgLTEuNSAwLjY3MTg3NSAtMS41IDEuNSBzIDAuNjY3OTY4IDEuNSAxLjUgMS41IGMgMC44MjgxMjUgMCAxLjUgLTAuNjcxODc1IDEuNSAtMS41IHMgLTAuNjcxODc1IC0xLjUgLTEuNSAtMS41IHogbSAtNiA2IGMgLTAuODMyMDMyIDAgLTEuNSAwLjY3MTg3NSAtMS41IDEuNSBzIDAuNjY3OTY4IDEuNSAxLjUgMS41IGMgMC44MjgxMjUgMCAxLjUgLTAuNjcxODc1IDEuNSAtMS41IHMgLTAuNjcxODc1IC0xLjUgLTEuNSAtMS41IHogbSA2IDAgYyAtMC44MzIwMzIgMCAtMS41IDAuNjcxODc1IC0xLjUgMS41IHMgMC42Njc5NjggMS41IDEuNSAxLjUgYyAwLjgyODEyNSAwIDEuNSAtMC42NzE4NzUgMS41IC0xLjUgcyAtMC42NzE4NzUgLTEuNSAtMS41IC0xLjUgeiBtIC02IDYgYyAtMC44MzIwMzIgMCAtMS41IDAuNjcxODc1IC0xLjUgMS41IHMgMC42Njc5NjggMS41IDEuNSAxLjUgYyAwLjgyODEyNSAwIDEuNSAtMC42NzE4NzUgMS41IC0xLjUgcyAtMC42NzE4NzUgLTEuNSAtMS41IC0xLjUgeiBtIDYgMCBjIC0wLjgzMjAzMiAwIC0xLjUgMC42NzE4NzUgLTEuNSAxLjUgcyAwLjY2Nzk2OCAxLjUgMS41IDEuNSBjIDAuODI4MTI1IDAgMS41IC0wLjY3MTg3NSAxLjUgLTEuNSBzIC0wLjY3MTg3NSAtMS41IC0xLjUgLTEuNSB6IG0gMCAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiZ3JleVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpeHR1cmVDb25maWdJZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIidfaWQnXCIgW25hbWVGaWVsZF09XCInbmFtZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJmaXh0dXJlVGVtcGxhdGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidGaXh0dXJlICcgKyAoaiArIDEpXCIgW3NlYXJjaF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1YlRleHRGaWVsZF09XCInc3VidGV4dCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWVuZCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGgtMTAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cImxheW91dEZvcm0uZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAoY2xpY2spPVwiZGVsZXRlRml4dHVyZSgnZmxvb3InLCBqKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgbWFyZ2luLWJvdHRvbTogMThweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAxTDEgOU0xIDFMOSA5XCIgc3Ryb2tlPVwiIzM0NDA1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGluay1idG5cIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE5ld0ZpeHR1cmUoJ2Zsb29yJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgZml4dHVyZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxociBzdHlsZT1cImJvcmRlci10b3A6IDFweCBkYXNoZWQgIzAwMDAwMDtcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGbG9vciBPdGhlciBFbGVtZW50cyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEZvcm1GbG9vck90aGVyRWxlbWVudHMuY29udHJvbHMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJmbG9vck90aGVyRWxlbWVudHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmaXh0dXJlIG9mIGdldEZvcm1GbG9vck90aGVyRWxlbWVudHMuY29udHJvbHM7IGxldCBqID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbZm9ybUdyb3VwTmFtZV09XCJqXCIgY2xhc3M9XCJyb3cgZy0wIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5FbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGogKyAxIH19PC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEcm9wZG93biBmb3IgdHlwZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwib3RoZXJFbGVtZW50TGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCInZmxvb3JFbGVtZW50TGFiZWwnICsgalwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ29uZGl0aW9uYWwgaW5wdXQgZm9yIGN1c3RvbSBuYW1lIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihmaXh0dXJlLmdldCgndHlwZScpPy52YWx1ZSkgPT09ICdPdGhlcnMnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtdC0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY3VzdG9tTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgY3VzdG9tIGVsZW1lbnQgbmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWVuZCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGgtMTAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cImxheW91dEZvcm0uZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAoY2xpY2spPVwicmVtb3ZlT3RoZXJFbGVtZW50KCdmbG9vcicsIGopXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBtYXJnaW4tYm90dG9tOiAxOHB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDFMMSA5TTEgMUw5IDlcIiBzdHJva2U9XCIjMzQ0MDU0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJsaW5rLWJ0blwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJsYXlvdXRGb3JtLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTmV3T3RoZXJFbGVtZW50cygnZmxvb3InKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBDZW50ZXIgQ29sdW1uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIG92ZXJmbG93LWhpZGRlbiBwb3NpdGlvbi1yZWxhdGl2ZVwiIFtuZ0NsYXNzXT1cInsgJ2Qtbm9uZSc6IGVkaXRGaXh0dXJlIH1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJjYW52YXMtY2FyZFwiIGNsYXNzPVwiYy1jYXJkIHBvc2l0aW9uLXJlbGF0aXZlXCIgI2NhbnZhc0NvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIENhbnZhcyBWaWV3IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxjYW52YXMgaWQ9XCJiYXNlLWNhbnZhc1wiICNiYXNlQ2FudmFzPjwvY2FudmFzPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtZW5kIGdhcC0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ0b3A6IDI0cHg7IHJpZ2h0OiAyNnB4O3dpZHRoOiBjYWxjKDEwMCUgLSA1MHB4KTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbnRyYW5jZSBCdXR0b24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJsYXlvdXRGb3JtLmVuYWJsZWRcIiBuZ2JUb29sdGlwPVwiWW91IGNhbiBhZGQgdXAgdG8gdHdvIGVudHJhbmNlcy5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVUb29sdGlwXT1cImdldEVudHJhbmNlcz8ubGVuZ3RoIDwgMlwiIGNsYXNzPVwibWUtYXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMjBweCAhaW1wb3J0YW50O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMyBiZy13aGl0ZSBzaGFkb3ctc20gXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2V0RW50cmFuY2VzPy5sZW5ndGggPj0gMlwiIChjbGljayk9XCJhZGROZXdFbnRyYW5jZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIEVudHJhbmNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENhbmNlbCBlZGl0IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYobGF5b3V0Rm9ybS5lbmFibGVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRTdGF0dXMgPT09ICdhbGxvY2F0aW9uUGVuZGluZycpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGJnLXdoaXRlIHNoYWRvdy1zbVwiIChjbGljayk9XCJjYW5jZWxFZGl0KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuY2VsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi10ZXh0XCIgKGNsaWNrKT1cImNhbmNlbEVkaXQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5jZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTYXZlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYobGF5b3V0Rm9ybS5lbmFibGVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRTdGF0dXMgPT09ICdkcmFmdCcpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHNoYWRvdy1zbSBiZy13aGl0ZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIGp1c3RpZnktY29udGVudC1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDogMTMwcHg7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzU2F2aW5nTGF5b3V0XCIgKGNsaWNrKT1cInVwZGF0ZUxheW91dCh0cnVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzU2F2aW5nTGF5b3V0XCIgY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbVwiIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgYXMgRHJhZnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1AZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweCAyMHB4ICFpbXBvcnRhbnQ7bWluLXdpZHRoOiA5MHB4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRleHQtbm93cmFwIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIganVzdGlmeS1jb250ZW50LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NhdmluZ0xheW91dFwiIChjbGljayk9XCJ1cGRhdGVMYXlvdXQodHJ1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1NhdmluZ0xheW91dFwiIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc21cIiByb2xlPVwic3RhdHVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ29tcGFjdCBidXR0b24gKENBRCBsYXlvdXRzIG9ubHksIHZpZXcgbW9kZSkg4oCUIG9uZS1zaG90OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNraW5nIGNvbXBhY3RzIHRoZSBsYXlvdXQgYW5kIGRyb3BzIHRoZSB1c2VyIGludG8gZWRpdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgc28gdGhlIGNoYW5nZSBpcyByZXZlcnRhYmxlIHZpYSBDYW5jZWwgYW5kIHBlcnNpc3RhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhIFNhdmUgLyBTdWJtaXQuIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2FuU2hvd0NvbXBhY3RUb2dnbGUgJiYgbGF5b3V0Rm9ybS5kaXNhYmxlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHNoYWRvdy1zbSBiZy13aGl0ZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIGp1c3RpZnktY29udGVudC1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb21wYWN0TGF5b3V0KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJDb21wYWN0IGxheW91dC5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiNCAxNCAxMCAxNCAxMCAyMFwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCIyMCAxMCAxNCAxMCAxNCA0XCI+PC9wb2x5bGluZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmUgeDE9XCIxNFwiIHkxPVwiMTBcIiB4Mj1cIjIxXCIgeTI9XCIzXCI+PC9saW5lPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluZSB4MT1cIjNcIiB5MT1cIjIxXCIgeDI9XCIxMFwiIHkyPVwiMTRcIj48L2xpbmU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFZGl0IEJ1dHRvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGlzRWRpdExheW91dEFsbG93ZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zIGJnLXdoaXRlIHNoYWRvdy1zbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tFZGl0KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xMzIyXzUzMjUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTQuMTY2NyAyLjQ5OTkzQzE0LjM4NTYgMi4yODEwNiAxNC42NDU1IDIuMTA3NDQgMTQuOTMxNCAxLjk4ODk5QzE1LjIxNzQgMS44NzA1NCAxNS41MjM5IDEuODA5NTcgMTUuODMzNCAxLjgwOTU3QzE2LjE0MjkgMS44MDk1NyAxNi40NDk0IDEuODcwNTQgMTYuNzM1NCAxLjk4ODk5QzE3LjAyMTQgMi4xMDc0NCAxNy4yODEyIDIuMjgxMDYgMTcuNTAwMSAyLjQ5OTkzQzE3LjcxOSAyLjcxODggMTcuODkyNiAyLjk3ODYzIDE4LjAxMSAzLjI2NDZDMTguMTI5NSAzLjU1MDU3IDE4LjE5MDQgMy44NTcwNiAxOC4xOTA0IDQuMTY2NTlDMTguMTkwNCA0LjQ3NjEyIDE4LjEyOTUgNC43ODI2MiAxOC4wMTEgNS4wNjg1OUMxNy44OTI2IDUuMzU0NTUgMTcuNzE5IDUuNjE0MzkgMTcuNTAwMSA1LjgzMzI2TDYuMjUwMDggMTcuMDgzM0wxLjY2Njc1IDE4LjMzMzNMMi45MTY3NSAxMy43NDk5TDE0LjE2NjcgMi40OTk5M1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTMyMl81MzI1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYW5jZWwgQnV0dG9uIChGcm9tIGFsbG9jYXRpb24pIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwibGF5b3V0Rm9ybS5kaXNhYmxlZCAmJiBpc0FsbG9jYXRpb25SdW5cIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGJnLXdoaXRlIHNoYWRvdy1zbVwiIChjbGljayk9XCJvbkNsaWNrUmV2ZXJ0QWxsb2NhdGlvbigpIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuY2VsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUnVuIGFsbG9jYXRpb24gLyBDb21wbGV0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGlzUnVuQWxsb2NhdGlvbkFsbG93ZWQgJiYgbGF5b3V0Rm9ybS5kaXNhYmxlZCAmJiBnZXRTdGF0dXMgPT09ICdhbGxvY2F0aW9uUGVuZGluZycpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCIhaXNBbGxvY2F0aW9uUnVuID8gaW52YWxpZEZpeHR1cmVzVG9vbHRpcCA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMjBweCAhaW1wb3J0YW50O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRleHQtbm93cmFwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0FsbG9jYXRpb25SdW4gJiYgaGFzSW52YWxpZEZpeHR1cmVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tSdW5BbGxvY2F0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXNBbGxvY2F0aW9uUnVuID8gJ0NvbXBsZXRlIEFsbG9jYXRpb24nIDogJ1J1biBBbGxvY2F0aW9uJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZ2V0U3RhdHVzID09PSAnZHJhZnQnXCIgdHlwZT1cImJ1dHRvblwiIHN0eWxlPVwicGFkZGluZzogOHB4IDIwcHggIWltcG9ydGFudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LW5vd3JhcFwiIChjbGljayk9XCJvbkNsaWNrQXBwcm92ZUxheW91dCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJtaXQgZm9yIG1lcmNoIGFsbG9jYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJvdGF0ZSBCdXR0b24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGJnLXdoaXRlIHNoYWRvdy1zbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicm90YXRlQ2FudmFzKGNhbnZhcyw5MClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiIHZpZXdCb3g9XCIwIDAgMjYgMjZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk02LjM2MjY1IDcuMTc4ODdMNy4xNzYyNSA2LjM2Mjg3TDUuOTA0MjUgNS4wOTIwN0w1LjA4OTQ1IDUuOTA1NjdMNi4zNjI2NSA3LjE3ODg3Wk0xNS42NzEgNi4zNjQwN0wxOS42Mzc5IDEwLjMzMDlMMjAuOTA5OSA5LjA1NzY5TDE2Ljk0NDIgNS4wOTA4N0wxNS42NzEgNi4zNjQwN1pNMTkuNjM3OSAxOC44MjU3TDE4LjgyNDMgMTkuNjM5M0wyMC4wOTYzIDIwLjkxMDFMMjAuOTA5OSAyMC4wOTc3TDE5LjYzNzkgMTguODI1N1pNMTAuMzI5NSAxOS42MzkzTDYuMzYyNjUgMTUuNjcyNUw1LjA5MDY1IDE2Ljk0NTdMOS4wNTYyNiAyMC45MTEzTDEwLjMyOTUgMTkuNjM5M1pNMTguODI0MyAxOS42MzkzQzE3LjY1NDMgMjAuODA4MSAxNi44NDA3IDIxLjYxOTMgMTYuMTQ1OSAyMi4xNDk3QzE1LjQ3MTUgMjIuNjY0NSAxNS4wMTU1IDIyLjgyODkgMTQuNTc2MyAyMi44Mjg5VjI0LjYyODlDMTUuNTY3NSAyNC42Mjg5IDE2LjQwMjcgMjQuMjE3MyAxNy4yMzY3IDIzLjU4MTNDMTguMDUwMyAyMi45NjA5IDE4Ljk2MzUgMjIuMDQ1MyAyMC4wOTYzIDIwLjkxMjVMMTguODI0MyAxOS42MzkzWk05LjA1NjI2IDIwLjkxMTNDMTAuMTg5MSAyMi4wNDUzIDExLjEwMjMgMjIuOTU5NyAxMS45MTU5IDIzLjU4MTNDMTIuNzQ5OSAyNC4yMTczIDEzLjU4NTEgMjQuNjI4OSAxNC41NzYzIDI0LjYyODlWMjIuODI4OUMxNC4xMzcxIDIyLjgyODkgMTMuNjgyMyAyMi42NjQ1IDEzLjAwNjcgMjIuMTQ5N0MxMi4zMTE5IDIxLjYxOTMgMTEuNDk4MyAyMC44MDgxIDEwLjMyOTUgMTkuNjM5M0w5LjA1NjI2IDIwLjkxMTNaTTE5LjYzNzkgMTAuMzMwOUMyMC44MDY3IDExLjQ5OTcgMjEuNjE3OSAxMi4zMTMzIDIyLjE0ODMgMTMuMDA4MUMyMi42NjMxIDEzLjY4MzcgMjIuODI3NSAxNC4xMzg1IDIyLjgyNzUgMTQuNTc3N0gyNC42Mjc1QzI0LjYyNzUgMTMuNTg2NSAyNC4yMTU5IDEyLjc1MTMgMjMuNTc5OSAxMS45MTczQzIyLjk1OTUgMTEuMTAzNyAyMi4wNDI3IDEwLjE5MDUgMjAuOTA5OSA5LjA1NzY5TDE5LjYzNzkgMTAuMzMwOVpNMjAuOTA5OSAyMC4wOTc3QzIyLjA0MzkgMTguOTYzNyAyMi45NTgzIDE4LjA1MTcgMjMuNTc5OSAxNy4yMzgxQzI0LjIxNTkgMTYuNDA0MSAyNC42Mjc1IDE1LjU2ODkgMjQuNjI3NSAxNC41Nzc3SDIyLjgyNzVDMjIuODI3NSAxNS4wMTY5IDIyLjY2MzEgMTUuNDcyOSAyMi4xNDgzIDE2LjE0NzNDMjEuNjE3OSAxNi44NDIxIDIwLjgwNjcgMTcuNjU1NyAxOS42Mzc5IDE4LjgyNTdMMjAuOTA5OSAyMC4wOTc3Wk03LjE3NjI1IDYuMzYyODdDOC4zNDYyNSA1LjE5NDA3IDkuMTU5ODUgNC4zODE2NyA5Ljg1NDY1IDMuODUxMjdDMTAuNTI5IDMuMzM2NDcgMTAuOTg1IDMuMTczMjcgMTEuNDI0MiAzLjE3MzI3VjEuMzcyMDdDMTAuNDMzIDEuMzcyMDcgOS41OTc4NSAxLjc4MzY3IDguNzYzODUgMi40MTk2N0M3Ljk0OTA1IDMuMDQxMjcgNy4wMzcwNSAzLjk1NTY3IDUuOTA0MjUgNS4wODg0N0w3LjE3NjI1IDYuMzYyODdaTTE2Ljk0NDIgNS4wOTA4N0MxNS44MTE0IDMuOTU2ODcgMTQuODk4MiAzLjA0MTI3IDE0LjA4NDYgMi40MTk2N0MxMy4yNTA2IDEuNzgzNjcgMTIuNDE1NCAxLjM3MjA3IDExLjQyNDIgMS4zNzIwN1YzLjE3MzI3QzExLjg2MzQgMy4xNzMyNyAxMi4zMTgyIDMuMzM2NDcgMTIuOTkzOCAzLjg1MTI3QzEzLjY4ODYgNC4zODE2NyAxNC41MDIyIDUuMTkyODcgMTUuNjcxIDYuMzYxNjdMMTYuOTQ0MiA1LjA5MDg3Wk01LjA4OTQ1IDUuOTAzMjdDMy45NTY2NSA3LjAzNjA3IDMuMDQyMjUgNy45NDgwNyAyLjQyMDY1IDguNzYyODdDMS43ODQ2NSA5LjU5Njg3IDEuMzczMDUgMTAuNDMyMSAxLjM3MzA1IDExLjQyMzNIMy4xNzMwNUMzLjE3MzA1IDEwLjk4NDEgMy4zMzc0NSAxMC41MjgxIDMuODUyMjUgOS44NTM2N0M0LjM4MjY1IDkuMTU4ODcgNS4xOTM4NSA4LjM0NTI3IDYuMzYyNjUgNy4xNzUyN0w1LjA4OTQ1IDUuOTAzMjdaTTYuMzYyNjUgMTUuNjcxM0M1LjE5Mzg1IDE0LjUwMTMgNC4zODI2NSAxMy42ODc3IDMuODUyMjUgMTIuOTkyOUMzLjMzNzQ1IDEyLjMxODUgMy4xNzMwNSAxMS44NjI1IDMuMTczMDUgMTEuNDIzM0gxLjM3MzA1QzEuMzczMDUgMTIuNDE0NSAxLjc4NDY1IDEzLjI0OTcgMi40MjA2NSAxNC4wODM3QzMuMDQyMjUgMTQuODk3MyAzLjk1NjY1IDE1LjgxMDUgNS4wODk0NSAxNi45NDMzTDYuMzYyNjUgMTUuNjcxM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzFEMjkzOVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMy4yIDYuOTgzMkwyNSA4LjJDMjUgNC41ODIgMjIuNDA1NiAxLjU3OTYgMTkgMU0yLjggMTkuMDE2OEwxIDE3LjhDMSAyMS40MTggMy41OTQ0IDI0LjQyMDQgNyAyNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMxRDI5MzlcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRG93bmxvYWQgQnV0dG9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zIGJnLXdoaXRlIHNoYWRvdy1zbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRDYW52YXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIyXCIgaGVpZ2h0PVwiMjJcIiB2aWV3Qm94PVwiMCAwIDI2IDI2XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBzdHJva2U9XCIjMDAwMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMC4yNDAwMDAwMDAwMDAwMDAwNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGlkPVwiU1ZHUmVwb19iZ0NhcnJpZXJcIiBzdHJva2Utd2lkdGg9XCIwXCI+PC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGlkPVwiU1ZHUmVwb190cmFjZXJDYXJyaWVyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0NDQ0NDQ1wiIHN0cm9rZS13aWR0aD1cIjAuMzg0XCI+PC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGlkPVwiU1ZHUmVwb19pY29uQ2FycmllclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMi41NTM1IDE2LjUwNjFDMTIuNDExNCAxNi42NjE1IDEyLjIxMDYgMTYuNzUgMTIgMTYuNzVDMTEuNzg5NCAxNi43NSAxMS41ODg2IDE2LjY2MTUgMTEuNDQ2NSAxNi41MDYxTDcuNDQ2NDggMTIuMTMxMUM3LjE2Njk4IDExLjgyNTQgNy4xODgyMiAxMS4zNTEgNy40OTM5MiAxMS4wNzE1QzcuNzk5NjMgMTAuNzkyIDguMjc0MDIgMTAuODEzMiA4LjU1MzUyIDExLjExODlMMTEuMjUgMTQuMDY4MlYzQzExLjI1IDIuNTg1NzkgMTEuNTg1OCAyLjI1IDEyIDIuMjVDMTIuNDE0MiAyLjI1IDEyLjc1IDIuNTg1NzkgMTIuNzUgM1YxNC4wNjgyTDE1LjQ0NjUgMTEuMTE4OUMxNS43MjYgMTAuODEzMiAxNi4yMDA0IDEwLjc5MiAxNi41MDYxIDExLjA3MTVDMTYuODExOCAxMS4zNTEgMTYuODMzIDExLjgyNTQgMTYuNTUzNSAxMi4xMzExTDEyLjU1MzUgMTYuNTA2MVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxRDI5MzlcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTMuNzUgMTVDMy43NSAxNC41ODU4IDMuNDE0MjIgMTQuMjUgMyAxNC4yNUMyLjU4NTc5IDE0LjI1IDIuMjUgMTQuNTg1OCAyLjI1IDE1VjE1LjA1NDlDMi4yNDk5OCAxNi40MjI1IDIuMjQ5OTYgMTcuNTI0OCAyLjM2NjUyIDE4LjM5MThDMi40ODc1NCAxOS4yOTE5IDIuNzQ2NDMgMjAuMDQ5NyAzLjM0ODM1IDIwLjY1MTZDMy45NTAyNyAyMS4yNTM2IDQuNzA4MTQgMjEuNTEyNSA1LjYwODI1IDIxLjYzMzVDNi40NzUyMiAyMS43NSA3LjU3NzU0IDIxLjc1IDguOTQ1MTMgMjEuNzVIMTUuMDU0OUMxNi40MjI1IDIxLjc1IDE3LjUyNDggMjEuNzUgMTguMzkxOCAyMS42MzM1QzE5LjI5MTkgMjEuNTEyNSAyMC4wNDk3IDIxLjI1MzYgMjAuNjUxNyAyMC42NTE2QzIxLjI1MzYgMjAuMDQ5NyAyMS41MTI1IDE5LjI5MTkgMjEuNjMzNSAxOC4zOTE4QzIxLjc1IDE3LjUyNDggMjEuNzUgMTYuNDIyNSAyMS43NSAxNS4wNTQ5VjE1QzIxLjc1IDE0LjU4NTggMjEuNDE0MiAxNC4yNSAyMSAxNC4yNUMyMC41ODU4IDE0LjI1IDIwLjI1IDE0LjU4NTggMjAuMjUgMTVDMjAuMjUgMTYuNDM1NCAyMC4yNDg0IDE3LjQzNjUgMjAuMTQ2OSAxOC4xOTE5QzIwLjA0ODIgMTguOTI1NyAxOS44Njc4IDE5LjMxNDIgMTkuNTkxIDE5LjU5MUMxOS4zMTQyIDE5Ljg2NzggMTguOTI1NyAyMC4wNDgyIDE4LjE5MTkgMjAuMTQ2OUMxNy40MzY1IDIwLjI0ODQgMTYuNDM1NCAyMC4yNSAxNSAyMC4yNUg5QzcuNTY0NTkgMjAuMjUgNi41NjM0NyAyMC4yNDg0IDUuODA4MTIgMjAuMTQ2OUM1LjA3NDM1IDIwLjA0ODIgNC42ODU3NyAxOS44Njc4IDQuNDA5MDEgMTkuNTkxQzQuMTMyMjUgMTkuMzE0MiAzLjk1MTggMTguOTI1NyAzLjg1MzE1IDE4LjE5MTlDMy43NTE1OSAxNy40MzY1IDMuNzUgMTYuNDM1NCAzLjc1IDE1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzFEMjkzOVwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBQYW5lbCBDb2xsYXBzZSBIYW5kbGVycyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xsYXBzZS1oYW5kbGVyIGxlZnRcIiAoY2xpY2spPVwidG9nZ2xlUGFuZWwoJ2xlZnQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCIhaXNMZWZ0UGFuZWxDb2xsYXBzZWRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxOCAxOFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMjczMDggMTIuNjM2TDQuNjM2NzIgOC45OTk2NEw4LjI3MzA4IDUuMzYzMjhNMTMuMzY0IDEyLjYzNkw5LjcyNzYzIDguOTk5NjRMMTMuMzY0IDUuMzYzMjhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjEuNDU0NTVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc0xlZnRQYW5lbENvbGxhcHNlZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOS43MjY5MiA1LjM2Mzk5TDEzLjM2MzMgOS4wMDAzNkw5LjcyNjkyIDEyLjYzNjdNNC42MzYwMSA1LjM2Mzk5TDguMjcyMzcgOS4wMDAzNkw0LjYzNjAxIDEyLjYzNjdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjEuNDU0NTVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbGxhcHNlLWhhbmRsZXIgcmlnaHRcIiAoY2xpY2spPVwidG9nZ2xlUGFuZWwoJ3JpZ2h0JylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNSaWdodFBhbmVsQ29sbGFwc2VkXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjI3MzA4IDEyLjYzNkw0LjYzNjcyIDguOTk5NjRMOC4yNzMwOCA1LjM2MzI4TTEzLjM2NCAxMi42MzZMOS43Mjc2MyA4Ljk5OTY0TDEzLjM2NCA1LjM2MzI4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIxLjQ1NDU1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiIWlzUmlnaHRQYW5lbENvbGxhcHNlZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOS43MjY5MiA1LjM2Mzk5TDEzLjM2MzMgOS4wMDAzNkw5LjcyNjkyIDEyLjYzNjdNNC42MzYwMSA1LjM2Mzk5TDguMjcyMzcgOS4wMDAzNkw0LjYzNjAxIDEyLjYzNjdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjEuNDU0NTVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBFZGl0IEZpeHR1cmUgQm9keSAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiIFtuZ0NsYXNzXT1cInsgJ2Qtbm9uZSc6ICFlZGl0Rml4dHVyZSB9XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiZWRpdC1ib2R5XCIgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJteC0zIG15LTUgbmF2IG5hdi1waWxsc1wiIHJvbGU9XCJ0YWJsaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtIGN1cnNvci1wb2ludGVyXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cInN1Ym1pdEZpeHR1cmUgPSBmYWxzZTsgZWRpdEZpeHR1cmVTZWN0aW9uID0gJ2Jhc2ljLWRldGFpbHMnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJlZGl0Rml4dHVyZVNlY3Rpb24gPT09ICdiYXNpYy1kZXRhaWxzJyA/ICdhY3RpdmUnIDogJydcIiBjbGFzcz1cIm5hdi1saW5rXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwidGFiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWMgZGV0YWlsc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBjdXJzb3ItcG9pbnRlclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIChjbGljayk9XCJzdWJtaXRGaXh0dXJlID0gZmFsc2U7IGVkaXRGaXh0dXJlU2VjdGlvbiA9ICdwcm9kdWN0cydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImVkaXRGaXh0dXJlU2VjdGlvbiA9PT0gJ3Byb2R1Y3RzJyA/ICdhY3RpdmUnIDogJydcIiBjbGFzcz1cIm5hdi1saW5rXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwidGFiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gY3Vyc29yLXBvaW50ZXJcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwic3VibWl0Rml4dHVyZSA9IGZhbHNlOyBlZGl0Rml4dHVyZVNlY3Rpb24gPSAndm1zJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZWRpdEZpeHR1cmVTZWN0aW9uID09PSAndm1zJyA/ICdhY3RpdmUnIDogJydcIiBjbGFzcz1cIm5hdi1saW5rXCIgcm9sZT1cInRhYlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpc3VhbCBNZXJjaGFuZGlzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRGaXh0dXJlU2VjdGlvbiA9PT0gJ2Jhc2ljLWRldGFpbHMnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWluc3RhbmNlLWJhc2ljLWRldGFpbHMgW2ZpeHR1cmVEYXRhXT1cInNlbGVjdGVkRml4dHVyZURhdGFcIiBbZWRpdE1vZGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzU3VibWl0dGVkXT1cInN1Ym1pdEZpeHR1cmVcIiAoc3VibWl0RXZlbnQpPVwib25GaXh0dXJlU3VibWl0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaWJyYXJ5Q2F0ZWdvcmllc109XCJsaWJyYXJ5Q2F0ZWdvcmllc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpYnJhcnlCeUNhdGVnb3J5XT1cImxpYnJhcnlCeUNhdGVnb3J5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWxsb3dDYXRlZ29yeUFuZFdpZHRoRWRpdF09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1pbnN0YW5jZS1iYXNpYy1kZXRhaWxzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0Rml4dHVyZVNlY3Rpb24gPT09ICdwcm9kdWN0cydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItaW5zdGFuY2UtcHJvZHVjdHMgW2ZpeHR1cmVEYXRhXT1cInNlbGVjdGVkRml4dHVyZURhdGFcIiBbZWRpdE1vZGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzU3VibWl0dGVkXT1cInN1Ym1pdEZpeHR1cmVcIiAoc3VibWl0RXZlbnQpPVwib25GaXh0dXJlU3VibWl0KCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLWluc3RhbmNlLXByb2R1Y3RzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0Rml4dHVyZVNlY3Rpb24gPT09ICd2bXMnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWluc3RhbmNlLXZtcyBbZml4dHVyZURhdGFdPVwic2VsZWN0ZWRGaXh0dXJlRGF0YVwiIFtlZGl0TW9kZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNTdWJtaXR0ZWRdPVwic3VibWl0Rml4dHVyZVwiIChzdWJtaXRFdmVudCk9XCJvbkZpeHR1cmVTdWJtaXQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItaW5zdGFuY2Utdm1zPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyAnY29sbGFwc2VkLWNvbCc6IGlzUmlnaHRQYW5lbENvbGxhcHNlZCwgJ2NvbC0zJzogIWlzUmlnaHRQYW5lbENvbGxhcHNlZCB9XCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7J21pbi13aWR0aCc6IGlzUmlnaHRQYW5lbENvbGxhcHNlZCA/ICcwJyA6ICBpc0FsbG9jYXRpb25SdW4gPyc2ODBweCcgOiAnNDY0cHgnIH1cIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaXh0dXJlUHJldmlld0NvbFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZml4dHVyZVByZXZpZXdDb2w+XHJcbiAgICA8ZGl2IGNsYXNzPVwicy1jYXJkXCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzplZGl0Rml4dHVyZSA/ICc3MnB4JyA6ICcwcHgnfVwiPlxyXG4gICAgICAgIDxvbmJvYXJkLWZpeHR1cmUgW25nQ2xhc3NdPVwieyAnZC1ub25lJzogaXNSaWdodFBhbmVsQ29sbGFwc2VkfVwiXHJcbiAgICAgICAgICAgIChvbkNsb3NlKT1cInRvZ2dsZVBhbmVsKCdyaWdodCcpOyBzZWxlY3RlZEZpeHR1cmVEYXRhID0gbnVsbDsgcmVtb3ZlSGlnaGxpZ2h0KCk7XCJcclxuICAgICAgICAgICAgW2ZpeHR1cmVEYXRhXT1cInNlbGVjdGVkRml4dHVyZURhdGFcIiBbaXNBbGxvY2F0aW9uUnVuXT1cImlzQWxsb2NhdGlvblJ1blwiXHJcbiAgICAgICAgICAgIFthbGxGaXh0dXJlc109XCJhbGxGaXh0dXJlSW5zdGFuY2VzXCI+PC9vbmJvYXJkLWZpeHR1cmU+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjaGVhZGVyU2tlbGV0b24+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IG0tMCBnLTAgbG9hZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBvdmVyZmxvdy1oaWRkZW5cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lciB3LTEwMCBwLTQgcm91bmRlZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBtdC0wIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNza2VsZXRvbkxvYWRlcj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgbG9hZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBvdmVyZmxvdy1oaWRkZW5cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lciByb3VuZGVkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjYXBwbHlMb2dpY3MgbGV0LW1vZGFsPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBtYi00XCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgdmlld0JveD1cIjAgMCA0MCA0MFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgcng9XCIyMFwiIGZpbGw9XCIjREFGMUZGXCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC44MzMgMjEuNjY2NUMxOC4wMzMgMjEuNjY2NSAxNy4xMTY0IDIyLjc5MTUgMTYuODE2NCAyMy41MzMyQzE3LjcwOCAyMy45MTY1IDE4LjMzMyAyNC43OTk4IDE4LjMzMyAyNS44MzMyQzE4LjMzMyAyNi40OTYyIDE4LjA2OTYgMjcuMTMyMSAxNy42MDA4IDI3LjYwMDlDMTcuMTMxOSAyOC4wNjk4IDE2LjQ5NjEgMjguMzMzMiAxNS44MzMgMjguMzMzMkMxNS4xNyAyOC4zMzMyIDE0LjUzNDEgMjguMDY5OCAxNC4wNjUzIDI3LjYwMDlDMTMuNTk2NCAyNy4xMzIxIDEzLjMzMyAyNi40OTYyIDEzLjMzMyAyNS44MzMyQzEzLjMzMyAyNC43NDE1IDE0LjAyNDcgMjMuODE2NSAxNC45OTk3IDIzLjQ3NDhWMTYuNTI0OEMxNC41MTE0IDE2LjM1MzUgMTQuMDg4NSAxNi4wMzQ0IDEzLjc4OTkgMTUuNjExN0MxMy40OTEyIDE1LjE4OTEgMTMuMzMxNSAxNC42ODQgMTMuMzMzIDE0LjE2NjVDMTMuMzMzIDEzLjUwMzUgMTMuNTk2NCAxMi44Njc2IDE0LjA2NTMgMTIuMzk4N0MxNC41MzQxIDExLjkyOTkgMTUuMTcgMTEuNjY2NSAxNS44MzMgMTEuNjY2NUMxNi40OTYxIDExLjY2NjUgMTcuMTMxOSAxMS45Mjk5IDE3LjYwMDggMTIuMzk4N0MxOC4wNjk2IDEyLjg2NzYgMTguMzMzIDEzLjUwMzUgMTguMzMzIDE0LjE2NjVDMTguMzMzIDE1LjI1ODIgMTcuNjQxNCAxNi4xODMyIDE2LjY2NjQgMTYuNTI0OFYyMC45MzMyQzE3LjM5OTcgMjAuMzkxNSAxOC40NjY0IDE5Ljk5OTggMTkuOTk5NyAxOS45OTk4QzIyLjIyNDcgMTkuOTk5OCAyMi45NjY0IDE4Ljg4MzIgMjMuMjA4IDE4LjE0MTVDMjIuNzUyMSAxNy45NTE2IDIyLjM2MjUgMTcuNjMxMSAyMi4wODgyIDE3LjIyMDRDMjEuODEzOSAxNi44MDk3IDIxLjY2NzEgMTYuMzI3MSAyMS42NjY0IDE1LjgzMzJDMjEuNjY2NCAxNS4xNzAxIDIxLjkyOTcgMTQuNTM0MiAyMi4zOTg2IDE0LjA2NTRDMjIuODY3NCAxMy41OTY2IDIzLjUwMzMgMTMuMzMzMiAyNC4xNjY0IDEzLjMzMzJDMjQuODI5NCAxMy4zMzMyIDI1LjQ2NTMgMTMuNTk2NiAyNS45MzQxIDE0LjA2NTRDMjYuNDAzIDE0LjUzNDIgMjYuNjY2NCAxNS4xNzAxIDI2LjY2NjQgMTUuODMzMkMyNi42NjY0IDE2Ljk0OTggMjUuOTMzIDE3LjkxNjUgMjQuOTI0NyAxOC4yMTY1QzI0LjcwOCAxOS40MDgyIDIzLjg5OTcgMjEuNjY2NSAyMC44MzMgMjEuNjY2NVpNMTUuODMzIDI0Ljk5OThDMTUuNjEyIDI0Ljk5OTggMTUuNCAyNS4wODc2IDE1LjI0MzggMjUuMjQzOUMxNS4wODc1IDI1LjQwMDIgMTQuOTk5NyAyNS42MTIyIDE0Ljk5OTcgMjUuODMzMkMxNC45OTk3IDI2LjA1NDIgMTUuMDg3NSAyNi4yNjYxIDE1LjI0MzggMjYuNDIyNEMxNS40IDI2LjU3ODcgMTUuNjEyIDI2LjY2NjUgMTUuODMzIDI2LjY2NjVDMTYuMDU0IDI2LjY2NjUgMTYuMjY2IDI2LjU3ODcgMTYuNDIyMyAyNi40MjI0QzE2LjU3ODYgMjYuMjY2MSAxNi42NjY0IDI2LjA1NDIgMTYuNjY2NCAyNS44MzMyQzE2LjY2NjQgMjUuNjEyMiAxNi41Nzg2IDI1LjQwMDIgMTYuNDIyMyAyNS4yNDM5QzE2LjI2NiAyNS4wODc2IDE2LjA1NCAyNC45OTk4IDE1LjgzMyAyNC45OTk4Wk0xNS44MzMgMTMuMzMzMkMxNS42MTIgMTMuMzMzMiAxNS40IDEzLjQyMSAxNS4yNDM4IDEzLjU3NzJDMTUuMDg3NSAxMy43MzM1IDE0Ljk5OTcgMTMuOTQ1NSAxNC45OTk3IDE0LjE2NjVDMTQuOTk5NyAxNC4zODc1IDE1LjA4NzUgMTQuNTk5NSAxNS4yNDM4IDE0Ljc1NThDMTUuNCAxNC45MTIgMTUuNjEyIDE0Ljk5OTggMTUuODMzIDE0Ljk5OThDMTYuMDU0IDE0Ljk5OTggMTYuMjY2IDE0LjkxMiAxNi40MjIzIDE0Ljc1NThDMTYuNTc4NiAxNC41OTk1IDE2LjY2NjQgMTQuMzg3NSAxNi42NjY0IDE0LjE2NjVDMTYuNjY2NCAxMy45NDU1IDE2LjU3ODYgMTMuNzMzNSAxNi40MjIzIDEzLjU3NzJDMTYuMjY2IDEzLjQyMSAxNi4wNTQgMTMuMzMzMiAxNS44MzMgMTMuMzMzMlpNMjQuMTY2NCAxNC45OTk4QzIzLjk0NTMgMTQuOTk5OCAyMy43MzM0IDE1LjA4NzYgMjMuNTc3MSAxNS4yNDM5QzIzLjQyMDggMTUuNDAwMiAyMy4zMzMgMTUuNjEyMiAyMy4zMzMgMTUuODMzMkMyMy4zMzMgMTYuMDU0MiAyMy40MjA4IDE2LjI2NjEgMjMuNTc3MSAxNi40MjI0QzIzLjczMzQgMTYuNTc4NyAyMy45NDUzIDE2LjY2NjUgMjQuMTY2NCAxNi42NjY1QzI0LjM4NzQgMTYuNjY2NSAyNC41OTkzIDE2LjU3ODcgMjQuNzU1NiAxNi40MjI0QzI0LjkxMTkgMTYuMjY2MSAyNC45OTk3IDE2LjA1NDIgMjQuOTk5NyAxNS44MzMyQzI0Ljk5OTcgMTUuNjEyMiAyNC45MTE5IDE1LjQwMDIgMjQuNzU1NiAxNS4yNDM5QzI0LjU5OTMgMTUuMDg3NiAyNC4zODc0IDE0Ljk5OTggMjQuMTY2NCAxNC45OTk4WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMwMDlCRjNcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGgyIGNsYXNzPVwibWItM1wiPlJ1biBBbGxvY2F0aW9uIExvZ2ljPC9oMj5cclxuICAgICAgICAgICAgPHA+VGhpcyB3aWxsIG1hcCBhbGwgZml4dHVyZXMgYW5kIGFwcGx5IGFsbG9jYXRpb25zIGJhc2VkIG9uIHRoZSBidXNpbmVzcy1kZWZpbmVkIGxvZ2ljLCB0aGVuIG1vdmUgdGhlbSB0b1xyXG4gICAgICAgICAgICAgICAgdGhlIHZlcmlmaWNhdGlvbiBzZWN0aW9uLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBnYXAtM1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJtb2RhbC5jbG9zZSgpXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0J1dHRvbkxvYWRpbmdcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwicnVuQWxsb2NhdGlvbigpXCIgW2Rpc2FibGVkXT1cImlzQnV0dG9uTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNCdXR0b25Mb2FkaW5nXCI+IFJ1biBhbGxvY2F0aW9uIExvZ2ljPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyBzdHlsZT1cIndpZHRoOiAxNDFweDtcIiAqbmdJZj1cImlzQnV0dG9uTG9hZGluZ1wiIGNsYXNzPVwic3Bpbm5lclwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwicGF0aFwiIGN4PVwiMjVcIiBjeT1cIjI1XCIgcj1cIjIwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCI0XCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjYXBwcm92ZUxheW91dE1vZGFsIGxldC1tb2RhbD5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGgyIGNsYXNzPVwibWItM1wiPkFwcHJvdmUgJiBTdWJtaXQ8L2gyPlxyXG4gICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgIFRoaXMgd2lsbCBjb21wbGV0ZSB0aGUgbGF5b3V0IGFuZCBtYWtlIGl0IHJlYWR5IGZvciBhbGxvY2F0aW9uLiBFbnN1cmUgdGhhdCBhbGwgZml4dHVyZSBjb3VudHMgYW5kXHJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnRzIGFyZSBhcyBwZXIgdGhlIHBsYW4uXHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBAaWYoaGFzSW52YWxpZEZpeHR1cmVzKSB7XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQgZ2FwLTIgcC0zIG1iLTMgcm91bmRlZFwiXHJcbiAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6ICNGRkZBRUI7IGJvcmRlcjogMXB4IHNvbGlkICNGRUM4NEI7XCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleC1zaHJpbms6IDA7IG1hcmdpbi10b3A6IDFweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkuOTk5NjUgNi42NjY2N1YxME05Ljk5OTY1IDEzLjMzMzNIMTAuMDA4TTguNTc0NjUgMi4zODMzNEwxLjUxNjMyIDE0LjE2NjdDMS4zNzA3OSAxNC40MTg3IDEuMjkzNzkgMTQuNzA0NCAxLjI5Mjk4IDE0Ljk5NTRDMS4yOTIxNiAxNS4yODY1IDEuMzY3NTYgMTUuNTcyNiAxLjUxMTY3IDE1LjgyNTRDMS42NTU3OSAxNi4wNzgzIDEuODYzNTkgMTYuMjg5IDIuMTE0NDEgMTYuNDM2NkMyLjM2NTIzIDE2LjU4NDEgMi42NTAzMiAxNi42NjM1IDIuOTQxMzIgMTYuNjY2N0gxNy4wNThDMTcuMzQ5IDE2LjY2MzUgMTcuNjM0MSAxNi41ODQxIDE3Ljg4NDkgMTYuNDM2NkMxOC4xMzU3IDE2LjI4OSAxOC4zNDM1IDE2LjA3ODMgMTguNDg3NiAxNS44MjU0QzE4LjYzMTcgMTUuNTcyNiAxOC43MDcxIDE1LjI4NjUgMTguNzA2MyAxNC45OTU0QzE4LjcwNTUgMTQuNzA0NCAxOC42Mjg1IDE0LjQxODcgMTguNDgzIDE0LjE2NjdMMTEuNDI0NyAyLjM4MzM0QzExLjI3NjEgMi4xMzg0MyAxMS4wNjY5IDEuOTM1OTQgMTAuODE3MyAxLjc5NTQxQzEwLjU2NzcgMS42NTQ4OCAxMC4yODYxIDEuNTgxMDUgOS45OTk2NSAxLjU4MTA1QzkuNzEzMjEgMS41ODEwNSA5LjQzMTU5IDEuNjU0ODggOS4xODE5OSAxLjc5NTQxQzguOTMyMzggMS45MzU5NCA4LjcyMzIxIDIuMTM4NDMgOC41NzQ2NSAyLjM4MzM0WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNGNTlFMEJcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCIgc3R5bGU9XCJmb250LXNpemU6IDEzcHg7IGNvbG9yOiAjOTI0MDBFO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihoYXNJbnZhbGlkSGVhZGVyRml4dHVyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57e2ludmFsaWRIZWFkZXJGaXh0dXJlQ291bnR9fSBmaXh0dXJle3tpbnZhbGlkSGVhZGVyRml4dHVyZUNvdW50ID09PSAxID8gJycgOiAncyd9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpbnZhbGlkSGVhZGVyRml4dHVyZUNvdW50ID09PSAxID8gJ2hhcycgOiAnaGF2ZSd9fSBhbiB1bnJlY29nbml6ZWQgaGVhZGVyLjwvc3Ryb25nPjxici8+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihoYXNJbnZhbGlkTGlicmFyeUZpeHR1cmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3tpbnZhbGlkTGlicmFyeUZpeHR1cmVDb3VudH19IGZpeHR1cmV7e2ludmFsaWRMaWJyYXJ5Rml4dHVyZUNvdW50ID09PSAxID8gJycgOiAncyd9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpbnZhbGlkTGlicmFyeUZpeHR1cmVDb3VudCA9PT0gMSA/ICdkb2VzJyA6ICdkbyd9fSBub3QgbWF0Y2ggYW55IGxpYnJhcnkgZW50cnkuPC9zdHJvbmc+PGJyLz5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgVGhlc2UgYXJlIGhpZ2hsaWdodGVkIGluIHJlZCBvbiB0aGUgbGF5b3V0IGFuZCBtdXN0IGJlIGNvcnJlY3RlZCBiZWZvcmUgdGhlIGFsbG9jYXRpb24gcnVsZSBjYW4gcnVuLlxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGdhcC0zXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cIm1vZGFsLmNsb3NlKClcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzQnV0dG9uTG9hZGluZ1wiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJhcHByb3ZlTGF5b3V0KClcIiBbZGlzYWJsZWRdPVwiaXNCdXR0b25Mb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0J1dHRvbkxvYWRpbmdcIj5TdWJtaXQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNCdXR0b25Mb2FkaW5nXCIgY2xhc3M9XCJzcGlubmVyXCIgdmlld0JveD1cIjAgMCA1MCA1MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJwYXRoXCIgY3g9XCIyNVwiIGN5PVwiMjVcIiByPVwiMjBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNyZXZlcnRBbGxvY2F0aW9uTW9kYWwgbGV0LW1vZGFsPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBtYi00XCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgdmlld0JveD1cIjAgMCA0MCA0MFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgcng9XCIyMFwiIGZpbGw9XCIjRkVGM0M3XCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0yMCAxMy4zMzMzVjIwTTIwIDI2LjY2NjdIMjAuMDE2N00yOC4zMzMzIDIwQzI4LjMzMzMgMjQuNjAyNCAyNC42MDI0IDI4LjMzMzMgMjAgMjguMzMzM0MxNS4zOTc2IDI4LjMzMzMgMTEuNjY2NyAyNC42MDI0IDExLjY2NjcgMjBDMTEuNjY2NyAxNS4zOTc2IDE1LjM5NzYgMTEuNjY2NyAyMCAxMS42NjY3QzI0LjYwMjQgMTEuNjY2NyAyOC4zMzMzIDE1LjM5NzYgMjguMzMzMyAyMFpcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNGNTlFMEJcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGgyIGNsYXNzPVwibWItM1wiPlJldmVydCBBbGxvY2F0aW9uPC9oMj5cclxuICAgICAgICAgICAgPHA+QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJldmVydCB0aGUgYWxsb2NhdGlvbj8gVGhpcyB3aWxsIHJlc3RvcmUgdGhlIHN0YXRlIGJlZm9yZSBydW5uaW5nIGFsbG9jYXRpb24uXHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgZ2FwLTNcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwibW9kYWwuY2xvc2UoKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNCdXR0b25Mb2FkaW5nXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cInJldmVydEFsbG9jYXRpb24oKTsgbW9kYWwuY2xvc2UoKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNCdXR0b25Mb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0J1dHRvbkxvYWRpbmdcIj5SZXZlcnQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHN0eWxlPVwid2lkdGg6IDE0MXB4O1wiICpuZ0lmPVwiaXNCdXR0b25Mb2FkaW5nXCIgY2xhc3M9XCJzcGlubmVyXCIgdmlld0JveD1cIjAgMCA1MCA1MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJwYXRoXCIgY3g9XCIyNVwiIGN5PVwiMjVcIiByPVwiMjBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNjb21wbGV0ZUFsbG9jYXRpb25Nb2RhbCBsZXQtbW9kYWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IG1iLTRcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiB2aWV3Qm94PVwiMCAwIDQwIDQwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjIwXCIgZmlsbD1cIiNEQUYxRkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTIwLjgzMyAyMS42NjY1QzE4LjAzMyAyMS42NjY1IDE3LjExNjQgMjIuNzkxNSAxNi44MTY0IDIzLjUzMzJDMTcuNzA4IDIzLjkxNjUgMTguMzMzIDI0Ljc5OTggMTguMzMzIDI1LjgzMzJDMTguMzMzIDI2LjQ5NjIgMTguMDY5NiAyNy4xMzIxIDE3LjYwMDggMjcuNjAwOUMxNy4xMzE5IDI4LjA2OTggMTYuNDk2MSAyOC4zMzMyIDE1LjgzMyAyOC4zMzMyQzE1LjE3IDI4LjMzMzIgMTQuNTM0MSAyOC4wNjk4IDE0LjA2NTMgMjcuNjAwOUMxMy41OTY0IDI3LjEzMjEgMTMuMzMzIDI2LjQ5NjIgMTMuMzMzIDI1LjgzMzJDMTMuMzMzIDI0Ljc0MTUgMTQuMDI0NyAyMy44MTY1IDE0Ljk5OTcgMjMuNDc0OFYxNi41MjQ4QzE0LjUxMTQgMTYuMzUzNSAxNC4wODg1IDE2LjAzNDQgMTMuNzg5OSAxNS42MTE3QzEzLjQ5MTIgMTUuMTg5MSAxMy4zMzE1IDE0LjY4NCAxMy4zMzMgMTQuMTY2NUMxMy4zMzMgMTMuNTAzNSAxMy41OTY0IDEyLjg2NzYgMTQuMDY1MyAxMi4zOTg3QzE0LjUzNDEgMTEuOTI5OSAxNS4xNyAxMS42NjY1IDE1LjgzMyAxMS42NjY1QzE2LjQ5NjEgMTEuNjY2NSAxNy4xMzE5IDExLjkyOTkgMTcuNjAwOCAxMi4zOTg3QzE4LjA2OTYgMTIuODY3NiAxOC4zMzMgMTMuNTAzNSAxOC4zMzMgMTQuMTY2NUMxOC4zMzMgMTUuMjU4MiAxNy42NDE0IDE2LjE4MzIgMTYuNjY2NCAxNi41MjQ4VjIwLjkzMzJDMTcuMzk5NyAyMC4zOTE1IDE4LjQ2NjQgMTkuOTk5OCAxOS45OTk3IDE5Ljk5OThDMjIuMjI0NyAxOS45OTk4IDIyLjk2NjQgMTguODgzMiAyMy4yMDggMTguMTQxNUMyMi43NTIxIDE3Ljk1MTYgMjIuMzYyNSAxNy42MzExIDIyLjA4ODIgMTcuMjIwNEMyMS44MTM5IDE2LjgwOTcgMjEuNjY3MSAxNi4zMjcxIDIxLjY2NjQgMTUuODMzMkMyMS42NjY0IDE1LjE3MDEgMjEuOTI5NyAxNC41MzQyIDIyLjM5ODYgMTQuMDY1NEMyMi44Njc0IDEzLjU5NjYgMjMuNTAzMyAxMy4zMzMyIDI0LjE2NjQgMTMuMzMzMkMyNC44Mjk0IDEzLjMzMzIgMjUuNDY1MyAxMy41OTY2IDI1LjkzNDEgMTQuMDY1NEMyNi40MDMgMTQuNTM0MiAyNi42NjY0IDE1LjE3MDEgMjYuNjY2NCAxNS44MzMyQzI2LjY2NjQgMTYuOTQ5OCAyNS45MzMgMTcuOTE2NSAyNC45MjQ3IDE4LjIxNjVDMjQuNzA4IDE5LjQwODIgMjMuODk5NyAyMS42NjY1IDIwLjgzMyAyMS42NjY1Wk0xNS44MzMgMjQuOTk5OEMxNS42MTIgMjQuOTk5OCAxNS40IDI1LjA4NzYgMTUuMjQzOCAyNS4yNDM5QzE1LjA4NzUgMjUuNDAwMiAxNC45OTk3IDI1LjYxMjIgMTQuOTk5NyAyNS44MzMyQzE0Ljk5OTcgMjYuMDU0MiAxNS4wODc1IDI2LjI2NjEgMTUuMjQzOCAyNi40MjI0QzE1LjQgMjYuNTc4NyAxNS42MTIgMjYuNjY2NSAxNS44MzMgMjYuNjY2NUMxNi4wNTQgMjYuNjY2NSAxNi4yNjYgMjYuNTc4NyAxNi40MjIzIDI2LjQyMjRDMTYuNTc4NiAyNi4yNjYxIDE2LjY2NjQgMjYuMDU0MiAxNi42NjY0IDI1LjgzMzJDMTYuNjY2NCAyNS42MTIyIDE2LjU3ODYgMjUuNDAwMiAxNi40MjIzIDI1LjI0MzlDMTYuMjY2IDI1LjA4NzYgMTYuMDU0IDI0Ljk5OTggMTUuODMzIDI0Ljk5OThaTTE1LjgzMyAxMy4zMzMyQzE1LjYxMiAxMy4zMzMyIDE1LjQgMTMuNDIxIDE1LjI0MzggMTMuNTc3MkMxNS4wODc1IDEzLjczMzUgMTQuOTk5NyAxMy45NDU1IDE0Ljk5OTcgMTQuMTY2NUMxNC45OTk3IDE0LjM4NzUgMTUuMDg3NSAxNC41OTk1IDE1LjI0MzggMTQuNzU1OEMxNS40IDE0LjkxMiAxNS42MTIgMTQuOTk5OCAxNS44MzMgMTQuOTk5OEMxNi4wNTQgMTQuOTk5OCAxNi4yNjYgMTQuOTEyIDE2LjQyMjMgMTQuNzU1OEMxNi41Nzg2IDE0LjU5OTUgMTYuNjY2NCAxNC4zODc1IDE2LjY2NjQgMTQuMTY2NUMxNi42NjY0IDEzLjk0NTUgMTYuNTc4NiAxMy43MzM1IDE2LjQyMjMgMTMuNTc3MkMxNi4yNjYgMTMuNDIxIDE2LjA1NCAxMy4zMzMyIDE1LjgzMyAxMy4zMzMyWk0yNC4xNjY0IDE0Ljk5OThDMjMuOTQ1MyAxNC45OTk4IDIzLjczMzQgMTUuMDg3NiAyMy41NzcxIDE1LjI0MzlDMjMuNDIwOCAxNS40MDAyIDIzLjMzMyAxNS42MTIyIDIzLjMzMyAxNS44MzMyQzIzLjMzMyAxNi4wNTQyIDIzLjQyMDggMTYuMjY2MSAyMy41NzcxIDE2LjQyMjRDMjMuNzMzNCAxNi41Nzg3IDIzLjk0NTMgMTYuNjY2NSAyNC4xNjY0IDE2LjY2NjVDMjQuMzg3NCAxNi42NjY1IDI0LjU5OTMgMTYuNTc4NyAyNC43NTU2IDE2LjQyMjRDMjQuOTExOSAxNi4yNjYxIDI0Ljk5OTcgMTYuMDU0MiAyNC45OTk3IDE1LjgzMzJDMjQuOTk5NyAxNS42MTIyIDI0LjkxMTkgMTUuNDAwMiAyNC43NTU2IDE1LjI0MzlDMjQuNTk5MyAxNS4wODc2IDI0LjM4NzQgMTQuOTk5OCAyNC4xNjY0IDE0Ljk5OThaXCJcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzAwOUJGM1wiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1iLTNcIj5TYXZlIGFuZCBjb21wbGV0ZSBhbGxvY2F0aW9uPC9oMj5cclxuICAgICAgICAgICAgPHA+WW91IGFyZSBhYm91dCB0byBjb21wbGV0ZSB0aGUgbWVyY2ggYWxsb2NhdGlvbiBwcm9jZXNzLiBUaGlzIHdpbGwgbWFrZSB0aGUgc3RvcmUgcmVhZHkgZm9yIGZpeHR1cmVcclxuICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbiBhbmQgbW92ZSBpdCB0byB0aGUgdmVyaWZpY2F0aW9uIHN0YWdlLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcHJvY2VlZD88L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGdhcC0zXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cIm1vZGFsLmNsb3NlKClcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzQnV0dG9uTG9hZGluZ1wiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJjb21wbGV0ZUFsbG9jYXRpb24oKTtcIiBbZGlzYWJsZWRdPVwiaXNCdXR0b25Mb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0J1dHRvbkxvYWRpbmdcIj5Db21wbGV0ZSBhbGxvY2F0aW9uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyBzdHlsZT1cIndpZHRoOiAxMDdweDtcIiAqbmdJZj1cImlzQnV0dG9uTG9hZGluZ1wiIGNsYXNzPVwic3Bpbm5lclwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwicGF0aFwiIGN4PVwiMjVcIiBjeT1cIjI1XCIgcj1cIjIwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCI0XCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
|