@firestitch/report 18.0.16 → 18.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (19) hide show
  1. package/app/reports/data/report.data.d.ts +1 -0
  2. package/app/reports/dialogs/entity-functions/entity-functions.component.d.ts +3 -2
  3. package/app/reports/dialogs/global-settings/components/semantic-database/semantic-database.component.d.ts +32 -10
  4. package/app/reports/interfaces/report.interface.d.ts +18 -2
  5. package/app/reports/views/reports/fs-ai-reports.component.d.ts +2 -1
  6. package/esm2022/app/reports/data/report.data.mjs +11 -1
  7. package/esm2022/app/reports/dialogs/entity-functions/entity-functions.component.mjs +16 -8
  8. package/esm2022/app/reports/dialogs/global-settings/components/semantic-database/semantic-database.component.mjs +94 -35
  9. package/esm2022/app/reports/export/report-pdf.service.mjs +5 -4
  10. package/esm2022/app/reports/export/report-pptx.service.mjs +5 -4
  11. package/esm2022/app/reports/interfaces/report.interface.mjs +8 -1
  12. package/esm2022/app/reports/views/reports/fs-ai-reports.component.mjs +34 -3
  13. package/fesm2022/{firestitch-report-echarts-CO50nSof.mjs → firestitch-report-echarts-CMOBB-Er.mjs} +2 -2
  14. package/fesm2022/{firestitch-report-echarts-CO50nSof.mjs.map → firestitch-report-echarts-CMOBB-Er.mjs.map} +1 -1
  15. package/fesm2022/{firestitch-report-firestitch-report-DlxhJJhU.mjs → firestitch-report-firestitch-report-DwgbMhwr.mjs} +172 -56
  16. package/fesm2022/firestitch-report-firestitch-report-DwgbMhwr.mjs.map +1 -0
  17. package/fesm2022/firestitch-report.mjs +1 -1
  18. package/package.json +1 -1
  19. package/fesm2022/firestitch-report-firestitch-report-DlxhJJhU.mjs.map +0 -1
