bways-report 0.1.4 → 0.1.6

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 (42) hide show
  1. package/README.md +75 -35
  2. package/esm2022/lib/core/services/index.mjs +3 -1
  3. package/esm2022/lib/core/services/report-data-discovery.service.mjs +135 -0
  4. package/esm2022/lib/core/services/report-storage.service.mjs +63 -0
  5. package/esm2022/lib/core/tokens/index.mjs +2 -1
  6. package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
  7. package/esm2022/lib/core/tokens/storage.token.mjs +128 -0
  8. package/esm2022/lib/core/utils/identifier-humanizer.mjs +15 -4
  9. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +17 -8
  10. package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +16 -44
  11. package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +3 -371
  12. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +69 -1023
  13. package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +345 -213
  14. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +39 -32
  15. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +35 -679
  16. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +97 -949
  17. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +112 -585
  18. package/esm2022/lib/features/designer/designer.component.mjs +3 -3
  19. package/esm2022/lib/features/designer/services/designer-state.service.mjs +62 -2
  20. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +115 -19
  21. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +31 -423
  22. package/esm2022/lib/provide-reporting.mjs +20 -5
  23. package/fesm2022/bways-report.mjs +2263 -5342
  24. package/fesm2022/bways-report.mjs.map +1 -1
  25. package/lib/core/services/index.d.ts +2 -0
  26. package/lib/core/services/report-data-discovery.service.d.ts +38 -0
  27. package/lib/core/services/report-storage.service.d.ts +26 -0
  28. package/lib/core/tokens/index.d.ts +2 -0
  29. package/lib/core/tokens/reporting-config.token.d.ts +2 -0
  30. package/lib/core/tokens/storage.token.d.ts +48 -0
  31. package/lib/data-access/adapters/http-lookup.adapter.d.ts +2 -1
  32. package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +1 -0
  33. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +5 -1
  34. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +5 -0
  35. package/lib/features/designer/components/property-editor/property-editor-action.component.d.ts +3 -0
  36. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +31 -1
  37. package/lib/features/designer/components/property-editor/property-editor.component.d.ts +19 -0
  38. package/lib/features/designer/services/designer-state.service.d.ts +12 -1
  39. package/lib/features/runtime/report-grid-bridge.component.d.ts +8 -58
  40. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +3 -0
  41. package/lib/provide-reporting.d.ts +6 -0
  42. package/package.json +9 -1
package/README.md CHANGED
@@ -7,6 +7,7 @@ It allows non-developers to visually design reporting pages with filters, KPI me
7
7
  ---
