bways-report 0.1.9 → 0.2.0

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 (93) hide show
  1. package/README.md +463 -316
  2. package/esm2022/lib/core/config/bways-report-config.mjs +29 -32
  3. package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
  4. package/esm2022/lib/core/services/report-api-execution.service.mjs +33 -11
  5. package/esm2022/lib/core/services/report-session-context.service.mjs +72 -3
  6. package/esm2022/lib/core/tokens/designer-config.token.mjs +4 -0
  7. package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
  8. package/esm2022/lib/core/utils/report-endpoint.util.mjs +22 -0
  9. package/esm2022/lib/core/utils/report-request-scope.mjs +48 -0
  10. package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +8 -1
  11. package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +5 -2
  12. package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +5 -2
  13. package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +30 -14
  14. package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +32 -28
  15. package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +1 -1
  16. package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +4 -37
  17. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +4 -50
  18. package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +43 -194
  19. package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +17 -65
  20. package/esm2022/lib/data-access/adapters/index.mjs +1 -1
  21. package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +13 -4
  22. package/esm2022/lib/data-access/adapters/report-id-availability.mjs +20 -0
  23. package/esm2022/lib/data-access/adapters/session-headers.mjs +11 -0
  24. package/esm2022/lib/data-access/contracts/index.mjs +1 -1
  25. package/esm2022/lib/data-access/contracts/report-persistence.contract.mjs +13 -1
  26. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +50 -40
  27. package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +546 -119
  28. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +12 -6
  29. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +9 -8
  30. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +9 -4
  31. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +54 -32
  32. package/esm2022/lib/features/designer/designer.component.mjs +100 -67
  33. package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +10 -4
  34. package/esm2022/lib/features/designer/services/designer-config.service.mjs +56 -0
  35. package/esm2022/lib/features/designer/services/designer-endpoints.service.mjs +155 -0
  36. package/esm2022/lib/features/designer/services/designer-state.service.mjs +3 -2
  37. package/esm2022/lib/features/embed/bways-report-builder.component.mjs +3 -3
  38. package/esm2022/lib/features/export/services/report-export.service.mjs +11 -6
  39. package/esm2022/lib/features/persistence/services/report-store.service.mjs +78 -23
  40. package/esm2022/lib/features/persistence/services/schema-validator.service.mjs +59 -3
  41. package/esm2022/lib/features/routing/components/routed-report-designer.component.mjs +12 -17
  42. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +5 -3
  43. package/esm2022/lib/features/routing/report-routes.mjs +6 -6
  44. package/esm2022/lib/features/routing/resolvers/report-route-identifier.mjs +5 -0
  45. package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +3 -2
  46. package/esm2022/lib/features/runtime/report-execution.service.mjs +18 -5
  47. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +4 -2
  48. package/esm2022/lib/features/runtime/report-runtime.component.mjs +94 -71
  49. package/esm2022/lib/features/runtime/rpt-report.component.mjs +49 -41
  50. package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +7 -2
  51. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +13 -1
  52. package/esm2022/lib/provide-reporting.mjs +9 -29
  53. package/fesm2022/bways-report.mjs +1789 -1041
  54. package/fesm2022/bways-report.mjs.map +1 -1
  55. package/lib/core/config/bways-report-config.d.ts +14 -5
  56. package/lib/core/models/report-datasource.model.d.ts +5 -0
  57. package/lib/core/services/report-session-context.service.d.ts +9 -0
  58. package/lib/core/tokens/designer-config.token.d.ts +4 -0
  59. package/lib/core/tokens/reporting-config.token.d.ts +4 -0
  60. package/lib/core/utils/report-endpoint.util.d.ts +12 -0
  61. package/lib/core/utils/report-request-scope.d.ts +14 -0
  62. package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +6 -2
  63. package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +4 -2
  64. package/lib/data-access/adapters/endpoint-tokens.d.ts +4 -0
  65. package/lib/data-access/adapters/http-datasource.adapter.d.ts +1 -3
  66. package/lib/data-access/adapters/http-lookup.adapter.d.ts +1 -3
  67. package/lib/data-access/adapters/http-persistence.adapter.d.ts +11 -16
  68. package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +3 -5
  69. package/lib/data-access/adapters/index.d.ts +1 -1
  70. package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +2 -2
  71. package/lib/data-access/adapters/report-id-availability.d.ts +6 -0
  72. package/lib/data-access/adapters/session-headers.d.ts +3 -0
  73. package/lib/data-access/contracts/index.d.ts +1 -0
  74. package/lib/data-access/contracts/report-persistence.contract.d.ts +16 -1
  75. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +2 -0
  76. package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +37 -5
  77. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +4 -3
  78. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +1 -0
  79. package/lib/features/designer/components/property-editor/property-editor.component.d.ts +1 -0
  80. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +7 -1
  81. package/lib/features/designer/designer.component.d.ts +15 -2
  82. package/lib/features/designer/rpt-report-designer.component.d.ts +5 -1
  83. package/lib/features/designer/services/designer-config.service.d.ts +13 -0
  84. package/lib/features/designer/services/designer-endpoints.service.d.ts +25 -0
  85. package/lib/features/persistence/services/report-store.service.d.ts +15 -1
  86. package/lib/features/persistence/services/schema-validator.service.d.ts +2 -0
  87. package/lib/features/routing/resolvers/report-route-identifier.d.ts +2 -0
  88. package/lib/features/runtime/report-execution.service.d.ts +3 -0
  89. package/lib/features/runtime/report-grid-bridge.component.d.ts +1 -0
  90. package/lib/features/runtime/report-runtime.component.d.ts +1 -0
  91. package/lib/features/runtime/rpt-report.component.d.ts +5 -0
  92. package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +3 -1
  93. package/package.json +2 -1
@@ -10,7 +10,7 @@ import { extractLookupOptionItem, extractRowArray } from '../../core/utils/data-
10
10
  import * as i0 from "@angular/core";
11
11
  /**
12
12
  * Built-in HTTP adapter for fetching dropdown options from backend database tables, SPs, and REST APIs.
13
- * Includes in-memory caching with TTL, in-flight request deduplication, and fallback mock data.
13
+ * Includes in-memory caching with TTL, in-flight request deduplication, and explicit request errors.
14
14
  */
15
15
  export class HttpReportLookupAdapter extends ReportLookupAdapter {
16
16
  http = inject(HttpClient, { optional: true });
@@ -19,45 +19,6 @@ export class HttpReportLookupAdapter extends ReportLookupAdapter {
19
19
  apiExecutionService = inject(ReportApiExecutionService, { optional: true });
20
20
  cache = new Map();
21
21
  inFlight = new Map();
22
- mockDataStore = {
23
- Customers: [
24
- { customerId: 101, customerName: 'Acme Corporation', branchId: 1, isActive: true },
25
- { customerId: 102, customerName: 'Globex Industries', branchId: 2, isActive: true },
26
- { customerId: 103, customerName: 'Initech Software', branchId: 1, isActive: true },
27
- { customerId: 104, customerName: 'Umbrella Corporation', branchId: 3, isActive: true },
28
- { customerId: 105, customerName: 'Wayne Enterprises', branchId: 2, isActive: true },
29
- { customerId: 106, customerName: 'Stark Industries', branchId: 1, isActive: true },
30
- ],
31
- Branches: [
32
- { branchId: 1, branchName: 'North America HQ (New York)', region: 'North America' },
33
- { branchId: 2, branchName: 'EMEA Division (London)', region: 'Europe' },
34
- { branchId: 3, branchName: 'APAC Hub (Singapore)', region: 'Asia Pacific' },
35
- { branchId: 4, branchName: 'LATAM Office (São Paulo)', region: 'Latin America' },
36
- ],
37
- Products: [
38
- { productId: 1, productName: 'Enterprise ERP Suite', category: 'Software', unitPrice: 2400 },
39
- { productId: 2, productName: 'Cloud Analytics Pro', category: 'SaaS', unitPrice: 1200 },
40
- { productId: 3, productName: 'Security Shield Endpoint', category: 'Security', unitPrice: 850 },
41
- { productId: 4, productName: 'Dedicated API Gateway', category: 'Infrastructure', unitPrice: 3100 },
42
- ],
43
- PaymentMethods: [
44
- { code: 'BANK_TRANSFER', title: 'Direct Bank Wire' },
45
- { code: 'CREDIT_CARD', title: 'Corporate Credit Card' },
46
- { code: 'PAYPAL', title: 'PayPal Corporate' },
47
- { code: 'NET_30', title: 'Net 30 Invoicing' },
48
- ],
49
- usp_GetCustomerList: [
50
- { id: 101, name: 'Acme Corporation (SP)', branchId: 1, branch: 'NA' },
51
- { id: 102, name: 'Globex Industries (SP)', branchId: 2, branch: 'EMEA' },
52
- { id: 105, name: 'Wayne Enterprises (SP)', branchId: 1, branch: 'NA' },
53
- { id: 106, name: 'Stark Industries (SP)', branchId: 3, branch: 'APAC' },
54
- ],
55
- usp_GetBranchLookup: [
56
- { id: 1, name: 'North America HQ' },
57
- { id: 2, name: 'EMEA Division' },
58
- { id: 3, name: 'APAC Hub' },
59
- ],
60
- };
61
22
  fetchOptions(request) {
62
23
  const cacheKey = this.generateCacheKey(request);
63
24
  const cached = this.cache.get(cacheKey);
@@ -116,9 +77,7 @@ export class HttpReportLookupAdapter extends ReportLookupAdapter {
116
77
  this.inFlight.set(cacheKey, obs$);
117
78
  return obs$;
118
79
  }
119
- const fallback = this.resolveMockOptions(request);
120
- this.setCache(cacheKey, fallback, 600);
121
- return of(fallback);
80
+ return throwError(() => new Error('[bways-report] Lookup requires HttpClient and apiBaseUrl.'));
122
81
  }
123
82
  setCache(key, data, ttlSeconds = 600) {
124
83
  this.cache.set(key, {
@@ -127,12 +86,7 @@ export class HttpReportLookupAdapter extends ReportLookupAdapter {
127
86
  });
128
87
  }
129
88
  generateCacheKey(req) {
130
- return `${req.sourceType}:${req.entityName || req.apiEndpoint}:${req.valueField}:${req.displayField}:${req.dataPath ?? ''}:${JSON.stringify(req.filter ?? {})}:${JSON.stringify(req.parameters ?? {})}`;
131
- }
132
- resolveMockOptions(req) {
133
- const entity = req.entityName || '';
134
- const records = this.mockDataStore[entity] ?? [];
135
- return records.map((r) => extractLookupOptionItem(r, req.valueField, req.displayField));
89
+ return JSON.stringify(this.sessionService?.getCurrentSessionContext() ?? {}) + ':' + `${req.sourceType}:${req.entityName || req.apiEndpoint}:${req.valueField}:${req.displayField}:${req.dataPath ?? ''}:${req.schema ?? 'dbo'}:${req.limit ?? 500}:${JSON.stringify(req.filter ?? {})}:${JSON.stringify(req.parameters ?? {})}`;
136
90
  }
137
91
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HttpReportLookupAdapter, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
138
92
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HttpReportLookupAdapter });
@@ -142,4 +96,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
142
96
  }] });
