tango-app-ui-store-builder 1.2.16 → 1.2.18

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.
Files changed (63) hide show
  1. package/esm2022/lib/components/access-denied/access-denied.component.mjs +31 -0
  2. package/esm2022/lib/components/collection-update-ai/collection-update-ai.component.mjs +3 -3
  3. package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.mjs +3 -3
  4. package/esm2022/lib/components/collection-update-ai/find-replace-layout/review-replace/review-replace.component.mjs +3 -3
  5. package/esm2022/lib/components/fixture-template/template-assign-stores/preview-modal/preview-modal.component.mjs +3 -3
  6. package/esm2022/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.mjs +3 -3
  7. package/esm2022/lib/components/fixture-template-table/find-and-replace/find-and-replace.component.mjs +3 -3
  8. package/esm2022/lib/components/fixture-template-table/fixture-template-table.component.mjs +25 -3
  9. package/esm2022/lib/components/fixture-template-tree/fixture-template-tree.component.mjs +3 -3
  10. package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +3 -3
  11. package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +3 -3
  12. package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +9 -3
  13. package/esm2022/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.mjs +9 -3
  14. package/esm2022/lib/components/onboard-store-plano/onboard-store-plano.component.mjs +133 -21
  15. package/esm2022/lib/components/plano-configurations/plano-configurations.component.mjs +25 -9
  16. package/esm2022/lib/components/plano-library/fixture-library/fixture-library.component.mjs +28 -5
  17. package/esm2022/lib/components/plano-tools/allow-edit/allow-edit.component.mjs +4 -3
  18. package/esm2022/lib/components/plano-tools/cad-files/cad-files.component.mjs +5 -4
  19. package/esm2022/lib/components/plano-tools/cad-render/cad-render.component.mjs +6 -5
  20. package/esm2022/lib/components/plano-tools/delete-floor/delete-floor.component.mjs +4 -3
  21. package/esm2022/lib/components/plano-tools/delete-task/delete-task.component.mjs +4 -3
  22. package/esm2022/lib/components/plano-tools/layout-touchup/layout-touchup.component.mjs +134 -0
  23. package/esm2022/lib/components/plano-tools/layout-touchup/touchup-editor/touchup-editor.component.mjs +5103 -0
  24. package/esm2022/lib/components/plano-tools/modify-fixture-numbers/modify-fixture-numbers.component.mjs +4 -3
  25. package/esm2022/lib/components/plano-tools/move-bucket/move-bucket.component.mjs +4 -3
  26. package/esm2022/lib/components/plano-tools/plano-data-export/plano-data-export.component.mjs +4 -3
  27. package/esm2022/lib/components/plano-tools/plano-migrate/plano-migrate.component.mjs +6 -5
  28. package/esm2022/lib/components/plano-tools/store-exports/store-exports.component.mjs +4 -3
  29. package/esm2022/lib/components/plano-tools/swap-template/swap-template.component.mjs +4 -3
  30. package/esm2022/lib/components/plano-tools/tool-page-header/tool-page-header.component.mjs +22 -0
  31. package/esm2022/lib/components/plano-tools/tools-parent/tools-parent.component.mjs +27 -8
  32. package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +3 -3
  33. package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-locator.component.mjs +3 -3
  34. package/esm2022/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.mjs +3 -3
  35. package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +3 -3
  36. package/esm2022/lib/components/popups/publish-plano-modal/publish-plano-modal.component.mjs +1 -1
  37. package/esm2022/lib/components/store-plano/store-plano-tree-view/store-plano-tree-view.component.mjs +3 -3
  38. package/esm2022/lib/components/store-plano/store-plano.component.mjs +3 -3
  39. package/esm2022/lib/functions/feature-access.guard.mjs +20 -0
  40. package/esm2022/lib/functions/plano.function.mjs +22 -1
  41. package/esm2022/lib/services/store-builder.service.mjs +24 -3
  42. package/esm2022/lib/tango-store-builder-routing.module.mjs +35 -55
  43. package/esm2022/lib/tango-store-builder.module.mjs +14 -2
  44. package/fesm2022/tango-app-ui-store-builder.mjs +5863 -376
  45. package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
  46. package/lib/components/access-denied/access-denied.component.d.ts +18 -0
  47. package/lib/components/fixture-template-table/fixture-template-table.component.d.ts +6 -0
  48. package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +4 -4
  49. package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +5 -5
  50. package/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.d.ts +1 -0
  51. package/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.d.ts +1 -0
  52. package/lib/components/onboard-store-plano/onboard-store-plano.component.d.ts +8 -0
  53. package/lib/components/plano-configurations/plano-configurations.component.d.ts +9 -1
  54. package/lib/components/plano-library/fixture-library/fixture-library.component.d.ts +5 -1
  55. package/lib/components/plano-tools/layout-touchup/layout-touchup.component.d.ts +50 -0
  56. package/lib/components/plano-tools/layout-touchup/touchup-editor/touchup-editor.component.d.ts +331 -0
  57. package/lib/components/plano-tools/tool-page-header/tool-page-header.component.d.ts +8 -0
  58. package/lib/components/plano-tools/tools-parent/tools-parent.component.d.ts +4 -2
  59. package/lib/functions/feature-access.guard.d.ts +9 -0
  60. package/lib/functions/plano.function.d.ts +9 -0
  61. package/lib/services/store-builder.service.d.ts +16 -0
  62. package/lib/tango-store-builder.module.d.ts +62 -58
  63. package/package.json +1 -1
@@ -5,6 +5,7 @@ import * as i1 from "../../../services/store-builder.service";
5
5
  import * as i2 from "tango-app-ui-global";
6
6
  import * as i3 from "@angular/forms";
7
7
  import * as i4 from "../../collection-update-ai/components/store-select/store-select.component";
8
+ import * as i5 from "../tool-page-header/tool-page-header.component";
8
9
  const POLL_INITIAL_DELAY_MS = 15000;
9
10
  const POLL_INTERVAL_MS = 10000;
10
11
  const POLL_TIMEOUT_MS = 30 * 60 * 1000;
@@ -225,10 +226,10 @@ export class StoreExportsComponent {
225
226
  this.destroy$.complete();
226
227
  }
227
228
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StoreExportsComponent, deps: [{ token: i1.StoreBuilderService }, { token: i2.GlobalStateService }], target: i0.ɵɵFactoryTarget.Component });
228
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: StoreExportsComponent, selector: "lib-store-exports", ngImport: i0, template: "<section class=\"store-exports p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 700px;\">\r\n <h5 class=\"mb-1\">Store Exports</h5>\r\n <p class=\"text-muted small mb-3\">\r\n Generate per-store fixture exports. Select one or more stores, then choose an export.\r\n Large exports run in the background and are saved to S3 \u2014 a download link appears here when ready.\r\n </p>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Stores \u2014 Manage Planogram (live)</label>\r\n <lib-store-select\r\n [options]=\"storeOptions\"\r\n [initialSelected]=\"initialStores\"\r\n (selectedChange)=\"onStoresSelected($event)\">\r\n </lib-store-select>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Stores \u2014 from a Revision</label>\r\n <lib-store-select\r\n [options]=\"storeOptions\"\r\n [initialSelected]=\"initialStores\"\r\n (selectedChange)=\"onRevisionStoresSelected($event)\">\r\n </lib-store-select>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Revision name</label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n [(ngModel)]=\"revisionName\"\r\n name=\"revisionName\"\r\n autocomplete=\"off\"\r\n placeholder=\"e.g. Q1-2026 Layout\"\r\n [disabled]=\"isWorking\" />\r\n <div class=\"form-text\">\r\n Applies to the \u201Cfrom a Revision\u201D stores above \u2014 each is exported from its revision with this exact name (stores without it are skipped). Live stores use current data; both sets are combined into one export.\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"onExportMbq()\"\r\n [disabled]=\"isWorking || totalSelectedStores === 0\">\r\n @if (starting === 'mbq') {\r\n Starting MBQ...\r\n } @else if (activeJob?.status === 'running' && activeJob?.kind === 'mbq') {\r\n Running MBQ...\r\n } @else {\r\n Export MBQ\r\n }\r\n </button>\r\n\r\n <button\r\n class=\"btn btn-success\"\r\n (click)=\"onExportOrderSheet()\"\r\n [disabled]=\"isWorking || totalSelectedStores === 0\">\r\n @if (starting === 'order') {\r\n Starting Order Sheet...\r\n } @else if (activeJob?.status === 'running' && activeJob?.kind === 'order') {\r\n Running Order Sheet...\r\n } @else {\r\n Export Order Sheet\r\n }\r\n </button>\r\n </div>\r\n\r\n @if (busyInfo) {\r\n <div class=\"mt-3 alert alert-warning\">\r\n Another {{ kindLabel(busyInfo.kind) }} export is currently running@if (busyInfo.storeCount) { ({{ busyInfo.storeCount }} store{{ busyInfo.storeCount === 1 ? '' : 's' }}) }@if (busyInfo.startedAt) {, started {{ startedAgo(busyInfo.startedAt) }}}. Please wait until it finishes before starting a new export.\r\n </div>\r\n }\r\n\r\n @if (activeJob) {\r\n <div\r\n class=\"mt-3 alert\"\r\n [class.alert-info]=\"activeJob.status === 'running'\"\r\n [class.alert-success]=\"activeJob.status === 'succeeded'\"\r\n [class.alert-danger]=\"activeJob.status === 'failed'\">\r\n @if (activeJob.status === 'running') {\r\n <div>\r\n {{ kindLabel(activeJob.kind) }} export is processing@if (activeJob.storeCount) { ({{ activeJob.storeCount }} store{{ activeJob.storeCount === 1 ? '' : 's' }}) }. Started {{ startedAgo(activeJob.startedAt) }}. Keep this page open \u2014 a download link will appear when it finishes.\r\n </div>\r\n } @else if (activeJob.status === 'succeeded' && activeJob.downloadUrl) {\r\n <div class=\"d-flex align-items-center justify-content-between gap-2 flex-wrap\">\r\n <span>\r\n {{ kindLabel(activeJob.kind) }} export ready@if (activeJob.rowCount) { \u2014 {{ activeJob.rowCount }} row{{ activeJob.rowCount === 1 ? '' : 's' }} }.\r\n </span>\r\n <div class=\"d-flex gap-2\">\r\n <a [href]=\"activeJob.downloadUrl\" class=\"btn btn-sm btn-success\" target=\"_blank\" rel=\"noopener\">Download</a>\r\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"dismissResult()\">Dismiss</button>\r\n </div>\r\n </div>\r\n } @else if (activeJob.status === 'failed') {\r\n <div class=\"d-flex align-items-center justify-content-between gap-2 flex-wrap\">\r\n <span>{{ kindLabel(activeJob.kind) }} export failed: {{ activeJob.error || 'Unknown error' }}</span>\r\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"dismissResult()\">Dismiss</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (message) {\r\n <div\r\n class=\"mt-3 alert\"\r\n [class.alert-success]=\"messageType === 'success'\"\r\n [class.alert-danger]=\"messageType === 'error'\">\r\n {{ message }}\r\n </div>\r\n }\r\n </div>\r\n</section>\r\n", styles: [".store-exports .card{border:1px solid #e0e0e0}\n"], dependencies: [{ 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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.StoreSelectComponent, selector: "lib-store-select", inputs: ["options", "initialSelected", "singleSelect"], outputs: ["selectedChange"] }] });
229
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: StoreExportsComponent, selector: "lib-store-exports", ngImport: i0, template: "<section class=\"store-exports p-3\">\r\n <lib-tool-page-header\r\n title=\"MBQ & Order\"\r\n description=\"Generate per-store fixture exports. Select one or more stores, then choose an export. Large exports run in the background and are saved to S3 \u2014 a download link appears here when ready.\"\r\n ></lib-tool-page-header>\r\n <div class=\"card p-4\" style=\"max-width: 700px;\">\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Stores \u2014 Manage Planogram (live)</label>\r\n <lib-store-select\r\n [options]=\"storeOptions\"\r\n [initialSelected]=\"initialStores\"\r\n (selectedChange)=\"onStoresSelected($event)\">\r\n </lib-store-select>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Stores \u2014 from a Revision</label>\r\n <lib-store-select\r\n [options]=\"storeOptions\"\r\n [initialSelected]=\"initialStores\"\r\n (selectedChange)=\"onRevisionStoresSelected($event)\">\r\n </lib-store-select>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Revision name</label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n [(ngModel)]=\"revisionName\"\r\n name=\"revisionName\"\r\n autocomplete=\"off\"\r\n placeholder=\"e.g. Q1-2026 Layout\"\r\n [disabled]=\"isWorking\" />\r\n <div class=\"form-text\">\r\n Applies to the \u201Cfrom a Revision\u201D stores above \u2014 each is exported from its revision with this exact name (stores without it are skipped). Live stores use current data; both sets are combined into one export.\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"onExportMbq()\"\r\n [disabled]=\"isWorking || totalSelectedStores === 0\">\r\n @if (starting === 'mbq') {\r\n Starting MBQ...\r\n } @else if (activeJob?.status === 'running' && activeJob?.kind === 'mbq') {\r\n Running MBQ...\r\n } @else {\r\n Export MBQ\r\n }\r\n </button>\r\n\r\n <button\r\n class=\"btn btn-success\"\r\n (click)=\"onExportOrderSheet()\"\r\n [disabled]=\"isWorking || totalSelectedStores === 0\">\r\n @if (starting === 'order') {\r\n Starting Order Sheet...\r\n } @else if (activeJob?.status === 'running' && activeJob?.kind === 'order') {\r\n Running Order Sheet...\r\n } @else {\r\n Export Order Sheet\r\n }\r\n </button>\r\n </div>\r\n\r\n @if (busyInfo) {\r\n <div class=\"mt-3 alert alert-warning\">\r\n Another {{ kindLabel(busyInfo.kind) }} export is currently running@if (busyInfo.storeCount) { ({{ busyInfo.storeCount }} store{{ busyInfo.storeCount === 1 ? '' : 's' }}) }@if (busyInfo.startedAt) {, started {{ startedAgo(busyInfo.startedAt) }}}. Please wait until it finishes before starting a new export.\r\n </div>\r\n }\r\n\r\n @if (activeJob) {\r\n <div\r\n class=\"mt-3 alert\"\r\n [class.alert-info]=\"activeJob.status === 'running'\"\r\n [class.alert-success]=\"activeJob.status === 'succeeded'\"\r\n [class.alert-danger]=\"activeJob.status === 'failed'\">\r\n @if (activeJob.status === 'running') {\r\n <div>\r\n {{ kindLabel(activeJob.kind) }} export is processing@if (activeJob.storeCount) { ({{ activeJob.storeCount }} store{{ activeJob.storeCount === 1 ? '' : 's' }}) }. Started {{ startedAgo(activeJob.startedAt) }}. Keep this page open \u2014 a download link will appear when it finishes.\r\n </div>\r\n } @else if (activeJob.status === 'succeeded' && activeJob.downloadUrl) {\r\n <div class=\"d-flex align-items-center justify-content-between gap-2 flex-wrap\">\r\n <span>\r\n {{ kindLabel(activeJob.kind) }} export ready@if (activeJob.rowCount) { \u2014 {{ activeJob.rowCount }} row{{ activeJob.rowCount === 1 ? '' : 's' }} }.\r\n </span>\r\n <div class=\"d-flex gap-2\">\r\n <a [href]=\"activeJob.downloadUrl\" class=\"btn btn-sm btn-success\" target=\"_blank\" rel=\"noopener\">Download</a>\r\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"dismissResult()\">Dismiss</button>\r\n </div>\r\n </div>\r\n } @else if (activeJob.status === 'failed') {\r\n <div class=\"d-flex align-items-center justify-content-between gap-2 flex-wrap\">\r\n <span>{{ kindLabel(activeJob.kind) }} export failed: {{ activeJob.error || 'Unknown error' }}</span>\r\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"dismissResult()\">Dismiss</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (message) {\r\n <div\r\n class=\"mt-3 alert\"\r\n [class.alert-success]=\"messageType === 'success'\"\r\n [class.alert-danger]=\"messageType === 'error'\">\r\n {{ message }}\r\n </div>\r\n }\r\n </div>\r\n</section>\r\n", styles: [".store-exports .card{border:1px solid #e0e0e0}\n"], dependencies: [{ 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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.StoreSelectComponent, selector: "lib-store-select", inputs: ["options", "initialSelected", "singleSelect"], outputs: ["selectedChange"] }, { kind: "component", type: i5.ToolPageHeaderComponent, selector: "lib-tool-page-header", inputs: ["title", "description", "backLink"] }] });
229
230
  }
230
231
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StoreExportsComponent, decorators: [{
231
232
  type: Component,
232
- args: [{ selector: 'lib-store-exports', template: "<section class=\"store-exports p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 700px;\">\r\n <h5 class=\"mb-1\">Store Exports</h5>\r\n <p class=\"text-muted small mb-3\">\r\n Generate per-store fixture exports. Select one or more stores, then choose an export.\r\n Large exports run in the background and are saved to S3 \u2014 a download link appears here when ready.\r\n </p>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Stores \u2014 Manage Planogram (live)</label>\r\n <lib-store-select\r\n [options]=\"storeOptions\"\r\n [initialSelected]=\"initialStores\"\r\n (selectedChange)=\"onStoresSelected($event)\">\r\n </lib-store-select>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Stores \u2014 from a Revision</label>\r\n <lib-store-select\r\n [options]=\"storeOptions\"\r\n [initialSelected]=\"initialStores\"\r\n (selectedChange)=\"onRevisionStoresSelected($event)\">\r\n </lib-store-select>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Revision name</label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n [(ngModel)]=\"revisionName\"\r\n name=\"revisionName\"\r\n autocomplete=\"off\"\r\n placeholder=\"e.g. Q1-2026 Layout\"\r\n [disabled]=\"isWorking\" />\r\n <div class=\"form-text\">\r\n Applies to the \u201Cfrom a Revision\u201D stores above \u2014 each is exported from its revision with this exact name (stores without it are skipped). Live stores use current data; both sets are combined into one export.\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"onExportMbq()\"\r\n [disabled]=\"isWorking || totalSelectedStores === 0\">\r\n @if (starting === 'mbq') {\r\n Starting MBQ...\r\n } @else if (activeJob?.status === 'running' && activeJob?.kind === 'mbq') {\r\n Running MBQ...\r\n } @else {\r\n Export MBQ\r\n }\r\n </button>\r\n\r\n <button\r\n class=\"btn btn-success\"\r\n (click)=\"onExportOrderSheet()\"\r\n [disabled]=\"isWorking || totalSelectedStores === 0\">\r\n @if (starting === 'order') {\r\n Starting Order Sheet...\r\n } @else if (activeJob?.status === 'running' && activeJob?.kind === 'order') {\r\n Running Order Sheet...\r\n } @else {\r\n Export Order Sheet\r\n }\r\n </button>\r\n </div>\r\n\r\n @if (busyInfo) {\r\n <div class=\"mt-3 alert alert-warning\">\r\n Another {{ kindLabel(busyInfo.kind) }} export is currently running@if (busyInfo.storeCount) { ({{ busyInfo.storeCount }} store{{ busyInfo.storeCount === 1 ? '' : 's' }}) }@if (busyInfo.startedAt) {, started {{ startedAgo(busyInfo.startedAt) }}}. Please wait until it finishes before starting a new export.\r\n </div>\r\n }\r\n\r\n @if (activeJob) {\r\n <div\r\n class=\"mt-3 alert\"\r\n [class.alert-info]=\"activeJob.status === 'running'\"\r\n [class.alert-success]=\"activeJob.status === 'succeeded'\"\r\n [class.alert-danger]=\"activeJob.status === 'failed'\">\r\n @if (activeJob.status === 'running') {\r\n <div>\r\n {{ kindLabel(activeJob.kind) }} export is processing@if (activeJob.storeCount) { ({{ activeJob.storeCount }} store{{ activeJob.storeCount === 1 ? '' : 's' }}) }. Started {{ startedAgo(activeJob.startedAt) }}. Keep this page open \u2014 a download link will appear when it finishes.\r\n </div>\r\n } @else if (activeJob.status === 'succeeded' && activeJob.downloadUrl) {\r\n <div class=\"d-flex align-items-center justify-content-between gap-2 flex-wrap\">\r\n <span>\r\n {{ kindLabel(activeJob.kind) }} export ready@if (activeJob.rowCount) { \u2014 {{ activeJob.rowCount }} row{{ activeJob.rowCount === 1 ? '' : 's' }} }.\r\n </span>\r\n <div class=\"d-flex gap-2\">\r\n <a [href]=\"activeJob.downloadUrl\" class=\"btn btn-sm btn-success\" target=\"_blank\" rel=\"noopener\">Download</a>\r\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"dismissResult()\">Dismiss</button>\r\n </div>\r\n </div>\r\n } @else if (activeJob.status === 'failed') {\r\n <div class=\"d-flex align-items-center justify-content-between gap-2 flex-wrap\">\r\n <span>{{ kindLabel(activeJob.kind) }} export failed: {{ activeJob.error || 'Unknown error' }}</span>\r\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"dismissResult()\">Dismiss</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (message) {\r\n <div\r\n class=\"mt-3 alert\"\r\n [class.alert-success]=\"messageType === 'success'\"\r\n [class.alert-danger]=\"messageType === 'error'\">\r\n {{ message }}\r\n </div>\r\n }\r\n </div>\r\n</section>\r\n", styles: [".store-exports .card{border:1px solid #e0e0e0}\n"] }]
233
+ args: [{ selector: 'lib-store-exports', template: "<section class=\"store-exports p-3\">\r\n <lib-tool-page-header\r\n title=\"MBQ & Order\"\r\n description=\"Generate per-store fixture exports. Select one or more stores, then choose an export. Large exports run in the background and are saved to S3 \u2014 a download link appears here when ready.\"\r\n ></lib-tool-page-header>\r\n <div class=\"card p-4\" style=\"max-width: 700px;\">\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Stores \u2014 Manage Planogram (live)</label>\r\n <lib-store-select\r\n [options]=\"storeOptions\"\r\n [initialSelected]=\"initialStores\"\r\n (selectedChange)=\"onStoresSelected($event)\">\r\n </lib-store-select>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Stores \u2014 from a Revision</label>\r\n <lib-store-select\r\n [options]=\"storeOptions\"\r\n [initialSelected]=\"initialStores\"\r\n (selectedChange)=\"onRevisionStoresSelected($event)\">\r\n </lib-store-select>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Revision name</label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n [(ngModel)]=\"revisionName\"\r\n name=\"revisionName\"\r\n autocomplete=\"off\"\r\n placeholder=\"e.g. Q1-2026 Layout\"\r\n [disabled]=\"isWorking\" />\r\n <div class=\"form-text\">\r\n Applies to the \u201Cfrom a Revision\u201D stores above \u2014 each is exported from its revision with this exact name (stores without it are skipped). Live stores use current data; both sets are combined into one export.\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"onExportMbq()\"\r\n [disabled]=\"isWorking || totalSelectedStores === 0\">\r\n @if (starting === 'mbq') {\r\n Starting MBQ...\r\n } @else if (activeJob?.status === 'running' && activeJob?.kind === 'mbq') {\r\n Running MBQ...\r\n } @else {\r\n Export MBQ\r\n }\r\n </button>\r\n\r\n <button\r\n class=\"btn btn-success\"\r\n (click)=\"onExportOrderSheet()\"\r\n [disabled]=\"isWorking || totalSelectedStores === 0\">\r\n @if (starting === 'order') {\r\n Starting Order Sheet...\r\n } @else if (activeJob?.status === 'running' && activeJob?.kind === 'order') {\r\n Running Order Sheet...\r\n } @else {\r\n Export Order Sheet\r\n }\r\n </button>\r\n </div>\r\n\r\n @if (busyInfo) {\r\n <div class=\"mt-3 alert alert-warning\">\r\n Another {{ kindLabel(busyInfo.kind) }} export is currently running@if (busyInfo.storeCount) { ({{ busyInfo.storeCount }} store{{ busyInfo.storeCount === 1 ? '' : 's' }}) }@if (busyInfo.startedAt) {, started {{ startedAgo(busyInfo.startedAt) }}}. Please wait until it finishes before starting a new export.\r\n </div>\r\n }\r\n\r\n @if (activeJob) {\r\n <div\r\n class=\"mt-3 alert\"\r\n [class.alert-info]=\"activeJob.status === 'running'\"\r\n [class.alert-success]=\"activeJob.status === 'succeeded'\"\r\n [class.alert-danger]=\"activeJob.status === 'failed'\">\r\n @if (activeJob.status === 'running') {\r\n <div>\r\n {{ kindLabel(activeJob.kind) }} export is processing@if (activeJob.storeCount) { ({{ activeJob.storeCount }} store{{ activeJob.storeCount === 1 ? '' : 's' }}) }. Started {{ startedAgo(activeJob.startedAt) }}. Keep this page open \u2014 a download link will appear when it finishes.\r\n </div>\r\n } @else if (activeJob.status === 'succeeded' && activeJob.downloadUrl) {\r\n <div class=\"d-flex align-items-center justify-content-between gap-2 flex-wrap\">\r\n <span>\r\n {{ kindLabel(activeJob.kind) }} export ready@if (activeJob.rowCount) { \u2014 {{ activeJob.rowCount }} row{{ activeJob.rowCount === 1 ? '' : 's' }} }.\r\n </span>\r\n <div class=\"d-flex gap-2\">\r\n <a [href]=\"activeJob.downloadUrl\" class=\"btn btn-sm btn-success\" target=\"_blank\" rel=\"noopener\">Download</a>\r\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"dismissResult()\">Dismiss</button>\r\n </div>\r\n </div>\r\n } @else if (activeJob.status === 'failed') {\r\n <div class=\"d-flex align-items-center justify-content-between gap-2 flex-wrap\">\r\n <span>{{ kindLabel(activeJob.kind) }} export failed: {{ activeJob.error || 'Unknown error' }}</span>\r\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"dismissResult()\">Dismiss</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (message) {\r\n <div\r\n class=\"mt-3 alert\"\r\n [class.alert-success]=\"messageType === 'success'\"\r\n [class.alert-danger]=\"messageType === 'error'\">\r\n {{ message }}\r\n </div>\r\n }\r\n </div>\r\n</section>\r\n", styles: [".store-exports .card{border:1px solid #e0e0e0}\n"] }]
233
234
  }], ctorParameters: () => [{ type: i1.StoreBuilderService }, { type: i2.GlobalStateService }] });
