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

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 (23) hide show
  1. package/esm2022/lib/components/collection-update-ai/components/store-select/store-select.component.mjs +5 -3
  2. package/esm2022/lib/components/fixture-template/template-products/template-products.component.mjs +4 -1
  3. package/esm2022/lib/components/fixture-template/template-vms/template-vms.component.mjs +4 -1
  4. package/esm2022/lib/components/look-plano-collection/look-plano-collection.component.mjs +27 -5
  5. package/esm2022/lib/components/look-plano-collection-form/look-plano-collection-form.component.mjs +26 -5
  6. package/esm2022/lib/components/manage-store-plano/verification-feedback/zone-editable-fixture/zone-editable-fixture.component.mjs +33 -7
  7. package/esm2022/lib/components/plano-tools/delete-task/delete-task.component.mjs +10 -4
  8. package/esm2022/lib/components/plano-tools/store-exports/store-exports.component.mjs +35 -9
  9. package/esm2022/lib/components/plano-tools/swap-template/swap-template.component.mjs +3 -1
  10. package/esm2022/lib/components/store-plano/store-plano.component.mjs +31 -6
  11. package/esm2022/lib/services/store-builder.service.mjs +6 -1
  12. package/esm2022/lib/tango-store-plano.module.mjs +5 -2
  13. package/fesm2022/tango-app-ui-store-builder.mjs +172 -29
  14. package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
  15. package/lib/components/look-plano-collection/look-plano-collection.component.d.ts +5 -1
  16. package/lib/components/look-plano-collection-form/look-plano-collection-form.component.d.ts +5 -1
  17. package/lib/components/manage-store-plano/verification-feedback/zone-editable-fixture/zone-editable-fixture.component.d.ts +6 -0
  18. package/lib/components/plano-tools/delete-task/delete-task.component.d.ts +2 -0
  19. package/lib/components/plano-tools/store-exports/store-exports.component.d.ts +4 -0
  20. package/lib/components/store-plano/store-plano.component.d.ts +1 -0
  21. package/lib/services/store-builder.service.d.ts +7 -1
  22. package/lib/tango-store-plano.module.d.ts +1 -1
  23. package/package.json +1 -1
@@ -3,11 +3,13 @@ import { Subject, takeUntil, debounceTime, filter, distinctUntilChanged } from '
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "../../../services/store-builder.service";
5
5
  import * as i2 from "tango-app-ui-global";
6
- import * as i3 from "../../collection-update-ai/components/store-select/store-select.component";
6
+ import * as i3 from "@angular/forms";
7
+ import * as i4 from "../../collection-update-ai/components/store-select/store-select.component";
7
8
  export class DeleteTaskComponent {
8
9
  sbs;
9
10
  gs;
10
11
  clientId;
12
+ taskType = 'fixture';
11
13
  storeOptions = [];
12
14
  initialStores = [];
13
15
  selectedStores = [];
@@ -43,6 +45,9 @@ export class DeleteTaskComponent {
43
45
  onStoresSelected(stores) {
44
46
  this.selectedStores = stores;
45
47
  }
48
+ onTaskTypeChange() {
49
+ this.message = '';
50
+ }
46
51
  onSubmit() {
47
52
  if (this.selectedStores.length === 0) {
48
53
  this.showMessage('Please select at least one store.', 'error');
@@ -50,6 +55,7 @@ export class DeleteTaskComponent {
50
55
  }
51
56
  let payload = {
52
57
  storeNames: this.selectedStores.map((s) => s.label),
58
+ taskType: this.taskType,
53
59
  };
54
60
  this.isSubmitting = true;
55
61
  this.sbs.deleteTaskForStores(payload).subscribe({
@@ -74,10 +80,10 @@ export class DeleteTaskComponent {
74
80
  this.destroy$.complete();
75
81
  }
76
82
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DeleteTaskComponent, deps: [{ token: i1.StoreBuilderService }, { token: i2.GlobalStateService }], target: i0.ɵɵFactoryTarget.Component });
77
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DeleteTaskComponent, selector: "lib-delete-task", ngImport: i0, template: "<section class=\"delete-task p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 600px;\">\r\n <h5 class=\"mb-3\">Delete Task</h5>\r\n\r\n <!-- Store Select -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Store</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 <!-- Submit -->\r\n <button class=\"btn btn-danger\" (click)=\"onSubmit()\"\r\n [disabled]=\"isSubmitting || selectedStores.length === 0\">\r\n {{ isSubmitting ? 'Deleting...' : 'Delete Task' }}\r\n </button>\r\n\r\n <!-- Message -->\r\n @if (message) {\r\n <div class=\"mt-3 alert\" [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: [""], dependencies: [{ kind: "component", type: i3.StoreSelectComponent, selector: "lib-store-select", inputs: ["options", "initialSelected", "singleSelect"], outputs: ["selectedChange"] }] });
83
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DeleteTaskComponent, selector: "lib-delete-task", ngImport: i0, template: "<section class=\"delete-task p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 600px;\">\r\n <h5 class=\"mb-3\">Delete Task</h5>\r\n\r\n <!-- Task Type -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label d-block\">Task Type</label>\r\n <div class=\"d-flex gap-3\">\r\n <div class=\"form-check\">\r\n <input type=\"radio\" class=\"form-check-input\" id=\"deleteTaskTypeFixture\"\r\n name=\"deleteTaskType\" value=\"fixture\"\r\n [(ngModel)]=\"taskType\" (change)=\"onTaskTypeChange()\">\r\n <label class=\"form-check-label\" for=\"deleteTaskTypeFixture\">Fixture Verification</label>\r\n </div>\r\n <div class=\"form-check\">\r\n <input type=\"radio\" class=\"form-check-input\" id=\"deleteTaskTypeZone\"\r\n name=\"deleteTaskType\" value=\"zoneVerification\"\r\n [(ngModel)]=\"taskType\" (change)=\"onTaskTypeChange()\">\r\n <label class=\"form-check-label\" for=\"deleteTaskTypeZone\">Zone Verification</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Select -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Store</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 <!-- Submit -->\r\n <button class=\"btn btn-danger\" (click)=\"onSubmit()\"\r\n [disabled]=\"isSubmitting || selectedStores.length === 0\">\r\n {{ isSubmitting ? 'Deleting...' : 'Delete Task' }}\r\n </button>\r\n\r\n <!-- Message -->\r\n @if (message) {\r\n <div class=\"mt-3 alert\" [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: [""], 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.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { 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"] }] });
78
84
  }