8
8
  [![npm version](https://img.shields.io/npm/v/bways-report.svg)](https://www.npmjs.com/package/bways-report)
9
9
  [![license](https://img.shields.io/npm/l/bways-report.svg)](https://github.com/ccplProject/BWays-CustomeReport)
10
+ [![Changelog](https://img.shields.io/badge/Changelog-v0.1.6-blue.svg)](CHANGELOG.md)
10
11
  ---
11
12
 
12
13
  ## Table of Contents
@@ -25,6 +26,11 @@ It allows non-developers to visually design reporting pages with filters, KPI me
25
26
  5. [Routing & ERP Navigation Integration](#5-routing--erp-navigation-integration)
26
27
  6. [Drill-Down Drill-Through & Slide-Over Drawers](#6-drill-down--slide-over-drawers)
27
28
  7. [Starter Blueprints Gallery & Branded Exports](#7-starter-blueprints--branded-exports)
29
+ 8. [Grid Bridge & Circular Echo Suppression](#8-grid-bridge--circular-echo-suppression)
30
+ 9. [Stored Procedure Discovery & Smart Parameter Mapping](#9-stored-procedure-discovery--smart-parameter-mapping)
31
+ 10. [Theming & CSS Custom Properties](#10-theming--css-custom-properties)
32
+ 11. [Exporting Data (CSV & JSON)](#11-exporting-data-csv--json)
33
+ 12. [Changelog & Version History](#12-changelog--version-history)
28
34
 
29
35
  ---
30
36
 
@@ -456,7 +462,67 @@ If not provided, the built-in SVG visual chart renderer outputs crisp, responsiv
456
462
 
457
463
  ---
458
464
 
459
- ## 7. Theming & CSS Custom Properties
465
+ ## 8. Grid Bridge & Circular Echo Suppression
466
+
467
+ `bways-report` features an intelligent runtime bridge (`ReportGridBridgeComponent` and `RptGridOutletDirective`) that connects any underlying grid library (e.g., `UltraGridComponent` from `bways-grid`) to the dynamic report state:
468
+
469
+ ```
470
+ ┌─────────────────────────────────────────────────────────────┐
471
+ │ Design Canvas / Runtime │
472
+ │ │
473
+ │ [gridDefinition] (ReportGridDefinition) │
474
+ │ │ │
475
+ │ ▼ │
476
+ │ ┌─────────────────────────────────────────────────────┐ │
477
+ │ │ ReportGridBridgeComponent │ │
478
+ │ │ │ │
479
+ │ │ - gridInputs: transforms definition into inputs │ │
480
+ │ │ - gridReportState: preserves active & condition │ │
481
+ │ │ filters from serialized report state │ │
482
+ │ │ │ │
483
+ │ │ ┌─────────────────────────────────────────────┐ │ │
484
+ │ │ │ RptGridOutletDirective │ │ │
485
+ │ │ │ │ │ │
486
+ │ │ │ - Circular Echo Suppression: │ │ │
487
+ │ │ │ Tracks last emitted state & col-defs │ │ │
488
+ │ │ │ Skips setInput when update came from │ │ │
489
+ │ │ │ the grid itself. │ │ │
490
+ │ │ └─────────────────────┬───────────────────────┘ │ │
491
+ │ └─────────────────────────┼───────────────────────────┘ │
492
+ │ │ │
493
+ │ ▼ │
494
+ │ ┌───────────────────────┐ │
495
+ │ │ UltraGridComponent │ │
496
+ │ │ (Live ERP Grid) │ │
497
+ │ └───────────────────────┘ │
498
+ └─────────────────────────────────────────────────────────────┘
499
+ ```
500
+
501
+ ### Key Capabilities:
502
+ - **Interactive Filtering without Popover Dismissal**: In traditional bindings, when a user types in a filter or checks a box, parent state updates re-trigger `setInput`, causing the grid to re-initialize headers and snap popovers shut. `RptGridOutletDirective` compares incoming states (`isReportStateMatching`) against the grid's own latest emission, preventing unnecessary re-renders.
503
+ - **Layout Auto-Persist vs. Runtime Filtering**:
504
+ - **Structural Layout** changes (`groupModel`, `sortModel`, column widths, visibility) trigger immediate persistence and display the `"Layout auto-persisted"` status banner.
505
+ - **Column Data Filtering** (`activeFilters`, `conditionFilters`) is treated as runtime data exploration: debounced (1200ms) with `{ skipHistory: true }`, ensuring undo/redo stacks aren't flooded with intermediate keystrokes.
506
+ - **Full Filter State Preservation**: Filter sets and expressions are preserved intact in `options.reportState` when saved or exported.
507
+
508
+ ---
509
+
510
+ ## 9. Stored Procedure Discovery & Smart Parameter Mapping
511
+
512
+ `bways-report` integrates with SQL Server stored procedures via `HttpReportSchemaDiscoveryAdapter`:
513
+
514
+ 1. **Introspection (`sys.parameters`)**: Queries stored procedure signatures, determining data types, nullability, and default expressions.
515
+ 2. **Smart Control Inference**:
516
+ - Date parameters (`@FromDate`, `@ToDate`, `@AsOnDate`) automatically suggest date-picker or date-range controls.
517
+ - Master entity parameters (`@SubGLCode`, `@BranchId`, `@CustomerId`) infer dropdown lookups from associated tables or views.
518
+ 3. **Lookup Deduplication & Account Resolution**:
519
+ - `identifier-humanizer.ts` prioritizes unique account numbers (`_acno`, `glacno`, `account_no`) over category codes (`_code`), preventing duplicate collapsing of customer accounts in dropdown lookups.
520
+ 4. **Session Token Binding**:
521
+ - Parameters matching ERP session context (`@BranchId`, `@CompanyId`, `@FinYearId`) are automatically resolved via `SessionContextProvider` without manual user intervention.
522
+
523
+ ---
524
+
525
+ ## 10. Theming & CSS Custom Properties
460
526
 
461
527
  `bways-report` uses CSS custom properties (`--rpt-*`) throughout all components, ensuring seamless alignment with your ERP application's design system:
462
528
 
@@ -490,40 +556,7 @@ If not provided, the built-in SVG visual chart renderer outputs crisp, responsiv
490
556
 
491
557
  ---
492
558
 
493
- ## 8. Registering Custom Host Controls
494
-
495
- You can register custom Angular components (e.g., custom slider, multi-select, rich customer picker) into the `ComponentRegistry` so they appear in the Visual Designer palette and render dynamically at runtime:
496
-
497
- ```typescript
498
- import { ComponentRegistry, ComponentMetadata } from 'bways-report';
499
- import { MyCustomPickerComponent } from './my-custom-picker.component';
500
-
501
- export function configureCustomControls(registry: ComponentRegistry): void {
502
- registry.register({
503
- type: 'customer-picker',
504
- displayName: 'Customer Picker',
505
- category: 'input',
506
- icon: 'person_search',
507
- component: MyCustomPickerComponent,
508
- createDefaultConfig: () => ({
509
- id: 'cust-picker',
510
- type: 'customer-picker',
511
- label: 'Select Customer',
512
- properties: { placeholder: 'Search customer...' },
513
- layout: { columnSpan: 4 },
514
- }),
515
- propertySchema: [
516
- { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },
517
- { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },
518
- { key: 'required', label: 'Required', type: 'boolean', group: 'Validation' },
519
- ],
520
- });
521
- }
522
- ```
523
-
524
- ---
525
-
526
- ## 9. Exporting Data (CSV & JSON)
559
+ ## 11. Exporting Data (CSV & JSON)
527
560
 
528
561
  Use `ReportExportService` for one-click file generation:
529
562
 
@@ -574,6 +607,13 @@ export class ExportActionsComponent {
574
607
 
575
608
  ---
576
609
 
610
+ ## 12. Changelog & Version History
611
+
612
+ For a complete record of releases, breaking changes, and bug fixes, refer to the **[Changelog](CHANGELOG.md)**.
613
+
614
+ ---
615
+
577
616
  ## License
578
617
 
579
618
  MIT © BWays Technologies
619
+
@@ -1,3 +1,5 @@
1
1
  export { DynamicFormBuilder } from './dynamic-form-builder.service';
2
2
  export { ReportSessionContextService } from './report-session-context.service';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgRHluYW1pY0Zvcm1CdWlsZGVyIH0gZnJvbSAnLi9keW5hbWljLWZvcm0tYnVpbGRlci5zZXJ2aWNlJztcbmV4cG9ydCB7IFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSB9IGZyb20gJy4vcmVwb3J0LXNlc3Npb24tY29udGV4dC5zZXJ2aWNlJztcbmV4cG9ydCB0eXBlIHtcbiAgU2Vzc2lvblBhcmFtTWF0Y2gsXG4gIERlcml2ZWRQYXJhbWV0ZXJzUmVzdWx0LFxufSBmcm9tICcuL3JlcG9ydC1zZXNzaW9uLWNvbnRleHQuc2VydmljZSc7XG5cbiJdfQ==
3
+ export { ReportStorageService } from './report-storage.service';
4
+ export { ReportDataDiscoveryService } from './report-data-discovery.service';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBSy9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgRHluYW1pY0Zvcm1CdWlsZGVyIH0gZnJvbSAnLi9keW5hbWljLWZvcm0tYnVpbGRlci5zZXJ2aWNlJztcbmV4cG9ydCB7IFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSB9IGZyb20gJy4vcmVwb3J0LXNlc3Npb24tY29udGV4dC5zZXJ2aWNlJztcbmV4cG9ydCB0eXBlIHtcbiAgU2Vzc2lvblBhcmFtTWF0Y2gsXG4gIERlcml2ZWRQYXJhbWV0ZXJzUmVzdWx0LFxufSBmcm9tICcuL3JlcG9ydC1zZXNzaW9uLWNvbnRleHQuc2VydmljZSc7XG5leHBvcnQgeyBSZXBvcnRTdG9yYWdlU2VydmljZSB9IGZyb20gJy4vcmVwb3J0LXN0b3JhZ2Uuc2VydmljZSc7XG5leHBvcnQgeyBSZXBvcnREYXRhRGlzY292ZXJ5U2VydmljZSB9IGZyb20gJy4vcmVwb3J0LWRhdGEtZGlzY292ZXJ5LnNlcnZpY2UnO1xuIl19
@@ -0,0 +1,135 @@
1
+ import { inject, Injectable } from '@angular/core';
2
+ import { of } from 'rxjs';
3
+ import { catchError, map } from 'rxjs/operators';
4
+ import { ReportSchemaDiscoveryAdapter, } from '../../data-access/contracts/schema-discovery.contract';
5
+ import { ReportLookupAdapter } from '../../data-access/contracts/lookup.contract';
6
+ import { ReportSessionContextService } from './report-session-context.service';
7
+ import { resolveParameterMappings } from '../utils/report-parameter.util';
8
+ import { humanizeIdentifier } from '../utils/identifier-humanizer';
9
+ import * as i0 from "@angular/core";
10
+ /**
11
+ * Centralized service for discovering database schema entities, parameters,
12
+ * and column definitions.
13
+ *
14
+ * Provides a unified static + dynamic detection pipeline:
15
+ * If static schema metadata discovery fails (e.g. SQL Server stored procedures
16
+ * using #temp tables that cannot be analyzed statically), it automatically
17
+ * falls back to executing a safe dynamic sample query with the active parameter
18
+ * values and extracting column definitions from the result dataset.
19
+ */
20
+ export class ReportDataDiscoveryService {
21
+ discoveryAdapter = inject(ReportSchemaDiscoveryAdapter, { optional: true });
22
+ lookupAdapter = inject(ReportLookupAdapter, { optional: true });
23
+ sessionService = inject(ReportSessionContextService, { optional: true });
24
+ /**
25
+ * Retrieves all database tables, views, and stored procedures.
26
+ */
27
+ getEntities(types) {
28
+ if (!this.discoveryAdapter) {
29
+ return of([]);
30
+ }
31
+ return this.discoveryAdapter.getEntities(types).pipe(catchError((err) => {
32
+ console.warn('[ReportDataDiscoveryService] Failed to get entities:', err);
33
+ return of([]);
34
+ }));
35
+ }
36
+ /**
37
+ * Retrieves stored procedure parameter metadata.
38
+ */
39
+ getParameters(procedureName, schema = 'dbo') {
40
+ if (!procedureName || !this.discoveryAdapter) {
41
+ return of([]);
42
+ }
43
+ return this.discoveryAdapter.getParameters(procedureName, schema).pipe(catchError((err) => {
44
+ console.warn(`[ReportDataDiscoveryService] Failed to get parameters for ${procedureName}:`, err);
45
+ return of([]);
46
+ }));
47
+ }
48
+ /**
49
+ * Unified column detection:
50
+ * 1. Attempts static schema discovery via ReportSchemaDiscoveryAdapter.
51
+ * 2. If static discovery returns 0 columns or throws an error (e.g. SQL Error 11526 with #temp tables),
52
+ * automatically runs dynamic sample query via ReportLookupAdapter using resolved parameters.
53
+ */
54
+ autoDetectColumns(entityName, entityType = 'stored_procedure', mappings = {}, schema = 'dbo') {
55
+ if (!entityName) {
56
+ return of([]);
57
+ }
58
+ // Try static discovery first
59
+ if (this.discoveryAdapter) {
60
+ return this.discoveryAdapter.getColumns(entityName, schema, entityType).pipe(map((cols) => {
61
+ if (cols && cols.length > 0) {
62
+ return this.mapStaticColumnsToGrid(cols);
63
+ }
64
+ throw new Error('STATIC_EMPTY');
65
+ }), catchError(() => {
66
+ // Fallback to dynamic execution
67
+ return this.fallbackDynamicDetection(entityName, entityType, mappings, schema);
68
+ }));
69
+ }
70
+ return this.fallbackDynamicDetection(entityName, entityType, mappings, schema);
71
+ }
72
+ mapStaticColumnsToGrid(cols) {
73
+ return cols.map((c) => ({
74
+ field: c.field,
75
+ label: humanizeIdentifier(c.label || c.field),
76
+ dataType: c.dataType || 'string',
77
+ visible: true,
78
+ sortable: true,
79
+ align: c.dataType === 'number' ? 'right' : 'left',
80
+ }));
81
+ }
82
+ fallbackDynamicDetection(entityName, sourceType, mappings, schema = 'dbo') {
83
+ if (!this.lookupAdapter) {
84
+ return of([]);
85
+ }
86
+ const session = this.sessionService?.getCurrentSessionContext() ?? {};
87
+ const resolvedParams = resolveParameterMappings(mappings, session, {});
88
+ return this.lookupAdapter
89
+ .fetchOptions({
90
+ sourceType: (sourceType === 'stored_procedure' ? 'procedure' : sourceType),
91
+ entityName,
92
+ schema,
93
+ valueField: '',
94
+ displayField: '',
95
+ parameters: resolvedParams,
96
+ })
97
+ .pipe(map((items) => {
98
+ if (items && items.length > 0 && items[0].raw) {
99
+ const sampleRow = items[0].raw;
100
+ const keys = Object.keys(sampleRow);
101
+ if (keys.length > 0) {
102
+ return keys.map((key) => {
103
+ const val = sampleRow[key];
104
+ let type = 'string';
105
+ if (typeof val === 'number')
106
+ type = 'number';
107
+ else if (typeof val === 'boolean')
108
+ type = 'boolean';
109
+ else if (typeof val === 'string' && /^\d{4}-\d{2}-\d{2}/.test(val))
110
+ type = 'date';
111
+ return {
112
+ field: key,
113
+ label: humanizeIdentifier(key),
114
+ dataType: type,
115
+ visible: true,
116
+ sortable: true,
117
+ align: (type === 'number' ? 'right' : 'left'),
118
+ };
119
+ });
120
+ }
121
+ }
122
+ return [];
123
+ }), catchError((err) => {
124
+ console.warn(`[ReportDataDiscoveryService] Dynamic sample detection failed for ${entityName}:`, err);
125
+ return of([]);
126
+ }));
127
+ }
128
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportDataDiscoveryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
129
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportDataDiscoveryService, providedIn: 'root' });
130
+ }
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportDataDiscoveryService, decorators: [{
132
+ type: Injectable,
133
+ args: [{ providedIn: 'root' }]
134
+ }] });
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWRhdGEtZGlzY292ZXJ5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL3JlcG9ydC1kYXRhLWRpc2NvdmVyeS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBYyxFQUFFLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBS0wsNEJBQTRCLEdBQzdCLE1BQU0sdURBQXVELENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbEYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFHL0UsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7O0FBRW5FOzs7Ozs7Ozs7R0FTRztBQUVILE1BQU0sT0FBTywwQkFBMEI7SUFDcEIsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLDRCQUE0QixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUUsYUFBYSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLGNBQWMsR0FBRyxNQUFNLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUUxRjs7T0FFRztJQUNILFdBQVcsQ0FBQyxLQUE0QjtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFn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b3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBEYXRhYmFzZUVudGl0eU1ldGFkYXRhLFxuICBEYXRhYmFzZUVudGl0eVR5cGUsXG4gIEVudGl0eUNvbHVtbk1ldGFkYXRhLFxuICBQcm9jZWR1cmVQYXJhbWV0ZXJNZXRhZGF0YSxcbiAgUmVwb3J0U2NoZW1hRGlzY292ZXJ5QWRhcHRlcixcbn0gZnJvbSAnLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3NjaGVtYS1kaXNjb3ZlcnkuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVwb3J0TG9va3VwQWRhcHRlciB9IGZyb20gJy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9sb29rdXAuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi9yZXBvcnQtc2Vzc2lvbi1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JpZENvbHVtbkRlZmluaXRpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVwb3J0LWdyaWQubW9kZWwnO1xuaW1wb3J0IHsgRHJvcGRvd25Tb3VyY2VUeXBlIH0gZnJvbSAnLi4vbW9kZWxzL3JlcG9ydC1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHsgcmVzb2x2ZVBhcmFtZXRlck1hcHBpbmdzIH0gZnJvbSAnLi4vdXRpbHMvcmVwb3J0LXBhcmFtZXRlci51dGlsJztcbmltcG9ydCB7IGh1bWFuaXplSWRlbnRpZmllciB9IGZyb20gJy4uL3V0aWxzL2lkZW50aWZpZXItaHVtYW5pemVyJztcblxuLyoqXG4gKiBDZW50cmFsaXplZCBzZXJ2aWNlIGZvciBkaXNjb3ZlcmluZyBkYXRhYmFzZSBzY2hlbWEgZW50aXRpZXMsIHBhcmFtZXRlcnMsXG4gKiBhbmQgY29sdW1uIGRlZmluaXRpb25zLlxuICpcbiAqIFByb3ZpZGVzIGEgdW5pZmllZCBzdGF0aWMgKyBkeW5hbWljIGRldGVjdGlvbiBwaXBlbGluZTpcbiAqIElmIHN0YXRpYyBzY2hlbWEgbWV0YWRhdGEgZGlzY292ZXJ5IGZhaWxzIChlLmcuIFNRTCBTZXJ2ZXIgc3RvcmVkIHByb2NlZHVyZXNcbiAqIHVzaW5nICN0ZW1wIHRhYmxlcyB0aGF0IGNhbm5vdCBiZSBhbmFseXplZCBzdGF0aWNhbGx5KSwgaXQgYXV0b21hdGljYWxseVxuICogZmFsbHMgYmFjayB0byBleGVjdXRpbmcgYSBzYWZlIGR5bmFtaWMgc2FtcGxlIHF1ZXJ5IHdpdGggdGhlIGFjdGl2ZSBwYXJhbWV0ZXJcbiAqIHZhbHVlcyBhbmQgZXh0cmFjdGluZyBjb2x1bW4gZGVmaW5pdGlvbnMgZnJvbSB0aGUgcmVzdWx0IGRhdGFzZXQuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUmVwb3J0RGF0YURpc2NvdmVyeVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc2NvdmVyeUFkYXB0ZXIgPSBpbmplY3QoUmVwb3J0U2NoZW1hRGlzY292ZXJ5QWRhcHRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb29rdXBBZGFwdGVyID0gaW5qZWN0KFJlcG9ydExvb2t1cEFkYXB0ZXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblNlcnZpY2UgPSBpbmplY3QoUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYWxsIGRhdGFiYXNlIHRhYmxlcywgdmlld3MsIGFuZCBzdG9yZWQgcHJvY2VkdXJlcy5cbiAgICovXG4gIGdldEVudGl0aWVzKHR5cGVzPzogRGF0YWJhc2VFbnRpdHlUeXBlW10pOiBPYnNlcnZhYmxlPERhdGFiYXNlRW50aXR5TWV0YWRhdGFbXT4ge1xuICAgIGlmICghdGhpcy5kaXNjb3ZlcnlBZGFwdGVyKSB7XG4gICAgICByZXR1cm4gb2YoW10pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaXNjb3ZlcnlBZGFwdGVyLmdldEVudGl0aWVzKHR5cGVzKS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1JlcG9ydERhdGFEaXNjb3ZlcnlTZXJ2aWNlXSBGYWlsZWQgdG8gZ2V0IGVudGl0aWVzOicsIGVycik7XG4gICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyIG1ldGFkYXRhLlxuICAgKi9cbiAgZ2V0UGFyYW1ldGVycyhwcm9jZWR1cmVOYW1lOiBzdHJpbmcsIHNjaGVtYSA9ICdkYm8nKTogT2JzZXJ2YWJsZTxQcm9jZWR1cmVQYXJhbWV0ZXJNZXRhZGF0YVtdPiB7XG4gICAgaWYgKCFwcm9jZWR1cmVOYW1lIHx8ICF0aGlzLmRpc2NvdmVyeUFkYXB0ZXIpIHtcbiAgICAgIHJldHVybiBvZihbXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRpc2NvdmVyeUFkYXB0ZXIuZ2V0UGFyYW1ldGVycyhwcm9jZWR1cmVOYW1lLCBzY2hlbWEpLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbUmVwb3J0RGF0YURpc2NvdmVyeVNlcnZpY2VdIEZhaWxlZCB0byBnZXQgcGFyYW1ldGVycyBmb3IgJHtwcm9jZWR1cmVOYW1lfTpgLCBlcnIpO1xuICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuaWZpZWQgY29sdW1uIGRldGVjdGlvbjpcbiAgICogMS4gQXR0ZW1wdHMgc3RhdGljIHNjaGVtYSBkaXNjb3ZlcnkgdmlhIFJlcG9ydFNjaGVtYURpc2NvdmVyeUFkYXB0ZXIuXG4gICAqIDIuIElmIHN0YXRpYyBkaXNjb3ZlcnkgcmV0dXJucyAwIGNvbHVtbnMgb3IgdGhyb3dzIGFuIGVycm9yIChlLmcuIFNRTCBFcnJvciAxMTUyNiB3aXRoICN0ZW1wIHRhYmxlcyksXG4gICAqICAgIGF1dG9tYXRpY2FsbHkgcnVucyBkeW5hbWljIHNhbXBsZSBxdWVyeSB2aWEgUmVwb3J0TG9va3VwQWRhcHRlciB1c2luZyByZXNvbHZlZCBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgYXV0b0RldGVjdENvbHVtbnMoXG4gICAgZW50aXR5TmFtZTogc3RyaW5nLFxuICAgIGVudGl0eVR5cGU6ICd0YWJsZScgfCAnc3RvcmVkX3Byb2NlZHVyZScgPSAnc3RvcmVkX3Byb2NlZHVyZScsXG4gICAgbWFwcGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30sXG4gICAgc2NoZW1hID0gJ2RibydcbiAgKTogT2JzZXJ2YWJsZTxHcmlkQ29sdW1uRGVmaW5pdGlvbltdPiB7XG4gICAgaWYgKCFlbnRpdHlOYW1lKSB7XG4gICAgICByZXR1cm4gb2YoW10pO1xuICAgIH1cblxuICAgIC8vIFRyeSBzdGF0aWMgZGlzY292ZXJ5IGZpcnN0XG4gICAgaWYgKHRoaXMuZGlzY292ZXJ5QWRhcHRlcikge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzY292ZXJ5QWRhcHRlci5nZXRDb2x1bW5zKGVudGl0eU5hbWUsIHNjaGVtYSwgZW50aXR5VHlwZSkucGlwZShcbiAgICAgICAgbWFwKChjb2xzKSA9PiB7XG4gICAgICAgICAgaWYgKGNvbHMgJiYgY29scy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXBTdGF0aWNDb2x1bW5zVG9HcmlkKGNvbHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NUQVRJQ19FTVBUWScpO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gZHluYW1pYyBleGVjdXRpb25cbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWxsYmFja0R5bmFtaWNEZXRlY3Rpb24oZW50aXR5TmFtZSwgZW50aXR5VHlwZSwgbWFwcGluZ3MsIHNjaGVtYSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZhbGxiYWNrRHluYW1pY0RldGVjdGlvbihlbnRpdHlOYW1lLCBlbnRpdHlUeXBlLCBtYXBwaW5ncywgc2NoZW1hKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwU3RhdGljQ29sdW1uc1RvR3JpZChjb2xzOiBFbnRpdHlDb2x1bW5NZXRhZGF0YVtdKTogR3JpZENvbHVtbkRlZmluaXRpb25bXSB7XG4gICAgcmV0dXJuIGNvbHMubWFwKChjKSA9PiAoe1xuICAgICAgZmllbGQ6IGMuZmllbGQsXG4gICAgICBsYWJlbDogaHVtYW5pemVJZGVudGlmaWVyKGMubGFiZWwgfHwgYy5maWVsZCksXG4gICAgICBkYXRhVHlwZTogKGMuZGF0YVR5cGUgYXMgYW55KSB8fCAnc3RyaW5nJyxcbiAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIGFsaWduOiBjLmRhdGFUeXBlID09PSAnbnVtYmVyJyA/ICdyaWdodCcgOiAnbGVmdCcsXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBmYWxsYmFja0R5bmFtaWNEZXRlY3Rpb24oXG4gICAgZW50aXR5TmFtZTogc3RyaW5nLFxuICAgIHNvdXJjZVR5cGU6ICd0YWJsZScgfCAnc3RvcmVkX3Byb2NlZHVyZScsXG4gICAgbWFwcGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHNjaGVtYSA9ICdkYm8nXG4gICk6IE9ic2VydmFibGU8R3JpZENvbHVtbkRlZmluaXRpb25bXT4ge1xuICAgIGlmICghdGhpcy5sb29rdXBBZGFwdGVyKSB7XG4gICAgICByZXR1cm4gb2YoW10pO1xuICAgIH1cblxuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnNlc3Npb25TZXJ2aWNlPy5nZXRDdXJyZW50U2Vzc2lvbkNvbnRleHQoKSA/PyB7fTtcbiAgICBjb25zdCByZXNvbHZlZFBhcmFtcyA9IHJlc29sdmVQYXJhbWV0ZXJNYXBwaW5ncyhtYXBwaW5ncyBhcyBhbnksIHNlc3Npb24sIHt9KTtcblxuICAgIHJldHVybiB0aGlzLmxvb2t1cEFkYXB0ZXJcbiAgICAgIC5mZXRjaE9wdGlvbnMoe1xuICAgICAgICBzb3VyY2VUeXBlOiAoc291cmNlVHlwZSA9PT0gJ3N0b3JlZF9wcm9jZWR1cmUnID8gJ3Byb2NlZHVyZScgOiBzb3VyY2VUeXBlKSBhcyBEcm9wZG93blNvdXJjZVR5cGUsXG4gICAgICAgIGVudGl0eU5hbWUsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgdmFsdWVGaWVsZDogJycsXG4gICAgICAgIGRpc3BsYXlGaWVsZDogJycsXG4gICAgICAgIHBhcmFtZXRlcnM6IHJlc29sdmVkUGFyYW1zLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCA+IDAgJiYgaXRlbXNbMF0ucmF3KSB7XG4gICAgICAgICAgICBjb25zdCBzYW1wbGVSb3cgPSBpdGVtc1swXS5yYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc2FtcGxlUm93KTtcbiAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGtleXMubWFwKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBzYW1wbGVSb3dba2V5XTtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdkYXRlJyB8ICdib29sZWFuJyA9ICdzdHJpbmcnO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgdHlwZSA9ICdudW1iZXInO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJykgdHlwZSA9ICdib29sZWFuJztcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9Ly50ZXN0KHZhbCkpIHR5cGUgPSAnZGF0ZSc7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgZmllbGQ6IGtleSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiBodW1hbml6ZUlkZW50aWZpZXIoa2V5KSxcbiAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgYWxpZ246ICh0eXBlID09PSAnbnVtYmVyJyA/ICdyaWdodCcgOiAnbGVmdCcpIGFzICdyaWdodCcgfCAnbGVmdCcsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW1JlcG9ydERhdGFEaXNjb3ZlcnlTZXJ2aWNlXSBEeW5hbWljIHNhbXBsZSBkZXRlY3Rpb24gZmFpbGVkIGZvciAke2VudGl0eU5hbWV9OmAsIGVycik7XG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,63 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { REPORT_STORAGE } from '../tokens/storage.token';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Angular injectable service wrapping report storage operations.
6
+ * Provides type-safe JSON serialization/deserialization and environment-agnostic access.
7
+ */
8
+ export class ReportStorageService {
9
+ storage = inject(REPORT_STORAGE);
10
+ getItem(key) {
11
+ return this.storage.getItem(key);
12
+ }
13
+ setItem(key, value) {
14
+ this.storage.setItem(key, value);
15
+ }
16
+ removeItem(key) {
17
+ this.storage.removeItem(key);
18
+ }
19
+ clear() {
20
+ this.storage.clear();
21
+ }
22
+ key(index) {
23
+ return this.storage.key ? this.storage.key(index) : null;
24
+ }
25
+ get length() {
26
+ return this.storage.length ?? 0;
27
+ }
28
+ /**
29
+ * Safely retrieves and parses a JSON value from storage.
30
+ * Returns fallback if key is missing or parsing fails.
31
+ */
32
+ getJSON(key, fallback) {
33
+ const raw = this.getItem(key);
34
+ if (!raw)
35
+ return fallback;
36
+ try {
37
+ return JSON.parse(raw);
38
+ }
39
+ catch {
40
+ return fallback;
41
+ }
42
+ }
43
+ /**
44
+ * Safely serializes and stores a JSON value in storage.
45
+ */
46
+ setJSON(key, value) {
47
+ try {
48
+ this.setItem(key, JSON.stringify(value));
49
+ }
50
+ catch {
51
+ // Storage error or circular structure handled gracefully
52
+ }
53
+ }
54
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportStorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
55
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportStorageService, providedIn: 'root' });
56
+ }
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportStorageService, decorators: [{
58
+ type: Injectable,
59
+ args: [{
60
+ providedIn: 'root',
61
+ }]
62
+ }] });
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXN0b3JhZ2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2NvcmUvc2VydmljZXMvcmVwb3J0LXN0b3JhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFpQixNQUFNLHlCQUF5QixDQUFDOztBQUV4RTs7O0dBR0c7QUFJSCxNQUFNLE9BQU8sb0JBQW9CO0lBQ2QsT0FBTyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUVsRCxPQUFPLENBQUMsR0FBVztRQUNqQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBVyxFQUFFLEtBQWE7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBVztRQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELEdBQUcsQ0FBQyxLQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzRCxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU8sQ0FBSSxHQUFXLEVBQUUsUUFBVztRQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDMUIsSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBTSxDQUFDO1FBQzlCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTyxDQUFJLEdBQVcsRUFBRSxLQUFRO1FBQzlCLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AseURBQXlEO1FBQzNELENBQUM7SUFDSCxDQUFDO3dHQWxEVSxvQkFBb0I7NEdBQXBCLG9CQUFvQixjQUZuQixNQUFNOzs0RkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSRVBPUlRfU1RPUkFHRSwgUmVwb3J0U3RvcmFnZSB9IGZyb20gJy4uL3Rva2Vucy9zdG9yYWdlLnRva2VuJztcblxuLyoqXG4gKiBBbmd1bGFyIGluamVjdGFibGUgc2VydmljZSB3cmFwcGluZyByZXBvcnQgc3RvcmFnZSBvcGVyYXRpb25zLlxuICogUHJvdmlkZXMgdHlwZS1zYWZlIEpTT04gc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gYW5kIGVudmlyb25tZW50LWFnbm9zdGljIGFjY2Vzcy5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFJlcG9ydFN0b3JhZ2VTZXJ2aWNlIGltcGxlbWVudHMgUmVwb3J0U3RvcmFnZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZSA9IGluamVjdChSRVBPUlRfU1RPUkFHRSk7XG5cbiAgZ2V0SXRlbShrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICB9XG5cbiAgc2V0SXRlbShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgcmVtb3ZlSXRlbShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JhZ2UuY2xlYXIoKTtcbiAgfVxuXG4gIGtleShpbmRleDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5rZXkgPyB0aGlzLnN0b3JhZ2Uua2V5KGluZGV4KSA6IG51bGw7XG4gIH1cblxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5sZW5ndGggPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYWZlbHkgcmV0cmlldmVzIGFuZCBwYXJzZXMgYSBKU09OIHZhbHVlIGZyb20gc3RvcmFnZS5cbiAgICogUmV0dXJucyBmYWxsYmFjayBpZiBrZXkgaXMgbWlzc2luZyBvciBwYXJzaW5nIGZhaWxzLlxuICAgKi9cbiAgZ2V0SlNPTjxUPihrZXk6IHN0cmluZywgZmFsbGJhY2s6IFQpOiBUIHtcbiAgICBjb25zdCByYXcgPSB0aGlzLmdldEl0ZW0oa2V5KTtcbiAgICBpZiAoIXJhdykgcmV0dXJuIGZhbGxiYWNrO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyYXcpIGFzIFQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhZmVseSBzZXJpYWxpemVzIGFuZCBzdG9yZXMgYSBKU09OIHZhbHVlIGluIHN0b3JhZ2UuXG4gICAqL1xuICBzZXRKU09OPFQ+KGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU3RvcmFnZSBlcnJvciBvciBjaXJjdWxhciBzdHJ1Y3R1cmUgaGFuZGxlZCBncmFjZWZ1bGx5XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,3 +1,4 @@
1
1
  export { REPORTING_CONFIG, GRID_COMPONENT, CHART_COMPONENT, } from './reporting-config.token';
2
2
  export { REPORT_SESSION_CONTEXT, REPORT_SESSION_PROVIDER, SessionContextProvider, } from './session-context.token';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9jb3JlL3Rva2Vucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxlQUFlLEdBQ2hCLE1BQU0sMEJBQTBCLENBQUM7QUFNbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsc0JBQXNCLEdBQ3ZCLE1BQU0seUJBQXlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xuICBSRVBPUlRJTkdfQ09ORklHLFxuICBHUklEX0NPTVBPTkVOVCxcbiAgQ0hBUlRfQ09NUE9ORU5ULFxufSBmcm9tICcuL3JlcG9ydGluZy1jb25maWcudG9rZW4nO1xuXG5leHBvcnQgdHlwZSB7XG4gIFJlcG9ydGluZ0NvbmZpZyxcbn0gZnJvbSAnLi9yZXBvcnRpbmctY29uZmlnLnRva2VuJztcblxuZXhwb3J0IHtcbiAgUkVQT1JUX1NFU1NJT05fQ09OVEVYVCxcbiAgUkVQT1JUX1NFU1NJT05fUFJPVklERVIsXG4gIFNlc3Npb25Db250ZXh0UHJvdmlkZXIsXG59IGZyb20gJy4vc2Vzc2lvbi1jb250ZXh0LnRva2VuJztcblxuZXhwb3J0IHR5cGUge1xuICBTZXNzaW9uUGFyYW1QcmltaXRpdmUsXG4gIFNlc3Npb25Db250ZXh0TWFwLFxuICBTZXNzaW9uQ29udGV4dFByb3ZpZGVyRm4sXG4gIFNlc3Npb25Db250ZXh0U291cmNlLFxufSBmcm9tICcuL3Nlc3Npb24tY29udGV4dC50b2tlbic7XG4iXX0=
3
+ export { REPORT_STORAGE, BrowserReportStorage, MemoryReportStorage, } from './storage.token';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9jb3JlL3Rva2Vucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxlQUFlLEdBQ2hCLE1BQU0sMEJBQTBCLENBQUM7QUFNbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsc0JBQXNCLEdBQ3ZCLE1BQU0seUJBQXlCLENBQUM7QUFTakMsT0FBTyxFQUNMLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsbUJBQW1CLEdBQ3BCLE1BQU0saUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xuICBSRVBPUlRJTkdfQ09ORklHLFxuICBHUklEX0NPTVBPTkVOVCxcbiAgQ0hBUlRfQ09NUE9ORU5ULFxufSBmcm9tICcuL3JlcG9ydGluZy1jb25maWcudG9rZW4nO1xuXG5leHBvcnQgdHlwZSB7XG4gIFJlcG9ydGluZ0NvbmZpZyxcbn0gZnJvbSAnLi9yZXBvcnRpbmctY29uZmlnLnRva2VuJztcblxuZXhwb3J0IHtcbiAgUkVQT1JUX1NFU1NJT05fQ09OVEVYVCxcbiAgUkVQT1JUX1NFU1NJT05fUFJPVklERVIsXG4gIFNlc3Npb25Db250ZXh0UHJvdmlkZXIsXG59IGZyb20gJy4vc2Vzc2lvbi1jb250ZXh0LnRva2VuJztcblxuZXhwb3J0IHR5cGUge1xuICBTZXNzaW9uUGFyYW1QcmltaXRpdmUsXG4gIFNlc3Npb25Db250ZXh0TWFwLFxuICBTZXNzaW9uQ29udGV4dFByb3ZpZGVyRm4sXG4gIFNlc3Npb25Db250ZXh0U291cmNlLFxufSBmcm9tICcuL3Nlc3Npb24tY29udGV4dC50b2tlbic7XG5cbmV4cG9ydCB7XG4gIFJFUE9SVF9TVE9SQUdFLFxuICBCcm93c2VyUmVwb3J0U3RvcmFnZSxcbiAgTWVtb3J5UmVwb3J0U3RvcmFnZSxcbn0gZnJvbSAnLi9zdG9yYWdlLnRva2VuJztcblxuZXhwb3J0IHR5cGUge1xuICBSZXBvcnRTdG9yYWdlLFxufSBmcm9tICcuL3N0b3JhZ2UudG9rZW4nO1xuIl19
@@ -23,4 +23,4 @@ export const CHART_COMPONENT = new InjectionToken('CHART_COMPONENT');
23
23
  * Injection token for the reporting library configuration.
24
24
  */
25
25
  export const REPORTING_CONFIG = new InjectionToken('REPORTING_CONFIG');
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLWNvbmZpZy50b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2NvcmUvdG9rZW5zL3JlcG9ydGluZy1jb25maWcudG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFRLE1BQU0sZUFBZSxDQUFDO0FBeUJyRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBZ0IsZ0JBQWdCLENBQUMsQ0FBQztBQUVsRjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGNBQWMsQ0FBZ0IsaUJBQWlCLENBQUMsQ0FBQztBQUVwRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFrQixrQkFBa0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXBvcnRpbmcgbGlicmFyeSBjb25maWd1cmF0aW9uIHRva2Vucy5cbiAqXG4gKiBDb3JlIGNvbmZpZ3VyYXRpb24gbW9kZWxzIGFuZCBpbmplY3Rpb24gdG9rZW5zLlxuICogRGVjb3VwbGVkIGZyb20gVUkgcHJpbWl0aXZlcyBhbmQgZGF0YS1hY2Nlc3MgYWRhcHRlcnMuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBMaWJyYXJ5IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdDb25maWcge1xuICAvKiogRGVmYXVsdCBwYWdlIHNpemUgZm9yIGdyaWRzLiAqL1xuICBkZWZhdWx0UGFnZVNpemU6IG51bWJlcjtcblxuICAvKiogRGF0ZSBmb3JtYXQgc3RyaW5nIHVzZWQgYWNyb3NzIHRoZSBsaWJyYXJ5LiAqL1xuICBkYXRlRm9ybWF0OiBzdHJpbmc7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIERlc2lnbmVyIGZlYXR1cmUgaXMgZW5hYmxlZC4gKi9cbiAgZW5hYmxlRGVzaWduZXI6IGJvb2xlYW47XG5cbiAgLyoqIEN1cnJlbnQgc2NoZW1hIHZlcnNpb24gZm9yIG5ldyByZXBvcnRzLiAqL1xuICBzY2hlbWFWZXJzaW9uOiBudW1iZXI7XG5cbiAgLyoqIEJhc2UgVVJMIGZvciBiYWNrZW5kIHJlcG9ydGluZyBlbmRwb2ludHMgKE5lc3RKUyAvIC5ORVQgLyBSRVNUIEFQSSkuICovXG4gIGFwaUJhc2VVcmw/OiBzdHJpbmc7XG5cbiAgLyoqIFdoZXRoZXIgYXV0b21hdGljIGJhY2tlbmQgc2NoZW1hIGRpc2NvdmVyeSAoU1BzICYgVGFibGVzKSBpcyBlbmFibGVkLiAqL1xuICBlbmFibGVTY2hlbWFEaXNjb3Zlcnk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEluamVjdGlvbiB0b2tlbiBmb3IgdGhlIGdyaWQgY29tcG9uZW50LlxuICpcbiAqIFRoZSBob3N0IHByb3ZpZGVzIHRoZWlyIGdyaWQgY29tcG9uZW50IChCV2F5cy1ncmlkLCBBRyBHcmlkIHdyYXBwZXIsIGV0Yy4pXG4gKiBhbmQgdGhlIGBSZXBvcnRHcmlkQnJpZGdlQ29tcG9uZW50YCByZXNvbHZlcyBpdCBhdCBydW50aW1lLlxuICovXG5leHBvcnQgY29uc3QgR1JJRF9DT01QT05FTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48VHlwZTx1bmtub3duPj4oJ0dSSURfQ09NUE9ORU5UJyk7XG5cbi8qKlxuICogSW5qZWN0aW9uIHRva2VuIGZvciB0aGUgY2hhcnQgY29tcG9uZW50LlxuICpcbiAqIFRoZSBob3N0IGNhbiBwcm92aWRlIHRoZWlyIHByZWZlcnJlZCBjaGFydCBjb21wb25lbnQgKENoYXJ0LmpzLCBIaWdoY2hhcnRzLCBBcGV4Q2hhcnRzIHdyYXBwZXIsIGV0Yy4pXG4gKiBhbmQgdGhlIGBSZXBvcnRDaGFydEJyaWRnZUNvbXBvbmVudGAgZGVsZWdhdGVzIHJlbmRlcmluZyB0byBpdCwgb3IgZmFsbHMgYmFjayB0byBidWlsdC1pbiBTVkcgY2hhcnRzLlxuICovXG5leHBvcnQgY29uc3QgQ0hBUlRfQ09NUE9ORU5UID0gbmV3IEluamVjdGlvblRva2VuPFR5cGU8dW5rbm93bj4+KCdDSEFSVF9DT01QT05FTlQnKTtcblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gZm9yIHRoZSByZXBvcnRpbmcgbGlicmFyeSBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgY29uc3QgUkVQT1JUSU5HX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxSZXBvcnRpbmdDb25maWc+KCdSRVBPUlRJTkdfQ09ORklHJyk7XG4iXX0=
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLWNvbmZpZy50b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2NvcmUvdG9rZW5zL3JlcG9ydGluZy1jb25maWcudG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFRLE1BQU0sZUFBZSxDQUFDO0FBNEJyRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBZ0IsZ0JBQWdCLENBQUMsQ0FBQztBQUVsRjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGNBQWMsQ0FBZ0IsaUJBQWlCLENBQUMsQ0FBQztBQUVwRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFrQixrQkFBa0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXBvcnRpbmcgbGlicmFyeSBjb25maWd1cmF0aW9uIHRva2Vucy5cbiAqXG4gKiBDb3JlIGNvbmZpZ3VyYXRpb24gbW9kZWxzIGFuZCBpbmplY3Rpb24gdG9rZW5zLlxuICogRGVjb3VwbGVkIGZyb20gVUkgcHJpbWl0aXZlcyBhbmQgZGF0YS1hY2Nlc3MgYWRhcHRlcnMuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBMaWJyYXJ5IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdDb25maWcge1xuICAvKiogRGVmYXVsdCBwYWdlIHNpemUgZm9yIGdyaWRzLiAqL1xuICBkZWZhdWx0UGFnZVNpemU6IG51bWJlcjtcblxuICAvKiogRGF0ZSBmb3JtYXQgc3RyaW5nIHVzZWQgYWNyb3NzIHRoZSBsaWJyYXJ5LiAqL1xuICBkYXRlRm9ybWF0OiBzdHJpbmc7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIERlc2lnbmVyIGZlYXR1cmUgaXMgZW5hYmxlZC4gKi9cbiAgZW5hYmxlRGVzaWduZXI6IGJvb2xlYW47XG5cbiAgLyoqIEN1cnJlbnQgc2NoZW1hIHZlcnNpb24gZm9yIG5ldyByZXBvcnRzLiAqL1xuICBzY2hlbWFWZXJzaW9uOiBudW1iZXI7XG5cbiAgLyoqIEJhc2UgVVJMIGZvciBiYWNrZW5kIHJlcG9ydGluZyBlbmRwb2ludHMgKE5lc3RKUyAvIC5ORVQgLyBSRVNUIEFQSSkuICovXG4gIGFwaUJhc2VVcmw/OiBzdHJpbmc7XG5cbiAgLyoqIFdoZXRoZXIgYXV0b21hdGljIGJhY2tlbmQgc2NoZW1hIGRpc2NvdmVyeSAoU1BzICYgVGFibGVzKSBpcyBlbmFibGVkLiAqL1xuICBlbmFibGVTY2hlbWFEaXNjb3Zlcnk/OiBib29sZWFuO1xuXG4gIC8qKiBPcHRpb25hbCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgZHJvcGRvd24gbG9va3VwIHF1ZXJpZXMgKGRlZmF1bHRzIHRvIDMwMDAwMG1zIC8gNSBtaW51dGVzKS4gKi9cbiAgbG9va3VwVGltZW91dE1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEluamVjdGlvbiB0b2tlbiBmb3IgdGhlIGdyaWQgY29tcG9uZW50LlxuICpcbiAqIFRoZSBob3N0IHByb3ZpZGVzIHRoZWlyIGdyaWQgY29tcG9uZW50IChCV2F5cy1ncmlkLCBBRyBHcmlkIHdyYXBwZXIsIGV0Yy4pXG4gKiBhbmQgdGhlIGBSZXBvcnRHcmlkQnJpZGdlQ29tcG9uZW50YCByZXNvbHZlcyBpdCBhdCBydW50aW1lLlxuICovXG5leHBvcnQgY29uc3QgR1JJRF9DT01QT05FTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48VHlwZTx1bmtub3duPj4oJ0dSSURfQ09NUE9ORU5UJyk7XG5cbi8qKlxuICogSW5qZWN0aW9uIHRva2VuIGZvciB0aGUgY2hhcnQgY29tcG9uZW50LlxuICpcbiAqIFRoZSBob3N0IGNhbiBwcm92aWRlIHRoZWlyIHByZWZlcnJlZCBjaGFydCBjb21wb25lbnQgKENoYXJ0LmpzLCBIaWdoY2hhcnRzLCBBcGV4Q2hhcnRzIHdyYXBwZXIsIGV0Yy4pXG4gKiBhbmQgdGhlIGBSZXBvcnRDaGFydEJyaWRnZUNvbXBvbmVudGAgZGVsZWdhdGVzIHJlbmRlcmluZyB0byBpdCwgb3IgZmFsbHMgYmFjayB0byBidWlsdC1pbiBTVkcgY2hhcnRzLlxuICovXG5leHBvcnQgY29uc3QgQ0hBUlRfQ09NUE9ORU5UID0gbmV3IEluamVjdGlvblRva2VuPFR5cGU8dW5rbm93bj4+KCdDSEFSVF9DT01QT05FTlQnKTtcblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gZm9yIHRoZSByZXBvcnRpbmcgbGlicmFyeSBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgY29uc3QgUkVQT1JUSU5HX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxSZXBvcnRpbmdDb25maWc+KCdSRVBPUlRJTkdfQ09ORklHJyk7XG4iXX0=
@@ -0,0 +1,128 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ /**
3
+ * In-memory fallback implementation of ReportStorage.
4
+ * Safe for SSR, unit tests, and sandboxed iframes where localStorage access is denied.
5
+ */
6
+ export class MemoryReportStorage {
7
+ store = new Map();
8
+ getItem(key) {
9
+ return this.store.get(key) ?? null;
10
+ }
11
+ setItem(key, value) {
12
+ this.store.set(key, value);
13
+ }
14
+ removeItem(key) {
15
+ this.store.delete(key);
16
+ }
17
+ clear() {
18
+ this.store.clear();
19
+ }
20
+ key(index) {
21
+ const keys = Array.from(this.store.keys());
22
+ return keys[index] ?? null;
23
+ }
24
+ get length() {
25
+ return this.store.size;
26
+ }
27
+ }
28
+ /**
29
+ * Browser localStorage-backed implementation of ReportStorage
30
+ * with transparent in-memory fallback on DOMException or SSR.
31
+ */
32
+ export class BrowserReportStorage {
33
+ memory = new MemoryReportStorage();
34
+ isSupported;
35
+ constructor() {
36
+ this.isSupported = this.checkStorageSupport();
37
+ }
38
+ checkStorageSupport() {
39
+ if (typeof window === 'undefined')
40
+ return false;
41
+ try {
42
+ const probe = '__bways_storage_probe__';
43
+ window.localStorage.setItem(probe, probe);
44
+ window.localStorage.removeItem(probe);
45
+ return true;
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
51
+ getItem(key) {
52
+ if (this.isSupported) {
53
+ try {
54
+ return window.localStorage.getItem(key);
55
+ }
56
+ catch {
57
+ return this.memory.getItem(key);
58
+ }
59
+ }
60
+ return this.memory.getItem(key);
61
+ }
62
+ setItem(key, value) {
63
+ if (this.isSupported) {
64
+ try {
65
+ window.localStorage.setItem(key, value);
66
+ return;
67
+ }
68
+ catch {
69
+ // Fall back to in-memory on quota or security exceptions
70
+ }
71
+ }
72
+ this.memory.setItem(key, value);
73
+ }
74
+ removeItem(key) {
75
+ if (this.isSupported) {
76
+ try {
77
+ window.localStorage.removeItem(key);
78
+ }
79
+ catch {
80
+ // Ignore
81
+ }
82
+ }
83
+ this.memory.removeItem(key);
84
+ }
85
+ clear() {
86
+ if (this.isSupported) {
87
+ try {
88
+ window.localStorage.clear();
89
+ }
90
+ catch {
91
+ // Ignore
92
+ }
93
+ }
94
+ this.memory.clear();
95
+ }
96
+ key(index) {
97
+ if (this.isSupported) {
98
+ try {
99
+ return window.localStorage.key(index);
100
+ }
101
+ catch {
102
+ return this.memory.key(index);
103
+ }
104
+ }
105
+ return this.memory.key(index);
106
+ }
107
+ get length() {
108
+ if (this.isSupported) {
109
+ try {
110
+ return window.localStorage.length;
111
+ }
112
+ catch {
113
+ return this.memory.length;
114
+ }
115
+ }
116
+ return this.memory.length;
117
+ }
118
+ }
119
+ /**
120
+ * Injection token for the report storage engine.
121
+ * Defaults to `BrowserReportStorage`, which transparently falls back to
122
+ * `MemoryReportStorage` when browser localStorage is unavailable or restricted.
123
+ */
124
+ export const REPORT_STORAGE = new InjectionToken('REPORT_STORAGE', {
125
+ providedIn: 'root',
126
+ factory: () => new BrowserReportStorage(),
127
+ });
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS50b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2NvcmUvdG9rZW5zL3N0b3JhZ2UudG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWUvQzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sbUJBQW1CO0lBQ2IsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBRW5ELE9BQU8sQ0FBQyxHQUFXO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBVyxFQUFFLEtBQWE7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBVztRQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELEdBQUcsQ0FBQyxLQUFhO1FBQ2YsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ3pCLENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxNQUFNLEdBQUcs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LElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1lBQ3BDLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBZ0IsZ0JBQWdCLEVBQUU7SUFDaEYsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksb0JBQW9CLEVBQUU7Q0FDMUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBTdG9yYWdlIGNvbnRyYWN0IGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHJlcG9ydCBjb25maWd1cmF0aW9ucyxcbiAqIHByZXNldHMsIGFuZCBsYXlvdXQgc3RhdGVzIGFjcm9zcyBlbnZpcm9ubWVudHMgKEJyb3dzZXIsIFNTUiwgc2FuZGJveGVkIGlmcmFtZXMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydFN0b3JhZ2Uge1xuICBnZXRJdGVtKGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbDtcbiAgc2V0SXRlbShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQ7XG4gIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpOiB2b2lkO1xuICBjbGVhcigpOiB2b2lkO1xuICBrZXk/KGluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCBudWxsO1xuICByZWFkb25seSBsZW5ndGg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogSW4tbWVtb3J5IGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIG9mIFJlcG9ydFN0b3JhZ2UuXG4gKiBTYWZlIGZvciBTU1IsIHVuaXQgdGVzdHMsIGFuZCBzYW5kYm94ZWQgaWZyYW1lcyB3aGVyZSBsb2NhbFN0b3JhZ2UgYWNjZXNzIGlzIGRlbmllZC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1lbW9yeVJlcG9ydFN0b3JhZ2UgaW1wbGVtZW50cyBSZXBvcnRTdG9yYWdlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgZ2V0SXRlbShrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChrZXkpID8/IG51bGw7XG4gIH1cblxuICBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXQoa2V5LCB2YWx1ZSk7XG4gIH1cblxuICByZW1vdmVJdGVtKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5kZWxldGUoa2V5KTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuY2xlYXIoKTtcbiAgfVxuXG4gIGtleShpbmRleDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3Qga2V5cyA9IEFycmF5LmZyb20odGhpcy5zdG9yZS5rZXlzKCkpO1xuICAgIHJldHVybiBrZXlzW2luZGV4XSA/PyBudWxsO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLnNpemU7XG4gIH1cbn1cblxuLyoqXG4gKiBCcm93c2VyIGxvY2FsU3RvcmFnZS1iYWNrZWQgaW1wbGVtZW50YXRpb24gb2YgUmVwb3J0U3RvcmFnZVxuICogd2l0aCB0cmFuc3BhcmVudCBpbi1tZW1vcnkgZmFsbGJhY2sgb24gRE9NRXhjZXB0aW9uIG9yIFNTUi5cbiAqL1xuZXhwb3J0IGNsYXNzIEJyb3dzZXJSZXBvcnRTdG9yYWdlIGltcGxlbWVudHMgUmVwb3J0U3RvcmFnZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVtb3J5ID0gbmV3IE1lbW9yeVJlcG9ydFN0b3JhZ2UoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc1N1cHBvcnRlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlzU3VwcG9ydGVkID0gdGhpcy5jaGVja1N0b3JhZ2VTdXBwb3J0KCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrU3RvcmFnZVN1cHBvcnQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2JlID0gJ19fYndheXNfc3RvcmFnZV9wcm9iZV9fJztcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShwcm9iZSwgcHJvYmUpO1xuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHByb2JlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGdldEl0ZW0oa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodGhpcy5pc1N1cHBvcnRlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5nZXRJdGVtKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lbW9yeS5nZXRJdGVtKGtleSk7XG4gIH1cblxuICBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTdXBwb3J0ZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBpbi1tZW1vcnkgb24gcXVvdGEgb3Igc2VjdXJpdHkgZXhjZXB0aW9uc1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm1lbW9yeS5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgcmVtb3ZlSXRlbShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzU3VwcG9ydGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBJZ25vcmVcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5tZW1vcnkucmVtb3ZlSXRlbShrZXkpO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTdXBwb3J0ZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UuY2xlYXIoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBJZ25vcmVcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5tZW1vcnkuY2xlYXIoKTtcbiAgfVxuXG4gIGtleShpbmRleDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuaXNTdXBwb3J0ZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLmtleShpbmRleCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmtleShpbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lbW9yeS5rZXkoaW5kZXgpO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmlzU3VwcG9ydGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5sZW5ndGg7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5Lmxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWVtb3J5Lmxlbmd0aDtcbiAgfVxufVxuXG4vKipcbiAqIEluamVjdGlvbiB0b2tlbiBmb3IgdGhlIHJlcG9ydCBzdG9yYWdlIGVuZ2luZS5cbiAqIERlZmF1bHRzIHRvIGBCcm93c2VyUmVwb3J0U3RvcmFnZWAsIHdoaWNoIHRyYW5zcGFyZW50bHkgZmFsbHMgYmFjayB0b1xuICogYE1lbW9yeVJlcG9ydFN0b3JhZ2VgIHdoZW4gYnJvd3NlciBsb2NhbFN0b3JhZ2UgaXMgdW5hdmFpbGFibGUgb3IgcmVzdHJpY3RlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFUE9SVF9TVE9SQUdFID0gbmV3IEluamVjdGlvblRva2VuPFJlcG9ydFN0b3JhZ2U+KCdSRVBPUlRfU1RPUkFHRScsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiBuZXcgQnJvd3NlclJlcG9ydFN0b3JhZ2UoKSxcbn0pO1xuIl19
@@ -51,14 +51,25 @@ export function detectDefaultValueField(columns) {
51
51
  const exactMatch = columns.find((c) => ['id', 'key', 'code', 'guid', 'uuid'].includes(c.field.toLowerCase()));
52
52
  if (exactMatch)
53
53
  return exactMatch.field;
54
- // 2. Check columns ending with 'id' or 'code' or 'key'
54
+ // 2. Check columns ending with 'acno', 'glacno', 'account_no', 'accountno', '_id', 'id'
55
+ const primaryIdMatch = columns.find((c) => {
56
+ const f = c.field.toLowerCase();
57
+ return (f.endsWith('_acno') ||
58
+ f.endsWith('acno') ||
59
+ f.includes('glacno') ||
60
+ f.endsWith('_id') ||
61
+ f.endsWith('id'));
62
+ });
63
+ if (primaryIdMatch)
64
+ return primaryIdMatch.field;
65
+ // 3. Check columns ending with 'code' or 'key'
55
66
  const suffixMatch = columns.find((c) => {
56
67
  const f = c.field.toLowerCase();
57
- return f.endsWith('_id') || f.endsWith('id') || f.endsWith('_code') || f.endsWith('code');
68
+ return f.endsWith('_code') || f.endsWith('code') || f.endsWith('_key') || f.endsWith('key');
58
69
  });
59
70
  if (suffixMatch)
60
71
  return suffixMatch.field;
61
- // 3. Fallback to first column
72
+ // 4. Fallback to first column
62
73
  return columns[0]?.field;
63
74
  }
64
75
  /**
@@ -85,4 +96,4 @@ export function detectDefaultDisplayField(columns) {
85
96
  // 3. Fallback to second column or first column
86
97
  return columns.length > 1 ? columns[1].field : columns[0]?.field;
87
98
  }
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpZmllci1odW1hbml6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9jb3JlL3V0aWxzL2lkZW50aWZpZXItaHVtYW5pemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEdBQVc7SUFDNUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFL0MsaUNBQWlDO0lBQ2pDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUUzRCwrRUFBK0U7SUFDL0UsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sNEJBQTRCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDL0MsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELHlGQUF5RjtJQUN6RixJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM1QixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUVuQyx3R0FBd0c7SUFDeEcsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkQsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFdEQsc0ZBQXNGO0lBQ3RGLGtHQUFrRztJQUNsRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsMEJBQTBCO0lBQzFCLE9BQU8sSUFBSTtTQUNSLEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixNQUFNLENBQUMsT0FBTyxDQUFDO1NBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDaEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE9BQStCO0lBQ3JFLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFdkQscURBQXFEO0lBQ3JELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNwQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUN0RSxDQUFDO0lBQ0YsSUFBSSxVQUFVO1FBQUUsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBRXhDLHVEQUF1RDtJQUN2RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUYsQ0FBQyxDQUFDLENBQUM7SUFDSCxJQUFJLFdBQVc7UUFBRSxPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUM7SUFFMUMsOEJBQThCO0lBQzlCLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztBQUMzQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsT0FBK0I7SUFDdkUsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUV2RCxzRUFBc0U7SUFDdEUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsT0FBTyxDQUNMLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQ25CLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUNILElBQUksU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQztJQUV0Qyx5Q0FBeUM7SUFDekMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQztJQUNqRSxJQUFJLFdBQVc7UUFBRSxPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUM7SUFFMUMsK0NBQStDO0lBQy9DLE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7QUFDbkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eUNvbHVtbk1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3NjaGVtYS1kaXNjb3ZlcnkuY29udHJhY3QnO1xuXG4vKipcbiAqIFN0cmlwcyB0ZWNobmljYWwgU1FMIHByZWZpeGVzICh1c3BfLCBzcF8sIHRibF8sIHZ3XywgQCksIHJlbW92ZXMgc2NoZW1hIGlmIHByZXNlbnQsXG4gKiBhbmQgY29udmVydHMgc25ha2VfY2FzZSwgUGFzY2FsQ2FzZSwgb3IgY2FtZWxDYXNlIGludG8gY2xlYW4sIGh1bWFuLXJlYWRhYmxlIFRpdGxlIENhc2UuXG4gKlxuICogRXhhbXBsZXM6XG4gKiAtICdkYm8udXNwX0dldEN1c3RvbWVyTGlzdCcgLT4gJ0N1c3RvbWVyIExpc3QnXG4gKiAtICd1c3BfR2V0QnJhbmNoZXMnIC0+ICdCcmFuY2hlcydcbiAqIC0gJ0BCcmFuY2hJZCcgLT4gJ0JyYW5jaCdcbiAqIC0gJ0BBY3RpdmVPbmx5JyAtPiAnQWN0aXZlIE9ubHknXG4gKiAtICd0YmxfUHJvZHVjdHMnIC0+ICdQcm9kdWN0cydcbiAqIC0gJ2N1c3RvbWVyX25hbWVfZW4nIC0+ICdDdXN0b21lciBOYW1lIEVuJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaHVtYW5pemVJZGVudGlmaWVyKHJhdzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ3N0cmluZycpIHJldHVybiAnJztcblxuICAvLyAxLiBSZW1vdmUgc2NoZW1hIChlLmcuICdkYm8uJylcbiAgbGV0IHRleHQgPSByYXcuaW5jbHVkZXMoJy4nKSA/IHJhdy5zcGxpdCgnLicpLnBvcCgpISA6IHJhdztcblxuICAvLyAyLiBSZW1vdmUgbGVhZGluZyBALCBhbmQgcHJlZml4ZXMgbGlrZSBzcF8sIHVzcF8sIHRibF8sIHZ3XywgZ2V0XyByZXBlYXRlZGx5XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL15AKy8sICcnKTtcbiAgd2hpbGUgKC9eKHVzcF98c3BffHRibF98dndffGdldF8pL2kudGVzdCh0ZXh0KSkge1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL14odXNwX3xzcF98dGJsX3x2d198Z2V0XykvaSwgJycpO1xuICB9XG5cbiAgLy8gMy4gSWYgaXQgc3RhcnRzIHdpdGggJ0dldCcgZm9sbG93ZWQgYnkgdXBwZXJjYXNlIChlLmcuICdHZXRDdXN0b21lckxpc3QnKSwgc3RyaXAgJ0dldCdcbiAgaWYgKC9eZ2V0W0EtWl0vaS50ZXN0KHRleHQpKSB7XG4gICAgdGV4dCA9IHRleHQuc2xpY2UoMyk7XG4gIH1cblxuICAvLyA0LiBTcGxpdCBzbmFrZV9jYXNlIGFuZCBrZWJhYi1jYXNlXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1tfLV0rL2csICcgJyk7XG5cbiAgLy8gNS4gU3BsaXQgUGFzY2FsQ2FzZSBhbmQgY2FtZWxDYXNlIChlLmcuICdDdXN0b21lckxpc3QnIC0+ICdDdXN0b21lciBMaXN0JywgJ0JyYW5jaElkJyAtPiAnQnJhbmNoIElkJylcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxICQyJyk7XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyhbQS1aXSspKFtBLVpdW2Etel0pL2csICckMSAkMicpO1xuXG4gIC8vIDYuIENsZWFuIHVwIHRyYWlsaW5nICcgSWQnIGlmIGl0J3MgYSBwYXJhbWV0ZXIgbGFiZWwgKGUuZy4gJ0JyYW5jaCBJZCcgLT4gJ0JyYW5jaCcpXG4gIC8vIFdlIGtlZXAgaXQgbmF0dXJhbCBmb3IgcGFyYW1ldGVyczogJ0JyYW5jaCcgaXMgY2xlYXJlciB0aGFuICdCcmFuY2ggSWQnIGZvciBub24tdGVjaG5pY2FsIHVzZXJzXG4gIGlmICh0ZXh0LmVuZHNXaXRoKCcgSWQnKSAmJiB0ZXh0Lmxlbmd0aCA+IDMpIHtcbiAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCAtMyk7XG4gIH1cblxuICAvLyA3LiBUaXRsZS1jYXNlIGVhY2ggd29yZFxuICByZXR1cm4gdGV4dFxuICAgIC5zcGxpdCgnICcpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5tYXAoKHcpID0+IHcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3LnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBtb3N0IHByb2JhYmxlIGNvbHVtbiB0byB1c2UgYXMgdGhlIHZhbHVlL2tleSAoZS5nLiBJRCwgQ29kZSwgS2V5LCBHdWlkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdERlZmF1bHRWYWx1ZUZpZWxkKGNvbHVtbnM6IEVudGl0eUNvbHVtbk1ldGFkYXRhW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbHVtbnMgfHwgY29sdW1ucy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gMS4gQ2hlY2sgZXhhY3QgbWF0Y2hlcyBmb3IgJ2lkJyBvciAna2V5JyBvciAnY29kZSdcbiAgY29uc3QgZXhhY3RNYXRjaCA9IGNvbHVtbnMuZmluZCgoYykgPT5cbiAgICBbJ2lkJywgJ2tleScsICdjb2RlJywgJ2d1aWQnLCAndXVpZCddLmluY2x1ZGVzKGMuZmllbGQudG9Mb3dlckNhc2UoKSlcbiAgKTtcbiAgaWYgKGV4YWN0TWF0Y2gpIHJldHVybiBleGFjdE1hdGNoLmZpZWxkO1xuXG4gIC8vIDIuIENoZWNrIGNvbHVtbnMgZW5kaW5nIHdpdGggJ2lkJyBvciAnY29kZScgb3IgJ2tleSdcbiAgY29uc3Qgc3VmZml4TWF0Y2ggPSBjb2x1bW5zLmZpbmQoKGMpID0+IHtcbiAgICBjb25zdCBmID0gYy5maWVsZC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBmLmVuZHNXaXRoKCdfaWQnKSB8fCBmLmVuZHNXaXRoKCdpZCcpIHx8IGYuZW5kc1dpdGgoJ19jb2RlJykgfHwgZi5lbmRzV2l0aCgnY29kZScpO1xuICB9KTtcbiAgaWYgKHN1ZmZpeE1hdGNoKSByZXR1cm4gc3VmZml4TWF0Y2guZmllbGQ7XG5cbiAgLy8gMy4gRmFsbGJhY2sgdG8gZmlyc3QgY29sdW1uXG4gIHJldHVybiBjb2x1bW5zWzBdPy5maWVsZDtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBtb3N0IHByb2JhYmxlIGNvbHVtbiB0byB1c2UgYXMgdGhlIGRpc3BsYXkgdGV4dCAoZS5nLiBOYW1lLCBUaXRsZSwgTGFiZWwsIERlc2NyaXB0aW9uKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdERlZmF1bHREaXNwbGF5RmllbGQoY29sdW1uczogRW50aXR5Q29sdW1uTWV0YWRhdGFbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29sdW1ucyB8fCBjb2x1bW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyAxLiBMb29rIGZvciB0ZXh0IGZpZWxkcyBjb250YWluaW5nICduYW1lJywgJ3RpdGxlJywgJ2xhYmVsJywgJ2Rlc2MnXG4gIGNvbnN0IG5hbWVNYXRjaCA9IGNvbHVtbnMuZmluZCgoYykgPT4ge1xuICAgIGNvbnN0IGYgPSBjLmZpZWxkLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIGYuaW5jbHVkZXMoJ25hbWUnKSB8fFxuICAgICAgZi5pbmNsdWRlcygndGl0bGUnKSB8fFxuICAgICAgZi5pbmNsdWRlcygnbGFiZWwnKSB8fFxuICAgICAgZi5pbmNsdWRlcygnZGVzY3JpcHRpb24nKSB8fFxuICAgICAgZi5pbmNsdWRlcygnZGVzYycpXG4gICAgKTtcbiAgfSk7XG4gIGlmIChuYW1lTWF0Y2gpIHJldHVybiBuYW1lTWF0Y2guZmllbGQ7XG5cbiAgLy8gMi4gTG9vayBmb3IgYW55IHN0cmluZyBkYXRhVHlwZSBjb2x1bW5cbiAgY29uc3Qgc3RyaW5nTWF0Y2ggPSBjb2x1bW5zLmZpbmQoKGMpID0+IGMuZGF0YVR5cGUgPT09ICdzdHJpbmcnKTtcbiAgaWYgKHN0cmluZ01hdGNoKSByZXR1cm4gc3RyaW5nTWF0Y2guZmllbGQ7XG5cbiAgLy8gMy4gRmFsbGJhY2sgdG8gc2Vjb25kIGNvbHVtbiBvciBmaXJzdCBjb2x1bW5cbiAgcmV0dXJuIGNvbHVtbnMubGVuZ3RoID4gMSA/IGNvbHVtbnNbMV0uZmllbGQgOiBjb2x1bW5zWzBdPy5maWVsZDtcbn1cbiJdfQ==
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpZmllci1odW1hbml6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9jb3JlL3V0aWxzL2lkZW50aWZpZXItaHVtYW5pemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEdBQVc7SUFDNUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFL0MsaUNBQWlDO0lBQ2pDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUUzRCwrRUFBK0U7SUFDL0UsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sNEJBQTRCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDL0MsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELHlGQUF5RjtJQUN6RixJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM1QixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUVuQyx3R0FBd0c7SUFDeEcsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsb0JB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QUFPLFNBQVMsQ0FBQztJQUV2RCxzRUFBc0U7SUFDdEUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsT0FBTyxDQUNMLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQ25CLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUNILElBQUksU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQztJQUV0Qyx5Q0FBeUM7SUFDekMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQztJQUNqRSxJQUFJLFdBQVc7UUFBRSxPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUM7SUFFMUMsK0NBQStDO0lBQy9DLE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7QUFDbkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eUNvbHVtbk1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3NjaGVtYS1kaXNjb3ZlcnkuY29udHJhY3QnO1xuXG4vKipcbiAqIFN0cmlwcyB0ZWNobmljYWwgU1FMIHByZWZpeGVzICh1c3BfLCBzcF8sIHRibF8sIHZ3XywgQCksIHJlbW92ZXMgc2NoZW1hIGlmIHByZXNlbnQsXG4gKiBhbmQgY29udmVydHMgc25ha2VfY2FzZSwgUGFzY2FsQ2FzZSwgb3IgY2FtZWxDYXNlIGludG8gY2xlYW4sIGh1bWFuLXJlYWRhYmxlIFRpdGxlIENhc2UuXG4gKlxuICogRXhhbXBsZXM6XG4gKiAtICdkYm8udXNwX0dldEN1c3RvbWVyTGlzdCcgLT4gJ0N1c3RvbWVyIExpc3QnXG4gKiAtICd1c3BfR2V0QnJhbmNoZXMnIC0+ICdCcmFuY2hlcydcbiAqIC0gJ0BCcmFuY2hJZCcgLT4gJ0JyYW5jaCdcbiAqIC0gJ0BBY3RpdmVPbmx5JyAtPiAnQWN0aXZlIE9ubHknXG4gKiAtICd0YmxfUHJvZHVjdHMnIC0+ICdQcm9kdWN0cydcbiAqIC0gJ2N1c3RvbWVyX25hbWVfZW4nIC0+ICdDdXN0b21lciBOYW1lIEVuJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaHVtYW5pemVJZGVudGlmaWVyKHJhdzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ3N0cmluZycpIHJldHVybiAnJztcblxuICAvLyAxLiBSZW1vdmUgc2NoZW1hIChlLmcuICdkYm8uJylcbiAgbGV0IHRleHQgPSByYXcuaW5jbHVkZXMoJy4nKSA/IHJhdy5zcGxpdCgnLicpLnBvcCgpISA6IHJhdztcblxuICAvLyAyLiBSZW1vdmUgbGVhZGluZyBALCBhbmQgcHJlZml4ZXMgbGlrZSBzcF8sIHVzcF8sIHRibF8sIHZ3XywgZ2V0XyByZXBlYXRlZGx5XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL15AKy8sICcnKTtcbiAgd2hpbGUgKC9eKHVzcF98c3BffHRibF98dndffGdldF8pL2kudGVzdCh0ZXh0KSkge1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL14odXNwX3xzcF98dGJsX3x2d198Z2V0XykvaSwgJycpO1xuICB9XG5cbiAgLy8gMy4gSWYgaXQgc3RhcnRzIHdpdGggJ0dldCcgZm9sbG93ZWQgYnkgdXBwZXJjYXNlIChlLmcuICdHZXRDdXN0b21lckxpc3QnKSwgc3RyaXAgJ0dldCdcbiAgaWYgKC9eZ2V0W0EtWl0vaS50ZXN0KHRleHQpKSB7XG4gICAgdGV4dCA9IHRleHQuc2xpY2UoMyk7XG4gIH1cblxuICAvLyA0LiBTcGxpdCBzbmFrZV9jYXNlIGFuZCBrZWJhYi1jYXNlXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1tfLV0rL2csICcgJyk7XG5cbiAgLy8gNS4gU3BsaXQgUGFzY2FsQ2FzZSBhbmQgY2FtZWxDYXNlIChlLmcuICdDdXN0b21lckxpc3QnIC0+ICdDdXN0b21lciBMaXN0JywgJ0JyYW5jaElkJyAtPiAnQnJhbmNoIElkJylcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxICQyJyk7XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyhbQS1aXSspKFtBLVpdW2Etel0pL2csICckMSAkMicpO1xuXG4gIC8vIDYuIENsZWFuIHVwIHRyYWlsaW5nICcgSWQnIGlmIGl0J3MgYSBwYXJhbWV0ZXIgbGFiZWwgKGUuZy4gJ0JyYW5jaCBJZCcgLT4gJ0JyYW5jaCcpXG4gIC8vIFdlIGtlZXAgaXQgbmF0dXJhbCBmb3IgcGFyYW1ldGVyczogJ0JyYW5jaCcgaXMgY2xlYXJlciB0aGFuICdCcmFuY2ggSWQnIGZvciBub24tdGVjaG5pY2FsIHVzZXJzXG4gIGlmICh0ZXh0LmVuZHNXaXRoKCcgSWQnKSAmJiB0ZXh0Lmxlbmd0aCA+IDMpIHtcbiAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCAtMyk7XG4gIH1cblxuICAvLyA3LiBUaXRsZS1jYXNlIGVhY2ggd29yZFxuICByZXR1cm4gdGV4dFxuICAgIC5zcGxpdCgnICcpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5tYXAoKHcpID0+IHcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3LnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBtb3N0IHByb2JhYmxlIGNvbHVtbiB0byB1c2UgYXMgdGhlIHZhbHVlL2tleSAoZS5nLiBJRCwgQ29kZSwgS2V5LCBHdWlkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdERlZmF1bHRWYWx1ZUZpZWxkKGNvbHVtbnM6IEVudGl0eUNvbHVtbk1ldGFkYXRhW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbHVtbnMgfHwgY29sdW1ucy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gMS4gQ2hlY2sgZXhhY3QgbWF0Y2hlcyBmb3IgJ2lkJyBvciAna2V5JyBvciAnY29kZSdcbiAgY29uc3QgZXhhY3RNYXRjaCA9IGNvbHVtbnMuZmluZCgoYykgPT5cbiAgICBbJ2lkJywgJ2tleScsICdjb2RlJywgJ2d1aWQnLCAndXVpZCddLmluY2x1ZGVzKGMuZmllbGQudG9Mb3dlckNhc2UoKSlcbiAgKTtcbiAgaWYgKGV4YWN0TWF0Y2gpIHJldHVybiBleGFjdE1hdGNoLmZpZWxkO1xuXG4gIC8vIDIuIENoZWNrIGNvbHVtbnMgZW5kaW5nIHdpdGggJ2Fjbm8nLCAnZ2xhY25vJywgJ2FjY291bnRfbm8nLCAnYWNjb3VudG5vJywgJ19pZCcsICdpZCdcbiAgY29uc3QgcHJpbWFyeUlkTWF0Y2ggPSBjb2x1bW5zLmZpbmQoKGMpID0+IHtcbiAgICBjb25zdCBmID0gYy5maWVsZC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiAoXG4gICAgICBmLmVuZHNXaXRoKCdfYWNubycpIHx8XG4gICAgICBmLmVuZHNXaXRoKCdhY25vJykgfHxcbiAgICAgIGYuaW5jbHVkZXMoJ2dsYWNubycpIHx8XG4gICAgICBmLmVuZHNXaXRoKCdfaWQnKSB8fFxuICAgICAgZi5lbmRzV2l0aCgnaWQnKVxuICAgICk7XG4gIH0pO1xuICBpZiAocHJpbWFyeUlkTWF0Y2gpIHJldHVybiBwcmltYXJ5SWRNYXRjaC5maWVsZDtcblxuICAvLyAzLiBDaGVjayBjb2x1bW5zIGVuZGluZyB3aXRoICdjb2RlJyBvciAna2V5J1xuICBjb25zdCBzdWZmaXhNYXRjaCA9IGNvbHVtbnMuZmluZCgoYykgPT4ge1xuICAgIGNvbnN0IGYgPSBjLmZpZWxkLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIGYuZW5kc1dpdGgoJ19jb2RlJykgfHwgZi5lbmRzV2l0aCgnY29kZScpIHx8IGYuZW5kc1dpdGgoJ19rZXknKSB8fCBmLmVuZHNXaXRoKCdrZXknKTtcbiAgfSk7XG4gIGlmIChzdWZmaXhNYXRjaCkgcmV0dXJuIHN1ZmZpeE1hdGNoLmZpZWxkO1xuXG4gIC8vIDQuIEZhbGxiYWNrIHRvIGZpcnN0IGNvbHVtblxuICByZXR1cm4gY29sdW1uc1swXT8uZmllbGQ7XG59XG5cbi8qKlxuICogRGV0ZWN0cyB0aGUgbW9zdCBwcm9iYWJsZSBjb2x1bW4gdG8gdXNlIGFzIHRoZSBkaXNwbGF5IHRleHQgKGUuZy4gTmFtZSwgVGl0bGUsIExhYmVsLCBEZXNjcmlwdGlvbikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3REZWZhdWx0RGlzcGxheUZpZWxkKGNvbHVtbnM6IEVudGl0eUNvbHVtbk1ldGFkYXRhW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbHVtbnMgfHwgY29sdW1ucy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gMS4gTG9vayBmb3IgdGV4dCBmaWVsZHMgY29udGFpbmluZyAnbmFtZScsICd0aXRsZScsICdsYWJlbCcsICdkZXNjJ1xuICBjb25zdCBuYW1lTWF0Y2ggPSBjb2x1bW5zLmZpbmQoKGMpID0+IHtcbiAgICBjb25zdCBmID0gYy5maWVsZC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiAoXG4gICAgICBmLmluY2x1ZGVzKCduYW1lJykgfHxcbiAgICAgIGYuaW5jbHVkZXMoJ3RpdGxlJykgfHxcbiAgICAgIGYuaW5jbHVkZXMoJ2xhYmVsJykgfHxcbiAgICAgIGYuaW5jbHVkZXMoJ2Rlc2NyaXB0aW9uJykgfHxcbiAgICAgIGYuaW5jbHVkZXMoJ2Rlc2MnKVxuICAgICk7XG4gIH0pO1xuICBpZiAobmFtZU1hdGNoKSByZXR1cm4gbmFtZU1hdGNoLmZpZWxkO1xuXG4gIC8vIDIuIExvb2sgZm9yIGFueSBzdHJpbmcgZGF0YVR5cGUgY29sdW1uXG4gIGNvbnN0IHN0cmluZ01hdGNoID0gY29sdW1ucy5maW5kKChjKSA9PiBjLmRhdGFUeXBlID09PSAnc3RyaW5nJyk7XG4gIGlmIChzdHJpbmdNYXRjaCkgcmV0dXJuIHN0cmluZ01hdGNoLmZpZWxkO1xuXG4gIC8vIDMuIEZhbGxiYWNrIHRvIHNlY29uZCBjb2x1bW4gb3IgZmlyc3QgY29sdW1uXG4gIHJldHVybiBjb2x1bW5zLmxlbmd0aCA+IDEgPyBjb2x1bW5zWzFdLmZpZWxkIDogY29sdW1uc1swXT8uZmllbGQ7XG59XG4iXX0=