234
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtZXhwb3J0cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9wbGFuby10b29scy9zdG9yZS1leHBvcnRzL3N0b3JlLWV4cG9ydHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvc3RvcmUtZXhwb3J0cy9zdG9yZS1leHBvcnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFDTCxPQUFPLEVBQ1AsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxFQUFFLEVBQ0YsS0FBSyxFQUNMLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7Ozs7OztBQTJCZCxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQUNwQyxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUMvQixNQUFNLGVBQWUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQU92QyxNQUFNLE9BQU8scUJBQXFCO0lBbUJ0QjtJQUNBO0lBbkJWLFFBQVEsQ0FBUztJQUNqQixZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUNqQyxhQUFhLEdBQWtCLEVBQUUsQ0FBQztJQUNsQyxjQUFjLEdBQWtCLEVBQUUsQ0FBQztJQUNuQyxzQkFBc0IsR0FBa0IsRUFBRSxDQUFDO0lBQzNDLFlBQVksR0FBVyxFQUFFLENBQUM7SUFFMUIsUUFBUSxHQUFzQixJQUFJLENBQUM7SUFDbkMsU0FBUyxHQUFxQixJQUFJLENBQUM7SUFDbkMsUUFBUSxH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Q0FBQyxTQUFTO2dCQUNqQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsS0FBSyxFQUFFLDJDQUEyQzthQUNuRCxDQUFDO1NBQ0g7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUNkLHVHQUF1RyxFQUN2RyxPQUFPLENBQ1IsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBVyxFQUFFLElBQXlCO1FBQ2hELElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7d0dBdlFVLHFCQUFxQjs0RkFBckIscUJBQXFCLHlEQ2hEbEMsb2pLQWtIQTs7NEZEbEVhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgU3ViamVjdCxcclxuICB0YWtlVW50aWwsXHJcbiAgZGVib3VuY2VUaW1lLFxyXG4gIGZpbHRlcixcclxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcclxuICB0aW1lcixcclxuICBvZixcclxuICBFTVBUWSxcclxuICBzd2l0Y2hNYXAsXHJcbiAgY2F0Y2hFcnJvcixcclxufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBTdG9yZU9wdGlvbiB9IGZyb20gJy4uLy4uL2NvbGxlY3Rpb24tdXBkYXRlLWFpL2NvbXBvbmVudHMvc3RvcmUtc2VsZWN0L3N0b3JlLXNlbGVjdC5jb21wb25lbnQnO1xyXG5cclxudHlwZSBFeHBvcnRLaW5kID0gJ21icScgfCAnb3JkZXInO1xyXG50eXBlIEpvYlN0YXR1cyA9ICdydW5uaW5nJyB8ICdzdWNjZWVkZWQnIHwgJ2ZhaWxlZCc7XHJcblxyXG5pbnRlcmZhY2UgRXhwb3J0Sm9iIHtcclxuICBqb2JJZDogc3RyaW5nO1xyXG4gIGtpbmQ6IEV4cG9ydEtpbmQ7XHJcbiAgc3RhdHVzOiBKb2JTdGF0dXM7XHJcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xyXG4gIGNvbXBsZXRlZEF0Pzogc3RyaW5nIHwgbnVsbDtcclxuICBkb3dubG9hZFVybD86IHN0cmluZyB8IG51bGw7XHJcbiAgZXJyb3I/OiBzdHJpbmcgfCBudWxsO1xyXG4gIHJvd0NvdW50PzogbnVtYmVyIHwgbnVsbDtcclxuICBzdG9yZUNvdW50PzogbnVtYmVyIHwgbnVsbDtcclxufVxyXG5cclxuaW50ZXJmYWNlIEJ1c3lJbmZvIHtcclxuICBqb2JJZDogc3RyaW5nO1xyXG4gIGtpbmQ6IEV4cG9ydEtpbmQ7XHJcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xyXG4gIHN0b3JlQ291bnQ/OiBudW1iZXI7XHJcbn1cclxuXHJcbmNvbnN0IFBPTExfSU5JVElBTF9ERUxBWV9NUyA9IDE1MDAwO1xyXG5jb25zdCBQT0xMX0lOVEVSVkFMX01TID0gMTAwMDA7XHJcbmNvbnN0IFBPTExfVElNRU9VVF9NUyA9IDMwICogNjAgKiAxMDAwO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItc3RvcmUtZXhwb3J0cycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3N0b3JlLWV4cG9ydHMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9zdG9yZS1leHBvcnRzLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFN0b3JlRXhwb3J0c0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG4gIHN0b3JlT3B0aW9uczogU3RvcmVPcHRpb25bXSA9IFtdO1xyXG4gIGluaXRpYWxTdG9yZXM6IFN0b3JlT3B0aW9uW10gPSBbXTtcclxuICBzZWxlY3RlZFN0b3JlczogU3RvcmVPcHRpb25bXSA9IFtdO1xyXG4gIHNlbGVjdGVkUmV2aXNpb25TdG9yZXM6IFN0b3JlT3B0aW9uW10gPSBbXTtcclxuICByZXZpc2lvbk5hbWU6IHN0cmluZyA9ICcnO1xyXG5cclxuICBzdGFydGluZzogRXhwb3J0S2luZCB8IG51bGwgPSBudWxsO1xyXG4gIGFjdGl2ZUpvYjogRXhwb3J0Sm9iIHwgbnVsbCA9IG51bGw7XHJcbiAgYnVzeUluZm86IEJ1c3lJbmZvIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIG1lc3NhZ2U6IHN0cmluZyA9ICcnO1xyXG4gIG1lc3NhZ2VUeXBlOiAnc3VjY2VzcycgfCAnZXJyb3InID0gJ3N1Y2Nlc3MnO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHN0b3BQb2xsJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzYnM6IFN0b3JlQnVpbGRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIFN0b3JlIG9wdGlvbnMgY29tZSBmcm9tIHBsYW5vZ3JhbXMgYW5kIGRvbid0IGRlcGVuZCBvbiB0aGUgY2xpZW50L2RhdGUgZmlsdGVyLFxyXG4gICAgLy8gc28gbG9hZCB0aGVtIGltbWVkaWF0ZWx5LiBQcmV2aW91c2x5IGxvYWRTdG9yZXMoKSBvbmx5IHJhbiBpbnNpZGUgdGhlXHJcbiAgICAvLyBkYXRhUmFuZ2VWYWx1ZSBzdWJzY3JpcHRpb24sIHNvIHRoZSBsaXN0IHN0YXllZCBlbXB0eSAobm8gZHJvcGRvd24sIG5vXHJcbiAgICAvLyB0eXBlLXRvLW1hdGNoKSB3aGVuZXZlciB0aGF0IG9ic2VydmFibGUgZGlkbid0IGVtaXQgb24gdGhpcyBwYWdlLlxyXG4gICAgdGhpcy5sb2FkU3RvcmVzKCk7XHJcblxyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDIwMCksXHJcbiAgICAgICAgZmlsdGVyKChkYXRhKSA9PiAhIWRhdGEpLFxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGE/LmNsaWVudCkge1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGRhdGEuY2xpZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBoZWFkZXJEYXRhID0gSlNPTi5wYXJzZShcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJykgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9hZFN0b3JlcygpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWRTdG9yZXMoKSB7XHJcbiAgICB0aGlzLnNic1xyXG4gICAgICAuZ2V0U3RvcmVPckNsdXN0ZXJMaXN0KHsgc2VhcmNoTW9kZTogJ3N0b3JlJyB9KVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXM/LmRhdGEpIHRoaXMuc3RvcmVPcHRpb25zID0gcmVzLmRhdGE7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25TdG9yZXNTZWxlY3RlZChzdG9yZXM6IFN0b3JlT3B0aW9uW10pIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZXMgPSBzdG9yZXM7XHJcbiAgfVxyXG5cclxuICBvblJldmlzaW9uU3RvcmVzU2VsZWN0ZWQoc3RvcmVzOiBTdG9yZU9wdGlvbltdKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkUmV2aXNpb25TdG9yZXMgPSBzdG9yZXM7XHJcbiAgfVxyXG5cclxuICBnZXQgdG90YWxTZWxlY3RlZFN0b3JlcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRTdG9yZXMubGVuZ3RoICsgdGhpcy5zZWxlY3RlZFJldmlzaW9uU3RvcmVzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIG9uRXhwb3J0TWJxKCkge1xyXG4gICAgdGhpcy5ydW5FeHBvcnQoJ21icScpO1xyXG4gIH1cclxuXHJcbiAgb25FeHBvcnRPcmRlclNoZWV0KCkge1xyXG4gICAgdGhpcy5ydW5FeHBvcnQoJ29yZGVyJyk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNXb3JraW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhcnRpbmcgIT09IG51bGwgfHwgdGhpcy5hY3RpdmVKb2I/LnN0YXR1cyA9PT0gJ3J1bm5pbmcnO1xyXG4gIH1cclxuXHJcbiAga2luZExhYmVsKGtpbmQ6IEV4cG9ydEtpbmQgfCB1bmRlZmluZWQgfCBudWxsKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBraW5kID09PSAnbWJxJyA/ICdNQlEnIDoga2luZCA9PT0gJ29yZGVyJyA/ICdPcmRlciBTaGVldCcgOiAnRXhwb3J0JztcclxuICB9XHJcblxyXG4gIHN0YXJ0ZWRBZ28oaXNvPzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWlzbykgcmV0dXJuICcnO1xyXG4gICAgY29uc3QgbXMgPSBEYXRlLm5vdygpIC0gbmV3IERhdGUoaXNvKS5nZXRUaW1lKCk7XHJcbiAgICBpZiAobXMgPCA2MF8wMDApIHJldHVybiBgJHtNYXRoLm1heCgwLCBNYXRoLmZsb29yKG1zIC8gMTAwMCkpfXMgYWdvYDtcclxuICAgIGlmIChtcyA8IDNfNjAwXzAwMCkgcmV0dXJuIGAke01hdGguZmxvb3IobXMgLyA2MF8wMDApfW0gYWdvYDtcclxuICAgIHJldHVybiBgJHtNYXRoLmZsb29yKG1zIC8gM182MDBfMDAwKX1oIGFnb2A7XHJcbiAgfVxyXG5cclxuICBkaXNtaXNzUmVzdWx0KCkge1xyXG4gICAgdGhpcy5hY3RpdmVKb2IgPSBudWxsO1xyXG4gICAgdGhpcy5idXN5SW5mbyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJ1bkV4cG9ydChraW5kOiBFeHBvcnRLaW5kKSB7XHJcbiAgICBpZiAodGhpcy5pc1dvcmtpbmcpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBsaXZlU3RvcmVzID0gdGhpcy5zZWxlY3RlZFN0b3Jlcy5tYXAoKHMpID0+IHMubGFiZWwpO1xyXG4gICAgY29uc3QgcmV2aXNpb25TdG9yZXMgPSB0aGlzLnNlbGVjdGVkUmV2aXNpb25TdG9yZXMubWFwKChzKSA9PiBzLmxhYmVsKTtcclxuICAgIGNvbnN0IHJldmlzaW9uTmFtZSA9IHRoaXMucmV2aXNpb25OYW1lLnRyaW0oKTtcclxuXHJcbiAgICBpZiAobGl2ZVN0b3Jlcy5sZW5ndGggPT09IDAgJiYgcmV2aXNpb25TdG9yZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuc2hvd01lc3NhZ2UoJ1BsZWFzZSBzZWxlY3QgYXQgbGVhc3Qgb25lIHN0b3JlLicsICdlcnJvcicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAocmV2aXNpb25TdG9yZXMubGVuZ3RoID4gMCAmJiAhcmV2aXNpb25OYW1lKSB7XHJcbiAgICAgIHRoaXMuc2hvd01lc3NhZ2UoJ0VudGVyIGEgcmV2aXNpb24gbmFtZSBmb3IgdGhlIHJldmlzaW9uIHN0b3Jlcy4nLCAnZXJyb3InKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHsgc3RvcmVOYW1lOiBsaXZlU3RvcmVzIH07XHJcbiAgICBpZiAocmV2aXNpb25TdG9yZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBwYXlsb2FkLnJldmlzaW9uU3RvcmVzID0gcmV2aXNpb25TdG9yZXM7XHJcbiAgICAgIHBheWxvYWQucmV2aXNpb25OYW1lID0gcmV2aXNpb25OYW1lO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdG90YWxTdG9yZXMgPSBsaXZlU3RvcmVzLmxlbmd0aCArIHJldmlzaW9uU3RvcmVzLmxlbmd0aDtcclxuICAgIHRoaXMuYnVzeUluZm8gPSBudWxsO1xyXG4gICAgdGhpcy5hY3RpdmVKb2IgPSBudWxsO1xyXG4gICAgdGhpcy5zdGFydGluZyA9IGtpbmQ7XHJcbiAgICB0aGlzLm1lc3NhZ2UgPSAnJztcclxuXHJcbiAgICBjb25zdCBzdWJtaXQkID1cclxuICAgICAga2luZCA9PT0gJ21icSdcclxuICAgICAgICA/IHRoaXMuc2JzLmV4cG9ydE1CUVNoZWV0QXN5bmMocGF5bG9hZClcclxuICAgICAgICA6IHRoaXMuc2JzLmV4cG9ydFBsYW5vT3JkZXJTaGVldEFzeW5jKHBheWxvYWQpO1xyXG5cclxuICAgIHN1Ym1pdCQuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlc3A6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RhcnRpbmcgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGJvZHkgPSByZXNwPy5ib2R5ID8/IHJlc3A7XHJcbiAgICAgICAgY29uc3Qgam9iSWQgPSBib2R5Py5kYXRhPy5qb2JJZDtcclxuICAgICAgICBpZiAoIWpvYklkKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKFxyXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN0YXJ0ICR7dGhpcy5raW5kTGFiZWwoa2luZCl9IGV4cG9ydCDigJQgc2VydmVyIGRpZCBub3QgcmV0dXJuIGEgam9iSWQuYCxcclxuICAgICAgICAgICAgJ2Vycm9yJyxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWN0aXZlSm9iID0ge1xyXG4gICAgICAgICAgam9iSWQsXHJcbiAgICAgICAgICBraW5kLFxyXG4gICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXHJcbiAgICAgICAgICBzdGFydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgIHN0b3JlQ291bnQ6IHRvdGFsU3RvcmVzLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zdGFydFBvbGxpbmcoam9iSWQpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdGFydGluZyA9IG51bGw7XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gZXJyPy5zdGF0dXM7XHJcbiAgICAgICAgY29uc3QgcmVzcEJvZHkgPSBlcnI/LmVycm9yO1xyXG4gICAgICAgIGlmIChzdGF0dXMgPT09IDQwOSAmJiByZXNwQm9keT8uZGF0YT8uam9iSWQpIHtcclxuICAgICAgICAgIHRoaXMuYnVzeUluZm8gPSB7XHJcbiAgICAgICAgICAgIGpvYklkOiByZXNwQm9keS5kYXRhLmpvYklkLFxyXG4gICAgICAgICAgICBraW5kOiByZXNwQm9keS5kYXRhLmtpbmQsXHJcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogcmVzcEJvZHkuZGF0YS5zdGFydGVkQXQsXHJcbiAgICAgICAgICAgIHN0b3JlQ291bnQ6IHJlc3BCb2R5LmRhdGEuc3RvcmVDb3VudCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGVyck1zZyA9XHJcbiAgICAgICAgICAgICh0eXBlb2YgcmVzcEJvZHk/LmVycm9yID09PSAnc3RyaW5nJyAmJiByZXNwQm9keS5lcnJvcikgfHxcclxuICAgICAgICAgICAgcmVzcEJvZHk/LmVycm9yPy5tZXNzYWdlIHx8XHJcbiAgICAgICAgICAgIHJlc3BCb2R5Py5tZXNzYWdlIHx8XHJcbiAgICAgICAgICAgIGVycj8ubWVzc2FnZSB8fFxyXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN0YXJ0ICR7dGhpcy5raW5kTGFiZWwoa2luZCl9IGV4cG9ydC5gO1xyXG4gICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShlcnJNc2csICdlcnJvcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGFydFBvbGxpbmcoam9iSWQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5zdG9wUG9sbCQubmV4dCgpO1xyXG4gICAgY29uc3QgcG9sbFN0YXJ0ZWQgPSBEYXRlLm5vdygpO1xyXG4gICAgdGltZXIoUE9MTF9JTklUSUFMX0RFTEFZX01TLCBQT0xMX0lOVEVSVkFMX01TKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuc3RvcFBvbGwkKSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cclxuICAgICAgICAgIHRoaXMuc2JzLmdldFBsYW5vRXhwb3J0Sm9iKGpvYklkKS5waXBlKFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHBvbGxTdGFydGVkID4gUE9MTF9USU1FT1VUX01TKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVBvbGxUaW1lb3V0KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIXJlcykgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGpvYiA9IHJlcz8uZGF0YTtcclxuICAgICAgICBpZiAoIWpvYikgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlSm9iID0ge1xyXG4gICAgICAgICAgam9iSWQ6IGpvYi5qb2JJZCxcclxuICAgICAgICAgIGtpbmQ6IGpvYi5raW5kLFxyXG4gICAgICAgICAgc3RhdHVzOiBqb2Iuc3RhdHVzLFxyXG4gICAgICAgICAgc3RhcnRlZEF0OiBqb2Iuc3RhcnRlZEF0LFxyXG4gICAgICAgICAgY29tcGxldGVkQXQ6IGpvYi5jb21wbGV0ZWRBdCxcclxuICAgICAgICAgIGRvd25sb2FkVXJsOiBqb2IuZG93bmxvYWRVcmwsXHJcbiAgICAgICAgICBlcnJvcjogam9iLmVycm9yLFxyXG4gICAgICAgICAgcm93Q291bnQ6IGpvYi5yb3dDb3VudCxcclxuICAgICAgICAgIHN0b3JlQ291bnQ6IGpvYi5zdG9yZUNvdW50LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKGpvYi5zdGF0dXMgPT09ICdzdWNjZWVkZWQnKSB7XHJcbiAgICAgICAgICB0aGlzLnN0b3BQb2xsJC5uZXh0KCk7XHJcbiAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKFxyXG4gICAgICAgICAgICBgJHt0aGlzLmtpbmRMYWJlbChqb2Iua2luZCl9IGV4cG9ydCBpcyByZWFkeS5gLFxyXG4gICAgICAgICAgICAnc3VjY2VzcycsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoam9iLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcclxuICAgICAgICAgIHRoaXMuc3RvcFBvbGwkLm5leHQoKTtcclxuICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoXHJcbiAgICAgICAgICAgIGAke3RoaXMua2luZExhYmVsKGpvYi5raW5kKX0gZXhwb3J0IGZhaWxlZDogJHtcclxuICAgICAgICAgICAgICBqb2IuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InXHJcbiAgICAgICAgICAgIH1gLFxyXG4gICAgICAgICAgICAnZXJyb3InLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgam9iLnN0YXR1cyA9PT0gJ3J1bm5pbmcnICYmXHJcbiAgICAgICAgICBEYXRlLm5vdygpIC0gcG9sbFN0YXJ0ZWQgPiBQT0xMX1RJTUVPVVRfTVNcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlUG9sbFRpbWVvdXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVQb2xsVGltZW91dCgpIHtcclxuICAgIHRoaXMuc3RvcFBvbGwkLm5leHQoKTtcclxuICAgIGlmICh0aGlzLmFjdGl2ZUpvYikge1xyXG4gICAgICB0aGlzLmFjdGl2ZUpvYiA9IHtcclxuICAgICAgICAuLi50aGlzLmFjdGl2ZUpvYixcclxuICAgICAgICBzdGF0dXM6ICdmYWlsZWQnLFxyXG4gICAgICAgIGVycm9yOiAnVGltZWQgb3V0IHdhaXRpbmcgZm9yIGV4cG9ydCB0byBjb21wbGV0ZS4nLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgdGhpcy5zaG93TWVzc2FnZShcclxuICAgICAgJ1RpbWVkIG91dCB3YWl0aW5nIGZvciBleHBvcnQgdG8gY29tcGxldGUuIFRoZSBqb2IgbWF5IHN0aWxsIGJlIHJ1bm5pbmcgb24gdGhlIHNlcnZlciDigJQgcmVmcmVzaCBsYXRlci4nLFxyXG4gICAgICAnZXJyb3InLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHNob3dNZXNzYWdlKG1zZzogc3RyaW5nLCB0eXBlOiAnc3VjY2VzcycgfCAnZXJyb3InKSB7XHJcbiAgICB0aGlzLm1lc3NhZ2UgPSBtc2c7XHJcbiAgICB0aGlzLm1lc3NhZ2VUeXBlID0gdHlwZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMubWVzc2FnZSA9ICcnKSwgNjAwMCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcFBvbGwkLm5leHQoKTtcclxuICAgIHRoaXMuc3RvcFBvbGwkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPHNlY3Rpb24gY2xhc3M9XCJzdG9yZS1leHBvcnRzIHAtM1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJjYXJkIHAtNFwiIHN0eWxlPVwibWF4LXdpZHRoOiA3MDBweDtcIj5cclxuICAgIDxoNSBjbGFzcz1cIm1iLTFcIj5TdG9yZSBFeHBvcnRzPC9oNT5cclxuICAgIDxwIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtYi0zXCI+XHJcbiAgICAgIEdlbmVyYXRlIHBlci1zdG9yZSBmaXh0dXJlIGV4cG9ydHMuIFNlbGVjdCBvbmUgb3IgbW9yZSBzdG9yZXMsIHRoZW4gY2hvb3NlIGFuIGV4cG9ydC5cclxuICAgICAgTGFyZ2UgZXhwb3J0cyBydW4gaW4gdGhlIGJhY2tncm91bmQgYW5kIGFyZSBzYXZlZCB0byBTMyDigJQgYSBkb3dubG9hZCBsaW5rIGFwcGVhcnMgaGVyZSB3aGVuIHJlYWR5LlxyXG4gICAgPC9wPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5TdG9yZXMg4oCUIE1hbmFnZSBQbGFub2dyYW0gKGxpdmUpPC9sYWJlbD5cclxuICAgICAgPGxpYi1zdG9yZS1zZWxlY3RcclxuICAgICAgICBbb3B0aW9uc109XCJzdG9yZU9wdGlvbnNcIlxyXG4gICAgICAgIFtpbml0aWFsU2VsZWN0ZWRdPVwiaW5pdGlhbFN0b3Jlc1wiXHJcbiAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cIm9uU3RvcmVzU2VsZWN0ZWQoJGV2ZW50KVwiPlxyXG4gICAgICA8L2xpYi1zdG9yZS1zZWxlY3Q+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U3RvcmVzIOKAlCBmcm9tIGEgUmV2aXNpb248L2xhYmVsPlxyXG4gICAgICA8bGliLXN0b3JlLXNlbGVjdFxyXG4gICAgICAgIFtvcHRpb25zXT1cInN0b3JlT3B0aW9uc1wiXHJcbiAgICAgICAgW2luaXRpYWxTZWxlY3RlZF09XCJpbml0aWFsU3RvcmVzXCJcclxuICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwib25SZXZpc2lvblN0b3Jlc1NlbGVjdGVkKCRldmVudClcIj5cclxuICAgICAgPC9saWItc3RvcmUtc2VsZWN0PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlJldmlzaW9uIG5hbWU8L2xhYmVsPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgIFsobmdNb2RlbCldPVwicmV2aXNpb25OYW1lXCJcclxuICAgICAgICBuYW1lPVwicmV2aXNpb25OYW1lXCJcclxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBRMS0yMDI2IExheW91dFwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzV29ya2luZ1wiIC8+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHRcIj5cclxuICAgICAgICBBcHBsaWVzIHRvIHRoZSDigJxmcm9tIGEgUmV2aXNpb27igJ0gc3RvcmVzIGFib3ZlIOKAlCBlYWNoIGlzIGV4cG9ydGVkIGZyb20gaXRzIHJldmlzaW9uIHdpdGggdGhpcyBleGFjdCBuYW1lIChzdG9yZXMgd2l0aG91dCBpdCBhcmUgc2tpcHBlZCkuIExpdmUgc3RvcmVzIHVzZSBjdXJyZW50IGRhdGE7IGJvdGggc2V0cyBhcmUgY29tYmluZWQgaW50byBvbmUgZXhwb3J0LlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTIgZmxleC13cmFwXCI+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uRXhwb3J0TWJxKClcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc1dvcmtpbmcgfHwgdG90YWxTZWxlY3RlZFN0b3JlcyA9PT0gMFwiPlxyXG4gICAgICAgIEBpZiAoc3RhcnRpbmcgPT09ICdtYnEnKSB7XHJcbiAgICAgICAgICBTdGFydGluZyBNQlEuLi5cclxuICAgICAgICB9IEBlbHNlIGlmIChhY3RpdmVKb2I/LnN0YXR1cyA9PT0gJ3J1bm5pbmcnICYmIGFjdGl2ZUpvYj8ua2luZCA9PT0gJ21icScpIHtcclxuICAgICAgICAgIFJ1bm5pbmcgTUJRLi4uXHJcbiAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICBFeHBvcnQgTUJRXHJcbiAgICAgICAgfVxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICBjbGFzcz1cImJ0biBidG4tc3VjY2Vzc1wiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uRXhwb3J0T3JkZXJTaGVldCgpXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNXb3JraW5nIHx8IHRvdGFsU2VsZWN0ZWRTdG9yZXMgPT09IDBcIj5cclxuICAgICAgICBAaWYgKHN0YXJ0aW5nID09PSAnb3JkZXInKSB7XHJcbiAgICAgICAgICBTdGFydGluZyBPcmRlciBTaGVldC4uLlxyXG4gICAgICAgIH0gQGVsc2UgaWYgKGFjdGl2ZUpvYj8uc3RhdHVzID09PSAncnVubmluZycgJiYgYWN0aXZlSm9iPy5raW5kID09PSAnb3JkZXInKSB7XHJcbiAgICAgICAgICBSdW5uaW5nIE9yZGVyIFNoZWV0Li4uXHJcbiAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICBFeHBvcnQgT3JkZXIgU2hlZXRcclxuICAgICAgICB9XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgQGlmIChidXN5SW5mbykge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwibXQtMyBhbGVydCBhbGVydC13YXJuaW5nXCI+XHJcbiAgICAgICAgQW5vdGhlciB7eyBraW5kTGFiZWwoYnVzeUluZm8ua2luZCkgfX0gZXhwb3J0IGlzIGN1cnJlbnRseSBydW5uaW5nQGlmIChidXN5SW5mby5zdG9yZUNvdW50KSB7ICh7eyBidXN5SW5mby5zdG9yZUNvdW50IH19IHN0b3Jle3sgYnVzeUluZm8uc3RvcmVDb3VudCA9PT0gMSA/ICcnIDogJ3MnIH19KSB9QGlmIChidXN5SW5mby5zdGFydGVkQXQpIHssIHN0YXJ0ZWQge3sgc3RhcnRlZEFnbyhidXN5SW5mby5zdGFydGVkQXQpIH19fS4gUGxlYXNlIHdhaXQgdW50aWwgaXQgZmluaXNoZXMgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IGV4cG9ydC5cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgQGlmIChhY3RpdmVKb2IpIHtcclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwibXQtMyBhbGVydFwiXHJcbiAgICAgICAgW2NsYXNzLmFsZXJ0LWluZm9dPVwiYWN0aXZlSm9iLnN0YXR1cyA9PT0gJ3J1bm5pbmcnXCJcclxuICAgICAgICBbY2xhc3MuYWxlcnQtc3VjY2Vzc109XCJhY3RpdmVKb2Iuc3RhdHVzID09PSAnc3VjY2VlZGVkJ1wiXHJcbiAgICAgICAgW2NsYXNzLmFsZXJ0LWRhbmdlcl09XCJhY3RpdmVKb2Iuc3RhdHVzID09PSAnZmFpbGVkJ1wiPlxyXG4gICAgICAgIEBpZiAoYWN0aXZlSm9iLnN0YXR1cyA9PT0gJ3J1bm5pbmcnKSB7XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICB7eyBraW5kTGFiZWwoYWN0aXZlSm9iLmtpbmQpIH19IGV4cG9ydCBpcyBwcm9jZXNzaW5nQGlmIChhY3RpdmVKb2Iuc3RvcmVDb3VudCkgeyAoe3sgYWN0aXZlSm9iLnN0b3JlQ291bnQgfX0gc3RvcmV7eyBhY3RpdmVKb2Iuc3RvcmVDb3VudCA9PT0gMSA/ICcnIDogJ3MnIH19KSB9LiBTdGFydGVkIHt7IHN0YXJ0ZWRBZ28oYWN0aXZlSm9iLnN0YXJ0ZWRBdCkgfX0uIEtlZXAgdGhpcyBwYWdlIG9wZW4g4oCUIGEgZG93bmxvYWQgbGluayB3aWxsIGFwcGVhciB3aGVuIGl0IGZpbmlzaGVzLlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfSBAZWxzZSBpZiAoYWN0aXZlSm9iLnN0YXR1cyA9PT0gJ3N1Y2NlZWRlZCcgJiYgYWN0aXZlSm9iLmRvd25sb2FkVXJsKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBnYXAtMiBmbGV4LXdyYXBcIj5cclxuICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAge3sga2luZExhYmVsKGFjdGl2ZUpvYi5raW5kKSB9fSBleHBvcnQgcmVhZHlAaWYgKGFjdGl2ZUpvYi5yb3dDb3VudCkgeyDigJQge3sgYWN0aXZlSm9iLnJvd0NvdW50IH19IHJvd3t7IGFjdGl2ZUpvYi5yb3dDb3VudCA9PT0gMSA/ICcnIDogJ3MnIH19IH0uXHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgIDxhIFtocmVmXT1cImFjdGl2ZUpvYi5kb3dubG9hZFVybFwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc3VjY2Vzc1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCI+RG93bmxvYWQ8L2E+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImRpc21pc3NSZXN1bHQoKVwiPkRpc21pc3M8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9IEBlbHNlIGlmIChhY3RpdmVKb2Iuc3RhdHVzID09PSAnZmFpbGVkJykge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gZ2FwLTIgZmxleC13cmFwXCI+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IGtpbmRMYWJlbChhY3RpdmVKb2Iua2luZCkgfX0gZXhwb3J0IGZhaWxlZDoge3sgYWN0aXZlSm9iLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImRpc21pc3NSZXN1bHQoKVwiPkRpc21pc3M8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgQGlmIChtZXNzYWdlKSB7XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cIm10LTMgYWxlcnRcIlxyXG4gICAgICAgIFtjbGFzcy5hbGVydC1zdWNjZXNzXT1cIm1lc3NhZ2VUeXBlID09PSAnc3VjY2VzcydcIlxyXG4gICAgICAgIFtjbGFzcy5hbGVydC1kYW5nZXJdPVwibWVzc2FnZVR5cGUgPT09ICdlcnJvcidcIj5cclxuICAgICAgICB7eyBtZXNzYWdlIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcbiJdfQ==
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtZXhwb3J0cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9wbGFuby10b29scy9zdG9yZS1leHBvcnRzL3N0b3JlLWV4cG9ydHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvc3RvcmUtZXhwb3J0cy9zdG9yZS1leHBvcnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFDTCxPQUFPLEVBQ1AsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxFQUFFLEVBQ0YsS0FBSyxFQUNMLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7QUEyQmQsTUFBTSxxQkFBcUIsR0FBRyxLQUFLLENBQUM7QUFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFDL0IsTUFBTSxlQUFlLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFPdkMsTUFBTSxPQUFPLHFCQUFxQjtJQW1CdEI7SUFDQTtJQW5CVixRQUFRLENBQVM7SUFDakIsWUFBWSxHQUFrQixFQUFFLENBQUM7SUFDakMsYUFBYSxHQUFrQixFQUFFLENBQUM7SUFDbEMsY0FBYyxHQUFrQixFQUFFLENBQUM7SUFDbkMsc0JBQXNCLEdBQWtCLEVBQUUsQ0FBQztJQUMzQyxZQUFZLEdBQVcsRUFBRSxDQUFDO0lBRTFCLFFBQVEsR0FBc0IsSUFBSSxDQUFDO0lBQ25DLFNBQVMsR0FBcUIsSUFBSSxDQUFDO0lBQ25DLFFBQVEs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LENBQUMsU0FBUztnQkFDakIsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLEtBQUssRUFBRSwyQ0FBMkM7YUFDbkQsQ0FBQztTQUNIO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FDZCx1R0FBdUcsRUFDdkcsT0FBTyxDQUNSLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQVcsRUFBRSxJQUF5QjtRQUNoRCxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQXZRVSxxQkFBcUI7NEZBQXJCLHFCQUFxQix5RENoRGxDLDJpS0FpSEE7OzRGRGpFYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIFN1YmplY3QsXHJcbiAgdGFrZVVudGlsLFxyXG4gIGRlYm91bmNlVGltZSxcclxuICBmaWx0ZXIsXHJcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXHJcbiAgdGltZXIsXHJcbiAgb2YsXHJcbiAgRU1QVFksXHJcbiAgc3dpdGNoTWFwLFxyXG4gIGNhdGNoRXJyb3IsXHJcbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFN0b3JlQnVpbGRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgU3RvcmVPcHRpb24gfSBmcm9tICcuLi8uLi9jb2xsZWN0aW9uLXVwZGF0ZS1haS9jb21wb25lbnRzL3N0b3JlLXNlbGVjdC9zdG9yZS1zZWxlY3QuY29tcG9uZW50JztcclxuXHJcbnR5cGUgRXhwb3J0S2luZCA9ICdtYnEnIHwgJ29yZGVyJztcclxudHlwZSBKb2JTdGF0dXMgPSAncnVubmluZycgfCAnc3VjY2VlZGVkJyB8ICdmYWlsZWQnO1xyXG5cclxuaW50ZXJmYWNlIEV4cG9ydEpvYiB7XHJcbiAgam9iSWQ6IHN0cmluZztcclxuICBraW5kOiBFeHBvcnRLaW5kO1xyXG4gIHN0YXR1czogSm9iU3RhdHVzO1xyXG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcclxuICBjb21wbGV0ZWRBdD86IHN0cmluZyB8IG51bGw7XHJcbiAgZG93bmxvYWRVcmw/OiBzdHJpbmcgfCBudWxsO1xyXG4gIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcclxuICByb3dDb3VudD86IG51bWJlciB8IG51bGw7XHJcbiAgc3RvcmVDb3VudD86IG51bWJlciB8IG51bGw7XHJcbn1cclxuXHJcbmludGVyZmFjZSBCdXN5SW5mbyB7XHJcbiAgam9iSWQ6IHN0cmluZztcclxuICBraW5kOiBFeHBvcnRLaW5kO1xyXG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcclxuICBzdG9yZUNvdW50PzogbnVtYmVyO1xyXG59XHJcblxyXG5jb25zdCBQT0xMX0lOSVRJQUxfREVMQVlfTVMgPSAxNTAwMDtcclxuY29uc3QgUE9MTF9JTlRFUlZBTF9NUyA9IDEwMDAwO1xyXG5jb25zdCBQT0xMX1RJTUVPVVRfTVMgPSAzMCAqIDYwICogMTAwMDtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXN0b3JlLWV4cG9ydHMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zdG9yZS1leHBvcnRzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc3RvcmUtZXhwb3J0cy5jb21wb25lbnQuc2NzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdG9yZUV4cG9ydHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuICBzdG9yZU9wdGlvbnM6IFN0b3JlT3B0aW9uW10gPSBbXTtcclxuICBpbml0aWFsU3RvcmVzOiBTdG9yZU9wdGlvbltdID0gW107XHJcbiAgc2VsZWN0ZWRTdG9yZXM6IFN0b3JlT3B0aW9uW10gPSBbXTtcclxuICBzZWxlY3RlZFJldmlzaW9uU3RvcmVzOiBTdG9yZU9wdGlvbltdID0gW107XHJcbiAgcmV2aXNpb25OYW1lOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgc3RhcnRpbmc6IEV4cG9ydEtpbmQgfCBudWxsID0gbnVsbDtcclxuICBhY3RpdmVKb2I6IEV4cG9ydEpvYiB8IG51bGwgPSBudWxsO1xyXG4gIGJ1c3lJbmZvOiBCdXN5SW5mbyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBtZXNzYWdlOiBzdHJpbmcgPSAnJztcclxuICBtZXNzYWdlVHlwZTogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyA9ICdzdWNjZXNzJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9wUG9sbCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgc2JzOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAvLyBTdG9yZSBvcHRpb25zIGNvbWUgZnJvbSBwbGFub2dyYW1zIGFuZCBkb24ndCBkZXBlbmQgb24gdGhlIGNsaWVudC9kYXRlIGZpbHRlcixcclxuICAgIC8vIHNvIGxvYWQgdGhlbSBpbW1lZGlhdGVseS4gUHJldmlvdXNseSBsb2FkU3RvcmVzKCkgb25seSByYW4gaW5zaWRlIHRoZVxyXG4gICAgLy8gZGF0YVJhbmdlVmFsdWUgc3Vic2NyaXB0aW9uLCBzbyB0aGUgbGlzdCBzdGF5ZWQgZW1wdHkgKG5vIGRyb3Bkb3duLCBub1xyXG4gICAgLy8gdHlwZS10by1tYXRjaCkgd2hlbmV2ZXIgdGhhdCBvYnNlcnZhYmxlIGRpZG4ndCBlbWl0IG9uIHRoaXMgcGFnZS5cclxuICAgIHRoaXMubG9hZFN0b3JlcygpO1xyXG5cclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICAgIGRlYm91bmNlVGltZSgyMDApLFxyXG4gICAgICAgIGZpbHRlcigoZGF0YSkgPT4gISFkYXRhKSxcclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhPy5jbGllbnQpIHtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhLmNsaWVudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgaGVhZGVyRGF0YSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoZWFkZXItZmlsdGVycycpIGFzIHN0cmluZyxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gaGVhZGVyRGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvYWRTdG9yZXMoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBsb2FkU3RvcmVzKCkge1xyXG4gICAgdGhpcy5zYnNcclxuICAgICAgLmdldFN0b3JlT3JDbHVzdGVyTGlzdCh7IHNlYXJjaE1vZGU6ICdzdG9yZScgfSlcclxuICAgICAgLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzPy5kYXRhKSB0aGlzLnN0b3JlT3B0aW9ucyA9IHJlcy5kYXRhO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uU3RvcmVzU2VsZWN0ZWQoc3RvcmVzOiBTdG9yZU9wdGlvbltdKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmVzID0gc3RvcmVzO1xyXG4gIH1cclxuXHJcbiAgb25SZXZpc2lvblN0b3Jlc1NlbGVjdGVkKHN0b3JlczogU3RvcmVPcHRpb25bXSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFJldmlzaW9uU3RvcmVzID0gc3RvcmVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRvdGFsU2VsZWN0ZWRTdG9yZXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkU3RvcmVzLmxlbmd0aCArIHRoaXMuc2VsZWN0ZWRSZXZpc2lvblN0b3Jlcy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBvbkV4cG9ydE1icSgpIHtcclxuICAgIHRoaXMucnVuRXhwb3J0KCdtYnEnKTtcclxuICB9XHJcblxyXG4gIG9uRXhwb3J0T3JkZXJTaGVldCgpIHtcclxuICAgIHRoaXMucnVuRXhwb3J0KCdvcmRlcicpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzV29ya2luZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXJ0aW5nICE9PSBudWxsIHx8IHRoaXMuYWN0aXZlSm9iPy5zdGF0dXMgPT09ICdydW5uaW5nJztcclxuICB9XHJcblxyXG4gIGtpbmRMYWJlbChraW5kOiBFeHBvcnRLaW5kIHwgdW5kZWZpbmVkIHwgbnVsbCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gJ21icScgPyAnTUJRJyA6IGtpbmQgPT09ICdvcmRlcicgPyAnT3JkZXIgU2hlZXQnIDogJ0V4cG9ydCc7XHJcbiAgfVxyXG5cclxuICBzdGFydGVkQWdvKGlzbz86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFpc28pIHJldHVybiAnJztcclxuICAgIGNvbnN0IG1zID0gRGF0ZS5ub3coKSAtIG5ldyBEYXRlKGlzbykuZ2V0VGltZSgpO1xyXG4gICAgaWYgKG1zIDwgNjBfMDAwKSByZXR1cm4gYCR7TWF0aC5tYXgoMCwgTWF0aC5mbG9vcihtcyAvIDEwMDApKX1zIGFnb2A7XHJcbiAgICBpZiAobXMgPCAzXzYwMF8wMDApIHJldHVybiBgJHtNYXRoLmZsb29yKG1zIC8gNjBfMDAwKX1tIGFnb2A7XHJcbiAgICByZXR1cm4gYCR7TWF0aC5mbG9vcihtcyAvIDNfNjAwXzAwMCl9aCBhZ29gO1xyXG4gIH1cclxuXHJcbiAgZGlzbWlzc1Jlc3VsdCgpIHtcclxuICAgIHRoaXMuYWN0aXZlSm9iID0gbnVsbDtcclxuICAgIHRoaXMuYnVzeUluZm8gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBydW5FeHBvcnQoa2luZDogRXhwb3J0S2luZCkge1xyXG4gICAgaWYgKHRoaXMuaXNXb3JraW5nKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgbGl2ZVN0b3JlcyA9IHRoaXMuc2VsZWN0ZWRTdG9yZXMubWFwKChzKSA9PiBzLmxhYmVsKTtcclxuICAgIGNvbnN0IHJldmlzaW9uU3RvcmVzID0gdGhpcy5zZWxlY3RlZFJldmlzaW9uU3RvcmVzLm1hcCgocykgPT4gcy5sYWJlbCk7XHJcbiAgICBjb25zdCByZXZpc2lvbk5hbWUgPSB0aGlzLnJldmlzaW9uTmFtZS50cmltKCk7XHJcblxyXG4gICAgaWYgKGxpdmVTdG9yZXMubGVuZ3RoID09PSAwICYmIHJldmlzaW9uU3RvcmVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnNob3dNZXNzYWdlKCdQbGVhc2Ugc2VsZWN0IGF0IGxlYXN0IG9uZSBzdG9yZS4nLCAnZXJyb3InKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHJldmlzaW9uU3RvcmVzLmxlbmd0aCA+IDAgJiYgIXJldmlzaW9uTmFtZSkge1xyXG4gICAgICB0aGlzLnNob3dNZXNzYWdlKCdFbnRlciBhIHJldmlzaW9uIG5hbWUgZm9yIHRoZSByZXZpc2lvbiBzdG9yZXMuJywgJ2Vycm9yJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7IHN0b3JlTmFtZTogbGl2ZVN0b3JlcyB9O1xyXG4gICAgaWYgKHJldmlzaW9uU3RvcmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcGF5bG9hZC5yZXZpc2lvblN0b3JlcyA9IHJldmlzaW9uU3RvcmVzO1xyXG4gICAgICBwYXlsb2FkLnJldmlzaW9uTmFtZSA9IHJldmlzaW9uTmFtZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRvdGFsU3RvcmVzID0gbGl2ZVN0b3Jlcy5sZW5ndGggKyByZXZpc2lvblN0b3Jlcy5sZW5ndGg7XHJcbiAgICB0aGlzLmJ1c3lJbmZvID0gbnVsbDtcclxuICAgIHRoaXMuYWN0aXZlSm9iID0gbnVsbDtcclxuICAgIHRoaXMuc3RhcnRpbmcgPSBraW5kO1xyXG4gICAgdGhpcy5tZXNzYWdlID0gJyc7XHJcblxyXG4gICAgY29uc3Qgc3VibWl0JCA9XHJcbiAgICAgIGtpbmQgPT09ICdtYnEnXHJcbiAgICAgICAgPyB0aGlzLnNicy5leHBvcnRNQlFTaGVldEFzeW5jKHBheWxvYWQpXHJcbiAgICAgICAgOiB0aGlzLnNicy5leHBvcnRQbGFub09yZGVyU2hlZXRBc3luYyhwYXlsb2FkKTtcclxuXHJcbiAgICBzdWJtaXQkLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXNwOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnN0YXJ0aW5nID0gbnVsbDtcclxuICAgICAgICBjb25zdCBib2R5ID0gcmVzcD8uYm9keSA/PyByZXNwO1xyXG4gICAgICAgIGNvbnN0IGpvYklkID0gYm9keT8uZGF0YT8uam9iSWQ7XHJcbiAgICAgICAgaWYgKCFqb2JJZCkge1xyXG4gICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShcclxuICAgICAgICAgICAgYEZhaWxlZCB0byBzdGFydCAke3RoaXMua2luZExhYmVsKGtpbmQpfSBleHBvcnQg4oCUIHNlcnZlciBkaWQgbm90IHJldHVybiBhIGpvYklkLmAsXHJcbiAgICAgICAgICAgICdlcnJvcicsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFjdGl2ZUpvYiA9IHtcclxuICAgICAgICAgIGpvYklkLFxyXG4gICAgICAgICAga2luZCxcclxuICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxyXG4gICAgICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgICBzdG9yZUNvdW50OiB0b3RhbFN0b3JlcyxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuc3RhcnRQb2xsaW5nKGpvYklkKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RhcnRpbmcgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGVycj8uc3RhdHVzO1xyXG4gICAgICAgIGNvbnN0IHJlc3BCb2R5ID0gZXJyPy5lcnJvcjtcclxuICAgICAgICBpZiAoc3RhdHVzID09PSA0MDkgJiYgcmVzcEJvZHk/LmRhdGE/LmpvYklkKSB7XHJcbiAgICAgICAgICB0aGlzLmJ1c3lJbmZvID0ge1xyXG4gICAgICAgICAgICBqb2JJZDogcmVzcEJvZHkuZGF0YS5qb2JJZCxcclxuICAgICAgICAgICAga2luZDogcmVzcEJvZHkuZGF0YS5raW5kLFxyXG4gICAgICAgICAgICBzdGFydGVkQXQ6IHJlc3BCb2R5LmRhdGEuc3RhcnRlZEF0LFxyXG4gICAgICAgICAgICBzdG9yZUNvdW50OiByZXNwQm9keS5kYXRhLnN0b3JlQ291bnQsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBlcnJNc2cgPVxyXG4gICAgICAgICAgICAodHlwZW9mIHJlc3BCb2R5Py5lcnJvciA9PT0gJ3N0cmluZycgJiYgcmVzcEJvZHkuZXJyb3IpIHx8XHJcbiAgICAgICAgICAgIHJlc3BCb2R5Py5lcnJvcj8ubWVzc2FnZSB8fFxyXG4gICAgICAgICAgICByZXNwQm9keT8ubWVzc2FnZSB8fFxyXG4gICAgICAgICAgICBlcnI/Lm1lc3NhZ2UgfHxcclxuICAgICAgICAgICAgYEZhaWxlZCB0byBzdGFydCAke3RoaXMua2luZExhYmVsKGtpbmQpfSBleHBvcnQuYDtcclxuICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoZXJyTXNnLCAnZXJyb3InKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhcnRQb2xsaW5nKGpvYklkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc3RvcFBvbGwkLm5leHQoKTtcclxuICAgIGNvbnN0IHBvbGxTdGFydGVkID0gRGF0ZS5ub3coKTtcclxuICAgIHRpbWVyKFBPTExfSU5JVElBTF9ERUxBWV9NUywgUE9MTF9JTlRFUlZBTF9NUylcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnN0b3BQb2xsJCksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+XHJcbiAgICAgICAgICB0aGlzLnNicy5nZXRQbGFub0V4cG9ydEpvYihqb2JJZCkucGlwZShcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSBwb2xsU3RhcnRlZCA+IFBPTExfVElNRU9VVF9NUykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQb2xsVGltZW91dCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgKSxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFyZXMpIHJldHVybjtcclxuICAgICAgICBjb25zdCBqb2IgPSByZXM/LmRhdGE7XHJcbiAgICAgICAgaWYgKCFqb2IpIHJldHVybjtcclxuICAgICAgICB0aGlzLmFjdGl2ZUpvYiA9IHtcclxuICAgICAgICAgIGpvYklkOiBqb2Iuam9iSWQsXHJcbiAgICAgICAgICBraW5kOiBqb2Iua2luZCxcclxuICAgICAgICAgIHN0YXR1czogam9iLnN0YXR1cyxcclxuICAgICAgICAgIHN0YXJ0ZWRBdDogam9iLnN0YXJ0ZWRBdCxcclxuICAgICAgICAgIGNvbXBsZXRlZEF0OiBqb2IuY29tcGxldGVkQXQsXHJcbiAgICAgICAgICBkb3dubG9hZFVybDogam9iLmRvd25sb2FkVXJsLFxyXG4gICAgICAgICAgZXJyb3I6IGpvYi5lcnJvcixcclxuICAgICAgICAgIHJvd0NvdW50OiBqb2Iucm93Q291bnQsXHJcbiAgICAgICAgICBzdG9yZUNvdW50OiBqb2Iuc3RvcmVDb3VudCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChqb2Iuc3RhdHVzID09PSAnc3VjY2VlZGVkJykge1xyXG4gICAgICAgICAgdGhpcy5zdG9wUG9sbCQubmV4dCgpO1xyXG4gICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShcclxuICAgICAgICAgICAgYCR7dGhpcy5raW5kTGFiZWwoam9iLmtpbmQpfSBleHBvcnQgaXMgcmVhZHkuYCxcclxuICAgICAgICAgICAgJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGpvYi5zdGF0dXMgPT09ICdmYWlsZWQnKSB7XHJcbiAgICAgICAgICB0aGlzLnN0b3BQb2xsJC5uZXh0KCk7XHJcbiAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKFxyXG4gICAgICAgICAgICBgJHt0aGlzLmtpbmRMYWJlbChqb2Iua2luZCl9IGV4cG9ydCBmYWlsZWQ6ICR7XHJcbiAgICAgICAgICAgICAgam9iLmVycm9yIHx8ICdVbmtub3duIGVycm9yJ1xyXG4gICAgICAgICAgICB9YCxcclxuICAgICAgICAgICAgJ2Vycm9yJyxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGpvYi5zdGF0dXMgPT09ICdydW5uaW5nJyAmJlxyXG4gICAgICAgICAgRGF0ZS5ub3coKSAtIHBvbGxTdGFydGVkID4gUE9MTF9USU1FT1VUX01TXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZVBvbGxUaW1lb3V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlUG9sbFRpbWVvdXQoKSB7XHJcbiAgICB0aGlzLnN0b3BQb2xsJC5uZXh0KCk7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVKb2IpIHtcclxuICAgICAgdGhpcy5hY3RpdmVKb2IgPSB7XHJcbiAgICAgICAgLi4udGhpcy5hY3RpdmVKb2IsXHJcbiAgICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcclxuICAgICAgICBlcnJvcjogJ1RpbWVkIG91dCB3YWl0aW5nIGZvciBleHBvcnQgdG8gY29tcGxldGUuJyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHRoaXMuc2hvd01lc3NhZ2UoXHJcbiAgICAgICdUaW1lZCBvdXQgd2FpdGluZyBmb3IgZXhwb3J0IHRvIGNvbXBsZXRlLiBUaGUgam9iIG1heSBzdGlsbCBiZSBydW5uaW5nIG9uIHRoZSBzZXJ2ZXIg4oCUIHJlZnJlc2ggbGF0ZXIuJyxcclxuICAgICAgJ2Vycm9yJyxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzaG93TWVzc2FnZShtc2c6IHN0cmluZywgdHlwZTogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJykge1xyXG4gICAgdGhpcy5tZXNzYWdlID0gbXNnO1xyXG4gICAgdGhpcy5tZXNzYWdlVHlwZSA9IHR5cGU7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLm1lc3NhZ2UgPSAnJyksIDYwMDApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3BQb2xsJC5uZXh0KCk7XHJcbiAgICB0aGlzLnN0b3BQb2xsJC5jb21wbGV0ZSgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxzZWN0aW9uIGNsYXNzPVwic3RvcmUtZXhwb3J0cyBwLTNcIj5cclxuICA8bGliLXRvb2wtcGFnZS1oZWFkZXJcclxuICAgIHRpdGxlPVwiTUJRICYgT3JkZXJcIlxyXG4gICAgZGVzY3JpcHRpb249XCJHZW5lcmF0ZSBwZXItc3RvcmUgZml4dHVyZSBleHBvcnRzLiBTZWxlY3Qgb25lIG9yIG1vcmUgc3RvcmVzLCB0aGVuIGNob29zZSBhbiBleHBvcnQuIExhcmdlIGV4cG9ydHMgcnVuIGluIHRoZSBiYWNrZ3JvdW5kIGFuZCBhcmUgc2F2ZWQgdG8gUzMg4oCUIGEgZG93bmxvYWQgbGluayBhcHBlYXJzIGhlcmUgd2hlbiByZWFkeS5cIlxyXG4gID48L2xpYi10b29sLXBhZ2UtaGVhZGVyPlxyXG4gIDxkaXYgY2xhc3M9XCJjYXJkIHAtNFwiIHN0eWxlPVwibWF4LXdpZHRoOiA3MDBweDtcIj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U3RvcmVzIOKAlCBNYW5hZ2UgUGxhbm9ncmFtIChsaXZlKTwvbGFiZWw+XHJcbiAgICAgIDxsaWItc3RvcmUtc2VsZWN0XHJcbiAgICAgICAgW29wdGlvbnNdPVwic3RvcmVPcHRpb25zXCJcclxuICAgICAgICBbaW5pdGlhbFNlbGVjdGVkXT1cImluaXRpYWxTdG9yZXNcIlxyXG4gICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJvblN0b3Jlc1NlbGVjdGVkKCRldmVudClcIj5cclxuICAgICAgPC9saWItc3RvcmUtc2VsZWN0PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN0b3JlcyDigJQgZnJvbSBhIFJldmlzaW9uPC9sYWJlbD5cclxuICAgICAgPGxpYi1zdG9yZS1zZWxlY3RcclxuICAgICAgICBbb3B0aW9uc109XCJzdG9yZU9wdGlvbnNcIlxyXG4gICAgICAgIFtpbml0aWFsU2VsZWN0ZWRdPVwiaW5pdGlhbFN0b3Jlc1wiXHJcbiAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cIm9uUmV2aXNpb25TdG9yZXNTZWxlY3RlZCgkZXZlbnQpXCI+XHJcbiAgICAgIDwvbGliLXN0b3JlLXNlbGVjdD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5SZXZpc2lvbiBuYW1lPC9sYWJlbD5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInJldmlzaW9uTmFtZVwiXHJcbiAgICAgICAgbmFtZT1cInJldmlzaW9uTmFtZVwiXHJcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gUTEtMjAyNiBMYXlvdXRcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc1dvcmtpbmdcIiAvPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS10ZXh0XCI+XHJcbiAgICAgICAgQXBwbGllcyB0byB0aGUg4oCcZnJvbSBhIFJldmlzaW9u4oCdIHN0b3JlcyBhYm92ZSDigJQgZWFjaCBpcyBleHBvcnRlZCBmcm9tIGl0cyByZXZpc2lvbiB3aXRoIHRoaXMgZXhhY3QgbmFtZSAoc3RvcmVzIHdpdGhvdXQgaXQgYXJlIHNraXBwZWQpLiBMaXZlIHN0b3JlcyB1c2UgY3VycmVudCBkYXRhOyBib3RoIHNldHMgYXJlIGNvbWJpbmVkIGludG8gb25lIGV4cG9ydC5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGZsZXgtd3JhcFwiPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxyXG4gICAgICAgIChjbGljayk9XCJvbkV4cG9ydE1icSgpXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNXb3JraW5nIHx8IHRvdGFsU2VsZWN0ZWRTdG9yZXMgPT09IDBcIj5cclxuICAgICAgICBAaWYgKHN0YXJ0aW5nID09PSAnbWJxJykge1xyXG4gICAgICAgICAgU3RhcnRpbmcgTUJRLi4uXHJcbiAgICAgICAgfSBAZWxzZSBpZiAoYWN0aXZlSm9iPy5zdGF0dXMgPT09ICdydW5uaW5nJyAmJiBhY3RpdmVKb2I/LmtpbmQgPT09ICdtYnEnKSB7XHJcbiAgICAgICAgICBSdW5uaW5nIE1CUS4uLlxyXG4gICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgRXhwb3J0IE1CUVxyXG4gICAgICAgIH1cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgIChjbGljayk9XCJvbkV4cG9ydE9yZGVyU2hlZXQoKVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzV29ya2luZyB8fCB0b3RhbFNlbGVjdGVkU3RvcmVzID09PSAwXCI+XHJcbiAgICAgICAgQGlmIChzdGFydGluZyA9PT0gJ29yZGVyJykge1xyXG4gICAgICAgICAgU3RhcnRpbmcgT3JkZXIgU2hlZXQuLi5cclxuICAgICAgICB9IEBlbHNlIGlmIChhY3RpdmVKb2I/LnN0YXR1cyA9PT0gJ3J1bm5pbmcnICYmIGFjdGl2ZUpvYj8ua2luZCA9PT0gJ29yZGVyJykge1xyXG4gICAgICAgICAgUnVubmluZyBPcmRlciBTaGVldC4uLlxyXG4gICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgRXhwb3J0IE9yZGVyIFNoZWV0XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIEBpZiAoYnVzeUluZm8pIHtcclxuICAgICAgPGRpdiBjbGFzcz1cIm10LTMgYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxyXG4gICAgICAgIEFub3RoZXIge3sga2luZExhYmVsKGJ1c3lJbmZvLmtpbmQpIH19IGV4cG9ydCBpcyBjdXJyZW50bHkgcnVubmluZ0BpZiAoYnVzeUluZm8uc3RvcmVDb3VudCkgeyAoe3sgYnVzeUluZm8uc3RvcmVDb3VudCB9fSBzdG9yZXt7IGJ1c3lJbmZvLnN0b3JlQ291bnQgPT09IDEgPyAnJyA6ICdzJyB9fSkgfUBpZiAoYnVzeUluZm8uc3RhcnRlZEF0KSB7LCBzdGFydGVkIHt7IHN0YXJ0ZWRBZ28oYnVzeUluZm8uc3RhcnRlZEF0KSB9fX0uIFBsZWFzZSB3YWl0IHVudGlsIGl0IGZpbmlzaGVzIGJlZm9yZSBzdGFydGluZyBhIG5ldyBleHBvcnQuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG5cclxuICAgIEBpZiAoYWN0aXZlSm9iKSB7XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cIm10LTMgYWxlcnRcIlxyXG4gICAgICAgIFtjbGFzcy5hbGVydC1pbmZvXT1cImFjdGl2ZUpvYi5zdGF0dXMgPT09ICdydW5uaW5nJ1wiXHJcbiAgICAgICAgW2NsYXNzLmFsZXJ0LXN1Y2Nlc3NdPVwiYWN0aXZlSm9iLnN0YXR1cyA9PT0gJ3N1Y2NlZWRlZCdcIlxyXG4gICAgICAgIFtjbGFzcy5hbGVydC1kYW5nZXJdPVwiYWN0aXZlSm9iLnN0YXR1cyA9PT0gJ2ZhaWxlZCdcIj5cclxuICAgICAgICBAaWYgKGFjdGl2ZUpvYi5zdGF0dXMgPT09ICdydW5uaW5nJykge1xyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAge3sga2luZExhYmVsKGFjdGl2ZUpvYi5raW5kKSB9fSBleHBvcnQgaXMgcHJvY2Vzc2luZ0BpZiAoYWN0aXZlSm9iLnN0b3JlQ291bnQpIHsgKHt7IGFjdGl2ZUpvYi5zdG9yZUNvdW50IH19IHN0b3Jle3sgYWN0aXZlSm9iLnN0b3JlQ291bnQgPT09IDEgPyAnJyA6ICdzJyB9fSkgfS4gU3RhcnRlZCB7eyBzdGFydGVkQWdvKGFjdGl2ZUpvYi5zdGFydGVkQXQpIH19LiBLZWVwIHRoaXMgcGFnZSBvcGVuIOKAlCBhIGRvd25sb2FkIGxpbmsgd2lsbCBhcHBlYXIgd2hlbiBpdCBmaW5pc2hlcy5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH0gQGVsc2UgaWYgKGFjdGl2ZUpvYi5zdGF0dXMgPT09ICdzdWNjZWVkZWQnICYmIGFjdGl2ZUpvYi5kb3dubG9hZFVybCkge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gZ2FwLTIgZmxleC13cmFwXCI+XHJcbiAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgIHt7IGtpbmRMYWJlbChhY3RpdmVKb2Iua2luZCkgfX0gZXhwb3J0IHJlYWR5QGlmIChhY3RpdmVKb2Iucm93Q291bnQpIHsg4oCUIHt7IGFjdGl2ZUpvYi5yb3dDb3VudCB9fSByb3d7eyBhY3RpdmVKb2Iucm93Q291bnQgPT09IDEgPyAnJyA6ICdzJyB9fSB9LlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTJcIj5cclxuICAgICAgICAgICAgICA8YSBbaHJlZl09XCJhY3RpdmVKb2IuZG93bmxvYWRVcmxcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXN1Y2Nlc3NcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiPkRvd25sb2FkPC9hPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIChjbGljayk9XCJkaXNtaXNzUmVzdWx0KClcIj5EaXNtaXNzPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfSBAZWxzZSBpZiAoYWN0aXZlSm9iLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGdhcC0yIGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyBraW5kTGFiZWwoYWN0aXZlSm9iLmtpbmQpIH19IGV4cG9ydCBmYWlsZWQ6IHt7IGFjdGl2ZUpvYi5lcnJvciB8fCAnVW5rbm93biBlcnJvcicgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIChjbGljayk9XCJkaXNtaXNzUmVzdWx0KClcIj5EaXNtaXNzPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG5cclxuICAgIEBpZiAobWVzc2FnZSkge1xyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJtdC0zIGFsZXJ0XCJcclxuICAgICAgICBbY2xhc3MuYWxlcnQtc3VjY2Vzc109XCJtZXNzYWdlVHlwZSA9PT0gJ3N1Y2Nlc3MnXCJcclxuICAgICAgICBbY2xhc3MuYWxlcnQtZGFuZ2VyXT1cIm1lc3NhZ2VUeXBlID09PSAnZXJyb3InXCI+XHJcbiAgICAgICAge3sgbWVzc2FnZSB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG4iXX0=
@@ -9,6 +9,7 @@ import * as i4 from "tango-app-ui-shared";
9
9
  import * as i5 from "../../reactive-select/reactive-select.component";