79
85
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DeleteTaskComponent, decorators: [{
80
86
  type: Component,
81
- args: [{ selector: 'lib-delete-task', template: "<section class=\"delete-task p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 600px;\">\r\n <h5 class=\"mb-3\">Delete Task</h5>\r\n\r\n <!-- Store Select -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Store</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 <!-- Submit -->\r\n <button class=\"btn btn-danger\" (click)=\"onSubmit()\"\r\n [disabled]=\"isSubmitting || selectedStores.length === 0\">\r\n {{ isSubmitting ? 'Deleting...' : 'Delete Task' }}\r\n </button>\r\n\r\n <!-- Message -->\r\n @if (message) {\r\n <div class=\"mt-3 alert\" [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" }]
87
+ args: [{ selector: 'lib-delete-task', template: "<section class=\"delete-task p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 600px;\">\r\n <h5 class=\"mb-3\">Delete Task</h5>\r\n\r\n <!-- Task Type -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label d-block\">Task Type</label>\r\n <div class=\"d-flex gap-3\">\r\n <div class=\"form-check\">\r\n <input type=\"radio\" class=\"form-check-input\" id=\"deleteTaskTypeFixture\"\r\n name=\"deleteTaskType\" value=\"fixture\"\r\n [(ngModel)]=\"taskType\" (change)=\"onTaskTypeChange()\">\r\n <label class=\"form-check-label\" for=\"deleteTaskTypeFixture\">Fixture Verification</label>\r\n </div>\r\n <div class=\"form-check\">\r\n <input type=\"radio\" class=\"form-check-input\" id=\"deleteTaskTypeZone\"\r\n name=\"deleteTaskType\" value=\"zoneVerification\"\r\n [(ngModel)]=\"taskType\" (change)=\"onTaskTypeChange()\">\r\n <label class=\"form-check-label\" for=\"deleteTaskTypeZone\">Zone Verification</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Select -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Store</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 <!-- Submit -->\r\n <button class=\"btn btn-danger\" (click)=\"onSubmit()\"\r\n [disabled]=\"isSubmitting || selectedStores.length === 0\">\r\n {{ isSubmitting ? 'Deleting...' : 'Delete Task' }}\r\n </button>\r\n\r\n <!-- Message -->\r\n @if (message) {\r\n <div class=\"mt-3 alert\" [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" }]
82
88
  }], ctorParameters: () => [{ type: i1.StoreBuilderService }, { type: i2.GlobalStateService }] });
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLXRhc2suY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvZGVsZXRlLXRhc2svZGVsZXRlLXRhc2suY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvZGVsZXRlLXRhc2svZGVsZXRlLXRhc2suY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFHN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7QUFRdEYsTUFBTSxPQUFPLG1CQUFtQjtJQVlwQjtJQUNBO0lBWlYsUUFBUSxDQUFTO0lBQ2pCLFlBQVksR0FBa0IsRUFBRSxDQUFDO0lBQ2pDLGFBQWEsR0FBa0IsRUFBRSxDQUFDO0lBQ2xDLGNBQWMsR0FBa0IsRUFBRSxDQUFDO0lBQ25DLFlBQVksR0FBWSxLQUFLLENBQUM7SUFDOUIsT0FBTyxHQUFXLEVBQUUsQ0FBQztJQUNyQixXQUFXLEdBQXdCLFNBQVMsQ0FBQztJQUU1QixRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVoRCxZQUNVLEdBQXdCLEVBQ3hCLEVBQXNCO1FBRHRCLFFBQUcsR0FBSCxHQUFHLENBQXFCO1FBQ3hCLE9BQUUsR0FBRixFQUFFLENBQW9CO0lBQzdCLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjO2FBQ25CLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUN4QixZ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Qix1RENYaEMsazlCQTZCQTs7NEZEbEJhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN0b3JlQnVpbGRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsLCBkZWJvdW5jZVRpbWUsIGZpbHRlciwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU3RvcmVPcHRpb24gfSBmcm9tICcuLi8uLi9jb2xsZWN0aW9uLXVwZGF0ZS1haS9jb21wb25lbnRzL3N0b3JlLXNlbGVjdC9zdG9yZS1zZWxlY3QuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWRlbGV0ZS10YXNrJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGVsZXRlLXRhc2suY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9kZWxldGUtdGFzay5jb21wb25lbnQuc2NzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEZWxldGVUYXNrQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGNsaWVudElkOiBzdHJpbmc7XHJcbiAgc3RvcmVPcHRpb25zOiBTdG9yZU9wdGlvbltdID0gW107XHJcbiAgaW5pdGlhbFN0b3JlczogU3RvcmVPcHRpb25bXSA9IFtdO1xyXG4gIHNlbGVjdGVkU3RvcmVzOiBTdG9yZU9wdGlvbltdID0gW107XHJcbiAgaXNTdWJtaXR0aW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbWVzc2FnZTogc3RyaW5nID0gJyc7XHJcbiAgbWVzc2FnZVR5cGU6ICdzdWNjZXNzJyB8ICdlcnJvcicgPSAnc3VjY2Vzcyc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgc2JzOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcclxuICAgICAgICBmaWx0ZXIoKGRhdGEpID0+ICEhZGF0YSksXHJcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhPy5jbGllbnQpIHtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhLmNsaWVudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGhlYWRlckRhdGEgPSBKU09OLnBhcnNlKFxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSBhcyBzdHJpbmdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gaGVhZGVyRGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvYWRTdG9yZXMoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBsb2FkU3RvcmVzKCkge1xyXG4gICAgdGhpcy5zYnMuZ2V0U3RvcmVPckNsdXN0ZXJMaXN0KHsgc2VhcmNoTW9kZTogJ3N0b3JlJyB9KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXM/LmRhdGEpIHtcclxuICAgICAgICB0aGlzLnN0b3JlT3B0aW9ucyA9IHJlcy5kYXRhO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uU3RvcmVzU2VsZWN0ZWQoc3RvcmVzOiBTdG9yZU9wdGlvbltdKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmVzID0gc3RvcmVzO1xyXG4gIH1cclxuXHJcbiAgb25TdWJtaXQoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFN0b3Jlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5zaG93TWVzc2FnZSgnUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgc3RvcmUuJywgJ2Vycm9yJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgc3RvcmVOYW1lczogdGhpcy5zZWxlY3RlZFN0b3Jlcy5tYXAoKHMpID0+IHMubGFiZWwpLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmlzU3VibWl0dGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnNicy5kZWxldGVUYXNrRm9yU3RvcmVzKHBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBjb3VudCA9IHJlcz8uZGF0YT8uZGVsZXRlZENvdW50IHx8IDA7XHJcbiAgICAgICAgdGhpcy5zaG93TWVzc2FnZShgRGVsZXRlZCAke2NvdW50fSB0YXNrKHMpIHN1Y2Nlc3NmdWxseS5gLCAnc3VjY2VzcycpO1xyXG4gICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNob3dNZXNzYWdlKGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ1NvbWV0aGluZyB3ZW50IHdyb25nLicsICdlcnJvcicpO1xyXG4gICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNob3dNZXNzYWdlKG1zZzogc3RyaW5nLCB0eXBlOiAnc3VjY2VzcycgfCAnZXJyb3InKSB7XHJcbiAgICB0aGlzLm1lc3NhZ2UgPSBtc2c7XHJcbiAgICB0aGlzLm1lc3NhZ2VUeXBlID0gdHlwZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMubWVzc2FnZSA9ICcnKSwgNTAwMCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8c2VjdGlvbiBjbGFzcz1cImRlbGV0ZS10YXNrIHAtM1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJjYXJkIHAtNFwiIHN0eWxlPVwibWF4LXdpZHRoOiA2MDBweDtcIj5cclxuICAgIDxoNSBjbGFzcz1cIm1iLTNcIj5EZWxldGUgVGFzazwvaDU+XHJcblxyXG4gICAgPCEtLSBTdG9yZSBTZWxlY3QgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U3RvcmU8L2xhYmVsPlxyXG4gICAgICA8bGliLXN0b3JlLXNlbGVjdFxyXG4gICAgICAgIFtvcHRpb25zXT1cInN0b3JlT3B0aW9uc1wiXHJcbiAgICAgICAgW2luaXRpYWxTZWxlY3RlZF09XCJpbml0aWFsU3RvcmVzXCJcclxuICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwib25TdG9yZXNTZWxlY3RlZCgkZXZlbnQpXCI+XHJcbiAgICAgIDwvbGliLXN0b3JlLXNlbGVjdD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gU3VibWl0IC0tPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgKGNsaWNrKT1cIm9uU3VibWl0KClcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiaXNTdWJtaXR0aW5nIHx8IHNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICB7eyBpc1N1Ym1pdHRpbmcgPyAnRGVsZXRpbmcuLi4nIDogJ0RlbGV0ZSBUYXNrJyB9fVxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPCEtLSBNZXNzYWdlIC0tPlxyXG4gICAgQGlmIChtZXNzYWdlKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtdC0zIGFsZXJ0XCIgW2NsYXNzLmFsZXJ0LXN1Y2Nlc3NdPVwibWVzc2FnZVR5cGUgPT09ICdzdWNjZXNzJ1wiXHJcbiAgICAgICAgW2NsYXNzLmFsZXJ0LWRhbmdlcl09XCJtZXNzYWdlVHlwZSA9PT0gJ2Vycm9yJ1wiPlxyXG4gICAgICAgIHt7IG1lc3NhZ2UgfX1cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuIl19
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLXRhc2suY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvZGVsZXRlLXRhc2svZGVsZXRlLXRhc2suY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvZGVsZXRlLXRhc2svZGVsZXRlLXRhc2suY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFHN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBUXRGLE1BQU0sT0FBTyxtQkFBbUI7SUFhcEI7SUFDQTtJQWJWLFFBQVEsQ0FBUztJQUNqQixRQUFRLEdBQW1DLFNBQVMsQ0FBQztJQUNyRCxZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUNqQyxhQUFhLEdBQWtCLEVBQUUsQ0FBQztJQUNsQyxjQUFjLEdBQWtCLEVBQUUsQ0FBQztJQUNuQyxZQUFZLEdBQVksS0FBSyxDQUFDO0lBQzlCLE9BQU8sR0FBVyxFQUFFLENBQUM7SUFDckIsV0FBVyxHQUF3QixTQUFTLENBQUM7SUFFNUIsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFaEQsWUFDVSxHQUF3QixFQUN4QixFQUFzQjtRQUR0QixRQUFHLEdBQUgsR0FBRyxDQUFxQjtRQUN4QixPQUFFLEdBQUYsRUFBRSxDQUFvQjtJQUM3QixDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYzthQUNuQixJQUFJLENBQ0gsU0FBUyxDQUFD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QUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQXhGVSxtQkFBbUI7NEZBQW5CLG1CQUFtQix1RENYaEMsNjREQWdEQTs7NEZEckNhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN0b3JlQnVpbGRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsLCBkZWJvdW5jZVRpbWUsIGZpbHRlciwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU3RvcmVPcHRpb24gfSBmcm9tICcuLi8uLi9jb2xsZWN0aW9uLXVwZGF0ZS1haS9jb21wb25lbnRzL3N0b3JlLXNlbGVjdC9zdG9yZS1zZWxlY3QuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWRlbGV0ZS10YXNrJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGVsZXRlLXRhc2suY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9kZWxldGUtdGFzay5jb21wb25lbnQuc2NzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEZWxldGVUYXNrQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGNsaWVudElkOiBzdHJpbmc7XHJcbiAgdGFza1R5cGU6ICdmaXh0dXJlJyB8ICd6b25lVmVyaWZpY2F0aW9uJyA9ICdmaXh0dXJlJztcclxuICBzdG9yZU9wdGlvbnM6IFN0b3JlT3B0aW9uW10gPSBbXTtcclxuICBpbml0aWFsU3RvcmVzOiBTdG9yZU9wdGlvbltdID0gW107XHJcbiAgc2VsZWN0ZWRTdG9yZXM6IFN0b3JlT3B0aW9uW10gPSBbXTtcclxuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBtZXNzYWdlOiBzdHJpbmcgPSAnJztcclxuICBtZXNzYWdlVHlwZTogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyA9ICdzdWNjZXNzJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzYnM6IFN0b3JlQnVpbGRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICAgIGRlYm91bmNlVGltZSgyMDApLFxyXG4gICAgICAgIGZpbHRlcigoZGF0YSkgPT4gISFkYXRhKSxcclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGE/LmNsaWVudCkge1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGRhdGEuY2xpZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaGVhZGVyRGF0YSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoZWFkZXItZmlsdGVycycpIGFzIHN0cmluZ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9hZFN0b3JlcygpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWRTdG9yZXMoKSB7XHJcbiAgICB0aGlzLnNicy5nZXRTdG9yZU9yQ2x1c3Rlckxpc3QoeyBzZWFyY2hNb2RlOiAnc3RvcmUnIH0pLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcz8uZGF0YSkge1xyXG4gICAgICAgIHRoaXMuc3RvcmVPcHRpb25zID0gcmVzLmRhdGE7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25TdG9yZXNTZWxlY3RlZChzdG9yZXM6IFN0b3JlT3B0aW9uW10pIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZXMgPSBzdG9yZXM7XHJcbiAgfVxyXG5cclxuICBvblRhc2tUeXBlQ2hhbmdlKCkge1xyXG4gICAgdGhpcy5tZXNzYWdlID0gJyc7XHJcbiAgfVxyXG5cclxuICBvblN1Ym1pdCgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnNob3dNZXNzYWdlKCdQbGVhc2Ugc2VsZWN0IGF0IGxlYXN0IG9uZSBzdG9yZS4nLCAnZXJyb3InKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICBzdG9yZU5hbWVzOiB0aGlzLnNlbGVjdGVkU3RvcmVzLm1hcCgocykgPT4gcy5sYWJlbCksXHJcbiAgICAgIHRhc2tUeXBlOiB0aGlzLnRhc2tUeXBlLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmlzU3VibWl0dGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnNicy5kZWxldGVUYXNrRm9yU3RvcmVzKHBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBjb3VudCA9IHJlcz8uZGF0YT8uZGVsZXRlZENvdW50IHx8IDA7XHJcbiAgICAgICAgdGhpcy5zaG93TWVzc2FnZShgRGVsZXRlZCAke2NvdW50fSB0YXNrKHMpIHN1Y2Nlc3NmdWxseS5gLCAnc3VjY2VzcycpO1xyXG4gICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNob3dNZXNzYWdlKGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ1NvbWV0aGluZyB3ZW50IHdyb25nLicsICdlcnJvcicpO1xyXG4gICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNob3dNZXNzYWdlKG1zZzogc3RyaW5nLCB0eXBlOiAnc3VjY2VzcycgfCAnZXJyb3InKSB7XHJcbiAgICB0aGlzLm1lc3NhZ2UgPSBtc2c7XHJcbiAgICB0aGlzLm1lc3NhZ2VUeXBlID0gdHlwZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMubWVzc2FnZSA9ICcnKSwgNTAwMCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8c2VjdGlvbiBjbGFzcz1cImRlbGV0ZS10YXNrIHAtM1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJjYXJkIHAtNFwiIHN0eWxlPVwibWF4LXdpZHRoOiA2MDBweDtcIj5cclxuICAgIDxoNSBjbGFzcz1cIm1iLTNcIj5EZWxldGUgVGFzazwvaDU+XHJcblxyXG4gICAgPCEtLSBUYXNrIFR5cGUgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtYmxvY2tcIj5UYXNrIFR5cGU8L2xhYmVsPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0zXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIj5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBpZD1cImRlbGV0ZVRhc2tUeXBlRml4dHVyZVwiXHJcbiAgICAgICAgICAgIG5hbWU9XCJkZWxldGVUYXNrVHlwZVwiIHZhbHVlPVwiZml4dHVyZVwiXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGFza1R5cGVcIiAoY2hhbmdlKT1cIm9uVGFza1R5cGVDaGFuZ2UoKVwiPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImRlbGV0ZVRhc2tUeXBlRml4dHVyZVwiPkZpeHR1cmUgVmVyaWZpY2F0aW9uPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIGlkPVwiZGVsZXRlVGFza1R5cGVab25lXCJcclxuICAgICAgICAgICAgbmFtZT1cImRlbGV0ZVRhc2tUeXBlXCIgdmFsdWU9XCJ6b25lVmVyaWZpY2F0aW9uXCJcclxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0YXNrVHlwZVwiIChjaGFuZ2UpPVwib25UYXNrVHlwZUNoYW5nZSgpXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZGVsZXRlVGFza1R5cGVab25lXCI+Wm9uZSBWZXJpZmljYXRpb248L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gU3RvcmUgU2VsZWN0IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN0b3JlPC9sYWJlbD5cclxuICAgICAgPGxpYi1zdG9yZS1zZWxlY3RcclxuICAgICAgICBbb3B0aW9uc109XCJzdG9yZU9wdGlvbnNcIlxyXG4gICAgICAgIFtpbml0aWFsU2VsZWN0ZWRdPVwiaW5pdGlhbFN0b3Jlc1wiXHJcbiAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cIm9uU3RvcmVzU2VsZWN0ZWQoJGV2ZW50KVwiPlxyXG4gICAgICA8L2xpYi1zdG9yZS1zZWxlY3Q+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFN1Ym1pdCAtLT5cclxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIChjbGljayk9XCJvblN1Ym1pdCgpXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImlzU3VibWl0dGluZyB8fCBzZWxlY3RlZFN0b3Jlcy5sZW5ndGggPT09IDBcIj5cclxuICAgICAge3sgaXNTdWJtaXR0aW5nID8gJ0RlbGV0aW5nLi4uJyA6ICdEZWxldGUgVGFzaycgfX1cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gTWVzc2FnZSAtLT5cclxuICAgIEBpZiAobWVzc2FnZSkge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwibXQtMyBhbGVydFwiIFtjbGFzcy5hbGVydC1zdWNjZXNzXT1cIm1lc3NhZ2VUeXBlID09PSAnc3VjY2VzcydcIlxyXG4gICAgICAgIFtjbGFzcy5hbGVydC1kYW5nZXJdPVwibWVzc2FnZVR5cGUgPT09ICdlcnJvcidcIj5cclxuICAgICAgICB7eyBtZXNzYWdlIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcbiJdfQ==
@@ -3,7 +3,8 @@ import { Subject, takeUntil, debounceTime, filter, distinctUntilChanged, timer,
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "../../../services/store-builder.service";
5
5
  import * as i2 from "tango-app-ui-global";
6
- import * as i3 from "../../collection-update-ai/components/store-select/store-select.component";
6
+ import * as i3 from "@angular/forms";
7
+ import * as i4 from "../../collection-update-ai/components/store-select/store-select.component";
7
8
  const POLL_INITIAL_DELAY_MS = 15000;
8
9
  const POLL_INTERVAL_MS = 10000;
9
10
  const POLL_TIMEOUT_MS = 30 * 60 * 1000;
@@ -14,6 +15,8 @@ export class StoreExportsComponent {
14
15
  storeOptions = [];
15
16
  initialStores = [];
16
17
  selectedStores = [];
18
+ selectedRevisionStores = [];
19
+ revisionName = '';
17
20
  starting = null;
18
21
  activeJob = null;
19
22
  busyInfo = null;
@@ -26,6 +29,11 @@ export class StoreExportsComponent {
26
29
  this.gs = gs;
27
30
  }
28
31
  ngOnInit() {
32
+ // Store options come from planograms and don't depend on the client/date filter,
33
+ // so load them immediately. Previously loadStores() only ran inside the
34
+ // dataRangeValue subscription, so the list stayed empty (no dropdown, no
35
+ // type-to-match) whenever that observable didn't emit on this page.
36
+ this.loadStores();
29
37
  this.gs.dataRangeValue
30
38
  .pipe(takeUntil(this.destroy$), debounceTime(200), filter((data) => !!data), distinctUntilChanged())
31
39
  .subscribe((data) => {
@@ -50,6 +58,12 @@ export class StoreExportsComponent {
50
58
  onStoresSelected(stores) {
51
59
  this.selectedStores = stores;
52
60
  }
61
+ onRevisionStoresSelected(stores) {
62
+ this.selectedRevisionStores = stores;
63
+ }
64
+ get totalSelectedStores() {
65
+ return this.selectedStores.length + this.selectedRevisionStores.length;
66
+ }
53
67
  onExportMbq() {
54
68
  this.runExport('mbq');
55
69
  }
@@ -79,18 +93,30 @@ export class StoreExportsComponent {
79
93
  runExport(kind) {
80
94
  if (this.isWorking)
81
95
  return;
82
- if (this.selectedStores.length === 0) {
96
+ const liveStores = this.selectedStores.map((s) => s.label);
97
+ const revisionStores = this.selectedRevisionStores.map((s) => s.label);
98
+ const revisionName = this.revisionName.trim();
99
+ if (liveStores.length === 0 && revisionStores.length === 0) {
83
100
  this.showMessage('Please select at least one store.', 'error');
84
101
  return;
85
102
  }
86
- const storeName = this.selectedStores.map((s) => s.label);
103
+ if (revisionStores.length > 0 && !revisionName) {
104
+ this.showMessage('Enter a revision name for the revision stores.', 'error');
105
+ return;
106
+ }
107
+ const payload = { storeName: liveStores };
108
+ if (revisionStores.length > 0) {
109
+ payload.revisionStores = revisionStores;
110
+ payload.revisionName = revisionName;
111
+ }
112
+ const totalStores = liveStores.length + revisionStores.length;
87
113
  this.busyInfo = null;
88
114
  this.activeJob = null;
89
115
  this.starting = kind;
90
116
  this.message = '';
91
117
  const submit$ = kind === 'mbq'
92
- ? this.sbs.exportMBQSheetAsync({ storeName })
93
- : this.sbs.exportPlanoOrderSheetAsync({ storeName });
118
+ ? this.sbs.exportMBQSheetAsync(payload)
119
+ : this.sbs.exportPlanoOrderSheetAsync(payload);
94
120
  submit$.subscribe({
95
121
  next: (resp) => {
96
122
  this.starting = null;
@@ -105,7 +131,7 @@ export class StoreExportsComponent {
105
131
  kind,
106
132
  status: 'running',
107
133
  startedAt: new Date().toISOString(),
108
- storeCount: storeName.length,
134
+ storeCount: totalStores,
109
135
  };
110
136
  this.startPolling(jobId);
111
137
  },
@@ -199,10 +225,10 @@ export class StoreExportsComponent {
199
225
  this.destroy$.complete();
200
226
  }
201
227
  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 });
202
- 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</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=\"d-flex gap-2 flex-wrap\">\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"onExportMbq()\"\r\n [disabled]=\"isWorking || selectedStores.length === 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 || selectedStores.length === 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: "component", type: i3.StoreSelectComponent, selector: "lib-store-select", inputs: ["options", "initialSelected", "singleSelect"], outputs: ["selectedChange"] }] });
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"] }] });
203
229
  }
204
230
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StoreExportsComponent, decorators: [{
205
231
  type: Component,
206
- 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</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=\"d-flex gap-2 flex-wrap\">\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"onExportMbq()\"\r\n [disabled]=\"isWorking || selectedStores.length === 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 || selectedStores.length === 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"] }]
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"] }]
207
233
  }], ctorParameters: () => [{ type: i1.StoreBuilderService }, { type: i2.GlobalStateService }] });
208
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtZXhwb3J0cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9wbGFuby10b29scy9zdG9yZS1leHBvcnRzL3N0b3JlLWV4cG9ydHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvc3RvcmUtZXhwb3J0cy9zdG9yZS1leHBvcnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFDTCxPQUFPLEVBQ1AsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxFQUFFLEVBQ0YsS0FBSyxFQUNMLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7Ozs7O0FBMkJkLE1BQU0scUJBQXFCLEdBQUcsS0FBSyxDQUFDO0FBQ3BDLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQy9CLE1BQU0sZUFBZSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBT3ZDLE1BQU0sT0FBTyxxQkFBcUI7SUFpQnRCO0lBQ0E7SUFqQlYsUUFBUSxDQUFTO0lBQ2pCLFlBQVksR0FBa0IsRUFBRSxDQUFDO0lBQ2pDLGFBQWEsR0FBa0IsRUFBRSxDQUFDO0lBQ2xDLGNBQWMsR0FBa0IsRUFBRSxDQUFDO0lBRW5DLFFBQVEsR0FBc0IsSUFBSSxDQUFDO0lBQ25DLFNBQVMsR0FBcUIsSUFBSSxDQUFDO0lBQ25DLFFBQVEsR0FBb0IsSUFBSSxDQUFDO0lBRWpDLE9BQU8sR0FBVyxFQUFFLENBQUM7SUFDckIsV0FBVyxHQUF3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SSxFQUFFLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUc7Z0JBQ2YsR0FBRyxJQUFJLENBQUMsU0FBUztnQkFDakIsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLEtBQUssRUFBRSwyQ0FBMkM7YUFDbkQsQ0FBQztTQUNIO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FDZCx1R0FBdUcsRUFDdkcsT0FBTyxDQUNSLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQVcsRUFBRSxJQUF5QjtRQUNoRCxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQXpPVSxxQkFBcUI7NEZBQXJCLHFCQUFxQix5RENoRGxDLGtrSUEwRkE7OzRGRDFDYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIFN1YmplY3QsXHJcbiAgdGFrZVVudGlsLFxyXG4gIGRlYm91bmNlVGltZSxcclxuICBmaWx0ZXIsXHJcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXHJcbiAgdGltZXIsXHJcbiAgb2YsXHJcbiAgRU1QVFksXHJcbiAgc3dpdGNoTWFwLFxyXG4gIGNhdGNoRXJyb3IsXHJcbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFN0b3JlQnVpbGRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgU3RvcmVPcHRpb24gfSBmcm9tICcuLi8uLi9jb2xsZWN0aW9uLXVwZGF0ZS1haS9jb21wb25lbnRzL3N0b3JlLXNlbGVjdC9zdG9yZS1zZWxlY3QuY29tcG9uZW50JztcclxuXHJcbnR5cGUgRXhwb3J0S2luZCA9ICdtYnEnIHwgJ29yZGVyJztcclxudHlwZSBKb2JTdGF0dXMgPSAncnVubmluZycgfCAnc3VjY2VlZGVkJyB8ICdmYWlsZWQnO1xyXG5cclxuaW50ZXJmYWNlIEV4cG9ydEpvYiB7XHJcbiAgam9iSWQ6IHN0cmluZztcclxuICBraW5kOiBFeHBvcnRLaW5kO1xyXG4gIHN0YXR1czogSm9iU3RhdHVzO1xyXG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcclxuICBjb21wbGV0ZWRBdD86IHN0cmluZyB8IG51bGw7XHJcbiAgZG93bmxvYWRVcmw/OiBzdHJpbmcgfCBudWxsO1xyXG4gIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcclxuICByb3dDb3VudD86IG51bWJlciB8IG51bGw7XHJcbiAgc3RvcmVDb3VudD86IG51bWJlciB8IG51bGw7XHJcbn1cclxuXHJcbmludGVyZmFjZSBCdXN5SW5mbyB7XHJcbiAgam9iSWQ6IHN0cmluZztcclxuICBraW5kOiBFeHBvcnRLaW5kO1xyXG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcclxuICBzdG9yZUNvdW50PzogbnVtYmVyO1xyXG59XHJcblxyXG5jb25zdCBQT0xMX0lOSVRJQUxfREVMQVlfTVMgPSAxNTAwMDtcclxuY29uc3QgUE9MTF9JTlRFUlZBTF9NUyA9IDEwMDAwO1xyXG5jb25zdCBQT0xMX1RJTUVPVVRfTVMgPSAzMCAqIDYwICogMTAwMDtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXN0b3JlLWV4cG9ydHMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zdG9yZS1leHBvcnRzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc3RvcmUtZXhwb3J0cy5jb21wb25lbnQuc2NzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdG9yZUV4cG9ydHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuICBzdG9yZU9wdGlvbnM6IFN0b3JlT3B0aW9uW10gPSBbXTtcclxuICBpbml0aWFsU3RvcmVzOiBTdG9yZU9wdGlvbltdID0gW107XHJcbiAgc2VsZWN0ZWRTdG9yZXM6IFN0b3JlT3B0aW9uW10gPSBbXTtcclxuXHJcbiAgc3RhcnRpbmc6IEV4cG9ydEtpbmQgfCBudWxsID0gbnVsbDtcclxuICBhY3RpdmVKb2I6IEV4cG9ydEpvYiB8IG51bGwgPSBudWxsO1xyXG4gIGJ1c3lJbmZvOiBCdXN5SW5mbyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBtZXNzYWdlOiBzdHJpbmcgPSAnJztcclxuICBtZXNzYWdlVHlwZTogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyA9ICdzdWNjZXNzJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9wUG9sbCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgc2JzOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcclxuICAgICAgICBmaWx0ZXIoKGRhdGEpID0+ICEhZGF0YSksXHJcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZGF0YT8uY2xpZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YS5jbGllbnQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGhlYWRlckRhdGEgPSBKU09OLnBhcnNlKFxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGhlYWRlckRhdGE/LmNsaWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2FkU3RvcmVzKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZFN0b3JlcygpIHtcclxuICAgIHRoaXMuc2JzXHJcbiAgICAgIC5nZXRTdG9yZU9yQ2x1c3Rlckxpc3QoeyBzZWFyY2hNb2RlOiAnc3RvcmUnIH0pXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcz8uZGF0YSkgdGhpcy5zdG9yZU9wdGlvbnMgPSByZXMuZGF0YTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblN0b3Jlc1NlbGVjdGVkKHN0b3JlczogU3RvcmVPcHRpb25bXSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFN0b3JlcyA9IHN0b3JlcztcclxuICB9XHJcblxyXG4gIG9uRXhwb3J0TWJxKCkge1xyXG4gICAgdGhpcy5ydW5FeHBvcnQoJ21icScpO1xyXG4gIH1cclxuXHJcbiAgb25FeHBvcnRPcmRlclNoZWV0KCkge1xyXG4gICAgdGhpcy5ydW5FeHBvcnQoJ29yZGVyJyk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNXb3JraW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhcnRpbmcgIT09IG51bGwgfHwgdGhpcy5hY3RpdmVKb2I/LnN0YXR1cyA9PT0gJ3J1bm5pbmcnO1xyXG4gIH1cclxuXHJcbiAga2luZExhYmVsKGtpbmQ6IEV4cG9ydEtpbmQgfCB1bmRlZmluZWQgfCBudWxsKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBraW5kID09PSAnbWJxJyA/ICdNQlEnIDoga2luZCA9PT0gJ29yZGVyJyA/ICdPcmRlciBTaGVldCcgOiAnRXhwb3J0JztcclxuICB9XHJcblxyXG4gIHN0YXJ0ZWRBZ28oaXNvPzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWlzbykgcmV0dXJuICcnO1xyXG4gICAgY29uc3QgbXMgPSBEYXRlLm5vdygpIC0gbmV3IERhdGUoaXNvKS5nZXRUaW1lKCk7XHJcbiAgICBpZiAobXMgPCA2MF8wMDApIHJldHVybiBgJHtNYXRoLm1heCgwLCBNYXRoLmZsb29yKG1zIC8gMTAwMCkpfXMgYWdvYDtcclxuICAgIGlmIChtcyA8IDNfNjAwXzAwMCkgcmV0dXJuIGAke01hdGguZmxvb3IobXMgLyA2MF8wMDApfW0gYWdvYDtcclxuICAgIHJldHVybiBgJHtNYXRoLmZsb29yKG1zIC8gM182MDBfMDAwKX1oIGFnb2A7XHJcbiAgfVxyXG5cclxuICBkaXNtaXNzUmVzdWx0KCkge1xyXG4gICAgdGhpcy5hY3RpdmVKb2IgPSBudWxsO1xyXG4gICAgdGhpcy5idXN5SW5mbyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJ1bkV4cG9ydChraW5kOiBFeHBvcnRLaW5kKSB7XHJcbiAgICBpZiAodGhpcy5pc1dvcmtpbmcpIHJldHVybjtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnNob3dNZXNzYWdlKCdQbGVhc2Ugc2VsZWN0IGF0IGxlYXN0IG9uZSBzdG9yZS4nLCAnZXJyb3InKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN0b3JlTmFtZSA9IHRoaXMuc2VsZWN0ZWRTdG9yZXMubWFwKChzKSA9PiBzLmxhYmVsKTtcclxuICAgIHRoaXMuYnVzeUluZm8gPSBudWxsO1xyXG4gICAgdGhpcy5hY3RpdmVKb2IgPSBudWxsO1xyXG4gICAgdGhpcy5zdGFydGluZyA9IGtpbmQ7XHJcbiAgICB0aGlzLm1lc3NhZ2UgPSAnJztcclxuXHJcbiAgICBjb25zdCBzdWJtaXQkID1cclxuICAgICAga2luZCA9PT0gJ21icSdcclxuICAgICAgICA/IHRoaXMuc2JzLmV4cG9ydE1CUVNoZWV0QXN5bmMoeyBzdG9yZU5hbWUgfSlcclxuICAgICAgICA6IHRoaXMuc2JzLmV4cG9ydFBsYW5vT3JkZXJTaGVldEFzeW5jKHsgc3RvcmVOYW1lIH0pO1xyXG5cclxuICAgIHN1Ym1pdCQuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlc3A6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RhcnRpbmcgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGJvZHkgPSByZXNwPy5ib2R5ID8/IHJlc3A7XHJcbiAgICAgICAgY29uc3Qgam9iSWQgPSBib2R5Py5kYXRhPy5qb2JJZDtcclxuICAgICAgICBpZiAoIWpvYklkKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKFxyXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN0YXJ0ICR7dGhpcy5raW5kTGFiZWwoa2luZCl9IGV4cG9ydCDigJQgc2VydmVyIGRpZCBub3QgcmV0dXJuIGEgam9iSWQuYCxcclxuICAgICAgICAgICAgJ2Vycm9yJyxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWN0aXZlSm9iID0ge1xyXG4gICAgICAgICAgam9iSWQsXHJcbiAgICAgICAgICBraW5kLFxyXG4gICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXHJcbiAgICAgICAgICBzdGFydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgIHN0b3JlQ291bnQ6IHN0b3JlTmFtZS5sZW5ndGgsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnN0YXJ0UG9sbGluZyhqb2JJZCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnN0YXJ0aW5nID0gbnVsbDtcclxuICAgICAgICBjb25zdCBzdGF0dXMgPSBlcnI/LnN0YXR1cztcclxuICAgICAgICBjb25zdCByZXNwQm9keSA9IGVycj8uZXJyb3I7XHJcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gNDA5ICYmIHJlc3BCb2R5Py5kYXRhPy5qb2JJZCkge1xyXG4gICAgICAgICAgdGhpcy5idXN5SW5mbyA9IHtcclxuICAgICAgICAgICAgam9iSWQ6IHJlc3BCb2R5LmRhdGEuam9iSWQsXHJcbiAgICAgICAgICAgIGtpbmQ6IHJlc3BCb2R5LmRhdGEua2luZCxcclxuICAgICAgICAgICAgc3RhcnRlZEF0OiByZXNwQm9keS5kYXRhLnN0YXJ0ZWRBdCxcclxuICAgICAgICAgICAgc3RvcmVDb3VudDogcmVzcEJvZHkuZGF0YS5zdG9yZUNvdW50LFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgZXJyTXNnID1cclxuICAgICAgICAgICAgKHR5cGVvZiByZXNwQm9keT8uZXJyb3IgPT09ICdzdHJpbmcnICYmIHJlc3BCb2R5LmVycm9yKSB8fFxyXG4gICAgICAgICAgICByZXNwQm9keT8uZXJyb3I/Lm1lc3NhZ2UgfHxcclxuICAgICAgICAgICAgcmVzcEJvZHk/Lm1lc3NhZ2UgfHxcclxuICAgICAgICAgICAgZXJyPy5tZXNzYWdlIHx8XHJcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc3RhcnQgJHt0aGlzLmtpbmRMYWJlbChraW5kKX0gZXhwb3J0LmA7XHJcbiAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKGVyck1zZywgJ2Vycm9yJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0UG9sbGluZyhqb2JJZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnN0b3BQb2xsJC5uZXh0KCk7XHJcbiAgICBjb25zdCBwb2xsU3RhcnRlZCA9IERhdGUubm93KCk7XHJcbiAgICB0aW1lcihQT0xMX0lOSVRJQUxfREVMQVlfTVMsIFBPTExfSU5URVJWQUxfTVMpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5zdG9wUG9sbCQpLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PlxyXG4gICAgICAgICAgdGhpcy5zYnMuZ2V0UGxhbm9FeHBvcnRKb2Ioam9iSWQpLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIC0gcG9sbFN0YXJ0ZWQgPiBQT0xMX1RJTUVPVVRfTVMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUG9sbFRpbWVvdXQoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICksXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghcmVzKSByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgam9iID0gcmVzPy5kYXRhO1xyXG4gICAgICAgIGlmICgham9iKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5hY3RpdmVKb2IgPSB7XHJcbiAgICAgICAgICBqb2JJZDogam9iLmpvYklkLFxyXG4gICAgICAgICAga2luZDogam9iLmtpbmQsXHJcbiAgICAgICAgICBzdGF0dXM6IGpvYi5zdGF0dXMsXHJcbiAgICAgICAgICBzdGFydGVkQXQ6IGpvYi5zdGFydGVkQXQsXHJcbiAgICAgICAgICBjb21wbGV0ZWRBdDogam9iLmNvbXBsZXRlZEF0LFxyXG4gICAgICAgICAgZG93bmxvYWRVcmw6IGpvYi5kb3dubG9hZFVybCxcclxuICAgICAgICAgIGVycm9yOiBqb2IuZXJyb3IsXHJcbiAgICAgICAgICByb3dDb3VudDogam9iLnJvd0NvdW50LFxyXG4gICAgICAgICAgc3RvcmVDb3VudDogam9iLnN0b3JlQ291bnQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoam9iLnN0YXR1cyA9PT0gJ3N1Y2NlZWRlZCcpIHtcclxuICAgICAgICAgIHRoaXMuc3RvcFBvbGwkLm5leHQoKTtcclxuICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoXHJcbiAgICAgICAgICAgIGAke3RoaXMua2luZExhYmVsKGpvYi5raW5kKX0gZXhwb3J0IGlzIHJlYWR5LmAsXHJcbiAgICAgICAgICAgICdzdWNjZXNzJyxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChqb2Iuc3RhdHVzID09PSAnZmFpbGVkJykge1xyXG4gICAgICAgICAgdGhpcy5zdG9wUG9sbCQubmV4dCgpO1xyXG4gICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShcclxuICAgICAgICAgICAgYCR7dGhpcy5raW5kTGFiZWwoam9iLmtpbmQpfSBleHBvcnQgZmFpbGVkOiAke1xyXG4gICAgICAgICAgICAgIGpvYi5lcnJvciB8fCAnVW5rbm93biBlcnJvcidcclxuICAgICAgICAgICAgfWAsXHJcbiAgICAgICAgICAgICdlcnJvcicsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBqb2Iuc3RhdHVzID09PSAncnVubmluZycgJiZcclxuICAgICAgICAgIERhdGUubm93KCkgLSBwb2xsU3RhcnRlZCA+IFBPTExfVElNRU9VVF9NU1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVQb2xsVGltZW91dCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZVBvbGxUaW1lb3V0KCkge1xyXG4gICAgdGhpcy5zdG9wUG9sbCQubmV4dCgpO1xyXG4gICAgaWYgKHRoaXMuYWN0aXZlSm9iKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlSm9iID0ge1xyXG4gICAgICAgIC4uLnRoaXMuYWN0aXZlSm9iLFxyXG4gICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXHJcbiAgICAgICAgZXJyb3I6ICdUaW1lZCBvdXQgd2FpdGluZyBmb3IgZXhwb3J0IHRvIGNvbXBsZXRlLicsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICB0aGlzLnNob3dNZXNzYWdlKFxyXG4gICAgICAnVGltZWQgb3V0IHdhaXRpbmcgZm9yIGV4cG9ydCB0byBjb21wbGV0ZS4gVGhlIGpvYiBtYXkgc3RpbGwgYmUgcnVubmluZyBvbiB0aGUgc2VydmVyIOKAlCByZWZyZXNoIGxhdGVyLicsXHJcbiAgICAgICdlcnJvcicsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2hvd01lc3NhZ2UobXNnOiBzdHJpbmcsIHR5cGU6ICdzdWNjZXNzJyB8ICdlcnJvcicpIHtcclxuICAgIHRoaXMubWVzc2FnZSA9IG1zZztcclxuICAgIHRoaXMubWVzc2FnZVR5cGUgPSB0eXBlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5tZXNzYWdlID0gJycpLCA2MDAwKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdG9wUG9sbCQubmV4dCgpO1xyXG4gICAgdGhpcy5zdG9wUG9sbCQuY29tcGxldGUoKTtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8c2VjdGlvbiBjbGFzcz1cInN0b3JlLWV4cG9ydHMgcC0zXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNhcmQgcC00XCIgc3R5bGU9XCJtYXgtd2lkdGg6IDcwMHB4O1wiPlxyXG4gICAgPGg1IGNsYXNzPVwibWItMVwiPlN0b3JlIEV4cG9ydHM8L2g1PlxyXG4gICAgPHAgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG1iLTNcIj5cclxuICAgICAgR2VuZXJhdGUgcGVyLXN0b3JlIGZpeHR1cmUgZXhwb3J0cy4gU2VsZWN0IG9uZSBvciBtb3JlIHN0b3JlcywgdGhlbiBjaG9vc2UgYW4gZXhwb3J0LlxyXG4gICAgICBMYXJnZSBleHBvcnRzIHJ1biBpbiB0aGUgYmFja2dyb3VuZCBhbmQgYXJlIHNhdmVkIHRvIFMzIOKAlCBhIGRvd25sb2FkIGxpbmsgYXBwZWFycyBoZXJlIHdoZW4gcmVhZHkuXHJcbiAgICA8L3A+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN0b3JlczwvbGFiZWw+XHJcbiAgICAgIDxsaWItc3RvcmUtc2VsZWN0XHJcbiAgICAgICAgW29wdGlvbnNdPVwic3RvcmVPcHRpb25zXCJcclxuICAgICAgICBbaW5pdGlhbFNlbGVjdGVkXT1cImluaXRpYWxTdG9yZXNcIlxyXG4gICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJvblN0b3Jlc1NlbGVjdGVkKCRldmVudClcIj5cclxuICAgICAgPC9saWItc3RvcmUtc2VsZWN0PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMiBmbGV4LXdyYXBcIj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAoY2xpY2spPVwib25FeHBvcnRNYnEoKVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzV29ya2luZyB8fCBzZWxlY3RlZFN0b3Jlcy5sZW5ndGggPT09IDBcIj5cclxuICAgICAgICBAaWYgKHN0YXJ0aW5nID09PSAnbWJxJykge1xyXG4gICAgICAgICAgU3RhcnRpbmcgTUJRLi4uXHJcbiAgICAgICAgfSBAZWxzZSBpZiAoYWN0aXZlSm9iPy5zdGF0dXMgPT09ICdydW5uaW5nJyAmJiBhY3RpdmVKb2I/LmtpbmQgPT09ICdtYnEnKSB7XHJcbiAgICAgICAgICBSdW5uaW5nIE1CUS4uLlxyXG4gICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgRXhwb3J0IE1CUVxyXG4gICAgICAgIH1cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgIChjbGljayk9XCJvbkV4cG9ydE9yZGVyU2hlZXQoKVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzV29ya2luZyB8fCBzZWxlY3RlZFN0b3Jlcy5sZW5ndGggPT09IDBcIj5cclxuICAgICAgICBAaWYgKHN0YXJ0aW5nID09PSAnb3JkZXInKSB7XHJcbiAgICAgICAgICBTdGFydGluZyBPcmRlciBTaGVldC4uLlxyXG4gICAgICAgIH0gQGVsc2UgaWYgKGFjdGl2ZUpvYj8uc3RhdHVzID09PSAncnVubmluZycgJiYgYWN0aXZlSm9iPy5raW5kID09PSAnb3JkZXInKSB7XHJcbiAgICAgICAgICBSdW5uaW5nIE9yZGVyIFNoZWV0Li4uXHJcbiAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICBFeHBvcnQgT3JkZXIgU2hlZXRcclxuICAgICAgICB9XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgQGlmIChidXN5SW5mbykge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwibXQtMyBhbGVydCBhbGVydC13YXJuaW5nXCI+XHJcbiAgICAgICAgQW5vdGhlciB7eyBraW5kTGFiZWwoYnVzeUluZm8ua2luZCkgfX0gZXhwb3J0IGlzIGN1cnJlbnRseSBydW5uaW5nQGlmIChidXN5SW5mby5zdG9yZUNvdW50KSB7ICh7eyBidXN5SW5mby5zdG9yZUNvdW50IH19IHN0b3Jle3sgYnVzeUluZm8uc3RvcmVDb3VudCA9PT0gMSA/ICcnIDogJ3MnIH19KSB9QGlmIChidXN5SW5mby5zdGFydGVkQXQpIHssIHN0YXJ0ZWQge3sgc3RhcnRlZEFnbyhidXN5SW5mby5zdGFydGVkQXQpIH19fS4gUGxlYXNlIHdhaXQgdW50aWwgaXQgZmluaXNoZXMgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IGV4cG9ydC5cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgQGlmIChhY3RpdmVKb2IpIHtcclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwibXQtMyBhbGVydFwiXHJcbiAgICAgICAgW2NsYXNzLmFsZXJ0LWluZm9dPVwiYWN0aXZlSm9iLnN0YXR1cyA9PT0gJ3J1bm5pbmcnXCJcclxuICAgICAgICBbY2xhc3MuYWxlcnQtc3VjY2Vzc109XCJhY3RpdmVKb2Iuc3RhdHVzID09PSAnc3VjY2VlZGVkJ1wiXHJcbiAgICAgICAgW2NsYXNzLmFsZXJ0LWRhbmdlcl09XCJhY3RpdmVKb2Iuc3RhdHVzID09PSAnZmFpbGVkJ1wiPlxyXG4gICAgICAgIEBpZiAoYWN0aXZlSm9iLnN0YXR1cyA9PT0gJ3J1bm5pbmcnKSB7XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICB7eyBraW5kTGFiZWwoYWN0aXZlSm9iLmtpbmQpIH19IGV4cG9ydCBpcyBwcm9jZXNzaW5nQGlmIChhY3RpdmVKb2Iuc3RvcmVDb3VudCkgeyAoe3sgYWN0aXZlSm9iLnN0b3JlQ291bnQgfX0gc3RvcmV7eyBhY3RpdmVKb2Iuc3RvcmVDb3VudCA9PT0gMSA/ICcnIDogJ3MnIH19KSB9LiBTdGFydGVkIHt7IHN0YXJ0ZWRBZ28oYWN0aXZlSm9iLnN0YXJ0ZWRBdCkgfX0uIEtlZXAgdGhpcyBwYWdlIG9wZW4g4oCUIGEgZG93bmxvYWQgbGluayB3aWxsIGFwcGVhciB3aGVuIGl0IGZpbmlzaGVzLlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfSBAZWxzZSBpZiAoYWN0aXZlSm9iLnN0YXR1cyA9PT0gJ3N1Y2NlZWRlZCcgJiYgYWN0aXZlSm9iLmRvd25sb2FkVXJsKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBnYXAtMiBmbGV4LXdyYXBcIj5cclxuICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAge3sga2luZExhYmVsKGFjdGl2ZUpvYi5raW5kKSB9fSBleHBvcnQgcmVhZHlAaWYgKGFjdGl2ZUpvYi5yb3dDb3VudCkgeyDigJQge3sgYWN0aXZlSm9iLnJvd0NvdW50IH19IHJvd3t7IGFjdGl2ZUpvYi5yb3dDb3VudCA9PT0gMSA/ICcnIDogJ3MnIH19IH0uXHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgIDxhIFtocmVmXT1cImFjdGl2ZUpvYi5kb3dubG9hZFVybFwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc3VjY2Vzc1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCI+RG93bmxvYWQ8L2E+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImRpc21pc3NSZXN1bHQoKVwiPkRpc21pc3M8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9IEBlbHNlIGlmIChhY3RpdmVKb2Iuc3RhdHVzID09PSAnZmFpbGVkJykge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gZ2FwLTIgZmxleC13cmFwXCI+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IGtpbmRMYWJlbChhY3RpdmVKb2Iua2luZCkgfX0gZXhwb3J0IGZhaWxlZDoge3sgYWN0aXZlSm9iLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImRpc21pc3NSZXN1bHQoKVwiPkRpc21pc3M8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgQGlmIChtZXNzYWdlKSB7XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cIm10LTMgYWxlcnRcIlxyXG4gICAgICAgIFtjbGFzcy5hbGVydC1zdWNjZXNzXT1cIm1lc3NhZ2VUeXBlID09PSAnc3VjY2VzcydcIlxyXG4gICAgICAgIFtjbGFzcy5hbGVydC1kYW5nZXJdPVwibWVzc2FnZVR5cGUgPT09ICdlcnJvcidcIj5cclxuICAgICAgICB7eyBtZXNzYWdlIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcbiJdfQ==
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==