143
97
  /** Convenience alias */
144
98
  export const HttpLookupAdapter = HttpReportLookupAdapter;
145
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1sb29rdXAuYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2RhdGEtYWNjZXNzL2FkYXB0ZXJzL2h0dHAtbG9va3VwLmFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQWMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFHTCxtQkFBbUIsR0FDcEIsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsZUFBZSxFQUFFLE1BQU0sMENBQTBDLENBQUM7O0FBT3BHOzs7R0FHRztBQUVILE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxtQkFBbUI7SUFDN0MsSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5QyxNQUFNLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEQsY0FBYyxHQUFHLE1BQU0sQ0FBQywyQkFBMkIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRTVFLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztJQUN0QyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQTBDLENBQUM7SUFFN0QsYUFBYSxHQUFzRDtRQUNsRixTQUFTLEVBQUU7WUFDVCxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtZQUNsRixFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtZQUNuRixFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtZQUNsRixFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtZQUN0RixFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtZQUNuRixFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtTQUNuRjtRQUNELFFBQVEsRUFBRTtZQUNSLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRTtZQUNuRixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7WUFDdkUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFO1lBQzNFLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRTtTQUNqRjtRQUNELFFBQVEsRUFBRTtZQUNSLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO1lBQzVGLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO1lBQ3ZGLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsMEJBQTBCLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO1lBQy9GLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUU7U0FDcEc7UUFDRCxjQUFjLEVBQUU7WUFDZCxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFO1lBQ3BELEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUU7WUFDdkQsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRTtZQUM3QyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFO1NBQzlDO1FBQ0QsbUJBQW1CLEVBQUU7WUFDbkIsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFDckUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSx3QkFBd0IsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7WUFDeEUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSx3QkFBd0IsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFDdEUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7U0FDeEU7UUFDRCxtQkFBbUIsRUFBRTtZQUNuQixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQ25DLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQ2hDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO1NBQzVCO0tBQ0YsQ0FBQztJQUVGLFlBQVksQ0FBQyxPQUEyQjtRQUN0QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXZCLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDckMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVELG9DQUFvQztRQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxLQUFLLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3RGLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7WUFDcEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLG1CQUFtQjtpQkFDbEMsVUFBVSxDQUNUO2dCQUNFLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7Z0JBQzFCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTthQUMzQixFQUNELE9BQU8sQ0FBQyxVQUFpQixFQUN6QixPQUFPLENBQUMsTUFBYSxDQUN0QjtpQkFDQSxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDWixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FDbkIsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUNyRSxDQUNGLEVBQ0QsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ1osSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzVELENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNqQixNQUFNLEdBQUcsR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLDJCQUEyQixDQUFDO2dCQUMvRSxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLENBQUMsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakMsQ0FBQyxDQUFDLEVBQ0YsV0FBVyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FDL0MsQ0FBQztZQUVKLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQztRQUN4QyxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDNUQsSUFBSSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN4RSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEUsQ0FBQztZQUNELElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3RFLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRSxDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQVUsR0FBRyxPQUFPLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDbEYsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2YsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMzQyxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUM3Qix1QkFBdUIsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQ3JFLENBQUM7WUFDSixDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDWiw2RUFBNkU7Z0JBQzdFLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1RCxDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDakIsTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQztnQkFDM0UsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoRixDQUFDLENBQUMsRUFDRixRQUFRLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxFQUNGLFdBQVcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQy9DLENBQUM7WUFFRixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2QyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRU8sUUFBUSxDQUFDLEdBQVcsRUFBRSxJQUF3QixFQUFFLFVBQVUsR0FBRyxHQUFHO1FBQ3RFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNsQixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFVBQVUsR0FBRyxJQUFJO1lBQ3pDLElBQUk7U0FDTCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsR0FBdUI7UUFDOUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLFlBQVksSUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDMU0sQ0FBQztJQUVPLGtCQUFrQixDQUFDLEdBQXVCO1FBQ2hELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQzVCLHVCQUF1QixDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FDN0QsQ0FBQztJQUNKLENBQUM7d0dBN0pVLHVCQUF1Qjs0R0FBdkIsdUJBQXVCOzs0RkFBdkIsdUJBQXVCO2tCQURuQyxVQUFVOztBQWlLWCx3QkFBd0I7QUFDeEIsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpbmFsaXplLCBtYXAsIHNoYXJlUmVwbGF5LCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBMb29rdXBPcHRpb25JdGVtLFxuICBMb29rdXBRdWVyeVJlcXVlc3QsXG4gIFJlcG9ydExvb2t1cEFkYXB0ZXIsXG59IGZyb20gJy4uL2NvbnRyYWN0cy9sb29rdXAuY29udHJhY3QnO1xuaW1wb3J0IHsgUkVQT1JUSU5HX0NPTkZJRyB9IGZyb20gJy4uLy4uL2NvcmUvdG9rZW5zL3JlcG9ydGluZy1jb25maWcudG9rZW4nO1xuaW1wb3J0IHsgUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9yZXBvcnQtc2Vzc2lvbi1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0QXBpRXhlY3V0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvcmVwb3J0LWFwaS1leGVjdXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBleHRyYWN0TG9va3VwT3B0aW9uSXRlbSwgZXh0cmFjdFJvd0FycmF5IH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9kYXRhLW5vcm1hbGl6YXRpb24udXRpbCc7XG5cbmludGVyZmFjZSBDYWNoZUVudHJ5IHtcbiAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIGRhdGE6IExvb2t1cE9wdGlvbkl0ZW1bXTtcbn1cblxuLyoqXG4gKiBCdWlsdC1pbiBIVFRQIGFkYXB0ZXIgZm9yIGZldGNoaW5nIGRyb3Bkb3duIG9wdGlvbnMgZnJvbSBiYWNrZW5kIGRhdGFiYXNlIHRhYmxlcywgU1BzLCBhbmQgUkVTVCBBUElzLlxuICogSW5jbHVkZXMgaW4tbWVtb3J5IGNhY2hpbmcgd2l0aCBUVEwsIGluLWZsaWdodCByZXF1ZXN0IGRlZHVwbGljYXRpb24sIGFuZCBmYWxsYmFjayBtb2NrIGRhdGEuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBIdHRwUmVwb3J0TG9va3VwQWRhcHRlciBleHRlbmRzIFJlcG9ydExvb2t1cEFkYXB0ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWcgPSBpbmplY3QoUkVQT1JUSU5HX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uU2VydmljZSA9IGluamVjdChSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpRXhlY3V0aW9uU2VydmljZSA9IGluamVjdChSZXBvcnRBcGlFeGVjdXRpb25TZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVFbnRyeT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbkZsaWdodCA9IG5ldyBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPExvb2t1cE9wdGlvbkl0ZW1bXT4+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtb2NrRGF0YVN0b3JlOiBSZWNvcmQ8c3RyaW5nLCBBcnJheTx7IFtrZXk6IHN0cmluZ106IHVua25vd24gfT4+ID0ge1xuICAgIEN1c3RvbWVyczogW1xuICAgICAgeyBjdXN0b21lcklkOiAxMDEsIGN1c3RvbWVyTmFtZTogJ0FjbWUgQ29ycG9yYXRpb24nLCBicmFuY2hJZDogMSwgaXNBY3RpdmU6IHRydWUgfSxcbiAgICAgIHsgY3VzdG9tZXJJZDogMTAyLCBjdXN0b21lck5hbWU6ICdHbG9iZXggSW5kdXN0cmllcycsIGJyYW5jaElkOiAyLCBpc0FjdGl2ZTogdHJ1ZSB9LFxuICAgICAgeyBjdXN0b21lcklkOiAxMDMsIGN1c3RvbWVyTmFtZTogJ0luaXRlY2ggU29mdHdhcmUnLCBicmFuY2hJZDogMSwgaXNBY3RpdmU6IHRydWUgfSxcbiAgICAgIHsgY3VzdG9tZXJJZDogMTA0LCBjdXN0b21lck5hbWU6ICdVbWJyZWxsYSBDb3Jwb3JhdGlvbicsIGJyYW5jaElkOiAzLCBpc0FjdGl2ZTogdHJ1ZSB9LFxuICAgICAgeyBjdXN0b21lcklkOiAxMDUsIGN1c3RvbWVyTmFtZTogJ1dheW5lIEVudGVycHJpc2VzJywgYnJhbmNoSWQ6IDIsIGlzQWN0aXZlOiB0cnVlIH0sXG4gICAgICB7IGN1c3RvbWVySWQ6IDEwNiwgY3VzdG9tZXJOYW1lOiAnU3RhcmsgSW5kdXN0cmllcycsIGJyYW5jaElkOiAxLCBpc0FjdGl2ZTogdHJ1ZSB9LFxuICAgIF0sXG4gICAgQnJhbmNoZXM6IFtcbiAgICAgIHsgYnJhbmNoSWQ6IDEsIGJyYW5jaE5hbWU6ICdOb3J0aCBBbWVyaWNhIEhRIChOZXcgWW9yayknLCByZWdpb246ICdOb3J0aCBBbWVyaWNhJyB9LFxuICAgICAgeyBicmFuY2hJZDogMiwgYnJhbmNoTmFtZTogJ0VNRUEgRGl2aXNpb24gKExvbmRvbiknLCByZWdpb246ICdFdXJvcGUnIH0sXG4gICAgICB7IGJyYW5jaElkOiAzLCBicmFuY2hOYW1lOiAnQVBBQyBIdWIgKFNpbmdhcG9yZSknLCByZWdpb246ICdBc2lhIFBhY2lmaWMnIH0sXG4gICAgICB7IGJyYW5jaElkOiA0LCBicmFuY2hOYW1lOiAnTEFUQU0gT2ZmaWNlIChTw6NvIFBhdWxvKScsIHJlZ2lvbjogJ0xhdGluIEFtZXJpY2EnIH0sXG4gICAgXSxcbiAgICBQcm9kdWN0czogW1xuICAgICAgeyBwcm9kdWN0SWQ6IDEsIHByb2R1Y3ROYW1lOiAnRW50ZXJwcmlzZSBFUlAgU3VpdGUnLCBjYXRlZ29yeTogJ1NvZnR3YXJlJywgdW5pdFByaWNlOiAyNDAwIH0sXG4gICAgICB7IHByb2R1Y3RJZDogMiwgcHJvZHVjdE5hbWU6ICdDbG91ZCBBbmFseXRpY3MgUHJvJywgY2F0ZWdvcnk6ICdTYWFTJywgdW5pdFByaWNlOiAxMjAwIH0sXG4gICAgICB7IHByb2R1Y3RJZDogMywgcHJvZHVjdE5hbWU6ICdTZWN1cml0eSBTaGllbGQgRW5kcG9pbnQnLCBjYXRlZ29yeTogJ1NlY3VyaXR5JywgdW5pdFByaWNlOiA4NTAgfSxcbiAgICAgIHsgcHJvZHVjdElkOiA0LCBwcm9kdWN0TmFtZTogJ0RlZGljYXRlZCBBUEkgR2F0ZXdheScsIGNhdGVnb3J5OiAnSW5mcmFzdHJ1Y3R1cmUnLCB1bml0UHJpY2U6IDMxMDAgfSxcbiAgICBdLFxuICAgIFBheW1lbnRNZXRob2RzOiBbXG4gICAgICB7IGNvZGU6ICdCQU5LX1RSQU5TRkVSJywgdGl0bGU6ICdEaXJlY3QgQmFuayBXaXJlJyB9LFxuICAgICAgeyBjb2RlOiAnQ1JFRElUX0NBUkQnLCB0aXRsZTogJ0NvcnBvcmF0ZSBDcmVkaXQgQ2FyZCcgfSxcbiAgICAgIHsgY29kZTogJ1BBWVBBTCcsIHRpdGxlOiAnUGF5UGFsIENvcnBvcmF0ZScgfSxcbiAgICAgIHsgY29kZTogJ05FVF8zMCcsIHRpdGxlOiAnTmV0IDMwIEludm9pY2luZycgfSxcbiAgICBdLFxuICAgIHVzcF9HZXRDdXN0b21lckxpc3Q6IFtcbiAgICAgIHsgaWQ6IDEwMSwgbmFtZTogJ0FjbWUgQ29ycG9yYXRpb24gKFNQKScsIGJyYW5jaElkOiAxLCBicmFuY2g6ICdOQScgfSxcbiAgICAgIHsgaWQ6IDEwMiwgbmFtZTogJ0dsb2JleCBJbmR1c3RyaWVzIChTUCknLCBicmFuY2hJZDogMiwgYnJhbmNoOiAnRU1FQScgfSxcbiAgICAgIHsgaWQ6IDEwNSwgbmFtZTogJ1dheW5lIEVudGVycHJpc2VzIChTUCknLCBicmFuY2hJZDogMSwgYnJhbmNoOiAnTkEnIH0sXG4gICAgICB7IGlkOiAxMDYsIG5hbWU6ICdTdGFyayBJbmR1c3RyaWVzIChTUCknLCBicmFuY2hJZDogMywgYnJhbmNoOiAnQVBBQycgfSxcbiAgICBdLFxuICAgIHVzcF9HZXRCcmFuY2hMb29rdXA6IFtcbiAgICAgIHsgaWQ6IDEsIG5hbWU6ICdOb3J0aCBBbWVyaWNhIEhRJyB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogJ0VNRUEgRGl2aXNpb24nIH0sXG4gICAgICB7IGlkOiAzLCBuYW1lOiAnQVBBQyBIdWInIH0sXG4gICAgXSxcbiAgfTtcblxuICBmZXRjaE9wdGlvbnMocmVxdWVzdDogTG9va3VwUXVlcnlSZXF1ZXN0KTogT2JzZXJ2YWJsZTxMb29rdXBPcHRpb25JdGVtW10+IHtcbiAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2VuZXJhdGVDYWNoZUtleShyZXF1ZXN0KTtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChjYWNoZWQgJiYgY2FjaGVkLmV4cGlyZXNBdCA+IG5vdykge1xuICAgICAgcmV0dXJuIG9mKGNhY2hlZC5kYXRhKTtcbiAgICB9XG5cbiAgICBjb25zdCBydW5uaW5nID0gdGhpcy5pbkZsaWdodC5nZXQoY2FjaGVLZXkpO1xuICAgIGlmIChydW5uaW5nKSB7XG4gICAgICByZXR1cm4gcnVubmluZztcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgQVBJLWJhc2VkIGRyb3Bkb3duIGxvb2t1cHNcbiAgICBpZiAoKHJlcXVlc3Quc291cmNlVHlwZSA9PT0gJ2FwaScgfHwgcmVxdWVzdC5hcGlFbmRwb2ludCkgJiYgdGhpcy5hcGlFeGVjdXRpb25TZXJ2aWNlKSB7XG4gICAgICBjb25zdCBlbmRwb2ludFVybCA9IHJlcXVlc3QuYXBpRW5kcG9pbnQgfHwgcmVxdWVzdC5lbnRpdHlOYW1lIHx8ICcnO1xuICAgICAgY29uc3Qgb2JzJCA9IHRoaXMuYXBpRXhlY3V0aW9uU2VydmljZVxuICAgICAgICAuZXhlY3V0ZUFwaShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbmRwb2ludDogZW5kcG9pbnRVcmwsXG4gICAgICAgICAgICBkYXRhUGF0aDogcmVxdWVzdC5kYXRhUGF0aCxcbiAgICAgICAgICAgIHVzZVByb3h5OiByZXF1ZXN0LnVzZVByb3h5LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWVzdC5wYXJhbWV0ZXJzIGFzIGFueSxcbiAgICAgICAgICByZXF1ZXN0LmZpbHRlciBhcyBhbnlcbiAgICAgICAgKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoKGl0ZW1zKSA9PlxuICAgICAgICAgICAgaXRlbXMubWFwKChyOiBhbnkpID0+XG4gICAgICAgICAgICAgIGV4dHJhY3RMb29rdXBPcHRpb25JdGVtKHIsIHJlcXVlc3QudmFsdWVGaWVsZCwgcmVxdWVzdC5kaXNwbGF5RmllbGQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0YXAoKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID4gMCkgdGhpcy5zZXRDYWNoZShjYWNoZUtleSwgaXRlbXMsIDYwMCk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCAnQVBJIGxvb2t1cCByZXF1ZXN0IGZhaWxlZCc7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoQXJyYXkuaXNBcnJheShtc2cpID8gbXNnLmpvaW4oJywgJykgOiBtc2cpKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmluRmxpZ2h0LmRlbGV0ZShjYWNoZUtleSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KVxuICAgICAgICApO1xuXG4gICAgICB0aGlzLmluRmxpZ2h0LnNldChjYWNoZUtleSwgb2JzJCk7XG4gICAgICByZXR1cm4gb2JzJDtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5jb25maWc/LmFwaUJhc2VVcmw7XG4gICAgaWYgKGJhc2VVcmwgJiYgdGhpcy5odHRwKSB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9uU2VydmljZT8uc2Vzc2lvbkNvbnRleHQoKSA/PyB7fTtcbiAgICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgICBpZiAoc2Vzc2lvblsnY29tcGFueUlkJ10gIT09IHVuZGVmaW5lZCAmJiBzZXNzaW9uWydjb21wYW55SWQnXSAhPT0gbnVsbCkge1xuICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ1gtQ29tcGFueS1JZCcsIFN0cmluZyhzZXNzaW9uWydjb21wYW55SWQnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKHNlc3Npb25bJ2JyYW5jaElkJ10gIT09IHVuZGVmaW5lZCAmJiBzZXNzaW9uWydicmFuY2hJZCddICE9PSBudWxsKSB7XG4gICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnWC1CcmFuY2gtSWQnLCBTdHJpbmcoc2Vzc2lvblsnYnJhbmNoSWQnXSkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvYnMkID0gdGhpcy5odHRwLnBvc3Q8dW5rbm93bj4oYCR7YmFzZVVybH0vbG9va3VwYCwgcmVxdWVzdCwgeyBoZWFkZXJzIH0pLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBjb25zdCByYXdJdGVtcyA9IGV4dHJhY3RSb3dBcnJheShyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuIHJhd0l0ZW1zLm1hcCgocjogYW55KSA9PlxuICAgICAgICAgICAgZXh0cmFjdExvb2t1cE9wdGlvbkl0ZW0ociwgcmVxdWVzdC52YWx1ZUZpZWxkLCByZXF1ZXN0LmRpc3BsYXlGaWVsZClcbiAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFwKChpdGVtcykgPT4ge1xuICAgICAgICAgIC8vIE5ldmVyIGNhY2hlIGVtcHR5IHJlc3VsdHM6IHBhcmFtZXRlcnMgbWF5IHNpbXBseSBub3QgaGF2ZSBiZWVuIGZpbGxlZCB5ZXQuXG4gICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHRoaXMuc2V0Q2FjaGUoY2FjaGVLZXksIGl0ZW1zLCA2MDApO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgJ0xvb2t1cCByZXF1ZXN0IGZhaWxlZCc7XG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKEFycmF5LmlzQXJyYXkobXNnKSA/IG1zZy5qb2luKCcsICcpIDogbXNnKSk7XG4gICAgICAgIH0pLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbkZsaWdodC5kZWxldGUoY2FjaGVLZXkpO1xuICAgICAgICB9KSxcbiAgICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KVxuICAgICAgKTtcblxuICAgICAgdGhpcy5pbkZsaWdodC5zZXQoY2FjaGVLZXksIG9icyQpO1xuICAgICAgcmV0dXJuIG9icyQ7XG4gICAgfVxuXG4gICAgY29uc3QgZmFsbGJhY2sgPSB0aGlzLnJlc29sdmVNb2NrT3B0aW9ucyhyZXF1ZXN0KTtcbiAgICB0aGlzLnNldENhY2hlKGNhY2hlS2V5LCBmYWxsYmFjaywgNjAwKTtcbiAgICByZXR1cm4gb2YoZmFsbGJhY2spO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDYWNoZShrZXk6IHN0cmluZywgZGF0YTogTG9va3VwT3B0aW9uSXRlbVtdLCB0dGxTZWNvbmRzID0gNjAwKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZS5zZXQoa2V5LCB7XG4gICAgICBleHBpcmVzQXQ6IERhdGUubm93KCkgKyB0dGxTZWNvbmRzICogMTAwMCxcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlQ2FjaGVLZXkocmVxOiBMb29rdXBRdWVyeVJlcXVlc3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtyZXEuc291cmNlVHlwZX06JHtyZXEuZW50aXR5TmFtZSB8fCByZXEuYXBpRW5kcG9pbnR9OiR7cmVxLnZhbHVlRmllbGR9OiR7cmVxLmRpc3BsYXlGaWVsZH06JHtyZXEuZGF0YVBhdGggPz8gJyd9OiR7SlNPTi5zdHJpbmdpZnkocmVxLmZpbHRlciA/PyB7fSl9OiR7SlNPTi5zdHJpbmdpZnkocmVxLnBhcmFtZXRlcnMgPz8ge30pfWA7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVNb2NrT3B0aW9ucyhyZXE6IExvb2t1cFF1ZXJ5UmVxdWVzdCk6IExvb2t1cE9wdGlvbkl0ZW1bXSB7XG4gICAgY29uc3QgZW50aXR5ID0gcmVxLmVudGl0eU5hbWUgfHwgJyc7XG4gICAgY29uc3QgcmVjb3JkcyA9IHRoaXMubW9ja0RhdGFTdG9yZVtlbnRpdHldID8/IFtdO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgocjogYW55KSA9PlxuICAgICAgZXh0cmFjdExvb2t1cE9wdGlvbkl0ZW0ociwgcmVxLnZhbHVlRmllbGQsIHJlcS5kaXNwbGF5RmllbGQpXG4gICAgKTtcbiAgfVxufVxuXG4vKiogQ29udmVuaWVuY2UgYWxpYXMgKi9cbmV4cG9ydCBjb25zdCBIdHRwTG9va3VwQWRhcHRlciA9IEh0dHBSZXBvcnRMb29rdXBBZGFwdGVyO1xuIl19
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1sb29rdXAuYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2RhdGEtYWNjZXNzL2FkYXB0ZXJzL2h0dHAtbG9va3VwLmFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQWMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFHTCxtQkFBbUIsR0FDcEIsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsZUFBZSxFQUFFLE1BQU0sMENBQTBDLENBQUM7O0FBT3BHOzs7R0FHRztBQUVILE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxtQkFBbUI7SUFDN0MsSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5QyxNQUFNLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEQsY0FBYyxHQUFHLE1BQU0sQ0FBQywyQkFBMkIsRUFBRSxFQUFFLFFB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d0IsRUFBRSxVQUFVLEdBQUcsR0FBRztRQUN0RSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbEIsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxVQUFVLEdBQUcsSUFBSTtZQUN6QyxJQUFJO1NBQ0wsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEdBQXVCO1FBQzlDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLHdCQUF3QixFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQyxRQUFRLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksS0FBSyxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNuVSxDQUFDO3dHQTVHVSx1QkFBdUI7NEdBQXZCLHVCQUF1Qjs7NEZBQXZCLHVCQUF1QjtrQkFEbkMsVUFBVTs7QUFrSFgsd0JBQXdCO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaW5hbGl6ZSwgbWFwLCBzaGFyZVJlcGxheSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgTG9va3VwT3B0aW9uSXRlbSxcbiAgTG9va3VwUXVlcnlSZXF1ZXN0LFxuICBSZXBvcnRMb29rdXBBZGFwdGVyLFxufSBmcm9tICcuLi9jb250cmFjdHMvbG9va3VwLmNvbnRyYWN0JztcbmltcG9ydCB7IFJFUE9SVElOR19DT05GSUcgfSBmcm9tICcuLi8uLi9jb3JlL3Rva2Vucy9yZXBvcnRpbmctY29uZmlnLnRva2VuJztcbmltcG9ydCB7IFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvcmVwb3J0LXNlc3Npb24tY29udGV4dC5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydEFwaUV4ZWN1dGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL3JlcG9ydC1hcGktZXhlY3V0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgZXh0cmFjdExvb2t1cE9wdGlvbkl0ZW0sIGV4dHJhY3RSb3dBcnJheSB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvZGF0YS1ub3JtYWxpemF0aW9uLnV0aWwnO1xuXG5pbnRlcmZhY2UgQ2FjaGVFbnRyeSB7XG4gIGV4cGlyZXNBdDogbnVtYmVyO1xuICBkYXRhOiBMb29rdXBPcHRpb25JdGVtW107XG59XG5cbi8qKlxuICogQnVpbHQtaW4gSFRUUCBhZGFwdGVyIGZvciBmZXRjaGluZyBkcm9wZG93biBvcHRpb25zIGZyb20gYmFja2VuZCBkYXRhYmFzZSB0YWJsZXMsIFNQcywgYW5kIFJFU1QgQVBJcy5cbiAqIEluY2x1ZGVzIGluLW1lbW9yeSBjYWNoaW5nIHdpdGggVFRMLCBpbi1mbGlnaHQgcmVxdWVzdCBkZWR1cGxpY2F0aW9uLCBhbmQgZXhwbGljaXQgcmVxdWVzdCBlcnJvcnMuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBIdHRwUmVwb3J0TG9va3VwQWRhcHRlciBleHRlbmRzIFJlcG9ydExvb2t1cEFkYXB0ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWcgPSBpbmplY3QoUkVQT1JUSU5HX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uU2VydmljZSA9IGluamVjdChSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpRXhlY3V0aW9uU2VydmljZSA9IGluamVjdChSZXBvcnRBcGlFeGVjdXRpb25TZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVFbnRyeT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbkZsaWdodCA9IG5ldyBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPExvb2t1cE9wdGlvbkl0ZW1bXT4+KCk7XG5cblxuICBmZXRjaE9wdGlvbnMocmVxdWVzdDogTG9va3VwUXVlcnlSZXF1ZXN0KTogT2JzZXJ2YWJsZTxMb29rdXBPcHRpb25JdGVtW10+IHtcbiAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2VuZXJhdGVDYWNoZUtleShyZXF1ZXN0KTtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChjYWNoZWQgJiYgY2FjaGVkLmV4cGlyZXNBdCA+IG5vdykge1xuICAgICAgcmV0dXJuIG9mKGNhY2hlZC5kYXRhKTtcbiAgICB9XG5cbiAgICBjb25zdCBydW5uaW5nID0gdGhpcy5pbkZsaWdodC5nZXQoY2FjaGVLZXkpO1xuICAgIGlmIChydW5uaW5nKSB7XG4gICAgICByZXR1cm4gcnVubmluZztcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgQVBJLWJhc2VkIGRyb3Bkb3duIGxvb2t1cHNcbiAgICBpZiAoKHJlcXVlc3Quc291cmNlVHlwZSA9PT0gJ2FwaScgfHwgcmVxdWVzdC5hcGlFbmRwb2ludCkgJiYgdGhpcy5hcGlFeGVjdXRpb25TZXJ2aWNlKSB7XG4gICAgICBjb25zdCBlbmRwb2ludFVybCA9IHJlcXVlc3QuYXBpRW5kcG9pbnQgfHwgcmVxdWVzdC5lbnRpdHlOYW1lIHx8ICcnO1xuICAgICAgY29uc3Qgb2JzJCA9IHRoaXMuYXBpRXhlY3V0aW9uU2VydmljZVxuICAgICAgICAuZXhlY3V0ZUFwaShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbmRwb2ludDogZW5kcG9pbnRVcmwsXG4gICAgICAgICAgICBkYXRhUGF0aDogcmVxdWVzdC5kYXRhUGF0aCxcbiAgICAgICAgICAgIHVzZVByb3h5OiByZXF1ZXN0LnVzZVByb3h5LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWVzdC5wYXJhbWV0ZXJzIGFzIGFueSxcbiAgICAgICAgICByZXF1ZXN0LmZpbHRlciBhcyBhbnlcbiAgICAgICAgKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoKGl0ZW1zKSA9PlxuICAgICAgICAgICAgaXRlbXMubWFwKChyOiBhbnkpID0+XG4gICAgICAgICAgICAgIGV4dHJhY3RMb29rdXBPcHRpb25JdGVtKHIsIHJlcXVlc3QudmFsdWVGaWVsZCwgcmVxdWVzdC5kaXNwbGF5RmllbGQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0YXAoKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID4gMCkgdGhpcy5zZXRDYWNoZShjYWNoZUtleSwgaXRlbXMsIDYwMCk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCAnQVBJIGxvb2t1cCByZXF1ZXN0IGZhaWxlZCc7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoQXJyYXkuaXNBcnJheShtc2cpID8gbXNnLmpvaW4oJywgJykgOiBtc2cpKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmluRmxpZ2h0LmRlbGV0ZShjYWNoZUtleSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KVxuICAgICAgICApO1xuXG4gICAgICB0aGlzLmluRmxpZ2h0LnNldChjYWNoZUtleSwgb2JzJCk7XG4gICAgICByZXR1cm4gb2JzJDtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5jb25maWc/LmFwaUJhc2VVcmw7XG4gICAgaWYgKGJhc2VVcmwgJiYgdGhpcy5odHRwKSB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9uU2VydmljZT8uc2Vzc2lvbkNvbnRleHQoKSA/PyB7fTtcbiAgICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgICBpZiAoc2Vzc2lvblsnY29tcGFueUlkJ10gIT09IHVuZGVmaW5lZCAmJiBzZXNzaW9uWydjb21wYW55SWQnXSAhPT0gbnVsbCkge1xuICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ1gtQ29tcGFueS1JZCcsIFN0cmluZyhzZXNzaW9uWydjb21wYW55SWQnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKHNlc3Npb25bJ2JyYW5jaElkJ10gIT09IHVuZGVmaW5lZCAmJiBzZXNzaW9uWydicmFuY2hJZCddICE9PSBudWxsKSB7XG4gICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnWC1CcmFuY2gtSWQnLCBTdHJpbmcoc2Vzc2lvblsnYnJhbmNoSWQnXSkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvYnMkID0gdGhpcy5odHRwLnBvc3Q8dW5rbm93bj4oYCR7YmFzZVVybH0vbG9va3VwYCwgcmVxdWVzdCwgeyBoZWFkZXJzIH0pLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBjb25zdCByYXdJdGVtcyA9IGV4dHJhY3RSb3dBcnJheShyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuIHJhd0l0ZW1zLm1hcCgocjogYW55KSA9PlxuICAgICAgICAgICAgZXh0cmFjdExvb2t1cE9wdGlvbkl0ZW0ociwgcmVxdWVzdC52YWx1ZUZpZWxkLCByZXF1ZXN0LmRpc3BsYXlGaWVsZClcbiAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFwKChpdGVtcykgPT4ge1xuICAgICAgICAgIC8vIE5ldmVyIGNhY2hlIGVtcHR5IHJlc3VsdHM6IHBhcmFtZXRlcnMgbWF5IHNpbXBseSBub3QgaGF2ZSBiZWVuIGZpbGxlZCB5ZXQuXG4gICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHRoaXMuc2V0Q2FjaGUoY2FjaGVLZXksIGl0ZW1zLCA2MDApO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgJ0xvb2t1cCByZXF1ZXN0IGZhaWxlZCc7XG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKEFycmF5LmlzQXJyYXkobXNnKSA/IG1zZy5qb2luKCcsICcpIDogbXNnKSk7XG4gICAgICAgIH0pLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbkZsaWdodC5kZWxldGUoY2FjaGVLZXkpO1xuICAgICAgICB9KSxcbiAgICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KVxuICAgICAgKTtcblxuICAgICAgdGhpcy5pbkZsaWdodC5zZXQoY2FjaGVLZXksIG9icyQpO1xuICAgICAgcmV0dXJuIG9icyQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdbYndheXMtcmVwb3J0XSBMb29rdXAgcmVxdWlyZXMgSHR0cENsaWVudCBhbmQgYXBpQmFzZVVybC4nKSk7XG4gIH1cblxuICBwcml2YXRlIHNldENhY2hlKGtleTogc3RyaW5nLCBkYXRhOiBMb29rdXBPcHRpb25JdGVtW10sIHR0bFNlY29uZHMgPSA2MDApOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlLnNldChrZXksIHtcbiAgICAgIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIHR0bFNlY29uZHMgKiAxMDAwLFxuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVDYWNoZUtleShyZXE6IExvb2t1cFF1ZXJ5UmVxdWVzdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuc2Vzc2lvblNlcnZpY2U/LmdldEN1cnJlbnRTZXNzaW9uQ29udGV4dCgpID8/IHt9KSArICc6JyArIGAke3JlcS5zb3VyY2VUeXBlfToke3JlcS5lbnRpdHlOYW1lIHx8IHJlcS5hcGlFbmRwb2ludH06JHtyZXEudmFsdWVGaWVsZH06JHtyZXEuZGlzcGxheUZpZWxkfToke3JlcS5kYXRhUGF0aCA/PyAnJ306JHtyZXEuc2NoZW1hID8/ICdkYm8nfToke3JlcS5saW1pdCA/PyA1MDB9OiR7SlNPTi5zdHJpbmdpZnkocmVxLmZpbHRlciA/PyB7fSl9OiR7SlNPTi5zdHJpbmdpZnkocmVxLnBhcmFtZXRlcnMgPz8ge30pfWA7XG4gIH1cblxuXG59XG5cbi8qKiBDb252ZW5pZW5jZSBhbGlhcyAqL1xuZXhwb3J0IGNvbnN0IEh0dHBMb29rdXBBZGFwdGVyID0gSHR0cFJlcG9ydExvb2t1cEFkYXB0ZXI7XG4iXX0=
@@ -1,217 +1,66 @@
1
+ import { reportIdAvailability, reportIdInspection } from './report-id-availability';
2
+ import { ReportSessionContextService } from '../../core/services/report-session-context.service';
3
+ import { reportSessionHeaders } from './session-headers';
1
4
  import { inject, Injectable } from '@angular/core';