10
10
  import * as i6 from "@angular/common";
11
11
  import * as i7 from "@angular/forms";
12
+ import * as i8 from "../tool-page-header/tool-page-header.component";
12
13
  export class SwapTemplateComponent {
13
14
  sbs;
14
15
  gs;
@@ -318,10 +319,10 @@ export class SwapTemplateComponent {
318
319
  this.storeSelected$.complete();
319
320
  }
320
321
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SwapTemplateComponent, deps: [{ token: i1.StoreBuilderService }, { token: i2.GlobalStateService }, { token: i3.NgbModal }, { token: i4.ToastService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
321
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SwapTemplateComponent, selector: "lib-swap-template", ngImport: i0, template: "<section class=\"swap-template p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 900px;\">\r\n <h5 class=\"mb-3\">Swap Fixture Template</h5>\r\n\r\n <!-- Store Select -->\r\n <div class=\"mb-3\">\r\n <lib-reactive-select\r\n label=\"Store\"\r\n [idField]=\"'id'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"storeOptions\"\r\n [search]=\"true\"\r\n [ngModel]=\"selectedStoreId\"\r\n (ngModelChange)=\"onStoreSelected($event)\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <ng-container *ngIf=\"selectedStore\">\r\n <ng-container *ngIf=\"isLoadingFixtures; else loaded\">\r\n <div class=\"text-muted mb-3\">Loading fixtures\u2026</div>\r\n </ng-container>\r\n\r\n <ng-template #loaded>\r\n <ng-container *ngIf=\"fixtures.length; else noFixtures\">\r\n <!-- Swap Rows -->\r\n <div class=\"swap-rows\">\r\n <div *ngFor=\"let row of rows; let i = index; trackBy: trackByRow\"\r\n class=\"swap-row mb-3\">\r\n <div class=\"row g-2 align-items-start\">\r\n <!-- Plano Fixture -->\r\n <div class=\"col-5\">\r\n <lib-reactive-select\r\n label=\"Plano Fixture\"\r\n [idField]=\"'_id'\"\r\n [nameField]=\"'displayName'\"\r\n [data]=\"row.fixtureOptions\"\r\n [search]=\"true\"\r\n [ngModel]=\"row.fixtureId\"\r\n (ngModelChange)=\"onRowFixtureChange(row, $event)\">\r\n </lib-reactive-select>\r\n\r\n <div *ngIf=\"row.fixture\" class=\"fixture-info mt-2\">\r\n <div>\r\n <span class=\"label\">Name:</span>\r\n {{ row.fixture.fixtureName || '\u2014' }}\r\n </div>\r\n <div>\r\n <span class=\"label\">Position:</span>\r\n {{ row.wallPosition }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Arrow -->\r\n <div class=\"col-1 d-flex justify-content-center\"\r\n style=\"padding-top: 30px;\">\r\n <span class=\"arrow\">\u2192</span>\r\n </div>\r\n\r\n <!-- Swapping Template -->\r\n <div class=\"col-5\">\r\n <lib-reactive-select\r\n label=\"Swapping Template\"\r\n [idField]=\"'_id'\"\r\n [nameField]=\"'displayName'\"\r\n [subTextField]=\"'subtext'\"\r\n [data]=\"templates\"\r\n [search]=\"true\"\r\n [ngModel]=\"row.templateId\"\r\n (ngModelChange)=\"onRowTemplateChange(row, $event)\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <!-- Remove Row -->\r\n <div class=\"col-1 d-flex justify-content-end\"\r\n style=\"padding-top: 30px;\">\r\n <button type=\"button\" class=\"btn btn-link p-0 remove-btn\"\r\n (click)=\"removeRow(i)\" title=\"Remove row\"\r\n [disabled]=\"rows.length === 1 && !row.fixture && !row.template\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\"\r\n stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Add Row -->\r\n <div class=\"mb-3\">\r\n <button type=\"button\" class=\"btn btn-link p-0 add-btn\"\r\n (click)=\"addRow()\" [disabled]=\"!canAddRow\">\r\n + Add another swap\r\n </button>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"d-flex gap-2 mt-4\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\"\r\n [disabled]=\"isSubmitting\">\r\n Cancel\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onSubmit()\"\r\n [disabled]=\"!canSubmit || isSubmitting\">\r\n {{ isSubmitting ? 'Submitting\u2026' : 'Submit' }}\r\n </button>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noFixtures>\r\n <div class=\"text-muted\">No fixtures found for this store.</div>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n</section>\r\n", styles: [".swap-template .swap-row{border:1px solid #eaecf0;border-radius:6px;padding:12px;background:#fcfcfd}.swap-template .fixture-info{font-size:12px;color:#475467;background:#fff;border:1px dashed #eaecf0;border-radius:4px;padding:6px 8px;line-height:1.5}.swap-template .fixture-info .label{font-weight:600;color:#344054;margin-right:4px}.swap-template .arrow{font-size:20px;color:#98a2b3;-webkit-user-select:none;user-select:none}.swap-template .add-btn{color:#1570ef;text-decoration:none;font-weight:500}.swap-template .add-btn:disabled{color:#98a2b3;cursor:not-allowed}.swap-template .remove-btn{line-height:1}.swap-template .remove-btn:disabled{opacity:.4;cursor:not-allowed}\n"], dependencies: [{ kind: "component", type: i5.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel", "disabled"], outputs: ["actionClick"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
322
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SwapTemplateComponent, selector: "lib-swap-template", ngImport: i0, template: "<section class=\"swap-template p-3\">\r\n <lib-tool-page-header\r\n title=\"Template Swap\"\r\n description=\"Replace one fixture template with another in a planogram.\"\r\n ></lib-tool-page-header>\r\n <div class=\"card p-4\" style=\"max-width: 900px;\">\r\n\r\n <!-- Store Select -->\r\n <div class=\"mb-3\">\r\n <lib-reactive-select\r\n label=\"Store\"\r\n [idField]=\"'id'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"storeOptions\"\r\n [search]=\"true\"\r\n [ngModel]=\"selectedStoreId\"\r\n (ngModelChange)=\"onStoreSelected($event)\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <ng-container *ngIf=\"selectedStore\">\r\n <ng-container *ngIf=\"isLoadingFixtures; else loaded\">\r\n <div class=\"text-muted mb-3\">Loading fixtures\u2026</div>\r\n </ng-container>\r\n\r\n <ng-template #loaded>\r\n <ng-container *ngIf=\"fixtures.length; else noFixtures\">\r\n <!-- Swap Rows -->\r\n <div class=\"swap-rows\">\r\n <div *ngFor=\"let row of rows; let i = index; trackBy: trackByRow\"\r\n class=\"swap-row mb-3\">\r\n <div class=\"row g-2 align-items-start\">\r\n <!-- Plano Fixture -->\r\n <div class=\"col-5\">\r\n <lib-reactive-select\r\n label=\"Plano Fixture\"\r\n [idField]=\"'_id'\"\r\n [nameField]=\"'displayName'\"\r\n [data]=\"row.fixtureOptions\"\r\n [search]=\"true\"\r\n [ngModel]=\"row.fixtureId\"\r\n (ngModelChange)=\"onRowFixtureChange(row, $event)\">\r\n </lib-reactive-select>\r\n\r\n <div *ngIf=\"row.fixture\" class=\"fixture-info mt-2\">\r\n <div>\r\n <span class=\"label\">Name:</span>\r\n {{ row.fixture.fixtureName || '\u2014' }}\r\n </div>\r\n <div>\r\n <span class=\"label\">Position:</span>\r\n {{ row.wallPosition }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Arrow -->\r\n <div class=\"col-1 d-flex justify-content-center\"\r\n style=\"padding-top: 30px;\">\r\n <span class=\"arrow\">\u2192</span>\r\n </div>\r\n\r\n <!-- Swapping Template -->\r\n <div class=\"col-5\">\r\n <lib-reactive-select\r\n label=\"Swapping Template\"\r\n [idField]=\"'_id'\"\r\n [nameField]=\"'displayName'\"\r\n [subTextField]=\"'subtext'\"\r\n [data]=\"templates\"\r\n [search]=\"true\"\r\n [ngModel]=\"row.templateId\"\r\n (ngModelChange)=\"onRowTemplateChange(row, $event)\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <!-- Remove Row -->\r\n <div class=\"col-1 d-flex justify-content-end\"\r\n style=\"padding-top: 30px;\">\r\n <button type=\"button\" class=\"btn btn-link p-0 remove-btn\"\r\n (click)=\"removeRow(i)\" title=\"Remove row\"\r\n [disabled]=\"rows.length === 1 && !row.fixture && !row.template\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\"\r\n stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Add Row -->\r\n <div class=\"mb-3\">\r\n <button type=\"button\" class=\"btn btn-link p-0 add-btn\"\r\n (click)=\"addRow()\" [disabled]=\"!canAddRow\">\r\n + Add another swap\r\n </button>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"d-flex gap-2 mt-4\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\"\r\n [disabled]=\"isSubmitting\">\r\n Cancel\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onSubmit()\"\r\n [disabled]=\"!canSubmit || isSubmitting\">\r\n {{ isSubmitting ? 'Submitting\u2026' : 'Submit' }}\r\n </button>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noFixtures>\r\n <div class=\"text-muted\">No fixtures found for this store.</div>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n</section>\r\n", styles: [".swap-template .swap-row{border:1px solid #eaecf0;border-radius:6px;padding:12px;background:#fcfcfd}.swap-template .fixture-info{font-size:12px;color:#475467;background:#fff;border:1px dashed #eaecf0;border-radius:4px;padding:6px 8px;line-height:1.5}.swap-template .fixture-info .label{font-weight:600;color:#344054;margin-right:4px}.swap-template .arrow{font-size:20px;color:#98a2b3;-webkit-user-select:none;user-select:none}.swap-template .add-btn{color:#1570ef;text-decoration:none;font-weight:500}.swap-template .add-btn:disabled{color:#98a2b3;cursor:not-allowed}.swap-template .remove-btn{line-height:1}.swap-template .remove-btn:disabled{opacity:.4;cursor:not-allowed}\n"], dependencies: [{ kind: "component", type: i5.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel", "disabled"], outputs: ["actionClick"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.ToolPageHeaderComponent, selector: "lib-tool-page-header", inputs: ["title", "description", "backLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
322
323
  }
323
324
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SwapTemplateComponent, decorators: [{
324
325
  type: Component,
325
- args: [{ selector: 'lib-swap-template', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section class=\"swap-template p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 900px;\">\r\n <h5 class=\"mb-3\">Swap Fixture Template</h5>\r\n\r\n <!-- Store Select -->\r\n <div class=\"mb-3\">\r\n <lib-reactive-select\r\n label=\"Store\"\r\n [idField]=\"'id'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"storeOptions\"\r\n [search]=\"true\"\r\n [ngModel]=\"selectedStoreId\"\r\n (ngModelChange)=\"onStoreSelected($event)\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <ng-container *ngIf=\"selectedStore\">\r\n <ng-container *ngIf=\"isLoadingFixtures; else loaded\">\r\n <div class=\"text-muted mb-3\">Loading fixtures\u2026</div>\r\n </ng-container>\r\n\r\n <ng-template #loaded>\r\n <ng-container *ngIf=\"fixtures.length; else noFixtures\">\r\n <!-- Swap Rows -->\r\n <div class=\"swap-rows\">\r\n <div *ngFor=\"let row of rows; let i = index; trackBy: trackByRow\"\r\n class=\"swap-row mb-3\">\r\n <div class=\"row g-2 align-items-start\">\r\n <!-- Plano Fixture -->\r\n <div class=\"col-5\">\r\n <lib-reactive-select\r\n label=\"Plano Fixture\"\r\n [idField]=\"'_id'\"\r\n [nameField]=\"'displayName'\"\r\n [data]=\"row.fixtureOptions\"\r\n [search]=\"true\"\r\n [ngModel]=\"row.fixtureId\"\r\n (ngModelChange)=\"onRowFixtureChange(row, $event)\">\r\n </lib-reactive-select>\r\n\r\n <div *ngIf=\"row.fixture\" class=\"fixture-info mt-2\">\r\n <div>\r\n <span class=\"label\">Name:</span>\r\n {{ row.fixture.fixtureName || '\u2014' }}\r\n </div>\r\n <div>\r\n <span class=\"label\">Position:</span>\r\n {{ row.wallPosition }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Arrow -->\r\n <div class=\"col-1 d-flex justify-content-center\"\r\n style=\"padding-top: 30px;\">\r\n <span class=\"arrow\">\u2192</span>\r\n </div>\r\n\r\n <!-- Swapping Template -->\r\n <div class=\"col-5\">\r\n <lib-reactive-select\r\n label=\"Swapping Template\"\r\n [idField]=\"'_id'\"\r\n [nameField]=\"'displayName'\"\r\n [subTextField]=\"'subtext'\"\r\n [data]=\"templates\"\r\n [search]=\"true\"\r\n [ngModel]=\"row.templateId\"\r\n (ngModelChange)=\"onRowTemplateChange(row, $event)\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <!-- Remove Row -->\r\n <div class=\"col-1 d-flex justify-content-end\"\r\n style=\"padding-top: 30px;\">\r\n <button type=\"button\" class=\"btn btn-link p-0 remove-btn\"\r\n (click)=\"removeRow(i)\" title=\"Remove row\"\r\n [disabled]=\"rows.length === 1 && !row.fixture && !row.template\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\"\r\n stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Add Row -->\r\n <div class=\"mb-3\">\r\n <button type=\"button\" class=\"btn btn-link p-0 add-btn\"\r\n (click)=\"addRow()\" [disabled]=\"!canAddRow\">\r\n + Add another swap\r\n </button>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"d-flex gap-2 mt-4\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\"\r\n [disabled]=\"isSubmitting\">\r\n Cancel\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onSubmit()\"\r\n [disabled]=\"!canSubmit || isSubmitting\">\r\n {{ isSubmitting ? 'Submitting\u2026' : 'Submit' }}\r\n </button>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noFixtures>\r\n <div class=\"text-muted\">No fixtures found for this store.</div>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n</section>\r\n", styles: [".swap-template .swap-row{border:1px solid #eaecf0;border-radius:6px;padding:12px;background:#fcfcfd}.swap-template .fixture-info{font-size:12px;color:#475467;background:#fff;border:1px dashed #eaecf0;border-radius:4px;padding:6px 8px;line-height:1.5}.swap-template .fixture-info .label{font-weight:600;color:#344054;margin-right:4px}.swap-template .arrow{font-size:20px;color:#98a2b3;-webkit-user-select:none;user-select:none}.swap-template .add-btn{color:#1570ef;text-decoration:none;font-weight:500}.swap-template .add-btn:disabled{color:#98a2b3;cursor:not-allowed}.swap-template .remove-btn{line-height:1}.swap-template .remove-btn:disabled{opacity:.4;cursor:not-allowed}\n"] }]
326
+ args: [{ selector: 'lib-swap-template', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section class=\"swap-template p-3\">\r\n <lib-tool-page-header\r\n title=\"Template Swap\"\r\n description=\"Replace one fixture template with another in a planogram.\"\r\n ></lib-tool-page-header>\r\n <div class=\"card p-4\" style=\"max-width: 900px;\">\r\n\r\n <!-- Store Select -->\r\n <div class=\"mb-3\">\r\n <lib-reactive-select\r\n label=\"Store\"\r\n [idField]=\"'id'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"storeOptions\"\r\n [search]=\"true\"\r\n [ngModel]=\"selectedStoreId\"\r\n (ngModelChange)=\"onStoreSelected($event)\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <ng-container *ngIf=\"selectedStore\">\r\n <ng-container *ngIf=\"isLoadingFixtures; else loaded\">\r\n <div class=\"text-muted mb-3\">Loading fixtures\u2026</div>\r\n </ng-container>\r\n\r\n <ng-template #loaded>\r\n <ng-container *ngIf=\"fixtures.length; else noFixtures\">\r\n <!-- Swap Rows -->\r\n <div class=\"swap-rows\">\r\n <div *ngFor=\"let row of rows; let i = index; trackBy: trackByRow\"\r\n class=\"swap-row mb-3\">\r\n <div class=\"row g-2 align-items-start\">\r\n <!-- Plano Fixture -->\r\n <div class=\"col-5\">\r\n <lib-reactive-select\r\n label=\"Plano Fixture\"\r\n [idField]=\"'_id'\"\r\n [nameField]=\"'displayName'\"\r\n [data]=\"row.fixtureOptions\"\r\n [search]=\"true\"\r\n [ngModel]=\"row.fixtureId\"\r\n (ngModelChange)=\"onRowFixtureChange(row, $event)\">\r\n </lib-reactive-select>\r\n\r\n <div *ngIf=\"row.fixture\" class=\"fixture-info mt-2\">\r\n <div>\r\n <span class=\"label\">Name:</span>\r\n {{ row.fixture.fixtureName || '\u2014' }}\r\n </div>\r\n <div>\r\n <span class=\"label\">Position:</span>\r\n {{ row.wallPosition }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Arrow -->\r\n <div class=\"col-1 d-flex justify-content-center\"\r\n style=\"padding-top: 30px;\">\r\n <span class=\"arrow\">\u2192</span>\r\n </div>\r\n\r\n <!-- Swapping Template -->\r\n <div class=\"col-5\">\r\n <lib-reactive-select\r\n label=\"Swapping Template\"\r\n [idField]=\"'_id'\"\r\n [nameField]=\"'displayName'\"\r\n [subTextField]=\"'subtext'\"\r\n [data]=\"templates\"\r\n [search]=\"true\"\r\n [ngModel]=\"row.templateId\"\r\n (ngModelChange)=\"onRowTemplateChange(row, $event)\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <!-- Remove Row -->\r\n <div class=\"col-1 d-flex justify-content-end\"\r\n style=\"padding-top: 30px;\">\r\n <button type=\"button\" class=\"btn btn-link p-0 remove-btn\"\r\n (click)=\"removeRow(i)\" title=\"Remove row\"\r\n [disabled]=\"rows.length === 1 && !row.fixture && !row.template\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 10 10\" fill=\"none\">\r\n <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\"\r\n stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Add Row -->\r\n <div class=\"mb-3\">\r\n <button type=\"button\" class=\"btn btn-link p-0 add-btn\"\r\n (click)=\"addRow()\" [disabled]=\"!canAddRow\">\r\n + Add another swap\r\n </button>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"d-flex gap-2 mt-4\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\"\r\n [disabled]=\"isSubmitting\">\r\n Cancel\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onSubmit()\"\r\n [disabled]=\"!canSubmit || isSubmitting\">\r\n {{ isSubmitting ? 'Submitting\u2026' : 'Submit' }}\r\n </button>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noFixtures>\r\n <div class=\"text-muted\">No fixtures found for this store.</div>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n</section>\r\n", styles: [".swap-template .swap-row{border:1px solid #eaecf0;border-radius:6px;padding:12px;background:#fcfcfd}.swap-template .fixture-info{font-size:12px;color:#475467;background:#fff;border:1px dashed #eaecf0;border-radius:4px;padding:6px 8px;line-height:1.5}.swap-template .fixture-info .label{font-weight:600;color:#344054;margin-right:4px}.swap-template .arrow{font-size:20px;color:#98a2b3;-webkit-user-select:none;user-select:none}.swap-template .add-btn{color:#1570ef;text-decoration:none;font-weight:500}.swap-template .add-btn:disabled{color:#98a2b3;cursor:not-allowed}.swap-template .remove-btn{line-height:1}.swap-template .remove-btn:disabled{opacity:.4;cursor:not-allowed}\n"] }]
326
327
  }], ctorParameters: () => [{ type: i1.StoreBuilderService }, { type: i2.GlobalStateService }, { type: i3.NgbModal }, { type: i4.ToastService }, { type: i0.ChangeDetectorRef }] });
327
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dhcC10ZW1wbGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9wbGFuby10b29scy9zd2FwLXRlbXBsYXRlL3N3YXAtdGVtcGxhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvc3dhcC10ZW1wbGF0ZS9zd2FwLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxHQUdWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sUUFBUSxFQUNSLEdBQUcsRUFFSCxFQUFFLEVBQ0YsV0FBVyxFQUNYLE9BQU8sRUFDUCxTQUFTLEVBQ1QsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUlkLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGdFQUFnRSxDQUFDOzs7Ozs7Ozs7QUF5QzdHLE1BQU0sT0FBTyxxQkFBcUI7SUF3QnRCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUEzQlYsUUFBUSxDQUFTO0lBRWpCLFlBQVksR0FBZ0IsRUFBRSxDQUFDO0lBQy9CLGVBQWUsR0FBa0IsSUFBSSxDQUFDO0lBQ3RDLGFBQWEsR0FBcUIsSUFBSSxDQUFDO0lBRXZDLFFBQVEsR0FBa0IsRUFBRSxDQUFDO0lBQzdCLFNBQVMsR0FBbUIsRUFBRSxDQUFDO0lBQy9CLElBQUksR0FBYyxFQUFFLENBQUM7SUFFckIsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQzFCLFlBQVksR0FBRyxLQUFLLENBQUM7SUFFckIsU0FB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U3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQge1xyXG4gIGNhdGNoRXJyb3IsXHJcbiAgZGVib3VuY2VUaW1lLFxyXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxyXG4gIGZpbHRlcixcclxuICBmaW5hbGl6ZSxcclxuICBtYXAsXHJcbiAgT2JzZXJ2YWJsZSxcclxuICBvZixcclxuICBzaGFyZVJlcGxheSxcclxuICBTdWJqZWN0LFxyXG4gIHN3aXRjaE1hcCxcclxuICB0YWtlVW50aWwsXHJcbiAgdGFwLFxyXG59IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcbmltcG9ydCB7IFN0b3JlQnVpbGRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9wb3B1cHMvZGVsZXRlLWNvbmZpcm1hdGlvbi9kZWxldGUtY29uZmlybWF0aW9uLmNvbXBvbmVudCc7XHJcblxyXG5pbnRlcmZhY2UgU3RvcmVJdGVtIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBGaXh0dXJlSXRlbSB7XHJcbiAgX2lkOiBzdHJpbmc7XHJcbiAgZml4dHVyZU51bWJlcjogbnVtYmVyO1xyXG4gIGZpeHR1cmVOYW1lOiBzdHJpbmc7XHJcbiAgZml4dHVyZUNhdGVnb3J5OiBzdHJpbmc7XHJcbiAgZml4dHVyZVdpZHRoVmFsdWU6IG51bWJlcjtcclxuICBhc3NvY2lhdGVkRWxlbWVudFR5cGU6IHN0cmluZztcclxuICBhc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXI6IG51bWJlciB8IG51bGw7XHJcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIFRlbXBsYXRlSXRlbSB7XHJcbiAgX2lkOiBzdHJpbmc7XHJcbiAgZml4dHVyZU5hbWU6IHN0cmluZztcclxuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xyXG4gIHN1YnRleHQ6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIFN3YXBSb3cge1xyXG4gIHJvd0lkOiBudW1iZXI7XHJcbiAgZml4dHVyZUlkOiBzdHJpbmcgfCBudWxsO1xyXG4gIHRlbXBsYXRlSWQ6IHN0cmluZyB8IG51bGw7XHJcbiAgZml4dHVyZTogRml4dHVyZUl0ZW0gfCBudWxsO1xyXG4gIHRlbXBsYXRlOiBUZW1wbGF0ZUl0ZW0gfCBudWxsO1xyXG4gIGZpeHR1cmVPcHRpb25zOiBGaXh0dXJlSXRlbVtdO1xyXG4gIHdhbGxQb3NpdGlvbjogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1zd2FwLXRlbXBsYXRlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3dhcC10ZW1wbGF0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3N3YXAtdGVtcGxhdGUuY29tcG9uZW50LnNjc3MnLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3dhcFRlbXBsYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGNsaWVudElkOiBzdHJpbmc7XHJcblxyXG4gIHN0b3JlT3B0aW9uczogU3RvcmVJdGVtW10gPSBbXTtcclxuICBzZWxlY3RlZFN0b3JlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHNlbGVjdGVkU3RvcmU6IFN0b3JlSXRlbSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBmaXh0dXJlczogRml4dHVyZUl0ZW1bXSA9IFtdO1xyXG4gIHRlbXBsYXRlczogVGVtcGxhdGVJdGVtW10gPSBbXTtcclxuICByb3dzOiBTd2FwUm93W10gPSBbXTtcclxuXHJcbiAgaXNMb2FkaW5nRml4dHVyZXMgPSBmYWxzZTtcclxuICBpc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuXHJcbiAgY2FuQWRkUm93ID0gZmFsc2U7XHJcbiAgY2FuU3VibWl0ID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmVTZWxlY3RlZCQgPSBuZXcgU3ViamVjdDxTdG9yZUl0ZW0+KCk7XHJcbiAgcHJpdmF0ZSB0ZW1wbGF0ZXNDYWNoZSQ6IE9ic2VydmFibGU8VGVtcGxhdGVJdGVtW10+IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBjYWNoZWRUZW1wbGF0ZXNDbGllbnRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSByb3dJZFNlcSA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzYnM6IFN0b3JlQnVpbGRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXHJcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICAgIGRlYm91bmNlVGltZSgyMDApLFxyXG4gICAgICAgIGZpbHRlcigoZGF0YSkgPT4gISFkYXRhKSxcclxuICAgICAgICBtYXAoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRhdGE/LmNsaWVudCkgcmV0dXJuIGRhdGEuY2xpZW50IGFzIHN0cmluZztcclxuICAgICAgICAgIGNvbnN0IGhlYWRlckRhdGEgPSBKU09OLnBhcnNlKFxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuIGhlYWRlckRhdGE/LmNsaWVudCBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgZmlsdGVyKChpZCk6IGlkIGlzIHN0cmluZyA9PiAhIWlkKSxcclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKGNsaWVudElkKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkO1xyXG4gICAgICAgIHRoaXMudGVtcGxhdGVzQ2FjaGUkID0gbnVsbDtcclxuICAgICAgICB0aGlzLmNhY2hlZFRlbXBsYXRlc0NsaWVudElkID0gbnVsbDtcclxuICAgICAgICB0aGlzLnJlc2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkU3RvcmVzKCk7XHJcbiAgICAgICAgdGhpcy5wcmVmZXRjaFRlbXBsYXRlcygpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnN0b3JlU2VsZWN0ZWQkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgICB0YXAoKHN0b3JlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcmUgPSBzdG9yZTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZUlkID0gc3RvcmUuaWQ7XHJcbiAgICAgICAgICB0aGlzLmZpeHR1cmVzID0gW107XHJcbiAgICAgICAgICB0aGlzLnJvd3MgPSBbXTtcclxuICAgICAgICAgIHRoaXMucmVjb21wdXRlRmxhZ3MoKTtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nRml4dHVyZXMgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKChzdG9yZSkgPT5cclxuICAgICAgICAgIHRoaXMuc2JzXHJcbiAgICAgICAgICAgIC5nZXRGaXh0dXJlRGV0YWlsc0J5U3RvcmUoc3RvcmUubGFiZWwsIHRoaXMuY2xpZW50SWQpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoeyBkYXRhOiBbXSB9KSksXHJcbiAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmdGaXh0dXJlcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZpeHR1cmVEYXRhOiBhbnlbXSA9IHJlcz8uZGF0YSB8fCBbXTtcclxuICAgICAgICB0aGlzLmZpeHR1cmVzID0gZml4dHVyZURhdGEubWFwKChmKSA9PiAoe1xyXG4gICAgICAgICAgX2lkOiBmLl9pZCxcclxuICAgICAgICAgIGZpeHR1cmVOdW1iZXI6IGYuZml4dHVyZU51bWJlcixcclxuICAgICAgICAgIGZpeHR1cmVOYW1lOiBmLmZpeHR1cmVOYW1lIHx8ICcnLFxyXG4gICAgICAgICAgZml4dHVyZUNhdGVnb3J5OiBmLmZpeHR1cmVDYXRlZ29yeSB8fCAnJyxcclxuICAgICAgICAgIGZpeHR1cmVXaWR0aFZhbHVlOiBmLmZpeHR1cmVXaWR0aFZhbHVlID8/IDAsXHJcbiAgICAgICAgICBhc3NvY2lhdGVkRWxlbWVudFR5cGU6IGYuYXNzb2NpYXRlZEVsZW1lbnRUeXBlIHx8ICcnLFxyXG4gICAgICAgICAgYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyOlxyXG4gICAgICAgICAgICBmLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlciA/PyBudWxsLFxyXG4gICAgICAgICAgZGlzcGxheU5hbWU6IGBGaXh0dXJlICR7Zi5maXh0dXJlTnVtYmVyfWAsXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHRoaXMucm93cyA9IHRoaXMuZml4dHVyZXMubGVuZ3RoID8gW3RoaXMubWFrZUVtcHR5Um93KCldIDogW107XHJcbiAgICAgICAgdGhpcy5yZWNvbXB1dGVGbGFncygpO1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWRTdG9yZXMoKSB7XHJcbiAgICB0aGlzLnNic1xyXG4gICAgICAuZ2V0U3RvcmVPckNsdXN0ZXJMaXN0KHsgc2VhcmNoTW9kZTogJ3N0b3JlJyB9KVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zdG9yZU9wdGlvbnMgPSByZXM/LmRhdGEgfHwgW107XHJcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnN0b3JlT3B0aW9ucyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZWZldGNoVGVtcGxhdGVzKCkge1xyXG4gICAgdGhpcy5nZXRDYWNoZWRUZW1wbGF0ZXMoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6ICh0ZW1wbGF0ZXMpID0+IHtcclxuICAgICAgICAgIHRoaXMudGVtcGxhdGVzID0gdGVtcGxhdGVzO1xyXG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZXMgPSBbXTtcclxuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDYWNoZWRUZW1wbGF0ZXMoKTogT2JzZXJ2YWJsZTxUZW1wbGF0ZUl0ZW1bXT4ge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnRlbXBsYXRlc0NhY2hlJCAmJlxyXG4gICAgICB0aGlzLmNhY2hlZFRlbXBsYXRlc0NsaWVudElkID09PSB0aGlzLmNsaWVudElkXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVzQ2FjaGUkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYWNoZWRUZW1wbGF0ZXNDbGllbnRJZCA9IHRoaXMuY2xpZW50SWQ7XHJcbiAgICB0aGlzLnRlbXBsYXRlc0NhY2hlJCA9IHRoaXMuc2JzXHJcbiAgICAgIC5nZXRBbGxUZW1wbGF0ZXMoeyBjbGllbnRJZDogdGhpcy5jbGllbnRJZCB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCB0cGxEYXRhOiBhbnlbXSA9IHJlcz8uZGF0YSB8fCBbXTtcclxuICAgICAgICAgIHJldHVybiB0cGxEYXRhLm1hcCgodCkgPT4gKHtcclxuICAgICAgICAgICAgX2lkOiB0Ll9pZCxcclxuICAgICAgICAgICAgZml4dHVyZU5hbWU6IHQuZml4dHVyZU5hbWUsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiB0LmZpeHR1cmVOYW1lPy5pbmNsdWRlcygnLWZ0JylcclxuICAgICAgICAgICAgICA/IHQuZml4dHVyZU5hbWVcclxuICAgICAgICAgICAgICA6IGAke3QuZml4dHVyZU5hbWV9IC0gJHt0LmZpeHR1cmVXaWR0aD8udmFsdWUgPz8gJyd9ICR7XHJcbiAgICAgICAgICAgICAgICAgIHQuZml4dHVyZVdpZHRoPy51bml0ID8/ICcnXHJcbiAgICAgICAgICAgICAgICB9YCxcclxuICAgICAgICAgICAgc3VidGV4dDogKHQucHJvZHVjdEJyYW5kTmFtZSB8fCBbXSkuam9pbignLCAnKSxcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiBmYWxzZSB9KSxcclxuICAgICAgKTtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlc0NhY2hlJDtcclxuICB9XHJcblxyXG4gIG9uU3RvcmVTZWxlY3RlZChzdG9yZUlkOiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgICBpZiAoIXN0b3JlSWQgfHwgc3RvcmVJZCA9PT0gdGhpcy5zZWxlY3RlZFN0b3JlPy5pZCkgcmV0dXJuO1xyXG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlT3B0aW9ucy5maW5kKChzKSA9PiBzLmlkID09PSBzdG9yZUlkKTtcclxuICAgIGlmICghc3RvcmUpIHJldHVybjtcclxuICAgIHRoaXMuc3RvcmVTZWxlY3RlZCQubmV4dChzdG9yZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1ha2VFbXB0eVJvdygpOiBTd2FwUm93IHtcclxuICAgIGNvbnN0IHJvdzogU3dhcFJvdyA9IHtcclxuICAgICAgcm93SWQ6ICsrdGhpcy5yb3dJZFNlcSxcclxuICAgICAgZml4dHVyZUlkOiBudWxsLFxyXG4gICAgICB0ZW1wbGF0ZUlkOiBudWxsLFxyXG4gICAgICBmaXh0dXJlOiBudWxsLFxyXG4gICAgICB0ZW1wbGF0ZTogbnVsbCxcclxuICAgICAgZml4dHVyZU9wdGlvbnM6IFtdLFxyXG4gICAgICB3YWxsUG9zaXRpb246ICcnLFxyXG4gICAgfTtcclxuICAgIHJvdy5maXh0dXJlT3B0aW9ucyA9IHRoaXMuY29tcHV0ZUZpeHR1cmVPcHRpb25zKHJvdyk7XHJcbiAgICByZXR1cm4gcm93O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wdXRlRml4dHVyZU9wdGlvbnMoZXhjbHVkZVJvdzogU3dhcFJvdyB8IG51bGwpOiBGaXh0dXJlSXRlbVtdIHtcclxuICAgIGNvbnN0IHVzZWRJZHMgPSBuZXcgU2V0KFxyXG4gICAgICB0aGlzLnJvd3NcclxuICAgICAgICAuZmlsdGVyKChyKSA9PiByICE9PSBleGNsdWRlUm93ICYmIHI/LmZpeHR1cmUpXHJcbiAgICAgICAgLm1hcCgocikgPT4gci5maXh0dXJlIS5faWQpLFxyXG4gICAgKTtcclxuICAgIHJldHVybiB0aGlzLmZpeHR1cmVzLmZpbHRlcigoZikgPT4gIXVzZWRJZHMuaGFzKGYuX2lkKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZnJlc2hBbGxGaXh0dXJlT3B0aW9ucygpIHtcclxuICAgIHRoaXMucm93cy5mb3JFYWNoKChyKSA9PiB7XHJcbiAgICAgIHIuZml4dHVyZU9wdGlvbnMgPSB0aGlzLmNvbXB1dGVGaXh0dXJlT3B0aW9ucyhyKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wdXRlV2FsbFBvc2l0aW9uKGZpeHR1cmU6IEZpeHR1cmVJdGVtIHwgbnVsbCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWZpeHR1cmUpIHJldHVybiAnJztcclxuICAgIGlmIChcclxuICAgICAgZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudFR5cGUgPT09ICd3YWxsJyAmJlxyXG4gICAgICBmaXh0dXJlLmFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlciAhPSBudWxsXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIGBXYWxsICR7Zml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXJ9YDtcclxuICAgIH1cclxuICAgIGlmIChmaXh0dXJlLmFzc29jaWF0ZWRFbGVtZW50VHlwZSA9PT0gJ2Zsb29yJykgcmV0dXJuICdGbG9vcic7XHJcbiAgICByZXR1cm4gZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudFR5cGVcclxuICAgICAgPyBmaXh0dXJlLmFzc29jaWF0ZWRFbGVtZW50VHlwZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArXHJcbiAgICAgICAgICBmaXh0dXJlLmFzc29jaWF0ZWRFbGVtZW50VHlwZS5zbGljZSgxKVxyXG4gICAgICA6ICfigJQnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWNvbXB1dGVGbGFncygpIHtcclxuICAgIGNvbnN0IGxhc3QgPSB0aGlzLnJvd3NbdGhpcy5yb3dzLmxlbmd0aCAtIDFdO1xyXG4gICAgdGhpcy5jYW5BZGRSb3cgPVxyXG4gICAgICB0aGlzLnJvd3MubGVuZ3RoID4gMCAmJlxyXG4gICAgICB0aGlzLnJvd3MubGVuZ3RoIDwgdGhpcy5maXh0dXJlcy5sZW5ndGggJiZcclxuICAgICAgISFsYXN0Py5maXh0dXJlICYmXHJcbiAgICAgICEhbGFzdD8udGVtcGxhdGU7XHJcblxyXG4gICAgdGhpcy5jYW5TdWJtaXQgPVxyXG4gICAgICAhIXRoaXMuc2VsZWN0ZWRTdG9yZSAmJlxyXG4gICAgICB0aGlzLnJvd3MubGVuZ3RoID4gMCAmJlxyXG4gICAgICB0aGlzLnJvd3MuZXZlcnkoKHIpID0+ICEhci5maXh0dXJlICYmICEhci50ZW1wbGF0ZSk7XHJcbiAgfVxyXG5cclxuICBvblJvd0ZpeHR1cmVDaGFuZ2Uocm93OiBTd2FwUm93LCBmaXh0dXJlSWQ6IHN0cmluZyB8IG51bGwpIHtcclxuICAgIHJvdy5maXh0dXJlSWQgPSBmaXh0dXJlSWQ7XHJcbiAgICByb3cuZml4dHVyZSA9IGZpeHR1cmVJZFxyXG4gICAgICA/IHRoaXMuZml4dHVyZXMuZmluZCgoZikgPT4gZi5faWQgPT09IGZpeHR1cmVJZCkgfHwgbnVsbFxyXG4gICAgICA6IG51bGw7XHJcbiAgICByb3cud2FsbFBvc2l0aW9uID0gdGhpcy5jb21wdXRlV2FsbFBvc2l0aW9uKHJvdy5maXh0dXJlKTtcclxuICAgIHRoaXMucmVmcmVzaEFsbEZpeHR1cmVPcHRpb25zKCk7XHJcbiAgICB0aGlzLnJlY29tcHV0ZUZsYWdzKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIG9uUm93VGVtcGxhdGVDaGFuZ2Uocm93OiBTd2FwUm93LCB0ZW1wbGF0ZUlkOiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgICByb3cudGVtcGxhdGVJZCA9IHRlbXBsYXRlSWQ7XHJcbiAgICByb3cudGVtcGxhdGUgPSB0ZW1wbGF0ZUlkXHJcbiAgICAgID8gdGhpcy50ZW1wbGF0ZXMuZmluZCgodCkgPT4gdC5faWQgPT09IHRlbXBsYXRlSWQpIHx8IG51bGxcclxuICAgICAgOiBudWxsO1xyXG4gICAgdGhpcy5yZWNvbXB1dGVGbGFncygpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBhZGRSb3coKSB7XHJcbiAgICBpZiAoIXRoaXMuY2FuQWRkUm93KSByZXR1cm47XHJcbiAgICB0aGlzLnJvd3MucHVzaCh0aGlzLm1ha2VFbXB0eVJvdygpKTtcclxuICAgIHRoaXMucmVjb21wdXRlRmxhZ3MoKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlUm93KGluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLnJvd3MubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHRoaXMucm93c1swXSA9IHRoaXMubWFrZUVtcHR5Um93KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJvd3Muc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVmcmVzaEFsbEZpeHR1cmVPcHRpb25zKCk7XHJcbiAgICB0aGlzLnJlY29tcHV0ZUZsYWdzKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIG9uQ2FuY2VsKCkge1xyXG4gICAgdGhpcy5yZXNldFNlbGVjdGlvbigpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0U2VsZWN0aW9uKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFN0b3JlID0gbnVsbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZUlkID0gbnVsbDtcclxuICAgIHRoaXMuZml4dHVyZXMgPSBbXTtcclxuICAgIHRoaXMucm93cyA9IFtdO1xyXG4gICAgdGhpcy5pc0xvYWRpbmdGaXh0dXJlcyA9IGZhbHNlO1xyXG4gICAgdGhpcy5yZWNvbXB1dGVGbGFncygpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICBpZiAoIXRoaXMuY2FuU3VibWl0IHx8ICF0aGlzLnNlbGVjdGVkU3RvcmUgfHwgdGhpcy5pc1N1Ym1pdHRpbmcpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBzdG9yZU5hbWUgPSB0aGlzLnNlbGVjdGVkU3RvcmUubGFiZWw7XHJcbiAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICBkYXRhOiB0aGlzLnJvd3MubWFwKChyKSA9PiAoe1xyXG4gICAgICAgIHN0b3JlTmFtZSxcclxuICAgICAgICBmaXh0dXJlSWQ6IHIuZml4dHVyZSEuX2lkLFxyXG4gICAgICAgIGZpeHR1cmVOdW1iZXI6IHIuZml4dHVyZSEuZml4dHVyZU51bWJlcixcclxuICAgICAgICB0ZW1wbGF0ZUlkOiByLnRlbXBsYXRlIS5faWQsXHJcbiAgICAgICAgdGVtcGxhdGVOYW1lOiByLnRlbXBsYXRlIS5maXh0dXJlTmFtZSxcclxuICAgICAgfSkpLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm1Td2FwKHBheWxvYWQuZGF0YS5sZW5ndGgpO1xyXG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmlzU3VibWl0dGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIHRoaXMuc2JzXHJcbiAgICAgIC5zd2FwRml4dHVyZVRlbXBsYXRlKHBheWxvYWQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzdWNjZXNzQ291bnQgPSByZXM/LmRhdGE/LnN1Y2Nlc3NDb3VudCA/PyAwO1xyXG4gICAgICAgICAgY29uc3QgZXJyb3JDb3VudCA9IHJlcz8uZGF0YT8uZXJyb3JDb3VudCA/PyAwO1xyXG4gICAgICAgICAgY29uc3QgZXJyb3JzID0gcmVzPy5kYXRhPy5lcnJvcnMgfHwgW107XHJcbiAgICAgICAgICBpZiAoZXJyb3JDb3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChcclxuICAgICAgICAgICAgICBgU3dhcHBlZCAke3N1Y2Nlc3NDb3VudH0gZml4dHVyZSB0ZW1wbGF0ZShzKSBzdWNjZXNzZnVsbHkuYCxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5vbkNhbmNlbCgpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChzdWNjZXNzQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0V2FybmluZ1RvYXN0KFxyXG4gICAgICAgICAgICAgIGBQYXJ0aWFsOiAke3N1Y2Nlc3NDb3VudH0gc3VjY2VlZGVkLCAke2Vycm9yQ291bnR9IGZhaWxlZC4gJHt0aGlzLnN1bW1hcml6ZUVycm9ycyhlcnJvcnMpfWAsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICAgICAgYEFsbCAke2Vycm9yQ291bnR9IHN3YXAocykgZmFpbGVkLiAke3RoaXMuc3VtbWFyaXplRXJyb3JzKGVycm9ycyl9YCxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChcclxuICAgICAgICAgICAgZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHN3YXAgZml4dHVyZSB0ZW1wbGF0ZS4nLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3VtbWFyaXplRXJyb3JzKFxyXG4gICAgZXJyb3JzOiB7IGZpeHR1cmVOdW1iZXI6IG51bWJlcjsgZXJyb3I6IHN0cmluZyB9W10sXHJcbiAgKTogc3RyaW5nIHtcclxuICAgIGlmICghZXJyb3JzPy5sZW5ndGgpIHJldHVybiAnJztcclxuICAgIGNvbnN0IGZpcnN0ID0gZXJyb3JzXHJcbiAgICAgIC5zbGljZSgwLCAyKVxyXG4gICAgICAubWFwKChlKSA9PiBgIyR7ZS5maXh0dXJlTnVtYmVyfTogJHtlLmVycm9yfWApXHJcbiAgICAgIC5qb2luKCc7ICcpO1xyXG4gICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPiAyID8gYCR7Zmlyc3R9OyDigKZgIDogZmlyc3Q7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNvbmZpcm1Td2FwKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQsIHtcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgfSk7XHJcbiAgICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gJ0NvbmZpcm0gdGVtcGxhdGUgc3dhcCc7XHJcbiAgICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLmRlc2NyaXB0aW9uID0gYFRoaXMgd2lsbCBvdmVyd3JpdGUgJHtjb3VudH0gZml4dHVyZShzKSB3aXRoIHRoZSBjaG9zZW4gdGVtcGxhdGVzIGFuZCBkZWxldGUgdGhlaXIgZXhpc3Rpbmcgc2hlbHZlcy4gVGhpcyBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS4gQ29udGludWU/YDtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbW9kZWxSZWYucmVzdWx0O1xyXG4gICAgICByZXR1cm4gcmVzdWx0ID09PSAnb2snO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRyYWNrQnlSb3cgPSAoXzogbnVtYmVyLCByb3c6IFN3YXBSb3cpID0+IHJvdy5yb3dJZDtcclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIHRoaXMuc3RvcmVTZWxlY3RlZCQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPHNlY3Rpb24gY2xhc3M9XCJzd2FwLXRlbXBsYXRlIHAtM1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJjYXJkIHAtNFwiIHN0eWxlPVwibWF4LXdpZHRoOiA5MDBweDtcIj5cclxuICAgIDxoNSBjbGFzcz1cIm1iLTNcIj5Td2FwIEZpeHR1cmUgVGVtcGxhdGU8L2g1PlxyXG5cclxuICAgIDwhLS0gU3RvcmUgU2VsZWN0IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3RcclxuICAgICAgICBsYWJlbD1cIlN0b3JlXCJcclxuICAgICAgICBbaWRGaWVsZF09XCInaWQnXCJcclxuICAgICAgICBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgIFtkYXRhXT1cInN0b3JlT3B0aW9uc1wiXHJcbiAgICAgICAgW3NlYXJjaF09XCJ0cnVlXCJcclxuICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZFN0b3JlSWRcIlxyXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU3RvcmVTZWxlY3RlZCgkZXZlbnQpXCI+XHJcbiAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFN0b3JlXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0xvYWRpbmdGaXh0dXJlczsgZWxzZSBsb2FkZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBtYi0zXCI+TG9hZGluZyBmaXh0dXJlc+KApjwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjbG9hZGVkPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaXh0dXJlcy5sZW5ndGg7IGVsc2Ugbm9GaXh0dXJlc1wiPlxyXG4gICAgICAgICAgPCEtLSBTd2FwIFJvd3MgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3dhcC1yb3dzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Um93XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInN3YXAtcm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctMiBhbGlnbi1pdGVtcy1zdGFydFwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBQbGFubyBGaXh0dXJlIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC01XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJQbGFubyBGaXh0dXJlXCJcclxuICAgICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCInX2lkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVGaWVsZF09XCInZGlzcGxheU5hbWUnXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJyb3cuZml4dHVyZU9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzZWFyY2hdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93LmZpeHR1cmVJZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Sb3dGaXh0dXJlQ2hhbmdlKHJvdywgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93LmZpeHR1cmVcIiBjbGFzcz1cImZpeHR1cmUtaW5mbyBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5OYW1lOjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IHJvdy5maXh0dXJlLmZpeHR1cmVOYW1lIHx8ICfigJQnIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5Qb3NpdGlvbjo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyByb3cud2FsbFBvc2l0aW9uIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBBcnJvdyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy10b3A6IDMwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJyb3dcIj7ihpI8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFN3YXBwaW5nIFRlbXBsYXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC01XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJTd2FwcGluZyBUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2lkRmllbGRdPVwiJ19pZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lRmllbGRdPVwiJ2Rpc3BsYXlOYW1lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3N1YlRleHRGaWVsZF09XCInc3VidGV4dCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cInRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NlYXJjaF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3cudGVtcGxhdGVJZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Sb3dUZW1wbGF0ZUNoYW5nZShyb3csICRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBSZW1vdmUgUm93IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCJcclxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLXRvcDogMzBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgcC0wIHJlbW92ZS1idG5cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVSb3coaSlcIiB0aXRsZT1cIlJlbW92ZSByb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyb3dzLmxlbmd0aCA9PT0gMSAmJiAhcm93LmZpeHR1cmUgJiYgIXJvdy50ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAxTDEgOU0xIDFMOSA5XCIgc3Ryb2tlPVwiIzM0NDA1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gQWRkIFJvdyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIHAtMCBhZGQtYnRuXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkUm93KClcIiBbZGlzYWJsZWRdPVwiIWNhbkFkZFJvd1wiPlxyXG4gICAgICAgICAgICAgICsgQWRkIGFub3RoZXIgc3dhcFxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gQWN0aW9ucyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTIgbXQtNFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJvbkNhbmNlbCgpXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNTdWJtaXR0aW5nXCI+XHJcbiAgICAgICAgICAgICAgQ2FuY2VsXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJvblN1Ym1pdCgpXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhblN1Ym1pdCB8fCBpc1N1Ym1pdHRpbmdcIj5cclxuICAgICAgICAgICAgICB7eyBpc1N1Ym1pdHRpbmcgPyAnU3VibWl0dGluZ+KApicgOiAnU3VibWl0JyB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI25vRml4dHVyZXM+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZFwiPk5vIGZpeHR1cmVzIGZvdW5kIGZvciB0aGlzIHN0b3JlLjwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG4iXX0=
328
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dhcC10ZW1wbGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9wbGFuby10b29scy9zd2FwLXRlbXBsYXRlL3N3YXAtdGVtcGxhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvc3dhcC10ZW1wbGF0ZS9zd2FwLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxHQUdWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sUUFBUSxFQUNSLEdBQUcsRUFFSCxFQUFFLEVBQ0YsV0FBVyxFQUNYLE9BQU8sRUFDUCxTQUFTLEVBQ1QsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUlkLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGdFQUFnRSxDQUFDOzs7Ozs7Ozs7O0FBeUM3RyxNQUFNLE9BQU8scUJBQXFCO0lBd0J0QjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBM0JWLFFBQVEsQ0FBUztJQUVqQixZQUFZLEdBQWdCLEVBQUUsQ0FBQztJQUMvQixlQUFlLEdBQWtCLElBQUksQ0FBQztJQUN0QyxhQUFhLEdBQXFCLElBQUksQ0FBQztJQUV2QyxRQUFRLEdBQWtCLEVBQUUsQ0FBQztJQUM3QixTQUFTLEdBQW1CLEVBQUUsQ0FBQztJQUMvQixJQUFJLEdBQWMsRUFBRSxDQUFDO0lBRXJCLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUMxQixZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRXJCLFNB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blN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHtcclxuICBjYXRjaEVycm9yLFxyXG4gIGRlYm91bmNlVGltZSxcclxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcclxuICBmaWx0ZXIsXHJcbiAgZmluYWxpemUsXHJcbiAgbWFwLFxyXG4gIE9ic2VydmFibGUsXHJcbiAgb2YsXHJcbiAgc2hhcmVSZXBsYXksXHJcbiAgU3ViamVjdCxcclxuICBzd2l0Y2hNYXAsXHJcbiAgdGFrZVVudGlsLFxyXG4gIHRhcCxcclxufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc3RvcmUtYnVpbGRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcG9wdXBzL2RlbGV0ZS1jb25maXJtYXRpb24vZGVsZXRlLWNvbmZpcm1hdGlvbi5jb21wb25lbnQnO1xyXG5cclxuaW50ZXJmYWNlIFN0b3JlSXRlbSB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgRml4dHVyZUl0ZW0ge1xyXG4gIF9pZDogc3RyaW5nO1xyXG4gIGZpeHR1cmVOdW1iZXI6IG51bWJlcjtcclxuICBmaXh0dXJlTmFtZTogc3RyaW5nO1xyXG4gIGZpeHR1cmVDYXRlZ29yeTogc3RyaW5nO1xyXG4gIGZpeHR1cmVXaWR0aFZhbHVlOiBudW1iZXI7XHJcbiAgYXNzb2NpYXRlZEVsZW1lbnRUeXBlOiBzdHJpbmc7XHJcbiAgYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyOiBudW1iZXIgfCBudWxsO1xyXG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBUZW1wbGF0ZUl0ZW0ge1xyXG4gIF9pZDogc3RyaW5nO1xyXG4gIGZpeHR1cmVOYW1lOiBzdHJpbmc7XHJcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcclxuICBzdWJ0ZXh0OiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBTd2FwUm93IHtcclxuICByb3dJZDogbnVtYmVyO1xyXG4gIGZpeHR1cmVJZDogc3RyaW5nIHwgbnVsbDtcclxuICB0ZW1wbGF0ZUlkOiBzdHJpbmcgfCBudWxsO1xyXG4gIGZpeHR1cmU6IEZpeHR1cmVJdGVtIHwgbnVsbDtcclxuICB0ZW1wbGF0ZTogVGVtcGxhdGVJdGVtIHwgbnVsbDtcclxuICBmaXh0dXJlT3B0aW9uczogRml4dHVyZUl0ZW1bXTtcclxuICB3YWxsUG9zaXRpb246IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItc3dhcC10ZW1wbGF0ZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3N3YXAtdGVtcGxhdGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9zd2FwLXRlbXBsYXRlLmNvbXBvbmVudC5zY3NzJyxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFN3YXBUZW1wbGF0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG5cclxuICBzdG9yZU9wdGlvbnM6IFN0b3JlSXRlbVtdID0gW107XHJcbiAgc2VsZWN0ZWRTdG9yZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBzZWxlY3RlZFN0b3JlOiBTdG9yZUl0ZW0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgZml4dHVyZXM6IEZpeHR1cmVJdGVtW10gPSBbXTtcclxuICB0ZW1wbGF0ZXM6IFRlbXBsYXRlSXRlbVtdID0gW107XHJcbiAgcm93czogU3dhcFJvd1tdID0gW107XHJcblxyXG4gIGlzTG9hZGluZ0ZpeHR1cmVzID0gZmFsc2U7XHJcbiAgaXNTdWJtaXR0aW5nID0gZmFsc2U7XHJcblxyXG4gIGNhbkFkZFJvdyA9IGZhbHNlO1xyXG4gIGNhblN1Ym1pdCA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlU2VsZWN0ZWQkID0gbmV3IFN1YmplY3Q8U3RvcmVJdGVtPigpO1xyXG4gIHByaXZhdGUgdGVtcGxhdGVzQ2FjaGUkOiBPYnNlcnZhYmxlPFRlbXBsYXRlSXRlbVtdPiB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgY2FjaGVkVGVtcGxhdGVzQ2xpZW50SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcm93SWRTZXEgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgc2JzOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcclxuICAgICAgICBmaWx0ZXIoKGRhdGEpID0+ICEhZGF0YSksXHJcbiAgICAgICAgbWFwKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChkYXRhPy5jbGllbnQpIHJldHVybiBkYXRhLmNsaWVudCBhcyBzdHJpbmc7XHJcbiAgICAgICAgICBjb25zdCBoZWFkZXJEYXRhID0gSlNPTi5wYXJzZShcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJykgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybiBoZWFkZXJEYXRhPy5jbGllbnQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gISFpZCksXHJcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChjbGllbnRJZCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlc0NhY2hlJCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jYWNoZWRUZW1wbGF0ZXNDbGllbnRJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5yZXNldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIHRoaXMubG9hZFN0b3JlcygpO1xyXG4gICAgICAgIHRoaXMucHJlZmV0Y2hUZW1wbGF0ZXMoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5zdG9yZVNlbGVjdGVkJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgICAgdGFwKChzdG9yZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlID0gc3RvcmU7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcmVJZCA9IHN0b3JlLmlkO1xyXG4gICAgICAgICAgdGhpcy5maXh0dXJlcyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5yb3dzID0gW107XHJcbiAgICAgICAgICB0aGlzLnJlY29tcHV0ZUZsYWdzKCk7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZ0ZpeHR1cmVzID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoc3RvcmUpID0+XHJcbiAgICAgICAgICB0aGlzLnNic1xyXG4gICAgICAgICAgICAuZ2V0Rml4dHVyZURldGFpbHNCeVN0b3JlKHN0b3JlLmxhYmVsLCB0aGlzLmNsaWVudElkKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKHsgZGF0YTogW10gfSkpLFxyXG4gICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nRml4dHVyZXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBmaXh0dXJlRGF0YTogYW55W10gPSByZXM/LmRhdGEgfHwgW107XHJcbiAgICAgICAgdGhpcy5maXh0dXJlcyA9IGZpeHR1cmVEYXRhLm1hcCgoZikgPT4gKHtcclxuICAgICAgICAgIF9pZDogZi5faWQsXHJcbiAgICAgICAgICBmaXh0dXJlTnVtYmVyOiBmLmZpeHR1cmVOdW1iZXIsXHJcbiAgICAgICAgICBmaXh0dXJlTmFtZTogZi5maXh0dXJlTmFtZSB8fCAnJyxcclxuICAgICAgICAgIGZpeHR1cmVDYXRlZ29yeTogZi5maXh0dXJlQ2F0ZWdvcnkgfHwgJycsXHJcbiAgICAgICAgICBmaXh0dXJlV2lkdGhWYWx1ZTogZi5maXh0dXJlV2lkdGhWYWx1ZSA/PyAwLFxyXG4gICAgICAgICAgYXNzb2NpYXRlZEVsZW1lbnRUeXBlOiBmLmFzc29jaWF0ZWRFbGVtZW50VHlwZSB8fCAnJyxcclxuICAgICAgICAgIGFzc29jaWF0ZWRFbGVtZW50Rml4dHVyZU51bWJlcjpcclxuICAgICAgICAgICAgZi5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIgPz8gbnVsbCxcclxuICAgICAgICAgIGRpc3BsYXlOYW1lOiBgRml4dHVyZSAke2YuZml4dHVyZU51bWJlcn1gLFxyXG4gICAgICAgIH0pKTtcclxuICAgICAgICB0aGlzLnJvd3MgPSB0aGlzLmZpeHR1cmVzLmxlbmd0aCA/IFt0aGlzLm1ha2VFbXB0eVJvdygpXSA6IFtdO1xyXG4gICAgICAgIHRoaXMucmVjb21wdXRlRmxhZ3MoKTtcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBsb2FkU3RvcmVzKCkge1xyXG4gICAgdGhpcy5zYnNcclxuICAgICAgLmdldFN0b3JlT3JDbHVzdGVyTGlzdCh7IHNlYXJjaE1vZGU6ICdzdG9yZScgfSlcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3RvcmVPcHRpb25zID0gcmVzPy5kYXRhIHx8IFtdO1xyXG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zdG9yZU9wdGlvbnMgPSBbXTtcclxuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVmZXRjaFRlbXBsYXRlcygpIHtcclxuICAgIHRoaXMuZ2V0Q2FjaGVkVGVtcGxhdGVzKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAodGVtcGxhdGVzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlcyA9IHRlbXBsYXRlcztcclxuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMudGVtcGxhdGVzID0gW107XHJcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q2FjaGVkVGVtcGxhdGVzKCk6IE9ic2VydmFibGU8VGVtcGxhdGVJdGVtW10+IHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy50ZW1wbGF0ZXNDYWNoZSQgJiZcclxuICAgICAgdGhpcy5jYWNoZWRUZW1wbGF0ZXNDbGllbnRJZCA9PT0gdGhpcy5jbGllbnRJZFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlc0NhY2hlJDtcclxuICAgIH1cclxuICAgIHRoaXMuY2FjaGVkVGVtcGxhdGVzQ2xpZW50SWQgPSB0aGlzLmNsaWVudElkO1xyXG4gICAgdGhpcy50ZW1wbGF0ZXNDYWNoZSQgPSB0aGlzLnNic1xyXG4gICAgICAuZ2V0QWxsVGVtcGxhdGVzKHsgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdHBsRGF0YTogYW55W10gPSByZXM/LmRhdGEgfHwgW107XHJcbiAgICAgICAgICByZXR1cm4gdHBsRGF0YS5tYXAoKHQpID0+ICh7XHJcbiAgICAgICAgICAgIF9pZDogdC5faWQsXHJcbiAgICAgICAgICAgIGZpeHR1cmVOYW1lOiB0LmZpeHR1cmVOYW1lLFxyXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogdC5maXh0dXJlTmFtZT8uaW5jbHVkZXMoJy1mdCcpXHJcbiAgICAgICAgICAgICAgPyB0LmZpeHR1cmVOYW1lXHJcbiAgICAgICAgICAgICAgOiBgJHt0LmZpeHR1cmVOYW1lfSAtICR7dC5maXh0dXJlV2lkdGg/LnZhbHVlID8/ICcnfSAke1xyXG4gICAgICAgICAgICAgICAgICB0LmZpeHR1cmVXaWR0aD8udW5pdCA/PyAnJ1xyXG4gICAgICAgICAgICAgICAgfWAsXHJcbiAgICAgICAgICAgIHN1YnRleHQ6ICh0LnByb2R1Y3RCcmFuZE5hbWUgfHwgW10pLmpvaW4oJywgJyksXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogZmFsc2UgfSksXHJcbiAgICAgICk7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZXNDYWNoZSQ7XHJcbiAgfVxyXG5cclxuICBvblN0b3JlU2VsZWN0ZWQoc3RvcmVJZDogc3RyaW5nIHwgbnVsbCkge1xyXG4gICAgaWYgKCFzdG9yZUlkIHx8IHN0b3JlSWQgPT09IHRoaXMuc2VsZWN0ZWRTdG9yZT8uaWQpIHJldHVybjtcclxuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5zdG9yZU9wdGlvbnMuZmluZCgocykgPT4gcy5pZCA9PT0gc3RvcmVJZCk7XHJcbiAgICBpZiAoIXN0b3JlKSByZXR1cm47XHJcbiAgICB0aGlzLnN0b3JlU2VsZWN0ZWQkLm5leHQoc3RvcmUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYWtlRW1wdHlSb3coKTogU3dhcFJvdyB7XHJcbiAgICBjb25zdCByb3c6IFN3YXBSb3cgPSB7XHJcbiAgICAgIHJvd0lkOiArK3RoaXMucm93SWRTZXEsXHJcbiAgICAgIGZpeHR1cmVJZDogbnVsbCxcclxuICAgICAgdGVtcGxhdGVJZDogbnVsbCxcclxuICAgICAgZml4dHVyZTogbnVsbCxcclxuICAgICAgdGVtcGxhdGU6IG51bGwsXHJcbiAgICAgIGZpeHR1cmVPcHRpb25zOiBbXSxcclxuICAgICAgd2FsbFBvc2l0aW9uOiAnJyxcclxuICAgIH07XHJcbiAgICByb3cuZml4dHVyZU9wdGlvbnMgPSB0aGlzLmNvbXB1dGVGaXh0dXJlT3B0aW9ucyhyb3cpO1xyXG4gICAgcmV0dXJuIHJvdztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tcHV0ZUZpeHR1cmVPcHRpb25zKGV4Y2x1ZGVSb3c6IFN3YXBSb3cgfCBudWxsKTogRml4dHVyZUl0ZW1bXSB7XHJcbiAgICBjb25zdCB1c2VkSWRzID0gbmV3IFNldChcclxuICAgICAgdGhpcy5yb3dzXHJcbiAgICAgICAgLmZpbHRlcigocikgPT4gciAhPT0gZXhjbHVkZVJvdyAmJiByPy5maXh0dXJlKVxyXG4gICAgICAgIC5tYXAoKHIpID0+IHIuZml4dHVyZSEuX2lkKSxcclxuICAgICk7XHJcbiAgICByZXR1cm4gdGhpcy5maXh0dXJlcy5maWx0ZXIoKGYpID0+ICF1c2VkSWRzLmhhcyhmLl9pZCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoQWxsRml4dHVyZU9wdGlvbnMoKSB7XHJcbiAgICB0aGlzLnJvd3MuZm9yRWFjaCgocikgPT4ge1xyXG4gICAgICByLmZpeHR1cmVPcHRpb25zID0gdGhpcy5jb21wdXRlRml4dHVyZU9wdGlvbnMocik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tcHV0ZVdhbGxQb3NpdGlvbihmaXh0dXJlOiBGaXh0dXJlSXRlbSB8IG51bGwpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFmaXh0dXJlKSByZXR1cm4gJyc7XHJcbiAgICBpZiAoXHJcbiAgICAgIGZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRUeXBlID09PSAnd2FsbCcgJiZcclxuICAgICAgZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudEZpeHR1cmVOdW1iZXIgIT0gbnVsbFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBgV2FsbCAke2ZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRGaXh0dXJlTnVtYmVyfWA7XHJcbiAgICB9XHJcbiAgICBpZiAoZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudFR5cGUgPT09ICdmbG9vcicpIHJldHVybiAnRmxvb3InO1xyXG4gICAgcmV0dXJuIGZpeHR1cmUuYXNzb2NpYXRlZEVsZW1lbnRUeXBlXHJcbiAgICAgID8gZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudFR5cGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgK1xyXG4gICAgICAgICAgZml4dHVyZS5hc3NvY2lhdGVkRWxlbWVudFR5cGUuc2xpY2UoMSlcclxuICAgICAgOiAn4oCUJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVjb21wdXRlRmxhZ3MoKSB7XHJcbiAgICBjb25zdCBsYXN0ID0gdGhpcy5yb3dzW3RoaXMucm93cy5sZW5ndGggLSAxXTtcclxuICAgIHRoaXMuY2FuQWRkUm93ID1cclxuICAgICAgdGhpcy5yb3dzLmxlbmd0aCA+IDAgJiZcclxuICAgICAgdGhpcy5yb3dzLmxlbmd0aCA8IHRoaXMuZml4dHVyZXMubGVuZ3RoICYmXHJcbiAgICAgICEhbGFzdD8uZml4dHVyZSAmJlxyXG4gICAgICAhIWxhc3Q/LnRlbXBsYXRlO1xyXG5cclxuICAgIHRoaXMuY2FuU3VibWl0ID1cclxuICAgICAgISF0aGlzLnNlbGVjdGVkU3RvcmUgJiZcclxuICAgICAgdGhpcy5yb3dzLmxlbmd0aCA+IDAgJiZcclxuICAgICAgdGhpcy5yb3dzLmV2ZXJ5KChyKSA9PiAhIXIuZml4dHVyZSAmJiAhIXIudGVtcGxhdGUpO1xyXG4gIH1cclxuXHJcbiAgb25Sb3dGaXh0dXJlQ2hhbmdlKHJvdzogU3dhcFJvdywgZml4dHVyZUlkOiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgICByb3cuZml4dHVyZUlkID0gZml4dHVyZUlkO1xyXG4gICAgcm93LmZpeHR1cmUgPSBmaXh0dXJlSWRcclxuICAgICAgPyB0aGlzLmZpeHR1cmVzLmZpbmQoKGYpID0+IGYuX2lkID09PSBmaXh0dXJlSWQpIHx8IG51bGxcclxuICAgICAgOiBudWxsO1xyXG4gICAgcm93LndhbGxQb3NpdGlvbiA9IHRoaXMuY29tcHV0ZVdhbGxQb3NpdGlvbihyb3cuZml4dHVyZSk7XHJcbiAgICB0aGlzLnJlZnJlc2hBbGxGaXh0dXJlT3B0aW9ucygpO1xyXG4gICAgdGhpcy5yZWNvbXB1dGVGbGFncygpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBvblJvd1RlbXBsYXRlQ2hhbmdlKHJvdzogU3dhcFJvdywgdGVtcGxhdGVJZDogc3RyaW5nIHwgbnVsbCkge1xyXG4gICAgcm93LnRlbXBsYXRlSWQgPSB0ZW1wbGF0ZUlkO1xyXG4gICAgcm93LnRlbXBsYXRlID0gdGVtcGxhdGVJZFxyXG4gICAgICA/IHRoaXMudGVtcGxhdGVzLmZpbmQoKHQpID0+IHQuX2lkID09PSB0ZW1wbGF0ZUlkKSB8fCBudWxsXHJcbiAgICAgIDogbnVsbDtcclxuICAgIHRoaXMucmVjb21wdXRlRmxhZ3MoKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgYWRkUm93KCkge1xyXG4gICAgaWYgKCF0aGlzLmNhbkFkZFJvdykgcmV0dXJuO1xyXG4gICAgdGhpcy5yb3dzLnB1c2godGhpcy5tYWtlRW1wdHlSb3coKSk7XHJcbiAgICB0aGlzLnJlY29tcHV0ZUZsYWdzKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVJvdyhpbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5yb3dzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICB0aGlzLnJvd3NbMF0gPSB0aGlzLm1ha2VFbXB0eVJvdygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yb3dzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlZnJlc2hBbGxGaXh0dXJlT3B0aW9ucygpO1xyXG4gICAgdGhpcy5yZWNvbXB1dGVGbGFncygpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbCgpIHtcclxuICAgIHRoaXMucmVzZXRTZWxlY3Rpb24oKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldFNlbGVjdGlvbigpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZSA9IG51bGw7XHJcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmVJZCA9IG51bGw7XHJcbiAgICB0aGlzLmZpeHR1cmVzID0gW107XHJcbiAgICB0aGlzLnJvd3MgPSBbXTtcclxuICAgIHRoaXMuaXNMb2FkaW5nRml4dHVyZXMgPSBmYWxzZTtcclxuICAgIHRoaXMucmVjb21wdXRlRmxhZ3MoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uU3VibWl0KCkge1xyXG4gICAgaWYgKCF0aGlzLmNhblN1Ym1pdCB8fCAhdGhpcy5zZWxlY3RlZFN0b3JlIHx8IHRoaXMuaXNTdWJtaXR0aW5nKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgc3RvcmVOYW1lID0gdGhpcy5zZWxlY3RlZFN0b3JlLmxhYmVsO1xyXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgZGF0YTogdGhpcy5yb3dzLm1hcCgocikgPT4gKHtcclxuICAgICAgICBzdG9yZU5hbWUsXHJcbiAgICAgICAgZml4dHVyZUlkOiByLmZpeHR1cmUhLl9pZCxcclxuICAgICAgICBmaXh0dXJlTnVtYmVyOiByLmZpeHR1cmUhLmZpeHR1cmVOdW1iZXIsXHJcbiAgICAgICAgdGVtcGxhdGVJZDogci50ZW1wbGF0ZSEuX2lkLFxyXG4gICAgICAgIHRlbXBsYXRlTmFtZTogci50ZW1wbGF0ZSEuZml4dHVyZU5hbWUsXHJcbiAgICAgIH0pKSxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5jb25maXJtU3dhcChwYXlsb2FkLmRhdGEubGVuZ3RoKTtcclxuICAgIGlmICghY29uZmlybWVkKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB0aGlzLnNic1xyXG4gICAgICAuc3dhcEZpeHR1cmVUZW1wbGF0ZShwYXlsb2FkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgc3VjY2Vzc0NvdW50ID0gcmVzPy5kYXRhPy5zdWNjZXNzQ291bnQgPz8gMDtcclxuICAgICAgICAgIGNvbnN0IGVycm9yQ291bnQgPSByZXM/LmRhdGE/LmVycm9yQ291bnQgPz8gMDtcclxuICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHJlcz8uZGF0YT8uZXJyb3JzIHx8IFtdO1xyXG4gICAgICAgICAgaWYgKGVycm9yQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoXHJcbiAgICAgICAgICAgICAgYFN3YXBwZWQgJHtzdWNjZXNzQ291bnR9IGZpeHR1cmUgdGVtcGxhdGUocykgc3VjY2Vzc2Z1bGx5LmAsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMub25DYW5jZWwoKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoc3VjY2Vzc0NvdW50ID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldFdhcm5pbmdUb2FzdChcclxuICAgICAgICAgICAgICBgUGFydGlhbDogJHtzdWNjZXNzQ291bnR9IHN1Y2NlZWRlZCwgJHtlcnJvckNvdW50fSBmYWlsZWQuICR7dGhpcy5zdW1tYXJpemVFcnJvcnMoZXJyb3JzKX1gLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgICAgICAgIGBBbGwgJHtlcnJvckNvdW50fSBzd2FwKHMpIGZhaWxlZC4gJHt0aGlzLnN1bW1hcml6ZUVycm9ycyhlcnJvcnMpfWAsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICAgIGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBzd2FwIGZpeHR1cmUgdGVtcGxhdGUuJyxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1bW1hcml6ZUVycm9ycyhcclxuICAgIGVycm9yczogeyBmaXh0dXJlTnVtYmVyOiBudW1iZXI7IGVycm9yOiBzdHJpbmcgfVtdLFxyXG4gICk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWVycm9ycz8ubGVuZ3RoKSByZXR1cm4gJyc7XHJcbiAgICBjb25zdCBmaXJzdCA9IGVycm9yc1xyXG4gICAgICAuc2xpY2UoMCwgMilcclxuICAgICAgLm1hcCgoZSkgPT4gYCMke2UuZml4dHVyZU51bWJlcn06ICR7ZS5lcnJvcn1gKVxyXG4gICAgICAuam9pbignOyAnKTtcclxuICAgIHJldHVybiBlcnJvcnMubGVuZ3RoID4gMiA/IGAke2ZpcnN0fTsg4oCmYCA6IGZpcnN0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtU3dhcChjb3VudDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7XHJcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIH0pO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50aXRsZSA9ICdDb25maXJtIHRlbXBsYXRlIHN3YXAnO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9IGBUaGlzIHdpbGwgb3ZlcndyaXRlICR7Y291bnR9IGZpeHR1cmUocykgd2l0aCB0aGUgY2hvc2VuIHRlbXBsYXRlcyBhbmQgZGVsZXRlIHRoZWlyIGV4aXN0aW5nIHNoZWx2ZXMuIFRoaXMgYWN0aW9uIGNhbm5vdCBiZSB1bmRvbmUuIENvbnRpbnVlP2A7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsUmVmLnJlc3VsdDtcclxuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gJ29rJztcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0cmFja0J5Um93ID0gKF86IG51bWJlciwgcm93OiBTd2FwUm93KSA9PiByb3cucm93SWQ7XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLnN0b3JlU2VsZWN0ZWQkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxzZWN0aW9uIGNsYXNzPVwic3dhcC10ZW1wbGF0ZSBwLTNcIj5cclxuICA8bGliLXRvb2wtcGFnZS1oZWFkZXJcclxuICAgIHRpdGxlPVwiVGVtcGxhdGUgU3dhcFwiXHJcbiAgICBkZXNjcmlwdGlvbj1cIlJlcGxhY2Ugb25lIGZpeHR1cmUgdGVtcGxhdGUgd2l0aCBhbm90aGVyIGluIGEgcGxhbm9ncmFtLlwiXHJcbiAgPjwvbGliLXRvb2wtcGFnZS1oZWFkZXI+XHJcbiAgPGRpdiBjbGFzcz1cImNhcmQgcC00XCIgc3R5bGU9XCJtYXgtd2lkdGg6IDkwMHB4O1wiPlxyXG5cclxuICAgIDwhLS0gU3RvcmUgU2VsZWN0IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3RcclxuICAgICAgICBsYWJlbD1cIlN0b3JlXCJcclxuICAgICAgICBbaWRGaWVsZF09XCInaWQnXCJcclxuICAgICAgICBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgIFtkYXRhXT1cInN0b3JlT3B0aW9uc1wiXHJcbiAgICAgICAgW3NlYXJjaF09XCJ0cnVlXCJcclxuICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZFN0b3JlSWRcIlxyXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU3RvcmVTZWxlY3RlZCgkZXZlbnQpXCI+XHJcbiAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFN0b3JlXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0xvYWRpbmdGaXh0dXJlczsgZWxzZSBsb2FkZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBtYi0zXCI+TG9hZGluZyBmaXh0dXJlc+KApjwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjbG9hZGVkPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaXh0dXJlcy5sZW5ndGg7IGVsc2Ugbm9GaXh0dXJlc1wiPlxyXG4gICAgICAgICAgPCEtLSBTd2FwIFJvd3MgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3dhcC1yb3dzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Um93XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInN3YXAtcm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctMiBhbGlnbi1pdGVtcy1zdGFydFwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBQbGFubyBGaXh0dXJlIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC01XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJQbGFubyBGaXh0dXJlXCJcclxuICAgICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCInX2lkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVGaWVsZF09XCInZGlzcGxheU5hbWUnXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJyb3cuZml4dHVyZU9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzZWFyY2hdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93LmZpeHR1cmVJZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Sb3dGaXh0dXJlQ2hhbmdlKHJvdywgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93LmZpeHR1cmVcIiBjbGFzcz1cImZpeHR1cmUtaW5mbyBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5OYW1lOjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IHJvdy5maXh0dXJlLmZpeHR1cmVOYW1lIHx8ICfigJQnIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5Qb3NpdGlvbjo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyByb3cud2FsbFBvc2l0aW9uIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBBcnJvdyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy10b3A6IDMwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJyb3dcIj7ihpI8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFN3YXBwaW5nIFRlbXBsYXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC01XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJTd2FwcGluZyBUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2lkRmllbGRdPVwiJ19pZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lRmllbGRdPVwiJ2Rpc3BsYXlOYW1lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3N1YlRleHRGaWVsZF09XCInc3VidGV4dCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cInRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NlYXJjaF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3cudGVtcGxhdGVJZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Sb3dUZW1wbGF0ZUNoYW5nZShyb3csICRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBSZW1vdmUgUm93IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCJcclxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLXRvcDogMzBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgcC0wIHJlbW92ZS1idG5cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVSb3coaSlcIiB0aXRsZT1cIlJlbW92ZSByb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyb3dzLmxlbmd0aCA9PT0gMSAmJiAhcm93LmZpeHR1cmUgJiYgIXJvdy50ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAxTDEgOU0xIDFMOSA5XCIgc3Ryb2tlPVwiIzM0NDA1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gQWRkIFJvdyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIHAtMCBhZGQtYnRuXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkUm93KClcIiBbZGlzYWJsZWRdPVwiIWNhbkFkZFJvd1wiPlxyXG4gICAgICAgICAgICAgICsgQWRkIGFub3RoZXIgc3dhcFxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gQWN0aW9ucyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTIgbXQtNFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJvbkNhbmNlbCgpXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNTdWJtaXR0aW5nXCI+XHJcbiAgICAgICAgICAgICAgQ2FuY2VsXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJvblN1Ym1pdCgpXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhblN1Ym1pdCB8fCBpc1N1Ym1pdHRpbmdcIj5cclxuICAgICAgICAgICAgICB7eyBpc1N1Ym1pdHRpbmcgPyAnU3VibWl0dGluZ+KApicgOiAnU3VibWl0JyB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI25vRml4dHVyZXM+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZFwiPk5vIGZpeHR1cmVzIGZvdW5kIGZvciB0aGlzIHN0b3JlLjwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG4iXX0=
@@ -0,0 +1,22 @@
1
+ import { Component, Input } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/router";
4
+ import * as i2 from "@angular/common";
5
+ export class ToolPageHeaderComponent {
6
+ title = "";
7
+ description = "";
8
+ backLink = "/manage/planogram/plano-tools";
9
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToolPageHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ToolPageHeaderComponent, selector: "lib-tool-page-header", inputs: { title: "title", description: "description", backLink: "backLink" }, ngImport: i0, template: "<div class=\"tool-page-header d-flex align-items-start gap-3 mb-3\">\r\n <a\r\n class=\"back-btn\"\r\n [routerLink]=\"backLink\"\r\n aria-label=\"Back to Plano Tools\"\r\n title=\"Back to Plano Tools\"\r\n >\r\n <i class=\"bi bi-arrow-left\"></i>\r\n </a>\r\n <div class=\"flex-grow-1\">\r\n <h4 class=\"title mb-1\">{{ title }}</h4>\r\n <p *ngIf=\"description\" class=\"text-muted small mb-0\">{{ description }}</p>\r\n </div>\r\n</div>\r\n", styles: [".tool-page-header{padding-bottom:.75rem;border-bottom:1px solid #e5e7eb}.tool-page-header .back-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:6px;color:#475569;background:#f1f5f9;text-decoration:none;flex-shrink:0;transition:background .15s,color .15s}.tool-page-header .back-btn:hover{background:#e2e8f0;color:#0f172a}.tool-page-header .back-btn i{font-size:1rem}.tool-page-header .title{font-weight:600;margin:0;color:#0f172a}\n"], dependencies: [{ kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
11
+ }
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToolPageHeaderComponent, decorators: [{
13
+ type: Component,
14
+ args: [{ selector: "lib-tool-page-header", template: "<div class=\"tool-page-header d-flex align-items-start gap-3 mb-3\">\r\n <a\r\n class=\"back-btn\"\r\n [routerLink]=\"backLink\"\r\n aria-label=\"Back to Plano Tools\"\r\n title=\"Back to Plano Tools\"\r\n >\r\n <i class=\"bi bi-arrow-left\"></i>\r\n </a>\r\n <div class=\"flex-grow-1\">\r\n <h4 class=\"title mb-1\">{{ title }}</h4>\r\n <p *ngIf=\"description\" class=\"text-muted small mb-0\">{{ description }}</p>\r\n </div>\r\n</div>\r\n", styles: [".tool-page-header{padding-bottom:.75rem;border-bottom:1px solid #e5e7eb}.tool-page-header .back-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:6px;color:#475569;background:#f1f5f9;text-decoration:none;flex-shrink:0;transition:background .15s,color .15s}.tool-page-header .back-btn:hover{background:#e2e8f0;color:#0f172a}.tool-page-header .back-btn i{font-size:1rem}.tool-page-header .title{font-weight:600;margin:0;color:#0f172a}\n"] }]
15
+ }], propDecorators: { title: [{
16
+ type: Input
17
+ }], description: [{
18
+ type: Input
19
+ }], backLink: [{
20
+ type: Input
21
+ }] } });
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1wYWdlLWhlYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9wbGFuby10b29scy90b29sLXBhZ2UtaGVhZGVyL3Rvb2wtcGFnZS1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvdG9vbC1wYWdlLWhlYWRlci90b29sLXBhZ2UtaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBT2pELE1BQU0sT0FBTyx1QkFBdUI7SUFDekIsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNYLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDakIsUUFBUSxHQUFXLCtCQUErQixDQUFDO3dHQUhqRCx1QkFBdUI7NEZBQXZCLHVCQUF1QiwwSUNQcEMscWRBY0E7OzRGRFBhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxzQkFBc0I7OEJBS3ZCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImxpYi10b29sLXBhZ2UtaGVhZGVyXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi90b29sLXBhZ2UtaGVhZGVyLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi90b29sLXBhZ2UtaGVhZGVyLmNvbXBvbmVudC5zY3NzXCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUb29sUGFnZUhlYWRlckNvbXBvbmVudCB7XHJcbiAgQElucHV0KCkgdGl0bGUgPSBcIlwiO1xyXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uID0gXCJcIjtcclxuICBASW5wdXQoKSBiYWNrTGluazogc3RyaW5nID0gXCIvbWFuYWdlL3BsYW5vZ3JhbS9wbGFuby10b29sc1wiO1xyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJ0b29sLXBhZ2UtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBnYXAtMyBtYi0zXCI+XHJcbiAgPGFcclxuICAgIGNsYXNzPVwiYmFjay1idG5cIlxyXG4gICAgW3JvdXRlckxpbmtdPVwiYmFja0xpbmtcIlxyXG4gICAgYXJpYS1sYWJlbD1cIkJhY2sgdG8gUGxhbm8gVG9vbHNcIlxyXG4gICAgdGl0bGU9XCJCYWNrIHRvIFBsYW5vIFRvb2xzXCJcclxuICA+XHJcbiAgICA8aSBjbGFzcz1cImJpIGJpLWFycm93LWxlZnRcIj48L2k+XHJcbiAgPC9hPlxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxyXG4gICAgPGg0IGNsYXNzPVwidGl0bGUgbWItMVwiPnt7IHRpdGxlIH19PC9oND5cclxuICAgIDxwICpuZ0lmPVwiZGVzY3JpcHRpb25cIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgbWItMFwiPnt7IGRlc2NyaXB0aW9uIH19PC9wPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19