tango-app-ui-store-builder 1.2.8 → 1.2.9

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.
@@ -4958,11 +4958,11 @@ export class ManageStorePlanoComponent {
4958
4958
  this.destroy$.complete();
4959
4959
  }
4960
4960
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ManageStorePlanoComponent, 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 });
4961
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ManageStorePlanoComponent, selector: "lib-manage-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: "noStoreVideoModalRef", first: true, predicate: ["noStoreVideo"], descendants: true }, { propertyName: "applyLogicsModalRef", first: true, predicate: ["applyLogics"], descendants: true }, { propertyName: "approveLayoutModalRef", first: true, predicate: ["approveLayoutModal"], descendants: true }, { propertyName: "bodyAccordion", first: true, predicate: ["bodyAccordion"], descendants: true }], ngImport: i0, template: "<section id=\"manage-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 class=\"d-flex align-items-center\">\r\n <div style=\"margin-left:5px;margin-right:5px\" *ngIf=\"planoData?.storeName\">\r\n <h2 class='title'>{{planoData?.storeName}} - Plano</h2>\r\n </div>\r\n <div>\r\n <lib-select-plano *ngIf=\"storeList?.length\" [idField]=\"'_id'\" [selectedValues]=\"[selectedStoreName]\"\r\n [items]=\"storeList\" [multi]=false searchField=\"storeName\" (selected)=\"onSelected($event)\">\r\n </lib-select-plano>\r\n </div>\r\n </div>\r\n\r\n <lib-reactive-select *ngIf=\"floorsList.length && !isPageLoading\" [formControl]=\"selectedFloorId\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorsList\">\r\n </lib-reactive-select>\r\n\r\n <div class=\"cus-btn\" [class.disabled-click]=\"isStoreTourLoading\" (click)=\"goToStoreTourPage()\">\r\n View store tour\r\n\r\n <svg *ngIf=\"!isStoreTourLoading\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_408_16498)\">\r\n <path\r\n d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\"\r\n stroke=\"#33B5FF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M5 4L8 6L5 8V4Z\" stroke=\"#33B5FF\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_408_16498\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <span *ngIf=\"isStoreTourLoading\" class=\"spinner-border spinner-border-sm\" role=\"status\"\r\n aria-hidden=\"true\"></span>\r\n\r\n </div>\r\n <div class=\"cus-btn\" (click)=\"goToStoreCameraPage()\">\r\n View camera\r\n\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_422_36321)\">\r\n <path\r\n d=\"M9 6.5V9.5C9 9.76522 8.89464 10.0196 8.70711 10.2071C8.51957 10.3946 8.26522 10.5 8 10.5H2.5C2.23478 10.5 1.98043 10.3946 1.79289 10.2071C1.60536 10.0196 1.5 9.76522 1.5 9.5V4C1.5 3.73478 1.60536 3.48043 1.79289 3.29289C1.98043 3.10536 2.23478 3 2.5 3H5.5M7.5 1.5H10.5M10.5 1.5V4.5M10.5 1.5L5 7\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_422_36321\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n\r\n </div>\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?.lastUpdate}}</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\" (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\r\n <!-- Normal Mode: per-task publish buttons live inside their respective cards below.\r\n Top-right shows the final overall \"Publish\" once layout+fixture+vm are approved.\r\n When a zone task exists and isn't Approved yet, the button stays visible but\r\n disabled (so the store can't be published until zone verification completes).\r\n Legacy stores without a zone task are unblocked immediately. -->\r\n <ng-container *ngIf=\"showTopPublish\">\r\n <div class=\"indicator completed\" *ngIf=\"floorData?.verificationStatus\">Published</div>\r\n <button *ngIf=\"!floorData?.verificationStatus\" type=\"button\" class=\"btn btn-primary text-nowrap\"\r\n (click)=\"publish()\" [disabled]=\"topPublishDisabled\">\r\n Publish\r\n </button>\r\n </ng-container>\r\n\r\n\r\n\r\n <!-- Revoke buttons live inside their respective cards (Layout / Fixtures / VM / Zone) below. -->\r\n\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 <ng-template>\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\" fill=\"none\"\r\n 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\" 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 taskInfo?.planoProgress <= 50\r\n ? 'bg-warning'\r\n : taskInfo?.planoProgress === 75\r\n ? 'bg-primary'\r\n : 'bg-success'\r\n \" role=\"progressbar\" [style]=\"'width:' + taskInfo?.planoProgress + '%'\"\r\n [attr.aria-valuenow]=\"taskInfo?.planoProgress\" aria-valuemin=\"0\" aria-valuemax=\"100\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-3\">{{ taskInfo?.planoProgress }}%</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Layout -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n <div class=\"flex-grow-1\">\r\n <h3><b>{{ storeMetrics.floorCount }}</b> Layout</h3>\r\n <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.layout.class\">\r\n <span class=\"me-2\" [hidden]=\"taskStyle.layout.name !== 'Redo'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_4984_27569)\">\r\n <path\r\n d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4984_27569\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span [hidden]=\"taskStyle.layout.name !== 'Flagged'\" class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n {{ taskStyle.layout.name }}\r\n </div>\r\n </div>\r\n <!-- Layout actions disabled for now \u2014 no layout-related actions are needed.\r\n <button *ngIf=\"!editFixture && (publishingState === 'layout' || publishingState === 'layout-redo') && taskStyle.layout.class !== 'taskAssigned' && taskStyle.layout.class !== 'completed' && taskStyle.fixture.class !== 'taskAssigned'\"\r\n type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n {{ publishingState === 'layout-redo' ? 'Publish Layout Redo' : 'Publish Layout Verification' }}\r\n </button>\r\n <button *ngIf=\"!editFixture && taskStyle.layout.class === 'taskAssigned'\" type=\"button\"\r\n class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_640_5594lay)\">\r\n <path\r\n d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_640_5594lay\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Revoke\r\n </button>\r\n -->\r\n </div>\r\n </div>\r\n\r\n <!-- Fixtures -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n <div class=\"flex-grow-1\">\r\n <h3><b>{{ storeMetrics.fixtureCount }}</b> Fixtures</h3>\r\n <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.fixture.class\">\r\n <span class=\"me-2\" [hidden]=\"taskStyle.fixture.name !== 'Redo'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_4984_27569)\">\r\n <path\r\n d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4984_27569\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span [hidden]=\"taskStyle.fixture.name !== 'Flagged'\" class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n {{ taskStyle.fixture.name }}\r\n </div>\r\n </div>\r\n <button *ngIf=\"!editFixture && (publishingState === 'fixture' || publishingState === 'fixture-redo') && taskStyle.fixture.class !== 'taskAssigned'\"\r\n type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n {{ publishingState === 'fixture-redo' ? 'Publish Redo' : 'Publish Task' }}\r\n </button>\r\n <button *ngIf=\"!editFixture && taskStyle.fixture.class === 'taskAssigned'\" type=\"button\"\r\n class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_640_5594fix)\">\r\n <path\r\n d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_640_5594fix\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Revoke\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Visual Merchandise -->\r\n <!--\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <div class=\"d-flex flex-column gap-2\">\r\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\r\n <h3 class=\"m-0\"><b>{{ storeMetrics.vmCount }}</b> Visual Merchandise</h3>\r\n <div class=\"indicator\" [ngClass]=\"taskStyle.vm.class\">\r\n <span class=\"me-2\" [hidden]=\"taskStyle.vm.name !== 'Redo'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_4984_27569)\">\r\n <path\r\n d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4984_27569\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span [hidden]=\"taskStyle.vm.name !== 'Flagged'\" class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n {{ taskStyle.vm.name }}\r\n </div>\r\n </div>\r\n <button *ngIf=\"!editFixture && (publishingState === 'vm' || publishingState === 'vm-redo') && taskStyle.vm.class !== 'taskAssigned'\"\r\n type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n {{ publishingState === 'vm-redo' ? 'Publish Redo' : 'Publish' }}\r\n </button>\r\n <button *ngIf=\"!editFixture && taskStyle.vm.class === 'taskAssigned'\" type=\"button\"\r\n class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_640_5594vm)\">\r\n <path\r\n d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_640_5594vm\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Revoke\r\n </button>\r\n </div>\r\n </div>\r\n -->\r\n\r\n <!-- Zone Verification -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n <div class=\"flex-grow-1\">\r\n <h3>Zone Verification</h3>\r\n <div class=\"indicator mt-2\" [ngClass]=\"zoneTaskStyle.class\">\r\n <span class=\"me-2\" [hidden]=\"zoneTaskStyle.name !== 'Redo'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_4984_27569)\">\r\n <path\r\n d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4984_27569\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n {{ zoneTaskStyle.name }}\r\n </div>\r\n </div>\r\n <button *ngIf=\"!editFixture && !zoneFeedback?.zoneVerificationTask\" type=\"button\"\r\n class=\"card-publish-btn\" (click)=\"publishZoneVerification()\">\r\n Publish Task\r\n </button>\r\n <button *ngIf=\"!editFixture && zoneRedoStatus\" type=\"button\"\r\n class=\"card-publish-btn\" (click)=\"publishZoneRedo()\">\r\n Publish Redo\r\n </button>\r\n <button *ngIf=\"!editFixture && zoneTaskStyle.class === 'taskAssigned'\" type=\"button\"\r\n class=\"card-revoke-btn\" (click)=\"revokeZoneTask()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_640_5594z)\">\r\n <path\r\n d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_640_5594z\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Revoke\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body -->\r\n <div id=\"body\" class=\"row\">\r\n <!-- Left Column -->\r\n <div [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\" 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 }} {{ 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\" height=\"18\" viewBox=\"0 0 18 18\"\r\n 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\" 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\" height=\"18\" viewBox=\"0 0 18 18\"\r\n 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\" 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\" height=\"18\" viewBox=\"0 0 18 18\"\r\n 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 (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 *ngFor=\"let fixture of getFormFixtures(i).controls; let j = index\">\r\n <div dndDropzone (dndDrop)=\"onDrop($event, i, j)\" [formGroupName]=\"j\"\r\n [dndDraggable]=\"{ wallIndex: i, fixtureIndex: j }\" [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 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\" 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 formControlName=\"fixtureConfigId\" [idField]=\"'_id'\"\r\n [nameField]=\"'name'\" [data]=\"fixtureTemplates\" [label]=\"'Fixture ' + (j + 1)\"\r\n [subTextField]=\"'subtext'\" [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\" width=\"10\" height=\"10\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" 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('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 *ngIf=\"getWallOtherElements(i).controls.length\">\r\n <div formArrayName=\"otherElements\">\r\n <ng-container *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 {{ j + 1 }}</label>\r\n\r\n <!-- Dropdown bound to 'type' -->\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"otherElementList\" [id]=\"'elementLabel' + j\" formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <!-- Show custom text input only when 'Others' is selected -->\r\n <input *ngIf=\"(fixture.get('type')?.value) === 'Others'\" type=\"text\"\r\n class=\"form-control mt-2\" 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\" width=\"10\" height=\"10\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" 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('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 (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 *ngFor=\"let fixture of getFormFloorFixtures.controls; let j = index\">\r\n <div dndDropzone (dndDrop)=\"onDrop($event, 'floor', j)\" [formGroupName]=\"j\"\r\n [dndDraggable]=\"{ wallIndex: 'floor', fixtureIndex: j }\" [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 class=\"d-flex align-items-center justify-content-center h-100\">\r\n <svg dndDragImageRef style=\"cursor: move; opacity: 0.5\" width=\"25px\"\r\n viewBox=\"0 0 16 16\" 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 formControlName=\"fixtureConfigId\" [idField]=\"'_id'\"\r\n [nameField]=\"'name'\" [data]=\"fixtureTemplates\" [label]=\"'Fixture ' + (j + 1)\"\r\n [search]=\"true\" [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\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" 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 *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 {{ j + 1 }}</label>\r\n\r\n <!-- Dropdown for type -->\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"otherElementList\" [id]=\"'floorElementLabel' + j\" formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <!-- Conditional input for custom name -->\r\n <input *ngIf=\"(fixture.get('type')?.value) === 'Others'\" type=\"text\"\r\n class=\"form-control mt-2\" 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\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" 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 <div [ngClass]=\"{ 'd-none': selectedView === 'tree' }\">\r\n <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n </div>\r\n\r\n <!-- Tree View -->\r\n <div *ngIf=\"selectedView === 'tree'\" class=\"w-100\">\r\n <store-plano-tree-view [allFixture]=\"allFixtures\"></store-plano-tree-view>\r\n </div>\r\n\r\n <!-- Top Controls -->\r\n <div style=\"top: 24px; left: 26px; position: absolute;\" id=\"segment-btn\" class=\"pb-5\">\r\n <div class=\"w-100 d-flex justify-content-start gap-4\">\r\n <ul class=\"nav nav-tabs custom-tabs d-flex\" style=\"width: 200px; margin: 0\">\r\n <li class=\"nav-item flex-fill\">\r\n <button class=\"nav-link w-100 h-100\" [class.active]=\"selectedView === 'detail'\"\r\n (click)=\"selectedView = 'detail'\">\r\n Detail View\r\n </button>\r\n </li>\r\n <li class=\"nav-item flex-fill\">\r\n <button class=\"nav-link w-100 h-100\" [class.active]=\"selectedView === 'tree'\"\r\n (click)=\"selectedView = 'tree'\">\r\n Tree View\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <!-- PID Allocation -->\r\n <!-- <div *ngIf=\"layoutForm.disabled\" style=\"top: 24px; left: 234px\"\r\n class=\"position-absolute\">\r\n <button type=\"button\" style=\"padding: 9px 19px !important;\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n [disabled]=\"getEntrances?.length >= 2\" (click)=\"onClickApplyLogics()\">\r\n Apply Logics\r\n </button>\r\n </div> -->\r\n\r\n <!-- Entrance Button -->\r\n <div *ngIf=\"layoutForm.enabled\" ngbTooltip=\"You can add up to two entrances.\" style=\"top: 24px; left: 234px\"\r\n class=\"position-absolute\" [disableTooltip]=\"getEntrances?.length < 2\">\r\n <button type=\"button\" style=\"padding: 9px 19px !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 <div *ngIf=\"layoutForm.enabled\" style=\"top: 24px; right: 192px\" class=\"position-absolute\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n (click)=\"cancelEdit()\">\r\n Cancel\r\n </button>\r\n </div>\r\n\r\n\r\n <!-- Edit Button -->\r\n <button *ngIf=\"layoutForm.disabled && selectedView === 'detail'\"\r\n [disabled]=\"disableEdit || ['taskAssigned'].includes(taskStyle.fixture.class) || (taskStyle.fixture.class == 'reviewPending' && !showLayout)\"\r\n style=\"top: 24px; right: 164px\" type=\"button\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute 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\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n\r\n <!-- Rotate Button -->\r\n <button style=\"top: 24px; right: 94px\" type=\"button\" *ngIf=\"layoutForm.disabled && selectedView === 'detail'\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute 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\" 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 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 <!-- Submit Button -->\r\n <button *ngIf=\"!layoutForm.disabled\"\r\n style=\"top: 24px; right: 94px;padding: 9px 20px !important;min-width: 90px;justify-content: center;\"\r\n type=\"button\" class=\"btn btn-primary d-flex align-items-center gap-2 position-absolute bg-white shadow-sm\"\r\n [disabled]=\"isSavingLayout\" (click)=\"updateLayout(true)\">\r\n <span *ngIf=\"isSavingLayout\" class=\"spinner-border spinner-border-sm\" role=\"status\"\r\n aria-hidden=\"true\"></span>\r\n Save\r\n </button>\r\n\r\n <!-- Download Button -->\r\n <button *ngIf=\"selectedView === 'detail'\" style=\"top: 24px; right: 26px\" type=\"button\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n (click)=\"downloadCanvas()\">\r\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n 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\" stroke=\"#CCCCCC\"\r\n 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 <!-- 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 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 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 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 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\" 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\" role=\"tab\">\r\n Products\r\n </a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\" *ngIf=\"editFromTab !== 'zone'\">\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\" [revertOnEdit]=\"shouldRevertOnEdit\"\r\n [zoneEditMode]=\"editFromTab === 'zone'\" (submitEvent)=\"onFixtureSubmit($event)\">\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\" [isSubmitted]=\"submitFixture\"\r\n [revertOnEdit]=\"shouldRevertOnEdit\" [zoneEditMode]=\"editFromTab === 'zone'\"\r\n (submitEvent)=\"onFixtureSubmit($event)\">\r\n </lib-instance-products>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"editFixtureSection === 'vms' && editFromTab !== 'zone'\">\r\n <lib-instance-vms [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\" [isSubmitted]=\"submitFixture\"\r\n [revertOnEdit]=\"shouldRevertOnEdit\" (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' : editFixture || showLayout ? '340px' : activeFeedbackTab === 'fixture' ? '1050px' : '750px'}\">\r\n <ng-container *ngTemplateOutlet=\"feedbackCol\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</section>\r\n\r\n<!-- Templates -->\r\n<ng-template #feedbackCol>\r\n <div class=\"s-card s-card--tabbed\" [ngStyle]=\"{'margin-top':editFixture ? '72px' : '0px'}\">\r\n <!-- @if(showFixturePreview && !isRightPanelCollapsed){\r\n <fixture-preview [fixtureData]=\"selectedFixture?.fixtureData\"></fixture-preview>\r\n } -->\r\n\r\n <ul class=\"nav nav-pills feedback-tabs\" role=\"tablist\"\r\n [ngClass]=\"{ 'd-none': isRightPanelCollapsed && !editFixture }\">\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"onFeedbackTabChange('fixture')\" [ngClass]=\"activeFeedbackTab === 'fixture' ? 'active' : ''\"\r\n class=\"nav-link\" role=\"tab\">\r\n Fixture Verification\r\n </a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"onFeedbackTabChange('zone')\" [ngClass]=\"activeFeedbackTab === 'zone' ? 'active' : ''\"\r\n class=\"nav-link d-flex align-items-center gap-2\" role=\"tab\">\r\n Zone Verification\r\n <span *ngIf=\"zonePendingCount > 0\" class=\"badge feedback-tab-badge\">\r\n {{ zonePendingCount }}\r\n </span>\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n <div class=\"feedback-tab-content\">\r\n <ng-container *ngIf=\"activeFeedbackTab === 'fixture'\">\r\n <div *ngIf=\"showLayout && !isRightPanelCollapsed\">\r\n <div class=\"card-body\">\r\n\r\n <!-- Title -->\r\n <div class=\"storeTitle mb-3\">Store response</div>\r\n <hr>\r\n\r\n <!-- Section Header -->\r\n <div class=\"d-flex justify-content-between align-items-center mb-1\">\r\n <h5 class=\"subTitle fw-semibold mb-0\">Fixture verification</h5>\r\n <i class=\"bi bi-chevron-up text-muted cursor-pointer\" (click)=\"toggle = !toggle\" *ngIf=\"!toggle\"></i>\r\n <i class=\"bi bi-chevron-down text-muted cursor-pointer\" (click)=\"toggle = !toggle\" *ngIf=\"toggle\"></i>\r\n </div>\r\n <div class=\"smallText text-muted d-block mb-4\">\r\n Assigned on: {{storeFeedback?.fixtureData?.[0]?.taskData?.createdAt | date:'dd MMM YYY, hh:mm:SS a'}}\r\n </div>\r\n\r\n\r\n <div *ngIf=\"toggle\" class=\"mt-10\">\r\n <!-- Column Headings -->\r\n <div class=\"row text-muted small fw-semibold mb-5\">\r\n <div class=\"col-6\"></div>\r\n <div class=\"col-3 text-center lightText\">Before</div>\r\n <div class=\"col-3 text-center lightText\">After</div>\r\n </div>\r\n\r\n <!-- Wall Fixtures -->\r\n <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n <div class=\"col-6\">Wall Fixtures</div>\r\n <div class=\"col-3 text-center\">\r\n {{wallCount - clCount}}\r\n </div>\r\n <div class=\"col-3 text-center fw-semibold\"\r\n [ngClass]=\"(wallCount - clCount) != storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures ? 'text-danger' : ''\">\r\n <i class=\"bi bi-arrow-up\"\r\n *ngIf=\"(wallCount - clCount) < storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures\"></i>\r\n <i class=\"bi bi-arrow-down\"\r\n *ngIf=\"(wallCount - clCount) > storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures\"></i>{{storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures}}\r\n </div>\r\n </div>\r\n\r\n <!-- Euro Centre Fixtures -->\r\n <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n <div class=\"col-6\">Euro Centre Fixtures</div>\r\n <div class=\"col-3 text-center\">{{floorData.centerFixture.length}}</div>\r\n <div class=\"col-3 text-center fw-semibold\"\r\n [ngClass]=\"floorData.centerFixture.length != storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures ? 'text-danger' : ''\">\r\n <i class=\"bi bi-arrow-down\"\r\n *ngIf=\"floorData.centerFixture.length > storeFeedback.fixtureData[0]?.answers?.[0]?.floorFixtures\"></i>\r\n <i class=\"bi bi-arrow-up\"\r\n *ngIf=\"floorData.centerFixture.length < storeFeedback.fixtureData[0]?.answers?.[0]?.floorFixtures\"></i>\r\n {{storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures}}\r\n </div>\r\n </div>\r\n\r\n <!-- Contact Lenses -->\r\n <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n <div class=\"col-6\">Contact Lenses</div>\r\n <div class=\"col-3 text-center\">{{clCount}}</div>\r\n <div class=\"col-3 text-center fw-semibold\"\r\n [ngClass]=\"clCount != storeFeedback.fixtureData[0].answers?.[0]?.cl ? 'text-danger' : ''\">\r\n <i class=\"bi bi-arrow-down\" *ngIf=\"clCount > storeFeedback.fixtureData[0].answers?.[0]?.cl\"></i>\r\n <i class=\"bi bi-arrow-up\" *ngIf=\"clCount < storeFeedback.fixtureData[0].answers?.[0]?.cl\"></i>\r\n {{storeFeedback.fixtureData[0].answers?.[0]?.cl}}\r\n </div>\r\n </div>\r\n\r\n <hr>\r\n\r\n <!-- Total Section -->\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-6 fw-semibold totalText\">Total</div>\r\n <div class=\"col-3 text-center totalText\">\r\n <div class=\"total-box\">{{floorData.fixtureCount}}</div>\r\n </div>\r\n <div class=\"col-3 text-center totalText\">\r\n <div class=\"total-box\"\r\n [ngClass]=\"floorData.fixtureCount !== (storeFeedback.fixtureData[0].answers?.[0]?.cl + storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures + storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures) ? 'text-center' :''\">\r\n {{storeFeedback.fixtureData[0].answers?.[0]?.cl + storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures + storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (storeFeedback.fixtureData[0]?.answers?.[0]?.comments.length) {\r\n <div id=\"fixture-comments\" class=\"mt-10\">\r\n <h5 class=\"mb-2\">Comments</h5>\r\n\r\n <div class=\"log-block\"\r\n *ngFor=\"let c of storeFeedback.fixtureData[0]?.answers[0]?.comments;let i= index\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.timeStamp | date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n\r\n @if(c?.responsetype === 'comment'){\r\n <h5>{{c?.comment}}</h5>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <lib-verification-feedback [floorData]=\"floorData\"\r\n [ngClass]=\"{ 'd-none': isRightPanelCollapsed && !editFixture}\" [feedbackDetails]=\"selectedFixtureFeedback\"\r\n (changeFixture)=\"onChangeFixtureOnFeedbackPanel($event,true)\" [totalFixtures]=\"allFixtureInstances\"\r\n [cdn]=\"cdnUrl\" (action)=\"handleFeedbackAction($event)\" [showAction]=\"!editFixture\"\r\n *ngIf=\"!showLayout\"></lib-verification-feedback>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"activeFeedbackTab === 'zone'\">\r\n <lib-zone-verification-feedback [floorData]=\"floorData\" [feedbackDetails]=\"selectedFixtureFeedback\"\r\n [zoneTask]=\"zoneFeedback?.zoneVerificationTask\" [zoneFeedback]=\"selectedZoneFeedback\"\r\n [totalFixtures]=\"allFixtureInstances\" [cdn]=\"cdnUrl\" [showAction]=\"!editFixture\"\r\n (changeFixture)=\"onChangeFixtureOnFeedbackPanel($event,true)\" (action)=\"handleFeedbackAction($event)\"\r\n [ngClass]=\"{ 'd-none': isRightPanelCollapsed && !editFixture }\"></lib-zone-verification-feedback>\r\n </ng-container>\r\n </div>\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\r\n<ng-template #noStoreVideo let-modal>\r\n <div class=\"modal-body\">\r\n <div>\r\n <h2 class=\"mb-3\">No Store Video Found</h2>\r\n <p>The video will be available once a request is raised and the store submits a complete store video.</p>\r\n </div>\r\n <div class=\"d-flex justify-content-end\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\">Close</button>\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>\r\n <h2 class=\"mb-3\">Apply IVM Logics</h2>\r\n <p>This will analyze the current layout and apply the pre-defined fixture logics.</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()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"applyPIDLogics()\">Proceed</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 layout/plan</h2>\r\n <p>\r\n Are you sure you want to approve the layout? Please ensure it has been thoroughly reviewed before approving.\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()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"approveLayout()\">\r\n <span *ngIf=\"!isButtonLoading\">Approve</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>", 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}::ng-deep .backgroundImg{background-color:#f9fafb!important}::ng-deep .accordion .accordion-button.backgroundImg:not(.collapsed){background-color:#f9fafb!important}::ng-deep .accordion-body{padding:10px 20px 20px}.s-card{position:relative;box-sizing:border-box;border-radius:8px;background:#fff;padding:20px 16px;height:75dvh;overflow-y:auto;overflow-x:visible}.card-publish-btn{flex-shrink:0;font-family:Inter;font-weight:600;font-size:12px;line-height:16px;padding:6px 10px;border-radius:6px;border:1px solid #009bf3;background:#009bf3;color:#fff;white-space:nowrap;cursor:pointer;box-shadow:0 1px 2px #1018280d}.card-publish-btn:hover:not(:disabled){background:#0084d1;border-color:#0084d1}.card-publish-btn:disabled{opacity:.5;cursor:not-allowed}.card-revoke-btn{flex-shrink:0;display:inline-flex;align-items:center;gap:4px;font-family:Inter;font-weight:600;font-size:12px;line-height:16px;padding:6px 10px;border-radius:6px;border:1px solid #fda29b;background:#fef3f2;color:#b42318;white-space:nowrap;cursor:pointer;box-shadow:0 1px 2px #1018280d}.card-revoke-btn:hover:not(:disabled){background:#fee4e2}.card-revoke-btn:disabled{opacity:.5;cursor:not-allowed}.s-card.s-card--tabbed{display:flex;flex-direction:column;padding:12px 16px 0;overflow:hidden}.s-card.s-card--tabbed .feedback-tabs{flex-shrink:0;margin:0 0 8px;padding:0}.s-card.s-card--tabbed .feedback-tabs .nav-link .badge.feedback-tab-badge{background-color:#eaf8ff;color:#009bf3;font-size:11px;font-weight:600;padding:2px 8px;border-radius:10px}.s-card.s-card--tabbed .feedback-tabs .nav-link.active .badge.feedback-tab-badge{background-color:#009bf3;color:#fff}.s-card.s-card--tabbed .feedback-tab-content{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}.s-card.s-card--tabbed .feedback-tab-content>*{flex:1 1 auto;min-height:0;display:block}.c-card{border-radius:8px;background:#fff;padding:20px 16px;height:75dvh;overflow:hidden;width:100%}.h-card{border-radius:8px;background:#fff;padding:20px 16px;min-height:20dvh}.wall-label{color:var(--Gray-600, #475467);font-family:Inter;font-size:14px;font-style:normal;font-weight:600}img{width:100%;height:100%;object-fit:cover;display:block}#header .filter-tab{min-width:180px}#header .title{color:var(--Gray-800, #1d2939);font-size:16px;font-weight:600;line-height:24px;margin:0;white-space:nowrap}#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;white-space:nowrap;flex-shrink:0;cursor:pointer}#header .cus-btn:hover{background:#e2f5ff}#header .updateClass{white-space:nowrap}@media (max-width: 1500px){#header [ngbAccordionHeader]{padding-left:1rem!important;padding-right:1rem!important;gap:.5rem}#header .gap-4{gap:.75rem!important}#header .title{font-size:14px;line-height:20px}#header .cus-btn{padding:3px 8px;font-size:12px}#header .updateClass{font-size:12px;line-height:18px}#header .row.gap-3{gap:.5rem!important}#header .filter-tab{min-width:170px;padding:.75rem}#header .filter-tab h3{font-size:14px;line-height:20px}#header .filter-tab .indicator{font-size:12px}}@media (max-width: 1300px){#header [ngbAccordionHeader]{padding-left:.75rem!important;padding-right:.75rem!important}#header .title{font-size:13px}#header .cus-btn{font-size:11px;padding:2px 6px}#header .updateClass{font-size:11px}#header .filter-tab{min-width:150px}#header .filter-tab h3{font-size:13px}}.loader .shimmer{height:100%!important}.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}.collapse-handler.right{right:0}.collapse-handler.left{left:0}.collapsed-col{transition:all .3s ease;width:40px!important}[class^=col]{transition:all .3s ease}#segment-btn .custom-tabs{border-radius:8px;border:1px solid var(--Gray-300, #d0d5dd);overflow:hidden;margin-bottom:24px}#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}#segment-btn .custom-tabs .nav-link.active{background:var(--Primary-500, #33b5ff);color:#fff}#segment-btn .nav-tabs .nav-link{border:none;margin:0}#segment-btn .nav-item{text-align:center}#segment-btn .nav-item:last-child .nav-link{border:none}.link-btn{color:#33b5ff;cursor:pointer;font-weight:500}.link-btn:hover{color:#33b5ff;text-decoration:underline!important}.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}.updateClass{font-family:Inter;font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#667085}.btn .spinner{height:22px;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)}}.storeTitle{font-family:Inter;font-weight:600;font-size:16px;line-height:24px;letter-spacing:0%;color:#101828}.subTitle{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;letter-spacing:0%;color:#1d2939}.smallText{font-family:Inter;font-weight:400;font-size:14px;color:#667085;line-height:20px;letter-spacing:0%}.wallText{font-family:Inter;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;color:#1d2939}.totalText{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;letter-spacing:0%;color:#1d2939}.lightText{font-family:Inter;font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;text-align:center;vertical-align:middle;color:#344054}.total-box{background-color:#f3f4f6;border-radius:8px;padding:8px 0;font-weight:600}.bi-arrow-up,.bi-arrow-down{color:#dc3545}.log-block{display:flex;gap:12px;padding:4px;margin-bottom:18px}.log-block h4{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}.log-block p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085;margin:0}.fixture-row{border-radius:8px;transition:background-color .2s ease,box-shadow .2s ease}.fixture-row.highlighted-fixture{background-color:#eaf8ff;box-shadow:0 0 0 2px #33b5ff}\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.StorePlanoTreeViewComponent, selector: "store-plano-tree-view", inputs: ["allFixture"], outputs: ["selectedInstance"] }, { kind: "component", type: i14.CustomSelectComponent, selector: "lib-select-plano", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label", "compact"], outputs: ["selected"] }, { kind: "component", type: i15.VerificationFeedbackComponent, selector: "lib-verification-feedback", inputs: ["floorData", "totalFixtures", "feedbackDetails", "cdn", "showAction"], outputs: ["changeFixture", "action"] }, { kind: "component", type: i16.ZoneVerificationFeedbackComponent, selector: "lib-zone-verification-feedback", inputs: ["floorData", "feedbackDetails", "zoneTask", "zoneFeedback", "totalFixtures", "cdn", "showAction"], outputs: ["changeFixture", "action"] }, { kind: "pipe", type: i5.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i5.DatePipe, name: "date" }] });
4961
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ManageStorePlanoComponent, selector: "lib-manage-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: "noStoreVideoModalRef", first: true, predicate: ["noStoreVideo"], descendants: true }, { propertyName: "applyLogicsModalRef", first: true, predicate: ["applyLogics"], descendants: true }, { propertyName: "approveLayoutModalRef", first: true, predicate: ["approveLayoutModal"], descendants: true }, { propertyName: "bodyAccordion", first: true, predicate: ["bodyAccordion"], descendants: true }], ngImport: i0, template: "<section id=\"manage-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 class=\"d-flex align-items-center\">\r\n <div style=\"margin-left:5px;margin-right:5px\" *ngIf=\"planoData?.storeName\">\r\n <h2 class='title'>{{planoData?.storeName}} - Plano</h2>\r\n </div>\r\n <div>\r\n <lib-select-plano *ngIf=\"storeList?.length\" [idField]=\"'_id'\" [selectedValues]=\"[selectedStoreName]\"\r\n [items]=\"storeList\" [multi]=false searchField=\"storeName\" (selected)=\"onSelected($event)\">\r\n </lib-select-plano>\r\n </div>\r\n </div>\r\n\r\n <lib-reactive-select *ngIf=\"floorsList.length && !isPageLoading\" [formControl]=\"selectedFloorId\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorsList\">\r\n </lib-reactive-select>\r\n\r\n <div class=\"cus-btn\" [class.disabled-click]=\"isStoreTourLoading\" (click)=\"goToStoreTourPage()\">\r\n View store tour\r\n\r\n <svg *ngIf=\"!isStoreTourLoading\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_408_16498)\">\r\n <path\r\n d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\"\r\n stroke=\"#33B5FF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M5 4L8 6L5 8V4Z\" stroke=\"#33B5FF\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_408_16498\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <span *ngIf=\"isStoreTourLoading\" class=\"spinner-border spinner-border-sm\" role=\"status\"\r\n aria-hidden=\"true\"></span>\r\n\r\n </div>\r\n <div class=\"cus-btn\" (click)=\"goToStoreCameraPage()\">\r\n View camera\r\n\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_422_36321)\">\r\n <path\r\n d=\"M9 6.5V9.5C9 9.76522 8.89464 10.0196 8.70711 10.2071C8.51957 10.3946 8.26522 10.5 8 10.5H2.5C2.23478 10.5 1.98043 10.3946 1.79289 10.2071C1.60536 10.0196 1.5 9.76522 1.5 9.5V4C1.5 3.73478 1.60536 3.48043 1.79289 3.29289C1.98043 3.10536 2.23478 3 2.5 3H5.5M7.5 1.5H10.5M10.5 1.5V4.5M10.5 1.5L5 7\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_422_36321\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n\r\n </div>\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\" (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\r\n <!-- Normal Mode: per-task publish buttons live inside their respective cards below.\r\n Top-right shows the final overall \"Publish\" once layout+fixture+vm are approved.\r\n When a zone task exists and isn't Approved yet, the button stays visible but\r\n disabled (so the store can't be published until zone verification completes).\r\n Legacy stores without a zone task are unblocked immediately. -->\r\n <ng-container *ngIf=\"showTopPublish\">\r\n <div class=\"indicator completed\" *ngIf=\"floorData?.verificationStatus\">Published</div>\r\n <button *ngIf=\"!floorData?.verificationStatus\" type=\"button\" class=\"btn btn-primary text-nowrap\"\r\n (click)=\"publish()\" [disabled]=\"topPublishDisabled\">\r\n Publish\r\n </button>\r\n </ng-container>\r\n\r\n\r\n\r\n <!-- Revoke buttons live inside their respective cards (Layout / Fixtures / VM / Zone) below. -->\r\n\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 <ng-template>\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\" fill=\"none\"\r\n 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\" 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 taskInfo?.planoProgress <= 50\r\n ? 'bg-warning'\r\n : taskInfo?.planoProgress === 75\r\n ? 'bg-primary'\r\n : 'bg-success'\r\n \" role=\"progressbar\" [style]=\"'width:' + taskInfo?.planoProgress + '%'\"\r\n [attr.aria-valuenow]=\"taskInfo?.planoProgress\" aria-valuemin=\"0\" aria-valuemax=\"100\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-3\">{{ taskInfo?.planoProgress }}%</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Layout -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n <div class=\"flex-grow-1\">\r\n <h3><b>{{ storeMetrics.floorCount }}</b> Layout</h3>\r\n <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.layout.class\">\r\n <span class=\"me-2\" [hidden]=\"taskStyle.layout.name !== 'Redo'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_4984_27569)\">\r\n <path\r\n d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4984_27569\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span [hidden]=\"taskStyle.layout.name !== 'Flagged'\" class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n {{ taskStyle.layout.name }}\r\n </div>\r\n </div>\r\n <!-- Layout actions disabled for now \u2014 no layout-related actions are needed.\r\n <button *ngIf=\"!editFixture && (publishingState === 'layout' || publishingState === 'layout-redo') && taskStyle.layout.class !== 'taskAssigned' && taskStyle.layout.class !== 'completed' && taskStyle.fixture.class !== 'taskAssigned'\"\r\n type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n {{ publishingState === 'layout-redo' ? 'Publish Layout Redo' : 'Publish Layout Verification' }}\r\n </button>\r\n <button *ngIf=\"!editFixture && taskStyle.layout.class === 'taskAssigned'\" type=\"button\"\r\n class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_640_5594lay)\">\r\n <path\r\n d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_640_5594lay\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Revoke\r\n </button>\r\n -->\r\n </div>\r\n </div>\r\n\r\n <!-- Fixtures -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n <div class=\"flex-grow-1\">\r\n <h3><b>{{ storeMetrics.fixtureCount }}</b> Fixtures</h3>\r\n <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.fixture.class\">\r\n <span class=\"me-2\" [hidden]=\"taskStyle.fixture.name !== 'Redo'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_4984_27569)\">\r\n <path\r\n d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4984_27569\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span [hidden]=\"taskStyle.fixture.name !== 'Flagged'\" class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n {{ taskStyle.fixture.name }}\r\n </div>\r\n </div>\r\n <button *ngIf=\"!editFixture && (publishingState === 'fixture' || publishingState === 'fixture-redo') && taskStyle.fixture.class !== 'taskAssigned'\"\r\n type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n {{ publishingState === 'fixture-redo' ? 'Publish Redo' : 'Publish Task' }}\r\n </button>\r\n <button *ngIf=\"!editFixture && taskStyle.fixture.class === 'taskAssigned'\" type=\"button\"\r\n class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_640_5594fix)\">\r\n <path\r\n d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_640_5594fix\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Revoke\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Visual Merchandise -->\r\n <!--\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <div class=\"d-flex flex-column gap-2\">\r\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\r\n <h3 class=\"m-0\"><b>{{ storeMetrics.vmCount }}</b> Visual Merchandise</h3>\r\n <div class=\"indicator\" [ngClass]=\"taskStyle.vm.class\">\r\n <span class=\"me-2\" [hidden]=\"taskStyle.vm.name !== 'Redo'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_4984_27569)\">\r\n <path\r\n d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4984_27569\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span [hidden]=\"taskStyle.vm.name !== 'Flagged'\" class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n {{ taskStyle.vm.name }}\r\n </div>\r\n </div>\r\n <button *ngIf=\"!editFixture && (publishingState === 'vm' || publishingState === 'vm-redo') && taskStyle.vm.class !== 'taskAssigned'\"\r\n type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n {{ publishingState === 'vm-redo' ? 'Publish Redo' : 'Publish' }}\r\n </button>\r\n <button *ngIf=\"!editFixture && taskStyle.vm.class === 'taskAssigned'\" type=\"button\"\r\n class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_640_5594vm)\">\r\n <path\r\n d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_640_5594vm\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Revoke\r\n </button>\r\n </div>\r\n </div>\r\n -->\r\n\r\n <!-- Zone Verification -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n <div class=\"flex-grow-1\">\r\n <h3>Zone Verification</h3>\r\n <div class=\"indicator mt-2\" [ngClass]=\"zoneTaskStyle.class\">\r\n <span class=\"me-2\" [hidden]=\"zoneTaskStyle.name !== 'Redo'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_4984_27569)\">\r\n <path\r\n d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4984_27569\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n {{ zoneTaskStyle.name }}\r\n </div>\r\n </div>\r\n <button *ngIf=\"!editFixture && !zoneFeedback?.zoneVerificationTask\" type=\"button\"\r\n class=\"card-publish-btn\" (click)=\"publishZoneVerification()\">\r\n Publish Task\r\n </button>\r\n <button *ngIf=\"!editFixture && zoneRedoStatus\" type=\"button\"\r\n class=\"card-publish-btn\" (click)=\"publishZoneRedo()\">\r\n Publish Redo\r\n </button>\r\n <button *ngIf=\"!editFixture && zoneTaskStyle.class === 'taskAssigned'\" type=\"button\"\r\n class=\"card-revoke-btn\" (click)=\"revokeZoneTask()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_640_5594z)\">\r\n <path\r\n d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_640_5594z\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Revoke\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body -->\r\n <div id=\"body\" class=\"row\">\r\n <!-- Left Column -->\r\n <div [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\" 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 }} {{ 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\" height=\"18\" viewBox=\"0 0 18 18\"\r\n 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\" 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\" height=\"18\" viewBox=\"0 0 18 18\"\r\n 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\" 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\" height=\"18\" viewBox=\"0 0 18 18\"\r\n 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 (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 *ngFor=\"let fixture of getFormFixtures(i).controls; let j = index\">\r\n <div dndDropzone (dndDrop)=\"onDrop($event, i, j)\" [formGroupName]=\"j\"\r\n [dndDraggable]=\"{ wallIndex: i, fixtureIndex: j }\" [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 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\" 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 formControlName=\"fixtureConfigId\" [idField]=\"'_id'\"\r\n [nameField]=\"'name'\" [data]=\"fixtureTemplates\" [label]=\"'Fixture ' + (j + 1)\"\r\n [subTextField]=\"'subtext'\" [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\" width=\"10\" height=\"10\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" 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('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 *ngIf=\"getWallOtherElements(i).controls.length\">\r\n <div formArrayName=\"otherElements\">\r\n <ng-container *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 {{ j + 1 }}</label>\r\n\r\n <!-- Dropdown bound to 'type' -->\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"otherElementList\" [id]=\"'elementLabel' + j\" formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <!-- Show custom text input only when 'Others' is selected -->\r\n <input *ngIf=\"(fixture.get('type')?.value) === 'Others'\" type=\"text\"\r\n class=\"form-control mt-2\" 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\" width=\"10\" height=\"10\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" 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('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 (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 *ngFor=\"let fixture of getFormFloorFixtures.controls; let j = index\">\r\n <div dndDropzone (dndDrop)=\"onDrop($event, 'floor', j)\" [formGroupName]=\"j\"\r\n [dndDraggable]=\"{ wallIndex: 'floor', fixtureIndex: j }\" [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 class=\"d-flex align-items-center justify-content-center h-100\">\r\n <svg dndDragImageRef style=\"cursor: move; opacity: 0.5\" width=\"25px\"\r\n viewBox=\"0 0 16 16\" 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 formControlName=\"fixtureConfigId\" [idField]=\"'_id'\"\r\n [nameField]=\"'name'\" [data]=\"fixtureTemplates\" [label]=\"'Fixture ' + (j + 1)\"\r\n [search]=\"true\" [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\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" 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 *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 {{ j + 1 }}</label>\r\n\r\n <!-- Dropdown for type -->\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"otherElementList\" [id]=\"'floorElementLabel' + j\" formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <!-- Conditional input for custom name -->\r\n <input *ngIf=\"(fixture.get('type')?.value) === 'Others'\" type=\"text\"\r\n class=\"form-control mt-2\" 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\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" 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 <div [ngClass]=\"{ 'd-none': selectedView === 'tree' }\">\r\n <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n </div>\r\n\r\n <!-- Tree View -->\r\n <div *ngIf=\"selectedView === 'tree'\" class=\"w-100\">\r\n <store-plano-tree-view [allFixture]=\"allFixtures\"></store-plano-tree-view>\r\n </div>\r\n\r\n <!-- Top Controls -->\r\n <div style=\"top: 24px; left: 26px; position: absolute;\" id=\"segment-btn\" class=\"pb-5\">\r\n <div class=\"w-100 d-flex justify-content-start gap-4\">\r\n <ul class=\"nav nav-tabs custom-tabs d-flex\" style=\"width: 200px; margin: 0\">\r\n <li class=\"nav-item flex-fill\">\r\n <button class=\"nav-link w-100 h-100\" [class.active]=\"selectedView === 'detail'\"\r\n (click)=\"selectedView = 'detail'\">\r\n Detail View\r\n </button>\r\n </li>\r\n <li class=\"nav-item flex-fill\">\r\n <button class=\"nav-link w-100 h-100\" [class.active]=\"selectedView === 'tree'\"\r\n (click)=\"selectedView = 'tree'\">\r\n Tree View\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <!-- PID Allocation -->\r\n <!-- <div *ngIf=\"layoutForm.disabled\" style=\"top: 24px; left: 234px\"\r\n class=\"position-absolute\">\r\n <button type=\"button\" style=\"padding: 9px 19px !important;\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n [disabled]=\"getEntrances?.length >= 2\" (click)=\"onClickApplyLogics()\">\r\n Apply Logics\r\n </button>\r\n </div> -->\r\n\r\n <!-- Entrance Button -->\r\n <div *ngIf=\"layoutForm.enabled\" ngbTooltip=\"You can add up to two entrances.\" style=\"top: 24px; left: 234px\"\r\n class=\"position-absolute\" [disableTooltip]=\"getEntrances?.length < 2\">\r\n <button type=\"button\" style=\"padding: 9px 19px !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 <div *ngIf=\"layoutForm.enabled\" style=\"top: 24px; right: 192px\" class=\"position-absolute\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n (click)=\"cancelEdit()\">\r\n Cancel\r\n </button>\r\n </div>\r\n\r\n\r\n <!-- Edit Button -->\r\n <button *ngIf=\"layoutForm.disabled && selectedView === 'detail'\"\r\n [disabled]=\"disableEdit || ['taskAssigned'].includes(taskStyle.fixture.class) || (taskStyle.fixture.class == 'reviewPending' && !showLayout)\"\r\n style=\"top: 24px; right: 164px\" type=\"button\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute 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\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n\r\n <!-- Rotate Button -->\r\n <button style=\"top: 24px; right: 94px\" type=\"button\" *ngIf=\"layoutForm.disabled && selectedView === 'detail'\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute 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\" 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 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 <!-- Submit Button -->\r\n <button *ngIf=\"!layoutForm.disabled\"\r\n style=\"top: 24px; right: 94px;padding: 9px 20px !important;min-width: 90px;justify-content: center;\"\r\n type=\"button\" class=\"btn btn-primary d-flex align-items-center gap-2 position-absolute bg-white shadow-sm\"\r\n [disabled]=\"isSavingLayout\" (click)=\"updateLayout(true)\">\r\n <span *ngIf=\"isSavingLayout\" class=\"spinner-border spinner-border-sm\" role=\"status\"\r\n aria-hidden=\"true\"></span>\r\n Save\r\n </button>\r\n\r\n <!-- Download Button -->\r\n <button *ngIf=\"selectedView === 'detail'\" style=\"top: 24px; right: 26px\" type=\"button\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n (click)=\"downloadCanvas()\">\r\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n 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\" stroke=\"#CCCCCC\"\r\n 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 <!-- 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 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 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 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 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\" 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\" role=\"tab\">\r\n Products\r\n </a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\" *ngIf=\"editFromTab !== 'zone'\">\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\" [revertOnEdit]=\"shouldRevertOnEdit\"\r\n [zoneEditMode]=\"editFromTab === 'zone'\" (submitEvent)=\"onFixtureSubmit($event)\">\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\" [isSubmitted]=\"submitFixture\"\r\n [revertOnEdit]=\"shouldRevertOnEdit\" [zoneEditMode]=\"editFromTab === 'zone'\"\r\n (submitEvent)=\"onFixtureSubmit($event)\">\r\n </lib-instance-products>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"editFixtureSection === 'vms' && editFromTab !== 'zone'\">\r\n <lib-instance-vms [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\" [isSubmitted]=\"submitFixture\"\r\n [revertOnEdit]=\"shouldRevertOnEdit\" (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' : editFixture || showLayout ? '340px' : activeFeedbackTab === 'fixture' ? '1050px' : '750px'}\">\r\n <ng-container *ngTemplateOutlet=\"feedbackCol\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</section>\r\n\r\n<!-- Templates -->\r\n<ng-template #feedbackCol>\r\n <div class=\"s-card s-card--tabbed\" [ngStyle]=\"{'margin-top':editFixture ? '72px' : '0px'}\">\r\n <!-- @if(showFixturePreview && !isRightPanelCollapsed){\r\n <fixture-preview [fixtureData]=\"selectedFixture?.fixtureData\"></fixture-preview>\r\n } -->\r\n\r\n <ul class=\"nav nav-pills feedback-tabs\" role=\"tablist\"\r\n [ngClass]=\"{ 'd-none': isRightPanelCollapsed && !editFixture }\">\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"onFeedbackTabChange('fixture')\" [ngClass]=\"activeFeedbackTab === 'fixture' ? 'active' : ''\"\r\n class=\"nav-link\" role=\"tab\">\r\n Fixture Verification\r\n </a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"onFeedbackTabChange('zone')\" [ngClass]=\"activeFeedbackTab === 'zone' ? 'active' : ''\"\r\n class=\"nav-link d-flex align-items-center gap-2\" role=\"tab\">\r\n Zone Verification\r\n <span *ngIf=\"zonePendingCount > 0\" class=\"badge feedback-tab-badge\">\r\n {{ zonePendingCount }}\r\n </span>\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n <div class=\"feedback-tab-content\">\r\n <ng-container *ngIf=\"activeFeedbackTab === 'fixture'\">\r\n <div *ngIf=\"showLayout && !isRightPanelCollapsed\">\r\n <div class=\"card-body\">\r\n\r\n <!-- Title -->\r\n <div class=\"storeTitle mb-3\">Store response</div>\r\n <hr>\r\n\r\n <!-- Section Header -->\r\n <div class=\"d-flex justify-content-between align-items-center mb-1\">\r\n <h5 class=\"subTitle fw-semibold mb-0\">Fixture verification</h5>\r\n <i class=\"bi bi-chevron-up text-muted cursor-pointer\" (click)=\"toggle = !toggle\" *ngIf=\"!toggle\"></i>\r\n <i class=\"bi bi-chevron-down text-muted cursor-pointer\" (click)=\"toggle = !toggle\" *ngIf=\"toggle\"></i>\r\n </div>\r\n <div class=\"smallText text-muted d-block mb-4\">\r\n Assigned on: {{storeFeedback?.fixtureData?.[0]?.taskData?.createdAt | date:'dd MMM YYY, hh:mm:SS a'}}\r\n </div>\r\n\r\n\r\n <div *ngIf=\"toggle\" class=\"mt-10\">\r\n <!-- Column Headings -->\r\n <div class=\"row text-muted small fw-semibold mb-5\">\r\n <div class=\"col-6\"></div>\r\n <div class=\"col-3 text-center lightText\">Before</div>\r\n <div class=\"col-3 text-center lightText\">After</div>\r\n </div>\r\n\r\n <!-- Wall Fixtures -->\r\n <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n <div class=\"col-6\">Wall Fixtures</div>\r\n <div class=\"col-3 text-center\">\r\n {{wallCount - clCount}}\r\n </div>\r\n <div class=\"col-3 text-center fw-semibold\"\r\n [ngClass]=\"(wallCount - clCount) != storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures ? 'text-danger' : ''\">\r\n <i class=\"bi bi-arrow-up\"\r\n *ngIf=\"(wallCount - clCount) < storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures\"></i>\r\n <i class=\"bi bi-arrow-down\"\r\n *ngIf=\"(wallCount - clCount) > storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures\"></i>{{storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures}}\r\n </div>\r\n </div>\r\n\r\n <!-- Euro Centre Fixtures -->\r\n <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n <div class=\"col-6\">Euro Centre Fixtures</div>\r\n <div class=\"col-3 text-center\">{{floorData.centerFixture.length}}</div>\r\n <div class=\"col-3 text-center fw-semibold\"\r\n [ngClass]=\"floorData.centerFixture.length != storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures ? 'text-danger' : ''\">\r\n <i class=\"bi bi-arrow-down\"\r\n *ngIf=\"floorData.centerFixture.length > storeFeedback.fixtureData[0]?.answers?.[0]?.floorFixtures\"></i>\r\n <i class=\"bi bi-arrow-up\"\r\n *ngIf=\"floorData.centerFixture.length < storeFeedback.fixtureData[0]?.answers?.[0]?.floorFixtures\"></i>\r\n {{storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures}}\r\n </div>\r\n </div>\r\n\r\n <!-- Contact Lenses -->\r\n <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n <div class=\"col-6\">Contact Lenses</div>\r\n <div class=\"col-3 text-center\">{{clCount}}</div>\r\n <div class=\"col-3 text-center fw-semibold\"\r\n [ngClass]=\"clCount != storeFeedback.fixtureData[0].answers?.[0]?.cl ? 'text-danger' : ''\">\r\n <i class=\"bi bi-arrow-down\" *ngIf=\"clCount > storeFeedback.fixtureData[0].answers?.[0]?.cl\"></i>\r\n <i class=\"bi bi-arrow-up\" *ngIf=\"clCount < storeFeedback.fixtureData[0].answers?.[0]?.cl\"></i>\r\n {{storeFeedback.fixtureData[0].answers?.[0]?.cl}}\r\n </div>\r\n </div>\r\n\r\n <hr>\r\n\r\n <!-- Total Section -->\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-6 fw-semibold totalText\">Total</div>\r\n <div class=\"col-3 text-center totalText\">\r\n <div class=\"total-box\">{{floorData.fixtureCount}}</div>\r\n </div>\r\n <div class=\"col-3 text-center totalText\">\r\n <div class=\"total-box\"\r\n [ngClass]=\"floorData.fixtureCount !== (storeFeedback.fixtureData[0].answers?.[0]?.cl + storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures + storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures) ? 'text-center' :''\">\r\n {{storeFeedback.fixtureData[0].answers?.[0]?.cl + storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures + storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (storeFeedback.fixtureData[0]?.answers?.[0]?.comments.length) {\r\n <div id=\"fixture-comments\" class=\"mt-10\">\r\n <h5 class=\"mb-2\">Comments</h5>\r\n\r\n <div class=\"log-block\"\r\n *ngFor=\"let c of storeFeedback.fixtureData[0]?.answers[0]?.comments;let i= index\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.timeStamp | date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n\r\n @if(c?.responsetype === 'comment'){\r\n <h5>{{c?.comment}}</h5>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <lib-verification-feedback [floorData]=\"floorData\"\r\n [ngClass]=\"{ 'd-none': isRightPanelCollapsed && !editFixture}\" [feedbackDetails]=\"selectedFixtureFeedback\"\r\n (changeFixture)=\"onChangeFixtureOnFeedbackPanel($event,true)\" [totalFixtures]=\"allFixtureInstances\"\r\n [cdn]=\"cdnUrl\" (action)=\"handleFeedbackAction($event)\" [showAction]=\"!editFixture\"\r\n *ngIf=\"!showLayout\"></lib-verification-feedback>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"activeFeedbackTab === 'zone'\">\r\n <lib-zone-verification-feedback [floorData]=\"floorData\" [feedbackDetails]=\"selectedFixtureFeedback\"\r\n [zoneTask]=\"zoneFeedback?.zoneVerificationTask\" [zoneFeedback]=\"selectedZoneFeedback\"\r\n [totalFixtures]=\"allFixtureInstances\" [cdn]=\"cdnUrl\" [showAction]=\"!editFixture\"\r\n (changeFixture)=\"onChangeFixtureOnFeedbackPanel($event,true)\" (action)=\"handleFeedbackAction($event)\"\r\n [ngClass]=\"{ 'd-none': isRightPanelCollapsed && !editFixture }\"></lib-zone-verification-feedback>\r\n </ng-container>\r\n </div>\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\r\n<ng-template #noStoreVideo let-modal>\r\n <div class=\"modal-body\">\r\n <div>\r\n <h2 class=\"mb-3\">No Store Video Found</h2>\r\n <p>The video will be available once a request is raised and the store submits a complete store video.</p>\r\n </div>\r\n <div class=\"d-flex justify-content-end\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\">Close</button>\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>\r\n <h2 class=\"mb-3\">Apply IVM Logics</h2>\r\n <p>This will analyze the current layout and apply the pre-defined fixture logics.</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()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"applyPIDLogics()\">Proceed</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 layout/plan</h2>\r\n <p>\r\n Are you sure you want to approve the layout? Please ensure it has been thoroughly reviewed before approving.\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()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"approveLayout()\">\r\n <span *ngIf=\"!isButtonLoading\">Approve</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>", 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}::ng-deep .backgroundImg{background-color:#f9fafb!important}::ng-deep .accordion .accordion-button.backgroundImg:not(.collapsed){background-color:#f9fafb!important}::ng-deep .accordion-body{padding:10px 20px 20px}.s-card{position:relative;box-sizing:border-box;border-radius:8px;background:#fff;padding:20px 16px;height:75dvh;overflow-y:auto;overflow-x:visible}.card-publish-btn{flex-shrink:0;font-family:Inter;font-weight:600;font-size:12px;line-height:16px;padding:6px 10px;border-radius:6px;border:1px solid #009bf3;background:#009bf3;color:#fff;white-space:nowrap;cursor:pointer;box-shadow:0 1px 2px #1018280d}.card-publish-btn:hover:not(:disabled){background:#0084d1;border-color:#0084d1}.card-publish-btn:disabled{opacity:.5;cursor:not-allowed}.card-revoke-btn{flex-shrink:0;display:inline-flex;align-items:center;gap:4px;font-family:Inter;font-weight:600;font-size:12px;line-height:16px;padding:6px 10px;border-radius:6px;border:1px solid #fda29b;background:#fef3f2;color:#b42318;white-space:nowrap;cursor:pointer;box-shadow:0 1px 2px #1018280d}.card-revoke-btn:hover:not(:disabled){background:#fee4e2}.card-revoke-btn:disabled{opacity:.5;cursor:not-allowed}.s-card.s-card--tabbed{display:flex;flex-direction:column;padding:12px 16px 0;overflow:hidden}.s-card.s-card--tabbed .feedback-tabs{flex-shrink:0;margin:0 0 8px;padding:0}.s-card.s-card--tabbed .feedback-tabs .nav-link .badge.feedback-tab-badge{background-color:#eaf8ff;color:#009bf3;font-size:11px;font-weight:600;padding:2px 8px;border-radius:10px}.s-card.s-card--tabbed .feedback-tabs .nav-link.active .badge.feedback-tab-badge{background-color:#009bf3;color:#fff}.s-card.s-card--tabbed .feedback-tab-content{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}.s-card.s-card--tabbed .feedback-tab-content>*{flex:1 1 auto;min-height:0;display:block}.c-card{border-radius:8px;background:#fff;padding:20px 16px;height:75dvh;overflow:hidden;width:100%}.h-card{border-radius:8px;background:#fff;padding:20px 16px;min-height:20dvh}.wall-label{color:var(--Gray-600, #475467);font-family:Inter;font-size:14px;font-style:normal;font-weight:600}img{width:100%;height:100%;object-fit:cover;display:block}#header .filter-tab{min-width:180px}#header .title{color:var(--Gray-800, #1d2939);font-size:16px;font-weight:600;line-height:24px;margin:0;white-space:nowrap}#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;white-space:nowrap;flex-shrink:0;cursor:pointer}#header .cus-btn:hover{background:#e2f5ff}#header .updateClass{white-space:nowrap}@media (max-width: 1500px){#header [ngbAccordionHeader]{padding-left:1rem!important;padding-right:1rem!important;gap:.5rem}#header .gap-4{gap:.75rem!important}#header .title{font-size:14px;line-height:20px}#header .cus-btn{padding:3px 8px;font-size:12px}#header .updateClass{font-size:12px;line-height:18px}#header .row.gap-3{gap:.5rem!important}#header .filter-tab{min-width:170px;padding:.75rem}#header .filter-tab h3{font-size:14px;line-height:20px}#header .filter-tab .indicator{font-size:12px}}@media (max-width: 1300px){#header [ngbAccordionHeader]{padding-left:.75rem!important;padding-right:.75rem!important}#header .title{font-size:13px}#header .cus-btn{font-size:11px;padding:2px 6px}#header .updateClass{font-size:11px}#header .filter-tab{min-width:150px}#header .filter-tab h3{font-size:13px}}.loader .shimmer{height:100%!important}.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}.collapse-handler.right{right:0}.collapse-handler.left{left:0}.collapsed-col{transition:all .3s ease;width:40px!important}[class^=col]{transition:all .3s ease}#segment-btn .custom-tabs{border-radius:8px;border:1px solid var(--Gray-300, #d0d5dd);overflow:hidden;margin-bottom:24px}#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}#segment-btn .custom-tabs .nav-link.active{background:var(--Primary-500, #33b5ff);color:#fff}#segment-btn .nav-tabs .nav-link{border:none;margin:0}#segment-btn .nav-item{text-align:center}#segment-btn .nav-item:last-child .nav-link{border:none}.link-btn{color:#33b5ff;cursor:pointer;font-weight:500}.link-btn:hover{color:#33b5ff;text-decoration:underline!important}.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}.updateClass{font-family:Inter;font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#667085}.btn .spinner{height:22px;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)}}.storeTitle{font-family:Inter;font-weight:600;font-size:16px;line-height:24px;letter-spacing:0%;color:#101828}.subTitle{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;letter-spacing:0%;color:#1d2939}.smallText{font-family:Inter;font-weight:400;font-size:14px;color:#667085;line-height:20px;letter-spacing:0%}.wallText{font-family:Inter;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;color:#1d2939}.totalText{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;letter-spacing:0%;color:#1d2939}.lightText{font-family:Inter;font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;text-align:center;vertical-align:middle;color:#344054}.total-box{background-color:#f3f4f6;border-radius:8px;padding:8px 0;font-weight:600}.bi-arrow-up,.bi-arrow-down{color:#dc3545}.log-block{display:flex;gap:12px;padding:4px;margin-bottom:18px}.log-block h4{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}.log-block p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085;margin:0}.fixture-row{border-radius:8px;transition:background-color .2s ease,box-shadow .2s ease}.fixture-row.highlighted-fixture{background-color:#eaf8ff;box-shadow:0 0 0 2px #33b5ff}\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.StorePlanoTreeViewComponent, selector: "store-plano-tree-view", inputs: ["allFixture"], outputs: ["selectedInstance"] }, { kind: "component", type: i14.CustomSelectComponent, selector: "lib-select-plano", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label", "compact"], outputs: ["selected"] }, { kind: "component", type: i15.VerificationFeedbackComponent, selector: "lib-verification-feedback", inputs: ["floorData", "totalFixtures", "feedbackDetails", "cdn", "showAction"], outputs: ["changeFixture", "action"] }, { kind: "component", type: i16.ZoneVerificationFeedbackComponent, selector: "lib-zone-verification-feedback", inputs: ["floorData", "feedbackDetails", "zoneTask", "zoneFeedback", "totalFixtures", "cdn", "showAction"], outputs: ["changeFixture", "action"] }, { kind: "pipe", type: i5.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i5.DatePipe, name: "date" }] });
4962
4962
  }
4963
4963
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ManageStorePlanoComponent, decorators: [{
4964
4964
  type: Component,
4965
- args: [{ selector: "lib-manage-store-plano", providers: [TitleCasePipe], template: "<section id=\"manage-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 class=\"d-flex align-items-center\">\r\n <div style=\"margin-left:5px;margin-right:5px\" *ngIf=\"planoData?.storeName\">\r\n <h2 class='title'>{{planoData?.storeName}} - Plano</h2>\r\n </div>\r\n <div>\r\n <lib-select-plano *ngIf=\"storeList?.length\" [idField]=\"'_id'\" [selectedValues]=\"[selectedStoreName]\"\r\n [items]=\"storeList\" [multi]=false searchField=\"storeName\" (selected)=\"onSelected($event)\">\r\n </lib-select-plano>\r\n </div>\r\n </div>\r\n\r\n <lib-reactive-select *ngIf=\"floorsList.length && !isPageLoading\" [formControl]=\"selectedFloorId\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorsList\">\r\n </lib-reactive-select>\r\n\r\n <div class=\"cus-btn\" [class.disabled-click]=\"isStoreTourLoading\" (click)=\"goToStoreTourPage()\">\r\n View store tour\r\n\r\n <svg *ngIf=\"!isStoreTourLoading\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_408_16498)\">\r\n <path\r\n d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\"\r\n stroke=\"#33B5FF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M5 4L8 6L5 8V4Z\" stroke=\"#33B5FF\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_408_16498\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <span *ngIf=\"isStoreTourLoading\" class=\"spinner-border spinner-border-sm\" role=\"status\"\r\n aria-hidden=\"true\"></span>\r\n\r\n </div>\r\n <div class=\"cus-btn\" (click)=\"goToStoreCameraPage()\">\r\n View camera\r\n\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_422_36321)\">\r\n <path\r\n d=\"M9 6.5V9.5C9 9.76522 8.89464 10.0196 8.70711 10.2071C8.51957 10.3946 8.26522 10.5 8 10.5H2.5C2.23478 10.5 1.98043 10.3946 1.79289 10.2071C1.60536 10.0196 1.5 9.76522 1.5 9.5V4C1.5 3.73478 1.60536 3.48043 1.79289 3.29289C1.98043 3.10536 2.23478 3 2.5 3H5.5M7.5 1.5H10.5M10.5 1.5V4.5M10.5 1.5L5 7\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_422_36321\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n\r\n </div>\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?.lastUpdate}}</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\" (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\r\n <!-- Normal Mode: per-task publish buttons live inside their respective cards below.\r\n Top-right shows the final overall \"Publish\" once layout+fixture+vm are approved.\r\n When a zone task exists and isn't Approved yet, the button stays visible but\r\n disabled (so the store can't be published until zone verification completes).\r\n Legacy stores without a zone task are unblocked immediately. -->\r\n <ng-container *ngIf=\"showTopPublish\">\r\n <div class=\"indicator completed\" *ngIf=\"floorData?.verificationStatus\">Published</div>\r\n <button *ngIf=\"!floorData?.verificationStatus\" type=\"button\" class=\"btn btn-primary text-nowrap\"\r\n (click)=\"publish()\" [disabled]=\"topPublishDisabled\">\r\n Publish\r\n </button>\r\n </ng-container>\r\n\r\n\r\n\r\n <!-- Revoke buttons live inside their respective cards (Layout / Fixtures / VM / Zone) below. -->\r\n\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 <ng-template>\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\" fill=\"none\"\r\n 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\" 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 taskInfo?.planoProgress <= 50\r\n ? 'bg-warning'\r\n : taskInfo?.planoProgress === 75\r\n ? 'bg-primary'\r\n : 'bg-success'\r\n \" role=\"progressbar\" [style]=\"'width:' + taskInfo?.planoProgress + '%'\"\r\n [attr.aria-valuenow]=\"taskInfo?.planoProgress\" aria-valuemin=\"0\" aria-valuemax=\"100\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-3\">{{ taskInfo?.planoProgress }}%</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Layout -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n <div class=\"flex-grow-1\">\r\n <h3><b>{{ storeMetrics.floorCount }}</b> Layout</h3>\r\n <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.layout.class\">\r\n <span class=\"me-2\" [hidden]=\"taskStyle.layout.name !== 'Redo'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_4984_27569)\">\r\n <path\r\n d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4984_27569\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span [hidden]=\"taskStyle.layout.name !== 'Flagged'\" class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n {{ taskStyle.layout.name }}\r\n </div>\r\n </div>\r\n <!-- Layout actions disabled for now \u2014 no layout-related actions are needed.\r\n <button *ngIf=\"!editFixture && (publishingState === 'layout' || publishingState === 'layout-redo') && taskStyle.layout.class !== 'taskAssigned' && taskStyle.layout.class !== 'completed' && taskStyle.fixture.class !== 'taskAssigned'\"\r\n type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n {{ publishingState === 'layout-redo' ? 'Publish Layout Redo' : 'Publish Layout Verification' }}\r\n </button>\r\n <button *ngIf=\"!editFixture && taskStyle.layout.class === 'taskAssigned'\" type=\"button\"\r\n class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_640_5594lay)\">\r\n <path\r\n d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_640_5594lay\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Revoke\r\n </button>\r\n -->\r\n </div>\r\n </div>\r\n\r\n <!-- Fixtures -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n <div class=\"flex-grow-1\">\r\n <h3><b>{{ storeMetrics.fixtureCount }}</b> Fixtures</h3>\r\n <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.fixture.class\">\r\n <span class=\"me-2\" [hidden]=\"taskStyle.fixture.name !== 'Redo'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_4984_27569)\">\r\n <path\r\n d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4984_27569\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span [hidden]=\"taskStyle.fixture.name !== 'Flagged'\" class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n {{ taskStyle.fixture.name }}\r\n </div>\r\n </div>\r\n <button *ngIf=\"!editFixture && (publishingState === 'fixture' || publishingState === 'fixture-redo') && taskStyle.fixture.class !== 'taskAssigned'\"\r\n type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n {{ publishingState === 'fixture-redo' ? 'Publish Redo' : 'Publish Task' }}\r\n </button>\r\n <button *ngIf=\"!editFixture && taskStyle.fixture.class === 'taskAssigned'\" type=\"button\"\r\n class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_640_5594fix)\">\r\n <path\r\n d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_640_5594fix\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Revoke\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Visual Merchandise -->\r\n <!--\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <div class=\"d-flex flex-column gap-2\">\r\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\r\n <h3 class=\"m-0\"><b>{{ storeMetrics.vmCount }}</b> Visual Merchandise</h3>\r\n <div class=\"indicator\" [ngClass]=\"taskStyle.vm.class\">\r\n <span class=\"me-2\" [hidden]=\"taskStyle.vm.name !== 'Redo'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_4984_27569)\">\r\n <path\r\n d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4984_27569\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span [hidden]=\"taskStyle.vm.name !== 'Flagged'\" class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n {{ taskStyle.vm.name }}\r\n </div>\r\n </div>\r\n <button *ngIf=\"!editFixture && (publishingState === 'vm' || publishingState === 'vm-redo') && taskStyle.vm.class !== 'taskAssigned'\"\r\n type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n {{ publishingState === 'vm-redo' ? 'Publish Redo' : 'Publish' }}\r\n </button>\r\n <button *ngIf=\"!editFixture && taskStyle.vm.class === 'taskAssigned'\" type=\"button\"\r\n class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_640_5594vm)\">\r\n <path\r\n d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_640_5594vm\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Revoke\r\n </button>\r\n </div>\r\n </div>\r\n -->\r\n\r\n <!-- Zone Verification -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n <div class=\"flex-grow-1\">\r\n <h3>Zone Verification</h3>\r\n <div class=\"indicator mt-2\" [ngClass]=\"zoneTaskStyle.class\">\r\n <span class=\"me-2\" [hidden]=\"zoneTaskStyle.name !== 'Redo'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_4984_27569)\">\r\n <path\r\n d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4984_27569\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n {{ zoneTaskStyle.name }}\r\n </div>\r\n </div>\r\n <button *ngIf=\"!editFixture && !zoneFeedback?.zoneVerificationTask\" type=\"button\"\r\n class=\"card-publish-btn\" (click)=\"publishZoneVerification()\">\r\n Publish Task\r\n </button>\r\n <button *ngIf=\"!editFixture && zoneRedoStatus\" type=\"button\"\r\n class=\"card-publish-btn\" (click)=\"publishZoneRedo()\">\r\n Publish Redo\r\n </button>\r\n <button *ngIf=\"!editFixture && zoneTaskStyle.class === 'taskAssigned'\" type=\"button\"\r\n class=\"card-revoke-btn\" (click)=\"revokeZoneTask()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_640_5594z)\">\r\n <path\r\n d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_640_5594z\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Revoke\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body -->\r\n <div id=\"body\" class=\"row\">\r\n <!-- Left Column -->\r\n <div [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\" 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 }} {{ 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\" height=\"18\" viewBox=\"0 0 18 18\"\r\n 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\" 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\" height=\"18\" viewBox=\"0 0 18 18\"\r\n 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\" 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\" height=\"18\" viewBox=\"0 0 18 18\"\r\n 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 (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 *ngFor=\"let fixture of getFormFixtures(i).controls; let j = index\">\r\n <div dndDropzone (dndDrop)=\"onDrop($event, i, j)\" [formGroupName]=\"j\"\r\n [dndDraggable]=\"{ wallIndex: i, fixtureIndex: j }\" [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 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\" 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 formControlName=\"fixtureConfigId\" [idField]=\"'_id'\"\r\n [nameField]=\"'name'\" [data]=\"fixtureTemplates\" [label]=\"'Fixture ' + (j + 1)\"\r\n [subTextField]=\"'subtext'\" [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\" width=\"10\" height=\"10\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" 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('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 *ngIf=\"getWallOtherElements(i).controls.length\">\r\n <div formArrayName=\"otherElements\">\r\n <ng-container *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 {{ j + 1 }}</label>\r\n\r\n <!-- Dropdown bound to 'type' -->\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"otherElementList\" [id]=\"'elementLabel' + j\" formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <!-- Show custom text input only when 'Others' is selected -->\r\n <input *ngIf=\"(fixture.get('type')?.value) === 'Others'\" type=\"text\"\r\n class=\"form-control mt-2\" 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\" width=\"10\" height=\"10\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" 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('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 (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 *ngFor=\"let fixture of getFormFloorFixtures.controls; let j = index\">\r\n <div dndDropzone (dndDrop)=\"onDrop($event, 'floor', j)\" [formGroupName]=\"j\"\r\n [dndDraggable]=\"{ wallIndex: 'floor', fixtureIndex: j }\" [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 class=\"d-flex align-items-center justify-content-center h-100\">\r\n <svg dndDragImageRef style=\"cursor: move; opacity: 0.5\" width=\"25px\"\r\n viewBox=\"0 0 16 16\" 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 formControlName=\"fixtureConfigId\" [idField]=\"'_id'\"\r\n [nameField]=\"'name'\" [data]=\"fixtureTemplates\" [label]=\"'Fixture ' + (j + 1)\"\r\n [search]=\"true\" [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\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" 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 *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 {{ j + 1 }}</label>\r\n\r\n <!-- Dropdown for type -->\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"otherElementList\" [id]=\"'floorElementLabel' + j\" formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <!-- Conditional input for custom name -->\r\n <input *ngIf=\"(fixture.get('type')?.value) === 'Others'\" type=\"text\"\r\n class=\"form-control mt-2\" 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\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" 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 <div [ngClass]=\"{ 'd-none': selectedView === 'tree' }\">\r\n <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n </div>\r\n\r\n <!-- Tree View -->\r\n <div *ngIf=\"selectedView === 'tree'\" class=\"w-100\">\r\n <store-plano-tree-view [allFixture]=\"allFixtures\"></store-plano-tree-view>\r\n </div>\r\n\r\n <!-- Top Controls -->\r\n <div style=\"top: 24px; left: 26px; position: absolute;\" id=\"segment-btn\" class=\"pb-5\">\r\n <div class=\"w-100 d-flex justify-content-start gap-4\">\r\n <ul class=\"nav nav-tabs custom-tabs d-flex\" style=\"width: 200px; margin: 0\">\r\n <li class=\"nav-item flex-fill\">\r\n <button class=\"nav-link w-100 h-100\" [class.active]=\"selectedView === 'detail'\"\r\n (click)=\"selectedView = 'detail'\">\r\n Detail View\r\n </button>\r\n </li>\r\n <li class=\"nav-item flex-fill\">\r\n <button class=\"nav-link w-100 h-100\" [class.active]=\"selectedView === 'tree'\"\r\n (click)=\"selectedView = 'tree'\">\r\n Tree View\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <!-- PID Allocation -->\r\n <!-- <div *ngIf=\"layoutForm.disabled\" style=\"top: 24px; left: 234px\"\r\n class=\"position-absolute\">\r\n <button type=\"button\" style=\"padding: 9px 19px !important;\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n [disabled]=\"getEntrances?.length >= 2\" (click)=\"onClickApplyLogics()\">\r\n Apply Logics\r\n </button>\r\n </div> -->\r\n\r\n <!-- Entrance Button -->\r\n <div *ngIf=\"layoutForm.enabled\" ngbTooltip=\"You can add up to two entrances.\" style=\"top: 24px; left: 234px\"\r\n class=\"position-absolute\" [disableTooltip]=\"getEntrances?.length < 2\">\r\n <button type=\"button\" style=\"padding: 9px 19px !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 <div *ngIf=\"layoutForm.enabled\" style=\"top: 24px; right: 192px\" class=\"position-absolute\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n (click)=\"cancelEdit()\">\r\n Cancel\r\n </button>\r\n </div>\r\n\r\n\r\n <!-- Edit Button -->\r\n <button *ngIf=\"layoutForm.disabled && selectedView === 'detail'\"\r\n [disabled]=\"disableEdit || ['taskAssigned'].includes(taskStyle.fixture.class) || (taskStyle.fixture.class == 'reviewPending' && !showLayout)\"\r\n style=\"top: 24px; right: 164px\" type=\"button\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute 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\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n\r\n <!-- Rotate Button -->\r\n <button style=\"top: 24px; right: 94px\" type=\"button\" *ngIf=\"layoutForm.disabled && selectedView === 'detail'\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute 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\" 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 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 <!-- Submit Button -->\r\n <button *ngIf=\"!layoutForm.disabled\"\r\n style=\"top: 24px; right: 94px;padding: 9px 20px !important;min-width: 90px;justify-content: center;\"\r\n type=\"button\" class=\"btn btn-primary d-flex align-items-center gap-2 position-absolute bg-white shadow-sm\"\r\n [disabled]=\"isSavingLayout\" (click)=\"updateLayout(true)\">\r\n <span *ngIf=\"isSavingLayout\" class=\"spinner-border spinner-border-sm\" role=\"status\"\r\n aria-hidden=\"true\"></span>\r\n Save\r\n </button>\r\n\r\n <!-- Download Button -->\r\n <button *ngIf=\"selectedView === 'detail'\" style=\"top: 24px; right: 26px\" type=\"button\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n (click)=\"downloadCanvas()\">\r\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n 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\" stroke=\"#CCCCCC\"\r\n 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 <!-- 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 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 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 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 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\" 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\" role=\"tab\">\r\n Products\r\n </a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\" *ngIf=\"editFromTab !== 'zone'\">\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\" [revertOnEdit]=\"shouldRevertOnEdit\"\r\n [zoneEditMode]=\"editFromTab === 'zone'\" (submitEvent)=\"onFixtureSubmit($event)\">\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\" [isSubmitted]=\"submitFixture\"\r\n [revertOnEdit]=\"shouldRevertOnEdit\" [zoneEditMode]=\"editFromTab === 'zone'\"\r\n (submitEvent)=\"onFixtureSubmit($event)\">\r\n </lib-instance-products>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"editFixtureSection === 'vms' && editFromTab !== 'zone'\">\r\n <lib-instance-vms [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\" [isSubmitted]=\"submitFixture\"\r\n [revertOnEdit]=\"shouldRevertOnEdit\" (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' : editFixture || showLayout ? '340px' : activeFeedbackTab === 'fixture' ? '1050px' : '750px'}\">\r\n <ng-container *ngTemplateOutlet=\"feedbackCol\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</section>\r\n\r\n<!-- Templates -->\r\n<ng-template #feedbackCol>\r\n <div class=\"s-card s-card--tabbed\" [ngStyle]=\"{'margin-top':editFixture ? '72px' : '0px'}\">\r\n <!-- @if(showFixturePreview && !isRightPanelCollapsed){\r\n <fixture-preview [fixtureData]=\"selectedFixture?.fixtureData\"></fixture-preview>\r\n } -->\r\n\r\n <ul class=\"nav nav-pills feedback-tabs\" role=\"tablist\"\r\n [ngClass]=\"{ 'd-none': isRightPanelCollapsed && !editFixture }\">\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"onFeedbackTabChange('fixture')\" [ngClass]=\"activeFeedbackTab === 'fixture' ? 'active' : ''\"\r\n class=\"nav-link\" role=\"tab\">\r\n Fixture Verification\r\n </a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"onFeedbackTabChange('zone')\" [ngClass]=\"activeFeedbackTab === 'zone' ? 'active' : ''\"\r\n class=\"nav-link d-flex align-items-center gap-2\" role=\"tab\">\r\n Zone Verification\r\n <span *ngIf=\"zonePendingCount > 0\" class=\"badge feedback-tab-badge\">\r\n {{ zonePendingCount }}\r\n </span>\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n <div class=\"feedback-tab-content\">\r\n <ng-container *ngIf=\"activeFeedbackTab === 'fixture'\">\r\n <div *ngIf=\"showLayout && !isRightPanelCollapsed\">\r\n <div class=\"card-body\">\r\n\r\n <!-- Title -->\r\n <div class=\"storeTitle mb-3\">Store response</div>\r\n <hr>\r\n\r\n <!-- Section Header -->\r\n <div class=\"d-flex justify-content-between align-items-center mb-1\">\r\n <h5 class=\"subTitle fw-semibold mb-0\">Fixture verification</h5>\r\n <i class=\"bi bi-chevron-up text-muted cursor-pointer\" (click)=\"toggle = !toggle\" *ngIf=\"!toggle\"></i>\r\n <i class=\"bi bi-chevron-down text-muted cursor-pointer\" (click)=\"toggle = !toggle\" *ngIf=\"toggle\"></i>\r\n </div>\r\n <div class=\"smallText text-muted d-block mb-4\">\r\n Assigned on: {{storeFeedback?.fixtureData?.[0]?.taskData?.createdAt | date:'dd MMM YYY, hh:mm:SS a'}}\r\n </div>\r\n\r\n\r\n <div *ngIf=\"toggle\" class=\"mt-10\">\r\n <!-- Column Headings -->\r\n <div class=\"row text-muted small fw-semibold mb-5\">\r\n <div class=\"col-6\"></div>\r\n <div class=\"col-3 text-center lightText\">Before</div>\r\n <div class=\"col-3 text-center lightText\">After</div>\r\n </div>\r\n\r\n <!-- Wall Fixtures -->\r\n <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n <div class=\"col-6\">Wall Fixtures</div>\r\n <div class=\"col-3 text-center\">\r\n {{wallCount - clCount}}\r\n </div>\r\n <div class=\"col-3 text-center fw-semibold\"\r\n [ngClass]=\"(wallCount - clCount) != storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures ? 'text-danger' : ''\">\r\n <i class=\"bi bi-arrow-up\"\r\n *ngIf=\"(wallCount - clCount) < storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures\"></i>\r\n <i class=\"bi bi-arrow-down\"\r\n *ngIf=\"(wallCount - clCount) > storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures\"></i>{{storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures}}\r\n </div>\r\n </div>\r\n\r\n <!-- Euro Centre Fixtures -->\r\n <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n <div class=\"col-6\">Euro Centre Fixtures</div>\r\n <div class=\"col-3 text-center\">{{floorData.centerFixture.length}}</div>\r\n <div class=\"col-3 text-center fw-semibold\"\r\n [ngClass]=\"floorData.centerFixture.length != storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures ? 'text-danger' : ''\">\r\n <i class=\"bi bi-arrow-down\"\r\n *ngIf=\"floorData.centerFixture.length > storeFeedback.fixtureData[0]?.answers?.[0]?.floorFixtures\"></i>\r\n <i class=\"bi bi-arrow-up\"\r\n *ngIf=\"floorData.centerFixture.length < storeFeedback.fixtureData[0]?.answers?.[0]?.floorFixtures\"></i>\r\n {{storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures}}\r\n </div>\r\n </div>\r\n\r\n <!-- Contact Lenses -->\r\n <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n <div class=\"col-6\">Contact Lenses</div>\r\n <div class=\"col-3 text-center\">{{clCount}}</div>\r\n <div class=\"col-3 text-center fw-semibold\"\r\n [ngClass]=\"clCount != storeFeedback.fixtureData[0].answers?.[0]?.cl ? 'text-danger' : ''\">\r\n <i class=\"bi bi-arrow-down\" *ngIf=\"clCount > storeFeedback.fixtureData[0].answers?.[0]?.cl\"></i>\r\n <i class=\"bi bi-arrow-up\" *ngIf=\"clCount < storeFeedback.fixtureData[0].answers?.[0]?.cl\"></i>\r\n {{storeFeedback.fixtureData[0].answers?.[0]?.cl}}\r\n </div>\r\n </div>\r\n\r\n <hr>\r\n\r\n <!-- Total Section -->\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-6 fw-semibold totalText\">Total</div>\r\n <div class=\"col-3 text-center totalText\">\r\n <div class=\"total-box\">{{floorData.fixtureCount}}</div>\r\n </div>\r\n <div class=\"col-3 text-center totalText\">\r\n <div class=\"total-box\"\r\n [ngClass]=\"floorData.fixtureCount !== (storeFeedback.fixtureData[0].answers?.[0]?.cl + storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures + storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures) ? 'text-center' :''\">\r\n {{storeFeedback.fixtureData[0].answers?.[0]?.cl + storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures + storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (storeFeedback.fixtureData[0]?.answers?.[0]?.comments.length) {\r\n <div id=\"fixture-comments\" class=\"mt-10\">\r\n <h5 class=\"mb-2\">Comments</h5>\r\n\r\n <div class=\"log-block\"\r\n *ngFor=\"let c of storeFeedback.fixtureData[0]?.answers[0]?.comments;let i= index\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.timeStamp | date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n\r\n @if(c?.responsetype === 'comment'){\r\n <h5>{{c?.comment}}</h5>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <lib-verification-feedback [floorData]=\"floorData\"\r\n [ngClass]=\"{ 'd-none': isRightPanelCollapsed && !editFixture}\" [feedbackDetails]=\"selectedFixtureFeedback\"\r\n (changeFixture)=\"onChangeFixtureOnFeedbackPanel($event,true)\" [totalFixtures]=\"allFixtureInstances\"\r\n [cdn]=\"cdnUrl\" (action)=\"handleFeedbackAction($event)\" [showAction]=\"!editFixture\"\r\n *ngIf=\"!showLayout\"></lib-verification-feedback>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"activeFeedbackTab === 'zone'\">\r\n <lib-zone-verification-feedback [floorData]=\"floorData\" [feedbackDetails]=\"selectedFixtureFeedback\"\r\n [zoneTask]=\"zoneFeedback?.zoneVerificationTask\" [zoneFeedback]=\"selectedZoneFeedback\"\r\n [totalFixtures]=\"allFixtureInstances\" [cdn]=\"cdnUrl\" [showAction]=\"!editFixture\"\r\n (changeFixture)=\"onChangeFixtureOnFeedbackPanel($event,true)\" (action)=\"handleFeedbackAction($event)\"\r\n [ngClass]=\"{ 'd-none': isRightPanelCollapsed && !editFixture }\"></lib-zone-verification-feedback>\r\n </ng-container>\r\n </div>\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\r\n<ng-template #noStoreVideo let-modal>\r\n <div class=\"modal-body\">\r\n <div>\r\n <h2 class=\"mb-3\">No Store Video Found</h2>\r\n <p>The video will be available once a request is raised and the store submits a complete store video.</p>\r\n </div>\r\n <div class=\"d-flex justify-content-end\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\">Close</button>\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>\r\n <h2 class=\"mb-3\">Apply IVM Logics</h2>\r\n <p>This will analyze the current layout and apply the pre-defined fixture logics.</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()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"applyPIDLogics()\">Proceed</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 layout/plan</h2>\r\n <p>\r\n Are you sure you want to approve the layout? Please ensure it has been thoroughly reviewed before approving.\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()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"approveLayout()\">\r\n <span *ngIf=\"!isButtonLoading\">Approve</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>", 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}::ng-deep .backgroundImg{background-color:#f9fafb!important}::ng-deep .accordion .accordion-button.backgroundImg:not(.collapsed){background-color:#f9fafb!important}::ng-deep .accordion-body{padding:10px 20px 20px}.s-card{position:relative;box-sizing:border-box;border-radius:8px;background:#fff;padding:20px 16px;height:75dvh;overflow-y:auto;overflow-x:visible}.card-publish-btn{flex-shrink:0;font-family:Inter;font-weight:600;font-size:12px;line-height:16px;padding:6px 10px;border-radius:6px;border:1px solid #009bf3;background:#009bf3;color:#fff;white-space:nowrap;cursor:pointer;box-shadow:0 1px 2px #1018280d}.card-publish-btn:hover:not(:disabled){background:#0084d1;border-color:#0084d1}.card-publish-btn:disabled{opacity:.5;cursor:not-allowed}.card-revoke-btn{flex-shrink:0;display:inline-flex;align-items:center;gap:4px;font-family:Inter;font-weight:600;font-size:12px;line-height:16px;padding:6px 10px;border-radius:6px;border:1px solid #fda29b;background:#fef3f2;color:#b42318;white-space:nowrap;cursor:pointer;box-shadow:0 1px 2px #1018280d}.card-revoke-btn:hover:not(:disabled){background:#fee4e2}.card-revoke-btn:disabled{opacity:.5;cursor:not-allowed}.s-card.s-card--tabbed{display:flex;flex-direction:column;padding:12px 16px 0;overflow:hidden}.s-card.s-card--tabbed .feedback-tabs{flex-shrink:0;margin:0 0 8px;padding:0}.s-card.s-card--tabbed .feedback-tabs .nav-link .badge.feedback-tab-badge{background-color:#eaf8ff;color:#009bf3;font-size:11px;font-weight:600;padding:2px 8px;border-radius:10px}.s-card.s-card--tabbed .feedback-tabs .nav-link.active .badge.feedback-tab-badge{background-color:#009bf3;color:#fff}.s-card.s-card--tabbed .feedback-tab-content{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}.s-card.s-card--tabbed .feedback-tab-content>*{flex:1 1 auto;min-height:0;display:block}.c-card{border-radius:8px;background:#fff;padding:20px 16px;height:75dvh;overflow:hidden;width:100%}.h-card{border-radius:8px;background:#fff;padding:20px 16px;min-height:20dvh}.wall-label{color:var(--Gray-600, #475467);font-family:Inter;font-size:14px;font-style:normal;font-weight:600}img{width:100%;height:100%;object-fit:cover;display:block}#header .filter-tab{min-width:180px}#header .title{color:var(--Gray-800, #1d2939);font-size:16px;font-weight:600;line-height:24px;margin:0;white-space:nowrap}#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;white-space:nowrap;flex-shrink:0;cursor:pointer}#header .cus-btn:hover{background:#e2f5ff}#header .updateClass{white-space:nowrap}@media (max-width: 1500px){#header [ngbAccordionHeader]{padding-left:1rem!important;padding-right:1rem!important;gap:.5rem}#header .gap-4{gap:.75rem!important}#header .title{font-size:14px;line-height:20px}#header .cus-btn{padding:3px 8px;font-size:12px}#header .updateClass{font-size:12px;line-height:18px}#header .row.gap-3{gap:.5rem!important}#header .filter-tab{min-width:170px;padding:.75rem}#header .filter-tab h3{font-size:14px;line-height:20px}#header .filter-tab .indicator{font-size:12px}}@media (max-width: 1300px){#header [ngbAccordionHeader]{padding-left:.75rem!important;padding-right:.75rem!important}#header .title{font-size:13px}#header .cus-btn{font-size:11px;padding:2px 6px}#header .updateClass{font-size:11px}#header .filter-tab{min-width:150px}#header .filter-tab h3{font-size:13px}}.loader .shimmer{height:100%!important}.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}.collapse-handler.right{right:0}.collapse-handler.left{left:0}.collapsed-col{transition:all .3s ease;width:40px!important}[class^=col]{transition:all .3s ease}#segment-btn .custom-tabs{border-radius:8px;border:1px solid var(--Gray-300, #d0d5dd);overflow:hidden;margin-bottom:24px}#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}#segment-btn .custom-tabs .nav-link.active{background:var(--Primary-500, #33b5ff);color:#fff}#segment-btn .nav-tabs .nav-link{border:none;margin:0}#segment-btn .nav-item{text-align:center}#segment-btn .nav-item:last-child .nav-link{border:none}.link-btn{color:#33b5ff;cursor:pointer;font-weight:500}.link-btn:hover{color:#33b5ff;text-decoration:underline!important}.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}.updateClass{font-family:Inter;font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#667085}.btn .spinner{height:22px;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)}}.storeTitle{font-family:Inter;font-weight:600;font-size:16px;line-height:24px;letter-spacing:0%;color:#101828}.subTitle{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;letter-spacing:0%;color:#1d2939}.smallText{font-family:Inter;font-weight:400;font-size:14px;color:#667085;line-height:20px;letter-spacing:0%}.wallText{font-family:Inter;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;color:#1d2939}.totalText{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;letter-spacing:0%;color:#1d2939}.lightText{font-family:Inter;font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;text-align:center;vertical-align:middle;color:#344054}.total-box{background-color:#f3f4f6;border-radius:8px;padding:8px 0;font-weight:600}.bi-arrow-up,.bi-arrow-down{color:#dc3545}.log-block{display:flex;gap:12px;padding:4px;margin-bottom:18px}.log-block h4{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}.log-block p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085;margin:0}.fixture-row{border-radius:8px;transition:background-color .2s ease,box-shadow .2s ease}.fixture-row.highlighted-fixture{background-color:#eaf8ff;box-shadow:0 0 0 2px #33b5ff}\n"] }]
4965
+ args: [{ selector: "lib-manage-store-plano", providers: [TitleCasePipe], template: "<section id=\"manage-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 class=\"d-flex align-items-center\">\r\n <div style=\"margin-left:5px;margin-right:5px\" *ngIf=\"planoData?.storeName\">\r\n <h2 class='title'>{{planoData?.storeName}} - Plano</h2>\r\n </div>\r\n <div>\r\n <lib-select-plano *ngIf=\"storeList?.length\" [idField]=\"'_id'\" [selectedValues]=\"[selectedStoreName]\"\r\n [items]=\"storeList\" [multi]=false searchField=\"storeName\" (selected)=\"onSelected($event)\">\r\n </lib-select-plano>\r\n </div>\r\n </div>\r\n\r\n <lib-reactive-select *ngIf=\"floorsList.length && !isPageLoading\" [formControl]=\"selectedFloorId\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorsList\">\r\n </lib-reactive-select>\r\n\r\n <div class=\"cus-btn\" [class.disabled-click]=\"isStoreTourLoading\" (click)=\"goToStoreTourPage()\">\r\n View store tour\r\n\r\n <svg *ngIf=\"!isStoreTourLoading\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_408_16498)\">\r\n <path\r\n d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\"\r\n stroke=\"#33B5FF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M5 4L8 6L5 8V4Z\" stroke=\"#33B5FF\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_408_16498\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <span *ngIf=\"isStoreTourLoading\" class=\"spinner-border spinner-border-sm\" role=\"status\"\r\n aria-hidden=\"true\"></span>\r\n\r\n </div>\r\n <div class=\"cus-btn\" (click)=\"goToStoreCameraPage()\">\r\n View camera\r\n\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_422_36321)\">\r\n <path\r\n d=\"M9 6.5V9.5C9 9.76522 8.89464 10.0196 8.70711 10.2071C8.51957 10.3946 8.26522 10.5 8 10.5H2.5C2.23478 10.5 1.98043 10.3946 1.79289 10.2071C1.60536 10.0196 1.5 9.76522 1.5 9.5V4C1.5 3.73478 1.60536 3.48043 1.79289 3.29289C1.98043 3.10536 2.23478 3 2.5 3H5.5M7.5 1.5H10.5M10.5 1.5V4.5M10.5 1.5L5 7\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_422_36321\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n\r\n </div>\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\" (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\r\n <!-- Normal Mode: per-task publish buttons live inside their respective cards below.\r\n Top-right shows the final overall \"Publish\" once layout+fixture+vm are approved.\r\n When a zone task exists and isn't Approved yet, the button stays visible but\r\n disabled (so the store can't be published until zone verification completes).\r\n Legacy stores without a zone task are unblocked immediately. -->\r\n <ng-container *ngIf=\"showTopPublish\">\r\n <div class=\"indicator completed\" *ngIf=\"floorData?.verificationStatus\">Published</div>\r\n <button *ngIf=\"!floorData?.verificationStatus\" type=\"button\" class=\"btn btn-primary text-nowrap\"\r\n (click)=\"publish()\" [disabled]=\"topPublishDisabled\">\r\n Publish\r\n </button>\r\n </ng-container>\r\n\r\n\r\n\r\n <!-- Revoke buttons live inside their respective cards (Layout / Fixtures / VM / Zone) below. -->\r\n\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 <ng-template>\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\" fill=\"none\"\r\n 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\" 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 taskInfo?.planoProgress <= 50\r\n ? 'bg-warning'\r\n : taskInfo?.planoProgress === 75\r\n ? 'bg-primary'\r\n : 'bg-success'\r\n \" role=\"progressbar\" [style]=\"'width:' + taskInfo?.planoProgress + '%'\"\r\n [attr.aria-valuenow]=\"taskInfo?.planoProgress\" aria-valuemin=\"0\" aria-valuemax=\"100\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-3\">{{ taskInfo?.planoProgress }}%</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Layout -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n <div class=\"flex-grow-1\">\r\n <h3><b>{{ storeMetrics.floorCount }}</b> Layout</h3>\r\n <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.layout.class\">\r\n <span class=\"me-2\" [hidden]=\"taskStyle.layout.name !== 'Redo'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_4984_27569)\">\r\n <path\r\n d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4984_27569\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span [hidden]=\"taskStyle.layout.name !== 'Flagged'\" class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n {{ taskStyle.layout.name }}\r\n </div>\r\n </div>\r\n <!-- Layout actions disabled for now \u2014 no layout-related actions are needed.\r\n <button *ngIf=\"!editFixture && (publishingState === 'layout' || publishingState === 'layout-redo') && taskStyle.layout.class !== 'taskAssigned' && taskStyle.layout.class !== 'completed' && taskStyle.fixture.class !== 'taskAssigned'\"\r\n type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n {{ publishingState === 'layout-redo' ? 'Publish Layout Redo' : 'Publish Layout Verification' }}\r\n </button>\r\n <button *ngIf=\"!editFixture && taskStyle.layout.class === 'taskAssigned'\" type=\"button\"\r\n class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_640_5594lay)\">\r\n <path\r\n d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_640_5594lay\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Revoke\r\n </button>\r\n -->\r\n </div>\r\n </div>\r\n\r\n <!-- Fixtures -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n <div class=\"flex-grow-1\">\r\n <h3><b>{{ storeMetrics.fixtureCount }}</b> Fixtures</h3>\r\n <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.fixture.class\">\r\n <span class=\"me-2\" [hidden]=\"taskStyle.fixture.name !== 'Redo'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_4984_27569)\">\r\n <path\r\n d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4984_27569\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span [hidden]=\"taskStyle.fixture.name !== 'Flagged'\" class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n {{ taskStyle.fixture.name }}\r\n </div>\r\n </div>\r\n <button *ngIf=\"!editFixture && (publishingState === 'fixture' || publishingState === 'fixture-redo') && taskStyle.fixture.class !== 'taskAssigned'\"\r\n type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n {{ publishingState === 'fixture-redo' ? 'Publish Redo' : 'Publish Task' }}\r\n </button>\r\n <button *ngIf=\"!editFixture && taskStyle.fixture.class === 'taskAssigned'\" type=\"button\"\r\n class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_640_5594fix)\">\r\n <path\r\n d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_640_5594fix\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Revoke\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Visual Merchandise -->\r\n <!--\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <div class=\"d-flex flex-column gap-2\">\r\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\r\n <h3 class=\"m-0\"><b>{{ storeMetrics.vmCount }}</b> Visual Merchandise</h3>\r\n <div class=\"indicator\" [ngClass]=\"taskStyle.vm.class\">\r\n <span class=\"me-2\" [hidden]=\"taskStyle.vm.name !== 'Redo'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_4984_27569)\">\r\n <path\r\n d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4984_27569\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span [hidden]=\"taskStyle.vm.name !== 'Flagged'\" class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n {{ taskStyle.vm.name }}\r\n </div>\r\n </div>\r\n <button *ngIf=\"!editFixture && (publishingState === 'vm' || publishingState === 'vm-redo') && taskStyle.vm.class !== 'taskAssigned'\"\r\n type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n {{ publishingState === 'vm-redo' ? 'Publish Redo' : 'Publish' }}\r\n </button>\r\n <button *ngIf=\"!editFixture && taskStyle.vm.class === 'taskAssigned'\" type=\"button\"\r\n class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_640_5594vm)\">\r\n <path\r\n d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_640_5594vm\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Revoke\r\n </button>\r\n </div>\r\n </div>\r\n -->\r\n\r\n <!-- Zone Verification -->\r\n <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n <div class=\"flex-grow-1\">\r\n <h3>Zone Verification</h3>\r\n <div class=\"indicator mt-2\" [ngClass]=\"zoneTaskStyle.class\">\r\n <span class=\"me-2\" [hidden]=\"zoneTaskStyle.name !== 'Redo'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_4984_27569)\">\r\n <path\r\n d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4984_27569\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n {{ zoneTaskStyle.name }}\r\n </div>\r\n </div>\r\n <button *ngIf=\"!editFixture && !zoneFeedback?.zoneVerificationTask\" type=\"button\"\r\n class=\"card-publish-btn\" (click)=\"publishZoneVerification()\">\r\n Publish Task\r\n </button>\r\n <button *ngIf=\"!editFixture && zoneRedoStatus\" type=\"button\"\r\n class=\"card-publish-btn\" (click)=\"publishZoneRedo()\">\r\n Publish Redo\r\n </button>\r\n <button *ngIf=\"!editFixture && zoneTaskStyle.class === 'taskAssigned'\" type=\"button\"\r\n class=\"card-revoke-btn\" (click)=\"revokeZoneTask()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_640_5594z)\">\r\n <path\r\n d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_640_5594z\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Revoke\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body -->\r\n <div id=\"body\" class=\"row\">\r\n <!-- Left Column -->\r\n <div [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\" 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 }} {{ 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\" height=\"18\" viewBox=\"0 0 18 18\"\r\n 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\" 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\" height=\"18\" viewBox=\"0 0 18 18\"\r\n 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\" 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\" height=\"18\" viewBox=\"0 0 18 18\"\r\n 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 (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 *ngFor=\"let fixture of getFormFixtures(i).controls; let j = index\">\r\n <div dndDropzone (dndDrop)=\"onDrop($event, i, j)\" [formGroupName]=\"j\"\r\n [dndDraggable]=\"{ wallIndex: i, fixtureIndex: j }\" [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 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\" 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 formControlName=\"fixtureConfigId\" [idField]=\"'_id'\"\r\n [nameField]=\"'name'\" [data]=\"fixtureTemplates\" [label]=\"'Fixture ' + (j + 1)\"\r\n [subTextField]=\"'subtext'\" [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\" width=\"10\" height=\"10\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" 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('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 *ngIf=\"getWallOtherElements(i).controls.length\">\r\n <div formArrayName=\"otherElements\">\r\n <ng-container *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 {{ j + 1 }}</label>\r\n\r\n <!-- Dropdown bound to 'type' -->\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"otherElementList\" [id]=\"'elementLabel' + j\" formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <!-- Show custom text input only when 'Others' is selected -->\r\n <input *ngIf=\"(fixture.get('type')?.value) === 'Others'\" type=\"text\"\r\n class=\"form-control mt-2\" 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\" width=\"10\" height=\"10\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" 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('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 (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 *ngFor=\"let fixture of getFormFloorFixtures.controls; let j = index\">\r\n <div dndDropzone (dndDrop)=\"onDrop($event, 'floor', j)\" [formGroupName]=\"j\"\r\n [dndDraggable]=\"{ wallIndex: 'floor', fixtureIndex: j }\" [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 class=\"d-flex align-items-center justify-content-center h-100\">\r\n <svg dndDragImageRef style=\"cursor: move; opacity: 0.5\" width=\"25px\"\r\n viewBox=\"0 0 16 16\" 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 formControlName=\"fixtureConfigId\" [idField]=\"'_id'\"\r\n [nameField]=\"'name'\" [data]=\"fixtureTemplates\" [label]=\"'Fixture ' + (j + 1)\"\r\n [search]=\"true\" [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\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" 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 *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 {{ j + 1 }}</label>\r\n\r\n <!-- Dropdown for type -->\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"otherElementList\" [id]=\"'floorElementLabel' + j\" formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <!-- Conditional input for custom name -->\r\n <input *ngIf=\"(fixture.get('type')?.value) === 'Others'\" type=\"text\"\r\n class=\"form-control mt-2\" 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\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" 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 <div [ngClass]=\"{ 'd-none': selectedView === 'tree' }\">\r\n <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n </div>\r\n\r\n <!-- Tree View -->\r\n <div *ngIf=\"selectedView === 'tree'\" class=\"w-100\">\r\n <store-plano-tree-view [allFixture]=\"allFixtures\"></store-plano-tree-view>\r\n </div>\r\n\r\n <!-- Top Controls -->\r\n <div style=\"top: 24px; left: 26px; position: absolute;\" id=\"segment-btn\" class=\"pb-5\">\r\n <div class=\"w-100 d-flex justify-content-start gap-4\">\r\n <ul class=\"nav nav-tabs custom-tabs d-flex\" style=\"width: 200px; margin: 0\">\r\n <li class=\"nav-item flex-fill\">\r\n <button class=\"nav-link w-100 h-100\" [class.active]=\"selectedView === 'detail'\"\r\n (click)=\"selectedView = 'detail'\">\r\n Detail View\r\n </button>\r\n </li>\r\n <li class=\"nav-item flex-fill\">\r\n <button class=\"nav-link w-100 h-100\" [class.active]=\"selectedView === 'tree'\"\r\n (click)=\"selectedView = 'tree'\">\r\n Tree View\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <!-- PID Allocation -->\r\n <!-- <div *ngIf=\"layoutForm.disabled\" style=\"top: 24px; left: 234px\"\r\n class=\"position-absolute\">\r\n <button type=\"button\" style=\"padding: 9px 19px !important;\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n [disabled]=\"getEntrances?.length >= 2\" (click)=\"onClickApplyLogics()\">\r\n Apply Logics\r\n </button>\r\n </div> -->\r\n\r\n <!-- Entrance Button -->\r\n <div *ngIf=\"layoutForm.enabled\" ngbTooltip=\"You can add up to two entrances.\" style=\"top: 24px; left: 234px\"\r\n class=\"position-absolute\" [disableTooltip]=\"getEntrances?.length < 2\">\r\n <button type=\"button\" style=\"padding: 9px 19px !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 <div *ngIf=\"layoutForm.enabled\" style=\"top: 24px; right: 192px\" class=\"position-absolute\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n (click)=\"cancelEdit()\">\r\n Cancel\r\n </button>\r\n </div>\r\n\r\n\r\n <!-- Edit Button -->\r\n <button *ngIf=\"layoutForm.disabled && selectedView === 'detail'\"\r\n [disabled]=\"disableEdit || ['taskAssigned'].includes(taskStyle.fixture.class) || (taskStyle.fixture.class == 'reviewPending' && !showLayout)\"\r\n style=\"top: 24px; right: 164px\" type=\"button\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute 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\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n\r\n <!-- Rotate Button -->\r\n <button style=\"top: 24px; right: 94px\" type=\"button\" *ngIf=\"layoutForm.disabled && selectedView === 'detail'\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute 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\" 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 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 <!-- Submit Button -->\r\n <button *ngIf=\"!layoutForm.disabled\"\r\n style=\"top: 24px; right: 94px;padding: 9px 20px !important;min-width: 90px;justify-content: center;\"\r\n type=\"button\" class=\"btn btn-primary d-flex align-items-center gap-2 position-absolute bg-white shadow-sm\"\r\n [disabled]=\"isSavingLayout\" (click)=\"updateLayout(true)\">\r\n <span *ngIf=\"isSavingLayout\" class=\"spinner-border spinner-border-sm\" role=\"status\"\r\n aria-hidden=\"true\"></span>\r\n Save\r\n </button>\r\n\r\n <!-- Download Button -->\r\n <button *ngIf=\"selectedView === 'detail'\" style=\"top: 24px; right: 26px\" type=\"button\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n (click)=\"downloadCanvas()\">\r\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n 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\" stroke=\"#CCCCCC\"\r\n 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 <!-- 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 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 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 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 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\" 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\" role=\"tab\">\r\n Products\r\n </a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\" *ngIf=\"editFromTab !== 'zone'\">\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\" [revertOnEdit]=\"shouldRevertOnEdit\"\r\n [zoneEditMode]=\"editFromTab === 'zone'\" (submitEvent)=\"onFixtureSubmit($event)\">\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\" [isSubmitted]=\"submitFixture\"\r\n [revertOnEdit]=\"shouldRevertOnEdit\" [zoneEditMode]=\"editFromTab === 'zone'\"\r\n (submitEvent)=\"onFixtureSubmit($event)\">\r\n </lib-instance-products>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"editFixtureSection === 'vms' && editFromTab !== 'zone'\">\r\n <lib-instance-vms [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\" [isSubmitted]=\"submitFixture\"\r\n [revertOnEdit]=\"shouldRevertOnEdit\" (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' : editFixture || showLayout ? '340px' : activeFeedbackTab === 'fixture' ? '1050px' : '750px'}\">\r\n <ng-container *ngTemplateOutlet=\"feedbackCol\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</section>\r\n\r\n<!-- Templates -->\r\n<ng-template #feedbackCol>\r\n <div class=\"s-card s-card--tabbed\" [ngStyle]=\"{'margin-top':editFixture ? '72px' : '0px'}\">\r\n <!-- @if(showFixturePreview && !isRightPanelCollapsed){\r\n <fixture-preview [fixtureData]=\"selectedFixture?.fixtureData\"></fixture-preview>\r\n } -->\r\n\r\n <ul class=\"nav nav-pills feedback-tabs\" role=\"tablist\"\r\n [ngClass]=\"{ 'd-none': isRightPanelCollapsed && !editFixture }\">\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"onFeedbackTabChange('fixture')\" [ngClass]=\"activeFeedbackTab === 'fixture' ? 'active' : ''\"\r\n class=\"nav-link\" role=\"tab\">\r\n Fixture Verification\r\n </a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n <a (click)=\"onFeedbackTabChange('zone')\" [ngClass]=\"activeFeedbackTab === 'zone' ? 'active' : ''\"\r\n class=\"nav-link d-flex align-items-center gap-2\" role=\"tab\">\r\n Zone Verification\r\n <span *ngIf=\"zonePendingCount > 0\" class=\"badge feedback-tab-badge\">\r\n {{ zonePendingCount }}\r\n </span>\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n <div class=\"feedback-tab-content\">\r\n <ng-container *ngIf=\"activeFeedbackTab === 'fixture'\">\r\n <div *ngIf=\"showLayout && !isRightPanelCollapsed\">\r\n <div class=\"card-body\">\r\n\r\n <!-- Title -->\r\n <div class=\"storeTitle mb-3\">Store response</div>\r\n <hr>\r\n\r\n <!-- Section Header -->\r\n <div class=\"d-flex justify-content-between align-items-center mb-1\">\r\n <h5 class=\"subTitle fw-semibold mb-0\">Fixture verification</h5>\r\n <i class=\"bi bi-chevron-up text-muted cursor-pointer\" (click)=\"toggle = !toggle\" *ngIf=\"!toggle\"></i>\r\n <i class=\"bi bi-chevron-down text-muted cursor-pointer\" (click)=\"toggle = !toggle\" *ngIf=\"toggle\"></i>\r\n </div>\r\n <div class=\"smallText text-muted d-block mb-4\">\r\n Assigned on: {{storeFeedback?.fixtureData?.[0]?.taskData?.createdAt | date:'dd MMM YYY, hh:mm:SS a'}}\r\n </div>\r\n\r\n\r\n <div *ngIf=\"toggle\" class=\"mt-10\">\r\n <!-- Column Headings -->\r\n <div class=\"row text-muted small fw-semibold mb-5\">\r\n <div class=\"col-6\"></div>\r\n <div class=\"col-3 text-center lightText\">Before</div>\r\n <div class=\"col-3 text-center lightText\">After</div>\r\n </div>\r\n\r\n <!-- Wall Fixtures -->\r\n <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n <div class=\"col-6\">Wall Fixtures</div>\r\n <div class=\"col-3 text-center\">\r\n {{wallCount - clCount}}\r\n </div>\r\n <div class=\"col-3 text-center fw-semibold\"\r\n [ngClass]=\"(wallCount - clCount) != storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures ? 'text-danger' : ''\">\r\n <i class=\"bi bi-arrow-up\"\r\n *ngIf=\"(wallCount - clCount) < storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures\"></i>\r\n <i class=\"bi bi-arrow-down\"\r\n *ngIf=\"(wallCount - clCount) > storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures\"></i>{{storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures}}\r\n </div>\r\n </div>\r\n\r\n <!-- Euro Centre Fixtures -->\r\n <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n <div class=\"col-6\">Euro Centre Fixtures</div>\r\n <div class=\"col-3 text-center\">{{floorData.centerFixture.length}}</div>\r\n <div class=\"col-3 text-center fw-semibold\"\r\n [ngClass]=\"floorData.centerFixture.length != storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures ? 'text-danger' : ''\">\r\n <i class=\"bi bi-arrow-down\"\r\n *ngIf=\"floorData.centerFixture.length > storeFeedback.fixtureData[0]?.answers?.[0]?.floorFixtures\"></i>\r\n <i class=\"bi bi-arrow-up\"\r\n *ngIf=\"floorData.centerFixture.length < storeFeedback.fixtureData[0]?.answers?.[0]?.floorFixtures\"></i>\r\n {{storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures}}\r\n </div>\r\n </div>\r\n\r\n <!-- Contact Lenses -->\r\n <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n <div class=\"col-6\">Contact Lenses</div>\r\n <div class=\"col-3 text-center\">{{clCount}}</div>\r\n <div class=\"col-3 text-center fw-semibold\"\r\n [ngClass]=\"clCount != storeFeedback.fixtureData[0].answers?.[0]?.cl ? 'text-danger' : ''\">\r\n <i class=\"bi bi-arrow-down\" *ngIf=\"clCount > storeFeedback.fixtureData[0].answers?.[0]?.cl\"></i>\r\n <i class=\"bi bi-arrow-up\" *ngIf=\"clCount < storeFeedback.fixtureData[0].answers?.[0]?.cl\"></i>\r\n {{storeFeedback.fixtureData[0].answers?.[0]?.cl}}\r\n </div>\r\n </div>\r\n\r\n <hr>\r\n\r\n <!-- Total Section -->\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-6 fw-semibold totalText\">Total</div>\r\n <div class=\"col-3 text-center totalText\">\r\n <div class=\"total-box\">{{floorData.fixtureCount}}</div>\r\n </div>\r\n <div class=\"col-3 text-center totalText\">\r\n <div class=\"total-box\"\r\n [ngClass]=\"floorData.fixtureCount !== (storeFeedback.fixtureData[0].answers?.[0]?.cl + storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures + storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures) ? 'text-center' :''\">\r\n {{storeFeedback.fixtureData[0].answers?.[0]?.cl + storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures + storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (storeFeedback.fixtureData[0]?.answers?.[0]?.comments.length) {\r\n <div id=\"fixture-comments\" class=\"mt-10\">\r\n <h5 class=\"mb-2\">Comments</h5>\r\n\r\n <div class=\"log-block\"\r\n *ngFor=\"let c of storeFeedback.fixtureData[0]?.answers[0]?.comments;let i= index\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.timeStamp | date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n\r\n @if(c?.responsetype === 'comment'){\r\n <h5>{{c?.comment}}</h5>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <lib-verification-feedback [floorData]=\"floorData\"\r\n [ngClass]=\"{ 'd-none': isRightPanelCollapsed && !editFixture}\" [feedbackDetails]=\"selectedFixtureFeedback\"\r\n (changeFixture)=\"onChangeFixtureOnFeedbackPanel($event,true)\" [totalFixtures]=\"allFixtureInstances\"\r\n [cdn]=\"cdnUrl\" (action)=\"handleFeedbackAction($event)\" [showAction]=\"!editFixture\"\r\n *ngIf=\"!showLayout\"></lib-verification-feedback>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"activeFeedbackTab === 'zone'\">\r\n <lib-zone-verification-feedback [floorData]=\"floorData\" [feedbackDetails]=\"selectedFixtureFeedback\"\r\n [zoneTask]=\"zoneFeedback?.zoneVerificationTask\" [zoneFeedback]=\"selectedZoneFeedback\"\r\n [totalFixtures]=\"allFixtureInstances\" [cdn]=\"cdnUrl\" [showAction]=\"!editFixture\"\r\n (changeFixture)=\"onChangeFixtureOnFeedbackPanel($event,true)\" (action)=\"handleFeedbackAction($event)\"\r\n [ngClass]=\"{ 'd-none': isRightPanelCollapsed && !editFixture }\"></lib-zone-verification-feedback>\r\n </ng-container>\r\n </div>\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\r\n<ng-template #noStoreVideo let-modal>\r\n <div class=\"modal-body\">\r\n <div>\r\n <h2 class=\"mb-3\">No Store Video Found</h2>\r\n <p>The video will be available once a request is raised and the store submits a complete store video.</p>\r\n </div>\r\n <div class=\"d-flex justify-content-end\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\">Close</button>\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>\r\n <h2 class=\"mb-3\">Apply IVM Logics</h2>\r\n <p>This will analyze the current layout and apply the pre-defined fixture logics.</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()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"applyPIDLogics()\">Proceed</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 layout/plan</h2>\r\n <p>\r\n Are you sure you want to approve the layout? Please ensure it has been thoroughly reviewed before approving.\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()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"approveLayout()\">\r\n <span *ngIf=\"!isButtonLoading\">Approve</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>", 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}::ng-deep .backgroundImg{background-color:#f9fafb!important}::ng-deep .accordion .accordion-button.backgroundImg:not(.collapsed){background-color:#f9fafb!important}::ng-deep .accordion-body{padding:10px 20px 20px}.s-card{position:relative;box-sizing:border-box;border-radius:8px;background:#fff;padding:20px 16px;height:75dvh;overflow-y:auto;overflow-x:visible}.card-publish-btn{flex-shrink:0;font-family:Inter;font-weight:600;font-size:12px;line-height:16px;padding:6px 10px;border-radius:6px;border:1px solid #009bf3;background:#009bf3;color:#fff;white-space:nowrap;cursor:pointer;box-shadow:0 1px 2px #1018280d}.card-publish-btn:hover:not(:disabled){background:#0084d1;border-color:#0084d1}.card-publish-btn:disabled{opacity:.5;cursor:not-allowed}.card-revoke-btn{flex-shrink:0;display:inline-flex;align-items:center;gap:4px;font-family:Inter;font-weight:600;font-size:12px;line-height:16px;padding:6px 10px;border-radius:6px;border:1px solid #fda29b;background:#fef3f2;color:#b42318;white-space:nowrap;cursor:pointer;box-shadow:0 1px 2px #1018280d}.card-revoke-btn:hover:not(:disabled){background:#fee4e2}.card-revoke-btn:disabled{opacity:.5;cursor:not-allowed}.s-card.s-card--tabbed{display:flex;flex-direction:column;padding:12px 16px 0;overflow:hidden}.s-card.s-card--tabbed .feedback-tabs{flex-shrink:0;margin:0 0 8px;padding:0}.s-card.s-card--tabbed .feedback-tabs .nav-link .badge.feedback-tab-badge{background-color:#eaf8ff;color:#009bf3;font-size:11px;font-weight:600;padding:2px 8px;border-radius:10px}.s-card.s-card--tabbed .feedback-tabs .nav-link.active .badge.feedback-tab-badge{background-color:#009bf3;color:#fff}.s-card.s-card--tabbed .feedback-tab-content{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}.s-card.s-card--tabbed .feedback-tab-content>*{flex:1 1 auto;min-height:0;display:block}.c-card{border-radius:8px;background:#fff;padding:20px 16px;height:75dvh;overflow:hidden;width:100%}.h-card{border-radius:8px;background:#fff;padding:20px 16px;min-height:20dvh}.wall-label{color:var(--Gray-600, #475467);font-family:Inter;font-size:14px;font-style:normal;font-weight:600}img{width:100%;height:100%;object-fit:cover;display:block}#header .filter-tab{min-width:180px}#header .title{color:var(--Gray-800, #1d2939);font-size:16px;font-weight:600;line-height:24px;margin:0;white-space:nowrap}#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;white-space:nowrap;flex-shrink:0;cursor:pointer}#header .cus-btn:hover{background:#e2f5ff}#header .updateClass{white-space:nowrap}@media (max-width: 1500px){#header [ngbAccordionHeader]{padding-left:1rem!important;padding-right:1rem!important;gap:.5rem}#header .gap-4{gap:.75rem!important}#header .title{font-size:14px;line-height:20px}#header .cus-btn{padding:3px 8px;font-size:12px}#header .updateClass{font-size:12px;line-height:18px}#header .row.gap-3{gap:.5rem!important}#header .filter-tab{min-width:170px;padding:.75rem}#header .filter-tab h3{font-size:14px;line-height:20px}#header .filter-tab .indicator{font-size:12px}}@media (max-width: 1300px){#header [ngbAccordionHeader]{padding-left:.75rem!important;padding-right:.75rem!important}#header .title{font-size:13px}#header .cus-btn{font-size:11px;padding:2px 6px}#header .updateClass{font-size:11px}#header .filter-tab{min-width:150px}#header .filter-tab h3{font-size:13px}}.loader .shimmer{height:100%!important}.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}.collapse-handler.right{right:0}.collapse-handler.left{left:0}.collapsed-col{transition:all .3s ease;width:40px!important}[class^=col]{transition:all .3s ease}#segment-btn .custom-tabs{border-radius:8px;border:1px solid var(--Gray-300, #d0d5dd);overflow:hidden;margin-bottom:24px}#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}#segment-btn .custom-tabs .nav-link.active{background:var(--Primary-500, #33b5ff);color:#fff}#segment-btn .nav-tabs .nav-link{border:none;margin:0}#segment-btn .nav-item{text-align:center}#segment-btn .nav-item:last-child .nav-link{border:none}.link-btn{color:#33b5ff;cursor:pointer;font-weight:500}.link-btn:hover{color:#33b5ff;text-decoration:underline!important}.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}.updateClass{font-family:Inter;font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#667085}.btn .spinner{height:22px;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)}}.storeTitle{font-family:Inter;font-weight:600;font-size:16px;line-height:24px;letter-spacing:0%;color:#101828}.subTitle{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;letter-spacing:0%;color:#1d2939}.smallText{font-family:Inter;font-weight:400;font-size:14px;color:#667085;line-height:20px;letter-spacing:0%}.wallText{font-family:Inter;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;color:#1d2939}.totalText{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;letter-spacing:0%;color:#1d2939}.lightText{font-family:Inter;font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;text-align:center;vertical-align:middle;color:#344054}.total-box{background-color:#f3f4f6;border-radius:8px;padding:8px 0;font-weight:600}.bi-arrow-up,.bi-arrow-down{color:#dc3545}.log-block{display:flex;gap:12px;padding:4px;margin-bottom:18px}.log-block h4{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}.log-block p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085;margin:0}.fixture-row{border-radius:8px;transition:background-color .2s ease,box-shadow .2s ease}.fixture-row.highlighted-fixture{background-color:#eaf8ff;box-shadow:0 0 0 2px #33b5ff}\n"] }]
4966
4966
  }], 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: [{
4967
4967
  type: ViewChild,
4968
4968
  args: ["baseCanvas"]
@@ -4985,4 +4985,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
4985
4985
  type: HostListener,
4986
4986
  args: ["window:resize"]
4987
4987
  }] } });
4988
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlLXN0b3JlLXBsYW5vLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby9tYW5hZ2Utc3RvcmUtcGxhbm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvbWFuYWdlLXN0b3JlLXBsYW5vL21hbmFnZS1zdG9yZS1wbGFuby5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUVULFlBQVksRUFJWixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFZLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTFELE9BQU8sRUFHTCxXQUFXLEVBRVgsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFJeEIsT0FBTyxFQUNMLE9BQU8sRUFFUCxZQUFZLEVBQ1osY0FBYyxFQUNkLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFHZCxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQU1qQyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1RUFBdUUsQ0FBQztBQUN4SCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNuRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNsRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUUxRyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUN6RyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUN4RyxPQUFPLEtB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QUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRTtnQkFDakUsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsRUFBRTtvQkFDL0IsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMvRDtxQkFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxFQUFFO29CQUMzQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BFO2FBQ0Y7WUFFRCxlQUFlO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRTtnQkFDakUsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsRUFBRTtvQkFDL0IsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMvRDtxQkFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FB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LENBQUMsZ29CQzlENUIsOGozRUErbUNjOzs0RkQvaUNELHlCQUF5QjtrQkFOckMsU0FBUzsrQkFDRSx3QkFBd0IsYUFHdkIsQ0FBQyxhQUFhLENBQUM7d1dBTTFCLFNBQVM7c0JBRFIsU0FBUzt1QkFBQyxZQUFZO2dCQUVPLFlBQVk7c0JBQXpDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUNELG9CQUFvQjtzQkFBOUMsU0FBUzt1QkFBQyxjQUFjO2dCQUNDLG1CQUFtQjtzQkFBNUMsU0FBUzt1QkFBQyxhQUFhO2dCQUNTLHFCQUFxQjtzQkFBckQsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBQ0gsYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUcxQixRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbmltcG9ydCB7IExvY2F0aW9uLCBUaXRsZUNhc2VQaXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5cclxuaW1wb3J0IHtcclxuICBGb3JtQXJyYXksXHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5cclxuaW1wb3J0IHtcclxuICBTdWJqZWN0LFxyXG4gIFN1YnNjcmlwdGlvbixcclxuICBkZWJvdW5jZVRpbWUsXHJcbiAgZmlyc3RWYWx1ZUZyb20sXHJcbiAgZnJvbUV2ZW50LFxyXG4gIHRha2VVbnRpbCxcclxufSBmcm9tIFwicnhqc1wiO1xyXG5cclxuaW1wb3J0IHsgTmdiQWNjb3JkaW9uRGlyZWN0aXZlLCBOZ2JNb2RhbCB9IGZyb20gXCJAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFwiO1xyXG5pbXBvcnQgKiBhcyBmYWJyaWMgZnJvbSBcImZhYnJpY1wiO1xyXG5cclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlLCBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLWdsb2JhbFwiO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLXNoYXJlZFwiO1xyXG5cclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTGF5b3V0RWRpdENvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9wb3B1cHMvbGF5b3V0LWVkaXQtY29uZmlybWF0aW9uL2xheW91dC1lZGl0LWNvbmZpcm1hdGlvbi5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgUHVibGlzaFRhc2tQb3B1cENvbXBvbmVudCB9IGZyb20gXCIuL3BvcHVwcy9wdWJsaXNodGFzay1wb3B1cC9wdWJsaXNodGFzay1wb3B1cC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgU3RvcmVUYXNrUmV2b2tlQ29tcG9uZW50IH0gZnJvbSBcIi4vcG9wdXBzL3N0b3JlLXRhc2stcmV2b2tlL3N0b3JlLXRhc2stcmV2b2tlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQgfSBmcm9tIFwiLi4vcG9wdXBzL2RlbGV0ZS1jb25maXJtYXRpb24vZGVsZXRlLWNvbmZpcm1hdGlvbi5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25JRiB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL3BsYW5vLWdlbmVyYWwuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IFB1Ymxpc2hQbGFub01vZGFsQ29tcG9uZW50IH0gZnJvbSBcIi4uL3BvcHVwcy9wdWJsaXNoLXBsYW5vLW1vZGFsL3B1Ymxpc2gtcGxhbm8tbW9kYWwuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IFNjaGVkdWxlVGFza1BvcHVwQ29tcG9uZW50IH0gZnJvbSBcIi4vcG9wdXBzL3NjaGVkdWxlLXRhc2stcG9wdXAvc2NoZWR1bGUtdGFzay1wb3B1cC5jb21wb25lbnRcIjtcclxuaW1wb3J0IGRheWpzIGZyb20gXCJkYXlqc1wiO1xyXG5pbXBvcnQgeyBnZXRGaXh0dXJlQ2FudmFzTGFiZWwgfSBmcm9tIFwiLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uXCI7XHJcblxyXG50eXBlIEJvdW5kRml4dHVyZUdyb3VwID0ge1xyXG4gIGZpeHR1cmVHcm91cDogZmFicmljLkdyb3VwO1xyXG4gIG9mZnNldFg6IG51bWJlcjtcclxuICBvZmZzZXRZOiBudW1iZXI7XHJcbiAgX3RlbXBPbGRUb3A/OiBudW1iZXI7XHJcbiAgX3RlbXBPbGRMZWZ0PzogbnVtYmVyO1xyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwibGliLW1hbmFnZS1zdG9yZS1wbGFub1wiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vbWFuYWdlLXN0b3JlLXBsYW5vLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9tYW5hZ2Utc3RvcmUtcGxhbm8uY29tcG9uZW50LnNjc3NcIixcclxuICBwcm92aWRlcnM6IFtUaXRsZUNhc2VQaXBlXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE1hbmFnZVN0b3JlUGxhbm9Db21wb25lbnRcclxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25Jbml0XHJcbntcclxuICBAVmlld0NoaWxkKFwiYmFzZUNhbnZhc1wiKVxyXG4gIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoXCJjYW52YXNDb250YWluZXJcIikgY29udGFpbmVyUmVmITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZChcIm5vU3RvcmVWaWRlb1wiKSBub1N0b3JlVmlkZW9Nb2RhbFJlZiE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZChcImFwcGx5TG9naWNzXCIpIGFwcGx5TG9naWNzTW9kYWxSZWYhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoXCJhcHByb3ZlTGF5b3V0TW9kYWxcIikgYXBwcm92ZUxheW91dE1vZGFsUmVmITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKFwiYm9keUFjY29yZGlvblwiKSBib2R5QWNjb3JkaW9uPzogTmdiQWNjb3JkaW9uRGlyZWN0aXZlO1xyXG5cclxuICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiKVxyXG4gIG9uUmVzaXplKCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVzaXplQ2FudmFzKCk7XHJcbiAgICB9LCAzMDApO1xyXG4gIH1cclxuXHJcbiAgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG5cclxuICBjYW52YXMhOiBmYWJyaWMuQ2FudmFzO1xyXG4gIHpvb21MZXZlbDogbnVtYmVyID0gMTtcclxuICB3YWxsVGhpY2tuZXNzID0gMzA7XHJcbiAgdmVydGljYWxNYXJnaW4gPSAoMS4yNSAvIDEwMCkgKiB0aGlzLnRvUGl4ZWxzKDE1MjQsIFwibW1cIik7XHJcbiAgd2FsbEJpbmRpbmdzID0gbmV3IE1hcDxmYWJyaWMuR3JvdXAsIEJvdW5kRml4dHVyZUdyb3VwW10+KCk7XHJcblxyXG4gIGxheW91dEZvcm06IEZvcm1Hcm91cDtcclxuICBzZWxlY3RlZEZsb29ySWQgPSBuZXcgRm9ybUNvbnRyb2woXCJcIik7XHJcbiAgZmxvb3JzTGlzdDogRHJvcGRvd25JRltdW10gPSBbXTtcclxuICBmaXh0dXJlQ29uZmlnU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuICBmaXh0dXJlVGVtcGxhdGVJZFN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcbiAgb3RoZXJFbGVtZW50c1N1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIHBsYW5vRGF0YTogYW55O1xyXG5cclxuICBmbG9vckRhdGE6IGFueTtcclxuICByZWFkb25seSBvcmlnaW5hbEZsb29yRGF0YTogYW55OyAvLyB1c2VkIHRvIHJvbGxiYWNrIHRvIG9yaWdpbmFsIGxheW91dCBzdGF0ZSBvbiBjbGljayBjYW5jZWwgd2hpbGUgZWRpdGluZy5cclxuXHJcbiAgY2RuVXJsOiBzdHJpbmc7XHJcbiAgZml4dHVyZVRlbXBsYXRlczogYW55W10gPSBbXTtcclxuICBhbGxGaXh0dXJlczogYW55W10gPSBbXTsgLy8gYWxsIGZpeHR1cmVzIGluY2x1ZGluZyB0aGUgbWFzdGVyIHRlbXBsYXRlcyBmb3IgdHJlZSB2aWV3XHJcbiAgYWxsRml4dHVyZUluc3RhbmNlczogYW55W10gPSBbXTsgLy8gb25seSB0aGUgbGF5b3V0IGZpeHR1cmVzIGluc3RhbmNlcy5cclxuICBzdG9yZUZlZWRiYWNrOiBhbnk7XHJcbiAgem9uZUZlZWRiYWNrOiBhbnk7XHJcbiAgc2VsZWN0ZWRab25lRmVlZGJhY2s6IGFueTtcclxuXHJcbiAgLy8gQ0wgZGV0ZWN0aW9uOiBoZWFkZXIubGFiZWwgbnVsbC9taXNzaW5nIG9yICdDTCcgKGxlZ2FjeSBtb2JpbGUgY2xpZW50cyksIE9SIHRoZVxyXG4gIC8vIG5ld2VyIHRlbXBsYXRlR3JvdXBOYW1lIHNuYXBzaG90ID09PSAnQ0wnIChtb2JpbGUgc3RhcnRlZCB3cml0aW5nIHRoaXMgb250b1xyXG4gIC8vIGFuc3dlcnNbMF0gZm9yIHpvbmUgc3VibWlzc2lvbnMgdG8gY2F0Y2ggYnJhbmQtbGFiZWxlZCBDTCBmaXh0dXJlcykuIE9sZGVyIHpvbmVcclxuICAvLyByb3dzIHdpdGhvdXQgdGVtcGxhdGVHcm91cE5hbWUgc3RpbGwgZmFsbCBiYWNrIHRvIHRoZSBoZWFkZXItbGFiZWwgY2hlY2suXHJcbiAgcHJpdmF0ZSBpc0NsQ29tcGxpYW5jZUFuc3dlcihhbnM6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgbGFiZWwgPSBhbnM/LmhlYWRlcj8ubGFiZWw7XHJcbiAgICBpZiAobGFiZWwgPT0gbnVsbCB8fCBsYWJlbCA9PT0gXCJDTFwiKSByZXR1cm4gdHJ1ZTtcclxuICAgIHJldHVybiBhbnM/LnRlbXBsYXRlR3JvdXBOYW1lID09PSBcIkNMXCI7XHJcbiAgfVxyXG5cclxuICBnZXQgem9uZVBlbmRpbmdDb3VudCgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgdGFzayA9IHRoaXMuem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uVGFzaztcclxuICAgIGlmICghdGFzaykgcmV0dXJuIDA7XHJcbiAgICBjb25zdCByb3dzOiBhbnlbXSA9IHRoaXMuem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uRGF0YSA/PyBbXTtcclxuICAgIGxldCBwZW5kaW5nID0gMDtcclxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcclxuICAgICAgY29uc3QgYW5zID0gcm93Py5hbnN3ZXJzPy5bMF07XHJcbiAgICAgIGlmICghYW5zKSBjb250aW51ZTtcclxuICAgICAgaWYgKHRoaXMuaXNDbENvbXBsaWFuY2VBbnN3ZXIoYW5zKSkgY29udGludWU7XHJcbiAgICAgIGNvbnN0IGhhc1Jlc3BvbnNlID1cclxuICAgICAgICBBcnJheS5pc0FycmF5KGFucz8uc2hlbGZDb25maWcpICYmIGFucy5zaGVsZkNvbmZpZy5sZW5ndGggPiAwO1xyXG4gICAgICBpZiAoaGFzUmVzcG9uc2UgJiYgIWFucz8udXNlckFjdGlvbikgcGVuZGluZysrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBlbmRpbmc7XHJcbiAgfVxyXG5cclxuICBnZXQgem9uZVJlZG9Db3VudCgpOiBudW1iZXIge1xyXG4gICAgLy8gSXRlcmF0ZSBjb21wbGlhbmNlIHJvd3MgZGlyZWN0bHkgc28gYSByZWRvIGZsYWcgaXMgZGV0ZWN0ZWQgZXZlbiBpZiB0aGUgZmxvb3JcclxuICAgIC8vIGRhdGEgaXNuJ3QgcmVmcmVzaGVkIHlldC4gQ0wgc2tpcCB1c2VzIGlzQ2xDb21wbGlhbmNlQW5zd2VyIChoZWFkZXIgbGFiZWwgT1JcclxuICAgIC8vIHRlbXBsYXRlR3JvdXBOYW1lIHNuYXBzaG90KSDigJQgc2FtZSBydWxlIGFzIHRoZSBCRSByb2xsdXAuXHJcbiAgICBjb25zdCByb3dzOiBhbnlbXSA9IHRoaXMuem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uRGF0YSA/PyBbXTtcclxuICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XHJcbiAgICAgIGNvbnN0IGFucyA9IHJvdz8uYW5zd2Vycz8uWzBdO1xyXG4gICAgICBpZiAoIWFucykgY29udGludWU7XHJcbiAgICAgIGlmICh0aGlzLmlzQ2xDb21wbGlhbmNlQW5zd2VyKGFucykpIGNvbnRpbnVlO1xyXG4gICAgICBpZiAoYW5zLnVzZXJBY3Rpb24gPT09IFwicmVkb1wiKSBjb3VudCsrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvdW50O1xyXG4gIH1cclxuXHJcbiAgLy8gUmVkbyBjYW4gYmUgcHVibGlzaGVkIG9uY2UgZXZlcnkgbm9uLUNMIGZpeHR1cmUgaGFzIGJlZW4gYWN0aW9uZWQgQU5EIGF0IGxlYXN0IG9uZSBpcyByZWRvLlxyXG4gIC8vIEFsc28gcmVxdWlyZXMgdGhlIHRhc2sgdG8gc3RpbGwgYmUgaW4gJ3N1Ym1pdCcgc3RhdGUg4oCUIG9uY2UgcmVkbyBpcyBwdWJsaXNoZWQsIHRoZSB0YXNrXHJcbiAgLy8gcmVvcGVucyAoc3RhdHVzPSdvcGVuJykgYW5kIHRoZSBidXR0b24gbXVzdCBoaWRlIHVudGlsIG1vYmlsZSByZXN1Ym1pdHMuXHJcbiAgZ2V0IHpvbmVSZWRvU3RhdHVzKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdGFzayA9IHRoaXMuem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uVGFzaztcclxuICAgIGlmICh0YXNrPy5jaGVja2xpc3RTdGF0dXMgIT09IFwic3VibWl0XCIpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0aGlzLnpvbmVQZW5kaW5nQ291bnQgPT09IDAgJiYgdGhpcy56b25lUmVkb0NvdW50ID4gMDtcclxuICB9XHJcblxyXG4gIGdldCB6b25lVGFza1N0eWxlKCk6IHsgbmFtZTogc3RyaW5nOyBjbGFzczogc3RyaW5nIH0ge1xyXG4gICAgY29uc3QgdGFzayA9IHRoaXMuem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uVGFzaztcclxuICAgIGlmICghdGFzaykgcmV0dXJuIHsgbmFtZTogXCJZZXQgdG8gQXNzaWduXCIsIGNsYXNzOiBcInlldFRvQXNzaWduXCIgfTtcclxuICAgIGNvbnN0IHN0YXR1cyA9IHRhc2suY2hlY2tsaXN0U3RhdHVzO1xyXG4gICAgLy8gQ29sbGFwc2UgJ29wZW4nIGFuZCAnaW5wcm9ncmVzcycgaW50byBhIHNpbmdsZSBcIlRhc2sgQXNzaWduZWRcIiBzdGF0ZSxcclxuICAgIC8vIG1hdGNoaW5nIHRoZSB2ZXJpZmljYXRpb24gdGFibGUncyBjb2x1bW4gY29udmVudGlvbi5cclxuICAgIGlmIChzdGF0dXMgPT09IFwib3BlblwiIHx8IHN0YXR1cyA9PT0gXCJpbnByb2dyZXNzXCIpIHtcclxuICAgICAgLy8gQWZ0ZXIgYSByZWRvIGlzIHB1Ymxpc2hlZCwgdGhlIHRhc2sgcmVvcGVucyB3aXRoIHJlZG9TdGF0dXM9dHJ1ZS5cclxuICAgICAgaWYgKHRhc2sucmVkb1N0YXR1cyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHJldHVybiB7IG5hbWU6IFwiUmVkb1wiLCBjbGFzczogXCJ0YXNrQXNzaWduZWRcIiB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7IG5hbWU6IFwiVGFzayBBc3NpZ25lZFwiLCBjbGFzczogXCJ0YXNrQXNzaWduZWRcIiB9O1xyXG4gICAgfVxyXG4gICAgLy8gc3RhdHVzID09PSAnc3VibWl0J1xyXG4gICAgLy8gTWF0Y2ggZml4dHVyZSB2ZXJpZmljYXRpb24ncyB3b3JkaW5nOiB3aGVuIHRoZXJlIGFyZSBwZW5kaW5nIHJlZG9zIHRvIHB1Ymxpc2gsXHJcbiAgICAvLyBmaXh0dXJlJ3MgZ2V0U3RhdHVzKCkgcmV0dXJucyBcIllldCB0byBBc3NpZ25cIiDigJQgc2FtZSBjb252ZW50aW9uIHVzZWQgaGVyZS5cclxuICAgIGlmICh0aGlzLnpvbmVSZWRvU3RhdHVzKSB7XHJcbiAgICAgIHJldHVybiB7IG5hbWU6IFwiWWV0IHRvIEFzc2lnblwiLCBjbGFzczogXCJ5ZXRUb0Fzc2lnblwiIH07XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy56b25lUGVuZGluZ0NvdW50ID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB7IG5hbWU6IFwiQXBwcm92ZWRcIiwgY2xhc3M6IFwiY29tcGxldGVkXCIgfTtcclxuICAgIH1cclxuICAgIHJldHVybiB7IG5hbWU6IFwiUmV2aWV3IFBlbmRpbmdcIiwgY2xhc3M6IFwicmV2aWV3UGVuZGluZ1wiIH07XHJcbiAgfVxyXG5cclxuICAvLyBUb3AgXCJQdWJsaXNoXCIgYnV0dG9uIHZpc2liaWxpdHk6IGFwcGVhcnMgb25jZSBsYXlvdXQrZml4dHVyZSt2bSBhcmUgQXBwcm92ZWQsXHJcbiAgLy8gcmVnYXJkbGVzcyBvZiB6b25lIHN0YXRlLiBTdXBwb3J0cyBsZWdhY3kgc3RvcmVzIChubyB6b25lIHRhc2spIGJ5IGVuYWJsaW5nXHJcbiAgLy8gaW1tZWRpYXRlbHksIGFuZCBnYXRlcyBhY3RpdmUgem9uZSB0YXNrcyB2aWEgdG9wUHVibGlzaERpc2FibGVkIGJlbG93LlxyXG4gIGdldCBzaG93VG9wUHVibGlzaCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMudGFza1N0eWxlLmxheW91dC5uYW1lID09PSBcIkFwcHJvdmVkXCIgJiZcclxuICAgICAgdGhpcy50YXNrU3R5bGUuZml4dHVyZS5uYW1lID09PSBcIkFwcHJvdmVkXCIgJiZcclxuICAgICAgdGhpcy50YXNrU3R5bGUudm0ubmFtZSA9PT0gXCJBcHByb3ZlZFwiXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gVG9wIFwiUHVibGlzaFwiIGJ1dHRvbiBkaXNhYmxlZCB3aGVuIGEgem9uZSB0YXNrIGV4aXN0cyBhbmQgaXNuJ3QgQXBwcm92ZWQgeWV0LlxyXG4gIC8vIEtlZXBzIHRoZSBkaXNhYmxlZFB1Ymxpc2ggc2lnbmFsIGZyb20gQkUgKHRhc2tJbmZvLmRpc2FibGVkIC8gZWRpdGluZykgaW50YWN0LlxyXG4gIGdldCB0b3BQdWJsaXNoRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB6b25lVGFza0V4aXN0cyA9ICEhdGhpcy56b25lRmVlZGJhY2s/LnpvbmVWZXJpZmljYXRpb25UYXNrO1xyXG4gICAgY29uc3Qgem9uZUFwcHJvdmVkID1cclxuICAgICAgIXpvbmVUYXNrRXhpc3RzIHx8IHRoaXMuem9uZVRhc2tTdHlsZS5uYW1lID09PSBcIkFwcHJvdmVkXCI7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZFB1Ymxpc2ggfHwgIXpvbmVBcHByb3ZlZDtcclxuICB9XHJcblxyXG4gIC8vIFRlbGxzIGluc2lkZS1maXh0dXJlIGVkaXRvcnMgd2hldGhlciB0byBhc2sgdGhlIEJFIHRvIHJldmVydCBkb3duc3RyZWFtXHJcbiAgLy8gdmVyaWZpY2F0aW9ucyBvbiBzYXZlLiBUcnVlIHdoZW5ldmVyIGFueSB2ZXJpZmljYXRpb24gKGZpeHR1cmUgLyB2bSAvIHpvbmUpIGlzXHJcbiAgLy8gcGFzdCBZZXRUb0Fzc2lnbiwgbWlycm9yaW5nIHVwZGF0ZVN0b3JlUGxhbm8ncyBhbHdheXMtb24gcmV2ZXJ0T25FZGl0LiBBSVxyXG4gIC8vIHZlcmlmaWNhdGlvbiBmbG93cyAoa2VlcFBsYW5vIC8gbW9kaWZ5UGxhbm8gLyBtb2RpZnlBaVJlc3BvbnNlIC8gem9uZSBlZGl0QWNjZXB0ZWQpXHJcbiAgLy8gYW5kIHJvbGxvdXQgZWRpdHMgYXJlIGZpbHRlcmVkIGVhcmxpZXIgYnkgdGhlIGNoaWxkcmVuJ3MgYCFmaXh0dXJlRGF0YT8udGFza1R5cGVcclxuICAvLyAmJiAhaXNSb2xsb3V0YCBnYXRlLCBzbyB3aWRlbmluZyB0aGlzIGhlcmUgb25seSBhZmZlY3RzIG5vcm1hbCBsYXlvdXQtZWRpdC1tb2RlXHJcbiAgLy8gZml4dHVyZSBzYXZlcyDigJQgd2hpY2ggaXMgZXhhY3RseSB0aGUgY2FzZSB0aGF0IHNob3VsZCBpbnZhbGlkYXRlIGRvd25zdHJlYW0gdGFza3MuXHJcbiAgZ2V0IHNob3VsZFJldmVydE9uRWRpdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMudGFza1N0eWxlLmZpeHR1cmUuY2xhc3MgIT09IFwieWV0VG9Bc3NpZ25cIiB8fFxyXG4gICAgICB0aGlzLnRhc2tTdHlsZS52bS5jbGFzcyAhPT0gXCJ5ZXRUb0Fzc2lnblwiIHx8XHJcbiAgICAgIHRoaXMuem9uZVRhc2tTdHlsZS5jbGFzcyAhPT0gXCJ5ZXRUb0Fzc2lnblwiXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRGaXh0dXJlOiBhbnk7XHJcbiAgc2VsZWN0ZWRGaXh0dXJlRGF0YTogYW55O1xyXG4gIHNlbGVjdGVkRml4dHVyZUZlZWRiYWNrOiBhbnk7XHJcbiAgZWRpdEZpeHR1cmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBlZGl0Rml4dHVyZVNlY3Rpb246IFwiYmFzaWMtZGV0YWlsc1wiIHwgXCJwcm9kdWN0c1wiIHwgXCJ2bXNcIiA9IFwiYmFzaWMtZGV0YWlsc1wiO1xyXG4gIGFjdGl2ZUZlZWRiYWNrVGFiOiBcImZpeHR1cmVcIiB8IFwiem9uZVwiID0gXCJmaXh0dXJlXCI7XHJcbiAgZWRpdEZyb21UYWI6IFwiZml4dHVyZVwiIHwgXCJ6b25lXCIgPSBcImZpeHR1cmVcIjtcclxuICBzdWJtaXRGaXh0dXJlID0gZmFsc2U7XHJcblxyXG4gIGhpZ2hsaWdodGVkRml4dHVyZUZvcm1JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHN0b3JlTWV0cmljcyA9IHtcclxuICAgIGZsb29yQ291bnQ6IDAsXHJcbiAgICBmaXh0dXJlQ291bnQ6IDAsXHJcbiAgICB2bUNvdW50OiAwLFxyXG4gIH07XHJcblxyXG4gIGlzUGFnZUxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzUmlnaHRQYW5lbENvbGxhcHNlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNMZWZ0UGFuZWxDb2xsYXBzZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHNlbGVjdGVkVmlldzogXCJ0cmVlXCIgfCBcImRldGFpbFwiID0gXCJkZXRhaWxcIjtcclxuXHJcbiAgcHVibGlzaGluZ1N0YXRlOlxyXG4gICAgfCBcImxheW91dFwiXHJcbiAgICB8IFwibGF5b3V0LXJlZG9cIlxyXG4gICAgfCBcImZpeHR1cmVcIlxyXG4gICAgfCBcImZpeHR1cmUtcmVkb1wiXHJcbiAgICB8IFwidm1cIlxyXG4gICAgfCBcInZtLXJlZG9cIlxyXG4gICAgfCBcImNvbXBsZXRlXCJcclxuICAgIHwgXCJcIiA9IFwiXCI7XHJcbiAgZGlzYWJsZWRQdWJsaXNoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZGlzYWJsZUVkaXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzU2F2aW5nTGF5b3V0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIEZsaXBwZWQgdG8gdHJ1ZSBieSBhbnkgbGF5b3V0LWxldmVsIG11dGF0aW9uIChhZGQgLyBkZWxldGUgLyBtb3ZlIC8gdGVtcGxhdGVcclxuICAvLyBjaGFuZ2UpLiBSZXNldCB0byBmYWxzZSBvbiBzdWNjZXNzZnVsIHNhdmUuIEdhdGVzIHRoZSBwZXItZml4dHVyZSBlZGl0IGljb25cclxuICAvLyBzbyB0aGUgdXNlciBtdXN0IHNhdmUgbGF5b3V0IGNoYW5nZXMgZmlyc3QuXHJcbiAgbGF5b3V0SGFzVW5zYXZlZENoYW5nZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0YXNrSW5mbzogYW55O1xyXG4gIHRhc2tTdHlsZSA9IHtcclxuICAgIGxheW91dDogeyBuYW1lOiBcIllldCBUbyBBc3NpZ25cIiwgY2xhc3M6IFwieWV0VG9Bc3NpZ25cIiB9LFxyXG4gICAgZml4dHVyZTogeyBuYW1lOiBcIllldCBUbyBBc3NpZ25cIiwgY2xhc3M6IFwieWV0VG9Bc3NpZ25cIiB9LFxyXG4gICAgdm06IHsgbmFtZTogXCJZZXQgVG8gQXNzaWduXCIsIGNsYXNzOiBcInlldFRvQXNzaWduXCIgfSxcclxuICB9O1xyXG5cclxuICBvdGhlckVsZW1lbnRMaXN0OiBEcm9wZG93bklGW10gPSBbXHJcbiAgICB7IGxhYmVsOiBcIlBPUyBDb3VudGVyXCIsIHZhbHVlOiBcIlBPUyBDb3VudGVyXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiRGlzY3Vzc2lvbiBUYWJsZVwiLCB2YWx1ZTogXCJEaXNjdXNzaW9uIFRhYmxlXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiTWlycm9yXCIsIHZhbHVlOiBcIk1pcnJvclwiIH0sXHJcbiAgICB7IGxhYmVsOiBcIk90aGVyc1wiLCB2YWx1ZTogXCJPdGhlcnNcIiB9LFxyXG4gIF07XHJcbiAgc3RvcmVMaXN0OiBhbnkgPSBbXTtcclxuICBzZWxlY3RlZFN0b3JlTmFtZTogYW55O1xyXG5cclxuICAvLyB2bUxpc3Q6IFZtTGlicmFyeUxpc3RbXSA9IFtdO1xyXG4gIC8vIGlzVXNlckludGVyYWN0ZWRXaXRoQ2FudmFzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgYWN0aXZlSGlnaGxpZ2h0OiBmYWJyaWMuUmVjdCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgY2FuY2VsSGlnaGxpZ2h0QmxpbmsgPSBmYWxzZTtcclxuXHJcbiAgaXNCdXR0b25Mb2FkaW5nID0gZmFsc2U7XHJcbiAgaXNTdG9yZVRvdXJMb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gIGxheW91dEJvdW5kczogYW55O1xyXG4gIHNob3dMYXlvdXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjbENvdW50OiBudW1iZXIgPSAwO1xyXG4gIHdhbGxDb3VudDogbnVtYmVyID0gMDtcclxuICB0b2dnbGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRpdGxlQ2FzZTogVGl0bGVDYXNlUGlwZSxcclxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXHJcbiAgICBwcml2YXRlIHBhZ2VJbmZvOiBQYWdlSW5mb1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICApIHtcclxuICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG5cclxuICAgIHRoaXMuZ3MuZW52aXJvbm1lbnQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICBpZiAoZSkgdGhpcy5jZG5VcmwgPSBlLnBsYW5vZ3JhbUNETjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNldFBhZ2VEYXRhKCk7XHJcblxyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKGRhdGEpID0+IHtcclxuICAgICAgICBpZiAoZGF0YT8uY2xpZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaGVhZGVyRGF0YSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhd2FpdCB0aGlzLmdldFZtc0xpc3QoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XHJcbiAgICAgICAgaWYgKHBhcmFtcz8ucGxhbm9JZCkge1xyXG4gICAgICAgICAgdGhpcy5nZXRTdG9yZUZpeHR1cmVzKHBhcmFtcz8ucGxhbm9JZCk7XHJcbiAgICAgICAgICB0aGlzLmdldFN0b3JlTGlzdChwYXJhbXM/LnBsYW5vSWQpO1xyXG4gICAgICAgICAgaWYgKHBhcmFtcz8uZmxvb3JJZCkge1xyXG4gICAgICAgICAgICB0aGlzLmZsb29yRGF0YSA9IHsgX2lkOiBwYXJhbXM/LmZsb29ySWQgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRGbG9vcklkLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoYXN5bmMgKGlkKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNsaWNrZWRGbG9vciA9IHRoaXMucGxhbm9EYXRhPy5mbG9vcnM/LmZpbmQoXHJcbiAgICAgICAgKGY6IGFueSkgPT4gZi5faWQgPT09IGlkLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKFtcImRyYWZ0XCIsIFwiYWxsb2NhdGlvblBlbmRpbmdcIl0uaW5jbHVkZXMoY2xpY2tlZEZsb29yLnN0YXR1cykpIHtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKFxyXG4gICAgICAgICAgYG1hbmFnZS9wbGFub2dyYW0vb25ib2FyZC1wbGFub2dyYW0/cGxhbm9JZD0ke2NsaWNrZWRGbG9vci5wbGFub0lkfSZmbG9vcklkPSR7Y2xpY2tlZEZsb29yLl9pZH1gLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mbG9vckRhdGEgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgICAgIC8vIEtlZXAgdGhlIGZvcm0gZGlzYWJsZWQgZHVyaW5nIHRoZSBmbG9vci1zd2l0Y2ggbG9hZGluZyB3aW5kb3cgc28gdGhlXHJcbiAgICAgICAgLy8gdGVtcGxhdGUncyBlZGl0LW1vZGUgYnV0dG9ucyAoU2F2ZSAvIENhbmNlbCAvIEFkZCBFbnRyYW5jZSkgZG9uJ3QgZmxhc2guXHJcbiAgICAgICAgdGhpcy5sYXlvdXRGb3JtLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5pc0xlZnRQYW5lbENvbGxhcHNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc1JpZ2h0UGFuZWxDb2xsYXBzZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBSZXNldCBwZXItZmxvb3Igc2VsZWN0aW9uIHN0YXRlIHNvIHN0YWxlIHJlZmVyZW5jZXMgZnJvbSB0aGUgcHJldmlvdXNcclxuICAgICAgICAvLyBmbG9vciBkb24ndCBibGVlZCBpbnRvIHRoZSBuZXcgZmxvb3IncyByZW5kZXIgYW5kIGZlZWRiYWNrIHBhbmVscy5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVGZWVkYmFjayA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFpvbmVGZWVkYmFjayA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5hbGxGaXh0dXJlSW5zdGFuY2VzID0gW107XHJcbiAgICAgICAgdGhpcy5hbGxGaXh0dXJlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMud2FsbENvdW50ID0gdGhpcy5jbENvdW50ID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy5mbG9vckRhdGEgPSBjbGlja2VkRmxvb3I7XHJcbiAgICAgICAgdGhpcy5leHRyYWN0QWxsRml4dHVyZXModGhpcy5mbG9vckRhdGEpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICB0aGlzLnRhc2tEZXRhaWxzKHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsIHRoaXMuZmxvb3JEYXRhLl9pZCksXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U3RvcmVGZWVkYmFjayhcclxuICAgICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgdGhpcy5nZXRab25lVmVyaWZpY2F0aW9uRmVlZGJhY2soXHJcbiAgICAgICAgICAgICAgdGhpcy5mbG9vckRhdGEucGxhbm9JZCxcclxuICAgICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICBdKTtcclxuICAgICAgICB9IGNhdGNoIHt9XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyRmxvb3IoKTtcclxuICAgICAgICB0aGlzLmxheW91dEZvcm0uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgY29uc3QgbmV3UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcclxuICAgICAgICBuZXdQYXJhbXMuc2V0KFwicGxhbm9JZFwiLCB0aGlzLmZsb29yRGF0YS5wbGFub0lkKTtcclxuICAgICAgICBuZXdQYXJhbXMuc2V0KFwiZmxvb3JJZFwiLCB0aGlzLmZsb29yRGF0YS5faWQpO1xyXG5cclxuICAgICAgICB0aGlzLmxvY2F0aW9uLnJlcGxhY2VTdGF0ZShcclxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSxcclxuICAgICAgICAgIG5ld1BhcmFtcy50b1N0cmluZygpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZsb29ySWQuc2V0VmFsdWUodGhpcy5mbG9vckRhdGEuX2lkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FudmFzID0gbmV3IGZhYnJpYy5DYW52YXModGhpcy5jYW52YXNSZWY/Lm5hdGl2ZUVsZW1lbnQsIHtcclxuICAgICAgc2VsZWN0aW9uRnVsbHlDb250YWluZWQ6IHRydWUsXHJcbiAgICAgIHBlclBpeGVsVGFyZ2V0RmluZDogdHJ1ZSxcclxuICAgICAgdGFyZ2V0RmluZFRvbGVyYW5jZTogNSxcclxuICAgIH0pO1xyXG5cclxuICAgIGZyb21FdmVudCh0aGlzLmNhbnZhcyBhcyBhbnksIFwib2JqZWN0Om1vZGlmaWVkXCIpXHJcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxMDApKVxyXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jIChlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBtb3ZlZE9iajogYW55ID0gZS50YXJnZXQ7XHJcblxyXG4gICAgICAgIGlmICghbW92ZWRPYmopIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0Rm9ybT8uZW5hYmxlZCkge1xyXG4gICAgICAgICAgdGhpcy5sYXlvdXRIYXNVbnNhdmVkQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobW92ZWRPYmo/LnR5cGUgPT09IFwiYWN0aXZlU2VsZWN0aW9uXCIpIHtcclxuICAgICAgICAgIHRoaXMuYXBwbHlHcm91cFRyYW5zZm9ybShtb3ZlZE9iaik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhY3Rpb24gPSBlLnRyYW5zZm9ybT8uYWN0aW9uO1xyXG5cclxuICAgICAgICBjb25zdCBpc1Jlc2l6ZSA9XHJcbiAgICAgICAgICBhY3Rpb24gPT09IFwic2NhbGVcIiB8fCBhY3Rpb24gPT09IFwic2NhbGVYXCIgfHwgYWN0aW9uID09PSBcInNjYWxlWVwiO1xyXG5cclxuICAgICAgICBpZiAoaXNSZXNpemUpIHtcclxuICAgICAgICAgIGNvbnN0IHR5cGUgPSBtb3ZlZE9iaj8ub2JqVHlwZSA/PyBcImdyb3VwXCI7XHJcblxyXG4gICAgICAgICAgY29uc3QgdXBkYXRlZENvbmZpZyA9IHtcclxuICAgICAgICAgICAgeDogbW92ZWRPYmoubGVmdCxcclxuICAgICAgICAgICAgeTogbW92ZWRPYmoudG9wLFxyXG4gICAgICAgICAgICB3aWR0aDogbW92ZWRPYmouZ2V0U2NhbGVkV2lkdGgoKSxcclxuICAgICAgICAgICAgaGVpZ2h0OiBtb3ZlZE9iai5nZXRTY2FsZWRIZWlnaHQoKSxcclxuICAgICAgICAgICAgYW5nbGU6IG1vdmVkT2JqLmFuZ2xlLFxyXG4gICAgICAgICAgICBlbGVtZW50RGF0YTogbW92ZWRPYmouZGF0YSxcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ3YWxsXCI6IHtcclxuICAgICAgICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmUobW92ZWRPYmopO1xyXG4gICAgICAgICAgICAgIHVwZGF0ZWRDb25maWcuZWxlbWVudERhdGEuYW5nbGUgPSB1cGRhdGVkQ29uZmlnLmFuZ2xlO1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCBuZXdXYWxsID0gYXdhaXQgdGhpcy5kcmF3V2FsbChcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy54LFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy55LFxyXG4gICAgICAgICAgICAgICAgdGhpcy53YWxsVGhpY2tuZXNzLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy53aWR0aCAtIDAuMjcsXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkQ29uZmlnLmVsZW1lbnREYXRhLFxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgIChuZXdXYWxsIGFzIGFueSkub2JqVHlwZSA9IFwid2FsbFwiO1xyXG4gICAgICAgICAgICAgIChuZXdXYWxsIGFzIGFueSkuZGF0YSA9IHVwZGF0ZWRDb25maWcuZWxlbWVudERhdGE7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuY2FudmFzLnNldEFjdGl2ZU9iamVjdChuZXdXYWxsKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2FzZSBcIm90aGVyc1wiOiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXMucmVtb3ZlKG1vdmVkT2JqKTtcclxuICAgICAgICAgICAgICB1cGRhdGVkQ29uZmlnLmVsZW1lbnREYXRhLnJlbGF0aXZlUG9zaXRpb24uYW5nbGUgPVxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy5hbmdsZTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgbmV3T3RoZXIgPSB0aGlzLmRyYXdPdGhlckVsZW1lbnRzV2l0aExhYmVsKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXMsXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkQ29uZmlnLngsXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkQ29uZmlnLnksXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkQ29uZmlnLmFuZ2xlLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy53aWR0aCAtIDIsXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkQ29uZmlnLmhlaWdodCAtIDIsXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkQ29uZmlnLmVsZW1lbnREYXRhLFxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgIChuZXdPdGhlciBhcyBhbnkpLm9ialR5cGUgPSBcIm90aGVyc1wiO1xyXG4gICAgICAgICAgICAgIChuZXdPdGhlciBhcyBhbnkpLmRhdGEgPSB1cGRhdGVkQ29uZmlnLmVsZW1lbnREYXRhO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmNhbnZhcy5zZXRBY3RpdmVPYmplY3QobmV3T3RoZXIpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjYXNlIFwiZW50cmFuY2VcIjoge1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjYXNlIFwiZml4dHVyZVwiOiB7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVXYWxsQ29vcmRpbmF0ZXMoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUZpeHR1cmVDb29yZGluYXRlcygpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlT3RoZXJFbGVtZW50c0Nvb3JkaW5hdGVzKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVFbnRyYW5jZUNvb3JkaW5hdGVzKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2V0dXBab29tSGFuZGxlcnMoKTtcclxuXHJcbiAgICB0aGlzLmxpc3RlblRvRGVsZXRlS2V5KCk7XHJcbiAgICB0aGlzLnRvZ2dsZVBhbmVsKFwibGVmdFwiLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZUFsbFBvc2l0aW9ucygpIHtcclxuICAgIHRoaXMudXBkYXRlV2FsbENvb3JkaW5hdGVzKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUZpeHR1cmVDb29yZGluYXRlcygpO1xyXG4gICAgdGhpcy51cGRhdGVPdGhlckVsZW1lbnRzQ29vcmRpbmF0ZXMoKTtcclxuICAgIHRoaXMudXBkYXRlRW50cmFuY2VDb29yZGluYXRlcygpO1xyXG5cclxuICAgIHRoaXMuZmxvb3JEYXRhLmNhZExheW91dCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlHcm91cFRyYW5zZm9ybShzZWxlY3Rpb246IGZhYnJpYy5BY3RpdmVTZWxlY3Rpb24pIHtcclxuICAgIGNvbnN0IG1hdHJpeCA9IHNlbGVjdGlvbi5jYWxjVHJhbnNmb3JtTWF0cml4KCk7XHJcblxyXG4gICAgc2VsZWN0aW9uLmdldE9iamVjdHMoKS5mb3JFYWNoKChvYmo6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBvYmpNYXRyaXggPSBvYmouY2FsY1RyYW5zZm9ybU1hdHJpeCgpO1xyXG4gICAgICBjb25zdCBmaW5hbE1hdHJpeCA9IGZhYnJpYy51dGlsLm11bHRpcGx5VHJhbnNmb3JtTWF0cmljZXMoXHJcbiAgICAgICAgbWF0cml4LFxyXG4gICAgICAgIG9iak1hdHJpeCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IHBvaW50ID0gbmV3IGZhYnJpYy5Qb2ludCgwLCAwKS50cmFuc2Zvcm0oZmluYWxNYXRyaXgpO1xyXG5cclxuICAgICAgb2JqLnNldCh7XHJcbiAgICAgICAgbGVmdDogcG9pbnQueCxcclxuICAgICAgICB0b3A6IHBvaW50LnksXHJcbiAgICAgICAgYW5nbGU6IHNlbGVjdGlvbi5hbmdsZSArIChvYmouYW5nbGUgPz8gMCksXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgb2JqLnNldENvb3JkcygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gVW5ncm91cCBhZnRlciBhcHBseWluZyB0cmFuc2Zvcm1cclxuICAgIHRoaXMuY2FudmFzLmRpc2NhcmRBY3RpdmVPYmplY3QoKTtcclxuICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICB9XHJcblxyXG4gIHJlc2l6ZUNhbnZhcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLmNhbnZhcy5zZXREaW1lbnNpb25zKHtcclxuICAgICAgd2lkdGg6IGNvbnRhaW5lci5jbGllbnRXaWR0aCAtIDUwLFxyXG5cclxuICAgICAgaGVpZ2h0OiBjb250YWluZXIuY2xpZW50SGVpZ2h0IC0gNDAsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICB9XHJcblxyXG4gIHNldHVwWm9vbUhhbmRsZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jYW52YXMub24oXCJtb3VzZTp3aGVlbFwiLCAob3B0OiBmYWJyaWMuVEV2ZW50PFdoZWVsRXZlbnQ+KSA9PiB7XHJcbiAgICAgIGNvbnN0IGUgPSBvcHQuZTtcclxuXHJcbiAgICAgIGlmIChlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSB7XHJcbiAgICAgICAgLy8gdGhpcy5pc1VzZXJJbnRlcmFjdGVkV2l0aENhbnZhcyA9IHRydWU7XHJcbiAgICAgICAgY29uc3QgZGVsdGEgPSBlLmRlbHRhWTtcclxuICAgICAgICBsZXQgem9vbSA9IHRoaXMuY2FudmFzLmdldFpvb20oKTtcclxuICAgICAgICB6b29tICo9IDAuOTk1ICoqIGRlbHRhO1xyXG5cclxuICAgICAgICB6b29tID0gTWF0aC5tYXgoMC4wNSwgTWF0aC5taW4oem9vbSwgNSkpO1xyXG5cclxuICAgICAgICB0aGlzLmNhbnZhcy56b29tVG9Qb2ludChcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgeDogZS5vZmZzZXRYLFxyXG4gICAgICAgICAgICB5OiBlLm9mZnNldFksXHJcbiAgICAgICAgICB9IGFzIGZhYnJpYy5Qb2ludCxcclxuICAgICAgICAgIHpvb20sXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XHJcbiAgICBsZXQgbGFzdFBvc1ggPSAwO1xyXG4gICAgbGV0IGxhc3RQb3NZID0gMDtcclxuXHJcbiAgICB0aGlzLmNhbnZhcy5vbihcIm1vdXNlOmRvd25cIiwgKG9wdDogYW55KSA9PiB7XHJcbiAgICAgIGlmICghb3B0LnRhcmdldCkge1xyXG4gICAgICAgIGlzRHJhZ2dpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2FudmFzLnNlbGVjdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGUgPSBvcHQuZTtcclxuICAgICAgICBsYXN0UG9zWCA9IGUuY2xpZW50WDtcclxuICAgICAgICBsYXN0UG9zWSA9IGUuY2xpZW50WTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYW52YXMub24oXCJtb3VzZTptb3ZlXCIsIChvcHQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoaXNEcmFnZ2luZyAmJiB0aGlzLmNhbnZhcy52aWV3cG9ydFRyYW5zZm9ybSkge1xyXG4gICAgICAgIC8vIHRoaXMuaXNVc2VySW50ZXJhY3RlZFdpdGhDYW52YXMgPSB0cnVlO1xyXG4gICAgICAgIGNvbnN0IGUgPSBvcHQuZTtcclxuICAgICAgICBjb25zdCB2cHQgPSB0aGlzLmNhbnZhcy52aWV3cG9ydFRyYW5zZm9ybTtcclxuICAgICAgICB2cHRbNF0gKz0gZS5jbGllbnRYIC0gbGFzdFBvc1g7XHJcbiAgICAgICAgdnB0WzVdICs9IGUuY2xpZW50WSAtIGxhc3RQb3NZO1xyXG4gICAgICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICAgICAgICBsYXN0UG9zWCA9IGUuY2xpZW50WDtcclxuICAgICAgICBsYXN0UG9zWSA9IGUuY2xpZW50WTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYW52YXMub24oXCJtb3VzZTp1cFwiLCAoKSA9PiB7XHJcbiAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jYW52YXMuc2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKFwiTWFuYWdlIFN0b3JlIFBsYW5vXCIpO1xyXG4gICAgdGhpcy5wYWdlSW5mby5zZXRCcmVhZGNydW1icyhbXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogXCJQbGFub2dyYW1cIixcclxuICAgICAgICBwYXRoOiBcIi9tYW5hZ2UvcGxhbm9ncmFtL21hbmFnZS1wbGFub2dyYW1zXCIsXHJcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGlzU2VwYXJhdG9yOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlwiLFxyXG4gICAgICAgIHBhdGg6IFwiXCIsXHJcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGlzU2VwYXJhdG9yOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBvbkZpeHR1cmVTYXZlKCkge1xyXG4gICAgdGhpcy5zdWJtaXRGaXh0dXJlID0gdHJ1ZTtcclxuICAgIC8vIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YS50YXNrVHlwZSA9IHRoaXMucHVibGlzaGluZ1N0YXRlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3VibWl0Rml4dHVyZSA9IGZhbHNlO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uRml4dHVyZVBhZ2VDYW5jZWwoKSB7XHJcbiAgICAvLyB0aGlzLnN1Ym1pdEZpeHR1cmUgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YSA9IG51bGw7XHJcbiAgICB0aGlzLmVkaXRGaXh0dXJlU2VjdGlvbiA9IFwiYmFzaWMtZGV0YWlsc1wiO1xyXG4gICAgdGhpcy5lZGl0Rml4dHVyZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5lZGl0RnJvbVRhYiA9IFwiZml4dHVyZVwiO1xyXG4gICAgLy8gdGhpcy5sYXlvdXRGb3JtLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVzaXplQ2FudmFzKCk7XHJcbiAgICAgIHRoaXMuZml0Q2FudmFzVG9MYXlvdXRBbmltYXRlZCgpO1xyXG4gICAgfSwgMzAwKTtcclxuICB9XHJcblxyXG4gIG9uRml4dHVyZVN1Ym1pdChldmVudDogYW55KSB7XHJcbiAgICBpZiAoIWV2ZW50ICYmICF0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEpIHJldHVybjtcclxuXHJcbiAgICBpZiAoZXZlbnQ/LnNoZWxmICYmIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YT8uc2hlbGZDb25maWcpIHtcclxuICAgICAgZXZlbnQuc2hlbGYgPSBldmVudC5zaGVsZi5tYXAoKHNoZWxmOiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgZmluZFNoZWxmID0gdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnLmZpbmQoXHJcbiAgICAgICAgICAoZWxlOiBhbnkpID0+IGVsZS5zaGVsZk51bWJlciA9PSBpbmRleCArIDEsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoZmluZFNoZWxmKSB7XHJcbiAgICAgICAgICBzaGVsZiA9IHsgLi4uZmluZFNoZWxmLCAuLi5zaGVsZiB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgZGV0YWlscyA9XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YS5zaGVsZkNvbmZpZ1tcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEuc2hlbGZDb25maWcubGVuZ3RoIC0gMVxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgICAgZGV0YWlscy5zaGVsZk51bWJlciA9IGluZGV4ICsgMTtcclxuICAgICAgICAgIHNoZWxmID0geyAuLi5kZXRhaWxzLCAuLi5zaGVsZiB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2hlbGY7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhW1wic2hlbGZDb25maWdcIl0gPSBldmVudD8uc2hlbGY7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YVtcImRlc2NyaXB0aW9uXCJdID0gZXZlbnQ/LmRlc2NyaXB0aW9uID8/IFwiXCI7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YVtcInRlbXBsYXRlR3JvdXBOYW1lXCJdID1cclxuICAgICAgICBldmVudD8udGVtcGxhdGVHcm91cE5hbWUgPz8gXCJcIjtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhLmhlYWRlci5sYWJlbCA9IGV2ZW50Py5oZWFkZXJMYWJlbCA/PyBcIlwiO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEuZm9vdGVyLmxhYmVsID0gZXZlbnQ/LmZvb3RlckxhYmVsID8/IFwiXCI7XHJcbiAgICB9IGVsc2UgaWYgKGV2ZW50Py5zZWN0aW9uKSB7XHJcbiAgICAgIGV2ZW50LnNlY3Rpb24uZm9yRWFjaCgoc2VjOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgbnVtYmVyID0gc2VjPy5zaGVsdmVzPy5tYXAoKGVsZTogYW55KSA9PlxyXG4gICAgICAgICAgcGFyc2VJbnQoZWxlLnNwbGl0KFwiIFwiKVsxXSksXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGE/LnNoZWxmQ29uZmlnLmZvckVhY2goKHNoZWxmOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChudW1iZXIuaW5jbHVkZXMoc2hlbGYuc2hlbGZOdW1iZXIpKSB7XHJcbiAgICAgICAgICAgIHNoZWxmLnpvbmUgPSBzZWMuem9uZTtcclxuICAgICAgICAgICAgc2hlbGYucHJvZHVjdEJyYW5kTmFtZSA9IHNlYy5wcm9kdWN0QnJhbmROYW1lO1xyXG4gICAgICAgICAgICBzaGVsZi5wcm9kdWN0Q2F0ZWdvcnkgPSBzZWMucHJvZHVjdENhdGVnb3J5O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAoZXZlbnQ/LnZtQ29uZmlnICYmIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YT8udm1Db25maWcpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhW1widm1Db25maWdcIl0gPSBldmVudD8udm1Db25maWc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAvLyB0aGlzLmdldFZtc0xpc3QoKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZWRpdEZpeHR1cmVTZWN0aW9uID0gXCJiYXNpYy1kZXRhaWxzXCI7XHJcbiAgICAgICAgdGhpcy5lZGl0Rml4dHVyZSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmVkaXRGcm9tVGFiID09PSBcInpvbmVcIikge1xyXG4gICAgICAgICAgdGhpcy5wZXJzaXN0Wm9uZUVkaXRBY2NlcHRlZCgpO1xyXG4gICAgICAgICAgdGhpcy5lZGl0RnJvbVRhYiA9IFwiZml4dHVyZVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdldFN0b3JlRml4dHVyZXModGhpcy5wbGFub0RhdGE/Ll9pZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVBhbmVsKHNpZGU6IFwibGVmdFwiIHwgXCJyaWdodFwiLCBhY3Rpb24/OiBib29sZWFuKSB7XHJcbiAgICBpZiAoc2lkZSA9PT0gXCJsZWZ0XCIpIHtcclxuICAgICAgdGhpcy5pc0xlZnRQYW5lbENvbGxhcHNlZCA9IGFjdGlvbiA/PyAhdGhpcy5pc0xlZnRQYW5lbENvbGxhcHNlZDtcclxuICAgICAgaWYgKCF0aGlzLmlzTGVmdFBhbmVsQ29sbGFwc2VkKSB0aGlzLmlzUmlnaHRQYW5lbENvbGxhcHNlZCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlzUmlnaHRQYW5lbENvbGxhcHNlZCA9IGFjdGlvbiA/PyAhdGhpcy5pc1JpZ2h0UGFuZWxDb2xsYXBzZWQ7XHJcbiAgICAgIGlmICghdGhpcy5pc1JpZ2h0UGFuZWxDb2xsYXBzZWQpIHRoaXMuaXNMZWZ0UGFuZWxDb2xsYXBzZWQgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRml4dHVyZUZlZWRiYWNrKSB7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZUZpeHR1cmVPbkZlZWRiYWNrUGFuZWwoe30pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVzaXplQ2FudmFzKCk7XHJcbiAgICAgIHRoaXMuZml0Q2FudmFzVG9MYXlvdXRBbmltYXRlZCgpO1xyXG4gICAgfSwgNDAwKTtcclxuICB9XHJcblxyXG4gIG9uRmVlZGJhY2tUYWJDaGFuZ2UodGFiOiBcImZpeHR1cmVcIiB8IFwiem9uZVwiKSB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVGZWVkYmFja1RhYiA9PT0gdGFiKSByZXR1cm47XHJcbiAgICB0aGlzLmFjdGl2ZUZlZWRiYWNrVGFiID0gdGFiO1xyXG5cclxuICAgIC8vIFBhbmVsIG1pbi13aWR0aCBhbmltYXRlcyBvdmVyIDMwMG1zIChzZWUgW2NsYXNzXj1cImNvbFwiXSB0cmFuc2l0aW9uKS5cclxuICAgIC8vIFJlc2l6ZSBwZXIgZnJhbWUgc28gdGhlIGNhbnZhcyB0cmFja3MgdGhlIGNvbnRhaW5lciB3aWR0aCBhcyBpdCBhbmltYXRlcyxcclxuICAgIC8vIHRoZW4gZml0IHRoZSBsYXlvdXQgb25jZSB0aGUgdHJhbnNpdGlvbiBzZXR0bGVzLlxyXG4gICAgY29uc3QgZHVyYXRpb24gPSAzNTA7XHJcbiAgICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgY29uc3Qgc3RlcCA9ICgpID0+IHtcclxuICAgICAgdGhpcy5yZXNpemVDYW52YXMoKTtcclxuICAgICAgaWYgKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQgPCBkdXJhdGlvbikge1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZpdENhbnZhc1RvTGF5b3V0QW5pbWF0ZWQoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTtcclxuICB9XHJcblxyXG4gIGdldFpvbmVWZXJpZmljYXRpb25GZWVkYmFjayhwbGFub0lkOiBzdHJpbmcsIGZsb29ySWQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAgIC5nZXRab25lVmVyaWZpY2F0aW9uRmVlZGJhY2soeyBwbGFub0lkLCBmbG9vcklkIH0pXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy56b25lRmVlZGJhY2sgPSByZXM/LmRhdGEgPz8gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaXh0dXJlRmVlZGJhY2s/LmZpeHR1cmVGZWVkYmFjaz8uZml4dHVyZUlkKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rab25lRmVlZGJhY2soXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZUZlZWRiYWNrLmZpeHR1cmVGZWVkYmFjay5maXh0dXJlSWQsXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVB1Ymxpc2hpbmdTdGF0ZSgpO1xyXG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuem9uZUZlZWRiYWNrID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQdWJsaXNoaW5nU3RhdGUoKTtcclxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFpvbmVGZWVkYmFjayhmaXh0dXJlSWQ6IHN0cmluZykge1xyXG4gICAgY29uc3Qgcm93czogYW55W10gPSB0aGlzLnpvbmVGZWVkYmFjaz8uem9uZVZlcmlmaWNhdGlvbkRhdGEgPz8gW107XHJcbiAgICB0aGlzLnNlbGVjdGVkWm9uZUZlZWRiYWNrID1cclxuICAgICAgcm93cy5maW5kKChyb3c6IGFueSkgPT4gcm93Py5maXh0dXJlSWQ/LnRvU3RyaW5nPy4oKSA9PT0gZml4dHVyZUlkKSA/P1xyXG4gICAgICBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RvcmVGZWVkYmFjayhcclxuICAgIHBsYW5vSWQ6IHN0cmluZyxcclxuICAgIGZsb29ySWQ6IHN0cmluZyxcclxuICAgIGZpbHRlcjogYW55LFxyXG4gICAgY2hlY2tQdWJsaXNoU3RhdGU6IGJvb2xlYW4gPSB0cnVlLFxyXG4gICkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgbGV0IGRhdGE6IGFueSA9IHtcclxuICAgICAgICBwbGFub0lkOiBwbGFub0lkLFxyXG4gICAgICAgIGZsb29ySWQ6IGZsb29ySWQsXHJcbiAgICAgIH07XHJcbiAgICAgIGlmIChmaWx0ZXIpIHtcclxuICAgICAgICBkYXRhID0geyAuLi5kYXRhLCAuLi5maWx0ZXIgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5hcGlTZXJ2aWNlLmdldFN0b3JlRmVlZGJhY2soZGF0YSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiBhc3luYyAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3RvcmVGZWVkYmFjayA9IHJlcy5kYXRhO1xyXG4gICAgICAgICAgaWYgKHJlcy5kYXRhPy5sYXlvdXREYXRhPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzTGF5b3V0RmVlZGJhY2socmVzLmRhdGEubGF5b3V0RGF0YSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NMYXlvdXRGZWVkYmFjayhbXSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHJlcy5kYXRhPy5maXh0dXJlRGF0YT8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICByZXMuZGF0YT8uZml4dHVyZURhdGEubGVuZ3RoICYmXHJcbiAgICAgICAgICAgICAgIXJlcy5kYXRhPy5maXh0dXJlRGF0YT8uWzBdPy5maXh0dXJlSWRcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zaG93TGF5b3V0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NGaXh0dXJlRmVlZGJhY2socmVzLmRhdGEuZml4dHVyZURhdGEpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzRml4dHVyZUZlZWRiYWNrKFtdKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocmVzLmRhdGE/LlZtRGF0YT8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1ZtRmVlZGJhY2socmVzLmRhdGEuVm1EYXRhKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1ZtRmVlZGJhY2soW10pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChjaGVja1B1Ymxpc2hTdGF0ZSkge1xyXG4gICAgICAgICAgICAvLyB0aGlzLmNhbGN1bGF0ZVB1Ymxpc2hpbmdTdGF0ZSgpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaXh0dXJlRmVlZGJhY2s/LmZpeHR1cmVGZWVkYmFjaz8uZml4dHVyZUlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2VGaXh0dXJlT25GZWVkYmFja1BhbmVsKHtcclxuICAgICAgICAgICAgICBjdXJyZW50Rml4dHVyZTpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRmVlZGJhY2suZml4dHVyZUZlZWRiYWNrLmZpeHR1cmVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gZmV0Y2ggc3RvcmUgZmVlZGJhY2tcIik7XHJcbiAgICAgICAgICByZWplY3QoKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlUHVibGlzaGluZ1N0YXRlKCkge1xyXG4gICAgbGV0IGRpc2FibGVFZGl0ID0gZmFsc2U7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb25baV07XHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWxlbWVudC5maXh0dXJlcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGNvbnN0IGZpeHR1cmUgPSBlbGVtZW50LmZpeHR1cmVzW2pdO1xyXG5cclxuICAgICAgICBpZiAoZml4dHVyZS5pc3N1ZSkge1xyXG4gICAgICAgICAgZGlzYWJsZUVkaXQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZsb29yRGF0YT8uY2VudGVyRml4dHVyZSkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBmaXh0dXJlID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZVtpXTtcclxuXHJcbiAgICAgICAgaWYgKGZpeHR1cmUuaXNzdWUpIHtcclxuICAgICAgICAgIGRpc2FibGVFZGl0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGlzYWJsZUVkaXQpIHtcclxuICAgICAgdGhpcy5kaXNhYmxlRWRpdCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRpc2FibGVFZGl0ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxheW91dERhdGEgPSB0aGlzLnRhc2tJbmZvPy50YXNrRGV0YWlscz8uZmluZChcclxuICAgICAgKGVsZTogYW55KSA9PiBlbGUudHlwZSA9PSBcImxheW91dFwiLFxyXG4gICAgKTtcclxuICAgIGxldCBmaXh0dXJlRGF0YSA9IHRoaXMudGFza0luZm8/LnRhc2tEZXRhaWxzPy5maW5kKFxyXG4gICAgICAoZWxlOiBhbnkpID0+IGVsZS50eXBlID09IFwiZml4dHVyZVwiLFxyXG4gICAgKTtcclxuICAgIGxldCB2bURhdGEgPSB0aGlzLnRhc2tJbmZvPy50YXNrRGV0YWlscz8uZmluZChcclxuICAgICAgKGVsZTogYW55KSA9PiBlbGUudHlwZSA9PSBcImZpeHR1cmVcIixcclxuICAgICk7XHJcbiAgICBjb25zdCB6b25lVGFza0V4aXN0cyA9ICEhdGhpcy56b25lRmVlZGJhY2s/LnpvbmVWZXJpZmljYXRpb25UYXNrO1xyXG4gICAgY29uc3Qgem9uZUFwcHJvdmVkID1cclxuICAgICAgIXpvbmVUYXNrRXhpc3RzIHx8IHRoaXMuem9uZVRhc2tTdHlsZS5uYW1lID09IFwiQXBwcm92ZWRcIjtcclxuXHJcbiAgICBjb25zdCBhbGxOb25ab25lQXBwcm92ZWQgPVxyXG4gICAgICB0aGlzLnRhc2tTdHlsZS5sYXlvdXQubmFtZSA9PSBcIkFwcHJvdmVkXCIgJiZcclxuICAgICAgdGhpcy50YXNrU3R5bGUuZml4dHVyZS5uYW1lID09IFwiQXBwcm92ZWRcIiAmJlxyXG4gICAgICB0aGlzLnRhc2tTdHlsZS52bS5uYW1lID09IFwiQXBwcm92ZWRcIjtcclxuXHJcbiAgICBpZiAoYWxsTm9uWm9uZUFwcHJvdmVkICYmIHpvbmVBcHByb3ZlZCkge1xyXG4gICAgICB0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9IFwiY29tcGxldGVcIjtcclxuICAgIH0gZWxzZSBpZiAoYWxsTm9uWm9uZUFwcHJvdmVkICYmICF6b25lQXBwcm92ZWQpIHtcclxuICAgICAgLy8gT25seSB6b25lIHJldmlldyBpcyBibG9ja2luZyDigJQgbm8gcHVibGlzaCBhY3Rpb24gdG8gdGFrZSBoZXJlLlxyXG4gICAgICB0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9IFwiXCI7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMudGFza1N0eWxlLmZpeHR1cmUubmFtZSA9PSBcIkFwcHJvdmVkXCIpIHtcclxuICAgICAgdGhpcy5wdWJsaXNoaW5nU3RhdGUgPSBcInZtXCI7XHJcbiAgICAgIGlmIChcclxuICAgICAgICB2bURhdGEgJiZcclxuICAgICAgICAoKHZtRGF0YS5zdGF0dXMgPT0gXCJzdWJtaXRcIiAmJiB2bURhdGEuZmVlZGJhY2tTdGF0dXMgPT0gXCJkaXNhZ3JlZVwiKSB8fFxyXG4gICAgICAgICAgdm1EYXRhPy5yZWRvU3RhdHVzKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9IFwidm0tcmVkb1wiO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9IFwiZml4dHVyZVwiO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgZml4dHVyZURhdGEgJiZcclxuICAgICAgICAoKGZpeHR1cmVEYXRhLnN0YXR1cyA9PSBcInN1Ym1pdFwiICYmXHJcbiAgICAgICAgICBmaXh0dXJlRGF0YS5mZWVkYmFja1N0YXR1cyA9PSBcImRpc2FncmVlXCIpIHx8XHJcbiAgICAgICAgICBmaXh0dXJlRGF0YT8ucmVkb1N0YXR1cylcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5wdWJsaXNoaW5nU3RhdGUgPSAhdGhpcy5mbG9vckRhdGEuaXNFZGl0ZWRcclxuICAgICAgICAgID8gXCJmaXh0dXJlLXJlZG9cIlxyXG4gICAgICAgICAgOiBcImZpeHR1cmVcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFRlbXBsYXRlKGZpeHR1cmVDb25maWdJZDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgIHRoaXMuYXBpU2VydmljZS5nZXRGaXh0dXJlVGVtcGxhdGUoZml4dHVyZUNvbmZpZ0lkKSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBwcm9jZXNzTGF5b3V0RmVlZGJhY2soc3RvcmVGZWVkYmFjazogYW55W10pIHtcclxuICAgIGNvbnN0IGxheW91dEZlZWRiYWNrID0gc3RvcmVGZWVkYmFjay5maW5kKFxyXG4gICAgICAoZmVlZGJhY2spID0+IGZlZWRiYWNrLnR5cGUgPT09IFwibGF5b3V0XCIsXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHdhbGxFbGVtZW50cyA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZmlsdGVyKFxyXG4gICAgICAoZWxlbWVudDogYW55KSA9PiBlbGVtZW50LmVsZW1lbnRUeXBlID09PSBcIndhbGxcIixcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGxheW91dEZlZWRiYWNrKSB7XHJcbiAgICAgIGNvbnN0IGlzc3VlcyA9IGxheW91dEZlZWRiYWNrPy5hbnN3ZXJzPy5bMF0/Lmlzc3VlcztcclxuXHJcbiAgICAgIGlmIChpc3N1ZXMpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlzc3Vlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgaXNzdWUgPSBpc3N1ZXNbaV07XHJcblxyXG4gICAgICAgICAgaWYgKGlzc3VlLmlzc3VlVHlwZSA9PT0gXCJleHRyYUZpeHR1cmVcIikge1xyXG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlcyA9IGlzc3VlLkRldGFpbHMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgIChmaXh0dXJlOiBhbnkpID0+IGZpeHR1cmUuc3RhdHVzID09PSBcInBlbmRpbmdcIixcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZml4dHVyZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICBjb25zdCBmaXh0dXJlID0gZml4dHVyZXNbal07XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlOiBhbnkgPSBhd2FpdCB0aGlzLmdldFRlbXBsYXRlKFxyXG4gICAgICAgICAgICAgICAgZml4dHVyZS5maXh0dXJlQ29uZmlnSWQsXHJcbiAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgZml4dHVyZUlkID0gYG5ldy0ke2NyeXB0by5yYW5kb21VVUlEKCl9YDtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgZ2hvc3RGaXh0dXJlID0ge1xyXG4gICAgICAgICAgICAgICAgLi4udGVtcGxhdGU/LmRhdGEsXHJcbiAgICAgICAgICAgICAgICBmaXh0dXJlQ29uZmlnSWQ6IHRlbXBsYXRlPy5kYXRhPy5faWQsXHJcbiAgICAgICAgICAgICAgICBfaWQ6IGZpeHR1cmVJZCxcclxuICAgICAgICAgICAgICAgIHJlbGF0aXZlUG9zaXRpb246IHsgeDogMCwgeTogMCwgdW5pdDogXCJmdFwiIH0sXHJcbiAgICAgICAgICAgICAgICBzaGVsZkNvbmZpZzogZml4dHVyZS5zaGVsZkNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGdob3N0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgaXNzdWU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBpc3N1ZURhdGE6IGZpeHR1cmUsXHJcbiAgICAgICAgICAgICAgICB0YXNrVHlwZTogXCJsYXlvdXRcIixcclxuICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAvLyBjb25zdCBmaXh0dXJlR3JvdXAgPSB0aGlzLnBhdGNoRml4dHVyZSh7IGZpeHR1cmVOYW1lOiBnaG9zdEZpeHR1cmUuZml4dHVyZU5hbWUsIGZpeHR1cmVDb25maWdJZDogZ2hvc3RGaXh0dXJlLmZpeHR1cmVDb25maWdJZCwgX2lkOiBnaG9zdEZpeHR1cmUuX2lkIH0pO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudFR5cGUgPT09IFwid2FsbFwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgd2FsbEluZGV4OiBudW1iZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgYXNzb2NXYWxsTnVtID0gZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudE51bWJlcjtcclxuICAgICAgICAgICAgICAgIGlmIChhc3NvY1dhbGxOdW0gPj0gd2FsbEVsZW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICB3YWxsSW5kZXggPSB3YWxsRWxlbWVudHMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhc3NvY1dhbGxOdW0gPD0gMCkge1xyXG4gICAgICAgICAgICAgICAgICB3YWxsSW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgd2FsbEluZGV4ID0gYXNzb2NXYWxsTnVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRGaXh0dXJlczogYW55ID0gd2FsbEVsZW1lbnRzLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgIChlbGVtZW50OiBhbnkpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIgJiZcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmVsZW1lbnROdW1iZXIgPT09IHdhbGxJbmRleCxcclxuICAgICAgICAgICAgICAgICkuZml4dHVyZXM7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhc3NvY0ZpeHR1cmVOdW0gPSBmaXh0dXJlLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXNzb2NGaXh0dXJlTnVtID4gZWxlbWVudEZpeHR1cmVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAoZWxlbWVudDogYW55KSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmVsZW1lbnROdW1iZXIgPT09IHdhbGxJbmRleCxcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpeHR1cmVzLnB1c2goZ2hvc3RGaXh0dXJlKTtcclxuICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRGb3JtRml4dHVyZXMod2FsbEluZGV4ISAtIDEpLnB1c2goZml4dHVyZUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXNzb2NGaXh0dXJlTnVtIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvblxyXG4gICAgICAgICAgICAgICAgICAgIC5maW5kKFxyXG4gICAgICAgICAgICAgICAgICAgICAgKGVsZW1lbnQ6IGFueSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5lbGVtZW50TnVtYmVyID09PSB3YWxsSW5kZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIC5maXh0dXJlcy51bnNoaWZ0KGdob3N0Rml4dHVyZSk7XHJcbiAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2V0Rm9ybUZpeHR1cmVzKHdhbGxJbmRleCEgLSAxKS5pbnNlcnQoMCwgZml4dHVyZUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb25cclxuICAgICAgICAgICAgICAgICAgICAuZmluZChcclxuICAgICAgICAgICAgICAgICAgICAgIChlbGVtZW50OiBhbnkpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZWxlbWVudFR5cGUgPT09IFwid2FsbFwiICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZWxlbWVudE51bWJlciA9PT0gd2FsbEluZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAuZml4dHVyZXMuc3BsaWNlKGFzc29jRml4dHVyZU51bSAtIDEsIDAsIGdob3N0Rml4dHVyZSk7XHJcbiAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2V0Rm9ybUZpeHR1cmVzKHdhbGxJbmRleCEgLSAxKS5pbnNlcnQoYXNzb2NGaXh0dXJlTnVtIC0gMSwgZml4dHVyZUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRUeXBlID09PSBcImZsb29yXCIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFzc29jRml4dHVyZU51bSA9IGZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhc3NvY0ZpeHR1cmVOdW0gPiB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlLnB1c2goZ2hvc3RGaXh0dXJlKTtcclxuICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRGb3JtRmxvb3JGaXh0dXJlcy5wdXNoKGZpeHR1cmVHcm91cCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFzc29jRml4dHVyZU51bSA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUudW5zaGlmdChnaG9zdEZpeHR1cmUpO1xyXG4gICAgICAgICAgICAgICAgICAvLyB0aGlzLmdldEZvcm1GbG9vckZpeHR1cmVzLmluc2VydCgwLCBmaXh0dXJlR3JvdXApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZS5zcGxpY2UoXHJcbiAgICAgICAgICAgICAgICAgICAgYXNzb2NGaXh0dXJlTnVtIC0gMSxcclxuICAgICAgICAgICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGdob3N0Rml4dHVyZSxcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRGb3JtRmxvb3JGaXh0dXJlcy5pbnNlcnQoYXNzb2NGaXh0dXJlTnVtIC0gMSwgZml4dHVyZUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGlzc3VlLmlzc3VlVHlwZSA9PT0gXCJmaXh0dXJlTWlzc2luZ1wiIHx8XHJcbiAgICAgICAgICAgIGlzc3VlLmlzc3VlVHlwZSA9PT0gXCJmaXh0dXJlTWlzbWF0Y2hcIlxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmVzID0gaXNzdWUuRGV0YWlscy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgKGZpeHR1cmU6IGFueSkgPT4gZml4dHVyZS5zdGF0dXMgPT09IFwicGVuZGluZ1wiLFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBmaXh0dXJlcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZpeHR1cmUgPSBmaXh0dXJlc1tqXTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gaWYgKGZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRUeXBlID09PSAnd2FsbCcpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0YXJnZXRGaXh0dXJlSWQgPSBmaXh0dXJlLmZpeHR1cmVJZDtcclxuXHJcbiAgICAgICAgICAgICAgZm9yIChjb25zdCB3YWxsRWxlbWVudCBvZiB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgIHdhbGxFbGVtZW50LmVsZW1lbnRUeXBlICE9PSBcIndhbGxcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAhQXJyYXkuaXNBcnJheSh3YWxsRWxlbWVudC5maXh0dXJlcylcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZml4dHVyZUluZGV4ID0gd2FsbEVsZW1lbnQuZml4dHVyZXMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgICAoZjogYW55KSA9PiBmLl9pZCA9PT0gdGFyZ2V0Rml4dHVyZUlkLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZml4dHVyZUluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICB3YWxsRWxlbWVudC5maXh0dXJlc1tmaXh0dXJlSW5kZXhdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLndhbGxFbGVtZW50LmZpeHR1cmVzW2ZpeHR1cmVJbmRleF0sXHJcbiAgICAgICAgICAgICAgICAgICAgaXNzdWU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVEYXRhOiBpc3N1ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgdGFza1R5cGU6IFwibGF5b3V0XCIsXHJcbiAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgIC8vIGVsc2UgaWYgKGZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRUeXBlID09PSAnZmxvb3InKSB7XHJcbiAgICAgICAgICAgICAgLy8gY29uc3QgdGFyZ2V0Rml4dHVyZUlkID0gZml4dHVyZS5maXh0dXJlSWQ7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IGNlbnRlckZpeHR1cmVzID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgZml4dHVyZUluZGV4ID0gY2VudGVyRml4dHVyZXMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgKGY6IGFueSkgPT4gZi5faWQgPT09IHRhcmdldEZpeHR1cmVJZCxcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZml4dHVyZUluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgY2VudGVyRml4dHVyZXNbZml4dHVyZUluZGV4XSA9IHtcclxuICAgICAgICAgICAgICAgICAgLi4uY2VudGVyRml4dHVyZXNbZml4dHVyZUluZGV4XSxcclxuICAgICAgICAgICAgICAgICAgaXNzdWU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgIGlzc3VlRGF0YTogaXNzdWVzLFxyXG4gICAgICAgICAgICAgICAgICB0YXNrVHlwZTogXCJsYXlvdXRcIixcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzRml4dHVyZUZlZWRiYWNrKHN0b3JlRmVlZGJhY2s6IGFueVtdKSB7XHJcbiAgICBjb25zdCBmaXh0dXJlRmVlZGJhY2sgPSBzdG9yZUZlZWRiYWNrLmZpbHRlcihcclxuICAgICAgKGZlZWRiYWNrKSA9PiBmZWVkYmFjay50eXBlID09PSBcImZpeHR1cmVcIixcclxuICAgICk7XHJcblxyXG4gICAgbGV0IGZpbmRGaXh0dXJlVGFzayA9IHRoaXMudGFza0luZm8/LnRhc2tEZXRhaWxzPy5maW5kKFxyXG4gICAgICAodGFzazogYW55KSA9PiB0YXNrLnR5cGUgPT0gXCJmaXh0dXJlXCIsXHJcbiAgICApO1xyXG5cclxuICAgIGZvciAoY29uc3QgZmVlZGJhY2sgb2YgZml4dHVyZUZlZWRiYWNrID8/IFtdKSB7XHJcbiAgICAgIGNvbnN0IGFpRGF0YSA9IGZlZWRiYWNrPy5maXh0dXJlQUlEYXRhO1xyXG4gICAgICBpZiAoIWFpRGF0YSkgY29udGludWU7XHJcblxyXG4gICAgICBjb25zdCBmaXh0dXJlID0gdGhpcy5hbGxGaXh0dXJlSW5zdGFuY2VzLmZpbmQoXHJcbiAgICAgICAgKGY6IGFueSkgPT4gZi5faWQgPT09IGFpRGF0YS5maXh0dXJlSWQsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICghZml4dHVyZSkgY29udGludWU7XHJcblxyXG4gICAgICBmZWVkYmFjay5GaXh0dXJlRGF0YSA9IHN0cnVjdHVyZWRDbG9uZShmaXh0dXJlKTtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXR1cyA9XHJcbiAgICAgICAgKGZpbmRGaXh0dXJlVGFzaz8uc3RhdHVzID09PSBcInN1Ym1pdFwiIHx8IGZpbmRGaXh0dXJlVGFzaz8ucmVkb1N0YXR1cykgJiZcclxuICAgICAgICBmZWVkYmFjaz8uYW5zd2Vycz8uWzBdPy5zdGF0dXNcclxuICAgICAgICAgID8gZmVlZGJhY2suYW5zd2Vyc1swXS5zdGF0dXNcclxuICAgICAgICAgIDogXCJcIjtcclxuXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oZml4dHVyZSwge1xyXG4gICAgICAgIGlzc3VlOiBmYWxzZSxcclxuICAgICAgICBpc3N1ZURhdGE6IGFpRGF0YSxcclxuICAgICAgICB0YXNrVHlwZTogXCJmaXh0dXJlXCIsXHJcbiAgICAgICAgc3RhdHVzLFxyXG4gICAgICAgIGJyZWFjaDogZmluZEZpeHR1cmVUYXNrPy5icmVhY2gsXHJcbiAgICAgICAgdGFza1N0YXR1czogZmluZEZpeHR1cmVUYXNrPy5zdGF0dXMsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc1ZtRmVlZGJhY2soc3RvcmVGZWVkYmFjazogYW55W10pIHtcclxuICAgIGNvbnN0IGZpeHR1cmVGZWVkYmFjayA9IHN0b3JlRmVlZGJhY2suZmlsdGVyKFxyXG4gICAgICAoZmVlZGJhY2spID0+IGZlZWRiYWNrLnR5cGUgPT09IFwidm1cIixcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGZpeHR1cmVGZWVkYmFjay5sZW5ndGgpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXh0dXJlRmVlZGJhY2subGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBpc3N1ZXMgPSBmaXh0dXJlRmVlZGJhY2s/LltpXT8uYW5zd2Vycz8uWzBdPy5pc3N1ZXM7XHJcblxyXG4gICAgICAgIGlmIChpc3N1ZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpc3N1ZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXNzdWUgPSBpc3N1ZXNbal07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlcyA9IGlzc3VlLkRldGFpbHMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgIChmaXh0dXJlOiBhbnkpID0+IGZpeHR1cmUuc3RhdHVzID09PSBcInBlbmRpbmdcIixcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZml4dHVyZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICBjb25zdCBmaXh0dXJlID0gZml4dHVyZXNbal07XHJcblxyXG4gICAgICAgICAgICAgIC8vIGlmIChmaXh0dXJlLmFzc29jaWF0ZWRFbGVtZW50VHlwZSA9PT0gJ3dhbGwnKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0Rml4dHVyZUlkID0gZml4dHVyZS5maXh0dXJlSWQ7XHJcblxyXG4gICAgICAgICAgICAgIGZvciAoY29uc3Qgd2FsbEVsZW1lbnQgb2YgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICB3YWxsRWxlbWVudC5lbGVtZW50VHlwZSAhPT0gXCJ3YWxsXCIgfHxcclxuICAgICAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkod2FsbEVsZW1lbnQuZml4dHVyZXMpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpeHR1cmVJbmRleCA9IHdhbGxFbGVtZW50LmZpeHR1cmVzLmZpbmRJbmRleChcclxuICAgICAgICAgICAgICAgICAgKGY6IGFueSkgPT4gZi5faWQgPT09IHRhcmdldEZpeHR1cmVJZCxcclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZpeHR1cmVJbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgd2FsbEVsZW1lbnQuZml4dHVyZXNbZml4dHVyZUluZGV4XSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAuLi53YWxsRWxlbWVudC5maXh0dXJlc1tmaXh0dXJlSW5kZXhdLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzc3VlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzc3VlRGF0YTogaXNzdWVzLFxyXG4gICAgICAgICAgICAgICAgICAgIHRhc2tUeXBlOiBcInZtXCIsXHJcbiAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgIC8vIGVsc2UgaWYgKGZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRUeXBlID09PSAnZmxvb3InKSB7XHJcbiAgICAgICAgICAgICAgLy8gY29uc3QgdGFyZ2V0Rml4dHVyZUlkID0gZml4dHVyZS5maXh0dXJlSWQ7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IGNlbnRlckZpeHR1cmVzID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgZml4dHVyZUluZGV4ID0gY2VudGVyRml4dHVyZXMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgKGY6IGFueSkgPT4gZi5faWQgPT09IHRhcmdldEZpeHR1cmVJZCxcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZml4dHVyZUluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgY2VudGVyRml4dHVyZXNbZml4dHVyZUluZGV4XSA9IHtcclxuICAgICAgICAgICAgICAgICAgLi4uY2VudGVyRml4dHVyZXNbZml4dHVyZUluZGV4XSxcclxuICAgICAgICAgICAgICAgICAgaXNzdWU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgIGlzc3VlRGF0YTogaXNzdWVzLFxyXG4gICAgICAgICAgICAgICAgICB0YXNrVHlwZTogXCJ2bVwiLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRyYW5zZmVyQXJyYXlJdGVtPFQgPSBhbnk+KFxyXG4gICAgY3VycmVudEFycmF5OiBUW10sXHJcbiAgICB0YXJnZXRBcnJheTogVFtdLFxyXG4gICAgY3VycmVudEluZGV4OiBudW1iZXIsXHJcbiAgICB0YXJnZXRJbmRleDogbnVtYmVyLFxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgZnJvbSA9IE1hdGgubWF4KDAsIE1hdGgubWluKGN1cnJlbnRBcnJheS5sZW5ndGggLSAxLCBjdXJyZW50SW5kZXgpKTtcclxuICAgIGNvbnN0IHRvID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGFyZ2V0QXJyYXkubGVuZ3RoLCB0YXJnZXRJbmRleCkpO1xyXG5cclxuICAgIGlmIChjdXJyZW50QXJyYXkubGVuZ3RoKSB7XHJcbiAgICAgIHRhcmdldEFycmF5LnNwbGljZSh0bywgMCwgY3VycmVudEFycmF5LnNwbGljZShmcm9tLCAxKVswXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW9yZGVyRml4dHVyZShmbG9vckRhdGE6IGFueSkge1xyXG4gICAgLy8gV2FsbHNcclxuICAgIGZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZWxlbWVudC5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICBsZXQgd2FsbEFzc29jaWF0ZWRJbmRleCA9IDE7XHJcblxyXG4gICAgICAgIGVsZW1lbnQuZml4dHVyZXMuZm9yRWFjaCgoZml4dHVyZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBmaXh0dXJlLmFzc29jaWF0ZWRFbGVtZW50VHlwZSA9IFwid2FsbFwiO1xyXG4gICAgICAgICAgZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudE51bWJlciA9IGVsZW1lbnQuZWxlbWVudE51bWJlcjtcclxuICAgICAgICAgIGZpeHR1cmUuZml4dHVyZVR5cGUgPSBcIndhbGxcIjtcclxuXHJcbiAgICAgICAgICBpZiAoIWZpeHR1cmUuZ2hvc3QpIHtcclxuICAgICAgICAgICAgLy8gZml4dHVyZS5maXh0dXJlTnVtYmVyID0gZml4dHVyZU51bWJlcisrO1xyXG4gICAgICAgICAgICBmaXh0dXJlLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlciA9IHdhbGxBc3NvY2lhdGVkSW5kZXgrKztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZpeHR1cmUuZml4dHVyZU51bWJlciA9IG51bGw7XHJcbiAgICAgICAgICAgIGZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gQ2VudGVyIGZsb29yIGZpeHR1cmVzXHJcbiAgICBsZXQgZmxvb3JBc3NvY2lhdGVkSW5kZXggPSAxO1xyXG4gICAgZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUuZm9yRWFjaCgoZml4dHVyZTogYW55KSA9PiB7XHJcbiAgICAgIGZpeHR1cmUuZml4dHVyZVR5cGUgPSBcImZsb29yXCI7XHJcblxyXG4gICAgICBpZiAoIWZpeHR1cmUuZ2hvc3QpIHtcclxuICAgICAgICAvLyBmaXh0dXJlLmZpeHR1cmVOdW1iZXIgPSBmaXh0dXJlTnVtYmVyKys7XHJcbiAgICAgICAgZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIgPSBmbG9vckFzc29jaWF0ZWRJbmRleCsrO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpeHR1cmUuZml4dHVyZU51bWJlciA9IG51bGw7XHJcbiAgICAgICAgZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEVsZW1lbnRWYWx1ZShncm91cDogYW55KSB7XHJcbiAgICByZXR1cm4gZ3JvdXAuZ2V0KFwiZWxlbWVudE51bWJlclwiKT8udmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFdhbGxCeU51bWJlcihlbGVtZW50TnVtYmVyOiBudW1iZXIpOiBhbnkgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuZmxvb3JEYXRhPy5sYXlvdXRQb2x5Z29uPy5maW5kKFxyXG4gICAgICAodzogYW55KSA9PiB3LmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiB3LmVsZW1lbnROdW1iZXIgPT09IGVsZW1lbnROdW1iZXIsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcm91bmRUb1R3byhudW06IG51bWJlcikge1xyXG4gICAgcmV0dXJuIE1hdGgucm91bmQobnVtICogMTAwKSAvIDEwMDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFN0b3JlRml4dHVyZXMoc3RvcmVJZDogc3RyaW5nLCBlbmFibGU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodCgpO1xyXG4gICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy5maXh0dXJlVGVtcGxhdGVzLmxlbmd0aCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmdldEZpeHR1cmVUZW1wbGF0ZXMoKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlID0gbnVsbDtcclxuICAgIHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAuZ2V0U3RvcmVGaXh0dXJlcyh7IGlkOiBbc3RvcmVJZF0sIHRyZWVWaWV3OiB0cnVlIH0pXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXJlcz8uZGF0YT8uWzBdPy5mbG9vcnM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5wbGFub0RhdGEgPSBzdHJ1Y3R1cmVkQ2xvbmUocmVzLmRhdGFbMF0pO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZmxvb3JEYXRhPy5faWQpIHtcclxuICAgICAgICAgICAgdGhpcy5mbG9vckRhdGEgPSBzdHJ1Y3R1cmVkQ2xvbmUoXHJcbiAgICAgICAgICAgICAgcmVzLmRhdGFbMF0uZmxvb3JzLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAoZmxvb3I6IGFueSkgPT4gZmxvb3I/Ll9pZCA9PT0gdGhpcy5mbG9vckRhdGE/Ll9pZCxcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mbG9vckRhdGEgPSBzdHJ1Y3R1cmVkQ2xvbmUocmVzLmRhdGFbMF0uZmxvb3JzWzBdKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoW1wiZHJhZnRcIiwgXCJhbGxvY2F0aW9uUGVuZGluZ1wiXS5pbmNsdWRlcyh0aGlzLmZsb29yRGF0YS5zdGF0dXMpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoXHJcbiAgICAgICAgICAgICAgYG1hbmFnZS9wbGFub2dyYW0vb25ib2FyZC1wbGFub2dyYW0/cGxhbm9JZD0ke3RoaXMuZmxvb3JEYXRhLnBsYW5vSWR9JmZsb29ySWQ9JHt0aGlzLmZsb29yRGF0YS5faWR9YCxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmZsb29yc0xpc3QgPSB0aGlzLnBsYW5vRGF0YS5mbG9vcnMubWFwKChmOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICAgIGxhYmVsOiBmLmZsb29yTnVtLFxyXG4gICAgICAgICAgICB2YWx1ZTogZi5faWQsXHJcbiAgICAgICAgICAgIC8vIGRpc2FibGVkOiBmLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIixcclxuICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmV4dHJhY3RBbGxGaXh0dXJlcyh0aGlzLmZsb29yRGF0YSk7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmxvb3JJZC5zZXRWYWx1ZSh0aGlzLmZsb29yRGF0YS5faWQsIHtcclxuICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuc3RvcmVNZXRyaWNzLmZsb29yQ291bnQgPSB0aGlzLnBsYW5vRGF0YT8uZmxvb3JzPy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgdGhpcy5kaXNhYmxlRWRpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICAgIHRoaXMudGFza0RldGFpbHModGhpcy5mbG9vckRhdGEucGxhbm9JZCwgdGhpcy5mbG9vckRhdGEuX2lkKSxcclxuICAgICAgICAgICAgICB0aGlzLmdldFN0b3JlRmVlZGJhY2soXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICB0aGlzLmdldFpvbmVWZXJpZmljYXRpb25GZWVkYmFjayhcclxuICAgICAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICB9IGNhdGNoIHt9XHJcblxyXG4gICAgICAgICAgdGhpcy5yZW5kZXJGbG9vcigpO1xyXG5cclxuICAgICAgICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKGVuYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gZmV0Y2ggcGxhbm9cIik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBleHRyYWN0QWxsRml4dHVyZXMoZmxvb3JEYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGV4dHJhY3RlZEZpeHR1cmUgPSBbXHJcbiAgICAgIC4uLihmbG9vckRhdGE/Lm1hc3RlclRlbXBsYXRlcyA/PyBbXSksXHJcbiAgICAgIC4uLihmbG9vckRhdGE/LmNlbnRlckZpeHR1cmUgPz8gW10pLFxyXG4gICAgXTtcclxuXHJcbiAgICBmbG9vckRhdGE/LmxheW91dFBvbHlnb24/LmZvckVhY2goKGxwOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy53YWxsQ291bnQgKz0gbHAuZml4dHVyZXMubGVuZ3RoO1xyXG4gICAgICB0aGlzLmNsQ291bnQgKz0gbHAuZml4dHVyZXMuZmlsdGVyKFxyXG4gICAgICAgIChlbGU6IGFueSkgPT4gZWxlLmhlYWRlci5sYWJlbCA9PSBcIkNMXCIsXHJcbiAgICAgICk/Lmxlbmd0aDtcclxuICAgICAgZXh0cmFjdGVkRml4dHVyZS5wdXNoKC4uLihscC5maXh0dXJlcyA/PyBbXSkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hbGxGaXh0dXJlcyA9IGV4dHJhY3RlZEZpeHR1cmU7XHJcblxyXG4gICAgdGhpcy5hbGxGaXh0dXJlSW5zdGFuY2VzID0gW1xyXG4gICAgICAuLi50aGlzLmZsb29yRGF0YSEubGF5b3V0UG9seWdvbi5mbGF0TWFwKChlOiBhbnkpID0+IGU/LmZpeHR1cmVzID8/IFtdKSxcclxuICAgICAgLi4uKHRoaXMuZmxvb3JEYXRhPy5jZW50ZXJGaXh0dXJlID8/IFtdKSxcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBhc3luYyByZW5kZXJGbG9vcih1cGRhdGU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICB0aGlzLnN0b3JlTWV0cmljcy5maXh0dXJlQ291bnQgPSB0aGlzLmZsb29yRGF0YS5maXh0dXJlQ291bnQ7XHJcbiAgICB0aGlzLnN0b3JlTWV0cmljcy52bUNvdW50ID0gdGhpcy5mbG9vckRhdGEudm1Db3VudDtcclxuICAgIHRoaXMuZHJhd0luaXRpYWxDb250ZW50KCk7XHJcbiAgICBpZiAodXBkYXRlKSB7XHJcbiAgICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG5cclxuICAgICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5mb3JFYWNoKCh3YWxsOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAod2FsbC5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICAgIGNvbnN0IHdhbGxJdGVtID0gdGhpcy5wYXRjaFdhbGxFbGVtZW50cyh7XHJcbiAgICAgICAgICAgIGVsZW1lbnRUeXBlOiB3YWxsLmVsZW1lbnRUeXBlLFxyXG4gICAgICAgICAgICBlbGVtZW50TnVtYmVyOiB3YWxsLmVsZW1lbnROdW1iZXIsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB3YWxsLmZpeHR1cmVzLmZvckVhY2goKGZpeHR1cmU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZml4dHVyZT8uZml4dHVyZU5hbWUgPT09IFwic3BhY2VcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlR3JvdXAgPSB0aGlzLnBhdGNoRml4dHVyZSh7XHJcbiAgICAgICAgICAgICAgZml4dHVyZU5hbWU6IGZpeHR1cmUuZml4dHVyZU5hbWUsXHJcbiAgICAgICAgICAgICAgZml4dHVyZUNvbmZpZ0lkOiBmaXh0dXJlLmZpeHR1cmVDb25maWdJZCxcclxuICAgICAgICAgICAgICBfaWQ6IGZpeHR1cmUuX2lkLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgKHdhbGxJdGVtLmdldChcImZpeHR1cmVzXCIpIGFzIEZvcm1BcnJheSkucHVzaChmaXh0dXJlR3JvdXApO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgd2FsbC5vdGhlckVsZW1lbnRzPy5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICAgIHR5cGU6IFtcclxuICAgICAgICAgICAgICAgIHRoaXMub3RoZXJFbGVtZW50TGlzdC5zb21lKChvKSA9PiBvLnZhbHVlID09PSBlbGUuZml4dHVyZU5hbWUpXHJcbiAgICAgICAgICAgICAgICAgID8gZWxlLmZpeHR1cmVOYW1lXHJcbiAgICAgICAgICAgICAgICAgIDogXCJPdGhlcnNcIixcclxuICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgIGN1c3RvbU5hbWU6IFtcclxuICAgICAgICAgICAgICAgIHRoaXMub3RoZXJFbGVtZW50TGlzdC5zb21lKChvKSA9PiBvLnZhbHVlID09PSBlbGUuZml4dHVyZU5hbWUpXHJcbiAgICAgICAgICAgICAgICAgID8gXCJcIlxyXG4gICAgICAgICAgICAgICAgICA6IGVsZS5maXh0dXJlTmFtZSxcclxuICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgKHdhbGxJdGVtLmdldChcIm90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5KS5wdXNoKGVsZUdyb3VwKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuZ2V0Rm9ybVdhbGxzLnB1c2god2FsbEl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5mbG9vckRhdGE/LmNlbnRlckZpeHR1cmU/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuZmxvb3JEYXRhPy5jZW50ZXJGaXh0dXJlLmZvckVhY2goKGZpeHR1cmU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZml4dHVyZUdyb3VwID0gdGhpcy5wYXRjaEZpeHR1cmUoe1xyXG4gICAgICAgICAgICBmaXh0dXJlTmFtZTogZml4dHVyZS5maXh0dXJlTmFtZSxcclxuICAgICAgICAgICAgZml4dHVyZUNvbmZpZ0lkOiBmaXh0dXJlLmZpeHR1cmVDb25maWdJZCxcclxuICAgICAgICAgICAgX2lkOiBmaXh0dXJlLl9pZCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vckZpeHR1cmVzXCIpIGFzIEZvcm1BcnJheSkucHVzaChcclxuICAgICAgICAgICAgZml4dHVyZUdyb3VwLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuZmxvb3JEYXRhPy5vdGhlckVsZW1lbnRzPy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmZsb29yRGF0YT8ub3RoZXJFbGVtZW50cz8uZm9yRWFjaCgoZWxlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGVsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIHR5cGU6IFtcclxuICAgICAgICAgICAgICB0aGlzLm90aGVyRWxlbWVudExpc3Quc29tZSgobykgPT4gby52YWx1ZSA9PT0gZWxlLmZpeHR1cmVOYW1lKVxyXG4gICAgICAgICAgICAgICAgPyBlbGUuZml4dHVyZU5hbWVcclxuICAgICAgICAgICAgICAgIDogXCJPdGhlcnNcIixcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgY3VzdG9tTmFtZTogW1xyXG4gICAgICAgICAgICAgIHRoaXMub3RoZXJFbGVtZW50TGlzdC5zb21lKChvKSA9PiBvLnZhbHVlID09PSBlbGUuZml4dHVyZU5hbWUpXHJcbiAgICAgICAgICAgICAgICA/IFwiXCJcclxuICAgICAgICAgICAgICAgIDogZWxlLmZpeHR1cmVOYW1lLFxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vck90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5KS5wdXNoKFxyXG4gICAgICAgICAgICBlbGVHcm91cCxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN1YnNjcmliZVRvRml4dHVyZUNvbmZpZ0lkQ2hhbmdlcygpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVUb090aGVyRWxlbWVudHNDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBkcmF3SW5pdGlhbENvbnRlbnQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmNhbnZhcy5jbGVhcigpO1xyXG4gICAgdGhpcy5yZW9yZGVyRml4dHVyZSh0aGlzLmZsb29yRGF0YSk7XHJcbiAgICBhd2FpdCB0aGlzLmRyYXdMYXlvdXRFbGVtZW50cygpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlc2l6ZUNhbnZhcygpO1xyXG4gICAgICB0aGlzLmZpdENhbnZhc1RvTGF5b3V0QW5pbWF0ZWQoKTtcclxuICAgIH0sIDMwMCk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVBbGxQb3NpdGlvbnMoKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRmVlZGJhY2s/LmZpeHR1cmVGZWVkYmFjaz8uZml4dHVyZUlkICYmXHJcbiAgICAgICF0aGlzLmlzUmlnaHRQYW5lbENvbGxhcHNlZCAmJlxyXG4gICAgICB0aGlzLmFjdGl2ZUhpZ2hsaWdodFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuY2FudmFzLmFkZCh0aGlzLmFjdGl2ZUhpZ2hsaWdodCk7XHJcbiAgICAgIHRoaXMua2VlcEhpZ2hsaWdodE9uVG9wKCk7XHJcbiAgICB9XHJcbiAgICAvLyB0aGlzLmRyYXdCZygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGdWxsTGF5b3V0Qm91bmRzKCkge1xyXG4gICAgY29uc3Qgb2JqZWN0cyA9IHRoaXMuY2FudmFzLmdldE9iamVjdHMoKTtcclxuICAgIGlmICghb2JqZWN0cy5sZW5ndGgpIHJldHVybiB7IGxlZnQ6IDAsIHRvcDogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xyXG5cclxuICAgIGxldCBtaW5YID0gSW5maW5pdHksXHJcbiAgICAgIG1pblkgPSBJbmZpbml0eSxcclxuICAgICAgbWF4WCA9IC1JbmZpbml0eSxcclxuICAgICAgbWF4WSA9IC1JbmZpbml0eTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IG9iaiBvZiBvYmplY3RzKSB7XHJcbiAgICAgIGNvbnN0IHJlY3QgPSBvYmouZ2V0Qm91bmRpbmdSZWN0KCk7XHJcbiAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCByZWN0LmxlZnQpO1xyXG4gICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgcmVjdC50b3ApO1xyXG4gICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCk7XHJcbiAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCByZWN0LnRvcCArIHJlY3QuaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsZWZ0OiBtaW5YLFxyXG4gICAgICB0b3A6IG1pblksXHJcbiAgICAgIHdpZHRoOiBtYXhYIC0gbWluWCxcclxuICAgICAgaGVpZ2h0OiBtYXhZIC0gbWluWSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpdENhbnZhc1RvTGF5b3V0QW5pbWF0ZWQoZHVyYXRpb24gPSA0MDApIHtcclxuICAgIGlmICghdGhpcy5jYW52YXMpIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5sYXlvdXRGb3JtLmVuYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmdldEZ1bGxMYXlvdXRCb3VuZHMoKTtcclxuICAgIGlmICghYm91bmRzLndpZHRoIHx8ICFib3VuZHMuaGVpZ2h0KSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgY2FudmFzVyA9IHRoaXMuY2FudmFzLmdldFdpZHRoKCk7XHJcbiAgICBjb25zdCBjYW52YXNIID0gdGhpcy5jYW52YXMuZ2V0SGVpZ2h0KCk7XHJcblxyXG4gICAgLy8gRmluYWwgem9vbSB0byBmaXQgKHdpdGggcGFkZGluZylcclxuICAgIGNvbnN0IHNjYWxlWCA9IGNhbnZhc1cgLyBib3VuZHMud2lkdGg7XHJcbiAgICBjb25zdCBzY2FsZVkgPSBjYW52YXNIIC8gYm91bmRzLmhlaWdodDtcclxuICAgIGNvbnN0IHRhcmdldFpvb20gPSBNYXRoLm1pbihzY2FsZVgsIHNjYWxlWSkgKiAwLjk7IC8vIHBhZGRpbmcgMTAlXHJcblxyXG4gICAgLy8gRGVzaXJlZCB2aWV3cG9ydCBvZmZzZXQgdG8gY2VudGVyIGxheW91dFxyXG4gICAgY29uc3QgdGFyZ2V0VnB0ID0gW1xyXG4gICAgICAuLi4odGhpcy5jYW52YXMudmlld3BvcnRUcmFuc2Zvcm0gfHwgWzEsIDAsIDAsIDEsIDAsIDBdKSxcclxuICAgIF0gYXMgZmFicmljLlRNYXQyRDtcclxuXHJcbiAgICB0YXJnZXRWcHRbMF0gPSB0YXJnZXRab29tOyAvLyBzY2FsZVhcclxuICAgIHRhcmdldFZwdFszXSA9IHRhcmdldFpvb207IC8vIHNjYWxlWVxyXG5cclxuICAgIHRhcmdldFZwdFs0XSA9IGNhbnZhc1cgLyAyIC0gKGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC8gMikgKiB0YXJnZXRab29tOyAvLyBjZW50ZXIgWFxyXG4gICAgdGFyZ2V0VnB0WzVdID0gY2FudmFzSCAvIDIgLSAoYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgLyAyKSAqIHRhcmdldFpvb207IC8vIGNlbnRlciBZXHJcblxyXG4gICAgLy8gQ3VycmVudCB2aWV3cG9ydCAoc3RhcnRpbmcgcG9pbnQgb2YgYW5pbWF0aW9uKVxyXG4gICAgY29uc3Qgc3RhcnRWcHQgPSBbLi4udGhpcy5jYW52YXMudmlld3BvcnRUcmFuc2Zvcm0hXSBhcyBmYWJyaWMuVE1hdDJEO1xyXG5cclxuICAgIGZhYnJpYy51dGlsLmFuaW1hdGUoe1xyXG4gICAgICBzdGFydFZhbHVlOiAwLFxyXG4gICAgICBlbmRWYWx1ZTogMSxcclxuICAgICAgZHVyYXRpb24sXHJcbiAgICAgIGVhc2luZzogZmFicmljLnV0aWwuZWFzZS5lYXNlT3V0Q3ViaWMsXHJcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZwdCA9IHRoaXMuY2FudmFzLnZpZXdwb3J0VHJhbnNmb3JtITtcclxuXHJcbiAgICAgICAgLy8gSW50ZXJwb2xhdGUgbWF0cml4IHZhbHVlc1xyXG4gICAgICAgIHZwdFswXSA9IHN0YXJ0VnB0WzBdICsgKHRhcmdldFZwdFswXSAtIHN0YXJ0VnB0WzBdKSAqIHZhbHVlO1xyXG4gICAgICAgIHZwdFszXSA9IHN0YXJ0VnB0WzNdICsgKHRhcmdldFZwdFszXSAtIHN0YXJ0VnB0WzNdKSAqIHZhbHVlO1xyXG4gICAgICAgIHZwdFs0XSA9IHN0YXJ0VnB0WzRdICsgKHRhcmdldFZwdFs0XSAtIHN0YXJ0VnB0WzRdKSAqIHZhbHVlO1xyXG4gICAgICAgIHZwdFs1XSA9IHN0YXJ0VnB0WzVdICsgKHRhcmdldFZwdFs1XSAtIHN0YXJ0VnB0WzVdKSAqIHZhbHVlO1xyXG5cclxuICAgICAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRyYXdMYXlvdXRFbGVtZW50cygpIHtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbltpbmRleF07XHJcblxyXG4gICAgICBlbGVtZW50LnJlbGF0aXZlUG9zaXRpb24gPz89IHtcclxuICAgICAgICB4OiAwLFxyXG4gICAgICAgIHk6IDAsXHJcbiAgICAgICAgdW5pdDogXCJmdFwiLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgeCA9IHRoaXMudG9QaXhlbHMoZWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLngsIGVsZW1lbnQudW5pdCk7XHJcbiAgICAgIGNvbnN0IHkgPSB0aGlzLnRvUGl4ZWxzKGVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi55LCBlbGVtZW50LnVuaXQpO1xyXG5cclxuICAgICAgaWYgKGVsZW1lbnQuZWxlbWVudFR5cGUgPT09IFwid2FsbFwiKSB7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy53YWxsVGhpY2tuZXNzO1xyXG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMudG9QaXhlbHMoZWxlbWVudC5kaXN0YW5jZSwgZWxlbWVudC51bml0KTtcclxuICAgICAgICBpZiAod2lkdGggPCBoZWlnaHQpIHdpZHRoID0gdGhpcy53YWxsVGhpY2tuZXNzICsgMTtcclxuICAgICAgICBhd2FpdCB0aGlzLmRyYXdXYWxsKHRoaXMuY2FudmFzLCB4LCB5LCBoZWlnaHQsIHdpZHRoLCBlbGVtZW50KTtcclxuICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmVsZW1lbnRUeXBlID09PSBcImVudHJhbmNlXCIpIHtcclxuICAgICAgICBjb25zdCBhcnJvd1dpZHRoID0gODA7XHJcbiAgICAgICAgY29uc3QgYXJyb3dIZWlnaHQgPSA3NTtcclxuICAgICAgICBjb25zdCBhcnJvd0Jhc2UgPSA0MDtcclxuICAgICAgICB0aGlzLmRyYXdFbnRyYW5jZShcclxuICAgICAgICAgIHRoaXMuY2FudmFzLFxyXG4gICAgICAgICAgeCxcclxuICAgICAgICAgIHksXHJcbiAgICAgICAgICBhcnJvd1dpZHRoLFxyXG4gICAgICAgICAgYXJyb3dIZWlnaHQsXHJcbiAgICAgICAgICBhcnJvd0Jhc2UsXHJcbiAgICAgICAgICBlbGVtZW50LFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3IgY2FkIGxheW91dHMgb25seS5cclxuICAgIHRoaXMubGF5b3V0Qm91bmRzID0gdGhpcy5nZXRGdWxsTGF5b3V0Qm91bmRzKCk7XHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24ubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uW2luZGV4XTtcclxuICAgICAgaWYgKGVsZW1lbnQuZWxlbWVudFR5cGUgIT09IFwid2FsbFwiKSBjb250aW51ZTtcclxuXHJcbiAgICAgIGNvbnN0IGZpeHR1cmVHcm91cHM6IGZhYnJpYy5Hcm91cFtdID0gW107XHJcblxyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGVsZW1lbnQ/LmZpeHR1cmVzPy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGNvbnN0IGZpeHR1cmUgPSBlbGVtZW50LmZpeHR1cmVzW2pdO1xyXG5cclxuICAgICAgICBjb25zdCBmaXh0dXJlSGVpZ2h0ID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgIGZpeHR1cmUuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSxcclxuICAgICAgICAgIGZpeHR1cmUuZml4dHVyZVN0YXRpY0xlbmd0aC51bml0LFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgZml4dHVyZVdpZHRoID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgIGZpeHR1cmUuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlLFxyXG4gICAgICAgICAgZml4dHVyZS5maXh0dXJlU3RhdGljV2lkdGgudW5pdCxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgeCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgICBmaXh0dXJlLnJlbGF0aXZlUG9zaXRpb24ueCxcclxuICAgICAgICAgIGZpeHR1cmUucmVsYXRpdmVQb3NpdGlvbi51bml0LFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IHkgPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLnksXHJcbiAgICAgICAgICBmaXh0dXJlLnJlbGF0aXZlUG9zaXRpb24udW5pdCxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyBvdmVycmlkZSB0aGUgZml4dHVyZSBwb3NpdGlvbiBmb3IgaW5pdGlhbCBjYWQgbGF5b3V0cy5cclxuICAgICAgICBpZiAodGhpcy5mbG9vckRhdGE/LmNhZExheW91dCkge1xyXG4gICAgICAgICAgY29uc3QgYmFzZVggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgICBlbGVtZW50LnJlbGF0aXZlUG9zaXRpb24ueCxcclxuICAgICAgICAgICAgZWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLnVuaXQsXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGJhc2VZID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgICAgZWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLnksXHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi51bml0LFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNvbnN0IHN0YXJ0QnVmZmVyID0gNDA7XHJcbiAgICAgICAgICBjb25zdCBzcGFjaW5nID0gMTM2O1xyXG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gc3RhcnRCdWZmZXIgKyBzcGFjaW5nICogajtcclxuXHJcbiAgICAgICAgICBjb25zdCBhbmdsZVJhZCA9IGZhYnJpYy51dGlsLmRlZ3JlZXNUb1JhZGlhbnMoZWxlbWVudC5hbmdsZSk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZGlyWCA9IE1hdGguY29zKGFuZ2xlUmFkKTtcclxuICAgICAgICAgIGNvbnN0IGRpclkgPSBNYXRoLnNpbihhbmdsZVJhZCk7XHJcblxyXG4gICAgICAgICAgY29uc3Qgbm9ybWFsT2Zmc2V0ID0gdGhpcy53YWxsVGhpY2tuZXNzO1xyXG5cclxuICAgICAgICAgIGNvbnN0IG5vcm1YID0gTWF0aC5jb3MoYW5nbGVSYWQgKyBNYXRoLlBJIC8gMikgKiBub3JtYWxPZmZzZXQ7XHJcbiAgICAgICAgICBjb25zdCBub3JtWSA9IE1hdGguc2luKGFuZ2xlUmFkICsgTWF0aC5QSSAvIDIpICogbm9ybWFsT2Zmc2V0O1xyXG5cclxuICAgICAgICAgIHggPSBiYXNlWCArIGRpclggKiBvZmZzZXQgKyBub3JtWDtcclxuICAgICAgICAgIHkgPSBiYXNlWSArIGRpclkgKiBvZmZzZXQgKyBub3JtWTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZpeHR1cmVPYmogPSBhd2FpdCB0aGlzLmRyYXdGaXh0dXJlKFxyXG4gICAgICAgICAgdGhpcy5jYW52YXMsXHJcbiAgICAgICAgICB4LFxyXG4gICAgICAgICAgeSxcclxuICAgICAgICAgIGZpeHR1cmVIZWlnaHQsXHJcbiAgICAgICAgICBmaXh0dXJlV2lkdGgsXHJcbiAgICAgICAgICBmaXh0dXJlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZml4dHVyZUdyb3Vwcy5wdXNoKGZpeHR1cmVPYmogYXMgZmFicmljLkdyb3VwKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50Py5vdGhlckVsZW1lbnRzPy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGNvbnN0IG90aGVyRWxlbWVudCA9IGVsZW1lbnQub3RoZXJFbGVtZW50c1tqXTtcclxuICAgICAgICBjb25zdCB4ID0gdGhpcy50b1BpeGVscyhvdGhlckVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi54LCBcImZ0XCIpO1xyXG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLnRvUGl4ZWxzKG90aGVyRWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLnksIFwiZnRcIik7XHJcbiAgICAgICAgY29uc3QgYSA9IG90aGVyRWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlO1xyXG4gICAgICAgIGNvbnN0IGggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNMZW5ndGgudmFsdWUsXHJcbiAgICAgICAgICBvdGhlckVsZW1lbnQuZml4dHVyZVN0YXRpY0xlbmd0aC51bml0LFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgdyA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgICBvdGhlckVsZW1lbnQuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlLFxyXG4gICAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNXaWR0aC51bml0LFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuZHJhd090aGVyRWxlbWVudHNXaXRoTGFiZWwoXHJcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcclxuICAgICAgICAgIHgsXHJcbiAgICAgICAgICB5LFxyXG4gICAgICAgICAgYSxcclxuICAgICAgICAgIHcsXHJcbiAgICAgICAgICBoLFxyXG4gICAgICAgICAgb3RoZXJFbGVtZW50LFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5mbG9vckRhdGE/LmNhZExheW91dCAmJiB0aGlzLmZsb29yRGF0YT8uY2VudGVyRml4dHVyZT8ubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGZpeHR1cmVzID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZTtcclxuXHJcbiAgICAgIC8vIExheW91dCBwb2x5Z29uICh5b3VyIGV4aXN0aW5nIG1ldGhvZClcclxuICAgICAgY29uc3QgbGF5b3V0UG9seWdvbiA9IHRoaXMuYnVpbGRMYXlvdXRQb2x5Z29uRnJvbVdhbGxzKCk7XHJcblxyXG4gICAgICAvLyBPY2N1cGllZCBhcmVhcyAoQUxMIG9iamVjdHMpXHJcbiAgICAgIGNvbnN0IG9jY3VwaWVkUmVjdHMgPSB0aGlzLmdldE9jY3VwaWVkUmVjdHMoKTtcclxuXHJcbiAgICAgIC8vIEZpeHR1cmUgc2l6ZVxyXG4gICAgICBjb25zdCBmaXh0dXJlV2lkdGhQeCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgZml4dHVyZXNbMF0uZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlLFxyXG4gICAgICAgIGZpeHR1cmVzWzBdLmZpeHR1cmVTdGF0aWNXaWR0aC51bml0LFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgZml4dHVyZUhlaWdodFB4ID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICBmaXh0dXJlc1swXS5maXh0dXJlU3RhdGljTGVuZ3RoLnZhbHVlLFxyXG4gICAgICAgIGZpeHR1cmVzWzBdLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIEdyaWQgc2hhcGUgKHdpZGUgYmlhcyBpZiB5b3Ugd2FudClcclxuICAgICAgY29uc3QgdG90YWwgPSBmaXh0dXJlcy5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IG1heFJvd3MgPSAyOyAvLyB5b3UgY2FuIHR3ZWFrXHJcbiAgICAgIGNvbnN0IHJvd3MgPSBNYXRoLm1pbihtYXhSb3dzLCB0b3RhbCk7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBNYXRoLmNlaWwodG90YWwgLyByb3dzKTtcclxuXHJcbiAgICAgIGNvbnN0IGdyaWRXaWR0aCA9IGNvbHVtbnMgKiBmaXh0dXJlV2lkdGhQeDtcclxuICAgICAgY29uc3QgZ3JpZEhlaWdodCA9IHJvd3MgKiBmaXh0dXJlSGVpZ2h0UHg7XHJcblxyXG4gICAgICAvLyBMYXlvdXQgYm91bmRzXHJcbiAgICAgIGNvbnN0IGJvdW5kcyA9IHRoaXMuZ2V0RnVsbExheW91dEJvdW5kcygpO1xyXG4gICAgICBjb25zdCBjZW50ZXJYID0gYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLyAyO1xyXG4gICAgICBjb25zdCBjZW50ZXJZID0gYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgLyAyO1xyXG5cclxuICAgICAgLy8gQ2hlY2sgaWYgZ3JpZCBmaXRzXHJcbiAgICAgIGNvbnN0IGdyaWRGaXRzID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZ3JpZFJlY3QgPSB7IHgsIHksIHc6IGdyaWRXaWR0aCwgaDogZ3JpZEhlaWdodCB9O1xyXG5cclxuICAgICAgICAvLyBJbnNpZGUgcG9seWdvblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICF0aGlzLmlzUG9pbnRJbnNpZGVQb2x5Z29uKHsgeCwgeSB9LCBsYXlvdXRQb2x5Z29uKSB8fFxyXG4gICAgICAgICAgIXRoaXMuaXNQb2ludEluc2lkZVBvbHlnb24oeyB4OiB4ICsgZ3JpZFdpZHRoLCB5IH0sIGxheW91dFBvbHlnb24pIHx8XHJcbiAgICAgICAgICAhdGhpcy5pc1BvaW50SW5zaWRlUG9seWdvbih7IHgsIHk6IHkgKyBncmlkSGVpZ2h0IH0sIGxheW91dFBvbHlnb24pIHx8XHJcbiAgICAgICAgICAhdGhpcy5pc1BvaW50SW5zaWRlUG9seWdvbihcclxuICAgICAgICAgICAgeyB4OiB4ICsgZ3JpZFdpZHRoLCB5OiB5ICsgZ3JpZEhlaWdodCB9LFxyXG4gICAgICAgICAgICBsYXlvdXRQb2x5Z29uLFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTm8gb3ZlcmxhcFxyXG4gICAgICAgIGZvciAoY29uc3Qgb2NjIG9mIG9jY3VwaWVkUmVjdHMpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnJlY3RzT3ZlcmxhcChncmlkUmVjdCwgb2NjKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGxldCBiZXN0U2NvcmUgPSAtSW5maW5pdHk7XHJcbiAgICAgIGxldCBiZXN0UG9zOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgIGNvbnN0IHN0ZXAgPSBmaXh0dXJlV2lkdGhQeCAvIDI7XHJcblxyXG4gICAgICBmb3IgKFxyXG4gICAgICAgIGxldCB5ID0gYm91bmRzLnRvcDtcclxuICAgICAgICB5IDw9IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC0gZ3JpZEhlaWdodDtcclxuICAgICAgICB5ICs9IHN0ZXBcclxuICAgICAgKSB7XHJcbiAgICAgICAgZm9yIChcclxuICAgICAgICAgIGxldCB4ID0gYm91bmRzLmxlZnQ7XHJcbiAgICAgICAgICB4IDw9IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC0gZ3JpZFdpZHRoO1xyXG4gICAgICAgICAgeCArPSBzdGVwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBpZiAoIWdyaWRGaXRzKHgsIHkpKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICBjb25zdCBncmlkUmVjdCA9IHsgeCwgeSwgdzogZ3JpZFdpZHRoLCBoOiBncmlkSGVpZ2h0IH07XHJcblxyXG4gICAgICAgICAgY29uc3QgZW1wdHlNYXJnaW4gPSB0aGlzLmNvbXB1dGVFbXB0eU1hcmdpbihcclxuICAgICAgICAgICAgZ3JpZFJlY3QsXHJcbiAgICAgICAgICAgIGJvdW5kcyxcclxuICAgICAgICAgICAgb2NjdXBpZWRSZWN0cyxcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZHggPSBjZW50ZXJYIC0gKHggKyBncmlkV2lkdGggLyAyKTtcclxuICAgICAgICAgIGNvbnN0IGR5ID0gY2VudGVyWSAtICh5ICsgZ3JpZEhlaWdodCAvIDIpO1xyXG4gICAgICAgICAgY29uc3QgY2VudGVyUGVuYWx0eSA9IGR4ICogZHggKyBkeSAqIGR5O1xyXG5cclxuICAgICAgICAgIC8vIEJpZ2dlc3QgZW1wdHkgc3BhY2Ugd2lucywgY2VudGVyIGlzIGEgc29mdCBzdGFiaWxpemVyXHJcbiAgICAgICAgICBjb25zdCBzY29yZSA9IGVtcHR5TWFyZ2luICogMTAwMCAtIGNlbnRlclBlbmFsdHkgKiAwLjAwMTtcclxuXHJcbiAgICAgICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUpIHtcclxuICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7XHJcbiAgICAgICAgICAgIGJlc3RQb3MgPSB7IHgsIHkgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghYmVzdFBvcykge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihcIk5vIHZhbGlkIGNlbnRlci1maXh0dXJlIHBsYWNlbWVudCBmb3VuZFwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEFzc2lnbiBwb3NpdGlvbnNcclxuICAgICAgZml4dHVyZXMuZm9yRWFjaCgoZml4dHVyZTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgcm93ID0gTWF0aC5mbG9vcihpbmRleCAvIGNvbHVtbnMpO1xyXG4gICAgICAgIGNvbnN0IGNvbCA9IGluZGV4ICUgY29sdW1ucztcclxuXHJcbiAgICAgICAgY29uc3QgeCA9IGJlc3RQb3MhLnggKyBjb2wgKiBmaXh0dXJlV2lkdGhQeDtcclxuICAgICAgICBjb25zdCB5ID0gYmVzdFBvcyEueSArIHJvdyAqIGZpeHR1cmVIZWlnaHRQeDtcclxuXHJcbiAgICAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLnggPSB0aGlzLmZyb21QaXhlbHMoeCwgXCJmdFwiKTtcclxuICAgICAgICBmaXh0dXJlLnJlbGF0aXZlUG9zaXRpb24ueSA9IHRoaXMuZnJvbVBpeGVscyh5LCBcImZ0XCIpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmxvb3JEYXRhPy5jZW50ZXJGaXh0dXJlPy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBmaXh0dXJlID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZVtpXTtcclxuXHJcbiAgICAgIGNvbnN0IGZpeHR1cmVIZWlnaHQgPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgIGZpeHR1cmUuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSxcclxuICAgICAgICBmaXh0dXJlLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IGZpeHR1cmVXaWR0aCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgZml4dHVyZS5maXh0dXJlU3RhdGljV2lkdGgudmFsdWUsXHJcbiAgICAgICAgZml4dHVyZS5maXh0dXJlU3RhdGljV2lkdGgudW5pdCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IHggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgIGZpeHR1cmUucmVsYXRpdmVQb3NpdGlvbi54LFxyXG4gICAgICAgIGZpeHR1cmUucmVsYXRpdmVQb3NpdGlvbi51bml0LFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgeSA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLnksXHJcbiAgICAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLnVuaXQsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLmRyYXdGaXh0dXJlKFxyXG4gICAgICAgIHRoaXMuY2FudmFzLFxyXG4gICAgICAgIHgsXHJcbiAgICAgICAgeSxcclxuICAgICAgICBmaXh0dXJlSGVpZ2h0LFxyXG4gICAgICAgIGZpeHR1cmVXaWR0aCxcclxuICAgICAgICBmaXh0dXJlLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5mbG9vckRhdGE/Lm90aGVyRWxlbWVudHM/Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgIGNvbnN0IG90aGVyRWxlbWVudCA9IHRoaXMuZmxvb3JEYXRhLm90aGVyRWxlbWVudHNbal07XHJcbiAgICAgIGNvbnN0IHggPSB0aGlzLnRvUGl4ZWxzKG90aGVyRWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLngsIFwiZnRcIik7XHJcbiAgICAgIGNvbnN0IHkgPSB0aGlzLnRvUGl4ZWxzKG90aGVyRWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLnksIFwiZnRcIik7XHJcbiAgICAgIGNvbnN0IGEgPSBvdGhlckVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi5hbmdsZTtcclxuICAgICAgY29uc3QgaCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNMZW5ndGgudmFsdWUsXHJcbiAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgdyA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNXaWR0aC52YWx1ZSxcclxuICAgICAgICBvdGhlckVsZW1lbnQuZml4dHVyZVN0YXRpY1dpZHRoLnVuaXQsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLmRyYXdPdGhlckVsZW1lbnRzV2l0aExhYmVsKHRoaXMuY2FudmFzLCB4LCB5LCBhLCB3LCBoLCBvdGhlckVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1BvaW50SW5zaWRlUG9seWdvbihcclxuICAgIHBvaW50OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXHJcbiAgICBwb2x5Z29uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH1bXSxcclxuICApOiBib29sZWFuIHtcclxuICAgIGxldCBpbnNpZGUgPSBmYWxzZTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IHBvbHlnb24ubGVuZ3RoIC0gMTsgaSA8IHBvbHlnb24ubGVuZ3RoOyBqID0gaSsrKSB7XHJcbiAgICAgIGNvbnN0IHhpID0gcG9seWdvbltpXS54LFxyXG4gICAgICAgIHlpID0gcG9seWdvbltpXS55O1xyXG4gICAgICBjb25zdCB4aiA9IHBvbHlnb25bal0ueCxcclxuICAgICAgICB5aiA9IHBvbHlnb25bal0ueTtcclxuXHJcbiAgICAgIGNvbnN0IGludGVyc2VjdCA9XHJcbiAgICAgICAgeWkgPiBwb2ludC55ICE9PSB5aiA+IHBvaW50LnkgJiZcclxuICAgICAgICBwb2ludC54IDwgKCh4aiAtIHhpKSAqIChwb2ludC55IC0geWkpKSAvICh5aiAtIHlpKSArIHhpO1xyXG5cclxuICAgICAgaWYgKGludGVyc2VjdCkgaW5zaWRlID0gIWluc2lkZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW5zaWRlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRPY2N1cGllZFJlY3RzKCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH1bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpLm1hcCgob2JqKSA9PiB7XHJcbiAgICAgIGNvbnN0IHIgPSBvYmouZ2V0Qm91bmRpbmdSZWN0KCk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgeDogci5sZWZ0LFxyXG4gICAgICAgIHk6IHIudG9wLFxyXG4gICAgICAgIHc6IHIud2lkdGgsXHJcbiAgICAgICAgaDogci5oZWlnaHQsXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVjdHNPdmVybGFwKFxyXG4gICAgYTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSxcclxuICAgIGI6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIShcclxuICAgICAgYS54ICsgYS53IDw9IGIueCB8fFxyXG4gICAgICBhLnggPj0gYi54ICsgYi53IHx8XHJcbiAgICAgIGEueSArIGEuaCA8PSBiLnkgfHxcclxuICAgICAgYS55ID49IGIueSArIGIuaFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tcHV0ZUVtcHR5TWFyZ2luKFxyXG4gICAgZ3JpZFJlY3Q6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sXHJcbiAgICBib3VuZHM6IHsgbGVmdDogbnVtYmVyOyB0b3A6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcclxuICAgIG9jY3VwaWVkUmVjdHM6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH1bXSxcclxuICApOiBudW1iZXIge1xyXG4gICAgbGV0IG1pbk1hcmdpbiA9IEluZmluaXR5O1xyXG5cclxuICAgIC8vIGRpc3RhbmNlIHRvIGxheW91dCBib3VuZHNcclxuICAgIG1pbk1hcmdpbiA9IE1hdGgubWluKFxyXG4gICAgICBtaW5NYXJnaW4sXHJcbiAgICAgIGdyaWRSZWN0LnggLSBib3VuZHMubGVmdCxcclxuICAgICAgYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLSAoZ3JpZFJlY3QueCArIGdyaWRSZWN0LncpLFxyXG4gICAgICBncmlkUmVjdC55IC0gYm91bmRzLnRvcCxcclxuICAgICAgYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgLSAoZ3JpZFJlY3QueSArIGdyaWRSZWN0LmgpLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBkaXN0YW5jZSB0byBvdGhlciBvYmplY3RzXHJcbiAgICBmb3IgKGNvbnN0IG9jYyBvZiBvY2N1cGllZFJlY3RzKSB7XHJcbiAgICAgIC8vIGhvcml6b250YWwgZ2FwXHJcbiAgICAgIGlmIChvY2MueSA8IGdyaWRSZWN0LnkgKyBncmlkUmVjdC5oICYmIG9jYy55ICsgb2NjLmggPiBncmlkUmVjdC55KSB7XHJcbiAgICAgICAgaWYgKG9jYy54ICsgb2NjLncgPD0gZ3JpZFJlY3QueCkge1xyXG4gICAgICAgICAgbWluTWFyZ2luID0gTWF0aC5taW4obWluTWFyZ2luLCBncmlkUmVjdC54IC0gKG9jYy54ICsgb2NjLncpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG9jYy54ID49IGdyaWRSZWN0LnggKyBncmlkUmVjdC53KSB7XHJcbiAgICAgICAgICBtaW5NYXJnaW4gPSBNYXRoLm1pbihtaW5NYXJnaW4sIG9jYy54IC0gKGdyaWRSZWN0LnggKyBncmlkUmVjdC53KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyB2ZXJ0aWNhbCBnYXBcclxuICAgICAgaWYgKG9jYy54IDwgZ3JpZFJlY3QueCArIGdyaWRSZWN0LncgJiYgb2NjLnggKyBvY2MudyA+IGdyaWRSZWN0LngpIHtcclxuICAgICAgICBpZiAob2NjLnkgKyBvY2MuaCA8PSBncmlkUmVjdC55KSB7XHJcbiAgICAgICAgICBtaW5NYXJnaW4gPSBNYXRoLm1pbihtaW5NYXJnaW4sIGdyaWRSZWN0LnkgLSAob2NjLnkgKyBvY2MuaCkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob2NjLnkgPj0gZ3JpZFJlY3QueSArIGdyaWRSZWN0LmgpIHtcclxuICAgICAgICAgIG1pbk1hcmdpbiA9IE1hdGgubWluKG1pbk1hcmdpbiwgb2NjLnkgLSAoZ3JpZFJlY3QueSArIGdyaWRSZWN0LmgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWluTWFyZ2luO1xyXG4gIH1cclxuXHJcbiAgZHJhd0ZpeHR1cmVSb3dMYWJlbCh0ZXh0OiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBsYWJlbCA9IG5ldyBmYWJyaWMuVGV4dCh0ZXh0LCB7XHJcbiAgICAgIGxlZnQ6IHgsXHJcbiAgICAgIHRvcDogeSxcclxuICAgICAgZm9udFNpemU6IDE0LFxyXG4gICAgICBmb250RmFtaWx5OiBcIkludGVyXCIsXHJcbiAgICAgIGZvbnRXZWlnaHQ6IFwiNjAwXCIsXHJcbiAgICAgIGZpbGw6IFwiIzMzM1wiLFxyXG4gICAgICBvcmlnaW5YOiBcImxlZnRcIixcclxuICAgICAgb3JpZ2luWTogXCJib3R0b21cIixcclxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYW52YXMuYWRkKGxhYmVsKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRyYXdXYWxsKFxyXG4gICAgY2FudmFzOiBmYWJyaWMuQ2FudmFzLFxyXG4gICAgeDogbnVtYmVyLFxyXG4gICAgeTogbnVtYmVyLFxyXG4gICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgZWxlbWVudERhdGE6IGFueSxcclxuICApIHtcclxuICAgIGNvbnN0IHJhZGl1cyA9IDU7XHJcbiAgICBjb25zdCBmaWxsQ29sb3IgPSBcIiNGNkZDRkZcIjtcclxuICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gXCIjRDBENUREXCI7XHJcbiAgICBjb25zdCBsYWJlbENvbG9yID0gXCIjMDA5QkYzXCI7XHJcbiAgICBsZXQgdGV4dCA9IGAke3RoaXMudGl0bGVDYXNlLnRyYW5zZm9ybShlbGVtZW50RGF0YS5lbGVtZW50VHlwZSl9ICR7XHJcbiAgICAgIGVsZW1lbnREYXRhLmVsZW1lbnROdW1iZXJcclxuICAgIH1gO1xyXG5cclxuICAgIGNvbnN0IHdhbGwgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICBsZWZ0OiAwLFxyXG4gICAgICB0b3A6IDAsXHJcbiAgICAgIHdpZHRoLFxyXG4gICAgICBoZWlnaHQsXHJcbiAgICAgIHJ4OiByYWRpdXMsXHJcbiAgICAgIHJ5OiByYWRpdXMsXHJcbiAgICAgIGZpbGw6IGZpbGxDb2xvcixcclxuICAgICAgc3Ryb2tlOiBzdHJva2VDb2xvcixcclxuICAgICAgc3Ryb2tlV2lkdGg6IDAuMjcsXHJcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICBzdHJva2VVbmlmb3JtOiB0cnVlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgY2VudGVyWCA9IHdpZHRoIC8gMjtcclxuICAgIGNvbnN0IGNlbnRlclkgPSBoZWlnaHQgLyAyO1xyXG4gICAgY29uc3QgaXNWZXJ0aWNhbCA9IGhlaWdodCA+IHdpZHRoO1xyXG5cclxuICAgIGNvbnN0IGxhYmVsID0gbmV3IGZhYnJpYy5GYWJyaWNUZXh0KHRleHQsIHtcclxuICAgICAgbGVmdDogY2VudGVyWCxcclxuICAgICAgdG9wOiBjZW50ZXJZLFxyXG4gICAgICBmb250U2l6ZTogMTAsXHJcbiAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgZm9udFdlaWdodDogXCI1MDBcIixcclxuICAgICAgZmlsbDogbGFiZWxDb2xvcixcclxuICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgYW5nbGU6IGlzVmVydGljYWwgPyAtOTAgOiAwLFxyXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGFycm93SGVhZCA9IDU7XHJcbiAgICBjb25zdCBlbGVtZW50czogZmFicmljLk9iamVjdFtdID0gW3dhbGwsIGxhYmVsXTtcclxuXHJcbiAgICBpZiAoaXNWZXJ0aWNhbCkge1xyXG4gICAgICBjb25zdCB0ZXh0V2lkdGggPSBsYWJlbC53aWR0aCB8fCAwO1xyXG4gICAgICBjb25zdCB0b3BBcnJvd1kgPSA1O1xyXG4gICAgICBjb25zdCB0b3BBcnJvd0VuZFkgPSBjZW50ZXJZIC0gdGV4dFdpZHRoIC8gMiAtIDU7XHJcblxyXG4gICAgICBpZiAodG9wQXJyb3dFbmRZID4gdG9wQXJyb3dZICsgYXJyb3dIZWFkKSB7XHJcbiAgICAgICAgZWxlbWVudHMucHVzaChcclxuICAgICAgICAgIG5ldyBmYWJyaWMuTGluZShbY2VudGVyWCwgdG9wQXJyb3dZLCBjZW50ZXJYLCB0b3BBcnJvd0VuZFldLCB7XHJcbiAgICAgICAgICAgIHN0cm9rZTogbGFiZWxDb2xvcixcclxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBuZXcgZmFicmljLlRyaWFuZ2xlKHtcclxuICAgICAgICAgICAgbGVmdDogY2VudGVyWCxcclxuICAgICAgICAgICAgdG9wOiB0b3BBcnJvd1ksXHJcbiAgICAgICAgICAgIHdpZHRoOiBhcnJvd0hlYWQsXHJcbiAgICAgICAgICAgIGhlaWdodDogYXJyb3dIZWFkLFxyXG4gICAgICAgICAgICBhbmdsZTogMCxcclxuICAgICAgICAgICAgZmlsbDogbGFiZWxDb2xvcixcclxuICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgb3JpZ2luWTogXCJib3R0b21cIixcclxuICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBib3R0b21BcnJvd1N0YXJ0WSA9IGNlbnRlclkgKyB0ZXh0V2lkdGggLyAyICsgNTtcclxuICAgICAgY29uc3QgYm90dG9tQXJyb3dFbmRZID0gaGVpZ2h0IC0gNTtcclxuXHJcbiAgICAgIGlmIChib3R0b21BcnJvd0VuZFkgPiBib3R0b21BcnJvd1N0YXJ0WSArIGFycm93SGVhZCkge1xyXG4gICAgICAgIGVsZW1lbnRzLnB1c2goXHJcbiAgICAgICAgICBuZXcgZmFicmljLkxpbmUoXHJcbiAgICAgICAgICAgIFtjZW50ZXJYLCBib3R0b21BcnJvd1N0YXJ0WSwgY2VudGVyWCwgYm90dG9tQXJyb3dFbmRZXSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHN0cm9rZTogbGFiZWxDb2xvcixcclxuICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMSxcclxuICAgICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBuZXcgZmFicmljLlRyaWFuZ2xlKHtcclxuICAgICAgICAgICAgbGVmdDogY2VudGVyWCxcclxuICAgICAgICAgICAgdG9wOiBib3R0b21BcnJvd0VuZFksXHJcbiAgICAgICAgICAgIHdpZHRoOiBhcnJvd0hlYWQsXHJcbiAgICAgICAgICAgIGhlaWdodDogYXJyb3dIZWFkLFxyXG4gICAgICAgICAgICBhbmdsZTogMTgwLFxyXG4gICAgICAgICAgICBmaWxsOiBsYWJlbENvbG9yLFxyXG4gICAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICBvcmlnaW5ZOiBcInRvcFwiLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRleHRXaWR0aCA9IGxhYmVsLndpZHRoIHx8IDA7XHJcbiAgICAgIGNvbnN0IGxlZnRBcnJvd1N0YXJ0WCA9IDU7XHJcbiAgICAgIGNvbnN0IGxlZnRBcnJvd0VuZFggPSBjZW50ZXJYIC0gdGV4dFdpZHRoIC8gMiAtIDU7XHJcblxyXG4gICAgICBpZiAobGVmdEFycm93RW5kWCA+IGxlZnRBcnJvd1N0YXJ0WCArIGFycm93SGVhZCkge1xyXG4gICAgICAgIGVsZW1lbnRzLnB1c2goXHJcbiAgICAgICAgICBuZXcgZmFicmljLkxpbmUoW2xlZnRBcnJvd1N0YXJ0WCwgY2VudGVyWSwgbGVmdEFycm93RW5kWCwgY2VudGVyWV0sIHtcclxuICAgICAgICAgICAgc3Ryb2tlOiBsYWJlbENvbG9yLFxyXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogMSxcclxuICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIG5ldyBmYWJyaWMuVHJpYW5nbGUoe1xyXG4gICAgICAgICAgICBsZWZ0OiBsZWZ0QXJyb3dTdGFydFgsXHJcbiAgICAgICAgICAgIHRvcDogY2VudGVyWSxcclxuICAgICAgICAgICAgd2lkdGg6IGFycm93SGVhZCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBhcnJvd0hlYWQsXHJcbiAgICAgICAgICAgIGFuZ2xlOiAtOTAsXHJcbiAgICAgICAgICAgIGZpbGw6IGxhYmVsQ29sb3IsXHJcbiAgICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcmlnaHRBcnJvd1N0YXJ0WCA9IGNlbnRlclggKyB0ZXh0V2lkdGggLyAyICsgNTtcclxuICAgICAgY29uc3QgcmlnaHRBcnJvd0VuZFggPSB3aWR0aCAtIDU7XHJcblxyXG4gICAgICBpZiAocmlnaHRBcnJvd0VuZFggPiByaWdodEFycm93U3RhcnRYICsgYXJyb3dIZWFkKSB7XHJcbiAgICAgICAgZWxlbWVudHMucHVzaChcclxuICAgICAgICAgIG5ldyBmYWJyaWMuTGluZShcclxuICAgICAgICAgICAgW3JpZ2h0QXJyb3dTdGFydFgsIGNlbnRlclksIHJpZ2h0QXJyb3dFbmRYLCBjZW50ZXJZXSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHN0cm9rZTogbGFiZWxDb2xvcixcclxuICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMSxcclxuICAgICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBuZXcgZmFicmljLlRyaWFuZ2xlKHtcclxuICAgICAgICAgICAgbGVmdDogcmlnaHRBcnJvd0VuZFgsXHJcbiAgICAgICAgICAgIHRvcDogY2VudGVyWSxcclxuICAgICAgICAgICAgd2lkdGg6IGFycm93SGVhZCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBhcnJvd0hlYWQsXHJcbiAgICAgICAgICAgIGFuZ2xlOiA5MCxcclxuICAgICAgICAgICAgZmlsbDogbGFiZWxDb2xvcixcclxuICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbG9ja1N2Z1N0cmluZyA9IGA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgPHBhdGggZD1cIk03IDExVjdDNyA1LjY3MzkyIDcuNTI2NzggNC40MDIxNSA4LjQ2NDQ3IDMuNDY0NDdDOS40MDIxNSAyLjUyNjc4IDEwLjY3MzkgMiAxMiAyQzEzLjMyNjEgMiAxNC41OTc5IDIuNTI2NzggMTUuNTM1NSAzLjQ2NDQ3QzE2LjQ3MzIgNC40MDIxNSAxNyA1LjY3MzkyIDE3IDdWMTFNNSAxMUgxOUMyMC4xMDQ2IDExIDIxIDExLjg5NTQgMjEgMTNWMjBDMjEgMjEuMTA0NiAyMC4xMDQ2IDIyIDE5IDIySDVDMy44OTU0MyAyMiAzIDIxLjEwNDYgMyAyMFYxM0MzIDExLjg5NTQgMy44OTU0MyAxMSA1IDExWlwiIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICA8L3N2Zz5gO1xyXG5cclxuICAgIGxldCBsb2FkZWRTVkc6IGFueSA9IGF3YWl0IGZhYnJpYy5sb2FkU1ZHRnJvbVN0cmluZyhsb2NrU3ZnU3RyaW5nKTtcclxuXHJcbiAgICBsZXQgbG9ja1N2ZyA9IGZhYnJpYy51dGlsLmdyb3VwU1ZHRWxlbWVudHMoXHJcbiAgICAgIGxvYWRlZFNWRy5vYmplY3RzLFxyXG4gICAgICBsb2FkZWRTVkcub3B0aW9ucyxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3Qgd2FsbENlbnRlclggPSB3aWR0aCAvIDI7XHJcbiAgICBjb25zdCB3YWxsQ2VudGVyWSA9IGhlaWdodCAvIDI7XHJcblxyXG4gICAgbG9ja1N2Zy5zY2FsZVRvV2lkdGgoMjApO1xyXG4gICAgbG9ja1N2Zy5zY2FsZVRvSGVpZ2h0KDIwKTtcclxuXHJcbiAgICBpZiAoaXNWZXJ0aWNhbCkge1xyXG4gICAgICBsb2NrU3ZnLnNldCh7XHJcbiAgICAgICAgbGVmdDogd2FsbENlbnRlclgsXHJcbiAgICAgICAgdG9wOiB3YWxsQ2VudGVyWSxcclxuICAgICAgICBhbmdsZTogLTkwLFxyXG4gICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsb2NrU3ZnLnNldCh7XHJcbiAgICAgICAgbGVmdDogd2FsbENlbnRlclgsXHJcbiAgICAgICAgdG9wOiB3YWxsQ2VudGVyWSxcclxuICAgICAgICBhbmdsZTogMCxcclxuICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxvY2tTdmcuc2V0KHtcclxuICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICBldmVudGVkOiB0cnVlLFxyXG4gICAgICBob3ZlckN1cnNvcjogXCJwb2ludGVyXCIsXHJcbiAgICB9KTtcclxuXHJcbiAgICBsb2NrU3ZnLm9uKFwibW91c2Vkb3duXCIsIChvcHQpID0+IHtcclxuICAgICAgaWYgKG9wdCAmJiBvcHQuZSAmJiBvcHQuZS5zdG9wUHJvcGFnYXRpb24pIHtcclxuICAgICAgICBvcHQuZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5sYXlvdXRGb3JtLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICAgIGVsZW1lbnREYXRhLmlzTG9ja2VkID0gIWVsZW1lbnREYXRhPy5pc0xvY2tlZDtcclxuICAgICAgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBlbGVtZW50cy5wdXNoKGxvY2tTdmcpO1xyXG5cclxuICAgIGxldCBtb2RDZW50ZXJYID0geDtcclxuICAgIGxldCBtb2RDZW50ZXJZID0geTtcclxuICAgIGxldCBhbmdsZSA9IGVsZW1lbnREYXRhLmFuZ2xlO1xyXG5cclxuICAgIGNvbnN0IGdyb3VwID0gbmV3IGZhYnJpYy5Hcm91cChlbGVtZW50cywge1xyXG4gICAgICBsZWZ0OiBtb2RDZW50ZXJYLFxyXG4gICAgICB0b3A6IG1vZENlbnRlclksXHJcbiAgICAgIGhhc0NvbnRyb2xzOiB0cnVlLFxyXG4gICAgICBsb2NrU2NhbGluZ1g6IGlzVmVydGljYWwsXHJcbiAgICAgIGxvY2tTY2FsaW5nWTogIWlzVmVydGljYWwsXHJcbiAgICAgIHNlbGVjdGFibGU6IHRoaXMubGF5b3V0Rm9ybS5lbmFibGVkLFxyXG4gICAgICBldmVudGVkOiB0cnVlLFxyXG4gICAgICBob3ZlckN1cnNvcjogXCJwb2ludGVyXCIsXHJcbiAgICAgIGFuZ2xlOiBhbmdsZSxcclxuICAgICAgc3ViVGFyZ2V0Q2hlY2s6IHRydWUsXHJcbiAgICB9KSBhcyBmYWJyaWMuR3JvdXAgJiB7XHJcbiAgICAgIG9ialR5cGU6IHN0cmluZztcclxuICAgICAgZGF0YTogYW55O1xyXG4gICAgfTtcclxuXHJcbiAgICBncm91cC5vYmpUeXBlID0gZWxlbWVudERhdGEuZWxlbWVudFR5cGU7XHJcbiAgICBncm91cC5kYXRhID0gZWxlbWVudERhdGE7XHJcblxyXG4gICAgY2FudmFzLmFkZChncm91cCk7XHJcblxyXG4gICAgLy8gSWYgbmV3bHkgYWRkZWQsIGZvY3VzIGl0IG9uY2VcclxuICAgIGlmICgoZWxlbWVudERhdGEgYXMgYW55KT8ubmV3QWRkZWQpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmNhbnZhcy5zZXRBY3RpdmVPYmplY3QoZ3JvdXApO1xyXG4gICAgICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICAgICAgfSBjYXRjaCB7fVxyXG4gICAgICBkZWxldGUgKGVsZW1lbnREYXRhIGFzIGFueSkubmV3QWRkZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGdyb3VwO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZHJhd0ZpeHR1cmUoXHJcbiAgICBjYW52YXM6IGZhYnJpYy5DYW52YXMsXHJcbiAgICB4OiBudW1iZXIsXHJcbiAgICB5OiBudW1iZXIsXHJcbiAgICBoZWlnaHQ6IG51bWJlcixcclxuICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICBmaXh0dXJlRGF0YTogYW55LFxyXG4gICkge1xyXG4gICAgY29uc3QgYWN0dWFsU2hlbHZlcyA9XHJcbiAgICAgIGZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnPy5maWx0ZXIoKHM6IGFueSkgPT4gcy5zaGVsZlR5cGUgIT0gXCJ2bW9ubHlcIikgPz9cclxuICAgICAgW107XHJcblxyXG4gICAgbGV0IGZpeHR1cmVDb2xvcjogYW55O1xyXG4gICAgaWYgKFtcImZpeHR1cmVcIiwgXCJmaXh0dXJlLXJlZG9cIl0uaW5jbHVkZXModGhpcy5wdWJsaXNoaW5nU3RhdGUpKSB7XHJcbiAgICAgIGZpeHR1cmVDb2xvciA9IHtcclxuICAgICAgICBwcmltYXJ5OlxyXG4gICAgICAgICAgZml4dHVyZURhdGEuc3RhdHVzID09IFwiXCIgJiYgZml4dHVyZURhdGEudGFza1N0YXR1cyA9PSBcInN1Ym1pdFwiXHJcbiAgICAgICAgICAgID8gXCIjYTVhNmE4XCJcclxuICAgICAgICAgICAgOiBmaXh0dXJlRGF0YS5zdGF0dXMgPT0gXCJhZ3JlZVwiXHJcbiAgICAgICAgICAgICAgPyBcIiM2Q0U5QTZcIlxyXG4gICAgICAgICAgICAgIDogXCIjNTFDMUZGXCIsXHJcbiAgICAgICAgZmlsbDpcclxuICAgICAgICAgIGZpeHR1cmVEYXRhLnN0YXR1cyA9PSBcIlwiICYmIGZpeHR1cmVEYXRhLnRhc2tTdGF0dXMgPT0gXCJzdWJtaXRcIlxyXG4gICAgICAgICAgICA/IFwiI2YzZjRmOFwiXHJcbiAgICAgICAgICAgIDogZml4dHVyZURhdGEuc3RhdHVzID09IFwiYWdyZWVcIlxyXG4gICAgICAgICAgICAgID8gXCIjNkNFOUE2XCJcclxuICAgICAgICAgICAgICA6IFwiI0VBRjhGRlwiLFxyXG4gICAgICAgIHZtRmlsbDpcclxuICAgICAgICAgIGZpeHR1cmVEYXRhLnN0YXR1cyA9PSBcIlwiICYmIGZpeHR1cmVEYXRhLnRhc2tTdGF0dXMgPT0gXCJzdWJtaXRcIlxyXG4gICAgICAgICAgICA/IFwiI2E1YTZhOFwiXHJcbiAgICAgICAgICAgIDogXCIjNjkzOEVGXCIsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoZml4dHVyZURhdGEuZml4dHVyZU5hbWUgPT09IFwic3BhY2VcIikgcmV0dXJuO1xyXG5cclxuICAgIC8vIFJlc29sdmUgdGhlIGFuZ2xlIHRoZSBmaXh0dXJlIGdyb3VwIHdpbGwgcmVuZGVyIGF0LiBGb3IgZmlyc3QtcmVuZGVyIG9mIGFcclxuICAgIC8vIENBRC11cGxvYWRlZCBsYXlvdXQsIHRoZSB3YWxsIGFuZ2xlIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGggKG90aGVyd2lzZSB3ZVxyXG4gICAgLy8gaG9ub3IgdGhlIGZpeHR1cmUncyBvd24gc2F2ZWQgYW5nbGUpLiBXaGVuIHRoYXQgYW5nbGUgbGllcyBpbiB0aGVcclxuICAgIC8vIHVwc2lkZS1kb3duIHJhbmdlICg5MMKwLCAyNzDCsCksIHdlIGZsaXAgdGhlIGZpeHR1cmUgYm9keSAxODDCsCBpbiBwbGFjZSBzb1xyXG4gICAgLy8gaXQgcmVuZGVycyBjYW5vbmljYWwgKGhlYWRlciBhdCB0b3AsIHN0b3JhZ2UgYXQgYm90dG9tKS4gVHJhZGUtb2ZmOiBvblxyXG4gICAgLy8gZmxpcHBlZCB3YWxscyB0aGUgc3RvcmFnZSBib3ggZW5kcyB1cCB2aXN1YWxseSB0b3VjaGluZyB0aGUgd2FsbCBpbnN0ZWFkXHJcbiAgICAvLyBvZiB0aGUgaGVhZGVyLiBNaXJyb3JzIHRoZSBzYW1lIGxvZ2ljIGluIG9uYm9hcmQtc3RvcmUtcGxhbm8uXHJcbiAgICBsZXQgYW5nbGUgPSBmaXh0dXJlRGF0YT8ucmVsYXRpdmVQb3NpdGlvbj8uYW5nbGUgPz8gMDtcclxuICAgIGlmICh0aGlzLmZsb29yRGF0YS5jYWRMYXlvdXQgJiYgZml4dHVyZURhdGEuZml4dHVyZVR5cGUgPT09IFwid2FsbFwiKSB7XHJcbiAgICAgIGNvbnN0IHdhbGxEYXRhID0gdGhpcy5nZXRXYWxsQnlOdW1iZXIoXHJcbiAgICAgICAgZml4dHVyZURhdGEuYXNzb2NpYXRlZEVsZW1lbnROdW1iZXIsXHJcbiAgICAgICk7XHJcbiAgICAgIGFuZ2xlID0gd2FsbERhdGE/LmFuZ2xlID8/IDA7XHJcbiAgICB9XHJcbiAgICBjb25zdCBub3JtQW5nbGUgPSAoKCgoYW5nbGUgYXMgbnVtYmVyKSAlIDM2MCkgKyAzNjApICUgMzYwKTtcclxuICAgIGNvbnN0IHNob3VsZEZsaXBCb2R5ID1cclxuICAgICAgdGhpcy5mbG9vckRhdGEuY2FkTGF5b3V0ICYmXHJcbiAgICAgIGZpeHR1cmVEYXRhLmZpeHR1cmVUeXBlID09PSBcIndhbGxcIiAmJlxyXG4gICAgICBub3JtQW5nbGUgPiA5MCAmJlxyXG4gICAgICBub3JtQW5nbGUgPCAyNzA7XHJcblxyXG4gICAgLy8gVG8gcm90YXRlIHRoZSBib2R5IDE4MMKwIHdoaWxlIGtlZXBpbmcgdGhlIHNhbWUgb24tY2FudmFzIHJlZ2lvbiwgc2hpZnRcclxuICAgIC8vIHRoZSBhbmNob3IgYnkgUihvcmlnaW5hbEFuZ2xlKcK3KHdpZHRoLCBoZWlnaHQpIOKAlCB0aGUgY2FudmFzIHBvc2l0aW9uIG9mXHJcbiAgICAvLyB0aGUgdW4tcm90YXRlZCBiYm94J3MgYm90dG9tLXJpZ2h0IGNvcm5lciByZWxhdGl2ZSB0byB0aGUgYW5jaG9yIOKAlCBhbmRcclxuICAgIC8vIGFkZCAxODDCsCB0byB0aGUgcm90YXRpb24uIGZhYnJpYyBzdGlsbCBwaXZvdHMgYXJvdW5kIHRvcC1sZWZ0LlxyXG4gICAgbGV0IHJlbmRlclggPSB4O1xyXG4gICAgbGV0IHJlbmRlclkgPSB5O1xyXG4gICAgbGV0IHJlbmRlckFuZ2xlID0gYW5nbGUgYXMgbnVtYmVyO1xyXG4gICAgaWYgKHNob3VsZEZsaXBCb2R5KSB7XHJcbiAgICAgIGNvbnN0IHJhZCA9ICgoYW5nbGUgYXMgbnVtYmVyKSAqIE1hdGguUEkpIC8gMTgwO1xyXG4gICAgICBjb25zdCBjb3NBID0gTWF0aC5jb3MocmFkKTtcclxuICAgICAgY29uc3Qgc2luQSA9IE1hdGguc2luKHJhZCk7XHJcbiAgICAgIHJlbmRlclggPSB4ICsgY29zQSAqIHdpZHRoIC0gc2luQSAqIGhlaWdodDtcclxuICAgICAgcmVuZGVyWSA9IHkgKyBzaW5BICogd2lkdGggKyBjb3NBICogaGVpZ2h0O1xyXG4gICAgICByZW5kZXJBbmdsZSA9IChhbmdsZSBhcyBudW1iZXIpICsgMTgwO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJhZGl1cyA9IDU7XHJcbiAgICBjb25zdCBtYWluQ29udGFpbmVyID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgbGVmdDogeCxcclxuICAgICAgdG9wOiB5LFxyXG4gICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICByeDogcmFkaXVzLFxyXG4gICAgICByeTogcmFkaXVzLFxyXG4gICAgICBzdHJva2U6IGZpeHR1cmVDb2xvcj8ucHJpbWFyeSA/PyBcIiM1MUMxRkZcIixcclxuICAgICAgc3Ryb2tlV2lkdGg6IDAuMjcsXHJcbiAgICAgIGZpbGw6IFwid2hpdGVcIixcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHRvcFdpZHRoID0gd2lkdGggLyAxLjA1O1xyXG4gICAgY29uc3QgdG9wSGVpZ2h0ID0gKDE1IC8gMTAwKSAqIGhlaWdodDtcclxuICAgIGNvbnN0IHRvcFggPSB4ICsgKHdpZHRoIC0gdG9wV2lkdGgpIC8gMjtcclxuICAgIGNvbnN0IHRvcFkgPSB5ICsgdGhpcy52ZXJ0aWNhbE1hcmdpbjtcclxuXHJcbiAgICBjb25zdCB0b3BDb250YWluZXIgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICBsZWZ0OiB0b3BYLFxyXG4gICAgICB0b3A6IHRvcFksXHJcbiAgICAgIHdpZHRoOiB0b3BXaWR0aCxcclxuICAgICAgaGVpZ2h0OiB0b3BIZWlnaHQsXHJcbiAgICAgIHJ4OiByYWRpdXMsXHJcbiAgICAgIHJ5OiByYWRpdXMsXHJcbiAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5ID8/IFwiIzUxQzFGRlwiLFxyXG4gICAgICBzdHJva2VXaWR0aDogMC4yNyxcclxuICAgICAgZmlsbDogXCJ3aGl0ZVwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgaW5uZXJCb3hIZWlnaHQgPSB0b3BIZWlnaHQgLyAyO1xyXG4gICAgY29uc3QgaW5uZXJUb3BCb3ggPSBuZXcgZmFicmljLlBhdGgoXHJcbiAgICAgIGBNICR7dG9wWCArIHJhZGl1c30gJHt0b3BZfSBcclxuICAgICAgICBMICR7dG9wWCArIHRvcFdpZHRoIC0gcmFkaXVzfSAke3RvcFl9IFxyXG4gICAgICAgIFEgJHt0b3BYICsgdG9wV2lkdGh9ICR7dG9wWX0gJHt0b3BYICsgdG9wV2lkdGh9ICR7dG9wWSArIHJhZGl1c30gXHJcbiAgICAgICAgTCAke3RvcFggKyB0b3BXaWR0aH0gJHt0b3BZICsgaW5uZXJCb3hIZWlnaHR9IFxyXG4gICAgICAgIEwgJHt0b3BYfSAke3RvcFkgKyBpbm5lckJveEhlaWdodH0gXHJcbiAgICAgICAgTCAke3RvcFh9ICR7dG9wWSArIHJhZGl1c30gXHJcbiAgICAgICAgUSAke3RvcFh9ICR7dG9wWX0gJHt0b3BYICsgcmFkaXVzfSAke3RvcFl9IFpgLFxyXG4gICAgICB7XHJcbiAgICAgICAgc3Ryb2tlOiBmaXh0dXJlQ29sb3I/LnByaW1hcnkgPz8gXCIjNTFDMUZGXCIsXHJcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDAuMjcsXHJcbiAgICAgICAgZmlsbDogXCJ0cmFuc3BhcmVudFwiLFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCB0b3BGaWVsZFRleHQgPVxyXG4gICAgICAoZml4dHVyZURhdGEuZml4dHVyZVR5cGUgPT09IFwid2FsbFwiXHJcbiAgICAgICAgPyBgV2FsbC0ke2ZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50TnVtYmVyfSAtIGBcclxuICAgICAgICA6IFwiRmxvb3IgLSBcIikgK1xyXG4gICAgICBgRml4dHVyZSAke1xyXG4gICAgICAgIGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlclxyXG4gICAgICAgICAgPyBmaXh0dXJlRGF0YS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIgK1xyXG4gICAgICAgICAgICAoZml4dHVyZURhdGE/LmZpeHR1cmVOdW1iZXJcclxuICAgICAgICAgICAgICA/IFwiIC0gRlgtXCIgKyBmaXh0dXJlRGF0YS5maXh0dXJlTnVtYmVyXHJcbiAgICAgICAgICAgICAgOiBcIlwiKVxyXG4gICAgICAgICAgOiBcIm5ld1wiXHJcbiAgICAgIH1gO1xyXG5cclxuICAgIGNvbnN0IHRvcFRleHQgPSBuZXcgZmFicmljLlRleHRib3godG9wRmllbGRUZXh0LCB7XHJcbiAgICAgIGxlZnQ6IHRvcFggKyB0b3BXaWR0aCAvIDIsXHJcbiAgICAgIHRvcDogdG9wWSArIGlubmVyQm94SGVpZ2h0IC8gMixcclxuICAgICAgZm9udFNpemU6IDUsXHJcbiAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgZm9udFdlaWdodDogXCI1MDBcIixcclxuICAgICAgZmlsbDogXCIjMTAxODI4XCIsXHJcbiAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgIHdpZHRoOiB0b3BXaWR0aCxcclxuICAgICAgaGVpZ2h0OiBpbm5lckJveEhlaWdodCxcclxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc2Vjb25kQm94WSA9IHRvcFkgKyBpbm5lckJveEhlaWdodDtcclxuXHJcbiAgICBjb25zdCBpbm5lckJvdHRvbUJveCA9IG5ldyBmYWJyaWMuUGF0aChcclxuICAgICAgYE0gJHt0b3BYfSAke3NlY29uZEJveFl9IFxyXG4gICAgTCAke3RvcFggKyB0b3BXaWR0aH0gJHtzZWNvbmRCb3hZfSBcclxuICAgIEwgJHt0b3BYICsgdG9wV2lkdGh9ICR7c2Vjb25kQm94WSArIGlubmVyQm94SGVpZ2h0IC0gcmFkaXVzfSBcclxuICAgIFEgJHt0b3BYICsgdG9wV2lkdGh9ICR7c2Vjb25kQm94WSArIGlubmVyQm94SGVpZ2h0fSAke1xyXG4gICAgICB0b3BYICsgdG9wV2lkdGggLSByYWRpdXNcclxuICAgIH0gJHtzZWNvbmRCb3hZICsgaW5uZXJCb3hIZWlnaHR9IFxyXG4gICAgTCAke3RvcFggKyByYWRpdXN9ICR7c2Vjb25kQm94WSArIGlubmVyQm94SGVpZ2h0fSBcclxuICAgIFEgJHt0b3BYfSAke3NlY29uZEJveFkgKyBpbm5lckJveEhlaWdodH0gJHt0b3BYfSAke1xyXG4gICAgICBzZWNvbmRCb3hZICsgaW5uZXJCb3hIZWlnaHQgLSByYWRpdXNcclxuICAgIH0gXHJcbiAgICBMICR7dG9wWH0gJHtzZWNvbmRCb3hZfSBaYCxcclxuICAgICAge1xyXG4gICAgICAgIGZpbGw6IFwiIzM0NDA1NFwiLFxyXG4gICAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5ID8/IFwiIzUxQzFGRlwiLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgZm9udFNpemUgPSA1O1xyXG4gICAgbGV0IGJvdHRvbVRleHQ7XHJcblxyXG4gICAgY29uc3QgdGV4dENvbnRlbnQgPSBnZXRGaXh0dXJlQ2FudmFzTGFiZWwoZml4dHVyZURhdGEpO1xyXG5cclxuICAgIGNvbnN0IGNyZWF0ZUJvdHRvbVRleHQgPSAoZnM6IGFueSkgPT5cclxuICAgICAgbmV3IGZhYnJpYy5UZXh0Ym94KHRleHRDb250ZW50LCB7XHJcbiAgICAgICAgbGVmdDogdG9wWCArIHRvcFdpZHRoIC8gMixcclxuICAgICAgICB0b3A6IHNlY29uZEJveFkgKyBpbm5lckJveEhlaWdodCAvIDIsXHJcbiAgICAgICAgZm9udFNpemU6IGZzLFxyXG4gICAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgICBmb250V2VpZ2h0OiBcIjUwMFwiLFxyXG4gICAgICAgIGZpbGw6IFwiI0ZGRkZGRlwiLFxyXG4gICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgICAgd2lkdGg6IHRvcFdpZHRoLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICBkbyB7XHJcbiAgICAgIGJvdHRvbVRleHQgPSBjcmVhdGVCb3R0b21UZXh0KGZvbnRTaXplKTtcclxuICAgICAgZm9udFNpemUgLT0gMC41O1xyXG4gICAgfSB3aGlsZSAoYm90dG9tVGV4dC5oZWlnaHQgPiBpbm5lckJveEhlaWdodCAmJiBmb250U2l6ZSA+IDIpO1xyXG5cclxuICAgIGNvbnN0IG1pZFdpZHRoID0gd2lkdGggLyAxLjA1O1xyXG4gICAgY29uc3QgbWlkSGVpZ2h0ID0gKDc3IC8gMTAwKSAqIGhlaWdodDtcclxuICAgIGNvbnN0IG1pZFggPSB4ICsgKHdpZHRoIC0gbWlkV2lkdGgpIC8gMjtcclxuICAgIGNvbnN0IG1pZFkgPSB0b3BZICsgdG9wSGVpZ2h0ICsgdGhpcy52ZXJ0aWNhbE1hcmdpbjtcclxuXHJcbiAgICBjb25zdCBtaWRDb250YWluZXIgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICBsZWZ0OiBtaWRYLFxyXG4gICAgICB0b3A6IG1pZFksXHJcbiAgICAgIHdpZHRoOiBtaWRXaWR0aCxcclxuICAgICAgaGVpZ2h0OiBtaWRIZWlnaHQsXHJcbiAgICAgIHJ4OiByYWRpdXMsXHJcbiAgICAgIHJ5OiByYWRpdXMsXHJcbiAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5ID8/IFwiIzUxQzFGRlwiLFxyXG4gICAgICBzdHJva2VXaWR0aDogMC4yNyxcclxuICAgICAgZmlsbDogXCJ3aGl0ZVwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc2hlbGZDb3VudCA9IGZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnPy5sZW5ndGg7XHJcbiAgICBjb25zdCBib3hIZWlnaHQgPSBtaWRIZWlnaHQgLyAoc2hlbGZDb3VudCArIDIpO1xyXG4gICAgY29uc3QgZmlyc3RCb3hZID0gbWlkWTtcclxuXHJcbiAgICBjb25zdCBmaXJzdEJveCA9IG5ldyBmYWJyaWMuUGF0aChcclxuICAgICAgYE0gJHttaWRYICsgcmFkaXVzfSAke2ZpcnN0Qm94WX0gXHJcbiAgICAgICAgTCAke21pZFggKyBtaWRXaWR0aCAtIHJhZGl1c30gJHtmaXJzdEJveFl9IFxyXG4gICAgICAgIFEgJHttaWRYICsgbWlkV2lkdGh9ICR7Zmlyc3RCb3hZfSAke21pZFggKyBtaWRXaWR0aH0gJHtcclxuICAgICAgICAgIGZpcnN0Qm94WSArIHJhZGl1c1xyXG4gICAgICAgIH0gXHJcbiAgICAgICAgTCAke21pZFggKyBtaWRXaWR0aH0gJHtmaXJzdEJveFkgKyBib3hIZWlnaHR9IFxyXG4gICAgICAgIEwgJHttaWRYfSAke2ZpcnN0Qm94WSArIGJveEhlaWdodH0gXHJcbiAgICAgICAgTCAke21pZFh9ICR7Zmlyc3RCb3hZICsgcmFkaXVzfSBcclxuICAgICAgICBRICR7bWlkWH0gJHtmaXJzdEJveFl9ICR7bWlkWCArIHJhZGl1c30gJHtmaXJzdEJveFl9IFpgLFxyXG4gICAgICB7XHJcbiAgICAgICAgZmlsbDogZml4dHVyZUNvbG9yPy5maWxsXHJcbiAgICAgICAgICA/IGZpeHR1cmVDb2xvcj8uZmlsbFxyXG4gICAgICAgICAgOiBmaXh0dXJlRGF0YS5pc3N1ZVxyXG4gICAgICAgICAgICA/IFwiI0Q5MkQyMFwiXHJcbiAgICAgICAgICAgIDogXCIjRUFGOEZGXCIsXHJcbiAgICAgICAgc3Ryb2tlOiBmaXh0dXJlQ29sb3I/LnByaW1hcnlcclxuICAgICAgICAgID8gZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICA6IGZpeHR1cmVEYXRhLmlzc3VlXHJcbiAgICAgICAgICAgID8gXCIjRDkyRDIwXCJcclxuICAgICAgICAgICAgOiBcIiM2QkNBRkZcIixcclxuICAgICAgICBzdHJva2VXaWR0aDogMC4yNyxcclxuICAgICAgfSxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgZmlyc3RCb3hUZXh0ID0gbmV3IGZhYnJpYy5UZXh0Ym94KFxyXG4gICAgICBgJHtmaXh0dXJlRGF0YT8uaGVhZGVyPy5sYWJlbCA/IGZpeHR1cmVEYXRhLmhlYWRlci5sYWJlbCA6IFwiXCJ9YCxcclxuICAgICAge1xyXG4gICAgICAgIGxlZnQ6IG1pZFggKyBtaWRXaWR0aCAvIDIsXHJcbiAgICAgICAgdG9wOiBmaXJzdEJveFkgKyBib3hIZWlnaHQgLyAyLFxyXG4gICAgICAgIGZvbnRTaXplOiA3LFxyXG4gICAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgICBmb250V2VpZ2h0OiBcIjYwMFwiLFxyXG4gICAgICAgIGZpbGw6IGZpeHR1cmVEYXRhLmlzc3VlID8gXCIjZmZmXCIgOiBcIiMxMDE4MjhcIixcclxuICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgd2lkdGg6IG1pZFdpZHRoLFxyXG4gICAgICAgIGhlaWdodDogYm94SGVpZ2h0LFxyXG4gICAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcclxuICAgICAgfSxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3Qgc2hlbHZlcyA9IFtdO1xyXG4gICAgY29uc3Qgc2hlbGZIZWlnaHQgPSBtaWRIZWlnaHQgLSAyICogYm94SGVpZ2h0O1xyXG5cclxuICAgIGlmIChmaXh0dXJlRGF0YS5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSBcIkwxXCIpIHtcclxuICAgICAgY29uc3QgYm94WSA9IGZpcnN0Qm94WSArIGJveEhlaWdodDtcclxuXHJcbiAgICAgIGNvbnN0IHNoZWxmID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgICBsZWZ0OiBtaWRYLFxyXG4gICAgICAgIHRvcDogYm94WSxcclxuICAgICAgICB3aWR0aDogbWlkV2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiBzaGVsZkhlaWdodCxcclxuICAgICAgICAvLyBzdHJva2U6ICcjNTFDMUZGJyxcclxuICAgICAgICBzdHJva2U6IGZpeHR1cmVDb2xvcj8ucHJpbWFyeVxyXG4gICAgICAgICAgPyBmaXh0dXJlQ29sb3I/LnByaW1hcnlcclxuICAgICAgICAgIDogZml4dHVyZURhdGEuaXNzdWVcclxuICAgICAgICAgICAgPyBcIiNEOTJEMjBcIlxyXG4gICAgICAgICAgICA6IFwiIzUxQzFGRlwiLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICAgIGZpbGw6IFwid2hpdGVcIixcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCB0ZXh0ID0gZml4dHVyZURhdGE/LnByb2R1Y3RCcmFuZE5hbWU/LmpvaW4oXCIgKyBcIikgfHwgXCJcIjtcclxuXHJcbiAgICAgIC8vIFdyYXAgdGV4dCB3aXRoaW4gZml4dHVyZSB3aWR0aCBhbmQgc2hyaW5rIHRvIGZpdCB2ZXJ0aWNhbCBzcGFjZVxyXG4gICAgICBjb25zdCBtYXhUZXh0V2lkdGggPSBtaWRXaWR0aCAqIDAuOTtcclxuICAgICAgY29uc3QgbWF4VGV4dEhlaWdodCA9IHNoZWxmSGVpZ2h0ICogMC44O1xyXG4gICAgICBsZXQgZm9udFNpemVMMSA9IDY7XHJcblxyXG4gICAgICBjb25zdCBjcmVhdGVXcmFwcGVkVGV4dGJveCA9IChmczogbnVtYmVyKSA9PlxyXG4gICAgICAgIG5ldyBmYWJyaWMuVGV4dGJveCh0ZXh0LCB7XHJcbiAgICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLyAyLFxyXG4gICAgICAgICAgdG9wOiBib3hZICsgc2hlbGZIZWlnaHQgLyAyLFxyXG4gICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICB3aWR0aDogbWF4VGV4dFdpZHRoLFxyXG4gICAgICAgICAgZm9udFNpemU6IGZzLFxyXG4gICAgICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICAgICAgZm9udFdlaWdodDogXCI1MDBcIixcclxuICAgICAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcclxuICAgICAgICAgIGZpbGw6IFwiIzMzM1wiLFxyXG4gICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIGxldCB3cmFwcGVkVGV4dCA9IGNyZWF0ZVdyYXBwZWRUZXh0Ym94KGZvbnRTaXplTDEpO1xyXG4gICAgICB3aGlsZSAod3JhcHBlZFRleHQuaGVpZ2h0ID4gbWF4VGV4dEhlaWdodCAmJiBmb250U2l6ZUwxID4gMikge1xyXG4gICAgICAgIGZvbnRTaXplTDEgLT0gMC41O1xyXG4gICAgICAgIHdyYXBwZWRUZXh0ID0gY3JlYXRlV3JhcHBlZFRleHRib3goZm9udFNpemVMMSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHBhZGRpbmcgPSAyO1xyXG4gICAgICBjb25zdCBiYWNrZ3JvdW5kID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLyAyLFxyXG4gICAgICAgIHRvcDogYm94WSArIHNoZWxmSGVpZ2h0IC8gMixcclxuICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgd2lkdGg6IE1hdGgubWluKG1heFRleHRXaWR0aCwgd3JhcHBlZFRleHQud2lkdGghKSArIHBhZGRpbmcsXHJcbiAgICAgICAgaGVpZ2h0OiB3cmFwcGVkVGV4dC5nZXRTY2FsZWRIZWlnaHQoKSArIDIsXHJcbiAgICAgICAgZmlsbDogXCJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSlcIixcclxuICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICByeDogMSxcclxuICAgICAgICByeTogMSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBzaGVsdmVzLnB1c2goc2hlbGYsIGJhY2tncm91bmQsIHdyYXBwZWRUZXh0KTtcclxuICAgIH0gZWxzZSBpZiAoZml4dHVyZURhdGEucHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gXCJMMlwiKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hlbGZDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgYm94WSA9IGZpcnN0Qm94WSArIGJveEhlaWdodCAqIChpICsgMSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNoZWxmID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgICAgIGxlZnQ6IG1pZFgsXHJcbiAgICAgICAgICB0b3A6IGJveFksXHJcbiAgICAgICAgICB3aWR0aDogbWlkV2lkdGgsXHJcbiAgICAgICAgICBoZWlnaHQ6IGJveEhlaWdodCxcclxuICAgICAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICAgID8gZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICAgIDogZml4dHVyZURhdGEuaXNzdWVcclxuICAgICAgICAgICAgICA/IFwiI0Q5MkQyMFwiXHJcbiAgICAgICAgICAgICAgOiBcIiM1MUMxRkZcIixcclxuICAgICAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICAgICAgZmlsbDogXCJ3aGl0ZVwiLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzaGVsdmVzLnB1c2goc2hlbGYpO1xyXG5cclxuICAgICAgICBpZiAoZml4dHVyZURhdGEuc2hlbGZDb25maWc/LltpXS5zaGVsZlR5cGUgPT09IFwidHJheVwiKSB7XHJcbiAgICAgICAgICBjb25zdCB0cmF5Um93cyA9IGZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnPy5baV0udHJheVJvd3MgfHwgMTtcclxuICAgICAgICAgIGNvbnN0IHJvd1NwYWNpbmcgPSBib3hIZWlnaHQgLyB0cmF5Um93cztcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCByID0gMTsgciA8IHRyYXlSb3dzOyByKyspIHtcclxuICAgICAgICAgICAgY29uc3QgbGluZVkgPSBib3hZICsgciAqIHJvd1NwYWNpbmc7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0cmF5TGluZSA9IG5ldyBmYWJyaWMuTGluZShcclxuICAgICAgICAgICAgICBbbWlkWCwgbGluZVksIG1pZFggKyBtaWRXaWR0aCwgbGluZVldLFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN0cm9rZTogXCIjOTk5XCIsXHJcbiAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMC4yLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgc2hlbHZlcy5wdXNoKHRyYXlMaW5lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRleHQgPVxyXG4gICAgICAgICAgZml4dHVyZURhdGEuc2hlbGZDb25maWc/LltpXS5wcm9kdWN0QnJhbmROYW1lPy5qb2luKFwiICsgXCIpIHx8IFwiXCI7XHJcblxyXG4gICAgICAgIC8vIEwyOiBTaW5nbGUtbGluZSBlbGxpcHNpcyBhZ2FpbnN0IGZ1bGwgc2hlbGYgd2lkdGhcclxuICAgICAgICBjb25zdCBob3Jpem9udGFsUGFkZGluZyA9IDY7XHJcbiAgICAgICAgY29uc3QgbWF4VGV4dFdpZHRoID0gTWF0aC5tYXgoMCwgbWlkV2lkdGggLSBob3Jpem9udGFsUGFkZGluZyk7XHJcbiAgICAgICAgY29uc3QgbWF4VGV4dEhlaWdodCA9IGJveEhlaWdodCAqIDAuODtcclxuICAgICAgICBjb25zdCBiYXNlRm9udFNpemUgPSA1O1xyXG5cclxuICAgICAgICBjb25zdCBtZWFzdXJlID0gKHQ6IHN0cmluZykgPT5cclxuICAgICAgICAgIG5ldyBmYWJyaWMuVGV4dCh0LCB7XHJcbiAgICAgICAgICAgIGZvbnRTaXplOiBiYXNlRm9udFNpemUsXHJcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgICAgICAgZm9udFdlaWdodDogXCI1MDBcIixcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgZGlzcGxheVRleHQgPSB0ZXh0O1xyXG4gICAgICAgIGxldCBtZWFzdXJlZCA9IG1lYXN1cmUoZGlzcGxheVRleHQpO1xyXG5cclxuICAgICAgICBpZiAoKG1lYXN1cmVkLndpZHRoID8/IDApID4gbWF4VGV4dFdpZHRoKSB7XHJcbiAgICAgICAgICBjb25zdCBlbGxpcHNpcyA9IFwiLi4uXCI7XHJcbiAgICAgICAgICBsZXQgbGVmdElkeCA9IDA7XHJcbiAgICAgICAgICBsZXQgcmlnaHRJZHggPSB0ZXh0Lmxlbmd0aDtcclxuXHJcbiAgICAgICAgICB3aGlsZSAobGVmdElkeCA8IHJpZ2h0SWR4KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pZElkeCA9IE1hdGguZmxvb3IoKGxlZnRJZHggKyByaWdodElkeCkgLyAyKTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdGV4dC5zbGljZSgwLCBtaWRJZHgpICsgZWxsaXBzaXM7XHJcbiAgICAgICAgICAgIG1lYXN1cmVkID0gbWVhc3VyZShjYW5kaWRhdGUpO1xyXG4gICAgICAgICAgICBpZiAoKG1lYXN1cmVkLndpZHRoID8/IDApID4gbWF4VGV4dFdpZHRoKSB7XHJcbiAgICAgICAgICAgICAgcmlnaHRJZHggPSBtaWRJZHg7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbGVmdElkeCA9IG1pZElkeCArIDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGRpc3BsYXlUZXh0ID0gdGV4dC5zbGljZSgwLCBNYXRoLm1heCgwLCBsZWZ0SWR4IC0gMSkpICsgZWxsaXBzaXM7XHJcbiAgICAgICAgICBtZWFzdXJlZCA9IG1lYXN1cmUoZGlzcGxheVRleHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYmFja2dyb3VuZCA9IG5ldyBmYWJyaWMuUmVjdCh7XHJcbiAgICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLyAyLFxyXG4gICAgICAgICAgdG9wOiBib3hZICsgYm94SGVpZ2h0IC8gMixcclxuICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgd2lkdGg6IG1pZFdpZHRoLFxyXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLm1pbihtYXhUZXh0SGVpZ2h0LCBtZWFzdXJlZC5oZWlnaHQgPz8gMTApICsgMixcclxuICAgICAgICAgIGZpbGw6IFwicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpXCIsXHJcbiAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgcng6IDEsXHJcbiAgICAgICAgICByeTogMSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgZmluYWxUZXh0ID0gbmV3IGZhYnJpYy5UZXh0KGRpc3BsYXlUZXh0LCB7XHJcbiAgICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLyAyLFxyXG4gICAgICAgICAgdG9wOiBib3hZICsgYm94SGVpZ2h0IC8gMixcclxuICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgZm9udFNpemU6IGJhc2VGb250U2l6ZSxcclxuICAgICAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgICAgIGZvbnRXZWlnaHQ6IFwiNTAwXCIsXHJcbiAgICAgICAgICBmaWxsOiBcIiMzMzNcIixcclxuICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNoZWx2ZXMucHVzaChiYWNrZ3JvdW5kLCBmaW5hbFRleHQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGZpeHR1cmVEYXRhLnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgPT09IFwiTDNcIikge1xyXG4gICAgICBjb25zdCBzZXF1ZW50aWFsR3JvdXBzOiB7IHpvbmU6IHN0cmluZzsgc2hlbHZlczogYW55W10gfVtdID0gW107XHJcblxyXG4gICAgICBsZXQgcHJldmlvdXNab25lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgc2hlbGYgb2YgZml4dHVyZURhdGEuc2hlbGZDb25maWcpIHtcclxuICAgICAgICBjb25zdCB6b25lID0gc2hlbGYuem9uZSB8fCBcIlVua25vd25cIjtcclxuICAgICAgICBpZiAoem9uZSAhPT0gcHJldmlvdXNab25lKSB7XHJcbiAgICAgICAgICBzZXF1ZW50aWFsR3JvdXBzLnB1c2goeyB6b25lLCBzaGVsdmVzOiBbc2hlbGZdIH0pO1xyXG4gICAgICAgICAgcHJldmlvdXNab25lID0gem9uZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2VxdWVudGlhbEdyb3Vwc1tzZXF1ZW50aWFsR3JvdXBzLmxlbmd0aCAtIDFdLnNoZWx2ZXMucHVzaChzaGVsZik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgY3VycmVudFNoZWxmSW5kZXggPSAwO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBncm91cCBvZiBzZXF1ZW50aWFsR3JvdXBzKSB7XHJcbiAgICAgICAgY29uc3QgeyB6b25lLCBzaGVsdmVzOiBzaGVsdmVzSW5Hcm91cCB9ID0gZ3JvdXA7XHJcblxyXG4gICAgICAgIGNvbnN0IGdyb3VwU3RhcnRJbmRleCA9IGN1cnJlbnRTaGVsZkluZGV4O1xyXG4gICAgICAgIGNvbnN0IGdyb3VwTGVuZ3RoID0gc2hlbHZlc0luR3JvdXAubGVuZ3RoO1xyXG5cclxuICAgICAgICBjb25zdCBncm91cFRvcFkgPSBmaXJzdEJveFkgKyBib3hIZWlnaHQgKiAoZ3JvdXBTdGFydEluZGV4ICsgMSk7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBCb3R0b21ZID0gZ3JvdXBUb3BZICsgYm94SGVpZ2h0ICogZ3JvdXBMZW5ndGg7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2hlbHZlc0luR3JvdXAubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgIGNvbnN0IHNoZWxmRGF0YSA9IHNoZWx2ZXNJbkdyb3VwW2pdO1xyXG4gICAgICAgICAgY29uc3QgYm94WSA9IGZpcnN0Qm94WSArIGJveEhlaWdodCAqIChjdXJyZW50U2hlbGZJbmRleCArIDEpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHNoZWxmUmVjdCA9IG5ldyBmYWJyaWMuUmVjdCh7XHJcbiAgICAgICAgICAgIGxlZnQ6IG1pZFgsXHJcbiAgICAgICAgICAgIHRvcDogYm94WSxcclxuICAgICAgICAgICAgd2lkdGg6IG1pZFdpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGJveEhlaWdodCxcclxuICAgICAgICAgICAgc3Ryb2tlOiBmaXh0dXJlQ29sb3I/LnByaW1hcnlcclxuICAgICAgICAgICAgICA/IGZpeHR1cmVDb2xvcj8ucHJpbWFyeVxyXG4gICAgICAgICAgICAgIDogZml4dHVyZURhdGEuaXNzdWVcclxuICAgICAgICAgICAgICAgID8gXCIjRDkyRDIwXCJcclxuICAgICAgICAgICAgICAgIDogXCIjNTFDMUZGXCIsXHJcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICAgICAgICBmaWxsOiBcIndoaXRlXCIsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBzaGVsdmVzLnB1c2goc2hlbGZSZWN0KTtcclxuXHJcbiAgICAgICAgICBpZiAoc2hlbGZEYXRhLnNoZWxmVHlwZSA9PT0gXCJ0cmF5XCIpIHtcclxuICAgICAgICAgICAgY29uc3QgdHJheVJvd3MgPSBzaGVsZkRhdGEudHJheVJvd3MgfHwgMDtcclxuICAgICAgICAgICAgY29uc3QgcHJvZHVjdFBlclNoZWxmID0gc2hlbGZEYXRhLnByb2R1Y3RQZXJTaGVsZiB8fCAwO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgcm93U3BhY2luZyA9IGJveEhlaWdodCAvIHRyYXlSb3dzO1xyXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5TcGFjaW5nID0gbWlkV2lkdGggLyBwcm9kdWN0UGVyU2hlbGY7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCByID0gMTsgciA8IHRyYXlSb3dzOyByKyspIHtcclxuICAgICAgICAgICAgICBjb25zdCBsaW5lWSA9IGJveFkgKyByICogcm93U3BhY2luZztcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgdHJheUxpbmUgPSBuZXcgZmFicmljLkxpbmUoXHJcbiAgICAgICAgICAgICAgICBbbWlkWCwgbGluZVksIG1pZFggKyBtaWRXaWR0aCwgbGluZVldLFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBzdHJva2U6IFwiIzk5OVwiLFxyXG4gICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMC4yLFxyXG4gICAgICAgICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgIHNoZWx2ZXMucHVzaCh0cmF5TGluZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAxOyBjIDwgcHJvZHVjdFBlclNoZWxmOyBjKyspIHtcclxuICAgICAgICAgICAgICBjb25zdCBsaW5lWCA9IG1pZFggKyBjICogY29sdW1uU3BhY2luZztcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgdmVydGljYWxMaW5lID0gbmV3IGZhYnJpYy5MaW5lKFxyXG4gICAgICAgICAgICAgICAgW2xpbmVYLCBib3hZLCBsaW5lWCwgYm94WSArIGJveEhlaWdodF0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZTogXCIjOTk5XCIsXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAwLjIsXHJcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgc2hlbHZlcy5wdXNoKHZlcnRpY2FsTGluZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjdXJyZW50U2hlbGZJbmRleCsrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBCb3R0b21MaW5lID0gbmV3IGZhYnJpYy5MaW5lKFxyXG4gICAgICAgICAgW21pZFgsIGdyb3VwQm90dG9tWSwgbWlkWCArIG1pZFdpZHRoLCBncm91cEJvdHRvbVldLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBzdHJva2U6IGZpeHR1cmVDb2xvcj8ucHJpbWFyeVxyXG4gICAgICAgICAgICAgID8gZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICAgICAgOiBmaXh0dXJlRGF0YS5pc3N1ZVxyXG4gICAgICAgICAgICAgICAgPyBcIiNEOTJEMjBcIlxyXG4gICAgICAgICAgICAgICAgOiBcIiM1MUMxRkZcIixcclxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgc2hlbHZlcy5wdXNoKGdyb3VwQm90dG9tTGluZSk7XHJcblxyXG4gICAgICAgIGlmIChmaXh0dXJlRGF0YS5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICAgIGNvbnN0IGxhYmVsUGFkZGluZyA9IDI7XHJcbiAgICAgICAgICBjb25zdCBsYWJlbFRleHQgPSBuZXcgZmFicmljLlRleHRib3goem9uZSwge1xyXG4gICAgICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLSBsYWJlbFBhZGRpbmcsXHJcbiAgICAgICAgICAgIHRvcDogZ3JvdXBCb3R0b21ZLFxyXG4gICAgICAgICAgICBmb250U2l6ZTogNSxcclxuICAgICAgICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICAgICAgICBmb250V2VpZ2h0OiBcIjYwMFwiLFxyXG4gICAgICAgICAgICBmaWxsOiBcIiM3MDcwNzBcIixcclxuICAgICAgICAgICAgb3JpZ2luWDogXCJyaWdodFwiLFxyXG4gICAgICAgICAgICBvcmlnaW5ZOiBcImJvdHRvbVwiLFxyXG4gICAgICAgICAgICB3aWR0aDogbWlkV2lkdGggLyAyLFxyXG4gICAgICAgICAgICB0ZXh0QWxpZ246IFwicmlnaHRcIixcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHNoZWx2ZXMucHVzaChsYWJlbFRleHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBDZW50ZXJYID0gbWlkWCArIG1pZFdpZHRoIC8gMjtcclxuICAgICAgICBjb25zdCBncm91cENlbnRlclkgPSBncm91cFRvcFkgKyAoZ3JvdXBCb3R0b21ZIC0gZ3JvdXBUb3BZKSAvIDI7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25CcmFuZHMgPSBuZXcgU2V0KCk7XHJcblxyXG4gICAgICAgIHNoZWx2ZXNJbkdyb3VwPy5mb3JFYWNoKChzaGVsZikgPT4ge1xyXG4gICAgICAgICAgc2hlbGYucHJvZHVjdEJyYW5kTmFtZT8uZm9yRWFjaCgoYnJhbmQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBzZWN0aW9uQnJhbmRzLmFkZChicmFuZCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKFsuLi5zZWN0aW9uQnJhbmRzXS5sZW5ndGgpIHtcclxuICAgICAgICAgIGNvbnN0IHRleHQgPSBbLi4uc2VjdGlvbkJyYW5kc10uam9pbihcIiArIFwiKTtcclxuICAgICAgICAgIGNvbnN0IHBhZGRpbmcgPSAyO1xyXG4gICAgICAgICAgY29uc3QgbWF4VGV4dFdpZHRoID0gbWlkV2lkdGg7XHJcbiAgICAgICAgICBjb25zdCByZWN0V2lkdGggPSBtaWRXaWR0aCAqIDAuOTtcclxuICAgICAgICAgIGNvbnN0IG1heFRleHRIZWlnaHQgPSAyMDtcclxuXHJcbiAgICAgICAgICBsZXQgZm9udFNpemUgPSA2O1xyXG4gICAgICAgICAgbGV0IHdyYXBwZWRUZXh0O1xyXG5cclxuICAgICAgICAgIGNvbnN0IGNyZWF0ZVRleHRib3ggPSAoZnM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IGZhYnJpYy5UZXh0Ym94KHRleHQsIHtcclxuICAgICAgICAgICAgICBmb250U2l6ZTogZnMsXHJcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IFwiNDAwXCIsXHJcbiAgICAgICAgICAgICAgd2lkdGg6IG1heFRleHRXaWR0aCxcclxuICAgICAgICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICAgIGZpbGw6IFwiIzEwMTgyOFwiLFxyXG4gICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGxlZnQ6IGdyb3VwQ2VudGVyWCxcclxuICAgICAgICAgICAgICB0b3A6IGdyb3VwQ2VudGVyWSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgd3JhcHBlZFRleHQgPSBjcmVhdGVUZXh0Ym94KGZvbnRTaXplKTtcclxuICAgICAgICAgICAgZm9udFNpemUgLT0gMC41O1xyXG4gICAgICAgICAgfSB3aGlsZSAod3JhcHBlZFRleHQuaGVpZ2h0ID4gbWF4VGV4dEhlaWdodCAmJiBmb250U2l6ZSA+IDIpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGZpbmFsRm9udFNpemUgPSBmb250U2l6ZSArIDAuNTtcclxuICAgICAgICAgIGNvbnN0IG1lYXN1cmVUZXh0ID0gKHN0cjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHQgPSBuZXcgZmFicmljLlRleHQoc3RyLCB7XHJcbiAgICAgICAgICAgICAgZm9udFNpemU6IGZpbmFsRm9udFNpemUsXHJcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IFwiNDAwXCIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gdC53aWR0aCA/PyAwO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBpZiAobWVhc3VyZVRleHQodGV4dCkgPiBtYXhUZXh0V2lkdGgpIHtcclxuICAgICAgICAgICAgbGV0IHRydW5jYXRlZCA9IHRleHQ7XHJcbiAgICAgICAgICAgIHdoaWxlICh0cnVuY2F0ZWQubGVuZ3RoID4gMSAmJiBtZWFzdXJlVGV4dCh0cnVuY2F0ZWQgKyAnLi4uJykgPiBtYXhUZXh0V2lkdGgpIHtcclxuICAgICAgICAgICAgICB0cnVuY2F0ZWQgPSB0cnVuY2F0ZWQuc2xpY2UoMCwgLTEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHRydW5jYXRlZFdpZHRoID0gbWVhc3VyZVRleHQodHJ1bmNhdGVkICsgJy4uLicpO1xyXG4gICAgICAgICAgICB3cmFwcGVkVGV4dCA9IGNyZWF0ZVRleHRib3goZmluYWxGb250U2l6ZSk7XHJcbiAgICAgICAgICAgIHdyYXBwZWRUZXh0LnNldCh7IHRleHQ6IHRydW5jYXRlZCArICcuLi4nLCB3aWR0aDogdHJ1bmNhdGVkV2lkdGggfSk7XHJcbiAgICAgICAgICAgIHdyYXBwZWRUZXh0LmluaXREaW1lbnNpb25zKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgcmVjdEhlaWdodCA9IHdyYXBwZWRUZXh0LmdldFNjYWxlZEhlaWdodCgpICsgcGFkZGluZztcclxuXHJcbiAgICAgICAgICBjb25zdCBncm91cENlbnRlclRleHQgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICAgICAgICBsZWZ0OiBncm91cENlbnRlclgsXHJcbiAgICAgICAgICAgIHRvcDogZ3JvdXBDZW50ZXJZLFxyXG4gICAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICB3aWR0aDogcmVjdFdpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IHJlY3RIZWlnaHQsXHJcbiAgICAgICAgICAgIGZpbGw6IFwicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpXCIsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcng6IDEsXHJcbiAgICAgICAgICAgIHJ5OiAxLFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgc2hlbHZlcy5wdXNoKGdyb3VwQ2VudGVyVGV4dCwgd3JhcHBlZFRleHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaXh0dXJlRGF0YT8udm1Db25maWc/Lmxlbmd0aCkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpeHR1cmVEYXRhLnZtQ29uZmlnLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3Qgdm0gPSBmaXh0dXJlRGF0YS52bUNvbmZpZ1tpXTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2hlbGZDb3VudCA9IGZpeHR1cmVEYXRhPy5zaGVsZkNvbmZpZz8ubGVuZ3RoID8/IDA7XHJcbiAgICAgICAgbGV0IHN0YXJ0UG9zID0gdm0/LnN0YXJ0WVBvc2l0aW9uO1xyXG4gICAgICAgIGxldCBlbmRQb3MgPSB2bT8uZW5kWVBvc2l0aW9uO1xyXG5cclxuICAgICAgICBpZiAoIXN0YXJ0UG9zICYmICFlbmRQb3MpIHtcclxuICAgICAgICAgIGlmICh2bT8ueFpvbmUgPT09IFwic3RyZXRjaFwiICYmIHZtPy55Wm9uZSA9PT0gXCJzdHJldGNoXCIpIHtcclxuICAgICAgICAgICAgc3RhcnRQb3MgPSBzaGVsZkNvdW50O1xyXG4gICAgICAgICAgICBlbmRQb3MgPSBzaGVsZkNvdW50O1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc3RhcnRQb3MgPSAxO1xyXG4gICAgICAgICAgICBlbmRQb3MgPSBzaGVsZkNvdW50O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHN0YXJ0UG9zIC0gMTtcclxuICAgICAgICBjb25zdCBlbmRJbmRleCA9IGVuZFBvcyAtIDE7XHJcblxyXG4gICAgICAgIGlmIChzdGFydEluZGV4ID4gc2hlbGZDb3VudCB8fCBlbmRJbmRleCA+IHNoZWxmQ291bnQpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBjb25zdCBzaGVsZlRvcFkgPSBmaXJzdEJveFkgKyBib3hIZWlnaHQgKiAoc3RhcnRJbmRleCArIDEpO1xyXG4gICAgICAgIGNvbnN0IHNoZWxmSGVpZ2h0U3BhbiA9IGJveEhlaWdodCAqIChlbmRJbmRleCAtIHN0YXJ0SW5kZXggKyAxKTtcclxuXHJcbiAgICAgICAgbGV0IHZtSGVpZ2h0UHg6IG51bWJlciA9IHNoZWxmSGVpZ2h0U3BhbjtcclxuICAgICAgICBsZXQgeTogbnVtYmVyID0gc2hlbGZUb3BZO1xyXG5cclxuICAgICAgICBpZiAodm0ueVpvbmUgJiYgdm0ueVpvbmUgIT09IFwic3RyZXRjaFwiKSB7XHJcbiAgICAgICAgICB2bUhlaWdodFB4ID0gc2hlbGZIZWlnaHRTcGFuIC8gMztcclxuXHJcbiAgICAgICAgICBzd2l0Y2ggKHZtLnlab25lKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ0b3BcIjpcclxuICAgICAgICAgICAgICB5ID0gc2hlbGZUb3BZO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibWlkZGxlXCI6XHJcbiAgICAgICAgICAgICAgeSA9IHNoZWxmVG9wWSArIHZtSGVpZ2h0UHg7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJib3R0b21cIjpcclxuICAgICAgICAgICAgICB5ID0gc2hlbGZUb3BZICsgMiAqIHZtSGVpZ2h0UHg7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgeSA9IHNoZWxmVG9wWTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB4ID0gbWlkWDtcclxuICAgICAgICBsZXQgd2lkdGggPSBtaWRXaWR0aDtcclxuXHJcbiAgICAgICAgaWYgKCF2bS54Wm9uZSB8fCB2bS54Wm9uZSA9PT0gXCJzdHJldGNoXCIpIHtcclxuICAgICAgICAgIHdpZHRoID0gbWlkV2lkdGg7XHJcbiAgICAgICAgICB4ID0gbWlkWDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3Qgc2VjdGlvbldpZHRoID0gbWlkV2lkdGggLyAzO1xyXG4gICAgICAgICAgc3dpdGNoICh2bS54Wm9uZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwibGVmdFwiOlxyXG4gICAgICAgICAgICAgIHdpZHRoID0gc2VjdGlvbldpZHRoO1xyXG4gICAgICAgICAgICAgIHggPSBtaWRYO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibWlkZGxlXCI6XHJcbiAgICAgICAgICAgICAgd2lkdGggPSBzZWN0aW9uV2lkdGg7XHJcbiAgICAgICAgICAgICAgeCA9IG1pZFggKyBzZWN0aW9uV2lkdGg7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyaWdodFwiOlxyXG4gICAgICAgICAgICAgIHdpZHRoID0gc2VjdGlvbldpZHRoO1xyXG4gICAgICAgICAgICAgIHggPSBtaWRYICsgMiAqIHNlY3Rpb25XaWR0aDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICB3aWR0aCA9IG1pZFdpZHRoO1xyXG4gICAgICAgICAgICAgIHggPSBtaWRYO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHZtLnZtSW1hZ2VVcmwpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZtSW1hZ2U6IGFueSA9IGF3YWl0IGZhYnJpYy5GYWJyaWNJbWFnZS5mcm9tVVJMKFxyXG4gICAgICAgICAgICAgIGAke3RoaXMuY2RuVXJsfSR7dm0udm1JbWFnZVVybH0/dj0ke0RhdGUubm93KCl9YCxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjcm9zc09yaWdpbjogXCJhbm9ueW1vdXNcIixcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgdm1JbWFnZS5zZXQoe1xyXG4gICAgICAgICAgICAgIGxlZnQ6IHggKyB3aWR0aCAvIDIsXHJcbiAgICAgICAgICAgICAgdG9wOiB5ICsgdm1IZWlnaHRQeCAvIDIsXHJcbiAgICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICAgIHNjYWxlWDogd2lkdGggLyB2bUltYWdlLndpZHRoISxcclxuICAgICAgICAgICAgICBzY2FsZVk6IHZtSGVpZ2h0UHggLyB2bUltYWdlLmhlaWdodCEsXHJcbiAgICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgc2hlbHZlcy5wdXNoKHZtSW1hZ2UpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGxvYWRpbmcgaW1hZ2UgZm9yIFZNOiAke3ZtLnZtSW1hZ2VVcmx9YCwgZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3Qgdm1Cb3ggPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICAgICAgICBsZWZ0OiB4LFxyXG4gICAgICAgICAgICB0b3A6IHksXHJcbiAgICAgICAgICAgIHdpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IHZtSGVpZ2h0UHgsXHJcbiAgICAgICAgICAgIGZpbGw6IGZpeHR1cmVDb2xvcj8udm1GaWxsID8/IFwiIzY5MzhFRlwiLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBsZXQgZm9udFNpemUgPSA1O1xyXG4gICAgICAgICAgbGV0IHZtVGV4dDtcclxuXHJcbiAgICAgICAgICBjb25zdCBjcmVhdGVWbVRleHQgPSAoZnM6IG51bWJlcikgPT5cclxuICAgICAgICAgICAgbmV3IGZhYnJpYy5UZXh0Ym94KHZtLnZtTmFtZSB8fCBcIlwiLCB7XHJcbiAgICAgICAgICAgICAgbGVmdDogeCArIHdpZHRoIC8gMixcclxuICAgICAgICAgICAgICB0b3A6IHkgKyB2bUhlaWdodFB4IC8gMixcclxuICAgICAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgZm9udFNpemU6IGZzLFxyXG4gICAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgICAgICAgICBmb250V2VpZ2h0OiBcIjYwMFwiLFxyXG4gICAgICAgICAgICAgIGZpbGw6IFwid2hpdGVcIixcclxuICAgICAgICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgIHZtVGV4dCA9IGNyZWF0ZVZtVGV4dChmb250U2l6ZSk7XHJcbiAgICAgICAgICAgIGZvbnRTaXplIC09IDAuNTtcclxuICAgICAgICAgIH0gd2hpbGUgKHZtVGV4dC5oZWlnaHQgPiB2bUhlaWdodFB4ICYmIGZvbnRTaXplID4gMik7XHJcblxyXG4gICAgICAgICAgc2hlbHZlcy5wdXNoKHZtQm94LCB2bVRleHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGxhc3RCb3hZID0gZmlyc3RCb3hZICsgYm94SGVpZ2h0ICogKHNoZWxmQ291bnQgKyAxKTtcclxuICAgIGNvbnN0IGxhc3RCb3ggPSBuZXcgZmFicmljLlBhdGgoXHJcbiAgICAgIGBNICR7bWlkWH0gJHtsYXN0Qm94WX0gXHJcbiAgICAgICAgTCAke21pZFggKyBtaWRXaWR0aH0gJHtsYXN0Qm94WX0gXHJcbiAgICAgICAgTCAke21pZFggKyBtaWRXaWR0aH0gJHtsYXN0Qm94WSArIGJveEhlaWdodCAtIHJhZGl1c30gXHJcbiAgICAgICAgUSAke21pZFggKyBtaWRXaWR0aH0gJHtsYXN0Qm94WSArIGJveEhlaWdodH0gJHtcclxuICAgICAgICAgIG1pZFggKyBtaWRXaWR0aCAtIHJhZGl1c1xyXG4gICAgICAgIH0gJHtsYXN0Qm94WSArIGJveEhlaWdodH0gXHJcbiAgICAgICAgTCAke21pZFggKyByYWRpdXN9ICR7bGFzdEJveFkgKyBib3hIZWlnaHR9IFxyXG4gICAgICAgIFEgJHttaWRYfSAke2xhc3RCb3hZICsgYm94SGVpZ2h0fSAke21pZFh9ICR7XHJcbiAgICAgICAgICBsYXN0Qm94WSArIGJveEhlaWdodCAtIHJhZGl1c1xyXG4gICAgICAgIH0gXHJcbiAgICAgICAgTCAke21pZFh9ICR7bGFzdEJveFl9IFpgLFxyXG4gICAgICB7XHJcbiAgICAgICAgZmlsbDogZml4dHVyZUNvbG9yPy5maWxsXHJcbiAgICAgICAgICA/IGZpeHR1cmVDb2xvcj8uZmlsbFxyXG4gICAgICAgICAgOiBmaXh0dXJlRGF0YS5pc3N1ZVxyXG4gICAgICAgICAgICA/IFwiI0ZFRTRFMlwiXHJcbiAgICAgICAgICAgIDogXCIjRUFGOEZGXCIsXHJcbiAgICAgICAgc3Ryb2tlOiBmaXh0dXJlQ29sb3I/LnByaW1hcnlcclxuICAgICAgICAgID8gZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICA6IGZpeHR1cmVEYXRhLmlzc3VlXHJcbiAgICAgICAgICAgID8gXCIjRDkyRDIwXCJcclxuICAgICAgICAgICAgOiBcIiM2QkNBRkZcIixcclxuICAgICAgICBzdHJva2VXaWR0aDogMC4yNyxcclxuICAgICAgfSxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgbGFzdEJveFRleHQgPSBuZXcgZmFicmljLlRleHRib3goXHJcbiAgICAgIGAke2ZpeHR1cmVEYXRhPy5mb290ZXI/LmxhYmVsID8gZml4dHVyZURhdGEuZm9vdGVyLmxhYmVsIDogXCJcIn1gLFxyXG4gICAgICB7XHJcbiAgICAgICAgbGVmdDogbWlkWCArIG1pZFdpZHRoIC8gMixcclxuICAgICAgICB0b3A6IGxhc3RCb3hZICsgYm94SGVpZ2h0IC8gMixcclxuICAgICAgICBmb250U2l6ZTogNSxcclxuICAgICAgICBmb250RmFtaWx5OiBcIkludGVyXCIsXHJcbiAgICAgICAgZm9udFdlaWdodDogXCI2MDBcIixcclxuICAgICAgICBmaWxsOiBcIiMxMDE4MjhcIixcclxuICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxyXG4gICAgICAgIHdpZHRoOiBtaWRXaWR0aCxcclxuICAgICAgICBoZWlndGg6IGJveEhlaWdodCxcclxuICAgICAgfSxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgYm90dG9tV2lkdGggPSB3aWR0aCAvIDEuMDU7XHJcbiAgICBjb25zdCBib3R0b21IZWlnaHQgPSAoMyAvIDEwMCkgKiBoZWlnaHQ7XHJcbiAgICBjb25zdCBib3R0b21YID0geCArICh3aWR0aCAtIGJvdHRvbVdpZHRoKSAvIDI7XHJcbiAgICBjb25zdCBib3R0b21ZID0gbWlkWSArIG1pZEhlaWdodCArIHRoaXMudmVydGljYWxNYXJnaW47XHJcblxyXG4gICAgY29uc3QgYm90dG9tQ29udGFpbmVyID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgbGVmdDogYm90dG9tWCxcclxuICAgICAgdG9wOiBib3R0b21ZLFxyXG4gICAgICB3aWR0aDogYm90dG9tV2lkdGgsXHJcbiAgICAgIGhlaWdodDogYm90dG9tSGVpZ2h0LFxyXG4gICAgICByeDogcmFkaXVzLFxyXG4gICAgICByeTogcmFkaXVzLFxyXG4gICAgICBzdHJva2U6IFwidHJhbnNwYXJlbnRcIixcclxuICAgICAgZmlsbDogXCJ0cmFuc3BhcmVudFwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgYm90dG9tVGV4dENvbnRlbnQgPSBuZXcgZmFicmljLlRleHRib3goXHJcbiAgICAgIGBTaGVsdmVzIC0gJHthY3R1YWxTaGVsdmVzLmxlbmd0aH0gLiBQcm9kdWN0cyAtICAke1xyXG4gICAgICAgIGZpeHR1cmVEYXRhPy5maXh0dXJlQ2FwYWNpdHkgPz8gMFxyXG4gICAgICB9IC4gVk0gLSAke2ZpeHR1cmVEYXRhPy52bUNvbmZpZz8ubGVuZ3RoID8/IDB9YCxcclxuICAgICAge1xyXG4gICAgICAgIGxlZnQ6IGJvdHRvbVggKyBib3R0b21XaWR0aCAvIDIsXHJcbiAgICAgICAgdG9wOiBib3R0b21ZICsgYm90dG9tSGVpZ2h0IC8gMixcclxuICAgICAgICBmb250U2l6ZTogNSxcclxuICAgICAgICBmb250RmFtaWx5OiBcIkludGVyXCIsXHJcbiAgICAgICAgZm9udFdlaWdodDogXCI1MDBcIixcclxuICAgICAgICBmaWxsOiBcIiMzMzNcIixcclxuICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxyXG4gICAgICAgIHdpZHRoOiBib3R0b21XaWR0aCxcclxuICAgICAgICBoZWlnaHQ6IGJvdHRvbUhlaWdodCxcclxuICAgICAgfSxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3Qgc3ZnU3RyaW5nID0gYFxyXG4gICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgPHJlY3Qgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgcng9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiLz5cclxuICAgICAgPHBhdGggZD1cIk0xNC45OTk4IDYuNjAwMDFDMTUuMTU3NCA2LjQ0MjQzIDE1LjM0NDUgNi4zMTc0MiAxNS41NTA0IDYuMjMyMTRDMTUuNzU2MyA2LjE0Njg1IDE1Ljk3NyA2LjEwMjk2IDE2LjE5OTggNi4xMDI5NkMxNi40MjI3IDYuMTAyOTYgMTYuNjQzNCA2LjE0Njg1IDE2Ljg0OTIgNi4yMzIxNEMxNy4wNTUxIDYuMzE3NDIgMTcuMjQyMiA2LjQ0MjQzIDE3LjM5OTggNi42MDAwMUMxNy41NTc0IDYuNzU3NiAxNy42ODI0IDYuOTQ0NjggMTcuNzY3NyA3LjE1MDU4QzE3Ljg1MyA3LjM1NjQ4IDE3Ljg5NjkgNy41NzcxNSAxNy44OTY5IDcuODAwMDFDMTcuODk2OSA4LjAyMjg4IDE3Ljg1MyA4LjI0MzU1IDE3Ljc2NzcgOC40NDk0NUMxNy42ODI0IDguNjU1MzUgMTcuNTU3NCA4Ljg0MjQzIDE3LjM5OTggOS4wMDAwMUw5LjI5OTgyIDE3LjFMNS45OTk4MiAxOEw2Ljg5OTgyIDE0LjdMMTQuOTk5OCA2LjYwMDAxWlwiIHN0cm9rZT1cIiMxRDI5MzlcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgIDwvc3ZnPmA7XHJcblxyXG4gICAgbGV0IGxvYWRlZFNWRzogYW55ID0gYXdhaXQgZmFicmljLmxvYWRTVkdGcm9tU3RyaW5nKHN2Z1N0cmluZyk7XHJcblxyXG4gICAgbGV0IGVkaXRTdmcgPSBmYWJyaWMudXRpbC5ncm91cFNWR0VsZW1lbnRzKFxyXG4gICAgICBsb2FkZWRTVkcub2JqZWN0cyxcclxuICAgICAgbG9hZGVkU1ZHLm9wdGlvbnMsXHJcbiAgICApO1xyXG5cclxuICAgIGVkaXRTdmcuc2V0KHtcclxuICAgICAgc2NhbGVYOiAxLFxyXG4gICAgICBzY2FsZVk6IDEsXHJcbiAgICAgIGxlZnQ6IHggKyB3aWR0aCAtIDMwLFxyXG4gICAgICB0b3A6IHkgKyAxNCxcclxuICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICBldmVudGVkOiB0cnVlLCAvLyBhbGxvdyBldmVudHNcclxuICAgICAgaG92ZXJDdXJzb3I6IFwicG9pbnRlclwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgZWRpdFN2Zy5vbihcIm1vdXNlZG93blwiLCAob3B0KSA9PiB7XHJcbiAgICAgIGlmIChvcHQgJiYgb3B0LmUgJiYgb3B0LmUuc3RvcFByb3BhZ2F0aW9uKSB7XHJcbiAgICAgICAgb3B0LmUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKHRoaXMuaGFzVW5zYXZlZExheW91dENoYW5nZXMoKSkge1xyXG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICBcIlNhdmUgeW91ciBsYXlvdXQgY2hhbmdlcyBiZWZvcmUgZWRpdGluZyB0aGUgZml4dHVyZVwiLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZSA9IHtcclxuICAgICAgICBmaXh0dXJlVHlwZTogZml4dHVyZURhdGEuZml4dHVyZVR5cGUsXHJcbiAgICAgICAgd2FsbEluZGV4OiBmaXh0dXJlRGF0YS5hc3NvY2lhdGVkRWxlbWVudE51bWJlcixcclxuICAgICAgICBmaXh0dXJlSW5kZXg6IGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcixcclxuICAgICAgICBmaXh0dXJlSWQ6IGZpeHR1cmVEYXRhLl9pZCxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkRml4dHVyZS5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICBjb25zdCB3YWxsID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5maW5kKFxyXG4gICAgICAgICAgKHdhbGw6IGFueSkgPT4gd2FsbC5lbGVtZW50TnVtYmVyID09PSB0aGlzLnNlbGVjdGVkRml4dHVyZS53YWxsSW5kZXgsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgZml4dHVyZSA9IHdhbGwuZml4dHVyZXMuZmluZChcclxuICAgICAgICAgIChmaXh0dXJlOiBhbnkpID0+IGZpeHR1cmUuX2lkID09PSB0aGlzLnNlbGVjdGVkRml4dHVyZS5maXh0dXJlSWQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEgPSBzdHJ1Y3R1cmVkQ2xvbmUoZml4dHVyZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEZpeHR1cmUuZml4dHVyZVR5cGUgPT09IFwiZmxvb3JcIikge1xyXG4gICAgICAgIGNvbnN0IGZpeHR1cmUgPSB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlLmZpbmQoXHJcbiAgICAgICAgICAoZml4dHVyZTogYW55KSA9PiBmaXh0dXJlLl9pZCA9PT0gdGhpcy5zZWxlY3RlZEZpeHR1cmUuZml4dHVyZUlkLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhID0gc3RydWN0dXJlZENsb25lKGZpeHR1cmUpO1xyXG4gICAgICB9XHJcbiAgICAgIGRlbGV0ZSB0aGlzPy5zZWxlY3RlZEZpeHR1cmVEYXRhPy50YXNrVHlwZTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmUuZml4dHVyZURhdGEgPSB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGE7XHJcbiAgICAgIHRoaXMuZWRpdEZpeHR1cmUgPSB0cnVlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZml4dHVyZUdyb3VwID0gbmV3IGZhYnJpYy5Hcm91cChcclxuICAgICAgW1xyXG4gICAgICAgIG1haW5Db250YWluZXIsXHJcbiAgICAgICAgdG9wQ29udGFpbmVyLFxyXG4gICAgICAgIGlubmVyVG9wQm94LFxyXG4gICAgICAgIHRvcFRleHQsXHJcbiAgICAgICAgaW5uZXJCb3R0b21Cb3gsXHJcbiAgICAgICAgYm90dG9tVGV4dCxcclxuICAgICAgICBtaWRDb250YWluZXIsXHJcbiAgICAgICAgZmlyc3RCb3gsXHJcbiAgICAgICAgZmlyc3RCb3hUZXh0LFxyXG4gICAgICAgIC4uLnNoZWx2ZXMsXHJcbiAgICAgICAgbGFzdEJveCxcclxuICAgICAgICBsYXN0Qm94VGV4dCxcclxuICAgICAgICBib3R0b21Db250YWluZXIsXHJcbiAgICAgICAgYm90dG9tVGV4dENvbnRlbnQsXHJcbiAgICAgICAgZWRpdFN2ZyxcclxuICAgICAgXSxcclxuICAgICAge1xyXG4gICAgICAgIGxlZnQ6IHJlbmRlclgsXHJcbiAgICAgICAgdG9wOiByZW5kZXJZLFxyXG4gICAgICAgIGV2ZW50ZWQ6IHRydWUsXHJcbiAgICAgICAgaG92ZXJDdXJzb3I6IFwicG9pbnRlclwiLFxyXG4gICAgICAgIHNlbGVjdGFibGU6IHRoaXMubGF5b3V0Rm9ybS5lbmFibGVkLFxyXG4gICAgICAgIGxvY2tTY2FsaW5nWDogdHJ1ZSxcclxuICAgICAgICBsb2NrU2NhbGluZ1k6IHRydWUsXHJcbiAgICAgICAgc3ViVGFyZ2V0Q2hlY2s6IHRydWUsXHJcbiAgICAgICAgYW5nbGU6IHJlbmRlckFuZ2xlLFxyXG4gICAgICB9LFxyXG4gICAgKSBhcyBmYWJyaWMuR3JvdXAgJiB7XHJcbiAgICAgIHdhbGxJbmRleDogbnVtYmVyO1xyXG4gICAgICBmaXh0dXJlSW5kZXg6IG51bWJlcjtcclxuICAgICAgZml4dHVyZUlkOiBzdHJpbmc7XHJcbiAgICAgIGZpeHR1cmVUeXBlOiBcIndhbGxcIiB8IFwiZmxvb3JcIjtcclxuICAgICAgaXNzdWU6IGJvb2xlYW47XHJcbiAgICAgIGlzc3VlRGF0YTogYW55O1xyXG4gICAgICB0YXNrVHlwZTogc3RyaW5nO1xyXG4gICAgICB2bUNvbmZpZzogW107XHJcbiAgICAgIG9ialR5cGU6IHN0cmluZztcclxuICAgIH07XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAhZml4dHVyZURhdGE/Lmlzc3VlICYmXHJcbiAgICAgICFmaXh0dXJlRGF0YT8udW5zYXZlZENoYW5nZXMgJiZcclxuICAgICAgdGhpcy5sYXlvdXRGb3JtLmVuYWJsZWRcclxuICAgICkge1xyXG4gICAgICBmaXh0dXJlR3JvdXAub24oXCJtb3VzZW92ZXJcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGVkaXRTdmcuc2V0KFwidmlzaWJsZVwiLCB0cnVlKTtcclxuICAgICAgICBjYW52YXMucmVuZGVyQWxsKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBmaXh0dXJlR3JvdXAub24oXCJtb3VzZW91dFwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZWRpdFN2Zy5zZXQoXCJ2aXNpYmxlXCIsIGZhbHNlKTtcclxuICAgICAgICBjYW52YXMucmVuZGVyQWxsKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZpeHR1cmVHcm91cC5vbihcIm1vdXNlZG93blwiLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XHJcbiAgICAgIGlmICh0aGlzLmxheW91dEZvcm0uZGlzYWJsZWQpIHtcclxuICAgICAgICB0aGlzLnRvZ2dsZVBhbmVsKFwicmlnaHRcIiwgZmFsc2UpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0Rml4dHVyZUluQWNjb3JkaW9uKGZpeHR1cmVEYXRhKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5oaWdobGlnaHRGaXh0dXJlKHRhcmdldCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0Rml4dHVyZU9uQ2FudmFzQ2xpY2sodGFyZ2V0LCB0cnVlKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmUuZml4dHVyZURhdGEgPSBmaXh0dXJlRGF0YTtcclxuICAgIH0pO1xyXG5cclxuICAgIGZpeHR1cmVHcm91cC5maXh0dXJlVHlwZSA9IGZpeHR1cmVEYXRhLmZpeHR1cmVUeXBlO1xyXG4gICAgZml4dHVyZUdyb3VwLndhbGxJbmRleCA9IGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50TnVtYmVyO1xyXG4gICAgZml4dHVyZUdyb3VwLmZpeHR1cmVJbmRleCA9IGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcjtcclxuICAgIGZpeHR1cmVHcm91cC5maXh0dXJlSWQgPSBmaXh0dXJlRGF0YS5faWQ7XHJcbiAgICBmaXh0dXJlR3JvdXAuaXNzdWUgPSBmaXh0dXJlRGF0YS5pc3N1ZTtcclxuICAgIGZpeHR1cmVHcm91cC5pc3N1ZURhdGEgPSBmaXh0dXJlRGF0YS5pc3N1ZURhdGE7XHJcbiAgICBmaXh0dXJlR3JvdXAudGFza1R5cGUgPSBmaXh0dXJlRGF0YS50YXNrVHlwZTtcclxuICAgIGZpeHR1cmVHcm91cC52bUNvbmZpZyA9IGZpeHR1cmVEYXRhLnZtQ29uZmlnO1xyXG4gICAgZml4dHVyZUdyb3VwLm9ialR5cGUgPSBcImZpeHR1cmVcIjtcclxuXHJcbiAgICAvLyB0aGlzLmNhbnZhcy5vbihcIm9iamVjdDptb3ZpbmdcIiwgKGUpID0+IHtcclxuICAgIC8vICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgYW55O1xyXG4gICAgLy8gICBpZiAoIXRhcmdldCB8fCB0YXJnZXQub2JqVHlwZSAhPT0gXCJmaXh0dXJlXCIpIHJldHVybjtcclxuXHJcbiAgICAvLyAgIGNvbnN0IGFuZ2xlRGVnID0gdGFyZ2V0LmFuZ2xlIHx8IDA7XHJcbiAgICAvLyAgIGNvbnN0IGFuZ2xlID0gKGFuZ2xlRGVnICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICAvLyAgIGlmICghdGFyZ2V0Ll9sYXN0TGVmdCkge1xyXG4gICAgLy8gICAgIHRhcmdldC5fbGFzdExlZnQgPSB0YXJnZXQubGVmdDtcclxuICAgIC8vICAgICB0YXJnZXQuX2xhc3RUb3AgPSB0YXJnZXQudG9wO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIGNvbnN0IGR4ID0gdGFyZ2V0LmxlZnQgLSB0YXJnZXQuX2xhc3RMZWZ0O1xyXG4gICAgLy8gICBjb25zdCBkeSA9IHRhcmdldC50b3AgLSB0YXJnZXQuX2xhc3RUb3A7XHJcbiAgICAvLyAgIGNvbnN0IHByb2plY3RlZCA9IGR4ICogTWF0aC5jb3MoYW5nbGUpICsgZHkgKiBNYXRoLnNpbihhbmdsZSk7XHJcbiAgICAvLyAgIHRhcmdldC5sZWZ0ID0gdGFyZ2V0Ll9sYXN0TGVmdCArIHByb2plY3RlZCAqIE1hdGguY29zKGFuZ2xlKTtcclxuICAgIC8vICAgdGFyZ2V0LnRvcCA9IHRhcmdldC5fbGFzdFRvcCArIHByb2plY3RlZCAqIE1hdGguc2luKGFuZ2xlKTtcclxuICAgIC8vICAgdGFyZ2V0Ll9sYXN0TGVmdCA9IHRhcmdldC5sZWZ0O1xyXG4gICAgLy8gICB0YXJnZXQuX2xhc3RUb3AgPSB0YXJnZXQudG9wO1xyXG4gICAgLy8gfSk7XHJcblxyXG4gICAgY2FudmFzLmFkZChmaXh0dXJlR3JvdXApO1xyXG5cclxuICAgIC8vIElmIG5ld2x5IGFkZGVkLCBmb2N1cyBpdCBvbmNlXHJcbiAgICBpZiAoKGZpeHR1cmVEYXRhIGFzIGFueSk/Lm5ld0FkZGVkKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5jYW52YXMuc2V0QWN0aXZlT2JqZWN0KGZpeHR1cmVHcm91cCk7XHJcbiAgICAgICAgdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gICAgICB9IGNhdGNoIHt9XHJcbiAgICAgIGRlbGV0ZSAoZml4dHVyZURhdGEgYXMgYW55KS5uZXdBZGRlZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZml4dHVyZUdyb3VwO1xyXG4gIH1cclxuXHJcbiAgZHJhd0VudHJhbmNlKFxyXG4gICAgY2FudmFzOiBmYWJyaWMuQ2FudmFzLFxyXG4gICAgeDogbnVtYmVyLFxyXG4gICAgeTogbnVtYmVyLFxyXG4gICAgd2lkdGg6IG51bWJlcixcclxuICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgYXJyb3dXaWR0aDogbnVtYmVyLFxyXG4gICAgZWxlbWVudERhdGE6IGFueSxcclxuICApIHtcclxuICAgIGNvbnN0IGJvZHlXaWR0aCA9IHdpZHRoIC0gYXJyb3dXaWR0aDtcclxuICAgIGNvbnN0IGFuZ2xlID0gdGhpcy5mbG9vckRhdGE/LmNhZExheW91dCA/IDAgOiBlbGVtZW50RGF0YS5hbmdsZTtcclxuXHJcbiAgICBjb25zdCBwYXRoRGF0YSA9IFtcclxuICAgICAgYE0gMCAwYCxcclxuICAgICAgYEwgJHtib2R5V2lkdGh9IDBgLFxyXG4gICAgICBgTCAke2JvZHlXaWR0aH0gJHstaGVpZ2h0IC8gMn1gLFxyXG4gICAgICBgTCAke3dpZHRofSAke2hlaWdodCAvIDJ9YCxcclxuICAgICAgYEwgJHtib2R5V2lkdGh9ICR7aGVpZ2h0ICsgaGVpZ2h0IC8gMn1gLFxyXG4gICAgICBgTCAke2JvZHlXaWR0aH0gJHtoZWlnaHR9YCxcclxuICAgICAgYEwgMCAke2hlaWdodH1gLFxyXG4gICAgICBgWmAsXHJcbiAgICBdLmpvaW4oXCIgXCIpO1xyXG5cclxuICAgIGNvbnN0IGFycm93ID0gbmV3IGZhYnJpYy5QYXRoKHBhdGhEYXRhLCB7XHJcbiAgICAgIGZpbGw6IFwiIzAzQTlGNFwiLFxyXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBtYXhUZXh0SGVpZ2h0ID0gaGVpZ2h0IC0gNjtcclxuICAgIGNvbnN0IHRleHQgPSBuZXcgZmFicmljLlRleHQoXCJFbnRyYW5jZVwiLCB7XHJcbiAgICAgIGZvbnRGYW1pbHk6IFwiQXJpYWxcIixcclxuICAgICAgZm9udFdlaWdodDogXCJib2xkXCIsXHJcbiAgICAgIGZpbGw6IFwid2hpdGVcIixcclxuICAgICAgYW5nbGU6IC05MCxcclxuICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgbGVmdDogMTUsXHJcbiAgICAgIHRvcDogaGVpZ2h0IC8gMixcclxuICAgICAgZm9udFNpemU6IDIwLFxyXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0ZXh0Qm91bmRzID0gdGV4dC5nZXRCb3VuZGluZ1JlY3QoKTtcclxuICAgIGlmICh0ZXh0Qm91bmRzLmhlaWdodCA+IG1heFRleHRIZWlnaHQpIHtcclxuICAgICAgY29uc3Qgc2NhbGUgPSBtYXhUZXh0SGVpZ2h0IC8gdGV4dEJvdW5kcy5oZWlnaHQ7XHJcbiAgICAgIHRleHQuc2V0KFwiZm9udFNpemVcIiwgdGV4dC5mb250U2l6ZSEgKiBzY2FsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZ3JvdXAgPSBuZXcgZmFicmljLkdyb3VwKFthcnJvdywgdGV4dF0sIHtcclxuICAgICAgbGVmdDogeCxcclxuICAgICAgdG9wOiB5LFxyXG4gICAgICBzZWxlY3RhYmxlOiB0aGlzLmxheW91dEZvcm0uZW5hYmxlZCxcclxuICAgICAgbG9ja1NjYWxpbmdYOiB0cnVlLFxyXG4gICAgICBsb2NrU2NhbGluZ1k6IHRydWUsXHJcbiAgICAgIGxvY2tTY2FsaW5nRmxpcDogdHJ1ZSxcclxuICAgICAgYW5nbGU6IGFuZ2xlLFxyXG4gICAgfSkgYXMgZmFicmljLkdyb3VwICYge1xyXG4gICAgICBvYmpUeXBlOiBzdHJpbmc7XHJcbiAgICAgIGRhdGE6IGFueTtcclxuICAgIH07XHJcblxyXG4gICAgZ3JvdXAub2JqVHlwZSA9IGVsZW1lbnREYXRhLmVsZW1lbnRUeXBlO1xyXG4gICAgZ3JvdXAuZGF0YSA9IGVsZW1lbnREYXRhO1xyXG5cclxuICAgIGNhbnZhcy5hZGQoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgZHJhd090aGVyRWxlbWVudHNXaXRoTGFiZWwoXHJcbiAgICBjYW52YXM6IGZhYnJpYy5DYW52YXMsXHJcbiAgICB4OiBudW1iZXIsXHJcbiAgICB5OiBudW1iZXIsXHJcbiAgICBhOiBudW1iZXIsXHJcbiAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICBlbGVtZW50OiBhbnksXHJcbiAgKTogZmFicmljLkdyb3VwIHtcclxuICAgIGNvbnN0IHJlY3QgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICB3aWR0aCxcclxuICAgICAgaGVpZ2h0LFxyXG4gICAgICByeDogMixcclxuICAgICAgcnk6IDIsXHJcbiAgICAgIGZpbGw6IFwiI0RBRjFGRlwiLFxyXG4gICAgICBzdHJva2U6IFwiIzZCQ0FGRlwiLFxyXG4gICAgICBzdHJva2VXaWR0aDogMixcclxuICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHRleHQgPSBuZXcgZmFicmljLlRleHRib3goZWxlbWVudC5maXh0dXJlTmFtZSwge1xyXG4gICAgICB3aWR0aDogd2lkdGggLSA4LFxyXG4gICAgICBmb250U2l6ZTogMTQsXHJcbiAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgZm9udFdlaWdodDogXCI1MDBcIixcclxuICAgICAgZmlsbDogXCIjMTAxODI4XCIsXHJcbiAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcclxuICAgICAgZWRpdGFibGU6IGZhbHNlLFxyXG4gICAgICBzcGxpdEJ5R3JhcGhlbWU6IHRydWUsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0ZXh0Qm91bmRzID0gdGV4dC5nZXRCb3VuZGluZ1JlY3QoKTtcclxuXHJcbiAgICBpZiAodGV4dEJvdW5kcy5oZWlnaHQgPiBoZWlnaHQgLSA4KSB7XHJcbiAgICAgIGNvbnN0IHNjYWxlID0gKGhlaWdodCAtIDgpIC8gdGV4dEJvdW5kcy5oZWlnaHQ7XHJcbiAgICAgIHRleHQuc2V0KFwiZm9udFNpemVcIiwgdGV4dC5mb250U2l6ZSEgKiBzY2FsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZ3JvdXAgPSBuZXcgZmFicmljLkdyb3VwKFtyZWN0LCB0ZXh0XSwge1xyXG4gICAgICBsZWZ0OiB4LFxyXG4gICAgICB0b3A6IHksXHJcbiAgICAgIGFuZ2xlOiBhLFxyXG4gICAgICBzZWxlY3RhYmxlOiB0aGlzLmxheW91dEZvcm0uZW5hYmxlZCxcclxuICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgIH0pIGFzIGZhYnJpYy5Hcm91cCAmIHtcclxuICAgICAgb2JqVHlwZTogc3RyaW5nO1xyXG4gICAgICBkYXRhOiBhbnk7XHJcbiAgICB9O1xyXG5cclxuICAgIGdyb3VwLm9ialR5cGUgPSBcIm90aGVyc1wiO1xyXG4gICAgZ3JvdXAuZGF0YSA9IGVsZW1lbnQ7XHJcblxyXG4gICAgY2FudmFzLmFkZChncm91cCk7XHJcblxyXG4gICAgaWYgKChlbGVtZW50IGFzIGFueSk/Lm5ld0FkZGVkKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5jYW52YXMuc2V0QWN0aXZlT2JqZWN0KGdyb3VwKTtcclxuICAgICAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgICAgIH0gY2F0Y2gge31cclxuICAgICAgZGVsZXRlIChlbGVtZW50IGFzIGFueSkubmV3QWRkZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGdyb3VwO1xyXG4gIH1cclxuXHJcbiAgZHJhd0JnKCkge1xyXG4gICAgY29uc3Qgd2FsbDEgPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZpbmQoXHJcbiAgICAgIChlOiBhbnkpID0+IGUuZWxlbWVudE51bWJlciA9PT0gMSAmJiBlLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIixcclxuICAgICk7XHJcbiAgICBjb25zdCB3YWxsMiA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZmluZChcclxuICAgICAgKGU6IGFueSkgPT4gZS5lbGVtZW50TnVtYmVyID09PSAyICYmIGUuZWxlbWVudFR5cGUgPT09IFwid2FsbFwiLFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHdpZHRoID0gdGhpcy50b1BpeGVscyh3YWxsMS5kaXN0YW5jZSwgd2FsbDEudW5pdCk7XHJcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnRvUGl4ZWxzKHdhbGwyLmRpc3RhbmNlLCB3YWxsMi51bml0KTtcclxuXHJcbiAgICBjb25zdCBiZyA9IG5ldyBmYWJyaWMuUmVjdCh7XHJcbiAgICAgIGxlZnQ6IHRoaXMud2FsbFRoaWNrbmVzcyxcclxuICAgICAgdG9wOiB0aGlzLndhbGxUaGlja25lc3MsXHJcbiAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXHJcbiAgICAgIGZpbGw6IFwiI2VhZWNmMFwiLFxyXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbnZhcy5hZGQoYmcpO1xyXG4gICAgdGhpcy5jYW52YXMucmVtb3ZlKGJnKTtcclxuICAgIHRoaXMuY2FudmFzLmluc2VydEF0KDAsIGJnKTtcclxuICAgIHRoaXMuY2FudmFzLnJlbmRlckFsbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gZ2V0Rml4dHVyZU1ldGFUb1JlbmRlcihmaXh0dXJlOiBhbnksIHdhbGxEYXRhOiBhbnkpIHtcclxuXHJcbiAgLy8gICByZXR1cm4ge1xyXG4gIC8vICAgICB4LFxyXG4gIC8vICAgICB5LFxyXG4gIC8vICAgICBmaXh0dXJlSGVpZ2h0LFxyXG4gIC8vICAgICBmaXh0dXJlV2lkdGgsXHJcbiAgLy8gICB9O1xyXG4gIC8vIH1cclxuXHJcbiAgc3Vic2NyaWJlVG9GaXh0dXJlQ29uZmlnSWRDaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5maXh0dXJlQ29uZmlnU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWIpID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcclxuICAgIHRoaXMuZml4dHVyZUNvbmZpZ1N1YnNjcmlwdGlvbnMgPSBbXTtcclxuXHJcbiAgICB0aGlzLmdldEZvcm1XYWxscy5jb250cm9scy5mb3JFYWNoKChjb250cm9sLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IHdhbGxHcm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xyXG4gICAgICBjb25zdCBmaXh0dXJlc0FycmF5ID0gd2FsbEdyb3VwLmdldChcImZpeHR1cmVzXCIpIGFzIEZvcm1BcnJheTtcclxuXHJcbiAgICAgIGZpeHR1cmVzQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoZml4dHVyZUNvbnRyb2wsIGopID0+IHtcclxuICAgICAgICBjb25zdCBmaXh0dXJlR3JvdXAgPSBmaXh0dXJlQ29udHJvbCBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgY29uc3Qgc3ViID0gZml4dHVyZUdyb3VwXHJcbiAgICAgICAgICAuZ2V0KFwiZml4dHVyZUNvbmZpZ0lkXCIpXHJcbiAgICAgICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKG5ld1ZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRml4dHVyZVRlbXBsYXRlKG5ld1ZhbHVlLCBcIndhbGxcIiwgaiwgaSk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHN1YikgdGhpcy5maXh0dXJlQ29uZmlnU3Vic2NyaXB0aW9ucy5wdXNoKHN1Yik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5nZXRGb3JtRmxvb3JGaXh0dXJlcy5jb250cm9scy5mb3JFYWNoKChmaXh0dXJlQ29udHJvbCwgaykgPT4ge1xyXG4gICAgICBjb25zdCBmaXh0dXJlR3JvdXAgPSBmaXh0dXJlQ29udHJvbCBhcyBGb3JtR3JvdXA7XHJcbiAgICAgIGNvbnN0IHN1YiA9IGZpeHR1cmVHcm91cFxyXG4gICAgICAgIC5nZXQoXCJmaXh0dXJlQ29uZmlnSWRcIilcclxuICAgICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChuZXdWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jaGFuZ2VGaXh0dXJlVGVtcGxhdGUobmV3VmFsdWUsIFwiZmxvb3JcIiwgayk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoc3ViKSB0aGlzLmZpeHR1cmVDb25maWdTdWJzY3JpcHRpb25zLnB1c2goc3ViKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3Vic2NyaWJlVG9PdGhlckVsZW1lbnRzQ2hhbmdlcygpIHtcclxuICAgIHRoaXMub3RoZXJFbGVtZW50c1N1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3ViKSA9PiBzdWI/LnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgdGhpcy5vdGhlckVsZW1lbnRzU3Vic2NyaXB0aW9ucyA9IFtdO1xyXG5cclxuICAgIC8vIFdhbGwtbGV2ZWwgb3RoZXJFbGVtZW50cyBsYWJlbCBzdWJzY3JpcHRpb25zXHJcbiAgICB0aGlzLmdldEZvcm1XYWxscy5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XHJcbiAgICAgIGNvbnN0IHdhbGxHcm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xyXG4gICAgICBjb25zdCBvdGhlckFycmF5ID0gd2FsbEdyb3VwLmdldChcIm90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5O1xyXG5cclxuICAgICAgb3RoZXJBcnJheS5jb250cm9scy5mb3JFYWNoKChjdHJsLCBvdGhlcklkeCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRHcm91cCA9IGN0cmwgYXMgRm9ybUdyb3VwO1xyXG4gICAgICAgIGNvbnN0IHR5cGVDb250cm9sID0gZWxlbWVudEdyb3VwLmdldChcInR5cGVcIikgYXMgRm9ybUNvbnRyb2w7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tTmFtZUNvbnRyb2wgPSBlbGVtZW50R3JvdXAuZ2V0KFwiY3VzdG9tTmFtZVwiKSBhcyBGb3JtQ29udHJvbDtcclxuXHJcbiAgICAgICAgY29uc3Qgd2FsbE1ldGEgPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZpbmQoXHJcbiAgICAgICAgICAoZWw6IGFueSkgPT5cclxuICAgICAgICAgICAgZWwuZWxlbWVudFR5cGUgPT09IHdhbGxHcm91cC5nZXQoXCJlbGVtZW50VHlwZVwiKT8udmFsdWUgJiZcclxuICAgICAgICAgICAgZWwuZWxlbWVudE51bWJlciA9PT0gd2FsbEdyb3VwLmdldChcImVsZW1lbnROdW1iZXJcIik/LnZhbHVlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudFJlZiA9IHdhbGxNZXRhPy5vdGhlckVsZW1lbnRzPy5bb3RoZXJJZHhdO1xyXG4gICAgICAgIGlmICghZWxlbWVudFJlZikgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyB3aGVuIHR5cGUgY2hhbmdlcyAoZHJvcGRvd24pXHJcbiAgICAgICAgY29uc3Qgc3ViVHlwZSA9IHR5cGVDb250cm9sLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoc2VsZWN0ZWQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAvLyBpZiB1c2VyIHBpY2tzIFwiT3RoZXJzXCIsIHByZWZlciBjdXN0b21OYW1lIGlmIHByZXNlbnQsIG90aGVyd2lzZSBzZXQgZml4dHVyZU5hbWUgdG8gXCJPdGhlcnNcIlxyXG4gICAgICAgICAgICBlbGVtZW50UmVmLmZpeHR1cmVOYW1lID1cclxuICAgICAgICAgICAgICBzZWxlY3RlZCA9PT0gXCJPdGhlcnNcIlxyXG4gICAgICAgICAgICAgICAgPyBjdXN0b21OYW1lQ29udHJvbD8udmFsdWUgfHwgXCJPdGhlcnNcIlxyXG4gICAgICAgICAgICAgICAgOiBzZWxlY3RlZDtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDYW52YXNPdGhlckVsZW1lbnRMYWJlbChlbGVtZW50UmVmKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyB3aGVuIGN1c3RvbU5hbWUgY2hhbmdlcyAodGV4dCBpbnB1dCB2aXNpYmxlIG9ubHkgd2hlbiB0eXBlID09PSAnT3RoZXJzJylcclxuICAgICAgICBjb25zdCBzdWJDdXN0b20gPSBjdXN0b21OYW1lQ29udHJvbC52YWx1ZUNoYW5nZXNcclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKGN1c3RvbTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlQ29udHJvbC52YWx1ZSA9PT0gXCJPdGhlcnNcIikge1xyXG4gICAgICAgICAgICAgIGVsZW1lbnRSZWYuZml4dHVyZU5hbWUgPSBjdXN0b207XHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYW52YXNPdGhlckVsZW1lbnRMYWJlbChlbGVtZW50UmVmKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMub3RoZXJFbGVtZW50c1N1YnNjcmlwdGlvbnMucHVzaChzdWJUeXBlLCBzdWJDdXN0b20pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEZsb29yLWxldmVsIG90aGVyRWxlbWVudHMgbGFiZWwgc3Vic2NyaXB0aW9uc1xyXG4gICAgdGhpcy5nZXRGb3JtRmxvb3JPdGhlckVsZW1lbnRzLmNvbnRyb2xzLmZvckVhY2goKGN0cmwsIGlkeCkgPT4ge1xyXG4gICAgICBjb25zdCBlbGVtZW50R3JvdXAgPSBjdHJsIGFzIEZvcm1Hcm91cDtcclxuICAgICAgY29uc3QgdHlwZUNvbnRyb2wgPSBlbGVtZW50R3JvdXAuZ2V0KFwidHlwZVwiKSBhcyBGb3JtQ29udHJvbDtcclxuICAgICAgY29uc3QgY3VzdG9tTmFtZUNvbnRyb2wgPSBlbGVtZW50R3JvdXAuZ2V0KFwiY3VzdG9tTmFtZVwiKSBhcyBGb3JtQ29udHJvbDtcclxuICAgICAgY29uc3QgZWxlbWVudFJlZiA9IHRoaXMuZmxvb3JEYXRhPy5vdGhlckVsZW1lbnRzPy5baWR4XTtcclxuICAgICAgaWYgKCFlbGVtZW50UmVmKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBzdWJUeXBlID0gdHlwZUNvbnRyb2wudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHNlbGVjdGVkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGVsZW1lbnRSZWYuZml4dHVyZU5hbWUgPVxyXG4gICAgICAgICAgICBzZWxlY3RlZCA9PT0gXCJPdGhlcnNcIlxyXG4gICAgICAgICAgICAgID8gY3VzdG9tTmFtZUNvbnRyb2w/LnZhbHVlIHx8IFwiT3RoZXJzXCJcclxuICAgICAgICAgICAgICA6IHNlbGVjdGVkO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVDYW52YXNPdGhlckVsZW1lbnRMYWJlbChlbGVtZW50UmVmKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHN1YkN1c3RvbSA9IGN1c3RvbU5hbWVDb250cm9sLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChjdXN0b206IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGVDb250cm9sLnZhbHVlID09PSBcIk90aGVyc1wiKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRSZWYuZml4dHVyZU5hbWUgPSBjdXN0b207XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FudmFzT3RoZXJFbGVtZW50TGFiZWwoZWxlbWVudFJlZik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLm90aGVyRWxlbWVudHNTdWJzY3JpcHRpb25zLnB1c2goc3ViVHlwZSwgc3ViQ3VzdG9tKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ2FudmFzT3RoZXJFbGVtZW50TGFiZWwoZWxlbWVudFJlZjogYW55KSB7XHJcbiAgICBpZiAoIXRoaXMuY2FudmFzKSByZXR1cm47XHJcbiAgICBjb25zdCBncm91cCA9IHRoaXMuY2FudmFzXHJcbiAgICAgIC5nZXRPYmplY3RzKClcclxuICAgICAgLmZpbmQoXHJcbiAgICAgICAgKG9iajogYW55KSA9PlxyXG4gICAgICAgICAgb2JqPy5vYmpUeXBlID09PSBcIm90aGVyc1wiICYmIG9iaj8uZGF0YS5faWQgPT09IGVsZW1lbnRSZWYuX2lkLFxyXG4gICAgICApIGFzIGFueTtcclxuXHJcbiAgICBpZiAoIWdyb3VwKSByZXR1cm47XHJcbiAgICBncm91cC5kYXRhID0gZWxlbWVudFJlZjtcclxuXHJcbiAgICBjb25zdCB0ZXh0T2JqID0gKGdyb3VwLmdldE9iamVjdHMoKSB8fCBbXSkuZmluZChcclxuICAgICAgKG86IGFueSkgPT4gbz8udHlwZSA9PT0gXCJ0ZXh0XCIgfHwgbz8udHlwZSA9PT0gXCJ0ZXh0Ym94XCIsXHJcbiAgICApIGFzIGZhYnJpYy5UZXh0IHwgZmFicmljLlRleHRib3ggfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgaWYgKHRleHRPYmopIHtcclxuICAgICAgKHRleHRPYmogYXMgYW55KS5zZXQoeyB0ZXh0OiBlbGVtZW50UmVmLmZpeHR1cmVOYW1lIH0pO1xyXG4gICAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByb3RhdGVDYW52YXMoY2FudmFzOiBmYWJyaWMuQ2FudmFzLCBhbmdsZURlZzogbnVtYmVyKSB7XHJcbiAgICBpZiAoIWNhbnZhcykgcmV0dXJuO1xyXG4gICAgY29uc3QgYWxsT2JqZWN0cyA9IGNhbnZhcy5nZXRPYmplY3RzKCk7XHJcbiAgICBpZiAoIWFsbE9iamVjdHMgfHwgYWxsT2JqZWN0cy5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICAvLyBDcmVhdGUgYW4gQWN0aXZlU2VsZWN0aW9uIGNvbnRhaW5pbmcgYWxsIG9iamVjdHMgb24gdGhlIGNhbnZhc1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gbmV3IGZhYnJpYy5BY3RpdmVTZWxlY3Rpb24oYWxsT2JqZWN0cyBhcyBhbnksIHsgY2FudmFzIH0pO1xyXG4gICAgY2FudmFzLnNldEFjdGl2ZU9iamVjdChzZWxlY3Rpb24pO1xyXG5cclxuICAgIC8vIFJvdGF0ZSB0aGUgQWN0aXZlU2VsZWN0aW9uIGRpcmVjdGx5ICh3b3JrcyBsaWtlIGEgdGVtcG9yYXJ5IGdyb3VwKVxyXG4gICAgY29uc3QgYWN0aXZlOiBhbnkgPSBjYW52YXMuZ2V0QWN0aXZlT2JqZWN0KCk7XHJcbiAgICBpZiAoIWFjdGl2ZSkge1xyXG4gICAgICBjYW52YXMuZGlzY2FyZEFjdGl2ZU9iamVjdCgpO1xyXG4gICAgICBjYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY3VycmVudEFuZ2xlID0gYWN0aXZlLmFuZ2xlIHx8IDA7XHJcbiAgICBhY3RpdmUucm90YXRlKGN1cnJlbnRBbmdsZSArIGFuZ2xlRGVnKTtcclxuICAgIGFjdGl2ZS5zZXRDb29yZHMoKTtcclxuXHJcbiAgICAvLyBDbGVhciBzZWxlY3Rpb24gYnV0IGtlZXAgcm90YXRlZCBwb3NpdGlvbnMgb2YgY2hpbGQgb2JqZWN0c1xyXG4gICAgY2FudmFzLmRpc2NhcmRBY3RpdmVPYmplY3QoKTtcclxuICAgIGNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RGaXh0dXJlT25DYW52YXNDbGljayh0YXJnZXQ6IGFueSwgY29sbGFwc2VUYXNrSW5mbzogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBpZiAodGFyZ2V0KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlID0ge1xyXG4gICAgICAgIGZpeHR1cmVUeXBlOiB0YXJnZXQuZml4dHVyZVR5cGUsXHJcbiAgICAgICAgd2FsbEluZGV4OiB0YXJnZXQud2FsbEluZGV4LFxyXG4gICAgICAgIGZpeHR1cmVJbmRleDogdGFyZ2V0LmZpeHR1cmVJbmRleCxcclxuICAgICAgICBmaXh0dXJlSWQ6IHRhcmdldC5maXh0dXJlSWQsXHJcbiAgICAgICAgaXNzdWU6IHRhcmdldC5pc3N1ZSxcclxuICAgICAgICBpc3N1ZURhdGE6IHRhcmdldC5pc3N1ZURhdGEsXHJcbiAgICAgICAgdm1Db25maWc6IHRhcmdldC52bUNvbmZpZyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0Rml4dHVyZUZlZWRiYWNrKFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlLmZpeHR1cmVJZCxcclxuICAgICAgICBjb2xsYXBzZVRhc2tJbmZvLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0Rml4dHVyZUZlZWRiYWNrKGZpeHR1cmVJZDogc3RyaW5nLCBjb2xsYXBzZVRhc2tJbmZvOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRGaXh0dXJlRmVlZGJhY2sgPSB0aGlzLnN0b3JlRmVlZGJhY2suZml4dHVyZURhdGEuZmluZChcclxuICAgICAgKGZiOiBhbnkpID0+IGZiLmZpeHR1cmVJZCA9PT0gZml4dHVyZUlkLFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCByYXdGaXh0dXJlID0gc3RydWN0dXJlZENsb25lKFxyXG4gICAgICB0aGlzLmFsbEZpeHR1cmVJbnN0YW5jZXMuZmluZCgoZmk6IGFueSkgPT4gZmkuX2lkID09PSBmaXh0dXJlSWQpLFxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoY3VycmVudEZpeHR1cmVGZWVkYmFjaykge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZUZlZWRiYWNrID0ge1xyXG4gICAgICAgIGdsb2JhbENvbW1lbnRzOiB0aGlzLnN0b3JlRmVlZGJhY2suZml4dHVyZUNvbW1lbnQsXHJcbiAgICAgICAgZml4dHVyZUZlZWRiYWNrOiB7XHJcbiAgICAgICAgICAuLi5jdXJyZW50Rml4dHVyZUZlZWRiYWNrLFxyXG4gICAgICAgICAgRml4dHVyZURhdGE6IHJhd0ZpeHR1cmUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0YXNrSW5mb1RvZ2dsZTogY29sbGFwc2VUYXNrSW5mbyxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRmVlZGJhY2sgPSB7XHJcbiAgICAgICAgZ2xvYmFsQ29tbWVudHM6IFtdLFxyXG4gICAgICAgIGZpeHR1cmVGZWVkYmFjazoge1xyXG4gICAgICAgICAgZml4dHVyZUlkOiBmaXh0dXJlSWQsXHJcbiAgICAgICAgICBGaXh0dXJlRGF0YTogcmF3Rml4dHVyZSxcclxuICAgICAgICAgIGZpeHR1cmVBSURhdGE6IG51bGwsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0YXNrSW5mb1RvZ2dsZTogY29sbGFwc2VUYXNrSW5mbyxcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdFpvbmVGZWVkYmFjayhmaXh0dXJlSWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0Rml4dHVyZVRlbXBsYXRlcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgfTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuYXBpU2VydmljZS5nZXRBbGxUZW1wbGF0ZXMocGF5bG9hZCksXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSByZXM/LmRhdGE7XHJcblxyXG4gICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlcyA9IGRhdGEubWFwKCh0OiBhbnkpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIF9pZDogdC5faWQsXHJcbiAgICAgICAgICAgIG5hbWU6IHQuZml4dHVyZU5hbWUuaW5jbHVkZXMoXCItZnRcIilcclxuICAgICAgICAgICAgICA/IHQuZml4dHVyZU5hbWVcclxuICAgICAgICAgICAgICA6IGAke3QuZml4dHVyZU5hbWV9IC0gJHt0LmZpeHR1cmVXaWR0aC52YWx1ZX0gJHt0LmZpeHR1cmVXaWR0aC51bml0fWAsXHJcbiAgICAgICAgICAgIHN1YnRleHQ6IGAke3QucHJvZHVjdEJyYW5kTmFtZT8uam9pbihcIiwgXCIpfWAsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgZml4dHVyZSB0ZW1wbGF0ZXM6XCIsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNyZWF0ZUZvcm0oKSB7XHJcbiAgICB0aGlzLmxheW91dEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgd2FsbHM6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBmbG9vckZpeHR1cmVzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgZmxvb3JPdGhlckVsZW1lbnRzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdldEZvcm1XYWxscygpIHtcclxuICAgIHJldHVybiB0aGlzLmxheW91dEZvcm0uZ2V0KFwid2FsbHNcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdldEZvcm1GbG9vckZpeHR1cmVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vckZpeHR1cmVzXCIpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldCBnZXRGb3JtRmxvb3JPdGhlckVsZW1lbnRzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vck90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdldEVudHJhbmNlcygpIHtcclxuICAgIHJldHVybiB0aGlzLmZsb29yRGF0YT8ubGF5b3V0UG9seWdvbj8uZmlsdGVyKFxyXG4gICAgICAoZWxlOiBhbnkpID0+IGVsZS5lbGVtZW50VHlwZSA9PT0gXCJlbnRyYW5jZVwiLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldCBzaG93Rml4dHVyZVByZXZpZXcoKSB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJmaXh0dXJlXCIgJiZcclxuICAgICAgIXRoaXMuZGlzYWJsZWRQdWJsaXNoICYmXHJcbiAgICAgICF0aGlzLmVkaXRGaXh0dXJlXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0V2FsbE90aGVyRWxlbWVudHMod2FsbEluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiAodGhpcy5sYXlvdXRGb3JtLmdldChcIndhbGxzXCIpIGFzIEZvcm1BcnJheSlcclxuICAgICAgLmF0KHdhbGxJbmRleClcclxuICAgICAgLmdldChcIm90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybUZpeHR1cmVzKHdhbGxJbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJ3YWxsc1wiKSBhcyBGb3JtQXJyYXkpXHJcbiAgICAgIC5hdCh3YWxsSW5kZXgpXHJcbiAgICAgIC5nZXQoXCJmaXh0dXJlc1wiKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBwYXRjaFdhbGxFbGVtZW50cyh7IGVsZW1lbnRUeXBlLCBlbGVtZW50TnVtYmVyIH06IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgZWxlbWVudFR5cGU6IFtlbGVtZW50VHlwZSA/IGVsZW1lbnRUeXBlIDogXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgZWxlbWVudE51bWJlcjogW2VsZW1lbnROdW1iZXIgPyBlbGVtZW50TnVtYmVyIDogMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgZml4dHVyZXM6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBvdGhlckVsZW1lbnRzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGl0ZW07XHJcbiAgfVxyXG5cclxuICBwYXRjaEZpeHR1cmUoeyBmaXh0dXJlTmFtZSwgZml4dHVyZUNvbmZpZ0lkLCBfaWQgfTogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBmaXh0dXJlTmFtZTogW2ZpeHR1cmVOYW1lID8gZml4dHVyZU5hbWUgOiBcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICBmaXh0dXJlQ29uZmlnSWQ6IFtcclxuICAgICAgICBmaXh0dXJlQ29uZmlnSWQgPyBmaXh0dXJlQ29uZmlnSWQgOiBcIlwiLFxyXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgXSxcclxuICAgICAgX2lkOiBbX2lkID8gX2lkIDogXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGl0ZW07XHJcbiAgfVxyXG5cclxuICBhZGRXYWxsU3BhY2Uod2FsbEluZGV4OiBudW1iZXIsIG9wZXJhdGlvbjogXCJpbmNyZW1lbnRcIiB8IFwiZGVjcmVtZW50XCIpIHtcclxuICAgIGlmICh0aGlzLmxheW91dEZvcm0uZGlzYWJsZWQpIHJldHVybjtcclxuICAgIGNvbnN0IGNsaWNrZWRXYWxsTnVtYmVyID0gd2FsbEluZGV4ICsgMTtcclxuICAgIGNvbnN0IG1tVG9GZWV0ID0gMzA1O1xyXG4gICAgY29uc3QgZml4dHVyZUhlaWdodCA9IDE1MjQgLyBtbVRvRmVldDsgLy8gfjUgZnQgKGhvcml6b250YWwgaW5jcmVtZW50KVxyXG4gICAgY29uc3QgZml4dHVyZVdpZHRoID0gMTIyMCAvIG1tVG9GZWV0OyAvLyB+NCBmdCAodmVydGljYWwgaW5jcmVtZW50KVxyXG5cclxuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb247XHJcblxyXG4gICAgY29uc3QgZ2V0V2FsbCA9IChudW06IG51bWJlcikgPT5cclxuICAgICAgbGF5b3V0LmZpbmQoXHJcbiAgICAgICAgKGVsOiBhbnkpID0+IGVsLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiBlbC5lbGVtZW50TnVtYmVyID09PSBudW0sXHJcbiAgICAgICk7XHJcblxyXG4gICAgY29uc3QgYW1vdW50ID0gb3BlcmF0aW9uID09PSBcImluY3JlbWVudFwiID8gMSA6IC0xO1xyXG5cclxuICAgIGNvbnN0IHcxID0gZ2V0V2FsbCgxKTtcclxuICAgIGNvbnN0IHcyID0gZ2V0V2FsbCgyKTtcclxuICAgIGNvbnN0IHczID0gZ2V0V2FsbCgzKTtcclxuICAgIGNvbnN0IHc0ID0gZ2V0V2FsbCg0KTtcclxuICAgIGNvbnN0IHc1ID0gZ2V0V2FsbCg1KTtcclxuICAgIGNvbnN0IGVudHJhbmNlID0gbGF5b3V0LmZpbmQoKGVsOiBhbnkpID0+IGVsLmVsZW1lbnRUeXBlID09PSBcImVudHJhbmNlXCIpO1xyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEhvcml6b250YWwgZ3Jvd3RoICAoV2FsbC0xIC8gV2FsbC0zKVxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgaWYgKGNsaWNrZWRXYWxsTnVtYmVyID09PSAxIHx8IGNsaWNrZWRXYWxsTnVtYmVyID09PSAzKSB7XHJcbiAgICAgIGlmICh3MSkgdzEuZGlzdGFuY2UgKz0gYW1vdW50ICogZml4dHVyZVdpZHRoO1xyXG4gICAgICBpZiAodzMpIHczLmRpc3RhbmNlICs9IGFtb3VudCAqIGZpeHR1cmVXaWR0aDtcclxuXHJcbiAgICAgIGlmICh3Mikge1xyXG4gICAgICAgIHcyLmZpeHR1cmVzLmZvckVhY2goKGZ4OiBhbnkpID0+IHtcclxuICAgICAgICAgIGZ4LnJlbGF0aXZlUG9zaXRpb24ueCA9XHJcbiAgICAgICAgICAgIChmeC5yZWxhdGl2ZVBvc2l0aW9uLnggfHwgMCkgKyBhbW91bnQgKiBmaXh0dXJlV2lkdGg7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBWZXJ0aWNhbCBncm93dGggIChXYWxsLTIgLyBXYWxsLTQgLyBXYWxsLTUpXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBpZiAoXHJcbiAgICAgIGNsaWNrZWRXYWxsTnVtYmVyID09PSAyIHx8XHJcbiAgICAgIGNsaWNrZWRXYWxsTnVtYmVyID09PSA0IHx8XHJcbiAgICAgIGNsaWNrZWRXYWxsTnVtYmVyID09PSA1XHJcbiAgICApIHtcclxuICAgICAgaWYgKHcyKSB3Mi5kaXN0YW5jZSArPSBhbW91bnQgKiBmaXh0dXJlSGVpZ2h0O1xyXG5cclxuICAgICAgaWYgKHczKSB7XHJcbiAgICAgICAgdzMuZml4dHVyZXMuZm9yRWFjaCgoZng6IGFueSkgPT4ge1xyXG4gICAgICAgICAgZngucmVsYXRpdmVQb3NpdGlvbi55ID1cclxuICAgICAgICAgICAgKGZ4LnJlbGF0aXZlUG9zaXRpb24ueSB8fCAwKSArIGFtb3VudCAqIGZpeHR1cmVIZWlnaHQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGVudHJhbmNlWSA9IGVudHJhbmNlPy5kaXN0YW5jZSB8fCAwO1xyXG4gICAgICBjb25zdCBleGlzdGluZ1c0ID0gdzQ/LmRpc3RhbmNlIHx8IDA7XHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nVzUgPSB3NT8uZGlzdGFuY2UgfHwgMDtcclxuXHJcbiAgICAgIC8vIEdyb3cgd2FsbC00IGlmIHdlIGNsaWNrZWQgd2FsbC00IE9SIHdhbGwtMlxyXG4gICAgICBpZiAoKGNsaWNrZWRXYWxsTnVtYmVyID09PSA0IHx8IGNsaWNrZWRXYWxsTnVtYmVyID09PSAyKSAmJiB3NCkge1xyXG4gICAgICAgIHc0LmRpc3RhbmNlID0gdGhpcy5yb3VuZFRvVHdvKGV4aXN0aW5nVzQgKyBhbW91bnQgKiBmaXh0dXJlSGVpZ2h0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gR3JvdyB3YWxsLTUgaWYgd2UgY2xpY2tlZCB3YWxsLTUgT1Igd2FsbC0yXHJcbiAgICAgIGlmICgoY2xpY2tlZFdhbGxOdW1iZXIgPT09IDUgfHwgY2xpY2tlZFdhbGxOdW1iZXIgPT09IDIpICYmIHc1KSB7XHJcbiAgICAgICAgdzUuZGlzdGFuY2UgPSB0aGlzLnJvdW5kVG9Ud28oZXhpc3RpbmdXNSArIGFtb3VudCAqIGZpeHR1cmVIZWlnaHQpO1xyXG5cclxuICAgICAgICBpZiAodzQpIHtcclxuICAgICAgICAgIHc0LmZpeHR1cmVzLmZvckVhY2goKGZ4OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgZngucmVsYXRpdmVQb3NpdGlvbi55ID1cclxuICAgICAgICAgICAgICAoZngucmVsYXRpdmVQb3NpdGlvbi55IHx8IDApICsgYW1vdW50ICogZml4dHVyZUhlaWdodDtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUHJldmVudCBvdmVyZmxvdzogc2hyaW5rIGJhY2sgaWYgdG90YWwgPiB3MiBzaXplXHJcbiAgICAgIGNvbnN0IHRvdGFsVXNlZCA9IGVudHJhbmNlWSArICh3ND8uZGlzdGFuY2UgfHwgMCkgKyAodzU/LmRpc3RhbmNlIHx8IDApO1xyXG4gICAgICBpZiAodG90YWxVc2VkID4gdzIhLmRpc3RhbmNlKSB7XHJcbiAgICAgICAgaWYgKHc1KSB7XHJcbiAgICAgICAgICB3NS5kaXN0YW5jZSA9IHRoaXMucm91bmRUb1R3byhcclxuICAgICAgICAgICAgdzUuZGlzdGFuY2UgLSAodG90YWxVc2VkIC0gdzIhLmRpc3RhbmNlKSxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVGaXh0dXJlKFxyXG4gICAgZml4dHVyZVR5cGU6IFwid2FsbFwiIHwgXCJmbG9vclwiLFxyXG4gICAgZml4dHVyZUluZGV4OiBudW1iZXIsXHJcbiAgICB3YWxsSW5kZXg/OiBudW1iZXIsXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5sYXlvdXRGb3JtLmRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgaWYgKGZpeHR1cmVUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICB0aGlzLmdldEZvcm1GaXh0dXJlcyh3YWxsSW5kZXghKS5yZW1vdmVBdChmaXh0dXJlSW5kZXgpO1xyXG5cclxuICAgICAgY29uc3Qgd2FsbCA9IHRoaXMuZ2V0V2FsbEJ5TnVtYmVyKHdhbGxJbmRleCEgKyAxKTtcclxuICAgICAgaWYgKHdhbGwgJiYgQXJyYXkuaXNBcnJheSh3YWxsLmZpeHR1cmVzKSkge1xyXG4gICAgICAgIHdhbGwuZml4dHVyZXMuc3BsaWNlKGZpeHR1cmVJbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoZml4dHVyZVR5cGUgPT09IFwiZmxvb3JcIikge1xyXG4gICAgICB0aGlzLmdldEZvcm1GbG9vckZpeHR1cmVzLnJlbW92ZUF0KGZpeHR1cmVJbmRleCk7XHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlKSkge1xyXG4gICAgICAgIHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUuc3BsaWNlKGZpeHR1cmVJbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxheW91dEhhc1Vuc2F2ZWRDaGFuZ2VzID0gdHJ1ZTtcclxuICAgIHRoaXMucmVuZGVyRmxvb3IoZmFsc2UpO1xyXG4gICAgdGhpcy5wdWJsaXNoaW5nU3RhdGUgPSBcImxheW91dFwiO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGxheW91dCBoYXMgcGVuZGluZyBjaGFuZ2VzIHRoZSB1c2VyIG11c3Qgc2F2ZSBiZWZvcmVcclxuICAvLyB0aGV5IGNhbiBlZGl0IGFuIGluZGl2aWR1YWwgZml4dHVyZS4gU2V0IGJ5IGFsbCBsYXlvdXQgbXV0YXRpb24gaGFuZGxlcnNcclxuICAvLyAoYWRkIC8gZGVsZXRlIC8gbW92ZSAvIHRlbXBsYXRlIGNoYW5nZSksIGNsZWFyZWQgb24gc3VjY2Vzc2Z1bCBzYXZlLlxyXG4gIHByaXZhdGUgaGFzVW5zYXZlZExheW91dENoYW5nZXMoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5sYXlvdXRIYXNVbnNhdmVkQ2hhbmdlcykgcmV0dXJuIHRydWU7XHJcbiAgICBjb25zdCB3YWxsRml4dHVyZXMgPSAodGhpcy5mbG9vckRhdGE/LmxheW91dFBvbHlnb24gPz8gW10pLmZsYXRNYXAoXHJcbiAgICAgIChlbDogYW55KSA9PiBlbD8uZml4dHVyZXMgPz8gW10sXHJcbiAgICApO1xyXG4gICAgY29uc3QgZmxvb3JGaXh0dXJlcyA9IHRoaXMuZmxvb3JEYXRhPy5jZW50ZXJGaXh0dXJlID8/IFtdO1xyXG4gICAgcmV0dXJuIFsuLi53YWxsRml4dHVyZXMsIC4uLmZsb29yRml4dHVyZXNdLnNvbWUoXHJcbiAgICAgIChmOiBhbnkpID0+IGY/LnVuc2F2ZWRDaGFuZ2VzLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZU90aGVyRWxlbWVudChcclxuICAgIGVsZW1lbnRUeXBlOiBcIndhbGxcIiB8IFwiZmxvb3JcIixcclxuICAgIGVsZW1lbnRJbmRleDogbnVtYmVyLFxyXG4gICAgd2FsbEluZGV4PzogbnVtYmVyLFxyXG4gICkge1xyXG4gICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgdGhpcy5nZXRXYWxsT3RoZXJFbGVtZW50cyh3YWxsSW5kZXghKS5yZW1vdmVBdChlbGVtZW50SW5kZXgpO1xyXG5cclxuICAgICAgY29uc3Qgd2FsbCA9IHRoaXMuZ2V0V2FsbEJ5TnVtYmVyKHdhbGxJbmRleCEgKyAxKTtcclxuICAgICAgaWYgKHdhbGwgJiYgQXJyYXkuaXNBcnJheSh3YWxsLm90aGVyRWxlbWVudHMpKSB7XHJcbiAgICAgICAgd2FsbC5vdGhlckVsZW1lbnRzLnNwbGljZShlbGVtZW50SW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09PSBcImZsb29yXCIpIHtcclxuICAgICAgdGhpcy5nZXRGb3JtRmxvb3JPdGhlckVsZW1lbnRzLnJlbW92ZUF0KGVsZW1lbnRJbmRleCk7XHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmZsb29yRGF0YS5vdGhlckVsZW1lbnRzKSkge1xyXG4gICAgICAgIHRoaXMuZmxvb3JEYXRhLm90aGVyRWxlbWVudHMuc3BsaWNlKGVsZW1lbnRJbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxheW91dEhhc1Vuc2F2ZWRDaGFuZ2VzID0gdHJ1ZTtcclxuICAgIHRoaXMucmVuZGVyRmxvb3IoZmFsc2UpO1xyXG4gICAgdGhpcy5wdWJsaXNoaW5nU3RhdGUgPSBcImxheW91dFwiO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlRml4dHVyZVRlbXBsYXRlKFxyXG4gICAgY29uZmlnSWQ6IHN0cmluZyxcclxuICAgIGZpeHR1cmVUeXBlOiBcIndhbGxcIiB8IFwiZmxvb3JcIixcclxuICAgIGZpeHR1cmVJbmRleDogbnVtYmVyLFxyXG4gICAgd2FsbEluZGV4PzogbnVtYmVyLFxyXG4gICkge1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlXHJcbiAgICAgIC5nZXRGaXh0dXJlVGVtcGxhdGUoY29uZmlnSWQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoZml4dHVyZVR5cGUgPT09IFwid2FsbFwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlRGF0YSA9IHJlcy5kYXRhO1xyXG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlSWQgPSBgbmV3LSR7Y3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xyXG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlR3JvdXAgPSB0aGlzLnBhdGNoRml4dHVyZSh7XHJcbiAgICAgICAgICAgICAgZml4dHVyZU5hbWU6IHRlbXBsYXRlRGF0YS5maXh0dXJlTmFtZSxcclxuICAgICAgICAgICAgICBmaXh0dXJlQ29uZmlnSWQ6IHRlbXBsYXRlRGF0YS5faWQsXHJcbiAgICAgICAgICAgICAgX2lkOiBmaXh0dXJlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmdldEZvcm1GaXh0dXJlcyh3YWxsSW5kZXghKS5zZXRDb250cm9sKFxyXG4gICAgICAgICAgICAgIGZpeHR1cmVJbmRleCxcclxuICAgICAgICAgICAgICBmaXh0dXJlR3JvdXAsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmVEYXRhID0ge1xyXG4gICAgICAgICAgICAgIC4uLnRlbXBsYXRlRGF0YSxcclxuICAgICAgICAgICAgICBmaXh0dXJlQ29uZmlnSWQ6IHRlbXBsYXRlRGF0YS5faWQsXHJcbiAgICAgICAgICAgICAgX2lkOiBmaXh0dXJlSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHdhbGxSZWYgPSB0aGlzLmdldFdhbGxCeU51bWJlcih3YWxsSW5kZXghICsgMSkhO1xyXG4gICAgICAgICAgICB3YWxsUmVmLmZpeHR1cmVzW2ZpeHR1cmVJbmRleF0gPSB7XHJcbiAgICAgICAgICAgICAgLi4ud2FsbFJlZi5maXh0dXJlc1tmaXh0dXJlSW5kZXhdLFxyXG4gICAgICAgICAgICAgIC4uLmZpeHR1cmVEYXRhLFxyXG4gICAgICAgICAgICAgIHVuc2F2ZWRDaGFuZ2VzOiB0cnVlLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dEhhc1Vuc2F2ZWRDaGFuZ2VzID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZml4dHVyZVR5cGUgPT09IFwiZmxvb3JcIikge1xyXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZURhdGEgPSByZXMuZGF0YTtcclxuICAgICAgICAgICAgY29uc3QgZml4dHVyZUlkID0gYG5ldy0ke2NyeXB0by5yYW5kb21VVUlEKCl9YDtcclxuICAgICAgICAgICAgY29uc3QgZml4dHVyZUdyb3VwID0gdGhpcy5wYXRjaEZpeHR1cmUoe1xyXG4gICAgICAgICAgICAgIGZpeHR1cmVOYW1lOiB0ZW1wbGF0ZURhdGEuZml4dHVyZU5hbWUsXHJcbiAgICAgICAgICAgICAgZml4dHVyZUNvbmZpZ0lkOiB0ZW1wbGF0ZURhdGEuX2lkLFxyXG4gICAgICAgICAgICAgIF9pZDogZml4dHVyZUlkLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vckZpeHR1cmVzXCIpIGFzIEZvcm1BcnJheSkuc2V0Q29udHJvbChcclxuICAgICAgICAgICAgICBmaXh0dXJlSW5kZXgsXHJcbiAgICAgICAgICAgICAgZml4dHVyZUdyb3VwLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlRGF0YSA9IHtcclxuICAgICAgICAgICAgICAuLi50ZW1wbGF0ZURhdGEsXHJcbiAgICAgICAgICAgICAgZml4dHVyZUNvbmZpZ0lkOiB0ZW1wbGF0ZURhdGEuX2lkLFxyXG4gICAgICAgICAgICAgIF9pZDogZml4dHVyZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlW2ZpeHR1cmVJbmRleF0gPSB7XHJcbiAgICAgICAgICAgICAgLi4udGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZVtmaXh0dXJlSW5kZXhdLFxyXG4gICAgICAgICAgICAgIC4uLmZpeHR1cmVEYXRhLFxyXG4gICAgICAgICAgICAgIHVuc2F2ZWRDaGFuZ2VzOiB0cnVlLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dEhhc1Vuc2F2ZWRDaGFuZ2VzID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnJlbmRlckZsb29yKGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMucHVibGlzaGluZ1N0YXRlID0gXCJsYXlvdXRcIjtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiRmFpbGVkIHRvIGZldGNoIHRlbXBsYXRlc1wiKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uRHJvcChcclxuICAgIGV2ZW50OiBhbnksXHJcbiAgICBkZXN0aW5hdGlvbldhbGxJbmRleDogbnVtYmVyIHwgXCJmbG9vclwiLFxyXG4gICAgZGVzdGluYXRpb25GaXh0dXJlSW5kZXg/OiBudW1iZXIsXHJcbiAgKSB7XHJcbiAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YTtcclxuXHJcbiAgICBpZiAodGhpcy5sYXlvdXRGb3JtLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICBjb25zdCBpc1NvdXJjZUZsb29yID0gZGF0YS53YWxsSW5kZXggPT09IFwiZmxvb3JcIjtcclxuICAgIGNvbnN0IGlzRGVzdGluYXRpb25GbG9vciA9IGRlc3RpbmF0aW9uV2FsbEluZGV4ID09PSBcImZsb29yXCI7XHJcblxyXG4gICAgY29uc3Qgc291cmNlRm9ybUFycmF5OiBGb3JtQXJyYXkgPSBpc1NvdXJjZUZsb29yXHJcbiAgICAgID8gdGhpcy5nZXRGb3JtRmxvb3JGaXh0dXJlc1xyXG4gICAgICA6IHRoaXMuZ2V0Rm9ybUZpeHR1cmVzKGRhdGEud2FsbEluZGV4KTtcclxuXHJcbiAgICBjb25zdCBkZXN0aW5hdGlvbkZvcm1BcnJheTogRm9ybUFycmF5ID0gaXNEZXN0aW5hdGlvbkZsb29yXHJcbiAgICAgID8gdGhpcy5nZXRGb3JtRmxvb3JGaXh0dXJlc1xyXG4gICAgICA6IHRoaXMuZ2V0Rm9ybUZpeHR1cmVzKGRlc3RpbmF0aW9uV2FsbEluZGV4IGFzIG51bWJlcik7XHJcblxyXG4gICAgY29uc3Qgc291cmNlV2FsbE1ldGEgPSBpc1NvdXJjZUZsb29yXHJcbiAgICAgID8gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZVxyXG4gICAgICA6ICh0aGlzLmdldFdhbGxCeU51bWJlcihcclxuICAgICAgICAgIHRoaXMuZ2V0Rm9ybVdhbGxzLmF0KGRhdGEud2FsbEluZGV4KS5nZXQoXCJlbGVtZW50TnVtYmVyXCIpPy52YWx1ZSxcclxuICAgICAgICApPy5maXh0dXJlcyA/PyBbXSk7XHJcblxyXG4gICAgY29uc3QgZGVzdGluYXRpb25XYWxsTWV0YSA9IGlzRGVzdGluYXRpb25GbG9vclxyXG4gICAgICA/IHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmVcclxuICAgICAgOiAodGhpcy5nZXRXYWxsQnlOdW1iZXIoXHJcbiAgICAgICAgICB0aGlzLmdldEZvcm1XYWxsc1xyXG4gICAgICAgICAgICAuYXQoZGVzdGluYXRpb25XYWxsSW5kZXggYXMgbnVtYmVyKVxyXG4gICAgICAgICAgICAuZ2V0KFwiZWxlbWVudE51bWJlclwiKT8udmFsdWUsXHJcbiAgICAgICAgKT8uZml4dHVyZXMgPz8gW10pO1xyXG5cclxuICAgIGNvbnN0IHNGaXh0dXJlSW5kZXggPSBzb3VyY2VXYWxsTWV0YS5maW5kSW5kZXgoXHJcbiAgICAgIChmaXh0dXJlOiBhbnkpID0+XHJcbiAgICAgICAgZml4dHVyZS5faWQgPT09XHJcbiAgICAgICAgc291cmNlRm9ybUFycmF5LmF0KGRhdGEuZml4dHVyZUluZGV4KT8uZ2V0KFwiX2lkXCIpPy52YWx1ZSxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgZEZpeHR1cmVJbmRleCA9XHJcbiAgICAgIGRlc3RpbmF0aW9uRml4dHVyZUluZGV4ICE9PSB1bmRlZmluZWRcclxuICAgICAgICA/IGRlc3RpbmF0aW9uV2FsbE1ldGEuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAoZml4dHVyZTogYW55KSA9PlxyXG4gICAgICAgICAgICAgIGZpeHR1cmUuX2lkID09PVxyXG4gICAgICAgICAgICAgIGRlc3RpbmF0aW9uRm9ybUFycmF5LmF0KGRlc3RpbmF0aW9uRml4dHVyZUluZGV4KT8uZ2V0KFwiX2lkXCIpXHJcbiAgICAgICAgICAgICAgICA/LnZhbHVlLFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIDogZGVzdGluYXRpb25Gb3JtQXJyYXkubGVuZ3RoO1xyXG5cclxuICAgIGNvbnN0IHNQb3NpdGlvbiA9IHtcclxuICAgICAgZml4dHVyZU51bWJlcjogc291cmNlV2FsbE1ldGFbc0ZpeHR1cmVJbmRleF0uZml4dHVyZU51bWJlcixcclxuICAgICAgYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyOlxyXG4gICAgICAgIHNvdXJjZVdhbGxNZXRhW3NGaXh0dXJlSW5kZXhdLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcixcclxuICAgIH07XHJcbiAgICBjb25zdCBkUG9zaXRpb24gPSB7XHJcbiAgICAgIGZpeHR1cmVOdW1iZXI6IGRlc3RpbmF0aW9uV2FsbE1ldGFbZEZpeHR1cmVJbmRleF0uZml4dHVyZU51bWJlcixcclxuICAgICAgYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyOlxyXG4gICAgICAgIGRlc3RpbmF0aW9uV2FsbE1ldGFbZEZpeHR1cmVJbmRleF0uYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoc291cmNlV2FsbE1ldGEgPT09IGRlc3RpbmF0aW9uV2FsbE1ldGEpIHtcclxuICAgICAgZGVzdGluYXRpb25XYWxsTWV0YVtkRml4dHVyZUluZGV4XS5maXh0dXJlTnVtYmVyID1cclxuICAgICAgICBzUG9zaXRpb24uZml4dHVyZU51bWJlcjtcclxuICAgICAgZGVzdGluYXRpb25XYWxsTWV0YVtkRml4dHVyZUluZGV4XS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIgPVxyXG4gICAgICAgIHNQb3NpdGlvbi5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXI7XHJcbiAgICAgIHNvdXJjZVdhbGxNZXRhW3NGaXh0dXJlSW5kZXhdLmZpeHR1cmVOdW1iZXIgPSBkUG9zaXRpb24uZml4dHVyZU51bWJlcjtcclxuICAgICAgc291cmNlV2FsbE1ldGFbc0ZpeHR1cmVJbmRleF0uYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyID1cclxuICAgICAgICBkUG9zaXRpb24uYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc291cmNlV2FsbE1ldGFbc0ZpeHR1cmVJbmRleF0uZml4dHVyZU51bWJlciA9IGRQb3NpdGlvbi5maXh0dXJlTnVtYmVyO1xyXG4gICAgICBzb3VyY2VXYWxsTWV0YVtzRml4dHVyZUluZGV4XS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIgPVxyXG4gICAgICAgIGRQb3NpdGlvbi5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50cmFuc2ZlckFycmF5SXRlbShcclxuICAgICAgc291cmNlRm9ybUFycmF5LmNvbnRyb2xzLFxyXG4gICAgICBkZXN0aW5hdGlvbkZvcm1BcnJheS5jb250cm9scyxcclxuICAgICAgZGF0YS5maXh0dXJlSW5kZXgsXHJcbiAgICAgIGRGaXh0dXJlSW5kZXgsXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMudHJhbnNmZXJBcnJheUl0ZW0oXHJcbiAgICAgIHNvdXJjZVdhbGxNZXRhLFxyXG4gICAgICBkZXN0aW5hdGlvbldhbGxNZXRhLFxyXG4gICAgICBzRml4dHVyZUluZGV4LFxyXG4gICAgICBkRml4dHVyZUluZGV4LFxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlckZsb29yKGZhbHNlKTtcclxuICAgIHRoaXMucHVibGlzaGluZ1N0YXRlID0gXCJsYXlvdXRcIjtcclxuICB9XHJcblxyXG4gIGRvd25sb2FkQ2FudmFzKCkge1xyXG4gICAgaWYgKCF0aGlzLmNhbnZhcykgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IG9yaWdpbmFsVmlld3BvcnQgPSBbXHJcbiAgICAgIC4uLnRoaXMuY2FudmFzLnZpZXdwb3J0VHJhbnNmb3JtISxcclxuICAgIF0gYXMgZmFicmljLlRNYXQyRDtcclxuXHJcbiAgICB0aGlzLmNhbnZhcy5zZXRWaWV3cG9ydFRyYW5zZm9ybShbMSwgMCwgMCwgMSwgMCwgMF0pO1xyXG5cclxuICAgIGNvbnN0IGJvdW5kcyA9IHRoaXMuZ2V0RnVsbExheW91dEJvdW5kcygpO1xyXG5cclxuICAgIGNvbnN0IGRhdGFVUkwgPSB0aGlzLmNhbnZhcy50b0RhdGFVUkwoe1xyXG4gICAgICBmb3JtYXQ6IFwicG5nXCIsXHJcbiAgICAgIGxlZnQ6IGJvdW5kcy5sZWZ0LFxyXG4gICAgICB0b3A6IGJvdW5kcy50b3AsXHJcbiAgICAgIHdpZHRoOiBib3VuZHMud2lkdGgsXHJcbiAgICAgIGhlaWdodDogYm91bmRzLmhlaWdodCxcclxuICAgICAgbXVsdGlwbGllcjogMixcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FudmFzLnNldFZpZXdwb3J0VHJhbnNmb3JtKG9yaWdpbmFsVmlld3BvcnQpO1xyXG5cclxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgIGxpbmsuaHJlZiA9IGRhdGFVUkw7XHJcbiAgICBsaW5rLmRvd25sb2FkID0gYCR7dGhpcy5wbGFub0RhdGEuc3RvcmVOYW1lfV8ke3RoaXMuZmxvb3JEYXRhLmZsb29yTmFtZX0ucG5nYDtcclxuICAgIGxpbmsuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIC8vIGRvd25sb2FkQ2FudmFzKCkge1xyXG4gIC8vICAgaWYgKCF0aGlzLmNhbnZhcykgcmV0dXJuO1xyXG5cclxuICAvLyAgIGNvbnN0IG9yaWdpbmFsVmlld3BvcnQgPSBbXHJcbiAgLy8gICAgIC4uLnRoaXMuY2FudmFzLnZpZXdwb3J0VHJhbnNmb3JtISxcclxuICAvLyAgIF0gYXMgZmFicmljLlRNYXQyRDtcclxuICAvLyAgIHRoaXMuY2FudmFzLnNldFZpZXdwb3J0VHJhbnNmb3JtKFsxLCAwLCAwLCAxLCAwLCAwXSk7XHJcblxyXG4gIC8vICAgY29uc3QgYm91bmRzID0gdGhpcy5nZXRGdWxsTGF5b3V0Qm91bmRzKCk7XHJcblxyXG4gIC8vICAgY29uc3QgYmcgPSB0aGlzLmNyZWF0ZUV4cG9ydExheW91dEJhY2tncm91bmQoKTtcclxuICAvLyAgIHRoaXMuY2FudmFzLmluc2VydEF0KDAsIGJnKTtcclxuICAvLyAgIHRoaXMuY2FudmFzLnJlbmRlckFsbCgpO1xyXG5cclxuICAvLyAgIGNvbnN0IGRhdGFVUkwgPSB0aGlzLmNhbnZhcy50b0RhdGFVUkwoe1xyXG4gIC8vICAgICBmb3JtYXQ6IFwicG5nXCIsXHJcbiAgLy8gICAgIGxlZnQ6IGJvdW5kcy5sZWZ0LFxyXG4gIC8vICAgICB0b3A6IGJvdW5kcy50b3AsXHJcbiAgLy8gICAgIHdpZHRoOiBib3VuZHMud2lkdGgsXHJcbiAgLy8gICAgIGhlaWdodDogYm91bmRzLmhlaWdodCxcclxuICAvLyAgICAgbXVsdGlwbGllcjogMixcclxuICAvLyAgIH0pO1xyXG5cclxuICAvLyAgIHRoaXMuY2FudmFzLnJlbW92ZShiZyk7XHJcbiAgLy8gICB0aGlzLmNhbnZhcy5zZXRWaWV3cG9ydFRyYW5zZm9ybShvcmlnaW5hbFZpZXdwb3J0KTtcclxuICAvLyAgIHRoaXMuY2FudmFzLnJlbmRlckFsbCgpO1xyXG5cclxuICAvLyAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAvLyAgIGxpbmsuaHJlZiA9IGRhdGFVUkw7XHJcbiAgLy8gICBsaW5rLmRvd25sb2FkID0gYCR7dGhpcy5wbGFub0RhdGEuc3RvcmVOYW1lfV8ke3RoaXMuZmxvb3JEYXRhLmZsb29yTmFtZX0ucG5nYDtcclxuICAvLyAgIGxpbmsuY2xpY2soKTtcclxuICAvLyB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRXhwb3J0TGF5b3V0QmFja2dyb3VuZCgpIHtcclxuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMuYnVpbGRMYXlvdXRQb2x5Z29uRnJvbVdhbGxzKCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBmYWJyaWMuUG9seWdvbihwb2ludHMsIHtcclxuICAgICAgZmlsbDogXCIjZWFlY2YwXCIsXHJcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgb2JqZWN0Q2FjaGluZzogZmFsc2UsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRMYXlvdXRQb2x5Z29uRnJvbVdhbGxzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb25cclxuICAgICAgLmZpbHRlcigodzogYW55KSA9PiB3LmVsZW1lbnRUeXBlID09PSBcIndhbGxcIilcclxuICAgICAgLm1hcCgodzogYW55KSA9PiAoe1xyXG4gICAgICAgIHg6IHRoaXMudG9QaXhlbHMody5yZWxhdGl2ZVBvc2l0aW9uLngsIFwiZnRcIiksXHJcbiAgICAgICAgeTogdGhpcy50b1BpeGVscyh3LnJlbGF0aXZlUG9zaXRpb24ueSwgXCJmdFwiKSxcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGFuZGxlRmVlZGJhY2tBY3Rpb24odXNlckFjdGlvbjogYW55KSB7XHJcbiAgICBpZiAodXNlckFjdGlvbj8udGFza1R5cGUgPT09IFwiem9uZVZlcmlmaWNhdGlvblwiKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZVpvbmVGZWVkYmFja0FjdGlvbih1c2VyQWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVkaXRGcm9tVGFiID0gXCJmaXh0dXJlXCI7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IHRhcmdldEZpeHR1cmU6IGFueSA9IHtcclxuICAgICAgICAuLi4odGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvblxyXG4gICAgICAgICAgLmZsYXRNYXAoKHA6IGFueSkgPT4gcC5maXh0dXJlcylcclxuICAgICAgICAgIC5jb25jYXQodGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZSlcclxuICAgICAgICAgIC5maW5kKChmOiBhbnkpID0+IGYuX2lkID09PSB0aGlzLnNlbGVjdGVkRml4dHVyZS5maXh0dXJlSWQpIHx8IG51bGwpLFxyXG4gICAgICAgIHVzZXJBY3Rpb246IHVzZXJBY3Rpb24uYWN0aW9uLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhID0geyAuLi50YXJnZXRGaXh0dXJlIH07XHJcblxyXG4gICAgICAvLyBlZGl0V2l0aEFpIC8gZWRpdFdpdGhQbGFubyDigJQgb3BlbiB0aGUgZWRpdCBwYW5lbCwgbm8gQVBJIGNhbGxzXHJcbiAgICAgIGlmIChcclxuICAgICAgICB1c2VyQWN0aW9uLmFjdGlvbiA9PT0gXCJlZGl0V2l0aEFpXCIgfHxcclxuICAgICAgICB1c2VyQWN0aW9uLmFjdGlvbiA9PT0gXCJlZGl0V2l0aFBsYW5vXCJcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKHVzZXJBY3Rpb24uYWN0aW9uID09PSBcImVkaXRXaXRoQWlcIikge1xyXG4gICAgICAgICAgdGFyZ2V0Rml4dHVyZSA9IHRoaXMubWVyZ2VBaUZpeHR1cmVEYXRhKHRhcmdldEZpeHR1cmUsIHVzZXJBY3Rpb24uZml4dHVyZURhdGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhID0ge1xyXG4gICAgICAgICAgLi4udGFyZ2V0Rml4dHVyZSxcclxuICAgICAgICAgIHRhc2tUeXBlOiBcImZpeHR1cmVcIixcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZS5maXh0dXJlRGF0YSA9IHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YTtcclxuXHJcbiAgICAgICAgdGhpcy5lZGl0Rml4dHVyZSA9IHRydWU7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmVkaXRGaXh0dXJlU2VjdGlvbiA9IHVzZXJBY3Rpb24/LnRhYiA/PyBcImJhc2ljLWRldGFpbHNcIjtcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0sIDEwMCk7XHJcblxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgYW5zd2VySWQgPSB1c2VyQWN0aW9uLmZlZWRiYWNrPy5hbnN3ZXJzPy5bMF0/Ll9pZDtcclxuICAgICAgaWYgKCFhbnN3ZXJJZCkgcmV0dXJuO1xyXG5cclxuICAgICAgLy8gYWNjZXB0QWkgLyBrZWVwUGxhbm8g4oCUIG1lcmdlIGZpeHR1cmUgZGF0YSBhbmQgc2F2ZVxyXG4gICAgICBpZiAodXNlckFjdGlvbi5hY3Rpb24gPT09IFwiYWNjZXB0QWlcIikge1xyXG4gICAgICAgIHRhcmdldEZpeHR1cmUgPSB0aGlzLm1lcmdlQWlGaXh0dXJlRGF0YSh0YXJnZXRGaXh0dXJlLCB1c2VyQWN0aW9uLmZpeHR1cmVEYXRhKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHVzZXJBY3Rpb24uYWN0aW9uID09PSBcImtlZXBQbGFub1wiKSB7XHJcbiAgICAgICAgY29uc3QgY3VycmVudExhYmVsID0gdGFyZ2V0Rml4dHVyZS5oZWFkZXI/LmxhYmVsO1xyXG4gICAgICAgIHRhcmdldEZpeHR1cmUgPSB7XHJcbiAgICAgICAgICAuLi50YXJnZXRGaXh0dXJlLFxyXG4gICAgICAgICAgLi4udXNlckFjdGlvbi5maXh0dXJlRGF0YSxcclxuICAgICAgICAgIGhlYWRlcjoge1xyXG4gICAgICAgICAgICAuLi50YXJnZXRGaXh0dXJlLmhlYWRlcixcclxuICAgICAgICAgICAgLi4udXNlckFjdGlvbi5maXh0dXJlRGF0YT8uaGVhZGVyLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICghdGFyZ2V0Rml4dHVyZS5oZWFkZXI/LmxhYmVsPy50cmltKCkpIHtcclxuICAgICAgICAgIHRhcmdldEZpeHR1cmUuaGVhZGVyLmxhYmVsID0gY3VycmVudExhYmVsO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gU3RlcCAxOiBVcGRhdGUgZml4dHVyZSBkYXRhIChza2lwIGZvciByZWRvIOKAlCBvbmx5IHN0YXR1cyB1cGRhdGUgbmVlZGVkKVxyXG4gICAgICBpZiAodXNlckFjdGlvbi5hY3Rpb24gIT09IFwicmVkb1wiKSB7XHJcbiAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlU3RvcmVGaXh0dXJlKHtcclxuICAgICAgICAgICAgZml4dHVyZUlkOiB0aGlzLnNlbGVjdGVkRml4dHVyZS5maXh0dXJlSWQsXHJcbiAgICAgICAgICAgIGRhdGE6IHRhcmdldEZpeHR1cmUsXHJcbiAgICAgICAgICAgIHRhc2tUeXBlOiBcImZpeHR1cmVcIixcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFN0ZXAgMjogVXBkYXRlIGNvbXBsaWFuY2Ugc3RhdHVzXHJcbiAgICAgIGNvbnN0IGZlZWRiYWNrID0gdXNlckFjdGlvbi5mZWVkYmFjaztcclxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgICBfaWQ6IGZlZWRiYWNrLl9pZCxcclxuICAgICAgICBhbnN3ZXJJZDogYW5zd2VySWQsXHJcbiAgICAgICAgdHlwZTogdXNlckFjdGlvbi50eXBlLFxyXG4gICAgICAgIHVzZXJBY3Rpb246IHVzZXJBY3Rpb24uYWN0aW9uLFxyXG4gICAgICAgIGNvbW1lbnRzOiB1c2VyQWN0aW9uLnJlbWFya3MsXHJcbiAgICAgICAgdGFza1R5cGU6IHVzZXJBY3Rpb24udGFza1R5cGUsXHJcbiAgICAgICAgcGxhbm9JZDogdXNlckFjdGlvbi5wbGFub0lkLFxyXG4gICAgICAgIGZsb29ySWQ6IHVzZXJBY3Rpb24uZmxvb3JJZCxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5hcGlTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVDb21wbGlhbmNlU3RhdHVzKHBheWxvYWQpLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCFyZXMgJiYgdXNlckFjdGlvbi50eXBlICE9IFwiYWdyZWVcIikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gU3RlcCAzOiBSZWZyZXNoXHJcbiAgICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmdldFN0b3JlRml4dHVyZXModGhpcy5wbGFub0RhdGEuX2lkKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gZXhlY3V0ZSB1c2VyIGFjdGlvblwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWVyZ2VBaUZpeHR1cmVEYXRhKHRhcmdldEZpeHR1cmU6IGFueSwgZml4dHVyZURhdGE6IGFueSk6IGFueSB7XHJcbiAgICBjb25zdCBjdXJyZW50TGFiZWwgPSB0YXJnZXRGaXh0dXJlLmhlYWRlcj8ubGFiZWw7XHJcblxyXG4gICAgY29uc3QgbWVyZ2VkID0ge1xyXG4gICAgICAuLi50YXJnZXRGaXh0dXJlLFxyXG4gICAgICAuLi5maXh0dXJlRGF0YSxcclxuICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgLi4udGFyZ2V0Rml4dHVyZS5oZWFkZXIsXHJcbiAgICAgICAgLi4uZml4dHVyZURhdGE/LmhlYWRlcixcclxuICAgICAgfSxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgYWlMYWJlbCA9IGZpeHR1cmVEYXRhPy5oZWFkZXI/LmxhYmVsPy50cmltKCk7XHJcbiAgICBpZiAoIWFpTGFiZWwgfHwgYWlMYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiaGVhZGVyIG5vdCBpZGVudGlmaWVkXCIpKSB7XHJcbiAgICAgIG1lcmdlZC5oZWFkZXIubGFiZWwgPSBjdXJyZW50TGFiZWw7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1lcmdlZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVwbGFjZUZpeHR1cmVJbkZsb29yRGF0YShmaXh0dXJlSWQ6IHN0cmluZywgbWVyZ2VkRml4dHVyZTogYW55KSB7XHJcbiAgICBpZiAoIXRoaXMuZmxvb3JEYXRhKSByZXR1cm47XHJcbiAgICBjb25zdCByZXBsYWNlSW5BcnJheSA9IChhcnI6IGFueVtdIHwgdW5kZWZpbmVkKSA9PiB7XHJcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGNvbnN0IGlkeCA9IGFyci5maW5kSW5kZXgoKGY6IGFueSkgPT4gZj8uX2lkID09PSBmaXh0dXJlSWQpO1xyXG4gICAgICBpZiAoaWR4ID49IDApIHtcclxuICAgICAgICBhcnJbaWR4XSA9IHsgLi4uYXJyW2lkeF0sIC4uLm1lcmdlZEZpeHR1cmUsIF9pZDogYXJyW2lkeF0uX2lkIH07XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uKSkge1xyXG4gICAgICBmb3IgKGNvbnN0IGxwIG9mIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24pIHtcclxuICAgICAgICBpZiAocmVwbGFjZUluQXJyYXkobHA/LmZpeHR1cmVzKSkgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXBsYWNlSW5BcnJheSh0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRMb2NhbEFjdGlvbkNvbW1lbnQoXHJcbiAgICByZXNwb25zZXR5cGU6IHN0cmluZyxcclxuICAgIGNvbW1lbnQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXHJcbiAgKTogYW55IHtcclxuICAgIGxldCB1c2VyRGF0YTogYW55ID0ge307XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInVzZXItaW5mb1wiKTtcclxuICAgICAgaWYgKHJhdykgdXNlckRhdGEgPSBKU09OLnBhcnNlKHJhdyk7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgdXNlckRhdGEgPSB7fTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVzZXJJZDogdXNlckRhdGE/Ll9pZCxcclxuICAgICAgdXNlck5hbWU6IHVzZXJEYXRhPy51c2VyTmFtZSxcclxuICAgICAgcm9sZTogdXNlckRhdGE/LnJvbGUsXHJcbiAgICAgIHJlc3BvbnNldHlwZSxcclxuICAgICAgY29tbWVudDogY29tbWVudCA/PyBudWxsLFxyXG4gICAgICB0aW1lU3RhbXA6IG5ldyBEYXRlKCksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gWm9uZS12ZXJpZmljYXRpb24gbWVyZ2U6IG92ZXJsYXkgb25seSBoZWFkZXIubGFiZWwgYW5kIHBlci16b25lIHByb2R1Y3RCcmFuZE5hbWVcclxuICAvLyBmcm9tIHRoZSByZXNwb25zZSBvbnRvIHRoZSBleGlzdGluZyB0ZW1wbGF0ZS5cclxuICBwcml2YXRlIG1lcmdlWm9uZUZpeHR1cmVEYXRhKHRhcmdldEZpeHR1cmU6IGFueSwgcmVzcG9uc2VGaXh0dXJlOiBhbnkpOiBhbnkge1xyXG4gICAgY29uc3QgbWVyZ2VkID0gc3RydWN0dXJlZENsb25lKHRhcmdldEZpeHR1cmUpO1xyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlTGFiZWwgPSByZXNwb25zZUZpeHR1cmU/LmhlYWRlcj8ubGFiZWw/LnRyaW0oKTtcclxuICAgIGlmIChyZXNwb25zZUxhYmVsKSB7XHJcbiAgICAgIG1lcmdlZC5oZWFkZXIgPSB7IC4uLihtZXJnZWQuaGVhZGVyID8/IHt9KSwgbGFiZWw6IHJlc3BvbnNlTGFiZWwgfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB6b25lVG9CcmFuZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcclxuICAgIChyZXNwb25zZUZpeHR1cmU/LnNoZWxmQ29uZmlnID8/IFtdKS5mb3JFYWNoKChzaGVsZjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHpvbmUgPSBzaGVsZj8uem9uZTtcclxuICAgICAgY29uc3QgYnJhbmQgPSBzaGVsZj8ucHJvZHVjdEJyYW5kTmFtZTtcclxuICAgICAgaWYgKCF6b25lIHx8ICFBcnJheS5pc0FycmF5KGJyYW5kKSB8fCBicmFuZC5sZW5ndGggPT09IDApIHJldHVybjtcclxuICAgICAgaWYgKCF6b25lVG9CcmFuZC5oYXMoem9uZSkpIHtcclxuICAgICAgICB6b25lVG9CcmFuZC5zZXQoem9uZSwgYnJhbmQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAobWVyZ2VkLnNoZWxmQ29uZmlnID8/IFtdKS5mb3JFYWNoKChzaGVsZjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGJyYW5kID0gc2hlbGY/LnpvbmUgPyB6b25lVG9CcmFuZC5nZXQoc2hlbGYuem9uZSkgOiBudWxsO1xyXG4gICAgICBpZiAoYnJhbmQpIHtcclxuICAgICAgICBzaGVsZi5wcm9kdWN0QnJhbmROYW1lID0gWy4uLmJyYW5kXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG1lcmdlZDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGhhbmRsZVpvbmVGZWVkYmFja0FjdGlvbih1c2VyQWN0aW9uOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZpeHR1cmVJZCA9IHRoaXMuc2VsZWN0ZWRGaXh0dXJlPy5maXh0dXJlSWQ7XHJcbiAgICAgIGlmICghZml4dHVyZUlkKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBmaXh0dXJlSW5kZXggPSB0aGlzLmFsbEZpeHR1cmVJbnN0YW5jZXMuZmluZEluZGV4KFxyXG4gICAgICAgIChmOiBhbnkpID0+IGYuX2lkID09PSBmaXh0dXJlSWQsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChmaXh0dXJlSW5kZXggPCAwKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBiYXNlRml4dHVyZSA9IHN0cnVjdHVyZWRDbG9uZShcclxuICAgICAgICB0aGlzLmFsbEZpeHR1cmVJbnN0YW5jZXNbZml4dHVyZUluZGV4XSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIGVkaXRXaXRoUmVzcG9uc2U6IG9wZW4gdGhlIGVkaXQgcGFuZWwgcHJlLXBvcHVsYXRlZCB3aXRoIG1lcmdlZCBkYXRhXHJcbiAgICAgIGlmICh1c2VyQWN0aW9uLmFjdGlvbiA9PT0gXCJlZGl0V2l0aFJlc3BvbnNlXCIpIHtcclxuICAgICAgICB0aGlzLmVkaXRGcm9tVGFiID0gXCJ6b25lXCI7XHJcbiAgICAgICAgY29uc3QgbWVyZ2VkID0gdGhpcy5tZXJnZVpvbmVGaXh0dXJlRGF0YShcclxuICAgICAgICAgIGJhc2VGaXh0dXJlLFxyXG4gICAgICAgICAgdXNlckFjdGlvbi5maXh0dXJlRGF0YSxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YSA9IHtcclxuICAgICAgICAgIC4uLm1lcmdlZCxcclxuICAgICAgICAgIHVzZXJBY3Rpb246IHVzZXJBY3Rpb24uYWN0aW9uLFxyXG4gICAgICAgICAgdGFza1R5cGU6IFwiem9uZVZlcmlmaWNhdGlvblwiLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmUuZml4dHVyZURhdGEgPSB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGE7XHJcbiAgICAgICAgdGhpcy5lZGl0Rml4dHVyZSA9IHRydWU7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmVkaXRGaXh0dXJlU2VjdGlvbiA9IFwiYmFzaWMtZGV0YWlsc1wiO1xyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGFuc3dlcklkID0gdXNlckFjdGlvbi5mZWVkYmFjaz8uYW5zd2Vycz8uWzBdPy5faWQ7XHJcbiAgICAgIGNvbnN0IHRhc2tJZCA9IHRoaXMuem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uVGFzaz8uX2lkO1xyXG4gICAgICBpZiAoIWFuc3dlcklkIHx8ICF0YXNrSWQpIHJldHVybjtcclxuXHJcbiAgICAgIC8vIHJlZG86IGRvbid0IHRvdWNoIHRoZSBwbGFub0ZpeHR1cmUg4oCUIG9ubHkgcmVjb3JkIHRoZSByZWplY3Rpb24gb24gdGhlIGNvbXBsaWFuY2UgZG9jXHJcbiAgICAgIC8vIHNvIHRoZSByZWRvIHJvdW5kIGNhbiByZS1jb2xsZWN0IHRoaXMgZml4dHVyZSdzIHJlc3BvbnNlIGZyb20gbW9iaWxlLlxyXG4gICAgICBpZiAodXNlckFjdGlvbi5hY3Rpb24gPT09IFwicmVkb1wiKSB7XHJcbiAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlWm9uZVZlcmlmaWNhdGlvblN0YXR1cyh7XHJcbiAgICAgICAgICAgIF9pZDogdXNlckFjdGlvbi5mZWVkYmFjay5faWQsXHJcbiAgICAgICAgICAgIGFuc3dlcklkLFxyXG4gICAgICAgICAgICB0YXNrSWQsXHJcbiAgICAgICAgICAgIHR5cGU6IHVzZXJBY3Rpb24udHlwZSxcclxuICAgICAgICAgICAgdXNlckFjdGlvbjogdXNlckFjdGlvbi5hY3Rpb24sXHJcbiAgICAgICAgICAgIGNvbW1lbnRzOiB1c2VyQWN0aW9uLnJlbWFya3MsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCB6b25lUm93c1JlZG8gPSB0aGlzLnpvbmVGZWVkYmFjaz8uem9uZVZlcmlmaWNhdGlvbkRhdGEgPz8gW107XHJcbiAgICAgICAgY29uc3Qgem9uZVJvd1JlZG8gPSB6b25lUm93c1JlZG8uZmluZChcclxuICAgICAgICAgIChyOiBhbnkpID0+IHI/LmZpeHR1cmVJZD8udG9TdHJpbmc/LigpID09PSBmaXh0dXJlSWQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoem9uZVJvd1JlZG8/LmFuc3dlcnM/LlswXSkge1xyXG4gICAgICAgICAgem9uZVJvd1JlZG8uYW5zd2Vyc1swXS51c2VyQWN0aW9uID0gdXNlckFjdGlvbi5hY3Rpb247XHJcbiAgICAgICAgICB6b25lUm93UmVkby5hbnN3ZXJzWzBdLnN0YXR1cyA9IHVzZXJBY3Rpb24udHlwZTtcclxuICAgICAgICAgIGNvbnN0IGFucyA9IHpvbmVSb3dSZWRvLmFuc3dlcnNbMF07XHJcbiAgICAgICAgICBhbnMuY29tbWVudHMgPSBhbnMuY29tbWVudHMgPz8gW107XHJcbiAgICAgICAgICBhbnMuY29tbWVudHMucHVzaChcclxuICAgICAgICAgICAgdGhpcy5idWlsZExvY2FsQWN0aW9uQ29tbWVudCh1c2VyQWN0aW9uLnR5cGUsIHVzZXJBY3Rpb24ucmVtYXJrcyksXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVjdEZpeHR1cmVGZWVkYmFjayhmaXh0dXJlSWQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8ga2VlcFBsYW5vIC8gYWNjZXB0UmVzcG9uc2UgLyBlZGl0QWNjZXB0ZWQ6IGJ1aWxkIG1lcmdlZCBmaXh0dXJlIGFuZCBwZXJzaXN0XHJcbiAgICAgIGxldCBtZXJnZWRGaXh0dXJlID0gYmFzZUZpeHR1cmU7XHJcbiAgICAgIGlmIChcclxuICAgICAgICB1c2VyQWN0aW9uLmFjdGlvbiA9PT0gXCJhY2NlcHRSZXNwb25zZVwiIHx8XHJcbiAgICAgICAgdXNlckFjdGlvbi5hY3Rpb24gPT09IFwiZWRpdEFjY2VwdGVkXCJcclxuICAgICAgKSB7XHJcbiAgICAgICAgbWVyZ2VkRml4dHVyZSA9IHRoaXMubWVyZ2Vab25lRml4dHVyZURhdGEoXHJcbiAgICAgICAgICBiYXNlRml4dHVyZSxcclxuICAgICAgICAgIHVzZXJBY3Rpb24uZml4dHVyZURhdGEsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5hcGlTZXJ2aWNlLnVwZGF0ZVN0b3JlRml4dHVyZSh7XHJcbiAgICAgICAgICBmaXh0dXJlSWQsXHJcbiAgICAgICAgICBkYXRhOiBtZXJnZWRGaXh0dXJlLFxyXG4gICAgICAgICAgdGFza1R5cGU6IFwiem9uZVZlcmlmaWNhdGlvblwiLFxyXG4gICAgICAgIH0pLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgbW9kaWZpZWRBbnN3ZXIgPVxyXG4gICAgICAgIHVzZXJBY3Rpb24uYWN0aW9uID09PSBcImVkaXRBY2NlcHRlZFwiXHJcbiAgICAgICAgICA/IHRoaXMuYnVpbGRab25lTW9kaWZpZWRBbnN3ZXIodXNlckFjdGlvbi5maXh0dXJlRGF0YSlcclxuICAgICAgICAgIDogbnVsbDtcclxuXHJcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuYXBpU2VydmljZS51cGRhdGVab25lVmVyaWZpY2F0aW9uU3RhdHVzKHtcclxuICAgICAgICAgIF9pZDogdXNlckFjdGlvbi5mZWVkYmFjay5faWQsXHJcbiAgICAgICAgICBhbnN3ZXJJZCxcclxuICAgICAgICAgIHRhc2tJZCxcclxuICAgICAgICAgIHR5cGU6IHVzZXJBY3Rpb24udHlwZSxcclxuICAgICAgICAgIHVzZXJBY3Rpb246IHVzZXJBY3Rpb24uYWN0aW9uLFxyXG4gICAgICAgICAgY29tbWVudHM6IHVzZXJBY3Rpb24ucmVtYXJrcyxcclxuICAgICAgICAgIC4uLihtb2RpZmllZEFuc3dlciA/IHsgbW9kaWZpZWRBbnN3ZXIgfSA6IHt9KSxcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIExvY2FsIHN0YXRlIHVwZGF0ZSDigJQga2VlcCBVSSBpbiBzeW5jIHdpdGhvdXQgcmUtZmV0Y2hpbmcuXHJcbiAgICAgIHRoaXMuYWxsRml4dHVyZUluc3RhbmNlc1tmaXh0dXJlSW5kZXhdID0gbWVyZ2VkRml4dHVyZTtcclxuICAgICAgdGhpcy5yZXBsYWNlRml4dHVyZUluRmxvb3JEYXRhKGZpeHR1cmVJZCwgbWVyZ2VkRml4dHVyZSk7XHJcbiAgICAgIHRoaXMucmVuZGVyRmxvb3IoZmFsc2UpO1xyXG5cclxuICAgICAgY29uc3Qgem9uZVJvd3MgPSB0aGlzLnpvbmVGZWVkYmFjaz8uem9uZVZlcmlmaWNhdGlvbkRhdGEgPz8gW107XHJcbiAgICAgIGNvbnN0IHpvbmVSb3cgPSB6b25lUm93cy5maW5kKFxyXG4gICAgICAgIChyOiBhbnkpID0+IHI/LmZpeHR1cmVJZD8udG9TdHJpbmc/LigpID09PSBmaXh0dXJlSWQsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICh6b25lUm93Py5hbnN3ZXJzPy5bMF0pIHtcclxuICAgICAgICB6b25lUm93LmFuc3dlcnNbMF0udXNlckFjdGlvbiA9IHVzZXJBY3Rpb24uYWN0aW9uO1xyXG4gICAgICAgIHpvbmVSb3cuYW5zd2Vyc1swXS5zdGF0dXMgPSB1c2VyQWN0aW9uLnR5cGU7XHJcbiAgICAgICAgY29uc3QgYW5zID0gem9uZVJvdy5hbnN3ZXJzWzBdO1xyXG4gICAgICAgIGFucy5jb21tZW50cyA9IGFucy5jb21tZW50cyA/PyBbXTtcclxuICAgICAgICBhbnMuY29tbWVudHMucHVzaChcclxuICAgICAgICAgIHRoaXMuYnVpbGRMb2NhbEFjdGlvbkNvbW1lbnQodXNlckFjdGlvbi50eXBlLCB1c2VyQWN0aW9uLnJlbWFya3MpLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmIChtb2RpZmllZEFuc3dlcikge1xyXG4gICAgICAgICAgLy8gQXBwbHkgdGhlIHNhbWUgb3ZlcmxheSB0aGUgYmFja2VuZCB3aWxsIGFwcGx5IG9uIG5leHQgcmVhZCwgc28gdGhlXHJcbiAgICAgICAgICAvLyBwYW5lbCByZWZsZWN0cyB0aGUgZWRpdHMgd2l0aG91dCB3YWl0aW5nIGZvciBhIHJlZmV0Y2guXHJcbiAgICAgICAgICBhbnMuaGVhZGVyID0ge1xyXG4gICAgICAgICAgICAuLi4oYW5zLmhlYWRlciA/PyB7fSksXHJcbiAgICAgICAgICAgIGxhYmVsOiBtb2RpZmllZEFuc3dlci5oZWFkZXIubGFiZWwsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgKGFucy5zaGVsZkNvbmZpZyA/PyBbXSkuZm9yRWFjaCgoc2hlbGY6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBicmFuZHMgPVxyXG4gICAgICAgICAgICAgIHNoZWxmPy56b25lICYmIG1vZGlmaWVkQW5zd2VyLnNoZWxmQnJhbmRzQnlab25lW3NoZWxmLnpvbmVdO1xyXG4gICAgICAgICAgICBpZiAoYnJhbmRzKSBzaGVsZi5wcm9kdWN0QnJhbmROYW1lID0gWy4uLmJyYW5kc107XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGFucy5tb2RpZmllZEFuc3dlciA9IG1vZGlmaWVkQW5zd2VyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jYWxjdWxhdGVQdWJsaXNoaW5nU3RhdGUoKTtcclxuICAgICAgdGhpcy5zZWxlY3RGaXh0dXJlRmVlZGJhY2soZml4dHVyZUlkKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gZXhlY3V0ZSB6b25lIGFjdGlvblwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRab25lTW9kaWZpZWRBbnN3ZXIoZml4dHVyZURhdGE6IGFueSk6IHtcclxuICAgIGhlYWRlcjogeyBsYWJlbDogc3RyaW5nIH07XHJcbiAgICBzaGVsZkJyYW5kc0J5Wm9uZTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xyXG4gIH0ge1xyXG4gICAgY29uc3Qgc2hlbGZCcmFuZHNCeVpvbmU6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xyXG4gICAgKGZpeHR1cmVEYXRhPy5zaGVsZkNvbmZpZyA/PyBbXSkuZm9yRWFjaCgoc2hlbGY6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCB6b25lID0gc2hlbGY/LnpvbmU7XHJcbiAgICAgIGlmICghem9uZSB8fCBzaGVsZkJyYW5kc0J5Wm9uZVt6b25lXSkgcmV0dXJuO1xyXG4gICAgICBzaGVsZkJyYW5kc0J5Wm9uZVt6b25lXSA9IEFycmF5LmlzQXJyYXkoc2hlbGY/LnByb2R1Y3RCcmFuZE5hbWUpXHJcbiAgICAgICAgPyBbLi4uc2hlbGYucHJvZHVjdEJyYW5kTmFtZV1cclxuICAgICAgICA6IFtdO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBoZWFkZXI6IHsgbGFiZWw6IGZpeHR1cmVEYXRhPy5oZWFkZXI/LmxhYmVsID8/IFwiXCIgfSxcclxuICAgICAgc2hlbGZCcmFuZHNCeVpvbmUsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwZXJzaXN0Wm9uZUVkaXRBY2NlcHRlZCgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZpeHR1cmVJZCA9IHRoaXMuc2VsZWN0ZWRGaXh0dXJlPy5maXh0dXJlSWQ7XHJcbiAgICAgIGlmICghZml4dHVyZUlkKSByZXR1cm47XHJcbiAgICAgIGNvbnN0IHpvbmVSb3dzID0gdGhpcy56b25lRmVlZGJhY2s/LnpvbmVWZXJpZmljYXRpb25EYXRhID8/IFtdO1xyXG4gICAgICBjb25zdCB6b25lUm93ID0gem9uZVJvd3MuZmluZChcclxuICAgICAgICAocjogYW55KSA9PiByPy5maXh0dXJlSWQ/LnRvU3RyaW5nPy4oKSA9PT0gZml4dHVyZUlkLFxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBhbnN3ZXJJZCA9IHpvbmVSb3c/LmFuc3dlcnM/LlswXT8uX2lkO1xyXG4gICAgICBjb25zdCB0YXNrSWQgPSB0aGlzLnpvbmVGZWVkYmFjaz8uem9uZVZlcmlmaWNhdGlvblRhc2s/Ll9pZDtcclxuICAgICAgaWYgKCFhbnN3ZXJJZCB8fCAhdGFza0lkKSByZXR1cm47XHJcblxyXG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlWm9uZVZlcmlmaWNhdGlvblN0YXR1cyh7XHJcbiAgICAgICAgICBfaWQ6IHpvbmVSb3cuX2lkLFxyXG4gICAgICAgICAgYW5zd2VySWQsXHJcbiAgICAgICAgICB0YXNrSWQsXHJcbiAgICAgICAgICB0eXBlOiBcImFncmVlXCIsXHJcbiAgICAgICAgICB1c2VyQWN0aW9uOiBcImVkaXRBY2NlcHRlZFwiLFxyXG4gICAgICAgICAgY29tbWVudHM6IG51bGwsXHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoem9uZVJvdz8uYW5zd2Vycz8uWzBdKSB7XHJcbiAgICAgICAgem9uZVJvdy5hbnN3ZXJzWzBdLnVzZXJBY3Rpb24gPSBcImVkaXRBY2NlcHRlZFwiO1xyXG4gICAgICAgIHpvbmVSb3cuYW5zd2Vyc1swXS5zdGF0dXMgPSBcImFncmVlXCI7XHJcbiAgICAgICAgY29uc3QgYW5zID0gem9uZVJvdy5hbnN3ZXJzWzBdO1xyXG4gICAgICAgIGFucy5jb21tZW50cyA9IGFucy5jb21tZW50cyA/PyBbXTtcclxuICAgICAgICBhbnMuY29tbWVudHMucHVzaCh0aGlzLmJ1aWxkTG9jYWxBY3Rpb25Db21tZW50KFwiYWdyZWVcIiwgbnVsbCkpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgIFwiRmFpbGVkIHRvIHJlY29yZCB6b25lIGVkaXQgYWNjZXB0YW5jZVwiLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcm90YXRlV2FsbChlbGVOdW1iZXI6IG51bWJlcikge1xyXG4gICAgY29uc3Qgd2FsbCA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZmluZChcclxuICAgICAgKGVsOiBhbnkpID0+IGVsLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiBlbC5lbGVtZW50TnVtYmVyID09PSBlbGVOdW1iZXIsXHJcbiAgICApO1xyXG4gICAgaWYgKHdhbGwuYW5nbGUgKyA5MCA8IDM2MCkge1xyXG4gICAgICB3YWxsLmFuZ2xlICs9IDkwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgd2FsbC5hbmdsZSA9IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmRlckZsb29yKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgYWRkTmV3V2FsbChlbGVOdW1iZXI6IG51bWJlcikge1xyXG4gICAgY29uc3QgZ2V0V2FsbEVuZFBvaW50ID0gKHdhbGw6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBhbmdsZVJhZCA9ICh3YWxsLmFuZ2xlICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICAgIGNvbnN0IGxlbmd0aCA9IHdhbGwuZGlzdGFuY2U7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHg6IHdhbGwucmVsYXRpdmVQb3NpdGlvbi54ICsgbGVuZ3RoICogTWF0aC5jb3MoYW5nbGVSYWQpLFxyXG4gICAgICAgIHk6IHdhbGwucmVsYXRpdmVQb3NpdGlvbi55ICsgbGVuZ3RoICogTWF0aC5zaW4oYW5nbGVSYWQpLFxyXG4gICAgICAgIHVuaXQ6IHdhbGwucmVsYXRpdmVQb3NpdGlvbi51bml0LFxyXG4gICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZmluZEluZGV4KFxyXG4gICAgICAodzogYW55KSA9PiB3LmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiB3LmVsZW1lbnROdW1iZXIgPT09IGVsZU51bWJlcixcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGluZGV4ID09PSAtMSAmJiBlbGVOdW1iZXIgIT09IDApIHJldHVybjtcclxuXHJcbiAgICBsZXQgc3RhcnRQb3NpdGlvbjtcclxuXHJcbiAgICBpZiAoZWxlTnVtYmVyID09PSAwKSB7XHJcbiAgICAgIHN0YXJ0UG9zaXRpb24gPSB7XHJcbiAgICAgICAgeDogMCxcclxuICAgICAgICB5OiAwLFxyXG4gICAgICAgIHVuaXQ6IFwiZnRcIixcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHByZXZXYWxsID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbltpbmRleF07XHJcbiAgICAgIHN0YXJ0UG9zaXRpb24gPSBnZXRXYWxsRW5kUG9pbnQocHJldldhbGwpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJhc2VXYWxsID1cclxuICAgICAgZWxlTnVtYmVyID09PSAwXHJcbiAgICAgICAgPyB7IGFuZ2xlOiAwLCBkaXJlY3Rpb246IFwicmlnaHRcIiwgdW5pdDogXCJmdFwiIH1cclxuICAgICAgICA6IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb25baW5kZXhdO1xyXG5cclxuICAgIGNvbnN0IG5ld1dhbGwgPSB7XHJcbiAgICAgIGVsZW1lbnRUeXBlOiBcIndhbGxcIixcclxuICAgICAgZGlzdGFuY2U6IDE1LFxyXG4gICAgICB1bml0OiBiYXNlV2FsbC51bml0LFxyXG4gICAgICBkaXJlY3Rpb246IGJhc2VXYWxsLmRpcmVjdGlvbixcclxuICAgICAgYW5nbGU6IGJhc2VXYWxsLmFuZ2xlLFxyXG4gICAgICBlbGVtZW50TnVtYmVyOiBlbGVOdW1iZXIgKyAxLFxyXG4gICAgICByZWxhdGl2ZVBvc2l0aW9uOiBzdGFydFBvc2l0aW9uLFxyXG4gICAgICBmaXh0dXJlczogW10sXHJcbiAgICAgIG90aGVyRWxlbWVudHM6IFtdLFxyXG4gICAgICBuZXdBZGRlZDogdHJ1ZSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5zcGxpY2UoXHJcbiAgICAgIGVsZU51bWJlciA9PT0gMCA/IDAgOiBpbmRleCArIDEsXHJcbiAgICAgIDAsXHJcbiAgICAgIG5ld1dhbGwsXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMudXBkYXRlV2FsbEVsZW1lbnROdW1iZXIoKTtcclxuICAgIHRoaXMudXBkYXRlV2FsbENvb3JkaW5hdGVzKCk7XHJcbiAgICB0aGlzLnJlbmRlckZsb29yKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgYWRkTmV3RW50cmFuY2UoKSB7XHJcbiAgICBjb25zdCBsYXlvdXRQb2x5Z29uID0gdGhpcy5mbG9vckRhdGE/LmxheW91dFBvbHlnb24gPz8gW107XHJcbiAgICBjb25zdCBlbGVOdW1iZXIgPVxyXG4gICAgICBsYXlvdXRQb2x5Z29uLmZpbHRlcigoZWxlOiBhbnkpID0+IGVsZS5lbGVtZW50VHlwZSA9PT0gXCJlbnRyYW5jZVwiKVxyXG4gICAgICAgID8ubGVuZ3RoID8/IDA7XHJcblxyXG4gICAgY29uc3QgZ2FwUHggPSAyNDtcclxuICAgIGNvbnN0IGRlZmF1bHRFbnRyYW5jZVdpZHRoUHggPSA4MDtcclxuXHJcbiAgICBsZXQgeEZ0ID0gMDtcclxuICAgIGxldCB5RnQgPSAwO1xyXG4gICAgbGV0IGFuZ2xlID0gMDtcclxuICAgIGxldCBpc1Bvc2l0aW9uUmVzb2x2ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyAxKSBJZiBlbnRyYW5jZShzKSBhbHJlYWR5IGV4aXN0LCBwbGFjZSBuZXh0IHRvIHRoZSBsYXRlc3Qgb25lLlxyXG4gICAgY29uc3QgZXhpc3RpbmdFbnRyYW5jZU9iamVjdHMgPSAodGhpcy5jYW52YXM/LmdldE9iamVjdHMoKSA/PyBbXSlcclxuICAgICAgLmZpbHRlcigob2JqOiBhbnkpID0+IG9iaj8ub2JqVHlwZSA9PT0gXCJlbnRyYW5jZVwiKVxyXG4gICAgICAuc29ydChcclxuICAgICAgICAoYTogYW55LCBiOiBhbnkpID0+XHJcbiAgICAgICAgICBOdW1iZXIoYT8uZGF0YT8uZWxlbWVudE51bWJlciB8fCAwKSAtXHJcbiAgICAgICAgICBOdW1iZXIoYj8uZGF0YT8uZWxlbWVudE51bWJlciB8fCAwKSxcclxuICAgICAgKTtcclxuXHJcbiAgICBjb25zdCBsYXRlc3RFbnRyYW5jZU9iaiA9IGV4aXN0aW5nRW50cmFuY2VPYmplY3RzLmF0KC0xKSBhcyBhbnk7XHJcblxyXG4gICAgaWYgKGxhdGVzdEVudHJhbmNlT2JqKSB7XHJcbiAgICAgIGNvbnN0IGxlZnRQeCA9IGxhdGVzdEVudHJhbmNlT2JqLmxlZnQgPz8gMDtcclxuICAgICAgY29uc3QgdG9wUHggPSBsYXRlc3RFbnRyYW5jZU9iai50b3AgPz8gMDtcclxuICAgICAgY29uc3Qgd2lkdGhQeCA9XHJcbiAgICAgICAgbGF0ZXN0RW50cmFuY2VPYmouZ2V0U2NhbGVkV2lkdGg/LigpIHx8IGRlZmF1bHRFbnRyYW5jZVdpZHRoUHg7XHJcbiAgICAgIGNvbnN0IGFuY2hvckFuZ2xlID0gTnVtYmVyKGxhdGVzdEVudHJhbmNlT2JqLmFuZ2xlIHx8IDApO1xyXG4gICAgICBjb25zdCBhbmdsZVJhZCA9IChhbmNob3JBbmdsZSAqIE1hdGguUEkpIC8gMTgwO1xyXG4gICAgICBjb25zdCBzdGVwUHggPSB3aWR0aFB4ICsgZ2FwUHg7XHJcblxyXG4gICAgICB4RnQgPSB0aGlzLmZyb21QaXhlbHMobGVmdFB4ICsgc3RlcFB4ICogTWF0aC5jb3MoYW5nbGVSYWQpLCBcImZ0XCIpO1xyXG4gICAgICB5RnQgPSB0aGlzLmZyb21QaXhlbHModG9wUHggKyBzdGVwUHggKiBNYXRoLnNpbihhbmdsZVJhZCksIFwiZnRcIik7XHJcbiAgICAgIGFuZ2xlID0gYW5jaG9yQW5nbGU7XHJcbiAgICAgIGlzUG9zaXRpb25SZXNvbHZlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFpc1Bvc2l0aW9uUmVzb2x2ZWQpIHtcclxuICAgICAgY29uc3QgZXhpc3RpbmdFbnRyYW5jZXMgPSBsYXlvdXRQb2x5Z29uXHJcbiAgICAgICAgLmZpbHRlcigoZWxlOiBhbnkpID0+IGVsZS5lbGVtZW50VHlwZSA9PT0gXCJlbnRyYW5jZVwiKVxyXG4gICAgICAgIC5zb3J0KFxyXG4gICAgICAgICAgKGE6IGFueSwgYjogYW55KSA9PlxyXG4gICAgICAgICAgICBOdW1iZXIoYT8uZWxlbWVudE51bWJlciB8fCAwKSAtIE51bWJlcihiPy5lbGVtZW50TnVtYmVyIHx8IDApLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICBjb25zdCBsYXRlc3RFbnRyYW5jZSA9IGV4aXN0aW5nRW50cmFuY2VzLmF0KC0xKTtcclxuICAgICAgaWYgKGxhdGVzdEVudHJhbmNlKSB7XHJcbiAgICAgICAgY29uc3QgYW5jaG9yQW5nbGUgPSBOdW1iZXIobGF0ZXN0RW50cmFuY2U/LmFuZ2xlIHx8IDApO1xyXG4gICAgICAgIGNvbnN0IGFuZ2xlUmFkID0gKGFuY2hvckFuZ2xlICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICAgICAgY29uc3Qgc3RlcEZ0ID1cclxuICAgICAgICAgIE51bWJlcihcclxuICAgICAgICAgICAgbGF0ZXN0RW50cmFuY2U/LmRpc3RhbmNlIHx8XHJcbiAgICAgICAgICAgICAgdGhpcy5mcm9tUGl4ZWxzKGRlZmF1bHRFbnRyYW5jZVdpZHRoUHgsIFwiZnRcIiksXHJcbiAgICAgICAgICApICsgdGhpcy5mcm9tUGl4ZWxzKGdhcFB4LCBcImZ0XCIpO1xyXG5cclxuICAgICAgICB4RnQgPVxyXG4gICAgICAgICAgTnVtYmVyKGxhdGVzdEVudHJhbmNlPy5yZWxhdGl2ZVBvc2l0aW9uPy54IHx8IDApICtcclxuICAgICAgICAgIHN0ZXBGdCAqIE1hdGguY29zKGFuZ2xlUmFkKTtcclxuICAgICAgICB5RnQgPVxyXG4gICAgICAgICAgTnVtYmVyKGxhdGVzdEVudHJhbmNlPy5yZWxhdGl2ZVBvc2l0aW9uPy55IHx8IDApICtcclxuICAgICAgICAgIHN0ZXBGdCAqIE1hdGguc2luKGFuZ2xlUmFkKTtcclxuICAgICAgICBhbmdsZSA9IGFuY2hvckFuZ2xlO1xyXG4gICAgICAgIGlzUG9zaXRpb25SZXNvbHZlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAyKSBJZiBubyBlbnRyYW5jZSwgcGxhY2UgbmV4dCB0byB3YWxsLTEuXHJcbiAgICBpZiAoIWlzUG9zaXRpb25SZXNvbHZlZCkge1xyXG4gICAgICBjb25zdCB3YWxsMSA9IGxheW91dFBvbHlnb24uZmluZChcclxuICAgICAgICAoZWxlOiBhbnkpID0+XHJcbiAgICAgICAgICBlbGUuZWxlbWVudFR5cGUgPT09IFwid2FsbFwiICYmIE51bWJlcihlbGUuZWxlbWVudE51bWJlcikgPT09IDEsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAod2FsbDEpIHtcclxuICAgICAgICBjb25zdCB3YWxsQW5nbGUgPSBOdW1iZXIod2FsbDE/LmFuZ2xlIHx8IDApO1xyXG4gICAgICAgIGNvbnN0IHdhbGxBbmdsZVJhZCA9ICh3YWxsQW5nbGUgKiBNYXRoLlBJKSAvIDE4MDtcclxuICAgICAgICBjb25zdCBhbG9uZ1dhbGxGdCA9IE1hdGgubWluKE51bWJlcih3YWxsMT8uZGlzdGFuY2UgfHwgMCkgLyAyLCA0KTtcclxuICAgICAgICBjb25zdCBzaWRlT2Zmc2V0RnQgPSAxLjU7XHJcbiAgICAgICAgY29uc3Qgd2FsbFggPSBOdW1iZXIod2FsbDE/LnJlbGF0aXZlUG9zaXRpb24/LnggfHwgMCk7XHJcbiAgICAgICAgY29uc3Qgd2FsbFkgPSBOdW1iZXIod2FsbDE/LnJlbGF0aXZlUG9zaXRpb24/LnkgfHwgMCk7XHJcblxyXG4gICAgICAgIHhGdCA9XHJcbiAgICAgICAgICB3YWxsWCArXHJcbiAgICAgICAgICBhbG9uZ1dhbGxGdCAqIE1hdGguY29zKHdhbGxBbmdsZVJhZCkgK1xyXG4gICAgICAgICAgc2lkZU9mZnNldEZ0ICogLU1hdGguc2luKHdhbGxBbmdsZVJhZCk7XHJcbiAgICAgICAgeUZ0ID1cclxuICAgICAgICAgIHdhbGxZICtcclxuICAgICAgICAgIGFsb25nV2FsbEZ0ICogTWF0aC5zaW4od2FsbEFuZ2xlUmFkKSArXHJcbiAgICAgICAgICBzaWRlT2Zmc2V0RnQgKiBNYXRoLmNvcyh3YWxsQW5nbGVSYWQpO1xyXG4gICAgICAgIGFuZ2xlID0gd2FsbEFuZ2xlO1xyXG4gICAgICAgIGlzUG9zaXRpb25SZXNvbHZlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAzKSBJZiBubyB3YWxsIChlLmcuIGxheW91dFBvbHlnb24gaXMgZW1wdHkpLCBwbGFjZSBuZXh0IHRvIGFueSBjYW52YXMgb2JqZWN0LlxyXG4gICAgaWYgKCFpc1Bvc2l0aW9uUmVzb2x2ZWQpIHtcclxuICAgICAgY29uc3QgYW5jaG9yT2JqID0gKHRoaXMuY2FudmFzPy5nZXRPYmplY3RzKCkgPz8gW10pLmZpbmQoKG9iajogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICEhb2JqPy5vYmpUeXBlICYmIG9iaj8uaXNEaXNzZWN0aW9uTGluZSAhPT0gdHJ1ZTtcclxuICAgICAgfSkgYXMgYW55O1xyXG5cclxuICAgICAgaWYgKGFuY2hvck9iaikge1xyXG4gICAgICAgIGNvbnN0IGxlZnRQeCA9IGFuY2hvck9iai5sZWZ0ID8/IDA7XHJcbiAgICAgICAgY29uc3QgdG9wUHggPSBhbmNob3JPYmoudG9wID8/IDA7XHJcbiAgICAgICAgY29uc3Qgd2lkdGhQeCA9IGFuY2hvck9iai5nZXRTY2FsZWRXaWR0aD8uKCkgfHwgZGVmYXVsdEVudHJhbmNlV2lkdGhQeDtcclxuXHJcbiAgICAgICAgeEZ0ID0gdGhpcy5mcm9tUGl4ZWxzKGxlZnRQeCArIHdpZHRoUHggKyBnYXBQeCwgXCJmdFwiKTtcclxuICAgICAgICB5RnQgPSB0aGlzLmZyb21QaXhlbHModG9wUHgsIFwiZnRcIik7XHJcbiAgICAgICAgYW5nbGUgPSBOdW1iZXIoYW5jaG9yT2JqPy5hbmdsZSB8fCAwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld0VudHJhbmNlID0ge1xyXG4gICAgICBlbGVtZW50VHlwZTogXCJlbnRyYW5jZVwiLFxyXG4gICAgICBkaXN0YW5jZTogNixcclxuICAgICAgdW5pdDogXCJmdFwiLFxyXG4gICAgICBkaXJlY3Rpb246IFwidXBcIixcclxuICAgICAgYW5nbGUsXHJcbiAgICAgIGVsZW1lbnROdW1iZXI6IGVsZU51bWJlciArIDEsXHJcbiAgICAgIHJlbGF0aXZlUG9zaXRpb246IHtcclxuICAgICAgICB4OiB4RnQsXHJcbiAgICAgICAgeTogeUZ0LFxyXG4gICAgICAgIHVuaXQ6IFwiZnRcIixcclxuICAgICAgfSxcclxuICAgICAgZml4dHVyZXM6IFtdLFxyXG4gICAgICBvdGhlckVsZW1lbnRzOiBbXSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5wdXNoKG5ld0VudHJhbmNlKTtcclxuICAgIHRoaXMucmVuZGVyRmxvb3IodHJ1ZSk7XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMudXBkYXRlRW50cmFuY2VDb29yZGluYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkTmV3Rml4dHVyZShmaXh0dXJlVHlwZTogXCJ3YWxsXCIgfCBcImZsb29yXCIsIHdhbGxJbmRleD86IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgY29uc3QgdGVtcGxhdGU6IGFueSA9IGF3YWl0IHRoaXMuZ2V0VGVtcGxhdGUodGhpcy5maXh0dXJlVGVtcGxhdGVzWzBdLl9pZCk7XHJcbiAgICBjb25zdCB0ZW1wbGF0ZURhdGEgPSB0ZW1wbGF0ZS5kYXRhO1xyXG4gICAgY29uc3QgZml4dHVyZUlkID0gYG5ldy0ke2NyeXB0by5yYW5kb21VVUlEKCl9YDtcclxuICAgIGNvbnN0IGZpeHR1cmVHcm91cCA9IHRoaXMucGF0Y2hGaXh0dXJlKHtcclxuICAgICAgZml4dHVyZU5hbWU6IHRlbXBsYXRlRGF0YS5maXh0dXJlTmFtZSxcclxuICAgICAgZml4dHVyZUNvbmZpZ0lkOiB0ZW1wbGF0ZURhdGEuX2lkLFxyXG4gICAgICBfaWQ6IGZpeHR1cmVJZCxcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGZpeHR1cmVEYXRhID0ge1xyXG4gICAgICAuLi50ZW1wbGF0ZURhdGEsXHJcbiAgICAgIGZpeHR1cmVDb25maWdJZDogdGVtcGxhdGVEYXRhLl9pZCxcclxuICAgICAgcmVsYXRpdmVQb3NpdGlvbjogeyB4OiAwLCB5OiAwLCBhbmdsZTogMCwgdW5pdDogXCJmdFwiIH0sXHJcbiAgICAgIF9pZDogZml4dHVyZUlkLFxyXG4gICAgICB1bnNhdmVkQ2hhbmdlczogdHJ1ZSxcclxuICAgICAgbmV3QWRkZWQ6IHRydWUsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5sYXlvdXRIYXNVbnNhdmVkQ2hhbmdlcyA9IHRydWU7XHJcblxyXG4gICAgaWYgKGZpeHR1cmVUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICBjb25zdCB3YWxsRGF0YSA9IHRoaXMuZ2V0V2FsbEJ5TnVtYmVyKHdhbGxJbmRleCEgKyAxKTtcclxuXHJcbiAgICAgIGNvbnN0IHcgPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgIGZpeHR1cmVEYXRhLmZpeHR1cmVTdGF0aWNXaWR0aC52YWx1ZSxcclxuICAgICAgICBmaXh0dXJlRGF0YS5maXh0dXJlU3RhdGljV2lkdGgudW5pdCxcclxuICAgICAgKTtcclxuICAgICAgY29uc3Qgd3AgPSB0aGlzLmZyb21QaXhlbHModywgXCJmdFwiKTtcclxuXHJcbiAgICAgIGlmICh3YWxsRGF0YSkge1xyXG4gICAgICAgIGNvbnN0IHgwID0gd2FsbERhdGEucmVsYXRpdmVQb3NpdGlvbi54O1xyXG4gICAgICAgIGNvbnN0IHkwID0gd2FsbERhdGEucmVsYXRpdmVQb3NpdGlvbi55O1xyXG4gICAgICAgIGNvbnN0IGFuZ2xlRGVnID0gd2FsbERhdGEuYW5nbGUgfHwgMDtcclxuICAgICAgICBjb25zdCBhbmdsZVJhZCA9IChhbmdsZURlZyAqIE1hdGguUEkpIC8gMTgwO1xyXG4gICAgICAgIGNvbnN0IGNvc0EgPSBNYXRoLmNvcyhhbmdsZVJhZCk7XHJcbiAgICAgICAgY29uc3Qgc2luQSA9IE1hdGguc2luKGFuZ2xlUmFkKTtcclxuXHJcbiAgICAgICAgLy8gUHJvamVjdCBhbGwgZXhpc3RpbmcgZml4dHVyZXMgb250byB0aGUgd2FsbCBheGlzIHRvIGdldCBvY2N1cGllZCByYW5nZXMgKGluIGZ0KS5cclxuICAgICAgICAvLyBQcm9qZWN0aW9uIHJlY292ZXJzIHQgY29ycmVjdGx5IGV2ZW4gd2l0aCB0aGUgMWZ0IHBlcnBlbmRpY3VsYXIgb2Zmc2V0IGFwcGxpZWRcclxuICAgICAgICAvLyBkdXJpbmcgcGxhY2VtZW50OiAo4oiSc2luQcK3Y29zQSArIGNvc0HCt3NpbkEpIGNhbmNlbHMgdG8gMC5cclxuICAgICAgICBjb25zdCBleGlzdGluZ0ZpeHR1cmVzID0gKHdhbGxEYXRhLmZpeHR1cmVzIHx8IFtdKS5maWx0ZXIoXHJcbiAgICAgICAgICAoZjogYW55KSA9PiBmLmZpeHR1cmVOYW1lICE9PSBcInNwYWNlXCIsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb2NjdXBpZWQ6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+ID0gZXhpc3RpbmdGaXh0dXJlcy5tYXAoXHJcbiAgICAgICAgICAoZjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZXaWR0aCA9IHRoaXMuZnJvbVBpeGVscyhcclxuICAgICAgICAgICAgICB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgICAgICAgZi5maXh0dXJlU3RhdGljV2lkdGgudmFsdWUsXHJcbiAgICAgICAgICAgICAgICBmLmZpeHR1cmVTdGF0aWNXaWR0aC51bml0LFxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgXCJmdFwiLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBmSGVpZ2h0ID0gdGhpcy5mcm9tUGl4ZWxzKFxyXG4gICAgICAgICAgICAgIHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgICAgICAgICBmLmZpeHR1cmVTdGF0aWNMZW5ndGgudmFsdWUsXHJcbiAgICAgICAgICAgICAgICBmLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgIFwiZnRcIixcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENBRC11cGxvYWRlZCBmaXh0dXJlcyBvbiBpbnZlcnRlZCB3YWxscyAod2FsbCBhbmdsZSDiiIggKDkwwrAsIDI3MMKwKSlcclxuICAgICAgICAgICAgLy8gaGF2ZSB0aGVpciBzYXZlZCAoeCwgeSkgc2hpZnRlZCBieSBSKHdhbGxBbmdsZSnCtyh3LCBoKSB0byBrZWVwIHRoZVxyXG4gICAgICAgICAgICAvLyBjYW5vbmljYWwgdmlzdWFsIGFmdGVyIGEgMTgwwrAgYm9keSBmbGlwIOKAlCBzZWUgZHJhd0ZpeHR1cmUuIFRvXHJcbiAgICAgICAgICAgIC8vIHJlY292ZXIgdGhlIHdhbGwtYXhpcyBwb3NpdGlvbiB0aGUgZ2FwLWZpbmRlciBuZWVkcywgdW5zaGlmdCBhbnlcclxuICAgICAgICAgICAgLy8gZml4dHVyZSB3aG9zZSBzYXZlZCBhbmdsZSBkaWZmZXJzIGZyb20gdGhlIHdhbGwgYW5nbGUgYnkgfjE4MMKwLlxyXG4gICAgICAgICAgICBjb25zdCBmQW5nbGUgPSAoZi5yZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlID8/IDApIGFzIG51bWJlcjtcclxuICAgICAgICAgICAgY29uc3QgYW5nbGVEaWZmID1cclxuICAgICAgICAgICAgICAoKCgoZkFuZ2xlIC0gYW5nbGVEZWcpICUgMzYwKSArIDM2MCkgJSAzNjApO1xyXG4gICAgICAgICAgICBjb25zdCBpc0ZsaXBwZWQgPSBNYXRoLmFicyhhbmdsZURpZmYgLSAxODApIDwgMTtcclxuXHJcbiAgICAgICAgICAgIGxldCBwcm9qWCA9IGYucmVsYXRpdmVQb3NpdGlvbi54O1xyXG4gICAgICAgICAgICBsZXQgcHJvalkgPSBmLnJlbGF0aXZlUG9zaXRpb24ueTtcclxuICAgICAgICAgICAgaWYgKGlzRmxpcHBlZCkge1xyXG4gICAgICAgICAgICAgIHByb2pYIC09IGNvc0EgKiBmV2lkdGggLSBzaW5BICogZkhlaWdodDtcclxuICAgICAgICAgICAgICBwcm9qWSAtPSBzaW5BICogZldpZHRoICsgY29zQSAqIGZIZWlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRTdGFydCA9IChwcm9qWCAtIHgwKSAqIGNvc0EgKyAocHJvalkgLSB5MCkgKiBzaW5BO1xyXG4gICAgICAgICAgICByZXR1cm4gW01hdGgubWF4KDAsIHRTdGFydCksIE1hdGgubWF4KDAsIHRTdGFydCkgKyBmV2lkdGhdIGFzIFtcclxuICAgICAgICAgICAgICBudW1iZXIsXHJcbiAgICAgICAgICAgICAgbnVtYmVyLFxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBvY2N1cGllZC5zb3J0KChhLCBiKSA9PiBhWzBdIC0gYlswXSk7XHJcblxyXG4gICAgICAgIC8vIFdhbGsgZnJvbSB3YWxsIHN0YXJ0OyBmaW5kIGZpcnN0IGdhcCB0aGF0IGZpdHMgdGhlIG5ldyBmaXh0dXJlLlxyXG4gICAgICAgIC8vIEVQU0lMT04gYWJzb3JicyBmbG9hdGluZy1wb2ludCBkcmlmdCBmcm9tIHJlcGVhdGVkIHVuaXQgcm91bmQtdHJpcHMuXHJcbiAgICAgICAgY29uc3QgRVBTSUxPTiA9IDAuMDAxO1xyXG4gICAgICAgIGxldCBwbGFjZW1lbnRUOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBsZXQgY3Vyc29yID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBbcmFuZ2VTdGFydCwgcmFuZ2VFbmRdIG9mIG9jY3VwaWVkKSB7XHJcbiAgICAgICAgICBpZiAocmFuZ2VTdGFydCAtIGN1cnNvciA+PSB3cCAtIEVQU0lMT04pIHtcclxuICAgICAgICAgICAgcGxhY2VtZW50VCA9IGN1cnNvcjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjdXJzb3IgPSBNYXRoLm1heChjdXJzb3IsIHJhbmdlRW5kKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE5vIGdhcCBmb3VuZCDihpIgcGxhY2UgYWZ0ZXIgbGFzdCBmaXh0dXJlLlxyXG4gICAgICAgIC8vIE92ZXJmbG93IGJleW9uZCB3YWxsIGxlbmd0aCBpcyBpbnRlbnRpb25hbCBwZXIgcmVxdWlyZW1lbnRzLlxyXG4gICAgICAgIGlmIChwbGFjZW1lbnRUID09PSBudWxsKSB7XHJcbiAgICAgICAgICBwbGFjZW1lbnRUID0gY3Vyc29yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZnggPSB4MCArIHBsYWNlbWVudFQgKiBjb3NBO1xyXG4gICAgICAgIGNvbnN0IGZ5ID0geTAgKyBwbGFjZW1lbnRUICogc2luQTtcclxuICAgICAgICBjb25zdCBvZmZzZXQgPSAwLjk7XHJcbiAgICAgICAgY29uc3QgZnhfb2Zmc2V0ID0gZnggKyBvZmZzZXQgKiAtc2luQTtcclxuICAgICAgICBjb25zdCBmeV9vZmZzZXQgPSBmeSArIG9mZnNldCAqIGNvc0E7XHJcblxyXG4gICAgICAgIGZpeHR1cmVEYXRhLnJlbGF0aXZlUG9zaXRpb24ueCA9IGZ4X29mZnNldDtcclxuICAgICAgICBmaXh0dXJlRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLnkgPSBmeV9vZmZzZXQ7XHJcbiAgICAgICAgZml4dHVyZURhdGEucmVsYXRpdmVQb3NpdGlvbi5hbmdsZSA9IGFuZ2xlRGVnO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgd2FsbCBhbmdsZSBwdXRzIHRoZSBmaXh0dXJlIGluIHRoZSB1cHNpZGUtZG93biByYW5nZSwgYmFrZVxyXG4gICAgICAgIC8vIHRoZSBzYW1lIDE4MMKwIGJvZHkgZmxpcCBkcmF3Rml4dHVyZSBhcHBsaWVzIGR1cmluZyBDQUQgZmlyc3QtcmVuZGVyXHJcbiAgICAgICAgLy8gKHNoaWZ0IGFuY2hvciBieSBSKHdhbGxBbmdsZSnCtyh3LCBoKSBhbmQgcm90YXRlICsxODDCsCkuIGRyYXdGaXh0dXJlJ3NcclxuICAgICAgICAvLyBvd24gZmxpcCBwYXRoIGlzIGdhdGVkIG9uIGNhZExheW91dD10cnVlLCBzbyBmb3IgZml4dHVyZXMgYWRkZWRcclxuICAgICAgICAvLyBwb3N0LUNBRCB2aWEgdGhlIHNpZGUgcGFuZWwgd2UgaGF2ZSB0byBiYWtlIHRoZSBmbGlwIGhlcmUg4oCUIGl0XHJcbiAgICAgICAgLy8gbWFrZXMgdGhlIG5ldyBmaXh0dXJlIGxhbmQgY2Fub25pY2FsIGluc3RlYWQgb2YgdXBzaWRlLWRvd24uXHJcbiAgICAgICAgY29uc3Qgbm9ybVdhbGxBbmdsZSA9ICgoKGFuZ2xlRGVnICUgMzYwKSArIDM2MCkgJSAzNjApO1xyXG4gICAgICAgIGlmIChub3JtV2FsbEFuZ2xlID4gOTAgJiYgbm9ybVdhbGxBbmdsZSA8IDI3MCkge1xyXG4gICAgICAgICAgY29uc3Qgd2lkdGhGdCA9IHRoaXMuZnJvbVBpeGVscyhcclxuICAgICAgICAgICAgdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgICAgICBmaXh0dXJlRGF0YS5maXh0dXJlU3RhdGljV2lkdGgudmFsdWUsXHJcbiAgICAgICAgICAgICAgZml4dHVyZURhdGEuZml4dHVyZVN0YXRpY1dpZHRoLnVuaXQsXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIFwiZnRcIixcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBjb25zdCBoZWlnaHRGdCA9IHRoaXMuZnJvbVBpeGVscyhcclxuICAgICAgICAgICAgdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgICAgICBmaXh0dXJlRGF0YS5maXh0dXJlU3RhdGljTGVuZ3RoLnZhbHVlLFxyXG4gICAgICAgICAgICAgIGZpeHR1cmVEYXRhLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgXCJmdFwiLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGZpeHR1cmVEYXRhLnJlbGF0aXZlUG9zaXRpb24ueCA9XHJcbiAgICAgICAgICAgIGZ4X29mZnNldCArIGNvc0EgKiB3aWR0aEZ0IC0gc2luQSAqIGhlaWdodEZ0O1xyXG4gICAgICAgICAgZml4dHVyZURhdGEucmVsYXRpdmVQb3NpdGlvbi55ID1cclxuICAgICAgICAgICAgZnlfb2Zmc2V0ICsgc2luQSAqIHdpZHRoRnQgKyBjb3NBICogaGVpZ2h0RnQ7XHJcbiAgICAgICAgICBmaXh0dXJlRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlID0gYW5nbGVEZWcgKyAxODA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAodGhpcy5nZXRGb3JtV2FsbHMuYXQod2FsbEluZGV4ISkuZ2V0KFwiZml4dHVyZXNcIikgYXMgRm9ybUFycmF5KS5wdXNoKFxyXG4gICAgICAgIGZpeHR1cmVHcm91cCxcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5nZXRXYWxsQnlOdW1iZXIod2FsbEluZGV4ISArIDEpPy5maXh0dXJlcy5wdXNoKGZpeHR1cmVEYXRhKTtcclxuICAgIH0gZWxzZSBpZiAoZml4dHVyZVR5cGUgPT09IFwiZmxvb3JcIikge1xyXG4gICAgICBjb25zdCBmaXh0dXJlV2lkdGhQeCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgZml4dHVyZURhdGEuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlLFxyXG4gICAgICAgIGZpeHR1cmVEYXRhLmZpeHR1cmVTdGF0aWNXaWR0aC51bml0LFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgZml4dHVyZUhlaWdodFB4ID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICBmaXh0dXJlRGF0YS5maXh0dXJlU3RhdGljTGVuZ3RoLnZhbHVlLFxyXG4gICAgICAgIGZpeHR1cmVEYXRhLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIE4tc2hhcGUgZ3JpZCBwbGFjZW1lbnQ6IGNvbCBmaWxscyBsZWZ0LXRvLXJpZ2h0LCBlYWNoIGNvbHVtbiBmaWxscyBib3R0b20gcm93IChyb3c9MSkgZmlyc3QgdGhlbiB0b3Agcm93IChyb3c9MClcclxuICAgICAgY29uc3QgbmV3SW5kZXggPSB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlLmxlbmd0aDtcclxuICAgICAgY29uc3QgbmV3Q29sID0gTWF0aC5mbG9vcihuZXdJbmRleCAvIDIpO1xyXG4gICAgICBjb25zdCBuZXdSb3cgPSBuZXdJbmRleCAlIDIgPT09IDAgPyAxIDogMDtcclxuXHJcbiAgICAgIGxldCBncmlkT3JpZ2luWDogbnVtYmVyO1xyXG4gICAgICBsZXQgZ3JpZE9yaWdpblk6IG51bWJlcjtcclxuXHJcbiAgICAgIGlmICh0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAvLyBSZWNvdmVyIGdyaWQgb3JpZ2luIGZyb20gZml4dHVyZSBhdCBpbmRleCAwIChhbHdheXMgcGxhY2VkIGF0IHJvdz0xLCBjb2w9MClcclxuICAgICAgICBjb25zdCBmMCA9IHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmVbMF07XHJcbiAgICAgICAgY29uc3QgZjB4ID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgIGYwLnJlbGF0aXZlUG9zaXRpb24ueCxcclxuICAgICAgICAgIGYwLnJlbGF0aXZlUG9zaXRpb24udW5pdCxcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IGYweSA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgICBmMC5yZWxhdGl2ZVBvc2l0aW9uLnksXHJcbiAgICAgICAgICBmMC5yZWxhdGl2ZVBvc2l0aW9uLnVuaXQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICAvLyBmMCBpcyBhdCByb3c9MSDihpIgZ3JpZE9yaWdpblkgPSBmMHkgLSAxICogZml4dHVyZUhlaWdodFB4OyBjb2w9MCDihpIgZ3JpZE9yaWdpblggPSBmMHhcclxuICAgICAgICBncmlkT3JpZ2luWCA9IGYweDtcclxuICAgICAgICBncmlkT3JpZ2luWSA9IGYweSAtIGZpeHR1cmVIZWlnaHRQeDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBObyBleGlzdGluZyBjZW50ZXIgZml4dHVyZXMg4oCUIGZpbmQgYmVzdCBncmlkIG9yaWdpbiB2aWEgcG9seWdvbiBzY2FuIChzYW1lIGFzIGRyYXdMYXlvdXRFbGVtZW50cylcclxuICAgICAgICBjb25zdCBsYXlvdXRQb2x5Z29uID0gdGhpcy5idWlsZExheW91dFBvbHlnb25Gcm9tV2FsbHMoKTtcclxuICAgICAgICBjb25zdCBvY2N1cGllZFJlY3RzID0gdGhpcy5nZXRPY2N1cGllZFJlY3RzKCk7XHJcbiAgICAgICAgY29uc3QgYm91bmRzID0gdGhpcy5nZXRGdWxsTGF5b3V0Qm91bmRzKCk7XHJcblxyXG4gICAgICAgIC8vIFJlc2VydmUgc3BhY2UgZm9yIDIgcm93cyBhbmQgMSBjb2x1bW4gYXMgdGhlIHN0YXJ0aW5nIGdyaWQgZm9vdHByaW50XHJcbiAgICAgICAgY29uc3QgZ3JpZFcgPSBmaXh0dXJlV2lkdGhQeDtcclxuICAgICAgICBjb25zdCBncmlkSCA9IDIgKiBmaXh0dXJlSGVpZ2h0UHg7XHJcblxyXG4gICAgICAgIGNvbnN0IGNlbnRlclggPSBib3VuZHMubGVmdCArIGJvdW5kcy53aWR0aCAvIDI7XHJcbiAgICAgICAgY29uc3QgY2VudGVyWSA9IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC8gMjtcclxuXHJcbiAgICAgICAgY29uc3QgZml0c0luUG9seWdvbiA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT5cclxuICAgICAgICAgIHRoaXMuaXNQb2ludEluc2lkZVBvbHlnb24oeyB4LCB5IH0sIGxheW91dFBvbHlnb24pICYmXHJcbiAgICAgICAgICB0aGlzLmlzUG9pbnRJbnNpZGVQb2x5Z29uKHsgeDogeCArIGdyaWRXLCB5IH0sIGxheW91dFBvbHlnb24pICYmXHJcbiAgICAgICAgICB0aGlzLmlzUG9pbnRJbnNpZGVQb2x5Z29uKHsgeCwgeTogeSArIGdyaWRIIH0sIGxheW91dFBvbHlnb24pICYmXHJcbiAgICAgICAgICB0aGlzLmlzUG9pbnRJbnNpZGVQb2x5Z29uKFxyXG4gICAgICAgICAgICB7IHg6IHggKyBncmlkVywgeTogeSArIGdyaWRIIH0sXHJcbiAgICAgICAgICAgIGxheW91dFBvbHlnb24sXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCBvdmVybGFwc09jY3VwaWVkID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PlxyXG4gICAgICAgICAgb2NjdXBpZWRSZWN0cy5zb21lKChvY2MpID0+XHJcbiAgICAgICAgICAgIHRoaXMucmVjdHNPdmVybGFwKHsgeCwgeSwgdzogZ3JpZFcsIGg6IGdyaWRIIH0sIG9jYyksXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCBzY2FuRm9yQmVzdE9yaWdpbiA9IChza2lwT3ZlcmxhcDogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgbGV0IGJlc3RTY29yZSA9IC1JbmZpbml0eTtcclxuICAgICAgICAgIGxldCBiZXN0UG9zOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcclxuICAgICAgICAgIGNvbnN0IHN0ZXAgPSBmaXh0dXJlV2lkdGhQeCAvIDI7XHJcblxyXG4gICAgICAgICAgZm9yIChcclxuICAgICAgICAgICAgbGV0IHkgPSBib3VuZHMudG9wO1xyXG4gICAgICAgICAgICB5IDw9IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC0gZ3JpZEg7XHJcbiAgICAgICAgICAgIHkgKz0gc3RlcFxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGZvciAoXHJcbiAgICAgICAgICAgICAgbGV0IHggPSBib3VuZHMubGVmdDtcclxuICAgICAgICAgICAgICB4IDw9IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC0gZ3JpZFc7XHJcbiAgICAgICAgICAgICAgeCArPSBzdGVwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIGlmICghZml0c0luUG9seWdvbih4LCB5KSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgaWYgKCFza2lwT3ZlcmxhcCAmJiBvdmVybGFwc09jY3VwaWVkKHgsIHkpKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgZ3JpZFJlY3QgPSB7IHgsIHksIHc6IGdyaWRXLCBoOiBncmlkSCB9O1xyXG4gICAgICAgICAgICAgIGNvbnN0IGVtcHR5TWFyZ2luID0gdGhpcy5jb21wdXRlRW1wdHlNYXJnaW4oXHJcbiAgICAgICAgICAgICAgICBncmlkUmVjdCxcclxuICAgICAgICAgICAgICAgIGJvdW5kcyxcclxuICAgICAgICAgICAgICAgIG9jY3VwaWVkUmVjdHMsXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBjb25zdCBkeCA9IGNlbnRlclggLSAoeCArIGdyaWRXIC8gMik7XHJcbiAgICAgICAgICAgICAgY29uc3QgZHkgPSBjZW50ZXJZIC0gKHkgKyBncmlkSCAvIDIpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHNjb3JlID0gZW1wdHlNYXJnaW4gKiAxMDAwIC0gKGR4ICogZHggKyBkeSAqIGR5KSAqIDAuMDAxO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUpIHtcclxuICAgICAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlO1xyXG4gICAgICAgICAgICAgICAgYmVzdFBvcyA9IHsgeCwgeSB9O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGJlc3RQb3M7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgYmVzdFBvcyA9IHNjYW5Gb3JCZXN0T3JpZ2luKGZhbHNlKSA/P1xyXG4gICAgICAgICAgc2NhbkZvckJlc3RPcmlnaW4odHJ1ZSkgPz8ge1xyXG4gICAgICAgICAgICB4OiBjZW50ZXJYIC0gZ3JpZFcgLyAyLFxyXG4gICAgICAgICAgICB5OiBjZW50ZXJZIC0gZ3JpZEggLyAyLFxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZ3JpZE9yaWdpblggPSBiZXN0UG9zLng7XHJcbiAgICAgICAgZ3JpZE9yaWdpblkgPSBiZXN0UG9zLnk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHggPSBncmlkT3JpZ2luWCArIG5ld0NvbCAqIGZpeHR1cmVXaWR0aFB4O1xyXG4gICAgICBjb25zdCB5ID0gZ3JpZE9yaWdpblkgKyBuZXdSb3cgKiBmaXh0dXJlSGVpZ2h0UHg7XHJcblxyXG4gICAgICBmaXh0dXJlRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLnggPSB0aGlzLmZyb21QaXhlbHMoeCwgXCJmdFwiKTtcclxuICAgICAgZml4dHVyZURhdGEucmVsYXRpdmVQb3NpdGlvbi55ID0gdGhpcy5mcm9tUGl4ZWxzKHksIFwiZnRcIik7XHJcblxyXG4gICAgICAodGhpcy5sYXlvdXRGb3JtLmdldChcImZsb29yRml4dHVyZXNcIikgYXMgRm9ybUFycmF5KS5wdXNoKGZpeHR1cmVHcm91cCk7XHJcbiAgICAgIHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUucHVzaChmaXh0dXJlRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgICB0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9IFwibGF5b3V0XCI7XHJcbiAgICB0aGlzLnVwZGF0ZUZpeHR1cmVDb29yZGluYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgYWRkTmV3T3RoZXJFbGVtZW50cyhwb3NUeXBlOiBcIndhbGxcIiB8IFwiZmxvb3JcIiwgd2FsbEluZGV4PzogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5sYXlvdXRGb3JtLmRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcG9zRGF0YSA9IHtcclxuICAgICAgX2lkOiBgbmV3LSR7Y3J5cHRvLnJhbmRvbVVVSUQoKX1gLFxyXG4gICAgICBmaXh0dXJlTmFtZTogYFBPUyBDb3VudGVyYCxcclxuICAgICAgZml4dHVyZVR5cGU6IFwib3RoZXJcIixcclxuICAgICAgcmVsYXRpdmVQb3NpdGlvbjogeyB4OiAwLCB5OiAwLCBhbmdsZTogMCwgdW5pdDogXCJmdFwiIH0sXHJcbiAgICAgIGZpeHR1cmVTdGF0aWNMZW5ndGg6IHtcclxuICAgICAgICB2YWx1ZTogMyxcclxuICAgICAgICB1bml0OiBcImZ0XCIsXHJcbiAgICAgIH0sXHJcbiAgICAgIGZpeHR1cmVTdGF0aWNXaWR0aDoge1xyXG4gICAgICAgIHZhbHVlOiA1LFxyXG4gICAgICAgIHVuaXQ6IFwiZnRcIixcclxuICAgICAgfSxcclxuICAgIH07XHJcblxyXG4gICAgbGV0IHggPSBwb3NEYXRhLnJlbGF0aXZlUG9zaXRpb24ueDtcclxuICAgIGxldCB5ID0gcG9zRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLnk7XHJcbiAgICBsZXQgYSA9IHBvc0RhdGEucmVsYXRpdmVQb3NpdGlvbi5hbmdsZTtcclxuXHJcbiAgICBjb25zdCBoID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgcG9zRGF0YS5maXh0dXJlU3RhdGljTGVuZ3RoLnZhbHVlLFxyXG4gICAgICBwb3NEYXRhLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICk7XHJcbiAgICBjb25zdCB3ID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgcG9zRGF0YS5maXh0dXJlU3RhdGljV2lkdGgudmFsdWUsXHJcbiAgICAgIHBvc0RhdGEuZml4dHVyZVN0YXRpY1dpZHRoLnVuaXQsXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IG5ld090aGVyR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdHlwZTogW3Bvc0RhdGEuZml4dHVyZU5hbWUgfHwgXCJQT1MgQ291bnRlclwiXSwgLy8gZGVmYXVsdCBzZWxlY3RlZCBsYWJlbFxyXG4gICAgICBjdXN0b21OYW1lOiBbXCJcIl0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAocG9zVHlwZSA9PSBcIndhbGxcIikge1xyXG4gICAgICBjb25zdCB3YWxsRGF0YSA9IHRoaXMuZ2V0V2FsbEJ5TnVtYmVyKHdhbGxJbmRleCEgKyAxKTtcclxuICAgICAgaWYgKHdhbGxEYXRhKSB7XHJcbiAgICAgICAgY29uc3QgeDAgPSB3YWxsRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLng7XHJcbiAgICAgICAgY29uc3QgeTAgPSB3YWxsRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLnk7XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gd2FsbERhdGEuZGlzdGFuY2U7XHJcbiAgICAgICAgY29uc3QgYW5nbGVEZWcgPSB3YWxsRGF0YS5hbmdsZSB8fCAwO1xyXG4gICAgICAgIGNvbnN0IGFuZ2xlUmFkID0gKGFuZ2xlRGVnICogTWF0aC5QSSkgLyAxODA7XHJcblxyXG4gICAgICAgIGNvbnN0IGZ4ID0geDAgKyAobGVuZ3RoIC8gMikgKiBNYXRoLmNvcyhhbmdsZVJhZCk7XHJcbiAgICAgICAgY29uc3QgZnkgPSB5MCArIChsZW5ndGggLyAyKSAqIE1hdGguc2luKGFuZ2xlUmFkKTtcclxuICAgICAgICBjb25zdCBvZmZzZXQgPSAyLjU7XHJcbiAgICAgICAgY29uc3QgZnhfb2Zmc2V0ID0gZnggKyBvZmZzZXQgKiAtTWF0aC5zaW4oYW5nbGVSYWQpO1xyXG4gICAgICAgIGNvbnN0IGZ5X29mZnNldCA9IGZ5ICsgb2Zmc2V0ICogTWF0aC5jb3MoYW5nbGVSYWQpO1xyXG5cclxuICAgICAgICB4ID0gdGhpcy50b1BpeGVscyhmeF9vZmZzZXQsIFwiZnRcIik7XHJcbiAgICAgICAgeSA9IHRoaXMudG9QaXhlbHMoZnlfb2Zmc2V0LCBcImZ0XCIpO1xyXG4gICAgICAgIGEgPSBhbmdsZURlZztcclxuICAgICAgfVxyXG5cclxuICAgICAgT2JqZWN0LmFzc2lnbihwb3NEYXRhLCB7XHJcbiAgICAgICAgYXNzb2NpYXRlZEVsZW1lbnROdW1iZXI6IHdhbGxJbmRleCEgKyAxLFxyXG4gICAgICAgIGFzc29jaWF0ZWRFbGVtZW50VHlwZTogXCJ3YWxsXCIsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgKHRoaXMuZ2V0Rm9ybVdhbGxzLmF0KHdhbGxJbmRleCEpLmdldChcIm90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5KS5wdXNoKFxyXG4gICAgICAgIG5ld090aGVyR3JvdXAsXHJcbiAgICAgICk7XHJcbiAgICAgIHdhbGxEYXRhLm90aGVyRWxlbWVudHMucHVzaCh7IC4uLnBvc0RhdGEsIG5ld0FkZGVkOiB0cnVlIH0pO1xyXG4gICAgfSBlbHNlIGlmIChwb3NUeXBlID09PSBcImZsb29yXCIpIHtcclxuICAgICAgKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vck90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5KS5wdXNoKFxyXG4gICAgICAgIG5ld090aGVyR3JvdXAsXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZmxvb3JEYXRhLm90aGVyRWxlbWVudHMucHVzaCh7IC4uLnBvc0RhdGEsIG5ld0FkZGVkOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlY3RHcm91cCA9IHRoaXMuZHJhd090aGVyRWxlbWVudHNXaXRoTGFiZWwoXHJcbiAgICAgIHRoaXMuY2FudmFzLFxyXG4gICAgICB4LFxyXG4gICAgICB5LFxyXG4gICAgICBhLFxyXG4gICAgICB3LFxyXG4gICAgICBoLFxyXG4gICAgICBwb3NEYXRhLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBtYWtlIGFjdGl2ZVxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5jYW52YXMuc2V0QWN0aXZlT2JqZWN0KHJlY3RHcm91cCk7XHJcbiAgICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICAgIH0gY2F0Y2gge31cclxuXHJcbiAgICB0aGlzLnN1YnNjcmliZVRvT3RoZXJFbGVtZW50c0NoYW5nZXMoKTtcclxuICAgIHRoaXMudXBkYXRlT3RoZXJFbGVtZW50c0Nvb3JkaW5hdGVzKCk7XHJcbiAgfVxyXG5cclxuICBmaW5kRW1wdHlDZW50ZXJTcG90KFxyXG4gICAgb2JqZWN0V2lkdGhQeDogbnVtYmVyLFxyXG4gICAgb2JqZWN0SGVpZ2h0UHg6IG51bWJlcixcclxuICAgIHRlbXBPY2N1cGllZDoge1xyXG4gICAgICB4OiBudW1iZXI7XHJcbiAgICAgIHk6IG51bWJlcjtcclxuICAgICAgd2lkdGg6IG51bWJlcjtcclxuICAgICAgaGVpZ2h0OiBudW1iZXI7XHJcbiAgICB9W10gPSBbXSxcclxuICApIHtcclxuICAgIGNvbnN0IG9iamVjdHMgPSB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCk7XHJcbiAgICBjb25zdCBDRU5URVJfT0ZGU0VUX1ggPSAtMzAwO1xyXG4gICAgY29uc3QgQ0VOVEVSX09GRlNFVF9ZID0gMDtcclxuICAgIGNvbnN0IGJvdW5kcyA9IHRoaXMuZ2V0RnVsbExheW91dEJvdW5kcygpO1xyXG5cclxuICAgIGNvbnN0IGNlbnRlclggPSBib3VuZHMubGVmdCArIGJvdW5kcy53aWR0aCAvIDIgKyBDRU5URVJfT0ZGU0VUX1g7XHJcblxyXG4gICAgY29uc3QgY2VudGVyWSA9IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC8gMiArIENFTlRFUl9PRkZTRVRfWTtcclxuXHJcbiAgICAvLyAyLiBTcGlyYWwgc2VhcmNoIHBhcmFtZXRlcnNcclxuICAgIGNvbnN0IHN0ZXAgPSAyMDtcclxuICAgIGNvbnN0IG1heFJhZGl1cyA9IE1hdGgubWF4KGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7XHJcblxyXG4gICAgZm9yIChsZXQgcmFkaXVzID0gMDsgcmFkaXVzIDwgbWF4UmFkaXVzOyByYWRpdXMgKz0gc3RlcCkge1xyXG4gICAgICBmb3IgKGxldCBhbmdsZSA9IDA7IGFuZ2xlIDwgMzYwOyBhbmdsZSArPSAzMCkge1xyXG4gICAgICAgIGNvbnN0IHJhZCA9IChhbmdsZSAqIE1hdGguUEkpIC8gMTgwO1xyXG5cclxuICAgICAgICAvLyDwn5SnIEZJWDogY2VudGVyIOKGkiB0b3AtbGVmdFxyXG4gICAgICAgIGNvbnN0IHggPSBjZW50ZXJYICsgcmFkaXVzICogTWF0aC5jb3MocmFkKSAtIG9iamVjdFdpZHRoUHggLyAyO1xyXG4gICAgICAgIGNvbnN0IHkgPSBjZW50ZXJZICsgcmFkaXVzICogTWF0aC5zaW4ocmFkKSAtIG9iamVjdEhlaWdodFB4IC8gMjtcclxuXHJcbiAgICAgICAgY29uc3QgdGVzdFJlY3QgPSB7XHJcbiAgICAgICAgICBsZWZ0OiB4LFxyXG4gICAgICAgICAgdG9wOiB5LFxyXG4gICAgICAgICAgd2lkdGg6IG9iamVjdFdpZHRoUHgsXHJcbiAgICAgICAgICBoZWlnaHQ6IG9iamVjdEhlaWdodFB4LFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIDMuIENoZWNrIGNvbGxpc2lvbiB3aXRoIGV4aXN0aW5nIGNhbnZhcyBvYmplY3RzXHJcbiAgICAgICAgY29uc3QgY2FudmFzQ29sbGlzaW9uID0gb2JqZWN0cy5zb21lKChvYmopID0+IHtcclxuICAgICAgICAgIGNvbnN0IHJlY3QgPSBvYmouZ2V0Qm91bmRpbmdSZWN0KCk7XHJcbiAgICAgICAgICByZXR1cm4gIShcclxuICAgICAgICAgICAgcmVjdC5sZWZ0ID4gdGVzdFJlY3QubGVmdCArIHRlc3RSZWN0LndpZHRoIHx8XHJcbiAgICAgICAgICAgIHJlY3QubGVmdCArIHJlY3Qud2lkdGggPCB0ZXN0UmVjdC5sZWZ0IHx8XHJcbiAgICAgICAgICAgIHJlY3QudG9wID4gdGVzdFJlY3QudG9wICsgdGVzdFJlY3QuaGVpZ2h0IHx8XHJcbiAgICAgICAgICAgIHJlY3QudG9wICsgcmVjdC5oZWlnaHQgPCB0ZXN0UmVjdC50b3BcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChjYW52YXNDb2xsaXNpb24pIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAvLyA0LiBDaGVjayBjb2xsaXNpb24gd2l0aCB0ZW1wIHBsYWNlZCBmaXh0dXJlcyAoQ0FEIGJhdGNoKVxyXG4gICAgICAgIGNvbnN0IHRlbXBDb2xsaXNpb24gPSB0ZW1wT2NjdXBpZWQuc29tZSgobykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuICEoXHJcbiAgICAgICAgICAgIG8ueCA+IHRlc3RSZWN0LmxlZnQgKyB0ZXN0UmVjdC53aWR0aCB8fFxyXG4gICAgICAgICAgICBvLnggKyBvLndpZHRoIDwgdGVzdFJlY3QubGVmdCB8fFxyXG4gICAgICAgICAgICBvLnkgPiB0ZXN0UmVjdC50b3AgKyB0ZXN0UmVjdC5oZWlnaHQgfHxcclxuICAgICAgICAgICAgby55ICsgby5oZWlnaHQgPCB0ZXN0UmVjdC50b3BcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh0ZW1wQ29sbGlzaW9uKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHsgeCwgeSB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjYW5jZWxFZGl0KCkge1xyXG4gICAgdGhpcy5oaWdobGlnaHRlZEZpeHR1cmVGb3JtSWQgPSBudWxsO1xyXG4gICAgYXdhaXQgdGhpcy5nZXRTdG9yZUZpeHR1cmVzKHRoaXMucGxhbm9EYXRhLl9pZCk7XHJcbiAgfVxyXG5cclxuICBsaXN0ZW5Ub0RlbGV0ZUtleSgpIHtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChlKSA9PiB7XHJcbiAgICAgIGlmIChlLmtleSA9PT0gXCJEZWxldGVcIiAmJiB0aGlzLmxheW91dEZvcm0uZW5hYmxlZCkge1xyXG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuY2FudmFzPy5nZXRBY3RpdmVPYmplY3QoKSBhcyBhbnk7XHJcblxyXG4gICAgICAgIGlmIChhY3RpdmUgJiYgKGFjdGl2ZSBhcyBhbnkpLm9ialR5cGUgPT09IFwiZW50cmFuY2VcIikge1xyXG4gICAgICAgICAgdGhpcy5kZWxldGVFbnRyYW5jZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFjdGl2ZSAmJiAoYWN0aXZlIGFzIGFueSkub2JqVHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICAgIGlmIChhY3RpdmU/LmRhdGE/LmVsZW1lbnROdW1iZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5kZWxldGVXYWxsKGFjdGl2ZT8uZGF0YT8uZWxlbWVudE51bWJlcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYWN0aXZlICYmIChhY3RpdmUgYXMgYW55KS5vYmpUeXBlID09PSBcImZpeHR1cmVcIikge1xyXG4gICAgICAgICAgaWYgKGFjdGl2ZT8uZml4dHVyZVR5cGUpIHtcclxuICAgICAgICAgICAgdGhpcy5kZWxldGVGaXh0dXJlKFxyXG4gICAgICAgICAgICAgIGFjdGl2ZT8uZml4dHVyZVR5cGUsXHJcbiAgICAgICAgICAgICAgYWN0aXZlPy5maXh0dXJlSW5kZXggLSAxLFxyXG4gICAgICAgICAgICAgIGFjdGl2ZT8ud2FsbEluZGV4IC0gMSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlRW50cmFuY2UoKSB7XHJcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmNhbnZhcy5nZXRBY3RpdmVPYmplY3QoKSBhcyBhbnk7XHJcblxyXG4gICAgaWYgKGFjdGl2ZSAmJiBhY3RpdmUub2JqVHlwZSA9PT0gXCJlbnRyYW5jZVwiKSB7XHJcbiAgICAgIGNvbnN0IGkgPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZpbmRJbmRleChcclxuICAgICAgICAoZWw6IGFueSkgPT5cclxuICAgICAgICAgIGVsLmVsZW1lbnRUeXBlID09PSBcImVudHJhbmNlXCIgJiZcclxuICAgICAgICAgIGVsLmVsZW1lbnROdW1iZXIgPT09IGFjdGl2ZS5kYXRhLmVsZW1lbnROdW1iZXIsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoaSA+PSAwKSB7XHJcbiAgICAgICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJGbG9vcih0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBkZWxldGVXYWxsKGVsZU51bWJlcjogbnVtYmVyKSB7XHJcbiAgICBjb25zdCB3YWxsID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5maW5kKFxyXG4gICAgICAoZWxlOiBhbnkpID0+XHJcbiAgICAgICAgZWxlLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiBlbGUuZWxlbWVudE51bWJlciA9PT0gZWxlTnVtYmVyLFxyXG4gICAgKTtcclxuICAgIGlmICh3YWxsLmZpeHR1cmVzLmxlbmd0aCB8fCB3YWxsLm90aGVyRWxlbWVudHMubGVuZ3RoKVxyXG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmNvbmZpcm1EZWxldGVXYWxsKCkpKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgaSA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZmluZEluZGV4KFxyXG4gICAgICAoZWw6IGFueSkgPT4gZWwuZWxlbWVudFR5cGUgPT09IFwid2FsbFwiICYmIGVsLmVsZW1lbnROdW1iZXIgPT09IGVsZU51bWJlcixcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5zcGxpY2UoaSwgMSk7XHJcbiAgICB0aGlzLnVwZGF0ZVdhbGxFbGVtZW50TnVtYmVyKCk7XHJcbiAgICB0aGlzLnJlbmRlckZsb29yKHRydWUpO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVXYWxsRWxlbWVudE51bWJlcigpIHtcclxuICAgIGNvbnN0IG9ubHlXYWxscyA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24/LmZpbHRlcihcclxuICAgICAgKGVsOiBhbnkpID0+IGVsLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIixcclxuICAgICk7XHJcblxyXG4gICAgb25seVdhbGxzPy5mb3JFYWNoKChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgaXRlbS5lbGVtZW50TnVtYmVyID0gaW5kZXggKyAxO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b1BpeGVscyh2YWx1ZTogbnVtYmVyLCB1bml0OiBzdHJpbmcsIGRwaSA9IDIuOCkge1xyXG4gICAgbGV0IHBpeGVsczogbnVtYmVyO1xyXG5cclxuICAgIGlmICh1bml0ID09PSBcIm1tXCIpIHtcclxuICAgICAgcGl4ZWxzID0gKHZhbHVlIC8gMjUuNCkgKiBkcGk7XHJcbiAgICB9IGVsc2UgaWYgKHVuaXQgPT09IFwiZnRcIikge1xyXG4gICAgICBwaXhlbHMgPSB2YWx1ZSAqIDEyICogZHBpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgdW5pdC4gVXNlICdtbScgb3IgJ2Z0Jy5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIE51bWJlcihwaXhlbHMudG9GaXhlZCg0KSk7XHJcbiAgfVxyXG5cclxuICBmcm9tUGl4ZWxzKHBpeGVsczogbnVtYmVyLCB1bml0OiBzdHJpbmcsIGRwaSA9IDIuOCk6IG51bWJlciB7XHJcbiAgICBsZXQgdmFsdWU6IG51bWJlcjtcclxuXHJcbiAgICAvLyBwaXhlbHMgPSBwaXhlbHMgPj0gdGhpcy53YWxsVGhpY2tuZXNzID8gcGl4ZWxzIC0gdGhpcy53YWxsVGhpY2tuZXNzIDogdGhpcy53YWxsVGhpY2tuZXNzO1xyXG5cclxuICAgIGlmICh1bml0ID09PSBcIm1tXCIpIHtcclxuICAgICAgdmFsdWUgPSAocGl4ZWxzIC8gZHBpKSAqIDI1LjQ7XHJcbiAgICB9IGVsc2UgaWYgKHVuaXQgPT09IFwiZnRcIikge1xyXG4gICAgICB2YWx1ZSA9IHBpeGVscyAvICgxMiAqIGRwaSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCB1bml0LiBVc2UgJ21tJyBvciAnZnQnLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlLnRvRml4ZWQoNCkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY29uZmlybUVkaXQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oTGF5b3V0RWRpdENvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGF3YWl0IG1vZGVsUmVmLnJlc3VsdC50aGVuPGJvb2xlYW4+KChyZXN1bHQpID0+IHJlc3VsdCA9PT0gXCJva1wiKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1EZWxldGVXYWxsKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gXCJEZWxldGUgd2FsbFwiO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9XHJcbiAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgd2FsbCBhbG9uZyB3aXRoIGl0cyBhc3NvY2lhdGVkIGZpeHR1cmVzIGFuZCBlbGVtZW50cz9cIjtcclxuXHJcbiAgICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09IFwib2tcIik7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGaXh0dXJlQ29vcmRpbmF0ZXMoZml4dHVyZXM/OiBhbnkpIHtcclxuICAgIGNvbnN0IGZpeHR1cmVzRnJvbUNhbnZhcyA9XHJcbiAgICAgIGZpeHR1cmVzID8/XHJcbiAgICAgIHRoaXMuY2FudmFzXHJcbiAgICAgICAgLmdldE9iamVjdHMoKVxyXG4gICAgICAgIC5maWx0ZXIoKG9iaikgPT4gKG9iaiBhcyBhbnkpLmZpeHR1cmVJZClcclxuICAgICAgICAubWFwKChvYmopID0+ICh7XHJcbiAgICAgICAgICBpZDogKG9iaiBhcyBhbnkpLmZpeHR1cmVJZCxcclxuICAgICAgICAgIHg6IG9iai5sZWZ0LFxyXG4gICAgICAgICAgeTogb2JqLnRvcCxcclxuICAgICAgICAgIGFuZ2xlOiBvYmo/LmFuZ2xlID8/IDAsXHJcbiAgICAgICAgfSkpO1xyXG4gICAgY29uc3QgcG9zTWFwID0gbmV3IE1hcCgpO1xyXG5cclxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlc0Zyb21DYW52YXMpIHtcclxuICAgICAgcG9zTWFwLnNldChmaXh0dXJlLmlkLCB7XHJcbiAgICAgICAgeDogdGhpcy5mcm9tUGl4ZWxzKGZpeHR1cmUueCwgXCJmdFwiKSxcclxuICAgICAgICB5OiB0aGlzLmZyb21QaXhlbHMoZml4dHVyZS55LCBcImZ0XCIpLFxyXG4gICAgICAgIGFuZ2xlOiBmaXh0dXJlLmFuZ2xlLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlLmZvckVhY2goKGNmOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgbGF0ZXN0Rml4dHVyZVBvcyA9IHBvc01hcC5nZXQoY2YuX2lkKTtcclxuICAgICAgaWYgKGxhdGVzdEZpeHR1cmVQb3MpIHtcclxuICAgICAgICBjZi5yZWxhdGl2ZVBvc2l0aW9uLnggPSBsYXRlc3RGaXh0dXJlUG9zLng7XHJcbiAgICAgICAgY2YucmVsYXRpdmVQb3NpdGlvbi55ID0gbGF0ZXN0Rml4dHVyZVBvcy55O1xyXG4gICAgICAgIGNmLnJlbGF0aXZlUG9zaXRpb24uYW5nbGUgPSBsYXRlc3RGaXh0dXJlUG9zLmFuZ2xlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKHc6IGFueSkgPT4ge1xyXG4gICAgICB3Py5maXh0dXJlcz8uZm9yRWFjaCgod2Y6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEZpeHR1cmVQb3MgPSBwb3NNYXAuZ2V0KHdmLl9pZCk7XHJcbiAgICAgICAgaWYgKGxhdGVzdEZpeHR1cmVQb3MpIHtcclxuICAgICAgICAgIHdmLnJlbGF0aXZlUG9zaXRpb24ueCA9IGxhdGVzdEZpeHR1cmVQb3MueDtcclxuICAgICAgICAgIHdmLnJlbGF0aXZlUG9zaXRpb24ueSA9IGxhdGVzdEZpeHR1cmVQb3MueTtcclxuICAgICAgICAgIHdmLnJlbGF0aXZlUG9zaXRpb24uYW5nbGUgPSBsYXRlc3RGaXh0dXJlUG9zLmFuZ2xlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZU90aGVyRWxlbWVudHNDb29yZGluYXRlcygpIHtcclxuICAgIGNvbnN0IG90aGVyc0Zyb21DYW52YXMgPSB0aGlzLmNhbnZhc1xyXG4gICAgICAuZ2V0T2JqZWN0cygpXHJcbiAgICAgIC5maWx0ZXIoKG9iaikgPT4gKG9iaiBhcyBhbnkpLm9ialR5cGUgPT09IFwib3RoZXJzXCIpXHJcbiAgICAgIC5tYXAoKG9iaikgPT4gKHtcclxuICAgICAgICBpZDogKG9iaiBhcyBhbnkpLmRhdGE/Ll9pZCxcclxuICAgICAgICBsYWJlbDogKG9iaiBhcyBhbnkpLmRhdGE/LmZpeHR1cmVOYW1lLFxyXG4gICAgICAgIHg6IG9iai5sZWZ0LFxyXG4gICAgICAgIHk6IG9iai50b3AsXHJcbiAgICAgICAgYW5nbGU6IG9iaj8uYW5nbGUgPz8gMCxcclxuICAgICAgICB3aWR0aDogdGhpcy5mcm9tUGl4ZWxzKG9iai5nZXRTY2FsZWRXaWR0aCgpIC0gMiwgXCJmdFwiKSxcclxuICAgICAgICBoZWlnaHQ6IHRoaXMuZnJvbVBpeGVscyhvYmouZ2V0U2NhbGVkSGVpZ2h0KCkgLSAyLCBcImZ0XCIpLFxyXG4gICAgICB9KSk7XHJcblxyXG4gICAgY29uc3QgcG9zTWFwID0gbmV3IE1hcDxcclxuICAgICAgc3RyaW5nLFxyXG4gICAgICB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBhbmdsZTogbnVtYmVyOyBoOiBudW1iZXI7IHc6IG51bWJlciB9XHJcbiAgICA+KCk7XHJcbiAgICBmb3IgKGNvbnN0IG90aGVyIG9mIG90aGVyc0Zyb21DYW52YXMpIHtcclxuICAgICAgaWYgKG90aGVyLmlkKSB7XHJcbiAgICAgICAgcG9zTWFwLnNldChvdGhlci5pZCwge1xyXG4gICAgICAgICAgeDogdGhpcy5mcm9tUGl4ZWxzKG90aGVyLngsIFwiZnRcIiksXHJcbiAgICAgICAgICB5OiB0aGlzLmZyb21QaXhlbHMob3RoZXIueSwgXCJmdFwiKSxcclxuICAgICAgICAgIGFuZ2xlOiBvdGhlci5hbmdsZSxcclxuICAgICAgICAgIGg6IG90aGVyLmhlaWdodCxcclxuICAgICAgICAgIHc6IG90aGVyLndpZHRoLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5mbG9vckRhdGEub3RoZXJFbGVtZW50cykpIHtcclxuICAgICAgdGhpcy5mbG9vckRhdGEub3RoZXJFbGVtZW50cy5mb3JFYWNoKChlbDogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGF0ZXN0T3RoZXJzUG9zID0gcG9zTWFwLmdldChlbC5faWQpO1xyXG4gICAgICAgIGlmIChsYXRlc3RPdGhlcnNQb3MpIHtcclxuICAgICAgICAgIGVsLnJlbGF0aXZlUG9zaXRpb24ueCA9IGxhdGVzdE90aGVyc1Bvcy54O1xyXG4gICAgICAgICAgZWwucmVsYXRpdmVQb3NpdGlvbi55ID0gbGF0ZXN0T3RoZXJzUG9zLnk7XHJcbiAgICAgICAgICBlbC5yZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlID0gbGF0ZXN0T3RoZXJzUG9zLmFuZ2xlO1xyXG4gICAgICAgICAgZWwuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSA9IGxhdGVzdE90aGVyc1Bvcy5oO1xyXG4gICAgICAgICAgZWwuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlID0gbGF0ZXN0T3RoZXJzUG9zLnc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKHc6IGFueSkgPT4ge1xyXG4gICAgICB3Py5vdGhlckVsZW1lbnRzPy5mb3JFYWNoKCh3ZjogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGF0ZXN0T3RoZXJzUG9zID0gcG9zTWFwLmdldCh3Zi5faWQpO1xyXG4gICAgICAgIGlmIChsYXRlc3RPdGhlcnNQb3MpIHtcclxuICAgICAgICAgIHdmLnJlbGF0aXZlUG9zaXRpb24ueCA9IGxhdGVzdE90aGVyc1Bvcy54O1xyXG4gICAgICAgICAgd2YucmVsYXRpdmVQb3NpdGlvbi55ID0gbGF0ZXN0T3RoZXJzUG9zLnk7XHJcbiAgICAgICAgICB3Zi5yZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlID0gbGF0ZXN0T3RoZXJzUG9zLmFuZ2xlO1xyXG4gICAgICAgICAgd2YuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSA9IGxhdGVzdE90aGVyc1Bvcy5oO1xyXG4gICAgICAgICAgd2YuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlID0gbGF0ZXN0T3RoZXJzUG9zLnc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlV2FsbENvb3JkaW5hdGVzKCkge1xyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY2FudmFzXHJcbiAgICAgIC5nZXRPYmplY3RzKClcclxuICAgICAgLmZpbHRlcigob2JqKSA9PiAob2JqIGFzIGFueSkub2JqVHlwZSA9PT0gXCJ3YWxsXCIpXHJcbiAgICAgIC5tYXAoKG9iaikgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICB0b3A6IHRoaXMuZnJvbVBpeGVscyhvYmoudG9wLCBcImZ0XCIpLFxyXG4gICAgICAgICAgbGVmdDogdGhpcy5mcm9tUGl4ZWxzKG9iai5sZWZ0LCBcImZ0XCIpLFxyXG4gICAgICAgICAgd2lkdGg6IHRoaXMuZnJvbVBpeGVscyhvYmouZ2V0U2NhbGVkV2lkdGgoKSAtIDAuMjcsIFwiZnRcIiksXHJcbiAgICAgICAgICBoZWlnaHQ6IHRoaXMuZnJvbVBpeGVscyhvYmouZ2V0U2NhbGVkSGVpZ2h0KCkgLSAwLjI3LCBcImZ0XCIpLFxyXG4gICAgICAgICAgYW5nbGU6IG9iai5hbmdsZSxcclxuICAgICAgICAgIGVsZW1lbnREYXRhOiAob2JqIGFzIGFueSkuZGF0YSxcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBjb25zdCBwb3NNYXAgPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgZm9yIChjb25zdCB3YWxsIG9mIGRhdGEpIHtcclxuICAgICAgcG9zTWFwLnNldChcclxuICAgICAgICBgJHt3YWxsLmVsZW1lbnREYXRhLmVsZW1lbnRUeXBlfSR7d2FsbC5lbGVtZW50RGF0YS5lbGVtZW50TnVtYmVyfWAsXHJcbiAgICAgICAgZGF0YS5maW5kKFxyXG4gICAgICAgICAgKG9iaikgPT5cclxuICAgICAgICAgICAgb2JqLmVsZW1lbnREYXRhLmVsZW1lbnRUeXBlID09PSB3YWxsLmVsZW1lbnREYXRhLmVsZW1lbnRUeXBlICYmXHJcbiAgICAgICAgICAgIG9iai5lbGVtZW50RGF0YS5lbGVtZW50TnVtYmVyID09PSB3YWxsLmVsZW1lbnREYXRhLmVsZW1lbnROdW1iZXIsXHJcbiAgICAgICAgKSxcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKHc6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCB3YWxsUG9zID0gcG9zTWFwLmdldChgJHt3LmVsZW1lbnRUeXBlfSR7dy5lbGVtZW50TnVtYmVyfWApO1xyXG4gICAgICBpZiAod2FsbFBvcykge1xyXG4gICAgICAgIHcucmVsYXRpdmVQb3NpdGlvbi54ID0gd2FsbFBvcy5sZWZ0O1xyXG4gICAgICAgIHcucmVsYXRpdmVQb3NpdGlvbi55ID0gd2FsbFBvcy50b3A7XHJcbiAgICAgICAgdy5hbmdsZSA9IHdhbGxQb3MuYW5nbGU7XHJcbiAgICAgICAgdy5kaXN0YW5jZSA9IHdhbGxQb3Mud2lkdGg7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlRW50cmFuY2VDb29yZGluYXRlcygpIHtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNhbnZhc1xyXG4gICAgICAuZ2V0T2JqZWN0cygpXHJcbiAgICAgIC5maWx0ZXIoKG9iaikgPT4gKG9iaiBhcyBhbnkpLm9ialR5cGUgPT09IFwiZW50cmFuY2VcIilcclxuICAgICAgLm1hcCgob2JqKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHRvcDogdGhpcy5mcm9tUGl4ZWxzKG9iai50b3AsIFwiZnRcIiksXHJcbiAgICAgICAgICBsZWZ0OiB0aGlzLmZyb21QaXhlbHMob2JqLmxlZnQsIFwiZnRcIiksXHJcbiAgICAgICAgICB3aWR0aDogdGhpcy5mcm9tUGl4ZWxzKG9iai5nZXRTY2FsZWRXaWR0aCgpLCBcImZ0XCIpLFxyXG4gICAgICAgICAgYW5nbGU6IG9iai5hbmdsZSxcclxuICAgICAgICAgIGVsZW1lbnREYXRhOiAob2JqIGFzIGFueSkuZGF0YSxcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBjb25zdCBwb3NNYXAgPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgZm9yIChjb25zdCBlbnRyYW5jZSBvZiBkYXRhKSB7XHJcbiAgICAgIHBvc01hcC5zZXQoXHJcbiAgICAgICAgYCR7ZW50cmFuY2UuZWxlbWVudERhdGEuZWxlbWVudFR5cGV9JHtlbnRyYW5jZS5lbGVtZW50RGF0YS5lbGVtZW50TnVtYmVyfWAsXHJcbiAgICAgICAgZGF0YS5maW5kKFxyXG4gICAgICAgICAgKG9iaikgPT5cclxuICAgICAgICAgICAgb2JqLmVsZW1lbnREYXRhLmVsZW1lbnRUeXBlID09PSBlbnRyYW5jZS5lbGVtZW50RGF0YS5lbGVtZW50VHlwZSAmJlxyXG4gICAgICAgICAgICBvYmouZWxlbWVudERhdGEuZWxlbWVudE51bWJlciA9PT1cclxuICAgICAgICAgICAgICBlbnRyYW5jZS5lbGVtZW50RGF0YS5lbGVtZW50TnVtYmVyLFxyXG4gICAgICAgICksXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5mb3JFYWNoKCh3OiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgZW50cmFuY2VQb3MgPSBwb3NNYXAuZ2V0KGAke3cuZWxlbWVudFR5cGV9JHt3LmVsZW1lbnROdW1iZXJ9YCk7XHJcbiAgICAgIGlmIChlbnRyYW5jZVBvcykge1xyXG4gICAgICAgIHcucmVsYXRpdmVQb3NpdGlvbi54ID0gZW50cmFuY2VQb3MubGVmdDtcclxuICAgICAgICB3LnJlbGF0aXZlUG9zaXRpb24ueSA9IGVudHJhbmNlUG9zLnRvcDtcclxuICAgICAgICB3LmFuZ2xlID0gZW50cmFuY2VQb3MuYW5nbGU7XHJcbiAgICAgICAgdy5kaXN0YW5jZSA9IGVudHJhbmNlUG9zLndpZHRoO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZUxheW91dChlZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBpZiAoZWRpdE1vZGUpIHtcclxuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jb25maXJtRWRpdCgpKSkge1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWRQdWJsaXNoID0gdGhpcy50YXNrSW5mby5kaXNhYmxlZDtcclxuICAgICAgICB0aGlzLmxheW91dEZvcm0uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnRhc2tTdHlsZS5maXh0dXJlLmNsYXNzID09IFwicmV2aWV3UGVuZGluZ1wiKSB7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZFB1Ymxpc2ggPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJmaXh0dXJlXCI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBlbGVtZW50LmZpeHR1cmVzID0gZWxlbWVudC5maXh0dXJlcy5maWx0ZXIoXHJcbiAgICAgICAgKGZpeHR1cmU6IGFueSkgPT4gIWZpeHR1cmU/Lmdob3N0ICYmIGZpeHR1cmUuZml4dHVyZU5hbWUgIT09IFwic3BhY2VcIixcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZSA9IHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmVcclxuICAgICAgLmZpbHRlcigoZml4dHVyZTogYW55KSA9PiAhZml4dHVyZT8uZ2hvc3QpXHJcbiAgICAgIC5tYXAoKGZpeHR1cmU6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgYXNzb2NpYXRlZEVsZW1lbnRUeXBlLCBhc3NvY2lhdGVkRWxlbWVudE51bWJlciwgLi4ucmVzdCB9ID1cclxuICAgICAgICAgIGZpeHR1cmU7XHJcbiAgICAgICAgcmV0dXJuIHJlc3Q7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5yZW9yZGVyRml4dHVyZSh0aGlzLmZsb29yRGF0YSk7XHJcblxyXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICBkYXRhOiB0aGlzLmZsb29yRGF0YSxcclxuICAgICAgZWRpdE1vZGU6IGVkaXRNb2RlLFxyXG4gICAgICAvLyBMYXlvdXQgZWRpdHMgaW52YWxpZGF0ZSBkb3duc3RyZWFtIHZlcmlmaWNhdGlvbnMgKGZpeHR1cmUsIFZNLCB6b25lKSwgc28gYW55XHJcbiAgICAgIC8vIGxheW91dC1lZGl0IHNhdmUgc2hvdWxkIHRyaWdnZXIgdGhlIEJFJ3MgcmV2ZXJ0T25FZGl0IGNsZWFudXAuIFRoZSBCRSdzXHJcbiAgICAgIC8vIGRlbGV0ZU1hbnkgaXMgaWRlbXBvdGVudCDigJQgaWYgbm8gZGVwZW5kZW50IHRhc2tzIGV4aXN0LCBub3RoaW5nIGhhcHBlbnMuXHJcbiAgICAgIHJldmVydE9uRWRpdDogZWRpdE1vZGUgPT09IHRydWUsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuaXNTYXZpbmdMYXlvdXQgPSB0cnVlO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLnVwZGF0ZVN0b3JlUGxhbm8ocGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlcykgPT4ge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgICAgIHRoaXMuZ2V0U3RvcmVGaXh0dXJlcyh0aGlzLnBsYW5vRGF0YS5faWQpO1xyXG4gICAgICAgIHRoaXMuaXNTYXZpbmdMYXlvdXQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxheW91dEhhc1Vuc2F2ZWRDaGFuZ2VzID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byB1cGRhdGUgbGF5b3V0XCIpO1xyXG4gICAgICAgIHRoaXMuaXNTYXZpbmdMYXlvdXQgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYXNzaWduVGFzaygpIHtcclxuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcclxuICAgICAgcmVkbzogZmFsc2UsXHJcbiAgICAgIGNoZWNrTGlzdE5hbWU6IFwiXCIsXHJcbiAgICAgIHN0b3JlOiB0aGlzLnBsYW5vRGF0YS5zdG9yZU5hbWUsXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLnBsYW5vRGF0YS5jbGllbnRJZCxcclxuICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5wdWJsaXNoaW5nU3RhdGUgPT09IFwibGF5b3V0XCIpIHtcclxuICAgICAgcGF5bG9hZC5jaGVja0xpc3ROYW1lID0gXCJMYXlvdXQgVmVyaWZpY2F0aW9uXCI7XHJcbiAgICAgIHBheWxvYWQucmVkbyA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJsYXlvdXQtcmVkb1wiKSB7XHJcbiAgICAgIHBheWxvYWQuY2hlY2tMaXN0TmFtZSA9IFwiTGF5b3V0IFZlcmlmaWNhdGlvblwiO1xyXG4gICAgICBwYXlsb2FkLnJlZG8gPSB0cnVlO1xyXG4gICAgICBwYXlsb2FkLnRhc2tJZCA9XHJcbiAgICAgICAgdGhpcy5zdG9yZUZlZWRiYWNrLmxheW91dERhdGFbXHJcbiAgICAgICAgICB0aGlzLnN0b3JlRmVlZGJhY2subGF5b3V0RGF0YS5sZW5ndGggLSAxXHJcbiAgICAgICAgXS50YXNrSWQ7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMucHVibGlzaGluZ1N0YXRlID09PSBcImZpeHR1cmVcIikge1xyXG4gICAgICBwYXlsb2FkLmNoZWNrTGlzdE5hbWUgPSBcIkZpeHR1cmUgVmVyaWZpY2F0aW9uXCI7XHJcbiAgICAgIHBheWxvYWQucmVkbyA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJmaXh0dXJlLXJlZG9cIikge1xyXG4gICAgICBwYXlsb2FkLmNoZWNrTGlzdE5hbWUgPSBcIkZpeHR1cmUgVmVyaWZpY2F0aW9uXCI7XHJcbiAgICAgIHBheWxvYWQucmVkbyA9IHRydWU7XHJcbiAgICAgIHBheWxvYWQudGFza0lkID1cclxuICAgICAgICB0aGlzLnN0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbXHJcbiAgICAgICAgICB0aGlzLnN0b3JlRmVlZGJhY2suZml4dHVyZURhdGEubGVuZ3RoIC0gMVxyXG4gICAgICAgIF0udGFza0lkO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJ2bVwiKSB7XHJcbiAgICAgIHBheWxvYWQuY2hlY2tMaXN0TmFtZSA9IFwiVk0gVmVyaWZpY2F0aW9uXCI7XHJcbiAgICAgIHBheWxvYWQucmVkbyA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJ2bS1yZWRvXCIpIHtcclxuICAgICAgcGF5bG9hZC5jaGVja0xpc3ROYW1lID0gXCJWTSBWZXJpZmljYXRpb25cIjtcclxuICAgICAgcGF5bG9hZC5yZWRvID0gdHJ1ZTtcclxuICAgICAgcGF5bG9hZC50YXNrSWQgPVxyXG4gICAgICAgIHRoaXMuc3RvcmVGZWVkYmFjay5WbURhdGFbdGhpcy5zdG9yZUZlZWRiYWNrLlZtRGF0YS5sZW5ndGggLSAxXS50YXNrSWQ7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3VsdDtcclxuXHJcbiAgICBpZiAodGhpcy5wdWJsaXNoaW5nU3RhdGUgPT09IFwiZml4dHVyZVwiKSB7XHJcbiAgICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihTY2hlZHVsZVRhc2tQb3B1cENvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICAgIHNpemU6IFwibWRcIixcclxuICAgICAgICBzY3JvbGxhYmxlOiB0cnVlLFxyXG4gICAgICAgIGJhY2tkcm9wOiBcInN0YXRpY1wiLFxyXG4gICAgICAgIHdpbmRvd0NsYXNzOiBcInNjaGVkdWxlLXRhc2stbW9kYWxcIixcclxuICAgICAgfSk7XHJcbiAgICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnR5cGUgPSB0aGlzLnB1Ymxpc2hpbmdTdGF0ZTtcclxuICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2Uuc3RvcmVOYW1lID0gdGhpcy5wbGFub0RhdGE/LnN0b3JlTmFtZTtcclxuICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZml4dHVyZXMgPSB0aGlzLmFsbEZpeHR1cmVJbnN0YW5jZXM7XHJcblxyXG4gICAgICByZXN1bHQgPSBhd2FpdCBtb2RhbFJlZi5yZXN1bHQ7XHJcblxyXG4gICAgICBpZiAocmVzdWx0Py5zY2hlZHVsZWREYXRlKSB7XHJcbiAgICAgICAgcGF5bG9hZC5zY2hlZHVsZWREYXRlID0gcmVzdWx0LnNjaGVkdWxlZERhdGU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihQdWJsaXNoVGFza1BvcHVwQ29tcG9uZW50LCB7XHJcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgICAgc2l6ZTogXCJtZFwiLFxyXG4gICAgICAgIHNjcm9sbGFibGU6IHRydWUsXHJcbiAgICAgICAgYmFja2Ryb3A6IFwic3RhdGljXCIsXHJcbiAgICAgICAgd2luZG93Q2xhc3M6IFwiY3VzdG9tLWhlaWdodC1tb2RhbFwiLFxyXG4gICAgICB9KTtcclxuICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudHlwZSA9IHRoaXMucHVibGlzaGluZ1N0YXRlO1xyXG4gICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnB1dERhdGEgPSBwYXlsb2FkO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCBtb2RhbFJlZi5yZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwic3VibWl0XCIpIHtcclxuICAgICAgbGV0IHRhc2tUeXBlID0gdGhpcy5wdWJsaXNoaW5nU3RhdGU7XHJcbiAgICAgIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJ2bS1yZWRvXCIpIHtcclxuICAgICAgICB0YXNrVHlwZSA9IFwidm1cIjtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5wdWJsaXNoaW5nU3RhdGUgPT09IFwiZml4dHVyZS1yZWRvXCIpIHtcclxuICAgICAgICB0YXNrVHlwZSA9IFwiZml4dHVyZVwiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJsYXlvdXQtcmVkb1wiKSB7XHJcbiAgICAgICAgdGFza1R5cGUgPSBcImxheW91dFwiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChyZXN1bHQ/LmNvbW1lbnRzICYmIHJlc3VsdD8uY29tbWVudHMgIT0gXCJcIikge1xyXG4gICAgICAgIGxldCBjb21tZW50UGF5bG9hZCA9IHtcclxuICAgICAgICAgIGZsb29ySWQ6IHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICAgIHBsYW5vSWQ6IHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgICAgICB0YXNrVHlwZTogdGFza1R5cGUsXHJcbiAgICAgICAgICBjb21tZW50OiByZXN1bHQuY29tbWVudHMsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlR2xvYmFsQ29tbWVudChjb21tZW50UGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge30sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYXBpU2VydmljZS5jcmVhdGVUYXNrKHBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzPy5zdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0xheW91dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnRhc2tEZXRhaWxzKHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsIHRoaXMuZmxvb3JEYXRhLl9pZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U3RvcmVGZWVkYmFjayhcclxuICAgICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KHJlcz8uZGF0YT8ubWVzc2FnZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byBwdWJsaXNoIHRhc2tcIik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBbWk9ORS1WRVJJRklDQVRJT05dIHJldm9rZSDigJQgbWlycm9ycyB0aGUgZml4dHVyZSByZXZva2UgZmxvdyBidXQgdGFyZ2V0cyB0aGUgem9uZSB0YXNrLlxyXG4gIC8vIFVzZXMgdGhlIGV4aXN0aW5nIFN0b3JlVGFza1Jldm9rZUNvbXBvbmVudCArIHJldm9rZVRhc2sgQkUgZW5kcG9pbnQgd2l0aCB0eXBlICd6b25lVmVyaWZpY2F0aW9uJy5cclxuICByZXZva2Vab25lVGFzaygpIHtcclxuICAgIGNvbnN0IHRhc2tJZCA9IHRoaXMuem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uVGFzaz8uX2lkO1xyXG4gICAgaWYgKCF0YXNrSWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XHJcbiAgICAgIHJlZG86IHRoaXMuem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uVGFzaz8ucmVkb1N0YXR1cyA9PT0gdHJ1ZSxcclxuICAgICAgY2hlY2tMaXN0TmFtZTogXCJab25lIFZlcmlmaWNhdGlvblwiLFxyXG4gICAgICB0eXBlOiBcInpvbmVWZXJpZmljYXRpb25cIixcclxuICAgICAgc3RvcmU6IHRoaXMucGxhbm9EYXRhLnN0b3JlTmFtZSxcclxuICAgICAgY2xpZW50SWQ6IHRoaXMucGxhbm9EYXRhLmNsaWVudElkLFxyXG4gICAgICBmbG9vcklkOiB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgIHBsYW5vSWQ6IHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgIHRhc2tJZCxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFN0b3JlVGFza1Jldm9rZUNvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogXCJtZFwiLFxyXG4gICAgICBzY3JvbGxhYmxlOiB0cnVlLFxyXG4gICAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICAgICAgd2luZG93Q2xhc3M6IFwiY3VzdG9tLWhlaWdodC1tb2RhbFwiLFxyXG4gICAgfSk7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50eXBlID0gcGF5bG9hZC5yZWRvID8gXCJ6b25lLXJlZG9cIiA6IFwiem9uZVwiO1xyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuaW5wdXREYXRhID0gcGF5bG9hZDtcclxuXHJcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQ/LnN0YXR1cyAhPT0gXCJzdWJtaXRcIikgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKHJlc3VsdC5jb21tZW50cykge1xyXG4gICAgICAgIHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAgICAgLnVwZGF0ZUdsb2JhbENvbW1lbnQoe1xyXG4gICAgICAgICAgICBmbG9vcklkOiB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgICAgICAgIHBsYW5vSWQ6IHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgICAgICAgIHRhc2tUeXBlOiBcInpvbmVWZXJpZmljYXRpb25cIixcclxuICAgICAgICAgICAgY29tbWVudDogcmVzdWx0LmNvbW1lbnRzLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoeyBuZXh0OiAoKSA9PiB7fSB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5hcGlTZXJ2aWNlLnJldm9rZVRhc2socGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgdGhpcy50YXNrRGV0YWlscyh0aGlzLmZsb29yRGF0YS5wbGFub0lkLCB0aGlzLmZsb29yRGF0YS5faWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldFpvbmVWZXJpZmljYXRpb25GZWVkYmFjayhcclxuICAgICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KHJlcz8ubWVzc2FnZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byByZXZva2Ugem9uZSB0YXNrXCIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBbWk9ORS1WRVJJRklDQVRJT05dIGluaXRpYWwgcHVibGlzaCDigJQgYXNzaWducyBhIHpvbmUgdmVyaWZpY2F0aW9uIHRhc2sgdG8gdGhlIHN0b3JlLlxyXG4gIC8vIE1pcnJvcnMgdGhlIGZpeHR1cmUgaW5pdGlhbCBwdWJsaXNoIGZsb3cuIFJldXNlcyBQdWJsaXNoVGFza1BvcHVwQ29tcG9uZW50IHdpdGggdHlwZSAnem9uZScuXHJcbiAgYXN5bmMgcHVibGlzaFpvbmVWZXJpZmljYXRpb24oKSB7XHJcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XHJcbiAgICAgIHJlZG86IGZhbHNlLFxyXG4gICAgICBjaGVja0xpc3ROYW1lOiBcIlpvbmUgVmVyaWZpY2F0aW9uXCIsXHJcbiAgICAgIHN0b3JlOiB0aGlzLnBsYW5vRGF0YS5zdG9yZU5hbWUsXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLnBsYW5vRGF0YS5jbGllbnRJZCxcclxuICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICBwbGFub0lkOiB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oUHVibGlzaFRhc2tQb3B1cENvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogXCJtZFwiLFxyXG4gICAgICBzY3JvbGxhYmxlOiB0cnVlLFxyXG4gICAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICAgICAgd2luZG93Q2xhc3M6IFwiY3VzdG9tLWhlaWdodC1tb2RhbFwiLFxyXG4gICAgfSk7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50eXBlID0gXCJ6b25lXCI7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnB1dERhdGEgPSBwYXlsb2FkO1xyXG5cclxuICAgIGxldCByZXN1bHQ6IGFueTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IG1vZGFsUmVmLnJlc3VsdDtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAocmVzdWx0Py5zdGF0dXMgIT09IFwic3VibWl0XCIpIHJldHVybjtcclxuXHJcbiAgICAvLyBDcmVhdGUgdGhlIHRhc2sgZmlyc3Qgc28gd2UgaGF2ZSB0aGUgbmV3IHRhc2tJZCB0byBhdHRhY2ggdG8gdGhlIGdsb2JhbFxyXG4gICAgLy8gY29tbWVudCDigJQgb3RoZXJ3aXNlIHRoZSBjb21tZW50IHdvdWxkIGJlIHNhdmVkIHdpdGggdGFza0lkOiB1bmRlZmluZWQgYW5kXHJcbiAgICAvLyB3b3VsZCBuZXZlciBiZSBwaWNrZWQgdXAgYnkgdGhlIHpvbmUgdGFzaydzIGNvbW1lbnRMb29rdXAgam9pbi5cclxuICAgIHRoaXMuYXBpU2VydmljZS5jcmVhdGVUYXNrKHBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgIGNvbnN0IG5ld1Rhc2tJZCA9IHJlcz8uZGF0YT8udGFza0lkO1xyXG4gICAgICAgICAgaWYgKHJlc3VsdD8uY29tbWVudHMpIHtcclxuICAgICAgICAgICAgdGhpcy5hcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgLnVwZGF0ZUdsb2JhbENvbW1lbnQoe1xyXG4gICAgICAgICAgICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICAgICAgICAgICAgcGxhbm9JZDogdGhpcy5mbG9vckRhdGEucGxhbm9JZCxcclxuICAgICAgICAgICAgICAgIHRhc2tUeXBlOiBcInpvbmVWZXJpZmljYXRpb25cIixcclxuICAgICAgICAgICAgICAgIHRhc2tJZDogbmV3VGFza0lkLFxyXG4gICAgICAgICAgICAgICAgY29tbWVudDogcmVzdWx0LmNvbW1lbnRzLFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSh7IG5leHQ6ICgpID0+IHt9IH0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMudGFza0RldGFpbHModGhpcy5mbG9vckRhdGEucGxhbm9JZCwgdGhpcy5mbG9vckRhdGEuX2lkKTtcclxuICAgICAgICAgIHRoaXMuZ2V0Wm9uZVZlcmlmaWNhdGlvbkZlZWRiYWNrKFxyXG4gICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KHJlcz8uZGF0YT8ubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gcHVibGlzaCB6b25lIHZlcmlmaWNhdGlvblwiKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gW1pPTkUtVkVSSUZJQ0FUSU9OXSByZWRvIHB1Ymxpc2gg4oCUIGluZGVwZW5kZW50IG9mIHRoZSBsYXlvdXQvZml4dHVyZS92bSBjaGFpbi5cclxuICAvLyBSZXVzZXMgUHVibGlzaFRhc2tQb3B1cENvbXBvbmVudCB3aXRoIGEgbmV3ICd6b25lLXJlZG8nIHR5cGUuXHJcbiAgYXN5bmMgcHVibGlzaFpvbmVSZWRvKCkge1xyXG4gICAgY29uc3QgdGFza0lkID0gdGhpcy56b25lRmVlZGJhY2s/LnpvbmVWZXJpZmljYXRpb25UYXNrPy5faWQ7XHJcbiAgICBpZiAoIXRhc2tJZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcclxuICAgICAgcmVkbzogdHJ1ZSxcclxuICAgICAgY2hlY2tMaXN0TmFtZTogXCJab25lIFZlcmlmaWNhdGlvblwiLFxyXG4gICAgICBzdG9yZTogdGhpcy5wbGFub0RhdGEuc3RvcmVOYW1lLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5wbGFub0RhdGEuY2xpZW50SWQsXHJcbiAgICAgIGZsb29ySWQ6IHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgdGFza0lkLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oUHVibGlzaFRhc2tQb3B1cENvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogXCJtZFwiLFxyXG4gICAgICBzY3JvbGxhYmxlOiB0cnVlLFxyXG4gICAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICAgICAgd2luZG93Q2xhc3M6IFwiY3VzdG9tLWhlaWdodC1tb2RhbFwiLFxyXG4gICAgfSk7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50eXBlID0gXCJ6b25lLXJlZG9cIjtcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmlucHV0RGF0YSA9IHBheWxvYWQ7XHJcblxyXG4gICAgbGV0IHJlc3VsdDogYW55O1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmVzdWx0ID0gYXdhaXQgbW9kYWxSZWYucmVzdWx0O1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChyZXN1bHQ/LnN0YXR1cyAhPT0gXCJzdWJtaXRcIikgcmV0dXJuO1xyXG5cclxuICAgIGlmIChyZXN1bHQ/LmNvbW1lbnRzKSB7XHJcbiAgICAgIHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAgIC51cGRhdGVHbG9iYWxDb21tZW50KHtcclxuICAgICAgICAgIGZsb29ySWQ6IHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICAgIHBsYW5vSWQ6IHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgICAgICB0YXNrVHlwZTogXCJ6b25lVmVyaWZpY2F0aW9uXCIsXHJcbiAgICAgICAgICB0YXNrSWQsXHJcbiAgICAgICAgICBjb21tZW50OiByZXN1bHQuY29tbWVudHMsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuc3Vic2NyaWJlKHsgbmV4dDogKCkgPT4ge30gfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmNyZWF0ZVRhc2socGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcz8uc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xyXG4gICAgICAgICAgdGhpcy50YXNrRGV0YWlscyh0aGlzLmZsb29yRGF0YS5wbGFub0lkLCB0aGlzLmZsb29yRGF0YS5faWQpO1xyXG4gICAgICAgICAgdGhpcy5nZXRab25lVmVyaWZpY2F0aW9uRmVlZGJhY2soXHJcbiAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRTdWNjZXNzVG9hc3QocmVzPy5kYXRhPy5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byBwdWJsaXNoIHpvbmUgcmVkb1wiKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DbGlja0VkaXQoKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuZGlzYWJsZUVkaXQgfHxcclxuICAgICAgW1widGFza0Fzc2lnbmVkXCJdLmluY2x1ZGVzKHRoaXMudGFza1N0eWxlLmZpeHR1cmUuY2xhc3MpIHx8XHJcbiAgICAgICh0aGlzLnRhc2tTdHlsZS5maXh0dXJlLmNsYXNzID09IFwicmV2aWV3UGVuZGluZ1wiICYmICF0aGlzLnNob3dMYXlvdXQpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gaWYgKHRoaXMudGFza1N0eWxlLmZpeHR1cmUubmFtZSAhPT0gXCJBcHByb3ZlZFwiKSB7XHJcbiAgICAgIHRoaXMudG9nZ2xlUGFuZWwoXCJyaWdodFwiLCB0cnVlKTtcclxuICAgICAgdGhpcy50b2dnbGVQYW5lbChcImxlZnRcIiwgZmFsc2UpO1xyXG5cclxuICAgICAgdGhpcy5kaXNhYmxlZFB1Ymxpc2ggPSB0cnVlO1xyXG4gICAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcclxuICAgICAgdGhpcy5sYXlvdXRGb3JtLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRGaXh0dXJlRm9ybUlkID0gbnVsbDtcclxuICAgICAgdGhpcy5yZW5kZXJGbG9vcigpO1xyXG4gICAgLy8gfSBlbHNlIHtcclxuICAgIC8vICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChcclxuICAgIC8vICAgICBgbWFuYWdlL3BsYW5vZ3JhbS9tYW5hZ2Utcm9sbG91dD9wbGFub0lkPSR7dGhpcy5mbG9vckRhdGEucGxhbm9JZH0mZmxvb3JJZD0ke3RoaXMuZmxvb3JEYXRhLl9pZH1gLFxyXG4gICAgLy8gICApO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgdGFza0RldGFpbHMocGxhbm9JZDogYW55LCBmbG9vcklkOiBhbnkpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMudGFza0luZm8gPSB7fTtcclxuICAgICAgdGhpcy50YXNrU3R5bGUgPSB7XHJcbiAgICAgICAgbGF5b3V0OiB7IG5hbWU6IFwiWWV0IFRvIEFzc2lnblwiLCBjbGFzczogXCJ5ZXRUb0Fzc2lnblwiIH0sXHJcbiAgICAgICAgZml4dHVyZTogeyBuYW1lOiBcIllldCBUbyBBc3NpZ25cIiwgY2xhc3M6IFwieWV0VG9Bc3NpZ25cIiB9LFxyXG4gICAgICAgIHZtOiB7IG5hbWU6IFwiWWV0IFRvIEFzc2lnblwiLCBjbGFzczogXCJ5ZXRUb0Fzc2lnblwiIH0sXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuYXBpU2VydmljZS5nZXRUYXNrSW5mbyh7IHBsYW5vSWQsIGZsb29ySWQgfSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWRQdWJsaXNoID0gcmVzPy5kYXRhPy5kaXNhYmxlZCB8fCBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy50YXNrSW5mbyA9IHJlcz8uZGF0YTtcclxuICAgICAgICAgICAgdGhpcy50YXNrSW5mbz8udGFza0RldGFpbHM/LmZvckVhY2goKGVsZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGVsZS50eXBlID09IFwibGF5b3V0XCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGFza1N0eWxlLmxheW91dCA9IHRoaXMuZ2V0U3RhdHVzKFwibGF5b3V0XCIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoZWxlLnR5cGUgPT0gXCJmaXh0dXJlXCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGFza1N0eWxlLmZpeHR1cmUgPSB0aGlzLmdldFN0YXR1cyhcImZpeHR1cmVcIik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChlbGUudHlwZSA9PSBcImZpeHR1cmVcIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50YXNrU3R5bGUudm0gPSB0aGlzLnRhc2tTdHlsZS5maXh0dXJlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUHVibGlzaGluZ1N0YXRlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gZ2V0IHRhc2sgZGV0YWlsc1wiKTtcclxuICAgICAgICAgIHJlamVjdCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRTdGF0dXModHlwZTogYW55KSB7XHJcbiAgICBsZXQgZGF0YSA9IHRoaXMudGFza0luZm8/LnRhc2tEZXRhaWxzPy5maW5kKChlbGU6IGFueSkgPT4gZWxlLnR5cGUgPT0gdHlwZSk7XHJcbiAgICBpZiAoZGF0YSkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgZGF0YS5zdGF0dXMgPT0gXCJzdWJtaXRcIiAmJlxyXG4gICAgICAgIChkYXRhLmZlZWRiYWNrU3RhdHVzID09IFwiY29tcGxldGVcIiB8fCAhZGF0YT8uZmVlZGJhY2tTdGF0dXMpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybiB7IG5hbWU6IFwiQXBwcm92ZWRcIiwgY2xhc3M6IFwiY29tcGxldGVkXCIgfTtcclxuICAgICAgfSBlbHNlIGlmIChkYXRhLnN0YXR1cyA9PSBcInN1Ym1pdFwiICYmIGRhdGEuZmVlZGJhY2tTdGF0dXMgPT0gXCJwZW5kaW5nXCIpIHtcclxuICAgICAgICByZXR1cm4geyBuYW1lOiBcIlJldmlldyBQZW5kaW5nXCIsIGNsYXNzOiBcInJldmlld1BlbmRpbmdcIiB9O1xyXG4gICAgICB9IGVsc2UgaWYgKGRhdGEuc3RhdHVzID09IFwic3VibWl0XCIgJiYgZGF0YS5mZWVkYmFja1N0YXR1cyA9PSBcImRpc2FncmVlXCIpIHtcclxuICAgICAgICByZXR1cm4geyBuYW1lOiBcIllldCB0byBBc3NpZ25cIiwgY2xhc3M6IFwieWV0VG9Bc3NpZ25cIiB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChkYXRhLnJlZG9TdGF0dXMgJiYgIWRhdGEuYnJlYWNoKSB7XHJcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiBcIlJlZG9cIiwgY2xhc3M6IFwidGFza0Fzc2lnbmVkXCIgfTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuYnJlYWNoKSB7XHJcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiBcIkZsYWdnZWRcIiwgY2xhc3M6IFwiZmxhZ2dlZFwiIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGRhdGE/LmRhdGUgJiZcclxuICAgICAgICAgIGRheWpzKGRhdGEuZGF0ZSwgXCJZWVlZLU1NLUREXCIpLmlzQWZ0ZXIoZGF5anMoKSwgXCJkYXlcIilcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG5hbWU6IGBUYXNrIHNjaGVkdWxlZDogJHtkYXlqcyhkYXRhLmRhdGUpLmZvcm1hdChcIkREIE1NTU0sIFlZWVlcIil9YCxcclxuICAgICAgICAgICAgY2xhc3M6IFwidGFza0Fzc2lnbmVkXCIsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiBcIlRhc2sgQXNzaWduZWRcIiwgY2xhc3M6IFwidGFza0Fzc2lnbmVkXCIgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7IG5hbWU6IFwiWWV0IHRvIEFzc2lnblwiLCBjbGFzczogXCJ5ZXRUb0Fzc2lnblwiIH07XHJcbiAgfVxyXG5cclxuICBnZXRFbGVtZW50TnVtYmVyKGdyb3VwOiBhbnkpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIHJldHVybiBncm91cC5nZXQoXCJlbGVtZW50TnVtYmVyXCIpPy52YWx1ZSA/PyBudWxsO1xyXG4gIH1cclxuXHJcbiAgaGlnaGxpZ2h0Rml4dHVyZShncm91cDogYW55LCBibGluazogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBpZiAodGhpcy5sYXlvdXRGb3JtLmVuYWJsZWQpIHJldHVybjtcclxuICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7XHJcbiAgICB0aGlzLmNhbmNlbEhpZ2hsaWdodEJsaW5rID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgY2VudGVyID0gZ3JvdXAuZ2V0Q2VudGVyUG9pbnQoKTtcclxuXHJcbiAgICBjb25zdCByZWFsV2lkdGggPSBncm91cC53aWR0aCEgKiBncm91cC5zY2FsZVghO1xyXG4gICAgY29uc3QgcmVhbEhlaWdodCA9IGdyb3VwLmhlaWdodCEgKiBncm91cC5zY2FsZVkhO1xyXG5cclxuICAgIGNvbnN0IHJlY3QgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICBsZWZ0OiBjZW50ZXIueCxcclxuICAgICAgdG9wOiBjZW50ZXIueSxcclxuICAgICAgd2lkdGg6IHJlYWxXaWR0aCArIDgsIC8vIGNvbnNpc3RlbnQgcGFkZGluZ1xyXG4gICAgICBoZWlnaHQ6IHJlYWxIZWlnaHQgKyA4LFxyXG4gICAgICByeDogNSxcclxuICAgICAgcnk6IDUsXHJcbiAgICAgIHN0cm9rZTogXCIjMDBhYWZmXCIsXHJcbiAgICAgIHN0cm9rZVdpZHRoOiAzLFxyXG4gICAgICBmaWxsOiBcInRyYW5zcGFyZW50XCIsXHJcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgYW5nbGU6IGdyb3VwLmFuZ2xlIHx8IDAsXHJcbiAgICAgIG9wYWNpdHk6IGJsaW5rID8gMCA6IDEsXHJcbiAgICB9KTtcclxuXHJcbiAgICAocmVjdCBhcyBhbnkpLmRhdGEgPSB7IHR5cGU6IFwiZml4dHVyZS1oaWdobGlnaHRcIiB9O1xyXG5cclxuICAgIHRoaXMuY2FudmFzLmFkZChyZWN0KTtcclxuICAgIHRoaXMuY2FudmFzLm1vdmVPYmplY3RUbyhyZWN0LCB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCkubGVuZ3RoIC0gMSk7XHJcbiAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcblxyXG4gICAgdGhpcy5hY3RpdmVIaWdobGlnaHQgPSByZWN0O1xyXG5cclxuICAgIC8vIC0tLSBObyBibGlua2luZyBuZWVkZWQgLS0tXHJcbiAgICBpZiAoIWJsaW5rKSByZXR1cm47XHJcblxyXG4gICAgbGV0IGN5Y2xlcyA9IDA7XHJcblxyXG4gICAgY29uc3QgYmxpbmtPbmNlID0gKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5jYW5jZWxIaWdobGlnaHRCbGluaykge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZWN0LmFuaW1hdGUoXHJcbiAgICAgICAgeyBvcGFjaXR5OiAxIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgIG9uQ2hhbmdlOiAoKSA9PiB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCksXHJcbiAgICAgICAgICBvbkNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbmNlbEhpZ2hsaWdodEJsaW5rKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHQoKTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlY3QuYW5pbWF0ZShcclxuICAgICAgICAgICAgICB7IG9wYWNpdHk6IDAgfSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMjAwLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6ICgpID0+IHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKSxcclxuICAgICAgICAgICAgICAgIG9uQ29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuY2VsSGlnaGxpZ2h0QmxpbmspIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgY3ljbGVzKys7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChjeWNsZXMgPCAyMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJsaW5rT25jZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jYW5jZWxIaWdobGlnaHRCbGluaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmVjdC5zZXQoeyBvcGFjaXR5OiAxIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICApO1xyXG4gICAgfTtcclxuXHJcbiAgICBibGlua09uY2UoKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUhpZ2hsaWdodCgpIHtcclxuICAgIHRoaXMuY2FuY2VsSGlnaGxpZ2h0QmxpbmsgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuY2FudmFzPy5nZXRPYmplY3RzKCk/LmZvckVhY2goKG9iaikgPT4ge1xyXG4gICAgICBpZiAoKG9iaiBhcyBhbnkpLmRhdGE/LnR5cGUgPT09IFwiZml4dHVyZS1oaWdobGlnaHRcIikge1xyXG4gICAgICAgIHRoaXMuY2FudmFzLnJlbW92ZShvYmopO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFjdGl2ZUhpZ2hsaWdodCA9IG51bGw7XHJcbiAgICB0aGlzLmNhbnZhcz8ucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gIH1cclxuXHJcbiAga2VlcEhpZ2hsaWdodE9uVG9wID0gKCkgPT4ge1xyXG4gICAgaWYgKCF0aGlzLmFjdGl2ZUhpZ2hsaWdodCkgcmV0dXJuO1xyXG4gICAgY29uc3Qgb2JqcyA9IHRoaXMuY2FudmFzLmdldE9iamVjdHMoKTtcclxuICAgIHRoaXMuY2FudmFzLm1vdmVPYmplY3RUbyh0aGlzLmFjdGl2ZUhpZ2hsaWdodCwgb2Jqcy5sZW5ndGggLSAxKTtcclxuICB9O1xyXG5cclxuICAvLyBJbiBlZGl0IG1vZGUsIHdoZW4gYSBmaXh0dXJlIGlzIGNsaWNrZWQgb24gdGhlIGNhbnZhcywgb3BlbiB0aGUgbWF0Y2hpbmdcclxuICAvLyBhY2NvcmRpb24gaXRlbSBpbiB0aGUgbGVmdCBwYW5lbCwgc2Nyb2xsIGl0IGludG8gdmlldyBhbmQgaGlnaGxpZ2h0IHRoZVxyXG4gIC8vIGZpeHR1cmUgcm93IHNvIHRoZSB1c2VyIGNhbiBsb2NhdGUgaXQgaW4gdGhlIGZvcm0gcXVpY2tseS5cclxuICBoaWdobGlnaHRGaXh0dXJlSW5BY2NvcmRpb24oZml4dHVyZURhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCFmaXh0dXJlRGF0YSB8fCB0aGlzLmxheW91dEZvcm0uZGlzYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICBsZXQgYWNjb3JkaW9uSXRlbUlkOiBzdHJpbmc7XHJcblxyXG4gICAgaWYgKGZpeHR1cmVEYXRhLmZpeHR1cmVUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICBjb25zdCBmb3JtSWR4ID0gdGhpcy5nZXRGb3JtV2FsbHMuY29udHJvbHMuZmluZEluZGV4KFxyXG4gICAgICAgIChjKSA9PlxyXG4gICAgICAgICAgYy5nZXQoXCJlbGVtZW50TnVtYmVyXCIpPy52YWx1ZSA9PT0gZml4dHVyZURhdGEuYXNzb2NpYXRlZEVsZW1lbnROdW1iZXIsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChmb3JtSWR4IDwgMCkge1xyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRGaXh0dXJlRm9ybUlkID0gbnVsbDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgYWNjb3JkaW9uSXRlbUlkID0gYGFjY29yZGlvbi13YWxsLSR7Zm9ybUlkeH1gO1xyXG4gICAgfSBlbHNlIGlmIChmaXh0dXJlRGF0YS5maXh0dXJlVHlwZSA9PT0gXCJmbG9vclwiKSB7XHJcbiAgICAgIGFjY29yZGlvbkl0ZW1JZCA9IFwiYWNjb3JkaW9uLWZsb29yXCI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oaWdobGlnaHRlZEZpeHR1cmVGb3JtSWQgPSBmaXh0dXJlRGF0YS5faWQgPz8gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5pc0xlZnRQYW5lbENvbGxhcHNlZCkge1xyXG4gICAgICB0aGlzLnRvZ2dsZVBhbmVsKFwibGVmdFwiLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ib2R5QWNjb3JkaW9uPy5leHBhbmQoYWNjb3JkaW9uSXRlbUlkKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhY2NvcmRpb25JdGVtSWQpO1xyXG4gICAgICBlbD8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogXCJzbW9vdGhcIiwgYmxvY2s6IFwic3RhcnRcIiB9KTtcclxuICAgIH0sIDM1MCk7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZUZpeHR1cmVPbkZlZWRiYWNrUGFuZWwoXHJcbiAgICB7XHJcbiAgICAgIGN1cnJlbnRGaXh0dXJlLFxyXG4gICAgICBhY3Rpb24sXHJcbiAgICB9OiB7XHJcbiAgICAgIGN1cnJlbnRGaXh0dXJlPzogc3RyaW5nO1xyXG4gICAgICBhY3Rpb24/OiBcIm5leHRcIiB8IFwicHJldmlvdXNcIjtcclxuICAgIH0sXHJcbiAgICBjb2xsYXBzZVRhc2tJbmZvOiBib29sZWFuID0gZmFsc2UsXHJcbiAgKSB7XHJcbiAgICBsZXQgaW5kZXhUb1NlbGVjdCA9IGN1cnJlbnRGaXh0dXJlXHJcbiAgICAgID8gdGhpcy5hbGxGaXh0dXJlSW5zdGFuY2VzLmZpbmRJbmRleCgoZjogYW55KSA9PiBmLl9pZCA9PT0gY3VycmVudEZpeHR1cmUpXHJcbiAgICAgIDogMDtcclxuXHJcbiAgICBpZiAoYWN0aW9uID09PSBcIm5leHRcIikge1xyXG4gICAgICBpZiAoaW5kZXhUb1NlbGVjdCA9PSB0aGlzLmFsbEZpeHR1cmVJbnN0YW5jZXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGluZGV4VG9TZWxlY3QgPSAwO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGluZGV4VG9TZWxlY3QrKztcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09IFwicHJldmlvdXNcIikge1xyXG4gICAgICBpZiAoaW5kZXhUb1NlbGVjdCA9PSAwKSB7XHJcbiAgICAgICAgaW5kZXhUb1NlbGVjdCA9IHRoaXMuYWxsRml4dHVyZUluc3RhbmNlcy5sZW5ndGggLSAxO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGluZGV4VG9TZWxlY3QtLTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICghY3VycmVudEZpeHR1cmUgJiYgIWFjdGlvbikge1xyXG4gICAgICBpbmRleFRvU2VsZWN0ID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaXh0dXJlSWRUb1NlbGVjdCA9IHRoaXMuYWxsRml4dHVyZUluc3RhbmNlc1tpbmRleFRvU2VsZWN0XT8uX2lkO1xyXG5cclxuICAgIGNvbnN0IGFjdGlvbkZpeHR1cmUgPSB0aGlzLmNhbnZhc1xyXG4gICAgICAuZ2V0T2JqZWN0cygpXHJcbiAgICAgIC5maW5kKFxyXG4gICAgICAgIChvYmo6IGFueSkgPT5cclxuICAgICAgICAgIG9iai5vYmpUeXBlID09PSBcImZpeHR1cmVcIiAmJiBvYmouZml4dHVyZUlkID09PSBmaXh0dXJlSWRUb1NlbGVjdCxcclxuICAgICAgKSBhcyBmYWJyaWMuR3JvdXAgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgaWYgKCFhY3Rpb25GaXh0dXJlKSByZXR1cm47XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVzaXplQ2FudmFzKCk7XHJcbiAgICAgIHRoaXMuZml0Q2FudmFzVG9MYXlvdXRBbmltYXRlZCgpO1xyXG4gICAgfSwgMzAwKTtcclxuXHJcbiAgICB0aGlzLmhpZ2hsaWdodEZpeHR1cmUoYWN0aW9uRml4dHVyZSk7XHJcbiAgICB0aGlzLnNlbGVjdEZpeHR1cmVPbkNhbnZhc0NsaWNrKGFjdGlvbkZpeHR1cmUsIGNvbGxhcHNlVGFza0luZm8pO1xyXG4gIH1cclxuXHJcbiAgcmV2b2tlVGFzaygpIHtcclxuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcclxuICAgICAgcmVkbzogZmFsc2UsXHJcbiAgICAgIGNoZWNrTGlzdE5hbWU6IFwiXCIsXHJcbiAgICAgIHN0b3JlOiB0aGlzLnBsYW5vRGF0YS5zdG9yZU5hbWUsXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLnBsYW5vRGF0YS5jbGllbnRJZCxcclxuICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICBwbGFub0lkOiB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5wdWJsaXNoaW5nU3RhdGUgPT09IFwibGF5b3V0XCIpIHtcclxuICAgICAgcGF5bG9hZC50eXBlID0gXCJsYXlvdXRcIjtcclxuICAgICAgLy8gdGhpcy51cGRhdGVMYXlvdXQoKVxyXG4gICAgICBwYXlsb2FkLmNoZWNrTGlzdE5hbWUgPSBcIkxheW91dCBWZXJpZmljYXRpb25cIjtcclxuICAgICAgcGF5bG9hZC5yZWRvID0gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMucHVibGlzaGluZ1N0YXRlID09PSBcImxheW91dC1yZWRvXCIpIHtcclxuICAgICAgcGF5bG9hZC5jaGVja0xpc3ROYW1lID0gXCJMYXlvdXQgVmVyaWZpY2F0aW9uXCI7XHJcbiAgICAgIHBheWxvYWQudHlwZSA9IFwibGF5b3V0XCI7XHJcbiAgICAgIHBheWxvYWQucmVkbyA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMucHVibGlzaGluZ1N0YXRlID09PSBcImZpeHR1cmVcIikge1xyXG4gICAgICBwYXlsb2FkLmNoZWNrTGlzdE5hbWUgPSBcIkZpeHR1cmUgVmVyaWZpY2F0aW9uXCI7XHJcbiAgICAgIHBheWxvYWQudHlwZSA9IFwiZml4dHVyZVwiO1xyXG4gICAgICBwYXlsb2FkLnJlZG8gPSBmYWxzZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5wdWJsaXNoaW5nU3RhdGUgPT09IFwiZml4dHVyZS1yZWRvXCIpIHtcclxuICAgICAgcGF5bG9hZC5jaGVja0xpc3ROYW1lID0gXCJGaXh0dXJlIFZlcmlmaWNhdGlvblwiO1xyXG4gICAgICBwYXlsb2FkLnR5cGUgPSBcImZpeHR1cmVcIjtcclxuICAgICAgcGF5bG9hZC5yZWRvID0gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5wdWJsaXNoaW5nU3RhdGUgPT09IFwidm1cIikge1xyXG4gICAgICBwYXlsb2FkLmNoZWNrTGlzdE5hbWUgPSBcIlZNIFZlcmlmaWNhdGlvblwiO1xyXG4gICAgICBwYXlsb2FkLnR5cGUgPSBcInZtXCI7XHJcbiAgICAgIHBheWxvYWQucmVkbyA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJ2bS1yZWRvXCIpIHtcclxuICAgICAgcGF5bG9hZC5jaGVja0xpc3ROYW1lID0gXCJWTSBWZXJpZmljYXRpb25cIjtcclxuICAgICAgcGF5bG9hZC50eXBlID0gXCJ2bVwiO1xyXG4gICAgICBwYXlsb2FkLnJlZG8gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcGF5bG9hZC50YXNrSWQgPSB0aGlzLnRhc2tJbmZvPy50YXNrRGV0YWlscy5maW5kKFxyXG4gICAgICAoZWxlOiBhbnkpID0+IGVsZS50eXBlID09IHBheWxvYWQudHlwZSxcclxuICAgICk/LnRhc2tJZDtcclxuXHJcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oU3RvcmVUYXNrUmV2b2tlQ29tcG9uZW50LCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICBzaXplOiBcIm1kXCIsXHJcbiAgICAgIHNjcm9sbGFibGU6IHRydWUsXHJcbiAgICAgIGJhY2tkcm9wOiBcInN0YXRpY1wiLFxyXG4gICAgICB3aW5kb3dDbGFzczogXCJjdXN0b20taGVpZ2h0LW1vZGFsXCIsIC8vIDwtLSBBZGQgYSBjdXN0b20gY2xhc3MgaGVyZVxyXG4gICAgfSk7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50eXBlID0gdGhpcy5wdWJsaXNoaW5nU3RhdGU7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnB1dERhdGEgPSBwYXlsb2FkO1xyXG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJzdWJtaXRcIikge1xyXG4gICAgICAgIGxldCB0YXNrVHlwZSA9IHRoaXMucHVibGlzaGluZ1N0YXRlO1xyXG4gICAgICAgIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJ2bS1yZWRvXCIpIHtcclxuICAgICAgICAgIHRhc2tUeXBlID0gXCJ2bVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wdWJsaXNoaW5nU3RhdGUgPT09IFwiZml4dHVyZS1yZWRvXCIpIHtcclxuICAgICAgICAgIHRhc2tUeXBlID0gXCJmaXh0dXJlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJsYXlvdXQtcmVkb1wiKSB7XHJcbiAgICAgICAgICB0YXNrVHlwZSA9IFwibGF5b3V0XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXN1bHQuY29tbWVudHMgJiYgcmVzdWx0LmNvbW1lbnRzICE9IFwiXCIpIHtcclxuICAgICAgICAgIGxldCBjb21tZW50UGF5bG9hZCA9IHtcclxuICAgICAgICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICAgICAgICBwbGFub0lkOiB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgICAgICB0YXNrVHlwZTogdGFza1R5cGUsXHJcbiAgICAgICAgICAgIGNvbW1lbnQ6IHJlc3VsdC5jb21tZW50cyxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlR2xvYmFsQ29tbWVudChjb21tZW50UGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7fSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFwaVNlcnZpY2UucmV2b2tlVGFzayhwYXlsb2FkKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgICB0aGlzLnRhc2tEZXRhaWxzKHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsIHRoaXMuZmxvb3JEYXRhLl9pZCk7XHJcbiAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KHJlcz8ubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiRmFpbGVkIHRvIHB1Ymxpc2ggdGFza1wiKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGlzaCgpIHtcclxuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihQdWJsaXNoUGxhbm9Nb2RhbENvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogXCJtZFwiLFxyXG4gICAgICBzY3JvbGxhYmxlOiB0cnVlLFxyXG4gICAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICAgICAgd2luZG93Q2xhc3M6IFwiY3VzdG9tLWhlaWdodC1tb2RhbFwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICBjb25zdCBwdWJsaXNoQXNEcmFmdCA9IHJlcy5wdWJsaXNoQXNEcmFmdDtcclxuICAgICAgICBsZXQgZGF0YSA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLnBsYW5vRGF0YSk7XHJcbiAgICAgICAgZGF0YS5mbG9vcklkID0gdGhpcy5mbG9vckRhdGEuX2lkO1xyXG4gICAgICAgIGRhdGEuZmxvb3JEYXRhID0gdGhpcy5mbG9vckRhdGE7XHJcbiAgICAgICAgZGVsZXRlIGRhdGEuZmxvb3JzO1xyXG4gICAgICAgIGRlbGV0ZSBkYXRhLmZsb29yRGF0YS5tYXN0ZXJUZW1wbGF0ZXM7XHJcbiAgICAgICAgZGF0YS5yZXZpc2lvbk5hbWUgPSByZXMucmV2aXNpb25OYW1lO1xyXG4gICAgICAgIGRhdGEuaXNBY3RpdmUgPSAhcHVibGlzaEFzRHJhZnQ7XHJcbiAgICAgICAgdGhpcy5hcGlTZXJ2aWNlLnB1Ymxpc2goZGF0YSkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChhcGlSZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYXBpUmVzICYmIGFwaVJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgICAgIGlmICghcHVibGlzaEFzRHJhZnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLnZlcmlmaWNhdGlvblN0YXR1cyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldFN1Y2Nlc3NUb2FzdChhcGlSZXM/Lm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiRmFpbGVkIHRvIHB1Ymxpc2ggcGxhbm9cIik7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdvVG9TdG9yZVRvdXJQYWdlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNTdG9yZVRvdXJMb2FkaW5nKSByZXR1cm47XHJcbiAgICB0aGlzLmlzU3RvcmVUb3VyTG9hZGluZyA9IHRydWU7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuYXBpU2VydmljZS5nZXRQbGFub1N0b3JlVmlkZW9QYXJhbXMoe1xyXG4gICAgICAgICAgc3RvcmVJZDogdGhpcy5wbGFub0RhdGEuc3RvcmVJZCxcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChyZXM/LmRhdGEpIHtcclxuICAgICAgICBsZXQgcGFyYW1zID0gcmVzPy5kYXRhO1xyXG4gICAgICAgIGNvbnN0IHVybFRyZWUgPSB0aGlzLnJvdXRlci5jcmVhdGVVcmxUcmVlKFtcIi9tYW5hZ2UvdHJheC9nYWxsZXJ5XCJdLCB7XHJcbiAgICAgICAgICBxdWVyeVBhcmFtczogcGFyYW1zLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMucm91dGVyLnNlcmlhbGl6ZVVybCh1cmxUcmVlKTtcclxuICAgICAgICB3aW5kb3cub3Blbih1cmwsIFwiX2JsYW5rXCIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMub3Blbk5vVmlkZW9Gb3VuZE1vZGFsKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLm9wZW5Ob1ZpZGVvRm91bmRNb2RhbCgpO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ29Ub1N0b3JlVG91clBhZ2UgW0VSUl06XCIsIGVycm9yKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNTdG9yZVRvdXJMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBvcGVuTm9WaWRlb0ZvdW5kTW9kYWwoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMubm9TdG9yZVZpZGVvTW9kYWxSZWYsIHtcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgfSkucmVzdWx0O1xyXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHt9XHJcbiAgfVxyXG5cclxuICBnb1RvU3RvcmVDYW1lcmFQYWdlKCkge1xyXG4gICAgY29uc3QgdXJsVHJlZSA9IHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUoW1wiL21hbmFnZS9zdG9yZXMvY2FtZXJhc1wiXSwge1xyXG4gICAgICBxdWVyeVBhcmFtczoge1xyXG4gICAgICAgIHN0b3JlSWQ6IHRoaXMucGxhbm9EYXRhLnN0b3JlSWQsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLnJvdXRlci5zZXJpYWxpemVVcmwodXJsVHJlZSk7XHJcbiAgICB3aW5kb3cub3Blbih1cmwsIFwiX2JsYW5rXCIpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RvcmVMaXN0KHBsYW5vSWQ/OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAuZ2V0UGxhbm9TdG9yZUxpc3QodGhpcy5jbGllbnRJZClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gcmVzLmRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gdGhpcy5zdG9yZUxpc3QubWFwKChlbGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLmVsZSwgc3RvcmVOYW1lOiBlbGUuc3RvcmVOYW1lLnRvVXBwZXJDYXNlKCkgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChwbGFub0lkKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlTmFtZSA9IHRoaXMuc3RvcmVMaXN0LmZpbmQoXHJcbiAgICAgICAgICAgICAgICAoZWxlOiBhbnkpID0+IGVsZS5wbGFub0lkLnRvU3RyaW5nKCkgPT0gcGxhbm9JZC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uU2VsZWN0ZWQoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5wbGFub0RhdGEgPSBudWxsO1xyXG4gICAgdGhpcy5mbG9vckRhdGEgPSBudWxsO1xyXG4gICAgY29uc3QgbmV3UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcclxuICAgIG5ld1BhcmFtcy5zZXQoXCJwbGFub0lkXCIsIGV2ZW50LnBsYW5vSWQpO1xyXG4gICAgbmV3UGFyYW1zLnNldChcImZsb29ySWRcIiwgZXZlbnQuZmxvb3JJZCk7XHJcblxyXG4gICAgdGhpcy5sb2NhdGlvbi5yZXBsYWNlU3RhdGUod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLCBuZXdQYXJhbXMudG9TdHJpbmcoKSk7XHJcbiAgICB0aGlzLmlzUmlnaHRQYW5lbENvbGxhcHNlZCA9IHRydWU7XHJcbiAgICB0aGlzLmlzTGVmdFBhbmVsQ29sbGFwc2VkID0gdHJ1ZTtcclxuICAgIHRoaXMud2FsbENvdW50ID0gdGhpcy5jbENvdW50ID0gMDtcclxuICAgIHRoaXMuc2hvd0xheW91dCA9IGZhbHNlO1xyXG4gICAgYXdhaXQgdGhpcy5nZXRTdG9yZUZpeHR1cmVzKGV2ZW50Ll9pZCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhcHBseVBJRExvZ2ljcygpIHt9XHJcblxyXG4gIGFzeW5jIG9uQ2xpY2tBcHBseUxvZ2ljcygpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5hcHBseUxvZ2ljc01vZGFsUmVmLCB7XHJcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIH0pLnJlc3VsdDtcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7fVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DbGlja0FwcHJvdmVMYXlvdXQoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuYXBwcm92ZUxheW91dE1vZGFsUmVmLCB7XHJcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIH0pLnJlc3VsdDtcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7fVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYXBwcm92ZUxheW91dCgpIHtcclxuICAgIHRoaXMuaXNCdXR0b25Mb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBmbG9vcklkID0gdGhpcy5mbG9vckRhdGEuX2lkO1xyXG5cclxuICAgICAgY29uc3QgcHVibGlzaERhdGEgPSB7XHJcbiAgICAgICAgLi4uc3RydWN0dXJlZENsb25lKHRoaXMucGxhbm9EYXRhKSxcclxuICAgICAgICBmbG9vcklkLFxyXG4gICAgICAgIGZsb29yRGF0YToge1xyXG4gICAgICAgICAgLi4udGhpcy5mbG9vckRhdGEsXHJcbiAgICAgICAgICBtYXN0ZXJUZW1wbGF0ZXM6IHVuZGVmaW5lZCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZsb29yczogdW5kZWZpbmVkLFxyXG4gICAgICB9O1xyXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlU3RvcmVQbGFubyh7XHJcbiAgICAgICAgICAgIGZsb29ySWQsXHJcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuZmxvb3JEYXRhLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKSxcclxuICAgICAgICBmaXJzdFZhbHVlRnJvbSh0aGlzLmFwaVNlcnZpY2UucHVibGlzaChwdWJsaXNoRGF0YSkpLFxyXG4gICAgICAgIGZpcnN0VmFsdWVGcm9tKHRoaXMuYXBpU2VydmljZS5hcHByb3ZlUGxhbm9MYXlvdXQoZmxvb3JJZCkpLFxyXG4gICAgICBdKTtcclxuXHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldFN1Y2Nlc3NUb2FzdChcIkxheW91dCBhcHByb3ZlZCBzdWNjZXNzZnVsbHlcIik7XHJcbiAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJhcHByb3ZlTGF5b3V0IGZhaWxlZDpcIiwgZXJyb3IpO1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiRmFpbGVkIHRvIGFwcHJvdmUgbGF5b3V0XCIpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc0J1dHRvbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8c2VjdGlvbiBpZD1cIm1hbmFnZS1wbGFub1wiPlxyXG4gIDwhLS0gTG9hZGluZyBTdGF0ZSAtLT5cclxuICA8ZGl2ICpuZ0lmPVwiaXNQYWdlTG9hZGluZ1wiIGNsYXNzPVwicm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG0tMFwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyU2tlbGV0b25cIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJza2VsZXRvbkxvYWRlclwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNrZWxldG9uTG9hZGVyXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2tlbGV0b25Mb2FkZXJcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIENvbnRlbnQgLS0+XHJcbiAgPGRpdiBbbmdDbGFzc109XCJ7ICdkLW5vbmUnOiBpc1BhZ2VMb2FkaW5nIH1cIj5cclxuICAgIDwhLS0gSGVhZGVyIEFjY29yZGlvbiAtLT5cclxuICAgIDxkaXYgaWQ9XCJoZWFkZXJcIiBuZ2JBY2NvcmRpb24gI2FjY29yZGlvbj1cIm5nYkFjY29yZGlvblwiIGNsYXNzPVwibXktNFwiPlxyXG4gICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJkZXRhaWxzXCIgW2NvbGxhcHNlZF09XCJmYWxzZVwiPlxyXG4gICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBweC02IHB5LTNcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTQgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjVweDttYXJnaW4tcmlnaHQ6NXB4XCIgKm5nSWY9XCJwbGFub0RhdGE/LnN0b3JlTmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgPGgyIGNsYXNzPSd0aXRsZSc+e3twbGFub0RhdGE/LnN0b3JlTmFtZX19IC0gUGxhbm88L2gyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8bGliLXNlbGVjdC1wbGFubyAqbmdJZj1cInN0b3JlTGlzdD8ubGVuZ3RoXCIgW2lkRmllbGRdPVwiJ19pZCdcIiBbc2VsZWN0ZWRWYWx1ZXNdPVwiW3NlbGVjdGVkU3RvcmVOYW1lXVwiXHJcbiAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJzdG9yZUxpc3RcIiBbbXVsdGldPWZhbHNlIHNlYXJjaEZpZWxkPVwic3RvcmVOYW1lXCIgKHNlbGVjdGVkKT1cIm9uU2VsZWN0ZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPC9saWItc2VsZWN0LXBsYW5vPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0ICpuZ0lmPVwiZmxvb3JzTGlzdC5sZW5ndGggJiYgIWlzUGFnZUxvYWRpbmdcIiBbZm9ybUNvbnRyb2xdPVwic2VsZWN0ZWRGbG9vcklkXCJcclxuICAgICAgICAgICAgICBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiZmxvb3JzTGlzdFwiPlxyXG4gICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzLWJ0blwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJpc1N0b3JlVG91ckxvYWRpbmdcIiAoY2xpY2spPVwiZ29Ub1N0b3JlVG91clBhZ2UoKVwiPlxyXG4gICAgICAgICAgICAgIFZpZXcgc3RvcmUgdG91clxyXG5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiIWlzU3RvcmVUb3VyTG9hZGluZ1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzQwOF8xNjQ5OClcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTYgMTFDOC43NjE0MiAxMSAxMSA4Ljc2MTQyIDExIDZDMTEgMy4yMzg1OCA4Ljc2MTQyIDEgNiAxQzMuMjM4NTggMSAxIDMuMjM4NTggMSA2QzEgOC43NjE0MiAzLjIzODU4IDExIDYgMTFaXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzNCNUZGXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDRMOCA2TDUgOFY0WlwiIHN0cm9rZT1cIiMzM0I1RkZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDA4XzE2NDk4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzU3RvcmVUb3VyTG9hZGluZ1wiIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc21cIiByb2xlPVwic3RhdHVzXCJcclxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzLWJ0blwiIChjbGljayk9XCJnb1RvU3RvcmVDYW1lcmFQYWdlKClcIj5cclxuICAgICAgICAgICAgICBWaWV3IGNhbWVyYVxyXG5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNDIyXzM2MzIxKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNOSA2LjVWOS41QzkgOS43NjUyMiA4Ljg5NDY0IDEwLjAxOTYgOC43MDcxMSAxMC4yMDcxQzguNTE5NTcgMTAuMzk0NiA4LjI2NTIyIDEwLjUgOCAxMC41SDIuNUMyLjIzNDc4IDEwLjUgMS45ODA0MyAxMC4zOTQ2IDEuNzkyODkgMTAuMjA3MUMxLjYwNTM2IDEwLjAxOTYgMS41IDkuNzY1MjIgMS41IDkuNVY0QzEuNSAzLjczNDc4IDEuNjA1MzYgMy40ODA0MyAxLjc5Mjg5IDMuMjkyODlDMS45ODA0MyAzLjEwNTM2IDIuMjM0NzggMyAyLjUgM0g1LjVNNy41IDEuNUgxMC41TTEwLjUgMS41VjQuNU0xMC41IDEuNUw1IDdcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzQyMl8zNjMyMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtNFwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWVkaXRGaXh0dXJlXCIgY2xhc3M9XCJ1cGRhdGVDbGFzc1wiPkxhc3QgVXBkYXRlOiB7e2Zsb29yRGF0YT8ubGFzdFVwZGF0ZX19PC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC00IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gRWRpdCBGaXh0dXJlIE1vZGUgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRGaXh0dXJlXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB0ZXh0LW5vd3JhcFwiIChjbGljayk9XCJvbkZpeHR1cmVQYWdlQ2FuY2VsKClcIj5cclxuICAgICAgICAgICAgICAgICAgQ2FuY2VsXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRleHQtbm93cmFwXCIgKGNsaWNrKT1cIm9uRml4dHVyZVNhdmUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICBTYXZlICYgQ2xvc2VcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIE5vcm1hbCBNb2RlOiBwZXItdGFzayBwdWJsaXNoIGJ1dHRvbnMgbGl2ZSBpbnNpZGUgdGhlaXIgcmVzcGVjdGl2ZSBjYXJkcyBiZWxvdy5cclxuICAgICAgICAgICAgICAgICAgIFRvcC1yaWdodCBzaG93cyB0aGUgZmluYWwgb3ZlcmFsbCBcIlB1Ymxpc2hcIiBvbmNlIGxheW91dCtmaXh0dXJlK3ZtIGFyZSBhcHByb3ZlZC5cclxuICAgICAgICAgICAgICAgICAgIFdoZW4gYSB6b25lIHRhc2sgZXhpc3RzIGFuZCBpc24ndCBBcHByb3ZlZCB5ZXQsIHRoZSBidXR0b24gc3RheXMgdmlzaWJsZSBidXRcclxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkIChzbyB0aGUgc3RvcmUgY2FuJ3QgYmUgcHVibGlzaGVkIHVudGlsIHpvbmUgdmVyaWZpY2F0aW9uIGNvbXBsZXRlcykuXHJcbiAgICAgICAgICAgICAgICAgICBMZWdhY3kgc3RvcmVzIHdpdGhvdXQgYSB6b25lIHRhc2sgYXJlIHVuYmxvY2tlZCBpbW1lZGlhdGVseS4gLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dUb3BQdWJsaXNoXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5kaWNhdG9yIGNvbXBsZXRlZFwiICpuZ0lmPVwiZmxvb3JEYXRhPy52ZXJpZmljYXRpb25TdGF0dXNcIj5QdWJsaXNoZWQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZmxvb3JEYXRhPy52ZXJpZmljYXRpb25TdGF0dXNcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdGV4dC1ub3dyYXBcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwicHVibGlzaCgpXCIgW2Rpc2FibGVkXT1cInRvcFB1Ymxpc2hEaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICBQdWJsaXNoXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFJldm9rZSBidXR0b25zIGxpdmUgaW5zaWRlIHRoZWlyIHJlc3BlY3RpdmUgY2FyZHMgKExheW91dCAvIEZpeHR1cmVzIC8gVk0gLyBab25lKSBiZWxvdy4gLS0+XHJcblxyXG4gICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJoZWFkZXJcIiBjbGFzcz1cInJvdyBteC0wIGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBQbGFubyBDb21wbGV0aW9uIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjdXJzb3I6IHVuc2V0O1wiIGNsYXNzPVwiY29sIGZpbHRlci10YWJcIj5cclxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgUGxhbm8gQ29tcGxldGlvbiAlXHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIiUgb2Ygb3ZlcmFsbCBwbGFub2dyYW0gY29tcGxldGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTUxN18xMjk4MDUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkgMTJWOU05IDZIOS4wMDc1TTE2LjUgOUMxNi41IDEzLjE0MjEgMTMuMTQyMSAxNi41IDkgMTYuNUM0Ljg1Nzg2IDE2LjUgMS41IDEzLjE0MjEgMS41IDlDMS41IDQuODU3ODYgNC44NTc4NiAxLjUgOSAxLjVDMTMuMTQyMSAxLjUgMTYuNSA0Ljg1Nzg2IDE2LjUgOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMTAxODI4XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTUxN18xMjk4MDVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiIHN0eWxlPVwiaGVpZ2h0OiA0cHhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBbbmdDbGFzc109XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrSW5mbz8ucGxhbm9Qcm9ncmVzcyA8PSA1MFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnYmctd2FybmluZydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGFza0luZm8/LnBsYW5vUHJvZ3Jlc3MgPT09IDc1XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdiZy1wcmltYXJ5J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnYmctc3VjY2VzcydcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgW3N0eWxlXT1cIid3aWR0aDonICsgdGFza0luZm8/LnBsYW5vUHJvZ3Jlc3MgKyAnJSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbm93XT1cInRhc2tJbmZvPy5wbGFub1Byb2dyZXNzXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPnt7IHRhc2tJbmZvPy5wbGFub1Byb2dyZXNzIH19JTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gTGF5b3V0IC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjdXJzb3I6IHVuc2V0O1wiIGNsYXNzPVwiY29sIGZpbHRlci10YWJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQganVzdGlmeS1jb250ZW50LWJldHdlZW4gZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgzPjxiPnt7IHN0b3JlTWV0cmljcy5mbG9vckNvdW50IH19PC9iPiBMYXlvdXQ8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmRpY2F0b3IgbXQtMlwiIFtuZ0NsYXNzXT1cInRhc2tTdHlsZS5sYXlvdXQuY2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMlwiIFtoaWRkZW5dPVwidGFza1N0eWxlLmxheW91dC5uYW1lICE9PSAnUmVkbydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF80OTg0XzI3NTY5KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0wLjUgMi4wMDA3N1Y1LjAwMDc3TTAuNSA1LjAwMDc3SDMuNU0wLjUgNS4wMDA3N0wyLjgyIDIuODIwNzdDMy4zNTczNyAyLjI4MzEzIDQuMDIyMTkgMS44OTAzNyA0Ljc1MjQgMS42NzkxNkM1LjQ4MjYyIDEuNDY3OTQgNi4yNTQ0NSAxLjQ0NTE1IDYuOTk1ODYgMS42MTI5QzcuNzM3MjcgMS43ODA2NSA4LjQyNDEgMi4xMzM0OSA4Ljk5MjI3IDIuNjM4NDhDOS41NjA0MyAzLjE0MzQ3IDkuOTkxNDIgMy43ODQxNiAxMC4yNDUgNC41MDA3N00xMS41IDEwLjAwMDhWNy4wMDA3N00xMS41IDcuMDAwNzdIOC41TTExLjUgNy4wMDA3N0w5LjE4IDkuMTgwNzdDOC42NDI2MyA5LjcxODQxIDcuOTc3ODEgMTAuMTExMiA3LjI0NzYgMTAuMzIyNEM2LjUxNzM4IDEwLjUzMzYgNS43NDU1NSAxMC41NTY0IDUuMDA0MTQgMTAuMzg4NkM0LjI2MjczIDEwLjIyMDkgMy41NzU5IDkuODY4MDUgMy4wMDc3MyA5LjM2MzA2QzIuNDM5NTcgOC44NTgwNyAyLjAwODU4IDguMjE3MzggMS43NTUgNy41MDA3N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM3QTVBRjhcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzQ5ODRfMjc1NjlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtoaWRkZW5dPVwidGFza1N0eWxlLmxheW91dC5uYW1lICE9PSAnRmxhZ2dlZCdcIiBjbGFzcz1cIm1lLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMiA3LjVDMiA3LjUgMi41IDcgNCA3QzUuNSA3IDYuNSA4IDggOEM5LjUgOCAxMCA3LjUgMTAgNy41VjEuNUMxMCAxLjUgOS41IDIgOCAyQzYuNSAyIDUuNSAxIDQgMUMyLjUgMSAyIDEuNSAyIDEuNVY3LjVaTTIgNy41VjExXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNCNDIzMThcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IHRhc2tTdHlsZS5sYXlvdXQubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBMYXlvdXQgYWN0aW9ucyBkaXNhYmxlZCBmb3Igbm93IOKAlCBubyBsYXlvdXQtcmVsYXRlZCBhY3Rpb25zIGFyZSBuZWVkZWQuXHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdEZpeHR1cmUgJiYgKHB1Ymxpc2hpbmdTdGF0ZSA9PT0gJ2xheW91dCcgfHwgcHVibGlzaGluZ1N0YXRlID09PSAnbGF5b3V0LXJlZG8nKSAmJiB0YXNrU3R5bGUubGF5b3V0LmNsYXNzICE9PSAndGFza0Fzc2lnbmVkJyAmJiB0YXNrU3R5bGUubGF5b3V0LmNsYXNzICE9PSAnY29tcGxldGVkJyAmJiB0YXNrU3R5bGUuZml4dHVyZS5jbGFzcyAhPT0gJ3Rhc2tBc3NpZ25lZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNhcmQtcHVibGlzaC1idG5cIiAoY2xpY2spPVwiYXNzaWduVGFzaygpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkUHVibGlzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHB1Ymxpc2hpbmdTdGF0ZSA9PT0gJ2xheW91dC1yZWRvJyA/ICdQdWJsaXNoIExheW91dCBSZWRvJyA6ICdQdWJsaXNoIExheW91dCBWZXJpZmljYXRpb24nIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRGaXh0dXJlICYmIHRhc2tTdHlsZS5sYXlvdXQuY2xhc3MgPT09ICd0YXNrQXNzaWduZWQnXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXJkLXJldm9rZS1idG5cIiAoY2xpY2spPVwicmV2b2tlVGFzaygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzY0MF81NTk0bGF5KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi42NjY2OSAxMC4wMDEzSDEzLjMzMzRNMTguMzMzNCAxMC4wMDEzQzE4LjMzMzQgMTQuNjAzNyAxNC42MDI0IDE4LjMzNDYgMTAgMTguMzM0NkM1LjM5NzY1IDE4LjMzNDYgMS42NjY2OSAxNC42MDM3IDEuNjY2NjkgMTAuMDAxM0MxLjY2NjY5IDUuMzk4OTMgNS4zOTc2NSAxLjY2Nzk3IDEwIDEuNjY3OTdDMTQuNjAyNCAxLjY2Nzk3IDE4LjMzMzQgNS4zOTg5MyAxOC4zMzM0IDEwLjAwMTNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjQjQyMzE4XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNjQwXzU1OTRsYXlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIFJldm9rZVxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgLS0+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBGaXh0dXJlcyAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY3Vyc29yOiB1bnNldDtcIiBjbGFzcz1cImNvbCBmaWx0ZXItdGFiXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMz48Yj57eyBzdG9yZU1ldHJpY3MuZml4dHVyZUNvdW50IH19PC9iPiBGaXh0dXJlczwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZGljYXRvciBtdC0yXCIgW25nQ2xhc3NdPVwidGFza1N0eWxlLmZpeHR1cmUuY2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMlwiIFtoaWRkZW5dPVwidGFza1N0eWxlLmZpeHR1cmUubmFtZSAhPT0gJ1JlZG8nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNDk4NF8yNzU2OSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMC41IDIuMDAwNzdWNS4wMDA3N00wLjUgNS4wMDA3N0gzLjVNMC41IDUuMDAwNzdMMi44MiAyLjgyMDc3QzMuMzU3MzcgMi4yODMxMyA0LjAyMjE5IDEuODkwMzcgNC43NTI0IDEuNjc5MTZDNS40ODI2MiAxLjQ2Nzk0IDYuMjU0NDUgMS40NDUxNSA2Ljk5NTg2IDEuNjEyOUM3LjczNzI3IDEuNzgwNjUgOC40MjQxIDIuMTMzNDkgOC45OTIyNyAyLjYzODQ4QzkuNTYwNDMgMy4xNDM0NyA5Ljk5MTQyIDMuNzg0MTYgMTAuMjQ1IDQuNTAwNzdNMTEuNSAxMC4wMDA4VjcuMDAwNzdNMTEuNSA3LjAwMDc3SDguNU0xMS41IDcuMDAwNzdMOS4xOCA5LjE4MDc3QzguNjQyNjMgOS43MTg0MSA3Ljk3NzgxIDEwLjExMTIgNy4yNDc2IDEwLjMyMjRDNi41MTczOCAxMC41MzM2IDUuNzQ1NTUgMTAuNTU2NCA1LjAwNDE0IDEwLjM4ODZDNC4yNjI3MyAxMC4yMjA5IDMuNTc1OSA5Ljg2ODA1IDMuMDA3NzMgOS4zNjMwNkMyLjQzOTU3IDguODU4MDcgMi4wMDg1OCA4LjIxNzM4IDEuNzU1IDcuNTAwNzdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjN0E1QUY4XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF80OTg0XzI3NTY5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cInRhc2tTdHlsZS5maXh0dXJlLm5hbWUgIT09ICdGbGFnZ2VkJ1wiIGNsYXNzPVwibWUtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yIDcuNUMyIDcuNSAyLjUgNyA0IDdDNS41IDcgNi41IDggOCA4QzkuNSA4IDEwIDcuNSAxMCA3LjVWMS41QzEwIDEuNSA5LjUgMiA4IDJDNi41IDIgNS41IDEgNCAxQzIuNSAxIDIgMS41IDIgMS41VjcuNVpNMiA3LjVWMTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0I0MjMxOFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgdGFza1N0eWxlLmZpeHR1cmUubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0Rml4dHVyZSAmJiAocHVibGlzaGluZ1N0YXRlID09PSAnZml4dHVyZScgfHwgcHVibGlzaGluZ1N0YXRlID09PSAnZml4dHVyZS1yZWRvJykgJiYgdGFza1N0eWxlLmZpeHR1cmUuY2xhc3MgIT09ICd0YXNrQXNzaWduZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjYXJkLXB1Ymxpc2gtYnRuXCIgKGNsaWNrKT1cImFzc2lnblRhc2soKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFB1Ymxpc2hcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBwdWJsaXNoaW5nU3RhdGUgPT09ICdmaXh0dXJlLXJlZG8nID8gJ1B1Ymxpc2ggUmVkbycgOiAnUHVibGlzaCBUYXNrJyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0Rml4dHVyZSAmJiB0YXNrU3R5bGUuZml4dHVyZS5jbGFzcyA9PT0gJ3Rhc2tBc3NpZ25lZCdcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtcmV2b2tlLWJ0blwiIChjbGljayk9XCJyZXZva2VUYXNrKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNjQwXzU1OTRmaXgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk02LjY2NjY5IDEwLjAwMTNIMTMuMzMzNE0xOC4zMzM0IDEwLjAwMTNDMTguMzMzNCAxNC42MDM3IDE0LjYwMjQgMTguMzM0NiAxMCAxOC4zMzQ2QzUuMzk3NjUgMTguMzM0NiAxLjY2NjY5IDE0LjYwMzcgMS42NjY2OSAxMC4wMDEzQzEuNjY2NjkgNS4zOTg5MyA1LjM5NzY1IDEuNjY3OTcgMTAgMS42Njc5N0MxNC42MDI0IDEuNjY3OTcgMTguMzMzNCA1LjM5ODkzIDE4LjMzMzQgMTAuMDAxM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNCNDIzMThcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF82NDBfNTU5NGZpeFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgUmV2b2tlXHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gVmlzdWFsIE1lcmNoYW5kaXNlIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS1cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY3Vyc29yOiB1bnNldDtcIiBjbGFzcz1cImNvbCBmaWx0ZXItdGFiXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcCBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cIm0tMFwiPjxiPnt7IHN0b3JlTWV0cmljcy52bUNvdW50IH19PC9iPiBWaXN1YWwgTWVyY2hhbmRpc2U8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmRpY2F0b3JcIiBbbmdDbGFzc109XCJ0YXNrU3R5bGUudm0uY2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMlwiIFtoaWRkZW5dPVwidGFza1N0eWxlLnZtLm5hbWUgIT09ICdSZWRvJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzQ5ODRfMjc1NjkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTAuNSAyLjAwMDc3VjUuMDAwNzdNMC41IDUuMDAwNzdIMy41TTAuNSA1LjAwMDc3TDIuODIgMi44MjA3N0MzLjM1NzM3IDIuMjgzMTMgNC4wMjIxOSAxLjg5MDM3IDQuNzUyNCAxLjY3OTE2QzUuNDgyNjIgMS40Njc5NCA2LjI1NDQ1IDEuNDQ1MTUgNi45OTU4NiAxLjYxMjlDNy43MzcyNyAxLjc4MDY1IDguNDI0MSAyLjEzMzQ5IDguOTkyMjcgMi42Mzg0OEM5LjU2MDQzIDMuMTQzNDcgOS45OTE0MiAzLjc4NDE2IDEwLjI0NSA0LjUwMDc3TTExLjUgMTAuMDAwOFY3LjAwMDc3TTExLjUgNy4wMDA3N0g4LjVNMTEuNSA3LjAwMDc3TDkuMTggOS4xODA3N0M4LjY0MjYzIDkuNzE4NDEgNy45Nzc4MSAxMC4xMTEyIDcuMjQ3NiAxMC4zMjI0QzYuNTE3MzggMTAuNTMzNiA1Ljc0NTU1IDEwLjU1NjQgNS4wMDQxNCAxMC4zODg2QzQuMjYyNzMgMTAuMjIwOSAzLjU3NTkgOS44NjgwNSAzLjAwNzczIDkuMzYzMDZDMi40Mzk1NyA4Ljg1ODA3IDIuMDA4NTggOC4yMTczOCAxLjc1NSA3LjUwMDc3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzdBNUFGOFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDk4NF8yNzU2OVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCJ0YXNrU3R5bGUudm0ubmFtZSAhPT0gJ0ZsYWdnZWQnXCIgY2xhc3M9XCJtZS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIgNy41QzIgNy41IDIuNSA3IDQgN0M1LjUgNyA2LjUgOCA4IDhDOS41IDggMTAgNy41IDEwIDcuNVYxLjVDMTAgMS41IDkuNSAyIDggMkM2LjUgMiA1LjUgMSA0IDFDMi41IDEgMiAxLjUgMiAxLjVWNy41Wk0yIDcuNVYxMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjQjQyMzE4XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyB0YXNrU3R5bGUudm0ubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0Rml4dHVyZSAmJiAocHVibGlzaGluZ1N0YXRlID09PSAndm0nIHx8IHB1Ymxpc2hpbmdTdGF0ZSA9PT0gJ3ZtLXJlZG8nKSAmJiB0YXNrU3R5bGUudm0uY2xhc3MgIT09ICd0YXNrQXNzaWduZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjYXJkLXB1Ymxpc2gtYnRuXCIgKGNsaWNrKT1cImFzc2lnblRhc2soKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFB1Ymxpc2hcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBwdWJsaXNoaW5nU3RhdGUgPT09ICd2bS1yZWRvJyA/ICdQdWJsaXNoIFJlZG8nIDogJ1B1Ymxpc2gnIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRGaXh0dXJlICYmIHRhc2tTdHlsZS52bS5jbGFzcyA9PT0gJ3Rhc2tBc3NpZ25lZCdcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtcmV2b2tlLWJ0blwiIChjbGljayk9XCJyZXZva2VUYXNrKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNjQwXzU1OTR2bSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTYuNjY2NjkgMTAuMDAxM0gxMy4zMzM0TTE4LjMzMzQgMTAuMDAxM0MxOC4zMzM0IDE0LjYwMzcgMTQuNjAyNCAxOC4zMzQ2IDEwIDE4LjMzNDZDNS4zOTc2NSAxOC4zMzQ2IDEuNjY2NjkgMTQuNjAzNyAxLjY2NjY5IDEwLjAwMTNDMS42NjY2OSA1LjM5ODkzIDUuMzk3NjUgMS42Njc5NyAxMCAxLjY2Nzk3QzE0LjYwMjQgMS42Njc5NyAxOC4zMzM0IDUuMzk4OTMgMTguMzMzNCAxMC4wMDEzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0I0MjMxOFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzY0MF81NTk0dm1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIFJldm9rZVxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIC0tPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFpvbmUgVmVyaWZpY2F0aW9uIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjdXJzb3I6IHVuc2V0O1wiIGNsYXNzPVwiY29sIGZpbHRlci10YWJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQganVzdGlmeS1jb250ZW50LWJldHdlZW4gZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgzPlpvbmUgVmVyaWZpY2F0aW9uPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5kaWNhdG9yIG10LTJcIiBbbmdDbGFzc109XCJ6b25lVGFza1N0eWxlLmNsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTJcIiBbaGlkZGVuXT1cInpvbmVUYXNrU3R5bGUubmFtZSAhPT0gJ1JlZG8nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNDk4NF8yNzU2OSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMC41IDIuMDAwNzdWNS4wMDA3N00wLjUgNS4wMDA3N0gzLjVNMC41IDUuMDAwNzdMMi44MiAyLjgyMDc3QzMuMzU3MzcgMi4yODMxMyA0LjAyMjE5IDEuODkwMzcgNC43NTI0IDEuNjc5MTZDNS40ODI2MiAxLjQ2Nzk0IDYuMjU0NDUgMS40NDUxNSA2Ljk5NTg2IDEuNjEyOUM3LjczNzI3IDEuNzgwNjUgOC40MjQxIDIuMTMzNDkgOC45OTIyNyAyLjYzODQ4QzkuNTYwNDMgMy4xNDM0NyA5Ljk5MTQyIDMuNzg0MTYgMTAuMjQ1IDQuNTAwNzdNMTEuNSAxMC4wMDA4VjcuMDAwNzdNMTEuNSA3LjAwMDc3SDguNU0xMS41IDcuMDAwNzdMOS4xOCA5LjE4MDc3QzguNjQyNjMgOS43MTg0MSA3Ljk3NzgxIDEwLjExMTIgNy4yNDc2IDEwLjMyMjRDNi41MTczOCAxMC41MzM2IDUuNzQ1NTUgMTAuNTU2NCA1LjAwNDE0IDEwLjM4ODZDNC4yNjI3MyAxMC4yMjA5IDMuNTc1OSA5Ljg2ODA1IDMuMDA3NzMgOS4zNjMwNkMyLjQzOTU3IDguODU4MDcgMi4wMDg1OCA4LjIxNzM4IDEuNzU1IDcuNTAwNzdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjN0E1QUY4XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF80OTg0XzI3NTY5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyB6b25lVGFza1N0eWxlLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdEZpeHR1cmUgJiYgIXpvbmVGZWVkYmFjaz8uem9uZVZlcmlmaWNhdGlvblRhc2tcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtcHVibGlzaC1idG5cIiAoY2xpY2spPVwicHVibGlzaFpvbmVWZXJpZmljYXRpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFB1Ymxpc2ggVGFza1xyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0Rml4dHVyZSAmJiB6b25lUmVkb1N0YXR1c1wiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1wdWJsaXNoLWJ0blwiIChjbGljayk9XCJwdWJsaXNoWm9uZVJlZG8oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFB1Ymxpc2ggUmVkb1xyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0Rml4dHVyZSAmJiB6b25lVGFza1N0eWxlLmNsYXNzID09PSAndGFza0Fzc2lnbmVkJ1wiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1yZXZva2UtYnRuXCIgKGNsaWNrKT1cInJldm9rZVpvbmVUYXNrKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNjQwXzU1OTR6KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi42NjY2OSAxMC4wMDEzSDEzLjMzMzRNMTguMzMzNCAxMC4wMDEzQzE4LjMzMzQgMTQuNjAzNyAxNC42MDI0IDE4LjMzNDYgMTAgMTguMzM0NkM1LjM5NzY1IDE4LjMzNDYgMS42NjY2OSAxNC42MDM3IDEuNjY2NjkgMTAuMDAxM0MxLjY2NjY5IDUuMzk4OTMgNS4zOTc2NSAxLjY2Nzk3IDEwIDEuNjY3OTdDMTQuNjAyNCAxLjY2Nzk3IDE4LjMzMzQgNS4zOTg5MyAxOC4zMzM0IDEwLjAwMTNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjQjQyMzE4XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNjQwXzU1OTR6XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICBSZXZva2VcclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEJvZHkgLS0+XHJcbiAgICA8ZGl2IGlkPVwiYm9keVwiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgIDwhLS0gTGVmdCBDb2x1bW4gLS0+XHJcbiAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyAnY29sbGFwc2VkLWNvbCc6IGlzTGVmdFBhbmVsQ29sbGFwc2VkLCAnY29sLTMnOiAhaXNMZWZ0UGFuZWxDb2xsYXBzZWQsJ2Qtbm9uZSc6IGVkaXRGaXh0dXJlICB9XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInMtY2FyZFwiPlxyXG4gICAgICAgICAgPGZvcm0gW25nQ2xhc3NdPVwieyAnZC1ub25lJzogaXNMZWZ0UGFuZWxDb2xsYXBzZWQgfVwiIFtmb3JtR3JvdXBdPVwibGF5b3V0Rm9ybVwiPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbiAjYm9keUFjY29yZGlvbj1cIm5nYkFjY29yZGlvblwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gV2FsbHMgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Rm9ybVdhbGxzLmNvbnRyb2xzLmxlbmd0aDsgZWxzZSBhZGRXYWxsQWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGZvcm1BcnJheU5hbWU9XCJ3YWxsc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cCBvZiBnZXRGb3JtV2FsbHMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtmb3JtR3JvdXBOYW1lXT1cImlcIiBbbmdiQWNjb3JkaW9uSXRlbV09XCInYWNjb3JkaW9uLXdhbGwtJyArIGlcIiBjbGFzcz1cIm1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWFpbmhlYWRpbmcgcC0wXCIgbmdiQWNjb3JkaW9uQnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTIgd2FsbC1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBncm91cC5nZXQoXCJlbGVtZW50VHlwZVwiKT8udmFsdWUgfCB0aXRsZWNhc2UgfX0ge3sgZ3JvdXAuZ2V0KFwiZWxlbWVudE51bWJlclwiKT8udmFsdWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYobGF5b3V0Rm9ybS5lbmFibGVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0xXCIgbmdiVG9vbHRpcD1cIlJvdGF0ZSB0aGlzIHdhbGwuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicm90YXRlV2FsbChnZXRFbGVtZW50TnVtYmVyKGdyb3VwKSEpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMy43MzczNSA4LjI1MDExQzQuMTIxOTMgOC4yNDM2MiA0LjQ0Mzc3IDguNTI3NzYgNC40OTMzOCA4Ljg5OTk4TDQuNDk5OSA4Ljk4NzM1TDQuNTAyNjIgOS4xNTUxNkM0LjU4NDM0IDExLjU3NDEgNi41NzI0MyAxMy41IDkgMTMuNUM5LjE0MDIyIDEzLjUgOS4yNzk1MSAxMy40OTM2IDkuNDE3NTYgMTMuNDgwOUw5LjIxOTY3IDEzLjI4MDNDOC45MjY3OCAxMi45ODc0IDguOTI2NzggMTIuNTEyNiA5LjIxOTY3IDEyLjIxOTdDOS41MTI1NyAxMS45MjY4IDkuOTg3NDQgMTEuOTI2OCAxMC4yODAzIDEyLjIxOTdMMTEuNzgwMyAxMy43MTk3QzEyLjA3MzIgMTQuMDEyNiAxMi4wNzMyIDE0LjQ4NzQgMTEuNzgwMyAxNC43ODAzTDEwLjI4MDMgMTYuMjgwM0M5Ljk4NzQ0IDE2LjU3MzIgOS41MTI1NyAxNi41NzMyIDkuMjE5NjcgMTYuMjgwM0M4LjkyNjc4IDE1Ljk4NzQgOC45MjY3OCAxNS41MTI2IDkuMjE5NjcgMTUuMjE5N0w5LjQ1ODM3IDE0Ljk4MjdDOS4zMDY0NiAxNC45OTQyIDkuMTUzNTkgMTUgOSAxNUM1LjgyNjUzIDE1IDMuMjE2NjUgMTIuNTMyMSAzLjAxMjUgOS4zODI4OUwzLjAwMzE1IDkuMTkzMTRMMy4wMDAxMSA5LjAxMjY1QzIuOTkzMTIgOC41OTg0OSAzLjMyMzIgOC4yNTcwOSAzLjczNzM1IDguMjUwMTFaTTguNzgwMzMgMS43MTk2N0M5LjA1MDcgMS45OTAwMyA5LjA3MTQ5IDIuNDE1NDYgOC44NDI3MiAyLjcwOTY3TDguNzgwMzMgMi43ODAzM0w4LjU0MTg3IDMuMDE3MjZDOC42OTM3MSAzLjAwNTc4IDguODQ2NSAzIDkgM0MxMi4zMTM3IDMgMTUgNS42ODYyOSAxNSA5QzE1IDkuNDE0MjEgMTQuNjY0MiA5Ljc1IDE0LjI1IDkuNzVDMTMuODM1OCA5Ljc1IDEzLjUgOS40MTQyMSAxMy41IDlDMTMuNSA2LjUxNDcyIDExLjQ4NTMgNC41IDkgNC41QzguODU5NyA0LjUgOC43MjAzNCA0LjUwNjQgOC41ODIyMSA0LjUxOTA5TDguNzgwMzMgNC43MTk2N0M5LjA3MzIzIDUuMDEyNTYgOS4wNzMyMyA1LjQ4NzQ0IDguNzgwMzMgNS43ODAzM0M4LjUwOTk3IDYuMDUwNjkgOC4wODQ1NSA2LjA3MTQ5IDcuNzkwMzMgNS44NDI3Mkw3LjcxOTY3IDUuNzgwMzNMNi4yMTk2NyA0LjI4MDMzQzUuOTQ5MzEgNC4wMDk5NyA1LjkyODUxIDMuNTg0NTQgNi4xNTcyOCAzLjI5MDMzTDYuMjE5NjcgMy4yMTk2N0w3LjcxOTY3IDEuNzE5NjdDOC4wMTI1NyAxLjQyNjc4IDguNDg3NDQgMS40MjY3OCA4Ljc4MDMzIDEuNzE5NjdaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiBzdHJva2U9XCIjNDc1NDY3XCIgc3Ryb2tlLXdpZHRoPVwiMC4wMDA2NFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0xXCIgbmdiVG9vbHRpcD1cIkluc2VydCBuZXcgd2FsbCBiZWxvdy5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROZXdXYWxsKGdldEVsZW1lbnROdW1iZXIoZ3JvdXApISk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMTggMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNjJfOClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkgOS43NUMxMS4wNzA3IDkuNzUgMTIuNzUgMTEuNDI5MyAxMi43NSAxMy41QzEyLjc1IDE1LjU3MDggMTEuMDcwNyAxNy4yNSA5IDE3LjI1QzYuOTI5MjUgMTcuMjUgNS4yNSAxNS41NzA4IDUuMjUgMTMuNUM1LjI1IDExLjQyOTMgNi45MjkyNSA5Ljc1IDkgOS43NVpNOS43NSAxMS4yNUg4LjI1VjEyLjc0OTNMNi43NSAxMi43NVYxNC4yNUw4LjI1IDE0LjI0OTNWMTUuNzVIOS43NVYxNC4yNDkzTDExLjI1IDE0LjI1VjEyLjc1TDkuNzUgMTIuNzQ5M1YxMS4yNVpNMTUgMi4yNUMxNS40MTQgMi4yNSAxNS43NSAyLjU4NiAxNS43NSAzVjcuNUMxNS43NSA3LjkxNCAxNS40MTQgOC4yNSAxNSA4LjI1SDNDMi41ODYgOC4yNSAyLjI1IDcuOTE0IDIuMjUgNy41VjNDMi4yNSAyLjU4NiAyLjU4NiAyLjI1IDMgMi4yNUgxNVpNMy43NSAzLjc1VjYuNzVIMTQuMjVWMy43NUgzLjc1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzYyXzhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMVwiIG5nYlRvb2x0aXA9XCJSZW1vdmUgdGhpcyB3YWxsIGFuZCBpdHMgZml4dHVyZXMuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlV2FsbChnZXRFbGVtZW50TnVtYmVyKGdyb3VwKSEpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzYzXzI1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNzA5NCAxLjVDMTEuMzU1MSAxLjUgMTEuOTI4MyAxLjkxMzE0IDEyLjEzMjQgMi41MjU2NUwxMi41NDA2IDMuNzVIMTVDMTUuNDE0MiAzLjc1IDE1Ljc1IDQuMDg1NzkgMTUuNzUgNC41QzE1Ljc1IDQuOTE0MiAxNS40MTQyIDUuMjQ5OTkgMTUgNS4yNUwxNC45OTgxIDUuMzAzNDRMMTQuMzQ3NiAxNC40MTAzQzE0LjI2MzUgMTUuNTg3OCAxMy4yODM4IDE2LjUgMTIuMTAzNCAxNi41SDUuODk2NjhDNC43MTYyNCAxNi41IDMuNzM2NSAxNS41ODc4IDMuNjUyNCAxNC40MTAzTDMuMDAxOTEgNS4zMDM0NEMzLjAwMDYyIDUuMjg1NTEgMi45OTk5OCA1LjI2NzY5IDIuOTk5OTcgNS4yNUMyLjU4NTc3IDUuMjQ5OTkgMi4yNSA0LjkxNDIgMi4yNSA0LjVDMi4yNSA0LjA4NTc5IDIuNTg1NzkgMy43NSAzIDMuNzVINS40NTk0M0w1Ljg2NzU0IDIuNTI1NjVDNi4wNzE3MiAxLjkxMzE0IDYuNjQ0OTMgMS41IDcuMjkwNTcgMS41SDEwLjcwOTRaTTEzLjQ5ODEgNS4yNUg0LjUwMTkxTDUuMTQ4NTggMTQuMzAzNEM1LjE3NjYyIDE0LjY5NiA1LjUwMzIgMTUgNS44OTY2OCAxNUgxMi4xMDM0QzEyLjQ5NjggMTUgMTIuODIzNCAxNC42OTYgMTIuODUxNCAxNC4zMDM0TDEzLjQ5ODEgNS4yNVpNNy41IDcuNUM3Ljg4NDY0IDcuNSA4LjIwMTYzIDcuNzg5NTIgOC4yNDQ5NSA4LjE2MjUzTDguMjUgOC4yNVYxMkM4LjI1IDEyLjQxNDIgNy45MTQyMiAxMi43NSA3LjUgMTIuNzVDNy4xMTUzNyAxMi43NSA2Ljc5ODM3IDEyLjQ2MDUgNi43NTUwNSAxMi4wODc1TDYuNzUgMTJWOC4yNUM2Ljc1IDcuODM1NzggNy4wODU3OCA3LjUgNy41IDcuNVpNMTAuNSA3LjVDMTAuOTE0MiA3LjUgMTEuMjUgNy44MzU3OCAxMS4yNSA4LjI1VjEyQzExLjI1IDEyLjQxNDIgMTAuOTE0MiAxMi43NSAxMC41IDEyLjc1QzEwLjA4NTggMTIuNzUgOS43NSAxMi40MTQyIDkuNzUgMTJWOC4yNUM5Ljc1IDcuODM1NzggMTAuMDg1OCA3LjUgMTAuNSA3LjVaTTEwLjcwOTQgM0g3LjI5MDU3TDcuMDQwNTcgMy43NUgxMC45NTk1TDEwLjcwOTQgM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjMyQjJCXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF82M18yNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keSBjbGFzcz1cInBzLTAgcGUtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtaW4taGVpZ2h0OiA1MHB4XCIgZG5kRHJvcHpvbmUgKGRuZERyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaXh0dXJlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEZvcm1GaXh0dXJlcyhpKS5jb250cm9scy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJmaXh0dXJlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZml4dHVyZSBvZiBnZXRGb3JtRml4dHVyZXMoaSkuY29udHJvbHM7IGxldCBqID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkbmREcm9wem9uZSAoZG5kRHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpLCBqKVwiIFtmb3JtR3JvdXBOYW1lXT1cImpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkbmREcmFnZ2FibGVdPVwieyB3YWxsSW5kZXg6IGksIGZpeHR1cmVJbmRleDogaiB9XCIgW2RuZEVmZmVjdEFsbG93ZWRdPVwiJ2FsbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm93IGctMCBtYi01IGZpeHR1cmUtcm93XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGlnaGxpZ2h0ZWQtZml4dHVyZV09XCJsYXlvdXRGb3JtLmVuYWJsZWQgJiYgaGlnaGxpZ2h0ZWRGaXh0dXJlRm9ybUlkICYmIGZpeHR1cmUuZ2V0KCdfaWQnKT8udmFsdWUgPT09IGhpZ2hsaWdodGVkRml4dHVyZUZvcm1JZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RuZERpc2FibGVEcmFnSWZdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgaC0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBkbmREcmFnSW1hZ2VSZWZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwieyBjdXJzb3I6IGxheW91dEZvcm0uZGlzYWJsZWQgPyAnZGVmYXVsdCcgOiAnbW92ZScsIG9wYWNpdHk6ICcwLjUnIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjVweFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJtIDQuNDk2MDk0IDAgYyAtMC44MzIwMzIgMCAtMS41IDAuNjcxODc1IC0xLjUgMS41IHMgMC42Njc5NjggMS41IDEuNSAxLjUgYyAwLjgyODEyNSAwIDEuNSAtMC42NzE4NzUgMS41IC0xLjUgcyAtMC42NzE4NzUgLTEuNSAtMS41IC0xLjUgeiBtIDYgMCBjIC0wLjgzMjAzMiAwIC0xLjUgMC42NzE4NzUgLTEuNSAxLjUgcyAwLjY2Nzk2OCAxLjUgMS41IDEuNSBjIDAuODI4MTI1IDAgMS41IC0wLjY3MTg3NSAxLjUgLTEuNSBzIC0wLjY3MTg3NSAtMS41IC0xLjUgLTEuNSB6IG0gLTYgNiBjIC0wLjgzMjAzMiAwIC0xLjUgMC42NzE4NzUgLTEuNSAxLjUgcyAwLjY2Nzk2OCAxLjUgMS41IDEuNSBjIDAuODI4MTI1IDAgMS41IC0wLjY3MTg3NSAxLjUgLTEuNSBzIC0wLjY3MTg3NSAtMS41IC0xLjUgLTEuNSB6IG0gNiAwIGMgLTAuODMyMDMyIDAgLTEuNSAwLjY3MTg3NSAtMS41IDEuNSBzIDAuNjY3OTY4IDEuNSAxLjUgMS41IGMgMC44MjgxMjUgMCAxLjUgLTAuNjcxODc1IDEuNSAtMS41IHMgLTAuNjcxODc1IC0xLjUgLTEuNSAtMS41IHogbSAtNiA2IGMgLTAuODMyMDMyIDAgLTEuNSAwLjY3MTg3NSAtMS41IDEuNSBzIDAuNjY3OTY4IDEuNSAxLjUgMS41IGMgMC44MjgxMjUgMCAxLjUgLTAuNjcxODc1IDEuNSAtMS41IHMgLTAuNjcxODc1IC0xLjUgLTEuNSAtMS41IHogbSA2IDAgYyAtMC44MzIwMzIgMCAtMS41IDAuNjcxODc1IC0xLjUgMS41IHMgMC42Njc5NjggMS41IDEuNSAxLjUgYyAwLjgyODEyNSAwIDEuNSAtMC42NzE4NzUgMS41IC0xLjUgcyAtMC42NzE4NzUgLTEuNSAtMS41IC0xLjUgeiBtIDAgMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiZ3JleVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImZpeHR1cmVDb25maWdJZFwiIFtpZEZpZWxkXT1cIidfaWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVGaWVsZF09XCInbmFtZSdcIiBbZGF0YV09XCJmaXh0dXJlVGVtcGxhdGVzXCIgW2xhYmVsXT1cIidGaXh0dXJlICcgKyAoaiArIDEpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1YlRleHRGaWVsZF09XCInc3VidGV4dCdcIiBbc2VhcmNoXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWVuZCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGgtMTAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cImxheW91dEZvcm0uZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAoY2xpY2spPVwiZGVsZXRlRml4dHVyZSgnd2FsbCcsIGosIGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgbWFyZ2luLWJvdHRvbTogMThweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDFMMSA5TTEgMUw5IDlcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGluay1idG5cIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTmV3Rml4dHVyZSgnd2FsbCcsIGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgZml4dHVyZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHIgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggZGFzaGVkICMwMDAwMDA7XCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT3RoZXIgRWxlbWVudHMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRXYWxsT3RoZXJFbGVtZW50cyhpKS5jb250cm9scy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJvdGhlckVsZW1lbnRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaXh0dXJlIG9mIGdldFdhbGxPdGhlckVsZW1lbnRzKGkpLmNvbnRyb2xzOyBsZXQgaiA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2Zvcm1Hcm91cE5hbWVdPVwialwiIGNsYXNzPVwicm93IGctMCBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+RWxlbWVudCB7eyBqICsgMSB9fTwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEcm9wZG93biBib3VuZCB0byAndHlwZScgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwib3RoZXJFbGVtZW50TGlzdFwiIFtpZF09XCInZWxlbWVudExhYmVsJyArIGpcIiBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTaG93IGN1c3RvbSB0ZXh0IGlucHV0IG9ubHkgd2hlbiAnT3RoZXJzJyBpcyBzZWxlY3RlZCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIihmaXh0dXJlLmdldCgndHlwZScpPy52YWx1ZSkgPT09ICdPdGhlcnMnXCIgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBtdC0yXCIgZm9ybUNvbnRyb2xOYW1lPVwiY3VzdG9tTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgY3VzdG9tIGVsZW1lbnQgbmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1lbmQganVzdGlmeS1jb250ZW50LWNlbnRlciBoLTEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJsYXlvdXRGb3JtLmRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKGNsaWNrKT1cInJlbW92ZU90aGVyRWxlbWVudCgnd2FsbCcsIGosIGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgbWFyZ2luLWJvdHRvbTogMThweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDFMMSA5TTEgMUw5IDlcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGluay1idG5cIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTmV3T3RoZXJFbGVtZW50cygnd2FsbCcsIGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2FkZFdhbGxBY3Rpb24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJhZGROZXdXYWxsKDApXCIgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cImxheW91dEZvcm0uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IHctMTAwIHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICBJbnNlcnQgbmV3IHdhbGxcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDxociBzdHlsZT1cImJvcmRlci10b3A6IDFweCBkYXNoZWQgIzAwMDAwMDtcIiAvPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEZsb29yIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBbbmdiQWNjb3JkaW9uSXRlbV09XCInYWNjb3JkaW9uLWZsb29yJ1wiIGNsYXNzPVwibWItNVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiIG5nYkFjY29yZGlvbkhlYWRlcj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYWluaGVhZGluZyBwLTBcIiBuZ2JBY2NvcmRpb25CdXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0yIHdhbGwtbGFiZWxcIj5GbG9vcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keSBjbGFzcz1cInBzLTAgcGUtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtaW4taGVpZ2h0OiA1MHB4XCIgZG5kRHJvcHpvbmUgKGRuZERyb3ApPVwib25Ecm9wKCRldmVudCwgJ2Zsb29yJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGbG9vciBGaXh0dXJlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEZvcm1GbG9vckZpeHR1cmVzLmNvbnRyb2xzLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cImZsb29yRml4dHVyZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpeHR1cmUgb2YgZ2V0Rm9ybUZsb29yRml4dHVyZXMuY29udHJvbHM7IGxldCBqID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkbmREcm9wem9uZSAoZG5kRHJvcCk9XCJvbkRyb3AoJGV2ZW50LCAnZmxvb3InLCBqKVwiIFtmb3JtR3JvdXBOYW1lXT1cImpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkbmREcmFnZ2FibGVdPVwieyB3YWxsSW5kZXg6ICdmbG9vcicsIGZpeHR1cmVJbmRleDogaiB9XCIgW2RuZEVmZmVjdEFsbG93ZWRdPVwiJ2FsbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkbmREaXNhYmxlRHJhZ0lmXT1cImxheW91dEZvcm0uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm93IGctMCBtYi01IGZpeHR1cmUtcm93XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGlnaGxpZ2h0ZWQtZml4dHVyZV09XCJsYXlvdXRGb3JtLmVuYWJsZWQgJiYgaGlnaGxpZ2h0ZWRGaXh0dXJlRm9ybUlkICYmIGZpeHR1cmUuZ2V0KCdfaWQnKT8udmFsdWUgPT09IGhpZ2hsaWdodGVkRml4dHVyZUZvcm1JZFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgaC0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBkbmREcmFnSW1hZ2VSZWYgc3R5bGU9XCJjdXJzb3I6IG1vdmU7IG9wYWNpdHk6IDAuNVwiIHdpZHRoPVwiMjVweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIm0gNC40OTYwOTQgMCBjIC0wLjgzMjAzMiAwIC0xLjUgMC42NzE4NzUgLTEuNSAxLjUgcyAwLjY2Nzk2OCAxLjUgMS41IDEuNSBjIDAuODI4MTI1IDAgMS41IC0wLjY3MTg3NSAxLjUgLTEuNSBzIC0wLjY3MTg3NSAtMS41IC0xLjUgLTEuNSB6IG0gNiAwIGMgLTAuODMyMDMyIDAgLTEuNSAwLjY3MTg3NSAtMS41IDEuNSBzIDAuNjY3OTY4IDEuNSAxLjUgMS41IGMgMC44MjgxMjUgMCAxLjUgLTAuNjcxODc1IDEuNSAtMS41IHMgLTAuNjcxODc1IC0xLjUgLTEuNSAtMS41IHogbSAtNiA2IGMgLTAuODMyMDMyIDAgLTEuNSAwLjY3MTg3NSAtMS41IDEuNSBzIDAuNjY3OTY4IDEuNSAxLjUgMS41IGMgMC44MjgxMjUgMCAxLjUgLTAuNjcxODc1IDEuNSAtMS41IHMgLTAuNjcxODc1IC0xLjUgLTEuNSAtMS41IHogbSA2IDAgYyAtMC44MzIwMzIgMCAtMS41IDAuNjcxODc1IC0xLjUgMS41IHMgMC42Njc5NjggMS41IDEuNSAxLjUgYyAwLjgyODEyNSAwIDEuNSAtMC42NzE4NzUgMS41IC0xLjUgcyAtMC42NzE4NzUgLTEuNSAtMS41IC0xLjUgeiBtIC02IDYgYyAtMC44MzIwMzIgMCAtMS41IDAuNjcxODc1IC0xLjUgMS41IHMgMC42Njc5NjggMS41IDEuNSAxLjUgYyAwLjgyODEyNSAwIDEuNSAtMC42NzE4NzUgMS41IC0xLjUgcyAtMC42NzE4NzUgLTEuNSAtMS41IC0xLjUgeiBtIDYgMCBjIC0wLjgzMjAzMiAwIC0xLjUgMC42NzE4NzUgLTEuNSAxLjUgcyAwLjY2Nzk2OCAxLjUgMS41IDEuNSBjIDAuODI4MTI1IDAgMS41IC0wLjY3MTg3NSAxLjUgLTEuNSBzIC0wLjY3MTg3NSAtMS41IC0xLjUgLTEuNSB6IG0gMCAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJncmV5XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZml4dHVyZUNvbmZpZ0lkXCIgW2lkRmllbGRdPVwiJ19pZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZUZpZWxkXT1cIiduYW1lJ1wiIFtkYXRhXT1cImZpeHR1cmVUZW1wbGF0ZXNcIiBbbGFiZWxdPVwiJ0ZpeHR1cmUgJyArIChqICsgMSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIiBbc3ViVGV4dEZpZWxkXT1cIidzdWJ0ZXh0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtZW5kIGp1c3RpZnktY29udGVudC1jZW50ZXIgaC0xMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIChjbGljayk9XCJkZWxldGVGaXh0dXJlKCdmbG9vcicsIGopXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgbWFyZ2luLWJvdHRvbTogMThweFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAxTDEgOU0xIDFMOSA5XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImxpbmstYnRuXCIgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cImxheW91dEZvcm0uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE5ld0ZpeHR1cmUoJ2Zsb29yJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBmaXh0dXJlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxociBzdHlsZT1cImJvcmRlci10b3A6IDFweCBkYXNoZWQgIzAwMDAwMDtcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGbG9vciBPdGhlciBFbGVtZW50cyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEZvcm1GbG9vck90aGVyRWxlbWVudHMuY29udHJvbHMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwiZmxvb3JPdGhlckVsZW1lbnRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaXh0dXJlIG9mIGdldEZvcm1GbG9vck90aGVyRWxlbWVudHMuY29udHJvbHM7IGxldCBqID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbZm9ybUdyb3VwTmFtZV09XCJqXCIgY2xhc3M9XCJyb3cgZy0wIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTExXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5FbGVtZW50IHt7IGogKyAxIH19PC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIGZvciB0eXBlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cIm90aGVyRWxlbWVudExpc3RcIiBbaWRdPVwiJ2Zsb29yRWxlbWVudExhYmVsJyArIGpcIiBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDb25kaXRpb25hbCBpbnB1dCBmb3IgY3VzdG9tIG5hbWUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCIoZml4dHVyZS5nZXQoJ3R5cGUnKT8udmFsdWUpID09PSAnT3RoZXJzJ1wiIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbXQtMlwiIGZvcm1Db250cm9sTmFtZT1cImN1c3RvbU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGN1c3RvbSBlbGVtZW50IG5hbWVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtZW5kIGp1c3RpZnktY29udGVudC1jZW50ZXIgaC0xMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIChjbGljayk9XCJyZW1vdmVPdGhlckVsZW1lbnQoJ2Zsb29yJywgailcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBtYXJnaW4tYm90dG9tOiAxOHB4XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDFMMSA5TTEgMUw5IDlcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGluay1idG5cIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTmV3T3RoZXJFbGVtZW50cygnZmxvb3InKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBDZW50ZXIgQ29sdW1uIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sIG92ZXJmbG93LWhpZGRlbiBwb3NpdGlvbi1yZWxhdGl2ZVwiIFtuZ0NsYXNzXT1cInsgJ2Qtbm9uZSc6IGVkaXRGaXh0dXJlIH1cIj5cclxuICAgICAgICA8ZGl2IGlkPVwiY2FudmFzLWNhcmRcIiBjbGFzcz1cImMtY2FyZCBwb3NpdGlvbi1yZWxhdGl2ZVwiICNjYW52YXNDb250YWluZXI+XHJcbiAgICAgICAgICA8IS0tIENhbnZhcyBWaWV3IC0tPlxyXG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7ICdkLW5vbmUnOiBzZWxlY3RlZFZpZXcgPT09ICd0cmVlJyB9XCI+XHJcbiAgICAgICAgICAgIDxjYW52YXMgaWQ9XCJiYXNlLWNhbnZhc1wiICNiYXNlQ2FudmFzPjwvY2FudmFzPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBUcmVlIFZpZXcgLS0+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRWaWV3ID09PSAndHJlZSdcIiBjbGFzcz1cInctMTAwXCI+XHJcbiAgICAgICAgICAgIDxzdG9yZS1wbGFuby10cmVlLXZpZXcgW2FsbEZpeHR1cmVdPVwiYWxsRml4dHVyZXNcIj48L3N0b3JlLXBsYW5vLXRyZWUtdmlldz5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gVG9wIENvbnRyb2xzIC0tPlxyXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInRvcDogMjRweDsgbGVmdDogMjZweDsgcG9zaXRpb246IGFic29sdXRlO1wiIGlkPVwic2VnbWVudC1idG5cIiBjbGFzcz1cInBiLTVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgZ2FwLTRcIj5cclxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgY3VzdG9tLXRhYnMgZC1mbGV4XCIgc3R5bGU9XCJ3aWR0aDogMjAwcHg7IG1hcmdpbjogMFwiPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gZmxleC1maWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtbGluayB3LTEwMCBoLTEwMFwiIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRWaWV3ID09PSAnZGV0YWlsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkVmlldyA9ICdkZXRhaWwnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgRGV0YWlsIFZpZXdcclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gZmxleC1maWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtbGluayB3LTEwMCBoLTEwMFwiIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRWaWV3ID09PSAndHJlZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RlZFZpZXcgPSAndHJlZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICBUcmVlIFZpZXdcclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBQSUQgQWxsb2NhdGlvbiAtLT5cclxuICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cImxheW91dEZvcm0uZGlzYWJsZWRcIiBzdHlsZT1cInRvcDogMjRweDsgbGVmdDogMjM0cHhcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHN0eWxlPVwicGFkZGluZzogOXB4IDE5cHggIWltcG9ydGFudDtcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zIGJnLXdoaXRlIHNoYWRvdy1zbVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdldEVudHJhbmNlcz8ubGVuZ3RoID49IDJcIiAoY2xpY2spPVwib25DbGlja0FwcGx5TG9naWNzKClcIj5cclxuICAgICAgICAgICAgICBBcHBseSBMb2dpY3NcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgICAgICAgPCEtLSBFbnRyYW5jZSBCdXR0b24gLS0+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwibGF5b3V0Rm9ybS5lbmFibGVkXCIgbmdiVG9vbHRpcD1cIllvdSBjYW4gYWRkIHVwIHRvIHR3byBlbnRyYW5jZXMuXCIgc3R5bGU9XCJ0b3A6IDI0cHg7IGxlZnQ6IDIzNHB4XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZVwiIFtkaXNhYmxlVG9vbHRpcF09XCJnZXRFbnRyYW5jZXM/Lmxlbmd0aCA8IDJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJwYWRkaW5nOiA5cHggMTlweCAhaW1wb3J0YW50O1wiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMyBiZy13aGl0ZSBzaGFkb3ctc21cIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnZXRFbnRyYW5jZXM/Lmxlbmd0aCA+PSAyXCIgKGNsaWNrKT1cImFkZE5ld0VudHJhbmNlKClcIj5cclxuICAgICAgICAgICAgICBBZGQgRW50cmFuY2VcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwibGF5b3V0Rm9ybS5lbmFibGVkXCIgc3R5bGU9XCJ0b3A6IDI0cHg7IHJpZ2h0OiAxOTJweFwiIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGVcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMyBiZy13aGl0ZSBzaGFkb3ctc21cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWxFZGl0KClcIj5cclxuICAgICAgICAgICAgICBDYW5jZWxcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgPCEtLSBFZGl0IEJ1dHRvbiAtLT5cclxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJsYXlvdXRGb3JtLmRpc2FibGVkICYmIHNlbGVjdGVkVmlldyA9PT0gJ2RldGFpbCdcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZUVkaXQgfHwgWyd0YXNrQXNzaWduZWQnXS5pbmNsdWRlcyh0YXNrU3R5bGUuZml4dHVyZS5jbGFzcykgfHwgKHRhc2tTdHlsZS5maXh0dXJlLmNsYXNzID09ICdyZXZpZXdQZW5kaW5nJyAmJiAhc2hvd0xheW91dClcIlxyXG4gICAgICAgICAgICBzdHlsZT1cInRvcDogMjRweDsgcmlnaHQ6IDE2NHB4XCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTMgcG9zaXRpb24tYWJzb2x1dGUgYmctd2hpdGUgc2hhZG93LXNtXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tFZGl0KClcIj5cclxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xMzIyXzUzMjUpXCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICBkPVwiTTE0LjE2NjcgMi40OTk5M0MxNC4zODU2IDIuMjgxMDYgMTQuNjQ1NSAyLjEwNzQ0IDE0LjkzMTQgMS45ODg5OUMxNS4yMTc0IDEuODcwNTQgMTUuNTIzOSAxLjgwOTU3IDE1LjgzMzQgMS44MDk1N0MxNi4xNDI5IDEuODA5NTcgMTYuNDQ5NCAxLjg3MDU0IDE2LjczNTQgMS45ODg5OUMxNy4wMjE0IDIuMTA3NDQgMTcuMjgxMiAyLjI4MTA2IDE3LjUwMDEgMi40OTk5M0MxNy43MTkgMi43MTg4IDE3Ljg5MjYgMi45Nzg2MyAxOC4wMTEgMy4yNjQ2QzE4LjEyOTUgMy41NTA1NyAxOC4xOTA0IDMuODU3MDYgMTguMTkwNCA0LjE2NjU5QzE4LjE5MDQgNC40NzYxMiAxOC4xMjk1IDQuNzgyNjIgMTguMDExIDUuMDY4NTlDMTcuODkyNiA1LjM1NDU1IDE3LjcxOSA1LjYxNDM5IDE3LjUwMDEgNS44MzMyNkw2LjI1MDA4IDE3LjA4MzNMMS42NjY3NSAxOC4zMzMzTDIuOTE2NzUgMTMuNzQ5OUwxNC4xNjY3IDIuNDk5OTNaXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzEzMjJfNTMyNVwiPlxyXG4gICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICBFZGl0XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8IS0tIFJvdGF0ZSBCdXR0b24gLS0+XHJcbiAgICAgICAgICA8YnV0dG9uIHN0eWxlPVwidG9wOiAyNHB4OyByaWdodDogOTRweFwiIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImxheW91dEZvcm0uZGlzYWJsZWQgJiYgc2VsZWN0ZWRWaWV3ID09PSAnZGV0YWlsJ1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTMgcG9zaXRpb24tYWJzb2x1dGUgYmctd2hpdGUgc2hhZG93LXNtXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInJvdGF0ZUNhbnZhcyhjYW52YXMsOTApXCI+XHJcbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiIHZpZXdCb3g9XCIwIDAgMjYgMjZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTYuMzYyNjUgNy4xNzg4N0w3LjE3NjI1IDYuMzYyODdMNS45MDQyNSA1LjA5MjA3TDUuMDg5NDUgNS45MDU2N0w2LjM2MjY1IDcuMTc4ODdaTTE1LjY3MSA2LjM2NDA3TDE5LjYzNzkgMTAuMzMwOUwyMC45MDk5IDkuMDU3NjlMMTYuOTQ0MiA1LjA5MDg3TDE1LjY3MSA2LjM2NDA3Wk0xOS42Mzc5IDE4LjgyNTdMMTguODI0MyAxOS42MzkzTDIwLjA5NjMgMjAuOTEwMUwyMC45MDk5IDIwLjA5NzdMMTkuNjM3OSAxOC44MjU3Wk0xMC4zMjk1IDE5LjYzOTNMNi4zNjI2NSAxNS42NzI1TDUuMDkwNjUgMTYuOTQ1N0w5LjA1NjI2IDIwLjkxMTNMMTAuMzI5NSAxOS42MzkzWk0xOC44MjQzIDE5LjYzOTNDMTcuNjU0MyAyMC44MDgxIDE2Ljg0MDcgMjEuNjE5MyAxNi4xNDU5IDIyLjE0OTdDMTUuNDcxNSAyMi42NjQ1IDE1LjAxNTUgMjIuODI4OSAxNC41NzYzIDIyLjgyODlWMjQuNjI4OUMxNS41Njc1IDI0LjYyODkgMTYuNDAyNyAyNC4yMTczIDE3LjIzNjcgMjMuNTgxM0MxOC4wNTAzIDIyLjk2MDkgMTguOTYzNSAyMi4wNDUzIDIwLjA5NjMgMjAuOTEyNUwxOC44MjQzIDE5LjYzOTNaTTkuMDU2MjYgMjAuOTExM0MxMC4xODkxIDIyLjA0NTMgMTEuMTAyMyAyMi45NTk3IDExLjkxNTkgMjMuNTgxM0MxMi43NDk5IDI0LjIxNzMgMTMuNTg1MSAyNC42Mjg5IDE0LjU3NjMgMjQuNjI4OVYyMi44Mjg5QzE0LjEzNzEgMjIuODI4OSAxMy42ODIzIDIyLjY2NDUgMTMuMDA2NyAyMi4xNDk3QzEyLjMxMTkgMjEuNjE5MyAxMS40OTgzIDIwLjgwODEgMTAuMzI5NSAxOS42MzkzTDkuMDU2MjYgMjAuOTExM1pNMTkuNjM3OSAxMC4zMzA5QzIwLjgwNjcgMTEuNDk5NyAyMS42MTc5IDEyLjMxMzMgMjIuMTQ4MyAxMy4wMDgxQzIyLjY2MzEgMTMuNjgzNyAyMi44Mjc1IDE0LjEzODUgMjIuODI3NSAxNC41Nzc3SDI0LjYyNzVDMjQuNjI3NSAxMy41ODY1IDI0LjIxNTkgMTIuNzUxMyAyMy41Nzk5IDExLjkxNzNDMjIuOTU5NSAxMS4xMDM3IDIyLjA0MjcgMTAuMTkwNSAyMC45MDk5IDkuMDU3NjlMMTkuNjM3OSAxMC4zMzA5Wk0yMC45MDk5IDIwLjA5NzdDMjIuMDQzOSAxOC45NjM3IDIyLjk1ODMgMTguMDUxNyAyMy41Nzk5IDE3LjIzODFDMjQuMjE1OSAxNi40MDQxIDI0LjYyNzUgMTUuNTY4OSAyNC42Mjc1IDE0LjU3NzdIMjIuODI3NUMyMi44Mjc1IDE1LjAxNjkgMjIuNjYzMSAxNS40NzI5IDIyLjE0ODMgMTYuMTQ3M0MyMS42MTc5IDE2Ljg0MjEgMjAuODA2NyAxNy42NTU3IDE5LjYzNzkgMTguODI1N0wyMC45MDk5IDIwLjA5NzdaTTcuMTc2MjUgNi4zNjI4N0M4LjM0NjI1IDUuMTk0MDcgOS4xNTk4NSA0LjM4MTY3IDkuODU0NjUgMy44NTEyN0MxMC41MjkgMy4zMzY0NyAxMC45ODUgMy4xNzMyNyAxMS40MjQyIDMuMTczMjdWMS4zNzIwN0MxMC40MzMgMS4zNzIwNyA5LjU5Nzg1IDEuNzgzNjcgOC43NjM4NSAyLjQxOTY3QzcuOTQ5MDUgMy4wNDEyNyA3LjAzNzA1IDMuOTU1NjcgNS45MDQyNSA1LjA4ODQ3TDcuMTc2MjUgNi4zNjI4N1pNMTYuOTQ0MiA1LjA5MDg3QzE1LjgxMTQgMy45NTY4NyAxNC44OTgyIDMuMDQxMjcgMTQuMDg0NiAyLjQxOTY3QzEzLjI1MDYgMS43ODM2NyAxMi40MTU0IDEuMzcyMDcgMTEuNDI0MiAxLjM3MjA3VjMuMTczMjdDMTEuODYzNCAzLjE3MzI3IDEyLjMxODIgMy4zMzY0NyAxMi45OTM4IDMuODUxMjdDMTMuNjg4NiA0LjM4MTY3IDE0LjUwMjIgNS4xOTI4NyAxNS42NzEgNi4zNjE2N0wxNi45NDQyIDUuMDkwODdaTTUuMDg5NDUgNS45MDMyN0MzLjk1NjY1IDcuMDM2MDcgMy4wNDIyNSA3Ljk0ODA3IDIuNDIwNjUgOC43NjI4N0MxLjc4NDY1IDkuNTk2ODcgMS4zNzMwNSAxMC40MzIxIDEuMzczMDUgMTEuNDIzM0gzLjE3MzA1QzMuMTczMDUgMTAuOTg0MSAzLjMzNzQ1IDEwLjUyODEgMy44NTIyNSA5Ljg1MzY3QzQuMzgyNjUgOS4xNTg4NyA1LjE5Mzg1IDguMzQ1MjcgNi4zNjI2NSA3LjE3NTI3TDUuMDg5NDUgNS45MDMyN1pNNi4zNjI2NSAxNS42NzEzQzUuMTkzODUgMTQuNTAxMyA0LjM4MjY1IDEzLjY4NzcgMy44NTIyNSAxMi45OTI5QzMuMzM3NDUgMTIuMzE4NSAzLjE3MzA1IDExLjg2MjUgMy4xNzMwNSAxMS40MjMzSDEuMzczMDVDMS4zNzMwNSAxMi40MTQ1IDEuNzg0NjUgMTMuMjQ5NyAyLjQyMDY1IDE0LjA4MzdDMy4wNDIyNSAxNC44OTczIDMuOTU2NjUgMTUuODEwNSA1LjA4OTQ1IDE2Ljk0MzNMNi4zNjI2NSAxNS42NzEzWlwiXHJcbiAgICAgICAgICAgICAgICBmaWxsPVwiIzFEMjkzOVwiIC8+XHJcbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMy4yIDYuOTgzMkwyNSA4LjJDMjUgNC41ODIgMjIuNDA1NiAxLjU3OTYgMTkgMU0yLjggMTkuMDE2OEwxIDE3LjhDMSAyMS40MTggMy41OTQ0IDI0LjQyMDQgNyAyNVwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjMUQyOTM5XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPCEtLSBTdWJtaXQgQnV0dG9uIC0tPlxyXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFsYXlvdXRGb3JtLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgc3R5bGU9XCJ0b3A6IDI0cHg7IHJpZ2h0OiA5NHB4O3BhZGRpbmc6IDlweCAyMHB4ICFpbXBvcnRhbnQ7bWluLXdpZHRoOiA5MHB4O2p1c3RpZnktY29udGVudDogY2VudGVyO1wiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIHBvc2l0aW9uLWFic29sdXRlIGJnLXdoaXRlIHNoYWRvdy1zbVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NhdmluZ0xheW91dFwiIChjbGljayk9XCJ1cGRhdGVMYXlvdXQodHJ1ZSlcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1NhdmluZ0xheW91dFwiIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc21cIiByb2xlPVwic3RhdHVzXCJcclxuICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIFNhdmVcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgIDwhLS0gRG93bmxvYWQgQnV0dG9uIC0tPlxyXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNlbGVjdGVkVmlldyA9PT0gJ2RldGFpbCdcIiBzdHlsZT1cInRvcDogMjRweDsgcmlnaHQ6IDI2cHhcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMyBwb3NpdGlvbi1hYnNvbHV0ZSBiZy13aGl0ZSBzaGFkb3ctc21cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRDYW52YXMoKVwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiIHZpZXdCb3g9XCIwIDAgMjYgMjZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIwLjI0MDAwMDAwMDAwMDAwMDA1XCI+XHJcbiAgICAgICAgICAgICAgPGcgaWQ9XCJTVkdSZXBvX2JnQ2FycmllclwiIHN0cm9rZS13aWR0aD1cIjBcIj48L2c+XHJcbiAgICAgICAgICAgICAgPGcgaWQ9XCJTVkdSZXBvX3RyYWNlckNhcnJpZXJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2U9XCIjQ0NDQ0NDXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjAuMzg0XCI+PC9nPlxyXG4gICAgICAgICAgICAgIDxnIGlkPVwiU1ZHUmVwb19pY29uQ2FycmllclwiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0xMi41NTM1IDE2LjUwNjFDMTIuNDExNCAxNi42NjE1IDEyLjIxMDYgMTYuNzUgMTIgMTYuNzVDMTEuNzg5NCAxNi43NSAxMS41ODg2IDE2LjY2MTUgMTEuNDQ2NSAxNi41MDYxTDcuNDQ2NDggMTIuMTMxMUM3LjE2Njk4IDExLjgyNTQgNy4xODgyMiAxMS4zNTEgNy40OTM5MiAxMS4wNzE1QzcuNzk5NjMgMTAuNzkyIDguMjc0MDIgMTAuODEzMiA4LjU1MzUyIDExLjExODlMMTEuMjUgMTQuMDY4MlYzQzExLjI1IDIuNTg1NzkgMTEuNTg1OCAyLjI1IDEyIDIuMjVDMTIuNDE0MiAyLjI1IDEyLjc1IDIuNTg1NzkgMTIuNzUgM1YxNC4wNjgyTDE1LjQ0NjUgMTEuMTE4OUMxNS43MjYgMTAuODEzMiAxNi4yMDA0IDEwLjc5MiAxNi41MDYxIDExLjA3MTVDMTYuODExOCAxMS4zNTEgMTYuODMzIDExLjgyNTQgMTYuNTUzNSAxMi4xMzExTDEyLjU1MzUgMTYuNTA2MVpcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwiIzFEMjkzOVwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMy43NSAxNUMzLjc1IDE0LjU4NTggMy40MTQyMiAxNC4yNSAzIDE0LjI1QzIuNTg1NzkgMTQuMjUgMi4yNSAxNC41ODU4IDIuMjUgMTVWMTUuMDU0OUMyLjI0OTk4IDE2LjQyMjUgMi4yNDk5NiAxNy41MjQ4IDIuMzY2NTIgMTguMzkxOEMyLjQ4NzU0IDE5LjI5MTkgMi43NDY0MyAyMC4wNDk3IDMuMzQ4MzUgMjAuNjUxNkMzLjk1MDI3IDIxLjI1MzYgNC43MDgxNCAyMS41MTI1IDUuNjA4MjUgMjEuNjMzNUM2LjQ3NTIyIDIxLjc1IDcuNTc3NTQgMjEuNzUgOC45NDUxMyAyMS43NUgxNS4wNTQ5QzE2LjQyMjUgMjEuNzUgMTcuNTI0OCAyMS43NSAxOC4zOTE4IDIxLjYzMzVDMTkuMjkxOSAyMS41MTI1IDIwLjA0OTcgMjEuMjUzNiAyMC42NTE3IDIwLjY1MTZDMjEuMjUzNiAyMC4wNDk3IDIxLjUxMjUgMTkuMjkxOSAyMS42MzM1IDE4LjM5MThDMjEuNzUgMTcuNTI0OCAyMS43NSAxNi40MjI1IDIxLjc1IDE1LjA1NDlWMTVDMjEuNzUgMTQuNTg1OCAyMS40MTQyIDE0LjI1IDIxIDE0LjI1QzIwLjU4NTggMTQuMjUgMjAuMjUgMTQuNTg1OCAyMC4yNSAxNUMyMC4yNSAxNi40MzU0IDIwLjI0ODQgMTcuNDM2NSAyMC4xNDY5IDE4LjE5MTlDMjAuMDQ4MiAxOC45MjU3IDE5Ljg2NzggMTkuMzE0MiAxOS41OTEgMTkuNTkxQzE5LjMxNDIgMTkuODY3OCAxOC45MjU3IDIwLjA0ODIgMTguMTkxOSAyMC4xNDY5QzE3LjQzNjUgMjAuMjQ4NCAxNi40MzU0IDIwLjI1IDE1IDIwLjI1SDlDNy41NjQ1OSAyMC4yNSA2LjU2MzQ3IDIwLjI0ODQgNS44MDgxMiAyMC4xNDY5QzUuMDc0MzUgMjAuMDQ4MiA0LjY4NTc3IDE5Ljg2NzggNC40MDkwMSAxOS41OTFDNC4xMzIyNSAxOS4zMTQyIDMuOTUxOCAxOC45MjU3IDMuODUzMTUgMTguMTkxOUMzLjc1MTU5IDE3LjQzNjUgMy43NSAxNi40MzU0IDMuNzUgMTVaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxRDI5MzlcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFBhbmVsIENvbGxhcHNlIEhhbmRsZXJzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xsYXBzZS1oYW5kbGVyIGxlZnRcIiAoY2xpY2spPVwidG9nZ2xlUGFuZWwoJ2xlZnQnKVwiPlxyXG4gICAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc0xlZnRQYW5lbENvbGxhcHNlZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIlxyXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk04LjI3MzA4IDEyLjYzNkw0LjYzNjcyIDguOTk5NjRMOC4yNzMwOCA1LjM2MzI4TTEzLjM2NCAxMi42MzZMOS43Mjc2MyA4Ljk5OTY0TDEzLjM2NCA1LjM2MzI4XCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjMTAxODI4XCIgc3Ryb2tlLXdpZHRoPVwiMS40NTQ1NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc0xlZnRQYW5lbENvbGxhcHNlZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIlxyXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk05LjcyNjkyIDUuMzYzOTlMMTMuMzYzMyA5LjAwMDM2TDkuNzI2OTIgMTIuNjM2N000LjYzNjAxIDUuMzYzOTlMOC4yNzIzNyA5LjAwMDM2TDQuNjM2MDEgMTIuNjM2N1wiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjEuNDU0NTVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xsYXBzZS1oYW5kbGVyIHJpZ2h0XCIgKGNsaWNrKT1cInRvZ2dsZVBhbmVsKCdyaWdodCcpXCI+XHJcbiAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNSaWdodFBhbmVsQ29sbGFwc2VkXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiXHJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTguMjczMDggMTIuNjM2TDQuNjM2NzIgOC45OTk2NEw4LjI3MzA4IDUuMzYzMjhNMTMuMzY0IDEyLjYzNkw5LjcyNzYzIDguOTk5NjRMMTMuMzY0IDUuMzYzMjhcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIxLjQ1NDU1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc1JpZ2h0UGFuZWxDb2xsYXBzZWRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxOCAxOFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNOS43MjY5MiA1LjM2Mzk5TDEzLjM2MzMgOS4wMDAzNkw5LjcyNjkyIDEyLjYzNjdNNC42MzYwMSA1LjM2Mzk5TDguMjcyMzcgOS4wMDAzNkw0LjYzNjAxIDEyLjYzNjdcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIxLjQ1NDU1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gRWRpdCBGaXh0dXJlIEJvZHkgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIiBbbmdDbGFzc109XCJ7ICdkLW5vbmUnOiAhZWRpdEZpeHR1cmUgfVwiPlxyXG4gICAgICAgIDxkaXYgaWQ9XCJlZGl0LWJvZHlcIiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPHVsIGNsYXNzPVwibXgtMyBteS01IG5hdiBuYXYtcGlsbHNcIiByb2xlPVwidGFibGlzdFwiPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBjdXJzb3ItcG9pbnRlclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICA8YSAoY2xpY2spPVwic3VibWl0Rml4dHVyZSA9IGZhbHNlOyBlZGl0Rml4dHVyZVNlY3Rpb24gPSAnYmFzaWMtZGV0YWlscydcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZWRpdEZpeHR1cmVTZWN0aW9uID09PSAnYmFzaWMtZGV0YWlscycgPyAnYWN0aXZlJyA6ICcnXCIgY2xhc3M9XCJuYXYtbGlua1wiIHJvbGU9XCJ0YWJcIj5cclxuICAgICAgICAgICAgICAgIEJhc2ljIGRldGFpbHNcclxuICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtIGN1cnNvci1wb2ludGVyXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgIDxhIChjbGljayk9XCJzdWJtaXRGaXh0dXJlID0gZmFsc2U7IGVkaXRGaXh0dXJlU2VjdGlvbiA9ICdwcm9kdWN0cydcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZWRpdEZpeHR1cmVTZWN0aW9uID09PSAncHJvZHVjdHMnID8gJ2FjdGl2ZScgOiAnJ1wiIGNsYXNzPVwibmF2LWxpbmtcIiByb2xlPVwidGFiXCI+XHJcbiAgICAgICAgICAgICAgICBQcm9kdWN0c1xyXG4gICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gY3Vyc29yLXBvaW50ZXJcIiByb2xlPVwicHJlc2VudGF0aW9uXCIgKm5nSWY9XCJlZGl0RnJvbVRhYiAhPT0gJ3pvbmUnXCI+XHJcbiAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cInN1Ym1pdEZpeHR1cmUgPSBmYWxzZTsgZWRpdEZpeHR1cmVTZWN0aW9uID0gJ3ZtcydcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZWRpdEZpeHR1cmVTZWN0aW9uID09PSAndm1zJyA/ICdhY3RpdmUnIDogJydcIiBjbGFzcz1cIm5hdi1saW5rXCIgcm9sZT1cInRhYlwiPlxyXG4gICAgICAgICAgICAgICAgVmlzdWFsIE1lcmNoYW5kaXNlXHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgPC91bD5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0Rml4dHVyZVNlY3Rpb24gPT09ICdiYXNpYy1kZXRhaWxzJ1wiPlxyXG4gICAgICAgICAgICAgIDxsaWItaW5zdGFuY2UtYmFzaWMtZGV0YWlscyBbZml4dHVyZURhdGFdPVwic2VsZWN0ZWRGaXh0dXJlRGF0YVwiIFtlZGl0TW9kZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIFtpc1N1Ym1pdHRlZF09XCJzdWJtaXRGaXh0dXJlXCIgW3JldmVydE9uRWRpdF09XCJzaG91bGRSZXZlcnRPbkVkaXRcIlxyXG4gICAgICAgICAgICAgICAgW3pvbmVFZGl0TW9kZV09XCJlZGl0RnJvbVRhYiA9PT0gJ3pvbmUnXCIgKHN1Ym1pdEV2ZW50KT1cIm9uRml4dHVyZVN1Ym1pdCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgPC9saWItaW5zdGFuY2UtYmFzaWMtZGV0YWlscz5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdEZpeHR1cmVTZWN0aW9uID09PSAncHJvZHVjdHMnXCI+XHJcbiAgICAgICAgICAgICAgPGxpYi1pbnN0YW5jZS1wcm9kdWN0cyBbZml4dHVyZURhdGFdPVwic2VsZWN0ZWRGaXh0dXJlRGF0YVwiIFtlZGl0TW9kZV09XCJ0cnVlXCIgW2lzU3VibWl0dGVkXT1cInN1Ym1pdEZpeHR1cmVcIlxyXG4gICAgICAgICAgICAgICAgW3JldmVydE9uRWRpdF09XCJzaG91bGRSZXZlcnRPbkVkaXRcIiBbem9uZUVkaXRNb2RlXT1cImVkaXRGcm9tVGFiID09PSAnem9uZSdcIlxyXG4gICAgICAgICAgICAgICAgKHN1Ym1pdEV2ZW50KT1cIm9uRml4dHVyZVN1Ym1pdCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgPC9saWItaW5zdGFuY2UtcHJvZHVjdHM+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRGaXh0dXJlU2VjdGlvbiA9PT0gJ3ZtcycgJiYgZWRpdEZyb21UYWIgIT09ICd6b25lJ1wiPlxyXG4gICAgICAgICAgICAgIDxsaWItaW5zdGFuY2Utdm1zIFtmaXh0dXJlRGF0YV09XCJzZWxlY3RlZEZpeHR1cmVEYXRhXCIgW2VkaXRNb2RlXT1cInRydWVcIiBbaXNTdWJtaXR0ZWRdPVwic3VibWl0Rml4dHVyZVwiXHJcbiAgICAgICAgICAgICAgICBbcmV2ZXJ0T25FZGl0XT1cInNob3VsZFJldmVydE9uRWRpdFwiIChzdWJtaXRFdmVudCk9XCJvbkZpeHR1cmVTdWJtaXQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgIDwvbGliLWluc3RhbmNlLXZtcz5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsgJ2NvbGxhcHNlZC1jb2wnOiBpc1JpZ2h0UGFuZWxDb2xsYXBzZWQsICdjb2wtMyc6ICFpc1JpZ2h0UGFuZWxDb2xsYXBzZWQgfVwiXHJcbiAgICAgICAgW3N0eWxlXT1cInsnbWluLXdpZHRoJzogaXNSaWdodFBhbmVsQ29sbGFwc2VkID8gJzAnIDogZWRpdEZpeHR1cmUgfHwgc2hvd0xheW91dCA/ICczNDBweCcgOiBhY3RpdmVGZWVkYmFja1RhYiA9PT0gJ2ZpeHR1cmUnID8gJzEwNTBweCcgOiAnNzUwcHgnfVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmZWVkYmFja0NvbFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG5cclxuPCEtLSBUZW1wbGF0ZXMgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZmVlZGJhY2tDb2w+XHJcbiAgPGRpdiBjbGFzcz1cInMtY2FyZCBzLWNhcmQtLXRhYmJlZFwiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6ZWRpdEZpeHR1cmUgPyAnNzJweCcgOiAnMHB4J31cIj5cclxuICAgIDwhLS0gQGlmKHNob3dGaXh0dXJlUHJldmlldyAmJiAhaXNSaWdodFBhbmVsQ29sbGFwc2VkKXtcclxuICAgICAgPGZpeHR1cmUtcHJldmlldyBbZml4dHVyZURhdGFdPVwic2VsZWN0ZWRGaXh0dXJlPy5maXh0dXJlRGF0YVwiPjwvZml4dHVyZS1wcmV2aWV3PlxyXG4gICAgfSAtLT5cclxuXHJcbiAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXBpbGxzIGZlZWRiYWNrLXRhYnNcIiByb2xlPVwidGFibGlzdFwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ2Qtbm9uZSc6IGlzUmlnaHRQYW5lbENvbGxhcHNlZCAmJiAhZWRpdEZpeHR1cmUgfVwiPlxyXG4gICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBjdXJzb3ItcG9pbnRlclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICA8YSAoY2xpY2spPVwib25GZWVkYmFja1RhYkNoYW5nZSgnZml4dHVyZScpXCIgW25nQ2xhc3NdPVwiYWN0aXZlRmVlZGJhY2tUYWIgPT09ICdmaXh0dXJlJyA/ICdhY3RpdmUnIDogJydcIlxyXG4gICAgICAgICAgY2xhc3M9XCJuYXYtbGlua1wiIHJvbGU9XCJ0YWJcIj5cclxuICAgICAgICAgIEZpeHR1cmUgVmVyaWZpY2F0aW9uXHJcbiAgICAgICAgPC9hPlxyXG4gICAgICA8L2xpPlxyXG4gICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBjdXJzb3ItcG9pbnRlclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICA8YSAoY2xpY2spPVwib25GZWVkYmFja1RhYkNoYW5nZSgnem9uZScpXCIgW25nQ2xhc3NdPVwiYWN0aXZlRmVlZGJhY2tUYWIgPT09ICd6b25lJyA/ICdhY3RpdmUnIDogJydcIlxyXG4gICAgICAgICAgY2xhc3M9XCJuYXYtbGluayBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCIgcm9sZT1cInRhYlwiPlxyXG4gICAgICAgICAgWm9uZSBWZXJpZmljYXRpb25cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiem9uZVBlbmRpbmdDb3VudCA+IDBcIiBjbGFzcz1cImJhZGdlIGZlZWRiYWNrLXRhYi1iYWRnZVwiPlxyXG4gICAgICAgICAgICB7eyB6b25lUGVuZGluZ0NvdW50IH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9hPlxyXG4gICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZmVlZGJhY2stdGFiLWNvbnRlbnRcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZUZlZWRiYWNrVGFiID09PSAnZml4dHVyZSdcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0xheW91dCAmJiAhaXNSaWdodFBhbmVsQ29sbGFwc2VkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRpdGxlIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmVUaXRsZSBtYi0zXCI+U3RvcmUgcmVzcG9uc2U8L2Rpdj5cclxuICAgICAgICAgICAgPGhyPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBTZWN0aW9uIEhlYWRlciAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMVwiPlxyXG4gICAgICAgICAgICAgIDxoNSBjbGFzcz1cInN1YlRpdGxlIGZ3LXNlbWlib2xkIG1iLTBcIj5GaXh0dXJlIHZlcmlmaWNhdGlvbjwvaDU+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1jaGV2cm9uLXVwIHRleHQtbXV0ZWQgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwidG9nZ2xlID0gIXRvZ2dsZVwiICpuZ0lmPVwiIXRvZ2dsZVwiPjwvaT5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWNoZXZyb24tZG93biB0ZXh0LW11dGVkIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInRvZ2dsZSA9ICF0b2dnbGVcIiAqbmdJZj1cInRvZ2dsZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbFRleHQgdGV4dC1tdXRlZCBkLWJsb2NrIG1iLTRcIj5cclxuICAgICAgICAgICAgICBBc3NpZ25lZCBvbjoge3tzdG9yZUZlZWRiYWNrPy5maXh0dXJlRGF0YT8uWzBdPy50YXNrRGF0YT8uY3JlYXRlZEF0IHwgZGF0ZTonZGQgTU1NIFlZWSwgaGg6bW06U1MgYSd9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidG9nZ2xlXCIgY2xhc3M9XCJtdC0xMFwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gQ29sdW1uIEhlYWRpbmdzIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdGV4dC1tdXRlZCBzbWFsbCBmdy1zZW1pYm9sZCBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlciBsaWdodFRleHRcIj5CZWZvcmU8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlciBsaWdodFRleHRcIj5BZnRlcjwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFdhbGwgRml4dHVyZXMgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgcHktMiBtYi01IHdhbGxUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5XYWxsIEZpeHR1cmVzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAge3t3YWxsQ291bnQgLSBjbENvdW50fX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyIGZ3LXNlbWlib2xkXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiKHdhbGxDb3VudCAtIGNsQ291bnQpICE9IHN0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbMF0uYW5zd2Vycz8uWzBdPy53YWxsRml4dHVyZXMgPyAndGV4dC1kYW5nZXInIDogJydcIj5cclxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1hcnJvdy11cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIod2FsbENvdW50IC0gY2xDb3VudCkgPCBzdG9yZUZlZWRiYWNrLmZpeHR1cmVEYXRhWzBdLmFuc3dlcnM/LlswXT8ud2FsbEZpeHR1cmVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWFycm93LWRvd25cIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKHdhbGxDb3VudCAtIGNsQ291bnQpID4gc3RvcmVGZWVkYmFjay5maXh0dXJlRGF0YVswXS5hbnN3ZXJzPy5bMF0/LndhbGxGaXh0dXJlc1wiPjwvaT57e3N0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbMF0uYW5zd2Vycz8uWzBdPy53YWxsRml4dHVyZXN9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gRXVybyBDZW50cmUgRml4dHVyZXMgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgcHktMiBtYi01IHdhbGxUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5FdXJvIENlbnRyZSBGaXh0dXJlczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyXCI+e3tmbG9vckRhdGEuY2VudGVyRml4dHVyZS5sZW5ndGh9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyIGZ3LXNlbWlib2xkXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUubGVuZ3RoICE9IHN0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbMF0uYW5zd2Vycz8uWzBdPy5mbG9vckZpeHR1cmVzID8gJ3RleHQtZGFuZ2VyJyA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktYXJyb3ctZG93blwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmbG9vckRhdGEuY2VudGVyRml4dHVyZS5sZW5ndGggPiBzdG9yZUZlZWRiYWNrLmZpeHR1cmVEYXRhWzBdPy5hbnN3ZXJzPy5bMF0/LmZsb29yRml4dHVyZXNcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktYXJyb3ctdXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUubGVuZ3RoIDwgc3RvcmVGZWVkYmFjay5maXh0dXJlRGF0YVswXT8uYW5zd2Vycz8uWzBdPy5mbG9vckZpeHR1cmVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICB7e3N0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbMF0uYW5zd2Vycz8uWzBdPy5mbG9vckZpeHR1cmVzfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIENvbnRhY3QgTGVuc2VzIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyIHB5LTIgbWItNSB3YWxsVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+Q29udGFjdCBMZW5zZXM8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlclwiPnt7Y2xDb3VudH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgdGV4dC1jZW50ZXIgZnctc2VtaWJvbGRcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjbENvdW50ICE9IHN0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbMF0uYW5zd2Vycz8uWzBdPy5jbCA/ICd0ZXh0LWRhbmdlcicgOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWFycm93LWRvd25cIiAqbmdJZj1cImNsQ291bnQgPiBzdG9yZUZlZWRiYWNrLmZpeHR1cmVEYXRhWzBdLmFuc3dlcnM/LlswXT8uY2xcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktYXJyb3ctdXBcIiAqbmdJZj1cImNsQ291bnQgPCBzdG9yZUZlZWRiYWNrLmZpeHR1cmVEYXRhWzBdLmFuc3dlcnM/LlswXT8uY2xcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIHt7c3RvcmVGZWVkYmFjay5maXh0dXJlRGF0YVswXS5hbnN3ZXJzPy5bMF0/LmNsfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8aHI+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gVG90YWwgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IGZ3LXNlbWlib2xkIHRvdGFsVGV4dFwiPlRvdGFsPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgdGV4dC1jZW50ZXIgdG90YWxUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3RhbC1ib3hcIj57e2Zsb29yRGF0YS5maXh0dXJlQ291bnR9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgdGV4dC1jZW50ZXIgdG90YWxUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3RhbC1ib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZsb29yRGF0YS5maXh0dXJlQ291bnQgIT09IChzdG9yZUZlZWRiYWNrLmZpeHR1cmVEYXRhWzBdLmFuc3dlcnM/LlswXT8uY2wgKyBzdG9yZUZlZWRiYWNrLmZpeHR1cmVEYXRhWzBdLmFuc3dlcnM/LlswXT8uZmxvb3JGaXh0dXJlcyArIHN0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbMF0uYW5zd2Vycz8uWzBdPy53YWxsRml4dHVyZXMpID8gJ3RleHQtY2VudGVyJyA6JydcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e3N0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbMF0uYW5zd2Vycz8uWzBdPy5jbCArIHN0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbMF0uYW5zd2Vycz8uWzBdPy5mbG9vckZpeHR1cmVzICsgc3RvcmVGZWVkYmFjay5maXh0dXJlRGF0YVswXS5hbnN3ZXJzPy5bMF0/LndhbGxGaXh0dXJlc319XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIEBpZiAoc3RvcmVGZWVkYmFjay5maXh0dXJlRGF0YVswXT8uYW5zd2Vycz8uWzBdPy5jb21tZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJmaXh0dXJlLWNvbW1lbnRzXCIgY2xhc3M9XCJtdC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtYi0yXCI+Q29tbWVudHM8L2g1PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGMgb2Ygc3RvcmVGZWVkYmFjay5maXh0dXJlRGF0YVswXT8uYW5zd2Vyc1swXT8uY29tbWVudHM7bGV0IGk9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBVc2VyIGF2YXRhciAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHJ4PVwiMTZcIiBmaWxsPVwiI0VBRjhGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIyLjY2NzMgMjMuNVYyMS44MzMzQzIyLjY2NzMgMjAuOTQ5MyAyMi4zMTYxIDIwLjEwMTQgMjEuNjkxIDE5LjQ3NjNDMjEuMDY1OSAxOC44NTEyIDIwLjIxOCAxOC41IDE5LjMzNCAxOC41SDEyLjY2NzNDMTEuNzgzMyAxOC41IDEwLjkzNTQgMTguODUxMiAxMC4zMTAzIDE5LjQ3NjNDOS42ODUxNyAyMC4xMDE0IDkuMzMzOTggMjAuOTQ5MyA5LjMzMzk4IDIxLjgzMzNWMjMuNU0xOS4zMzQgMTEuODMzM0MxOS4zMzQgMTMuNjc0MyAxNy44NDE2IDE1LjE2NjcgMTYuMDAwNyAxNS4xNjY3QzE0LjE1OTcgMTUuMTY2NyAxMi42NjczIDEzLjY3NDMgMTIuNjY3MyAxMS44MzMzQzEyLjY2NzMgOS45OTIzOCAxNC4xNTk3IDguNSAxNi4wMDA3IDguNUMxNy44NDE2IDguNSAxOS4zMzQgOS45OTIzOCAxOS4zMzQgMTEuODMzM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTEgZmxleC1jb2x1bW5cIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0xIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoND57e2M/LnVzZXJOYW1lfX08L2g0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD57e2M/LnRpbWVTdGFtcCB8IGRhdGU6J2hoOm1tOnNzIGEgLSBkZCBNTU0geXl5eSd9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZihjPy5yZXNwb25zZXR5cGUgPT09ICdjb21tZW50Jyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNT57e2M/LmNvbW1lbnR9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGxpYi12ZXJpZmljYXRpb24tZmVlZGJhY2sgW2Zsb29yRGF0YV09XCJmbG9vckRhdGFcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnZC1ub25lJzogaXNSaWdodFBhbmVsQ29sbGFwc2VkICYmICFlZGl0Rml4dHVyZX1cIiBbZmVlZGJhY2tEZXRhaWxzXT1cInNlbGVjdGVkRml4dHVyZUZlZWRiYWNrXCJcclxuICAgICAgICAgIChjaGFuZ2VGaXh0dXJlKT1cIm9uQ2hhbmdlRml4dHVyZU9uRmVlZGJhY2tQYW5lbCgkZXZlbnQsdHJ1ZSlcIiBbdG90YWxGaXh0dXJlc109XCJhbGxGaXh0dXJlSW5zdGFuY2VzXCJcclxuICAgICAgICAgIFtjZG5dPVwiY2RuVXJsXCIgKGFjdGlvbik9XCJoYW5kbGVGZWVkYmFja0FjdGlvbigkZXZlbnQpXCIgW3Nob3dBY3Rpb25dPVwiIWVkaXRGaXh0dXJlXCJcclxuICAgICAgICAgICpuZ0lmPVwiIXNob3dMYXlvdXRcIj48L2xpYi12ZXJpZmljYXRpb24tZmVlZGJhY2s+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZUZlZWRiYWNrVGFiID09PSAnem9uZSdcIj5cclxuICAgICAgICA8bGliLXpvbmUtdmVyaWZpY2F0aW9uLWZlZWRiYWNrIFtmbG9vckRhdGFdPVwiZmxvb3JEYXRhXCIgW2ZlZWRiYWNrRGV0YWlsc109XCJzZWxlY3RlZEZpeHR1cmVGZWVkYmFja1wiXHJcbiAgICAgICAgICBbem9uZVRhc2tdPVwiem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uVGFza1wiIFt6b25lRmVlZGJhY2tdPVwic2VsZWN0ZWRab25lRmVlZGJhY2tcIlxyXG4gICAgICAgICAgW3RvdGFsRml4dHVyZXNdPVwiYWxsRml4dHVyZUluc3RhbmNlc1wiIFtjZG5dPVwiY2RuVXJsXCIgW3Nob3dBY3Rpb25dPVwiIWVkaXRGaXh0dXJlXCJcclxuICAgICAgICAgIChjaGFuZ2VGaXh0dXJlKT1cIm9uQ2hhbmdlRml4dHVyZU9uRmVlZGJhY2tQYW5lbCgkZXZlbnQsdHJ1ZSlcIiAoYWN0aW9uKT1cImhhbmRsZUZlZWRiYWNrQWN0aW9uKCRldmVudClcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnZC1ub25lJzogaXNSaWdodFBhbmVsQ29sbGFwc2VkICYmICFlZGl0Rml4dHVyZSB9XCI+PC9saWItem9uZS12ZXJpZmljYXRpb24tZmVlZGJhY2s+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2hlYWRlclNrZWxldG9uPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgbS0wIGctMCBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIG92ZXJmbG93LWhpZGRlblwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXIgdy0xMDAgcC00IHJvdW5kZWRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIG10LTAgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNza2VsZXRvbkxvYWRlcj5cclxuICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lciByb3VuZGVkXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICA8YnIgLz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgIDxiciAvPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICA8YnIgLz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjbm9TdG9yZVZpZGVvIGxldC1tb2RhbD5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgPGRpdj5cclxuICAgICAgPGgyIGNsYXNzPVwibWItM1wiPk5vIFN0b3JlIFZpZGVvIEZvdW5kPC9oMj5cclxuICAgICAgPHA+VGhlIHZpZGVvIHdpbGwgYmUgYXZhaWxhYmxlIG9uY2UgYSByZXF1ZXN0IGlzIHJhaXNlZCBhbmQgdGhlIHN0b3JlIHN1Ym1pdHMgYSBjb21wbGV0ZSBzdG9yZSB2aWRlby48L3A+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJtb2RhbC5jbG9zZSgpXCI+Q2xvc2U8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNhcHBseUxvZ2ljcyBsZXQtbW9kYWw+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxoMiBjbGFzcz1cIm1iLTNcIj5BcHBseSBJVk0gTG9naWNzPC9oMj5cclxuICAgICAgPHA+VGhpcyB3aWxsIGFuYWx5emUgdGhlIGN1cnJlbnQgbGF5b3V0IGFuZCBhcHBseSB0aGUgcHJlLWRlZmluZWQgZml4dHVyZSBsb2dpY3MuPC9wPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgZ2FwLTNcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwibW9kYWwuY2xvc2UoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJhcHBseVBJRExvZ2ljcygpXCI+UHJvY2VlZDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2FwcHJvdmVMYXlvdXRNb2RhbCBsZXQtbW9kYWw+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxoMiBjbGFzcz1cIm1iLTNcIj5BcHByb3ZlIGxheW91dC9wbGFuPC9oMj5cclxuICAgICAgPHA+XHJcbiAgICAgICAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGFwcHJvdmUgdGhlIGxheW91dD8gUGxlYXNlIGVuc3VyZSBpdCBoYXMgYmVlbiB0aG9yb3VnaGx5IHJldmlld2VkIGJlZm9yZSBhcHByb3ZpbmcuXHJcbiAgICAgIDwvcD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGdhcC0zXCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cIm1vZGFsLmNsb3NlKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiYXBwcm92ZUxheW91dCgpXCI+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNCdXR0b25Mb2FkaW5nXCI+QXBwcm92ZTwvc3Bhbj5cclxuICAgICAgICA8c3ZnICpuZ0lmPVwiaXNCdXR0b25Mb2FkaW5nXCIgY2xhc3M9XCJzcGlubmVyXCIgdmlld0JveD1cIjAgMCA1MCA1MFwiPlxyXG4gICAgICAgICAgPGNpcmNsZSBjbGFzcz1cInBhdGhcIiBjeD1cIjI1XCIgY3k9XCIyNVwiIHI9XCIyMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiNFwiPjwvY2lyY2xlPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
4988
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlLXN0b3JlLXBsYW5vLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby9tYW5hZ2Utc3RvcmUtcGxhbm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvbWFuYWdlLXN0b3JlLXBsYW5vL21hbmFnZS1zdG9yZS1wbGFuby5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUVULFlBQVksRUFJWixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFZLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTFELE9BQU8sRUFHTCxXQUFXLEVBRVgsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFJeEIsT0FBTyxFQUNMLE9BQU8sRUFFUCxZQUFZLEVBQ1osY0FBYyxFQUNkLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFHZCxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQU1qQyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1RUFBdUUsQ0FBQztBQUN4SCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNuRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNsRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUUxRyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUN6RyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUN4RyxPQUFPLEtB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QUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRTtnQkFDakUsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsRUFBRTtvQkFDL0IsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMvRDtxQkFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxFQUFFO29CQUMzQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BFO2FBQ0Y7WUFFRCxlQUFlO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRTtnQkFDakUsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsRUFBRTtvQkFDL0IsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMvRDtxQkFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FB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LENBQUMsZ29CQzlENUIsa3YzRUFrbkNjOzs0RkRsakNELHlCQUF5QjtrQkFOckMsU0FBUzsrQkFDRSx3QkFBd0IsYUFHdkIsQ0FBQyxhQUFhLENBQUM7d1dBTTFCLFNBQVM7c0JBRFIsU0FBUzt1QkFBQyxZQUFZO2dCQUVPLFlBQVk7c0JBQXpDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUNELG9CQUFvQjtzQkFBOUMsU0FBUzt1QkFBQyxjQUFjO2dCQUNDLG1CQUFtQjtzQkFBNUMsU0FBUzt1QkFBQyxhQUFhO2dCQUNTLHFCQUFxQjtzQkFBckQsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBQ0gsYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUcxQixRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbmltcG9ydCB7IExvY2F0aW9uLCBUaXRsZUNhc2VQaXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5cclxuaW1wb3J0IHtcclxuICBGb3JtQXJyYXksXHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5cclxuaW1wb3J0IHtcclxuICBTdWJqZWN0LFxyXG4gIFN1YnNjcmlwdGlvbixcclxuICBkZWJvdW5jZVRpbWUsXHJcbiAgZmlyc3RWYWx1ZUZyb20sXHJcbiAgZnJvbUV2ZW50LFxyXG4gIHRha2VVbnRpbCxcclxufSBmcm9tIFwicnhqc1wiO1xyXG5cclxuaW1wb3J0IHsgTmdiQWNjb3JkaW9uRGlyZWN0aXZlLCBOZ2JNb2RhbCB9IGZyb20gXCJAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFwiO1xyXG5pbXBvcnQgKiBhcyBmYWJyaWMgZnJvbSBcImZhYnJpY1wiO1xyXG5cclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlLCBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLWdsb2JhbFwiO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLXNoYXJlZFwiO1xyXG5cclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTGF5b3V0RWRpdENvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9wb3B1cHMvbGF5b3V0LWVkaXQtY29uZmlybWF0aW9uL2xheW91dC1lZGl0LWNvbmZpcm1hdGlvbi5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgUHVibGlzaFRhc2tQb3B1cENvbXBvbmVudCB9IGZyb20gXCIuL3BvcHVwcy9wdWJsaXNodGFzay1wb3B1cC9wdWJsaXNodGFzay1wb3B1cC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgU3RvcmVUYXNrUmV2b2tlQ29tcG9uZW50IH0gZnJvbSBcIi4vcG9wdXBzL3N0b3JlLXRhc2stcmV2b2tlL3N0b3JlLXRhc2stcmV2b2tlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQgfSBmcm9tIFwiLi4vcG9wdXBzL2RlbGV0ZS1jb25maXJtYXRpb24vZGVsZXRlLWNvbmZpcm1hdGlvbi5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25JRiB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL3BsYW5vLWdlbmVyYWwuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IFB1Ymxpc2hQbGFub01vZGFsQ29tcG9uZW50IH0gZnJvbSBcIi4uL3BvcHVwcy9wdWJsaXNoLXBsYW5vLW1vZGFsL3B1Ymxpc2gtcGxhbm8tbW9kYWwuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IFNjaGVkdWxlVGFza1BvcHVwQ29tcG9uZW50IH0gZnJvbSBcIi4vcG9wdXBzL3NjaGVkdWxlLXRhc2stcG9wdXAvc2NoZWR1bGUtdGFzay1wb3B1cC5jb21wb25lbnRcIjtcclxuaW1wb3J0IGRheWpzIGZyb20gXCJkYXlqc1wiO1xyXG5pbXBvcnQgeyBnZXRGaXh0dXJlQ2FudmFzTGFiZWwgfSBmcm9tIFwiLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uXCI7XHJcblxyXG50eXBlIEJvdW5kRml4dHVyZUdyb3VwID0ge1xyXG4gIGZpeHR1cmVHcm91cDogZmFicmljLkdyb3VwO1xyXG4gIG9mZnNldFg6IG51bWJlcjtcclxuICBvZmZzZXRZOiBudW1iZXI7XHJcbiAgX3RlbXBPbGRUb3A/OiBudW1iZXI7XHJcbiAgX3RlbXBPbGRMZWZ0PzogbnVtYmVyO1xyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwibGliLW1hbmFnZS1zdG9yZS1wbGFub1wiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vbWFuYWdlLXN0b3JlLXBsYW5vLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9tYW5hZ2Utc3RvcmUtcGxhbm8uY29tcG9uZW50LnNjc3NcIixcclxuICBwcm92aWRlcnM6IFtUaXRsZUNhc2VQaXBlXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE1hbmFnZVN0b3JlUGxhbm9Db21wb25lbnRcclxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25Jbml0XHJcbntcclxuICBAVmlld0NoaWxkKFwiYmFzZUNhbnZhc1wiKVxyXG4gIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoXCJjYW52YXNDb250YWluZXJcIikgY29udGFpbmVyUmVmITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZChcIm5vU3RvcmVWaWRlb1wiKSBub1N0b3JlVmlkZW9Nb2RhbFJlZiE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZChcImFwcGx5TG9naWNzXCIpIGFwcGx5TG9naWNzTW9kYWxSZWYhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoXCJhcHByb3ZlTGF5b3V0TW9kYWxcIikgYXBwcm92ZUxheW91dE1vZGFsUmVmITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKFwiYm9keUFjY29yZGlvblwiKSBib2R5QWNjb3JkaW9uPzogTmdiQWNjb3JkaW9uRGlyZWN0aXZlO1xyXG5cclxuICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiKVxyXG4gIG9uUmVzaXplKCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVzaXplQ2FudmFzKCk7XHJcbiAgICB9LCAzMDApO1xyXG4gIH1cclxuXHJcbiAgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG5cclxuICBjYW52YXMhOiBmYWJyaWMuQ2FudmFzO1xyXG4gIHpvb21MZXZlbDogbnVtYmVyID0gMTtcclxuICB3YWxsVGhpY2tuZXNzID0gMzA7XHJcbiAgdmVydGljYWxNYXJnaW4gPSAoMS4yNSAvIDEwMCkgKiB0aGlzLnRvUGl4ZWxzKDE1MjQsIFwibW1cIik7XHJcbiAgd2FsbEJpbmRpbmdzID0gbmV3IE1hcDxmYWJyaWMuR3JvdXAsIEJvdW5kRml4dHVyZUdyb3VwW10+KCk7XHJcblxyXG4gIGxheW91dEZvcm06IEZvcm1Hcm91cDtcclxuICBzZWxlY3RlZEZsb29ySWQgPSBuZXcgRm9ybUNvbnRyb2woXCJcIik7XHJcbiAgZmxvb3JzTGlzdDogRHJvcGRvd25JRltdW10gPSBbXTtcclxuICBmaXh0dXJlQ29uZmlnU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuICBmaXh0dXJlVGVtcGxhdGVJZFN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcbiAgb3RoZXJFbGVtZW50c1N1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIHBsYW5vRGF0YTogYW55O1xyXG5cclxuICBmbG9vckRhdGE6IGFueTtcclxuICByZWFkb25seSBvcmlnaW5hbEZsb29yRGF0YTogYW55OyAvLyB1c2VkIHRvIHJvbGxiYWNrIHRvIG9yaWdpbmFsIGxheW91dCBzdGF0ZSBvbiBjbGljayBjYW5jZWwgd2hpbGUgZWRpdGluZy5cclxuXHJcbiAgY2RuVXJsOiBzdHJpbmc7XHJcbiAgZml4dHVyZVRlbXBsYXRlczogYW55W10gPSBbXTtcclxuICBhbGxGaXh0dXJlczogYW55W10gPSBbXTsgLy8gYWxsIGZpeHR1cmVzIGluY2x1ZGluZyB0aGUgbWFzdGVyIHRlbXBsYXRlcyBmb3IgdHJlZSB2aWV3XHJcbiAgYWxsRml4dHVyZUluc3RhbmNlczogYW55W10gPSBbXTsgLy8gb25seSB0aGUgbGF5b3V0IGZpeHR1cmVzIGluc3RhbmNlcy5cclxuICBzdG9yZUZlZWRiYWNrOiBhbnk7XHJcbiAgem9uZUZlZWRiYWNrOiBhbnk7XHJcbiAgc2VsZWN0ZWRab25lRmVlZGJhY2s6IGFueTtcclxuXHJcbiAgLy8gQ0wgZGV0ZWN0aW9uOiBoZWFkZXIubGFiZWwgbnVsbC9taXNzaW5nIG9yICdDTCcgKGxlZ2FjeSBtb2JpbGUgY2xpZW50cyksIE9SIHRoZVxyXG4gIC8vIG5ld2VyIHRlbXBsYXRlR3JvdXBOYW1lIHNuYXBzaG90ID09PSAnQ0wnIChtb2JpbGUgc3RhcnRlZCB3cml0aW5nIHRoaXMgb250b1xyXG4gIC8vIGFuc3dlcnNbMF0gZm9yIHpvbmUgc3VibWlzc2lvbnMgdG8gY2F0Y2ggYnJhbmQtbGFiZWxlZCBDTCBmaXh0dXJlcykuIE9sZGVyIHpvbmVcclxuICAvLyByb3dzIHdpdGhvdXQgdGVtcGxhdGVHcm91cE5hbWUgc3RpbGwgZmFsbCBiYWNrIHRvIHRoZSBoZWFkZXItbGFiZWwgY2hlY2suXHJcbiAgcHJpdmF0ZSBpc0NsQ29tcGxpYW5jZUFuc3dlcihhbnM6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgbGFiZWwgPSBhbnM/LmhlYWRlcj8ubGFiZWw7XHJcbiAgICBpZiAobGFiZWwgPT0gbnVsbCB8fCBsYWJlbCA9PT0gXCJDTFwiKSByZXR1cm4gdHJ1ZTtcclxuICAgIHJldHVybiBhbnM/LnRlbXBsYXRlR3JvdXBOYW1lID09PSBcIkNMXCI7XHJcbiAgfVxyXG5cclxuICBnZXQgem9uZVBlbmRpbmdDb3VudCgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgdGFzayA9IHRoaXMuem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uVGFzaztcclxuICAgIGlmICghdGFzaykgcmV0dXJuIDA7XHJcbiAgICBjb25zdCByb3dzOiBhbnlbXSA9IHRoaXMuem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uRGF0YSA/PyBbXTtcclxuICAgIGxldCBwZW5kaW5nID0gMDtcclxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcclxuICAgICAgY29uc3QgYW5zID0gcm93Py5hbnN3ZXJzPy5bMF07XHJcbiAgICAgIGlmICghYW5zKSBjb250aW51ZTtcclxuICAgICAgaWYgKHRoaXMuaXNDbENvbXBsaWFuY2VBbnN3ZXIoYW5zKSkgY29udGludWU7XHJcbiAgICAgIGNvbnN0IGhhc1Jlc3BvbnNlID1cclxuICAgICAgICBBcnJheS5pc0FycmF5KGFucz8uc2hlbGZDb25maWcpICYmIGFucy5zaGVsZkNvbmZpZy5sZW5ndGggPiAwO1xyXG4gICAgICBpZiAoaGFzUmVzcG9uc2UgJiYgIWFucz8udXNlckFjdGlvbikgcGVuZGluZysrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBlbmRpbmc7XHJcbiAgfVxyXG5cclxuICBnZXQgem9uZVJlZG9Db3VudCgpOiBudW1iZXIge1xyXG4gICAgLy8gSXRlcmF0ZSBjb21wbGlhbmNlIHJvd3MgZGlyZWN0bHkgc28gYSByZWRvIGZsYWcgaXMgZGV0ZWN0ZWQgZXZlbiBpZiB0aGUgZmxvb3JcclxuICAgIC8vIGRhdGEgaXNuJ3QgcmVmcmVzaGVkIHlldC4gQ0wgc2tpcCB1c2VzIGlzQ2xDb21wbGlhbmNlQW5zd2VyIChoZWFkZXIgbGFiZWwgT1JcclxuICAgIC8vIHRlbXBsYXRlR3JvdXBOYW1lIHNuYXBzaG90KSDigJQgc2FtZSBydWxlIGFzIHRoZSBCRSByb2xsdXAuXHJcbiAgICBjb25zdCByb3dzOiBhbnlbXSA9IHRoaXMuem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uRGF0YSA/PyBbXTtcclxuICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XHJcbiAgICAgIGNvbnN0IGFucyA9IHJvdz8uYW5zd2Vycz8uWzBdO1xyXG4gICAgICBpZiAoIWFucykgY29udGludWU7XHJcbiAgICAgIGlmICh0aGlzLmlzQ2xDb21wbGlhbmNlQW5zd2VyKGFucykpIGNvbnRpbnVlO1xyXG4gICAgICBpZiAoYW5zLnVzZXJBY3Rpb24gPT09IFwicmVkb1wiKSBjb3VudCsrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvdW50O1xyXG4gIH1cclxuXHJcbiAgLy8gUmVkbyBjYW4gYmUgcHVibGlzaGVkIG9uY2UgZXZlcnkgbm9uLUNMIGZpeHR1cmUgaGFzIGJlZW4gYWN0aW9uZWQgQU5EIGF0IGxlYXN0IG9uZSBpcyByZWRvLlxyXG4gIC8vIEFsc28gcmVxdWlyZXMgdGhlIHRhc2sgdG8gc3RpbGwgYmUgaW4gJ3N1Ym1pdCcgc3RhdGUg4oCUIG9uY2UgcmVkbyBpcyBwdWJsaXNoZWQsIHRoZSB0YXNrXHJcbiAgLy8gcmVvcGVucyAoc3RhdHVzPSdvcGVuJykgYW5kIHRoZSBidXR0b24gbXVzdCBoaWRlIHVudGlsIG1vYmlsZSByZXN1Ym1pdHMuXHJcbiAgZ2V0IHpvbmVSZWRvU3RhdHVzKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdGFzayA9IHRoaXMuem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uVGFzaztcclxuICAgIGlmICh0YXNrPy5jaGVja2xpc3RTdGF0dXMgIT09IFwic3VibWl0XCIpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0aGlzLnpvbmVQZW5kaW5nQ291bnQgPT09IDAgJiYgdGhpcy56b25lUmVkb0NvdW50ID4gMDtcclxuICB9XHJcblxyXG4gIGdldCB6b25lVGFza1N0eWxlKCk6IHsgbmFtZTogc3RyaW5nOyBjbGFzczogc3RyaW5nIH0ge1xyXG4gICAgY29uc3QgdGFzayA9IHRoaXMuem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uVGFzaztcclxuICAgIGlmICghdGFzaykgcmV0dXJuIHsgbmFtZTogXCJZZXQgdG8gQXNzaWduXCIsIGNsYXNzOiBcInlldFRvQXNzaWduXCIgfTtcclxuICAgIGNvbnN0IHN0YXR1cyA9IHRhc2suY2hlY2tsaXN0U3RhdHVzO1xyXG4gICAgLy8gQ29sbGFwc2UgJ29wZW4nIGFuZCAnaW5wcm9ncmVzcycgaW50byBhIHNpbmdsZSBcIlRhc2sgQXNzaWduZWRcIiBzdGF0ZSxcclxuICAgIC8vIG1hdGNoaW5nIHRoZSB2ZXJpZmljYXRpb24gdGFibGUncyBjb2x1bW4gY29udmVudGlvbi5cclxuICAgIGlmIChzdGF0dXMgPT09IFwib3BlblwiIHx8IHN0YXR1cyA9PT0gXCJpbnByb2dyZXNzXCIpIHtcclxuICAgICAgLy8gQWZ0ZXIgYSByZWRvIGlzIHB1Ymxpc2hlZCwgdGhlIHRhc2sgcmVvcGVucyB3aXRoIHJlZG9TdGF0dXM9dHJ1ZS5cclxuICAgICAgaWYgKHRhc2sucmVkb1N0YXR1cyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHJldHVybiB7IG5hbWU6IFwiUmVkb1wiLCBjbGFzczogXCJ0YXNrQXNzaWduZWRcIiB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7IG5hbWU6IFwiVGFzayBBc3NpZ25lZFwiLCBjbGFzczogXCJ0YXNrQXNzaWduZWRcIiB9O1xyXG4gICAgfVxyXG4gICAgLy8gc3RhdHVzID09PSAnc3VibWl0J1xyXG4gICAgLy8gTWF0Y2ggZml4dHVyZSB2ZXJpZmljYXRpb24ncyB3b3JkaW5nOiB3aGVuIHRoZXJlIGFyZSBwZW5kaW5nIHJlZG9zIHRvIHB1Ymxpc2gsXHJcbiAgICAvLyBmaXh0dXJlJ3MgZ2V0U3RhdHVzKCkgcmV0dXJucyBcIllldCB0byBBc3NpZ25cIiDigJQgc2FtZSBjb252ZW50aW9uIHVzZWQgaGVyZS5cclxuICAgIGlmICh0aGlzLnpvbmVSZWRvU3RhdHVzKSB7XHJcbiAgICAgIHJldHVybiB7IG5hbWU6IFwiWWV0IHRvIEFzc2lnblwiLCBjbGFzczogXCJ5ZXRUb0Fzc2lnblwiIH07XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy56b25lUGVuZGluZ0NvdW50ID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB7IG5hbWU6IFwiQXBwcm92ZWRcIiwgY2xhc3M6IFwiY29tcGxldGVkXCIgfTtcclxuICAgIH1cclxuICAgIHJldHVybiB7IG5hbWU6IFwiUmV2aWV3IFBlbmRpbmdcIiwgY2xhc3M6IFwicmV2aWV3UGVuZGluZ1wiIH07XHJcbiAgfVxyXG5cclxuICAvLyBUb3AgXCJQdWJsaXNoXCIgYnV0dG9uIHZpc2liaWxpdHk6IGFwcGVhcnMgb25jZSBsYXlvdXQrZml4dHVyZSt2bSBhcmUgQXBwcm92ZWQsXHJcbiAgLy8gcmVnYXJkbGVzcyBvZiB6b25lIHN0YXRlLiBTdXBwb3J0cyBsZWdhY3kgc3RvcmVzIChubyB6b25lIHRhc2spIGJ5IGVuYWJsaW5nXHJcbiAgLy8gaW1tZWRpYXRlbHksIGFuZCBnYXRlcyBhY3RpdmUgem9uZSB0YXNrcyB2aWEgdG9wUHVibGlzaERpc2FibGVkIGJlbG93LlxyXG4gIGdldCBzaG93VG9wUHVibGlzaCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMudGFza1N0eWxlLmxheW91dC5uYW1lID09PSBcIkFwcHJvdmVkXCIgJiZcclxuICAgICAgdGhpcy50YXNrU3R5bGUuZml4dHVyZS5uYW1lID09PSBcIkFwcHJvdmVkXCIgJiZcclxuICAgICAgdGhpcy50YXNrU3R5bGUudm0ubmFtZSA9PT0gXCJBcHByb3ZlZFwiXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gVG9wIFwiUHVibGlzaFwiIGJ1dHRvbiBkaXNhYmxlZCB3aGVuIGEgem9uZSB0YXNrIGV4aXN0cyBhbmQgaXNuJ3QgQXBwcm92ZWQgeWV0LlxyXG4gIC8vIEtlZXBzIHRoZSBkaXNhYmxlZFB1Ymxpc2ggc2lnbmFsIGZyb20gQkUgKHRhc2tJbmZvLmRpc2FibGVkIC8gZWRpdGluZykgaW50YWN0LlxyXG4gIGdldCB0b3BQdWJsaXNoRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB6b25lVGFza0V4aXN0cyA9ICEhdGhpcy56b25lRmVlZGJhY2s/LnpvbmVWZXJpZmljYXRpb25UYXNrO1xyXG4gICAgY29uc3Qgem9uZUFwcHJvdmVkID1cclxuICAgICAgIXpvbmVUYXNrRXhpc3RzIHx8IHRoaXMuem9uZVRhc2tTdHlsZS5uYW1lID09PSBcIkFwcHJvdmVkXCI7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZFB1Ymxpc2ggfHwgIXpvbmVBcHByb3ZlZDtcclxuICB9XHJcblxyXG4gIC8vIFRlbGxzIGluc2lkZS1maXh0dXJlIGVkaXRvcnMgd2hldGhlciB0byBhc2sgdGhlIEJFIHRvIHJldmVydCBkb3duc3RyZWFtXHJcbiAgLy8gdmVyaWZpY2F0aW9ucyBvbiBzYXZlLiBUcnVlIHdoZW5ldmVyIGFueSB2ZXJpZmljYXRpb24gKGZpeHR1cmUgLyB2bSAvIHpvbmUpIGlzXHJcbiAgLy8gcGFzdCBZZXRUb0Fzc2lnbiwgbWlycm9yaW5nIHVwZGF0ZVN0b3JlUGxhbm8ncyBhbHdheXMtb24gcmV2ZXJ0T25FZGl0LiBBSVxyXG4gIC8vIHZlcmlmaWNhdGlvbiBmbG93cyAoa2VlcFBsYW5vIC8gbW9kaWZ5UGxhbm8gLyBtb2RpZnlBaVJlc3BvbnNlIC8gem9uZSBlZGl0QWNjZXB0ZWQpXHJcbiAgLy8gYW5kIHJvbGxvdXQgZWRpdHMgYXJlIGZpbHRlcmVkIGVhcmxpZXIgYnkgdGhlIGNoaWxkcmVuJ3MgYCFmaXh0dXJlRGF0YT8udGFza1R5cGVcclxuICAvLyAmJiAhaXNSb2xsb3V0YCBnYXRlLCBzbyB3aWRlbmluZyB0aGlzIGhlcmUgb25seSBhZmZlY3RzIG5vcm1hbCBsYXlvdXQtZWRpdC1tb2RlXHJcbiAgLy8gZml4dHVyZSBzYXZlcyDigJQgd2hpY2ggaXMgZXhhY3RseSB0aGUgY2FzZSB0aGF0IHNob3VsZCBpbnZhbGlkYXRlIGRvd25zdHJlYW0gdGFza3MuXHJcbiAgZ2V0IHNob3VsZFJldmVydE9uRWRpdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMudGFza1N0eWxlLmZpeHR1cmUuY2xhc3MgIT09IFwieWV0VG9Bc3NpZ25cIiB8fFxyXG4gICAgICB0aGlzLnRhc2tTdHlsZS52bS5jbGFzcyAhPT0gXCJ5ZXRUb0Fzc2lnblwiIHx8XHJcbiAgICAgIHRoaXMuem9uZVRhc2tTdHlsZS5jbGFzcyAhPT0gXCJ5ZXRUb0Fzc2lnblwiXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRGaXh0dXJlOiBhbnk7XHJcbiAgc2VsZWN0ZWRGaXh0dXJlRGF0YTogYW55O1xyXG4gIHNlbGVjdGVkRml4dHVyZUZlZWRiYWNrOiBhbnk7XHJcbiAgZWRpdEZpeHR1cmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBlZGl0Rml4dHVyZVNlY3Rpb246IFwiYmFzaWMtZGV0YWlsc1wiIHwgXCJwcm9kdWN0c1wiIHwgXCJ2bXNcIiA9IFwiYmFzaWMtZGV0YWlsc1wiO1xyXG4gIGFjdGl2ZUZlZWRiYWNrVGFiOiBcImZpeHR1cmVcIiB8IFwiem9uZVwiID0gXCJmaXh0dXJlXCI7XHJcbiAgZWRpdEZyb21UYWI6IFwiZml4dHVyZVwiIHwgXCJ6b25lXCIgPSBcImZpeHR1cmVcIjtcclxuICBzdWJtaXRGaXh0dXJlID0gZmFsc2U7XHJcblxyXG4gIGhpZ2hsaWdodGVkRml4dHVyZUZvcm1JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHN0b3JlTWV0cmljcyA9IHtcclxuICAgIGZsb29yQ291bnQ6IDAsXHJcbiAgICBmaXh0dXJlQ291bnQ6IDAsXHJcbiAgICB2bUNvdW50OiAwLFxyXG4gIH07XHJcblxyXG4gIGlzUGFnZUxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzUmlnaHRQYW5lbENvbGxhcHNlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNMZWZ0UGFuZWxDb2xsYXBzZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHNlbGVjdGVkVmlldzogXCJ0cmVlXCIgfCBcImRldGFpbFwiID0gXCJkZXRhaWxcIjtcclxuXHJcbiAgcHVibGlzaGluZ1N0YXRlOlxyXG4gICAgfCBcImxheW91dFwiXHJcbiAgICB8IFwibGF5b3V0LXJlZG9cIlxyXG4gICAgfCBcImZpeHR1cmVcIlxyXG4gICAgfCBcImZpeHR1cmUtcmVkb1wiXHJcbiAgICB8IFwidm1cIlxyXG4gICAgfCBcInZtLXJlZG9cIlxyXG4gICAgfCBcImNvbXBsZXRlXCJcclxuICAgIHwgXCJcIiA9IFwiXCI7XHJcbiAgZGlzYWJsZWRQdWJsaXNoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZGlzYWJsZUVkaXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzU2F2aW5nTGF5b3V0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIEZsaXBwZWQgdG8gdHJ1ZSBieSBhbnkgbGF5b3V0LWxldmVsIG11dGF0aW9uIChhZGQgLyBkZWxldGUgLyBtb3ZlIC8gdGVtcGxhdGVcclxuICAvLyBjaGFuZ2UpLiBSZXNldCB0byBmYWxzZSBvbiBzdWNjZXNzZnVsIHNhdmUuIEdhdGVzIHRoZSBwZXItZml4dHVyZSBlZGl0IGljb25cclxuICAvLyBzbyB0aGUgdXNlciBtdXN0IHNhdmUgbGF5b3V0IGNoYW5nZXMgZmlyc3QuXHJcbiAgbGF5b3V0SGFzVW5zYXZlZENoYW5nZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0YXNrSW5mbzogYW55O1xyXG4gIHRhc2tTdHlsZSA9IHtcclxuICAgIGxheW91dDogeyBuYW1lOiBcIllldCBUbyBBc3NpZ25cIiwgY2xhc3M6IFwieWV0VG9Bc3NpZ25cIiB9LFxyXG4gICAgZml4dHVyZTogeyBuYW1lOiBcIllldCBUbyBBc3NpZ25cIiwgY2xhc3M6IFwieWV0VG9Bc3NpZ25cIiB9LFxyXG4gICAgdm06IHsgbmFtZTogXCJZZXQgVG8gQXNzaWduXCIsIGNsYXNzOiBcInlldFRvQXNzaWduXCIgfSxcclxuICB9O1xyXG5cclxuICBvdGhlckVsZW1lbnRMaXN0OiBEcm9wZG93bklGW10gPSBbXHJcbiAgICB7IGxhYmVsOiBcIlBPUyBDb3VudGVyXCIsIHZhbHVlOiBcIlBPUyBDb3VudGVyXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiRGlzY3Vzc2lvbiBUYWJsZVwiLCB2YWx1ZTogXCJEaXNjdXNzaW9uIFRhYmxlXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiTWlycm9yXCIsIHZhbHVlOiBcIk1pcnJvclwiIH0sXHJcbiAgICB7IGxhYmVsOiBcIk90aGVyc1wiLCB2YWx1ZTogXCJPdGhlcnNcIiB9LFxyXG4gIF07XHJcbiAgc3RvcmVMaXN0OiBhbnkgPSBbXTtcclxuICBzZWxlY3RlZFN0b3JlTmFtZTogYW55O1xyXG5cclxuICAvLyB2bUxpc3Q6IFZtTGlicmFyeUxpc3RbXSA9IFtdO1xyXG4gIC8vIGlzVXNlckludGVyYWN0ZWRXaXRoQ2FudmFzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgYWN0aXZlSGlnaGxpZ2h0OiBmYWJyaWMuUmVjdCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgY2FuY2VsSGlnaGxpZ2h0QmxpbmsgPSBmYWxzZTtcclxuXHJcbiAgaXNCdXR0b25Mb2FkaW5nID0gZmFsc2U7XHJcbiAgaXNTdG9yZVRvdXJMb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gIGxheW91dEJvdW5kczogYW55O1xyXG4gIHNob3dMYXlvdXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjbENvdW50OiBudW1iZXIgPSAwO1xyXG4gIHdhbGxDb3VudDogbnVtYmVyID0gMDtcclxuICB0b2dnbGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRpdGxlQ2FzZTogVGl0bGVDYXNlUGlwZSxcclxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXHJcbiAgICBwcml2YXRlIHBhZ2VJbmZvOiBQYWdlSW5mb1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICApIHtcclxuICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG5cclxuICAgIHRoaXMuZ3MuZW52aXJvbm1lbnQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICBpZiAoZSkgdGhpcy5jZG5VcmwgPSBlLnBsYW5vZ3JhbUNETjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNldFBhZ2VEYXRhKCk7XHJcblxyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKGRhdGEpID0+IHtcclxuICAgICAgICBpZiAoZGF0YT8uY2xpZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaGVhZGVyRGF0YSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhd2FpdCB0aGlzLmdldFZtc0xpc3QoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XHJcbiAgICAgICAgaWYgKHBhcmFtcz8ucGxhbm9JZCkge1xyXG4gICAgICAgICAgdGhpcy5nZXRTdG9yZUZpeHR1cmVzKHBhcmFtcz8ucGxhbm9JZCk7XHJcbiAgICAgICAgICB0aGlzLmdldFN0b3JlTGlzdChwYXJhbXM/LnBsYW5vSWQpO1xyXG4gICAgICAgICAgaWYgKHBhcmFtcz8uZmxvb3JJZCkge1xyXG4gICAgICAgICAgICB0aGlzLmZsb29yRGF0YSA9IHsgX2lkOiBwYXJhbXM/LmZsb29ySWQgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRGbG9vcklkLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoYXN5bmMgKGlkKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNsaWNrZWRGbG9vciA9IHRoaXMucGxhbm9EYXRhPy5mbG9vcnM/LmZpbmQoXHJcbiAgICAgICAgKGY6IGFueSkgPT4gZi5faWQgPT09IGlkLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKFtcImRyYWZ0XCIsIFwiYWxsb2NhdGlvblBlbmRpbmdcIl0uaW5jbHVkZXMoY2xpY2tlZEZsb29yLnN0YXR1cykpIHtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKFxyXG4gICAgICAgICAgYG1hbmFnZS9wbGFub2dyYW0vb25ib2FyZC1wbGFub2dyYW0/cGxhbm9JZD0ke2NsaWNrZWRGbG9vci5wbGFub0lkfSZmbG9vcklkPSR7Y2xpY2tlZEZsb29yLl9pZH1gLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mbG9vckRhdGEgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgICAgIC8vIEtlZXAgdGhlIGZvcm0gZGlzYWJsZWQgZHVyaW5nIHRoZSBmbG9vci1zd2l0Y2ggbG9hZGluZyB3aW5kb3cgc28gdGhlXHJcbiAgICAgICAgLy8gdGVtcGxhdGUncyBlZGl0LW1vZGUgYnV0dG9ucyAoU2F2ZSAvIENhbmNlbCAvIEFkZCBFbnRyYW5jZSkgZG9uJ3QgZmxhc2guXHJcbiAgICAgICAgdGhpcy5sYXlvdXRGb3JtLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5pc0xlZnRQYW5lbENvbGxhcHNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc1JpZ2h0UGFuZWxDb2xsYXBzZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBSZXNldCBwZXItZmxvb3Igc2VsZWN0aW9uIHN0YXRlIHNvIHN0YWxlIHJlZmVyZW5jZXMgZnJvbSB0aGUgcHJldmlvdXNcclxuICAgICAgICAvLyBmbG9vciBkb24ndCBibGVlZCBpbnRvIHRoZSBuZXcgZmxvb3IncyByZW5kZXIgYW5kIGZlZWRiYWNrIHBhbmVscy5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVGZWVkYmFjayA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFpvbmVGZWVkYmFjayA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5hbGxGaXh0dXJlSW5zdGFuY2VzID0gW107XHJcbiAgICAgICAgdGhpcy5hbGxGaXh0dXJlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMud2FsbENvdW50ID0gdGhpcy5jbENvdW50ID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy5mbG9vckRhdGEgPSBjbGlja2VkRmxvb3I7XHJcbiAgICAgICAgdGhpcy5leHRyYWN0QWxsRml4dHVyZXModGhpcy5mbG9vckRhdGEpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICB0aGlzLnRhc2tEZXRhaWxzKHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsIHRoaXMuZmxvb3JEYXRhLl9pZCksXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U3RvcmVGZWVkYmFjayhcclxuICAgICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgdGhpcy5nZXRab25lVmVyaWZpY2F0aW9uRmVlZGJhY2soXHJcbiAgICAgICAgICAgICAgdGhpcy5mbG9vckRhdGEucGxhbm9JZCxcclxuICAgICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICBdKTtcclxuICAgICAgICB9IGNhdGNoIHt9XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyRmxvb3IoKTtcclxuICAgICAgICB0aGlzLmxheW91dEZvcm0uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgY29uc3QgbmV3UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcclxuICAgICAgICBuZXdQYXJhbXMuc2V0KFwicGxhbm9JZFwiLCB0aGlzLmZsb29yRGF0YS5wbGFub0lkKTtcclxuICAgICAgICBuZXdQYXJhbXMuc2V0KFwiZmxvb3JJZFwiLCB0aGlzLmZsb29yRGF0YS5faWQpO1xyXG5cclxuICAgICAgICB0aGlzLmxvY2F0aW9uLnJlcGxhY2VTdGF0ZShcclxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSxcclxuICAgICAgICAgIG5ld1BhcmFtcy50b1N0cmluZygpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZsb29ySWQuc2V0VmFsdWUodGhpcy5mbG9vckRhdGEuX2lkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FudmFzID0gbmV3IGZhYnJpYy5DYW52YXModGhpcy5jYW52YXNSZWY/Lm5hdGl2ZUVsZW1lbnQsIHtcclxuICAgICAgc2VsZWN0aW9uRnVsbHlDb250YWluZWQ6IHRydWUsXHJcbiAgICAgIHBlclBpeGVsVGFyZ2V0RmluZDogdHJ1ZSxcclxuICAgICAgdGFyZ2V0RmluZFRvbGVyYW5jZTogNSxcclxuICAgIH0pO1xyXG5cclxuICAgIGZyb21FdmVudCh0aGlzLmNhbnZhcyBhcyBhbnksIFwib2JqZWN0Om1vZGlmaWVkXCIpXHJcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxMDApKVxyXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jIChlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBtb3ZlZE9iajogYW55ID0gZS50YXJnZXQ7XHJcblxyXG4gICAgICAgIGlmICghbW92ZWRPYmopIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0Rm9ybT8uZW5hYmxlZCkge1xyXG4gICAgICAgICAgdGhpcy5sYXlvdXRIYXNVbnNhdmVkQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobW92ZWRPYmo/LnR5cGUgPT09IFwiYWN0aXZlU2VsZWN0aW9uXCIpIHtcclxuICAgICAgICAgIHRoaXMuYXBwbHlHcm91cFRyYW5zZm9ybShtb3ZlZE9iaik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhY3Rpb24gPSBlLnRyYW5zZm9ybT8uYWN0aW9uO1xyXG5cclxuICAgICAgICBjb25zdCBpc1Jlc2l6ZSA9XHJcbiAgICAgICAgICBhY3Rpb24gPT09IFwic2NhbGVcIiB8fCBhY3Rpb24gPT09IFwic2NhbGVYXCIgfHwgYWN0aW9uID09PSBcInNjYWxlWVwiO1xyXG5cclxuICAgICAgICBpZiAoaXNSZXNpemUpIHtcclxuICAgICAgICAgIGNvbnN0IHR5cGUgPSBtb3ZlZE9iaj8ub2JqVHlwZSA/PyBcImdyb3VwXCI7XHJcblxyXG4gICAgICAgICAgY29uc3QgdXBkYXRlZENvbmZpZyA9IHtcclxuICAgICAgICAgICAgeDogbW92ZWRPYmoubGVmdCxcclxuICAgICAgICAgICAgeTogbW92ZWRPYmoudG9wLFxyXG4gICAgICAgICAgICB3aWR0aDogbW92ZWRPYmouZ2V0U2NhbGVkV2lkdGgoKSxcclxuICAgICAgICAgICAgaGVpZ2h0OiBtb3ZlZE9iai5nZXRTY2FsZWRIZWlnaHQoKSxcclxuICAgICAgICAgICAgYW5nbGU6IG1vdmVkT2JqLmFuZ2xlLFxyXG4gICAgICAgICAgICBlbGVtZW50RGF0YTogbW92ZWRPYmouZGF0YSxcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ3YWxsXCI6IHtcclxuICAgICAgICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmUobW92ZWRPYmopO1xyXG4gICAgICAgICAgICAgIHVwZGF0ZWRDb25maWcuZWxlbWVudERhdGEuYW5nbGUgPSB1cGRhdGVkQ29uZmlnLmFuZ2xlO1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCBuZXdXYWxsID0gYXdhaXQgdGhpcy5kcmF3V2FsbChcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy54LFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy55LFxyXG4gICAgICAgICAgICAgICAgdGhpcy53YWxsVGhpY2tuZXNzLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy53aWR0aCAtIDAuMjcsXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkQ29uZmlnLmVsZW1lbnREYXRhLFxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgIChuZXdXYWxsIGFzIGFueSkub2JqVHlwZSA9IFwid2FsbFwiO1xyXG4gICAgICAgICAgICAgIChuZXdXYWxsIGFzIGFueSkuZGF0YSA9IHVwZGF0ZWRDb25maWcuZWxlbWVudERhdGE7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuY2FudmFzLnNldEFjdGl2ZU9iamVjdChuZXdXYWxsKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2FzZSBcIm90aGVyc1wiOiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXMucmVtb3ZlKG1vdmVkT2JqKTtcclxuICAgICAgICAgICAgICB1cGRhdGVkQ29uZmlnLmVsZW1lbnREYXRhLnJlbGF0aXZlUG9zaXRpb24uYW5nbGUgPVxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy5hbmdsZTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgbmV3T3RoZXIgPSB0aGlzLmRyYXdPdGhlckVsZW1lbnRzV2l0aExhYmVsKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXMsXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkQ29uZmlnLngsXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkQ29uZmlnLnksXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkQ29uZmlnLmFuZ2xlLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZENvbmZpZy53aWR0aCAtIDIsXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkQ29uZmlnLmhlaWdodCAtIDIsXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkQ29uZmlnLmVsZW1lbnREYXRhLFxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgIChuZXdPdGhlciBhcyBhbnkpLm9ialR5cGUgPSBcIm90aGVyc1wiO1xyXG4gICAgICAgICAgICAgIChuZXdPdGhlciBhcyBhbnkpLmRhdGEgPSB1cGRhdGVkQ29uZmlnLmVsZW1lbnREYXRhO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmNhbnZhcy5zZXRBY3RpdmVPYmplY3QobmV3T3RoZXIpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjYXNlIFwiZW50cmFuY2VcIjoge1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjYXNlIFwiZml4dHVyZVwiOiB7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVXYWxsQ29vcmRpbmF0ZXMoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUZpeHR1cmVDb29yZGluYXRlcygpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlT3RoZXJFbGVtZW50c0Nvb3JkaW5hdGVzKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVFbnRyYW5jZUNvb3JkaW5hdGVzKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2V0dXBab29tSGFuZGxlcnMoKTtcclxuXHJcbiAgICB0aGlzLmxpc3RlblRvRGVsZXRlS2V5KCk7XHJcbiAgICB0aGlzLnRvZ2dsZVBhbmVsKFwibGVmdFwiLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZUFsbFBvc2l0aW9ucygpIHtcclxuICAgIHRoaXMudXBkYXRlV2FsbENvb3JkaW5hdGVzKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUZpeHR1cmVDb29yZGluYXRlcygpO1xyXG4gICAgdGhpcy51cGRhdGVPdGhlckVsZW1lbnRzQ29vcmRpbmF0ZXMoKTtcclxuICAgIHRoaXMudXBkYXRlRW50cmFuY2VDb29yZGluYXRlcygpO1xyXG5cclxuICAgIHRoaXMuZmxvb3JEYXRhLmNhZExheW91dCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlHcm91cFRyYW5zZm9ybShzZWxlY3Rpb246IGZhYnJpYy5BY3RpdmVTZWxlY3Rpb24pIHtcclxuICAgIGNvbnN0IG1hdHJpeCA9IHNlbGVjdGlvbi5jYWxjVHJhbnNmb3JtTWF0cml4KCk7XHJcblxyXG4gICAgc2VsZWN0aW9uLmdldE9iamVjdHMoKS5mb3JFYWNoKChvYmo6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBvYmpNYXRyaXggPSBvYmouY2FsY1RyYW5zZm9ybU1hdHJpeCgpO1xyXG4gICAgICBjb25zdCBmaW5hbE1hdHJpeCA9IGZhYnJpYy51dGlsLm11bHRpcGx5VHJhbnNmb3JtTWF0cmljZXMoXHJcbiAgICAgICAgbWF0cml4LFxyXG4gICAgICAgIG9iak1hdHJpeCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IHBvaW50ID0gbmV3IGZhYnJpYy5Qb2ludCgwLCAwKS50cmFuc2Zvcm0oZmluYWxNYXRyaXgpO1xyXG5cclxuICAgICAgb2JqLnNldCh7XHJcbiAgICAgICAgbGVmdDogcG9pbnQueCxcclxuICAgICAgICB0b3A6IHBvaW50LnksXHJcbiAgICAgICAgYW5nbGU6IHNlbGVjdGlvbi5hbmdsZSArIChvYmouYW5nbGUgPz8gMCksXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgb2JqLnNldENvb3JkcygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gVW5ncm91cCBhZnRlciBhcHBseWluZyB0cmFuc2Zvcm1cclxuICAgIHRoaXMuY2FudmFzLmRpc2NhcmRBY3RpdmVPYmplY3QoKTtcclxuICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICB9XHJcblxyXG4gIHJlc2l6ZUNhbnZhcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLmNhbnZhcy5zZXREaW1lbnNpb25zKHtcclxuICAgICAgd2lkdGg6IGNvbnRhaW5lci5jbGllbnRXaWR0aCAtIDUwLFxyXG5cclxuICAgICAgaGVpZ2h0OiBjb250YWluZXIuY2xpZW50SGVpZ2h0IC0gNDAsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICB9XHJcblxyXG4gIHNldHVwWm9vbUhhbmRsZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jYW52YXMub24oXCJtb3VzZTp3aGVlbFwiLCAob3B0OiBmYWJyaWMuVEV2ZW50PFdoZWVsRXZlbnQ+KSA9PiB7XHJcbiAgICAgIGNvbnN0IGUgPSBvcHQuZTtcclxuXHJcbiAgICAgIGlmIChlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSB7XHJcbiAgICAgICAgLy8gdGhpcy5pc1VzZXJJbnRlcmFjdGVkV2l0aENhbnZhcyA9IHRydWU7XHJcbiAgICAgICAgY29uc3QgZGVsdGEgPSBlLmRlbHRhWTtcclxuICAgICAgICBsZXQgem9vbSA9IHRoaXMuY2FudmFzLmdldFpvb20oKTtcclxuICAgICAgICB6b29tICo9IDAuOTk1ICoqIGRlbHRhO1xyXG5cclxuICAgICAgICB6b29tID0gTWF0aC5tYXgoMC4wNSwgTWF0aC5taW4oem9vbSwgNSkpO1xyXG5cclxuICAgICAgICB0aGlzLmNhbnZhcy56b29tVG9Qb2ludChcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgeDogZS5vZmZzZXRYLFxyXG4gICAgICAgICAgICB5OiBlLm9mZnNldFksXHJcbiAgICAgICAgICB9IGFzIGZhYnJpYy5Qb2ludCxcclxuICAgICAgICAgIHpvb20sXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XHJcbiAgICBsZXQgbGFzdFBvc1ggPSAwO1xyXG4gICAgbGV0IGxhc3RQb3NZID0gMDtcclxuXHJcbiAgICB0aGlzLmNhbnZhcy5vbihcIm1vdXNlOmRvd25cIiwgKG9wdDogYW55KSA9PiB7XHJcbiAgICAgIGlmICghb3B0LnRhcmdldCkge1xyXG4gICAgICAgIGlzRHJhZ2dpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2FudmFzLnNlbGVjdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGUgPSBvcHQuZTtcclxuICAgICAgICBsYXN0UG9zWCA9IGUuY2xpZW50WDtcclxuICAgICAgICBsYXN0UG9zWSA9IGUuY2xpZW50WTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYW52YXMub24oXCJtb3VzZTptb3ZlXCIsIChvcHQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoaXNEcmFnZ2luZyAmJiB0aGlzLmNhbnZhcy52aWV3cG9ydFRyYW5zZm9ybSkge1xyXG4gICAgICAgIC8vIHRoaXMuaXNVc2VySW50ZXJhY3RlZFdpdGhDYW52YXMgPSB0cnVlO1xyXG4gICAgICAgIGNvbnN0IGUgPSBvcHQuZTtcclxuICAgICAgICBjb25zdCB2cHQgPSB0aGlzLmNhbnZhcy52aWV3cG9ydFRyYW5zZm9ybTtcclxuICAgICAgICB2cHRbNF0gKz0gZS5jbGllbnRYIC0gbGFzdFBvc1g7XHJcbiAgICAgICAgdnB0WzVdICs9IGUuY2xpZW50WSAtIGxhc3RQb3NZO1xyXG4gICAgICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICAgICAgICBsYXN0UG9zWCA9IGUuY2xpZW50WDtcclxuICAgICAgICBsYXN0UG9zWSA9IGUuY2xpZW50WTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYW52YXMub24oXCJtb3VzZTp1cFwiLCAoKSA9PiB7XHJcbiAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jYW52YXMuc2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKFwiTWFuYWdlIFN0b3JlIFBsYW5vXCIpO1xyXG4gICAgdGhpcy5wYWdlSW5mby5zZXRCcmVhZGNydW1icyhbXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogXCJQbGFub2dyYW1cIixcclxuICAgICAgICBwYXRoOiBcIi9tYW5hZ2UvcGxhbm9ncmFtL21hbmFnZS1wbGFub2dyYW1zXCIsXHJcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGlzU2VwYXJhdG9yOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlwiLFxyXG4gICAgICAgIHBhdGg6IFwiXCIsXHJcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGlzU2VwYXJhdG9yOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBvbkZpeHR1cmVTYXZlKCkge1xyXG4gICAgdGhpcy5zdWJtaXRGaXh0dXJlID0gdHJ1ZTtcclxuICAgIC8vIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YS50YXNrVHlwZSA9IHRoaXMucHVibGlzaGluZ1N0YXRlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3VibWl0Rml4dHVyZSA9IGZhbHNlO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uRml4dHVyZVBhZ2VDYW5jZWwoKSB7XHJcbiAgICAvLyB0aGlzLnN1Ym1pdEZpeHR1cmUgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YSA9IG51bGw7XHJcbiAgICB0aGlzLmVkaXRGaXh0dXJlU2VjdGlvbiA9IFwiYmFzaWMtZGV0YWlsc1wiO1xyXG4gICAgdGhpcy5lZGl0Rml4dHVyZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5lZGl0RnJvbVRhYiA9IFwiZml4dHVyZVwiO1xyXG4gICAgLy8gdGhpcy5sYXlvdXRGb3JtLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVzaXplQ2FudmFzKCk7XHJcbiAgICAgIHRoaXMuZml0Q2FudmFzVG9MYXlvdXRBbmltYXRlZCgpO1xyXG4gICAgfSwgMzAwKTtcclxuICB9XHJcblxyXG4gIG9uRml4dHVyZVN1Ym1pdChldmVudDogYW55KSB7XHJcbiAgICBpZiAoIWV2ZW50ICYmICF0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEpIHJldHVybjtcclxuXHJcbiAgICBpZiAoZXZlbnQ/LnNoZWxmICYmIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YT8uc2hlbGZDb25maWcpIHtcclxuICAgICAgZXZlbnQuc2hlbGYgPSBldmVudC5zaGVsZi5tYXAoKHNoZWxmOiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgZmluZFNoZWxmID0gdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnLmZpbmQoXHJcbiAgICAgICAgICAoZWxlOiBhbnkpID0+IGVsZS5zaGVsZk51bWJlciA9PSBpbmRleCArIDEsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoZmluZFNoZWxmKSB7XHJcbiAgICAgICAgICBzaGVsZiA9IHsgLi4uZmluZFNoZWxmLCAuLi5zaGVsZiB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgZGV0YWlscyA9XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YS5zaGVsZkNvbmZpZ1tcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEuc2hlbGZDb25maWcubGVuZ3RoIC0gMVxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgICAgZGV0YWlscy5zaGVsZk51bWJlciA9IGluZGV4ICsgMTtcclxuICAgICAgICAgIHNoZWxmID0geyAuLi5kZXRhaWxzLCAuLi5zaGVsZiB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2hlbGY7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhW1wic2hlbGZDb25maWdcIl0gPSBldmVudD8uc2hlbGY7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YVtcImRlc2NyaXB0aW9uXCJdID0gZXZlbnQ/LmRlc2NyaXB0aW9uID8/IFwiXCI7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YVtcInRlbXBsYXRlR3JvdXBOYW1lXCJdID1cclxuICAgICAgICBldmVudD8udGVtcGxhdGVHcm91cE5hbWUgPz8gXCJcIjtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhLmhlYWRlci5sYWJlbCA9IGV2ZW50Py5oZWFkZXJMYWJlbCA/PyBcIlwiO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEuZm9vdGVyLmxhYmVsID0gZXZlbnQ/LmZvb3RlckxhYmVsID8/IFwiXCI7XHJcbiAgICB9IGVsc2UgaWYgKGV2ZW50Py5zZWN0aW9uKSB7XHJcbiAgICAgIGV2ZW50LnNlY3Rpb24uZm9yRWFjaCgoc2VjOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgbnVtYmVyID0gc2VjPy5zaGVsdmVzPy5tYXAoKGVsZTogYW55KSA9PlxyXG4gICAgICAgICAgcGFyc2VJbnQoZWxlLnNwbGl0KFwiIFwiKVsxXSksXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGE/LnNoZWxmQ29uZmlnLmZvckVhY2goKHNoZWxmOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChudW1iZXIuaW5jbHVkZXMoc2hlbGYuc2hlbGZOdW1iZXIpKSB7XHJcbiAgICAgICAgICAgIHNoZWxmLnpvbmUgPSBzZWMuem9uZTtcclxuICAgICAgICAgICAgc2hlbGYucHJvZHVjdEJyYW5kTmFtZSA9IHNlYy5wcm9kdWN0QnJhbmROYW1lO1xyXG4gICAgICAgICAgICBzaGVsZi5wcm9kdWN0Q2F0ZWdvcnkgPSBzZWMucHJvZHVjdENhdGVnb3J5O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAoZXZlbnQ/LnZtQ29uZmlnICYmIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YT8udm1Db25maWcpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhW1widm1Db25maWdcIl0gPSBldmVudD8udm1Db25maWc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAvLyB0aGlzLmdldFZtc0xpc3QoKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZWRpdEZpeHR1cmVTZWN0aW9uID0gXCJiYXNpYy1kZXRhaWxzXCI7XHJcbiAgICAgICAgdGhpcy5lZGl0Rml4dHVyZSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmVkaXRGcm9tVGFiID09PSBcInpvbmVcIikge1xyXG4gICAgICAgICAgdGhpcy5wZXJzaXN0Wm9uZUVkaXRBY2NlcHRlZCgpO1xyXG4gICAgICAgICAgdGhpcy5lZGl0RnJvbVRhYiA9IFwiZml4dHVyZVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdldFN0b3JlRml4dHVyZXModGhpcy5wbGFub0RhdGE/Ll9pZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVBhbmVsKHNpZGU6IFwibGVmdFwiIHwgXCJyaWdodFwiLCBhY3Rpb24/OiBib29sZWFuKSB7XHJcbiAgICBpZiAoc2lkZSA9PT0gXCJsZWZ0XCIpIHtcclxuICAgICAgdGhpcy5pc0xlZnRQYW5lbENvbGxhcHNlZCA9IGFjdGlvbiA/PyAhdGhpcy5pc0xlZnRQYW5lbENvbGxhcHNlZDtcclxuICAgICAgaWYgKCF0aGlzLmlzTGVmdFBhbmVsQ29sbGFwc2VkKSB0aGlzLmlzUmlnaHRQYW5lbENvbGxhcHNlZCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlzUmlnaHRQYW5lbENvbGxhcHNlZCA9IGFjdGlvbiA/PyAhdGhpcy5pc1JpZ2h0UGFuZWxDb2xsYXBzZWQ7XHJcbiAgICAgIGlmICghdGhpcy5pc1JpZ2h0UGFuZWxDb2xsYXBzZWQpIHRoaXMuaXNMZWZ0UGFuZWxDb2xsYXBzZWQgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRml4dHVyZUZlZWRiYWNrKSB7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZUZpeHR1cmVPbkZlZWRiYWNrUGFuZWwoe30pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVzaXplQ2FudmFzKCk7XHJcbiAgICAgIHRoaXMuZml0Q2FudmFzVG9MYXlvdXRBbmltYXRlZCgpO1xyXG4gICAgfSwgNDAwKTtcclxuICB9XHJcblxyXG4gIG9uRmVlZGJhY2tUYWJDaGFuZ2UodGFiOiBcImZpeHR1cmVcIiB8IFwiem9uZVwiKSB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVGZWVkYmFja1RhYiA9PT0gdGFiKSByZXR1cm47XHJcbiAgICB0aGlzLmFjdGl2ZUZlZWRiYWNrVGFiID0gdGFiO1xyXG5cclxuICAgIC8vIFBhbmVsIG1pbi13aWR0aCBhbmltYXRlcyBvdmVyIDMwMG1zIChzZWUgW2NsYXNzXj1cImNvbFwiXSB0cmFuc2l0aW9uKS5cclxuICAgIC8vIFJlc2l6ZSBwZXIgZnJhbWUgc28gdGhlIGNhbnZhcyB0cmFja3MgdGhlIGNvbnRhaW5lciB3aWR0aCBhcyBpdCBhbmltYXRlcyxcclxuICAgIC8vIHRoZW4gZml0IHRoZSBsYXlvdXQgb25jZSB0aGUgdHJhbnNpdGlvbiBzZXR0bGVzLlxyXG4gICAgY29uc3QgZHVyYXRpb24gPSAzNTA7XHJcbiAgICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgY29uc3Qgc3RlcCA9ICgpID0+IHtcclxuICAgICAgdGhpcy5yZXNpemVDYW52YXMoKTtcclxuICAgICAgaWYgKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQgPCBkdXJhdGlvbikge1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZpdENhbnZhc1RvTGF5b3V0QW5pbWF0ZWQoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTtcclxuICB9XHJcblxyXG4gIGdldFpvbmVWZXJpZmljYXRpb25GZWVkYmFjayhwbGFub0lkOiBzdHJpbmcsIGZsb29ySWQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAgIC5nZXRab25lVmVyaWZpY2F0aW9uRmVlZGJhY2soeyBwbGFub0lkLCBmbG9vcklkIH0pXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy56b25lRmVlZGJhY2sgPSByZXM/LmRhdGEgPz8gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaXh0dXJlRmVlZGJhY2s/LmZpeHR1cmVGZWVkYmFjaz8uZml4dHVyZUlkKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rab25lRmVlZGJhY2soXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZUZlZWRiYWNrLmZpeHR1cmVGZWVkYmFjay5maXh0dXJlSWQsXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVB1Ymxpc2hpbmdTdGF0ZSgpO1xyXG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuem9uZUZlZWRiYWNrID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQdWJsaXNoaW5nU3RhdGUoKTtcclxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFpvbmVGZWVkYmFjayhmaXh0dXJlSWQ6IHN0cmluZykge1xyXG4gICAgY29uc3Qgcm93czogYW55W10gPSB0aGlzLnpvbmVGZWVkYmFjaz8uem9uZVZlcmlmaWNhdGlvbkRhdGEgPz8gW107XHJcbiAgICB0aGlzLnNlbGVjdGVkWm9uZUZlZWRiYWNrID1cclxuICAgICAgcm93cy5maW5kKChyb3c6IGFueSkgPT4gcm93Py5maXh0dXJlSWQ/LnRvU3RyaW5nPy4oKSA9PT0gZml4dHVyZUlkKSA/P1xyXG4gICAgICBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RvcmVGZWVkYmFjayhcclxuICAgIHBsYW5vSWQ6IHN0cmluZyxcclxuICAgIGZsb29ySWQ6IHN0cmluZyxcclxuICAgIGZpbHRlcjogYW55LFxyXG4gICAgY2hlY2tQdWJsaXNoU3RhdGU6IGJvb2xlYW4gPSB0cnVlLFxyXG4gICkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgbGV0IGRhdGE6IGFueSA9IHtcclxuICAgICAgICBwbGFub0lkOiBwbGFub0lkLFxyXG4gICAgICAgIGZsb29ySWQ6IGZsb29ySWQsXHJcbiAgICAgIH07XHJcbiAgICAgIGlmIChmaWx0ZXIpIHtcclxuICAgICAgICBkYXRhID0geyAuLi5kYXRhLCAuLi5maWx0ZXIgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5hcGlTZXJ2aWNlLmdldFN0b3JlRmVlZGJhY2soZGF0YSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiBhc3luYyAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3RvcmVGZWVkYmFjayA9IHJlcy5kYXRhO1xyXG4gICAgICAgICAgaWYgKHJlcy5kYXRhPy5sYXlvdXREYXRhPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzTGF5b3V0RmVlZGJhY2socmVzLmRhdGEubGF5b3V0RGF0YSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NMYXlvdXRGZWVkYmFjayhbXSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHJlcy5kYXRhPy5maXh0dXJlRGF0YT8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICByZXMuZGF0YT8uZml4dHVyZURhdGEubGVuZ3RoICYmXHJcbiAgICAgICAgICAgICAgIXJlcy5kYXRhPy5maXh0dXJlRGF0YT8uWzBdPy5maXh0dXJlSWRcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zaG93TGF5b3V0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NGaXh0dXJlRmVlZGJhY2socmVzLmRhdGEuZml4dHVyZURhdGEpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzRml4dHVyZUZlZWRiYWNrKFtdKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocmVzLmRhdGE/LlZtRGF0YT8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1ZtRmVlZGJhY2socmVzLmRhdGEuVm1EYXRhKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1ZtRmVlZGJhY2soW10pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChjaGVja1B1Ymxpc2hTdGF0ZSkge1xyXG4gICAgICAgICAgICAvLyB0aGlzLmNhbGN1bGF0ZVB1Ymxpc2hpbmdTdGF0ZSgpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaXh0dXJlRmVlZGJhY2s/LmZpeHR1cmVGZWVkYmFjaz8uZml4dHVyZUlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2VGaXh0dXJlT25GZWVkYmFja1BhbmVsKHtcclxuICAgICAgICAgICAgICBjdXJyZW50Rml4dHVyZTpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRmVlZGJhY2suZml4dHVyZUZlZWRiYWNrLmZpeHR1cmVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gZmV0Y2ggc3RvcmUgZmVlZGJhY2tcIik7XHJcbiAgICAgICAgICByZWplY3QoKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlUHVibGlzaGluZ1N0YXRlKCkge1xyXG4gICAgbGV0IGRpc2FibGVFZGl0ID0gZmFsc2U7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb25baV07XHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWxlbWVudC5maXh0dXJlcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGNvbnN0IGZpeHR1cmUgPSBlbGVtZW50LmZpeHR1cmVzW2pdO1xyXG5cclxuICAgICAgICBpZiAoZml4dHVyZS5pc3N1ZSkge1xyXG4gICAgICAgICAgZGlzYWJsZUVkaXQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZsb29yRGF0YT8uY2VudGVyRml4dHVyZSkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBmaXh0dXJlID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZVtpXTtcclxuXHJcbiAgICAgICAgaWYgKGZpeHR1cmUuaXNzdWUpIHtcclxuICAgICAgICAgIGRpc2FibGVFZGl0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGlzYWJsZUVkaXQpIHtcclxuICAgICAgdGhpcy5kaXNhYmxlRWRpdCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRpc2FibGVFZGl0ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxheW91dERhdGEgPSB0aGlzLnRhc2tJbmZvPy50YXNrRGV0YWlscz8uZmluZChcclxuICAgICAgKGVsZTogYW55KSA9PiBlbGUudHlwZSA9PSBcImxheW91dFwiLFxyXG4gICAgKTtcclxuICAgIGxldCBmaXh0dXJlRGF0YSA9IHRoaXMudGFza0luZm8/LnRhc2tEZXRhaWxzPy5maW5kKFxyXG4gICAgICAoZWxlOiBhbnkpID0+IGVsZS50eXBlID09IFwiZml4dHVyZVwiLFxyXG4gICAgKTtcclxuICAgIGxldCB2bURhdGEgPSB0aGlzLnRhc2tJbmZvPy50YXNrRGV0YWlscz8uZmluZChcclxuICAgICAgKGVsZTogYW55KSA9PiBlbGUudHlwZSA9PSBcImZpeHR1cmVcIixcclxuICAgICk7XHJcbiAgICBjb25zdCB6b25lVGFza0V4aXN0cyA9ICEhdGhpcy56b25lRmVlZGJhY2s/LnpvbmVWZXJpZmljYXRpb25UYXNrO1xyXG4gICAgY29uc3Qgem9uZUFwcHJvdmVkID1cclxuICAgICAgIXpvbmVUYXNrRXhpc3RzIHx8IHRoaXMuem9uZVRhc2tTdHlsZS5uYW1lID09IFwiQXBwcm92ZWRcIjtcclxuXHJcbiAgICBjb25zdCBhbGxOb25ab25lQXBwcm92ZWQgPVxyXG4gICAgICB0aGlzLnRhc2tTdHlsZS5sYXlvdXQubmFtZSA9PSBcIkFwcHJvdmVkXCIgJiZcclxuICAgICAgdGhpcy50YXNrU3R5bGUuZml4dHVyZS5uYW1lID09IFwiQXBwcm92ZWRcIiAmJlxyXG4gICAgICB0aGlzLnRhc2tTdHlsZS52bS5uYW1lID09IFwiQXBwcm92ZWRcIjtcclxuXHJcbiAgICBpZiAoYWxsTm9uWm9uZUFwcHJvdmVkICYmIHpvbmVBcHByb3ZlZCkge1xyXG4gICAgICB0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9IFwiY29tcGxldGVcIjtcclxuICAgIH0gZWxzZSBpZiAoYWxsTm9uWm9uZUFwcHJvdmVkICYmICF6b25lQXBwcm92ZWQpIHtcclxuICAgICAgLy8gT25seSB6b25lIHJldmlldyBpcyBibG9ja2luZyDigJQgbm8gcHVibGlzaCBhY3Rpb24gdG8gdGFrZSBoZXJlLlxyXG4gICAgICB0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9IFwiXCI7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMudGFza1N0eWxlLmZpeHR1cmUubmFtZSA9PSBcIkFwcHJvdmVkXCIpIHtcclxuICAgICAgdGhpcy5wdWJsaXNoaW5nU3RhdGUgPSBcInZtXCI7XHJcbiAgICAgIGlmIChcclxuICAgICAgICB2bURhdGEgJiZcclxuICAgICAgICAoKHZtRGF0YS5zdGF0dXMgPT0gXCJzdWJtaXRcIiAmJiB2bURhdGEuZmVlZGJhY2tTdGF0dXMgPT0gXCJkaXNhZ3JlZVwiKSB8fFxyXG4gICAgICAgICAgdm1EYXRhPy5yZWRvU3RhdHVzKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9IFwidm0tcmVkb1wiO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9IFwiZml4dHVyZVwiO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgZml4dHVyZURhdGEgJiZcclxuICAgICAgICAoKGZpeHR1cmVEYXRhLnN0YXR1cyA9PSBcInN1Ym1pdFwiICYmXHJcbiAgICAgICAgICBmaXh0dXJlRGF0YS5mZWVkYmFja1N0YXR1cyA9PSBcImRpc2FncmVlXCIpIHx8XHJcbiAgICAgICAgICBmaXh0dXJlRGF0YT8ucmVkb1N0YXR1cylcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5wdWJsaXNoaW5nU3RhdGUgPSAhdGhpcy5mbG9vckRhdGEuaXNFZGl0ZWRcclxuICAgICAgICAgID8gXCJmaXh0dXJlLXJlZG9cIlxyXG4gICAgICAgICAgOiBcImZpeHR1cmVcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFRlbXBsYXRlKGZpeHR1cmVDb25maWdJZDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgIHRoaXMuYXBpU2VydmljZS5nZXRGaXh0dXJlVGVtcGxhdGUoZml4dHVyZUNvbmZpZ0lkKSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBwcm9jZXNzTGF5b3V0RmVlZGJhY2soc3RvcmVGZWVkYmFjazogYW55W10pIHtcclxuICAgIGNvbnN0IGxheW91dEZlZWRiYWNrID0gc3RvcmVGZWVkYmFjay5maW5kKFxyXG4gICAgICAoZmVlZGJhY2spID0+IGZlZWRiYWNrLnR5cGUgPT09IFwibGF5b3V0XCIsXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHdhbGxFbGVtZW50cyA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZmlsdGVyKFxyXG4gICAgICAoZWxlbWVudDogYW55KSA9PiBlbGVtZW50LmVsZW1lbnRUeXBlID09PSBcIndhbGxcIixcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGxheW91dEZlZWRiYWNrKSB7XHJcbiAgICAgIGNvbnN0IGlzc3VlcyA9IGxheW91dEZlZWRiYWNrPy5hbnN3ZXJzPy5bMF0/Lmlzc3VlcztcclxuXHJcbiAgICAgIGlmIChpc3N1ZXMpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlzc3Vlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgaXNzdWUgPSBpc3N1ZXNbaV07XHJcblxyXG4gICAgICAgICAgaWYgKGlzc3VlLmlzc3VlVHlwZSA9PT0gXCJleHRyYUZpeHR1cmVcIikge1xyXG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlcyA9IGlzc3VlLkRldGFpbHMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgIChmaXh0dXJlOiBhbnkpID0+IGZpeHR1cmUuc3RhdHVzID09PSBcInBlbmRpbmdcIixcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZml4dHVyZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICBjb25zdCBmaXh0dXJlID0gZml4dHVyZXNbal07XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlOiBhbnkgPSBhd2FpdCB0aGlzLmdldFRlbXBsYXRlKFxyXG4gICAgICAgICAgICAgICAgZml4dHVyZS5maXh0dXJlQ29uZmlnSWQsXHJcbiAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgZml4dHVyZUlkID0gYG5ldy0ke2NyeXB0by5yYW5kb21VVUlEKCl9YDtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgZ2hvc3RGaXh0dXJlID0ge1xyXG4gICAgICAgICAgICAgICAgLi4udGVtcGxhdGU/LmRhdGEsXHJcbiAgICAgICAgICAgICAgICBmaXh0dXJlQ29uZmlnSWQ6IHRlbXBsYXRlPy5kYXRhPy5faWQsXHJcbiAgICAgICAgICAgICAgICBfaWQ6IGZpeHR1cmVJZCxcclxuICAgICAgICAgICAgICAgIHJlbGF0aXZlUG9zaXRpb246IHsgeDogMCwgeTogMCwgdW5pdDogXCJmdFwiIH0sXHJcbiAgICAgICAgICAgICAgICBzaGVsZkNvbmZpZzogZml4dHVyZS5zaGVsZkNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGdob3N0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgaXNzdWU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBpc3N1ZURhdGE6IGZpeHR1cmUsXHJcbiAgICAgICAgICAgICAgICB0YXNrVHlwZTogXCJsYXlvdXRcIixcclxuICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAvLyBjb25zdCBmaXh0dXJlR3JvdXAgPSB0aGlzLnBhdGNoRml4dHVyZSh7IGZpeHR1cmVOYW1lOiBnaG9zdEZpeHR1cmUuZml4dHVyZU5hbWUsIGZpeHR1cmVDb25maWdJZDogZ2hvc3RGaXh0dXJlLmZpeHR1cmVDb25maWdJZCwgX2lkOiBnaG9zdEZpeHR1cmUuX2lkIH0pO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudFR5cGUgPT09IFwid2FsbFwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgd2FsbEluZGV4OiBudW1iZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgYXNzb2NXYWxsTnVtID0gZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudE51bWJlcjtcclxuICAgICAgICAgICAgICAgIGlmIChhc3NvY1dhbGxOdW0gPj0gd2FsbEVsZW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICB3YWxsSW5kZXggPSB3YWxsRWxlbWVudHMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhc3NvY1dhbGxOdW0gPD0gMCkge1xyXG4gICAgICAgICAgICAgICAgICB3YWxsSW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgd2FsbEluZGV4ID0gYXNzb2NXYWxsTnVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRGaXh0dXJlczogYW55ID0gd2FsbEVsZW1lbnRzLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgIChlbGVtZW50OiBhbnkpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIgJiZcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmVsZW1lbnROdW1iZXIgPT09IHdhbGxJbmRleCxcclxuICAgICAgICAgICAgICAgICkuZml4dHVyZXM7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhc3NvY0ZpeHR1cmVOdW0gPSBmaXh0dXJlLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXNzb2NGaXh0dXJlTnVtID4gZWxlbWVudEZpeHR1cmVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAoZWxlbWVudDogYW55KSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmVsZW1lbnROdW1iZXIgPT09IHdhbGxJbmRleCxcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpeHR1cmVzLnB1c2goZ2hvc3RGaXh0dXJlKTtcclxuICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRGb3JtRml4dHVyZXMod2FsbEluZGV4ISAtIDEpLnB1c2goZml4dHVyZUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXNzb2NGaXh0dXJlTnVtIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvblxyXG4gICAgICAgICAgICAgICAgICAgIC5maW5kKFxyXG4gICAgICAgICAgICAgICAgICAgICAgKGVsZW1lbnQ6IGFueSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5lbGVtZW50TnVtYmVyID09PSB3YWxsSW5kZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIC5maXh0dXJlcy51bnNoaWZ0KGdob3N0Rml4dHVyZSk7XHJcbiAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2V0Rm9ybUZpeHR1cmVzKHdhbGxJbmRleCEgLSAxKS5pbnNlcnQoMCwgZml4dHVyZUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb25cclxuICAgICAgICAgICAgICAgICAgICAuZmluZChcclxuICAgICAgICAgICAgICAgICAgICAgIChlbGVtZW50OiBhbnkpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZWxlbWVudFR5cGUgPT09IFwid2FsbFwiICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZWxlbWVudE51bWJlciA9PT0gd2FsbEluZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAuZml4dHVyZXMuc3BsaWNlKGFzc29jRml4dHVyZU51bSAtIDEsIDAsIGdob3N0Rml4dHVyZSk7XHJcbiAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2V0Rm9ybUZpeHR1cmVzKHdhbGxJbmRleCEgLSAxKS5pbnNlcnQoYXNzb2NGaXh0dXJlTnVtIC0gMSwgZml4dHVyZUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRUeXBlID09PSBcImZsb29yXCIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFzc29jRml4dHVyZU51bSA9IGZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhc3NvY0ZpeHR1cmVOdW0gPiB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlLnB1c2goZ2hvc3RGaXh0dXJlKTtcclxuICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRGb3JtRmxvb3JGaXh0dXJlcy5wdXNoKGZpeHR1cmVHcm91cCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFzc29jRml4dHVyZU51bSA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUudW5zaGlmdChnaG9zdEZpeHR1cmUpO1xyXG4gICAgICAgICAgICAgICAgICAvLyB0aGlzLmdldEZvcm1GbG9vckZpeHR1cmVzLmluc2VydCgwLCBmaXh0dXJlR3JvdXApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZS5zcGxpY2UoXHJcbiAgICAgICAgICAgICAgICAgICAgYXNzb2NGaXh0dXJlTnVtIC0gMSxcclxuICAgICAgICAgICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGdob3N0Rml4dHVyZSxcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRGb3JtRmxvb3JGaXh0dXJlcy5pbnNlcnQoYXNzb2NGaXh0dXJlTnVtIC0gMSwgZml4dHVyZUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGlzc3VlLmlzc3VlVHlwZSA9PT0gXCJmaXh0dXJlTWlzc2luZ1wiIHx8XHJcbiAgICAgICAgICAgIGlzc3VlLmlzc3VlVHlwZSA9PT0gXCJmaXh0dXJlTWlzbWF0Y2hcIlxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmVzID0gaXNzdWUuRGV0YWlscy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgKGZpeHR1cmU6IGFueSkgPT4gZml4dHVyZS5zdGF0dXMgPT09IFwicGVuZGluZ1wiLFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBmaXh0dXJlcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZpeHR1cmUgPSBmaXh0dXJlc1tqXTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gaWYgKGZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRUeXBlID09PSAnd2FsbCcpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0YXJnZXRGaXh0dXJlSWQgPSBmaXh0dXJlLmZpeHR1cmVJZDtcclxuXHJcbiAgICAgICAgICAgICAgZm9yIChjb25zdCB3YWxsRWxlbWVudCBvZiB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgIHdhbGxFbGVtZW50LmVsZW1lbnRUeXBlICE9PSBcIndhbGxcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAhQXJyYXkuaXNBcnJheSh3YWxsRWxlbWVudC5maXh0dXJlcylcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZml4dHVyZUluZGV4ID0gd2FsbEVsZW1lbnQuZml4dHVyZXMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgICAoZjogYW55KSA9PiBmLl9pZCA9PT0gdGFyZ2V0Rml4dHVyZUlkLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZml4dHVyZUluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICB3YWxsRWxlbWVudC5maXh0dXJlc1tmaXh0dXJlSW5kZXhdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLndhbGxFbGVtZW50LmZpeHR1cmVzW2ZpeHR1cmVJbmRleF0sXHJcbiAgICAgICAgICAgICAgICAgICAgaXNzdWU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVEYXRhOiBpc3N1ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgdGFza1R5cGU6IFwibGF5b3V0XCIsXHJcbiAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgIC8vIGVsc2UgaWYgKGZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRUeXBlID09PSAnZmxvb3InKSB7XHJcbiAgICAgICAgICAgICAgLy8gY29uc3QgdGFyZ2V0Rml4dHVyZUlkID0gZml4dHVyZS5maXh0dXJlSWQ7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IGNlbnRlckZpeHR1cmVzID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgZml4dHVyZUluZGV4ID0gY2VudGVyRml4dHVyZXMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgKGY6IGFueSkgPT4gZi5faWQgPT09IHRhcmdldEZpeHR1cmVJZCxcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZml4dHVyZUluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgY2VudGVyRml4dHVyZXNbZml4dHVyZUluZGV4XSA9IHtcclxuICAgICAgICAgICAgICAgICAgLi4uY2VudGVyRml4dHVyZXNbZml4dHVyZUluZGV4XSxcclxuICAgICAgICAgICAgICAgICAgaXNzdWU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgIGlzc3VlRGF0YTogaXNzdWVzLFxyXG4gICAgICAgICAgICAgICAgICB0YXNrVHlwZTogXCJsYXlvdXRcIixcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzRml4dHVyZUZlZWRiYWNrKHN0b3JlRmVlZGJhY2s6IGFueVtdKSB7XHJcbiAgICBjb25zdCBmaXh0dXJlRmVlZGJhY2sgPSBzdG9yZUZlZWRiYWNrLmZpbHRlcihcclxuICAgICAgKGZlZWRiYWNrKSA9PiBmZWVkYmFjay50eXBlID09PSBcImZpeHR1cmVcIixcclxuICAgICk7XHJcblxyXG4gICAgbGV0IGZpbmRGaXh0dXJlVGFzayA9IHRoaXMudGFza0luZm8/LnRhc2tEZXRhaWxzPy5maW5kKFxyXG4gICAgICAodGFzazogYW55KSA9PiB0YXNrLnR5cGUgPT0gXCJmaXh0dXJlXCIsXHJcbiAgICApO1xyXG5cclxuICAgIGZvciAoY29uc3QgZmVlZGJhY2sgb2YgZml4dHVyZUZlZWRiYWNrID8/IFtdKSB7XHJcbiAgICAgIGNvbnN0IGFpRGF0YSA9IGZlZWRiYWNrPy5maXh0dXJlQUlEYXRhO1xyXG4gICAgICBpZiAoIWFpRGF0YSkgY29udGludWU7XHJcblxyXG4gICAgICBjb25zdCBmaXh0dXJlID0gdGhpcy5hbGxGaXh0dXJlSW5zdGFuY2VzLmZpbmQoXHJcbiAgICAgICAgKGY6IGFueSkgPT4gZi5faWQgPT09IGFpRGF0YS5maXh0dXJlSWQsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICghZml4dHVyZSkgY29udGludWU7XHJcblxyXG4gICAgICBmZWVkYmFjay5GaXh0dXJlRGF0YSA9IHN0cnVjdHVyZWRDbG9uZShmaXh0dXJlKTtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXR1cyA9XHJcbiAgICAgICAgKGZpbmRGaXh0dXJlVGFzaz8uc3RhdHVzID09PSBcInN1Ym1pdFwiIHx8IGZpbmRGaXh0dXJlVGFzaz8ucmVkb1N0YXR1cykgJiZcclxuICAgICAgICBmZWVkYmFjaz8uYW5zd2Vycz8uWzBdPy5zdGF0dXNcclxuICAgICAgICAgID8gZmVlZGJhY2suYW5zd2Vyc1swXS5zdGF0dXNcclxuICAgICAgICAgIDogXCJcIjtcclxuXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oZml4dHVyZSwge1xyXG4gICAgICAgIGlzc3VlOiBmYWxzZSxcclxuICAgICAgICBpc3N1ZURhdGE6IGFpRGF0YSxcclxuICAgICAgICB0YXNrVHlwZTogXCJmaXh0dXJlXCIsXHJcbiAgICAgICAgc3RhdHVzLFxyXG4gICAgICAgIGJyZWFjaDogZmluZEZpeHR1cmVUYXNrPy5icmVhY2gsXHJcbiAgICAgICAgdGFza1N0YXR1czogZmluZEZpeHR1cmVUYXNrPy5zdGF0dXMsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc1ZtRmVlZGJhY2soc3RvcmVGZWVkYmFjazogYW55W10pIHtcclxuICAgIGNvbnN0IGZpeHR1cmVGZWVkYmFjayA9IHN0b3JlRmVlZGJhY2suZmlsdGVyKFxyXG4gICAgICAoZmVlZGJhY2spID0+IGZlZWRiYWNrLnR5cGUgPT09IFwidm1cIixcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGZpeHR1cmVGZWVkYmFjay5sZW5ndGgpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXh0dXJlRmVlZGJhY2subGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBpc3N1ZXMgPSBmaXh0dXJlRmVlZGJhY2s/LltpXT8uYW5zd2Vycz8uWzBdPy5pc3N1ZXM7XHJcblxyXG4gICAgICAgIGlmIChpc3N1ZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpc3N1ZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXNzdWUgPSBpc3N1ZXNbal07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlcyA9IGlzc3VlLkRldGFpbHMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgIChmaXh0dXJlOiBhbnkpID0+IGZpeHR1cmUuc3RhdHVzID09PSBcInBlbmRpbmdcIixcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZml4dHVyZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICBjb25zdCBmaXh0dXJlID0gZml4dHVyZXNbal07XHJcblxyXG4gICAgICAgICAgICAgIC8vIGlmIChmaXh0dXJlLmFzc29jaWF0ZWRFbGVtZW50VHlwZSA9PT0gJ3dhbGwnKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0Rml4dHVyZUlkID0gZml4dHVyZS5maXh0dXJlSWQ7XHJcblxyXG4gICAgICAgICAgICAgIGZvciAoY29uc3Qgd2FsbEVsZW1lbnQgb2YgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICB3YWxsRWxlbWVudC5lbGVtZW50VHlwZSAhPT0gXCJ3YWxsXCIgfHxcclxuICAgICAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkod2FsbEVsZW1lbnQuZml4dHVyZXMpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpeHR1cmVJbmRleCA9IHdhbGxFbGVtZW50LmZpeHR1cmVzLmZpbmRJbmRleChcclxuICAgICAgICAgICAgICAgICAgKGY6IGFueSkgPT4gZi5faWQgPT09IHRhcmdldEZpeHR1cmVJZCxcclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZpeHR1cmVJbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgd2FsbEVsZW1lbnQuZml4dHVyZXNbZml4dHVyZUluZGV4XSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAuLi53YWxsRWxlbWVudC5maXh0dXJlc1tmaXh0dXJlSW5kZXhdLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzc3VlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzc3VlRGF0YTogaXNzdWVzLFxyXG4gICAgICAgICAgICAgICAgICAgIHRhc2tUeXBlOiBcInZtXCIsXHJcbiAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgIC8vIGVsc2UgaWYgKGZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRUeXBlID09PSAnZmxvb3InKSB7XHJcbiAgICAgICAgICAgICAgLy8gY29uc3QgdGFyZ2V0Rml4dHVyZUlkID0gZml4dHVyZS5maXh0dXJlSWQ7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IGNlbnRlckZpeHR1cmVzID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgZml4dHVyZUluZGV4ID0gY2VudGVyRml4dHVyZXMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgKGY6IGFueSkgPT4gZi5faWQgPT09IHRhcmdldEZpeHR1cmVJZCxcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZml4dHVyZUluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgY2VudGVyRml4dHVyZXNbZml4dHVyZUluZGV4XSA9IHtcclxuICAgICAgICAgICAgICAgICAgLi4uY2VudGVyRml4dHVyZXNbZml4dHVyZUluZGV4XSxcclxuICAgICAgICAgICAgICAgICAgaXNzdWU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgIGlzc3VlRGF0YTogaXNzdWVzLFxyXG4gICAgICAgICAgICAgICAgICB0YXNrVHlwZTogXCJ2bVwiLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRyYW5zZmVyQXJyYXlJdGVtPFQgPSBhbnk+KFxyXG4gICAgY3VycmVudEFycmF5OiBUW10sXHJcbiAgICB0YXJnZXRBcnJheTogVFtdLFxyXG4gICAgY3VycmVudEluZGV4OiBudW1iZXIsXHJcbiAgICB0YXJnZXRJbmRleDogbnVtYmVyLFxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgZnJvbSA9IE1hdGgubWF4KDAsIE1hdGgubWluKGN1cnJlbnRBcnJheS5sZW5ndGggLSAxLCBjdXJyZW50SW5kZXgpKTtcclxuICAgIGNvbnN0IHRvID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGFyZ2V0QXJyYXkubGVuZ3RoLCB0YXJnZXRJbmRleCkpO1xyXG5cclxuICAgIGlmIChjdXJyZW50QXJyYXkubGVuZ3RoKSB7XHJcbiAgICAgIHRhcmdldEFycmF5LnNwbGljZSh0bywgMCwgY3VycmVudEFycmF5LnNwbGljZShmcm9tLCAxKVswXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW9yZGVyRml4dHVyZShmbG9vckRhdGE6IGFueSkge1xyXG4gICAgLy8gV2FsbHNcclxuICAgIGZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZWxlbWVudC5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICBsZXQgd2FsbEFzc29jaWF0ZWRJbmRleCA9IDE7XHJcblxyXG4gICAgICAgIGVsZW1lbnQuZml4dHVyZXMuZm9yRWFjaCgoZml4dHVyZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBmaXh0dXJlLmFzc29jaWF0ZWRFbGVtZW50VHlwZSA9IFwid2FsbFwiO1xyXG4gICAgICAgICAgZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudE51bWJlciA9IGVsZW1lbnQuZWxlbWVudE51bWJlcjtcclxuICAgICAgICAgIGZpeHR1cmUuZml4dHVyZVR5cGUgPSBcIndhbGxcIjtcclxuXHJcbiAgICAgICAgICBpZiAoIWZpeHR1cmUuZ2hvc3QpIHtcclxuICAgICAgICAgICAgLy8gZml4dHVyZS5maXh0dXJlTnVtYmVyID0gZml4dHVyZU51bWJlcisrO1xyXG4gICAgICAgICAgICBmaXh0dXJlLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlciA9IHdhbGxBc3NvY2lhdGVkSW5kZXgrKztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZpeHR1cmUuZml4dHVyZU51bWJlciA9IG51bGw7XHJcbiAgICAgICAgICAgIGZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gQ2VudGVyIGZsb29yIGZpeHR1cmVzXHJcbiAgICBsZXQgZmxvb3JBc3NvY2lhdGVkSW5kZXggPSAxO1xyXG4gICAgZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUuZm9yRWFjaCgoZml4dHVyZTogYW55KSA9PiB7XHJcbiAgICAgIGZpeHR1cmUuZml4dHVyZVR5cGUgPSBcImZsb29yXCI7XHJcblxyXG4gICAgICBpZiAoIWZpeHR1cmUuZ2hvc3QpIHtcclxuICAgICAgICAvLyBmaXh0dXJlLmZpeHR1cmVOdW1iZXIgPSBmaXh0dXJlTnVtYmVyKys7XHJcbiAgICAgICAgZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIgPSBmbG9vckFzc29jaWF0ZWRJbmRleCsrO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpeHR1cmUuZml4dHVyZU51bWJlciA9IG51bGw7XHJcbiAgICAgICAgZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEVsZW1lbnRWYWx1ZShncm91cDogYW55KSB7XHJcbiAgICByZXR1cm4gZ3JvdXAuZ2V0KFwiZWxlbWVudE51bWJlclwiKT8udmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFdhbGxCeU51bWJlcihlbGVtZW50TnVtYmVyOiBudW1iZXIpOiBhbnkgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuZmxvb3JEYXRhPy5sYXlvdXRQb2x5Z29uPy5maW5kKFxyXG4gICAgICAodzogYW55KSA9PiB3LmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiB3LmVsZW1lbnROdW1iZXIgPT09IGVsZW1lbnROdW1iZXIsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcm91bmRUb1R3byhudW06IG51bWJlcikge1xyXG4gICAgcmV0dXJuIE1hdGgucm91bmQobnVtICogMTAwKSAvIDEwMDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFN0b3JlRml4dHVyZXMoc3RvcmVJZDogc3RyaW5nLCBlbmFibGU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodCgpO1xyXG4gICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy5maXh0dXJlVGVtcGxhdGVzLmxlbmd0aCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmdldEZpeHR1cmVUZW1wbGF0ZXMoKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlID0gbnVsbDtcclxuICAgIHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAuZ2V0U3RvcmVGaXh0dXJlcyh7IGlkOiBbc3RvcmVJZF0sIHRyZWVWaWV3OiB0cnVlIH0pXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXJlcz8uZGF0YT8uWzBdPy5mbG9vcnM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5wbGFub0RhdGEgPSBzdHJ1Y3R1cmVkQ2xvbmUocmVzLmRhdGFbMF0pO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZmxvb3JEYXRhPy5faWQpIHtcclxuICAgICAgICAgICAgdGhpcy5mbG9vckRhdGEgPSBzdHJ1Y3R1cmVkQ2xvbmUoXHJcbiAgICAgICAgICAgICAgcmVzLmRhdGFbMF0uZmxvb3JzLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAoZmxvb3I6IGFueSkgPT4gZmxvb3I/Ll9pZCA9PT0gdGhpcy5mbG9vckRhdGE/Ll9pZCxcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mbG9vckRhdGEgPSBzdHJ1Y3R1cmVkQ2xvbmUocmVzLmRhdGFbMF0uZmxvb3JzWzBdKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoW1wiZHJhZnRcIiwgXCJhbGxvY2F0aW9uUGVuZGluZ1wiXS5pbmNsdWRlcyh0aGlzLmZsb29yRGF0YS5zdGF0dXMpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoXHJcbiAgICAgICAgICAgICAgYG1hbmFnZS9wbGFub2dyYW0vb25ib2FyZC1wbGFub2dyYW0/cGxhbm9JZD0ke3RoaXMuZmxvb3JEYXRhLnBsYW5vSWR9JmZsb29ySWQ9JHt0aGlzLmZsb29yRGF0YS5faWR9YCxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmZsb29yc0xpc3QgPSB0aGlzLnBsYW5vRGF0YS5mbG9vcnMubWFwKChmOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICAgIGxhYmVsOiBmLmZsb29yTnVtLFxyXG4gICAgICAgICAgICB2YWx1ZTogZi5faWQsXHJcbiAgICAgICAgICAgIC8vIGRpc2FibGVkOiBmLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIixcclxuICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmV4dHJhY3RBbGxGaXh0dXJlcyh0aGlzLmZsb29yRGF0YSk7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmxvb3JJZC5zZXRWYWx1ZSh0aGlzLmZsb29yRGF0YS5faWQsIHtcclxuICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuc3RvcmVNZXRyaWNzLmZsb29yQ291bnQgPSB0aGlzLnBsYW5vRGF0YT8uZmxvb3JzPy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgdGhpcy5kaXNhYmxlRWRpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICAgIHRoaXMudGFza0RldGFpbHModGhpcy5mbG9vckRhdGEucGxhbm9JZCwgdGhpcy5mbG9vckRhdGEuX2lkKSxcclxuICAgICAgICAgICAgICB0aGlzLmdldFN0b3JlRmVlZGJhY2soXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICB0aGlzLmdldFpvbmVWZXJpZmljYXRpb25GZWVkYmFjayhcclxuICAgICAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICB9IGNhdGNoIHt9XHJcblxyXG4gICAgICAgICAgdGhpcy5yZW5kZXJGbG9vcigpO1xyXG5cclxuICAgICAgICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKGVuYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gZmV0Y2ggcGxhbm9cIik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBleHRyYWN0QWxsRml4dHVyZXMoZmxvb3JEYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGV4dHJhY3RlZEZpeHR1cmUgPSBbXHJcbiAgICAgIC4uLihmbG9vckRhdGE/Lm1hc3RlclRlbXBsYXRlcyA/PyBbXSksXHJcbiAgICAgIC4uLihmbG9vckRhdGE/LmNlbnRlckZpeHR1cmUgPz8gW10pLFxyXG4gICAgXTtcclxuXHJcbiAgICBmbG9vckRhdGE/LmxheW91dFBvbHlnb24/LmZvckVhY2goKGxwOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy53YWxsQ291bnQgKz0gbHAuZml4dHVyZXMubGVuZ3RoO1xyXG4gICAgICB0aGlzLmNsQ291bnQgKz0gbHAuZml4dHVyZXMuZmlsdGVyKFxyXG4gICAgICAgIChlbGU6IGFueSkgPT4gZWxlLmhlYWRlci5sYWJlbCA9PSBcIkNMXCIsXHJcbiAgICAgICk/Lmxlbmd0aDtcclxuICAgICAgZXh0cmFjdGVkRml4dHVyZS5wdXNoKC4uLihscC5maXh0dXJlcyA/PyBbXSkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hbGxGaXh0dXJlcyA9IGV4dHJhY3RlZEZpeHR1cmU7XHJcblxyXG4gICAgdGhpcy5hbGxGaXh0dXJlSW5zdGFuY2VzID0gW1xyXG4gICAgICAuLi50aGlzLmZsb29yRGF0YSEubGF5b3V0UG9seWdvbi5mbGF0TWFwKChlOiBhbnkpID0+IGU/LmZpeHR1cmVzID8/IFtdKSxcclxuICAgICAgLi4uKHRoaXMuZmxvb3JEYXRhPy5jZW50ZXJGaXh0dXJlID8/IFtdKSxcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBhc3luYyByZW5kZXJGbG9vcih1cGRhdGU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICB0aGlzLnN0b3JlTWV0cmljcy5maXh0dXJlQ291bnQgPSB0aGlzLmZsb29yRGF0YS5maXh0dXJlQ291bnQ7XHJcbiAgICB0aGlzLnN0b3JlTWV0cmljcy52bUNvdW50ID0gdGhpcy5mbG9vckRhdGEudm1Db3VudDtcclxuICAgIHRoaXMuZHJhd0luaXRpYWxDb250ZW50KCk7XHJcbiAgICBpZiAodXBkYXRlKSB7XHJcbiAgICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG5cclxuICAgICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5mb3JFYWNoKCh3YWxsOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAod2FsbC5lbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICAgIGNvbnN0IHdhbGxJdGVtID0gdGhpcy5wYXRjaFdhbGxFbGVtZW50cyh7XHJcbiAgICAgICAgICAgIGVsZW1lbnRUeXBlOiB3YWxsLmVsZW1lbnRUeXBlLFxyXG4gICAgICAgICAgICBlbGVtZW50TnVtYmVyOiB3YWxsLmVsZW1lbnROdW1iZXIsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB3YWxsLmZpeHR1cmVzLmZvckVhY2goKGZpeHR1cmU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZml4dHVyZT8uZml4dHVyZU5hbWUgPT09IFwic3BhY2VcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlR3JvdXAgPSB0aGlzLnBhdGNoRml4dHVyZSh7XHJcbiAgICAgICAgICAgICAgZml4dHVyZU5hbWU6IGZpeHR1cmUuZml4dHVyZU5hbWUsXHJcbiAgICAgICAgICAgICAgZml4dHVyZUNvbmZpZ0lkOiBmaXh0dXJlLmZpeHR1cmVDb25maWdJZCxcclxuICAgICAgICAgICAgICBfaWQ6IGZpeHR1cmUuX2lkLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgKHdhbGxJdGVtLmdldChcImZpeHR1cmVzXCIpIGFzIEZvcm1BcnJheSkucHVzaChmaXh0dXJlR3JvdXApO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgd2FsbC5vdGhlckVsZW1lbnRzPy5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICAgIHR5cGU6IFtcclxuICAgICAgICAgICAgICAgIHRoaXMub3RoZXJFbGVtZW50TGlzdC5zb21lKChvKSA9PiBvLnZhbHVlID09PSBlbGUuZml4dHVyZU5hbWUpXHJcbiAgICAgICAgICAgICAgICAgID8gZWxlLmZpeHR1cmVOYW1lXHJcbiAgICAgICAgICAgICAgICAgIDogXCJPdGhlcnNcIixcclxuICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgIGN1c3RvbU5hbWU6IFtcclxuICAgICAgICAgICAgICAgIHRoaXMub3RoZXJFbGVtZW50TGlzdC5zb21lKChvKSA9PiBvLnZhbHVlID09PSBlbGUuZml4dHVyZU5hbWUpXHJcbiAgICAgICAgICAgICAgICAgID8gXCJcIlxyXG4gICAgICAgICAgICAgICAgICA6IGVsZS5maXh0dXJlTmFtZSxcclxuICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgKHdhbGxJdGVtLmdldChcIm90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5KS5wdXNoKGVsZUdyb3VwKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuZ2V0Rm9ybVdhbGxzLnB1c2god2FsbEl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5mbG9vckRhdGE/LmNlbnRlckZpeHR1cmU/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuZmxvb3JEYXRhPy5jZW50ZXJGaXh0dXJlLmZvckVhY2goKGZpeHR1cmU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZml4dHVyZUdyb3VwID0gdGhpcy5wYXRjaEZpeHR1cmUoe1xyXG4gICAgICAgICAgICBmaXh0dXJlTmFtZTogZml4dHVyZS5maXh0dXJlTmFtZSxcclxuICAgICAgICAgICAgZml4dHVyZUNvbmZpZ0lkOiBmaXh0dXJlLmZpeHR1cmVDb25maWdJZCxcclxuICAgICAgICAgICAgX2lkOiBmaXh0dXJlLl9pZCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vckZpeHR1cmVzXCIpIGFzIEZvcm1BcnJheSkucHVzaChcclxuICAgICAgICAgICAgZml4dHVyZUdyb3VwLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuZmxvb3JEYXRhPy5vdGhlckVsZW1lbnRzPy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmZsb29yRGF0YT8ub3RoZXJFbGVtZW50cz8uZm9yRWFjaCgoZWxlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGVsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIHR5cGU6IFtcclxuICAgICAgICAgICAgICB0aGlzLm90aGVyRWxlbWVudExpc3Quc29tZSgobykgPT4gby52YWx1ZSA9PT0gZWxlLmZpeHR1cmVOYW1lKVxyXG4gICAgICAgICAgICAgICAgPyBlbGUuZml4dHVyZU5hbWVcclxuICAgICAgICAgICAgICAgIDogXCJPdGhlcnNcIixcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgY3VzdG9tTmFtZTogW1xyXG4gICAgICAgICAgICAgIHRoaXMub3RoZXJFbGVtZW50TGlzdC5zb21lKChvKSA9PiBvLnZhbHVlID09PSBlbGUuZml4dHVyZU5hbWUpXHJcbiAgICAgICAgICAgICAgICA/IFwiXCJcclxuICAgICAgICAgICAgICAgIDogZWxlLmZpeHR1cmVOYW1lLFxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vck90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5KS5wdXNoKFxyXG4gICAgICAgICAgICBlbGVHcm91cCxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN1YnNjcmliZVRvRml4dHVyZUNvbmZpZ0lkQ2hhbmdlcygpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVUb090aGVyRWxlbWVudHNDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBkcmF3SW5pdGlhbENvbnRlbnQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmNhbnZhcy5jbGVhcigpO1xyXG4gICAgdGhpcy5yZW9yZGVyRml4dHVyZSh0aGlzLmZsb29yRGF0YSk7XHJcbiAgICBhd2FpdCB0aGlzLmRyYXdMYXlvdXRFbGVtZW50cygpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlc2l6ZUNhbnZhcygpO1xyXG4gICAgICB0aGlzLmZpdENhbnZhc1RvTGF5b3V0QW5pbWF0ZWQoKTtcclxuICAgIH0sIDMwMCk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVBbGxQb3NpdGlvbnMoKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRmVlZGJhY2s/LmZpeHR1cmVGZWVkYmFjaz8uZml4dHVyZUlkICYmXHJcbiAgICAgICF0aGlzLmlzUmlnaHRQYW5lbENvbGxhcHNlZCAmJlxyXG4gICAgICB0aGlzLmFjdGl2ZUhpZ2hsaWdodFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuY2FudmFzLmFkZCh0aGlzLmFjdGl2ZUhpZ2hsaWdodCk7XHJcbiAgICAgIHRoaXMua2VlcEhpZ2hsaWdodE9uVG9wKCk7XHJcbiAgICB9XHJcbiAgICAvLyB0aGlzLmRyYXdCZygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGdWxsTGF5b3V0Qm91bmRzKCkge1xyXG4gICAgY29uc3Qgb2JqZWN0cyA9IHRoaXMuY2FudmFzLmdldE9iamVjdHMoKTtcclxuICAgIGlmICghb2JqZWN0cy5sZW5ndGgpIHJldHVybiB7IGxlZnQ6IDAsIHRvcDogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xyXG5cclxuICAgIGxldCBtaW5YID0gSW5maW5pdHksXHJcbiAgICAgIG1pblkgPSBJbmZpbml0eSxcclxuICAgICAgbWF4WCA9IC1JbmZpbml0eSxcclxuICAgICAgbWF4WSA9IC1JbmZpbml0eTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IG9iaiBvZiBvYmplY3RzKSB7XHJcbiAgICAgIGNvbnN0IHJlY3QgPSBvYmouZ2V0Qm91bmRpbmdSZWN0KCk7XHJcbiAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCByZWN0LmxlZnQpO1xyXG4gICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgcmVjdC50b3ApO1xyXG4gICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCk7XHJcbiAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCByZWN0LnRvcCArIHJlY3QuaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsZWZ0OiBtaW5YLFxyXG4gICAgICB0b3A6IG1pblksXHJcbiAgICAgIHdpZHRoOiBtYXhYIC0gbWluWCxcclxuICAgICAgaGVpZ2h0OiBtYXhZIC0gbWluWSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpdENhbnZhc1RvTGF5b3V0QW5pbWF0ZWQoZHVyYXRpb24gPSA0MDApIHtcclxuICAgIGlmICghdGhpcy5jYW52YXMpIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5sYXlvdXRGb3JtLmVuYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmdldEZ1bGxMYXlvdXRCb3VuZHMoKTtcclxuICAgIGlmICghYm91bmRzLndpZHRoIHx8ICFib3VuZHMuaGVpZ2h0KSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgY2FudmFzVyA9IHRoaXMuY2FudmFzLmdldFdpZHRoKCk7XHJcbiAgICBjb25zdCBjYW52YXNIID0gdGhpcy5jYW52YXMuZ2V0SGVpZ2h0KCk7XHJcblxyXG4gICAgLy8gRmluYWwgem9vbSB0byBmaXQgKHdpdGggcGFkZGluZylcclxuICAgIGNvbnN0IHNjYWxlWCA9IGNhbnZhc1cgLyBib3VuZHMud2lkdGg7XHJcbiAgICBjb25zdCBzY2FsZVkgPSBjYW52YXNIIC8gYm91bmRzLmhlaWdodDtcclxuICAgIGNvbnN0IHRhcmdldFpvb20gPSBNYXRoLm1pbihzY2FsZVgsIHNjYWxlWSkgKiAwLjk7IC8vIHBhZGRpbmcgMTAlXHJcblxyXG4gICAgLy8gRGVzaXJlZCB2aWV3cG9ydCBvZmZzZXQgdG8gY2VudGVyIGxheW91dFxyXG4gICAgY29uc3QgdGFyZ2V0VnB0ID0gW1xyXG4gICAgICAuLi4odGhpcy5jYW52YXMudmlld3BvcnRUcmFuc2Zvcm0gfHwgWzEsIDAsIDAsIDEsIDAsIDBdKSxcclxuICAgIF0gYXMgZmFicmljLlRNYXQyRDtcclxuXHJcbiAgICB0YXJnZXRWcHRbMF0gPSB0YXJnZXRab29tOyAvLyBzY2FsZVhcclxuICAgIHRhcmdldFZwdFszXSA9IHRhcmdldFpvb207IC8vIHNjYWxlWVxyXG5cclxuICAgIHRhcmdldFZwdFs0XSA9IGNhbnZhc1cgLyAyIC0gKGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC8gMikgKiB0YXJnZXRab29tOyAvLyBjZW50ZXIgWFxyXG4gICAgdGFyZ2V0VnB0WzVdID0gY2FudmFzSCAvIDIgLSAoYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgLyAyKSAqIHRhcmdldFpvb207IC8vIGNlbnRlciBZXHJcblxyXG4gICAgLy8gQ3VycmVudCB2aWV3cG9ydCAoc3RhcnRpbmcgcG9pbnQgb2YgYW5pbWF0aW9uKVxyXG4gICAgY29uc3Qgc3RhcnRWcHQgPSBbLi4udGhpcy5jYW52YXMudmlld3BvcnRUcmFuc2Zvcm0hXSBhcyBmYWJyaWMuVE1hdDJEO1xyXG5cclxuICAgIGZhYnJpYy51dGlsLmFuaW1hdGUoe1xyXG4gICAgICBzdGFydFZhbHVlOiAwLFxyXG4gICAgICBlbmRWYWx1ZTogMSxcclxuICAgICAgZHVyYXRpb24sXHJcbiAgICAgIGVhc2luZzogZmFicmljLnV0aWwuZWFzZS5lYXNlT3V0Q3ViaWMsXHJcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZwdCA9IHRoaXMuY2FudmFzLnZpZXdwb3J0VHJhbnNmb3JtITtcclxuXHJcbiAgICAgICAgLy8gSW50ZXJwb2xhdGUgbWF0cml4IHZhbHVlc1xyXG4gICAgICAgIHZwdFswXSA9IHN0YXJ0VnB0WzBdICsgKHRhcmdldFZwdFswXSAtIHN0YXJ0VnB0WzBdKSAqIHZhbHVlO1xyXG4gICAgICAgIHZwdFszXSA9IHN0YXJ0VnB0WzNdICsgKHRhcmdldFZwdFszXSAtIHN0YXJ0VnB0WzNdKSAqIHZhbHVlO1xyXG4gICAgICAgIHZwdFs0XSA9IHN0YXJ0VnB0WzRdICsgKHRhcmdldFZwdFs0XSAtIHN0YXJ0VnB0WzRdKSAqIHZhbHVlO1xyXG4gICAgICAgIHZwdFs1XSA9IHN0YXJ0VnB0WzVdICsgKHRhcmdldFZwdFs1XSAtIHN0YXJ0VnB0WzVdKSAqIHZhbHVlO1xyXG5cclxuICAgICAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRyYXdMYXlvdXRFbGVtZW50cygpIHtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbltpbmRleF07XHJcblxyXG4gICAgICBlbGVtZW50LnJlbGF0aXZlUG9zaXRpb24gPz89IHtcclxuICAgICAgICB4OiAwLFxyXG4gICAgICAgIHk6IDAsXHJcbiAgICAgICAgdW5pdDogXCJmdFwiLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgeCA9IHRoaXMudG9QaXhlbHMoZWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLngsIGVsZW1lbnQudW5pdCk7XHJcbiAgICAgIGNvbnN0IHkgPSB0aGlzLnRvUGl4ZWxzKGVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi55LCBlbGVtZW50LnVuaXQpO1xyXG5cclxuICAgICAgaWYgKGVsZW1lbnQuZWxlbWVudFR5cGUgPT09IFwid2FsbFwiKSB7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy53YWxsVGhpY2tuZXNzO1xyXG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMudG9QaXhlbHMoZWxlbWVudC5kaXN0YW5jZSwgZWxlbWVudC51bml0KTtcclxuICAgICAgICBpZiAod2lkdGggPCBoZWlnaHQpIHdpZHRoID0gdGhpcy53YWxsVGhpY2tuZXNzICsgMTtcclxuICAgICAgICBhd2FpdCB0aGlzLmRyYXdXYWxsKHRoaXMuY2FudmFzLCB4LCB5LCBoZWlnaHQsIHdpZHRoLCBlbGVtZW50KTtcclxuICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmVsZW1lbnRUeXBlID09PSBcImVudHJhbmNlXCIpIHtcclxuICAgICAgICBjb25zdCBhcnJvd1dpZHRoID0gODA7XHJcbiAgICAgICAgY29uc3QgYXJyb3dIZWlnaHQgPSA3NTtcclxuICAgICAgICBjb25zdCBhcnJvd0Jhc2UgPSA0MDtcclxuICAgICAgICB0aGlzLmRyYXdFbnRyYW5jZShcclxuICAgICAgICAgIHRoaXMuY2FudmFzLFxyXG4gICAgICAgICAgeCxcclxuICAgICAgICAgIHksXHJcbiAgICAgICAgICBhcnJvd1dpZHRoLFxyXG4gICAgICAgICAgYXJyb3dIZWlnaHQsXHJcbiAgICAgICAgICBhcnJvd0Jhc2UsXHJcbiAgICAgICAgICBlbGVtZW50LFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3IgY2FkIGxheW91dHMgb25seS5cclxuICAgIHRoaXMubGF5b3V0Qm91bmRzID0gdGhpcy5nZXRGdWxsTGF5b3V0Qm91bmRzKCk7XHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24ubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uW2luZGV4XTtcclxuICAgICAgaWYgKGVsZW1lbnQuZWxlbWVudFR5cGUgIT09IFwid2FsbFwiKSBjb250aW51ZTtcclxuXHJcbiAgICAgIGNvbnN0IGZpeHR1cmVHcm91cHM6IGZhYnJpYy5Hcm91cFtdID0gW107XHJcblxyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGVsZW1lbnQ/LmZpeHR1cmVzPy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGNvbnN0IGZpeHR1cmUgPSBlbGVtZW50LmZpeHR1cmVzW2pdO1xyXG5cclxuICAgICAgICBjb25zdCBmaXh0dXJlSGVpZ2h0ID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgIGZpeHR1cmUuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSxcclxuICAgICAgICAgIGZpeHR1cmUuZml4dHVyZVN0YXRpY0xlbmd0aC51bml0LFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgZml4dHVyZVdpZHRoID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgIGZpeHR1cmUuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlLFxyXG4gICAgICAgICAgZml4dHVyZS5maXh0dXJlU3RhdGljV2lkdGgudW5pdCxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgeCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgICBmaXh0dXJlLnJlbGF0aXZlUG9zaXRpb24ueCxcclxuICAgICAgICAgIGZpeHR1cmUucmVsYXRpdmVQb3NpdGlvbi51bml0LFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IHkgPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLnksXHJcbiAgICAgICAgICBmaXh0dXJlLnJlbGF0aXZlUG9zaXRpb24udW5pdCxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyBvdmVycmlkZSB0aGUgZml4dHVyZSBwb3NpdGlvbiBmb3IgaW5pdGlhbCBjYWQgbGF5b3V0cy5cclxuICAgICAgICBpZiAodGhpcy5mbG9vckRhdGE/LmNhZExheW91dCkge1xyXG4gICAgICAgICAgY29uc3QgYmFzZVggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgICBlbGVtZW50LnJlbGF0aXZlUG9zaXRpb24ueCxcclxuICAgICAgICAgICAgZWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLnVuaXQsXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGJhc2VZID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgICAgZWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLnksXHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi51bml0LFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNvbnN0IHN0YXJ0QnVmZmVyID0gNDA7XHJcbiAgICAgICAgICBjb25zdCBzcGFjaW5nID0gMTM2O1xyXG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gc3RhcnRCdWZmZXIgKyBzcGFjaW5nICogajtcclxuXHJcbiAgICAgICAgICBjb25zdCBhbmdsZVJhZCA9IGZhYnJpYy51dGlsLmRlZ3JlZXNUb1JhZGlhbnMoZWxlbWVudC5hbmdsZSk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZGlyWCA9IE1hdGguY29zKGFuZ2xlUmFkKTtcclxuICAgICAgICAgIGNvbnN0IGRpclkgPSBNYXRoLnNpbihhbmdsZVJhZCk7XHJcblxyXG4gICAgICAgICAgY29uc3Qgbm9ybWFsT2Zmc2V0ID0gdGhpcy53YWxsVGhpY2tuZXNzO1xyXG5cclxuICAgICAgICAgIGNvbnN0IG5vcm1YID0gTWF0aC5jb3MoYW5nbGVSYWQgKyBNYXRoLlBJIC8gMikgKiBub3JtYWxPZmZzZXQ7XHJcbiAgICAgICAgICBjb25zdCBub3JtWSA9IE1hdGguc2luKGFuZ2xlUmFkICsgTWF0aC5QSSAvIDIpICogbm9ybWFsT2Zmc2V0O1xyXG5cclxuICAgICAgICAgIHggPSBiYXNlWCArIGRpclggKiBvZmZzZXQgKyBub3JtWDtcclxuICAgICAgICAgIHkgPSBiYXNlWSArIGRpclkgKiBvZmZzZXQgKyBub3JtWTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZpeHR1cmVPYmogPSBhd2FpdCB0aGlzLmRyYXdGaXh0dXJlKFxyXG4gICAgICAgICAgdGhpcy5jYW52YXMsXHJcbiAgICAgICAgICB4LFxyXG4gICAgICAgICAgeSxcclxuICAgICAgICAgIGZpeHR1cmVIZWlnaHQsXHJcbiAgICAgICAgICBmaXh0dXJlV2lkdGgsXHJcbiAgICAgICAgICBmaXh0dXJlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZml4dHVyZUdyb3Vwcy5wdXNoKGZpeHR1cmVPYmogYXMgZmFicmljLkdyb3VwKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50Py5vdGhlckVsZW1lbnRzPy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGNvbnN0IG90aGVyRWxlbWVudCA9IGVsZW1lbnQub3RoZXJFbGVtZW50c1tqXTtcclxuICAgICAgICBjb25zdCB4ID0gdGhpcy50b1BpeGVscyhvdGhlckVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi54LCBcImZ0XCIpO1xyXG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLnRvUGl4ZWxzKG90aGVyRWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLnksIFwiZnRcIik7XHJcbiAgICAgICAgY29uc3QgYSA9IG90aGVyRWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlO1xyXG4gICAgICAgIGNvbnN0IGggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNMZW5ndGgudmFsdWUsXHJcbiAgICAgICAgICBvdGhlckVsZW1lbnQuZml4dHVyZVN0YXRpY0xlbmd0aC51bml0LFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgdyA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgICBvdGhlckVsZW1lbnQuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlLFxyXG4gICAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNXaWR0aC51bml0LFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuZHJhd090aGVyRWxlbWVudHNXaXRoTGFiZWwoXHJcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcclxuICAgICAgICAgIHgsXHJcbiAgICAgICAgICB5LFxyXG4gICAgICAgICAgYSxcclxuICAgICAgICAgIHcsXHJcbiAgICAgICAgICBoLFxyXG4gICAgICAgICAgb3RoZXJFbGVtZW50LFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5mbG9vckRhdGE/LmNhZExheW91dCAmJiB0aGlzLmZsb29yRGF0YT8uY2VudGVyRml4dHVyZT8ubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGZpeHR1cmVzID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZTtcclxuXHJcbiAgICAgIC8vIExheW91dCBwb2x5Z29uICh5b3VyIGV4aXN0aW5nIG1ldGhvZClcclxuICAgICAgY29uc3QgbGF5b3V0UG9seWdvbiA9IHRoaXMuYnVpbGRMYXlvdXRQb2x5Z29uRnJvbVdhbGxzKCk7XHJcblxyXG4gICAgICAvLyBPY2N1cGllZCBhcmVhcyAoQUxMIG9iamVjdHMpXHJcbiAgICAgIGNvbnN0IG9jY3VwaWVkUmVjdHMgPSB0aGlzLmdldE9jY3VwaWVkUmVjdHMoKTtcclxuXHJcbiAgICAgIC8vIEZpeHR1cmUgc2l6ZVxyXG4gICAgICBjb25zdCBmaXh0dXJlV2lkdGhQeCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgZml4dHVyZXNbMF0uZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlLFxyXG4gICAgICAgIGZpeHR1cmVzWzBdLmZpeHR1cmVTdGF0aWNXaWR0aC51bml0LFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgZml4dHVyZUhlaWdodFB4ID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICBmaXh0dXJlc1swXS5maXh0dXJlU3RhdGljTGVuZ3RoLnZhbHVlLFxyXG4gICAgICAgIGZpeHR1cmVzWzBdLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIEdyaWQgc2hhcGUgKHdpZGUgYmlhcyBpZiB5b3Ugd2FudClcclxuICAgICAgY29uc3QgdG90YWwgPSBmaXh0dXJlcy5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IG1heFJvd3MgPSAyOyAvLyB5b3UgY2FuIHR3ZWFrXHJcbiAgICAgIGNvbnN0IHJvd3MgPSBNYXRoLm1pbihtYXhSb3dzLCB0b3RhbCk7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBNYXRoLmNlaWwodG90YWwgLyByb3dzKTtcclxuXHJcbiAgICAgIGNvbnN0IGdyaWRXaWR0aCA9IGNvbHVtbnMgKiBmaXh0dXJlV2lkdGhQeDtcclxuICAgICAgY29uc3QgZ3JpZEhlaWdodCA9IHJvd3MgKiBmaXh0dXJlSGVpZ2h0UHg7XHJcblxyXG4gICAgICAvLyBMYXlvdXQgYm91bmRzXHJcbiAgICAgIGNvbnN0IGJvdW5kcyA9IHRoaXMuZ2V0RnVsbExheW91dEJvdW5kcygpO1xyXG4gICAgICBjb25zdCBjZW50ZXJYID0gYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLyAyO1xyXG4gICAgICBjb25zdCBjZW50ZXJZID0gYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgLyAyO1xyXG5cclxuICAgICAgLy8gQ2hlY2sgaWYgZ3JpZCBmaXRzXHJcbiAgICAgIGNvbnN0IGdyaWRGaXRzID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZ3JpZFJlY3QgPSB7IHgsIHksIHc6IGdyaWRXaWR0aCwgaDogZ3JpZEhlaWdodCB9O1xyXG5cclxuICAgICAgICAvLyBJbnNpZGUgcG9seWdvblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICF0aGlzLmlzUG9pbnRJbnNpZGVQb2x5Z29uKHsgeCwgeSB9LCBsYXlvdXRQb2x5Z29uKSB8fFxyXG4gICAgICAgICAgIXRoaXMuaXNQb2ludEluc2lkZVBvbHlnb24oeyB4OiB4ICsgZ3JpZFdpZHRoLCB5IH0sIGxheW91dFBvbHlnb24pIHx8XHJcbiAgICAgICAgICAhdGhpcy5pc1BvaW50SW5zaWRlUG9seWdvbih7IHgsIHk6IHkgKyBncmlkSGVpZ2h0IH0sIGxheW91dFBvbHlnb24pIHx8XHJcbiAgICAgICAgICAhdGhpcy5pc1BvaW50SW5zaWRlUG9seWdvbihcclxuICAgICAgICAgICAgeyB4OiB4ICsgZ3JpZFdpZHRoLCB5OiB5ICsgZ3JpZEhlaWdodCB9LFxyXG4gICAgICAgICAgICBsYXlvdXRQb2x5Z29uLFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTm8gb3ZlcmxhcFxyXG4gICAgICAgIGZvciAoY29uc3Qgb2NjIG9mIG9jY3VwaWVkUmVjdHMpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnJlY3RzT3ZlcmxhcChncmlkUmVjdCwgb2NjKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGxldCBiZXN0U2NvcmUgPSAtSW5maW5pdHk7XHJcbiAgICAgIGxldCBiZXN0UG9zOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgIGNvbnN0IHN0ZXAgPSBmaXh0dXJlV2lkdGhQeCAvIDI7XHJcblxyXG4gICAgICBmb3IgKFxyXG4gICAgICAgIGxldCB5ID0gYm91bmRzLnRvcDtcclxuICAgICAgICB5IDw9IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC0gZ3JpZEhlaWdodDtcclxuICAgICAgICB5ICs9IHN0ZXBcclxuICAgICAgKSB7XHJcbiAgICAgICAgZm9yIChcclxuICAgICAgICAgIGxldCB4ID0gYm91bmRzLmxlZnQ7XHJcbiAgICAgICAgICB4IDw9IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC0gZ3JpZFdpZHRoO1xyXG4gICAgICAgICAgeCArPSBzdGVwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBpZiAoIWdyaWRGaXRzKHgsIHkpKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICBjb25zdCBncmlkUmVjdCA9IHsgeCwgeSwgdzogZ3JpZFdpZHRoLCBoOiBncmlkSGVpZ2h0IH07XHJcblxyXG4gICAgICAgICAgY29uc3QgZW1wdHlNYXJnaW4gPSB0aGlzLmNvbXB1dGVFbXB0eU1hcmdpbihcclxuICAgICAgICAgICAgZ3JpZFJlY3QsXHJcbiAgICAgICAgICAgIGJvdW5kcyxcclxuICAgICAgICAgICAgb2NjdXBpZWRSZWN0cyxcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZHggPSBjZW50ZXJYIC0gKHggKyBncmlkV2lkdGggLyAyKTtcclxuICAgICAgICAgIGNvbnN0IGR5ID0gY2VudGVyWSAtICh5ICsgZ3JpZEhlaWdodCAvIDIpO1xyXG4gICAgICAgICAgY29uc3QgY2VudGVyUGVuYWx0eSA9IGR4ICogZHggKyBkeSAqIGR5O1xyXG5cclxuICAgICAgICAgIC8vIEJpZ2dlc3QgZW1wdHkgc3BhY2Ugd2lucywgY2VudGVyIGlzIGEgc29mdCBzdGFiaWxpemVyXHJcbiAgICAgICAgICBjb25zdCBzY29yZSA9IGVtcHR5TWFyZ2luICogMTAwMCAtIGNlbnRlclBlbmFsdHkgKiAwLjAwMTtcclxuXHJcbiAgICAgICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUpIHtcclxuICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7XHJcbiAgICAgICAgICAgIGJlc3RQb3MgPSB7IHgsIHkgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghYmVzdFBvcykge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihcIk5vIHZhbGlkIGNlbnRlci1maXh0dXJlIHBsYWNlbWVudCBmb3VuZFwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEFzc2lnbiBwb3NpdGlvbnNcclxuICAgICAgZml4dHVyZXMuZm9yRWFjaCgoZml4dHVyZTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgcm93ID0gTWF0aC5mbG9vcihpbmRleCAvIGNvbHVtbnMpO1xyXG4gICAgICAgIGNvbnN0IGNvbCA9IGluZGV4ICUgY29sdW1ucztcclxuXHJcbiAgICAgICAgY29uc3QgeCA9IGJlc3RQb3MhLnggKyBjb2wgKiBmaXh0dXJlV2lkdGhQeDtcclxuICAgICAgICBjb25zdCB5ID0gYmVzdFBvcyEueSArIHJvdyAqIGZpeHR1cmVIZWlnaHRQeDtcclxuXHJcbiAgICAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLnggPSB0aGlzLmZyb21QaXhlbHMoeCwgXCJmdFwiKTtcclxuICAgICAgICBmaXh0dXJlLnJlbGF0aXZlUG9zaXRpb24ueSA9IHRoaXMuZnJvbVBpeGVscyh5LCBcImZ0XCIpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmxvb3JEYXRhPy5jZW50ZXJGaXh0dXJlPy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBmaXh0dXJlID0gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZVtpXTtcclxuXHJcbiAgICAgIGNvbnN0IGZpeHR1cmVIZWlnaHQgPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgIGZpeHR1cmUuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSxcclxuICAgICAgICBmaXh0dXJlLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IGZpeHR1cmVXaWR0aCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgZml4dHVyZS5maXh0dXJlU3RhdGljV2lkdGgudmFsdWUsXHJcbiAgICAgICAgZml4dHVyZS5maXh0dXJlU3RhdGljV2lkdGgudW5pdCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IHggPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgIGZpeHR1cmUucmVsYXRpdmVQb3NpdGlvbi54LFxyXG4gICAgICAgIGZpeHR1cmUucmVsYXRpdmVQb3NpdGlvbi51bml0LFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgeSA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLnksXHJcbiAgICAgICAgZml4dHVyZS5yZWxhdGl2ZVBvc2l0aW9uLnVuaXQsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLmRyYXdGaXh0dXJlKFxyXG4gICAgICAgIHRoaXMuY2FudmFzLFxyXG4gICAgICAgIHgsXHJcbiAgICAgICAgeSxcclxuICAgICAgICBmaXh0dXJlSGVpZ2h0LFxyXG4gICAgICAgIGZpeHR1cmVXaWR0aCxcclxuICAgICAgICBmaXh0dXJlLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5mbG9vckRhdGE/Lm90aGVyRWxlbWVudHM/Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgIGNvbnN0IG90aGVyRWxlbWVudCA9IHRoaXMuZmxvb3JEYXRhLm90aGVyRWxlbWVudHNbal07XHJcbiAgICAgIGNvbnN0IHggPSB0aGlzLnRvUGl4ZWxzKG90aGVyRWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLngsIFwiZnRcIik7XHJcbiAgICAgIGNvbnN0IHkgPSB0aGlzLnRvUGl4ZWxzKG90aGVyRWxlbWVudC5yZWxhdGl2ZVBvc2l0aW9uLnksIFwiZnRcIik7XHJcbiAgICAgIGNvbnN0IGEgPSBvdGhlckVsZW1lbnQucmVsYXRpdmVQb3NpdGlvbi5hbmdsZTtcclxuICAgICAgY29uc3QgaCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNMZW5ndGgudmFsdWUsXHJcbiAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgdyA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgb3RoZXJFbGVtZW50LmZpeHR1cmVTdGF0aWNXaWR0aC52YWx1ZSxcclxuICAgICAgICBvdGhlckVsZW1lbnQuZml4dHVyZVN0YXRpY1dpZHRoLnVuaXQsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLmRyYXdPdGhlckVsZW1lbnRzV2l0aExhYmVsKHRoaXMuY2FudmFzLCB4LCB5LCBhLCB3LCBoLCBvdGhlckVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1BvaW50SW5zaWRlUG9seWdvbihcclxuICAgIHBvaW50OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXHJcbiAgICBwb2x5Z29uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH1bXSxcclxuICApOiBib29sZWFuIHtcclxuICAgIGxldCBpbnNpZGUgPSBmYWxzZTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IHBvbHlnb24ubGVuZ3RoIC0gMTsgaSA8IHBvbHlnb24ubGVuZ3RoOyBqID0gaSsrKSB7XHJcbiAgICAgIGNvbnN0IHhpID0gcG9seWdvbltpXS54LFxyXG4gICAgICAgIHlpID0gcG9seWdvbltpXS55O1xyXG4gICAgICBjb25zdCB4aiA9IHBvbHlnb25bal0ueCxcclxuICAgICAgICB5aiA9IHBvbHlnb25bal0ueTtcclxuXHJcbiAgICAgIGNvbnN0IGludGVyc2VjdCA9XHJcbiAgICAgICAgeWkgPiBwb2ludC55ICE9PSB5aiA+IHBvaW50LnkgJiZcclxuICAgICAgICBwb2ludC54IDwgKCh4aiAtIHhpKSAqIChwb2ludC55IC0geWkpKSAvICh5aiAtIHlpKSArIHhpO1xyXG5cclxuICAgICAgaWYgKGludGVyc2VjdCkgaW5zaWRlID0gIWluc2lkZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW5zaWRlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRPY2N1cGllZFJlY3RzKCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH1bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpLm1hcCgob2JqKSA9PiB7XHJcbiAgICAgIGNvbnN0IHIgPSBvYmouZ2V0Qm91bmRpbmdSZWN0KCk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgeDogci5sZWZ0LFxyXG4gICAgICAgIHk6IHIudG9wLFxyXG4gICAgICAgIHc6IHIud2lkdGgsXHJcbiAgICAgICAgaDogci5oZWlnaHQsXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVjdHNPdmVybGFwKFxyXG4gICAgYTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSxcclxuICAgIGI6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIShcclxuICAgICAgYS54ICsgYS53IDw9IGIueCB8fFxyXG4gICAgICBhLnggPj0gYi54ICsgYi53IHx8XHJcbiAgICAgIGEueSArIGEuaCA8PSBiLnkgfHxcclxuICAgICAgYS55ID49IGIueSArIGIuaFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tcHV0ZUVtcHR5TWFyZ2luKFxyXG4gICAgZ3JpZFJlY3Q6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sXHJcbiAgICBib3VuZHM6IHsgbGVmdDogbnVtYmVyOyB0b3A6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcclxuICAgIG9jY3VwaWVkUmVjdHM6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH1bXSxcclxuICApOiBudW1iZXIge1xyXG4gICAgbGV0IG1pbk1hcmdpbiA9IEluZmluaXR5O1xyXG5cclxuICAgIC8vIGRpc3RhbmNlIHRvIGxheW91dCBib3VuZHNcclxuICAgIG1pbk1hcmdpbiA9IE1hdGgubWluKFxyXG4gICAgICBtaW5NYXJnaW4sXHJcbiAgICAgIGdyaWRSZWN0LnggLSBib3VuZHMubGVmdCxcclxuICAgICAgYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLSAoZ3JpZFJlY3QueCArIGdyaWRSZWN0LncpLFxyXG4gICAgICBncmlkUmVjdC55IC0gYm91bmRzLnRvcCxcclxuICAgICAgYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgLSAoZ3JpZFJlY3QueSArIGdyaWRSZWN0LmgpLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBkaXN0YW5jZSB0byBvdGhlciBvYmplY3RzXHJcbiAgICBmb3IgKGNvbnN0IG9jYyBvZiBvY2N1cGllZFJlY3RzKSB7XHJcbiAgICAgIC8vIGhvcml6b250YWwgZ2FwXHJcbiAgICAgIGlmIChvY2MueSA8IGdyaWRSZWN0LnkgKyBncmlkUmVjdC5oICYmIG9jYy55ICsgb2NjLmggPiBncmlkUmVjdC55KSB7XHJcbiAgICAgICAgaWYgKG9jYy54ICsgb2NjLncgPD0gZ3JpZFJlY3QueCkge1xyXG4gICAgICAgICAgbWluTWFyZ2luID0gTWF0aC5taW4obWluTWFyZ2luLCBncmlkUmVjdC54IC0gKG9jYy54ICsgb2NjLncpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG9jYy54ID49IGdyaWRSZWN0LnggKyBncmlkUmVjdC53KSB7XHJcbiAgICAgICAgICBtaW5NYXJnaW4gPSBNYXRoLm1pbihtaW5NYXJnaW4sIG9jYy54IC0gKGdyaWRSZWN0LnggKyBncmlkUmVjdC53KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyB2ZXJ0aWNhbCBnYXBcclxuICAgICAgaWYgKG9jYy54IDwgZ3JpZFJlY3QueCArIGdyaWRSZWN0LncgJiYgb2NjLnggKyBvY2MudyA+IGdyaWRSZWN0LngpIHtcclxuICAgICAgICBpZiAob2NjLnkgKyBvY2MuaCA8PSBncmlkUmVjdC55KSB7XHJcbiAgICAgICAgICBtaW5NYXJnaW4gPSBNYXRoLm1pbihtaW5NYXJnaW4sIGdyaWRSZWN0LnkgLSAob2NjLnkgKyBvY2MuaCkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob2NjLnkgPj0gZ3JpZFJlY3QueSArIGdyaWRSZWN0LmgpIHtcclxuICAgICAgICAgIG1pbk1hcmdpbiA9IE1hdGgubWluKG1pbk1hcmdpbiwgb2NjLnkgLSAoZ3JpZFJlY3QueSArIGdyaWRSZWN0LmgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWluTWFyZ2luO1xyXG4gIH1cclxuXHJcbiAgZHJhd0ZpeHR1cmVSb3dMYWJlbCh0ZXh0OiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBsYWJlbCA9IG5ldyBmYWJyaWMuVGV4dCh0ZXh0LCB7XHJcbiAgICAgIGxlZnQ6IHgsXHJcbiAgICAgIHRvcDogeSxcclxuICAgICAgZm9udFNpemU6IDE0LFxyXG4gICAgICBmb250RmFtaWx5OiBcIkludGVyXCIsXHJcbiAgICAgIGZvbnRXZWlnaHQ6IFwiNjAwXCIsXHJcbiAgICAgIGZpbGw6IFwiIzMzM1wiLFxyXG4gICAgICBvcmlnaW5YOiBcImxlZnRcIixcclxuICAgICAgb3JpZ2luWTogXCJib3R0b21cIixcclxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYW52YXMuYWRkKGxhYmVsKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRyYXdXYWxsKFxyXG4gICAgY2FudmFzOiBmYWJyaWMuQ2FudmFzLFxyXG4gICAgeDogbnVtYmVyLFxyXG4gICAgeTogbnVtYmVyLFxyXG4gICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgZWxlbWVudERhdGE6IGFueSxcclxuICApIHtcclxuICAgIGNvbnN0IHJhZGl1cyA9IDU7XHJcbiAgICBjb25zdCBmaWxsQ29sb3IgPSBcIiNGNkZDRkZcIjtcclxuICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gXCIjRDBENUREXCI7XHJcbiAgICBjb25zdCBsYWJlbENvbG9yID0gXCIjMDA5QkYzXCI7XHJcbiAgICBsZXQgdGV4dCA9IGAke3RoaXMudGl0bGVDYXNlLnRyYW5zZm9ybShlbGVtZW50RGF0YS5lbGVtZW50VHlwZSl9ICR7XHJcbiAgICAgIGVsZW1lbnREYXRhLmVsZW1lbnROdW1iZXJcclxuICAgIH1gO1xyXG5cclxuICAgIGNvbnN0IHdhbGwgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICBsZWZ0OiAwLFxyXG4gICAgICB0b3A6IDAsXHJcbiAgICAgIHdpZHRoLFxyXG4gICAgICBoZWlnaHQsXHJcbiAgICAgIHJ4OiByYWRpdXMsXHJcbiAgICAgIHJ5OiByYWRpdXMsXHJcbiAgICAgIGZpbGw6IGZpbGxDb2xvcixcclxuICAgICAgc3Ryb2tlOiBzdHJva2VDb2xvcixcclxuICAgICAgc3Ryb2tlV2lkdGg6IDAuMjcsXHJcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICBzdHJva2VVbmlmb3JtOiB0cnVlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgY2VudGVyWCA9IHdpZHRoIC8gMjtcclxuICAgIGNvbnN0IGNlbnRlclkgPSBoZWlnaHQgLyAyO1xyXG4gICAgY29uc3QgaXNWZXJ0aWNhbCA9IGhlaWdodCA+IHdpZHRoO1xyXG5cclxuICAgIGNvbnN0IGxhYmVsID0gbmV3IGZhYnJpYy5GYWJyaWNUZXh0KHRleHQsIHtcclxuICAgICAgbGVmdDogY2VudGVyWCxcclxuICAgICAgdG9wOiBjZW50ZXJZLFxyXG4gICAgICBmb250U2l6ZTogMTAsXHJcbiAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgZm9udFdlaWdodDogXCI1MDBcIixcclxuICAgICAgZmlsbDogbGFiZWxDb2xvcixcclxuICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgYW5nbGU6IGlzVmVydGljYWwgPyAtOTAgOiAwLFxyXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGFycm93SGVhZCA9IDU7XHJcbiAgICBjb25zdCBlbGVtZW50czogZmFicmljLk9iamVjdFtdID0gW3dhbGwsIGxhYmVsXTtcclxuXHJcbiAgICBpZiAoaXNWZXJ0aWNhbCkge1xyXG4gICAgICBjb25zdCB0ZXh0V2lkdGggPSBsYWJlbC53aWR0aCB8fCAwO1xyXG4gICAgICBjb25zdCB0b3BBcnJvd1kgPSA1O1xyXG4gICAgICBjb25zdCB0b3BBcnJvd0VuZFkgPSBjZW50ZXJZIC0gdGV4dFdpZHRoIC8gMiAtIDU7XHJcblxyXG4gICAgICBpZiAodG9wQXJyb3dFbmRZID4gdG9wQXJyb3dZICsgYXJyb3dIZWFkKSB7XHJcbiAgICAgICAgZWxlbWVudHMucHVzaChcclxuICAgICAgICAgIG5ldyBmYWJyaWMuTGluZShbY2VudGVyWCwgdG9wQXJyb3dZLCBjZW50ZXJYLCB0b3BBcnJvd0VuZFldLCB7XHJcbiAgICAgICAgICAgIHN0cm9rZTogbGFiZWxDb2xvcixcclxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBuZXcgZmFicmljLlRyaWFuZ2xlKHtcclxuICAgICAgICAgICAgbGVmdDogY2VudGVyWCxcclxuICAgICAgICAgICAgdG9wOiB0b3BBcnJvd1ksXHJcbiAgICAgICAgICAgIHdpZHRoOiBhcnJvd0hlYWQsXHJcbiAgICAgICAgICAgIGhlaWdodDogYXJyb3dIZWFkLFxyXG4gICAgICAgICAgICBhbmdsZTogMCxcclxuICAgICAgICAgICAgZmlsbDogbGFiZWxDb2xvcixcclxuICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgb3JpZ2luWTogXCJib3R0b21cIixcclxuICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBib3R0b21BcnJvd1N0YXJ0WSA9IGNlbnRlclkgKyB0ZXh0V2lkdGggLyAyICsgNTtcclxuICAgICAgY29uc3QgYm90dG9tQXJyb3dFbmRZID0gaGVpZ2h0IC0gNTtcclxuXHJcbiAgICAgIGlmIChib3R0b21BcnJvd0VuZFkgPiBib3R0b21BcnJvd1N0YXJ0WSArIGFycm93SGVhZCkge1xyXG4gICAgICAgIGVsZW1lbnRzLnB1c2goXHJcbiAgICAgICAgICBuZXcgZmFicmljLkxpbmUoXHJcbiAgICAgICAgICAgIFtjZW50ZXJYLCBib3R0b21BcnJvd1N0YXJ0WSwgY2VudGVyWCwgYm90dG9tQXJyb3dFbmRZXSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHN0cm9rZTogbGFiZWxDb2xvcixcclxuICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMSxcclxuICAgICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBuZXcgZmFicmljLlRyaWFuZ2xlKHtcclxuICAgICAgICAgICAgbGVmdDogY2VudGVyWCxcclxuICAgICAgICAgICAgdG9wOiBib3R0b21BcnJvd0VuZFksXHJcbiAgICAgICAgICAgIHdpZHRoOiBhcnJvd0hlYWQsXHJcbiAgICAgICAgICAgIGhlaWdodDogYXJyb3dIZWFkLFxyXG4gICAgICAgICAgICBhbmdsZTogMTgwLFxyXG4gICAgICAgICAgICBmaWxsOiBsYWJlbENvbG9yLFxyXG4gICAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICBvcmlnaW5ZOiBcInRvcFwiLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRleHRXaWR0aCA9IGxhYmVsLndpZHRoIHx8IDA7XHJcbiAgICAgIGNvbnN0IGxlZnRBcnJvd1N0YXJ0WCA9IDU7XHJcbiAgICAgIGNvbnN0IGxlZnRBcnJvd0VuZFggPSBjZW50ZXJYIC0gdGV4dFdpZHRoIC8gMiAtIDU7XHJcblxyXG4gICAgICBpZiAobGVmdEFycm93RW5kWCA+IGxlZnRBcnJvd1N0YXJ0WCArIGFycm93SGVhZCkge1xyXG4gICAgICAgIGVsZW1lbnRzLnB1c2goXHJcbiAgICAgICAgICBuZXcgZmFicmljLkxpbmUoW2xlZnRBcnJvd1N0YXJ0WCwgY2VudGVyWSwgbGVmdEFycm93RW5kWCwgY2VudGVyWV0sIHtcclxuICAgICAgICAgICAgc3Ryb2tlOiBsYWJlbENvbG9yLFxyXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogMSxcclxuICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIG5ldyBmYWJyaWMuVHJpYW5nbGUoe1xyXG4gICAgICAgICAgICBsZWZ0OiBsZWZ0QXJyb3dTdGFydFgsXHJcbiAgICAgICAgICAgIHRvcDogY2VudGVyWSxcclxuICAgICAgICAgICAgd2lkdGg6IGFycm93SGVhZCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBhcnJvd0hlYWQsXHJcbiAgICAgICAgICAgIGFuZ2xlOiAtOTAsXHJcbiAgICAgICAgICAgIGZpbGw6IGxhYmVsQ29sb3IsXHJcbiAgICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcmlnaHRBcnJvd1N0YXJ0WCA9IGNlbnRlclggKyB0ZXh0V2lkdGggLyAyICsgNTtcclxuICAgICAgY29uc3QgcmlnaHRBcnJvd0VuZFggPSB3aWR0aCAtIDU7XHJcblxyXG4gICAgICBpZiAocmlnaHRBcnJvd0VuZFggPiByaWdodEFycm93U3RhcnRYICsgYXJyb3dIZWFkKSB7XHJcbiAgICAgICAgZWxlbWVudHMucHVzaChcclxuICAgICAgICAgIG5ldyBmYWJyaWMuTGluZShcclxuICAgICAgICAgICAgW3JpZ2h0QXJyb3dTdGFydFgsIGNlbnRlclksIHJpZ2h0QXJyb3dFbmRYLCBjZW50ZXJZXSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHN0cm9rZTogbGFiZWxDb2xvcixcclxuICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMSxcclxuICAgICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBuZXcgZmFicmljLlRyaWFuZ2xlKHtcclxuICAgICAgICAgICAgbGVmdDogcmlnaHRBcnJvd0VuZFgsXHJcbiAgICAgICAgICAgIHRvcDogY2VudGVyWSxcclxuICAgICAgICAgICAgd2lkdGg6IGFycm93SGVhZCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBhcnJvd0hlYWQsXHJcbiAgICAgICAgICAgIGFuZ2xlOiA5MCxcclxuICAgICAgICAgICAgZmlsbDogbGFiZWxDb2xvcixcclxuICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbG9ja1N2Z1N0cmluZyA9IGA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgPHBhdGggZD1cIk03IDExVjdDNyA1LjY3MzkyIDcuNTI2NzggNC40MDIxNSA4LjQ2NDQ3IDMuNDY0NDdDOS40MDIxNSAyLjUyNjc4IDEwLjY3MzkgMiAxMiAyQzEzLjMyNjEgMiAxNC41OTc5IDIuNTI2NzggMTUuNTM1NSAzLjQ2NDQ3QzE2LjQ3MzIgNC40MDIxNSAxNyA1LjY3MzkyIDE3IDdWMTFNNSAxMUgxOUMyMC4xMDQ2IDExIDIxIDExLjg5NTQgMjEgMTNWMjBDMjEgMjEuMTA0NiAyMC4xMDQ2IDIyIDE5IDIySDVDMy44OTU0MyAyMiAzIDIxLjEwNDYgMyAyMFYxM0MzIDExLjg5NTQgMy44OTU0MyAxMSA1IDExWlwiIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICA8L3N2Zz5gO1xyXG5cclxuICAgIGxldCBsb2FkZWRTVkc6IGFueSA9IGF3YWl0IGZhYnJpYy5sb2FkU1ZHRnJvbVN0cmluZyhsb2NrU3ZnU3RyaW5nKTtcclxuXHJcbiAgICBsZXQgbG9ja1N2ZyA9IGZhYnJpYy51dGlsLmdyb3VwU1ZHRWxlbWVudHMoXHJcbiAgICAgIGxvYWRlZFNWRy5vYmplY3RzLFxyXG4gICAgICBsb2FkZWRTVkcub3B0aW9ucyxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3Qgd2FsbENlbnRlclggPSB3aWR0aCAvIDI7XHJcbiAgICBjb25zdCB3YWxsQ2VudGVyWSA9IGhlaWdodCAvIDI7XHJcblxyXG4gICAgbG9ja1N2Zy5zY2FsZVRvV2lkdGgoMjApO1xyXG4gICAgbG9ja1N2Zy5zY2FsZVRvSGVpZ2h0KDIwKTtcclxuXHJcbiAgICBpZiAoaXNWZXJ0aWNhbCkge1xyXG4gICAgICBsb2NrU3ZnLnNldCh7XHJcbiAgICAgICAgbGVmdDogd2FsbENlbnRlclgsXHJcbiAgICAgICAgdG9wOiB3YWxsQ2VudGVyWSxcclxuICAgICAgICBhbmdsZTogLTkwLFxyXG4gICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsb2NrU3ZnLnNldCh7XHJcbiAgICAgICAgbGVmdDogd2FsbENlbnRlclgsXHJcbiAgICAgICAgdG9wOiB3YWxsQ2VudGVyWSxcclxuICAgICAgICBhbmdsZTogMCxcclxuICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxvY2tTdmcuc2V0KHtcclxuICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICBldmVudGVkOiB0cnVlLFxyXG4gICAgICBob3ZlckN1cnNvcjogXCJwb2ludGVyXCIsXHJcbiAgICB9KTtcclxuXHJcbiAgICBsb2NrU3ZnLm9uKFwibW91c2Vkb3duXCIsIChvcHQpID0+IHtcclxuICAgICAgaWYgKG9wdCAmJiBvcHQuZSAmJiBvcHQuZS5zdG9wUHJvcGFnYXRpb24pIHtcclxuICAgICAgICBvcHQuZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5sYXlvdXRGb3JtLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICAgIGVsZW1lbnREYXRhLmlzTG9ja2VkID0gIWVsZW1lbnREYXRhPy5pc0xvY2tlZDtcclxuICAgICAgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBlbGVtZW50cy5wdXNoKGxvY2tTdmcpO1xyXG5cclxuICAgIGxldCBtb2RDZW50ZXJYID0geDtcclxuICAgIGxldCBtb2RDZW50ZXJZID0geTtcclxuICAgIGxldCBhbmdsZSA9IGVsZW1lbnREYXRhLmFuZ2xlO1xyXG5cclxuICAgIGNvbnN0IGdyb3VwID0gbmV3IGZhYnJpYy5Hcm91cChlbGVtZW50cywge1xyXG4gICAgICBsZWZ0OiBtb2RDZW50ZXJYLFxyXG4gICAgICB0b3A6IG1vZENlbnRlclksXHJcbiAgICAgIGhhc0NvbnRyb2xzOiB0cnVlLFxyXG4gICAgICBsb2NrU2NhbGluZ1g6IGlzVmVydGljYWwsXHJcbiAgICAgIGxvY2tTY2FsaW5nWTogIWlzVmVydGljYWwsXHJcbiAgICAgIHNlbGVjdGFibGU6IHRoaXMubGF5b3V0Rm9ybS5lbmFibGVkLFxyXG4gICAgICBldmVudGVkOiB0cnVlLFxyXG4gICAgICBob3ZlckN1cnNvcjogXCJwb2ludGVyXCIsXHJcbiAgICAgIGFuZ2xlOiBhbmdsZSxcclxuICAgICAgc3ViVGFyZ2V0Q2hlY2s6IHRydWUsXHJcbiAgICB9KSBhcyBmYWJyaWMuR3JvdXAgJiB7XHJcbiAgICAgIG9ialR5cGU6IHN0cmluZztcclxuICAgICAgZGF0YTogYW55O1xyXG4gICAgfTtcclxuXHJcbiAgICBncm91cC5vYmpUeXBlID0gZWxlbWVudERhdGEuZWxlbWVudFR5cGU7XHJcbiAgICBncm91cC5kYXRhID0gZWxlbWVudERhdGE7XHJcblxyXG4gICAgY2FudmFzLmFkZChncm91cCk7XHJcblxyXG4gICAgLy8gSWYgbmV3bHkgYWRkZWQsIGZvY3VzIGl0IG9uY2VcclxuICAgIGlmICgoZWxlbWVudERhdGEgYXMgYW55KT8ubmV3QWRkZWQpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmNhbnZhcy5zZXRBY3RpdmVPYmplY3QoZ3JvdXApO1xyXG4gICAgICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICAgICAgfSBjYXRjaCB7fVxyXG4gICAgICBkZWxldGUgKGVsZW1lbnREYXRhIGFzIGFueSkubmV3QWRkZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGdyb3VwO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZHJhd0ZpeHR1cmUoXHJcbiAgICBjYW52YXM6IGZhYnJpYy5DYW52YXMsXHJcbiAgICB4OiBudW1iZXIsXHJcbiAgICB5OiBudW1iZXIsXHJcbiAgICBoZWlnaHQ6IG51bWJlcixcclxuICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICBmaXh0dXJlRGF0YTogYW55LFxyXG4gICkge1xyXG4gICAgY29uc3QgYWN0dWFsU2hlbHZlcyA9XHJcbiAgICAgIGZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnPy5maWx0ZXIoKHM6IGFueSkgPT4gcy5zaGVsZlR5cGUgIT0gXCJ2bW9ubHlcIikgPz9cclxuICAgICAgW107XHJcblxyXG4gICAgbGV0IGZpeHR1cmVDb2xvcjogYW55O1xyXG4gICAgaWYgKFtcImZpeHR1cmVcIiwgXCJmaXh0dXJlLXJlZG9cIl0uaW5jbHVkZXModGhpcy5wdWJsaXNoaW5nU3RhdGUpKSB7XHJcbiAgICAgIGZpeHR1cmVDb2xvciA9IHtcclxuICAgICAgICBwcmltYXJ5OlxyXG4gICAgICAgICAgZml4dHVyZURhdGEuc3RhdHVzID09IFwiXCIgJiYgZml4dHVyZURhdGEudGFza1N0YXR1cyA9PSBcInN1Ym1pdFwiXHJcbiAgICAgICAgICAgID8gXCIjYTVhNmE4XCJcclxuICAgICAgICAgICAgOiBmaXh0dXJlRGF0YS5zdGF0dXMgPT0gXCJhZ3JlZVwiXHJcbiAgICAgICAgICAgICAgPyBcIiM2Q0U5QTZcIlxyXG4gICAgICAgICAgICAgIDogXCIjNTFDMUZGXCIsXHJcbiAgICAgICAgZmlsbDpcclxuICAgICAgICAgIGZpeHR1cmVEYXRhLnN0YXR1cyA9PSBcIlwiICYmIGZpeHR1cmVEYXRhLnRhc2tTdGF0dXMgPT0gXCJzdWJtaXRcIlxyXG4gICAgICAgICAgICA/IFwiI2YzZjRmOFwiXHJcbiAgICAgICAgICAgIDogZml4dHVyZURhdGEuc3RhdHVzID09IFwiYWdyZWVcIlxyXG4gICAgICAgICAgICAgID8gXCIjNkNFOUE2XCJcclxuICAgICAgICAgICAgICA6IFwiI0VBRjhGRlwiLFxyXG4gICAgICAgIHZtRmlsbDpcclxuICAgICAgICAgIGZpeHR1cmVEYXRhLnN0YXR1cyA9PSBcIlwiICYmIGZpeHR1cmVEYXRhLnRhc2tTdGF0dXMgPT0gXCJzdWJtaXRcIlxyXG4gICAgICAgICAgICA/IFwiI2E1YTZhOFwiXHJcbiAgICAgICAgICAgIDogXCIjNjkzOEVGXCIsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoZml4dHVyZURhdGEuZml4dHVyZU5hbWUgPT09IFwic3BhY2VcIikgcmV0dXJuO1xyXG5cclxuICAgIC8vIFJlc29sdmUgdGhlIGFuZ2xlIHRoZSBmaXh0dXJlIGdyb3VwIHdpbGwgcmVuZGVyIGF0LiBGb3IgZmlyc3QtcmVuZGVyIG9mIGFcclxuICAgIC8vIENBRC11cGxvYWRlZCBsYXlvdXQsIHRoZSB3YWxsIGFuZ2xlIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGggKG90aGVyd2lzZSB3ZVxyXG4gICAgLy8gaG9ub3IgdGhlIGZpeHR1cmUncyBvd24gc2F2ZWQgYW5nbGUpLiBXaGVuIHRoYXQgYW5nbGUgbGllcyBpbiB0aGVcclxuICAgIC8vIHVwc2lkZS1kb3duIHJhbmdlICg5MMKwLCAyNzDCsCksIHdlIGZsaXAgdGhlIGZpeHR1cmUgYm9keSAxODDCsCBpbiBwbGFjZSBzb1xyXG4gICAgLy8gaXQgcmVuZGVycyBjYW5vbmljYWwgKGhlYWRlciBhdCB0b3AsIHN0b3JhZ2UgYXQgYm90dG9tKS4gVHJhZGUtb2ZmOiBvblxyXG4gICAgLy8gZmxpcHBlZCB3YWxscyB0aGUgc3RvcmFnZSBib3ggZW5kcyB1cCB2aXN1YWxseSB0b3VjaGluZyB0aGUgd2FsbCBpbnN0ZWFkXHJcbiAgICAvLyBvZiB0aGUgaGVhZGVyLiBNaXJyb3JzIHRoZSBzYW1lIGxvZ2ljIGluIG9uYm9hcmQtc3RvcmUtcGxhbm8uXHJcbiAgICBsZXQgYW5nbGUgPSBmaXh0dXJlRGF0YT8ucmVsYXRpdmVQb3NpdGlvbj8uYW5nbGUgPz8gMDtcclxuICAgIGlmICh0aGlzLmZsb29yRGF0YS5jYWRMYXlvdXQgJiYgZml4dHVyZURhdGEuZml4dHVyZVR5cGUgPT09IFwid2FsbFwiKSB7XHJcbiAgICAgIGNvbnN0IHdhbGxEYXRhID0gdGhpcy5nZXRXYWxsQnlOdW1iZXIoXHJcbiAgICAgICAgZml4dHVyZURhdGEuYXNzb2NpYXRlZEVsZW1lbnROdW1iZXIsXHJcbiAgICAgICk7XHJcbiAgICAgIGFuZ2xlID0gd2FsbERhdGE/LmFuZ2xlID8/IDA7XHJcbiAgICB9XHJcbiAgICBjb25zdCBub3JtQW5nbGUgPSAoKCgoYW5nbGUgYXMgbnVtYmVyKSAlIDM2MCkgKyAzNjApICUgMzYwKTtcclxuICAgIGNvbnN0IHNob3VsZEZsaXBCb2R5ID1cclxuICAgICAgdGhpcy5mbG9vckRhdGEuY2FkTGF5b3V0ICYmXHJcbiAgICAgIGZpeHR1cmVEYXRhLmZpeHR1cmVUeXBlID09PSBcIndhbGxcIiAmJlxyXG4gICAgICBub3JtQW5nbGUgPiA5MCAmJlxyXG4gICAgICBub3JtQW5nbGUgPCAyNzA7XHJcblxyXG4gICAgLy8gVG8gcm90YXRlIHRoZSBib2R5IDE4MMKwIHdoaWxlIGtlZXBpbmcgdGhlIHNhbWUgb24tY2FudmFzIHJlZ2lvbiwgc2hpZnRcclxuICAgIC8vIHRoZSBhbmNob3IgYnkgUihvcmlnaW5hbEFuZ2xlKcK3KHdpZHRoLCBoZWlnaHQpIOKAlCB0aGUgY2FudmFzIHBvc2l0aW9uIG9mXHJcbiAgICAvLyB0aGUgdW4tcm90YXRlZCBiYm94J3MgYm90dG9tLXJpZ2h0IGNvcm5lciByZWxhdGl2ZSB0byB0aGUgYW5jaG9yIOKAlCBhbmRcclxuICAgIC8vIGFkZCAxODDCsCB0byB0aGUgcm90YXRpb24uIGZhYnJpYyBzdGlsbCBwaXZvdHMgYXJvdW5kIHRvcC1sZWZ0LlxyXG4gICAgbGV0IHJlbmRlclggPSB4O1xyXG4gICAgbGV0IHJlbmRlclkgPSB5O1xyXG4gICAgbGV0IHJlbmRlckFuZ2xlID0gYW5nbGUgYXMgbnVtYmVyO1xyXG4gICAgaWYgKHNob3VsZEZsaXBCb2R5KSB7XHJcbiAgICAgIGNvbnN0IHJhZCA9ICgoYW5nbGUgYXMgbnVtYmVyKSAqIE1hdGguUEkpIC8gMTgwO1xyXG4gICAgICBjb25zdCBjb3NBID0gTWF0aC5jb3MocmFkKTtcclxuICAgICAgY29uc3Qgc2luQSA9IE1hdGguc2luKHJhZCk7XHJcbiAgICAgIHJlbmRlclggPSB4ICsgY29zQSAqIHdpZHRoIC0gc2luQSAqIGhlaWdodDtcclxuICAgICAgcmVuZGVyWSA9IHkgKyBzaW5BICogd2lkdGggKyBjb3NBICogaGVpZ2h0O1xyXG4gICAgICByZW5kZXJBbmdsZSA9IChhbmdsZSBhcyBudW1iZXIpICsgMTgwO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJhZGl1cyA9IDU7XHJcbiAgICBjb25zdCBtYWluQ29udGFpbmVyID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgbGVmdDogeCxcclxuICAgICAgdG9wOiB5LFxyXG4gICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICByeDogcmFkaXVzLFxyXG4gICAgICByeTogcmFkaXVzLFxyXG4gICAgICBzdHJva2U6IGZpeHR1cmVDb2xvcj8ucHJpbWFyeSA/PyBcIiM1MUMxRkZcIixcclxuICAgICAgc3Ryb2tlV2lkdGg6IDAuMjcsXHJcbiAgICAgIGZpbGw6IFwid2hpdGVcIixcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHRvcFdpZHRoID0gd2lkdGggLyAxLjA1O1xyXG4gICAgY29uc3QgdG9wSGVpZ2h0ID0gKDE1IC8gMTAwKSAqIGhlaWdodDtcclxuICAgIGNvbnN0IHRvcFggPSB4ICsgKHdpZHRoIC0gdG9wV2lkdGgpIC8gMjtcclxuICAgIGNvbnN0IHRvcFkgPSB5ICsgdGhpcy52ZXJ0aWNhbE1hcmdpbjtcclxuXHJcbiAgICBjb25zdCB0b3BDb250YWluZXIgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICBsZWZ0OiB0b3BYLFxyXG4gICAgICB0b3A6IHRvcFksXHJcbiAgICAgIHdpZHRoOiB0b3BXaWR0aCxcclxuICAgICAgaGVpZ2h0OiB0b3BIZWlnaHQsXHJcbiAgICAgIHJ4OiByYWRpdXMsXHJcbiAgICAgIHJ5OiByYWRpdXMsXHJcbiAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5ID8/IFwiIzUxQzFGRlwiLFxyXG4gICAgICBzdHJva2VXaWR0aDogMC4yNyxcclxuICAgICAgZmlsbDogXCJ3aGl0ZVwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgaW5uZXJCb3hIZWlnaHQgPSB0b3BIZWlnaHQgLyAyO1xyXG4gICAgY29uc3QgaW5uZXJUb3BCb3ggPSBuZXcgZmFicmljLlBhdGgoXHJcbiAgICAgIGBNICR7dG9wWCArIHJhZGl1c30gJHt0b3BZfSBcclxuICAgICAgICBMICR7dG9wWCArIHRvcFdpZHRoIC0gcmFkaXVzfSAke3RvcFl9IFxyXG4gICAgICAgIFEgJHt0b3BYICsgdG9wV2lkdGh9ICR7dG9wWX0gJHt0b3BYICsgdG9wV2lkdGh9ICR7dG9wWSArIHJhZGl1c30gXHJcbiAgICAgICAgTCAke3RvcFggKyB0b3BXaWR0aH0gJHt0b3BZICsgaW5uZXJCb3hIZWlnaHR9IFxyXG4gICAgICAgIEwgJHt0b3BYfSAke3RvcFkgKyBpbm5lckJveEhlaWdodH0gXHJcbiAgICAgICAgTCAke3RvcFh9ICR7dG9wWSArIHJhZGl1c30gXHJcbiAgICAgICAgUSAke3RvcFh9ICR7dG9wWX0gJHt0b3BYICsgcmFkaXVzfSAke3RvcFl9IFpgLFxyXG4gICAgICB7XHJcbiAgICAgICAgc3Ryb2tlOiBmaXh0dXJlQ29sb3I/LnByaW1hcnkgPz8gXCIjNTFDMUZGXCIsXHJcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDAuMjcsXHJcbiAgICAgICAgZmlsbDogXCJ0cmFuc3BhcmVudFwiLFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCB0b3BGaWVsZFRleHQgPVxyXG4gICAgICAoZml4dHVyZURhdGEuZml4dHVyZVR5cGUgPT09IFwid2FsbFwiXHJcbiAgICAgICAgPyBgV2FsbC0ke2ZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50TnVtYmVyfSAtIGBcclxuICAgICAgICA6IFwiRmxvb3IgLSBcIikgK1xyXG4gICAgICBgRml4dHVyZSAke1xyXG4gICAgICAgIGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlclxyXG4gICAgICAgICAgPyBmaXh0dXJlRGF0YS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIgK1xyXG4gICAgICAgICAgICAoZml4dHVyZURhdGE/LmZpeHR1cmVOdW1iZXJcclxuICAgICAgICAgICAgICA/IFwiIC0gRlgtXCIgKyBmaXh0dXJlRGF0YS5maXh0dXJlTnVtYmVyXHJcbiAgICAgICAgICAgICAgOiBcIlwiKVxyXG4gICAgICAgICAgOiBcIm5ld1wiXHJcbiAgICAgIH1gO1xyXG5cclxuICAgIGNvbnN0IHRvcFRleHQgPSBuZXcgZmFicmljLlRleHRib3godG9wRmllbGRUZXh0LCB7XHJcbiAgICAgIGxlZnQ6IHRvcFggKyB0b3BXaWR0aCAvIDIsXHJcbiAgICAgIHRvcDogdG9wWSArIGlubmVyQm94SGVpZ2h0IC8gMixcclxuICAgICAgZm9udFNpemU6IDUsXHJcbiAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgZm9udFdlaWdodDogXCI1MDBcIixcclxuICAgICAgZmlsbDogXCIjMTAxODI4XCIsXHJcbiAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgIHdpZHRoOiB0b3BXaWR0aCxcclxuICAgICAgaGVpZ2h0OiBpbm5lckJveEhlaWdodCxcclxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc2Vjb25kQm94WSA9IHRvcFkgKyBpbm5lckJveEhlaWdodDtcclxuXHJcbiAgICBjb25zdCBpbm5lckJvdHRvbUJveCA9IG5ldyBmYWJyaWMuUGF0aChcclxuICAgICAgYE0gJHt0b3BYfSAke3NlY29uZEJveFl9IFxyXG4gICAgTCAke3RvcFggKyB0b3BXaWR0aH0gJHtzZWNvbmRCb3hZfSBcclxuICAgIEwgJHt0b3BYICsgdG9wV2lkdGh9ICR7c2Vjb25kQm94WSArIGlubmVyQm94SGVpZ2h0IC0gcmFkaXVzfSBcclxuICAgIFEgJHt0b3BYICsgdG9wV2lkdGh9ICR7c2Vjb25kQm94WSArIGlubmVyQm94SGVpZ2h0fSAke1xyXG4gICAgICB0b3BYICsgdG9wV2lkdGggLSByYWRpdXNcclxuICAgIH0gJHtzZWNvbmRCb3hZICsgaW5uZXJCb3hIZWlnaHR9IFxyXG4gICAgTCAke3RvcFggKyByYWRpdXN9ICR7c2Vjb25kQm94WSArIGlubmVyQm94SGVpZ2h0fSBcclxuICAgIFEgJHt0b3BYfSAke3NlY29uZEJveFkgKyBpbm5lckJveEhlaWdodH0gJHt0b3BYfSAke1xyXG4gICAgICBzZWNvbmRCb3hZICsgaW5uZXJCb3hIZWlnaHQgLSByYWRpdXNcclxuICAgIH0gXHJcbiAgICBMICR7dG9wWH0gJHtzZWNvbmRCb3hZfSBaYCxcclxuICAgICAge1xyXG4gICAgICAgIGZpbGw6IFwiIzM0NDA1NFwiLFxyXG4gICAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5ID8/IFwiIzUxQzFGRlwiLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgZm9udFNpemUgPSA1O1xyXG4gICAgbGV0IGJvdHRvbVRleHQ7XHJcblxyXG4gICAgY29uc3QgdGV4dENvbnRlbnQgPSBnZXRGaXh0dXJlQ2FudmFzTGFiZWwoZml4dHVyZURhdGEpO1xyXG5cclxuICAgIGNvbnN0IGNyZWF0ZUJvdHRvbVRleHQgPSAoZnM6IGFueSkgPT5cclxuICAgICAgbmV3IGZhYnJpYy5UZXh0Ym94KHRleHRDb250ZW50LCB7XHJcbiAgICAgICAgbGVmdDogdG9wWCArIHRvcFdpZHRoIC8gMixcclxuICAgICAgICB0b3A6IHNlY29uZEJveFkgKyBpbm5lckJveEhlaWdodCAvIDIsXHJcbiAgICAgICAgZm9udFNpemU6IGZzLFxyXG4gICAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgICBmb250V2VpZ2h0OiBcIjUwMFwiLFxyXG4gICAgICAgIGZpbGw6IFwiI0ZGRkZGRlwiLFxyXG4gICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgICAgd2lkdGg6IHRvcFdpZHRoLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICBkbyB7XHJcbiAgICAgIGJvdHRvbVRleHQgPSBjcmVhdGVCb3R0b21UZXh0KGZvbnRTaXplKTtcclxuICAgICAgZm9udFNpemUgLT0gMC41O1xyXG4gICAgfSB3aGlsZSAoYm90dG9tVGV4dC5oZWlnaHQgPiBpbm5lckJveEhlaWdodCAmJiBmb250U2l6ZSA+IDIpO1xyXG5cclxuICAgIGNvbnN0IG1pZFdpZHRoID0gd2lkdGggLyAxLjA1O1xyXG4gICAgY29uc3QgbWlkSGVpZ2h0ID0gKDc3IC8gMTAwKSAqIGhlaWdodDtcclxuICAgIGNvbnN0IG1pZFggPSB4ICsgKHdpZHRoIC0gbWlkV2lkdGgpIC8gMjtcclxuICAgIGNvbnN0IG1pZFkgPSB0b3BZICsgdG9wSGVpZ2h0ICsgdGhpcy52ZXJ0aWNhbE1hcmdpbjtcclxuXHJcbiAgICBjb25zdCBtaWRDb250YWluZXIgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICBsZWZ0OiBtaWRYLFxyXG4gICAgICB0b3A6IG1pZFksXHJcbiAgICAgIHdpZHRoOiBtaWRXaWR0aCxcclxuICAgICAgaGVpZ2h0OiBtaWRIZWlnaHQsXHJcbiAgICAgIHJ4OiByYWRpdXMsXHJcbiAgICAgIHJ5OiByYWRpdXMsXHJcbiAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5ID8/IFwiIzUxQzFGRlwiLFxyXG4gICAgICBzdHJva2VXaWR0aDogMC4yNyxcclxuICAgICAgZmlsbDogXCJ3aGl0ZVwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc2hlbGZDb3VudCA9IGZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnPy5sZW5ndGg7XHJcbiAgICBjb25zdCBib3hIZWlnaHQgPSBtaWRIZWlnaHQgLyAoc2hlbGZDb3VudCArIDIpO1xyXG4gICAgY29uc3QgZmlyc3RCb3hZID0gbWlkWTtcclxuXHJcbiAgICBjb25zdCBmaXJzdEJveCA9IG5ldyBmYWJyaWMuUGF0aChcclxuICAgICAgYE0gJHttaWRYICsgcmFkaXVzfSAke2ZpcnN0Qm94WX0gXHJcbiAgICAgICAgTCAke21pZFggKyBtaWRXaWR0aCAtIHJhZGl1c30gJHtmaXJzdEJveFl9IFxyXG4gICAgICAgIFEgJHttaWRYICsgbWlkV2lkdGh9ICR7Zmlyc3RCb3hZfSAke21pZFggKyBtaWRXaWR0aH0gJHtcclxuICAgICAgICAgIGZpcnN0Qm94WSArIHJhZGl1c1xyXG4gICAgICAgIH0gXHJcbiAgICAgICAgTCAke21pZFggKyBtaWRXaWR0aH0gJHtmaXJzdEJveFkgKyBib3hIZWlnaHR9IFxyXG4gICAgICAgIEwgJHttaWRYfSAke2ZpcnN0Qm94WSArIGJveEhlaWdodH0gXHJcbiAgICAgICAgTCAke21pZFh9ICR7Zmlyc3RCb3hZICsgcmFkaXVzfSBcclxuICAgICAgICBRICR7bWlkWH0gJHtmaXJzdEJveFl9ICR7bWlkWCArIHJhZGl1c30gJHtmaXJzdEJveFl9IFpgLFxyXG4gICAgICB7XHJcbiAgICAgICAgZmlsbDogZml4dHVyZUNvbG9yPy5maWxsXHJcbiAgICAgICAgICA/IGZpeHR1cmVDb2xvcj8uZmlsbFxyXG4gICAgICAgICAgOiBmaXh0dXJlRGF0YS5pc3N1ZVxyXG4gICAgICAgICAgICA/IFwiI0Q5MkQyMFwiXHJcbiAgICAgICAgICAgIDogXCIjRUFGOEZGXCIsXHJcbiAgICAgICAgc3Ryb2tlOiBmaXh0dXJlQ29sb3I/LnByaW1hcnlcclxuICAgICAgICAgID8gZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICA6IGZpeHR1cmVEYXRhLmlzc3VlXHJcbiAgICAgICAgICAgID8gXCIjRDkyRDIwXCJcclxuICAgICAgICAgICAgOiBcIiM2QkNBRkZcIixcclxuICAgICAgICBzdHJva2VXaWR0aDogMC4yNyxcclxuICAgICAgfSxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgZmlyc3RCb3hUZXh0ID0gbmV3IGZhYnJpYy5UZXh0Ym94KFxyXG4gICAgICBgJHtmaXh0dXJlRGF0YT8uaGVhZGVyPy5sYWJlbCA/IGZpeHR1cmVEYXRhLmhlYWRlci5sYWJlbCA6IFwiXCJ9YCxcclxuICAgICAge1xyXG4gICAgICAgIGxlZnQ6IG1pZFggKyBtaWRXaWR0aCAvIDIsXHJcbiAgICAgICAgdG9wOiBmaXJzdEJveFkgKyBib3hIZWlnaHQgLyAyLFxyXG4gICAgICAgIGZvbnRTaXplOiA3LFxyXG4gICAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgICBmb250V2VpZ2h0OiBcIjYwMFwiLFxyXG4gICAgICAgIGZpbGw6IGZpeHR1cmVEYXRhLmlzc3VlID8gXCIjZmZmXCIgOiBcIiMxMDE4MjhcIixcclxuICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgd2lkdGg6IG1pZFdpZHRoLFxyXG4gICAgICAgIGhlaWdodDogYm94SGVpZ2h0LFxyXG4gICAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcclxuICAgICAgfSxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3Qgc2hlbHZlcyA9IFtdO1xyXG4gICAgY29uc3Qgc2hlbGZIZWlnaHQgPSBtaWRIZWlnaHQgLSAyICogYm94SGVpZ2h0O1xyXG5cclxuICAgIGlmIChmaXh0dXJlRGF0YS5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSBcIkwxXCIpIHtcclxuICAgICAgY29uc3QgYm94WSA9IGZpcnN0Qm94WSArIGJveEhlaWdodDtcclxuXHJcbiAgICAgIGNvbnN0IHNoZWxmID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgICBsZWZ0OiBtaWRYLFxyXG4gICAgICAgIHRvcDogYm94WSxcclxuICAgICAgICB3aWR0aDogbWlkV2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiBzaGVsZkhlaWdodCxcclxuICAgICAgICAvLyBzdHJva2U6ICcjNTFDMUZGJyxcclxuICAgICAgICBzdHJva2U6IGZpeHR1cmVDb2xvcj8ucHJpbWFyeVxyXG4gICAgICAgICAgPyBmaXh0dXJlQ29sb3I/LnByaW1hcnlcclxuICAgICAgICAgIDogZml4dHVyZURhdGEuaXNzdWVcclxuICAgICAgICAgICAgPyBcIiNEOTJEMjBcIlxyXG4gICAgICAgICAgICA6IFwiIzUxQzFGRlwiLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICAgIGZpbGw6IFwid2hpdGVcIixcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCB0ZXh0ID0gZml4dHVyZURhdGE/LnByb2R1Y3RCcmFuZE5hbWU/LmpvaW4oXCIgKyBcIikgfHwgXCJcIjtcclxuXHJcbiAgICAgIC8vIFdyYXAgdGV4dCB3aXRoaW4gZml4dHVyZSB3aWR0aCBhbmQgc2hyaW5rIHRvIGZpdCB2ZXJ0aWNhbCBzcGFjZVxyXG4gICAgICBjb25zdCBtYXhUZXh0V2lkdGggPSBtaWRXaWR0aCAqIDAuOTtcclxuICAgICAgY29uc3QgbWF4VGV4dEhlaWdodCA9IHNoZWxmSGVpZ2h0ICogMC44O1xyXG4gICAgICBsZXQgZm9udFNpemVMMSA9IDY7XHJcblxyXG4gICAgICBjb25zdCBjcmVhdGVXcmFwcGVkVGV4dGJveCA9IChmczogbnVtYmVyKSA9PlxyXG4gICAgICAgIG5ldyBmYWJyaWMuVGV4dGJveCh0ZXh0LCB7XHJcbiAgICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLyAyLFxyXG4gICAgICAgICAgdG9wOiBib3hZICsgc2hlbGZIZWlnaHQgLyAyLFxyXG4gICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICB3aWR0aDogbWF4VGV4dFdpZHRoLFxyXG4gICAgICAgICAgZm9udFNpemU6IGZzLFxyXG4gICAgICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICAgICAgZm9udFdlaWdodDogXCI1MDBcIixcclxuICAgICAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcclxuICAgICAgICAgIGZpbGw6IFwiIzMzM1wiLFxyXG4gICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIGxldCB3cmFwcGVkVGV4dCA9IGNyZWF0ZVdyYXBwZWRUZXh0Ym94KGZvbnRTaXplTDEpO1xyXG4gICAgICB3aGlsZSAod3JhcHBlZFRleHQuaGVpZ2h0ID4gbWF4VGV4dEhlaWdodCAmJiBmb250U2l6ZUwxID4gMikge1xyXG4gICAgICAgIGZvbnRTaXplTDEgLT0gMC41O1xyXG4gICAgICAgIHdyYXBwZWRUZXh0ID0gY3JlYXRlV3JhcHBlZFRleHRib3goZm9udFNpemVMMSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHBhZGRpbmcgPSAyO1xyXG4gICAgICBjb25zdCBiYWNrZ3JvdW5kID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLyAyLFxyXG4gICAgICAgIHRvcDogYm94WSArIHNoZWxmSGVpZ2h0IC8gMixcclxuICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgd2lkdGg6IE1hdGgubWluKG1heFRleHRXaWR0aCwgd3JhcHBlZFRleHQud2lkdGghKSArIHBhZGRpbmcsXHJcbiAgICAgICAgaGVpZ2h0OiB3cmFwcGVkVGV4dC5nZXRTY2FsZWRIZWlnaHQoKSArIDIsXHJcbiAgICAgICAgZmlsbDogXCJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSlcIixcclxuICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICByeDogMSxcclxuICAgICAgICByeTogMSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBzaGVsdmVzLnB1c2goc2hlbGYsIGJhY2tncm91bmQsIHdyYXBwZWRUZXh0KTtcclxuICAgIH0gZWxzZSBpZiAoZml4dHVyZURhdGEucHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gXCJMMlwiKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hlbGZDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgYm94WSA9IGZpcnN0Qm94WSArIGJveEhlaWdodCAqIChpICsgMSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNoZWxmID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgICAgIGxlZnQ6IG1pZFgsXHJcbiAgICAgICAgICB0b3A6IGJveFksXHJcbiAgICAgICAgICB3aWR0aDogbWlkV2lkdGgsXHJcbiAgICAgICAgICBoZWlnaHQ6IGJveEhlaWdodCxcclxuICAgICAgICAgIHN0cm9rZTogZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICAgID8gZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICAgIDogZml4dHVyZURhdGEuaXNzdWVcclxuICAgICAgICAgICAgICA/IFwiI0Q5MkQyMFwiXHJcbiAgICAgICAgICAgICAgOiBcIiM1MUMxRkZcIixcclxuICAgICAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICAgICAgZmlsbDogXCJ3aGl0ZVwiLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzaGVsdmVzLnB1c2goc2hlbGYpO1xyXG5cclxuICAgICAgICBpZiAoZml4dHVyZURhdGEuc2hlbGZDb25maWc/LltpXS5zaGVsZlR5cGUgPT09IFwidHJheVwiKSB7XHJcbiAgICAgICAgICBjb25zdCB0cmF5Um93cyA9IGZpeHR1cmVEYXRhLnNoZWxmQ29uZmlnPy5baV0udHJheVJvd3MgfHwgMTtcclxuICAgICAgICAgIGNvbnN0IHJvd1NwYWNpbmcgPSBib3hIZWlnaHQgLyB0cmF5Um93cztcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCByID0gMTsgciA8IHRyYXlSb3dzOyByKyspIHtcclxuICAgICAgICAgICAgY29uc3QgbGluZVkgPSBib3hZICsgciAqIHJvd1NwYWNpbmc7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0cmF5TGluZSA9IG5ldyBmYWJyaWMuTGluZShcclxuICAgICAgICAgICAgICBbbWlkWCwgbGluZVksIG1pZFggKyBtaWRXaWR0aCwgbGluZVldLFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN0cm9rZTogXCIjOTk5XCIsXHJcbiAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMC4yLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgc2hlbHZlcy5wdXNoKHRyYXlMaW5lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRleHQgPVxyXG4gICAgICAgICAgZml4dHVyZURhdGEuc2hlbGZDb25maWc/LltpXS5wcm9kdWN0QnJhbmROYW1lPy5qb2luKFwiICsgXCIpIHx8IFwiXCI7XHJcblxyXG4gICAgICAgIC8vIEwyOiBTaW5nbGUtbGluZSBlbGxpcHNpcyBhZ2FpbnN0IGZ1bGwgc2hlbGYgd2lkdGhcclxuICAgICAgICBjb25zdCBob3Jpem9udGFsUGFkZGluZyA9IDY7XHJcbiAgICAgICAgY29uc3QgbWF4VGV4dFdpZHRoID0gTWF0aC5tYXgoMCwgbWlkV2lkdGggLSBob3Jpem9udGFsUGFkZGluZyk7XHJcbiAgICAgICAgY29uc3QgbWF4VGV4dEhlaWdodCA9IGJveEhlaWdodCAqIDAuODtcclxuICAgICAgICBjb25zdCBiYXNlRm9udFNpemUgPSA1O1xyXG5cclxuICAgICAgICBjb25zdCBtZWFzdXJlID0gKHQ6IHN0cmluZykgPT5cclxuICAgICAgICAgIG5ldyBmYWJyaWMuVGV4dCh0LCB7XHJcbiAgICAgICAgICAgIGZvbnRTaXplOiBiYXNlRm9udFNpemUsXHJcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgICAgICAgZm9udFdlaWdodDogXCI1MDBcIixcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgZGlzcGxheVRleHQgPSB0ZXh0O1xyXG4gICAgICAgIGxldCBtZWFzdXJlZCA9IG1lYXN1cmUoZGlzcGxheVRleHQpO1xyXG5cclxuICAgICAgICBpZiAoKG1lYXN1cmVkLndpZHRoID8/IDApID4gbWF4VGV4dFdpZHRoKSB7XHJcbiAgICAgICAgICBjb25zdCBlbGxpcHNpcyA9IFwiLi4uXCI7XHJcbiAgICAgICAgICBsZXQgbGVmdElkeCA9IDA7XHJcbiAgICAgICAgICBsZXQgcmlnaHRJZHggPSB0ZXh0Lmxlbmd0aDtcclxuXHJcbiAgICAgICAgICB3aGlsZSAobGVmdElkeCA8IHJpZ2h0SWR4KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pZElkeCA9IE1hdGguZmxvb3IoKGxlZnRJZHggKyByaWdodElkeCkgLyAyKTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdGV4dC5zbGljZSgwLCBtaWRJZHgpICsgZWxsaXBzaXM7XHJcbiAgICAgICAgICAgIG1lYXN1cmVkID0gbWVhc3VyZShjYW5kaWRhdGUpO1xyXG4gICAgICAgICAgICBpZiAoKG1lYXN1cmVkLndpZHRoID8/IDApID4gbWF4VGV4dFdpZHRoKSB7XHJcbiAgICAgICAgICAgICAgcmlnaHRJZHggPSBtaWRJZHg7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbGVmdElkeCA9IG1pZElkeCArIDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGRpc3BsYXlUZXh0ID0gdGV4dC5zbGljZSgwLCBNYXRoLm1heCgwLCBsZWZ0SWR4IC0gMSkpICsgZWxsaXBzaXM7XHJcbiAgICAgICAgICBtZWFzdXJlZCA9IG1lYXN1cmUoZGlzcGxheVRleHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYmFja2dyb3VuZCA9IG5ldyBmYWJyaWMuUmVjdCh7XHJcbiAgICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLyAyLFxyXG4gICAgICAgICAgdG9wOiBib3hZICsgYm94SGVpZ2h0IC8gMixcclxuICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgd2lkdGg6IG1pZFdpZHRoLFxyXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLm1pbihtYXhUZXh0SGVpZ2h0LCBtZWFzdXJlZC5oZWlnaHQgPz8gMTApICsgMixcclxuICAgICAgICAgIGZpbGw6IFwicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpXCIsXHJcbiAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgcng6IDEsXHJcbiAgICAgICAgICByeTogMSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgZmluYWxUZXh0ID0gbmV3IGZhYnJpYy5UZXh0KGRpc3BsYXlUZXh0LCB7XHJcbiAgICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLyAyLFxyXG4gICAgICAgICAgdG9wOiBib3hZICsgYm94SGVpZ2h0IC8gMixcclxuICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgZm9udFNpemU6IGJhc2VGb250U2l6ZSxcclxuICAgICAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgICAgIGZvbnRXZWlnaHQ6IFwiNTAwXCIsXHJcbiAgICAgICAgICBmaWxsOiBcIiMzMzNcIixcclxuICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNoZWx2ZXMucHVzaChiYWNrZ3JvdW5kLCBmaW5hbFRleHQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGZpeHR1cmVEYXRhLnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgPT09IFwiTDNcIikge1xyXG4gICAgICBjb25zdCBzZXF1ZW50aWFsR3JvdXBzOiB7IHpvbmU6IHN0cmluZzsgc2hlbHZlczogYW55W10gfVtdID0gW107XHJcblxyXG4gICAgICBsZXQgcHJldmlvdXNab25lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgc2hlbGYgb2YgZml4dHVyZURhdGEuc2hlbGZDb25maWcpIHtcclxuICAgICAgICBjb25zdCB6b25lID0gc2hlbGYuem9uZSB8fCBcIlVua25vd25cIjtcclxuICAgICAgICBpZiAoem9uZSAhPT0gcHJldmlvdXNab25lKSB7XHJcbiAgICAgICAgICBzZXF1ZW50aWFsR3JvdXBzLnB1c2goeyB6b25lLCBzaGVsdmVzOiBbc2hlbGZdIH0pO1xyXG4gICAgICAgICAgcHJldmlvdXNab25lID0gem9uZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2VxdWVudGlhbEdyb3Vwc1tzZXF1ZW50aWFsR3JvdXBzLmxlbmd0aCAtIDFdLnNoZWx2ZXMucHVzaChzaGVsZik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgY3VycmVudFNoZWxmSW5kZXggPSAwO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBncm91cCBvZiBzZXF1ZW50aWFsR3JvdXBzKSB7XHJcbiAgICAgICAgY29uc3QgeyB6b25lLCBzaGVsdmVzOiBzaGVsdmVzSW5Hcm91cCB9ID0gZ3JvdXA7XHJcblxyXG4gICAgICAgIGNvbnN0IGdyb3VwU3RhcnRJbmRleCA9IGN1cnJlbnRTaGVsZkluZGV4O1xyXG4gICAgICAgIGNvbnN0IGdyb3VwTGVuZ3RoID0gc2hlbHZlc0luR3JvdXAubGVuZ3RoO1xyXG5cclxuICAgICAgICBjb25zdCBncm91cFRvcFkgPSBmaXJzdEJveFkgKyBib3hIZWlnaHQgKiAoZ3JvdXBTdGFydEluZGV4ICsgMSk7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBCb3R0b21ZID0gZ3JvdXBUb3BZICsgYm94SGVpZ2h0ICogZ3JvdXBMZW5ndGg7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2hlbHZlc0luR3JvdXAubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgIGNvbnN0IHNoZWxmRGF0YSA9IHNoZWx2ZXNJbkdyb3VwW2pdO1xyXG4gICAgICAgICAgY29uc3QgYm94WSA9IGZpcnN0Qm94WSArIGJveEhlaWdodCAqIChjdXJyZW50U2hlbGZJbmRleCArIDEpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHNoZWxmUmVjdCA9IG5ldyBmYWJyaWMuUmVjdCh7XHJcbiAgICAgICAgICAgIGxlZnQ6IG1pZFgsXHJcbiAgICAgICAgICAgIHRvcDogYm94WSxcclxuICAgICAgICAgICAgd2lkdGg6IG1pZFdpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGJveEhlaWdodCxcclxuICAgICAgICAgICAgc3Ryb2tlOiBmaXh0dXJlQ29sb3I/LnByaW1hcnlcclxuICAgICAgICAgICAgICA/IGZpeHR1cmVDb2xvcj8ucHJpbWFyeVxyXG4gICAgICAgICAgICAgIDogZml4dHVyZURhdGEuaXNzdWVcclxuICAgICAgICAgICAgICAgID8gXCIjRDkyRDIwXCJcclxuICAgICAgICAgICAgICAgIDogXCIjNTFDMUZGXCIsXHJcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAwLjI3LFxyXG4gICAgICAgICAgICBmaWxsOiBcIndoaXRlXCIsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBzaGVsdmVzLnB1c2goc2hlbGZSZWN0KTtcclxuXHJcbiAgICAgICAgICBpZiAoc2hlbGZEYXRhLnNoZWxmVHlwZSA9PT0gXCJ0cmF5XCIpIHtcclxuICAgICAgICAgICAgY29uc3QgdHJheVJvd3MgPSBzaGVsZkRhdGEudHJheVJvd3MgfHwgMDtcclxuICAgICAgICAgICAgY29uc3QgcHJvZHVjdFBlclNoZWxmID0gc2hlbGZEYXRhLnByb2R1Y3RQZXJTaGVsZiB8fCAwO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgcm93U3BhY2luZyA9IGJveEhlaWdodCAvIHRyYXlSb3dzO1xyXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5TcGFjaW5nID0gbWlkV2lkdGggLyBwcm9kdWN0UGVyU2hlbGY7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCByID0gMTsgciA8IHRyYXlSb3dzOyByKyspIHtcclxuICAgICAgICAgICAgICBjb25zdCBsaW5lWSA9IGJveFkgKyByICogcm93U3BhY2luZztcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgdHJheUxpbmUgPSBuZXcgZmFicmljLkxpbmUoXHJcbiAgICAgICAgICAgICAgICBbbWlkWCwgbGluZVksIG1pZFggKyBtaWRXaWR0aCwgbGluZVldLFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBzdHJva2U6IFwiIzk5OVwiLFxyXG4gICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMC4yLFxyXG4gICAgICAgICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgIHNoZWx2ZXMucHVzaCh0cmF5TGluZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAxOyBjIDwgcHJvZHVjdFBlclNoZWxmOyBjKyspIHtcclxuICAgICAgICAgICAgICBjb25zdCBsaW5lWCA9IG1pZFggKyBjICogY29sdW1uU3BhY2luZztcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgdmVydGljYWxMaW5lID0gbmV3IGZhYnJpYy5MaW5lKFxyXG4gICAgICAgICAgICAgICAgW2xpbmVYLCBib3hZLCBsaW5lWCwgYm94WSArIGJveEhlaWdodF0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZTogXCIjOTk5XCIsXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAwLjIsXHJcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgc2hlbHZlcy5wdXNoKHZlcnRpY2FsTGluZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjdXJyZW50U2hlbGZJbmRleCsrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBCb3R0b21MaW5lID0gbmV3IGZhYnJpYy5MaW5lKFxyXG4gICAgICAgICAgW21pZFgsIGdyb3VwQm90dG9tWSwgbWlkWCArIG1pZFdpZHRoLCBncm91cEJvdHRvbVldLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBzdHJva2U6IGZpeHR1cmVDb2xvcj8ucHJpbWFyeVxyXG4gICAgICAgICAgICAgID8gZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICAgICAgOiBmaXh0dXJlRGF0YS5pc3N1ZVxyXG4gICAgICAgICAgICAgICAgPyBcIiNEOTJEMjBcIlxyXG4gICAgICAgICAgICAgICAgOiBcIiM1MUMxRkZcIixcclxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgc2hlbHZlcy5wdXNoKGdyb3VwQm90dG9tTGluZSk7XHJcblxyXG4gICAgICAgIGlmIChmaXh0dXJlRGF0YS5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICAgIGNvbnN0IGxhYmVsUGFkZGluZyA9IDI7XHJcbiAgICAgICAgICBjb25zdCBsYWJlbFRleHQgPSBuZXcgZmFicmljLlRleHRib3goem9uZSwge1xyXG4gICAgICAgICAgICBsZWZ0OiBtaWRYICsgbWlkV2lkdGggLSBsYWJlbFBhZGRpbmcsXHJcbiAgICAgICAgICAgIHRvcDogZ3JvdXBCb3R0b21ZLFxyXG4gICAgICAgICAgICBmb250U2l6ZTogNSxcclxuICAgICAgICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICAgICAgICBmb250V2VpZ2h0OiBcIjYwMFwiLFxyXG4gICAgICAgICAgICBmaWxsOiBcIiM3MDcwNzBcIixcclxuICAgICAgICAgICAgb3JpZ2luWDogXCJyaWdodFwiLFxyXG4gICAgICAgICAgICBvcmlnaW5ZOiBcImJvdHRvbVwiLFxyXG4gICAgICAgICAgICB3aWR0aDogbWlkV2lkdGggLyAyLFxyXG4gICAgICAgICAgICB0ZXh0QWxpZ246IFwicmlnaHRcIixcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHNoZWx2ZXMucHVzaChsYWJlbFRleHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBDZW50ZXJYID0gbWlkWCArIG1pZFdpZHRoIC8gMjtcclxuICAgICAgICBjb25zdCBncm91cENlbnRlclkgPSBncm91cFRvcFkgKyAoZ3JvdXBCb3R0b21ZIC0gZ3JvdXBUb3BZKSAvIDI7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25CcmFuZHMgPSBuZXcgU2V0KCk7XHJcblxyXG4gICAgICAgIHNoZWx2ZXNJbkdyb3VwPy5mb3JFYWNoKChzaGVsZikgPT4ge1xyXG4gICAgICAgICAgc2hlbGYucHJvZHVjdEJyYW5kTmFtZT8uZm9yRWFjaCgoYnJhbmQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBzZWN0aW9uQnJhbmRzLmFkZChicmFuZCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKFsuLi5zZWN0aW9uQnJhbmRzXS5sZW5ndGgpIHtcclxuICAgICAgICAgIGNvbnN0IHRleHQgPSBbLi4uc2VjdGlvbkJyYW5kc10uam9pbihcIiArIFwiKTtcclxuICAgICAgICAgIGNvbnN0IHBhZGRpbmcgPSAyO1xyXG4gICAgICAgICAgY29uc3QgbWF4VGV4dFdpZHRoID0gbWlkV2lkdGg7XHJcbiAgICAgICAgICBjb25zdCByZWN0V2lkdGggPSBtaWRXaWR0aCAqIDAuOTtcclxuICAgICAgICAgIGNvbnN0IG1heFRleHRIZWlnaHQgPSAyMDtcclxuXHJcbiAgICAgICAgICBsZXQgZm9udFNpemUgPSA2O1xyXG4gICAgICAgICAgbGV0IHdyYXBwZWRUZXh0O1xyXG5cclxuICAgICAgICAgIGNvbnN0IGNyZWF0ZVRleHRib3ggPSAoZnM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IGZhYnJpYy5UZXh0Ym94KHRleHQsIHtcclxuICAgICAgICAgICAgICBmb250U2l6ZTogZnMsXHJcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IFwiNDAwXCIsXHJcbiAgICAgICAgICAgICAgd2lkdGg6IG1heFRleHRXaWR0aCxcclxuICAgICAgICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICAgIGZpbGw6IFwiIzEwMTgyOFwiLFxyXG4gICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGxlZnQ6IGdyb3VwQ2VudGVyWCxcclxuICAgICAgICAgICAgICB0b3A6IGdyb3VwQ2VudGVyWSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgd3JhcHBlZFRleHQgPSBjcmVhdGVUZXh0Ym94KGZvbnRTaXplKTtcclxuICAgICAgICAgICAgZm9udFNpemUgLT0gMC41O1xyXG4gICAgICAgICAgfSB3aGlsZSAod3JhcHBlZFRleHQuaGVpZ2h0ID4gbWF4VGV4dEhlaWdodCAmJiBmb250U2l6ZSA+IDIpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGZpbmFsRm9udFNpemUgPSBmb250U2l6ZSArIDAuNTtcclxuICAgICAgICAgIGNvbnN0IG1lYXN1cmVUZXh0ID0gKHN0cjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHQgPSBuZXcgZmFicmljLlRleHQoc3RyLCB7XHJcbiAgICAgICAgICAgICAgZm9udFNpemU6IGZpbmFsRm9udFNpemUsXHJcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJJbnRlclwiLFxyXG4gICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IFwiNDAwXCIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gdC53aWR0aCA/PyAwO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBpZiAobWVhc3VyZVRleHQodGV4dCkgPiBtYXhUZXh0V2lkdGgpIHtcclxuICAgICAgICAgICAgbGV0IHRydW5jYXRlZCA9IHRleHQ7XHJcbiAgICAgICAgICAgIHdoaWxlICh0cnVuY2F0ZWQubGVuZ3RoID4gMSAmJiBtZWFzdXJlVGV4dCh0cnVuY2F0ZWQgKyAnLi4uJykgPiBtYXhUZXh0V2lkdGgpIHtcclxuICAgICAgICAgICAgICB0cnVuY2F0ZWQgPSB0cnVuY2F0ZWQuc2xpY2UoMCwgLTEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHRydW5jYXRlZFdpZHRoID0gbWVhc3VyZVRleHQodHJ1bmNhdGVkICsgJy4uLicpO1xyXG4gICAgICAgICAgICB3cmFwcGVkVGV4dCA9IGNyZWF0ZVRleHRib3goZmluYWxGb250U2l6ZSk7XHJcbiAgICAgICAgICAgIHdyYXBwZWRUZXh0LnNldCh7IHRleHQ6IHRydW5jYXRlZCArICcuLi4nLCB3aWR0aDogdHJ1bmNhdGVkV2lkdGggfSk7XHJcbiAgICAgICAgICAgIHdyYXBwZWRUZXh0LmluaXREaW1lbnNpb25zKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgcmVjdEhlaWdodCA9IHdyYXBwZWRUZXh0LmdldFNjYWxlZEhlaWdodCgpICsgcGFkZGluZztcclxuXHJcbiAgICAgICAgICBjb25zdCBncm91cENlbnRlclRleHQgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICAgICAgICBsZWZ0OiBncm91cENlbnRlclgsXHJcbiAgICAgICAgICAgIHRvcDogZ3JvdXBDZW50ZXJZLFxyXG4gICAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICB3aWR0aDogcmVjdFdpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IHJlY3RIZWlnaHQsXHJcbiAgICAgICAgICAgIGZpbGw6IFwicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpXCIsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcng6IDEsXHJcbiAgICAgICAgICAgIHJ5OiAxLFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgc2hlbHZlcy5wdXNoKGdyb3VwQ2VudGVyVGV4dCwgd3JhcHBlZFRleHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaXh0dXJlRGF0YT8udm1Db25maWc/Lmxlbmd0aCkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpeHR1cmVEYXRhLnZtQ29uZmlnLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3Qgdm0gPSBmaXh0dXJlRGF0YS52bUNvbmZpZ1tpXTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2hlbGZDb3VudCA9IGZpeHR1cmVEYXRhPy5zaGVsZkNvbmZpZz8ubGVuZ3RoID8/IDA7XHJcbiAgICAgICAgbGV0IHN0YXJ0UG9zID0gdm0/LnN0YXJ0WVBvc2l0aW9uO1xyXG4gICAgICAgIGxldCBlbmRQb3MgPSB2bT8uZW5kWVBvc2l0aW9uO1xyXG5cclxuICAgICAgICBpZiAoIXN0YXJ0UG9zICYmICFlbmRQb3MpIHtcclxuICAgICAgICAgIGlmICh2bT8ueFpvbmUgPT09IFwic3RyZXRjaFwiICYmIHZtPy55Wm9uZSA9PT0gXCJzdHJldGNoXCIpIHtcclxuICAgICAgICAgICAgc3RhcnRQb3MgPSBzaGVsZkNvdW50O1xyXG4gICAgICAgICAgICBlbmRQb3MgPSBzaGVsZkNvdW50O1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc3RhcnRQb3MgPSAxO1xyXG4gICAgICAgICAgICBlbmRQb3MgPSBzaGVsZkNvdW50O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHN0YXJ0UG9zIC0gMTtcclxuICAgICAgICBjb25zdCBlbmRJbmRleCA9IGVuZFBvcyAtIDE7XHJcblxyXG4gICAgICAgIGlmIChzdGFydEluZGV4ID4gc2hlbGZDb3VudCB8fCBlbmRJbmRleCA+IHNoZWxmQ291bnQpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBjb25zdCBzaGVsZlRvcFkgPSBmaXJzdEJveFkgKyBib3hIZWlnaHQgKiAoc3RhcnRJbmRleCArIDEpO1xyXG4gICAgICAgIGNvbnN0IHNoZWxmSGVpZ2h0U3BhbiA9IGJveEhlaWdodCAqIChlbmRJbmRleCAtIHN0YXJ0SW5kZXggKyAxKTtcclxuXHJcbiAgICAgICAgbGV0IHZtSGVpZ2h0UHg6IG51bWJlciA9IHNoZWxmSGVpZ2h0U3BhbjtcclxuICAgICAgICBsZXQgeTogbnVtYmVyID0gc2hlbGZUb3BZO1xyXG5cclxuICAgICAgICBpZiAodm0ueVpvbmUgJiYgdm0ueVpvbmUgIT09IFwic3RyZXRjaFwiKSB7XHJcbiAgICAgICAgICB2bUhlaWdodFB4ID0gc2hlbGZIZWlnaHRTcGFuIC8gMztcclxuXHJcbiAgICAgICAgICBzd2l0Y2ggKHZtLnlab25lKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ0b3BcIjpcclxuICAgICAgICAgICAgICB5ID0gc2hlbGZUb3BZO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibWlkZGxlXCI6XHJcbiAgICAgICAgICAgICAgeSA9IHNoZWxmVG9wWSArIHZtSGVpZ2h0UHg7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJib3R0b21cIjpcclxuICAgICAgICAgICAgICB5ID0gc2hlbGZUb3BZICsgMiAqIHZtSGVpZ2h0UHg7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgeSA9IHNoZWxmVG9wWTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB4ID0gbWlkWDtcclxuICAgICAgICBsZXQgd2lkdGggPSBtaWRXaWR0aDtcclxuXHJcbiAgICAgICAgaWYgKCF2bS54Wm9uZSB8fCB2bS54Wm9uZSA9PT0gXCJzdHJldGNoXCIpIHtcclxuICAgICAgICAgIHdpZHRoID0gbWlkV2lkdGg7XHJcbiAgICAgICAgICB4ID0gbWlkWDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3Qgc2VjdGlvbldpZHRoID0gbWlkV2lkdGggLyAzO1xyXG4gICAgICAgICAgc3dpdGNoICh2bS54Wm9uZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwibGVmdFwiOlxyXG4gICAgICAgICAgICAgIHdpZHRoID0gc2VjdGlvbldpZHRoO1xyXG4gICAgICAgICAgICAgIHggPSBtaWRYO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibWlkZGxlXCI6XHJcbiAgICAgICAgICAgICAgd2lkdGggPSBzZWN0aW9uV2lkdGg7XHJcbiAgICAgICAgICAgICAgeCA9IG1pZFggKyBzZWN0aW9uV2lkdGg7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyaWdodFwiOlxyXG4gICAgICAgICAgICAgIHdpZHRoID0gc2VjdGlvbldpZHRoO1xyXG4gICAgICAgICAgICAgIHggPSBtaWRYICsgMiAqIHNlY3Rpb25XaWR0aDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICB3aWR0aCA9IG1pZFdpZHRoO1xyXG4gICAgICAgICAgICAgIHggPSBtaWRYO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHZtLnZtSW1hZ2VVcmwpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZtSW1hZ2U6IGFueSA9IGF3YWl0IGZhYnJpYy5GYWJyaWNJbWFnZS5mcm9tVVJMKFxyXG4gICAgICAgICAgICAgIGAke3RoaXMuY2RuVXJsfSR7dm0udm1JbWFnZVVybH0/dj0ke0RhdGUubm93KCl9YCxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjcm9zc09yaWdpbjogXCJhbm9ueW1vdXNcIixcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgdm1JbWFnZS5zZXQoe1xyXG4gICAgICAgICAgICAgIGxlZnQ6IHggKyB3aWR0aCAvIDIsXHJcbiAgICAgICAgICAgICAgdG9wOiB5ICsgdm1IZWlnaHRQeCAvIDIsXHJcbiAgICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgICBvcmlnaW5ZOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICAgIHNjYWxlWDogd2lkdGggLyB2bUltYWdlLndpZHRoISxcclxuICAgICAgICAgICAgICBzY2FsZVk6IHZtSGVpZ2h0UHggLyB2bUltYWdlLmhlaWdodCEsXHJcbiAgICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgc2hlbHZlcy5wdXNoKHZtSW1hZ2UpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGxvYWRpbmcgaW1hZ2UgZm9yIFZNOiAke3ZtLnZtSW1hZ2VVcmx9YCwgZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3Qgdm1Cb3ggPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICAgICAgICBsZWZ0OiB4LFxyXG4gICAgICAgICAgICB0b3A6IHksXHJcbiAgICAgICAgICAgIHdpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IHZtSGVpZ2h0UHgsXHJcbiAgICAgICAgICAgIGZpbGw6IGZpeHR1cmVDb2xvcj8udm1GaWxsID8/IFwiIzY5MzhFRlwiLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBsZXQgZm9udFNpemUgPSA1O1xyXG4gICAgICAgICAgbGV0IHZtVGV4dDtcclxuXHJcbiAgICAgICAgICBjb25zdCBjcmVhdGVWbVRleHQgPSAoZnM6IG51bWJlcikgPT5cclxuICAgICAgICAgICAgbmV3IGZhYnJpYy5UZXh0Ym94KHZtLnZtTmFtZSB8fCBcIlwiLCB7XHJcbiAgICAgICAgICAgICAgbGVmdDogeCArIHdpZHRoIC8gMixcclxuICAgICAgICAgICAgICB0b3A6IHkgKyB2bUhlaWdodFB4IC8gMixcclxuICAgICAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgZm9udFNpemU6IGZzLFxyXG4gICAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgICAgICAgICBmb250V2VpZ2h0OiBcIjYwMFwiLFxyXG4gICAgICAgICAgICAgIGZpbGw6IFwid2hpdGVcIixcclxuICAgICAgICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgIHZtVGV4dCA9IGNyZWF0ZVZtVGV4dChmb250U2l6ZSk7XHJcbiAgICAgICAgICAgIGZvbnRTaXplIC09IDAuNTtcclxuICAgICAgICAgIH0gd2hpbGUgKHZtVGV4dC5oZWlnaHQgPiB2bUhlaWdodFB4ICYmIGZvbnRTaXplID4gMik7XHJcblxyXG4gICAgICAgICAgc2hlbHZlcy5wdXNoKHZtQm94LCB2bVRleHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGxhc3RCb3hZID0gZmlyc3RCb3hZICsgYm94SGVpZ2h0ICogKHNoZWxmQ291bnQgKyAxKTtcclxuICAgIGNvbnN0IGxhc3RCb3ggPSBuZXcgZmFicmljLlBhdGgoXHJcbiAgICAgIGBNICR7bWlkWH0gJHtsYXN0Qm94WX0gXHJcbiAgICAgICAgTCAke21pZFggKyBtaWRXaWR0aH0gJHtsYXN0Qm94WX0gXHJcbiAgICAgICAgTCAke21pZFggKyBtaWRXaWR0aH0gJHtsYXN0Qm94WSArIGJveEhlaWdodCAtIHJhZGl1c30gXHJcbiAgICAgICAgUSAke21pZFggKyBtaWRXaWR0aH0gJHtsYXN0Qm94WSArIGJveEhlaWdodH0gJHtcclxuICAgICAgICAgIG1pZFggKyBtaWRXaWR0aCAtIHJhZGl1c1xyXG4gICAgICAgIH0gJHtsYXN0Qm94WSArIGJveEhlaWdodH0gXHJcbiAgICAgICAgTCAke21pZFggKyByYWRpdXN9ICR7bGFzdEJveFkgKyBib3hIZWlnaHR9IFxyXG4gICAgICAgIFEgJHttaWRYfSAke2xhc3RCb3hZICsgYm94SGVpZ2h0fSAke21pZFh9ICR7XHJcbiAgICAgICAgICBsYXN0Qm94WSArIGJveEhlaWdodCAtIHJhZGl1c1xyXG4gICAgICAgIH0gXHJcbiAgICAgICAgTCAke21pZFh9ICR7bGFzdEJveFl9IFpgLFxyXG4gICAgICB7XHJcbiAgICAgICAgZmlsbDogZml4dHVyZUNvbG9yPy5maWxsXHJcbiAgICAgICAgICA/IGZpeHR1cmVDb2xvcj8uZmlsbFxyXG4gICAgICAgICAgOiBmaXh0dXJlRGF0YS5pc3N1ZVxyXG4gICAgICAgICAgICA/IFwiI0ZFRTRFMlwiXHJcbiAgICAgICAgICAgIDogXCIjRUFGOEZGXCIsXHJcbiAgICAgICAgc3Ryb2tlOiBmaXh0dXJlQ29sb3I/LnByaW1hcnlcclxuICAgICAgICAgID8gZml4dHVyZUNvbG9yPy5wcmltYXJ5XHJcbiAgICAgICAgICA6IGZpeHR1cmVEYXRhLmlzc3VlXHJcbiAgICAgICAgICAgID8gXCIjRDkyRDIwXCJcclxuICAgICAgICAgICAgOiBcIiM2QkNBRkZcIixcclxuICAgICAgICBzdHJva2VXaWR0aDogMC4yNyxcclxuICAgICAgfSxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgbGFzdEJveFRleHQgPSBuZXcgZmFicmljLlRleHRib3goXHJcbiAgICAgIGAke2ZpeHR1cmVEYXRhPy5mb290ZXI/LmxhYmVsID8gZml4dHVyZURhdGEuZm9vdGVyLmxhYmVsIDogXCJcIn1gLFxyXG4gICAgICB7XHJcbiAgICAgICAgbGVmdDogbWlkWCArIG1pZFdpZHRoIC8gMixcclxuICAgICAgICB0b3A6IGxhc3RCb3hZICsgYm94SGVpZ2h0IC8gMixcclxuICAgICAgICBmb250U2l6ZTogNSxcclxuICAgICAgICBmb250RmFtaWx5OiBcIkludGVyXCIsXHJcbiAgICAgICAgZm9udFdlaWdodDogXCI2MDBcIixcclxuICAgICAgICBmaWxsOiBcIiMxMDE4MjhcIixcclxuICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxyXG4gICAgICAgIHdpZHRoOiBtaWRXaWR0aCxcclxuICAgICAgICBoZWlndGg6IGJveEhlaWdodCxcclxuICAgICAgfSxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgYm90dG9tV2lkdGggPSB3aWR0aCAvIDEuMDU7XHJcbiAgICBjb25zdCBib3R0b21IZWlnaHQgPSAoMyAvIDEwMCkgKiBoZWlnaHQ7XHJcbiAgICBjb25zdCBib3R0b21YID0geCArICh3aWR0aCAtIGJvdHRvbVdpZHRoKSAvIDI7XHJcbiAgICBjb25zdCBib3R0b21ZID0gbWlkWSArIG1pZEhlaWdodCArIHRoaXMudmVydGljYWxNYXJnaW47XHJcblxyXG4gICAgY29uc3QgYm90dG9tQ29udGFpbmVyID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgbGVmdDogYm90dG9tWCxcclxuICAgICAgdG9wOiBib3R0b21ZLFxyXG4gICAgICB3aWR0aDogYm90dG9tV2lkdGgsXHJcbiAgICAgIGhlaWdodDogYm90dG9tSGVpZ2h0LFxyXG4gICAgICByeDogcmFkaXVzLFxyXG4gICAgICByeTogcmFkaXVzLFxyXG4gICAgICBzdHJva2U6IFwidHJhbnNwYXJlbnRcIixcclxuICAgICAgZmlsbDogXCJ0cmFuc3BhcmVudFwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgYm90dG9tVGV4dENvbnRlbnQgPSBuZXcgZmFicmljLlRleHRib3goXHJcbiAgICAgIGBTaGVsdmVzIC0gJHthY3R1YWxTaGVsdmVzLmxlbmd0aH0gLiBQcm9kdWN0cyAtICAke1xyXG4gICAgICAgIGZpeHR1cmVEYXRhPy5maXh0dXJlQ2FwYWNpdHkgPz8gMFxyXG4gICAgICB9IC4gVk0gLSAke2ZpeHR1cmVEYXRhPy52bUNvbmZpZz8ubGVuZ3RoID8/IDB9YCxcclxuICAgICAge1xyXG4gICAgICAgIGxlZnQ6IGJvdHRvbVggKyBib3R0b21XaWR0aCAvIDIsXHJcbiAgICAgICAgdG9wOiBib3R0b21ZICsgYm90dG9tSGVpZ2h0IC8gMixcclxuICAgICAgICBmb250U2l6ZTogNSxcclxuICAgICAgICBmb250RmFtaWx5OiBcIkludGVyXCIsXHJcbiAgICAgICAgZm9udFdlaWdodDogXCI1MDBcIixcclxuICAgICAgICBmaWxsOiBcIiMzMzNcIixcclxuICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxyXG4gICAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxyXG4gICAgICAgIHdpZHRoOiBib3R0b21XaWR0aCxcclxuICAgICAgICBoZWlnaHQ6IGJvdHRvbUhlaWdodCxcclxuICAgICAgfSxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3Qgc3ZnU3RyaW5nID0gYFxyXG4gICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgPHJlY3Qgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgcng9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiLz5cclxuICAgICAgPHBhdGggZD1cIk0xNC45OTk4IDYuNjAwMDFDMTUuMTU3NCA2LjQ0MjQzIDE1LjM0NDUgNi4zMTc0MiAxNS41NTA0IDYuMjMyMTRDMTUuNzU2MyA2LjE0Njg1IDE1Ljk3NyA2LjEwMjk2IDE2LjE5OTggNi4xMDI5NkMxNi40MjI3IDYuMTAyOTYgMTYuNjQzNCA2LjE0Njg1IDE2Ljg0OTIgNi4yMzIxNEMxNy4wNTUxIDYuMzE3NDIgMTcuMjQyMiA2LjQ0MjQzIDE3LjM5OTggNi42MDAwMUMxNy41NTc0IDYuNzU3NiAxNy42ODI0IDYuOTQ0NjggMTcuNzY3NyA3LjE1MDU4QzE3Ljg1MyA3LjM1NjQ4IDE3Ljg5NjkgNy41NzcxNSAxNy44OTY5IDcuODAwMDFDMTcuODk2OSA4LjAyMjg4IDE3Ljg1MyA4LjI0MzU1IDE3Ljc2NzcgOC40NDk0NUMxNy42ODI0IDguNjU1MzUgMTcuNTU3NCA4Ljg0MjQzIDE3LjM5OTggOS4wMDAwMUw5LjI5OTgyIDE3LjFMNS45OTk4MiAxOEw2Ljg5OTgyIDE0LjdMMTQuOTk5OCA2LjYwMDAxWlwiIHN0cm9rZT1cIiMxRDI5MzlcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgIDwvc3ZnPmA7XHJcblxyXG4gICAgbGV0IGxvYWRlZFNWRzogYW55ID0gYXdhaXQgZmFicmljLmxvYWRTVkdGcm9tU3RyaW5nKHN2Z1N0cmluZyk7XHJcblxyXG4gICAgbGV0IGVkaXRTdmcgPSBmYWJyaWMudXRpbC5ncm91cFNWR0VsZW1lbnRzKFxyXG4gICAgICBsb2FkZWRTVkcub2JqZWN0cyxcclxuICAgICAgbG9hZGVkU1ZHLm9wdGlvbnMsXHJcbiAgICApO1xyXG5cclxuICAgIGVkaXRTdmcuc2V0KHtcclxuICAgICAgc2NhbGVYOiAxLFxyXG4gICAgICBzY2FsZVk6IDEsXHJcbiAgICAgIGxlZnQ6IHggKyB3aWR0aCAtIDMwLFxyXG4gICAgICB0b3A6IHkgKyAxNCxcclxuICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICBldmVudGVkOiB0cnVlLCAvLyBhbGxvdyBldmVudHNcclxuICAgICAgaG92ZXJDdXJzb3I6IFwicG9pbnRlclwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgZWRpdFN2Zy5vbihcIm1vdXNlZG93blwiLCAob3B0KSA9PiB7XHJcbiAgICAgIGlmIChvcHQgJiYgb3B0LmUgJiYgb3B0LmUuc3RvcFByb3BhZ2F0aW9uKSB7XHJcbiAgICAgICAgb3B0LmUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKHRoaXMuaGFzVW5zYXZlZExheW91dENoYW5nZXMoKSkge1xyXG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICBcIlNhdmUgeW91ciBsYXlvdXQgY2hhbmdlcyBiZWZvcmUgZWRpdGluZyB0aGUgZml4dHVyZVwiLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZSA9IHtcclxuICAgICAgICBmaXh0dXJlVHlwZTogZml4dHVyZURhdGEuZml4dHVyZVR5cGUsXHJcbiAgICAgICAgd2FsbEluZGV4OiBmaXh0dXJlRGF0YS5hc3NvY2lhdGVkRWxlbWVudE51bWJlcixcclxuICAgICAgICBmaXh0dXJlSW5kZXg6IGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcixcclxuICAgICAgICBmaXh0dXJlSWQ6IGZpeHR1cmVEYXRhLl9pZCxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkRml4dHVyZS5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICBjb25zdCB3YWxsID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5maW5kKFxyXG4gICAgICAgICAgKHdhbGw6IGFueSkgPT4gd2FsbC5lbGVtZW50TnVtYmVyID09PSB0aGlzLnNlbGVjdGVkRml4dHVyZS53YWxsSW5kZXgsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgZml4dHVyZSA9IHdhbGwuZml4dHVyZXMuZmluZChcclxuICAgICAgICAgIChmaXh0dXJlOiBhbnkpID0+IGZpeHR1cmUuX2lkID09PSB0aGlzLnNlbGVjdGVkRml4dHVyZS5maXh0dXJlSWQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGEgPSBzdHJ1Y3R1cmVkQ2xvbmUoZml4dHVyZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEZpeHR1cmUuZml4dHVyZVR5cGUgPT09IFwiZmxvb3JcIikge1xyXG4gICAgICAgIGNvbnN0IGZpeHR1cmUgPSB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlLmZpbmQoXHJcbiAgICAgICAgICAoZml4dHVyZTogYW55KSA9PiBmaXh0dXJlLl9pZCA9PT0gdGhpcy5zZWxlY3RlZEZpeHR1cmUuZml4dHVyZUlkLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhID0gc3RydWN0dXJlZENsb25lKGZpeHR1cmUpO1xyXG4gICAgICB9XHJcbiAgICAgIGRlbGV0ZSB0aGlzPy5zZWxlY3RlZEZpeHR1cmVEYXRhPy50YXNrVHlwZTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmUuZml4dHVyZURhdGEgPSB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGE7XHJcbiAgICAgIHRoaXMuZWRpdEZpeHR1cmUgPSB0cnVlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZml4dHVyZUdyb3VwID0gbmV3IGZhYnJpYy5Hcm91cChcclxuICAgICAgW1xyXG4gICAgICAgIG1haW5Db250YWluZXIsXHJcbiAgICAgICAgdG9wQ29udGFpbmVyLFxyXG4gICAgICAgIGlubmVyVG9wQm94LFxyXG4gICAgICAgIHRvcFRleHQsXHJcbiAgICAgICAgaW5uZXJCb3R0b21Cb3gsXHJcbiAgICAgICAgYm90dG9tVGV4dCxcclxuICAgICAgICBtaWRDb250YWluZXIsXHJcbiAgICAgICAgZmlyc3RCb3gsXHJcbiAgICAgICAgZmlyc3RCb3hUZXh0LFxyXG4gICAgICAgIC4uLnNoZWx2ZXMsXHJcbiAgICAgICAgbGFzdEJveCxcclxuICAgICAgICBsYXN0Qm94VGV4dCxcclxuICAgICAgICBib3R0b21Db250YWluZXIsXHJcbiAgICAgICAgYm90dG9tVGV4dENvbnRlbnQsXHJcbiAgICAgICAgZWRpdFN2ZyxcclxuICAgICAgXSxcclxuICAgICAge1xyXG4gICAgICAgIGxlZnQ6IHJlbmRlclgsXHJcbiAgICAgICAgdG9wOiByZW5kZXJZLFxyXG4gICAgICAgIGV2ZW50ZWQ6IHRydWUsXHJcbiAgICAgICAgaG92ZXJDdXJzb3I6IFwicG9pbnRlclwiLFxyXG4gICAgICAgIHNlbGVjdGFibGU6IHRoaXMubGF5b3V0Rm9ybS5lbmFibGVkLFxyXG4gICAgICAgIGxvY2tTY2FsaW5nWDogdHJ1ZSxcclxuICAgICAgICBsb2NrU2NhbGluZ1k6IHRydWUsXHJcbiAgICAgICAgc3ViVGFyZ2V0Q2hlY2s6IHRydWUsXHJcbiAgICAgICAgYW5nbGU6IHJlbmRlckFuZ2xlLFxyXG4gICAgICB9LFxyXG4gICAgKSBhcyBmYWJyaWMuR3JvdXAgJiB7XHJcbiAgICAgIHdhbGxJbmRleDogbnVtYmVyO1xyXG4gICAgICBmaXh0dXJlSW5kZXg6IG51bWJlcjtcclxuICAgICAgZml4dHVyZUlkOiBzdHJpbmc7XHJcbiAgICAgIGZpeHR1cmVUeXBlOiBcIndhbGxcIiB8IFwiZmxvb3JcIjtcclxuICAgICAgaXNzdWU6IGJvb2xlYW47XHJcbiAgICAgIGlzc3VlRGF0YTogYW55O1xyXG4gICAgICB0YXNrVHlwZTogc3RyaW5nO1xyXG4gICAgICB2bUNvbmZpZzogW107XHJcbiAgICAgIG9ialR5cGU6IHN0cmluZztcclxuICAgIH07XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAhZml4dHVyZURhdGE/Lmlzc3VlICYmXHJcbiAgICAgICFmaXh0dXJlRGF0YT8udW5zYXZlZENoYW5nZXMgJiZcclxuICAgICAgdGhpcy5sYXlvdXRGb3JtLmVuYWJsZWRcclxuICAgICkge1xyXG4gICAgICBmaXh0dXJlR3JvdXAub24oXCJtb3VzZW92ZXJcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGVkaXRTdmcuc2V0KFwidmlzaWJsZVwiLCB0cnVlKTtcclxuICAgICAgICBjYW52YXMucmVuZGVyQWxsKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBmaXh0dXJlR3JvdXAub24oXCJtb3VzZW91dFwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZWRpdFN2Zy5zZXQoXCJ2aXNpYmxlXCIsIGZhbHNlKTtcclxuICAgICAgICBjYW52YXMucmVuZGVyQWxsKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZpeHR1cmVHcm91cC5vbihcIm1vdXNlZG93blwiLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XHJcbiAgICAgIGlmICh0aGlzLmxheW91dEZvcm0uZGlzYWJsZWQpIHtcclxuICAgICAgICB0aGlzLnRvZ2dsZVBhbmVsKFwicmlnaHRcIiwgZmFsc2UpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0Rml4dHVyZUluQWNjb3JkaW9uKGZpeHR1cmVEYXRhKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5oaWdobGlnaHRGaXh0dXJlKHRhcmdldCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0Rml4dHVyZU9uQ2FudmFzQ2xpY2sodGFyZ2V0LCB0cnVlKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmUuZml4dHVyZURhdGEgPSBmaXh0dXJlRGF0YTtcclxuICAgIH0pO1xyXG5cclxuICAgIGZpeHR1cmVHcm91cC5maXh0dXJlVHlwZSA9IGZpeHR1cmVEYXRhLmZpeHR1cmVUeXBlO1xyXG4gICAgZml4dHVyZUdyb3VwLndhbGxJbmRleCA9IGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50TnVtYmVyO1xyXG4gICAgZml4dHVyZUdyb3VwLmZpeHR1cmVJbmRleCA9IGZpeHR1cmVEYXRhLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcjtcclxuICAgIGZpeHR1cmVHcm91cC5maXh0dXJlSWQgPSBmaXh0dXJlRGF0YS5faWQ7XHJcbiAgICBmaXh0dXJlR3JvdXAuaXNzdWUgPSBmaXh0dXJlRGF0YS5pc3N1ZTtcclxuICAgIGZpeHR1cmVHcm91cC5pc3N1ZURhdGEgPSBmaXh0dXJlRGF0YS5pc3N1ZURhdGE7XHJcbiAgICBmaXh0dXJlR3JvdXAudGFza1R5cGUgPSBmaXh0dXJlRGF0YS50YXNrVHlwZTtcclxuICAgIGZpeHR1cmVHcm91cC52bUNvbmZpZyA9IGZpeHR1cmVEYXRhLnZtQ29uZmlnO1xyXG4gICAgZml4dHVyZUdyb3VwLm9ialR5cGUgPSBcImZpeHR1cmVcIjtcclxuXHJcbiAgICAvLyB0aGlzLmNhbnZhcy5vbihcIm9iamVjdDptb3ZpbmdcIiwgKGUpID0+IHtcclxuICAgIC8vICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgYW55O1xyXG4gICAgLy8gICBpZiAoIXRhcmdldCB8fCB0YXJnZXQub2JqVHlwZSAhPT0gXCJmaXh0dXJlXCIpIHJldHVybjtcclxuXHJcbiAgICAvLyAgIGNvbnN0IGFuZ2xlRGVnID0gdGFyZ2V0LmFuZ2xlIHx8IDA7XHJcbiAgICAvLyAgIGNvbnN0IGFuZ2xlID0gKGFuZ2xlRGVnICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICAvLyAgIGlmICghdGFyZ2V0Ll9sYXN0TGVmdCkge1xyXG4gICAgLy8gICAgIHRhcmdldC5fbGFzdExlZnQgPSB0YXJnZXQubGVmdDtcclxuICAgIC8vICAgICB0YXJnZXQuX2xhc3RUb3AgPSB0YXJnZXQudG9wO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIGNvbnN0IGR4ID0gdGFyZ2V0LmxlZnQgLSB0YXJnZXQuX2xhc3RMZWZ0O1xyXG4gICAgLy8gICBjb25zdCBkeSA9IHRhcmdldC50b3AgLSB0YXJnZXQuX2xhc3RUb3A7XHJcbiAgICAvLyAgIGNvbnN0IHByb2plY3RlZCA9IGR4ICogTWF0aC5jb3MoYW5nbGUpICsgZHkgKiBNYXRoLnNpbihhbmdsZSk7XHJcbiAgICAvLyAgIHRhcmdldC5sZWZ0ID0gdGFyZ2V0Ll9sYXN0TGVmdCArIHByb2plY3RlZCAqIE1hdGguY29zKGFuZ2xlKTtcclxuICAgIC8vICAgdGFyZ2V0LnRvcCA9IHRhcmdldC5fbGFzdFRvcCArIHByb2plY3RlZCAqIE1hdGguc2luKGFuZ2xlKTtcclxuICAgIC8vICAgdGFyZ2V0Ll9sYXN0TGVmdCA9IHRhcmdldC5sZWZ0O1xyXG4gICAgLy8gICB0YXJnZXQuX2xhc3RUb3AgPSB0YXJnZXQudG9wO1xyXG4gICAgLy8gfSk7XHJcblxyXG4gICAgY2FudmFzLmFkZChmaXh0dXJlR3JvdXApO1xyXG5cclxuICAgIC8vIElmIG5ld2x5IGFkZGVkLCBmb2N1cyBpdCBvbmNlXHJcbiAgICBpZiAoKGZpeHR1cmVEYXRhIGFzIGFueSk/Lm5ld0FkZGVkKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5jYW52YXMuc2V0QWN0aXZlT2JqZWN0KGZpeHR1cmVHcm91cCk7XHJcbiAgICAgICAgdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gICAgICB9IGNhdGNoIHt9XHJcbiAgICAgIGRlbGV0ZSAoZml4dHVyZURhdGEgYXMgYW55KS5uZXdBZGRlZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZml4dHVyZUdyb3VwO1xyXG4gIH1cclxuXHJcbiAgZHJhd0VudHJhbmNlKFxyXG4gICAgY2FudmFzOiBmYWJyaWMuQ2FudmFzLFxyXG4gICAgeDogbnVtYmVyLFxyXG4gICAgeTogbnVtYmVyLFxyXG4gICAgd2lkdGg6IG51bWJlcixcclxuICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgYXJyb3dXaWR0aDogbnVtYmVyLFxyXG4gICAgZWxlbWVudERhdGE6IGFueSxcclxuICApIHtcclxuICAgIGNvbnN0IGJvZHlXaWR0aCA9IHdpZHRoIC0gYXJyb3dXaWR0aDtcclxuICAgIGNvbnN0IGFuZ2xlID0gdGhpcy5mbG9vckRhdGE/LmNhZExheW91dCA/IDAgOiBlbGVtZW50RGF0YS5hbmdsZTtcclxuXHJcbiAgICBjb25zdCBwYXRoRGF0YSA9IFtcclxuICAgICAgYE0gMCAwYCxcclxuICAgICAgYEwgJHtib2R5V2lkdGh9IDBgLFxyXG4gICAgICBgTCAke2JvZHlXaWR0aH0gJHstaGVpZ2h0IC8gMn1gLFxyXG4gICAgICBgTCAke3dpZHRofSAke2hlaWdodCAvIDJ9YCxcclxuICAgICAgYEwgJHtib2R5V2lkdGh9ICR7aGVpZ2h0ICsgaGVpZ2h0IC8gMn1gLFxyXG4gICAgICBgTCAke2JvZHlXaWR0aH0gJHtoZWlnaHR9YCxcclxuICAgICAgYEwgMCAke2hlaWdodH1gLFxyXG4gICAgICBgWmAsXHJcbiAgICBdLmpvaW4oXCIgXCIpO1xyXG5cclxuICAgIGNvbnN0IGFycm93ID0gbmV3IGZhYnJpYy5QYXRoKHBhdGhEYXRhLCB7XHJcbiAgICAgIGZpbGw6IFwiIzAzQTlGNFwiLFxyXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBtYXhUZXh0SGVpZ2h0ID0gaGVpZ2h0IC0gNjtcclxuICAgIGNvbnN0IHRleHQgPSBuZXcgZmFicmljLlRleHQoXCJFbnRyYW5jZVwiLCB7XHJcbiAgICAgIGZvbnRGYW1pbHk6IFwiQXJpYWxcIixcclxuICAgICAgZm9udFdlaWdodDogXCJib2xkXCIsXHJcbiAgICAgIGZpbGw6IFwid2hpdGVcIixcclxuICAgICAgYW5nbGU6IC05MCxcclxuICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgbGVmdDogMTUsXHJcbiAgICAgIHRvcDogaGVpZ2h0IC8gMixcclxuICAgICAgZm9udFNpemU6IDIwLFxyXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0ZXh0Qm91bmRzID0gdGV4dC5nZXRCb3VuZGluZ1JlY3QoKTtcclxuICAgIGlmICh0ZXh0Qm91bmRzLmhlaWdodCA+IG1heFRleHRIZWlnaHQpIHtcclxuICAgICAgY29uc3Qgc2NhbGUgPSBtYXhUZXh0SGVpZ2h0IC8gdGV4dEJvdW5kcy5oZWlnaHQ7XHJcbiAgICAgIHRleHQuc2V0KFwiZm9udFNpemVcIiwgdGV4dC5mb250U2l6ZSEgKiBzY2FsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZ3JvdXAgPSBuZXcgZmFicmljLkdyb3VwKFthcnJvdywgdGV4dF0sIHtcclxuICAgICAgbGVmdDogeCxcclxuICAgICAgdG9wOiB5LFxyXG4gICAgICBzZWxlY3RhYmxlOiB0aGlzLmxheW91dEZvcm0uZW5hYmxlZCxcclxuICAgICAgbG9ja1NjYWxpbmdYOiB0cnVlLFxyXG4gICAgICBsb2NrU2NhbGluZ1k6IHRydWUsXHJcbiAgICAgIGxvY2tTY2FsaW5nRmxpcDogdHJ1ZSxcclxuICAgICAgYW5nbGU6IGFuZ2xlLFxyXG4gICAgfSkgYXMgZmFicmljLkdyb3VwICYge1xyXG4gICAgICBvYmpUeXBlOiBzdHJpbmc7XHJcbiAgICAgIGRhdGE6IGFueTtcclxuICAgIH07XHJcblxyXG4gICAgZ3JvdXAub2JqVHlwZSA9IGVsZW1lbnREYXRhLmVsZW1lbnRUeXBlO1xyXG4gICAgZ3JvdXAuZGF0YSA9IGVsZW1lbnREYXRhO1xyXG5cclxuICAgIGNhbnZhcy5hZGQoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgZHJhd090aGVyRWxlbWVudHNXaXRoTGFiZWwoXHJcbiAgICBjYW52YXM6IGZhYnJpYy5DYW52YXMsXHJcbiAgICB4OiBudW1iZXIsXHJcbiAgICB5OiBudW1iZXIsXHJcbiAgICBhOiBudW1iZXIsXHJcbiAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICBlbGVtZW50OiBhbnksXHJcbiAgKTogZmFicmljLkdyb3VwIHtcclxuICAgIGNvbnN0IHJlY3QgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICB3aWR0aCxcclxuICAgICAgaGVpZ2h0LFxyXG4gICAgICByeDogMixcclxuICAgICAgcnk6IDIsXHJcbiAgICAgIGZpbGw6IFwiI0RBRjFGRlwiLFxyXG4gICAgICBzdHJva2U6IFwiIzZCQ0FGRlwiLFxyXG4gICAgICBzdHJva2VXaWR0aDogMixcclxuICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHRleHQgPSBuZXcgZmFicmljLlRleHRib3goZWxlbWVudC5maXh0dXJlTmFtZSwge1xyXG4gICAgICB3aWR0aDogd2lkdGggLSA4LFxyXG4gICAgICBmb250U2l6ZTogMTQsXHJcbiAgICAgIGZvbnRGYW1pbHk6IFwiSW50ZXJcIixcclxuICAgICAgZm9udFdlaWdodDogXCI1MDBcIixcclxuICAgICAgZmlsbDogXCIjMTAxODI4XCIsXHJcbiAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXHJcbiAgICAgIG9yaWdpblk6IFwiY2VudGVyXCIsXHJcbiAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcclxuICAgICAgZWRpdGFibGU6IGZhbHNlLFxyXG4gICAgICBzcGxpdEJ5R3JhcGhlbWU6IHRydWUsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0ZXh0Qm91bmRzID0gdGV4dC5nZXRCb3VuZGluZ1JlY3QoKTtcclxuXHJcbiAgICBpZiAodGV4dEJvdW5kcy5oZWlnaHQgPiBoZWlnaHQgLSA4KSB7XHJcbiAgICAgIGNvbnN0IHNjYWxlID0gKGhlaWdodCAtIDgpIC8gdGV4dEJvdW5kcy5oZWlnaHQ7XHJcbiAgICAgIHRleHQuc2V0KFwiZm9udFNpemVcIiwgdGV4dC5mb250U2l6ZSEgKiBzY2FsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZ3JvdXAgPSBuZXcgZmFicmljLkdyb3VwKFtyZWN0LCB0ZXh0XSwge1xyXG4gICAgICBsZWZ0OiB4LFxyXG4gICAgICB0b3A6IHksXHJcbiAgICAgIGFuZ2xlOiBhLFxyXG4gICAgICBzZWxlY3RhYmxlOiB0aGlzLmxheW91dEZvcm0uZW5hYmxlZCxcclxuICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgIH0pIGFzIGZhYnJpYy5Hcm91cCAmIHtcclxuICAgICAgb2JqVHlwZTogc3RyaW5nO1xyXG4gICAgICBkYXRhOiBhbnk7XHJcbiAgICB9O1xyXG5cclxuICAgIGdyb3VwLm9ialR5cGUgPSBcIm90aGVyc1wiO1xyXG4gICAgZ3JvdXAuZGF0YSA9IGVsZW1lbnQ7XHJcblxyXG4gICAgY2FudmFzLmFkZChncm91cCk7XHJcblxyXG4gICAgaWYgKChlbGVtZW50IGFzIGFueSk/Lm5ld0FkZGVkKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5jYW52YXMuc2V0QWN0aXZlT2JqZWN0KGdyb3VwKTtcclxuICAgICAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgICAgIH0gY2F0Y2gge31cclxuICAgICAgZGVsZXRlIChlbGVtZW50IGFzIGFueSkubmV3QWRkZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGdyb3VwO1xyXG4gIH1cclxuXHJcbiAgZHJhd0JnKCkge1xyXG4gICAgY29uc3Qgd2FsbDEgPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZpbmQoXHJcbiAgICAgIChlOiBhbnkpID0+IGUuZWxlbWVudE51bWJlciA9PT0gMSAmJiBlLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIixcclxuICAgICk7XHJcbiAgICBjb25zdCB3YWxsMiA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZmluZChcclxuICAgICAgKGU6IGFueSkgPT4gZS5lbGVtZW50TnVtYmVyID09PSAyICYmIGUuZWxlbWVudFR5cGUgPT09IFwid2FsbFwiLFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHdpZHRoID0gdGhpcy50b1BpeGVscyh3YWxsMS5kaXN0YW5jZSwgd2FsbDEudW5pdCk7XHJcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnRvUGl4ZWxzKHdhbGwyLmRpc3RhbmNlLCB3YWxsMi51bml0KTtcclxuXHJcbiAgICBjb25zdCBiZyA9IG5ldyBmYWJyaWMuUmVjdCh7XHJcbiAgICAgIGxlZnQ6IHRoaXMud2FsbFRoaWNrbmVzcyxcclxuICAgICAgdG9wOiB0aGlzLndhbGxUaGlja25lc3MsXHJcbiAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXHJcbiAgICAgIGZpbGw6IFwiI2VhZWNmMFwiLFxyXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgZXZlbnRlZDogZmFsc2UsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbnZhcy5hZGQoYmcpO1xyXG4gICAgdGhpcy5jYW52YXMucmVtb3ZlKGJnKTtcclxuICAgIHRoaXMuY2FudmFzLmluc2VydEF0KDAsIGJnKTtcclxuICAgIHRoaXMuY2FudmFzLnJlbmRlckFsbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gZ2V0Rml4dHVyZU1ldGFUb1JlbmRlcihmaXh0dXJlOiBhbnksIHdhbGxEYXRhOiBhbnkpIHtcclxuXHJcbiAgLy8gICByZXR1cm4ge1xyXG4gIC8vICAgICB4LFxyXG4gIC8vICAgICB5LFxyXG4gIC8vICAgICBmaXh0dXJlSGVpZ2h0LFxyXG4gIC8vICAgICBmaXh0dXJlV2lkdGgsXHJcbiAgLy8gICB9O1xyXG4gIC8vIH1cclxuXHJcbiAgc3Vic2NyaWJlVG9GaXh0dXJlQ29uZmlnSWRDaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5maXh0dXJlQ29uZmlnU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWIpID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcclxuICAgIHRoaXMuZml4dHVyZUNvbmZpZ1N1YnNjcmlwdGlvbnMgPSBbXTtcclxuXHJcbiAgICB0aGlzLmdldEZvcm1XYWxscy5jb250cm9scy5mb3JFYWNoKChjb250cm9sLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IHdhbGxHcm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xyXG4gICAgICBjb25zdCBmaXh0dXJlc0FycmF5ID0gd2FsbEdyb3VwLmdldChcImZpeHR1cmVzXCIpIGFzIEZvcm1BcnJheTtcclxuXHJcbiAgICAgIGZpeHR1cmVzQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoZml4dHVyZUNvbnRyb2wsIGopID0+IHtcclxuICAgICAgICBjb25zdCBmaXh0dXJlR3JvdXAgPSBmaXh0dXJlQ29udHJvbCBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgY29uc3Qgc3ViID0gZml4dHVyZUdyb3VwXHJcbiAgICAgICAgICAuZ2V0KFwiZml4dHVyZUNvbmZpZ0lkXCIpXHJcbiAgICAgICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKG5ld1ZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRml4dHVyZVRlbXBsYXRlKG5ld1ZhbHVlLCBcIndhbGxcIiwgaiwgaSk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHN1YikgdGhpcy5maXh0dXJlQ29uZmlnU3Vic2NyaXB0aW9ucy5wdXNoKHN1Yik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5nZXRGb3JtRmxvb3JGaXh0dXJlcy5jb250cm9scy5mb3JFYWNoKChmaXh0dXJlQ29udHJvbCwgaykgPT4ge1xyXG4gICAgICBjb25zdCBmaXh0dXJlR3JvdXAgPSBmaXh0dXJlQ29udHJvbCBhcyBGb3JtR3JvdXA7XHJcbiAgICAgIGNvbnN0IHN1YiA9IGZpeHR1cmVHcm91cFxyXG4gICAgICAgIC5nZXQoXCJmaXh0dXJlQ29uZmlnSWRcIilcclxuICAgICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChuZXdWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jaGFuZ2VGaXh0dXJlVGVtcGxhdGUobmV3VmFsdWUsIFwiZmxvb3JcIiwgayk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoc3ViKSB0aGlzLmZpeHR1cmVDb25maWdTdWJzY3JpcHRpb25zLnB1c2goc3ViKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3Vic2NyaWJlVG9PdGhlckVsZW1lbnRzQ2hhbmdlcygpIHtcclxuICAgIHRoaXMub3RoZXJFbGVtZW50c1N1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3ViKSA9PiBzdWI/LnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgdGhpcy5vdGhlckVsZW1lbnRzU3Vic2NyaXB0aW9ucyA9IFtdO1xyXG5cclxuICAgIC8vIFdhbGwtbGV2ZWwgb3RoZXJFbGVtZW50cyBsYWJlbCBzdWJzY3JpcHRpb25zXHJcbiAgICB0aGlzLmdldEZvcm1XYWxscy5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XHJcbiAgICAgIGNvbnN0IHdhbGxHcm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xyXG4gICAgICBjb25zdCBvdGhlckFycmF5ID0gd2FsbEdyb3VwLmdldChcIm90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5O1xyXG5cclxuICAgICAgb3RoZXJBcnJheS5jb250cm9scy5mb3JFYWNoKChjdHJsLCBvdGhlcklkeCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRHcm91cCA9IGN0cmwgYXMgRm9ybUdyb3VwO1xyXG4gICAgICAgIGNvbnN0IHR5cGVDb250cm9sID0gZWxlbWVudEdyb3VwLmdldChcInR5cGVcIikgYXMgRm9ybUNvbnRyb2w7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tTmFtZUNvbnRyb2wgPSBlbGVtZW50R3JvdXAuZ2V0KFwiY3VzdG9tTmFtZVwiKSBhcyBGb3JtQ29udHJvbDtcclxuXHJcbiAgICAgICAgY29uc3Qgd2FsbE1ldGEgPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZpbmQoXHJcbiAgICAgICAgICAoZWw6IGFueSkgPT5cclxuICAgICAgICAgICAgZWwuZWxlbWVudFR5cGUgPT09IHdhbGxHcm91cC5nZXQoXCJlbGVtZW50VHlwZVwiKT8udmFsdWUgJiZcclxuICAgICAgICAgICAgZWwuZWxlbWVudE51bWJlciA9PT0gd2FsbEdyb3VwLmdldChcImVsZW1lbnROdW1iZXJcIik/LnZhbHVlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudFJlZiA9IHdhbGxNZXRhPy5vdGhlckVsZW1lbnRzPy5bb3RoZXJJZHhdO1xyXG4gICAgICAgIGlmICghZWxlbWVudFJlZikgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyB3aGVuIHR5cGUgY2hhbmdlcyAoZHJvcGRvd24pXHJcbiAgICAgICAgY29uc3Qgc3ViVHlwZSA9IHR5cGVDb250cm9sLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoc2VsZWN0ZWQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAvLyBpZiB1c2VyIHBpY2tzIFwiT3RoZXJzXCIsIHByZWZlciBjdXN0b21OYW1lIGlmIHByZXNlbnQsIG90aGVyd2lzZSBzZXQgZml4dHVyZU5hbWUgdG8gXCJPdGhlcnNcIlxyXG4gICAgICAgICAgICBlbGVtZW50UmVmLmZpeHR1cmVOYW1lID1cclxuICAgICAgICAgICAgICBzZWxlY3RlZCA9PT0gXCJPdGhlcnNcIlxyXG4gICAgICAgICAgICAgICAgPyBjdXN0b21OYW1lQ29udHJvbD8udmFsdWUgfHwgXCJPdGhlcnNcIlxyXG4gICAgICAgICAgICAgICAgOiBzZWxlY3RlZDtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDYW52YXNPdGhlckVsZW1lbnRMYWJlbChlbGVtZW50UmVmKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyB3aGVuIGN1c3RvbU5hbWUgY2hhbmdlcyAodGV4dCBpbnB1dCB2aXNpYmxlIG9ubHkgd2hlbiB0eXBlID09PSAnT3RoZXJzJylcclxuICAgICAgICBjb25zdCBzdWJDdXN0b20gPSBjdXN0b21OYW1lQ29udHJvbC52YWx1ZUNoYW5nZXNcclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKGN1c3RvbTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlQ29udHJvbC52YWx1ZSA9PT0gXCJPdGhlcnNcIikge1xyXG4gICAgICAgICAgICAgIGVsZW1lbnRSZWYuZml4dHVyZU5hbWUgPSBjdXN0b207XHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYW52YXNPdGhlckVsZW1lbnRMYWJlbChlbGVtZW50UmVmKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMub3RoZXJFbGVtZW50c1N1YnNjcmlwdGlvbnMucHVzaChzdWJUeXBlLCBzdWJDdXN0b20pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEZsb29yLWxldmVsIG90aGVyRWxlbWVudHMgbGFiZWwgc3Vic2NyaXB0aW9uc1xyXG4gICAgdGhpcy5nZXRGb3JtRmxvb3JPdGhlckVsZW1lbnRzLmNvbnRyb2xzLmZvckVhY2goKGN0cmwsIGlkeCkgPT4ge1xyXG4gICAgICBjb25zdCBlbGVtZW50R3JvdXAgPSBjdHJsIGFzIEZvcm1Hcm91cDtcclxuICAgICAgY29uc3QgdHlwZUNvbnRyb2wgPSBlbGVtZW50R3JvdXAuZ2V0KFwidHlwZVwiKSBhcyBGb3JtQ29udHJvbDtcclxuICAgICAgY29uc3QgY3VzdG9tTmFtZUNvbnRyb2wgPSBlbGVtZW50R3JvdXAuZ2V0KFwiY3VzdG9tTmFtZVwiKSBhcyBGb3JtQ29udHJvbDtcclxuICAgICAgY29uc3QgZWxlbWVudFJlZiA9IHRoaXMuZmxvb3JEYXRhPy5vdGhlckVsZW1lbnRzPy5baWR4XTtcclxuICAgICAgaWYgKCFlbGVtZW50UmVmKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBzdWJUeXBlID0gdHlwZUNvbnRyb2wudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHNlbGVjdGVkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGVsZW1lbnRSZWYuZml4dHVyZU5hbWUgPVxyXG4gICAgICAgICAgICBzZWxlY3RlZCA9PT0gXCJPdGhlcnNcIlxyXG4gICAgICAgICAgICAgID8gY3VzdG9tTmFtZUNvbnRyb2w/LnZhbHVlIHx8IFwiT3RoZXJzXCJcclxuICAgICAgICAgICAgICA6IHNlbGVjdGVkO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVDYW52YXNPdGhlckVsZW1lbnRMYWJlbChlbGVtZW50UmVmKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHN1YkN1c3RvbSA9IGN1c3RvbU5hbWVDb250cm9sLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChjdXN0b206IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGVDb250cm9sLnZhbHVlID09PSBcIk90aGVyc1wiKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRSZWYuZml4dHVyZU5hbWUgPSBjdXN0b207XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FudmFzT3RoZXJFbGVtZW50TGFiZWwoZWxlbWVudFJlZik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLm90aGVyRWxlbWVudHNTdWJzY3JpcHRpb25zLnB1c2goc3ViVHlwZSwgc3ViQ3VzdG9tKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ2FudmFzT3RoZXJFbGVtZW50TGFiZWwoZWxlbWVudFJlZjogYW55KSB7XHJcbiAgICBpZiAoIXRoaXMuY2FudmFzKSByZXR1cm47XHJcbiAgICBjb25zdCBncm91cCA9IHRoaXMuY2FudmFzXHJcbiAgICAgIC5nZXRPYmplY3RzKClcclxuICAgICAgLmZpbmQoXHJcbiAgICAgICAgKG9iajogYW55KSA9PlxyXG4gICAgICAgICAgb2JqPy5vYmpUeXBlID09PSBcIm90aGVyc1wiICYmIG9iaj8uZGF0YS5faWQgPT09IGVsZW1lbnRSZWYuX2lkLFxyXG4gICAgICApIGFzIGFueTtcclxuXHJcbiAgICBpZiAoIWdyb3VwKSByZXR1cm47XHJcbiAgICBncm91cC5kYXRhID0gZWxlbWVudFJlZjtcclxuXHJcbiAgICBjb25zdCB0ZXh0T2JqID0gKGdyb3VwLmdldE9iamVjdHMoKSB8fCBbXSkuZmluZChcclxuICAgICAgKG86IGFueSkgPT4gbz8udHlwZSA9PT0gXCJ0ZXh0XCIgfHwgbz8udHlwZSA9PT0gXCJ0ZXh0Ym94XCIsXHJcbiAgICApIGFzIGZhYnJpYy5UZXh0IHwgZmFicmljLlRleHRib3ggfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgaWYgKHRleHRPYmopIHtcclxuICAgICAgKHRleHRPYmogYXMgYW55KS5zZXQoeyB0ZXh0OiBlbGVtZW50UmVmLmZpeHR1cmVOYW1lIH0pO1xyXG4gICAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByb3RhdGVDYW52YXMoY2FudmFzOiBmYWJyaWMuQ2FudmFzLCBhbmdsZURlZzogbnVtYmVyKSB7XHJcbiAgICBpZiAoIWNhbnZhcykgcmV0dXJuO1xyXG4gICAgY29uc3QgYWxsT2JqZWN0cyA9IGNhbnZhcy5nZXRPYmplY3RzKCk7XHJcbiAgICBpZiAoIWFsbE9iamVjdHMgfHwgYWxsT2JqZWN0cy5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICAvLyBDcmVhdGUgYW4gQWN0aXZlU2VsZWN0aW9uIGNvbnRhaW5pbmcgYWxsIG9iamVjdHMgb24gdGhlIGNhbnZhc1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gbmV3IGZhYnJpYy5BY3RpdmVTZWxlY3Rpb24oYWxsT2JqZWN0cyBhcyBhbnksIHsgY2FudmFzIH0pO1xyXG4gICAgY2FudmFzLnNldEFjdGl2ZU9iamVjdChzZWxlY3Rpb24pO1xyXG5cclxuICAgIC8vIFJvdGF0ZSB0aGUgQWN0aXZlU2VsZWN0aW9uIGRpcmVjdGx5ICh3b3JrcyBsaWtlIGEgdGVtcG9yYXJ5IGdyb3VwKVxyXG4gICAgY29uc3QgYWN0aXZlOiBhbnkgPSBjYW52YXMuZ2V0QWN0aXZlT2JqZWN0KCk7XHJcbiAgICBpZiAoIWFjdGl2ZSkge1xyXG4gICAgICBjYW52YXMuZGlzY2FyZEFjdGl2ZU9iamVjdCgpO1xyXG4gICAgICBjYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY3VycmVudEFuZ2xlID0gYWN0aXZlLmFuZ2xlIHx8IDA7XHJcbiAgICBhY3RpdmUucm90YXRlKGN1cnJlbnRBbmdsZSArIGFuZ2xlRGVnKTtcclxuICAgIGFjdGl2ZS5zZXRDb29yZHMoKTtcclxuXHJcbiAgICAvLyBDbGVhciBzZWxlY3Rpb24gYnV0IGtlZXAgcm90YXRlZCBwb3NpdGlvbnMgb2YgY2hpbGQgb2JqZWN0c1xyXG4gICAgY2FudmFzLmRpc2NhcmRBY3RpdmVPYmplY3QoKTtcclxuICAgIGNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RGaXh0dXJlT25DYW52YXNDbGljayh0YXJnZXQ6IGFueSwgY29sbGFwc2VUYXNrSW5mbzogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBpZiAodGFyZ2V0KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlID0ge1xyXG4gICAgICAgIGZpeHR1cmVUeXBlOiB0YXJnZXQuZml4dHVyZVR5cGUsXHJcbiAgICAgICAgd2FsbEluZGV4OiB0YXJnZXQud2FsbEluZGV4LFxyXG4gICAgICAgIGZpeHR1cmVJbmRleDogdGFyZ2V0LmZpeHR1cmVJbmRleCxcclxuICAgICAgICBmaXh0dXJlSWQ6IHRhcmdldC5maXh0dXJlSWQsXHJcbiAgICAgICAgaXNzdWU6IHRhcmdldC5pc3N1ZSxcclxuICAgICAgICBpc3N1ZURhdGE6IHRhcmdldC5pc3N1ZURhdGEsXHJcbiAgICAgICAgdm1Db25maWc6IHRhcmdldC52bUNvbmZpZyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0Rml4dHVyZUZlZWRiYWNrKFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlLmZpeHR1cmVJZCxcclxuICAgICAgICBjb2xsYXBzZVRhc2tJbmZvLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0Rml4dHVyZUZlZWRiYWNrKGZpeHR1cmVJZDogc3RyaW5nLCBjb2xsYXBzZVRhc2tJbmZvOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRGaXh0dXJlRmVlZGJhY2sgPSB0aGlzLnN0b3JlRmVlZGJhY2suZml4dHVyZURhdGEuZmluZChcclxuICAgICAgKGZiOiBhbnkpID0+IGZiLmZpeHR1cmVJZCA9PT0gZml4dHVyZUlkLFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCByYXdGaXh0dXJlID0gc3RydWN0dXJlZENsb25lKFxyXG4gICAgICB0aGlzLmFsbEZpeHR1cmVJbnN0YW5jZXMuZmluZCgoZmk6IGFueSkgPT4gZmkuX2lkID09PSBmaXh0dXJlSWQpLFxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoY3VycmVudEZpeHR1cmVGZWVkYmFjaykge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZUZlZWRiYWNrID0ge1xyXG4gICAgICAgIGdsb2JhbENvbW1lbnRzOiB0aGlzLnN0b3JlRmVlZGJhY2suZml4dHVyZUNvbW1lbnQsXHJcbiAgICAgICAgZml4dHVyZUZlZWRiYWNrOiB7XHJcbiAgICAgICAgICAuLi5jdXJyZW50Rml4dHVyZUZlZWRiYWNrLFxyXG4gICAgICAgICAgRml4dHVyZURhdGE6IHJhd0ZpeHR1cmUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0YXNrSW5mb1RvZ2dsZTogY29sbGFwc2VUYXNrSW5mbyxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRmVlZGJhY2sgPSB7XHJcbiAgICAgICAgZ2xvYmFsQ29tbWVudHM6IFtdLFxyXG4gICAgICAgIGZpeHR1cmVGZWVkYmFjazoge1xyXG4gICAgICAgICAgZml4dHVyZUlkOiBmaXh0dXJlSWQsXHJcbiAgICAgICAgICBGaXh0dXJlRGF0YTogcmF3Rml4dHVyZSxcclxuICAgICAgICAgIGZpeHR1cmVBSURhdGE6IG51bGwsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0YXNrSW5mb1RvZ2dsZTogY29sbGFwc2VUYXNrSW5mbyxcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdFpvbmVGZWVkYmFjayhmaXh0dXJlSWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0Rml4dHVyZVRlbXBsYXRlcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgfTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuYXBpU2VydmljZS5nZXRBbGxUZW1wbGF0ZXMocGF5bG9hZCksXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSByZXM/LmRhdGE7XHJcblxyXG4gICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlcyA9IGRhdGEubWFwKCh0OiBhbnkpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIF9pZDogdC5faWQsXHJcbiAgICAgICAgICAgIG5hbWU6IHQuZml4dHVyZU5hbWUuaW5jbHVkZXMoXCItZnRcIilcclxuICAgICAgICAgICAgICA/IHQuZml4dHVyZU5hbWVcclxuICAgICAgICAgICAgICA6IGAke3QuZml4dHVyZU5hbWV9IC0gJHt0LmZpeHR1cmVXaWR0aC52YWx1ZX0gJHt0LmZpeHR1cmVXaWR0aC51bml0fWAsXHJcbiAgICAgICAgICAgIHN1YnRleHQ6IGAke3QucHJvZHVjdEJyYW5kTmFtZT8uam9pbihcIiwgXCIpfWAsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgZml4dHVyZSB0ZW1wbGF0ZXM6XCIsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNyZWF0ZUZvcm0oKSB7XHJcbiAgICB0aGlzLmxheW91dEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgd2FsbHM6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBmbG9vckZpeHR1cmVzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgZmxvb3JPdGhlckVsZW1lbnRzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdldEZvcm1XYWxscygpIHtcclxuICAgIHJldHVybiB0aGlzLmxheW91dEZvcm0uZ2V0KFwid2FsbHNcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdldEZvcm1GbG9vckZpeHR1cmVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vckZpeHR1cmVzXCIpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldCBnZXRGb3JtRmxvb3JPdGhlckVsZW1lbnRzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vck90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdldEVudHJhbmNlcygpIHtcclxuICAgIHJldHVybiB0aGlzLmZsb29yRGF0YT8ubGF5b3V0UG9seWdvbj8uZmlsdGVyKFxyXG4gICAgICAoZWxlOiBhbnkpID0+IGVsZS5lbGVtZW50VHlwZSA9PT0gXCJlbnRyYW5jZVwiLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldCBzaG93Rml4dHVyZVByZXZpZXcoKSB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJmaXh0dXJlXCIgJiZcclxuICAgICAgIXRoaXMuZGlzYWJsZWRQdWJsaXNoICYmXHJcbiAgICAgICF0aGlzLmVkaXRGaXh0dXJlXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0V2FsbE90aGVyRWxlbWVudHMod2FsbEluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiAodGhpcy5sYXlvdXRGb3JtLmdldChcIndhbGxzXCIpIGFzIEZvcm1BcnJheSlcclxuICAgICAgLmF0KHdhbGxJbmRleClcclxuICAgICAgLmdldChcIm90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybUZpeHR1cmVzKHdhbGxJbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJ3YWxsc1wiKSBhcyBGb3JtQXJyYXkpXHJcbiAgICAgIC5hdCh3YWxsSW5kZXgpXHJcbiAgICAgIC5nZXQoXCJmaXh0dXJlc1wiKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBwYXRjaFdhbGxFbGVtZW50cyh7IGVsZW1lbnRUeXBlLCBlbGVtZW50TnVtYmVyIH06IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgZWxlbWVudFR5cGU6IFtlbGVtZW50VHlwZSA/IGVsZW1lbnRUeXBlIDogXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgZWxlbWVudE51bWJlcjogW2VsZW1lbnROdW1iZXIgPyBlbGVtZW50TnVtYmVyIDogMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgZml4dHVyZXM6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBvdGhlckVsZW1lbnRzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGl0ZW07XHJcbiAgfVxyXG5cclxuICBwYXRjaEZpeHR1cmUoeyBmaXh0dXJlTmFtZSwgZml4dHVyZUNvbmZpZ0lkLCBfaWQgfTogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBmaXh0dXJlTmFtZTogW2ZpeHR1cmVOYW1lID8gZml4dHVyZU5hbWUgOiBcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICBmaXh0dXJlQ29uZmlnSWQ6IFtcclxuICAgICAgICBmaXh0dXJlQ29uZmlnSWQgPyBmaXh0dXJlQ29uZmlnSWQgOiBcIlwiLFxyXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgXSxcclxuICAgICAgX2lkOiBbX2lkID8gX2lkIDogXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGl0ZW07XHJcbiAgfVxyXG5cclxuICBhZGRXYWxsU3BhY2Uod2FsbEluZGV4OiBudW1iZXIsIG9wZXJhdGlvbjogXCJpbmNyZW1lbnRcIiB8IFwiZGVjcmVtZW50XCIpIHtcclxuICAgIGlmICh0aGlzLmxheW91dEZvcm0uZGlzYWJsZWQpIHJldHVybjtcclxuICAgIGNvbnN0IGNsaWNrZWRXYWxsTnVtYmVyID0gd2FsbEluZGV4ICsgMTtcclxuICAgIGNvbnN0IG1tVG9GZWV0ID0gMzA1O1xyXG4gICAgY29uc3QgZml4dHVyZUhlaWdodCA9IDE1MjQgLyBtbVRvRmVldDsgLy8gfjUgZnQgKGhvcml6b250YWwgaW5jcmVtZW50KVxyXG4gICAgY29uc3QgZml4dHVyZVdpZHRoID0gMTIyMCAvIG1tVG9GZWV0OyAvLyB+NCBmdCAodmVydGljYWwgaW5jcmVtZW50KVxyXG5cclxuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb247XHJcblxyXG4gICAgY29uc3QgZ2V0V2FsbCA9IChudW06IG51bWJlcikgPT5cclxuICAgICAgbGF5b3V0LmZpbmQoXHJcbiAgICAgICAgKGVsOiBhbnkpID0+IGVsLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiBlbC5lbGVtZW50TnVtYmVyID09PSBudW0sXHJcbiAgICAgICk7XHJcblxyXG4gICAgY29uc3QgYW1vdW50ID0gb3BlcmF0aW9uID09PSBcImluY3JlbWVudFwiID8gMSA6IC0xO1xyXG5cclxuICAgIGNvbnN0IHcxID0gZ2V0V2FsbCgxKTtcclxuICAgIGNvbnN0IHcyID0gZ2V0V2FsbCgyKTtcclxuICAgIGNvbnN0IHczID0gZ2V0V2FsbCgzKTtcclxuICAgIGNvbnN0IHc0ID0gZ2V0V2FsbCg0KTtcclxuICAgIGNvbnN0IHc1ID0gZ2V0V2FsbCg1KTtcclxuICAgIGNvbnN0IGVudHJhbmNlID0gbGF5b3V0LmZpbmQoKGVsOiBhbnkpID0+IGVsLmVsZW1lbnRUeXBlID09PSBcImVudHJhbmNlXCIpO1xyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEhvcml6b250YWwgZ3Jvd3RoICAoV2FsbC0xIC8gV2FsbC0zKVxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgaWYgKGNsaWNrZWRXYWxsTnVtYmVyID09PSAxIHx8IGNsaWNrZWRXYWxsTnVtYmVyID09PSAzKSB7XHJcbiAgICAgIGlmICh3MSkgdzEuZGlzdGFuY2UgKz0gYW1vdW50ICogZml4dHVyZVdpZHRoO1xyXG4gICAgICBpZiAodzMpIHczLmRpc3RhbmNlICs9IGFtb3VudCAqIGZpeHR1cmVXaWR0aDtcclxuXHJcbiAgICAgIGlmICh3Mikge1xyXG4gICAgICAgIHcyLmZpeHR1cmVzLmZvckVhY2goKGZ4OiBhbnkpID0+IHtcclxuICAgICAgICAgIGZ4LnJlbGF0aXZlUG9zaXRpb24ueCA9XHJcbiAgICAgICAgICAgIChmeC5yZWxhdGl2ZVBvc2l0aW9uLnggfHwgMCkgKyBhbW91bnQgKiBmaXh0dXJlV2lkdGg7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBWZXJ0aWNhbCBncm93dGggIChXYWxsLTIgLyBXYWxsLTQgLyBXYWxsLTUpXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBpZiAoXHJcbiAgICAgIGNsaWNrZWRXYWxsTnVtYmVyID09PSAyIHx8XHJcbiAgICAgIGNsaWNrZWRXYWxsTnVtYmVyID09PSA0IHx8XHJcbiAgICAgIGNsaWNrZWRXYWxsTnVtYmVyID09PSA1XHJcbiAgICApIHtcclxuICAgICAgaWYgKHcyKSB3Mi5kaXN0YW5jZSArPSBhbW91bnQgKiBmaXh0dXJlSGVpZ2h0O1xyXG5cclxuICAgICAgaWYgKHczKSB7XHJcbiAgICAgICAgdzMuZml4dHVyZXMuZm9yRWFjaCgoZng6IGFueSkgPT4ge1xyXG4gICAgICAgICAgZngucmVsYXRpdmVQb3NpdGlvbi55ID1cclxuICAgICAgICAgICAgKGZ4LnJlbGF0aXZlUG9zaXRpb24ueSB8fCAwKSArIGFtb3VudCAqIGZpeHR1cmVIZWlnaHQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGVudHJhbmNlWSA9IGVudHJhbmNlPy5kaXN0YW5jZSB8fCAwO1xyXG4gICAgICBjb25zdCBleGlzdGluZ1c0ID0gdzQ/LmRpc3RhbmNlIHx8IDA7XHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nVzUgPSB3NT8uZGlzdGFuY2UgfHwgMDtcclxuXHJcbiAgICAgIC8vIEdyb3cgd2FsbC00IGlmIHdlIGNsaWNrZWQgd2FsbC00IE9SIHdhbGwtMlxyXG4gICAgICBpZiAoKGNsaWNrZWRXYWxsTnVtYmVyID09PSA0IHx8IGNsaWNrZWRXYWxsTnVtYmVyID09PSAyKSAmJiB3NCkge1xyXG4gICAgICAgIHc0LmRpc3RhbmNlID0gdGhpcy5yb3VuZFRvVHdvKGV4aXN0aW5nVzQgKyBhbW91bnQgKiBmaXh0dXJlSGVpZ2h0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gR3JvdyB3YWxsLTUgaWYgd2UgY2xpY2tlZCB3YWxsLTUgT1Igd2FsbC0yXHJcbiAgICAgIGlmICgoY2xpY2tlZFdhbGxOdW1iZXIgPT09IDUgfHwgY2xpY2tlZFdhbGxOdW1iZXIgPT09IDIpICYmIHc1KSB7XHJcbiAgICAgICAgdzUuZGlzdGFuY2UgPSB0aGlzLnJvdW5kVG9Ud28oZXhpc3RpbmdXNSArIGFtb3VudCAqIGZpeHR1cmVIZWlnaHQpO1xyXG5cclxuICAgICAgICBpZiAodzQpIHtcclxuICAgICAgICAgIHc0LmZpeHR1cmVzLmZvckVhY2goKGZ4OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgZngucmVsYXRpdmVQb3NpdGlvbi55ID1cclxuICAgICAgICAgICAgICAoZngucmVsYXRpdmVQb3NpdGlvbi55IHx8IDApICsgYW1vdW50ICogZml4dHVyZUhlaWdodDtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUHJldmVudCBvdmVyZmxvdzogc2hyaW5rIGJhY2sgaWYgdG90YWwgPiB3MiBzaXplXHJcbiAgICAgIGNvbnN0IHRvdGFsVXNlZCA9IGVudHJhbmNlWSArICh3ND8uZGlzdGFuY2UgfHwgMCkgKyAodzU/LmRpc3RhbmNlIHx8IDApO1xyXG4gICAgICBpZiAodG90YWxVc2VkID4gdzIhLmRpc3RhbmNlKSB7XHJcbiAgICAgICAgaWYgKHc1KSB7XHJcbiAgICAgICAgICB3NS5kaXN0YW5jZSA9IHRoaXMucm91bmRUb1R3byhcclxuICAgICAgICAgICAgdzUuZGlzdGFuY2UgLSAodG90YWxVc2VkIC0gdzIhLmRpc3RhbmNlKSxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVGaXh0dXJlKFxyXG4gICAgZml4dHVyZVR5cGU6IFwid2FsbFwiIHwgXCJmbG9vclwiLFxyXG4gICAgZml4dHVyZUluZGV4OiBudW1iZXIsXHJcbiAgICB3YWxsSW5kZXg/OiBudW1iZXIsXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5sYXlvdXRGb3JtLmRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgaWYgKGZpeHR1cmVUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICB0aGlzLmdldEZvcm1GaXh0dXJlcyh3YWxsSW5kZXghKS5yZW1vdmVBdChmaXh0dXJlSW5kZXgpO1xyXG5cclxuICAgICAgY29uc3Qgd2FsbCA9IHRoaXMuZ2V0V2FsbEJ5TnVtYmVyKHdhbGxJbmRleCEgKyAxKTtcclxuICAgICAgaWYgKHdhbGwgJiYgQXJyYXkuaXNBcnJheSh3YWxsLmZpeHR1cmVzKSkge1xyXG4gICAgICAgIHdhbGwuZml4dHVyZXMuc3BsaWNlKGZpeHR1cmVJbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoZml4dHVyZVR5cGUgPT09IFwiZmxvb3JcIikge1xyXG4gICAgICB0aGlzLmdldEZvcm1GbG9vckZpeHR1cmVzLnJlbW92ZUF0KGZpeHR1cmVJbmRleCk7XHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlKSkge1xyXG4gICAgICAgIHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUuc3BsaWNlKGZpeHR1cmVJbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxheW91dEhhc1Vuc2F2ZWRDaGFuZ2VzID0gdHJ1ZTtcclxuICAgIHRoaXMucmVuZGVyRmxvb3IoZmFsc2UpO1xyXG4gICAgdGhpcy5wdWJsaXNoaW5nU3RhdGUgPSBcImxheW91dFwiO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGxheW91dCBoYXMgcGVuZGluZyBjaGFuZ2VzIHRoZSB1c2VyIG11c3Qgc2F2ZSBiZWZvcmVcclxuICAvLyB0aGV5IGNhbiBlZGl0IGFuIGluZGl2aWR1YWwgZml4dHVyZS4gU2V0IGJ5IGFsbCBsYXlvdXQgbXV0YXRpb24gaGFuZGxlcnNcclxuICAvLyAoYWRkIC8gZGVsZXRlIC8gbW92ZSAvIHRlbXBsYXRlIGNoYW5nZSksIGNsZWFyZWQgb24gc3VjY2Vzc2Z1bCBzYXZlLlxyXG4gIHByaXZhdGUgaGFzVW5zYXZlZExheW91dENoYW5nZXMoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5sYXlvdXRIYXNVbnNhdmVkQ2hhbmdlcykgcmV0dXJuIHRydWU7XHJcbiAgICBjb25zdCB3YWxsRml4dHVyZXMgPSAodGhpcy5mbG9vckRhdGE/LmxheW91dFBvbHlnb24gPz8gW10pLmZsYXRNYXAoXHJcbiAgICAgIChlbDogYW55KSA9PiBlbD8uZml4dHVyZXMgPz8gW10sXHJcbiAgICApO1xyXG4gICAgY29uc3QgZmxvb3JGaXh0dXJlcyA9IHRoaXMuZmxvb3JEYXRhPy5jZW50ZXJGaXh0dXJlID8/IFtdO1xyXG4gICAgcmV0dXJuIFsuLi53YWxsRml4dHVyZXMsIC4uLmZsb29yRml4dHVyZXNdLnNvbWUoXHJcbiAgICAgIChmOiBhbnkpID0+IGY/LnVuc2F2ZWRDaGFuZ2VzLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZU90aGVyRWxlbWVudChcclxuICAgIGVsZW1lbnRUeXBlOiBcIndhbGxcIiB8IFwiZmxvb3JcIixcclxuICAgIGVsZW1lbnRJbmRleDogbnVtYmVyLFxyXG4gICAgd2FsbEluZGV4PzogbnVtYmVyLFxyXG4gICkge1xyXG4gICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgdGhpcy5nZXRXYWxsT3RoZXJFbGVtZW50cyh3YWxsSW5kZXghKS5yZW1vdmVBdChlbGVtZW50SW5kZXgpO1xyXG5cclxuICAgICAgY29uc3Qgd2FsbCA9IHRoaXMuZ2V0V2FsbEJ5TnVtYmVyKHdhbGxJbmRleCEgKyAxKTtcclxuICAgICAgaWYgKHdhbGwgJiYgQXJyYXkuaXNBcnJheSh3YWxsLm90aGVyRWxlbWVudHMpKSB7XHJcbiAgICAgICAgd2FsbC5vdGhlckVsZW1lbnRzLnNwbGljZShlbGVtZW50SW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09PSBcImZsb29yXCIpIHtcclxuICAgICAgdGhpcy5nZXRGb3JtRmxvb3JPdGhlckVsZW1lbnRzLnJlbW92ZUF0KGVsZW1lbnRJbmRleCk7XHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmZsb29yRGF0YS5vdGhlckVsZW1lbnRzKSkge1xyXG4gICAgICAgIHRoaXMuZmxvb3JEYXRhLm90aGVyRWxlbWVudHMuc3BsaWNlKGVsZW1lbnRJbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxheW91dEhhc1Vuc2F2ZWRDaGFuZ2VzID0gdHJ1ZTtcclxuICAgIHRoaXMucmVuZGVyRmxvb3IoZmFsc2UpO1xyXG4gICAgdGhpcy5wdWJsaXNoaW5nU3RhdGUgPSBcImxheW91dFwiO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlRml4dHVyZVRlbXBsYXRlKFxyXG4gICAgY29uZmlnSWQ6IHN0cmluZyxcclxuICAgIGZpeHR1cmVUeXBlOiBcIndhbGxcIiB8IFwiZmxvb3JcIixcclxuICAgIGZpeHR1cmVJbmRleDogbnVtYmVyLFxyXG4gICAgd2FsbEluZGV4PzogbnVtYmVyLFxyXG4gICkge1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlXHJcbiAgICAgIC5nZXRGaXh0dXJlVGVtcGxhdGUoY29uZmlnSWQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoZml4dHVyZVR5cGUgPT09IFwid2FsbFwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlRGF0YSA9IHJlcy5kYXRhO1xyXG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlSWQgPSBgbmV3LSR7Y3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xyXG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlR3JvdXAgPSB0aGlzLnBhdGNoRml4dHVyZSh7XHJcbiAgICAgICAgICAgICAgZml4dHVyZU5hbWU6IHRlbXBsYXRlRGF0YS5maXh0dXJlTmFtZSxcclxuICAgICAgICAgICAgICBmaXh0dXJlQ29uZmlnSWQ6IHRlbXBsYXRlRGF0YS5faWQsXHJcbiAgICAgICAgICAgICAgX2lkOiBmaXh0dXJlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmdldEZvcm1GaXh0dXJlcyh3YWxsSW5kZXghKS5zZXRDb250cm9sKFxyXG4gICAgICAgICAgICAgIGZpeHR1cmVJbmRleCxcclxuICAgICAgICAgICAgICBmaXh0dXJlR3JvdXAsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmVEYXRhID0ge1xyXG4gICAgICAgICAgICAgIC4uLnRlbXBsYXRlRGF0YSxcclxuICAgICAgICAgICAgICBmaXh0dXJlQ29uZmlnSWQ6IHRlbXBsYXRlRGF0YS5faWQsXHJcbiAgICAgICAgICAgICAgX2lkOiBmaXh0dXJlSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHdhbGxSZWYgPSB0aGlzLmdldFdhbGxCeU51bWJlcih3YWxsSW5kZXghICsgMSkhO1xyXG4gICAgICAgICAgICB3YWxsUmVmLmZpeHR1cmVzW2ZpeHR1cmVJbmRleF0gPSB7XHJcbiAgICAgICAgICAgICAgLi4ud2FsbFJlZi5maXh0dXJlc1tmaXh0dXJlSW5kZXhdLFxyXG4gICAgICAgICAgICAgIC4uLmZpeHR1cmVEYXRhLFxyXG4gICAgICAgICAgICAgIHVuc2F2ZWRDaGFuZ2VzOiB0cnVlLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dEhhc1Vuc2F2ZWRDaGFuZ2VzID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZml4dHVyZVR5cGUgPT09IFwiZmxvb3JcIikge1xyXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZURhdGEgPSByZXMuZGF0YTtcclxuICAgICAgICAgICAgY29uc3QgZml4dHVyZUlkID0gYG5ldy0ke2NyeXB0by5yYW5kb21VVUlEKCl9YDtcclxuICAgICAgICAgICAgY29uc3QgZml4dHVyZUdyb3VwID0gdGhpcy5wYXRjaEZpeHR1cmUoe1xyXG4gICAgICAgICAgICAgIGZpeHR1cmVOYW1lOiB0ZW1wbGF0ZURhdGEuZml4dHVyZU5hbWUsXHJcbiAgICAgICAgICAgICAgZml4dHVyZUNvbmZpZ0lkOiB0ZW1wbGF0ZURhdGEuX2lkLFxyXG4gICAgICAgICAgICAgIF9pZDogZml4dHVyZUlkLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vckZpeHR1cmVzXCIpIGFzIEZvcm1BcnJheSkuc2V0Q29udHJvbChcclxuICAgICAgICAgICAgICBmaXh0dXJlSW5kZXgsXHJcbiAgICAgICAgICAgICAgZml4dHVyZUdyb3VwLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlRGF0YSA9IHtcclxuICAgICAgICAgICAgICAuLi50ZW1wbGF0ZURhdGEsXHJcbiAgICAgICAgICAgICAgZml4dHVyZUNvbmZpZ0lkOiB0ZW1wbGF0ZURhdGEuX2lkLFxyXG4gICAgICAgICAgICAgIF9pZDogZml4dHVyZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlW2ZpeHR1cmVJbmRleF0gPSB7XHJcbiAgICAgICAgICAgICAgLi4udGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZVtmaXh0dXJlSW5kZXhdLFxyXG4gICAgICAgICAgICAgIC4uLmZpeHR1cmVEYXRhLFxyXG4gICAgICAgICAgICAgIHVuc2F2ZWRDaGFuZ2VzOiB0cnVlLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dEhhc1Vuc2F2ZWRDaGFuZ2VzID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnJlbmRlckZsb29yKGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMucHVibGlzaGluZ1N0YXRlID0gXCJsYXlvdXRcIjtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiRmFpbGVkIHRvIGZldGNoIHRlbXBsYXRlc1wiKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uRHJvcChcclxuICAgIGV2ZW50OiBhbnksXHJcbiAgICBkZXN0aW5hdGlvbldhbGxJbmRleDogbnVtYmVyIHwgXCJmbG9vclwiLFxyXG4gICAgZGVzdGluYXRpb25GaXh0dXJlSW5kZXg/OiBudW1iZXIsXHJcbiAgKSB7XHJcbiAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YTtcclxuXHJcbiAgICBpZiAodGhpcy5sYXlvdXRGb3JtLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICBjb25zdCBpc1NvdXJjZUZsb29yID0gZGF0YS53YWxsSW5kZXggPT09IFwiZmxvb3JcIjtcclxuICAgIGNvbnN0IGlzRGVzdGluYXRpb25GbG9vciA9IGRlc3RpbmF0aW9uV2FsbEluZGV4ID09PSBcImZsb29yXCI7XHJcblxyXG4gICAgY29uc3Qgc291cmNlRm9ybUFycmF5OiBGb3JtQXJyYXkgPSBpc1NvdXJjZUZsb29yXHJcbiAgICAgID8gdGhpcy5nZXRGb3JtRmxvb3JGaXh0dXJlc1xyXG4gICAgICA6IHRoaXMuZ2V0Rm9ybUZpeHR1cmVzKGRhdGEud2FsbEluZGV4KTtcclxuXHJcbiAgICBjb25zdCBkZXN0aW5hdGlvbkZvcm1BcnJheTogRm9ybUFycmF5ID0gaXNEZXN0aW5hdGlvbkZsb29yXHJcbiAgICAgID8gdGhpcy5nZXRGb3JtRmxvb3JGaXh0dXJlc1xyXG4gICAgICA6IHRoaXMuZ2V0Rm9ybUZpeHR1cmVzKGRlc3RpbmF0aW9uV2FsbEluZGV4IGFzIG51bWJlcik7XHJcblxyXG4gICAgY29uc3Qgc291cmNlV2FsbE1ldGEgPSBpc1NvdXJjZUZsb29yXHJcbiAgICAgID8gdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZVxyXG4gICAgICA6ICh0aGlzLmdldFdhbGxCeU51bWJlcihcclxuICAgICAgICAgIHRoaXMuZ2V0Rm9ybVdhbGxzLmF0KGRhdGEud2FsbEluZGV4KS5nZXQoXCJlbGVtZW50TnVtYmVyXCIpPy52YWx1ZSxcclxuICAgICAgICApPy5maXh0dXJlcyA/PyBbXSk7XHJcblxyXG4gICAgY29uc3QgZGVzdGluYXRpb25XYWxsTWV0YSA9IGlzRGVzdGluYXRpb25GbG9vclxyXG4gICAgICA/IHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmVcclxuICAgICAgOiAodGhpcy5nZXRXYWxsQnlOdW1iZXIoXHJcbiAgICAgICAgICB0aGlzLmdldEZvcm1XYWxsc1xyXG4gICAgICAgICAgICAuYXQoZGVzdGluYXRpb25XYWxsSW5kZXggYXMgbnVtYmVyKVxyXG4gICAgICAgICAgICAuZ2V0KFwiZWxlbWVudE51bWJlclwiKT8udmFsdWUsXHJcbiAgICAgICAgKT8uZml4dHVyZXMgPz8gW10pO1xyXG5cclxuICAgIGNvbnN0IHNGaXh0dXJlSW5kZXggPSBzb3VyY2VXYWxsTWV0YS5maW5kSW5kZXgoXHJcbiAgICAgIChmaXh0dXJlOiBhbnkpID0+XHJcbiAgICAgICAgZml4dHVyZS5faWQgPT09XHJcbiAgICAgICAgc291cmNlRm9ybUFycmF5LmF0KGRhdGEuZml4dHVyZUluZGV4KT8uZ2V0KFwiX2lkXCIpPy52YWx1ZSxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgZEZpeHR1cmVJbmRleCA9XHJcbiAgICAgIGRlc3RpbmF0aW9uRml4dHVyZUluZGV4ICE9PSB1bmRlZmluZWRcclxuICAgICAgICA/IGRlc3RpbmF0aW9uV2FsbE1ldGEuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAoZml4dHVyZTogYW55KSA9PlxyXG4gICAgICAgICAgICAgIGZpeHR1cmUuX2lkID09PVxyXG4gICAgICAgICAgICAgIGRlc3RpbmF0aW9uRm9ybUFycmF5LmF0KGRlc3RpbmF0aW9uRml4dHVyZUluZGV4KT8uZ2V0KFwiX2lkXCIpXHJcbiAgICAgICAgICAgICAgICA/LnZhbHVlLFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIDogZGVzdGluYXRpb25Gb3JtQXJyYXkubGVuZ3RoO1xyXG5cclxuICAgIGNvbnN0IHNQb3NpdGlvbiA9IHtcclxuICAgICAgZml4dHVyZU51bWJlcjogc291cmNlV2FsbE1ldGFbc0ZpeHR1cmVJbmRleF0uZml4dHVyZU51bWJlcixcclxuICAgICAgYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyOlxyXG4gICAgICAgIHNvdXJjZVdhbGxNZXRhW3NGaXh0dXJlSW5kZXhdLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcixcclxuICAgIH07XHJcbiAgICBjb25zdCBkUG9zaXRpb24gPSB7XHJcbiAgICAgIGZpeHR1cmVOdW1iZXI6IGRlc3RpbmF0aW9uV2FsbE1ldGFbZEZpeHR1cmVJbmRleF0uZml4dHVyZU51bWJlcixcclxuICAgICAgYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyOlxyXG4gICAgICAgIGRlc3RpbmF0aW9uV2FsbE1ldGFbZEZpeHR1cmVJbmRleF0uYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoc291cmNlV2FsbE1ldGEgPT09IGRlc3RpbmF0aW9uV2FsbE1ldGEpIHtcclxuICAgICAgZGVzdGluYXRpb25XYWxsTWV0YVtkRml4dHVyZUluZGV4XS5maXh0dXJlTnVtYmVyID1cclxuICAgICAgICBzUG9zaXRpb24uZml4dHVyZU51bWJlcjtcclxuICAgICAgZGVzdGluYXRpb25XYWxsTWV0YVtkRml4dHVyZUluZGV4XS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIgPVxyXG4gICAgICAgIHNQb3NpdGlvbi5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXI7XHJcbiAgICAgIHNvdXJjZVdhbGxNZXRhW3NGaXh0dXJlSW5kZXhdLmZpeHR1cmVOdW1iZXIgPSBkUG9zaXRpb24uZml4dHVyZU51bWJlcjtcclxuICAgICAgc291cmNlV2FsbE1ldGFbc0ZpeHR1cmVJbmRleF0uYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyID1cclxuICAgICAgICBkUG9zaXRpb24uYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc291cmNlV2FsbE1ldGFbc0ZpeHR1cmVJbmRleF0uZml4dHVyZU51bWJlciA9IGRQb3NpdGlvbi5maXh0dXJlTnVtYmVyO1xyXG4gICAgICBzb3VyY2VXYWxsTWV0YVtzRml4dHVyZUluZGV4XS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIgPVxyXG4gICAgICAgIGRQb3NpdGlvbi5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50cmFuc2ZlckFycmF5SXRlbShcclxuICAgICAgc291cmNlRm9ybUFycmF5LmNvbnRyb2xzLFxyXG4gICAgICBkZXN0aW5hdGlvbkZvcm1BcnJheS5jb250cm9scyxcclxuICAgICAgZGF0YS5maXh0dXJlSW5kZXgsXHJcbiAgICAgIGRGaXh0dXJlSW5kZXgsXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMudHJhbnNmZXJBcnJheUl0ZW0oXHJcbiAgICAgIHNvdXJjZVdhbGxNZXRhLFxyXG4gICAgICBkZXN0aW5hdGlvbldhbGxNZXRhLFxyXG4gICAgICBzRml4dHVyZUluZGV4LFxyXG4gICAgICBkRml4dHVyZUluZGV4LFxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlckZsb29yKGZhbHNlKTtcclxuICAgIHRoaXMucHVibGlzaGluZ1N0YXRlID0gXCJsYXlvdXRcIjtcclxuICB9XHJcblxyXG4gIGRvd25sb2FkQ2FudmFzKCkge1xyXG4gICAgaWYgKCF0aGlzLmNhbnZhcykgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IG9yaWdpbmFsVmlld3BvcnQgPSBbXHJcbiAgICAgIC4uLnRoaXMuY2FudmFzLnZpZXdwb3J0VHJhbnNmb3JtISxcclxuICAgIF0gYXMgZmFicmljLlRNYXQyRDtcclxuXHJcbiAgICB0aGlzLmNhbnZhcy5zZXRWaWV3cG9ydFRyYW5zZm9ybShbMSwgMCwgMCwgMSwgMCwgMF0pO1xyXG5cclxuICAgIGNvbnN0IGJvdW5kcyA9IHRoaXMuZ2V0RnVsbExheW91dEJvdW5kcygpO1xyXG5cclxuICAgIGNvbnN0IGRhdGFVUkwgPSB0aGlzLmNhbnZhcy50b0RhdGFVUkwoe1xyXG4gICAgICBmb3JtYXQ6IFwicG5nXCIsXHJcbiAgICAgIGxlZnQ6IGJvdW5kcy5sZWZ0LFxyXG4gICAgICB0b3A6IGJvdW5kcy50b3AsXHJcbiAgICAgIHdpZHRoOiBib3VuZHMud2lkdGgsXHJcbiAgICAgIGhlaWdodDogYm91bmRzLmhlaWdodCxcclxuICAgICAgbXVsdGlwbGllcjogMixcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FudmFzLnNldFZpZXdwb3J0VHJhbnNmb3JtKG9yaWdpbmFsVmlld3BvcnQpO1xyXG5cclxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgIGxpbmsuaHJlZiA9IGRhdGFVUkw7XHJcbiAgICBsaW5rLmRvd25sb2FkID0gYCR7dGhpcy5wbGFub0RhdGEuc3RvcmVOYW1lfV8ke3RoaXMuZmxvb3JEYXRhLmZsb29yTmFtZX0ucG5nYDtcclxuICAgIGxpbmsuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIC8vIGRvd25sb2FkQ2FudmFzKCkge1xyXG4gIC8vICAgaWYgKCF0aGlzLmNhbnZhcykgcmV0dXJuO1xyXG5cclxuICAvLyAgIGNvbnN0IG9yaWdpbmFsVmlld3BvcnQgPSBbXHJcbiAgLy8gICAgIC4uLnRoaXMuY2FudmFzLnZpZXdwb3J0VHJhbnNmb3JtISxcclxuICAvLyAgIF0gYXMgZmFicmljLlRNYXQyRDtcclxuICAvLyAgIHRoaXMuY2FudmFzLnNldFZpZXdwb3J0VHJhbnNmb3JtKFsxLCAwLCAwLCAxLCAwLCAwXSk7XHJcblxyXG4gIC8vICAgY29uc3QgYm91bmRzID0gdGhpcy5nZXRGdWxsTGF5b3V0Qm91bmRzKCk7XHJcblxyXG4gIC8vICAgY29uc3QgYmcgPSB0aGlzLmNyZWF0ZUV4cG9ydExheW91dEJhY2tncm91bmQoKTtcclxuICAvLyAgIHRoaXMuY2FudmFzLmluc2VydEF0KDAsIGJnKTtcclxuICAvLyAgIHRoaXMuY2FudmFzLnJlbmRlckFsbCgpO1xyXG5cclxuICAvLyAgIGNvbnN0IGRhdGFVUkwgPSB0aGlzLmNhbnZhcy50b0RhdGFVUkwoe1xyXG4gIC8vICAgICBmb3JtYXQ6IFwicG5nXCIsXHJcbiAgLy8gICAgIGxlZnQ6IGJvdW5kcy5sZWZ0LFxyXG4gIC8vICAgICB0b3A6IGJvdW5kcy50b3AsXHJcbiAgLy8gICAgIHdpZHRoOiBib3VuZHMud2lkdGgsXHJcbiAgLy8gICAgIGhlaWdodDogYm91bmRzLmhlaWdodCxcclxuICAvLyAgICAgbXVsdGlwbGllcjogMixcclxuICAvLyAgIH0pO1xyXG5cclxuICAvLyAgIHRoaXMuY2FudmFzLnJlbW92ZShiZyk7XHJcbiAgLy8gICB0aGlzLmNhbnZhcy5zZXRWaWV3cG9ydFRyYW5zZm9ybShvcmlnaW5hbFZpZXdwb3J0KTtcclxuICAvLyAgIHRoaXMuY2FudmFzLnJlbmRlckFsbCgpO1xyXG5cclxuICAvLyAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAvLyAgIGxpbmsuaHJlZiA9IGRhdGFVUkw7XHJcbiAgLy8gICBsaW5rLmRvd25sb2FkID0gYCR7dGhpcy5wbGFub0RhdGEuc3RvcmVOYW1lfV8ke3RoaXMuZmxvb3JEYXRhLmZsb29yTmFtZX0ucG5nYDtcclxuICAvLyAgIGxpbmsuY2xpY2soKTtcclxuICAvLyB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRXhwb3J0TGF5b3V0QmFja2dyb3VuZCgpIHtcclxuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMuYnVpbGRMYXlvdXRQb2x5Z29uRnJvbVdhbGxzKCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBmYWJyaWMuUG9seWdvbihwb2ludHMsIHtcclxuICAgICAgZmlsbDogXCIjZWFlY2YwXCIsXHJcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgb2JqZWN0Q2FjaGluZzogZmFsc2UsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRMYXlvdXRQb2x5Z29uRnJvbVdhbGxzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb25cclxuICAgICAgLmZpbHRlcigodzogYW55KSA9PiB3LmVsZW1lbnRUeXBlID09PSBcIndhbGxcIilcclxuICAgICAgLm1hcCgodzogYW55KSA9PiAoe1xyXG4gICAgICAgIHg6IHRoaXMudG9QaXhlbHMody5yZWxhdGl2ZVBvc2l0aW9uLngsIFwiZnRcIiksXHJcbiAgICAgICAgeTogdGhpcy50b1BpeGVscyh3LnJlbGF0aXZlUG9zaXRpb24ueSwgXCJmdFwiKSxcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGFuZGxlRmVlZGJhY2tBY3Rpb24odXNlckFjdGlvbjogYW55KSB7XHJcbiAgICBpZiAodXNlckFjdGlvbj8udGFza1R5cGUgPT09IFwiem9uZVZlcmlmaWNhdGlvblwiKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZVpvbmVGZWVkYmFja0FjdGlvbih1c2VyQWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVkaXRGcm9tVGFiID0gXCJmaXh0dXJlXCI7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IHRhcmdldEZpeHR1cmU6IGFueSA9IHtcclxuICAgICAgICAuLi4odGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvblxyXG4gICAgICAgICAgLmZsYXRNYXAoKHA6IGFueSkgPT4gcC5maXh0dXJlcylcclxuICAgICAgICAgIC5jb25jYXQodGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZSlcclxuICAgICAgICAgIC5maW5kKChmOiBhbnkpID0+IGYuX2lkID09PSB0aGlzLnNlbGVjdGVkRml4dHVyZS5maXh0dXJlSWQpIHx8IG51bGwpLFxyXG4gICAgICAgIHVzZXJBY3Rpb246IHVzZXJBY3Rpb24uYWN0aW9uLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhID0geyAuLi50YXJnZXRGaXh0dXJlIH07XHJcblxyXG4gICAgICAvLyBlZGl0V2l0aEFpIC8gZWRpdFdpdGhQbGFubyDigJQgb3BlbiB0aGUgZWRpdCBwYW5lbCwgbm8gQVBJIGNhbGxzXHJcbiAgICAgIGlmIChcclxuICAgICAgICB1c2VyQWN0aW9uLmFjdGlvbiA9PT0gXCJlZGl0V2l0aEFpXCIgfHxcclxuICAgICAgICB1c2VyQWN0aW9uLmFjdGlvbiA9PT0gXCJlZGl0V2l0aFBsYW5vXCJcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKHVzZXJBY3Rpb24uYWN0aW9uID09PSBcImVkaXRXaXRoQWlcIikge1xyXG4gICAgICAgICAgdGFyZ2V0Rml4dHVyZSA9IHRoaXMubWVyZ2VBaUZpeHR1cmVEYXRhKHRhcmdldEZpeHR1cmUsIHVzZXJBY3Rpb24uZml4dHVyZURhdGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVEYXRhID0ge1xyXG4gICAgICAgICAgLi4udGFyZ2V0Rml4dHVyZSxcclxuICAgICAgICAgIHRhc2tUeXBlOiBcImZpeHR1cmVcIixcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZS5maXh0dXJlRGF0YSA9IHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YTtcclxuXHJcbiAgICAgICAgdGhpcy5lZGl0Rml4dHVyZSA9IHRydWU7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmVkaXRGaXh0dXJlU2VjdGlvbiA9IHVzZXJBY3Rpb24/LnRhYiA/PyBcImJhc2ljLWRldGFpbHNcIjtcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0sIDEwMCk7XHJcblxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgYW5zd2VySWQgPSB1c2VyQWN0aW9uLmZlZWRiYWNrPy5hbnN3ZXJzPy5bMF0/Ll9pZDtcclxuICAgICAgaWYgKCFhbnN3ZXJJZCkgcmV0dXJuO1xyXG5cclxuICAgICAgLy8gYWNjZXB0QWkgLyBrZWVwUGxhbm8g4oCUIG1lcmdlIGZpeHR1cmUgZGF0YSBhbmQgc2F2ZVxyXG4gICAgICBpZiAodXNlckFjdGlvbi5hY3Rpb24gPT09IFwiYWNjZXB0QWlcIikge1xyXG4gICAgICAgIHRhcmdldEZpeHR1cmUgPSB0aGlzLm1lcmdlQWlGaXh0dXJlRGF0YSh0YXJnZXRGaXh0dXJlLCB1c2VyQWN0aW9uLmZpeHR1cmVEYXRhKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHVzZXJBY3Rpb24uYWN0aW9uID09PSBcImtlZXBQbGFub1wiKSB7XHJcbiAgICAgICAgY29uc3QgY3VycmVudExhYmVsID0gdGFyZ2V0Rml4dHVyZS5oZWFkZXI/LmxhYmVsO1xyXG4gICAgICAgIHRhcmdldEZpeHR1cmUgPSB7XHJcbiAgICAgICAgICAuLi50YXJnZXRGaXh0dXJlLFxyXG4gICAgICAgICAgLi4udXNlckFjdGlvbi5maXh0dXJlRGF0YSxcclxuICAgICAgICAgIGhlYWRlcjoge1xyXG4gICAgICAgICAgICAuLi50YXJnZXRGaXh0dXJlLmhlYWRlcixcclxuICAgICAgICAgICAgLi4udXNlckFjdGlvbi5maXh0dXJlRGF0YT8uaGVhZGVyLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICghdGFyZ2V0Rml4dHVyZS5oZWFkZXI/LmxhYmVsPy50cmltKCkpIHtcclxuICAgICAgICAgIHRhcmdldEZpeHR1cmUuaGVhZGVyLmxhYmVsID0gY3VycmVudExhYmVsO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gU3RlcCAxOiBVcGRhdGUgZml4dHVyZSBkYXRhIChza2lwIGZvciByZWRvIOKAlCBvbmx5IHN0YXR1cyB1cGRhdGUgbmVlZGVkKVxyXG4gICAgICBpZiAodXNlckFjdGlvbi5hY3Rpb24gIT09IFwicmVkb1wiKSB7XHJcbiAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlU3RvcmVGaXh0dXJlKHtcclxuICAgICAgICAgICAgZml4dHVyZUlkOiB0aGlzLnNlbGVjdGVkRml4dHVyZS5maXh0dXJlSWQsXHJcbiAgICAgICAgICAgIGRhdGE6IHRhcmdldEZpeHR1cmUsXHJcbiAgICAgICAgICAgIHRhc2tUeXBlOiBcImZpeHR1cmVcIixcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFN0ZXAgMjogVXBkYXRlIGNvbXBsaWFuY2Ugc3RhdHVzXHJcbiAgICAgIGNvbnN0IGZlZWRiYWNrID0gdXNlckFjdGlvbi5mZWVkYmFjaztcclxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgICBfaWQ6IGZlZWRiYWNrLl9pZCxcclxuICAgICAgICBhbnN3ZXJJZDogYW5zd2VySWQsXHJcbiAgICAgICAgdHlwZTogdXNlckFjdGlvbi50eXBlLFxyXG4gICAgICAgIHVzZXJBY3Rpb246IHVzZXJBY3Rpb24uYWN0aW9uLFxyXG4gICAgICAgIGNvbW1lbnRzOiB1c2VyQWN0aW9uLnJlbWFya3MsXHJcbiAgICAgICAgdGFza1R5cGU6IHVzZXJBY3Rpb24udGFza1R5cGUsXHJcbiAgICAgICAgcGxhbm9JZDogdXNlckFjdGlvbi5wbGFub0lkLFxyXG4gICAgICAgIGZsb29ySWQ6IHVzZXJBY3Rpb24uZmxvb3JJZCxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5hcGlTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVDb21wbGlhbmNlU3RhdHVzKHBheWxvYWQpLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCFyZXMgJiYgdXNlckFjdGlvbi50eXBlICE9IFwiYWdyZWVcIikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gU3RlcCAzOiBSZWZyZXNoXHJcbiAgICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmdldFN0b3JlRml4dHVyZXModGhpcy5wbGFub0RhdGEuX2lkKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gZXhlY3V0ZSB1c2VyIGFjdGlvblwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWVyZ2VBaUZpeHR1cmVEYXRhKHRhcmdldEZpeHR1cmU6IGFueSwgZml4dHVyZURhdGE6IGFueSk6IGFueSB7XHJcbiAgICBjb25zdCBjdXJyZW50TGFiZWwgPSB0YXJnZXRGaXh0dXJlLmhlYWRlcj8ubGFiZWw7XHJcblxyXG4gICAgY29uc3QgbWVyZ2VkID0ge1xyXG4gICAgICAuLi50YXJnZXRGaXh0dXJlLFxyXG4gICAgICAuLi5maXh0dXJlRGF0YSxcclxuICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgLi4udGFyZ2V0Rml4dHVyZS5oZWFkZXIsXHJcbiAgICAgICAgLi4uZml4dHVyZURhdGE/LmhlYWRlcixcclxuICAgICAgfSxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgYWlMYWJlbCA9IGZpeHR1cmVEYXRhPy5oZWFkZXI/LmxhYmVsPy50cmltKCk7XHJcbiAgICBpZiAoIWFpTGFiZWwgfHwgYWlMYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiaGVhZGVyIG5vdCBpZGVudGlmaWVkXCIpKSB7XHJcbiAgICAgIG1lcmdlZC5oZWFkZXIubGFiZWwgPSBjdXJyZW50TGFiZWw7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1lcmdlZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVwbGFjZUZpeHR1cmVJbkZsb29yRGF0YShmaXh0dXJlSWQ6IHN0cmluZywgbWVyZ2VkRml4dHVyZTogYW55KSB7XHJcbiAgICBpZiAoIXRoaXMuZmxvb3JEYXRhKSByZXR1cm47XHJcbiAgICBjb25zdCByZXBsYWNlSW5BcnJheSA9IChhcnI6IGFueVtdIHwgdW5kZWZpbmVkKSA9PiB7XHJcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGNvbnN0IGlkeCA9IGFyci5maW5kSW5kZXgoKGY6IGFueSkgPT4gZj8uX2lkID09PSBmaXh0dXJlSWQpO1xyXG4gICAgICBpZiAoaWR4ID49IDApIHtcclxuICAgICAgICBhcnJbaWR4XSA9IHsgLi4uYXJyW2lkeF0sIC4uLm1lcmdlZEZpeHR1cmUsIF9pZDogYXJyW2lkeF0uX2lkIH07XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uKSkge1xyXG4gICAgICBmb3IgKGNvbnN0IGxwIG9mIHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24pIHtcclxuICAgICAgICBpZiAocmVwbGFjZUluQXJyYXkobHA/LmZpeHR1cmVzKSkgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXBsYWNlSW5BcnJheSh0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRMb2NhbEFjdGlvbkNvbW1lbnQoXHJcbiAgICByZXNwb25zZXR5cGU6IHN0cmluZyxcclxuICAgIGNvbW1lbnQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXHJcbiAgKTogYW55IHtcclxuICAgIGxldCB1c2VyRGF0YTogYW55ID0ge307XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInVzZXItaW5mb1wiKTtcclxuICAgICAgaWYgKHJhdykgdXNlckRhdGEgPSBKU09OLnBhcnNlKHJhdyk7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgdXNlckRhdGEgPSB7fTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVzZXJJZDogdXNlckRhdGE/Ll9pZCxcclxuICAgICAgdXNlck5hbWU6IHVzZXJEYXRhPy51c2VyTmFtZSxcclxuICAgICAgcm9sZTogdXNlckRhdGE/LnJvbGUsXHJcbiAgICAgIHJlc3BvbnNldHlwZSxcclxuICAgICAgY29tbWVudDogY29tbWVudCA/PyBudWxsLFxyXG4gICAgICB0aW1lU3RhbXA6IG5ldyBEYXRlKCksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gWm9uZS12ZXJpZmljYXRpb24gbWVyZ2U6IG92ZXJsYXkgb25seSBoZWFkZXIubGFiZWwgYW5kIHBlci16b25lIHByb2R1Y3RCcmFuZE5hbWVcclxuICAvLyBmcm9tIHRoZSByZXNwb25zZSBvbnRvIHRoZSBleGlzdGluZyB0ZW1wbGF0ZS5cclxuICBwcml2YXRlIG1lcmdlWm9uZUZpeHR1cmVEYXRhKHRhcmdldEZpeHR1cmU6IGFueSwgcmVzcG9uc2VGaXh0dXJlOiBhbnkpOiBhbnkge1xyXG4gICAgY29uc3QgbWVyZ2VkID0gc3RydWN0dXJlZENsb25lKHRhcmdldEZpeHR1cmUpO1xyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlTGFiZWwgPSByZXNwb25zZUZpeHR1cmU/LmhlYWRlcj8ubGFiZWw/LnRyaW0oKTtcclxuICAgIGlmIChyZXNwb25zZUxhYmVsKSB7XHJcbiAgICAgIG1lcmdlZC5oZWFkZXIgPSB7IC4uLihtZXJnZWQuaGVhZGVyID8/IHt9KSwgbGFiZWw6IHJlc3BvbnNlTGFiZWwgfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB6b25lVG9CcmFuZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcclxuICAgIChyZXNwb25zZUZpeHR1cmU/LnNoZWxmQ29uZmlnID8/IFtdKS5mb3JFYWNoKChzaGVsZjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHpvbmUgPSBzaGVsZj8uem9uZTtcclxuICAgICAgY29uc3QgYnJhbmQgPSBzaGVsZj8ucHJvZHVjdEJyYW5kTmFtZTtcclxuICAgICAgaWYgKCF6b25lIHx8ICFBcnJheS5pc0FycmF5KGJyYW5kKSB8fCBicmFuZC5sZW5ndGggPT09IDApIHJldHVybjtcclxuICAgICAgaWYgKCF6b25lVG9CcmFuZC5oYXMoem9uZSkpIHtcclxuICAgICAgICB6b25lVG9CcmFuZC5zZXQoem9uZSwgYnJhbmQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAobWVyZ2VkLnNoZWxmQ29uZmlnID8/IFtdKS5mb3JFYWNoKChzaGVsZjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGJyYW5kID0gc2hlbGY/LnpvbmUgPyB6b25lVG9CcmFuZC5nZXQoc2hlbGYuem9uZSkgOiBudWxsO1xyXG4gICAgICBpZiAoYnJhbmQpIHtcclxuICAgICAgICBzaGVsZi5wcm9kdWN0QnJhbmROYW1lID0gWy4uLmJyYW5kXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG1lcmdlZDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGhhbmRsZVpvbmVGZWVkYmFja0FjdGlvbih1c2VyQWN0aW9uOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZpeHR1cmVJZCA9IHRoaXMuc2VsZWN0ZWRGaXh0dXJlPy5maXh0dXJlSWQ7XHJcbiAgICAgIGlmICghZml4dHVyZUlkKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBmaXh0dXJlSW5kZXggPSB0aGlzLmFsbEZpeHR1cmVJbnN0YW5jZXMuZmluZEluZGV4KFxyXG4gICAgICAgIChmOiBhbnkpID0+IGYuX2lkID09PSBmaXh0dXJlSWQsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChmaXh0dXJlSW5kZXggPCAwKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBiYXNlRml4dHVyZSA9IHN0cnVjdHVyZWRDbG9uZShcclxuICAgICAgICB0aGlzLmFsbEZpeHR1cmVJbnN0YW5jZXNbZml4dHVyZUluZGV4XSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIGVkaXRXaXRoUmVzcG9uc2U6IG9wZW4gdGhlIGVkaXQgcGFuZWwgcHJlLXBvcHVsYXRlZCB3aXRoIG1lcmdlZCBkYXRhXHJcbiAgICAgIGlmICh1c2VyQWN0aW9uLmFjdGlvbiA9PT0gXCJlZGl0V2l0aFJlc3BvbnNlXCIpIHtcclxuICAgICAgICB0aGlzLmVkaXRGcm9tVGFiID0gXCJ6b25lXCI7XHJcbiAgICAgICAgY29uc3QgbWVyZ2VkID0gdGhpcy5tZXJnZVpvbmVGaXh0dXJlRGF0YShcclxuICAgICAgICAgIGJhc2VGaXh0dXJlLFxyXG4gICAgICAgICAgdXNlckFjdGlvbi5maXh0dXJlRGF0YSxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YSA9IHtcclxuICAgICAgICAgIC4uLm1lcmdlZCxcclxuICAgICAgICAgIHVzZXJBY3Rpb246IHVzZXJBY3Rpb24uYWN0aW9uLFxyXG4gICAgICAgICAgdGFza1R5cGU6IFwiem9uZVZlcmlmaWNhdGlvblwiLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmUuZml4dHVyZURhdGEgPSB0aGlzLnNlbGVjdGVkRml4dHVyZURhdGE7XHJcbiAgICAgICAgdGhpcy5lZGl0Rml4dHVyZSA9IHRydWU7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmVkaXRGaXh0dXJlU2VjdGlvbiA9IFwiYmFzaWMtZGV0YWlsc1wiO1xyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGFuc3dlcklkID0gdXNlckFjdGlvbi5mZWVkYmFjaz8uYW5zd2Vycz8uWzBdPy5faWQ7XHJcbiAgICAgIGNvbnN0IHRhc2tJZCA9IHRoaXMuem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uVGFzaz8uX2lkO1xyXG4gICAgICBpZiAoIWFuc3dlcklkIHx8ICF0YXNrSWQpIHJldHVybjtcclxuXHJcbiAgICAgIC8vIHJlZG86IGRvbid0IHRvdWNoIHRoZSBwbGFub0ZpeHR1cmUg4oCUIG9ubHkgcmVjb3JkIHRoZSByZWplY3Rpb24gb24gdGhlIGNvbXBsaWFuY2UgZG9jXHJcbiAgICAgIC8vIHNvIHRoZSByZWRvIHJvdW5kIGNhbiByZS1jb2xsZWN0IHRoaXMgZml4dHVyZSdzIHJlc3BvbnNlIGZyb20gbW9iaWxlLlxyXG4gICAgICBpZiAodXNlckFjdGlvbi5hY3Rpb24gPT09IFwicmVkb1wiKSB7XHJcbiAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlWm9uZVZlcmlmaWNhdGlvblN0YXR1cyh7XHJcbiAgICAgICAgICAgIF9pZDogdXNlckFjdGlvbi5mZWVkYmFjay5faWQsXHJcbiAgICAgICAgICAgIGFuc3dlcklkLFxyXG4gICAgICAgICAgICB0YXNrSWQsXHJcbiAgICAgICAgICAgIHR5cGU6IHVzZXJBY3Rpb24udHlwZSxcclxuICAgICAgICAgICAgdXNlckFjdGlvbjogdXNlckFjdGlvbi5hY3Rpb24sXHJcbiAgICAgICAgICAgIGNvbW1lbnRzOiB1c2VyQWN0aW9uLnJlbWFya3MsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCB6b25lUm93c1JlZG8gPSB0aGlzLnpvbmVGZWVkYmFjaz8uem9uZVZlcmlmaWNhdGlvbkRhdGEgPz8gW107XHJcbiAgICAgICAgY29uc3Qgem9uZVJvd1JlZG8gPSB6b25lUm93c1JlZG8uZmluZChcclxuICAgICAgICAgIChyOiBhbnkpID0+IHI/LmZpeHR1cmVJZD8udG9TdHJpbmc/LigpID09PSBmaXh0dXJlSWQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoem9uZVJvd1JlZG8/LmFuc3dlcnM/LlswXSkge1xyXG4gICAgICAgICAgem9uZVJvd1JlZG8uYW5zd2Vyc1swXS51c2VyQWN0aW9uID0gdXNlckFjdGlvbi5hY3Rpb247XHJcbiAgICAgICAgICB6b25lUm93UmVkby5hbnN3ZXJzWzBdLnN0YXR1cyA9IHVzZXJBY3Rpb24udHlwZTtcclxuICAgICAgICAgIGNvbnN0IGFucyA9IHpvbmVSb3dSZWRvLmFuc3dlcnNbMF07XHJcbiAgICAgICAgICBhbnMuY29tbWVudHMgPSBhbnMuY29tbWVudHMgPz8gW107XHJcbiAgICAgICAgICBhbnMuY29tbWVudHMucHVzaChcclxuICAgICAgICAgICAgdGhpcy5idWlsZExvY2FsQWN0aW9uQ29tbWVudCh1c2VyQWN0aW9uLnR5cGUsIHVzZXJBY3Rpb24ucmVtYXJrcyksXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVjdEZpeHR1cmVGZWVkYmFjayhmaXh0dXJlSWQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8ga2VlcFBsYW5vIC8gYWNjZXB0UmVzcG9uc2UgLyBlZGl0QWNjZXB0ZWQ6IGJ1aWxkIG1lcmdlZCBmaXh0dXJlIGFuZCBwZXJzaXN0XHJcbiAgICAgIGxldCBtZXJnZWRGaXh0dXJlID0gYmFzZUZpeHR1cmU7XHJcbiAgICAgIGlmIChcclxuICAgICAgICB1c2VyQWN0aW9uLmFjdGlvbiA9PT0gXCJhY2NlcHRSZXNwb25zZVwiIHx8XHJcbiAgICAgICAgdXNlckFjdGlvbi5hY3Rpb24gPT09IFwiZWRpdEFjY2VwdGVkXCJcclxuICAgICAgKSB7XHJcbiAgICAgICAgbWVyZ2VkRml4dHVyZSA9IHRoaXMubWVyZ2Vab25lRml4dHVyZURhdGEoXHJcbiAgICAgICAgICBiYXNlRml4dHVyZSxcclxuICAgICAgICAgIHVzZXJBY3Rpb24uZml4dHVyZURhdGEsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5hcGlTZXJ2aWNlLnVwZGF0ZVN0b3JlRml4dHVyZSh7XHJcbiAgICAgICAgICBmaXh0dXJlSWQsXHJcbiAgICAgICAgICBkYXRhOiBtZXJnZWRGaXh0dXJlLFxyXG4gICAgICAgICAgdGFza1R5cGU6IFwiem9uZVZlcmlmaWNhdGlvblwiLFxyXG4gICAgICAgIH0pLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgbW9kaWZpZWRBbnN3ZXIgPVxyXG4gICAgICAgIHVzZXJBY3Rpb24uYWN0aW9uID09PSBcImVkaXRBY2NlcHRlZFwiXHJcbiAgICAgICAgICA/IHRoaXMuYnVpbGRab25lTW9kaWZpZWRBbnN3ZXIodXNlckFjdGlvbi5maXh0dXJlRGF0YSlcclxuICAgICAgICAgIDogbnVsbDtcclxuXHJcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuYXBpU2VydmljZS51cGRhdGVab25lVmVyaWZpY2F0aW9uU3RhdHVzKHtcclxuICAgICAgICAgIF9pZDogdXNlckFjdGlvbi5mZWVkYmFjay5faWQsXHJcbiAgICAgICAgICBhbnN3ZXJJZCxcclxuICAgICAgICAgIHRhc2tJZCxcclxuICAgICAgICAgIHR5cGU6IHVzZXJBY3Rpb24udHlwZSxcclxuICAgICAgICAgIHVzZXJBY3Rpb246IHVzZXJBY3Rpb24uYWN0aW9uLFxyXG4gICAgICAgICAgY29tbWVudHM6IHVzZXJBY3Rpb24ucmVtYXJrcyxcclxuICAgICAgICAgIC4uLihtb2RpZmllZEFuc3dlciA/IHsgbW9kaWZpZWRBbnN3ZXIgfSA6IHt9KSxcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIExvY2FsIHN0YXRlIHVwZGF0ZSDigJQga2VlcCBVSSBpbiBzeW5jIHdpdGhvdXQgcmUtZmV0Y2hpbmcuXHJcbiAgICAgIHRoaXMuYWxsRml4dHVyZUluc3RhbmNlc1tmaXh0dXJlSW5kZXhdID0gbWVyZ2VkRml4dHVyZTtcclxuICAgICAgdGhpcy5yZXBsYWNlRml4dHVyZUluRmxvb3JEYXRhKGZpeHR1cmVJZCwgbWVyZ2VkRml4dHVyZSk7XHJcbiAgICAgIHRoaXMucmVuZGVyRmxvb3IoZmFsc2UpO1xyXG5cclxuICAgICAgY29uc3Qgem9uZVJvd3MgPSB0aGlzLnpvbmVGZWVkYmFjaz8uem9uZVZlcmlmaWNhdGlvbkRhdGEgPz8gW107XHJcbiAgICAgIGNvbnN0IHpvbmVSb3cgPSB6b25lUm93cy5maW5kKFxyXG4gICAgICAgIChyOiBhbnkpID0+IHI/LmZpeHR1cmVJZD8udG9TdHJpbmc/LigpID09PSBmaXh0dXJlSWQsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICh6b25lUm93Py5hbnN3ZXJzPy5bMF0pIHtcclxuICAgICAgICB6b25lUm93LmFuc3dlcnNbMF0udXNlckFjdGlvbiA9IHVzZXJBY3Rpb24uYWN0aW9uO1xyXG4gICAgICAgIHpvbmVSb3cuYW5zd2Vyc1swXS5zdGF0dXMgPSB1c2VyQWN0aW9uLnR5cGU7XHJcbiAgICAgICAgY29uc3QgYW5zID0gem9uZVJvdy5hbnN3ZXJzWzBdO1xyXG4gICAgICAgIGFucy5jb21tZW50cyA9IGFucy5jb21tZW50cyA/PyBbXTtcclxuICAgICAgICBhbnMuY29tbWVudHMucHVzaChcclxuICAgICAgICAgIHRoaXMuYnVpbGRMb2NhbEFjdGlvbkNvbW1lbnQodXNlckFjdGlvbi50eXBlLCB1c2VyQWN0aW9uLnJlbWFya3MpLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmIChtb2RpZmllZEFuc3dlcikge1xyXG4gICAgICAgICAgLy8gQXBwbHkgdGhlIHNhbWUgb3ZlcmxheSB0aGUgYmFja2VuZCB3aWxsIGFwcGx5IG9uIG5leHQgcmVhZCwgc28gdGhlXHJcbiAgICAgICAgICAvLyBwYW5lbCByZWZsZWN0cyB0aGUgZWRpdHMgd2l0aG91dCB3YWl0aW5nIGZvciBhIHJlZmV0Y2guXHJcbiAgICAgICAgICBhbnMuaGVhZGVyID0ge1xyXG4gICAgICAgICAgICAuLi4oYW5zLmhlYWRlciA/PyB7fSksXHJcbiAgICAgICAgICAgIGxhYmVsOiBtb2RpZmllZEFuc3dlci5oZWFkZXIubGFiZWwsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgKGFucy5zaGVsZkNvbmZpZyA/PyBbXSkuZm9yRWFjaCgoc2hlbGY6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBicmFuZHMgPVxyXG4gICAgICAgICAgICAgIHNoZWxmPy56b25lICYmIG1vZGlmaWVkQW5zd2VyLnNoZWxmQnJhbmRzQnlab25lW3NoZWxmLnpvbmVdO1xyXG4gICAgICAgICAgICBpZiAoYnJhbmRzKSBzaGVsZi5wcm9kdWN0QnJhbmROYW1lID0gWy4uLmJyYW5kc107XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGFucy5tb2RpZmllZEFuc3dlciA9IG1vZGlmaWVkQW5zd2VyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jYWxjdWxhdGVQdWJsaXNoaW5nU3RhdGUoKTtcclxuICAgICAgdGhpcy5zZWxlY3RGaXh0dXJlRmVlZGJhY2soZml4dHVyZUlkKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gZXhlY3V0ZSB6b25lIGFjdGlvblwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRab25lTW9kaWZpZWRBbnN3ZXIoZml4dHVyZURhdGE6IGFueSk6IHtcclxuICAgIGhlYWRlcjogeyBsYWJlbDogc3RyaW5nIH07XHJcbiAgICBzaGVsZkJyYW5kc0J5Wm9uZTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xyXG4gIH0ge1xyXG4gICAgY29uc3Qgc2hlbGZCcmFuZHNCeVpvbmU6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xyXG4gICAgKGZpeHR1cmVEYXRhPy5zaGVsZkNvbmZpZyA/PyBbXSkuZm9yRWFjaCgoc2hlbGY6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCB6b25lID0gc2hlbGY/LnpvbmU7XHJcbiAgICAgIGlmICghem9uZSB8fCBzaGVsZkJyYW5kc0J5Wm9uZVt6b25lXSkgcmV0dXJuO1xyXG4gICAgICBzaGVsZkJyYW5kc0J5Wm9uZVt6b25lXSA9IEFycmF5LmlzQXJyYXkoc2hlbGY/LnByb2R1Y3RCcmFuZE5hbWUpXHJcbiAgICAgICAgPyBbLi4uc2hlbGYucHJvZHVjdEJyYW5kTmFtZV1cclxuICAgICAgICA6IFtdO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBoZWFkZXI6IHsgbGFiZWw6IGZpeHR1cmVEYXRhPy5oZWFkZXI/LmxhYmVsID8/IFwiXCIgfSxcclxuICAgICAgc2hlbGZCcmFuZHNCeVpvbmUsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwZXJzaXN0Wm9uZUVkaXRBY2NlcHRlZCgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZpeHR1cmVJZCA9IHRoaXMuc2VsZWN0ZWRGaXh0dXJlPy5maXh0dXJlSWQ7XHJcbiAgICAgIGlmICghZml4dHVyZUlkKSByZXR1cm47XHJcbiAgICAgIGNvbnN0IHpvbmVSb3dzID0gdGhpcy56b25lRmVlZGJhY2s/LnpvbmVWZXJpZmljYXRpb25EYXRhID8/IFtdO1xyXG4gICAgICBjb25zdCB6b25lUm93ID0gem9uZVJvd3MuZmluZChcclxuICAgICAgICAocjogYW55KSA9PiByPy5maXh0dXJlSWQ/LnRvU3RyaW5nPy4oKSA9PT0gZml4dHVyZUlkLFxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBhbnN3ZXJJZCA9IHpvbmVSb3c/LmFuc3dlcnM/LlswXT8uX2lkO1xyXG4gICAgICBjb25zdCB0YXNrSWQgPSB0aGlzLnpvbmVGZWVkYmFjaz8uem9uZVZlcmlmaWNhdGlvblRhc2s/Ll9pZDtcclxuICAgICAgaWYgKCFhbnN3ZXJJZCB8fCAhdGFza0lkKSByZXR1cm47XHJcblxyXG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlWm9uZVZlcmlmaWNhdGlvblN0YXR1cyh7XHJcbiAgICAgICAgICBfaWQ6IHpvbmVSb3cuX2lkLFxyXG4gICAgICAgICAgYW5zd2VySWQsXHJcbiAgICAgICAgICB0YXNrSWQsXHJcbiAgICAgICAgICB0eXBlOiBcImFncmVlXCIsXHJcbiAgICAgICAgICB1c2VyQWN0aW9uOiBcImVkaXRBY2NlcHRlZFwiLFxyXG4gICAgICAgICAgY29tbWVudHM6IG51bGwsXHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoem9uZVJvdz8uYW5zd2Vycz8uWzBdKSB7XHJcbiAgICAgICAgem9uZVJvdy5hbnN3ZXJzWzBdLnVzZXJBY3Rpb24gPSBcImVkaXRBY2NlcHRlZFwiO1xyXG4gICAgICAgIHpvbmVSb3cuYW5zd2Vyc1swXS5zdGF0dXMgPSBcImFncmVlXCI7XHJcbiAgICAgICAgY29uc3QgYW5zID0gem9uZVJvdy5hbnN3ZXJzWzBdO1xyXG4gICAgICAgIGFucy5jb21tZW50cyA9IGFucy5jb21tZW50cyA/PyBbXTtcclxuICAgICAgICBhbnMuY29tbWVudHMucHVzaCh0aGlzLmJ1aWxkTG9jYWxBY3Rpb25Db21tZW50KFwiYWdyZWVcIiwgbnVsbCkpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgIFwiRmFpbGVkIHRvIHJlY29yZCB6b25lIGVkaXQgYWNjZXB0YW5jZVwiLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcm90YXRlV2FsbChlbGVOdW1iZXI6IG51bWJlcikge1xyXG4gICAgY29uc3Qgd2FsbCA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZmluZChcclxuICAgICAgKGVsOiBhbnkpID0+IGVsLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiBlbC5lbGVtZW50TnVtYmVyID09PSBlbGVOdW1iZXIsXHJcbiAgICApO1xyXG4gICAgaWYgKHdhbGwuYW5nbGUgKyA5MCA8IDM2MCkge1xyXG4gICAgICB3YWxsLmFuZ2xlICs9IDkwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgd2FsbC5hbmdsZSA9IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmRlckZsb29yKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgYWRkTmV3V2FsbChlbGVOdW1iZXI6IG51bWJlcikge1xyXG4gICAgY29uc3QgZ2V0V2FsbEVuZFBvaW50ID0gKHdhbGw6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBhbmdsZVJhZCA9ICh3YWxsLmFuZ2xlICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICAgIGNvbnN0IGxlbmd0aCA9IHdhbGwuZGlzdGFuY2U7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHg6IHdhbGwucmVsYXRpdmVQb3NpdGlvbi54ICsgbGVuZ3RoICogTWF0aC5jb3MoYW5nbGVSYWQpLFxyXG4gICAgICAgIHk6IHdhbGwucmVsYXRpdmVQb3NpdGlvbi55ICsgbGVuZ3RoICogTWF0aC5zaW4oYW5nbGVSYWQpLFxyXG4gICAgICAgIHVuaXQ6IHdhbGwucmVsYXRpdmVQb3NpdGlvbi51bml0LFxyXG4gICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZmluZEluZGV4KFxyXG4gICAgICAodzogYW55KSA9PiB3LmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiB3LmVsZW1lbnROdW1iZXIgPT09IGVsZU51bWJlcixcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGluZGV4ID09PSAtMSAmJiBlbGVOdW1iZXIgIT09IDApIHJldHVybjtcclxuXHJcbiAgICBsZXQgc3RhcnRQb3NpdGlvbjtcclxuXHJcbiAgICBpZiAoZWxlTnVtYmVyID09PSAwKSB7XHJcbiAgICAgIHN0YXJ0UG9zaXRpb24gPSB7XHJcbiAgICAgICAgeDogMCxcclxuICAgICAgICB5OiAwLFxyXG4gICAgICAgIHVuaXQ6IFwiZnRcIixcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHByZXZXYWxsID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbltpbmRleF07XHJcbiAgICAgIHN0YXJ0UG9zaXRpb24gPSBnZXRXYWxsRW5kUG9pbnQocHJldldhbGwpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJhc2VXYWxsID1cclxuICAgICAgZWxlTnVtYmVyID09PSAwXHJcbiAgICAgICAgPyB7IGFuZ2xlOiAwLCBkaXJlY3Rpb246IFwicmlnaHRcIiwgdW5pdDogXCJmdFwiIH1cclxuICAgICAgICA6IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb25baW5kZXhdO1xyXG5cclxuICAgIGNvbnN0IG5ld1dhbGwgPSB7XHJcbiAgICAgIGVsZW1lbnRUeXBlOiBcIndhbGxcIixcclxuICAgICAgZGlzdGFuY2U6IDE1LFxyXG4gICAgICB1bml0OiBiYXNlV2FsbC51bml0LFxyXG4gICAgICBkaXJlY3Rpb246IGJhc2VXYWxsLmRpcmVjdGlvbixcclxuICAgICAgYW5nbGU6IGJhc2VXYWxsLmFuZ2xlLFxyXG4gICAgICBlbGVtZW50TnVtYmVyOiBlbGVOdW1iZXIgKyAxLFxyXG4gICAgICByZWxhdGl2ZVBvc2l0aW9uOiBzdGFydFBvc2l0aW9uLFxyXG4gICAgICBmaXh0dXJlczogW10sXHJcbiAgICAgIG90aGVyRWxlbWVudHM6IFtdLFxyXG4gICAgICBuZXdBZGRlZDogdHJ1ZSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5zcGxpY2UoXHJcbiAgICAgIGVsZU51bWJlciA9PT0gMCA/IDAgOiBpbmRleCArIDEsXHJcbiAgICAgIDAsXHJcbiAgICAgIG5ld1dhbGwsXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMudXBkYXRlV2FsbEVsZW1lbnROdW1iZXIoKTtcclxuICAgIHRoaXMudXBkYXRlV2FsbENvb3JkaW5hdGVzKCk7XHJcbiAgICB0aGlzLnJlbmRlckZsb29yKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgYWRkTmV3RW50cmFuY2UoKSB7XHJcbiAgICBjb25zdCBsYXlvdXRQb2x5Z29uID0gdGhpcy5mbG9vckRhdGE/LmxheW91dFBvbHlnb24gPz8gW107XHJcbiAgICBjb25zdCBlbGVOdW1iZXIgPVxyXG4gICAgICBsYXlvdXRQb2x5Z29uLmZpbHRlcigoZWxlOiBhbnkpID0+IGVsZS5lbGVtZW50VHlwZSA9PT0gXCJlbnRyYW5jZVwiKVxyXG4gICAgICAgID8ubGVuZ3RoID8/IDA7XHJcblxyXG4gICAgY29uc3QgZ2FwUHggPSAyNDtcclxuICAgIGNvbnN0IGRlZmF1bHRFbnRyYW5jZVdpZHRoUHggPSA4MDtcclxuXHJcbiAgICBsZXQgeEZ0ID0gMDtcclxuICAgIGxldCB5RnQgPSAwO1xyXG4gICAgbGV0IGFuZ2xlID0gMDtcclxuICAgIGxldCBpc1Bvc2l0aW9uUmVzb2x2ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyAxKSBJZiBlbnRyYW5jZShzKSBhbHJlYWR5IGV4aXN0LCBwbGFjZSBuZXh0IHRvIHRoZSBsYXRlc3Qgb25lLlxyXG4gICAgY29uc3QgZXhpc3RpbmdFbnRyYW5jZU9iamVjdHMgPSAodGhpcy5jYW52YXM/LmdldE9iamVjdHMoKSA/PyBbXSlcclxuICAgICAgLmZpbHRlcigob2JqOiBhbnkpID0+IG9iaj8ub2JqVHlwZSA9PT0gXCJlbnRyYW5jZVwiKVxyXG4gICAgICAuc29ydChcclxuICAgICAgICAoYTogYW55LCBiOiBhbnkpID0+XHJcbiAgICAgICAgICBOdW1iZXIoYT8uZGF0YT8uZWxlbWVudE51bWJlciB8fCAwKSAtXHJcbiAgICAgICAgICBOdW1iZXIoYj8uZGF0YT8uZWxlbWVudE51bWJlciB8fCAwKSxcclxuICAgICAgKTtcclxuXHJcbiAgICBjb25zdCBsYXRlc3RFbnRyYW5jZU9iaiA9IGV4aXN0aW5nRW50cmFuY2VPYmplY3RzLmF0KC0xKSBhcyBhbnk7XHJcblxyXG4gICAgaWYgKGxhdGVzdEVudHJhbmNlT2JqKSB7XHJcbiAgICAgIGNvbnN0IGxlZnRQeCA9IGxhdGVzdEVudHJhbmNlT2JqLmxlZnQgPz8gMDtcclxuICAgICAgY29uc3QgdG9wUHggPSBsYXRlc3RFbnRyYW5jZU9iai50b3AgPz8gMDtcclxuICAgICAgY29uc3Qgd2lkdGhQeCA9XHJcbiAgICAgICAgbGF0ZXN0RW50cmFuY2VPYmouZ2V0U2NhbGVkV2lkdGg/LigpIHx8IGRlZmF1bHRFbnRyYW5jZVdpZHRoUHg7XHJcbiAgICAgIGNvbnN0IGFuY2hvckFuZ2xlID0gTnVtYmVyKGxhdGVzdEVudHJhbmNlT2JqLmFuZ2xlIHx8IDApO1xyXG4gICAgICBjb25zdCBhbmdsZVJhZCA9IChhbmNob3JBbmdsZSAqIE1hdGguUEkpIC8gMTgwO1xyXG4gICAgICBjb25zdCBzdGVwUHggPSB3aWR0aFB4ICsgZ2FwUHg7XHJcblxyXG4gICAgICB4RnQgPSB0aGlzLmZyb21QaXhlbHMobGVmdFB4ICsgc3RlcFB4ICogTWF0aC5jb3MoYW5nbGVSYWQpLCBcImZ0XCIpO1xyXG4gICAgICB5RnQgPSB0aGlzLmZyb21QaXhlbHModG9wUHggKyBzdGVwUHggKiBNYXRoLnNpbihhbmdsZVJhZCksIFwiZnRcIik7XHJcbiAgICAgIGFuZ2xlID0gYW5jaG9yQW5nbGU7XHJcbiAgICAgIGlzUG9zaXRpb25SZXNvbHZlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFpc1Bvc2l0aW9uUmVzb2x2ZWQpIHtcclxuICAgICAgY29uc3QgZXhpc3RpbmdFbnRyYW5jZXMgPSBsYXlvdXRQb2x5Z29uXHJcbiAgICAgICAgLmZpbHRlcigoZWxlOiBhbnkpID0+IGVsZS5lbGVtZW50VHlwZSA9PT0gXCJlbnRyYW5jZVwiKVxyXG4gICAgICAgIC5zb3J0KFxyXG4gICAgICAgICAgKGE6IGFueSwgYjogYW55KSA9PlxyXG4gICAgICAgICAgICBOdW1iZXIoYT8uZWxlbWVudE51bWJlciB8fCAwKSAtIE51bWJlcihiPy5lbGVtZW50TnVtYmVyIHx8IDApLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICBjb25zdCBsYXRlc3RFbnRyYW5jZSA9IGV4aXN0aW5nRW50cmFuY2VzLmF0KC0xKTtcclxuICAgICAgaWYgKGxhdGVzdEVudHJhbmNlKSB7XHJcbiAgICAgICAgY29uc3QgYW5jaG9yQW5nbGUgPSBOdW1iZXIobGF0ZXN0RW50cmFuY2U/LmFuZ2xlIHx8IDApO1xyXG4gICAgICAgIGNvbnN0IGFuZ2xlUmFkID0gKGFuY2hvckFuZ2xlICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICAgICAgY29uc3Qgc3RlcEZ0ID1cclxuICAgICAgICAgIE51bWJlcihcclxuICAgICAgICAgICAgbGF0ZXN0RW50cmFuY2U/LmRpc3RhbmNlIHx8XHJcbiAgICAgICAgICAgICAgdGhpcy5mcm9tUGl4ZWxzKGRlZmF1bHRFbnRyYW5jZVdpZHRoUHgsIFwiZnRcIiksXHJcbiAgICAgICAgICApICsgdGhpcy5mcm9tUGl4ZWxzKGdhcFB4LCBcImZ0XCIpO1xyXG5cclxuICAgICAgICB4RnQgPVxyXG4gICAgICAgICAgTnVtYmVyKGxhdGVzdEVudHJhbmNlPy5yZWxhdGl2ZVBvc2l0aW9uPy54IHx8IDApICtcclxuICAgICAgICAgIHN0ZXBGdCAqIE1hdGguY29zKGFuZ2xlUmFkKTtcclxuICAgICAgICB5RnQgPVxyXG4gICAgICAgICAgTnVtYmVyKGxhdGVzdEVudHJhbmNlPy5yZWxhdGl2ZVBvc2l0aW9uPy55IHx8IDApICtcclxuICAgICAgICAgIHN0ZXBGdCAqIE1hdGguc2luKGFuZ2xlUmFkKTtcclxuICAgICAgICBhbmdsZSA9IGFuY2hvckFuZ2xlO1xyXG4gICAgICAgIGlzUG9zaXRpb25SZXNvbHZlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAyKSBJZiBubyBlbnRyYW5jZSwgcGxhY2UgbmV4dCB0byB3YWxsLTEuXHJcbiAgICBpZiAoIWlzUG9zaXRpb25SZXNvbHZlZCkge1xyXG4gICAgICBjb25zdCB3YWxsMSA9IGxheW91dFBvbHlnb24uZmluZChcclxuICAgICAgICAoZWxlOiBhbnkpID0+XHJcbiAgICAgICAgICBlbGUuZWxlbWVudFR5cGUgPT09IFwid2FsbFwiICYmIE51bWJlcihlbGUuZWxlbWVudE51bWJlcikgPT09IDEsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAod2FsbDEpIHtcclxuICAgICAgICBjb25zdCB3YWxsQW5nbGUgPSBOdW1iZXIod2FsbDE/LmFuZ2xlIHx8IDApO1xyXG4gICAgICAgIGNvbnN0IHdhbGxBbmdsZVJhZCA9ICh3YWxsQW5nbGUgKiBNYXRoLlBJKSAvIDE4MDtcclxuICAgICAgICBjb25zdCBhbG9uZ1dhbGxGdCA9IE1hdGgubWluKE51bWJlcih3YWxsMT8uZGlzdGFuY2UgfHwgMCkgLyAyLCA0KTtcclxuICAgICAgICBjb25zdCBzaWRlT2Zmc2V0RnQgPSAxLjU7XHJcbiAgICAgICAgY29uc3Qgd2FsbFggPSBOdW1iZXIod2FsbDE/LnJlbGF0aXZlUG9zaXRpb24/LnggfHwgMCk7XHJcbiAgICAgICAgY29uc3Qgd2FsbFkgPSBOdW1iZXIod2FsbDE/LnJlbGF0aXZlUG9zaXRpb24/LnkgfHwgMCk7XHJcblxyXG4gICAgICAgIHhGdCA9XHJcbiAgICAgICAgICB3YWxsWCArXHJcbiAgICAgICAgICBhbG9uZ1dhbGxGdCAqIE1hdGguY29zKHdhbGxBbmdsZVJhZCkgK1xyXG4gICAgICAgICAgc2lkZU9mZnNldEZ0ICogLU1hdGguc2luKHdhbGxBbmdsZVJhZCk7XHJcbiAgICAgICAgeUZ0ID1cclxuICAgICAgICAgIHdhbGxZICtcclxuICAgICAgICAgIGFsb25nV2FsbEZ0ICogTWF0aC5zaW4od2FsbEFuZ2xlUmFkKSArXHJcbiAgICAgICAgICBzaWRlT2Zmc2V0RnQgKiBNYXRoLmNvcyh3YWxsQW5nbGVSYWQpO1xyXG4gICAgICAgIGFuZ2xlID0gd2FsbEFuZ2xlO1xyXG4gICAgICAgIGlzUG9zaXRpb25SZXNvbHZlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAzKSBJZiBubyB3YWxsIChlLmcuIGxheW91dFBvbHlnb24gaXMgZW1wdHkpLCBwbGFjZSBuZXh0IHRvIGFueSBjYW52YXMgb2JqZWN0LlxyXG4gICAgaWYgKCFpc1Bvc2l0aW9uUmVzb2x2ZWQpIHtcclxuICAgICAgY29uc3QgYW5jaG9yT2JqID0gKHRoaXMuY2FudmFzPy5nZXRPYmplY3RzKCkgPz8gW10pLmZpbmQoKG9iajogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICEhb2JqPy5vYmpUeXBlICYmIG9iaj8uaXNEaXNzZWN0aW9uTGluZSAhPT0gdHJ1ZTtcclxuICAgICAgfSkgYXMgYW55O1xyXG5cclxuICAgICAgaWYgKGFuY2hvck9iaikge1xyXG4gICAgICAgIGNvbnN0IGxlZnRQeCA9IGFuY2hvck9iai5sZWZ0ID8/IDA7XHJcbiAgICAgICAgY29uc3QgdG9wUHggPSBhbmNob3JPYmoudG9wID8/IDA7XHJcbiAgICAgICAgY29uc3Qgd2lkdGhQeCA9IGFuY2hvck9iai5nZXRTY2FsZWRXaWR0aD8uKCkgfHwgZGVmYXVsdEVudHJhbmNlV2lkdGhQeDtcclxuXHJcbiAgICAgICAgeEZ0ID0gdGhpcy5mcm9tUGl4ZWxzKGxlZnRQeCArIHdpZHRoUHggKyBnYXBQeCwgXCJmdFwiKTtcclxuICAgICAgICB5RnQgPSB0aGlzLmZyb21QaXhlbHModG9wUHgsIFwiZnRcIik7XHJcbiAgICAgICAgYW5nbGUgPSBOdW1iZXIoYW5jaG9yT2JqPy5hbmdsZSB8fCAwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld0VudHJhbmNlID0ge1xyXG4gICAgICBlbGVtZW50VHlwZTogXCJlbnRyYW5jZVwiLFxyXG4gICAgICBkaXN0YW5jZTogNixcclxuICAgICAgdW5pdDogXCJmdFwiLFxyXG4gICAgICBkaXJlY3Rpb246IFwidXBcIixcclxuICAgICAgYW5nbGUsXHJcbiAgICAgIGVsZW1lbnROdW1iZXI6IGVsZU51bWJlciArIDEsXHJcbiAgICAgIHJlbGF0aXZlUG9zaXRpb246IHtcclxuICAgICAgICB4OiB4RnQsXHJcbiAgICAgICAgeTogeUZ0LFxyXG4gICAgICAgIHVuaXQ6IFwiZnRcIixcclxuICAgICAgfSxcclxuICAgICAgZml4dHVyZXM6IFtdLFxyXG4gICAgICBvdGhlckVsZW1lbnRzOiBbXSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5wdXNoKG5ld0VudHJhbmNlKTtcclxuICAgIHRoaXMucmVuZGVyRmxvb3IodHJ1ZSk7XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMudXBkYXRlRW50cmFuY2VDb29yZGluYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkTmV3Rml4dHVyZShmaXh0dXJlVHlwZTogXCJ3YWxsXCIgfCBcImZsb29yXCIsIHdhbGxJbmRleD86IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMubGF5b3V0Rm9ybS5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgY29uc3QgdGVtcGxhdGU6IGFueSA9IGF3YWl0IHRoaXMuZ2V0VGVtcGxhdGUodGhpcy5maXh0dXJlVGVtcGxhdGVzWzBdLl9pZCk7XHJcbiAgICBjb25zdCB0ZW1wbGF0ZURhdGEgPSB0ZW1wbGF0ZS5kYXRhO1xyXG4gICAgY29uc3QgZml4dHVyZUlkID0gYG5ldy0ke2NyeXB0by5yYW5kb21VVUlEKCl9YDtcclxuICAgIGNvbnN0IGZpeHR1cmVHcm91cCA9IHRoaXMucGF0Y2hGaXh0dXJlKHtcclxuICAgICAgZml4dHVyZU5hbWU6IHRlbXBsYXRlRGF0YS5maXh0dXJlTmFtZSxcclxuICAgICAgZml4dHVyZUNvbmZpZ0lkOiB0ZW1wbGF0ZURhdGEuX2lkLFxyXG4gICAgICBfaWQ6IGZpeHR1cmVJZCxcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGZpeHR1cmVEYXRhID0ge1xyXG4gICAgICAuLi50ZW1wbGF0ZURhdGEsXHJcbiAgICAgIGZpeHR1cmVDb25maWdJZDogdGVtcGxhdGVEYXRhLl9pZCxcclxuICAgICAgcmVsYXRpdmVQb3NpdGlvbjogeyB4OiAwLCB5OiAwLCBhbmdsZTogMCwgdW5pdDogXCJmdFwiIH0sXHJcbiAgICAgIF9pZDogZml4dHVyZUlkLFxyXG4gICAgICB1bnNhdmVkQ2hhbmdlczogdHJ1ZSxcclxuICAgICAgbmV3QWRkZWQ6IHRydWUsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5sYXlvdXRIYXNVbnNhdmVkQ2hhbmdlcyA9IHRydWU7XHJcblxyXG4gICAgaWYgKGZpeHR1cmVUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICBjb25zdCB3YWxsRGF0YSA9IHRoaXMuZ2V0V2FsbEJ5TnVtYmVyKHdhbGxJbmRleCEgKyAxKTtcclxuXHJcbiAgICAgIGNvbnN0IHcgPSB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgIGZpeHR1cmVEYXRhLmZpeHR1cmVTdGF0aWNXaWR0aC52YWx1ZSxcclxuICAgICAgICBmaXh0dXJlRGF0YS5maXh0dXJlU3RhdGljV2lkdGgudW5pdCxcclxuICAgICAgKTtcclxuICAgICAgY29uc3Qgd3AgPSB0aGlzLmZyb21QaXhlbHModywgXCJmdFwiKTtcclxuXHJcbiAgICAgIGlmICh3YWxsRGF0YSkge1xyXG4gICAgICAgIGNvbnN0IHgwID0gd2FsbERhdGEucmVsYXRpdmVQb3NpdGlvbi54O1xyXG4gICAgICAgIGNvbnN0IHkwID0gd2FsbERhdGEucmVsYXRpdmVQb3NpdGlvbi55O1xyXG4gICAgICAgIGNvbnN0IGFuZ2xlRGVnID0gd2FsbERhdGEuYW5nbGUgfHwgMDtcclxuICAgICAgICBjb25zdCBhbmdsZVJhZCA9IChhbmdsZURlZyAqIE1hdGguUEkpIC8gMTgwO1xyXG4gICAgICAgIGNvbnN0IGNvc0EgPSBNYXRoLmNvcyhhbmdsZVJhZCk7XHJcbiAgICAgICAgY29uc3Qgc2luQSA9IE1hdGguc2luKGFuZ2xlUmFkKTtcclxuXHJcbiAgICAgICAgLy8gUHJvamVjdCBhbGwgZXhpc3RpbmcgZml4dHVyZXMgb250byB0aGUgd2FsbCBheGlzIHRvIGdldCBvY2N1cGllZCByYW5nZXMgKGluIGZ0KS5cclxuICAgICAgICAvLyBQcm9qZWN0aW9uIHJlY292ZXJzIHQgY29ycmVjdGx5IGV2ZW4gd2l0aCB0aGUgMWZ0IHBlcnBlbmRpY3VsYXIgb2Zmc2V0IGFwcGxpZWRcclxuICAgICAgICAvLyBkdXJpbmcgcGxhY2VtZW50OiAo4oiSc2luQcK3Y29zQSArIGNvc0HCt3NpbkEpIGNhbmNlbHMgdG8gMC5cclxuICAgICAgICBjb25zdCBleGlzdGluZ0ZpeHR1cmVzID0gKHdhbGxEYXRhLmZpeHR1cmVzIHx8IFtdKS5maWx0ZXIoXHJcbiAgICAgICAgICAoZjogYW55KSA9PiBmLmZpeHR1cmVOYW1lICE9PSBcInNwYWNlXCIsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb2NjdXBpZWQ6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+ID0gZXhpc3RpbmdGaXh0dXJlcy5tYXAoXHJcbiAgICAgICAgICAoZjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZXaWR0aCA9IHRoaXMuZnJvbVBpeGVscyhcclxuICAgICAgICAgICAgICB0aGlzLnRvUGl4ZWxzKFxyXG4gICAgICAgICAgICAgICAgZi5maXh0dXJlU3RhdGljV2lkdGgudmFsdWUsXHJcbiAgICAgICAgICAgICAgICBmLmZpeHR1cmVTdGF0aWNXaWR0aC51bml0LFxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgXCJmdFwiLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBmSGVpZ2h0ID0gdGhpcy5mcm9tUGl4ZWxzKFxyXG4gICAgICAgICAgICAgIHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgICAgICAgICBmLmZpeHR1cmVTdGF0aWNMZW5ndGgudmFsdWUsXHJcbiAgICAgICAgICAgICAgICBmLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgIFwiZnRcIixcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENBRC11cGxvYWRlZCBmaXh0dXJlcyBvbiBpbnZlcnRlZCB3YWxscyAod2FsbCBhbmdsZSDiiIggKDkwwrAsIDI3MMKwKSlcclxuICAgICAgICAgICAgLy8gaGF2ZSB0aGVpciBzYXZlZCAoeCwgeSkgc2hpZnRlZCBieSBSKHdhbGxBbmdsZSnCtyh3LCBoKSB0byBrZWVwIHRoZVxyXG4gICAgICAgICAgICAvLyBjYW5vbmljYWwgdmlzdWFsIGFmdGVyIGEgMTgwwrAgYm9keSBmbGlwIOKAlCBzZWUgZHJhd0ZpeHR1cmUuIFRvXHJcbiAgICAgICAgICAgIC8vIHJlY292ZXIgdGhlIHdhbGwtYXhpcyBwb3NpdGlvbiB0aGUgZ2FwLWZpbmRlciBuZWVkcywgdW5zaGlmdCBhbnlcclxuICAgICAgICAgICAgLy8gZml4dHVyZSB3aG9zZSBzYXZlZCBhbmdsZSBkaWZmZXJzIGZyb20gdGhlIHdhbGwgYW5nbGUgYnkgfjE4MMKwLlxyXG4gICAgICAgICAgICBjb25zdCBmQW5nbGUgPSAoZi5yZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlID8/IDApIGFzIG51bWJlcjtcclxuICAgICAgICAgICAgY29uc3QgYW5nbGVEaWZmID1cclxuICAgICAgICAgICAgICAoKCgoZkFuZ2xlIC0gYW5nbGVEZWcpICUgMzYwKSArIDM2MCkgJSAzNjApO1xyXG4gICAgICAgICAgICBjb25zdCBpc0ZsaXBwZWQgPSBNYXRoLmFicyhhbmdsZURpZmYgLSAxODApIDwgMTtcclxuXHJcbiAgICAgICAgICAgIGxldCBwcm9qWCA9IGYucmVsYXRpdmVQb3NpdGlvbi54O1xyXG4gICAgICAgICAgICBsZXQgcHJvalkgPSBmLnJlbGF0aXZlUG9zaXRpb24ueTtcclxuICAgICAgICAgICAgaWYgKGlzRmxpcHBlZCkge1xyXG4gICAgICAgICAgICAgIHByb2pYIC09IGNvc0EgKiBmV2lkdGggLSBzaW5BICogZkhlaWdodDtcclxuICAgICAgICAgICAgICBwcm9qWSAtPSBzaW5BICogZldpZHRoICsgY29zQSAqIGZIZWlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRTdGFydCA9IChwcm9qWCAtIHgwKSAqIGNvc0EgKyAocHJvalkgLSB5MCkgKiBzaW5BO1xyXG4gICAgICAgICAgICByZXR1cm4gW01hdGgubWF4KDAsIHRTdGFydCksIE1hdGgubWF4KDAsIHRTdGFydCkgKyBmV2lkdGhdIGFzIFtcclxuICAgICAgICAgICAgICBudW1iZXIsXHJcbiAgICAgICAgICAgICAgbnVtYmVyLFxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBvY2N1cGllZC5zb3J0KChhLCBiKSA9PiBhWzBdIC0gYlswXSk7XHJcblxyXG4gICAgICAgIC8vIFdhbGsgZnJvbSB3YWxsIHN0YXJ0OyBmaW5kIGZpcnN0IGdhcCB0aGF0IGZpdHMgdGhlIG5ldyBmaXh0dXJlLlxyXG4gICAgICAgIC8vIEVQU0lMT04gYWJzb3JicyBmbG9hdGluZy1wb2ludCBkcmlmdCBmcm9tIHJlcGVhdGVkIHVuaXQgcm91bmQtdHJpcHMuXHJcbiAgICAgICAgY29uc3QgRVBTSUxPTiA9IDAuMDAxO1xyXG4gICAgICAgIGxldCBwbGFjZW1lbnRUOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBsZXQgY3Vyc29yID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBbcmFuZ2VTdGFydCwgcmFuZ2VFbmRdIG9mIG9jY3VwaWVkKSB7XHJcbiAgICAgICAgICBpZiAocmFuZ2VTdGFydCAtIGN1cnNvciA+PSB3cCAtIEVQU0lMT04pIHtcclxuICAgICAgICAgICAgcGxhY2VtZW50VCA9IGN1cnNvcjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjdXJzb3IgPSBNYXRoLm1heChjdXJzb3IsIHJhbmdlRW5kKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE5vIGdhcCBmb3VuZCDihpIgcGxhY2UgYWZ0ZXIgbGFzdCBmaXh0dXJlLlxyXG4gICAgICAgIC8vIE92ZXJmbG93IGJleW9uZCB3YWxsIGxlbmd0aCBpcyBpbnRlbnRpb25hbCBwZXIgcmVxdWlyZW1lbnRzLlxyXG4gICAgICAgIGlmIChwbGFjZW1lbnRUID09PSBudWxsKSB7XHJcbiAgICAgICAgICBwbGFjZW1lbnRUID0gY3Vyc29yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZnggPSB4MCArIHBsYWNlbWVudFQgKiBjb3NBO1xyXG4gICAgICAgIGNvbnN0IGZ5ID0geTAgKyBwbGFjZW1lbnRUICogc2luQTtcclxuICAgICAgICBjb25zdCBvZmZzZXQgPSAwLjk7XHJcbiAgICAgICAgY29uc3QgZnhfb2Zmc2V0ID0gZnggKyBvZmZzZXQgKiAtc2luQTtcclxuICAgICAgICBjb25zdCBmeV9vZmZzZXQgPSBmeSArIG9mZnNldCAqIGNvc0E7XHJcblxyXG4gICAgICAgIGZpeHR1cmVEYXRhLnJlbGF0aXZlUG9zaXRpb24ueCA9IGZ4X29mZnNldDtcclxuICAgICAgICBmaXh0dXJlRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLnkgPSBmeV9vZmZzZXQ7XHJcbiAgICAgICAgZml4dHVyZURhdGEucmVsYXRpdmVQb3NpdGlvbi5hbmdsZSA9IGFuZ2xlRGVnO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgd2FsbCBhbmdsZSBwdXRzIHRoZSBmaXh0dXJlIGluIHRoZSB1cHNpZGUtZG93biByYW5nZSwgYmFrZVxyXG4gICAgICAgIC8vIHRoZSBzYW1lIDE4MMKwIGJvZHkgZmxpcCBkcmF3Rml4dHVyZSBhcHBsaWVzIGR1cmluZyBDQUQgZmlyc3QtcmVuZGVyXHJcbiAgICAgICAgLy8gKHNoaWZ0IGFuY2hvciBieSBSKHdhbGxBbmdsZSnCtyh3LCBoKSBhbmQgcm90YXRlICsxODDCsCkuIGRyYXdGaXh0dXJlJ3NcclxuICAgICAgICAvLyBvd24gZmxpcCBwYXRoIGlzIGdhdGVkIG9uIGNhZExheW91dD10cnVlLCBzbyBmb3IgZml4dHVyZXMgYWRkZWRcclxuICAgICAgICAvLyBwb3N0LUNBRCB2aWEgdGhlIHNpZGUgcGFuZWwgd2UgaGF2ZSB0byBiYWtlIHRoZSBmbGlwIGhlcmUg4oCUIGl0XHJcbiAgICAgICAgLy8gbWFrZXMgdGhlIG5ldyBmaXh0dXJlIGxhbmQgY2Fub25pY2FsIGluc3RlYWQgb2YgdXBzaWRlLWRvd24uXHJcbiAgICAgICAgY29uc3Qgbm9ybVdhbGxBbmdsZSA9ICgoKGFuZ2xlRGVnICUgMzYwKSArIDM2MCkgJSAzNjApO1xyXG4gICAgICAgIGlmIChub3JtV2FsbEFuZ2xlID4gOTAgJiYgbm9ybVdhbGxBbmdsZSA8IDI3MCkge1xyXG4gICAgICAgICAgY29uc3Qgd2lkdGhGdCA9IHRoaXMuZnJvbVBpeGVscyhcclxuICAgICAgICAgICAgdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgICAgICBmaXh0dXJlRGF0YS5maXh0dXJlU3RhdGljV2lkdGgudmFsdWUsXHJcbiAgICAgICAgICAgICAgZml4dHVyZURhdGEuZml4dHVyZVN0YXRpY1dpZHRoLnVuaXQsXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIFwiZnRcIixcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBjb25zdCBoZWlnaHRGdCA9IHRoaXMuZnJvbVBpeGVscyhcclxuICAgICAgICAgICAgdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgICAgICBmaXh0dXJlRGF0YS5maXh0dXJlU3RhdGljTGVuZ3RoLnZhbHVlLFxyXG4gICAgICAgICAgICAgIGZpeHR1cmVEYXRhLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgXCJmdFwiLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGZpeHR1cmVEYXRhLnJlbGF0aXZlUG9zaXRpb24ueCA9XHJcbiAgICAgICAgICAgIGZ4X29mZnNldCArIGNvc0EgKiB3aWR0aEZ0IC0gc2luQSAqIGhlaWdodEZ0O1xyXG4gICAgICAgICAgZml4dHVyZURhdGEucmVsYXRpdmVQb3NpdGlvbi55ID1cclxuICAgICAgICAgICAgZnlfb2Zmc2V0ICsgc2luQSAqIHdpZHRoRnQgKyBjb3NBICogaGVpZ2h0RnQ7XHJcbiAgICAgICAgICBmaXh0dXJlRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlID0gYW5nbGVEZWcgKyAxODA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAodGhpcy5nZXRGb3JtV2FsbHMuYXQod2FsbEluZGV4ISkuZ2V0KFwiZml4dHVyZXNcIikgYXMgRm9ybUFycmF5KS5wdXNoKFxyXG4gICAgICAgIGZpeHR1cmVHcm91cCxcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5nZXRXYWxsQnlOdW1iZXIod2FsbEluZGV4ISArIDEpPy5maXh0dXJlcy5wdXNoKGZpeHR1cmVEYXRhKTtcclxuICAgIH0gZWxzZSBpZiAoZml4dHVyZVR5cGUgPT09IFwiZmxvb3JcIikge1xyXG4gICAgICBjb25zdCBmaXh0dXJlV2lkdGhQeCA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgZml4dHVyZURhdGEuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlLFxyXG4gICAgICAgIGZpeHR1cmVEYXRhLmZpeHR1cmVTdGF0aWNXaWR0aC51bml0LFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgZml4dHVyZUhlaWdodFB4ID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICBmaXh0dXJlRGF0YS5maXh0dXJlU3RhdGljTGVuZ3RoLnZhbHVlLFxyXG4gICAgICAgIGZpeHR1cmVEYXRhLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIE4tc2hhcGUgZ3JpZCBwbGFjZW1lbnQ6IGNvbCBmaWxscyBsZWZ0LXRvLXJpZ2h0LCBlYWNoIGNvbHVtbiBmaWxscyBib3R0b20gcm93IChyb3c9MSkgZmlyc3QgdGhlbiB0b3Agcm93IChyb3c9MClcclxuICAgICAgY29uc3QgbmV3SW5kZXggPSB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlLmxlbmd0aDtcclxuICAgICAgY29uc3QgbmV3Q29sID0gTWF0aC5mbG9vcihuZXdJbmRleCAvIDIpO1xyXG4gICAgICBjb25zdCBuZXdSb3cgPSBuZXdJbmRleCAlIDIgPT09IDAgPyAxIDogMDtcclxuXHJcbiAgICAgIGxldCBncmlkT3JpZ2luWDogbnVtYmVyO1xyXG4gICAgICBsZXQgZ3JpZE9yaWdpblk6IG51bWJlcjtcclxuXHJcbiAgICAgIGlmICh0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAvLyBSZWNvdmVyIGdyaWQgb3JpZ2luIGZyb20gZml4dHVyZSBhdCBpbmRleCAwIChhbHdheXMgcGxhY2VkIGF0IHJvdz0xLCBjb2w9MClcclxuICAgICAgICBjb25zdCBmMCA9IHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmVbMF07XHJcbiAgICAgICAgY29uc3QgZjB4ID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgICAgIGYwLnJlbGF0aXZlUG9zaXRpb24ueCxcclxuICAgICAgICAgIGYwLnJlbGF0aXZlUG9zaXRpb24udW5pdCxcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IGYweSA9IHRoaXMudG9QaXhlbHMoXHJcbiAgICAgICAgICBmMC5yZWxhdGl2ZVBvc2l0aW9uLnksXHJcbiAgICAgICAgICBmMC5yZWxhdGl2ZVBvc2l0aW9uLnVuaXQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICAvLyBmMCBpcyBhdCByb3c9MSDihpIgZ3JpZE9yaWdpblkgPSBmMHkgLSAxICogZml4dHVyZUhlaWdodFB4OyBjb2w9MCDihpIgZ3JpZE9yaWdpblggPSBmMHhcclxuICAgICAgICBncmlkT3JpZ2luWCA9IGYweDtcclxuICAgICAgICBncmlkT3JpZ2luWSA9IGYweSAtIGZpeHR1cmVIZWlnaHRQeDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBObyBleGlzdGluZyBjZW50ZXIgZml4dHVyZXMg4oCUIGZpbmQgYmVzdCBncmlkIG9yaWdpbiB2aWEgcG9seWdvbiBzY2FuIChzYW1lIGFzIGRyYXdMYXlvdXRFbGVtZW50cylcclxuICAgICAgICBjb25zdCBsYXlvdXRQb2x5Z29uID0gdGhpcy5idWlsZExheW91dFBvbHlnb25Gcm9tV2FsbHMoKTtcclxuICAgICAgICBjb25zdCBvY2N1cGllZFJlY3RzID0gdGhpcy5nZXRPY2N1cGllZFJlY3RzKCk7XHJcbiAgICAgICAgY29uc3QgYm91bmRzID0gdGhpcy5nZXRGdWxsTGF5b3V0Qm91bmRzKCk7XHJcblxyXG4gICAgICAgIC8vIFJlc2VydmUgc3BhY2UgZm9yIDIgcm93cyBhbmQgMSBjb2x1bW4gYXMgdGhlIHN0YXJ0aW5nIGdyaWQgZm9vdHByaW50XHJcbiAgICAgICAgY29uc3QgZ3JpZFcgPSBmaXh0dXJlV2lkdGhQeDtcclxuICAgICAgICBjb25zdCBncmlkSCA9IDIgKiBmaXh0dXJlSGVpZ2h0UHg7XHJcblxyXG4gICAgICAgIGNvbnN0IGNlbnRlclggPSBib3VuZHMubGVmdCArIGJvdW5kcy53aWR0aCAvIDI7XHJcbiAgICAgICAgY29uc3QgY2VudGVyWSA9IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC8gMjtcclxuXHJcbiAgICAgICAgY29uc3QgZml0c0luUG9seWdvbiA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT5cclxuICAgICAgICAgIHRoaXMuaXNQb2ludEluc2lkZVBvbHlnb24oeyB4LCB5IH0sIGxheW91dFBvbHlnb24pICYmXHJcbiAgICAgICAgICB0aGlzLmlzUG9pbnRJbnNpZGVQb2x5Z29uKHsgeDogeCArIGdyaWRXLCB5IH0sIGxheW91dFBvbHlnb24pICYmXHJcbiAgICAgICAgICB0aGlzLmlzUG9pbnRJbnNpZGVQb2x5Z29uKHsgeCwgeTogeSArIGdyaWRIIH0sIGxheW91dFBvbHlnb24pICYmXHJcbiAgICAgICAgICB0aGlzLmlzUG9pbnRJbnNpZGVQb2x5Z29uKFxyXG4gICAgICAgICAgICB7IHg6IHggKyBncmlkVywgeTogeSArIGdyaWRIIH0sXHJcbiAgICAgICAgICAgIGxheW91dFBvbHlnb24sXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCBvdmVybGFwc09jY3VwaWVkID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PlxyXG4gICAgICAgICAgb2NjdXBpZWRSZWN0cy5zb21lKChvY2MpID0+XHJcbiAgICAgICAgICAgIHRoaXMucmVjdHNPdmVybGFwKHsgeCwgeSwgdzogZ3JpZFcsIGg6IGdyaWRIIH0sIG9jYyksXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCBzY2FuRm9yQmVzdE9yaWdpbiA9IChza2lwT3ZlcmxhcDogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgbGV0IGJlc3RTY29yZSA9IC1JbmZpbml0eTtcclxuICAgICAgICAgIGxldCBiZXN0UG9zOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcclxuICAgICAgICAgIGNvbnN0IHN0ZXAgPSBmaXh0dXJlV2lkdGhQeCAvIDI7XHJcblxyXG4gICAgICAgICAgZm9yIChcclxuICAgICAgICAgICAgbGV0IHkgPSBib3VuZHMudG9wO1xyXG4gICAgICAgICAgICB5IDw9IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC0gZ3JpZEg7XHJcbiAgICAgICAgICAgIHkgKz0gc3RlcFxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGZvciAoXHJcbiAgICAgICAgICAgICAgbGV0IHggPSBib3VuZHMubGVmdDtcclxuICAgICAgICAgICAgICB4IDw9IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC0gZ3JpZFc7XHJcbiAgICAgICAgICAgICAgeCArPSBzdGVwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIGlmICghZml0c0luUG9seWdvbih4LCB5KSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgaWYgKCFza2lwT3ZlcmxhcCAmJiBvdmVybGFwc09jY3VwaWVkKHgsIHkpKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgZ3JpZFJlY3QgPSB7IHgsIHksIHc6IGdyaWRXLCBoOiBncmlkSCB9O1xyXG4gICAgICAgICAgICAgIGNvbnN0IGVtcHR5TWFyZ2luID0gdGhpcy5jb21wdXRlRW1wdHlNYXJnaW4oXHJcbiAgICAgICAgICAgICAgICBncmlkUmVjdCxcclxuICAgICAgICAgICAgICAgIGJvdW5kcyxcclxuICAgICAgICAgICAgICAgIG9jY3VwaWVkUmVjdHMsXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBjb25zdCBkeCA9IGNlbnRlclggLSAoeCArIGdyaWRXIC8gMik7XHJcbiAgICAgICAgICAgICAgY29uc3QgZHkgPSBjZW50ZXJZIC0gKHkgKyBncmlkSCAvIDIpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHNjb3JlID0gZW1wdHlNYXJnaW4gKiAxMDAwIC0gKGR4ICogZHggKyBkeSAqIGR5KSAqIDAuMDAxO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUpIHtcclxuICAgICAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlO1xyXG4gICAgICAgICAgICAgICAgYmVzdFBvcyA9IHsgeCwgeSB9O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGJlc3RQb3M7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgYmVzdFBvcyA9IHNjYW5Gb3JCZXN0T3JpZ2luKGZhbHNlKSA/P1xyXG4gICAgICAgICAgc2NhbkZvckJlc3RPcmlnaW4odHJ1ZSkgPz8ge1xyXG4gICAgICAgICAgICB4OiBjZW50ZXJYIC0gZ3JpZFcgLyAyLFxyXG4gICAgICAgICAgICB5OiBjZW50ZXJZIC0gZ3JpZEggLyAyLFxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZ3JpZE9yaWdpblggPSBiZXN0UG9zLng7XHJcbiAgICAgICAgZ3JpZE9yaWdpblkgPSBiZXN0UG9zLnk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHggPSBncmlkT3JpZ2luWCArIG5ld0NvbCAqIGZpeHR1cmVXaWR0aFB4O1xyXG4gICAgICBjb25zdCB5ID0gZ3JpZE9yaWdpblkgKyBuZXdSb3cgKiBmaXh0dXJlSGVpZ2h0UHg7XHJcblxyXG4gICAgICBmaXh0dXJlRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLnggPSB0aGlzLmZyb21QaXhlbHMoeCwgXCJmdFwiKTtcclxuICAgICAgZml4dHVyZURhdGEucmVsYXRpdmVQb3NpdGlvbi55ID0gdGhpcy5mcm9tUGl4ZWxzKHksIFwiZnRcIik7XHJcblxyXG4gICAgICAodGhpcy5sYXlvdXRGb3JtLmdldChcImZsb29yRml4dHVyZXNcIikgYXMgRm9ybUFycmF5KS5wdXNoKGZpeHR1cmVHcm91cCk7XHJcbiAgICAgIHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUucHVzaChmaXh0dXJlRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgICB0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9IFwibGF5b3V0XCI7XHJcbiAgICB0aGlzLnVwZGF0ZUZpeHR1cmVDb29yZGluYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgYWRkTmV3T3RoZXJFbGVtZW50cyhwb3NUeXBlOiBcIndhbGxcIiB8IFwiZmxvb3JcIiwgd2FsbEluZGV4PzogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5sYXlvdXRGb3JtLmRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcG9zRGF0YSA9IHtcclxuICAgICAgX2lkOiBgbmV3LSR7Y3J5cHRvLnJhbmRvbVVVSUQoKX1gLFxyXG4gICAgICBmaXh0dXJlTmFtZTogYFBPUyBDb3VudGVyYCxcclxuICAgICAgZml4dHVyZVR5cGU6IFwib3RoZXJcIixcclxuICAgICAgcmVsYXRpdmVQb3NpdGlvbjogeyB4OiAwLCB5OiAwLCBhbmdsZTogMCwgdW5pdDogXCJmdFwiIH0sXHJcbiAgICAgIGZpeHR1cmVTdGF0aWNMZW5ndGg6IHtcclxuICAgICAgICB2YWx1ZTogMyxcclxuICAgICAgICB1bml0OiBcImZ0XCIsXHJcbiAgICAgIH0sXHJcbiAgICAgIGZpeHR1cmVTdGF0aWNXaWR0aDoge1xyXG4gICAgICAgIHZhbHVlOiA1LFxyXG4gICAgICAgIHVuaXQ6IFwiZnRcIixcclxuICAgICAgfSxcclxuICAgIH07XHJcblxyXG4gICAgbGV0IHggPSBwb3NEYXRhLnJlbGF0aXZlUG9zaXRpb24ueDtcclxuICAgIGxldCB5ID0gcG9zRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLnk7XHJcbiAgICBsZXQgYSA9IHBvc0RhdGEucmVsYXRpdmVQb3NpdGlvbi5hbmdsZTtcclxuXHJcbiAgICBjb25zdCBoID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgcG9zRGF0YS5maXh0dXJlU3RhdGljTGVuZ3RoLnZhbHVlLFxyXG4gICAgICBwb3NEYXRhLmZpeHR1cmVTdGF0aWNMZW5ndGgudW5pdCxcclxuICAgICk7XHJcbiAgICBjb25zdCB3ID0gdGhpcy50b1BpeGVscyhcclxuICAgICAgcG9zRGF0YS5maXh0dXJlU3RhdGljV2lkdGgudmFsdWUsXHJcbiAgICAgIHBvc0RhdGEuZml4dHVyZVN0YXRpY1dpZHRoLnVuaXQsXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IG5ld090aGVyR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdHlwZTogW3Bvc0RhdGEuZml4dHVyZU5hbWUgfHwgXCJQT1MgQ291bnRlclwiXSwgLy8gZGVmYXVsdCBzZWxlY3RlZCBsYWJlbFxyXG4gICAgICBjdXN0b21OYW1lOiBbXCJcIl0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAocG9zVHlwZSA9PSBcIndhbGxcIikge1xyXG4gICAgICBjb25zdCB3YWxsRGF0YSA9IHRoaXMuZ2V0V2FsbEJ5TnVtYmVyKHdhbGxJbmRleCEgKyAxKTtcclxuICAgICAgaWYgKHdhbGxEYXRhKSB7XHJcbiAgICAgICAgY29uc3QgeDAgPSB3YWxsRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLng7XHJcbiAgICAgICAgY29uc3QgeTAgPSB3YWxsRGF0YS5yZWxhdGl2ZVBvc2l0aW9uLnk7XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gd2FsbERhdGEuZGlzdGFuY2U7XHJcbiAgICAgICAgY29uc3QgYW5nbGVEZWcgPSB3YWxsRGF0YS5hbmdsZSB8fCAwO1xyXG4gICAgICAgIGNvbnN0IGFuZ2xlUmFkID0gKGFuZ2xlRGVnICogTWF0aC5QSSkgLyAxODA7XHJcblxyXG4gICAgICAgIGNvbnN0IGZ4ID0geDAgKyAobGVuZ3RoIC8gMikgKiBNYXRoLmNvcyhhbmdsZVJhZCk7XHJcbiAgICAgICAgY29uc3QgZnkgPSB5MCArIChsZW5ndGggLyAyKSAqIE1hdGguc2luKGFuZ2xlUmFkKTtcclxuICAgICAgICBjb25zdCBvZmZzZXQgPSAyLjU7XHJcbiAgICAgICAgY29uc3QgZnhfb2Zmc2V0ID0gZnggKyBvZmZzZXQgKiAtTWF0aC5zaW4oYW5nbGVSYWQpO1xyXG4gICAgICAgIGNvbnN0IGZ5X29mZnNldCA9IGZ5ICsgb2Zmc2V0ICogTWF0aC5jb3MoYW5nbGVSYWQpO1xyXG5cclxuICAgICAgICB4ID0gdGhpcy50b1BpeGVscyhmeF9vZmZzZXQsIFwiZnRcIik7XHJcbiAgICAgICAgeSA9IHRoaXMudG9QaXhlbHMoZnlfb2Zmc2V0LCBcImZ0XCIpO1xyXG4gICAgICAgIGEgPSBhbmdsZURlZztcclxuICAgICAgfVxyXG5cclxuICAgICAgT2JqZWN0LmFzc2lnbihwb3NEYXRhLCB7XHJcbiAgICAgICAgYXNzb2NpYXRlZEVsZW1lbnROdW1iZXI6IHdhbGxJbmRleCEgKyAxLFxyXG4gICAgICAgIGFzc29jaWF0ZWRFbGVtZW50VHlwZTogXCJ3YWxsXCIsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgKHRoaXMuZ2V0Rm9ybVdhbGxzLmF0KHdhbGxJbmRleCEpLmdldChcIm90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5KS5wdXNoKFxyXG4gICAgICAgIG5ld090aGVyR3JvdXAsXHJcbiAgICAgICk7XHJcbiAgICAgIHdhbGxEYXRhLm90aGVyRWxlbWVudHMucHVzaCh7IC4uLnBvc0RhdGEsIG5ld0FkZGVkOiB0cnVlIH0pO1xyXG4gICAgfSBlbHNlIGlmIChwb3NUeXBlID09PSBcImZsb29yXCIpIHtcclxuICAgICAgKHRoaXMubGF5b3V0Rm9ybS5nZXQoXCJmbG9vck90aGVyRWxlbWVudHNcIikgYXMgRm9ybUFycmF5KS5wdXNoKFxyXG4gICAgICAgIG5ld090aGVyR3JvdXAsXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZmxvb3JEYXRhLm90aGVyRWxlbWVudHMucHVzaCh7IC4uLnBvc0RhdGEsIG5ld0FkZGVkOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlY3RHcm91cCA9IHRoaXMuZHJhd090aGVyRWxlbWVudHNXaXRoTGFiZWwoXHJcbiAgICAgIHRoaXMuY2FudmFzLFxyXG4gICAgICB4LFxyXG4gICAgICB5LFxyXG4gICAgICBhLFxyXG4gICAgICB3LFxyXG4gICAgICBoLFxyXG4gICAgICBwb3NEYXRhLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBtYWtlIGFjdGl2ZVxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5jYW52YXMuc2V0QWN0aXZlT2JqZWN0KHJlY3RHcm91cCk7XHJcbiAgICAgIHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKTtcclxuICAgIH0gY2F0Y2gge31cclxuXHJcbiAgICB0aGlzLnN1YnNjcmliZVRvT3RoZXJFbGVtZW50c0NoYW5nZXMoKTtcclxuICAgIHRoaXMudXBkYXRlT3RoZXJFbGVtZW50c0Nvb3JkaW5hdGVzKCk7XHJcbiAgfVxyXG5cclxuICBmaW5kRW1wdHlDZW50ZXJTcG90KFxyXG4gICAgb2JqZWN0V2lkdGhQeDogbnVtYmVyLFxyXG4gICAgb2JqZWN0SGVpZ2h0UHg6IG51bWJlcixcclxuICAgIHRlbXBPY2N1cGllZDoge1xyXG4gICAgICB4OiBudW1iZXI7XHJcbiAgICAgIHk6IG51bWJlcjtcclxuICAgICAgd2lkdGg6IG51bWJlcjtcclxuICAgICAgaGVpZ2h0OiBudW1iZXI7XHJcbiAgICB9W10gPSBbXSxcclxuICApIHtcclxuICAgIGNvbnN0IG9iamVjdHMgPSB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCk7XHJcbiAgICBjb25zdCBDRU5URVJfT0ZGU0VUX1ggPSAtMzAwO1xyXG4gICAgY29uc3QgQ0VOVEVSX09GRlNFVF9ZID0gMDtcclxuICAgIGNvbnN0IGJvdW5kcyA9IHRoaXMuZ2V0RnVsbExheW91dEJvdW5kcygpO1xyXG5cclxuICAgIGNvbnN0IGNlbnRlclggPSBib3VuZHMubGVmdCArIGJvdW5kcy53aWR0aCAvIDIgKyBDRU5URVJfT0ZGU0VUX1g7XHJcblxyXG4gICAgY29uc3QgY2VudGVyWSA9IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC8gMiArIENFTlRFUl9PRkZTRVRfWTtcclxuXHJcbiAgICAvLyAyLiBTcGlyYWwgc2VhcmNoIHBhcmFtZXRlcnNcclxuICAgIGNvbnN0IHN0ZXAgPSAyMDtcclxuICAgIGNvbnN0IG1heFJhZGl1cyA9IE1hdGgubWF4KGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7XHJcblxyXG4gICAgZm9yIChsZXQgcmFkaXVzID0gMDsgcmFkaXVzIDwgbWF4UmFkaXVzOyByYWRpdXMgKz0gc3RlcCkge1xyXG4gICAgICBmb3IgKGxldCBhbmdsZSA9IDA7IGFuZ2xlIDwgMzYwOyBhbmdsZSArPSAzMCkge1xyXG4gICAgICAgIGNvbnN0IHJhZCA9IChhbmdsZSAqIE1hdGguUEkpIC8gMTgwO1xyXG5cclxuICAgICAgICAvLyDwn5SnIEZJWDogY2VudGVyIOKGkiB0b3AtbGVmdFxyXG4gICAgICAgIGNvbnN0IHggPSBjZW50ZXJYICsgcmFkaXVzICogTWF0aC5jb3MocmFkKSAtIG9iamVjdFdpZHRoUHggLyAyO1xyXG4gICAgICAgIGNvbnN0IHkgPSBjZW50ZXJZICsgcmFkaXVzICogTWF0aC5zaW4ocmFkKSAtIG9iamVjdEhlaWdodFB4IC8gMjtcclxuXHJcbiAgICAgICAgY29uc3QgdGVzdFJlY3QgPSB7XHJcbiAgICAgICAgICBsZWZ0OiB4LFxyXG4gICAgICAgICAgdG9wOiB5LFxyXG4gICAgICAgICAgd2lkdGg6IG9iamVjdFdpZHRoUHgsXHJcbiAgICAgICAgICBoZWlnaHQ6IG9iamVjdEhlaWdodFB4LFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIDMuIENoZWNrIGNvbGxpc2lvbiB3aXRoIGV4aXN0aW5nIGNhbnZhcyBvYmplY3RzXHJcbiAgICAgICAgY29uc3QgY2FudmFzQ29sbGlzaW9uID0gb2JqZWN0cy5zb21lKChvYmopID0+IHtcclxuICAgICAgICAgIGNvbnN0IHJlY3QgPSBvYmouZ2V0Qm91bmRpbmdSZWN0KCk7XHJcbiAgICAgICAgICByZXR1cm4gIShcclxuICAgICAgICAgICAgcmVjdC5sZWZ0ID4gdGVzdFJlY3QubGVmdCArIHRlc3RSZWN0LndpZHRoIHx8XHJcbiAgICAgICAgICAgIHJlY3QubGVmdCArIHJlY3Qud2lkdGggPCB0ZXN0UmVjdC5sZWZ0IHx8XHJcbiAgICAgICAgICAgIHJlY3QudG9wID4gdGVzdFJlY3QudG9wICsgdGVzdFJlY3QuaGVpZ2h0IHx8XHJcbiAgICAgICAgICAgIHJlY3QudG9wICsgcmVjdC5oZWlnaHQgPCB0ZXN0UmVjdC50b3BcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChjYW52YXNDb2xsaXNpb24pIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAvLyA0LiBDaGVjayBjb2xsaXNpb24gd2l0aCB0ZW1wIHBsYWNlZCBmaXh0dXJlcyAoQ0FEIGJhdGNoKVxyXG4gICAgICAgIGNvbnN0IHRlbXBDb2xsaXNpb24gPSB0ZW1wT2NjdXBpZWQuc29tZSgobykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuICEoXHJcbiAgICAgICAgICAgIG8ueCA+IHRlc3RSZWN0LmxlZnQgKyB0ZXN0UmVjdC53aWR0aCB8fFxyXG4gICAgICAgICAgICBvLnggKyBvLndpZHRoIDwgdGVzdFJlY3QubGVmdCB8fFxyXG4gICAgICAgICAgICBvLnkgPiB0ZXN0UmVjdC50b3AgKyB0ZXN0UmVjdC5oZWlnaHQgfHxcclxuICAgICAgICAgICAgby55ICsgby5oZWlnaHQgPCB0ZXN0UmVjdC50b3BcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh0ZW1wQ29sbGlzaW9uKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHsgeCwgeSB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjYW5jZWxFZGl0KCkge1xyXG4gICAgdGhpcy5oaWdobGlnaHRlZEZpeHR1cmVGb3JtSWQgPSBudWxsO1xyXG4gICAgYXdhaXQgdGhpcy5nZXRTdG9yZUZpeHR1cmVzKHRoaXMucGxhbm9EYXRhLl9pZCk7XHJcbiAgfVxyXG5cclxuICBsaXN0ZW5Ub0RlbGV0ZUtleSgpIHtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChlKSA9PiB7XHJcbiAgICAgIGlmIChlLmtleSA9PT0gXCJEZWxldGVcIiAmJiB0aGlzLmxheW91dEZvcm0uZW5hYmxlZCkge1xyXG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuY2FudmFzPy5nZXRBY3RpdmVPYmplY3QoKSBhcyBhbnk7XHJcblxyXG4gICAgICAgIGlmIChhY3RpdmUgJiYgKGFjdGl2ZSBhcyBhbnkpLm9ialR5cGUgPT09IFwiZW50cmFuY2VcIikge1xyXG4gICAgICAgICAgdGhpcy5kZWxldGVFbnRyYW5jZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFjdGl2ZSAmJiAoYWN0aXZlIGFzIGFueSkub2JqVHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgICAgIGlmIChhY3RpdmU/LmRhdGE/LmVsZW1lbnROdW1iZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5kZWxldGVXYWxsKGFjdGl2ZT8uZGF0YT8uZWxlbWVudE51bWJlcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYWN0aXZlICYmIChhY3RpdmUgYXMgYW55KS5vYmpUeXBlID09PSBcImZpeHR1cmVcIikge1xyXG4gICAgICAgICAgaWYgKGFjdGl2ZT8uZml4dHVyZVR5cGUpIHtcclxuICAgICAgICAgICAgdGhpcy5kZWxldGVGaXh0dXJlKFxyXG4gICAgICAgICAgICAgIGFjdGl2ZT8uZml4dHVyZVR5cGUsXHJcbiAgICAgICAgICAgICAgYWN0aXZlPy5maXh0dXJlSW5kZXggLSAxLFxyXG4gICAgICAgICAgICAgIGFjdGl2ZT8ud2FsbEluZGV4IC0gMSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlRW50cmFuY2UoKSB7XHJcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmNhbnZhcy5nZXRBY3RpdmVPYmplY3QoKSBhcyBhbnk7XHJcblxyXG4gICAgaWYgKGFjdGl2ZSAmJiBhY3RpdmUub2JqVHlwZSA9PT0gXCJlbnRyYW5jZVwiKSB7XHJcbiAgICAgIGNvbnN0IGkgPSB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZpbmRJbmRleChcclxuICAgICAgICAoZWw6IGFueSkgPT5cclxuICAgICAgICAgIGVsLmVsZW1lbnRUeXBlID09PSBcImVudHJhbmNlXCIgJiZcclxuICAgICAgICAgIGVsLmVsZW1lbnROdW1iZXIgPT09IGFjdGl2ZS5kYXRhLmVsZW1lbnROdW1iZXIsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoaSA+PSAwKSB7XHJcbiAgICAgICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJGbG9vcih0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBkZWxldGVXYWxsKGVsZU51bWJlcjogbnVtYmVyKSB7XHJcbiAgICBjb25zdCB3YWxsID0gdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5maW5kKFxyXG4gICAgICAoZWxlOiBhbnkpID0+XHJcbiAgICAgICAgZWxlLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIiAmJiBlbGUuZWxlbWVudE51bWJlciA9PT0gZWxlTnVtYmVyLFxyXG4gICAgKTtcclxuICAgIGlmICh3YWxsLmZpeHR1cmVzLmxlbmd0aCB8fCB3YWxsLm90aGVyRWxlbWVudHMubGVuZ3RoKVxyXG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmNvbmZpcm1EZWxldGVXYWxsKCkpKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgaSA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24uZmluZEluZGV4KFxyXG4gICAgICAoZWw6IGFueSkgPT4gZWwuZWxlbWVudFR5cGUgPT09IFwid2FsbFwiICYmIGVsLmVsZW1lbnROdW1iZXIgPT09IGVsZU51bWJlcixcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5zcGxpY2UoaSwgMSk7XHJcbiAgICB0aGlzLnVwZGF0ZVdhbGxFbGVtZW50TnVtYmVyKCk7XHJcbiAgICB0aGlzLnJlbmRlckZsb29yKHRydWUpO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVXYWxsRWxlbWVudE51bWJlcigpIHtcclxuICAgIGNvbnN0IG9ubHlXYWxscyA9IHRoaXMuZmxvb3JEYXRhLmxheW91dFBvbHlnb24/LmZpbHRlcihcclxuICAgICAgKGVsOiBhbnkpID0+IGVsLmVsZW1lbnRUeXBlID09PSBcIndhbGxcIixcclxuICAgICk7XHJcblxyXG4gICAgb25seVdhbGxzPy5mb3JFYWNoKChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgaXRlbS5lbGVtZW50TnVtYmVyID0gaW5kZXggKyAxO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b1BpeGVscyh2YWx1ZTogbnVtYmVyLCB1bml0OiBzdHJpbmcsIGRwaSA9IDIuOCkge1xyXG4gICAgbGV0IHBpeGVsczogbnVtYmVyO1xyXG5cclxuICAgIGlmICh1bml0ID09PSBcIm1tXCIpIHtcclxuICAgICAgcGl4ZWxzID0gKHZhbHVlIC8gMjUuNCkgKiBkcGk7XHJcbiAgICB9IGVsc2UgaWYgKHVuaXQgPT09IFwiZnRcIikge1xyXG4gICAgICBwaXhlbHMgPSB2YWx1ZSAqIDEyICogZHBpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgdW5pdC4gVXNlICdtbScgb3IgJ2Z0Jy5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIE51bWJlcihwaXhlbHMudG9GaXhlZCg0KSk7XHJcbiAgfVxyXG5cclxuICBmcm9tUGl4ZWxzKHBpeGVsczogbnVtYmVyLCB1bml0OiBzdHJpbmcsIGRwaSA9IDIuOCk6IG51bWJlciB7XHJcbiAgICBsZXQgdmFsdWU6IG51bWJlcjtcclxuXHJcbiAgICAvLyBwaXhlbHMgPSBwaXhlbHMgPj0gdGhpcy53YWxsVGhpY2tuZXNzID8gcGl4ZWxzIC0gdGhpcy53YWxsVGhpY2tuZXNzIDogdGhpcy53YWxsVGhpY2tuZXNzO1xyXG5cclxuICAgIGlmICh1bml0ID09PSBcIm1tXCIpIHtcclxuICAgICAgdmFsdWUgPSAocGl4ZWxzIC8gZHBpKSAqIDI1LjQ7XHJcbiAgICB9IGVsc2UgaWYgKHVuaXQgPT09IFwiZnRcIikge1xyXG4gICAgICB2YWx1ZSA9IHBpeGVscyAvICgxMiAqIGRwaSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCB1bml0LiBVc2UgJ21tJyBvciAnZnQnLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlLnRvRml4ZWQoNCkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY29uZmlybUVkaXQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oTGF5b3V0RWRpdENvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGF3YWl0IG1vZGVsUmVmLnJlc3VsdC50aGVuPGJvb2xlYW4+KChyZXN1bHQpID0+IHJlc3VsdCA9PT0gXCJva1wiKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1EZWxldGVXYWxsKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gXCJEZWxldGUgd2FsbFwiO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9XHJcbiAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgd2FsbCBhbG9uZyB3aXRoIGl0cyBhc3NvY2lhdGVkIGZpeHR1cmVzIGFuZCBlbGVtZW50cz9cIjtcclxuXHJcbiAgICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09IFwib2tcIik7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGaXh0dXJlQ29vcmRpbmF0ZXMoZml4dHVyZXM/OiBhbnkpIHtcclxuICAgIGNvbnN0IGZpeHR1cmVzRnJvbUNhbnZhcyA9XHJcbiAgICAgIGZpeHR1cmVzID8/XHJcbiAgICAgIHRoaXMuY2FudmFzXHJcbiAgICAgICAgLmdldE9iamVjdHMoKVxyXG4gICAgICAgIC5maWx0ZXIoKG9iaikgPT4gKG9iaiBhcyBhbnkpLmZpeHR1cmVJZClcclxuICAgICAgICAubWFwKChvYmopID0+ICh7XHJcbiAgICAgICAgICBpZDogKG9iaiBhcyBhbnkpLmZpeHR1cmVJZCxcclxuICAgICAgICAgIHg6IG9iai5sZWZ0LFxyXG4gICAgICAgICAgeTogb2JqLnRvcCxcclxuICAgICAgICAgIGFuZ2xlOiBvYmo/LmFuZ2xlID8/IDAsXHJcbiAgICAgICAgfSkpO1xyXG4gICAgY29uc3QgcG9zTWFwID0gbmV3IE1hcCgpO1xyXG5cclxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlc0Zyb21DYW52YXMpIHtcclxuICAgICAgcG9zTWFwLnNldChmaXh0dXJlLmlkLCB7XHJcbiAgICAgICAgeDogdGhpcy5mcm9tUGl4ZWxzKGZpeHR1cmUueCwgXCJmdFwiKSxcclxuICAgICAgICB5OiB0aGlzLmZyb21QaXhlbHMoZml4dHVyZS55LCBcImZ0XCIpLFxyXG4gICAgICAgIGFuZ2xlOiBmaXh0dXJlLmFuZ2xlLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5jZW50ZXJGaXh0dXJlLmZvckVhY2goKGNmOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgbGF0ZXN0Rml4dHVyZVBvcyA9IHBvc01hcC5nZXQoY2YuX2lkKTtcclxuICAgICAgaWYgKGxhdGVzdEZpeHR1cmVQb3MpIHtcclxuICAgICAgICBjZi5yZWxhdGl2ZVBvc2l0aW9uLnggPSBsYXRlc3RGaXh0dXJlUG9zLng7XHJcbiAgICAgICAgY2YucmVsYXRpdmVQb3NpdGlvbi55ID0gbGF0ZXN0Rml4dHVyZVBvcy55O1xyXG4gICAgICAgIGNmLnJlbGF0aXZlUG9zaXRpb24uYW5nbGUgPSBsYXRlc3RGaXh0dXJlUG9zLmFuZ2xlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKHc6IGFueSkgPT4ge1xyXG4gICAgICB3Py5maXh0dXJlcz8uZm9yRWFjaCgod2Y6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEZpeHR1cmVQb3MgPSBwb3NNYXAuZ2V0KHdmLl9pZCk7XHJcbiAgICAgICAgaWYgKGxhdGVzdEZpeHR1cmVQb3MpIHtcclxuICAgICAgICAgIHdmLnJlbGF0aXZlUG9zaXRpb24ueCA9IGxhdGVzdEZpeHR1cmVQb3MueDtcclxuICAgICAgICAgIHdmLnJlbGF0aXZlUG9zaXRpb24ueSA9IGxhdGVzdEZpeHR1cmVQb3MueTtcclxuICAgICAgICAgIHdmLnJlbGF0aXZlUG9zaXRpb24uYW5nbGUgPSBsYXRlc3RGaXh0dXJlUG9zLmFuZ2xlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZU90aGVyRWxlbWVudHNDb29yZGluYXRlcygpIHtcclxuICAgIGNvbnN0IG90aGVyc0Zyb21DYW52YXMgPSB0aGlzLmNhbnZhc1xyXG4gICAgICAuZ2V0T2JqZWN0cygpXHJcbiAgICAgIC5maWx0ZXIoKG9iaikgPT4gKG9iaiBhcyBhbnkpLm9ialR5cGUgPT09IFwib3RoZXJzXCIpXHJcbiAgICAgIC5tYXAoKG9iaikgPT4gKHtcclxuICAgICAgICBpZDogKG9iaiBhcyBhbnkpLmRhdGE/Ll9pZCxcclxuICAgICAgICBsYWJlbDogKG9iaiBhcyBhbnkpLmRhdGE/LmZpeHR1cmVOYW1lLFxyXG4gICAgICAgIHg6IG9iai5sZWZ0LFxyXG4gICAgICAgIHk6IG9iai50b3AsXHJcbiAgICAgICAgYW5nbGU6IG9iaj8uYW5nbGUgPz8gMCxcclxuICAgICAgICB3aWR0aDogdGhpcy5mcm9tUGl4ZWxzKG9iai5nZXRTY2FsZWRXaWR0aCgpIC0gMiwgXCJmdFwiKSxcclxuICAgICAgICBoZWlnaHQ6IHRoaXMuZnJvbVBpeGVscyhvYmouZ2V0U2NhbGVkSGVpZ2h0KCkgLSAyLCBcImZ0XCIpLFxyXG4gICAgICB9KSk7XHJcblxyXG4gICAgY29uc3QgcG9zTWFwID0gbmV3IE1hcDxcclxuICAgICAgc3RyaW5nLFxyXG4gICAgICB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBhbmdsZTogbnVtYmVyOyBoOiBudW1iZXI7IHc6IG51bWJlciB9XHJcbiAgICA+KCk7XHJcbiAgICBmb3IgKGNvbnN0IG90aGVyIG9mIG90aGVyc0Zyb21DYW52YXMpIHtcclxuICAgICAgaWYgKG90aGVyLmlkKSB7XHJcbiAgICAgICAgcG9zTWFwLnNldChvdGhlci5pZCwge1xyXG4gICAgICAgICAgeDogdGhpcy5mcm9tUGl4ZWxzKG90aGVyLngsIFwiZnRcIiksXHJcbiAgICAgICAgICB5OiB0aGlzLmZyb21QaXhlbHMob3RoZXIueSwgXCJmdFwiKSxcclxuICAgICAgICAgIGFuZ2xlOiBvdGhlci5hbmdsZSxcclxuICAgICAgICAgIGg6IG90aGVyLmhlaWdodCxcclxuICAgICAgICAgIHc6IG90aGVyLndpZHRoLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5mbG9vckRhdGEub3RoZXJFbGVtZW50cykpIHtcclxuICAgICAgdGhpcy5mbG9vckRhdGEub3RoZXJFbGVtZW50cy5mb3JFYWNoKChlbDogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGF0ZXN0T3RoZXJzUG9zID0gcG9zTWFwLmdldChlbC5faWQpO1xyXG4gICAgICAgIGlmIChsYXRlc3RPdGhlcnNQb3MpIHtcclxuICAgICAgICAgIGVsLnJlbGF0aXZlUG9zaXRpb24ueCA9IGxhdGVzdE90aGVyc1Bvcy54O1xyXG4gICAgICAgICAgZWwucmVsYXRpdmVQb3NpdGlvbi55ID0gbGF0ZXN0T3RoZXJzUG9zLnk7XHJcbiAgICAgICAgICBlbC5yZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlID0gbGF0ZXN0T3RoZXJzUG9zLmFuZ2xlO1xyXG4gICAgICAgICAgZWwuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSA9IGxhdGVzdE90aGVyc1Bvcy5oO1xyXG4gICAgICAgICAgZWwuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlID0gbGF0ZXN0T3RoZXJzUG9zLnc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKHc6IGFueSkgPT4ge1xyXG4gICAgICB3Py5vdGhlckVsZW1lbnRzPy5mb3JFYWNoKCh3ZjogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGF0ZXN0T3RoZXJzUG9zID0gcG9zTWFwLmdldCh3Zi5faWQpO1xyXG4gICAgICAgIGlmIChsYXRlc3RPdGhlcnNQb3MpIHtcclxuICAgICAgICAgIHdmLnJlbGF0aXZlUG9zaXRpb24ueCA9IGxhdGVzdE90aGVyc1Bvcy54O1xyXG4gICAgICAgICAgd2YucmVsYXRpdmVQb3NpdGlvbi55ID0gbGF0ZXN0T3RoZXJzUG9zLnk7XHJcbiAgICAgICAgICB3Zi5yZWxhdGl2ZVBvc2l0aW9uLmFuZ2xlID0gbGF0ZXN0T3RoZXJzUG9zLmFuZ2xlO1xyXG4gICAgICAgICAgd2YuZml4dHVyZVN0YXRpY0xlbmd0aC52YWx1ZSA9IGxhdGVzdE90aGVyc1Bvcy5oO1xyXG4gICAgICAgICAgd2YuZml4dHVyZVN0YXRpY1dpZHRoLnZhbHVlID0gbGF0ZXN0T3RoZXJzUG9zLnc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlV2FsbENvb3JkaW5hdGVzKCkge1xyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY2FudmFzXHJcbiAgICAgIC5nZXRPYmplY3RzKClcclxuICAgICAgLmZpbHRlcigob2JqKSA9PiAob2JqIGFzIGFueSkub2JqVHlwZSA9PT0gXCJ3YWxsXCIpXHJcbiAgICAgIC5tYXAoKG9iaikgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICB0b3A6IHRoaXMuZnJvbVBpeGVscyhvYmoudG9wLCBcImZ0XCIpLFxyXG4gICAgICAgICAgbGVmdDogdGhpcy5mcm9tUGl4ZWxzKG9iai5sZWZ0LCBcImZ0XCIpLFxyXG4gICAgICAgICAgd2lkdGg6IHRoaXMuZnJvbVBpeGVscyhvYmouZ2V0U2NhbGVkV2lkdGgoKSAtIDAuMjcsIFwiZnRcIiksXHJcbiAgICAgICAgICBoZWlnaHQ6IHRoaXMuZnJvbVBpeGVscyhvYmouZ2V0U2NhbGVkSGVpZ2h0KCkgLSAwLjI3LCBcImZ0XCIpLFxyXG4gICAgICAgICAgYW5nbGU6IG9iai5hbmdsZSxcclxuICAgICAgICAgIGVsZW1lbnREYXRhOiAob2JqIGFzIGFueSkuZGF0YSxcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBjb25zdCBwb3NNYXAgPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgZm9yIChjb25zdCB3YWxsIG9mIGRhdGEpIHtcclxuICAgICAgcG9zTWFwLnNldChcclxuICAgICAgICBgJHt3YWxsLmVsZW1lbnREYXRhLmVsZW1lbnRUeXBlfSR7d2FsbC5lbGVtZW50RGF0YS5lbGVtZW50TnVtYmVyfWAsXHJcbiAgICAgICAgZGF0YS5maW5kKFxyXG4gICAgICAgICAgKG9iaikgPT5cclxuICAgICAgICAgICAgb2JqLmVsZW1lbnREYXRhLmVsZW1lbnRUeXBlID09PSB3YWxsLmVsZW1lbnREYXRhLmVsZW1lbnRUeXBlICYmXHJcbiAgICAgICAgICAgIG9iai5lbGVtZW50RGF0YS5lbGVtZW50TnVtYmVyID09PSB3YWxsLmVsZW1lbnREYXRhLmVsZW1lbnROdW1iZXIsXHJcbiAgICAgICAgKSxcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKHc6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCB3YWxsUG9zID0gcG9zTWFwLmdldChgJHt3LmVsZW1lbnRUeXBlfSR7dy5lbGVtZW50TnVtYmVyfWApO1xyXG4gICAgICBpZiAod2FsbFBvcykge1xyXG4gICAgICAgIHcucmVsYXRpdmVQb3NpdGlvbi54ID0gd2FsbFBvcy5sZWZ0O1xyXG4gICAgICAgIHcucmVsYXRpdmVQb3NpdGlvbi55ID0gd2FsbFBvcy50b3A7XHJcbiAgICAgICAgdy5hbmdsZSA9IHdhbGxQb3MuYW5nbGU7XHJcbiAgICAgICAgdy5kaXN0YW5jZSA9IHdhbGxQb3Mud2lkdGg7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlRW50cmFuY2VDb29yZGluYXRlcygpIHtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNhbnZhc1xyXG4gICAgICAuZ2V0T2JqZWN0cygpXHJcbiAgICAgIC5maWx0ZXIoKG9iaikgPT4gKG9iaiBhcyBhbnkpLm9ialR5cGUgPT09IFwiZW50cmFuY2VcIilcclxuICAgICAgLm1hcCgob2JqKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHRvcDogdGhpcy5mcm9tUGl4ZWxzKG9iai50b3AsIFwiZnRcIiksXHJcbiAgICAgICAgICBsZWZ0OiB0aGlzLmZyb21QaXhlbHMob2JqLmxlZnQsIFwiZnRcIiksXHJcbiAgICAgICAgICB3aWR0aDogdGhpcy5mcm9tUGl4ZWxzKG9iai5nZXRTY2FsZWRXaWR0aCgpLCBcImZ0XCIpLFxyXG4gICAgICAgICAgYW5nbGU6IG9iai5hbmdsZSxcclxuICAgICAgICAgIGVsZW1lbnREYXRhOiAob2JqIGFzIGFueSkuZGF0YSxcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBjb25zdCBwb3NNYXAgPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgZm9yIChjb25zdCBlbnRyYW5jZSBvZiBkYXRhKSB7XHJcbiAgICAgIHBvc01hcC5zZXQoXHJcbiAgICAgICAgYCR7ZW50cmFuY2UuZWxlbWVudERhdGEuZWxlbWVudFR5cGV9JHtlbnRyYW5jZS5lbGVtZW50RGF0YS5lbGVtZW50TnVtYmVyfWAsXHJcbiAgICAgICAgZGF0YS5maW5kKFxyXG4gICAgICAgICAgKG9iaikgPT5cclxuICAgICAgICAgICAgb2JqLmVsZW1lbnREYXRhLmVsZW1lbnRUeXBlID09PSBlbnRyYW5jZS5lbGVtZW50RGF0YS5lbGVtZW50VHlwZSAmJlxyXG4gICAgICAgICAgICBvYmouZWxlbWVudERhdGEuZWxlbWVudE51bWJlciA9PT1cclxuICAgICAgICAgICAgICBlbnRyYW5jZS5lbGVtZW50RGF0YS5lbGVtZW50TnVtYmVyLFxyXG4gICAgICAgICksXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5mbG9vckRhdGEubGF5b3V0UG9seWdvbi5mb3JFYWNoKCh3OiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgZW50cmFuY2VQb3MgPSBwb3NNYXAuZ2V0KGAke3cuZWxlbWVudFR5cGV9JHt3LmVsZW1lbnROdW1iZXJ9YCk7XHJcbiAgICAgIGlmIChlbnRyYW5jZVBvcykge1xyXG4gICAgICAgIHcucmVsYXRpdmVQb3NpdGlvbi54ID0gZW50cmFuY2VQb3MubGVmdDtcclxuICAgICAgICB3LnJlbGF0aXZlUG9zaXRpb24ueSA9IGVudHJhbmNlUG9zLnRvcDtcclxuICAgICAgICB3LmFuZ2xlID0gZW50cmFuY2VQb3MuYW5nbGU7XHJcbiAgICAgICAgdy5kaXN0YW5jZSA9IGVudHJhbmNlUG9zLndpZHRoO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZUxheW91dChlZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBpZiAoZWRpdE1vZGUpIHtcclxuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jb25maXJtRWRpdCgpKSkge1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWRQdWJsaXNoID0gdGhpcy50YXNrSW5mby5kaXNhYmxlZDtcclxuICAgICAgICB0aGlzLmxheW91dEZvcm0uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJGbG9vcihmYWxzZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnRhc2tTdHlsZS5maXh0dXJlLmNsYXNzID09IFwicmV2aWV3UGVuZGluZ1wiKSB7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZFB1Ymxpc2ggPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJmaXh0dXJlXCI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZsb29yRGF0YS5sYXlvdXRQb2x5Z29uLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBlbGVtZW50LmZpeHR1cmVzID0gZWxlbWVudC5maXh0dXJlcy5maWx0ZXIoXHJcbiAgICAgICAgKGZpeHR1cmU6IGFueSkgPT4gIWZpeHR1cmU/Lmdob3N0ICYmIGZpeHR1cmUuZml4dHVyZU5hbWUgIT09IFwic3BhY2VcIixcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5mbG9vckRhdGEuY2VudGVyRml4dHVyZSA9IHRoaXMuZmxvb3JEYXRhLmNlbnRlckZpeHR1cmVcclxuICAgICAgLmZpbHRlcigoZml4dHVyZTogYW55KSA9PiAhZml4dHVyZT8uZ2hvc3QpXHJcbiAgICAgIC5tYXAoKGZpeHR1cmU6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgYXNzb2NpYXRlZEVsZW1lbnRUeXBlLCBhc3NvY2lhdGVkRWxlbWVudE51bWJlciwgLi4ucmVzdCB9ID1cclxuICAgICAgICAgIGZpeHR1cmU7XHJcbiAgICAgICAgcmV0dXJuIHJlc3Q7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5yZW9yZGVyRml4dHVyZSh0aGlzLmZsb29yRGF0YSk7XHJcblxyXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICBkYXRhOiB0aGlzLmZsb29yRGF0YSxcclxuICAgICAgZWRpdE1vZGU6IGVkaXRNb2RlLFxyXG4gICAgICAvLyBMYXlvdXQgZWRpdHMgaW52YWxpZGF0ZSBkb3duc3RyZWFtIHZlcmlmaWNhdGlvbnMgKGZpeHR1cmUsIFZNLCB6b25lKSwgc28gYW55XHJcbiAgICAgIC8vIGxheW91dC1lZGl0IHNhdmUgc2hvdWxkIHRyaWdnZXIgdGhlIEJFJ3MgcmV2ZXJ0T25FZGl0IGNsZWFudXAuIFRoZSBCRSdzXHJcbiAgICAgIC8vIGRlbGV0ZU1hbnkgaXMgaWRlbXBvdGVudCDigJQgaWYgbm8gZGVwZW5kZW50IHRhc2tzIGV4aXN0LCBub3RoaW5nIGhhcHBlbnMuXHJcbiAgICAgIHJldmVydE9uRWRpdDogZWRpdE1vZGUgPT09IHRydWUsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuaXNTYXZpbmdMYXlvdXQgPSB0cnVlO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLnVwZGF0ZVN0b3JlUGxhbm8ocGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlcykgPT4ge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgICAgIHRoaXMuZ2V0U3RvcmVGaXh0dXJlcyh0aGlzLnBsYW5vRGF0YS5faWQpO1xyXG4gICAgICAgIHRoaXMuaXNTYXZpbmdMYXlvdXQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxheW91dEhhc1Vuc2F2ZWRDaGFuZ2VzID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byB1cGRhdGUgbGF5b3V0XCIpO1xyXG4gICAgICAgIHRoaXMuaXNTYXZpbmdMYXlvdXQgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYXNzaWduVGFzaygpIHtcclxuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcclxuICAgICAgcmVkbzogZmFsc2UsXHJcbiAgICAgIGNoZWNrTGlzdE5hbWU6IFwiXCIsXHJcbiAgICAgIHN0b3JlOiB0aGlzLnBsYW5vRGF0YS5zdG9yZU5hbWUsXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLnBsYW5vRGF0YS5jbGllbnRJZCxcclxuICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5wdWJsaXNoaW5nU3RhdGUgPT09IFwibGF5b3V0XCIpIHtcclxuICAgICAgcGF5bG9hZC5jaGVja0xpc3ROYW1lID0gXCJMYXlvdXQgVmVyaWZpY2F0aW9uXCI7XHJcbiAgICAgIHBheWxvYWQucmVkbyA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJsYXlvdXQtcmVkb1wiKSB7XHJcbiAgICAgIHBheWxvYWQuY2hlY2tMaXN0TmFtZSA9IFwiTGF5b3V0IFZlcmlmaWNhdGlvblwiO1xyXG4gICAgICBwYXlsb2FkLnJlZG8gPSB0cnVlO1xyXG4gICAgICBwYXlsb2FkLnRhc2tJZCA9XHJcbiAgICAgICAgdGhpcy5zdG9yZUZlZWRiYWNrLmxheW91dERhdGFbXHJcbiAgICAgICAgICB0aGlzLnN0b3JlRmVlZGJhY2subGF5b3V0RGF0YS5sZW5ndGggLSAxXHJcbiAgICAgICAgXS50YXNrSWQ7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMucHVibGlzaGluZ1N0YXRlID09PSBcImZpeHR1cmVcIikge1xyXG4gICAgICBwYXlsb2FkLmNoZWNrTGlzdE5hbWUgPSBcIkZpeHR1cmUgVmVyaWZpY2F0aW9uXCI7XHJcbiAgICAgIHBheWxvYWQucmVkbyA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJmaXh0dXJlLXJlZG9cIikge1xyXG4gICAgICBwYXlsb2FkLmNoZWNrTGlzdE5hbWUgPSBcIkZpeHR1cmUgVmVyaWZpY2F0aW9uXCI7XHJcbiAgICAgIHBheWxvYWQucmVkbyA9IHRydWU7XHJcbiAgICAgIHBheWxvYWQudGFza0lkID1cclxuICAgICAgICB0aGlzLnN0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbXHJcbiAgICAgICAgICB0aGlzLnN0b3JlRmVlZGJhY2suZml4dHVyZURhdGEubGVuZ3RoIC0gMVxyXG4gICAgICAgIF0udGFza0lkO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJ2bVwiKSB7XHJcbiAgICAgIHBheWxvYWQuY2hlY2tMaXN0TmFtZSA9IFwiVk0gVmVyaWZpY2F0aW9uXCI7XHJcbiAgICAgIHBheWxvYWQucmVkbyA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJ2bS1yZWRvXCIpIHtcclxuICAgICAgcGF5bG9hZC5jaGVja0xpc3ROYW1lID0gXCJWTSBWZXJpZmljYXRpb25cIjtcclxuICAgICAgcGF5bG9hZC5yZWRvID0gdHJ1ZTtcclxuICAgICAgcGF5bG9hZC50YXNrSWQgPVxyXG4gICAgICAgIHRoaXMuc3RvcmVGZWVkYmFjay5WbURhdGFbdGhpcy5zdG9yZUZlZWRiYWNrLlZtRGF0YS5sZW5ndGggLSAxXS50YXNrSWQ7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3VsdDtcclxuXHJcbiAgICBpZiAodGhpcy5wdWJsaXNoaW5nU3RhdGUgPT09IFwiZml4dHVyZVwiKSB7XHJcbiAgICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihTY2hlZHVsZVRhc2tQb3B1cENvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICAgIHNpemU6IFwibWRcIixcclxuICAgICAgICBzY3JvbGxhYmxlOiB0cnVlLFxyXG4gICAgICAgIGJhY2tkcm9wOiBcInN0YXRpY1wiLFxyXG4gICAgICAgIHdpbmRvd0NsYXNzOiBcInNjaGVkdWxlLXRhc2stbW9kYWxcIixcclxuICAgICAgfSk7XHJcbiAgICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnR5cGUgPSB0aGlzLnB1Ymxpc2hpbmdTdGF0ZTtcclxuICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2Uuc3RvcmVOYW1lID0gdGhpcy5wbGFub0RhdGE/LnN0b3JlTmFtZTtcclxuICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZml4dHVyZXMgPSB0aGlzLmFsbEZpeHR1cmVJbnN0YW5jZXM7XHJcblxyXG4gICAgICByZXN1bHQgPSBhd2FpdCBtb2RhbFJlZi5yZXN1bHQ7XHJcblxyXG4gICAgICBpZiAocmVzdWx0Py5zY2hlZHVsZWREYXRlKSB7XHJcbiAgICAgICAgcGF5bG9hZC5zY2hlZHVsZWREYXRlID0gcmVzdWx0LnNjaGVkdWxlZERhdGU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihQdWJsaXNoVGFza1BvcHVwQ29tcG9uZW50LCB7XHJcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgICAgc2l6ZTogXCJtZFwiLFxyXG4gICAgICAgIHNjcm9sbGFibGU6IHRydWUsXHJcbiAgICAgICAgYmFja2Ryb3A6IFwic3RhdGljXCIsXHJcbiAgICAgICAgd2luZG93Q2xhc3M6IFwiY3VzdG9tLWhlaWdodC1tb2RhbFwiLFxyXG4gICAgICB9KTtcclxuICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudHlwZSA9IHRoaXMucHVibGlzaGluZ1N0YXRlO1xyXG4gICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnB1dERhdGEgPSBwYXlsb2FkO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCBtb2RhbFJlZi5yZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwic3VibWl0XCIpIHtcclxuICAgICAgbGV0IHRhc2tUeXBlID0gdGhpcy5wdWJsaXNoaW5nU3RhdGU7XHJcbiAgICAgIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJ2bS1yZWRvXCIpIHtcclxuICAgICAgICB0YXNrVHlwZSA9IFwidm1cIjtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5wdWJsaXNoaW5nU3RhdGUgPT09IFwiZml4dHVyZS1yZWRvXCIpIHtcclxuICAgICAgICB0YXNrVHlwZSA9IFwiZml4dHVyZVwiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJsYXlvdXQtcmVkb1wiKSB7XHJcbiAgICAgICAgdGFza1R5cGUgPSBcImxheW91dFwiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChyZXN1bHQ/LmNvbW1lbnRzICYmIHJlc3VsdD8uY29tbWVudHMgIT0gXCJcIikge1xyXG4gICAgICAgIGxldCBjb21tZW50UGF5bG9hZCA9IHtcclxuICAgICAgICAgIGZsb29ySWQ6IHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICAgIHBsYW5vSWQ6IHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgICAgICB0YXNrVHlwZTogdGFza1R5cGUsXHJcbiAgICAgICAgICBjb21tZW50OiByZXN1bHQuY29tbWVudHMsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlR2xvYmFsQ29tbWVudChjb21tZW50UGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge30sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYXBpU2VydmljZS5jcmVhdGVUYXNrKHBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzPy5zdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0xheW91dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnRhc2tEZXRhaWxzKHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsIHRoaXMuZmxvb3JEYXRhLl9pZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U3RvcmVGZWVkYmFjayhcclxuICAgICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KHJlcz8uZGF0YT8ubWVzc2FnZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byBwdWJsaXNoIHRhc2tcIik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBbWk9ORS1WRVJJRklDQVRJT05dIHJldm9rZSDigJQgbWlycm9ycyB0aGUgZml4dHVyZSByZXZva2UgZmxvdyBidXQgdGFyZ2V0cyB0aGUgem9uZSB0YXNrLlxyXG4gIC8vIFVzZXMgdGhlIGV4aXN0aW5nIFN0b3JlVGFza1Jldm9rZUNvbXBvbmVudCArIHJldm9rZVRhc2sgQkUgZW5kcG9pbnQgd2l0aCB0eXBlICd6b25lVmVyaWZpY2F0aW9uJy5cclxuICByZXZva2Vab25lVGFzaygpIHtcclxuICAgIGNvbnN0IHRhc2tJZCA9IHRoaXMuem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uVGFzaz8uX2lkO1xyXG4gICAgaWYgKCF0YXNrSWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XHJcbiAgICAgIHJlZG86IHRoaXMuem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uVGFzaz8ucmVkb1N0YXR1cyA9PT0gdHJ1ZSxcclxuICAgICAgY2hlY2tMaXN0TmFtZTogXCJab25lIFZlcmlmaWNhdGlvblwiLFxyXG4gICAgICB0eXBlOiBcInpvbmVWZXJpZmljYXRpb25cIixcclxuICAgICAgc3RvcmU6IHRoaXMucGxhbm9EYXRhLnN0b3JlTmFtZSxcclxuICAgICAgY2xpZW50SWQ6IHRoaXMucGxhbm9EYXRhLmNsaWVudElkLFxyXG4gICAgICBmbG9vcklkOiB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgIHBsYW5vSWQ6IHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgIHRhc2tJZCxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFN0b3JlVGFza1Jldm9rZUNvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogXCJtZFwiLFxyXG4gICAgICBzY3JvbGxhYmxlOiB0cnVlLFxyXG4gICAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICAgICAgd2luZG93Q2xhc3M6IFwiY3VzdG9tLWhlaWdodC1tb2RhbFwiLFxyXG4gICAgfSk7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50eXBlID0gcGF5bG9hZC5yZWRvID8gXCJ6b25lLXJlZG9cIiA6IFwiem9uZVwiO1xyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuaW5wdXREYXRhID0gcGF5bG9hZDtcclxuXHJcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQ/LnN0YXR1cyAhPT0gXCJzdWJtaXRcIikgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKHJlc3VsdC5jb21tZW50cykge1xyXG4gICAgICAgIHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAgICAgLnVwZGF0ZUdsb2JhbENvbW1lbnQoe1xyXG4gICAgICAgICAgICBmbG9vcklkOiB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgICAgICAgIHBsYW5vSWQ6IHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgICAgICAgIHRhc2tUeXBlOiBcInpvbmVWZXJpZmljYXRpb25cIixcclxuICAgICAgICAgICAgY29tbWVudDogcmVzdWx0LmNvbW1lbnRzLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoeyBuZXh0OiAoKSA9PiB7fSB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5hcGlTZXJ2aWNlLnJldm9rZVRhc2socGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgdGhpcy50YXNrRGV0YWlscyh0aGlzLmZsb29yRGF0YS5wbGFub0lkLCB0aGlzLmZsb29yRGF0YS5faWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldFpvbmVWZXJpZmljYXRpb25GZWVkYmFjayhcclxuICAgICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KHJlcz8ubWVzc2FnZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byByZXZva2Ugem9uZSB0YXNrXCIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBbWk9ORS1WRVJJRklDQVRJT05dIGluaXRpYWwgcHVibGlzaCDigJQgYXNzaWducyBhIHpvbmUgdmVyaWZpY2F0aW9uIHRhc2sgdG8gdGhlIHN0b3JlLlxyXG4gIC8vIE1pcnJvcnMgdGhlIGZpeHR1cmUgaW5pdGlhbCBwdWJsaXNoIGZsb3cuIFJldXNlcyBQdWJsaXNoVGFza1BvcHVwQ29tcG9uZW50IHdpdGggdHlwZSAnem9uZScuXHJcbiAgYXN5bmMgcHVibGlzaFpvbmVWZXJpZmljYXRpb24oKSB7XHJcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XHJcbiAgICAgIHJlZG86IGZhbHNlLFxyXG4gICAgICBjaGVja0xpc3ROYW1lOiBcIlpvbmUgVmVyaWZpY2F0aW9uXCIsXHJcbiAgICAgIHN0b3JlOiB0aGlzLnBsYW5vRGF0YS5zdG9yZU5hbWUsXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLnBsYW5vRGF0YS5jbGllbnRJZCxcclxuICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICBwbGFub0lkOiB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oUHVibGlzaFRhc2tQb3B1cENvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogXCJtZFwiLFxyXG4gICAgICBzY3JvbGxhYmxlOiB0cnVlLFxyXG4gICAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICAgICAgd2luZG93Q2xhc3M6IFwiY3VzdG9tLWhlaWdodC1tb2RhbFwiLFxyXG4gICAgfSk7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50eXBlID0gXCJ6b25lXCI7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnB1dERhdGEgPSBwYXlsb2FkO1xyXG5cclxuICAgIGxldCByZXN1bHQ6IGFueTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IG1vZGFsUmVmLnJlc3VsdDtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAocmVzdWx0Py5zdGF0dXMgIT09IFwic3VibWl0XCIpIHJldHVybjtcclxuXHJcbiAgICAvLyBDcmVhdGUgdGhlIHRhc2sgZmlyc3Qgc28gd2UgaGF2ZSB0aGUgbmV3IHRhc2tJZCB0byBhdHRhY2ggdG8gdGhlIGdsb2JhbFxyXG4gICAgLy8gY29tbWVudCDigJQgb3RoZXJ3aXNlIHRoZSBjb21tZW50IHdvdWxkIGJlIHNhdmVkIHdpdGggdGFza0lkOiB1bmRlZmluZWQgYW5kXHJcbiAgICAvLyB3b3VsZCBuZXZlciBiZSBwaWNrZWQgdXAgYnkgdGhlIHpvbmUgdGFzaydzIGNvbW1lbnRMb29rdXAgam9pbi5cclxuICAgIHRoaXMuYXBpU2VydmljZS5jcmVhdGVUYXNrKHBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgIGNvbnN0IG5ld1Rhc2tJZCA9IHJlcz8uZGF0YT8udGFza0lkO1xyXG4gICAgICAgICAgaWYgKHJlc3VsdD8uY29tbWVudHMpIHtcclxuICAgICAgICAgICAgdGhpcy5hcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgLnVwZGF0ZUdsb2JhbENvbW1lbnQoe1xyXG4gICAgICAgICAgICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICAgICAgICAgICAgcGxhbm9JZDogdGhpcy5mbG9vckRhdGEucGxhbm9JZCxcclxuICAgICAgICAgICAgICAgIHRhc2tUeXBlOiBcInpvbmVWZXJpZmljYXRpb25cIixcclxuICAgICAgICAgICAgICAgIHRhc2tJZDogbmV3VGFza0lkLFxyXG4gICAgICAgICAgICAgICAgY29tbWVudDogcmVzdWx0LmNvbW1lbnRzLFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSh7IG5leHQ6ICgpID0+IHt9IH0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMudGFza0RldGFpbHModGhpcy5mbG9vckRhdGEucGxhbm9JZCwgdGhpcy5mbG9vckRhdGEuX2lkKTtcclxuICAgICAgICAgIHRoaXMuZ2V0Wm9uZVZlcmlmaWNhdGlvbkZlZWRiYWNrKFxyXG4gICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgICAgICB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KHJlcz8uZGF0YT8ubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gcHVibGlzaCB6b25lIHZlcmlmaWNhdGlvblwiKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gW1pPTkUtVkVSSUZJQ0FUSU9OXSByZWRvIHB1Ymxpc2gg4oCUIGluZGVwZW5kZW50IG9mIHRoZSBsYXlvdXQvZml4dHVyZS92bSBjaGFpbi5cclxuICAvLyBSZXVzZXMgUHVibGlzaFRhc2tQb3B1cENvbXBvbmVudCB3aXRoIGEgbmV3ICd6b25lLXJlZG8nIHR5cGUuXHJcbiAgYXN5bmMgcHVibGlzaFpvbmVSZWRvKCkge1xyXG4gICAgY29uc3QgdGFza0lkID0gdGhpcy56b25lRmVlZGJhY2s/LnpvbmVWZXJpZmljYXRpb25UYXNrPy5faWQ7XHJcbiAgICBpZiAoIXRhc2tJZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcclxuICAgICAgcmVkbzogdHJ1ZSxcclxuICAgICAgY2hlY2tMaXN0TmFtZTogXCJab25lIFZlcmlmaWNhdGlvblwiLFxyXG4gICAgICBzdG9yZTogdGhpcy5wbGFub0RhdGEuc3RvcmVOYW1lLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5wbGFub0RhdGEuY2xpZW50SWQsXHJcbiAgICAgIGZsb29ySWQ6IHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgdGFza0lkLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oUHVibGlzaFRhc2tQb3B1cENvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogXCJtZFwiLFxyXG4gICAgICBzY3JvbGxhYmxlOiB0cnVlLFxyXG4gICAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICAgICAgd2luZG93Q2xhc3M6IFwiY3VzdG9tLWhlaWdodC1tb2RhbFwiLFxyXG4gICAgfSk7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50eXBlID0gXCJ6b25lLXJlZG9cIjtcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmlucHV0RGF0YSA9IHBheWxvYWQ7XHJcblxyXG4gICAgbGV0IHJlc3VsdDogYW55O1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmVzdWx0ID0gYXdhaXQgbW9kYWxSZWYucmVzdWx0O1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChyZXN1bHQ/LnN0YXR1cyAhPT0gXCJzdWJtaXRcIikgcmV0dXJuO1xyXG5cclxuICAgIGlmIChyZXN1bHQ/LmNvbW1lbnRzKSB7XHJcbiAgICAgIHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAgIC51cGRhdGVHbG9iYWxDb21tZW50KHtcclxuICAgICAgICAgIGZsb29ySWQ6IHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICAgIHBsYW5vSWQ6IHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgICAgICB0YXNrVHlwZTogXCJ6b25lVmVyaWZpY2F0aW9uXCIsXHJcbiAgICAgICAgICB0YXNrSWQsXHJcbiAgICAgICAgICBjb21tZW50OiByZXN1bHQuY29tbWVudHMsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuc3Vic2NyaWJlKHsgbmV4dDogKCkgPT4ge30gfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmNyZWF0ZVRhc2socGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcz8uc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xyXG4gICAgICAgICAgdGhpcy50YXNrRGV0YWlscyh0aGlzLmZsb29yRGF0YS5wbGFub0lkLCB0aGlzLmZsb29yRGF0YS5faWQpO1xyXG4gICAgICAgICAgdGhpcy5nZXRab25lVmVyaWZpY2F0aW9uRmVlZGJhY2soXHJcbiAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRTdWNjZXNzVG9hc3QocmVzPy5kYXRhPy5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byBwdWJsaXNoIHpvbmUgcmVkb1wiKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DbGlja0VkaXQoKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuZGlzYWJsZUVkaXQgfHxcclxuICAgICAgW1widGFza0Fzc2lnbmVkXCJdLmluY2x1ZGVzKHRoaXMudGFza1N0eWxlLmZpeHR1cmUuY2xhc3MpIHx8XHJcbiAgICAgICh0aGlzLnRhc2tTdHlsZS5maXh0dXJlLmNsYXNzID09IFwicmV2aWV3UGVuZGluZ1wiICYmICF0aGlzLnNob3dMYXlvdXQpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gaWYgKHRoaXMudGFza1N0eWxlLmZpeHR1cmUubmFtZSAhPT0gXCJBcHByb3ZlZFwiKSB7XHJcbiAgICAgIHRoaXMudG9nZ2xlUGFuZWwoXCJyaWdodFwiLCB0cnVlKTtcclxuICAgICAgdGhpcy50b2dnbGVQYW5lbChcImxlZnRcIiwgZmFsc2UpO1xyXG5cclxuICAgICAgdGhpcy5kaXNhYmxlZFB1Ymxpc2ggPSB0cnVlO1xyXG4gICAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcclxuICAgICAgdGhpcy5sYXlvdXRGb3JtLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRGaXh0dXJlRm9ybUlkID0gbnVsbDtcclxuICAgICAgdGhpcy5yZW5kZXJGbG9vcigpO1xyXG4gICAgLy8gfSBlbHNlIHtcclxuICAgIC8vICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChcclxuICAgIC8vICAgICBgbWFuYWdlL3BsYW5vZ3JhbS9tYW5hZ2Utcm9sbG91dD9wbGFub0lkPSR7dGhpcy5mbG9vckRhdGEucGxhbm9JZH0mZmxvb3JJZD0ke3RoaXMuZmxvb3JEYXRhLl9pZH1gLFxyXG4gICAgLy8gICApO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgdGFza0RldGFpbHMocGxhbm9JZDogYW55LCBmbG9vcklkOiBhbnkpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMudGFza0luZm8gPSB7fTtcclxuICAgICAgdGhpcy50YXNrU3R5bGUgPSB7XHJcbiAgICAgICAgbGF5b3V0OiB7IG5hbWU6IFwiWWV0IFRvIEFzc2lnblwiLCBjbGFzczogXCJ5ZXRUb0Fzc2lnblwiIH0sXHJcbiAgICAgICAgZml4dHVyZTogeyBuYW1lOiBcIllldCBUbyBBc3NpZ25cIiwgY2xhc3M6IFwieWV0VG9Bc3NpZ25cIiB9LFxyXG4gICAgICAgIHZtOiB7IG5hbWU6IFwiWWV0IFRvIEFzc2lnblwiLCBjbGFzczogXCJ5ZXRUb0Fzc2lnblwiIH0sXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuYXBpU2VydmljZS5nZXRUYXNrSW5mbyh7IHBsYW5vSWQsIGZsb29ySWQgfSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWRQdWJsaXNoID0gcmVzPy5kYXRhPy5kaXNhYmxlZCB8fCBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy50YXNrSW5mbyA9IHJlcz8uZGF0YTtcclxuICAgICAgICAgICAgdGhpcy50YXNrSW5mbz8udGFza0RldGFpbHM/LmZvckVhY2goKGVsZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGVsZS50eXBlID09IFwibGF5b3V0XCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGFza1N0eWxlLmxheW91dCA9IHRoaXMuZ2V0U3RhdHVzKFwibGF5b3V0XCIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoZWxlLnR5cGUgPT0gXCJmaXh0dXJlXCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGFza1N0eWxlLmZpeHR1cmUgPSB0aGlzLmdldFN0YXR1cyhcImZpeHR1cmVcIik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChlbGUudHlwZSA9PSBcImZpeHR1cmVcIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50YXNrU3R5bGUudm0gPSB0aGlzLnRhc2tTdHlsZS5maXh0dXJlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUHVibGlzaGluZ1N0YXRlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gZ2V0IHRhc2sgZGV0YWlsc1wiKTtcclxuICAgICAgICAgIHJlamVjdCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRTdGF0dXModHlwZTogYW55KSB7XHJcbiAgICBsZXQgZGF0YSA9IHRoaXMudGFza0luZm8/LnRhc2tEZXRhaWxzPy5maW5kKChlbGU6IGFueSkgPT4gZWxlLnR5cGUgPT0gdHlwZSk7XHJcbiAgICBpZiAoZGF0YSkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgZGF0YS5zdGF0dXMgPT0gXCJzdWJtaXRcIiAmJlxyXG4gICAgICAgIChkYXRhLmZlZWRiYWNrU3RhdHVzID09IFwiY29tcGxldGVcIiB8fCAhZGF0YT8uZmVlZGJhY2tTdGF0dXMpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybiB7IG5hbWU6IFwiQXBwcm92ZWRcIiwgY2xhc3M6IFwiY29tcGxldGVkXCIgfTtcclxuICAgICAgfSBlbHNlIGlmIChkYXRhLnN0YXR1cyA9PSBcInN1Ym1pdFwiICYmIGRhdGEuZmVlZGJhY2tTdGF0dXMgPT0gXCJwZW5kaW5nXCIpIHtcclxuICAgICAgICByZXR1cm4geyBuYW1lOiBcIlJldmlldyBQZW5kaW5nXCIsIGNsYXNzOiBcInJldmlld1BlbmRpbmdcIiB9O1xyXG4gICAgICB9IGVsc2UgaWYgKGRhdGEuc3RhdHVzID09IFwic3VibWl0XCIgJiYgZGF0YS5mZWVkYmFja1N0YXR1cyA9PSBcImRpc2FncmVlXCIpIHtcclxuICAgICAgICByZXR1cm4geyBuYW1lOiBcIllldCB0byBBc3NpZ25cIiwgY2xhc3M6IFwieWV0VG9Bc3NpZ25cIiB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChkYXRhLnJlZG9TdGF0dXMgJiYgIWRhdGEuYnJlYWNoKSB7XHJcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiBcIlJlZG9cIiwgY2xhc3M6IFwidGFza0Fzc2lnbmVkXCIgfTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuYnJlYWNoKSB7XHJcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiBcIkZsYWdnZWRcIiwgY2xhc3M6IFwiZmxhZ2dlZFwiIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGRhdGE/LmRhdGUgJiZcclxuICAgICAgICAgIGRheWpzKGRhdGEuZGF0ZSwgXCJZWVlZLU1NLUREXCIpLmlzQWZ0ZXIoZGF5anMoKSwgXCJkYXlcIilcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG5hbWU6IGBUYXNrIHNjaGVkdWxlZDogJHtkYXlqcyhkYXRhLmRhdGUpLmZvcm1hdChcIkREIE1NTU0sIFlZWVlcIil9YCxcclxuICAgICAgICAgICAgY2xhc3M6IFwidGFza0Fzc2lnbmVkXCIsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiBcIlRhc2sgQXNzaWduZWRcIiwgY2xhc3M6IFwidGFza0Fzc2lnbmVkXCIgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7IG5hbWU6IFwiWWV0IHRvIEFzc2lnblwiLCBjbGFzczogXCJ5ZXRUb0Fzc2lnblwiIH07XHJcbiAgfVxyXG5cclxuICBnZXRFbGVtZW50TnVtYmVyKGdyb3VwOiBhbnkpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIHJldHVybiBncm91cC5nZXQoXCJlbGVtZW50TnVtYmVyXCIpPy52YWx1ZSA/PyBudWxsO1xyXG4gIH1cclxuXHJcbiAgaGlnaGxpZ2h0Rml4dHVyZShncm91cDogYW55LCBibGluazogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBpZiAodGhpcy5sYXlvdXRGb3JtLmVuYWJsZWQpIHJldHVybjtcclxuICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7XHJcbiAgICB0aGlzLmNhbmNlbEhpZ2hsaWdodEJsaW5rID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgY2VudGVyID0gZ3JvdXAuZ2V0Q2VudGVyUG9pbnQoKTtcclxuXHJcbiAgICBjb25zdCByZWFsV2lkdGggPSBncm91cC53aWR0aCEgKiBncm91cC5zY2FsZVghO1xyXG4gICAgY29uc3QgcmVhbEhlaWdodCA9IGdyb3VwLmhlaWdodCEgKiBncm91cC5zY2FsZVkhO1xyXG5cclxuICAgIGNvbnN0IHJlY3QgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICBsZWZ0OiBjZW50ZXIueCxcclxuICAgICAgdG9wOiBjZW50ZXIueSxcclxuICAgICAgd2lkdGg6IHJlYWxXaWR0aCArIDgsIC8vIGNvbnNpc3RlbnQgcGFkZGluZ1xyXG4gICAgICBoZWlnaHQ6IHJlYWxIZWlnaHQgKyA4LFxyXG4gICAgICByeDogNSxcclxuICAgICAgcnk6IDUsXHJcbiAgICAgIHN0cm9rZTogXCIjMDBhYWZmXCIsXHJcbiAgICAgIHN0cm9rZVdpZHRoOiAzLFxyXG4gICAgICBmaWxsOiBcInRyYW5zcGFyZW50XCIsXHJcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICBldmVudGVkOiBmYWxzZSxcclxuICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcclxuICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcclxuICAgICAgYW5nbGU6IGdyb3VwLmFuZ2xlIHx8IDAsXHJcbiAgICAgIG9wYWNpdHk6IGJsaW5rID8gMCA6IDEsXHJcbiAgICB9KTtcclxuXHJcbiAgICAocmVjdCBhcyBhbnkpLmRhdGEgPSB7IHR5cGU6IFwiZml4dHVyZS1oaWdobGlnaHRcIiB9O1xyXG5cclxuICAgIHRoaXMuY2FudmFzLmFkZChyZWN0KTtcclxuICAgIHRoaXMuY2FudmFzLm1vdmVPYmplY3RUbyhyZWN0LCB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCkubGVuZ3RoIC0gMSk7XHJcbiAgICB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCk7XHJcblxyXG4gICAgdGhpcy5hY3RpdmVIaWdobGlnaHQgPSByZWN0O1xyXG5cclxuICAgIC8vIC0tLSBObyBibGlua2luZyBuZWVkZWQgLS0tXHJcbiAgICBpZiAoIWJsaW5rKSByZXR1cm47XHJcblxyXG4gICAgbGV0IGN5Y2xlcyA9IDA7XHJcblxyXG4gICAgY29uc3QgYmxpbmtPbmNlID0gKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5jYW5jZWxIaWdobGlnaHRCbGluaykge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZWN0LmFuaW1hdGUoXHJcbiAgICAgICAgeyBvcGFjaXR5OiAxIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgIG9uQ2hhbmdlOiAoKSA9PiB0aGlzLmNhbnZhcy5yZXF1ZXN0UmVuZGVyQWxsKCksXHJcbiAgICAgICAgICBvbkNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbmNlbEhpZ2hsaWdodEJsaW5rKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHQoKTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlY3QuYW5pbWF0ZShcclxuICAgICAgICAgICAgICB7IG9wYWNpdHk6IDAgfSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMjAwLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6ICgpID0+IHRoaXMuY2FudmFzLnJlcXVlc3RSZW5kZXJBbGwoKSxcclxuICAgICAgICAgICAgICAgIG9uQ29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuY2VsSGlnaGxpZ2h0QmxpbmspIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgY3ljbGVzKys7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChjeWNsZXMgPCAyMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJsaW5rT25jZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jYW5jZWxIaWdobGlnaHRCbGluaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmVjdC5zZXQoeyBvcGFjaXR5OiAxIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXMucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICApO1xyXG4gICAgfTtcclxuXHJcbiAgICBibGlua09uY2UoKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUhpZ2hsaWdodCgpIHtcclxuICAgIHRoaXMuY2FuY2VsSGlnaGxpZ2h0QmxpbmsgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuY2FudmFzPy5nZXRPYmplY3RzKCk/LmZvckVhY2goKG9iaikgPT4ge1xyXG4gICAgICBpZiAoKG9iaiBhcyBhbnkpLmRhdGE/LnR5cGUgPT09IFwiZml4dHVyZS1oaWdobGlnaHRcIikge1xyXG4gICAgICAgIHRoaXMuY2FudmFzLnJlbW92ZShvYmopO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFjdGl2ZUhpZ2hsaWdodCA9IG51bGw7XHJcbiAgICB0aGlzLmNhbnZhcz8ucmVxdWVzdFJlbmRlckFsbCgpO1xyXG4gIH1cclxuXHJcbiAga2VlcEhpZ2hsaWdodE9uVG9wID0gKCkgPT4ge1xyXG4gICAgaWYgKCF0aGlzLmFjdGl2ZUhpZ2hsaWdodCkgcmV0dXJuO1xyXG4gICAgY29uc3Qgb2JqcyA9IHRoaXMuY2FudmFzLmdldE9iamVjdHMoKTtcclxuICAgIHRoaXMuY2FudmFzLm1vdmVPYmplY3RUbyh0aGlzLmFjdGl2ZUhpZ2hsaWdodCwgb2Jqcy5sZW5ndGggLSAxKTtcclxuICB9O1xyXG5cclxuICAvLyBJbiBlZGl0IG1vZGUsIHdoZW4gYSBmaXh0dXJlIGlzIGNsaWNrZWQgb24gdGhlIGNhbnZhcywgb3BlbiB0aGUgbWF0Y2hpbmdcclxuICAvLyBhY2NvcmRpb24gaXRlbSBpbiB0aGUgbGVmdCBwYW5lbCwgc2Nyb2xsIGl0IGludG8gdmlldyBhbmQgaGlnaGxpZ2h0IHRoZVxyXG4gIC8vIGZpeHR1cmUgcm93IHNvIHRoZSB1c2VyIGNhbiBsb2NhdGUgaXQgaW4gdGhlIGZvcm0gcXVpY2tseS5cclxuICBoaWdobGlnaHRGaXh0dXJlSW5BY2NvcmRpb24oZml4dHVyZURhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCFmaXh0dXJlRGF0YSB8fCB0aGlzLmxheW91dEZvcm0uZGlzYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICBsZXQgYWNjb3JkaW9uSXRlbUlkOiBzdHJpbmc7XHJcblxyXG4gICAgaWYgKGZpeHR1cmVEYXRhLmZpeHR1cmVUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICBjb25zdCBmb3JtSWR4ID0gdGhpcy5nZXRGb3JtV2FsbHMuY29udHJvbHMuZmluZEluZGV4KFxyXG4gICAgICAgIChjKSA9PlxyXG4gICAgICAgICAgYy5nZXQoXCJlbGVtZW50TnVtYmVyXCIpPy52YWx1ZSA9PT0gZml4dHVyZURhdGEuYXNzb2NpYXRlZEVsZW1lbnROdW1iZXIsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChmb3JtSWR4IDwgMCkge1xyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRGaXh0dXJlRm9ybUlkID0gbnVsbDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgYWNjb3JkaW9uSXRlbUlkID0gYGFjY29yZGlvbi13YWxsLSR7Zm9ybUlkeH1gO1xyXG4gICAgfSBlbHNlIGlmIChmaXh0dXJlRGF0YS5maXh0dXJlVHlwZSA9PT0gXCJmbG9vclwiKSB7XHJcbiAgICAgIGFjY29yZGlvbkl0ZW1JZCA9IFwiYWNjb3JkaW9uLWZsb29yXCI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oaWdobGlnaHRlZEZpeHR1cmVGb3JtSWQgPSBmaXh0dXJlRGF0YS5faWQgPz8gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5pc0xlZnRQYW5lbENvbGxhcHNlZCkge1xyXG4gICAgICB0aGlzLnRvZ2dsZVBhbmVsKFwibGVmdFwiLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ib2R5QWNjb3JkaW9uPy5leHBhbmQoYWNjb3JkaW9uSXRlbUlkKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhY2NvcmRpb25JdGVtSWQpO1xyXG4gICAgICBlbD8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogXCJzbW9vdGhcIiwgYmxvY2s6IFwic3RhcnRcIiB9KTtcclxuICAgIH0sIDM1MCk7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZUZpeHR1cmVPbkZlZWRiYWNrUGFuZWwoXHJcbiAgICB7XHJcbiAgICAgIGN1cnJlbnRGaXh0dXJlLFxyXG4gICAgICBhY3Rpb24sXHJcbiAgICB9OiB7XHJcbiAgICAgIGN1cnJlbnRGaXh0dXJlPzogc3RyaW5nO1xyXG4gICAgICBhY3Rpb24/OiBcIm5leHRcIiB8IFwicHJldmlvdXNcIjtcclxuICAgIH0sXHJcbiAgICBjb2xsYXBzZVRhc2tJbmZvOiBib29sZWFuID0gZmFsc2UsXHJcbiAgKSB7XHJcbiAgICBsZXQgaW5kZXhUb1NlbGVjdCA9IGN1cnJlbnRGaXh0dXJlXHJcbiAgICAgID8gdGhpcy5hbGxGaXh0dXJlSW5zdGFuY2VzLmZpbmRJbmRleCgoZjogYW55KSA9PiBmLl9pZCA9PT0gY3VycmVudEZpeHR1cmUpXHJcbiAgICAgIDogMDtcclxuXHJcbiAgICBpZiAoYWN0aW9uID09PSBcIm5leHRcIikge1xyXG4gICAgICBpZiAoaW5kZXhUb1NlbGVjdCA9PSB0aGlzLmFsbEZpeHR1cmVJbnN0YW5jZXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGluZGV4VG9TZWxlY3QgPSAwO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGluZGV4VG9TZWxlY3QrKztcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09IFwicHJldmlvdXNcIikge1xyXG4gICAgICBpZiAoaW5kZXhUb1NlbGVjdCA9PSAwKSB7XHJcbiAgICAgICAgaW5kZXhUb1NlbGVjdCA9IHRoaXMuYWxsRml4dHVyZUluc3RhbmNlcy5sZW5ndGggLSAxO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGluZGV4VG9TZWxlY3QtLTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICghY3VycmVudEZpeHR1cmUgJiYgIWFjdGlvbikge1xyXG4gICAgICBpbmRleFRvU2VsZWN0ID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaXh0dXJlSWRUb1NlbGVjdCA9IHRoaXMuYWxsRml4dHVyZUluc3RhbmNlc1tpbmRleFRvU2VsZWN0XT8uX2lkO1xyXG5cclxuICAgIGNvbnN0IGFjdGlvbkZpeHR1cmUgPSB0aGlzLmNhbnZhc1xyXG4gICAgICAuZ2V0T2JqZWN0cygpXHJcbiAgICAgIC5maW5kKFxyXG4gICAgICAgIChvYmo6IGFueSkgPT5cclxuICAgICAgICAgIG9iai5vYmpUeXBlID09PSBcImZpeHR1cmVcIiAmJiBvYmouZml4dHVyZUlkID09PSBmaXh0dXJlSWRUb1NlbGVjdCxcclxuICAgICAgKSBhcyBmYWJyaWMuR3JvdXAgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgaWYgKCFhY3Rpb25GaXh0dXJlKSByZXR1cm47XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVzaXplQ2FudmFzKCk7XHJcbiAgICAgIHRoaXMuZml0Q2FudmFzVG9MYXlvdXRBbmltYXRlZCgpO1xyXG4gICAgfSwgMzAwKTtcclxuXHJcbiAgICB0aGlzLmhpZ2hsaWdodEZpeHR1cmUoYWN0aW9uRml4dHVyZSk7XHJcbiAgICB0aGlzLnNlbGVjdEZpeHR1cmVPbkNhbnZhc0NsaWNrKGFjdGlvbkZpeHR1cmUsIGNvbGxhcHNlVGFza0luZm8pO1xyXG4gIH1cclxuXHJcbiAgcmV2b2tlVGFzaygpIHtcclxuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcclxuICAgICAgcmVkbzogZmFsc2UsXHJcbiAgICAgIGNoZWNrTGlzdE5hbWU6IFwiXCIsXHJcbiAgICAgIHN0b3JlOiB0aGlzLnBsYW5vRGF0YS5zdG9yZU5hbWUsXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLnBsYW5vRGF0YS5jbGllbnRJZCxcclxuICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICBwbGFub0lkOiB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5wdWJsaXNoaW5nU3RhdGUgPT09IFwibGF5b3V0XCIpIHtcclxuICAgICAgcGF5bG9hZC50eXBlID0gXCJsYXlvdXRcIjtcclxuICAgICAgLy8gdGhpcy51cGRhdGVMYXlvdXQoKVxyXG4gICAgICBwYXlsb2FkLmNoZWNrTGlzdE5hbWUgPSBcIkxheW91dCBWZXJpZmljYXRpb25cIjtcclxuICAgICAgcGF5bG9hZC5yZWRvID0gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMucHVibGlzaGluZ1N0YXRlID09PSBcImxheW91dC1yZWRvXCIpIHtcclxuICAgICAgcGF5bG9hZC5jaGVja0xpc3ROYW1lID0gXCJMYXlvdXQgVmVyaWZpY2F0aW9uXCI7XHJcbiAgICAgIHBheWxvYWQudHlwZSA9IFwibGF5b3V0XCI7XHJcbiAgICAgIHBheWxvYWQucmVkbyA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMucHVibGlzaGluZ1N0YXRlID09PSBcImZpeHR1cmVcIikge1xyXG4gICAgICBwYXlsb2FkLmNoZWNrTGlzdE5hbWUgPSBcIkZpeHR1cmUgVmVyaWZpY2F0aW9uXCI7XHJcbiAgICAgIHBheWxvYWQudHlwZSA9IFwiZml4dHVyZVwiO1xyXG4gICAgICBwYXlsb2FkLnJlZG8gPSBmYWxzZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5wdWJsaXNoaW5nU3RhdGUgPT09IFwiZml4dHVyZS1yZWRvXCIpIHtcclxuICAgICAgcGF5bG9hZC5jaGVja0xpc3ROYW1lID0gXCJGaXh0dXJlIFZlcmlmaWNhdGlvblwiO1xyXG4gICAgICBwYXlsb2FkLnR5cGUgPSBcImZpeHR1cmVcIjtcclxuICAgICAgcGF5bG9hZC5yZWRvID0gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5wdWJsaXNoaW5nU3RhdGUgPT09IFwidm1cIikge1xyXG4gICAgICBwYXlsb2FkLmNoZWNrTGlzdE5hbWUgPSBcIlZNIFZlcmlmaWNhdGlvblwiO1xyXG4gICAgICBwYXlsb2FkLnR5cGUgPSBcInZtXCI7XHJcbiAgICAgIHBheWxvYWQucmVkbyA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJ2bS1yZWRvXCIpIHtcclxuICAgICAgcGF5bG9hZC5jaGVja0xpc3ROYW1lID0gXCJWTSBWZXJpZmljYXRpb25cIjtcclxuICAgICAgcGF5bG9hZC50eXBlID0gXCJ2bVwiO1xyXG4gICAgICBwYXlsb2FkLnJlZG8gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcGF5bG9hZC50YXNrSWQgPSB0aGlzLnRhc2tJbmZvPy50YXNrRGV0YWlscy5maW5kKFxyXG4gICAgICAoZWxlOiBhbnkpID0+IGVsZS50eXBlID09IHBheWxvYWQudHlwZSxcclxuICAgICk/LnRhc2tJZDtcclxuXHJcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oU3RvcmVUYXNrUmV2b2tlQ29tcG9uZW50LCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICBzaXplOiBcIm1kXCIsXHJcbiAgICAgIHNjcm9sbGFibGU6IHRydWUsXHJcbiAgICAgIGJhY2tkcm9wOiBcInN0YXRpY1wiLFxyXG4gICAgICB3aW5kb3dDbGFzczogXCJjdXN0b20taGVpZ2h0LW1vZGFsXCIsIC8vIDwtLSBBZGQgYSBjdXN0b20gY2xhc3MgaGVyZVxyXG4gICAgfSk7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50eXBlID0gdGhpcy5wdWJsaXNoaW5nU3RhdGU7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnB1dERhdGEgPSBwYXlsb2FkO1xyXG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJzdWJtaXRcIikge1xyXG4gICAgICAgIGxldCB0YXNrVHlwZSA9IHRoaXMucHVibGlzaGluZ1N0YXRlO1xyXG4gICAgICAgIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJ2bS1yZWRvXCIpIHtcclxuICAgICAgICAgIHRhc2tUeXBlID0gXCJ2bVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wdWJsaXNoaW5nU3RhdGUgPT09IFwiZml4dHVyZS1yZWRvXCIpIHtcclxuICAgICAgICAgIHRhc2tUeXBlID0gXCJmaXh0dXJlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnB1Ymxpc2hpbmdTdGF0ZSA9PT0gXCJsYXlvdXQtcmVkb1wiKSB7XHJcbiAgICAgICAgICB0YXNrVHlwZSA9IFwibGF5b3V0XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXN1bHQuY29tbWVudHMgJiYgcmVzdWx0LmNvbW1lbnRzICE9IFwiXCIpIHtcclxuICAgICAgICAgIGxldCBjb21tZW50UGF5bG9hZCA9IHtcclxuICAgICAgICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICAgICAgICBwbGFub0lkOiB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgICAgICB0YXNrVHlwZTogdGFza1R5cGUsXHJcbiAgICAgICAgICAgIGNvbW1lbnQ6IHJlc3VsdC5jb21tZW50cyxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlR2xvYmFsQ29tbWVudChjb21tZW50UGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7fSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFwaVNlcnZpY2UucmV2b2tlVGFzayhwYXlsb2FkKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgICB0aGlzLnRhc2tEZXRhaWxzKHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsIHRoaXMuZmxvb3JEYXRhLl9pZCk7XHJcbiAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KHJlcz8ubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiRmFpbGVkIHRvIHB1Ymxpc2ggdGFza1wiKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGlzaCgpIHtcclxuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihQdWJsaXNoUGxhbm9Nb2RhbENvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogXCJtZFwiLFxyXG4gICAgICBzY3JvbGxhYmxlOiB0cnVlLFxyXG4gICAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICAgICAgd2luZG93Q2xhc3M6IFwiY3VzdG9tLWhlaWdodC1tb2RhbFwiLFxyXG4gICAgfSk7XHJcblxyXG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICBjb25zdCBwdWJsaXNoQXNEcmFmdCA9IHJlcy5wdWJsaXNoQXNEcmFmdDtcclxuICAgICAgICBsZXQgZGF0YSA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLnBsYW5vRGF0YSk7XHJcbiAgICAgICAgZGF0YS5mbG9vcklkID0gdGhpcy5mbG9vckRhdGEuX2lkO1xyXG4gICAgICAgIGRhdGEuZmxvb3JEYXRhID0gdGhpcy5mbG9vckRhdGE7XHJcbiAgICAgICAgZGVsZXRlIGRhdGEuZmxvb3JzO1xyXG4gICAgICAgIGRlbGV0ZSBkYXRhLmZsb29yRGF0YS5tYXN0ZXJUZW1wbGF0ZXM7XHJcbiAgICAgICAgZGF0YS5yZXZpc2lvbk5hbWUgPSByZXMucmV2aXNpb25OYW1lO1xyXG4gICAgICAgIGRhdGEuaXNBY3RpdmUgPSAhcHVibGlzaEFzRHJhZnQ7XHJcbiAgICAgICAgdGhpcy5hcGlTZXJ2aWNlLnB1Ymxpc2goZGF0YSkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChhcGlSZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYXBpUmVzICYmIGFwaVJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgICAgIGlmICghcHVibGlzaEFzRHJhZnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmxvb3JEYXRhLnZlcmlmaWNhdGlvblN0YXR1cyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldFN1Y2Nlc3NUb2FzdChhcGlSZXM/Lm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiRmFpbGVkIHRvIHB1Ymxpc2ggcGxhbm9cIik7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdvVG9TdG9yZVRvdXJQYWdlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNTdG9yZVRvdXJMb2FkaW5nKSByZXR1cm47XHJcbiAgICB0aGlzLmlzU3RvcmVUb3VyTG9hZGluZyA9IHRydWU7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuYXBpU2VydmljZS5nZXRQbGFub1N0b3JlVmlkZW9QYXJhbXMoe1xyXG4gICAgICAgICAgc3RvcmVJZDogdGhpcy5wbGFub0RhdGEuc3RvcmVJZCxcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChyZXM/LmRhdGEpIHtcclxuICAgICAgICBsZXQgcGFyYW1zID0gcmVzPy5kYXRhO1xyXG4gICAgICAgIGNvbnN0IHVybFRyZWUgPSB0aGlzLnJvdXRlci5jcmVhdGVVcmxUcmVlKFtcIi9tYW5hZ2UvdHJheC9nYWxsZXJ5XCJdLCB7XHJcbiAgICAgICAgICBxdWVyeVBhcmFtczogcGFyYW1zLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMucm91dGVyLnNlcmlhbGl6ZVVybCh1cmxUcmVlKTtcclxuICAgICAgICB3aW5kb3cub3Blbih1cmwsIFwiX2JsYW5rXCIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMub3Blbk5vVmlkZW9Gb3VuZE1vZGFsKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLm9wZW5Ob1ZpZGVvRm91bmRNb2RhbCgpO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ29Ub1N0b3JlVG91clBhZ2UgW0VSUl06XCIsIGVycm9yKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNTdG9yZVRvdXJMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBvcGVuTm9WaWRlb0ZvdW5kTW9kYWwoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMubm9TdG9yZVZpZGVvTW9kYWxSZWYsIHtcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgfSkucmVzdWx0O1xyXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHt9XHJcbiAgfVxyXG5cclxuICBnb1RvU3RvcmVDYW1lcmFQYWdlKCkge1xyXG4gICAgY29uc3QgdXJsVHJlZSA9IHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUoW1wiL21hbmFnZS9zdG9yZXMvY2FtZXJhc1wiXSwge1xyXG4gICAgICBxdWVyeVBhcmFtczoge1xyXG4gICAgICAgIHN0b3JlSWQ6IHRoaXMucGxhbm9EYXRhLnN0b3JlSWQsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLnJvdXRlci5zZXJpYWxpemVVcmwodXJsVHJlZSk7XHJcbiAgICB3aW5kb3cub3Blbih1cmwsIFwiX2JsYW5rXCIpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RvcmVMaXN0KHBsYW5vSWQ/OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAuZ2V0UGxhbm9TdG9yZUxpc3QodGhpcy5jbGllbnRJZClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gcmVzLmRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gdGhpcy5zdG9yZUxpc3QubWFwKChlbGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLmVsZSwgc3RvcmVOYW1lOiBlbGUuc3RvcmVOYW1lLnRvVXBwZXJDYXNlKCkgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChwbGFub0lkKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlTmFtZSA9IHRoaXMuc3RvcmVMaXN0LmZpbmQoXHJcbiAgICAgICAgICAgICAgICAoZWxlOiBhbnkpID0+IGVsZS5wbGFub0lkLnRvU3RyaW5nKCkgPT0gcGxhbm9JZC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uU2VsZWN0ZWQoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5wbGFub0RhdGEgPSBudWxsO1xyXG4gICAgdGhpcy5mbG9vckRhdGEgPSBudWxsO1xyXG4gICAgY29uc3QgbmV3UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcclxuICAgIG5ld1BhcmFtcy5zZXQoXCJwbGFub0lkXCIsIGV2ZW50LnBsYW5vSWQpO1xyXG4gICAgbmV3UGFyYW1zLnNldChcImZsb29ySWRcIiwgZXZlbnQuZmxvb3JJZCk7XHJcblxyXG4gICAgdGhpcy5sb2NhdGlvbi5yZXBsYWNlU3RhdGUod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLCBuZXdQYXJhbXMudG9TdHJpbmcoKSk7XHJcbiAgICB0aGlzLmlzUmlnaHRQYW5lbENvbGxhcHNlZCA9IHRydWU7XHJcbiAgICB0aGlzLmlzTGVmdFBhbmVsQ29sbGFwc2VkID0gdHJ1ZTtcclxuICAgIHRoaXMud2FsbENvdW50ID0gdGhpcy5jbENvdW50ID0gMDtcclxuICAgIHRoaXMuc2hvd0xheW91dCA9IGZhbHNlO1xyXG4gICAgYXdhaXQgdGhpcy5nZXRTdG9yZUZpeHR1cmVzKGV2ZW50Ll9pZCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhcHBseVBJRExvZ2ljcygpIHt9XHJcblxyXG4gIGFzeW5jIG9uQ2xpY2tBcHBseUxvZ2ljcygpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5hcHBseUxvZ2ljc01vZGFsUmVmLCB7XHJcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIH0pLnJlc3VsdDtcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7fVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DbGlja0FwcHJvdmVMYXlvdXQoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuYXBwcm92ZUxheW91dE1vZGFsUmVmLCB7XHJcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIH0pLnJlc3VsdDtcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7fVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYXBwcm92ZUxheW91dCgpIHtcclxuICAgIHRoaXMuaXNCdXR0b25Mb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBmbG9vcklkID0gdGhpcy5mbG9vckRhdGEuX2lkO1xyXG5cclxuICAgICAgY29uc3QgcHVibGlzaERhdGEgPSB7XHJcbiAgICAgICAgLi4uc3RydWN0dXJlZENsb25lKHRoaXMucGxhbm9EYXRhKSxcclxuICAgICAgICBmbG9vcklkLFxyXG4gICAgICAgIGZsb29yRGF0YToge1xyXG4gICAgICAgICAgLi4udGhpcy5mbG9vckRhdGEsXHJcbiAgICAgICAgICBtYXN0ZXJUZW1wbGF0ZXM6IHVuZGVmaW5lZCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZsb29yczogdW5kZWZpbmVkLFxyXG4gICAgICB9O1xyXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlU3RvcmVQbGFubyh7XHJcbiAgICAgICAgICAgIGZsb29ySWQsXHJcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuZmxvb3JEYXRhLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKSxcclxuICAgICAgICBmaXJzdFZhbHVlRnJvbSh0aGlzLmFwaVNlcnZpY2UucHVibGlzaChwdWJsaXNoRGF0YSkpLFxyXG4gICAgICAgIGZpcnN0VmFsdWVGcm9tKHRoaXMuYXBpU2VydmljZS5hcHByb3ZlUGxhbm9MYXlvdXQoZmxvb3JJZCkpLFxyXG4gICAgICBdKTtcclxuXHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldFN1Y2Nlc3NUb2FzdChcIkxheW91dCBhcHByb3ZlZCBzdWNjZXNzZnVsbHlcIik7XHJcbiAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJhcHByb3ZlTGF5b3V0IGZhaWxlZDpcIiwgZXJyb3IpO1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiRmFpbGVkIHRvIGFwcHJvdmUgbGF5b3V0XCIpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc0J1dHRvbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8c2VjdGlvbiBpZD1cIm1hbmFnZS1wbGFub1wiPlxyXG4gIDwhLS0gTG9hZGluZyBTdGF0ZSAtLT5cclxuICA8ZGl2ICpuZ0lmPVwiaXNQYWdlTG9hZGluZ1wiIGNsYXNzPVwicm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG0tMFwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyU2tlbGV0b25cIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJza2VsZXRvbkxvYWRlclwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNrZWxldG9uTG9hZGVyXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2tlbGV0b25Mb2FkZXJcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIENvbnRlbnQgLS0+XHJcbiAgPGRpdiBbbmdDbGFzc109XCJ7ICdkLW5vbmUnOiBpc1BhZ2VMb2FkaW5nIH1cIj5cclxuICAgIDwhLS0gSGVhZGVyIEFjY29yZGlvbiAtLT5cclxuICAgIDxkaXYgaWQ9XCJoZWFkZXJcIiBuZ2JBY2NvcmRpb24gI2FjY29yZGlvbj1cIm5nYkFjY29yZGlvblwiIGNsYXNzPVwibXktNFwiPlxyXG4gICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJkZXRhaWxzXCIgW2NvbGxhcHNlZF09XCJmYWxzZVwiPlxyXG4gICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBweC02IHB5LTNcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTQgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjVweDttYXJnaW4tcmlnaHQ6NXB4XCIgKm5nSWY9XCJwbGFub0RhdGE/LnN0b3JlTmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgPGgyIGNsYXNzPSd0aXRsZSc+e3twbGFub0RhdGE/LnN0b3JlTmFtZX19IC0gUGxhbm88L2gyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8bGliLXNlbGVjdC1wbGFubyAqbmdJZj1cInN0b3JlTGlzdD8ubGVuZ3RoXCIgW2lkRmllbGRdPVwiJ19pZCdcIiBbc2VsZWN0ZWRWYWx1ZXNdPVwiW3NlbGVjdGVkU3RvcmVOYW1lXVwiXHJcbiAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJzdG9yZUxpc3RcIiBbbXVsdGldPWZhbHNlIHNlYXJjaEZpZWxkPVwic3RvcmVOYW1lXCIgKHNlbGVjdGVkKT1cIm9uU2VsZWN0ZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPC9saWItc2VsZWN0LXBsYW5vPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0ICpuZ0lmPVwiZmxvb3JzTGlzdC5sZW5ndGggJiYgIWlzUGFnZUxvYWRpbmdcIiBbZm9ybUNvbnRyb2xdPVwic2VsZWN0ZWRGbG9vcklkXCJcclxuICAgICAgICAgICAgICBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiZmxvb3JzTGlzdFwiPlxyXG4gICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzLWJ0blwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJpc1N0b3JlVG91ckxvYWRpbmdcIiAoY2xpY2spPVwiZ29Ub1N0b3JlVG91clBhZ2UoKVwiPlxyXG4gICAgICAgICAgICAgIFZpZXcgc3RvcmUgdG91clxyXG5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiIWlzU3RvcmVUb3VyTG9hZGluZ1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzQwOF8xNjQ5OClcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTYgMTFDOC43NjE0MiAxMSAxMSA4Ljc2MTQyIDExIDZDMTEgMy4yMzg1OCA4Ljc2MTQyIDEgNiAxQzMuMjM4NTggMSAxIDMuMjM4NTggMSA2QzEgOC43NjE0MiAzLjIzODU4IDExIDYgMTFaXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzNCNUZGXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDRMOCA2TDUgOFY0WlwiIHN0cm9rZT1cIiMzM0I1RkZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDA4XzE2NDk4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzU3RvcmVUb3VyTG9hZGluZ1wiIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc21cIiByb2xlPVwic3RhdHVzXCJcclxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzLWJ0blwiIChjbGljayk9XCJnb1RvU3RvcmVDYW1lcmFQYWdlKClcIj5cclxuICAgICAgICAgICAgICBWaWV3IGNhbWVyYVxyXG5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNDIyXzM2MzIxKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNOSA2LjVWOS41QzkgOS43NjUyMiA4Ljg5NDY0IDEwLjAxOTYgOC43MDcxMSAxMC4yMDcxQzguNTE5NTcgMTAuMzk0NiA4LjI2NTIyIDEwLjUgOCAxMC41SDIuNUMyLjIzNDc4IDEwLjUgMS45ODA0MyAxMC4zOTQ2IDEuNzkyODkgMTAuMjA3MUMxLjYwNTM2IDEwLjAxOTYgMS41IDkuNzY1MjIgMS41IDkuNVY0QzEuNSAzLjczNDc4IDEuNjA1MzYgMy40ODA0MyAxLjc5Mjg5IDMuMjkyODlDMS45ODA0MyAzLjEwNTM2IDIuMjM0NzggMyAyLjUgM0g1LjVNNy41IDEuNUgxMC41TTEwLjUgMS41VjQuNU0xMC41IDEuNUw1IDdcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzQyMl8zNjMyMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtNFwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWVkaXRGaXh0dXJlXCIgY2xhc3M9XCJ1cGRhdGVDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCJmbG9vckRhdGE/LnVwZGF0ZWRCeU5hbWUgPyAnVXBkYXRlZCBieSAnICsgZmxvb3JEYXRhLnVwZGF0ZWRCeU5hbWUgOiBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICBMYXN0IFVwZGF0ZToge3sgZmxvb3JEYXRhPy5sYXN0VXBkYXRlSXNvIHwgZGF0ZTonZCBNTU0geXl5eSwgaGg6bW0gYScgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC00IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gRWRpdCBGaXh0dXJlIE1vZGUgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRGaXh0dXJlXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB0ZXh0LW5vd3JhcFwiIChjbGljayk9XCJvbkZpeHR1cmVQYWdlQ2FuY2VsKClcIj5cclxuICAgICAgICAgICAgICAgICAgQ2FuY2VsXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRleHQtbm93cmFwXCIgKGNsaWNrKT1cIm9uRml4dHVyZVNhdmUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICBTYXZlICYgQ2xvc2VcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIE5vcm1hbCBNb2RlOiBwZXItdGFzayBwdWJsaXNoIGJ1dHRvbnMgbGl2ZSBpbnNpZGUgdGhlaXIgcmVzcGVjdGl2ZSBjYXJkcyBiZWxvdy5cclxuICAgICAgICAgICAgICAgICAgIFRvcC1yaWdodCBzaG93cyB0aGUgZmluYWwgb3ZlcmFsbCBcIlB1Ymxpc2hcIiBvbmNlIGxheW91dCtmaXh0dXJlK3ZtIGFyZSBhcHByb3ZlZC5cclxuICAgICAgICAgICAgICAgICAgIFdoZW4gYSB6b25lIHRhc2sgZXhpc3RzIGFuZCBpc24ndCBBcHByb3ZlZCB5ZXQsIHRoZSBidXR0b24gc3RheXMgdmlzaWJsZSBidXRcclxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkIChzbyB0aGUgc3RvcmUgY2FuJ3QgYmUgcHVibGlzaGVkIHVudGlsIHpvbmUgdmVyaWZpY2F0aW9uIGNvbXBsZXRlcykuXHJcbiAgICAgICAgICAgICAgICAgICBMZWdhY3kgc3RvcmVzIHdpdGhvdXQgYSB6b25lIHRhc2sgYXJlIHVuYmxvY2tlZCBpbW1lZGlhdGVseS4gLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dUb3BQdWJsaXNoXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5kaWNhdG9yIGNvbXBsZXRlZFwiICpuZ0lmPVwiZmxvb3JEYXRhPy52ZXJpZmljYXRpb25TdGF0dXNcIj5QdWJsaXNoZWQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZmxvb3JEYXRhPy52ZXJpZmljYXRpb25TdGF0dXNcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdGV4dC1ub3dyYXBcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwicHVibGlzaCgpXCIgW2Rpc2FibGVkXT1cInRvcFB1Ymxpc2hEaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICBQdWJsaXNoXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFJldm9rZSBidXR0b25zIGxpdmUgaW5zaWRlIHRoZWlyIHJlc3BlY3RpdmUgY2FyZHMgKExheW91dCAvIEZpeHR1cmVzIC8gVk0gLyBab25lKSBiZWxvdy4gLS0+XHJcblxyXG4gICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJoZWFkZXJcIiBjbGFzcz1cInJvdyBteC0wIGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBQbGFubyBDb21wbGV0aW9uIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjdXJzb3I6IHVuc2V0O1wiIGNsYXNzPVwiY29sIGZpbHRlci10YWJcIj5cclxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgUGxhbm8gQ29tcGxldGlvbiAlXHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIiUgb2Ygb3ZlcmFsbCBwbGFub2dyYW0gY29tcGxldGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTUxN18xMjk4MDUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkgMTJWOU05IDZIOS4wMDc1TTE2LjUgOUMxNi41IDEzLjE0MjEgMTMuMTQyMSAxNi41IDkgMTYuNUM0Ljg1Nzg2IDE2LjUgMS41IDEzLjE0MjEgMS41IDlDMS41IDQuODU3ODYgNC44NTc4NiAxLjUgOSAxLjVDMTMuMTQyMSAxLjUgMTYuNSA0Ljg1Nzg2IDE2LjUgOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMTAxODI4XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTUxN18xMjk4MDVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiIHN0eWxlPVwiaGVpZ2h0OiA0cHhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBbbmdDbGFzc109XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrSW5mbz8ucGxhbm9Qcm9ncmVzcyA8PSA1MFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnYmctd2FybmluZydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGFza0luZm8/LnBsYW5vUHJvZ3Jlc3MgPT09IDc1XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdiZy1wcmltYXJ5J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnYmctc3VjY2VzcydcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgW3N0eWxlXT1cIid3aWR0aDonICsgdGFza0luZm8/LnBsYW5vUHJvZ3Jlc3MgKyAnJSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbm93XT1cInRhc2tJbmZvPy5wbGFub1Byb2dyZXNzXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPnt7IHRhc2tJbmZvPy5wbGFub1Byb2dyZXNzIH19JTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gTGF5b3V0IC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjdXJzb3I6IHVuc2V0O1wiIGNsYXNzPVwiY29sIGZpbHRlci10YWJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQganVzdGlmeS1jb250ZW50LWJldHdlZW4gZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgzPjxiPnt7IHN0b3JlTWV0cmljcy5mbG9vckNvdW50IH19PC9iPiBMYXlvdXQ8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmRpY2F0b3IgbXQtMlwiIFtuZ0NsYXNzXT1cInRhc2tTdHlsZS5sYXlvdXQuY2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMlwiIFtoaWRkZW5dPVwidGFza1N0eWxlLmxheW91dC5uYW1lICE9PSAnUmVkbydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF80OTg0XzI3NTY5KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0wLjUgMi4wMDA3N1Y1LjAwMDc3TTAuNSA1LjAwMDc3SDMuNU0wLjUgNS4wMDA3N0wyLjgyIDIuODIwNzdDMy4zNTczNyAyLjI4MzEzIDQuMDIyMTkgMS44OTAzNyA0Ljc1MjQgMS42NzkxNkM1LjQ4MjYyIDEuNDY3OTQgNi4yNTQ0NSAxLjQ0NTE1IDYuOTk1ODYgMS42MTI5QzcuNzM3MjcgMS43ODA2NSA4LjQyNDEgMi4xMzM0OSA4Ljk5MjI3IDIuNjM4NDhDOS41NjA0MyAzLjE0MzQ3IDkuOTkxNDIgMy43ODQxNiAxMC4yNDUgNC41MDA3N00xMS41IDEwLjAwMDhWNy4wMDA3N00xMS41IDcuMDAwNzdIOC41TTExLjUgNy4wMDA3N0w5LjE4IDkuMTgwNzdDOC42NDI2MyA5LjcxODQxIDcuOTc3ODEgMTAuMTExMiA3LjI0NzYgMTAuMzIyNEM2LjUxNzM4IDEwLjUzMzYgNS43NDU1NSAxMC41NTY0IDUuMDA0MTQgMTAuMzg4NkM0LjI2MjczIDEwLjIyMDkgMy41NzU5IDkuODY4MDUgMy4wMDc3MyA5LjM2MzA2QzIuNDM5NTcgOC44NTgwNyAyLjAwODU4IDguMjE3MzggMS43NTUgNy41MDA3N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM3QTVBRjhcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzQ5ODRfMjc1NjlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtoaWRkZW5dPVwidGFza1N0eWxlLmxheW91dC5uYW1lICE9PSAnRmxhZ2dlZCdcIiBjbGFzcz1cIm1lLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMiA3LjVDMiA3LjUgMi41IDcgNCA3QzUuNSA3IDYuNSA4IDggOEM5LjUgOCAxMCA3LjUgMTAgNy41VjEuNUMxMCAxLjUgOS41IDIgOCAyQzYuNSAyIDUuNSAxIDQgMUMyLjUgMSAyIDEuNSAyIDEuNVY3LjVaTTIgNy41VjExXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNCNDIzMThcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IHRhc2tTdHlsZS5sYXlvdXQubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBMYXlvdXQgYWN0aW9ucyBkaXNhYmxlZCBmb3Igbm93IOKAlCBubyBsYXlvdXQtcmVsYXRlZCBhY3Rpb25zIGFyZSBuZWVkZWQuXHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdEZpeHR1cmUgJiYgKHB1Ymxpc2hpbmdTdGF0ZSA9PT0gJ2xheW91dCcgfHwgcHVibGlzaGluZ1N0YXRlID09PSAnbGF5b3V0LXJlZG8nKSAmJiB0YXNrU3R5bGUubGF5b3V0LmNsYXNzICE9PSAndGFza0Fzc2lnbmVkJyAmJiB0YXNrU3R5bGUubGF5b3V0LmNsYXNzICE9PSAnY29tcGxldGVkJyAmJiB0YXNrU3R5bGUuZml4dHVyZS5jbGFzcyAhPT0gJ3Rhc2tBc3NpZ25lZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNhcmQtcHVibGlzaC1idG5cIiAoY2xpY2spPVwiYXNzaWduVGFzaygpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkUHVibGlzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHB1Ymxpc2hpbmdTdGF0ZSA9PT0gJ2xheW91dC1yZWRvJyA/ICdQdWJsaXNoIExheW91dCBSZWRvJyA6ICdQdWJsaXNoIExheW91dCBWZXJpZmljYXRpb24nIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRGaXh0dXJlICYmIHRhc2tTdHlsZS5sYXlvdXQuY2xhc3MgPT09ICd0YXNrQXNzaWduZWQnXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXJkLXJldm9rZS1idG5cIiAoY2xpY2spPVwicmV2b2tlVGFzaygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzY0MF81NTk0bGF5KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi42NjY2OSAxMC4wMDEzSDEzLjMzMzRNMTguMzMzNCAxMC4wMDEzQzE4LjMzMzQgMTQuNjAzNyAxNC42MDI0IDE4LjMzNDYgMTAgMTguMzM0NkM1LjM5NzY1IDE4LjMzNDYgMS42NjY2OSAxNC42MDM3IDEuNjY2NjkgMTAuMDAxM0MxLjY2NjY5IDUuMzk4OTMgNS4zOTc2NSAxLjY2Nzk3IDEwIDEuNjY3OTdDMTQuNjAyNCAxLjY2Nzk3IDE4LjMzMzQgNS4zOTg5MyAxOC4zMzM0IDEwLjAwMTNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjQjQyMzE4XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNjQwXzU1OTRsYXlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIFJldm9rZVxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgLS0+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBGaXh0dXJlcyAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY3Vyc29yOiB1bnNldDtcIiBjbGFzcz1cImNvbCBmaWx0ZXItdGFiXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMz48Yj57eyBzdG9yZU1ldHJpY3MuZml4dHVyZUNvdW50IH19PC9iPiBGaXh0dXJlczwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZGljYXRvciBtdC0yXCIgW25nQ2xhc3NdPVwidGFza1N0eWxlLmZpeHR1cmUuY2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMlwiIFtoaWRkZW5dPVwidGFza1N0eWxlLmZpeHR1cmUubmFtZSAhPT0gJ1JlZG8nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNDk4NF8yNzU2OSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMC41IDIuMDAwNzdWNS4wMDA3N00wLjUgNS4wMDA3N0gzLjVNMC41IDUuMDAwNzdMMi44MiAyLjgyMDc3QzMuMzU3MzcgMi4yODMxMyA0LjAyMjE5IDEuODkwMzcgNC43NTI0IDEuNjc5MTZDNS40ODI2MiAxLjQ2Nzk0IDYuMjU0NDUgMS40NDUxNSA2Ljk5NTg2IDEuNjEyOUM3LjczNzI3IDEuNzgwNjUgOC40MjQxIDIuMTMzNDkgOC45OTIyNyAyLjYzODQ4QzkuNTYwNDMgMy4xNDM0NyA5Ljk5MTQyIDMuNzg0MTYgMTAuMjQ1IDQuNTAwNzdNMTEuNSAxMC4wMDA4VjcuMDAwNzdNMTEuNSA3LjAwMDc3SDguNU0xMS41IDcuMDAwNzdMOS4xOCA5LjE4MDc3QzguNjQyNjMgOS43MTg0MSA3Ljk3NzgxIDEwLjExMTIgNy4yNDc2IDEwLjMyMjRDNi41MTczOCAxMC41MzM2IDUuNzQ1NTUgMTAuNTU2NCA1LjAwNDE0IDEwLjM4ODZDNC4yNjI3MyAxMC4yMjA5IDMuNTc1OSA5Ljg2ODA1IDMuMDA3NzMgOS4zNjMwNkMyLjQzOTU3IDguODU4MDcgMi4wMDg1OCA4LjIxNzM4IDEuNzU1IDcuNTAwNzdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjN0E1QUY4XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF80OTg0XzI3NTY5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cInRhc2tTdHlsZS5maXh0dXJlLm5hbWUgIT09ICdGbGFnZ2VkJ1wiIGNsYXNzPVwibWUtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yIDcuNUMyIDcuNSAyLjUgNyA0IDdDNS41IDcgNi41IDggOCA4QzkuNSA4IDEwIDcuNSAxMCA3LjVWMS41QzEwIDEuNSA5LjUgMiA4IDJDNi41IDIgNS41IDEgNCAxQzIuNSAxIDIgMS41IDIgMS41VjcuNVpNMiA3LjVWMTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0I0MjMxOFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgdGFza1N0eWxlLmZpeHR1cmUubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0Rml4dHVyZSAmJiAocHVibGlzaGluZ1N0YXRlID09PSAnZml4dHVyZScgfHwgcHVibGlzaGluZ1N0YXRlID09PSAnZml4dHVyZS1yZWRvJykgJiYgdGFza1N0eWxlLmZpeHR1cmUuY2xhc3MgIT09ICd0YXNrQXNzaWduZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjYXJkLXB1Ymxpc2gtYnRuXCIgKGNsaWNrKT1cImFzc2lnblRhc2soKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFB1Ymxpc2hcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBwdWJsaXNoaW5nU3RhdGUgPT09ICdmaXh0dXJlLXJlZG8nID8gJ1B1Ymxpc2ggUmVkbycgOiAnUHVibGlzaCBUYXNrJyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0Rml4dHVyZSAmJiB0YXNrU3R5bGUuZml4dHVyZS5jbGFzcyA9PT0gJ3Rhc2tBc3NpZ25lZCdcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtcmV2b2tlLWJ0blwiIChjbGljayk9XCJyZXZva2VUYXNrKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNjQwXzU1OTRmaXgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk02LjY2NjY5IDEwLjAwMTNIMTMuMzMzNE0xOC4zMzM0IDEwLjAwMTNDMTguMzMzNCAxNC42MDM3IDE0LjYwMjQgMTguMzM0NiAxMCAxOC4zMzQ2QzUuMzk3NjUgMTguMzM0NiAxLjY2NjY5IDE0LjYwMzcgMS42NjY2OSAxMC4wMDEzQzEuNjY2NjkgNS4zOTg5MyA1LjM5NzY1IDEuNjY3OTcgMTAgMS42Njc5N0MxNC42MDI0IDEuNjY3OTcgMTguMzMzNCA1LjM5ODkzIDE4LjMzMzQgMTAuMDAxM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNCNDIzMThcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF82NDBfNTU5NGZpeFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgUmV2b2tlXHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gVmlzdWFsIE1lcmNoYW5kaXNlIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS1cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY3Vyc29yOiB1bnNldDtcIiBjbGFzcz1cImNvbCBmaWx0ZXItdGFiXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcCBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cIm0tMFwiPjxiPnt7IHN0b3JlTWV0cmljcy52bUNvdW50IH19PC9iPiBWaXN1YWwgTWVyY2hhbmRpc2U8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmRpY2F0b3JcIiBbbmdDbGFzc109XCJ0YXNrU3R5bGUudm0uY2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMlwiIFtoaWRkZW5dPVwidGFza1N0eWxlLnZtLm5hbWUgIT09ICdSZWRvJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzQ5ODRfMjc1NjkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTAuNSAyLjAwMDc3VjUuMDAwNzdNMC41IDUuMDAwNzdIMy41TTAuNSA1LjAwMDc3TDIuODIgMi44MjA3N0MzLjM1NzM3IDIuMjgzMTMgNC4wMjIxOSAxLjg5MDM3IDQuNzUyNCAxLjY3OTE2QzUuNDgyNjIgMS40Njc5NCA2LjI1NDQ1IDEuNDQ1MTUgNi45OTU4NiAxLjYxMjlDNy43MzcyNyAxLjc4MDY1IDguNDI0MSAyLjEzMzQ5IDguOTkyMjcgMi42Mzg0OEM5LjU2MDQzIDMuMTQzNDcgOS45OTE0MiAzLjc4NDE2IDEwLjI0NSA0LjUwMDc3TTExLjUgMTAuMDAwOFY3LjAwMDc3TTExLjUgNy4wMDA3N0g4LjVNMTEuNSA3LjAwMDc3TDkuMTggOS4xODA3N0M4LjY0MjYzIDkuNzE4NDEgNy45Nzc4MSAxMC4xMTEyIDcuMjQ3NiAxMC4zMjI0QzYuNTE3MzggMTAuNTMzNiA1Ljc0NTU1IDEwLjU1NjQgNS4wMDQxNCAxMC4zODg2QzQuMjYyNzMgMTAuMjIwOSAzLjU3NTkgOS44NjgwNSAzLjAwNzczIDkuMzYzMDZDMi40Mzk1NyA4Ljg1ODA3IDIuMDA4NTggOC4yMTczOCAxLjc1NSA3LjUwMDc3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzdBNUFGOFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDk4NF8yNzU2OVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCJ0YXNrU3R5bGUudm0ubmFtZSAhPT0gJ0ZsYWdnZWQnXCIgY2xhc3M9XCJtZS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIgNy41QzIgNy41IDIuNSA3IDQgN0M1LjUgNyA2LjUgOCA4IDhDOS41IDggMTAgNy41IDEwIDcuNVYxLjVDMTAgMS41IDkuNSAyIDggMkM2LjUgMiA1LjUgMSA0IDFDMi41IDEgMiAxLjUgMiAxLjVWNy41Wk0yIDcuNVYxMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjQjQyMzE4XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyB0YXNrU3R5bGUudm0ubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0Rml4dHVyZSAmJiAocHVibGlzaGluZ1N0YXRlID09PSAndm0nIHx8IHB1Ymxpc2hpbmdTdGF0ZSA9PT0gJ3ZtLXJlZG8nKSAmJiB0YXNrU3R5bGUudm0uY2xhc3MgIT09ICd0YXNrQXNzaWduZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjYXJkLXB1Ymxpc2gtYnRuXCIgKGNsaWNrKT1cImFzc2lnblRhc2soKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFB1Ymxpc2hcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBwdWJsaXNoaW5nU3RhdGUgPT09ICd2bS1yZWRvJyA/ICdQdWJsaXNoIFJlZG8nIDogJ1B1Ymxpc2gnIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRGaXh0dXJlICYmIHRhc2tTdHlsZS52bS5jbGFzcyA9PT0gJ3Rhc2tBc3NpZ25lZCdcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtcmV2b2tlLWJ0blwiIChjbGljayk9XCJyZXZva2VUYXNrKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNjQwXzU1OTR2bSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTYuNjY2NjkgMTAuMDAxM0gxMy4zMzM0TTE4LjMzMzQgMTAuMDAxM0MxOC4zMzM0IDE0LjYwMzcgMTQuNjAyNCAxOC4zMzQ2IDEwIDE4LjMzNDZDNS4zOTc2NSAxOC4zMzQ2IDEuNjY2NjkgMTQuNjAzNyAxLjY2NjY5IDEwLjAwMTNDMS42NjY2OSA1LjM5ODkzIDUuMzk3NjUgMS42Njc5NyAxMCAxLjY2Nzk3QzE0LjYwMjQgMS42Njc5NyAxOC4zMzM0IDUuMzk4OTMgMTguMzMzNCAxMC4wMDEzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0I0MjMxOFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzY0MF81NTk0dm1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIFJldm9rZVxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIC0tPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFpvbmUgVmVyaWZpY2F0aW9uIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjdXJzb3I6IHVuc2V0O1wiIGNsYXNzPVwiY29sIGZpbHRlci10YWJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQganVzdGlmeS1jb250ZW50LWJldHdlZW4gZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgzPlpvbmUgVmVyaWZpY2F0aW9uPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5kaWNhdG9yIG10LTJcIiBbbmdDbGFzc109XCJ6b25lVGFza1N0eWxlLmNsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTJcIiBbaGlkZGVuXT1cInpvbmVUYXNrU3R5bGUubmFtZSAhPT0gJ1JlZG8nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNDk4NF8yNzU2OSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMC41IDIuMDAwNzdWNS4wMDA3N00wLjUgNS4wMDA3N0gzLjVNMC41IDUuMDAwNzdMMi44MiAyLjgyMDc3QzMuMzU3MzcgMi4yODMxMyA0LjAyMjE5IDEuODkwMzcgNC43NTI0IDEuNjc5MTZDNS40ODI2MiAxLjQ2Nzk0IDYuMjU0NDUgMS40NDUxNSA2Ljk5NTg2IDEuNjEyOUM3LjczNzI3IDEuNzgwNjUgOC40MjQxIDIuMTMzNDkgOC45OTIyNyAyLjYzODQ4QzkuNTYwNDMgMy4xNDM0NyA5Ljk5MTQyIDMuNzg0MTYgMTAuMjQ1IDQuNTAwNzdNMTEuNSAxMC4wMDA4VjcuMDAwNzdNMTEuNSA3LjAwMDc3SDguNU0xMS41IDcuMDAwNzdMOS4xOCA5LjE4MDc3QzguNjQyNjMgOS43MTg0MSA3Ljk3NzgxIDEwLjExMTIgNy4yNDc2IDEwLjMyMjRDNi41MTczOCAxMC41MzM2IDUuNzQ1NTUgMTAuNTU2NCA1LjAwNDE0IDEwLjM4ODZDNC4yNjI3MyAxMC4yMjA5IDMuNTc1OSA5Ljg2ODA1IDMuMDA3NzMgOS4zNjMwNkMyLjQzOTU3IDguODU4MDcgMi4wMDg1OCA4LjIxNzM4IDEuNzU1IDcuNTAwNzdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjN0E1QUY4XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF80OTg0XzI3NTY5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyB6b25lVGFza1N0eWxlLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdEZpeHR1cmUgJiYgIXpvbmVGZWVkYmFjaz8uem9uZVZlcmlmaWNhdGlvblRhc2tcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtcHVibGlzaC1idG5cIiAoY2xpY2spPVwicHVibGlzaFpvbmVWZXJpZmljYXRpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFB1Ymxpc2ggVGFza1xyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0Rml4dHVyZSAmJiB6b25lUmVkb1N0YXR1c1wiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1wdWJsaXNoLWJ0blwiIChjbGljayk9XCJwdWJsaXNoWm9uZVJlZG8oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFB1Ymxpc2ggUmVkb1xyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0Rml4dHVyZSAmJiB6b25lVGFza1N0eWxlLmNsYXNzID09PSAndGFza0Fzc2lnbmVkJ1wiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1yZXZva2UtYnRuXCIgKGNsaWNrKT1cInJldm9rZVpvbmVUYXNrKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNjQwXzU1OTR6KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi42NjY2OSAxMC4wMDEzSDEzLjMzMzRNMTguMzMzNCAxMC4wMDEzQzE4LjMzMzQgMTQuNjAzNyAxNC42MDI0IDE4LjMzNDYgMTAgMTguMzM0NkM1LjM5NzY1IDE4LjMzNDYgMS42NjY2OSAxNC42MDM3IDEuNjY2NjkgMTAuMDAxM0MxLjY2NjY5IDUuMzk4OTMgNS4zOTc2NSAxLjY2Nzk3IDEwIDEuNjY3OTdDMTQuNjAyNCAxLjY2Nzk3IDE4LjMzMzQgNS4zOTg5MyAxOC4zMzM0IDEwLjAwMTNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjQjQyMzE4XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNjQwXzU1OTR6XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICBSZXZva2VcclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEJvZHkgLS0+XHJcbiAgICA8ZGl2IGlkPVwiYm9keVwiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgIDwhLS0gTGVmdCBDb2x1bW4gLS0+XHJcbiAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyAnY29sbGFwc2VkLWNvbCc6IGlzTGVmdFBhbmVsQ29sbGFwc2VkLCAnY29sLTMnOiAhaXNMZWZ0UGFuZWxDb2xsYXBzZWQsJ2Qtbm9uZSc6IGVkaXRGaXh0dXJlICB9XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInMtY2FyZFwiPlxyXG4gICAgICAgICAgPGZvcm0gW25nQ2xhc3NdPVwieyAnZC1ub25lJzogaXNMZWZ0UGFuZWxDb2xsYXBzZWQgfVwiIFtmb3JtR3JvdXBdPVwibGF5b3V0Rm9ybVwiPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbiAjYm9keUFjY29yZGlvbj1cIm5nYkFjY29yZGlvblwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gV2FsbHMgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Rm9ybVdhbGxzLmNvbnRyb2xzLmxlbmd0aDsgZWxzZSBhZGRXYWxsQWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGZvcm1BcnJheU5hbWU9XCJ3YWxsc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cCBvZiBnZXRGb3JtV2FsbHMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtmb3JtR3JvdXBOYW1lXT1cImlcIiBbbmdiQWNjb3JkaW9uSXRlbV09XCInYWNjb3JkaW9uLXdhbGwtJyArIGlcIiBjbGFzcz1cIm1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWFpbmhlYWRpbmcgcC0wXCIgbmdiQWNjb3JkaW9uQnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTIgd2FsbC1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBncm91cC5nZXQoXCJlbGVtZW50VHlwZVwiKT8udmFsdWUgfCB0aXRsZWNhc2UgfX0ge3sgZ3JvdXAuZ2V0KFwiZWxlbWVudE51bWJlclwiKT8udmFsdWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYobGF5b3V0Rm9ybS5lbmFibGVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0xXCIgbmdiVG9vbHRpcD1cIlJvdGF0ZSB0aGlzIHdhbGwuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicm90YXRlV2FsbChnZXRFbGVtZW50TnVtYmVyKGdyb3VwKSEpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMy43MzczNSA4LjI1MDExQzQuMTIxOTMgOC4yNDM2MiA0LjQ0Mzc3IDguNTI3NzYgNC40OTMzOCA4Ljg5OTk4TDQuNDk5OSA4Ljk4NzM1TDQuNTAyNjIgOS4xNTUxNkM0LjU4NDM0IDExLjU3NDEgNi41NzI0MyAxMy41IDkgMTMuNUM5LjE0MDIyIDEzLjUgOS4yNzk1MSAxMy40OTM2IDkuNDE3NTYgMTMuNDgwOUw5LjIxOTY3IDEzLjI4MDNDOC45MjY3OCAxMi45ODc0IDguOTI2NzggMTIuNTEyNiA5LjIxOTY3IDEyLjIxOTdDOS41MTI1NyAxMS45MjY4IDkuOTg3NDQgMTEuOTI2OCAxMC4yODAzIDEyLjIxOTdMMTEuNzgwMyAxMy43MTk3QzEyLjA3MzIgMTQuMDEyNiAxMi4wNzMyIDE0LjQ4NzQgMTEuNzgwMyAxNC43ODAzTDEwLjI4MDMgMTYuMjgwM0M5Ljk4NzQ0IDE2LjU3MzIgOS41MTI1NyAxNi41NzMyIDkuMjE5NjcgMTYuMjgwM0M4LjkyNjc4IDE1Ljk4NzQgOC45MjY3OCAxNS41MTI2IDkuMjE5NjcgMTUuMjE5N0w5LjQ1ODM3IDE0Ljk4MjdDOS4zMDY0NiAxNC45OTQyIDkuMTUzNTkgMTUgOSAxNUM1LjgyNjUzIDE1IDMuMjE2NjUgMTIuNTMyMSAzLjAxMjUgOS4zODI4OUwzLjAwMzE1IDkuMTkzMTRMMy4wMDAxMSA5LjAxMjY1QzIuOTkzMTIgOC41OTg0OSAzLjMyMzIgOC4yNTcwOSAzLjczNzM1IDguMjUwMTFaTTguNzgwMzMgMS43MTk2N0M5LjA1MDcgMS45OTAwMyA5LjA3MTQ5IDIuNDE1NDYgOC44NDI3MiAyLjcwOTY3TDguNzgwMzMgMi43ODAzM0w4LjU0MTg3IDMuMDE3MjZDOC42OTM3MSAzLjAwNTc4IDguODQ2NSAzIDkgM0MxMi4zMTM3IDMgMTUgNS42ODYyOSAxNSA5QzE1IDkuNDE0MjEgMTQuNjY0MiA5Ljc1IDE0LjI1IDkuNzVDMTMuODM1OCA5Ljc1IDEzLjUgOS40MTQyMSAxMy41IDlDMTMuNSA2LjUxNDcyIDExLjQ4NTMgNC41IDkgNC41QzguODU5NyA0LjUgOC43MjAzNCA0LjUwNjQgOC41ODIyMSA0LjUxOTA5TDguNzgwMzMgNC43MTk2N0M5LjA3MzIzIDUuMDEyNTYgOS4wNzMyMyA1LjQ4NzQ0IDguNzgwMzMgNS43ODAzM0M4LjUwOTk3IDYuMDUwNjkgOC4wODQ1NSA2LjA3MTQ5IDcuNzkwMzMgNS44NDI3Mkw3LjcxOTY3IDUuNzgwMzNMNi4yMTk2NyA0LjI4MDMzQzUuOTQ5MzEgNC4wMDk5NyA1LjkyODUxIDMuNTg0NTQgNi4xNTcyOCAzLjI5MDMzTDYuMjE5NjcgMy4yMTk2N0w3LjcxOTY3IDEuNzE5NjdDOC4wMTI1NyAxLjQyNjc4IDguNDg3NDQgMS40MjY3OCA4Ljc4MDMzIDEuNzE5NjdaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiBzdHJva2U9XCIjNDc1NDY3XCIgc3Ryb2tlLXdpZHRoPVwiMC4wMDA2NFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0xXCIgbmdiVG9vbHRpcD1cIkluc2VydCBuZXcgd2FsbCBiZWxvdy5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROZXdXYWxsKGdldEVsZW1lbnROdW1iZXIoZ3JvdXApISk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMTggMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNjJfOClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkgOS43NUMxMS4wNzA3IDkuNzUgMTIuNzUgMTEuNDI5MyAxMi43NSAxMy41QzEyLjc1IDE1LjU3MDggMTEuMDcwNyAxNy4yNSA5IDE3LjI1QzYuOTI5MjUgMTcuMjUgNS4yNSAxNS41NzA4IDUuMjUgMTMuNUM1LjI1IDExLjQyOTMgNi45MjkyNSA5Ljc1IDkgOS43NVpNOS43NSAxMS4yNUg4LjI1VjEyLjc0OTNMNi43NSAxMi43NVYxNC4yNUw4LjI1IDE0LjI0OTNWMTUuNzVIOS43NVYxNC4yNDkzTDExLjI1IDE0LjI1VjEyLjc1TDkuNzUgMTIuNzQ5M1YxMS4yNVpNMTUgMi4yNUMxNS40MTQgMi4yNSAxNS43NSAyLjU4NiAxNS43NSAzVjcuNUMxNS43NSA3LjkxNCAxNS40MTQgOC4yNSAxNSA4LjI1SDNDMi41ODYgOC4yNSAyLjI1IDcuOTE0IDIuMjUgNy41VjNDMi4yNSAyLjU4NiAyLjU4NiAyLjI1IDMgMi4yNUgxNVpNMy43NSAzLjc1VjYuNzVIMTQuMjVWMy43NUgzLjc1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzYyXzhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMVwiIG5nYlRvb2x0aXA9XCJSZW1vdmUgdGhpcyB3YWxsIGFuZCBpdHMgZml4dHVyZXMuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlV2FsbChnZXRFbGVtZW50TnVtYmVyKGdyb3VwKSEpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzYzXzI1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNzA5NCAxLjVDMTEuMzU1MSAxLjUgMTEuOTI4MyAxLjkxMzE0IDEyLjEzMjQgMi41MjU2NUwxMi41NDA2IDMuNzVIMTVDMTUuNDE0MiAzLjc1IDE1Ljc1IDQuMDg1NzkgMTUuNzUgNC41QzE1Ljc1IDQuOTE0MiAxNS40MTQyIDUuMjQ5OTkgMTUgNS4yNUwxNC45OTgxIDUuMzAzNDRMMTQuMzQ3NiAxNC40MTAzQzE0LjI2MzUgMTUuNTg3OCAxMy4yODM4IDE2LjUgMTIuMTAzNCAxNi41SDUuODk2NjhDNC43MTYyNCAxNi41IDMuNzM2NSAxNS41ODc4IDMuNjUyNCAxNC40MTAzTDMuMDAxOTEgNS4zMDM0NEMzLjAwMDYyIDUuMjg1NTEgMi45OTk5OCA1LjI2NzY5IDIuOTk5OTcgNS4yNUMyLjU4NTc3IDUuMjQ5OTkgMi4yNSA0LjkxNDIgMi4yNSA0LjVDMi4yNSA0LjA4NTc5IDIuNTg1NzkgMy43NSAzIDMuNzVINS40NTk0M0w1Ljg2NzU0IDIuNTI1NjVDNi4wNzE3MiAxLjkxMzE0IDYuNjQ0OTMgMS41IDcuMjkwNTcgMS41SDEwLjcwOTRaTTEzLjQ5ODEgNS4yNUg0LjUwMTkxTDUuMTQ4NTggMTQuMzAzNEM1LjE3NjYyIDE0LjY5NiA1LjUwMzIgMTUgNS44OTY2OCAxNUgxMi4xMDM0QzEyLjQ5NjggMTUgMTIuODIzNCAxNC42OTYgMTIuODUxNCAxNC4zMDM0TDEzLjQ5ODEgNS4yNVpNNy41IDcuNUM3Ljg4NDY0IDcuNSA4LjIwMTYzIDcuNzg5NTIgOC4yNDQ5NSA4LjE2MjUzTDguMjUgOC4yNVYxMkM4LjI1IDEyLjQxNDIgNy45MTQyMiAxMi43NSA3LjUgMTIuNzVDNy4xMTUzNyAxMi43NSA2Ljc5ODM3IDEyLjQ2MDUgNi43NTUwNSAxMi4wODc1TDYuNzUgMTJWOC4yNUM2Ljc1IDcuODM1NzggNy4wODU3OCA3LjUgNy41IDcuNVpNMTAuNSA3LjVDMTAuOTE0MiA3LjUgMTEuMjUgNy44MzU3OCAxMS4yNSA4LjI1VjEyQzExLjI1IDEyLjQxNDIgMTAuOTE0MiAxMi43NSAxMC41IDEyLjc1QzEwLjA4NTggMTIuNzUgOS43NSAxMi40MTQyIDkuNzUgMTJWOC4yNUM5Ljc1IDcuODM1NzggMTAuMDg1OCA3LjUgMTAuNSA3LjVaTTEwLjcwOTQgM0g3LjI5MDU3TDcuMDQwNTcgMy43NUgxMC45NTk1TDEwLjcwOTQgM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjMyQjJCXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF82M18yNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keSBjbGFzcz1cInBzLTAgcGUtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtaW4taGVpZ2h0OiA1MHB4XCIgZG5kRHJvcHpvbmUgKGRuZERyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaXh0dXJlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEZvcm1GaXh0dXJlcyhpKS5jb250cm9scy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJmaXh0dXJlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZml4dHVyZSBvZiBnZXRGb3JtRml4dHVyZXMoaSkuY29udHJvbHM7IGxldCBqID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkbmREcm9wem9uZSAoZG5kRHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpLCBqKVwiIFtmb3JtR3JvdXBOYW1lXT1cImpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkbmREcmFnZ2FibGVdPVwieyB3YWxsSW5kZXg6IGksIGZpeHR1cmVJbmRleDogaiB9XCIgW2RuZEVmZmVjdEFsbG93ZWRdPVwiJ2FsbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm93IGctMCBtYi01IGZpeHR1cmUtcm93XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGlnaGxpZ2h0ZWQtZml4dHVyZV09XCJsYXlvdXRGb3JtLmVuYWJsZWQgJiYgaGlnaGxpZ2h0ZWRGaXh0dXJlRm9ybUlkICYmIGZpeHR1cmUuZ2V0KCdfaWQnKT8udmFsdWUgPT09IGhpZ2hsaWdodGVkRml4dHVyZUZvcm1JZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RuZERpc2FibGVEcmFnSWZdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgaC0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBkbmREcmFnSW1hZ2VSZWZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwieyBjdXJzb3I6IGxheW91dEZvcm0uZGlzYWJsZWQgPyAnZGVmYXVsdCcgOiAnbW92ZScsIG9wYWNpdHk6ICcwLjUnIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjVweFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJtIDQuNDk2MDk0IDAgYyAtMC44MzIwMzIgMCAtMS41IDAuNjcxODc1IC0xLjUgMS41IHMgMC42Njc5NjggMS41IDEuNSAxLjUgYyAwLjgyODEyNSAwIDEuNSAtMC42NzE4NzUgMS41IC0xLjUgcyAtMC42NzE4NzUgLTEuNSAtMS41IC0xLjUgeiBtIDYgMCBjIC0wLjgzMjAzMiAwIC0xLjUgMC42NzE4NzUgLTEuNSAxLjUgcyAwLjY2Nzk2OCAxLjUgMS41IDEuNSBjIDAuODI4MTI1IDAgMS41IC0wLjY3MTg3NSAxLjUgLTEuNSBzIC0wLjY3MTg3NSAtMS41IC0xLjUgLTEuNSB6IG0gLTYgNiBjIC0wLjgzMjAzMiAwIC0xLjUgMC42NzE4NzUgLTEuNSAxLjUgcyAwLjY2Nzk2OCAxLjUgMS41IDEuNSBjIDAuODI4MTI1IDAgMS41IC0wLjY3MTg3NSAxLjUgLTEuNSBzIC0wLjY3MTg3NSAtMS41IC0xLjUgLTEuNSB6IG0gNiAwIGMgLTAuODMyMDMyIDAgLTEuNSAwLjY3MTg3NSAtMS41IDEuNSBzIDAuNjY3OTY4IDEuNSAxLjUgMS41IGMgMC44MjgxMjUgMCAxLjUgLTAuNjcxODc1IDEuNSAtMS41IHMgLTAuNjcxODc1IC0xLjUgLTEuNSAtMS41IHogbSAtNiA2IGMgLTAuODMyMDMyIDAgLTEuNSAwLjY3MTg3NSAtMS41IDEuNSBzIDAuNjY3OTY4IDEuNSAxLjUgMS41IGMgMC44MjgxMjUgMCAxLjUgLTAuNjcxODc1IDEuNSAtMS41IHMgLTAuNjcxODc1IC0xLjUgLTEuNSAtMS41IHogbSA2IDAgYyAtMC44MzIwMzIgMCAtMS41IDAuNjcxODc1IC0xLjUgMS41IHMgMC42Njc5NjggMS41IDEuNSAxLjUgYyAwLjgyODEyNSAwIDEuNSAtMC42NzE4NzUgMS41IC0xLjUgcyAtMC42NzE4NzUgLTEuNSAtMS41IC0xLjUgeiBtIDAgMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiZ3JleVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImZpeHR1cmVDb25maWdJZFwiIFtpZEZpZWxkXT1cIidfaWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVGaWVsZF09XCInbmFtZSdcIiBbZGF0YV09XCJmaXh0dXJlVGVtcGxhdGVzXCIgW2xhYmVsXT1cIidGaXh0dXJlICcgKyAoaiArIDEpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1YlRleHRGaWVsZF09XCInc3VidGV4dCdcIiBbc2VhcmNoXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWVuZCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGgtMTAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cImxheW91dEZvcm0uZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAoY2xpY2spPVwiZGVsZXRlRml4dHVyZSgnd2FsbCcsIGosIGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgbWFyZ2luLWJvdHRvbTogMThweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDFMMSA5TTEgMUw5IDlcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGluay1idG5cIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTmV3Rml4dHVyZSgnd2FsbCcsIGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgZml4dHVyZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHIgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggZGFzaGVkICMwMDAwMDA7XCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT3RoZXIgRWxlbWVudHMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRXYWxsT3RoZXJFbGVtZW50cyhpKS5jb250cm9scy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJvdGhlckVsZW1lbnRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaXh0dXJlIG9mIGdldFdhbGxPdGhlckVsZW1lbnRzKGkpLmNvbnRyb2xzOyBsZXQgaiA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2Zvcm1Hcm91cE5hbWVdPVwialwiIGNsYXNzPVwicm93IGctMCBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+RWxlbWVudCB7eyBqICsgMSB9fTwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEcm9wZG93biBib3VuZCB0byAndHlwZScgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwib3RoZXJFbGVtZW50TGlzdFwiIFtpZF09XCInZWxlbWVudExhYmVsJyArIGpcIiBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTaG93IGN1c3RvbSB0ZXh0IGlucHV0IG9ubHkgd2hlbiAnT3RoZXJzJyBpcyBzZWxlY3RlZCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIihmaXh0dXJlLmdldCgndHlwZScpPy52YWx1ZSkgPT09ICdPdGhlcnMnXCIgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBtdC0yXCIgZm9ybUNvbnRyb2xOYW1lPVwiY3VzdG9tTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgY3VzdG9tIGVsZW1lbnQgbmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1lbmQganVzdGlmeS1jb250ZW50LWNlbnRlciBoLTEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJsYXlvdXRGb3JtLmRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKGNsaWNrKT1cInJlbW92ZU90aGVyRWxlbWVudCgnd2FsbCcsIGosIGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgbWFyZ2luLWJvdHRvbTogMThweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDFMMSA5TTEgMUw5IDlcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGluay1idG5cIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTmV3T3RoZXJFbGVtZW50cygnd2FsbCcsIGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2FkZFdhbGxBY3Rpb24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJhZGROZXdXYWxsKDApXCIgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cImxheW91dEZvcm0uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IHctMTAwIHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICBJbnNlcnQgbmV3IHdhbGxcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDxociBzdHlsZT1cImJvcmRlci10b3A6IDFweCBkYXNoZWQgIzAwMDAwMDtcIiAvPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEZsb29yIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBbbmdiQWNjb3JkaW9uSXRlbV09XCInYWNjb3JkaW9uLWZsb29yJ1wiIGNsYXNzPVwibWItNVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiIG5nYkFjY29yZGlvbkhlYWRlcj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYWluaGVhZGluZyBwLTBcIiBuZ2JBY2NvcmRpb25CdXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0yIHdhbGwtbGFiZWxcIj5GbG9vcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keSBjbGFzcz1cInBzLTAgcGUtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtaW4taGVpZ2h0OiA1MHB4XCIgZG5kRHJvcHpvbmUgKGRuZERyb3ApPVwib25Ecm9wKCRldmVudCwgJ2Zsb29yJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGbG9vciBGaXh0dXJlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEZvcm1GbG9vckZpeHR1cmVzLmNvbnRyb2xzLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cImZsb29yRml4dHVyZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpeHR1cmUgb2YgZ2V0Rm9ybUZsb29yRml4dHVyZXMuY29udHJvbHM7IGxldCBqID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkbmREcm9wem9uZSAoZG5kRHJvcCk9XCJvbkRyb3AoJGV2ZW50LCAnZmxvb3InLCBqKVwiIFtmb3JtR3JvdXBOYW1lXT1cImpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkbmREcmFnZ2FibGVdPVwieyB3YWxsSW5kZXg6ICdmbG9vcicsIGZpeHR1cmVJbmRleDogaiB9XCIgW2RuZEVmZmVjdEFsbG93ZWRdPVwiJ2FsbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkbmREaXNhYmxlRHJhZ0lmXT1cImxheW91dEZvcm0uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm93IGctMCBtYi01IGZpeHR1cmUtcm93XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGlnaGxpZ2h0ZWQtZml4dHVyZV09XCJsYXlvdXRGb3JtLmVuYWJsZWQgJiYgaGlnaGxpZ2h0ZWRGaXh0dXJlRm9ybUlkICYmIGZpeHR1cmUuZ2V0KCdfaWQnKT8udmFsdWUgPT09IGhpZ2hsaWdodGVkRml4dHVyZUZvcm1JZFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgaC0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBkbmREcmFnSW1hZ2VSZWYgc3R5bGU9XCJjdXJzb3I6IG1vdmU7IG9wYWNpdHk6IDAuNVwiIHdpZHRoPVwiMjVweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIm0gNC40OTYwOTQgMCBjIC0wLjgzMjAzMiAwIC0xLjUgMC42NzE4NzUgLTEuNSAxLjUgcyAwLjY2Nzk2OCAxLjUgMS41IDEuNSBjIDAuODI4MTI1IDAgMS41IC0wLjY3MTg3NSAxLjUgLTEuNSBzIC0wLjY3MTg3NSAtMS41IC0xLjUgLTEuNSB6IG0gNiAwIGMgLTAuODMyMDMyIDAgLTEuNSAwLjY3MTg3NSAtMS41IDEuNSBzIDAuNjY3OTY4IDEuNSAxLjUgMS41IGMgMC44MjgxMjUgMCAxLjUgLTAuNjcxODc1IDEuNSAtMS41IHMgLTAuNjcxODc1IC0xLjUgLTEuNSAtMS41IHogbSAtNiA2IGMgLTAuODMyMDMyIDAgLTEuNSAwLjY3MTg3NSAtMS41IDEuNSBzIDAuNjY3OTY4IDEuNSAxLjUgMS41IGMgMC44MjgxMjUgMCAxLjUgLTAuNjcxODc1IDEuNSAtMS41IHMgLTAuNjcxODc1IC0xLjUgLTEuNSAtMS41IHogbSA2IDAgYyAtMC44MzIwMzIgMCAtMS41IDAuNjcxODc1IC0xLjUgMS41IHMgMC42Njc5NjggMS41IDEuNSAxLjUgYyAwLjgyODEyNSAwIDEuNSAtMC42NzE4NzUgMS41IC0xLjUgcyAtMC42NzE4NzUgLTEuNSAtMS41IC0xLjUgeiBtIC02IDYgYyAtMC44MzIwMzIgMCAtMS41IDAuNjcxODc1IC0xLjUgMS41IHMgMC42Njc5NjggMS41IDEuNSAxLjUgYyAwLjgyODEyNSAwIDEuNSAtMC42NzE4NzUgMS41IC0xLjUgcyAtMC42NzE4NzUgLTEuNSAtMS41IC0xLjUgeiBtIDYgMCBjIC0wLjgzMjAzMiAwIC0xLjUgMC42NzE4NzUgLTEuNSAxLjUgcyAwLjY2Nzk2OCAxLjUgMS41IDEuNSBjIDAuODI4MTI1IDAgMS41IC0wLjY3MTg3NSAxLjUgLTEuNSBzIC0wLjY3MTg3NSAtMS41IC0xLjUgLTEuNSB6IG0gMCAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJncmV5XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZml4dHVyZUNvbmZpZ0lkXCIgW2lkRmllbGRdPVwiJ19pZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZUZpZWxkXT1cIiduYW1lJ1wiIFtkYXRhXT1cImZpeHR1cmVUZW1wbGF0ZXNcIiBbbGFiZWxdPVwiJ0ZpeHR1cmUgJyArIChqICsgMSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIiBbc3ViVGV4dEZpZWxkXT1cIidzdWJ0ZXh0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtZW5kIGp1c3RpZnktY29udGVudC1jZW50ZXIgaC0xMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIChjbGljayk9XCJkZWxldGVGaXh0dXJlKCdmbG9vcicsIGopXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgbWFyZ2luLWJvdHRvbTogMThweFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAxTDEgOU0xIDFMOSA5XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImxpbmstYnRuXCIgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cImxheW91dEZvcm0uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE5ld0ZpeHR1cmUoJ2Zsb29yJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBmaXh0dXJlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxociBzdHlsZT1cImJvcmRlci10b3A6IDFweCBkYXNoZWQgIzAwMDAwMDtcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGbG9vciBPdGhlciBFbGVtZW50cyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEZvcm1GbG9vck90aGVyRWxlbWVudHMuY29udHJvbHMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwiZmxvb3JPdGhlckVsZW1lbnRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaXh0dXJlIG9mIGdldEZvcm1GbG9vck90aGVyRWxlbWVudHMuY29udHJvbHM7IGxldCBqID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbZm9ybUdyb3VwTmFtZV09XCJqXCIgY2xhc3M9XCJyb3cgZy0wIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTExXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5FbGVtZW50IHt7IGogKyAxIH19PC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIGZvciB0eXBlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cIm90aGVyRWxlbWVudExpc3RcIiBbaWRdPVwiJ2Zsb29yRWxlbWVudExhYmVsJyArIGpcIiBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDb25kaXRpb25hbCBpbnB1dCBmb3IgY3VzdG9tIG5hbWUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCIoZml4dHVyZS5nZXQoJ3R5cGUnKT8udmFsdWUpID09PSAnT3RoZXJzJ1wiIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbXQtMlwiIGZvcm1Db250cm9sTmFtZT1cImN1c3RvbU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGN1c3RvbSBlbGVtZW50IG5hbWVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtZW5kIGp1c3RpZnktY29udGVudC1jZW50ZXIgaC0xMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIChjbGljayk9XCJyZW1vdmVPdGhlckVsZW1lbnQoJ2Zsb29yJywgailcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBtYXJnaW4tYm90dG9tOiAxOHB4XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDFMMSA5TTEgMUw5IDlcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGluay1idG5cIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwibGF5b3V0Rm9ybS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTmV3T3RoZXJFbGVtZW50cygnZmxvb3InKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBDZW50ZXIgQ29sdW1uIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sIG92ZXJmbG93LWhpZGRlbiBwb3NpdGlvbi1yZWxhdGl2ZVwiIFtuZ0NsYXNzXT1cInsgJ2Qtbm9uZSc6IGVkaXRGaXh0dXJlIH1cIj5cclxuICAgICAgICA8ZGl2IGlkPVwiY2FudmFzLWNhcmRcIiBjbGFzcz1cImMtY2FyZCBwb3NpdGlvbi1yZWxhdGl2ZVwiICNjYW52YXNDb250YWluZXI+XHJcbiAgICAgICAgICA8IS0tIENhbnZhcyBWaWV3IC0tPlxyXG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7ICdkLW5vbmUnOiBzZWxlY3RlZFZpZXcgPT09ICd0cmVlJyB9XCI+XHJcbiAgICAgICAgICAgIDxjYW52YXMgaWQ9XCJiYXNlLWNhbnZhc1wiICNiYXNlQ2FudmFzPjwvY2FudmFzPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBUcmVlIFZpZXcgLS0+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRWaWV3ID09PSAndHJlZSdcIiBjbGFzcz1cInctMTAwXCI+XHJcbiAgICAgICAgICAgIDxzdG9yZS1wbGFuby10cmVlLXZpZXcgW2FsbEZpeHR1cmVdPVwiYWxsRml4dHVyZXNcIj48L3N0b3JlLXBsYW5vLXRyZWUtdmlldz5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gVG9wIENvbnRyb2xzIC0tPlxyXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInRvcDogMjRweDsgbGVmdDogMjZweDsgcG9zaXRpb246IGFic29sdXRlO1wiIGlkPVwic2VnbWVudC1idG5cIiBjbGFzcz1cInBiLTVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgZ2FwLTRcIj5cclxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgY3VzdG9tLXRhYnMgZC1mbGV4XCIgc3R5bGU9XCJ3aWR0aDogMjAwcHg7IG1hcmdpbjogMFwiPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gZmxleC1maWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtbGluayB3LTEwMCBoLTEwMFwiIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRWaWV3ID09PSAnZGV0YWlsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkVmlldyA9ICdkZXRhaWwnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgRGV0YWlsIFZpZXdcclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gZmxleC1maWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtbGluayB3LTEwMCBoLTEwMFwiIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRWaWV3ID09PSAndHJlZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RlZFZpZXcgPSAndHJlZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICBUcmVlIFZpZXdcclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBQSUQgQWxsb2NhdGlvbiAtLT5cclxuICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cImxheW91dEZvcm0uZGlzYWJsZWRcIiBzdHlsZT1cInRvcDogMjRweDsgbGVmdDogMjM0cHhcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHN0eWxlPVwicGFkZGluZzogOXB4IDE5cHggIWltcG9ydGFudDtcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zIGJnLXdoaXRlIHNoYWRvdy1zbVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdldEVudHJhbmNlcz8ubGVuZ3RoID49IDJcIiAoY2xpY2spPVwib25DbGlja0FwcGx5TG9naWNzKClcIj5cclxuICAgICAgICAgICAgICBBcHBseSBMb2dpY3NcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgICAgICAgPCEtLSBFbnRyYW5jZSBCdXR0b24gLS0+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwibGF5b3V0Rm9ybS5lbmFibGVkXCIgbmdiVG9vbHRpcD1cIllvdSBjYW4gYWRkIHVwIHRvIHR3byBlbnRyYW5jZXMuXCIgc3R5bGU9XCJ0b3A6IDI0cHg7IGxlZnQ6IDIzNHB4XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZVwiIFtkaXNhYmxlVG9vbHRpcF09XCJnZXRFbnRyYW5jZXM/Lmxlbmd0aCA8IDJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJwYWRkaW5nOiA5cHggMTlweCAhaW1wb3J0YW50O1wiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMyBiZy13aGl0ZSBzaGFkb3ctc21cIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnZXRFbnRyYW5jZXM/Lmxlbmd0aCA+PSAyXCIgKGNsaWNrKT1cImFkZE5ld0VudHJhbmNlKClcIj5cclxuICAgICAgICAgICAgICBBZGQgRW50cmFuY2VcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwibGF5b3V0Rm9ybS5lbmFibGVkXCIgc3R5bGU9XCJ0b3A6IDI0cHg7IHJpZ2h0OiAxOTJweFwiIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGVcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMyBiZy13aGl0ZSBzaGFkb3ctc21cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWxFZGl0KClcIj5cclxuICAgICAgICAgICAgICBDYW5jZWxcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgPCEtLSBFZGl0IEJ1dHRvbiAtLT5cclxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJsYXlvdXRGb3JtLmRpc2FibGVkICYmIHNlbGVjdGVkVmlldyA9PT0gJ2RldGFpbCdcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZUVkaXQgfHwgWyd0YXNrQXNzaWduZWQnXS5pbmNsdWRlcyh0YXNrU3R5bGUuZml4dHVyZS5jbGFzcykgfHwgKHRhc2tTdHlsZS5maXh0dXJlLmNsYXNzID09ICdyZXZpZXdQZW5kaW5nJyAmJiAhc2hvd0xheW91dClcIlxyXG4gICAgICAgICAgICBzdHlsZT1cInRvcDogMjRweDsgcmlnaHQ6IDE2NHB4XCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTMgcG9zaXRpb24tYWJzb2x1dGUgYmctd2hpdGUgc2hhZG93LXNtXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tFZGl0KClcIj5cclxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xMzIyXzUzMjUpXCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICBkPVwiTTE0LjE2NjcgMi40OTk5M0MxNC4zODU2IDIuMjgxMDYgMTQuNjQ1NSAyLjEwNzQ0IDE0LjkzMTQgMS45ODg5OUMxNS4yMTc0IDEuODcwNTQgMTUuNTIzOSAxLjgwOTU3IDE1LjgzMzQgMS44MDk1N0MxNi4xNDI5IDEuODA5NTcgMTYuNDQ5NCAxLjg3MDU0IDE2LjczNTQgMS45ODg5OUMxNy4wMjE0IDIuMTA3NDQgMTcuMjgxMiAyLjI4MTA2IDE3LjUwMDEgMi40OTk5M0MxNy43MTkgMi43MTg4IDE3Ljg5MjYgMi45Nzg2MyAxOC4wMTEgMy4yNjQ2QzE4LjEyOTUgMy41NTA1NyAxOC4xOTA0IDMuODU3MDYgMTguMTkwNCA0LjE2NjU5QzE4LjE5MDQgNC40NzYxMiAxOC4xMjk1IDQuNzgyNjIgMTguMDExIDUuMDY4NTlDMTcuODkyNiA1LjM1NDU1IDE3LjcxOSA1LjYxNDM5IDE3LjUwMDEgNS44MzMyNkw2LjI1MDA4IDE3LjA4MzNMMS42NjY3NSAxOC4zMzMzTDIuOTE2NzUgMTMuNzQ5OUwxNC4xNjY3IDIuNDk5OTNaXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzEzMjJfNTMyNVwiPlxyXG4gICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICBFZGl0XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8IS0tIFJvdGF0ZSBCdXR0b24gLS0+XHJcbiAgICAgICAgICA8YnV0dG9uIHN0eWxlPVwidG9wOiAyNHB4OyByaWdodDogOTRweFwiIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImxheW91dEZvcm0uZGlzYWJsZWQgJiYgc2VsZWN0ZWRWaWV3ID09PSAnZGV0YWlsJ1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTMgcG9zaXRpb24tYWJzb2x1dGUgYmctd2hpdGUgc2hhZG93LXNtXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInJvdGF0ZUNhbnZhcyhjYW52YXMsOTApXCI+XHJcbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiIHZpZXdCb3g9XCIwIDAgMjYgMjZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTYuMzYyNjUgNy4xNzg4N0w3LjE3NjI1IDYuMzYyODdMNS45MDQyNSA1LjA5MjA3TDUuMDg5NDUgNS45MDU2N0w2LjM2MjY1IDcuMTc4ODdaTTE1LjY3MSA2LjM2NDA3TDE5LjYzNzkgMTAuMzMwOUwyMC45MDk5IDkuMDU3NjlMMTYuOTQ0MiA1LjA5MDg3TDE1LjY3MSA2LjM2NDA3Wk0xOS42Mzc5IDE4LjgyNTdMMTguODI0MyAxOS42MzkzTDIwLjA5NjMgMjAuOTEwMUwyMC45MDk5IDIwLjA5NzdMMTkuNjM3OSAxOC44MjU3Wk0xMC4zMjk1IDE5LjYzOTNMNi4zNjI2NSAxNS42NzI1TDUuMDkwNjUgMTYuOTQ1N0w5LjA1NjI2IDIwLjkxMTNMMTAuMzI5NSAxOS42MzkzWk0xOC44MjQzIDE5LjYzOTNDMTcuNjU0MyAyMC44MDgxIDE2Ljg0MDcgMjEuNjE5MyAxNi4xNDU5IDIyLjE0OTdDMTUuNDcxNSAyMi42NjQ1IDE1LjAxNTUgMjIuODI4OSAxNC41NzYzIDIyLjgyODlWMjQuNjI4OUMxNS41Njc1IDI0LjYyODkgMTYuNDAyNyAyNC4yMTczIDE3LjIzNjcgMjMuNTgxM0MxOC4wNTAzIDIyLjk2MDkgMTguOTYzNSAyMi4wNDUzIDIwLjA5NjMgMjAuOTEyNUwxOC44MjQzIDE5LjYzOTNaTTkuMDU2MjYgMjAuOTExM0MxMC4xODkxIDIyLjA0NTMgMTEuMTAyMyAyMi45NTk3IDExLjkxNTkgMjMuNTgxM0MxMi43NDk5IDI0LjIxNzMgMTMuNTg1MSAyNC42Mjg5IDE0LjU3NjMgMjQuNjI4OVYyMi44Mjg5QzE0LjEzNzEgMjIuODI4OSAxMy42ODIzIDIyLjY2NDUgMTMuMDA2NyAyMi4xNDk3QzEyLjMxMTkgMjEuNjE5MyAxMS40OTgzIDIwLjgwODEgMTAuMzI5NSAxOS42MzkzTDkuMDU2MjYgMjAuOTExM1pNMTkuNjM3OSAxMC4zMzA5QzIwLjgwNjcgMTEuNDk5NyAyMS42MTc5IDEyLjMxMzMgMjIuMTQ4MyAxMy4wMDgxQzIyLjY2MzEgMTMuNjgzNyAyMi44Mjc1IDE0LjEzODUgMjIuODI3NSAxNC41Nzc3SDI0LjYyNzVDMjQuNjI3NSAxMy41ODY1IDI0LjIxNTkgMTIuNzUxMyAyMy41Nzk5IDExLjkxNzNDMjIuOTU5NSAxMS4xMDM3IDIyLjA0MjcgMTAuMTkwNSAyMC45MDk5IDkuMDU3NjlMMTkuNjM3OSAxMC4zMzA5Wk0yMC45MDk5IDIwLjA5NzdDMjIuMDQzOSAxOC45NjM3IDIyLjk1ODMgMTguMDUxNyAyMy41Nzk5IDE3LjIzODFDMjQuMjE1OSAxNi40MDQxIDI0LjYyNzUgMTUuNTY4OSAyNC42Mjc1IDE0LjU3NzdIMjIuODI3NUMyMi44Mjc1IDE1LjAxNjkgMjIuNjYzMSAxNS40NzI5IDIyLjE0ODMgMTYuMTQ3M0MyMS42MTc5IDE2Ljg0MjEgMjAuODA2NyAxNy42NTU3IDE5LjYzNzkgMTguODI1N0wyMC45MDk5IDIwLjA5NzdaTTcuMTc2MjUgNi4zNjI4N0M4LjM0NjI1IDUuMTk0MDcgOS4xNTk4NSA0LjM4MTY3IDkuODU0NjUgMy44NTEyN0MxMC41MjkgMy4zMzY0NyAxMC45ODUgMy4xNzMyNyAxMS40MjQyIDMuMTczMjdWMS4zNzIwN0MxMC40MzMgMS4zNzIwNyA5LjU5Nzg1IDEuNzgzNjcgOC43NjM4NSAyLjQxOTY3QzcuOTQ5MDUgMy4wNDEyNyA3LjAzNzA1IDMuOTU1NjcgNS45MDQyNSA1LjA4ODQ3TDcuMTc2MjUgNi4zNjI4N1pNMTYuOTQ0MiA1LjA5MDg3QzE1LjgxMTQgMy45NTY4NyAxNC44OTgyIDMuMDQxMjcgMTQuMDg0NiAyLjQxOTY3QzEzLjI1MDYgMS43ODM2NyAxMi40MTU0IDEuMzcyMDcgMTEuNDI0MiAxLjM3MjA3VjMuMTczMjdDMTEuODYzNCAzLjE3MzI3IDEyLjMxODIgMy4zMzY0NyAxMi45OTM4IDMuODUxMjdDMTMuNjg4NiA0LjM4MTY3IDE0LjUwMjIgNS4xOTI4NyAxNS42NzEgNi4zNjE2N0wxNi45NDQyIDUuMDkwODdaTTUuMDg5NDUgNS45MDMyN0MzLjk1NjY1IDcuMDM2MDcgMy4wNDIyNSA3Ljk0ODA3IDIuNDIwNjUgOC43NjI4N0MxLjc4NDY1IDkuNTk2ODcgMS4zNzMwNSAxMC40MzIxIDEuMzczMDUgMTEuNDIzM0gzLjE3MzA1QzMuMTczMDUgMTAuOTg0MSAzLjMzNzQ1IDEwLjUyODEgMy44NTIyNSA5Ljg1MzY3QzQuMzgyNjUgOS4xNTg4NyA1LjE5Mzg1IDguMzQ1MjcgNi4zNjI2NSA3LjE3NTI3TDUuMDg5NDUgNS45MDMyN1pNNi4zNjI2NSAxNS42NzEzQzUuMTkzODUgMTQuNTAxMyA0LjM4MjY1IDEzLjY4NzcgMy44NTIyNSAxMi45OTI5QzMuMzM3NDUgMTIuMzE4NSAzLjE3MzA1IDExLjg2MjUgMy4xNzMwNSAxMS40MjMzSDEuMzczMDVDMS4zNzMwNSAxMi40MTQ1IDEuNzg0NjUgMTMuMjQ5NyAyLjQyMDY1IDE0LjA4MzdDMy4wNDIyNSAxNC44OTczIDMuOTU2NjUgMTUuODEwNSA1LjA4OTQ1IDE2Ljk0MzNMNi4zNjI2NSAxNS42NzEzWlwiXHJcbiAgICAgICAgICAgICAgICBmaWxsPVwiIzFEMjkzOVwiIC8+XHJcbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMy4yIDYuOTgzMkwyNSA4LjJDMjUgNC41ODIgMjIuNDA1NiAxLjU3OTYgMTkgMU0yLjggMTkuMDE2OEwxIDE3LjhDMSAyMS40MTggMy41OTQ0IDI0LjQyMDQgNyAyNVwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjMUQyOTM5XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPCEtLSBTdWJtaXQgQnV0dG9uIC0tPlxyXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFsYXlvdXRGb3JtLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgc3R5bGU9XCJ0b3A6IDI0cHg7IHJpZ2h0OiA5NHB4O3BhZGRpbmc6IDlweCAyMHB4ICFpbXBvcnRhbnQ7bWluLXdpZHRoOiA5MHB4O2p1c3RpZnktY29udGVudDogY2VudGVyO1wiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIHBvc2l0aW9uLWFic29sdXRlIGJnLXdoaXRlIHNoYWRvdy1zbVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NhdmluZ0xheW91dFwiIChjbGljayk9XCJ1cGRhdGVMYXlvdXQodHJ1ZSlcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1NhdmluZ0xheW91dFwiIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc21cIiByb2xlPVwic3RhdHVzXCJcclxuICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIFNhdmVcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgIDwhLS0gRG93bmxvYWQgQnV0dG9uIC0tPlxyXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNlbGVjdGVkVmlldyA9PT0gJ2RldGFpbCdcIiBzdHlsZT1cInRvcDogMjRweDsgcmlnaHQ6IDI2cHhcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMyBwb3NpdGlvbi1hYnNvbHV0ZSBiZy13aGl0ZSBzaGFkb3ctc21cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRDYW52YXMoKVwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiIHZpZXdCb3g9XCIwIDAgMjYgMjZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIwLjI0MDAwMDAwMDAwMDAwMDA1XCI+XHJcbiAgICAgICAgICAgICAgPGcgaWQ9XCJTVkdSZXBvX2JnQ2FycmllclwiIHN0cm9rZS13aWR0aD1cIjBcIj48L2c+XHJcbiAgICAgICAgICAgICAgPGcgaWQ9XCJTVkdSZXBvX3RyYWNlckNhcnJpZXJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2U9XCIjQ0NDQ0NDXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjAuMzg0XCI+PC9nPlxyXG4gICAgICAgICAgICAgIDxnIGlkPVwiU1ZHUmVwb19pY29uQ2FycmllclwiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0xMi41NTM1IDE2LjUwNjFDMTIuNDExNCAxNi42NjE1IDEyLjIxMDYgMTYuNzUgMTIgMTYuNzVDMTEuNzg5NCAxNi43NSAxMS41ODg2IDE2LjY2MTUgMTEuNDQ2NSAxNi41MDYxTDcuNDQ2NDggMTIuMTMxMUM3LjE2Njk4IDExLjgyNTQgNy4xODgyMiAxMS4zNTEgNy40OTM5MiAxMS4wNzE1QzcuNzk5NjMgMTAuNzkyIDguMjc0MDIgMTAuODEzMiA4LjU1MzUyIDExLjExODlMMTEuMjUgMTQuMDY4MlYzQzExLjI1IDIuNTg1NzkgMTEuNTg1OCAyLjI1IDEyIDIuMjVDMTIuNDE0MiAyLjI1IDEyLjc1IDIuNTg1NzkgMTIuNzUgM1YxNC4wNjgyTDE1LjQ0NjUgMTEuMTE4OUMxNS43MjYgMTAuODEzMiAxNi4yMDA0IDEwLjc5MiAxNi41MDYxIDExLjA3MTVDMTYuODExOCAxMS4zNTEgMTYuODMzIDExLjgyNTQgMTYuNTUzNSAxMi4xMzExTDEyLjU1MzUgMTYuNTA2MVpcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwiIzFEMjkzOVwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMy43NSAxNUMzLjc1IDE0LjU4NTggMy40MTQyMiAxNC4yNSAzIDE0LjI1QzIuNTg1NzkgMTQuMjUgMi4yNSAxNC41ODU4IDIuMjUgMTVWMTUuMDU0OUMyLjI0OTk4IDE2LjQyMjUgMi4yNDk5NiAxNy41MjQ4IDIuMzY2NTIgMTguMzkxOEMyLjQ4NzU0IDE5LjI5MTkgMi43NDY0MyAyMC4wNDk3IDMuMzQ4MzUgMjAuNjUxNkMzLjk1MDI3IDIxLjI1MzYgNC43MDgxNCAyMS41MTI1IDUuNjA4MjUgMjEuNjMzNUM2LjQ3NTIyIDIxLjc1IDcuNTc3NTQgMjEuNzUgOC45NDUxMyAyMS43NUgxNS4wNTQ5QzE2LjQyMjUgMjEuNzUgMTcuNTI0OCAyMS43NSAxOC4zOTE4IDIxLjYzMzVDMTkuMjkxOSAyMS41MTI1IDIwLjA0OTcgMjEuMjUzNiAyMC42NTE3IDIwLjY1MTZDMjEuMjUzNiAyMC4wNDk3IDIxLjUxMjUgMTkuMjkxOSAyMS42MzM1IDE4LjM5MThDMjEuNzUgMTcuNTI0OCAyMS43NSAxNi40MjI1IDIxLjc1IDE1LjA1NDlWMTVDMjEuNzUgMTQuNTg1OCAyMS40MTQyIDE0LjI1IDIxIDE0LjI1QzIwLjU4NTggMTQuMjUgMjAuMjUgMTQuNTg1OCAyMC4yNSAxNUMyMC4yNSAxNi40MzU0IDIwLjI0ODQgMTcuNDM2NSAyMC4xNDY5IDE4LjE5MTlDMjAuMDQ4MiAxOC45MjU3IDE5Ljg2NzggMTkuMzE0MiAxOS41OTEgMTkuNTkxQzE5LjMxNDIgMTkuODY3OCAxOC45MjU3IDIwLjA0ODIgMTguMTkxOSAyMC4xNDY5QzE3LjQzNjUgMjAuMjQ4NCAxNi40MzU0IDIwLjI1IDE1IDIwLjI1SDlDNy41NjQ1OSAyMC4yNSA2LjU2MzQ3IDIwLjI0ODQgNS44MDgxMiAyMC4xNDY5QzUuMDc0MzUgMjAuMDQ4MiA0LjY4NTc3IDE5Ljg2NzggNC40MDkwMSAxOS41OTFDNC4xMzIyNSAxOS4zMTQyIDMuOTUxOCAxOC45MjU3IDMuODUzMTUgMTguMTkxOUMzLjc1MTU5IDE3LjQzNjUgMy43NSAxNi40MzU0IDMuNzUgMTVaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxRDI5MzlcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFBhbmVsIENvbGxhcHNlIEhhbmRsZXJzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xsYXBzZS1oYW5kbGVyIGxlZnRcIiAoY2xpY2spPVwidG9nZ2xlUGFuZWwoJ2xlZnQnKVwiPlxyXG4gICAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc0xlZnRQYW5lbENvbGxhcHNlZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIlxyXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk04LjI3MzA4IDEyLjYzNkw0LjYzNjcyIDguOTk5NjRMOC4yNzMwOCA1LjM2MzI4TTEzLjM2NCAxMi42MzZMOS43Mjc2MyA4Ljk5OTY0TDEzLjM2NCA1LjM2MzI4XCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjMTAxODI4XCIgc3Ryb2tlLXdpZHRoPVwiMS40NTQ1NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc0xlZnRQYW5lbENvbGxhcHNlZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIlxyXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk05LjcyNjkyIDUuMzYzOTlMMTMuMzYzMyA5LjAwMDM2TDkuNzI2OTIgMTIuNjM2N000LjYzNjAxIDUuMzYzOTlMOC4yNzIzNyA5LjAwMDM2TDQuNjM2MDEgMTIuNjM2N1wiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjEuNDU0NTVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xsYXBzZS1oYW5kbGVyIHJpZ2h0XCIgKGNsaWNrKT1cInRvZ2dsZVBhbmVsKCdyaWdodCcpXCI+XHJcbiAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNSaWdodFBhbmVsQ29sbGFwc2VkXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiXHJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTguMjczMDggMTIuNjM2TDQuNjM2NzIgOC45OTk2NEw4LjI3MzA4IDUuMzYzMjhNMTMuMzY0IDEyLjYzNkw5LjcyNzYzIDguOTk5NjRMMTMuMzY0IDUuMzYzMjhcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIxLjQ1NDU1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc1JpZ2h0UGFuZWxDb2xsYXBzZWRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxOCAxOFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNOS43MjY5MiA1LjM2Mzk5TDEzLjM2MzMgOS4wMDAzNkw5LjcyNjkyIDEyLjYzNjdNNC42MzYwMSA1LjM2Mzk5TDguMjcyMzcgOS4wMDAzNkw0LjYzNjAxIDEyLjYzNjdcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIxLjQ1NDU1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gRWRpdCBGaXh0dXJlIEJvZHkgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIiBbbmdDbGFzc109XCJ7ICdkLW5vbmUnOiAhZWRpdEZpeHR1cmUgfVwiPlxyXG4gICAgICAgIDxkaXYgaWQ9XCJlZGl0LWJvZHlcIiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPHVsIGNsYXNzPVwibXgtMyBteS01IG5hdiBuYXYtcGlsbHNcIiByb2xlPVwidGFibGlzdFwiPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBjdXJzb3ItcG9pbnRlclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICA8YSAoY2xpY2spPVwic3VibWl0Rml4dHVyZSA9IGZhbHNlOyBlZGl0Rml4dHVyZVNlY3Rpb24gPSAnYmFzaWMtZGV0YWlscydcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZWRpdEZpeHR1cmVTZWN0aW9uID09PSAnYmFzaWMtZGV0YWlscycgPyAnYWN0aXZlJyA6ICcnXCIgY2xhc3M9XCJuYXYtbGlua1wiIHJvbGU9XCJ0YWJcIj5cclxuICAgICAgICAgICAgICAgIEJhc2ljIGRldGFpbHNcclxuICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtIGN1cnNvci1wb2ludGVyXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgIDxhIChjbGljayk9XCJzdWJtaXRGaXh0dXJlID0gZmFsc2U7IGVkaXRGaXh0dXJlU2VjdGlvbiA9ICdwcm9kdWN0cydcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZWRpdEZpeHR1cmVTZWN0aW9uID09PSAncHJvZHVjdHMnID8gJ2FjdGl2ZScgOiAnJ1wiIGNsYXNzPVwibmF2LWxpbmtcIiByb2xlPVwidGFiXCI+XHJcbiAgICAgICAgICAgICAgICBQcm9kdWN0c1xyXG4gICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gY3Vyc29yLXBvaW50ZXJcIiByb2xlPVwicHJlc2VudGF0aW9uXCIgKm5nSWY9XCJlZGl0RnJvbVRhYiAhPT0gJ3pvbmUnXCI+XHJcbiAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cInN1Ym1pdEZpeHR1cmUgPSBmYWxzZTsgZWRpdEZpeHR1cmVTZWN0aW9uID0gJ3ZtcydcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZWRpdEZpeHR1cmVTZWN0aW9uID09PSAndm1zJyA/ICdhY3RpdmUnIDogJydcIiBjbGFzcz1cIm5hdi1saW5rXCIgcm9sZT1cInRhYlwiPlxyXG4gICAgICAgICAgICAgICAgVmlzdWFsIE1lcmNoYW5kaXNlXHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgPC91bD5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0Rml4dHVyZVNlY3Rpb24gPT09ICdiYXNpYy1kZXRhaWxzJ1wiPlxyXG4gICAgICAgICAgICAgIDxsaWItaW5zdGFuY2UtYmFzaWMtZGV0YWlscyBbZml4dHVyZURhdGFdPVwic2VsZWN0ZWRGaXh0dXJlRGF0YVwiIFtlZGl0TW9kZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIFtpc1N1Ym1pdHRlZF09XCJzdWJtaXRGaXh0dXJlXCIgW3JldmVydE9uRWRpdF09XCJzaG91bGRSZXZlcnRPbkVkaXRcIlxyXG4gICAgICAgICAgICAgICAgW3pvbmVFZGl0TW9kZV09XCJlZGl0RnJvbVRhYiA9PT0gJ3pvbmUnXCIgKHN1Ym1pdEV2ZW50KT1cIm9uRml4dHVyZVN1Ym1pdCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgPC9saWItaW5zdGFuY2UtYmFzaWMtZGV0YWlscz5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdEZpeHR1cmVTZWN0aW9uID09PSAncHJvZHVjdHMnXCI+XHJcbiAgICAgICAgICAgICAgPGxpYi1pbnN0YW5jZS1wcm9kdWN0cyBbZml4dHVyZURhdGFdPVwic2VsZWN0ZWRGaXh0dXJlRGF0YVwiIFtlZGl0TW9kZV09XCJ0cnVlXCIgW2lzU3VibWl0dGVkXT1cInN1Ym1pdEZpeHR1cmVcIlxyXG4gICAgICAgICAgICAgICAgW3JldmVydE9uRWRpdF09XCJzaG91bGRSZXZlcnRPbkVkaXRcIiBbem9uZUVkaXRNb2RlXT1cImVkaXRGcm9tVGFiID09PSAnem9uZSdcIlxyXG4gICAgICAgICAgICAgICAgKHN1Ym1pdEV2ZW50KT1cIm9uRml4dHVyZVN1Ym1pdCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgPC9saWItaW5zdGFuY2UtcHJvZHVjdHM+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRGaXh0dXJlU2VjdGlvbiA9PT0gJ3ZtcycgJiYgZWRpdEZyb21UYWIgIT09ICd6b25lJ1wiPlxyXG4gICAgICAgICAgICAgIDxsaWItaW5zdGFuY2Utdm1zIFtmaXh0dXJlRGF0YV09XCJzZWxlY3RlZEZpeHR1cmVEYXRhXCIgW2VkaXRNb2RlXT1cInRydWVcIiBbaXNTdWJtaXR0ZWRdPVwic3VibWl0Rml4dHVyZVwiXHJcbiAgICAgICAgICAgICAgICBbcmV2ZXJ0T25FZGl0XT1cInNob3VsZFJldmVydE9uRWRpdFwiIChzdWJtaXRFdmVudCk9XCJvbkZpeHR1cmVTdWJtaXQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgIDwvbGliLWluc3RhbmNlLXZtcz5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsgJ2NvbGxhcHNlZC1jb2wnOiBpc1JpZ2h0UGFuZWxDb2xsYXBzZWQsICdjb2wtMyc6ICFpc1JpZ2h0UGFuZWxDb2xsYXBzZWQgfVwiXHJcbiAgICAgICAgW3N0eWxlXT1cInsnbWluLXdpZHRoJzogaXNSaWdodFBhbmVsQ29sbGFwc2VkID8gJzAnIDogZWRpdEZpeHR1cmUgfHwgc2hvd0xheW91dCA/ICczNDBweCcgOiBhY3RpdmVGZWVkYmFja1RhYiA9PT0gJ2ZpeHR1cmUnID8gJzEwNTBweCcgOiAnNzUwcHgnfVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmZWVkYmFja0NvbFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG5cclxuPCEtLSBUZW1wbGF0ZXMgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZmVlZGJhY2tDb2w+XHJcbiAgPGRpdiBjbGFzcz1cInMtY2FyZCBzLWNhcmQtLXRhYmJlZFwiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6ZWRpdEZpeHR1cmUgPyAnNzJweCcgOiAnMHB4J31cIj5cclxuICAgIDwhLS0gQGlmKHNob3dGaXh0dXJlUHJldmlldyAmJiAhaXNSaWdodFBhbmVsQ29sbGFwc2VkKXtcclxuICAgICAgPGZpeHR1cmUtcHJldmlldyBbZml4dHVyZURhdGFdPVwic2VsZWN0ZWRGaXh0dXJlPy5maXh0dXJlRGF0YVwiPjwvZml4dHVyZS1wcmV2aWV3PlxyXG4gICAgfSAtLT5cclxuXHJcbiAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXBpbGxzIGZlZWRiYWNrLXRhYnNcIiByb2xlPVwidGFibGlzdFwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ2Qtbm9uZSc6IGlzUmlnaHRQYW5lbENvbGxhcHNlZCAmJiAhZWRpdEZpeHR1cmUgfVwiPlxyXG4gICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBjdXJzb3ItcG9pbnRlclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICA8YSAoY2xpY2spPVwib25GZWVkYmFja1RhYkNoYW5nZSgnZml4dHVyZScpXCIgW25nQ2xhc3NdPVwiYWN0aXZlRmVlZGJhY2tUYWIgPT09ICdmaXh0dXJlJyA/ICdhY3RpdmUnIDogJydcIlxyXG4gICAgICAgICAgY2xhc3M9XCJuYXYtbGlua1wiIHJvbGU9XCJ0YWJcIj5cclxuICAgICAgICAgIEZpeHR1cmUgVmVyaWZpY2F0aW9uXHJcbiAgICAgICAgPC9hPlxyXG4gICAgICA8L2xpPlxyXG4gICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBjdXJzb3ItcG9pbnRlclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICA8YSAoY2xpY2spPVwib25GZWVkYmFja1RhYkNoYW5nZSgnem9uZScpXCIgW25nQ2xhc3NdPVwiYWN0aXZlRmVlZGJhY2tUYWIgPT09ICd6b25lJyA/ICdhY3RpdmUnIDogJydcIlxyXG4gICAgICAgICAgY2xhc3M9XCJuYXYtbGluayBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCIgcm9sZT1cInRhYlwiPlxyXG4gICAgICAgICAgWm9uZSBWZXJpZmljYXRpb25cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiem9uZVBlbmRpbmdDb3VudCA+IDBcIiBjbGFzcz1cImJhZGdlIGZlZWRiYWNrLXRhYi1iYWRnZVwiPlxyXG4gICAgICAgICAgICB7eyB6b25lUGVuZGluZ0NvdW50IH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9hPlxyXG4gICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZmVlZGJhY2stdGFiLWNvbnRlbnRcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZUZlZWRiYWNrVGFiID09PSAnZml4dHVyZSdcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0xheW91dCAmJiAhaXNSaWdodFBhbmVsQ29sbGFwc2VkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRpdGxlIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmVUaXRsZSBtYi0zXCI+U3RvcmUgcmVzcG9uc2U8L2Rpdj5cclxuICAgICAgICAgICAgPGhyPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBTZWN0aW9uIEhlYWRlciAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMVwiPlxyXG4gICAgICAgICAgICAgIDxoNSBjbGFzcz1cInN1YlRpdGxlIGZ3LXNlbWlib2xkIG1iLTBcIj5GaXh0dXJlIHZlcmlmaWNhdGlvbjwvaDU+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1jaGV2cm9uLXVwIHRleHQtbXV0ZWQgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwidG9nZ2xlID0gIXRvZ2dsZVwiICpuZ0lmPVwiIXRvZ2dsZVwiPjwvaT5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWNoZXZyb24tZG93biB0ZXh0LW11dGVkIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInRvZ2dsZSA9ICF0b2dnbGVcIiAqbmdJZj1cInRvZ2dsZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbFRleHQgdGV4dC1tdXRlZCBkLWJsb2NrIG1iLTRcIj5cclxuICAgICAgICAgICAgICBBc3NpZ25lZCBvbjoge3tzdG9yZUZlZWRiYWNrPy5maXh0dXJlRGF0YT8uWzBdPy50YXNrRGF0YT8uY3JlYXRlZEF0IHwgZGF0ZTonZGQgTU1NIFlZWSwgaGg6bW06U1MgYSd9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidG9nZ2xlXCIgY2xhc3M9XCJtdC0xMFwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gQ29sdW1uIEhlYWRpbmdzIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdGV4dC1tdXRlZCBzbWFsbCBmdy1zZW1pYm9sZCBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlciBsaWdodFRleHRcIj5CZWZvcmU8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlciBsaWdodFRleHRcIj5BZnRlcjwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFdhbGwgRml4dHVyZXMgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgcHktMiBtYi01IHdhbGxUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5XYWxsIEZpeHR1cmVzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAge3t3YWxsQ291bnQgLSBjbENvdW50fX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyIGZ3LXNlbWlib2xkXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiKHdhbGxDb3VudCAtIGNsQ291bnQpICE9IHN0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbMF0uYW5zd2Vycz8uWzBdPy53YWxsRml4dHVyZXMgPyAndGV4dC1kYW5nZXInIDogJydcIj5cclxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1hcnJvdy11cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIod2FsbENvdW50IC0gY2xDb3VudCkgPCBzdG9yZUZlZWRiYWNrLmZpeHR1cmVEYXRhWzBdLmFuc3dlcnM/LlswXT8ud2FsbEZpeHR1cmVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWFycm93LWRvd25cIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKHdhbGxDb3VudCAtIGNsQ291bnQpID4gc3RvcmVGZWVkYmFjay5maXh0dXJlRGF0YVswXS5hbnN3ZXJzPy5bMF0/LndhbGxGaXh0dXJlc1wiPjwvaT57e3N0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbMF0uYW5zd2Vycz8uWzBdPy53YWxsRml4dHVyZXN9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gRXVybyBDZW50cmUgRml4dHVyZXMgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgcHktMiBtYi01IHdhbGxUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5FdXJvIENlbnRyZSBGaXh0dXJlczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyXCI+e3tmbG9vckRhdGEuY2VudGVyRml4dHVyZS5sZW5ndGh9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyIGZ3LXNlbWlib2xkXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUubGVuZ3RoICE9IHN0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbMF0uYW5zd2Vycz8uWzBdPy5mbG9vckZpeHR1cmVzID8gJ3RleHQtZGFuZ2VyJyA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktYXJyb3ctZG93blwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmbG9vckRhdGEuY2VudGVyRml4dHVyZS5sZW5ndGggPiBzdG9yZUZlZWRiYWNrLmZpeHR1cmVEYXRhWzBdPy5hbnN3ZXJzPy5bMF0/LmZsb29yRml4dHVyZXNcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktYXJyb3ctdXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JEYXRhLmNlbnRlckZpeHR1cmUubGVuZ3RoIDwgc3RvcmVGZWVkYmFjay5maXh0dXJlRGF0YVswXT8uYW5zd2Vycz8uWzBdPy5mbG9vckZpeHR1cmVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICB7e3N0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbMF0uYW5zd2Vycz8uWzBdPy5mbG9vckZpeHR1cmVzfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIENvbnRhY3QgTGVuc2VzIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyIHB5LTIgbWItNSB3YWxsVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+Q29udGFjdCBMZW5zZXM8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlclwiPnt7Y2xDb3VudH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgdGV4dC1jZW50ZXIgZnctc2VtaWJvbGRcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjbENvdW50ICE9IHN0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbMF0uYW5zd2Vycz8uWzBdPy5jbCA/ICd0ZXh0LWRhbmdlcicgOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWFycm93LWRvd25cIiAqbmdJZj1cImNsQ291bnQgPiBzdG9yZUZlZWRiYWNrLmZpeHR1cmVEYXRhWzBdLmFuc3dlcnM/LlswXT8uY2xcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktYXJyb3ctdXBcIiAqbmdJZj1cImNsQ291bnQgPCBzdG9yZUZlZWRiYWNrLmZpeHR1cmVEYXRhWzBdLmFuc3dlcnM/LlswXT8uY2xcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIHt7c3RvcmVGZWVkYmFjay5maXh0dXJlRGF0YVswXS5hbnN3ZXJzPy5bMF0/LmNsfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8aHI+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gVG90YWwgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IGZ3LXNlbWlib2xkIHRvdGFsVGV4dFwiPlRvdGFsPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgdGV4dC1jZW50ZXIgdG90YWxUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3RhbC1ib3hcIj57e2Zsb29yRGF0YS5maXh0dXJlQ291bnR9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgdGV4dC1jZW50ZXIgdG90YWxUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3RhbC1ib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZsb29yRGF0YS5maXh0dXJlQ291bnQgIT09IChzdG9yZUZlZWRiYWNrLmZpeHR1cmVEYXRhWzBdLmFuc3dlcnM/LlswXT8uY2wgKyBzdG9yZUZlZWRiYWNrLmZpeHR1cmVEYXRhWzBdLmFuc3dlcnM/LlswXT8uZmxvb3JGaXh0dXJlcyArIHN0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbMF0uYW5zd2Vycz8uWzBdPy53YWxsRml4dHVyZXMpID8gJ3RleHQtY2VudGVyJyA6JydcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e3N0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbMF0uYW5zd2Vycz8uWzBdPy5jbCArIHN0b3JlRmVlZGJhY2suZml4dHVyZURhdGFbMF0uYW5zd2Vycz8uWzBdPy5mbG9vckZpeHR1cmVzICsgc3RvcmVGZWVkYmFjay5maXh0dXJlRGF0YVswXS5hbnN3ZXJzPy5bMF0/LndhbGxGaXh0dXJlc319XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIEBpZiAoc3RvcmVGZWVkYmFjay5maXh0dXJlRGF0YVswXT8uYW5zd2Vycz8uWzBdPy5jb21tZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJmaXh0dXJlLWNvbW1lbnRzXCIgY2xhc3M9XCJtdC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtYi0yXCI+Q29tbWVudHM8L2g1PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGMgb2Ygc3RvcmVGZWVkYmFjay5maXh0dXJlRGF0YVswXT8uYW5zd2Vyc1swXT8uY29tbWVudHM7bGV0IGk9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBVc2VyIGF2YXRhciAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHJ4PVwiMTZcIiBmaWxsPVwiI0VBRjhGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIyLjY2NzMgMjMuNVYyMS44MzMzQzIyLjY2NzMgMjAuOTQ5MyAyMi4zMTYxIDIwLjEwMTQgMjEuNjkxIDE5LjQ3NjNDMjEuMDY1OSAxOC44NTEyIDIwLjIxOCAxOC41IDE5LjMzNCAxOC41SDEyLjY2NzNDMTEuNzgzMyAxOC41IDEwLjkzNTQgMTguODUxMiAxMC4zMTAzIDE5LjQ3NjNDOS42ODUxNyAyMC4xMDE0IDkuMzMzOTggMjAuOTQ5MyA5LjMzMzk4IDIxLjgzMzNWMjMuNU0xOS4zMzQgMTEuODMzM0MxOS4zMzQgMTMuNjc0MyAxNy44NDE2IDE1LjE2NjcgMTYuMDAwNyAxNS4xNjY3QzE0LjE1OTcgMTUuMTY2NyAxMi42NjczIDEzLjY3NDMgMTIuNjY3MyAxMS44MzMzQzEyLjY2NzMgOS45OTIzOCAxNC4xNTk3IDguNSAxNi4wMDA3IDguNUMxNy44NDE2IDguNSAxOS4zMzQgOS45OTIzOCAxOS4zMzQgMTEuODMzM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTEgZmxleC1jb2x1bW5cIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0xIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoND57e2M/LnVzZXJOYW1lfX08L2g0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD57e2M/LnRpbWVTdGFtcCB8IGRhdGU6J2hoOm1tOnNzIGEgLSBkZCBNTU0geXl5eSd9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZihjPy5yZXNwb25zZXR5cGUgPT09ICdjb21tZW50Jyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNT57e2M/LmNvbW1lbnR9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGxpYi12ZXJpZmljYXRpb24tZmVlZGJhY2sgW2Zsb29yRGF0YV09XCJmbG9vckRhdGFcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnZC1ub25lJzogaXNSaWdodFBhbmVsQ29sbGFwc2VkICYmICFlZGl0Rml4dHVyZX1cIiBbZmVlZGJhY2tEZXRhaWxzXT1cInNlbGVjdGVkRml4dHVyZUZlZWRiYWNrXCJcclxuICAgICAgICAgIChjaGFuZ2VGaXh0dXJlKT1cIm9uQ2hhbmdlRml4dHVyZU9uRmVlZGJhY2tQYW5lbCgkZXZlbnQsdHJ1ZSlcIiBbdG90YWxGaXh0dXJlc109XCJhbGxGaXh0dXJlSW5zdGFuY2VzXCJcclxuICAgICAgICAgIFtjZG5dPVwiY2RuVXJsXCIgKGFjdGlvbik9XCJoYW5kbGVGZWVkYmFja0FjdGlvbigkZXZlbnQpXCIgW3Nob3dBY3Rpb25dPVwiIWVkaXRGaXh0dXJlXCJcclxuICAgICAgICAgICpuZ0lmPVwiIXNob3dMYXlvdXRcIj48L2xpYi12ZXJpZmljYXRpb24tZmVlZGJhY2s+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZUZlZWRiYWNrVGFiID09PSAnem9uZSdcIj5cclxuICAgICAgICA8bGliLXpvbmUtdmVyaWZpY2F0aW9uLWZlZWRiYWNrIFtmbG9vckRhdGFdPVwiZmxvb3JEYXRhXCIgW2ZlZWRiYWNrRGV0YWlsc109XCJzZWxlY3RlZEZpeHR1cmVGZWVkYmFja1wiXHJcbiAgICAgICAgICBbem9uZVRhc2tdPVwiem9uZUZlZWRiYWNrPy56b25lVmVyaWZpY2F0aW9uVGFza1wiIFt6b25lRmVlZGJhY2tdPVwic2VsZWN0ZWRab25lRmVlZGJhY2tcIlxyXG4gICAgICAgICAgW3RvdGFsRml4dHVyZXNdPVwiYWxsRml4dHVyZUluc3RhbmNlc1wiIFtjZG5dPVwiY2RuVXJsXCIgW3Nob3dBY3Rpb25dPVwiIWVkaXRGaXh0dXJlXCJcclxuICAgICAgICAgIChjaGFuZ2VGaXh0dXJlKT1cIm9uQ2hhbmdlRml4dHVyZU9uRmVlZGJhY2tQYW5lbCgkZXZlbnQsdHJ1ZSlcIiAoYWN0aW9uKT1cImhhbmRsZUZlZWRiYWNrQWN0aW9uKCRldmVudClcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnZC1ub25lJzogaXNSaWdodFBhbmVsQ29sbGFwc2VkICYmICFlZGl0Rml4dHVyZSB9XCI+PC9saWItem9uZS12ZXJpZmljYXRpb24tZmVlZGJhY2s+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2hlYWRlclNrZWxldG9uPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgbS0wIGctMCBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIG92ZXJmbG93LWhpZGRlblwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXIgdy0xMDAgcC00IHJvdW5kZWRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIG10LTAgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNza2VsZXRvbkxvYWRlcj5cclxuICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lciByb3VuZGVkXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICA8YnIgLz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgIDxiciAvPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICA8YnIgLz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjbm9TdG9yZVZpZGVvIGxldC1tb2RhbD5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgPGRpdj5cclxuICAgICAgPGgyIGNsYXNzPVwibWItM1wiPk5vIFN0b3JlIFZpZGVvIEZvdW5kPC9oMj5cclxuICAgICAgPHA+VGhlIHZpZGVvIHdpbGwgYmUgYXZhaWxhYmxlIG9uY2UgYSByZXF1ZXN0IGlzIHJhaXNlZCBhbmQgdGhlIHN0b3JlIHN1Ym1pdHMgYSBjb21wbGV0ZSBzdG9yZSB2aWRlby48L3A+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJtb2RhbC5jbG9zZSgpXCI+Q2xvc2U8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNhcHBseUxvZ2ljcyBsZXQtbW9kYWw+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxoMiBjbGFzcz1cIm1iLTNcIj5BcHBseSBJVk0gTG9naWNzPC9oMj5cclxuICAgICAgPHA+VGhpcyB3aWxsIGFuYWx5emUgdGhlIGN1cnJlbnQgbGF5b3V0IGFuZCBhcHBseSB0aGUgcHJlLWRlZmluZWQgZml4dHVyZSBsb2dpY3MuPC9wPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgZ2FwLTNcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwibW9kYWwuY2xvc2UoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJhcHBseVBJRExvZ2ljcygpXCI+UHJvY2VlZDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2FwcHJvdmVMYXlvdXRNb2RhbCBsZXQtbW9kYWw+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxoMiBjbGFzcz1cIm1iLTNcIj5BcHByb3ZlIGxheW91dC9wbGFuPC9oMj5cclxuICAgICAgPHA+XHJcbiAgICAgICAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGFwcHJvdmUgdGhlIGxheW91dD8gUGxlYXNlIGVuc3VyZSBpdCBoYXMgYmVlbiB0aG9yb3VnaGx5IHJldmlld2VkIGJlZm9yZSBhcHByb3ZpbmcuXHJcbiAgICAgIDwvcD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGdhcC0zXCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cIm1vZGFsLmNsb3NlKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiYXBwcm92ZUxheW91dCgpXCI+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNCdXR0b25Mb2FkaW5nXCI+QXBwcm92ZTwvc3Bhbj5cclxuICAgICAgICA8c3ZnICpuZ0lmPVwiaXNCdXR0b25Mb2FkaW5nXCIgY2xhc3M9XCJzcGlubmVyXCIgdmlld0JveD1cIjAgMCA1MCA1MFwiPlxyXG4gICAgICAgICAgPGNpcmNsZSBjbGFzcz1cInBhdGhcIiBjeD1cIjI1XCIgY3k9XCIyNVwiIHI9XCIyMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiNFwiPjwvY2lyY2xlPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==