2
5
  import { HttpClient } from '@angular/common/http';
3
- import { of } from 'rxjs';
6
+ import { throwError } from 'rxjs';
4
7
  import { catchError } from 'rxjs/operators';
5
8
  import { ReportPersistenceAdapter } from '../contracts/report-persistence.contract';
6
9
  import { REPORTING_CONFIG } from '../../core/tokens/reporting-config.token';
7
10
  import * as i0 from "@angular/core";
8
- /**
9
- * Built-in HTTP adapter for report definitions persistence.
10
- * Connects to NestJS `/api/reporting/reports` endpoints.
11
- * Includes in-memory mock fallback when the remote backend is unreachable.
12
- */
11
+ /** HTTP-only persistence. Use withLocalStorage() explicitly for offline demos. */
13
12
  export class HttpReportPersistenceAdapter extends ReportPersistenceAdapter {
13
+ session = inject(ReportSessionContextService, { optional: true });
14
+ get headers() { return reportSessionHeaders(this.session?.getCurrentSessionContext() ?? {}); }
14
15
  http = inject(HttpClient, { optional: true });
15
16
  config = inject(REPORTING_CONFIG, { optional: true });
16
- mockStore = new Map();
17
- constructor() {
18
- super();
19
- this.seedDefaultMockReports();
17
+ checkId(reportId) {
18
+ if (!this.http || !this.config?.apiBaseUrl)
19
+ return throwError(() => new Error('HTTP report storage is not configured.'));
20
+ const url = this.config.apiBaseUrl.replace(/\/+$/, '') + '/reports/' + encodeURIComponent(reportId) + '/availability';
21
+ return reportIdAvailability(this.http, url, this.headers, () => super.checkId(reportId));
20
22
  }
21
- load(reportId) {
22
- const baseUrl = this.config?.apiBaseUrl;
23
- if (baseUrl && this.http) {
24
- return this.http
25
- .get(`${baseUrl}/reports/${encodeURIComponent(reportId)}`)
26
- .pipe(catchError((err) => {
27
- console.warn(`[HttpReportPersistenceAdapter] Failed to load remote report ${reportId}:`, err);
28
- return of(this.getMockReport(reportId));
29
- }));
30
- }
31
- return of(this.getMockReport(reportId));
23
+ inspectId(reportId) {
24
+ if (!this.http || !this.config?.apiBaseUrl)
25
+ return throwError(() => new Error('HTTP report storage is not configured.'));
26
+ const url = this.config.apiBaseUrl.replace(/\/+$/, '') + '/reports/' + encodeURIComponent(reportId) + '/availability';
27
+ return reportIdInspection(this.http, url, this.headers, () => super.inspectId(reportId));
32
28
  }
33
- save(report) {
34
- const baseUrl = this.config?.apiBaseUrl;
35
- if (baseUrl && this.http) {
36
- const payload = {
37
- id: report.id,
38
- name: report.name,
39
- description: report.description,
40
- category: report.category,
41
- version: report.version,
42
- isPublished: report.isPublished ?? false,
43
- definition: report,
44
- };
45
- return this.http
46
- .post(`${baseUrl}/reports`, payload)
47
- .pipe(catchError((err) => {
48
- console.warn('[HttpReportPersistenceAdapter] Failed to save remote report, storing in mock:', err);
49
- this.mockStore.set(report.id, { ...report, updatedAt: new Date().toISOString() });
50
- return of(report);
51
- }));
52
- }
53
- this.mockStore.set(report.id, { ...report, updatedAt: new Date().toISOString() });
54
- return of(report);
29
+ load(id) {
30
+ return this.request('GET', '/' + encodeURIComponent(id));
55
31
  }
56
- list() {
57
- const baseUrl = this.config?.apiBaseUrl;
58
- if (baseUrl && this.http) {
59
- return this.http.get(`${baseUrl}/reports`).pipe(catchError((err) => {
60
- console.warn('[HttpReportPersistenceAdapter] Failed to list remote reports, returning mock list:', err);
61
- return of(this.getMockSummaries());
62
- }));
63
- }
64
- return of(this.getMockSummaries());
32
+ save(report, options) {
33
+ return this.request('POST', '', {
34
+ id: report.id, name: report.name, description: report.description,
35
+ category: report.category, version: report.version,
36
+ isPublished: report.isPublished ?? false, definition: report,
37
+ ...(options?.createOnly ? { createOnly: true } : {}),
38
+ ...(options?.expectedVersion !== undefined ? { expectedVersion: options.expectedVersion } : {}),
39
+ });
65
40
  }
66
- delete(reportId) {
67
- const baseUrl = this.config?.apiBaseUrl;
68
- if (baseUrl && this.http) {
69
- return this.http
70
- .delete(`${baseUrl}/reports/${encodeURIComponent(reportId)}`)
71
- .pipe(catchError((err) => {
72
- console.warn(`[HttpReportPersistenceAdapter] Failed to delete remote report ${reportId}:`, err);
73
- this.mockStore.delete(reportId);
74
- return of(undefined);
75
- }));
76
- }
77
- this.mockStore.delete(reportId);
78
- return of(undefined);
41
+ list() {
42
+ return this.request('GET', '');
79
43
  }
80
- publish(reportId, version) {
81
- const baseUrl = this.config?.apiBaseUrl;
82
- if (baseUrl && this.http) {
83
- return this.http
84
- .post(`${baseUrl}/reports/${encodeURIComponent(reportId)}/publish`, { version })
85
- .pipe(catchError((err) => {
86
- console.warn(`[HttpReportPersistenceAdapter] Failed to publish remote report ${reportId}:`, err);
87
- const r = this.mockStore.get(reportId);
88
- if (r) {
89
- r.isPublished = true;
90
- r.version = version;
91
- }
92
- return of(undefined);
93
- }));
94
- }
95
- const r = this.mockStore.get(reportId);
96
- if (r) {
97
- r.isPublished = true;
98
- r.version = version;
99
- }
100
- return of(undefined);
44
+ delete(id) {
45
+ return this.request('DELETE', '/' + encodeURIComponent(id));
101
46
  }
102
- getMockReport(id) {
103
- const existing = this.mockStore.get(id);
104
- if (existing)
105
- return existing;
106
- const fallback = {
107
- id,
108
- name: 'Default Report',
109
- schemaVersion: 1,
110
- version: 1,
111
- isPublished: true,
112
- components: [],
113
- parameters: [],
114
- dataSources: [],
115
- layout: {
116
- columns: 12,
117
- gap: 16,
118
- padding: 16,
119
- },
120
- };
121
- this.mockStore.set(id, fallback);
122
- return fallback;
47
+ publish(id, version) {
48
+ return this.request('POST', '/' + encodeURIComponent(id) + '/publish', { version });
123
49
  }
124
- getMockSummaries() {
125
- return Array.from(this.mockStore.values()).map((r) => ({
126
- id: r.id,
127
- name: r.name,
128
- description: r.description,
129
- category: r.category,
130
- version: r.version,
131
- isPublished: Boolean(r.isPublished),
132
- updatedAt: r.updatedAt,
50
+ request(method, path, body) {
51
+ if (!this.http || !this.config?.apiBaseUrl) {
52
+ return throwError(() => new Error('[bways-report] HTTP persistence requires HttpClient and apiBaseUrl. Use withLocalStorage() for offline storage.'));
53
+ }
54
+ return this.http.request(method, this.config.apiBaseUrl.replace(/\/+$/, '') + '/reports' + path, { body, headers: this.headers }).pipe(catchError(err => {
55
+ const message = err?.error?.message || err?.message || 'Report persistence failed';
56
+ return throwError(() => new Error(Array.isArray(message) ? message.join(', ') : message));
133
57
  }));
134
58
  }
135
- seedDefaultMockReports() {
136
- const seed = {
137
- id: 'sales-summary',
138
- name: 'Sales Register & Analysis',
139
- description: 'Comprehensive sales performance and invoice tracking',
140
- category: 'Sales',
141
- schemaVersion: 1,
142
- version: 1,
143
- isPublished: true,
144
- parameters: [],
145
- dataSources: [
146
- {
147
- id: 'ds-sales',
148
- name: 'Sales Register SP',
149
- endpoint: 'usp_GetSalesRegister',
150
- method: 'STORED_PROCEDURE',
151
- },
152
- ],
153
- components: [
154
- {
155
- id: 'cmp-from-date',
156
- key: 'fromDate',
157
- type: 'date',
158
- properties: { label: 'From Date', placeholder: 'dd/MM/yyyy' },
159
- validation: {},
160
- },
161
- {
162
- id: 'cmp-to-date',
163
- key: 'toDate',
164
- type: 'date',
165
- properties: { label: 'To Date', placeholder: 'dd/MM/yyyy' },
166
- validation: {},
167
- },
168
- {
169
- id: 'cmp-customer',
170
- key: 'customerId',
171
- type: 'dropdown',
172
- properties: {
173
- label: 'Customer',
174
- sourceType: 'table',
175
- entityName: 'Customers',
176
- valueField: 'customerId',
177
- displayField: 'customerName',
178
- },
179
- validation: {},
180
- },
181
- {
182
- id: 'cmp-grid',
183
- key: 'salesGrid',
184
- type: 'grid',
185
- properties: {
186
- dataSourceId: 'ds-sales',
187
- pageSize: 25,
188
- enableSorting: true,
189
- enableFiltering: true,
190
- columns: [
191
- { field: 'invoiceNo', headerText: 'Invoice #' },
192
- { field: 'date', headerText: 'Date' },
193
- { field: 'customer', headerText: 'Customer' },
194
- { field: 'amount', headerText: 'Amount', format: 'currency' },
195
- { field: 'status', headerText: 'Status' },
196
- ],
197
- },
198
- validation: {},
199
- },
200
- ],
201
- layout: {
202
- columns: 12,
203
- gap: 16,
204
- padding: 16,
205
- },
206
- };
207
- this.mockStore.set(seed.id, seed);
208
- }
209
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HttpReportPersistenceAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
59
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HttpReportPersistenceAdapter, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
210
60
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HttpReportPersistenceAdapter });
211
61
  }
212
62
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HttpReportPersistenceAdapter, decorators: [{
213
63
  type: Injectable
214
- }], ctorParameters: () => [] });
215
- /** Convenience alias */
64
+ }] });
216
65
  export const HttpPersistenceAdapter = HttpReportPersistenceAdapter;
217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1wZXJzaXN0ZW5jZS5hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZGF0YS1hY2Nlc3MvYWRhcHRlcnMvaHR0cC1wZXJzaXN0ZW5jZS5hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUs1QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7QUFHNUU7Ozs7R0FJRztBQUVILE1BQU0sT0FBTyw0QkFBNkIsU0FBUSx3QkFBd0I7SUFDdkQsSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5QyxNQUFNLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFdEQsU0FBUyxHQUFHLElBQUksR0FBRyxFQUE0QixDQUFDO0lBRWpFO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQWdCO1FBQ25CLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDO1FBQ3hDLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6QixPQUFPLElBQUks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LE9BQU8sRUFBRSxFQUFFO2FBQ1o7U0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO3dHQXpOVSw0QkFBNEI7NEdBQTVCLDRCQUE0Qjs7NEZBQTVCLDRCQUE0QjtrQkFEeEMsVUFBVTs7QUE2Tlgsd0JBQXdCO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLDRCQUE0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBSZXBvcnREZWZpbml0aW9uLFxuICBSZXBvcnRTdW1tYXJ5LFxufSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIgfSBmcm9tICcuLi9jb250cmFjdHMvcmVwb3J0LXBlcnNpc3RlbmNlLmNvbnRyYWN0JztcbmltcG9ydCB7IFJFUE9SVElOR19DT05GSUcgfSBmcm9tICcuLi8uLi9jb3JlL3Rva2Vucy9yZXBvcnRpbmctY29uZmlnLnRva2VuJztcbmltcG9ydCB7IFNhdmVSZXBvcnRSZXF1ZXN0RHRvIH0gZnJvbSAnLi4vY29udHJhY3RzL2FwaS1kdG9zJztcblxuLyoqXG4gKiBCdWlsdC1pbiBIVFRQIGFkYXB0ZXIgZm9yIHJlcG9ydCBkZWZpbml0aW9ucyBwZXJzaXN0ZW5jZS5cbiAqIENvbm5lY3RzIHRvIE5lc3RKUyBgL2FwaS9yZXBvcnRpbmcvcmVwb3J0c2AgZW5kcG9pbnRzLlxuICogSW5jbHVkZXMgaW4tbWVtb3J5IG1vY2sgZmFsbGJhY2sgd2hlbiB0aGUgcmVtb3RlIGJhY2tlbmQgaXMgdW5yZWFjaGFibGUuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBIdHRwUmVwb3J0UGVyc2lzdGVuY2VBZGFwdGVyIGV4dGVuZHMgUmVwb3J0UGVyc2lzdGVuY2VBZGFwdGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnID0gaW5qZWN0KFJFUE9SVElOR19DT05GSUcsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtb2NrU3RvcmUgPSBuZXcgTWFwPHN0cmluZywgUmVwb3J0RGVmaW5pdGlvbj4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2VlZERlZmF1bHRNb2NrUmVwb3J0cygpO1xuICB9XG5cbiAgbG9hZChyZXBvcnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxSZXBvcnREZWZpbml0aW9uPiB7XG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMuY29uZmlnPy5hcGlCYXNlVXJsO1xuICAgIGlmIChiYXNlVXJsICYmIHRoaXMuaHR0cCkge1xuICAgICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgICAuZ2V0PFJlcG9ydERlZmluaXRpb24+KGAke2Jhc2VVcmx9L3JlcG9ydHMvJHtlbmNvZGVVUklDb21wb25lbnQocmVwb3J0SWQpfWApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbSHR0cFJlcG9ydFBlcnNpc3RlbmNlQWRhcHRlcl0gRmFpbGVkIHRvIGxvYWQgcmVtb3RlIHJlcG9ydCAke3JlcG9ydElkfTpgLCBlcnIpO1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRoaXMuZ2V0TW9ja1JlcG9ydChyZXBvcnRJZCkpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvZih0aGlzLmdldE1vY2tSZXBvcnQocmVwb3J0SWQpKTtcbiAgfVxuXG4gIHNhdmUocmVwb3J0OiBSZXBvcnREZWZpbml0aW9uKTogT2JzZXJ2YWJsZTxSZXBvcnREZWZpbml0aW9uPiB7XG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMuY29uZmlnPy5hcGlCYXNlVXJsO1xuICAgIGlmIChiYXNlVXJsICYmIHRoaXMuaHR0cCkge1xuICAgICAgY29uc3QgcGF5bG9hZDogU2F2ZVJlcG9ydFJlcXVlc3REdG8gPSB7XG4gICAgICAgIGlkOiByZXBvcnQuaWQsXG4gICAgICAgIG5hbWU6IHJlcG9ydC5uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogcmVwb3J0LmRlc2NyaXB0aW9uLFxuICAgICAgICBjYXRlZ29yeTogcmVwb3J0LmNhdGVnb3J5LFxuICAgICAgICB2ZXJzaW9uOiByZXBvcnQudmVyc2lvbixcbiAgICAgICAgaXNQdWJsaXNoZWQ6IHJlcG9ydC5pc1B1Ymxpc2hlZCA/PyBmYWxzZSxcbiAgICAgICAgZGVmaW5pdGlvbjogcmVwb3J0LFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgICAucG9zdDxSZXBvcnREZWZpbml0aW9uPihgJHtiYXNlVXJsfS9yZXBvcnRzYCwgcGF5bG9hZClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tIdHRwUmVwb3J0UGVyc2lzdGVuY2VBZGFwdGVyXSBGYWlsZWQgdG8gc2F2ZSByZW1vdGUgcmVwb3J0LCBzdG9yaW5nIGluIG1vY2s6JywgZXJyKTtcbiAgICAgICAgICAgIHRoaXMubW9ja1N0b3JlLnNldChyZXBvcnQuaWQsIHsgLi4ucmVwb3J0LCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KTtcbiAgICAgICAgICAgIHJldHVybiBvZihyZXBvcnQpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5tb2NrU3RvcmUuc2V0KHJlcG9ydC5pZCwgeyAuLi5yZXBvcnQsIHVwZGF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pO1xuICAgIHJldHVybiBvZihyZXBvcnQpO1xuICB9XG5cbiAgbGlzdCgpOiBPYnNlcnZhYmxlPFJlcG9ydFN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmNvbmZpZz8uYXBpQmFzZVVybDtcbiAgICBpZiAoYmFzZVVybCAmJiB0aGlzLmh0dHApIHtcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFJlcG9ydFN1bW1hcnlbXT4oYCR7YmFzZVVybH0vcmVwb3J0c2ApLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW0h0dHBSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXJdIEZhaWxlZCB0byBsaXN0IHJlbW90ZSByZXBvcnRzLCByZXR1cm5pbmcgbW9jayBsaXN0OicsIGVycik7XG4gICAgICAgICAgcmV0dXJuIG9mKHRoaXMuZ2V0TW9ja1N1bW1hcmllcygpKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvZih0aGlzLmdldE1vY2tTdW1tYXJpZXMoKSk7XG4gIH1cblxuICBkZWxldGUocmVwb3J0SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmNvbmZpZz8uYXBpQmFzZVVybDtcbiAgICBpZiAoYmFzZVVybCAmJiB0aGlzLmh0dHApIHtcbiAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgLmRlbGV0ZTx2b2lkPihgJHtiYXNlVXJsfS9yZXBvcnRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHJlcG9ydElkKX1gKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgW0h0dHBSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXJdIEZhaWxlZCB0byBkZWxldGUgcmVtb3RlIHJlcG9ydCAke3JlcG9ydElkfTpgLCBlcnIpO1xuICAgICAgICAgICAgdGhpcy5tb2NrU3RvcmUuZGVsZXRlKHJlcG9ydElkKTtcbiAgICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuICAgIHRoaXMubW9ja1N0b3JlLmRlbGV0ZShyZXBvcnRJZCk7XG4gICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gIH1cblxuICBwdWJsaXNoKHJlcG9ydElkOiBzdHJpbmcsIHZlcnNpb246IG51bWJlcik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmNvbmZpZz8uYXBpQmFzZVVybDtcbiAgICBpZiAoYmFzZVVybCAmJiB0aGlzLmh0dHApIHtcbiAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgLnBvc3Q8dm9pZD4oYCR7YmFzZVVybH0vcmVwb3J0cy8ke2VuY29kZVVSSUNvbXBvbmVudChyZXBvcnRJZCl9L3B1Ymxpc2hgLCB7IHZlcnNpb24gfSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtIdHRwUmVwb3J0UGVyc2lzdGVuY2VBZGFwdGVyXSBGYWlsZWQgdG8gcHVibGlzaCByZW1vdGUgcmVwb3J0ICR7cmVwb3J0SWR9OmAsIGVycik7XG4gICAgICAgICAgICBjb25zdCByID0gdGhpcy5tb2NrU3RvcmUuZ2V0KHJlcG9ydElkKTtcbiAgICAgICAgICAgIGlmIChyKSB7XG4gICAgICAgICAgICAgIHIuaXNQdWJsaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICByLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgciA9IHRoaXMubW9ja1N0b3JlLmdldChyZXBvcnRJZCk7XG4gICAgaWYgKHIpIHtcbiAgICAgIHIuaXNQdWJsaXNoZWQgPSB0cnVlO1xuICAgICAgci52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICB9XG4gICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcml2YXRlIGdldE1vY2tSZXBvcnQoaWQ6IHN0cmluZyk6IFJlcG9ydERlZmluaXRpb24ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5tb2NrU3RvcmUuZ2V0KGlkKTtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcblxuICAgIGNvbnN0IGZhbGxiYWNrOiBSZXBvcnREZWZpbml0aW9uID0ge1xuICAgICAgaWQsXG4gICAgICBuYW1lOiAnRGVmYXVsdCBSZXBvcnQnLFxuICAgICAgc2NoZW1hVmVyc2lvbjogMSxcbiAgICAgIHZlcnNpb246IDEsXG4gICAgICBpc1B1Ymxpc2hlZDogdHJ1ZSxcbiAgICAgIGNvbXBvbmVudHM6IFtdLFxuICAgICAgcGFyYW1ldGVyczogW10sXG4gICAgICBkYXRhU291cmNlczogW10sXG4gICAgICBsYXlvdXQ6IHtcbiAgICAgICAgY29sdW1uczogMTIsXG4gICAgICAgIGdhcDogMTYsXG4gICAgICAgIHBhZGRpbmc6IDE2LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMubW9ja1N0b3JlLnNldChpZCwgZmFsbGJhY2spO1xuICAgIHJldHVybiBmYWxsYmFjaztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TW9ja1N1bW1hcmllcygpOiBSZXBvcnRTdW1tYXJ5W10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubW9ja1N0b3JlLnZhbHVlcygpKS5tYXAoKHIpID0+ICh7XG4gICAgICBpZDogci5pZCxcbiAgICAgIG5hbWU6IHIubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiByLmRlc2NyaXB0aW9uLFxuICAgICAgY2F0ZWdvcnk6IHIuY2F0ZWdvcnksXG4gICAgICB2ZXJzaW9uOiByLnZlcnNpb24sXG4gICAgICBpc1B1Ymxpc2hlZDogQm9vbGVhbihyLmlzUHVibGlzaGVkKSxcbiAgICAgIHVwZGF0ZWRBdDogci51cGRhdGVkQXQsXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWVkRGVmYXVsdE1vY2tSZXBvcnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlZWQ6IFJlcG9ydERlZmluaXRpb24gPSB7XG4gICAgICBpZDogJ3NhbGVzLXN1bW1hcnknLFxuICAgICAgbmFtZTogJ1NhbGVzIFJlZ2lzdGVyICYgQW5hbHlzaXMnLFxuICAgICAgZGVzY3JpcHRpb246ICdDb21wcmVoZW5zaXZlIHNhbGVzIHBlcmZvcm1hbmNlIGFuZCBpbnZvaWNlIHRyYWNraW5nJyxcbiAgICAgIGNhdGVnb3J5OiAnU2FsZXMnLFxuICAgICAgc2NoZW1hVmVyc2lvbjogMSxcbiAgICAgIHZlcnNpb246IDEsXG4gICAgICBpc1B1Ymxpc2hlZDogdHJ1ZSxcbiAgICAgIHBhcmFtZXRlcnM6IFtdLFxuICAgICAgZGF0YVNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnZHMtc2FsZXMnLFxuICAgICAgICAgIG5hbWU6ICdTYWxlcyBSZWdpc3RlciBTUCcsXG4gICAgICAgICAgZW5kcG9pbnQ6ICd1c3BfR2V0U2FsZXNSZWdpc3RlcicsXG4gICAgICAgICAgbWV0aG9kOiAnU1RPUkVEX1BST0NFRFVSRScsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdjbXAtZnJvbS1kYXRlJyxcbiAgICAgICAgICBrZXk6ICdmcm9tRGF0ZScsXG4gICAgICAgICAgdHlwZTogJ2RhdGUnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHsgbGFiZWw6ICdGcm9tIERhdGUnLCBwbGFjZWhvbGRlcjogJ2RkL01NL3l5eXknIH0sXG4gICAgICAgICAgdmFsaWRhdGlvbjoge30sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ2NtcC10by1kYXRlJyxcbiAgICAgICAgICBrZXk6ICd0b0RhdGUnLFxuICAgICAgICAgIHR5cGU6ICdkYXRlJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7IGxhYmVsOiAnVG8gRGF0ZScsIHBsYWNlaG9sZGVyOiAnZGQvTU0veXl5eScgfSxcbiAgICAgICAgICB2YWxpZGF0aW9uOiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnY21wLWN1c3RvbWVyJyxcbiAgICAgICAgICBrZXk6ICdjdXN0b21lcklkJyxcbiAgICAgICAgICB0eXBlOiAnZHJvcGRvd24nLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnQ3VzdG9tZXInLFxuICAgICAgICAgICAgc291cmNlVHlwZTogJ3RhYmxlJyxcbiAgICAgICAgICAgIGVudGl0eU5hbWU6ICdDdXN0b21lcnMnLFxuICAgICAgICAgICAgdmFsdWVGaWVsZDogJ2N1c3RvbWVySWQnLFxuICAgICAgICAgICAgZGlzcGxheUZpZWxkOiAnY3VzdG9tZXJOYW1lJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZhbGlkYXRpb246IHt9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdjbXAtZ3JpZCcsXG4gICAgICAgICAga2V5OiAnc2FsZXNHcmlkJyxcbiAgICAgICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgZGF0YVNvdXJjZUlkOiAnZHMtc2FsZXMnLFxuICAgICAgICAgICAgcGFnZVNpemU6IDI1LFxuICAgICAgICAgICAgZW5hYmxlU29ydGluZzogdHJ1ZSxcbiAgICAgICAgICAgIGVuYWJsZUZpbHRlcmluZzogdHJ1ZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgICAgeyBmaWVsZDogJ2ludm9pY2VObycsIGhlYWRlclRleHQ6ICdJbnZvaWNlICMnIH0sXG4gICAgICAgICAgICAgIHsgZmllbGQ6ICdkYXRlJywgaGVhZGVyVGV4dDogJ0RhdGUnIH0sXG4gICAgICAgICAgICAgIHsgZmllbGQ6ICdjdXN0b21lcicsIGhlYWRlclRleHQ6ICdDdXN0b21lcicgfSxcbiAgICAgICAgICAgICAgeyBmaWVsZDogJ2Ftb3VudCcsIGhlYWRlclRleHQ6ICdBbW91bnQnLCBmb3JtYXQ6ICdjdXJyZW5jeScgfSxcbiAgICAgICAgICAgICAgeyBmaWVsZDogJ3N0YXR1cycsIGhlYWRlclRleHQ6ICdTdGF0dXMnIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmFsaWRhdGlvbjoge30sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgbGF5b3V0OiB7XG4gICAgICAgIGNvbHVtbnM6IDEyLFxuICAgICAgICBnYXA6IDE2LFxuICAgICAgICBwYWRkaW5nOiAxNixcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1vY2tTdG9yZS5zZXQoc2VlZC5pZCwgc2VlZCk7XG4gIH1cbn1cblxuLyoqIENvbnZlbmllbmNlIGFsaWFzICovXG5leHBvcnQgY29uc3QgSHR0cFBlcnNpc3RlbmNlQWRhcHRlciA9IEh0dHBSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXI7XG4iXX0=
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1wZXJzaXN0ZW5jZS5hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZGF0YS1hY2Nlc3MvYWRhcHRlcnMvaHR0cC1wZXJzaXN0ZW5jZS5hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1QyxPQUFPLEVBQUUsd0JBQXdCLEVBQXFDLE1BQU0sMENBQTBDLENBQUM7QUFDdkgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMENBQTBDLENBQUM7O0FBRTVFLGtGQUFrRjtBQUVsRixNQUFNLE9BQU8sNEJBQTZCLFNBQVEsd0JBQXdCO0lBQ3ZELE9BQU8sR0FBRyxNQUFNLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNuRixJQUFZLE9BQU8sS0FBSyxPQUFPLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckYsSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENB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LE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLDRCQUE0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVwb3J0SWRBdmFpbGFiaWxpdHksIHJlcG9ydElkSW5zcGVjdGlvbiB9IGZyb20gJy4vcmVwb3J0LWlkLWF2YWlsYWJpbGl0eSc7XG5pbXBvcnQgeyBSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL3JlcG9ydC1zZXNzaW9uLWNvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyByZXBvcnRTZXNzaW9uSGVhZGVycyB9IGZyb20gJy4vc2Vzc2lvbi1oZWFkZXJzJztcbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBSZXBvcnREZWZpbml0aW9uLCBSZXBvcnRTdW1tYXJ5IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWRlZmluaXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0UGVyc2lzdGVuY2VBZGFwdGVyLCBSZXBvcnRTYXZlT3B0aW9ucywgUmVwb3J0SWRTdGF0dXMgfSBmcm9tICcuLi9jb250cmFjdHMvcmVwb3J0LXBlcnNpc3RlbmNlLmNvbnRyYWN0JztcbmltcG9ydCB7IFJFUE9SVElOR19DT05GSUcgfSBmcm9tICcuLi8uLi9jb3JlL3Rva2Vucy9yZXBvcnRpbmctY29uZmlnLnRva2VuJztcblxuLyoqIEhUVFAtb25seSBwZXJzaXN0ZW5jZS4gVXNlIHdpdGhMb2NhbFN0b3JhZ2UoKSBleHBsaWNpdGx5IGZvciBvZmZsaW5lIGRlbW9zLiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEh0dHBSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIgZXh0ZW5kcyBSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb24gPSBpbmplY3QoUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIGdldCBoZWFkZXJzKCkgeyByZXR1cm4gcmVwb3J0U2Vzc2lvbkhlYWRlcnModGhpcy5zZXNzaW9uPy5nZXRDdXJyZW50U2Vzc2lvbkNvbnRleHQoKSA/PyB7fSk7IH1cbiAgcHJpdmF0ZSByZWFkb25seSBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnID0gaW5qZWN0KFJFUE9SVElOR19DT05GSUcsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgb3ZlcnJpZGUgY2hlY2tJZChyZXBvcnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLmh0dHAgfHwgIXRoaXMuY29uZmlnPy5hcGlCYXNlVXJsKSByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ0hUVFAgcmVwb3J0IHN0b3JhZ2UgaXMgbm90IGNvbmZpZ3VyZWQuJykpO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnLmFwaUJhc2VVcmwucmVwbGFjZSgvXFwvKyQvLCAnJykgKyAnL3JlcG9ydHMvJyArIGVuY29kZVVSSUNvbXBvbmVudChyZXBvcnRJZCkgKyAnL2F2YWlsYWJpbGl0eSc7XG4gICAgcmV0dXJuIHJlcG9ydElkQXZhaWxhYmlsaXR5KHRoaXMuaHR0cCwgdXJsLCB0aGlzLmhlYWRlcnMsICgpID0+IHN1cGVyLmNoZWNrSWQocmVwb3J0SWQpKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGluc3BlY3RJZChyZXBvcnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxSZXBvcnRJZFN0YXR1cz4ge1xuICAgIGlmICghdGhpcy5odHRwIHx8ICF0aGlzLmNvbmZpZz8uYXBpQmFzZVVybCkgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdIVFRQIHJlcG9ydCBzdG9yYWdlIGlzIG5vdCBjb25maWd1cmVkLicpKTtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmNvbmZpZy5hcGlCYXNlVXJsLnJlcGxhY2UoL1xcLyskLywgJycpICsgJy9yZXBvcnRzLycgKyBlbmNvZGVVUklDb21wb25lbnQocmVwb3J0SWQpICsgJy9hdmFpbGFiaWxpdHknO1xuICAgIHJldHVybiByZXBvcnRJZEluc3BlY3Rpb24odGhpcy5odHRwLCB1cmwsIHRoaXMuaGVhZGVycywgKCkgPT4gc3VwZXIuaW5zcGVjdElkKHJlcG9ydElkKSk7XG4gIH1cblxuICBsb2FkKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFJlcG9ydERlZmluaXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdHRVQnLCAnLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpKTtcbiAgfVxuXG4gIHNhdmUocmVwb3J0OiBSZXBvcnREZWZpbml0aW9uLCBvcHRpb25zPzogUmVwb3J0U2F2ZU9wdGlvbnMpOiBPYnNlcnZhYmxlPFJlcG9ydERlZmluaXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQT1NUJywgJycsIHtcbiAgICAgIGlkOiByZXBvcnQuaWQsIG5hbWU6IHJlcG9ydC5uYW1lLCBkZXNjcmlwdGlvbjogcmVwb3J0LmRlc2NyaXB0aW9uLFxuICAgICAgY2F0ZWdvcnk6IHJlcG9ydC5jYXRlZ29yeSwgdmVyc2lvbjogcmVwb3J0LnZlcnNpb24sXG4gICAgICBpc1B1Ymxpc2hlZDogcmVwb3J0LmlzUHVibGlzaGVkID8/IGZhbHNlLCBkZWZpbml0aW9uOiByZXBvcnQsXG4gICAgICAuLi4ob3B0aW9ucz8uY3JlYXRlT25seSA/IHsgY3JlYXRlT25seTogdHJ1ZSB9IDoge30pLFxuICAgICAgLi4uKG9wdGlvbnM/LmV4cGVjdGVkVmVyc2lvbiAhPT0gdW5kZWZpbmVkID8geyBleHBlY3RlZFZlcnNpb246IG9wdGlvbnMuZXhwZWN0ZWRWZXJzaW9uIH0gOiB7fSksXG4gICAgfSk7XG4gIH1cblxuICBsaXN0KCk6IE9ic2VydmFibGU8UmVwb3J0U3VtbWFyeVtdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnR0VUJywgJycpO1xuICB9XG5cbiAgZGVsZXRlKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdERUxFVEUnLCAnLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpKTtcbiAgfVxuXG4gIHB1Ymxpc2goaWQ6IHN0cmluZywgdmVyc2lvbjogbnVtYmVyKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUE9TVCcsICcvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCkgKyAnL3B1Ymxpc2gnLCB7IHZlcnNpb24gfSk7XG4gIH1cblxuICBwcml2YXRlIHJlcXVlc3Q8VD4obWV0aG9kOiBzdHJpbmcsIHBhdGg6IHN0cmluZywgYm9keT86IHVua25vd24pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBpZiAoIXRoaXMuaHR0cCB8fCAhdGhpcy5jb25maWc/LmFwaUJhc2VVcmwpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignW2J3YXlzLXJlcG9ydF0gSFRUUCBwZXJzaXN0ZW5jZSByZXF1aXJlcyBIdHRwQ2xpZW50IGFuZCBhcGlCYXNlVXJsLiBVc2Ugd2l0aExvY2FsU3RvcmFnZSgpIGZvciBvZmZsaW5lIHN0b3JhZ2UuJykpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3Q8VD4obWV0aG9kLCB0aGlzLmNvbmZpZy5hcGlCYXNlVXJsLnJlcGxhY2UoL1xcLyskLywgJycpICsgJy9yZXBvcnRzJyArIHBhdGgsIHsgYm9keSwgaGVhZGVyczogdGhpcy5oZWFkZXJzIH0pLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCAnUmVwb3J0IHBlcnNpc3RlbmNlIGZhaWxlZCc7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcihBcnJheS5pc0FycmF5KG1lc3NhZ2UpID8gbWVzc2FnZS5qb2luKCcsICcpIDogbWVzc2FnZSkpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBIdHRwUGVyc2lzdGVuY2VBZGFwdGVyID0gSHR0cFJlcG9ydFBlcnNpc3RlbmNlQWRhcHRlcjtcbiJdfQ==