@@ -13,6 +13,7 @@ export declare class ReportData<T = any> {
13
13
  addPage(reportId: number, config?: RequestConfig): Observable<T>;
14
14
  updateComponent(reportId: number, componentId: number, settings: Record<string, unknown>, config?: RequestConfig): Observable<T>;
15
15
  delete(reportId: number, config?: RequestConfig): Observable<T>;
16
+ undelete(reportId: number, config?: RequestConfig): Observable<T>;
16
17
  get(reportId: number, config?: RequestConfig): Observable<T>;
17
18
  savePositions(reportId: number, positions: ({
18
19
  componentId: number;
@@ -1,12 +1,13 @@
1
- import { SemanticEntityFunction, SemanticEntityFunctions } from '../../interfaces/report.interface';
1
+ import { SemanticEntityFunction, SemanticEntityFunctions, SemanticFunctionSource } from '../../interfaces/report.interface';
2
2
  import * as i0 from "@angular/core";
3
3
  export interface EntityFunctionsDialogData {
4
4
  entityKey: string;
5
- source: 'model' | 'handler';
5
+ source: SemanticFunctionSource;
6
6
  }
7
7
  export declare class EntityFunctionsComponent {
8
8
  private static readonly KIND_COLORS;
9
9
  private static readonly KIND_ORDER;
10
+ private static readonly SOURCE_LABELS;
10
11
  private readonly _data;
11
12
  readonly entityKey: string;
12
13
  readonly sourceLabel: string;
@@ -1,19 +1,28 @@
1
- import { SemanticBuildEntity, SemanticBuildStage, SemanticBuildStatus, SemanticBuildTable } from '../../../../interfaces/report.interface';
1
+ import { SemanticBuildEntity, SemanticBuildStatus, SemanticBuildTable, SemanticFunctionSource } from '../../../../interfaces/report.interface';
2
2
  import * as i0 from "@angular/core";
3
+ interface SemanticUnitView {
4
+ key: string;
5
+ name: string;
6
+ hasTable: boolean;
7
+ entity: SemanticBuildEntity | null;
8
+ model: string | null;
9
+ functionCount: number;
10
+ }
3
11
  export declare class SemanticDatabaseComponent {
4
12
  private static readonly ACTIVE_STATES;
5
13
  private static readonly STATE_LABELS;
6
- private static readonly DONE_COLOR;
7
14
  private static readonly PENDING_COLOR;
8
- readonly stageKeys: string[];
9
- readonly stageLabels: Record<string, string>;
15
+ private static readonly NAME_SUFFIX;
10
16
  readonly status: import("@angular/core").WritableSignal<SemanticBuildStatus>;
17
+ readonly filter: import("@angular/core").WritableSignal<string>;
11
18
  readonly building: import("@angular/core").WritableSignal<boolean>;
12
19
  readonly buildActive: import("@angular/core").Signal<boolean>;
13
20
  readonly buildStateLabel: import("@angular/core").Signal<string>;
14
21
  readonly hasCatalog: import("@angular/core").Signal<boolean>;
15
22
  readonly excludedTables: import("@angular/core").Signal<SemanticBuildTable[]>;
16
23
  readonly unlinkedJunctions: import("@angular/core").Signal<SemanticBuildTable[]>;
24
+ readonly units: import("@angular/core").Signal<SemanticUnitView[]>;
25
+ readonly filteredUnits: import("@angular/core").Signal<SemanticUnitView[]>;
17
26
  readonly coverage: import("@angular/core").Signal<string>;
18
27
  private readonly _tables;
19
28
  private _buildFinalized;
@@ -51,16 +60,29 @@ export declare class SemanticDatabaseComponent {
51
60
  * confirms success.
52
61
  */
53
62
  private _announceOutcome;
54
- stageColor(stage: SemanticBuildStage): string;
55
- stageTooltip(stage: SemanticBuildStage): string;
63
+ pendingColor(): string;
64
+ /**
65
+ * The build stages this row is still owed, or [] when it is fully built. A
66
+ * stopped or interrupted build is the only way to get a non-empty list.
67
+ */
68
+ pendingStages(unit: SemanticUnitView): string[];
69
+ setFilter(value: string): void;
56
70
  /**
57
- * Open the child dialog listing one group of an entity's cached functions —
58
- * the model class's or the handler class's. The dialog fetches fresh on open,
59
- * so the tab never holds function payloads.
71
+ * Open the child dialog listing one group of a unit's cached functions — an
72
+ * entity's model or handler class, or a standalone class's code. The dialog
73
+ * fetches fresh on open, so the tab never holds function payloads.
60
74
  */
61
- openFunctions(entity: SemanticBuildEntity, source: 'model' | 'handler'): void;
75
+ openFunctions(unit: SemanticUnitView, source: SemanticFunctionSource): void;
62
76
  private _init;
77
+ /**
78
+ * What a reader recognizes the unit by: its class's short name, minus the
79
+ * `Model` suffix that every model carries and none of them are distinguished
80
+ * by. Falls back to the cache key for a unit whose class could not be
81
+ * resolved, so a row never renders nameless.
82
+ */
83
+ private _displayName;
63
84
  private _refreshStatus;
64
85
  static ɵfac: i0.ɵɵFactoryDeclaration<SemanticDatabaseComponent, never>;
65
86
  static ɵcmp: i0.ɵɵComponentDeclaration<SemanticDatabaseComponent, "fs-ai-report-global-settings-semantic-database", never, {}, {}, never, never, true, never>;
66
87
  }
88
+ export {};
@@ -90,7 +90,8 @@ export interface ListConfig {
90
90
  columns?: {
91
91
  column: string;
92
92
  label?: string;
93
- format?: 'date' | 'number';
93
+ format?: 'date';
94
+ sortColumn?: string;
94
95
  }[];
95
96
  sort?: ReportSort;
96
97
  pageSize?: number;
@@ -174,6 +175,11 @@ export interface ReportListItem {
174
175
  id: number;
175
176
  name: string;
176
177
  modifyDate: string;
178
+ state?: ReportState;
179
+ }
180
+ export declare enum ReportState {
181
+ Active = "active",
182
+ Deleted = "deleted"
177
183
  }
178
184
  export interface ReportChatResponse {
179
185
  reportChanged?: boolean;
@@ -210,6 +216,8 @@ export interface SemanticBuildEnum {
210
216
  export interface SemanticBuildEntity {
211
217
  key: string;
212
218
  table: string;
219
+ model: string | null;
220
+ handler: string | null;
213
221
  columns: number;
214
222
  relationships: number;
215
223
  enums: SemanticBuildEnum[];
@@ -219,6 +227,11 @@ export interface SemanticBuildEntity {
219
227
  handlerFunctionCount: number;
220
228
  stages: Record<string, SemanticBuildStage>;
221
229
  }
230
+ export interface SemanticBuildClass {
231
+ key: string;
232
+ model: string | null;
233
+ functionCount: number;
234
+ }
222
235
  export type SemanticTableClassification = 'entity' | 'junction' | 'excluded';
223
236
  export interface SemanticBuildTable {
224
237
  table: string;
@@ -229,14 +242,17 @@ export interface SemanticBuildTable {
229
242
  export interface SemanticBuildDetail {
230
243
  generatedAt: Date | null;
231
244
  entityCount: number;
245
+ classCount: number;
232
246
  functionCount: number;
233
247
  entities: SemanticBuildEntity[];
248
+ classes: SemanticBuildClass[];
234
249
  tableCount: number;
235
250
  junctionCount: number;
236
251
  unlinkedJunctionCount: number;
237
252
  excludedCount: number;
238
253
  tables: SemanticBuildTable[];
239
254
  }
255
+ export type SemanticFunctionSource = 'model' | 'handler' | 'class';
240
256
  export interface SemanticEntityFunction {
241
257
  class: string;
242
258
  method: string;
@@ -244,7 +260,7 @@ export interface SemanticEntityFunction {
244
260
  kind: string;
245
261
  summary: string;
246
262
  produces: string;
247
- source: 'model' | 'handler';
263
+ source: SemanticFunctionSource;
248
264
  }
249
265
  export interface SemanticEntityFunctions {
250
266
  entity: string;
@@ -1,5 +1,5 @@
1
1
  import { FsListComponent, FsListConfig } from '@firestitch/list';
2
- import { ReportListItem } from '../../interfaces/report.interface';
2
+ import { ReportListItem, ReportState } from '../../interfaces/report.interface';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class FsAiReportsComponent {
5
5
  readonly basePath: import("@angular/core").InputSignal<string>;
@@ -7,6 +7,7 @@ export declare class FsAiReportsComponent {
7
7
  readonly createPattern: import("@angular/core").InputSignal<string>;
8
8
  list: FsListComponent;
9
9
  listConfig: FsListConfig<ReportListItem>;
10
+ readonly deletedState = ReportState.Deleted;
10
11
  private _reportData;
11
12
  private _router;
12
13
  private _route;
@@ -56,12 +56,22 @@ export class ReportData {
56
56
  ...config,
57
57
  });
58
58
  }
59
+ // Soft-delete: the report leaves the listing but keeps its pages and
60
+ // components, so undelete() brings back the same document.
59
61
  delete(reportId, config = {}) {
60
62
  return this._api.delete(this._path(`${reportId}`), {}, {
61
63
  key: 'report',
62
64
  ...config,
63
65
  });
64
66
  }
67
+ // Restore a soft-deleted report through its own action endpoint — the report
68
+ // PUT does not accept `state`.
69
+ undelete(reportId, config = {}) {
70
+ return this._api.post(this._path(`${reportId}/undelete`), {}, {
71
+ key: 'report',
72
+ ...config,
73
+ });
74
+ }
65
75
  // The assembled structure: pages → components (+ their filters) and the
66
76
  // report's filter groups.
67
77
  get(reportId, config = {}) {
@@ -218,4 +228,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
218
228
  providedIn: 'root',
219
229
  }]
220
230
  }] });
221
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGF0YS9yZXBvcnQuZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsS0FBSyxFQUFpQixNQUFNLGlCQUFpQixDQUFDOztBQVl2RCwyRUFBMkU7QUFDM0UsOEVBQThFO0FBQzlFLHFGQUFxRjtBQUlyRixNQUFNLE9BQU8sVUFBVTtJQUNiLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFN0IsNkVBQTZFO0lBQzdFLDhFQUE4RTtJQUN2RSxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBRTVCLGtGQUFrRjtJQUNsRixrREFBa0Q7SUFDMUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFO1FBQ3ZCLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDL0QsQ0FBQztJQUVNLE9BQU8sQ0FBQyxRQUFhLEVBQUUsRUFBRSxTQUF3QixFQUFFO1FBQ3hELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFDWixLQUFLLEVBQ0w7WUFDRSxHQUFHLEVBQUUsU0FBUztZQUNkLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTSxNQUFNLENBQUMsSUFBWSxFQUFFLFNBQXdCLEVBQUU7UUFDcEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDbkIsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUNaLEVBQUUsSUFBSSxFQUFFLEVBQ1I7WUFDRSxHQUFHLEVBQUUsUUFBUTtZQUNiLEdBQUcsTUFBTTtTQUNWLENB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QUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxpQkFBaUIsT0FBTyxFQUFFLENBQUMsRUFDakQsT0FBTyxFQUNQO1lBQ0UsR0FBRyxFQUFFLGFBQWE7WUFDbEIsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQzt3R0FyWFUsVUFBVTs0R0FBVixVQUFVLGNBRlQsTUFBTTs7NEZBRVAsVUFBVTtrQkFIdEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRnNBcGksIFJlcXVlc3RDb25maWcgfSBmcm9tICdAZmlyZXN0aXRjaC9hcGknO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgRmlsdGVyR3JvdXBEZWZhdWx0LFxuICBSZXBvcnRGaWx0ZXJMZXZlbCxcbiAgUmVzb2x2ZWRGaWx0ZXJWYWx1ZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcblxuXG4vLyBBUEkgZ2F0ZXdheSBmb3IgdGhlIFJlcG9ydHMgbW9kdWxlLiBFdmVyeSBlbmRwb2ludCBoYW5ncyBvZmYgW2Jhc2VQYXRoXSxcbi8vIHdoaWNoIGRlZmF1bHRzIHRvIFwicmVwb3J0c1wiICh0aGUgZnJhbWV3b3JrIHJlcG9ydHMgYmFja2VuZCBhdCAvYXBpL3JlcG9ydHMpXG4vLyBhbmQgY2FuIGJlIHJlcG9pbnRlZCBieSB0aGUgaG9zdCBzbyB0aGUgcGFja2FnZSBzdGF5cyBzZWxmLWNvbnRhaW5lZCBhbmQgcG9ydGFibGUuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUmVwb3J0RGF0YTxUID0gYW55PiB7XG4gIHByaXZhdGUgX2FwaSA9IGluamVjdChGc0FwaSk7XG5cbiAgLy8gVGhlIEFQSSByb290IGZvciBldmVyeSByZXBvcnRzIGVuZHBvaW50LiBEZWZhdWx0cyB0byB0aGUgZnJhbWV3b3JrIHJlcG9ydHNcbiAgLy8gY29udGV4dDsgc2V0IGl0IG9uY2UgKGUuZy4gZnJvbSB0aGUgaG9zdCdzIHJlcG9ydCBwYWdlKSB0byBtb3VudCBlbHNld2hlcmUuXG4gIHB1YmxpYyBiYXNlUGF0aCA9ICdyZXBvcnRzJztcblxuICAvLyBCdWlsZCBhbiBlbmRwb2ludCBwYXRoIHVuZGVyIHRoZSBjb25maWd1cmVkIGJhc2UsIGUuZy4gX3BhdGgoKSA9PiBcImFpL3JlcG9ydHNcIixcbiAgLy8gX3BhdGgoYCR7aWR9L3BhZ2VzYCkgPT4gXCJhaS9yZXBvcnRzLzEyMy9wYWdlc1wiLlxuICBwcml2YXRlIF9wYXRoKHN1ZmZpeCA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VmZml4ID8gYCR7dGhpcy5iYXNlUGF0aH0vJHtzdWZmaXh9YCA6IHRoaXMuYmFzZVBhdGg7XG4gIH1cblxuICBwdWJsaWMgcmVwb3J0cyhxdWVyeTogYW55ID0ge30sIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKCksXG4gICAgICBxdWVyeSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0cycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUobmFtZTogc3RyaW5nLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoKSxcbiAgICAgIHsgbmFtZSB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lKHJlcG9ydElkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9YCksXG4gICAgICB7IG5hbWUgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVwb3J0IHNldHRpbmdzOiBhbnkgc3Vic2V0IG9mIHsgbmFtZSwgcGFnZVNpemUsIHBhZ2VPcmllbnRhdGlvbiwgbGF5b3V0LFxuICAvLyBzdHlsZXMgfSDigJQgc3R5bGVzIGNhcnJ5IHRoZSByZXBvcnQncyB0eXBvZ3JhcGhpYyBjb25maWcgKGUuZy4gaGVhZGluZyBzaXplKS5cbiAgcHVibGljIHVwZGF0ZShyZXBvcnRJZDogbnVtYmVyLCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAgc2V0dGluZ3MsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFwcGVuZCBhIGJsYW5rIHBhZ2UgdG8gdGhlIHJlcG9ydDsgcmVzb2x2ZXMgdG8gdGhlIG5ldyBwYWdlLlxuICBwdWJsaWMgYWRkUGFnZShyZXBvcnRJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3BhZ2VzYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncGFnZScsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIENvbXBvbmVudCBzZXR0aW5nczogYW55IHN1YnNldCBvZiB7IHRpdGxlLCBwYWRkaW5nIH0g4oCUIHRoZSBodW1hbi1mYWNpbmdcbiAgLy8gZGlhbG9nIGVkaXRzOyBnZW9tZXRyeSAoeC95L3cvaC9mbG93V2lkdGgpIGlzIHBlcnNpc3RlZCB2aWEgc2F2ZVBvc2l0aW9uc1xuICAvLyBmcm9tIHRoZSBjYW52YXMgaW5zdGVhZC5cbiAgcHVibGljIHVwZGF0ZUNvbXBvbmVudChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vc2V0dGluZ3NgKSxcbiAgICAgIHNldHRpbmdzLFxuICAgICAge1xuICAgICAgICBrZXk6ICdjb21wb25lbnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlKHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5kZWxldGUoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBhc3NlbWJsZWQgc3RydWN0dXJlOiBwYWdlcyDihpIgY29tcG9uZW50cyAoKyB0aGVpciBmaWx0ZXJzKSBhbmQgdGhlXG4gIC8vIHJlcG9ydCdzIGZpbHRlciBncm91cHMuXG4gIHB1YmxpYyBnZXQocmVwb3J0SWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9YCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUGVyc2lzdCBnZW9tZXRyeSBmb3IgdGhlIG1vdmVkIGNvbXBvbmVudHMgb25seSDigJQgYW55IHN1YnNldCBvZlxuICAvLyB7IHgsIHksIHcsIGggfSAoaW5jaGVzKSwgZmxvd1dpZHRoIChwZXJjZW50KSBhbmQgb3JkZXIgKGZsb3cgcG9zaXRpb24pLlxuICBwdWJsaWMgc2F2ZVBvc2l0aW9ucyhcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIHBvc2l0aW9uczogKHsgY29tcG9uZW50SWQ6IG51bWJlciB9ICYgUGFydGlhbDx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlcjsgZmxvd1dpZHRoOiBudW1iZXI7IG9yZGVyOiBudW1iZXIgfT4pW10sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy9wb3NpdGlvbnNgKSxcbiAgICAgIHsgcG9zaXRpb25zIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gT25lIGNvbXBvbmVudCdzIGRhdGEuIFRoZSBib2R5IGNhcnJpZXMgZXZlcnl0aGluZyBzZXNzaW9uLXNjb3BlZDogdGhlXG4gIC8vIHJlc29sdmVkIGZpbHRlciB2YWx1ZXMgYW5kIHRoZSBjb21wb25lbnQncyBvd24gaW50ZXJhY3Rpb24gc3RhdGUuXG4gIHB1YmxpYyBjb21wb25lbnREYXRhKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgY29tcG9uZW50SWQ6IG51bWJlcixcbiAgICBmaWx0ZXJzOiBSZXNvbHZlZEZpbHRlclZhbHVlW10gPSBbXSxcbiAgICBzdGF0ZTogQ29tcG9uZW50RGF0YVN0YXRlID0ge30sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vZGF0YWApLFxuICAgICAgeyBmaWx0ZXJzLCBzdGF0ZSB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdkYXRhJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gRXhwb3J0cyB0aGUgY29tcG9uZW50J3MgRlVMTCBmaWx0ZXJlZCBkYXRhc2V0IHRvIENTViBzZXJ2ZXItc2lkZSBhbmRcbiAgLy8gcmVzb2x2ZXMgdG8gYSBwcmVzaWduZWQgZG93bmxvYWQgVVJMLiBUaGUgYmFja2VuZCBzdHJlYW1zIHBlcmNlbnRhZ2VcbiAgLy8gcHJvZ3Jlc3Mgd2hpbGUgY2h1bmtpbmc7IGNvbnN1bWUgdGhyb3VnaCBGc1Byb2Nlc3MuZG93bmxvYWQuXG4gIHB1YmxpYyBleHBvcnRDb21wb25lbnQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcnM6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdLFxuICAgIHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSB7fSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9leHBvcnRgKSxcbiAgICAgIHsgZmlsdGVycywgc3RhdGUgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAndXJsJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gRGlzdGluY3Qgb3B0aW9ucyBmb3IgYSBzZWxlY3QgZmlsdGVyIChkcml2ZXMgbXVsdGlzZWxlY3QgY29udHJvbHMpLlxuICBwdWJsaWMgZmlsdGVyT3B0aW9ucyhyZXBvcnRJZDogbnVtYmVyLCBmaWx0ZXJJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZmlsdGVycy8ke2ZpbHRlcklkfS9vcHRpb25zYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnb3B0aW9ucycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBjb21wb25lbnQgU1FMJ3MgZmlsdGVyYWJsZSBvdXRwdXQgY29sdW1ucyDigJQgZHJpdmVzIHRoZSBjb2x1bW4gcGlja2VyXG4gIC8vIGluIHRoZSBmaWx0ZXIgVUkgc28gYSBjb2x1bW4gbmFtZSBpcyBuZXZlciB0eXBlZCBieSBoYW5kLlxuICBwdWJsaWMgY29tcG9uZW50Q29sdW1ucyhyZXBvcnRJZDogbnVtYmVyLCBjb21wb25lbnRJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9jb2x1bW5zYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnY29sdW1ucycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIE1ha2Ugb25lIGNvbHVtbiBmaWx0ZXJhYmxlLiBgbGV2ZWxgIChjb21wb25lbnQgfCByZXBvcnQpIHBsYWNlcyBhIG5ld1xuICAvLyBncm91cDsgYGdyb3VwSWRgIGluc3RlYWQgbGlua3MgaW50byBhbiBleGlzdGluZyBncm91cC4gQSBzZWxlY3QgZmlsdGVyJ3NcbiAgLy8gb3B0aW9ucyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBjb21wb25lbnQgU1FMIHdoZW4gb3B0aW9uc1NxbCBpcyBvbWl0dGVkLlxuICBwdWJsaWMgYWRkRmlsdGVyKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgY29tcG9uZW50SWQ6IG51bWJlcixcbiAgICBmaWx0ZXI6IHsgZmlsdGVyQ29sdW1uOiBzdHJpbmc7IHR5cGU/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nOyBsZXZlbD86IHN0cmluZzsgb3B0aW9uc1NxbD86IHN0cmluZzsgZ3JvdXBJZD86IG51bWJlciB9LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L2ZpbHRlcnNgKSxcbiAgICAgIGZpbHRlcixcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZmlsdGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVXBkYXRlIGEgZmlsdGVyIOKAlCBhbnkgc3Vic2V0IG9mIHsgbGFiZWwsIG9wdGlvbnNTcWwsIGVuYWJsZWQgfS5cbiAgcHVibGljIHVwZGF0ZUZpbHRlcihcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcklkOiBudW1iZXIsXG4gICAgY2hhbmdlczogeyBsYWJlbD86IHN0cmluZzsgb3B0aW9uc1NxbD86IHN0cmluZzsgZW5hYmxlZD86IGJvb2xlYW4gfSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9maWx0ZXJzLyR7ZmlsdGVySWR9YCksXG4gICAgICBjaGFuZ2VzLFxuICAgICAge1xuICAgICAgICBrZXk6ICdmaWx0ZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSZW1vdmUgYSBmaWx0ZXIgKGl0cyBncm91cCBnb2VzIHRvbyB3aGVuIG5vdGhpbmcgZWxzZSB1c2VzIGl0KS5cbiAgcHVibGljIGRlbGV0ZUZpbHRlcihyZXBvcnRJZDogbnVtYmVyLCBmaWx0ZXJJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZGVsZXRlKFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZmlsdGVycy8ke2ZpbHRlcklkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZpbHRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBnbG9iYWwgQUkga25vd2xlZGdlIGRvY3VtZW50IChvcGVyYXRvci1hdXRob3JlZCBhZ2VudCBpbnN0cnVjdGlvbnMpXG4gIC8vIGFuZCBpdHMgZnVsbCB2ZXJzaW9uIGhpc3Rvcnk6IHsgaW5zdHJ1Y3Rpb25zLCB2ZXJzaW9ucyB9LlxuICBwdWJsaWMgaW5zdHJ1Y3Rpb25zKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKCdpbnN0cnVjdGlvbnMnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNhdmUgYSBuZXcgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQgKGFwcGVuZC1vbmx5OyBhbiB1bmNoYW5nZWQgc2F2ZSBpcyBhXG4gIC8vIG5vLW9wIHNlcnZlci1zaWRlKS4gUmVzb2x2ZXMgdG8gdGhlIHNhbWUgeyBpbnN0cnVjdGlvbnMsIHZlcnNpb25zIH0gc2hhcGUuXG4gIHB1YmxpYyBzYXZlSW5zdHJ1Y3Rpb25zKGNvbnRlbnQ6IHN0cmluZywgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoJ2luc3RydWN0aW9ucycpLFxuICAgICAgeyBjb250ZW50IH0sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gTWFrZSBhbiBlYXJsaWVyIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50IGN1cnJlbnQgKG5vIG5ldyByb3cgaXMgY3JlYXRlZCkuXG4gIHB1YmxpYyByZXN0b3JlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25JZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYGluc3RydWN0aW9ucy8ke2luc3RydWN0aW9uSWR9L3Jlc3RvcmVgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJ1biBhIHNlbWFudGljLWRhdGFiYXNlIGJ1aWxkLCBzdHJlYW1lZDogZW1pdHMgYW4gZXZlbnQgcGVyIE5ESlNPTiBmcmFtZVxuICAvLyAoeyBraW5kOiAnbG9nJywgbGluZSwgcGVyY2VudCB9IGZlZWQgbGluZXMgYW5kIHsga2luZDogJ3NlY3Rpb24nIH0gcGhhc2VcbiAgLy8gbWFya2VycykgYW5kIGNvbXBsZXRlcyB3aGVuIHRoZSBidWlsZCBlbmRzLiBGZWVkIHRoZSBsaW5lcyBpbnRvIEZzUHJvY2Vzcy5cbiAgcHVibGljIHNlbWFudGljQnVpbGQoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuc3RyZWFtKFxuICAgICAgJ1BPU1QnLFxuICAgICAgdGhpcy5fcGF0aCgnc2VtYW50aWMvYnVpbGQnKSxcbiAgICAgIHsgc3RyZWFtOiB0cnVlIH0sXG4gICAgICBjb25maWcsXG4gICAgKTtcbiAgfVxuXG4gIC8vIExhdGVzdCBidWlsZCBzdGF0dXMgKyBlbnRpdHkgc2NvcmVib2FyZDogeyBidWlsZCwgZGV0YWlsIH0uXG4gIHB1YmxpYyBzZW1hbnRpY0J1aWxkU3RhdHVzKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKCdzZW1hbnRpYy9idWlsZCcpLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gU3RvcCB0aGUgcnVubmluZyBidWlsZCAodGhlIGN1cnJlbnQgc2VtYW50aWMgZGF0YWJhc2Ugc3RheXMgaW4gcGxhY2UpLlxuICBwdWJsaWMgc2VtYW50aWNCdWlsZFN0b3AoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKCdzZW1hbnRpYy9idWlsZC9zdG9wJyksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnYnVpbGQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBPbmUgZW50aXR5J3MgY2FjaGVkIEFJLWNsYXNzaWZpZWQgY29kZSBmdW5jdGlvbnMg4oCUIGxvYWRlZCBvbiBleHBhbmQsIG9uZVxuICAvLyBlbnRpdHkgYXQgYSB0aW1lLCBiZWNhdXNlIHRoZSBmdWxsIHNldCBhY3Jvc3MgYWxsIGVudGl0aWVzIGlzIGZhciB0b28gYmlnXG4gIC8vIHRvIHNoaXAgaW5zaWRlIHRoZSBzY29yZWJvYXJkIGNhbGwuXG4gIHB1YmxpYyBzZW1hbnRpY0VudGl0eUZ1bmN0aW9ucyhlbnRpdHk6IHN0cmluZywgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYHNlbWFudGljL2VudGl0aWVzLyR7ZW50aXR5fS9mdW5jdGlvbnNgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdlbnRpdHlGdW5jdGlvbnMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0IG1vZHVsZSdzIEdlbmVyYWwgc2V0dGluZ3MgKHNlbWFudGljLWJ1aWxkIGNvbmN1cnJlbmN5ICsgaXRzIGJvdW5kcykuXG4gIHB1YmxpYyBzZXR0aW5ncyhjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgnc2V0dGluZ3MnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdzZXR0aW5ncycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNhdmUgdGhlIEdlbmVyYWwgc2V0dGluZ3M7IHJlc29sdmVzIHRvIHRoZSBzYW1lIHsgc2V0dGluZ3MgfSBzaGFwZS5cbiAgcHVibGljIHNhdmVTZXR0aW5ncyhzZXR0aW5nczogeyBzZW1hbnRpY0J1aWxkQ29uY3VycmVuY3k6IG51bWJlciB9LCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aCgnc2V0dGluZ3MnKSxcbiAgICAgIHNldHRpbmdzLFxuICAgICAge1xuICAgICAgICBrZXk6ICdzZXR0aW5ncycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBhIGZpbHRlciBncm91cCDigJQgaXRzIGV4cG9zdXJlIGxldmVsICgnY29tcG9uZW50JyB8ICdyZXBvcnQnIHwgJ2JvdGgnKVxuICAvLyBhbmQvb3IgaXRzIGRlZmF1bHQgdmFsdWUgKHRoZSB2YWx1ZSBzZWVkaW5nIHRoZSByZXBvcnQgYmFyIG9uIG9wZW4pLiBTZW5kXG4gIC8vIGBkZWZhdWx0OiBudWxsYCAob3IgYW4gZW1wdHkgZGVmYXVsdCkgdG8gY2xlYXIgaXQuIE9ubHkgdGhlIGtleXMgcHJvdmlkZWRcbiAgLy8gYXJlIGNoYW5nZWQuXG4gIHB1YmxpYyB1cGRhdGVGaWx0ZXJHcm91cChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGdyb3VwSWQ6IG51bWJlcixcbiAgICBjaGFuZ2VzOiB7IGxldmVsPzogUmVwb3J0RmlsdGVyTGV2ZWw7IGRlZmF1bHQ/OiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZmlsdGVyZ3JvdXBzLyR7Z3JvdXBJZH1gKSxcbiAgICAgIGNoYW5nZXMsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZpbHRlckdyb3VwJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG59XG4iXX0=
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGF0YS9yZXBvcnQuZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsS0FBSyxFQUFpQixNQUFNLGlCQUFpQixDQUFDOztBQVl2RCwyRUFBMkU7QUFDM0UsOEVBQThFO0FBQzlFLHFGQUFxRjtBQUlyRixNQUFNLE9BQU8sVUFBVTtJQUNiLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFN0IsNkVBQTZFO0lBQzdFLDhFQUE4RTtJQUN2RSxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBRTVCLGtGQUFrRjtJQUNsRixrREFBa0Q7SUFDMUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFO1FBQ3ZCLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDL0QsQ0FBQztJQUVNLE9BQU8sQ0FBQyxRQUFhLEVBQUUsRUFBRSxTQUF3QixFQUFFO1FBQ3hELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFDWixLQUFLLEVBQ0w7WUFDRSxHQUFHLEVBQUUsU0FBUztZQUNkLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTSxNQUFNLENBQUMsSUFBWSxFQUFFLFNBQXdCLEVBQUU7UUFDcEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDbkIsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUNaLEVBQUUsSUFBSSxFQUFFLEVBQ1I7WUFDRSxHQUFHLEVBQUUsUUFBUTtZQUNiLEdBQUcsTUFBTTtTQUNWLENB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SSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQ3RCLFFBQVEsRUFDUjtZQUNFLEdBQUcsRUFBRSxVQUFVO1lBQ2YsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELCtFQUErRTtJQUMvRSw0RUFBNEU7SUFDNUUsNEVBQTRFO0lBQzVFLGVBQWU7SUFDUixpQkFBaUIsQ0FDdEIsUUFBZ0IsRUFDaEIsT0FBZSxFQUNmLE9BQTJFLEVBQzNFLFNBQXdCLEVBQUU7UUFFMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsaUJBQWlCLE9BQU8sRUFBRSxDQUFDLEVBQ2pELE9BQU8sRUFDUDtZQUNFLEdBQUcsRUFBRSxhQUFhO1lBQ2xCLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7d0dBcFlVLFVBQVU7NEdBQVYsVUFBVSxjQUZULE1BQU07OzRGQUVQLFVBQVU7a0JBSHRCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEZzQXBpLCBSZXF1ZXN0Q29uZmlnIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYXBpJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBDb21wb25lbnREYXRhU3RhdGUsXG4gIEZpbHRlckdyb3VwRGVmYXVsdCxcbiAgUmVwb3J0RmlsdGVyTGV2ZWwsXG4gIFJlc29sdmVkRmlsdGVyVmFsdWUsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuLy8gQVBJIGdhdGV3YXkgZm9yIHRoZSBSZXBvcnRzIG1vZHVsZS4gRXZlcnkgZW5kcG9pbnQgaGFuZ3Mgb2ZmIFtiYXNlUGF0aF0sXG4vLyB3aGljaCBkZWZhdWx0cyB0byBcInJlcG9ydHNcIiAodGhlIGZyYW1ld29yayByZXBvcnRzIGJhY2tlbmQgYXQgL2FwaS9yZXBvcnRzKVxuLy8gYW5kIGNhbiBiZSByZXBvaW50ZWQgYnkgdGhlIGhvc3Qgc28gdGhlIHBhY2thZ2Ugc3RheXMgc2VsZi1jb250YWluZWQgYW5kIHBvcnRhYmxlLlxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFJlcG9ydERhdGE8VCA9IGFueT4ge1xuICBwcml2YXRlIF9hcGkgPSBpbmplY3QoRnNBcGkpO1xuXG4gIC8vIFRoZSBBUEkgcm9vdCBmb3IgZXZlcnkgcmVwb3J0cyBlbmRwb2ludC4gRGVmYXVsdHMgdG8gdGhlIGZyYW1ld29yayByZXBvcnRzXG4gIC8vIGNvbnRleHQ7IHNldCBpdCBvbmNlIChlLmcuIGZyb20gdGhlIGhvc3QncyByZXBvcnQgcGFnZSkgdG8gbW91bnQgZWxzZXdoZXJlLlxuICBwdWJsaWMgYmFzZVBhdGggPSAncmVwb3J0cyc7XG5cbiAgLy8gQnVpbGQgYW4gZW5kcG9pbnQgcGF0aCB1bmRlciB0aGUgY29uZmlndXJlZCBiYXNlLCBlLmcuIF9wYXRoKCkgPT4gXCJhaS9yZXBvcnRzXCIsXG4gIC8vIF9wYXRoKGAke2lkfS9wYWdlc2ApID0+IFwiYWkvcmVwb3J0cy8xMjMvcGFnZXNcIi5cbiAgcHJpdmF0ZSBfcGF0aChzdWZmaXggPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1ZmZpeCA/IGAke3RoaXMuYmFzZVBhdGh9LyR7c3VmZml4fWAgOiB0aGlzLmJhc2VQYXRoO1xuICB9XG5cbiAgcHVibGljIHJlcG9ydHMocXVlcnk6IGFueSA9IHt9LCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgpLFxuICAgICAgcXVlcnksXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydHMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlKG5hbWU6IHN0cmluZywgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKCksXG4gICAgICB7IG5hbWUgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZShyZXBvcnRJZDogbnVtYmVyLCBuYW1lOiBzdHJpbmcsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAgeyBuYW1lIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlcG9ydCBzZXR0aW5nczogYW55IHN1YnNldCBvZiB7IG5hbWUsIHBhZ2VTaXplLCBwYWdlT3JpZW50YXRpb24sIGxheW91dCxcbiAgLy8gc3R5bGVzIH0g4oCUIHN0eWxlcyBjYXJyeSB0aGUgcmVwb3J0J3MgdHlwb2dyYXBoaWMgY29uZmlnIChlLmcuIGhlYWRpbmcgc2l6ZSkuXG4gIHB1YmxpYyB1cGRhdGUocmVwb3J0SWQ6IG51bWJlciwgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH1gKSxcbiAgICAgIHNldHRpbmdzLFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBBcHBlbmQgYSBibGFuayBwYWdlIHRvIHRoZSByZXBvcnQ7IHJlc29sdmVzIHRvIHRoZSBuZXcgcGFnZS5cbiAgcHVibGljIGFkZFBhZ2UocmVwb3J0SWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9wYWdlc2ApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3BhZ2UnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBDb21wb25lbnQgc2V0dGluZ3M6IGFueSBzdWJzZXQgb2YgeyB0aXRsZSwgcGFkZGluZyB9IOKAlCB0aGUgaHVtYW4tZmFjaW5nXG4gIC8vIGRpYWxvZyBlZGl0czsgZ2VvbWV0cnkgKHgveS93L2gvZmxvd1dpZHRoKSBpcyBwZXJzaXN0ZWQgdmlhIHNhdmVQb3NpdGlvbnNcbiAgLy8gZnJvbSB0aGUgY2FudmFzIGluc3RlYWQuXG4gIHB1YmxpYyB1cGRhdGVDb21wb25lbnQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L3NldHRpbmdzYCksXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnY29tcG9uZW50JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gU29mdC1kZWxldGU6IHRoZSByZXBvcnQgbGVhdmVzIHRoZSBsaXN0aW5nIGJ1dCBrZWVwcyBpdHMgcGFnZXMgYW5kXG4gIC8vIGNvbXBvbmVudHMsIHNvIHVuZGVsZXRlKCkgYnJpbmdzIGJhY2sgdGhlIHNhbWUgZG9jdW1lbnQuXG4gIHB1YmxpYyBkZWxldGUocmVwb3J0SWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9YCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVzdG9yZSBhIHNvZnQtZGVsZXRlZCByZXBvcnQgdGhyb3VnaCBpdHMgb3duIGFjdGlvbiBlbmRwb2ludCDigJQgdGhlIHJlcG9ydFxuICAvLyBQVVQgZG9lcyBub3QgYWNjZXB0IGBzdGF0ZWAuXG4gIHB1YmxpYyB1bmRlbGV0ZShyZXBvcnRJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3VuZGVsZXRlYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIGFzc2VtYmxlZCBzdHJ1Y3R1cmU6IHBhZ2VzIOKGkiBjb21wb25lbnRzICgrIHRoZWlyIGZpbHRlcnMpIGFuZCB0aGVcbiAgLy8gcmVwb3J0J3MgZmlsdGVyIGdyb3Vwcy5cbiAgcHVibGljIGdldChyZXBvcnRJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH1gKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBQZXJzaXN0IGdlb21ldHJ5IGZvciB0aGUgbW92ZWQgY29tcG9uZW50cyBvbmx5IOKAlCBhbnkgc3Vic2V0IG9mXG4gIC8vIHsgeCwgeSwgdywgaCB9IChpbmNoZXMpLCBmbG93V2lkdGggKHBlcmNlbnQpIGFuZCBvcmRlciAoZmxvdyBwb3NpdGlvbikuXG4gIHB1YmxpYyBzYXZlUG9zaXRpb25zKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcG9zaXRpb25zOiAoeyBjb21wb25lbnRJZDogbnVtYmVyIH0gJiBQYXJ0aWFsPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyOyBmbG93V2lkdGg6IG51bWJlcjsgb3JkZXI6IG51bWJlciB9PilbXSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzL3Bvc2l0aW9uc2ApLFxuICAgICAgeyBwb3NpdGlvbnMgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBPbmUgY29tcG9uZW50J3MgZGF0YS4gVGhlIGJvZHkgY2FycmllcyBldmVyeXRoaW5nIHNlc3Npb24tc2NvcGVkOiB0aGVcbiAgLy8gcmVzb2x2ZWQgZmlsdGVyIHZhbHVlcyBhbmQgdGhlIGNvbXBvbmVudCdzIG93biBpbnRlcmFjdGlvbiBzdGF0ZS5cbiAgcHVibGljIGNvbXBvbmVudERhdGEoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcnM6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdLFxuICAgIHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSB7fSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9kYXRhYCksXG4gICAgICB7IGZpbHRlcnMsIHN0YXRlIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2RhdGEnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBFeHBvcnRzIHRoZSBjb21wb25lbnQncyBGVUxMIGZpbHRlcmVkIGRhdGFzZXQgdG8gQ1NWIHNlcnZlci1zaWRlIGFuZFxuICAvLyByZXNvbHZlcyB0byBhIHByZXNpZ25lZCBkb3dubG9hZCBVUkwuIFRoZSBiYWNrZW5kIHN0cmVhbXMgcGVyY2VudGFnZVxuICAvLyBwcm9ncmVzcyB3aGlsZSBjaHVua2luZzsgY29uc3VtZSB0aHJvdWdoIEZzUHJvY2Vzcy5kb3dubG9hZC5cbiAgcHVibGljIGV4cG9ydENvbXBvbmVudChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgZmlsdGVyczogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW10sXG4gICAgc3RhdGU6IENvbXBvbmVudERhdGFTdGF0ZSA9IHt9LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L2V4cG9ydGApLFxuICAgICAgeyBmaWx0ZXJzLCBzdGF0ZSB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICd1cmwnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBEaXN0aW5jdCBvcHRpb25zIGZvciBhIHNlbGVjdCBmaWx0ZXIgKGRyaXZlcyBtdWx0aXNlbGVjdCBjb250cm9scykuXG4gIHB1YmxpYyBmaWx0ZXJPcHRpb25zKHJlcG9ydElkOiBudW1iZXIsIGZpbHRlcklkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9maWx0ZXJzLyR7ZmlsdGVySWR9L29wdGlvbnNgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdvcHRpb25zJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIGNvbXBvbmVudCBTUUwncyBmaWx0ZXJhYmxlIG91dHB1dCBjb2x1bW5zIOKAlCBkcml2ZXMgdGhlIGNvbHVtbiBwaWNrZXJcbiAgLy8gaW4gdGhlIGZpbHRlciBVSSBzbyBhIGNvbHVtbiBuYW1lIGlzIG5ldmVyIHR5cGVkIGJ5IGhhbmQuXG4gIHB1YmxpYyBjb21wb25lbnRDb2x1bW5zKHJlcG9ydElkOiBudW1iZXIsIGNvbXBvbmVudElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L2NvbHVtbnNgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdjb2x1bW5zJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gTWFrZSBvbmUgY29sdW1uIGZpbHRlcmFibGUuIGBsZXZlbGAgKGNvbXBvbmVudCB8IHJlcG9ydCkgcGxhY2VzIGEgbmV3XG4gIC8vIGdyb3VwOyBgZ3JvdXBJZGAgaW5zdGVhZCBsaW5rcyBpbnRvIGFuIGV4aXN0aW5nIGdyb3VwLiBBIHNlbGVjdCBmaWx0ZXInc1xuICAvLyBvcHRpb25zIGFyZSBkZXJpdmVkIGZyb20gdGhlIGNvbXBvbmVudCBTUUwgd2hlbiBvcHRpb25zU3FsIGlzIG9taXR0ZWQuXG4gIHB1YmxpYyBhZGRGaWx0ZXIoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcjogeyBmaWx0ZXJDb2x1bW46IHN0cmluZzsgdHlwZT86IHN0cmluZzsgbGFiZWw/OiBzdHJpbmc7IGxldmVsPzogc3RyaW5nOyBvcHRpb25zU3FsPzogc3RyaW5nOyBncm91cElkPzogbnVtYmVyIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vZmlsdGVyc2ApLFxuICAgICAgZmlsdGVyLFxuICAgICAge1xuICAgICAgICBrZXk6ICdmaWx0ZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBVcGRhdGUgYSBmaWx0ZXIg4oCUIGFueSBzdWJzZXQgb2YgeyBsYWJlbCwgb3B0aW9uc1NxbCwgZW5hYmxlZCB9LlxuICBwdWJsaWMgdXBkYXRlRmlsdGVyKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgZmlsdGVySWQ6IG51bWJlcixcbiAgICBjaGFuZ2VzOiB7IGxhYmVsPzogc3RyaW5nOyBvcHRpb25zU3FsPzogc3RyaW5nOyBlbmFibGVkPzogYm9vbGVhbiB9LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2ZpbHRlcnMvJHtmaWx0ZXJJZH1gKSxcbiAgICAgIGNoYW5nZXMsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZpbHRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSBhIGZpbHRlciAoaXRzIGdyb3VwIGdvZXMgdG9vIHdoZW4gbm90aGluZyBlbHNlIHVzZXMgaXQpLlxuICBwdWJsaWMgZGVsZXRlRmlsdGVyKHJlcG9ydElkOiBudW1iZXIsIGZpbHRlcklkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5kZWxldGUoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9maWx0ZXJzLyR7ZmlsdGVySWR9YCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZmlsdGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIGdsb2JhbCBBSSBrbm93bGVkZ2UgZG9jdW1lbnQgKG9wZXJhdG9yLWF1dGhvcmVkIGFnZW50IGluc3RydWN0aW9ucylcbiAgLy8gYW5kIGl0cyBmdWxsIHZlcnNpb24gaGlzdG9yeTogeyBpbnN0cnVjdGlvbnMsIHZlcnNpb25zIH0uXG4gIHB1YmxpYyBpbnN0cnVjdGlvbnMoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoJ2luc3RydWN0aW9ucycpLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gU2F2ZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCAoYXBwZW5kLW9ubHk7IGFuIHVuY2hhbmdlZCBzYXZlIGlzIGFcbiAgLy8gbm8tb3Agc2VydmVyLXNpZGUpLiBSZXNvbHZlcyB0byB0aGUgc2FtZSB7IGluc3RydWN0aW9ucywgdmVyc2lvbnMgfSBzaGFwZS5cbiAgcHVibGljIHNhdmVJbnN0cnVjdGlvbnMoY29udGVudDogc3RyaW5nLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aCgnaW5zdHJ1Y3Rpb25zJyksXG4gICAgICB7IGNvbnRlbnQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBNYWtlIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQgY3VycmVudCAobm8gbmV3IHJvdyBpcyBjcmVhdGVkKS5cbiAgcHVibGljIHJlc3RvcmVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbklkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgaW5zdHJ1Y3Rpb25zLyR7aW5zdHJ1Y3Rpb25JZH0vcmVzdG9yZWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUnVuIGEgc2VtYW50aWMtZGF0YWJhc2UgYnVpbGQsIHN0cmVhbWVkOiBlbWl0cyBhbiBldmVudCBwZXIgTkRKU09OIGZyYW1lXG4gIC8vICh7IGtpbmQ6ICdsb2cnLCBsaW5lLCBwZXJjZW50IH0gZmVlZCBsaW5lcyBhbmQgeyBraW5kOiAnc2VjdGlvbicgfSBwaGFzZVxuICAvLyBtYXJrZXJzKSBhbmQgY29tcGxldGVzIHdoZW4gdGhlIGJ1aWxkIGVuZHMuIEZlZWQgdGhlIGxpbmVzIGludG8gRnNQcm9jZXNzLlxuICBwdWJsaWMgc2VtYW50aWNCdWlsZChjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5zdHJlYW0oXG4gICAgICAnUE9TVCcsXG4gICAgICB0aGlzLl9wYXRoKCdzZW1hbnRpYy9idWlsZCcpLFxuICAgICAgeyBzdHJlYW06IHRydWUgfSxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuICB9XG5cbiAgLy8gTGF0ZXN0IGJ1aWxkIHN0YXR1cyArIGVudGl0eSBzY29yZWJvYXJkOiB7IGJ1aWxkLCBkZXRhaWwgfS5cbiAgcHVibGljIHNlbWFudGljQnVpbGRTdGF0dXMoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoJ3NlbWFudGljL2J1aWxkJyksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBTdG9wIHRoZSBydW5uaW5nIGJ1aWxkICh0aGUgY3VycmVudCBzZW1hbnRpYyBkYXRhYmFzZSBzdGF5cyBpbiBwbGFjZSkuXG4gIHB1YmxpYyBzZW1hbnRpY0J1aWxkU3RvcChjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoJ3NlbWFudGljL2J1aWxkL3N0b3AnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdidWlsZCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIE9uZSBlbnRpdHkncyBjYWNoZWQgQUktY2xhc3NpZmllZCBjb2RlIGZ1bmN0aW9ucyDigJQgbG9hZGVkIG9uIGV4cGFuZCwgb25lXG4gIC8vIGVudGl0eSBhdCBhIHRpbWUsIGJlY2F1c2UgdGhlIGZ1bGwgc2V0IGFjcm9zcyBhbGwgZW50aXRpZXMgaXMgZmFyIHRvbyBiaWdcbiAgLy8gdG8gc2hpcCBpbnNpZGUgdGhlIHNjb3JlYm9hcmQgY2FsbC5cbiAgcHVibGljIHNlbWFudGljRW50aXR5RnVuY3Rpb25zKGVudGl0eTogc3RyaW5nLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aChgc2VtYW50aWMvZW50aXRpZXMvJHtlbnRpdHl9L2Z1bmN0aW9uc2ApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2VudGl0eUZ1bmN0aW9ucycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSByZXBvcnQgbW9kdWxlJ3MgR2VuZXJhbCBzZXR0aW5ncyAoc2VtYW50aWMtYnVpbGQgY29uY3VycmVuY3kgKyBpdHMgYm91bmRzKS5cbiAgcHVibGljIHNldHRpbmdzKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKCdzZXR0aW5ncycpLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NldHRpbmdzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gU2F2ZSB0aGUgR2VuZXJhbCBzZXR0aW5nczsgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgeyBzZXR0aW5ncyB9IHNoYXBlLlxuICBwdWJsaWMgc2F2ZVNldHRpbmdzKHNldHRpbmdzOiB7IHNlbWFudGljQnVpbGRDb25jdXJyZW5jeTogbnVtYmVyIH0sIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKCdzZXR0aW5ncycpLFxuICAgICAgc2V0dGluZ3MsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NldHRpbmdzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVXBkYXRlIGEgZmlsdGVyIGdyb3VwIOKAlCBpdHMgZXhwb3N1cmUgbGV2ZWwgKCdjb21wb25lbnQnIHwgJ3JlcG9ydCcgfCAnYm90aCcpXG4gIC8vIGFuZC9vciBpdHMgZGVmYXVsdCB2YWx1ZSAodGhlIHZhbHVlIHNlZWRpbmcgdGhlIHJlcG9ydCBiYXIgb24gb3BlbikuIFNlbmRcbiAgLy8gYGRlZmF1bHQ6IG51bGxgIChvciBhbiBlbXB0eSBkZWZhdWx0KSB0byBjbGVhciBpdC4gT25seSB0aGUga2V5cyBwcm92aWRlZFxuICAvLyBhcmUgY2hhbmdlZC5cbiAgcHVibGljIHVwZGF0ZUZpbHRlckdyb3VwKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgZ3JvdXBJZDogbnVtYmVyLFxuICAgIGNoYW5nZXM6IHsgbGV2ZWw/OiBSZXBvcnRGaWx0ZXJMZXZlbDsgZGVmYXVsdD86IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwgfSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9maWx0ZXJncm91cHMvJHtncm91cElkfWApLFxuICAgICAgY2hhbmdlcyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZmlsdGVyR3JvdXAnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -12,10 +12,10 @@ import * as i1 from "@firestitch/chip";
12
12
  import * as i2 from "@firestitch/date";
13
13
  import * as i3 from "@firestitch/dialog";
14
14
  import * as i4 from "@firestitch/skeleton";
15
- // One group of an entity's AI-classified cached code functions — the model
16
- // class's or the handler class's, per the source it was opened for. Fetched on
17
- // open from the shared per-entity endpoint (one payload carries both groups,
18
- // each row tagged with its source) and filtered client-side.
15
+ // One group of a unit's AI-classified cached code functions — an entity's model
16
+ // or handler class, or the single group of a standalone code class. Fetched on
17
+ // open from the shared per-key endpoint (one payload carries every group, each
18
+ // row tagged with its source) and filtered client-side.
19
19
  export class EntityFunctionsComponent {
20
20
  // One color per AI classification kind, so a function's nature reads at a glance.
21
21
  static KIND_COLORS = {
@@ -28,15 +28,23 @@ export class EntityFunctionsComponent {
28
28
  };
29
29
  // Interesting logic first: derived values and rules, then data access, then the rest.
30
30
  static KIND_ORDER = ['calculation', 'business-rule', 'query', 'mutation', 'accessor', 'other'];
31
+ // The dialog title per group. A standalone class has no model/handler split,
32
+ // so its one group is just the code the build read.
33
+ static SOURCE_LABELS = {
34
+ model: 'Model functions',
35
+ handler: 'Handler functions',
36
+ class: 'Code functions',
37
+ };
31
38
  _data = inject(MAT_DIALOG_DATA);
32
39
  entityKey = this._data.entityKey;
33
- sourceLabel = this._data.source === 'model' ? 'Model functions' : 'Handler functions';
40
+ sourceLabel = EntityFunctionsComponent.SOURCE_LABELS[this._data.source];
34
41
  // null until loaded — gates the list behind the skeleton.
35
42
  entityFunctions = signal(null);
36
- // The class this group's functions were discovered from.
43
+ // The class this group's functions were discovered from. A standalone code
44
+ // class has no handler, so its group reads the model slot like 'model' does.
37
45
  discoveredClass = computed(() => {
38
46
  const loaded = this.entityFunctions();
39
- return this._data.source === 'model' ? loaded?.modelClass : loaded?.handlerClass;
47
+ return this._data.source === 'handler' ? loaded?.handlerClass : loaded?.modelClass;
40
48
  });
41
49
  // This group's functions, ordered by kind priority then method name.
42
50
  functions = computed(() => this._sortFunctions((this.entityFunctions()?.functions ?? [])
@@ -78,4 +86,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
78
86
  FsSkeletonModule,
79
87
  ], template: "<fs-dialog>\n <fs-dialog-title>\n {{ entityKey }} \u2014 {{ sourceLabel }}\n </fs-dialog-title>\n <mat-dialog-content>\n <div *fsSkeleton=\"entityFunctions()\">\n @if (entityFunctions(); as fns) {\n @if (functions().length) {\n @if (fns.generatedAt) {\n <div class=\"hint functions-generated\">\n Discovered from {{ discoveredClass() }} &middot;\n <fs-date\n [date]=\"fns.generatedAt\"\n format=\"date-time\">\n </fs-date>\n </div>\n }\n <div class=\"functions-list\">\n @for (fn of functions(); track fn.class + '::' + fn.method) {\n <div class=\"function-row\">\n <div class=\"function-head\">\n <fs-chip\n size=\"tiny\"\n [backgroundColor]=\"kindColor(fn.kind)\"\n color=\"#ffffff\">\n {{ fn.kind }}\n </fs-chip>\n <code class=\"function-method\">{{ fn.method }}</code>\n </div>\n <div class=\"function-summary\">{{ fn.summary }}</div>\n @if (fn.produces) {\n <div class=\"function-produces hint\">Produces: {{ fn.produces }}</div>\n }\n </div>\n }\n </div>\n } @else {\n <div class=\"hint\">\n No functions cached for this entity yet \u2014 run a build to discover its code.\n </div>\n }\n }\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n type=\"button\"\n mat-button\n color=\"primary\"\n [mat-dialog-close]=\"undefined\">\n Close\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n", styles: [".hint{margin:0;color:#0009;font-size:13px;line-height:1.5}.functions-generated{margin-bottom:10px}.functions-list{display:flex;flex-direction:column}.functions-list .function-row{display:flex;flex-direction:column;gap:3px;padding:10px 0}.functions-list .function-row+.function-row{border-top:1px solid rgba(0,0,0,.08)}.functions-list .function-row .function-head{display:flex;align-items:center;gap:8px}.functions-list .function-row .function-method{font-family:monospace;font-size:13px;font-weight:600}.functions-list .function-row .function-summary{color:#000000bf}.functions-list .function-row .function-produces{padding-left:10px}\n"] }]
80
88
  }], ctorParameters: () => [] });
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWZ1bmN0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGlhbG9ncy9lbnRpdHktZnVuY3Rpb25zL2VudGl0eS1mdW5jdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvZW50aXR5LWZ1bmN0aW9ucy9lbnRpdHktZnVuY3Rpb25zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFL0csT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFhcEQsMkVBQTJFO0FBQzNFLCtFQUErRTtBQUMvRSw2RUFBNkU7QUFDN0UsNkRBQTZEO0FBaUI3RCxNQUFNLE9BQU8sd0JBQXdCO0lBRW5DLGtGQUFrRjtJQUMxRSxNQUFNLENBQVUsV0FBVyxHQUEyQjtRQUM1RCxhQUFhLEVBQUUsU0FBUztRQUN4Qixl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QztJQUN6RSxDQUFDO3dHQS9EVSx3QkFBd0I7NEZBQXhCLHdCQUF3Qix3RUM1Q3JDLG95REFzREEsc3JCRHBCSSxTQUFTLGlMQUNULGdCQUFnQix5R0FDaEIsZ0JBQWdCLDRIQUNoQixjQUFjLG9MQUNkLFlBQVkscVhBQ1osWUFBWSw0SUFDWixjQUFjLDhUQUNkLGdCQUFnQjs7NEZBR1Asd0JBQXdCO2tCQWhCcEMsU0FBUztzQ0FHUyx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxTQUFTO3dCQUNULGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixjQUFjO3dCQUNkLGdCQUFnQjtxQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuaW1wb3J0IHsgTWF0QnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nQWN0aW9ucywgTWF0RGlhbG9nQ2xvc2UsIE1hdERpYWxvZ0NvbnRlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG5pbXBvcnQgeyBGc0NoaXBNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9jaGlwJztcbmltcG9ydCB7IEZzRGF0ZU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGUnO1xuaW1wb3J0IHsgRnNEaWFsb2dNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kaWFsb2cnO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHtcbiAgU2VtYW50aWNFbnRpdHlGdW5jdGlvbixcbiAgU2VtYW50aWNFbnRpdHlGdW5jdGlvbnMsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlGdW5jdGlvbnNEaWFsb2dEYXRhIHtcbiAgZW50aXR5S2V5OiBzdHJpbmc7XG4gIHNvdXJjZTogJ21vZGVsJyB8ICdoYW5kbGVyJztcbn1cblxuXG4vLyBPbmUgZ3JvdXAgb2YgYW4gZW50aXR5J3MgQUktY2xhc3NpZmllZCBjYWNoZWQgY29kZSBmdW5jdGlvbnMg4oCUIHRoZSBtb2RlbFxuLy8gY2xhc3MncyBvciB0aGUgaGFuZGxlciBjbGFzcydzLCBwZXIgdGhlIHNvdXJjZSBpdCB3YXMgb3BlbmVkIGZvci4gRmV0Y2hlZCBvblxuLy8gb3BlbiBmcm9tIHRoZSBzaGFyZWQgcGVyLWVudGl0eSBlbmRwb2ludCAob25lIHBheWxvYWQgY2FycmllcyBib3RoIGdyb3Vwcyxcbi8vIGVhY2ggcm93IHRhZ2dlZCB3aXRoIGl0cyBzb3VyY2UpIGFuZCBmaWx0ZXJlZCBjbGllbnQtc2lkZS5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vZW50aXR5LWZ1bmN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VudGl0eS1mdW5jdGlvbnMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRCdXR0b24sXG4gICAgTWF0RGlhbG9nQ29udGVudCxcbiAgICBNYXREaWFsb2dBY3Rpb25zLFxuICAgIE1hdERpYWxvZ0Nsb3NlLFxuICAgIEZzQ2hpcE1vZHVsZSxcbiAgICBGc0RhdGVNb2R1bGUsXG4gICAgRnNEaWFsb2dNb2R1bGUsXG4gICAgRnNTa2VsZXRvbk1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50IHtcblxuICAvLyBPbmUgY29sb3IgcGVyIEFJIGNsYXNzaWZpY2F0aW9uIGtpbmQsIHNvIGEgZnVuY3Rpb24ncyBuYXR1cmUgcmVhZHMgYXQgYSBnbGFuY2UuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEtJTkRfQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICdjYWxjdWxhdGlvbic6ICcjMTU2NWMwJyxcbiAgICAnYnVzaW5lc3MtcnVsZSc6ICcjNmExYjlhJyxcbiAgICAncXVlcnknOiAnIzAwNjk1YycsXG4gICAgJ211dGF0aW9uJzogJyNlNjUxMDAnLFxuICAgICdhY2Nlc3Nvcic6ICcjNTQ2ZTdhJyxcbiAgICAnb3RoZXInOiAnIzc1NzU3NScsXG4gIH07XG5cbiAgLy8gSW50ZXJlc3RpbmcgbG9naWMgZmlyc3Q6IGRlcml2ZWQgdmFsdWVzIGFuZCBydWxlcywgdGhlbiBkYXRhIGFjY2VzcywgdGhlbiB0aGUgcmVzdC5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgS0lORF9PUkRFUiA9IFsnY2FsY3VsYXRpb24nLCAnYnVzaW5lc3MtcnVsZScsICdxdWVyeScsICdtdXRhdGlvbicsICdhY2Nlc3NvcicsICdvdGhlciddO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RhdGEgPSBpbmplY3Q8RW50aXR5RnVuY3Rpb25zRGlhbG9nRGF0YT4oTUFUX0RJQUxPR19EQVRBKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZW50aXR5S2V5ID0gdGhpcy5fZGF0YS5lbnRpdHlLZXk7XG4gIHB1YmxpYyByZWFkb25seSBzb3VyY2VMYWJlbCA9IHRoaXMuX2RhdGEuc291cmNlID09PSAnbW9kZWwnID8gJ01vZGVsIGZ1bmN0aW9ucycgOiAnSGFuZGxlciBmdW5jdGlvbnMnO1xuXG4gIC8vIG51bGwgdW50aWwgbG9hZGVkIOKAlCBnYXRlcyB0aGUgbGlzdCBiZWhpbmQgdGhlIHNrZWxldG9uLlxuICBwdWJsaWMgcmVhZG9ubHkgZW50aXR5RnVuY3Rpb25zID0gc2lnbmFsPFNlbWFudGljRW50aXR5RnVuY3Rpb25zIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIGNsYXNzIHRoaXMgZ3JvdXAncyBmdW5jdGlvbnMgd2VyZSBkaXNjb3ZlcmVkIGZyb20uXG4gIHB1YmxpYyByZWFkb25seSBkaXNjb3ZlcmVkQ2xhc3MgPSBjb21wdXRlZDxzdHJpbmcgfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgbG9hZGVkID0gdGhpcy5lbnRpdHlGdW5jdGlvbnMoKTtcblxuICAgIHJldHVybiB0aGlzLl9kYXRhLnNvdXJjZSA9PT0gJ21vZGVsJyA/IGxvYWRlZD8ubW9kZWxDbGFzcyA6IGxvYWRlZD8uaGFuZGxlckNsYXNzO1xuICB9KTtcblxuICAvLyBUaGlzIGdyb3VwJ3MgZnVuY3Rpb25zLCBvcmRlcmVkIGJ5IGtpbmQgcHJpb3JpdHkgdGhlbiBtZXRob2QgbmFtZS5cbiAgcHVibGljIHJlYWRvbmx5IGZ1bmN0aW9ucyA9IGNvbXB1dGVkPFNlbWFudGljRW50aXR5RnVuY3Rpb25bXT4oKCkgPT5cbiAgICB0aGlzLl9zb3J0RnVuY3Rpb25zKFxuICAgICAgKHRoaXMuZW50aXR5RnVuY3Rpb25zKCk/LmZ1bmN0aW9ucyA/PyBbXSlcbiAgICAgICAgLmZpbHRlcigoZm4pID0+IGZuLnNvdXJjZSA9PT0gdGhpcy5fZGF0YS5zb3VyY2UpLFxuICAgICksXG4gICk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaW5qZWN0KFJlcG9ydERhdGEpLnNlbWFudGljRW50aXR5RnVuY3Rpb25zKHRoaXMuX2RhdGEuZW50aXR5S2V5KVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKChlbnRpdHlGdW5jdGlvbnM6IFNlbWFudGljRW50aXR5RnVuY3Rpb25zKSA9PiB7XG4gICAgICAgIHRoaXMuZW50aXR5RnVuY3Rpb25zLnNldChlbnRpdHlGdW5jdGlvbnMpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMga2luZENvbG9yKGtpbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEVudGl0eUZ1bmN0aW9uc0NvbXBvbmVudC5LSU5EX0NPTE9SU1traW5kXSA/PyBFbnRpdHlGdW5jdGlvbnNDb21wb25lbnQuS0lORF9DT0xPUlMub3RoZXI7XG4gIH1cblxuICBwcml2YXRlIF9zb3J0RnVuY3Rpb25zKGZ1bmN0aW9uczogU2VtYW50aWNFbnRpdHlGdW5jdGlvbltdKTogU2VtYW50aWNFbnRpdHlGdW5jdGlvbltdIHtcbiAgICByZXR1cm4gWy4uLmZ1bmN0aW9uc11cbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGtpbmREaWZmID0gdGhpcy5fa2luZFJhbmsoYS5raW5kKSAtIHRoaXMuX2tpbmRSYW5rKGIua2luZCk7XG5cbiAgICAgICAgcmV0dXJuIGtpbmREaWZmICE9PSAwID8ga2luZERpZmYgOiBhLm1ldGhvZC5sb2NhbGVDb21wYXJlKGIubWV0aG9kKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfa2luZFJhbmsoa2luZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCByYW5rID0gRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50LktJTkRfT1JERVIuaW5kZXhPZihraW5kKTtcblxuICAgIHJldHVybiByYW5rID09PSAtMSA/IEVudGl0eUZ1bmN0aW9uc0NvbXBvbmVudC5LSU5EX09SREVSLmxlbmd0aCA6IHJhbms7XG4gIH1cbn1cbiIsIjxmcy1kaWFsb2c+XG4gIDxmcy1kaWFsb2ctdGl0bGU+XG4gICAge3sgZW50aXR5S2V5IH19IOKAlCB7eyBzb3VyY2VMYWJlbCB9fVxuICA8L2ZzLWRpYWxvZy10aXRsZT5cbiAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICA8ZGl2ICpmc1NrZWxldG9uPVwiZW50aXR5RnVuY3Rpb25zKClcIj5cbiAgICAgIEBpZiAoZW50aXR5RnVuY3Rpb25zKCk7IGFzIGZucykge1xuICAgICAgICBAaWYgKGZ1bmN0aW9ucygpLmxlbmd0aCkge1xuICAgICAgICAgIEBpZiAoZm5zLmdlbmVyYXRlZEF0KSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGludCBmdW5jdGlvbnMtZ2VuZXJhdGVkXCI+XG4gICAgICAgICAgICAgIERpc2NvdmVyZWQgZnJvbSB7eyBkaXNjb3ZlcmVkQ2xhc3MoKSB9fSAmbWlkZG90O1xuICAgICAgICAgICAgICA8ZnMtZGF0ZVxuICAgICAgICAgICAgICAgICAgW2RhdGVdPVwiZm5zLmdlbmVyYXRlZEF0XCJcbiAgICAgICAgICAgICAgICAgIGZvcm1hdD1cImRhdGUtdGltZVwiPlxuICAgICAgICAgICAgICA8L2ZzLWRhdGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZ1bmN0aW9ucy1saXN0XCI+XG4gICAgICAgICAgICBAZm9yIChmbiBvZiBmdW5jdGlvbnMoKTsgdHJhY2sgZm4uY2xhc3MgKyAnOjonICsgZm4ubWV0aG9kKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdW5jdGlvbi1yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnVuY3Rpb24taGVhZFwiPlxuICAgICAgICAgICAgICAgICAgPGZzLWNoaXBcbiAgICAgICAgICAgICAgICAgICAgICBzaXplPVwidGlueVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCJraW5kQ29sb3IoZm4ua2luZClcIlxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwiI2ZmZmZmZlwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBmbi5raW5kIH19XG4gICAgICAgICAgICAgICAgICA8L2ZzLWNoaXA+XG4gICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImZ1bmN0aW9uLW1ldGhvZFwiPnt7IGZuLm1ldGhvZCB9fTwvY29kZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnVuY3Rpb24tc3VtbWFyeVwiPnt7IGZuLnN1bW1hcnkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICBAaWYgKGZuLnByb2R1Y2VzKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnVuY3Rpb24tcHJvZHVjZXMgaGludFwiPlByb2R1Y2VzOiB7eyBmbi5wcm9kdWNlcyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoaW50XCI+XG4gICAgICAgICAgICBObyBmdW5jdGlvbnMgY2FjaGVkIGZvciB0aGlzIGVudGl0eSB5ZXQg4oCUIHJ1biBhIGJ1aWxkIHRvIGRpc2NvdmVyIGl0cyBjb2RlLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgW21hdC1kaWFsb2ctY2xvc2VdPVwidW5kZWZpbmVkXCI+XG4gICAgICBDbG9zZVxuICAgIDwvYnV0dG9uPlxuICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbjwvZnMtZGlhbG9nPlxuIl19
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWZ1bmN0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGlhbG9ncy9lbnRpdHktZnVuY3Rpb25zL2VudGl0eS1mdW5jdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvZW50aXR5LWZ1bmN0aW9ucy9lbnRpdHktZnVuY3Rpb25zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFL0csT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFjcEQsZ0ZBQWdGO0FBQ2hGLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0Usd0RBQXdEO0FBaUJ4RCxNQUFNLE9BQU8sd0JBQXdCO0lBRW5DLGtGQUFrRjtJQUMxRSxNQUFNLENBQVUsV0FBVyxHQUEyQjtRQUM1RCxhQUFhLEVBQUUsU0FBUztRQUN4Qixl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TyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRS9ELE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDekUsQ0FBQzt3R0F4RVUsd0JBQXdCOzRGQUF4Qix3QkFBd0Isd0VDN0NyQyxveURBc0RBLHNyQkRuQkksU0FBUyxpTEFDVCxnQkFBZ0IseUdBQ2hCLGdCQUFnQiw0SEFDaEIsY0FBYyxvTEFDZCxZQUFZLHFYQUNaLFlBQVksNElBQ1osY0FBYyw4VEFDZCxnQkFBZ0I7OzRGQUdQLHdCQUF3QjtrQkFoQnBDLFNBQVM7c0NBR1MsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsU0FBUzt3QkFDVCxnQkFBZ0I7d0JBQ2hCLGdCQUFnQjt3QkFDaEIsY0FBYzt3QkFDZCxZQUFZO3dCQUNaLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxnQkFBZ0I7cUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ0FjdGlvbnMsIE1hdERpYWxvZ0Nsb3NlLCBNYXREaWFsb2dDb250ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgRnNDaGlwTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvY2hpcCc7XG5pbXBvcnQgeyBGc0RhdGVNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kYXRlJztcbmltcG9ydCB7IEZzRGlhbG9nTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZGlhbG9nJztcbmltcG9ydCB7IEZzU2tlbGV0b25Nb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9za2VsZXRvbic7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7XG4gIFNlbWFudGljRW50aXR5RnVuY3Rpb24sXG4gIFNlbWFudGljRW50aXR5RnVuY3Rpb25zLFxuICBTZW1hbnRpY0Z1bmN0aW9uU291cmNlLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5RnVuY3Rpb25zRGlhbG9nRGF0YSB7XG4gIGVudGl0eUtleTogc3RyaW5nO1xuICBzb3VyY2U6IFNlbWFudGljRnVuY3Rpb25Tb3VyY2U7XG59XG5cblxuLy8gT25lIGdyb3VwIG9mIGEgdW5pdCdzIEFJLWNsYXNzaWZpZWQgY2FjaGVkIGNvZGUgZnVuY3Rpb25zIOKAlCBhbiBlbnRpdHkncyBtb2RlbFxuLy8gb3IgaGFuZGxlciBjbGFzcywgb3IgdGhlIHNpbmdsZSBncm91cCBvZiBhIHN0YW5kYWxvbmUgY29kZSBjbGFzcy4gRmV0Y2hlZCBvblxuLy8gb3BlbiBmcm9tIHRoZSBzaGFyZWQgcGVyLWtleSBlbmRwb2ludCAob25lIHBheWxvYWQgY2FycmllcyBldmVyeSBncm91cCwgZWFjaFxuLy8gcm93IHRhZ2dlZCB3aXRoIGl0cyBzb3VyY2UpIGFuZCBmaWx0ZXJlZCBjbGllbnQtc2lkZS5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vZW50aXR5LWZ1bmN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VudGl0eS1mdW5jdGlvbnMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRCdXR0b24sXG4gICAgTWF0RGlhbG9nQ29udGVudCxcbiAgICBNYXREaWFsb2dBY3Rpb25zLFxuICAgIE1hdERpYWxvZ0Nsb3NlLFxuICAgIEZzQ2hpcE1vZHVsZSxcbiAgICBGc0RhdGVNb2R1bGUsXG4gICAgRnNEaWFsb2dNb2R1bGUsXG4gICAgRnNTa2VsZXRvbk1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50IHtcblxuICAvLyBPbmUgY29sb3IgcGVyIEFJIGNsYXNzaWZpY2F0aW9uIGtpbmQsIHNvIGEgZnVuY3Rpb24ncyBuYXR1cmUgcmVhZHMgYXQgYSBnbGFuY2UuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEtJTkRfQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICdjYWxjdWxhdGlvbic6ICcjMTU2NWMwJyxcbiAgICAnYnVzaW5lc3MtcnVsZSc6ICcjNmExYjlhJyxcbiAgICAncXVlcnknOiAnIzAwNjk1YycsXG4gICAgJ211dGF0aW9uJzogJyNlNjUxMDAnLFxuICAgICdhY2Nlc3Nvcic6ICcjNTQ2ZTdhJyxcbiAgICAnb3RoZXInOiAnIzc1NzU3NScsXG4gIH07XG5cbiAgLy8gSW50ZXJlc3RpbmcgbG9naWMgZmlyc3Q6IGRlcml2ZWQgdmFsdWVzIGFuZCBydWxlcywgdGhlbiBkYXRhIGFjY2VzcywgdGhlbiB0aGUgcmVzdC5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgS0lORF9PUkRFUiA9IFsnY2FsY3VsYXRpb24nLCAnYnVzaW5lc3MtcnVsZScsICdxdWVyeScsICdtdXRhdGlvbicsICdhY2Nlc3NvcicsICdvdGhlciddO1xuXG4gIC8vIFRoZSBkaWFsb2cgdGl0bGUgcGVyIGdyb3VwLiBBIHN0YW5kYWxvbmUgY2xhc3MgaGFzIG5vIG1vZGVsL2hhbmRsZXIgc3BsaXQsXG4gIC8vIHNvIGl0cyBvbmUgZ3JvdXAgaXMganVzdCB0aGUgY29kZSB0aGUgYnVpbGQgcmVhZC5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU09VUkNFX0xBQkVMUzogUmVjb3JkPFNlbWFudGljRnVuY3Rpb25Tb3VyY2UsIHN0cmluZz4gPSB7XG4gICAgbW9kZWw6ICdNb2RlbCBmdW5jdGlvbnMnLFxuICAgIGhhbmRsZXI6ICdIYW5kbGVyIGZ1bmN0aW9ucycsXG4gICAgY2xhc3M6ICdDb2RlIGZ1bmN0aW9ucycsXG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGF0YSA9IGluamVjdDxFbnRpdHlGdW5jdGlvbnNEaWFsb2dEYXRhPihNQVRfRElBTE9HX0RBVEEpO1xuXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdHlLZXkgPSB0aGlzLl9kYXRhLmVudGl0eUtleTtcbiAgcHVibGljIHJlYWRvbmx5IHNvdXJjZUxhYmVsID0gRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50LlNPVVJDRV9MQUJFTFNbdGhpcy5fZGF0YS5zb3VyY2VdO1xuXG4gIC8vIG51bGwgdW50aWwgbG9hZGVkIOKAlCBnYXRlcyB0aGUgbGlzdCBiZWhpbmQgdGhlIHNrZWxldG9uLlxuICBwdWJsaWMgcmVhZG9ubHkgZW50aXR5RnVuY3Rpb25zID0gc2lnbmFsPFNlbWFudGljRW50aXR5RnVuY3Rpb25zIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIGNsYXNzIHRoaXMgZ3JvdXAncyBmdW5jdGlvbnMgd2VyZSBkaXNjb3ZlcmVkIGZyb20uIEEgc3RhbmRhbG9uZSBjb2RlXG4gIC8vIGNsYXNzIGhhcyBubyBoYW5kbGVyLCBzbyBpdHMgZ3JvdXAgcmVhZHMgdGhlIG1vZGVsIHNsb3QgbGlrZSAnbW9kZWwnIGRvZXMuXG4gIHB1YmxpYyByZWFkb25seSBkaXNjb3ZlcmVkQ2xhc3MgPSBjb21wdXRlZDxzdHJpbmcgfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgbG9hZGVkID0gdGhpcy5lbnRpdHlGdW5jdGlvbnMoKTtcblxuICAgIHJldHVybiB0aGlzLl9kYXRhLnNvdXJjZSA9PT0gJ2hhbmRsZXInID8gbG9hZGVkPy5oYW5kbGVyQ2xhc3MgOiBsb2FkZWQ/Lm1vZGVsQ2xhc3M7XG4gIH0pO1xuXG4gIC8vIFRoaXMgZ3JvdXAncyBmdW5jdGlvbnMsIG9yZGVyZWQgYnkga2luZCBwcmlvcml0eSB0aGVuIG1ldGhvZCBuYW1lLlxuICBwdWJsaWMgcmVhZG9ubHkgZnVuY3Rpb25zID0gY29tcHV0ZWQ8U2VtYW50aWNFbnRpdHlGdW5jdGlvbltdPigoKSA9PlxuICAgIHRoaXMuX3NvcnRGdW5jdGlvbnMoXG4gICAgICAodGhpcy5lbnRpdHlGdW5jdGlvbnMoKT8uZnVuY3Rpb25zID8/IFtdKVxuICAgICAgICAuZmlsdGVyKChmbikgPT4gZm4uc291cmNlID09PSB0aGlzLl9kYXRhLnNvdXJjZSksXG4gICAgKSxcbiAgKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpbmplY3QoUmVwb3J0RGF0YSkuc2VtYW50aWNFbnRpdHlGdW5jdGlvbnModGhpcy5fZGF0YS5lbnRpdHlLZXkpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUoKGVudGl0eUZ1bmN0aW9uczogU2VtYW50aWNFbnRpdHlGdW5jdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy5lbnRpdHlGdW5jdGlvbnMuc2V0KGVudGl0eUZ1bmN0aW9ucyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBraW5kQ29sb3Ioa2luZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50LktJTkRfQ09MT1JTW2tpbmRdID8/IEVudGl0eUZ1bmN0aW9uc0NvbXBvbmVudC5LSU5EX0NPTE9SUy5vdGhlcjtcbiAgfVxuXG4gIHByaXZhdGUgX3NvcnRGdW5jdGlvbnMoZnVuY3Rpb25zOiBTZW1hbnRpY0VudGl0eUZ1bmN0aW9uW10pOiBTZW1hbnRpY0VudGl0eUZ1bmN0aW9uW10ge1xuICAgIHJldHVybiBbLi4uZnVuY3Rpb25zXVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3Qga2luZERpZmYgPSB0aGlzLl9raW5kUmFuayhhLmtpbmQpIC0gdGhpcy5fa2luZFJhbmsoYi5raW5kKTtcblxuICAgICAgICByZXR1cm4ga2luZERpZmYgIT09IDAgPyBraW5kRGlmZiA6IGEubWV0aG9kLmxvY2FsZUNvbXBhcmUoYi5tZXRob2QpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9raW5kUmFuayhraW5kOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IHJhbmsgPSBFbnRpdHlGdW5jdGlvbnNDb21wb25lbnQuS0lORF9PUkRFUi5pbmRleE9mKGtpbmQpO1xuXG4gICAgcmV0dXJuIHJhbmsgPT09IC0xID8gRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50LktJTkRfT1JERVIubGVuZ3RoIDogcmFuaztcbiAgfVxufVxuIiwiPGZzLWRpYWxvZz5cbiAgPGZzLWRpYWxvZy10aXRsZT5cbiAgICB7eyBlbnRpdHlLZXkgfX0g4oCUIHt7IHNvdXJjZUxhYmVsIH19XG4gIDwvZnMtZGlhbG9nLXRpdGxlPlxuICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgIDxkaXYgKmZzU2tlbGV0b249XCJlbnRpdHlGdW5jdGlvbnMoKVwiPlxuICAgICAgQGlmIChlbnRpdHlGdW5jdGlvbnMoKTsgYXMgZm5zKSB7XG4gICAgICAgIEBpZiAoZnVuY3Rpb25zKCkubGVuZ3RoKSB7XG4gICAgICAgICAgQGlmIChmbnMuZ2VuZXJhdGVkQXQpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoaW50IGZ1bmN0aW9ucy1nZW5lcmF0ZWRcIj5cbiAgICAgICAgICAgICAgRGlzY292ZXJlZCBmcm9tIHt7IGRpc2NvdmVyZWRDbGFzcygpIH19ICZtaWRkb3Q7XG4gICAgICAgICAgICAgIDxmcy1kYXRlXG4gICAgICAgICAgICAgICAgICBbZGF0ZV09XCJmbnMuZ2VuZXJhdGVkQXRcIlxuICAgICAgICAgICAgICAgICAgZm9ybWF0PVwiZGF0ZS10aW1lXCI+XG4gICAgICAgICAgICAgIDwvZnMtZGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnVuY3Rpb25zLWxpc3RcIj5cbiAgICAgICAgICAgIEBmb3IgKGZuIG9mIGZ1bmN0aW9ucygpOyB0cmFjayBmbi5jbGFzcyArICc6OicgKyBmbi5tZXRob2QpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ1bmN0aW9uLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdW5jdGlvbi1oZWFkXCI+XG4gICAgICAgICAgICAgICAgICA8ZnMtY2hpcFxuICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJ0aW55XCJcbiAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cImtpbmRDb2xvcihmbi5raW5kKVwiXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCIjZmZmZmZmXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGZuLmtpbmQgfX1cbiAgICAgICAgICAgICAgICAgIDwvZnMtY2hpcD5cbiAgICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiZnVuY3Rpb24tbWV0aG9kXCI+e3sgZm4ubWV0aG9kIH19PC9jb2RlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdW5jdGlvbi1zdW1tYXJ5XCI+e3sgZm4uc3VtbWFyeSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIEBpZiAoZm4ucHJvZHVjZXMpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdW5jdGlvbi1wcm9kdWNlcyBoaW50XCI+UHJvZHVjZXM6IHt7IGZuLnByb2R1Y2VzIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhpbnRcIj5cbiAgICAgICAgICAgIE5vIGZ1bmN0aW9ucyBjYWNoZWQgZm9yIHRoaXMgZW50aXR5IHlldCDigJQgcnVuIGEgYnVpbGQgdG8gZGlzY292ZXIgaXRzIGNvZGUuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBbbWF0LWRpYWxvZy1jbG9zZV09XCJ1bmRlZmluZWRcIj5cbiAgICAgIENsb3NlXG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuPC9mcy1kaWFsb2c+XG4iXX0=