@firestitch/report 18.1.0 → 18.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. package/app/reports/components/component-list/component-list.component.d.ts +6 -2
  2. package/app/reports/components/report-canvas/report-canvas.component.d.ts +1 -0
  3. package/app/reports/data/report.data.d.ts +1 -0
  4. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +5 -1
  5. package/app/reports/interfaces/report.interface.d.ts +8 -0
  6. package/app/reports/views/report/fs-ai-report.component.d.ts +2 -0
  7. package/esm2022/app/reports/components/component-list/component-list.component.mjs +69 -14
  8. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +19 -2
  9. package/esm2022/app/reports/data/report.data.mjs +10 -1
  10. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +30 -6
  11. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  12. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +42 -4
  13. package/esm2022/app/reports/views/report/report.component.mjs +11 -2
  14. package/fesm2022/{firestitch-report-echarts-DPeQc3Lq.mjs → firestitch-report-echarts-Id_HJuQO.mjs} +2 -2
  15. package/fesm2022/{firestitch-report-echarts-DPeQc3Lq.mjs.map → firestitch-report-echarts-Id_HJuQO.mjs.map} +1 -1
  16. package/fesm2022/{firestitch-report-firestitch-report-BSGrWdzK.mjs → firestitch-report-firestitch-report-CfSwIwzw.mjs} +175 -27
  17. package/fesm2022/firestitch-report-firestitch-report-CfSwIwzw.mjs.map +1 -0
  18. package/fesm2022/firestitch-report.mjs +1 -1
  19. package/package.json +2 -2
  20. package/fesm2022/firestitch-report-firestitch-report-BSGrWdzK.mjs.map +0 -1
@@ -8,11 +8,13 @@ export declare class ComponentListComponent implements OnInit {
8
8
  groups: Map<number, ReportFilterGroup>;
9
9
  listComponent: FsListComponent;
10
10
  listConfig: FsListConfig;
11
- columns: {
11
+ columns: import("@angular/core").WritableSignal<{
12
12
  column: string;
13
13
  label?: string;
14
14
  format?: string;
15
- }[];
15
+ }[]>;
16
+ pivoted: import("@angular/core").WritableSignal<boolean>;
17
+ truncated: import("@angular/core").WritableSignal<boolean>;
16
18
  private _reportData;
17
19
  private _filterState;
18
20
  private _destroyRef;
@@ -21,6 +23,8 @@ export declare class ComponentListComponent implements OnInit {
21
23
  private _ownFilters;
22
24
  private _filterItem;
23
25
  private _fetch;
26
+ private _pivotColumns;
27
+ private _spansMultipleYears;
24
28
  private _barValues;
25
29
  static ɵfac: i0.ɵɵFactoryDeclaration<ComponentListComponent, never>;
26
30
  static ɵcmp: i0.ɵɵComponentDeclaration<ComponentListComponent, "app-report-component-list", never, { "reportId": { "alias": "reportId"; "required": false; }; "component": { "alias": "component"; "required": false; }; "groups": { "alias": "groups"; "required": false; }; }, {}, never, never, true, never>;
@@ -52,6 +52,7 @@ export declare class ReportCanvasComponent implements OnChanges, AfterViewInit {
52
52
  private _destroyRef;
53
53
  private _fitted;
54
54
  private _previousPageCount;
55
+ private _emittedPageId;
55
56
  ngOnChanges(): void;
56
57
  get headingSizePx(): number;
57
58
  ngAfterViewInit(): void;
@@ -23,6 +23,7 @@ export declare class ReportData<T = any> {
23
23
  order: number;
24
24
  }[], config?: RequestConfig): Observable<T>;
25
25
  updateComponent(reportId: number, componentId: number, settings: Record<string, unknown>, config?: RequestConfig): Observable<T>;
26
+ deleteComponent(reportId: number, componentId: number, config?: RequestConfig): Observable<T>;
26
27
  delete(reportId: number, config?: RequestConfig): Observable<T>;
27
28
  undelete(reportId: number, config?: RequestConfig): Observable<T>;
28
29
  get(reportId: number, config?: RequestConfig): Observable<T>;
@@ -3,7 +3,8 @@ import { Observable } from 'rxjs';
3
3
  import { ComponentSettings, Report, ReportComponent, ReportFilterType } from '../../interfaces/report.interface';
4
4
  import * as i0 from "@angular/core";
5
5
  export interface ComponentSettingsResult {
6
- settings: ComponentSettings;
6
+ settings?: ComponentSettings;
7
+ deleted?: boolean;
7
8
  }
8
9
  interface FilterRow {
9
10
  column: string;
@@ -36,9 +37,12 @@ export declare class ComponentSettingsComponent implements OnInit {
36
37
  private readonly _dialogRef;
37
38
  private readonly _reportData;
38
39
  private readonly _message;
40
+ private readonly _prompt;
41
+ private readonly _destroyRef;
39
42
  private readonly _cdRef;
40
43
  ngOnInit(): void;
41
44
  typeLabel(type: ReportFilterType): string;
45
+ delete(): void;
42
46
  save: () => Observable<any>;
43
47
  setExposure(row: FilterRow, target: 'report' | 'component', on: boolean): void;
44
48
  private _padding;
@@ -109,6 +109,14 @@ export interface ListConfig {
109
109
  format?: 'date';
110
110
  sortColumn?: string;
111
111
  }[];
112
+ rowBy?: {
113
+ column: string;
114
+ label?: string;
115
+ };
116
+ pivotBy?: {
117
+ column: string;
118
+ label?: string;
119
+ };
112
120
  sort?: ReportSort;
113
121
  pageSize?: number;
114
122
  }
@@ -12,6 +12,8 @@ export declare class FsAiReportComponent {
12
12
  report: Report | null;
13
13
  editMode: boolean;
14
14
  pageId: number | null;
15
+ readonly chatPageId: import("@angular/core").WritableSignal<number>;
16
+ readonly chatRequestData: import("@angular/core").Signal<Record<string, unknown>>;
15
17
  reportFilterConfig: FilterConfig;
16
18
  private _split;
17
19
  private _chatPanel;
@@ -1,10 +1,11 @@
1
- import { ChangeDetectionStrategy, Component, DestroyRef, Input, ViewChild, inject } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, DestroyRef, Input, ViewChild, inject, signal } from '@angular/core';
2
2
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
3
  import { DatePipe } from '@angular/common';
4
4
  import { ItemType } from '@firestitch/filter';
5
5
  import { FsListComponent, FsListModule, PaginationStrategy } from '@firestitch/list';
6
6
  import { map } from 'rxjs';
7
7
  import { ReportData } from '../../data/report.data';
8
+ import { formatPeriodLabel } from '../../option-builder';
8
9
  import { dateBoundString } from '../../report-filter-items';
9
10
  import { ReportFilterStateService } from '../../services/report-filter-state.service';
10
11
  import * as i0 from "@angular/core";
@@ -20,13 +21,29 @@ export class ComponentListComponent {
20
21
  groups;
21
22
  listComponent;
22
23
  listConfig;
23
- columns = [];
24
+ // A plain list's columns are authored and fixed at init. A cross-tab's are
25
+ // the pivot dimension's VALUES, so they arrive with the rows and change
26
+ // whenever the filters do — which is why this is a signal rather than the
27
+ // one-shot read it used to be.
28
+ columns = signal([]);
29
+ // A cross-tab sorts only by its row-key column: every other header is a
30
+ // pivot value, and the server orders the long rows before pivoting, so a
31
+ // click on "Mar 2026" has nothing to order by.
32
+ pivoted = signal(false);
33
+ // A cut result is worse for a grid than for a list: the cut lands on the LONG
34
+ // rows before the reshape, so a pivot value living only in the tail vanishes
35
+ // as a whole COLUMN and straddled cells come back blank, indistinguishable
36
+ // from a real zero. The parent's truncation banner never fires for a list
37
+ // (it only renders what _load() fetched, which lists skip), so the warning
38
+ // belongs here.
39
+ truncated = signal(false);
24
40
  _reportData = inject(ReportData);
25
41
  _filterState = inject(ReportFilterStateService);
26
42
  _destroyRef = inject(DestroyRef);
27
43
  ngOnInit() {
28
44
  const config = (this.component.config ?? {});
29
- this.columns = config.columns ?? [];
45
+ this.pivoted.set(!!config.pivotBy?.column);
46
+ this.columns.set(config.columns ?? []);
30
47
  this._initListConfig(config);
31
48
  // Report-level filter changes that scope this component re-run the list.
32
49
  this._filterState.changesFor(this.component)
@@ -136,14 +153,52 @@ export class ComponentListComponent {
136
153
  }
137
154
  return this._reportData
138
155
  .componentData(this.reportId, this.component.id, [...resolved.values()], state)
139
- .pipe(map((data) => ({
140
- data: data.rows ?? [],
141
- paging: {
142
- limit: data.paging?.pageSize ?? state.pageSize,
143
- records: data.paging?.total ?? (data.rows?.length ?? 0),
144
- page: data.paging?.page ?? state.page,
145
- },
146
- })));
156
+ .pipe(map((data) => {
157
+ // A cross-tab's headers come back with the rows: the row-key column
158
+ // first, then one per pivot value. Re-read them on every fetch, since
159
+ // a filter change can add or remove a column.
160
+ if (this.pivoted()) {
161
+ this.columns.set(this._pivotColumns(data));
162
+ this.truncated.set(!!data.truncated);
163
+ }
164
+ return {
165
+ data: data.rows ?? [],
166
+ paging: {
167
+ limit: data.paging?.pageSize ?? state.pageSize,
168
+ records: data.paging?.total ?? (data.rows?.length ?? 0),
169
+ page: data.paging?.page ?? state.page,
170
+ },
171
+ };
172
+ }));
173
+ }
174
+ // A cross-tab's columns, built from the wire. The first is the row key and
175
+ // keeps its authored label; the rest are pivot VALUES used as headings. When
176
+ // the pivot axis is a time dimension the server sends the grain it bucketed
177
+ // at, so a period-start like "2026-01-01" is shown as "Jan 2026" — the same
178
+ // formatter the chart's x-axis uses, so a grid and a chart of the same query
179
+ // label their periods identically.
180
+ _pivotColumns(data) {
181
+ const config = (this.component.config ?? {});
182
+ const granularity = data.granularity;
183
+ const multiYear = this._spansMultipleYears(data.columns ?? []);
184
+ return (data.columns ?? []).map((column, index) => {
185
+ if (index === 0) {
186
+ return { column, label: config.rowBy?.label || column };
187
+ }
188
+ return {
189
+ column,
190
+ label: granularity ? formatPeriodLabel(column, granularity, multiYear) : column,
191
+ };
192
+ });
193
+ }
194
+ // Whether the period columns cross a year boundary, which decides if the
195
+ // formatter appends the year to each heading.
196
+ _spansMultipleYears(columns) {
197
+ const years = new Set(columns
198
+ .map((column) => /^(\d{4})-\d{2}-\d{2}/.exec(column))
199
+ .filter(Boolean)
200
+ .map((match) => match[1]));
201
+ return years.size > 1;
147
202
  }
148
203
  // The list's own FsFilter values, read back out of the fetch query by the
149
204
  // `f<filterId>` naming convention.
@@ -180,14 +235,14 @@ export class ComponentListComponent {
180
235
  return values;
181
236
  }
182
237
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
183
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentListComponent, isStandalone: true, selector: "app-report-component-list", inputs: { reportId: "reportId", component: "component", groups: "groups" }, viewQueries: [{ propertyName: "listComponent", first: true, predicate: FsListComponent, descendants: true }], ngImport: i0, template: "<fs-list [config]=\"listConfig\">\n @for (column of columns; track column.column) {\n <fs-list-column\n [name]=\"column.column\"\n [title]=\"column.label || column.column\"\n [sortable]=\"true\">\n <ng-template\n fs-list-cell\n let-row=\"row\">\n @if (column.format === 'date') {\n {{ row[column.column] | date: 'mediumDate' }}\n } @else {\n {{ row[column.column] }}\n }\n </ng-template>\n </fs-list-column>\n }\n</fs-list>\n", styles: [":host{display:block;width:100%;height:100%;min-height:0}:host ::ng-deep fs-list{display:flex;flex-direction:column;height:100%;min-height:0}:host ::ng-deep fs-list .fs-list-container{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;height:100%}:host ::ng-deep fs-list .fs-list-header-container{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-container .fs-list-table-container{flex:1 1 auto;min-height:0;overflow-y:auto!important}:host ::ng-deep fs-list .fs-list-table thead th{position:sticky;top:0;z-index:1;background-color:#fff}:host ::ng-deep fs-list fs-list-pagination{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-load-more{position:sticky;bottom:0;background-color:#fff}:host ::ng-deep fs-list .fs-list-load-more button{margin-top:0}\n"], dependencies: [{ kind: "pipe", type: DatePipe, name: "date" }, { kind: "ngmodule", type: FsListModule }, { kind: "component", type: i1.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines", "cellRowType"], outputs: ["filtersReady"] }, { kind: "directive", type: i1.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customizable", "sortable", "sortableDefault", "sortableDirection", "direction", "align", "width", "class"] }, { kind: "directive", type: i1.FsListCellDirective, selector: "[fs-list-cell],[fsListCell]", inputs: ["colspan", "align", "class", "fsListCell", "configTyping"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
238
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentListComponent, isStandalone: true, selector: "app-report-component-list", inputs: { reportId: "reportId", component: "component", groups: "groups" }, viewQueries: [{ propertyName: "listComponent", first: true, predicate: FsListComponent, descendants: true }], ngImport: i0, template: "@if (truncated()) {\n <div class=\"pivot-truncated\">\n This grid was built from a partial result, so some columns or values may be missing. Narrow it with a filter.\n </div>\n}\n\n<fs-list [config]=\"listConfig\">\n @for (column of columns(); track column.column) {\n <fs-list-column\n [name]=\"column.column\"\n [title]=\"column.label || column.column\"\n [sortable]=\"!pivoted() || $first\">\n <ng-template\n fs-list-cell\n let-row=\"row\">\n @if (column.format === 'date') {\n {{ row[column.column] | date: 'mediumDate' }}\n } @else {\n {{ row[column.column] }}\n }\n </ng-template>\n </fs-list-column>\n }\n</fs-list>\n", styles: [":host{display:block;width:100%;height:100%;min-height:0}:host ::ng-deep fs-list{display:flex;flex-direction:column;height:100%;min-height:0}:host ::ng-deep fs-list .fs-list-container{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;height:100%}:host ::ng-deep fs-list .fs-list-header-container{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-container .fs-list-table-container{flex:1 1 auto;min-height:0;overflow-y:auto!important}:host ::ng-deep fs-list .fs-list-table thead th{position:sticky;top:0;z-index:1;background-color:#fff}:host ::ng-deep fs-list fs-list-pagination{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-load-more{position:sticky;bottom:0;background-color:#fff}:host ::ng-deep fs-list .fs-list-load-more button{margin-top:0}.pivot-truncated{flex:0 0 auto;padding:8px 12px;margin-bottom:8px;border-radius:4px;background-color:#fff4e5;color:#663c00}\n"], dependencies: [{ kind: "pipe", type: DatePipe, name: "date" }, { kind: "ngmodule", type: FsListModule }, { kind: "component", type: i1.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines", "cellRowType"], outputs: ["filtersReady"] }, { kind: "directive", type: i1.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customizable", "sortable", "sortableDefault", "sortableDirection", "direction", "align", "width", "class"] }, { kind: "directive", type: i1.FsListCellDirective, selector: "[fs-list-cell],[fsListCell]", inputs: ["colspan", "align", "class", "fsListCell", "configTyping"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
184
239
  }
185
240
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentListComponent, decorators: [{
186
241
  type: Component,
187
242
  args: [{ selector: 'app-report-component-list', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
188
243
  DatePipe,
189
244
  FsListModule,
190
- ], template: "<fs-list [config]=\"listConfig\">\n @for (column of columns; track column.column) {\n <fs-list-column\n [name]=\"column.column\"\n [title]=\"column.label || column.column\"\n [sortable]=\"true\">\n <ng-template\n fs-list-cell\n let-row=\"row\">\n @if (column.format === 'date') {\n {{ row[column.column] | date: 'mediumDate' }}\n } @else {\n {{ row[column.column] }}\n }\n </ng-template>\n </fs-list-column>\n }\n</fs-list>\n", styles: [":host{display:block;width:100%;height:100%;min-height:0}:host ::ng-deep fs-list{display:flex;flex-direction:column;height:100%;min-height:0}:host ::ng-deep fs-list .fs-list-container{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;height:100%}:host ::ng-deep fs-list .fs-list-header-container{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-container .fs-list-table-container{flex:1 1 auto;min-height:0;overflow-y:auto!important}:host ::ng-deep fs-list .fs-list-table thead th{position:sticky;top:0;z-index:1;background-color:#fff}:host ::ng-deep fs-list fs-list-pagination{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-load-more{position:sticky;bottom:0;background-color:#fff}:host ::ng-deep fs-list .fs-list-load-more button{margin-top:0}\n"] }]
245
+ ], template: "@if (truncated()) {\n <div class=\"pivot-truncated\">\n This grid was built from a partial result, so some columns or values may be missing. Narrow it with a filter.\n </div>\n}\n\n<fs-list [config]=\"listConfig\">\n @for (column of columns(); track column.column) {\n <fs-list-column\n [name]=\"column.column\"\n [title]=\"column.label || column.column\"\n [sortable]=\"!pivoted() || $first\">\n <ng-template\n fs-list-cell\n let-row=\"row\">\n @if (column.format === 'date') {\n {{ row[column.column] | date: 'mediumDate' }}\n } @else {\n {{ row[column.column] }}\n }\n </ng-template>\n </fs-list-column>\n }\n</fs-list>\n", styles: [":host{display:block;width:100%;height:100%;min-height:0}:host ::ng-deep fs-list{display:flex;flex-direction:column;height:100%;min-height:0}:host ::ng-deep fs-list .fs-list-container{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;height:100%}:host ::ng-deep fs-list .fs-list-header-container{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-container .fs-list-table-container{flex:1 1 auto;min-height:0;overflow-y:auto!important}:host ::ng-deep fs-list .fs-list-table thead th{position:sticky;top:0;z-index:1;background-color:#fff}:host ::ng-deep fs-list fs-list-pagination{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-load-more{position:sticky;bottom:0;background-color:#fff}:host ::ng-deep fs-list .fs-list-load-more button{margin-top:0}.pivot-truncated{flex:0 0 auto;padding:8px 12px;margin-bottom:8px;border-radius:4px;background-color:#fff4e5;color:#663c00}\n"] }]
191
246
  }], propDecorators: { reportId: [{
192
247
  type: Input
193
248
  }], component: [{
@@ -198,4 +253,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
198
253
  type: ViewChild,
199
254
  args: [FsListComponent]
200
255
  }] } });
201
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFnQixZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVuRyxPQUFPLEVBQWMsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVdwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNENBQTRDLENBQUM7OztBQUd0RiwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLHdFQUF3RTtBQUN4RSx3RUFBd0U7QUFDeEUsK0RBQStEO0FBWS9ELE1BQU0sT0FBTyxzQkFBc0I7SUFFakIsUUFBUSxDQUFTO0lBQ2pCLFNBQVMsQ0FBa0I7SUFDM0IsTUFBTSxDQUFpQztJQUdoRCxhQUFhLENBQWtC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LENBQUM7Z0JBQ2pELElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1osTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO3dHQTlMVSxzQkFBc0I7NEZBQXRCLHNCQUFzQixnTkFNdEIsZUFBZSxnREM5QzVCLGlnQkFrQkEseXlCRGtCSSxRQUFRLDRDQUNSLFlBQVk7OzRGQUdILHNCQUFzQjtrQkFYbEMsU0FBUzsrQkFDRSwyQkFBMkIsbUJBR3BCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLFFBQVE7d0JBQ1IsWUFBWTtxQkFDYjs4QkFJZSxRQUFRO3NCQUF2QixLQUFLO2dCQUNVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBQ1UsTUFBTTtzQkFBckIsS0FBSztnQkFHQyxhQUFhO3NCQURuQixTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2ZpbHRlcic7XG5pbXBvcnQgeyBGc0xpc3RDb21wb25lbnQsIEZzTGlzdENvbmZpZywgRnNMaXN0TW9kdWxlLCBQYWdpbmF0aW9uU3RyYXRlZ3kgfSBmcm9tICdAZmlyZXN0aXRjaC9saXN0JztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgbWFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgTGlzdENvbmZpZyxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGaWx0ZXIsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRGaWx0ZXJPcHRpb24sXG4gIFJlc29sdmVkRmlsdGVyVmFsdWUsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBkYXRlQm91bmRTdHJpbmcgfSBmcm9tICcuLi8uLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5cblxuLy8gQSBsaXN0IGNvbXBvbmVudDogRnNMaXN0ICsgRnNGaWx0ZXIgcmVuZGVyZWQgZnJvbSB0aGUgY29tcG9uZW50J3MgY29uZmlnIGFuZFxuLy8gaXRzIHJlcG9ydF9maWx0ZXJzIHJvd3MuIFRoZSBjb21wb25lbnQncyBvd24gZmlsdGVyIGJhciBjYXJyaWVzIGl0cyBmaWx0ZXJzXG4vLyB3aG9zZSBncm91cCByZW5kZXJzIGF0IHRoZSBjb21wb25lbnQgbGV2ZWw7IHJlcG9ydC1sZXZlbCBncm91cHMgYXBwbHlcbi8vIHRocm91Z2ggdGhlIHNoYXJlZCBmaWx0ZXItc3RhdGUgc2VydmljZSBhbmQgbWVyZ2UgaW50byBldmVyeSByZXF1ZXN0LlxuLy8gUGFnaW5nIGFuZCBzb3J0aW5nIGFyZSBwdXNoZWQgaW50byB0aGUgU1FMIHdyYXAgc2VydmVyLXNpZGUuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVwb3J0LWNvbXBvbmVudC1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBvbmVudC1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29tcG9uZW50LWxpc3QuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBEYXRlUGlwZSxcbiAgICBGc0xpc3RNb2R1bGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudExpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIHB1YmxpYyByZXBvcnRJZDogbnVtYmVyO1xuICBASW5wdXQoKSBwdWJsaWMgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIEBJbnB1dCgpIHB1YmxpYyBncm91cHM6IE1hcDxudW1iZXIsIFJlcG9ydEZpbHRlckdyb3VwPjtcblxuICBAVmlld0NoaWxkKEZzTGlzdENvbXBvbmVudClcbiAgcHVibGljIGxpc3RDb21wb25lbnQ6IEZzTGlzdENvbXBvbmVudDtcblxuICBwdWJsaWMgbGlzdENvbmZpZzogRnNMaXN0Q29uZmlnO1xuICBwdWJsaWMgY29sdW1uczogeyBjb2x1bW46IHN0cmluZzsgbGFiZWw/OiBzdHJpbmc7IGZvcm1hdD86IHN0cmluZyB9W10gPSBbXTtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSAodGhpcy5jb21wb25lbnQuY29uZmlnID8/IHt9KSBhcyBMaXN0Q29uZmlnO1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbmZpZy5jb2x1bW5zID8/IFtdO1xuXG4gICAgdGhpcy5faW5pdExpc3RDb25maWcoY29uZmlnKTtcblxuICAgIC8vIFJlcG9ydC1sZXZlbCBmaWx0ZXIgY2hhbmdlcyB0aGF0IHNjb3BlIHRoaXMgY29tcG9uZW50IHJlLXJ1biB0aGUgbGlzdC5cbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5jaGFuZ2VzRm9yKHRoaXMuY29tcG9uZW50KVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmxpc3RDb21wb25lbnQ/LnJlbG9hZCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRMaXN0Q29uZmlnKGNvbmZpZzogTGlzdENvbmZpZyk6IHZvaWQge1xuICAgIHRoaXMubGlzdENvbmZpZyA9IHtcbiAgICAgIC8vIEluc2lkZSBhIHJlcG9ydCBjb21wb25lbnQgdGhlIGxpc3QgaXMgYSBjbGVhbiBkYXRhIHBhbmUg4oCUIG5vIHN0YXR1c1xuICAgICAgLy8gYmFyLCBubyByZWxvYWQgYnV0dG9uIChmaWx0ZXIgY2hhbmdlcyBhbHJlYWR5IHJlZmV0Y2gpLlxuICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgIHJlbG9hZDogZmFsc2UsXG4gICAgICAvLyBOZXZlciB0b3VjaCB0aGUgVVJMIG9yIHBlcnNpc3QgZmlsdGVyL3BhZ2luZyBzdGF0ZSDigJQgcmVwb3J0IGZpbHRlcmluZ1xuICAgICAgLy8gaXMgc2Vzc2lvbi1vbmx5LlxuICAgICAgcXVlcnlQYXJhbTogZmFsc2UsXG4gICAgICBwZXJzaXN0OiBmYWxzZSxcbiAgICAgIHNvcnQ6IGNvbmZpZy5zb3J0XG4gICAgICAgID8geyB2YWx1ZTogY29uZmlnLnNvcnQuY29sdW1uLCBkaXJlY3Rpb246IGNvbmZpZy5zb3J0LmRpcmVjdGlvbiA/PyAnYXNjJyB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgLy8gTG9hZC1tb3JlOiB0aGUgbGlzdCBrZWVwcyBhIGZpeGVkLCBzY3JvbGxhYmxlIGhlaWdodCBhbmQgYXBwZW5kcyB0aGVcbiAgICAgIC8vIG5leHQgcGFnZSBpbiBwbGFjZSBpbnN0ZWFkIG9mIHN3YXBwaW5nIHBhZ2VzLiBUaGUgYnV0dG9uIGlzIHBpbm5lZCB0b1xuICAgICAgLy8gdGhlIGJvdHRvbSBvZiB0aGUgc2Nyb2xsIHBhbmUgKHNlZSBjb21wb25lbnQgU0NTUykuXG4gICAgICAvL1xuICAgICAgLy8gVXNlcyB0aGUgT2Zmc2V0IHN0cmF0ZWd5IChvZmZzZXQgKyBsaW1pdCkgcmF0aGVyIHRoYW4gTWFueTogaW5cbiAgICAgIC8vIEBmaXJlc3RpdGNoL2xpc3QgdGhlIHBhZ2luYXRpb24gdGVtcGxhdGUgcmVzb2x2ZXMgYGhhc01hbnlTdHJhdGVneWBcbiAgICAgIC8vIEJFRk9SRSBgbG9hZE1vcmVFbmFibGVkYCwgYW5kIE1hbnkgcmVuZGVycyBhIGZvcndhcmQtb25seSBwYWdlIHBhZ2VyIOKAlFxuICAgICAgLy8gc28gTWFueSB3b3VsZCBzdXBwcmVzcyB0aGUgbG9hZC1tb3JlIGJ1dHRvbiBlbnRpcmVseS4gT2Zmc2V0ICsgbG9hZE1vcmVcbiAgICAgIC8vIGlzIHRoZSBjb21iaW5hdGlvbiB0aGF0IGFjdHVhbGx5IHJlbmRlcnMgYW5kIGFwcGVuZHMuIGBfZmV0Y2hgIGFscmVhZHlcbiAgICAgIC8vIGRlcml2ZXMgYHBhZ2VgIGZyb20gYG9mZnNldGAsIHNvIHRoZSBzZXJ2ZXItc2lkZSB3cmFwIGlzIHVuYWZmZWN0ZWQuXG4gICAgICBwYWdpbmc6IHtcbiAgICAgICAgbGltaXQ6IGNvbmZpZy5wYWdlU2l6ZSA/PyAyNSxcbiAgICAgICAgc3RyYXRlZ3k6IFBhZ2luYXRpb25TdHJhdGVneS5PZmZzZXQsXG4gICAgICB9LFxuICAgICAgbG9hZE1vcmU6IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbGFiZWw6ICdMb2FkIG1vcmUnLFxuICAgICAgICBidXR0b25UeXBlOiAnc3Ryb2tlZCcsXG4gICAgICB9LFxuICAgICAgZmlsdGVyczogdGhpcy5fb3duRmlsdGVycygpLm1hcCgoZmlsdGVyKSA9PiB0aGlzLl9maWx0ZXJJdGVtKGZpbHRlcikpLFxuICAgICAgZmV0Y2g6IChxdWVyeTogYW55KSA9PiB0aGlzLl9mZXRjaChxdWVyeSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRoZSBmaWx0ZXJzIHRoaXMgbGlzdCByZW5kZXJzIGluIGl0cyBvd24gYmFyOiBpdHMgcmVwb3J0X2ZpbHRlcnMgd2hvc2VcbiAgLy8gZ3JvdXAgaXMgY29tcG9uZW50LWxldmVsLiBSZXBvcnQtbGV2ZWwgZ3JvdXBzIHJlbmRlciBpbiB0aGUgcmVwb3J0IGJhci5cbiAgcHJpdmF0ZSBfb3duRmlsdGVycygpOiBSZXBvcnRGaWx0ZXJbXSB7XG4gICAgcmV0dXJuICh0aGlzLmNvbXBvbmVudC5maWx0ZXJzID8/IFtdKVxuICAgICAgLmZpbHRlcigoZmlsdGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmdldChmaWx0ZXIuZmlsdGVyR3JvdXBJZCk7XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlci5lbmFibGVkICYmICghZ3JvdXAgfHwgZ3JvdXAubGV2ZWwgPT09ICdjb21wb25lbnQnIHx8IGdyb3VwLmxldmVsID09PSAnYm90aCcpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9maWx0ZXJJdGVtKGZpbHRlcjogUmVwb3J0RmlsdGVyKTogYW55IHtcbiAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5nZXQoZmlsdGVyLmZpbHRlckdyb3VwSWQpO1xuICAgIGNvbnN0IG5hbWUgPSBgZiR7ZmlsdGVyLmlkfWA7XG4gICAgY29uc3QgbGFiZWwgPSBmaWx0ZXIubGFiZWwgfHwgZ3JvdXA/LmxhYmVsIHx8IGZpbHRlci5maWx0ZXJDb2x1bW47XG5cbiAgICBzd2l0Y2ggKGdyb3VwPy50eXBlKSB7XG4gICAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgdHlwZTogSXRlbVR5cGUuRGF0ZVJhbmdlLFxuICAgICAgICAgIGxhYmVsOiBbYCR7bGFiZWx9IEZyb21gLCBgJHtsYWJlbH0gVG9gXSxcbiAgICAgICAgfTtcblxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLkF1dG9Db21wbGV0ZUNoaXBzLFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIC8vIFRoZSBzZXJ2ZXIgc2VuZHMgeyB2YWx1ZSwgbGFiZWwgfTogdGhlIGZpbHRlciBtYXRjaGVzIG9uIHRoZSB2YWx1ZVxuICAgICAgICAgIC8vIChhbiBlbnRpdHkncyBzdGFibGUgaWQpIHdoaWxlIHRoZSB2aWV3ZXIgcmVhZHMgdGhlIGxhYmVsLlxuICAgICAgICAgIHZhbHVlczogKCkgPT4gdGhpcy5fcmVwb3J0RGF0YS5maWx0ZXJPcHRpb25zKHRoaXMucmVwb3J0SWQsIGZpbHRlci5pZClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBtYXAoKG9wdGlvbnM6IFJlcG9ydEZpbHRlck9wdGlvbltdKSA9PiAob3B0aW9ucyA/PyBbXSlcbiAgICAgICAgICAgICAgICAubWFwKChvcHRpb24pID0+ICh7IG5hbWU6IG9wdGlvbi5sYWJlbCwgdmFsdWU6IG9wdGlvbi52YWx1ZSB9KSkpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgfTtcblxuICAgICAgY2FzZSAna2V5d29yZCc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgdHlwZTogSXRlbVR5cGUuS2V5d29yZCxcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9mZXRjaChxdWVyeTogYW55KTogT2JzZXJ2YWJsZTx7IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107IHBhZ2luZzogYW55IH0+IHtcbiAgICAvLyBNYW55L2xvYWQtbW9yZSBzZW5kcyBgb2Zmc2V0YCArIGBsaW1pdGAgKG5vdCBgcGFnZWApOyBkZXJpdmUgdGhlIHBhZ2Ugc29cbiAgICAvLyB0aGUgc2VydmVyLXNpZGUgd3JhcCBrZWVwcyB3b3JraW5nIHVuY2hhbmdlZC4gUGFnZSBzdHJhdGVneSBzdGlsbCBzZW5kc1xuICAgIC8vIGBwYWdlYCBkaXJlY3RseS5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IHF1ZXJ5LmxpbWl0ID8/IDI1O1xuICAgIGNvbnN0IHBhZ2UgPSBxdWVyeS5wYWdlXG4gICAgICA/PyAocXVlcnkub2Zmc2V0ICE9IG51bGwgPyBNYXRoLmZsb29yKHF1ZXJ5Lm9mZnNldCAvIHBhZ2VTaXplKSArIDEgOiAxKTtcblxuICAgIGNvbnN0IHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSB7XG4gICAgICBwYWdlLFxuICAgICAgcGFnZVNpemUsXG4gICAgfTtcblxuICAgIGNvbnN0IG9yZGVyID0gU3RyaW5nKHF1ZXJ5Lm9yZGVyID8/ICcnKTtcbiAgICBpZiAob3JkZXIpIHtcbiAgICAgIGNvbnN0IFtjb2x1bW4sIGRpcmVjdGlvbl0gPSBvcmRlci5zcGxpdCgnLCcpO1xuICAgICAgc3RhdGUuc29ydCA9IHsgY29sdW1uLCBkaXJlY3Rpb246IGRpcmVjdGlvbiA9PT0gJ2Rlc2MnID8gJ2Rlc2MnIDogJ2FzYycgfTtcbiAgICB9XG5cbiAgICAvLyBSZXBvcnQtbGV2ZWwgdmFsdWVzIGZyb20gdGhlIHNoYXJlZCBzZXNzaW9uIHN0YXRlLCBtZXJnZWQgd2l0aCB0aGlzXG4gICAgLy8gbGlzdCdzIG93biBmaWx0ZXItYmFyIHZhbHVlcyAob3duIHZhbHVlcyB3aW4gcGVyIGZpbHRlcikuXG4gICAgY29uc3QgcmVzb2x2ZWQgPSBuZXcgTWFwPG51bWJlciwgUmVzb2x2ZWRGaWx0ZXJWYWx1ZT4oKTtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQodGhpcy5jb21wb25lbnQpKSB7XG4gICAgICByZXNvbHZlZC5zZXQodmFsdWUuZmlsdGVySWQsIHZhbHVlKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLl9iYXJWYWx1ZXMocXVlcnkpKSB7XG4gICAgICByZXNvbHZlZC5zZXQodmFsdWUuZmlsdGVySWQsIHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YVxuICAgICAgLmNvbXBvbmVudERhdGEodGhpcy5yZXBvcnRJZCwgdGhpcy5jb21wb25lbnQuaWQsIFsuLi5yZXNvbHZlZC52YWx1ZXMoKV0sIHN0YXRlKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoZGF0YTogQ29tcG9uZW50RGF0YSkgPT4gKHtcbiAgICAgICAgICBkYXRhOiBkYXRhLnJvd3MgPz8gW10sXG4gICAgICAgICAgcGFnaW5nOiB7XG4gICAgICAgICAgICBsaW1pdDogZGF0YS5wYWdpbmc/LnBhZ2VTaXplID8/IHN0YXRlLnBhZ2VTaXplLFxuICAgICAgICAgICAgcmVjb3JkczogZGF0YS5wYWdpbmc/LnRvdGFsID8/IChkYXRhLnJvd3M/Lmxlbmd0aCA/PyAwKSxcbiAgICAgICAgICAgIHBhZ2U6IGRhdGEucGFnaW5nPy5wYWdlID8/IHN0YXRlLnBhZ2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBsaXN0J3Mgb3duIEZzRmlsdGVyIHZhbHVlcywgcmVhZCBiYWNrIG91dCBvZiB0aGUgZmV0Y2ggcXVlcnkgYnkgdGhlXG4gIC8vIGBmPGZpbHRlcklkPmAgbmFtaW5nIGNvbnZlbnRpb24uXG4gIHByaXZhdGUgX2JhclZhbHVlcyhxdWVyeTogYW55KTogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdIHtcbiAgICBjb25zdCB2YWx1ZXM6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgdGhpcy5fb3duRmlsdGVycygpKSB7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5nZXQoZmlsdGVyLmZpbHRlckdyb3VwSWQpO1xuICAgICAgY29uc3QgbmFtZSA9IGBmJHtmaWx0ZXIuaWR9YDtcblxuICAgICAgaWYgKGdyb3VwPy50eXBlID09PSAnZGF0ZVJhbmdlJykge1xuICAgICAgICBjb25zdCBmcm9tID0gZGF0ZUJvdW5kU3RyaW5nKHF1ZXJ5W2Ake25hbWV9RnJvbWBdKTtcbiAgICAgICAgY29uc3QgdG8gPSBkYXRlQm91bmRTdHJpbmcocXVlcnlbYCR7bmFtZX1Ub2BdKTtcbiAgICAgICAgaWYgKGZyb20gfHwgdG8pIHtcbiAgICAgICAgICB2YWx1ZXMucHVzaCh7IGZpbHRlcklkOiBmaWx0ZXIuaWQsIHN0YXJ0OiBmcm9tLCBlbmQ6IHRvIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGdyb3VwPy50eXBlID09PSAnc2VsZWN0Jykge1xuICAgICAgICAvLyBmcy1maWx0ZXIgam9pbnMgYSBtdWx0aS1zZWxlY3QgaW50byBvbmUgXCJhLGJcIiBzdHJpbmc7IHNwbGl0IGl0IGJhY2tcbiAgICAgICAgLy8gc28gZWFjaCB2YWx1ZSBiaW5kcyBzZXBhcmF0ZWx5IChlbHNlIGBjb2wgSU4gKCdhLGInKWAgbWF0Y2hlcyBub3RoaW5nKS5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBxdWVyeVtuYW1lXTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXMgPSBBcnJheS5pc0FycmF5KHNlbGVjdGVkKVxuICAgICAgICAgID8gc2VsZWN0ZWRcbiAgICAgICAgICA6IChzZWxlY3RlZCA/IFN0cmluZyhzZWxlY3RlZCkuc3BsaXQoJywnKSA6IFtdKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkVmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgIHZhbHVlcy5wdXNoKHsgZmlsdGVySWQ6IGZpbHRlci5pZCwgdmFsdWVzOiBzZWxlY3RlZFZhbHVlcyB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qga2V5d29yZCA9IFN0cmluZyhxdWVyeVtuYW1lXSA/PyAnJykudHJpbSgpO1xuICAgICAgICBpZiAoa2V5d29yZCkge1xuICAgICAgICAgIHZhbHVlcy5wdXNoKHsgZmlsdGVySWQ6IGZpbHRlci5pZCwgdmFsdWU6IGtleXdvcmQgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG59XG4iLCI8ZnMtbGlzdCBbY29uZmlnXT1cImxpc3RDb25maWdcIj5cbiAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnM7IHRyYWNrIGNvbHVtbi5jb2x1bW4pIHtcbiAgICA8ZnMtbGlzdC1jb2x1bW5cbiAgICAgIFtuYW1lXT1cImNvbHVtbi5jb2x1bW5cIlxuICAgICAgW3RpdGxlXT1cImNvbHVtbi5sYWJlbCB8fCBjb2x1bW4uY29sdW1uXCJcbiAgICAgIFtzb3J0YWJsZV09XCJ0cnVlXCI+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgZnMtbGlzdC1jZWxsXG4gICAgICAgIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgICAgQGlmIChjb2x1bW4uZm9ybWF0ID09PSAnZGF0ZScpIHtcbiAgICAgICAgICB7eyByb3dbY29sdW1uLmNvbHVtbl0gfCBkYXRlOiAnbWVkaXVtRGF0ZScgfX1cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAge3sgcm93W2NvbHVtbi5jb2x1bW5dIH19XG4gICAgICAgIH1cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9mcy1saXN0LWNvbHVtbj5cbiAgfVxuPC9mcy1saXN0PlxuIl19
256
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkcsT0FBTyxFQUFjLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV2QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFXcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOzs7QUFHdEYsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSx3RUFBd0U7QUFDeEUsd0VBQXdFO0FBQ3hFLCtEQUErRDtBQVkvRCxNQUFNLE9BQU8sc0JBQXNCO0lBRWpCLFFBQVEs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QUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7d0dBL1BVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLGdOQU10QixlQUFlLGdEQy9DNUIsNnNCQXdCQSxvNkJEYUksUUFBUSw0Q0FDUixZQUFZOzs0RkFHSCxzQkFBc0I7a0JBWGxDLFNBQVM7K0JBQ0UsMkJBQTJCLG1CQUdwQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxRQUFRO3dCQUNSLFlBQVk7cUJBQ2I7OEJBSWUsUUFBUTtzQkFBdkIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLE1BQU07c0JBQXJCLEtBQUs7Z0JBR0MsYUFBYTtzQkFEbkIsU0FBUzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRGVzdHJveVJlZiwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2ZpbHRlcic7XG5pbXBvcnQgeyBGc0xpc3RDb21wb25lbnQsIEZzTGlzdENvbmZpZywgRnNMaXN0TW9kdWxlLCBQYWdpbmF0aW9uU3RyYXRlZ3kgfSBmcm9tICdAZmlyZXN0aXRjaC9saXN0JztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgbWFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgTGlzdENvbmZpZyxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGaWx0ZXIsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRGaWx0ZXJPcHRpb24sXG4gIFJlc29sdmVkRmlsdGVyVmFsdWUsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBmb3JtYXRQZXJpb2RMYWJlbCB9IGZyb20gJy4uLy4uL29wdGlvbi1idWlsZGVyJztcbmltcG9ydCB7IGRhdGVCb3VuZFN0cmluZyB9IGZyb20gJy4uLy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcblxuXG4vLyBBIGxpc3QgY29tcG9uZW50OiBGc0xpc3QgKyBGc0ZpbHRlciByZW5kZXJlZCBmcm9tIHRoZSBjb21wb25lbnQncyBjb25maWcgYW5kXG4vLyBpdHMgcmVwb3J0X2ZpbHRlcnMgcm93cy4gVGhlIGNvbXBvbmVudCdzIG93biBmaWx0ZXIgYmFyIGNhcnJpZXMgaXRzIGZpbHRlcnNcbi8vIHdob3NlIGdyb3VwIHJlbmRlcnMgYXQgdGhlIGNvbXBvbmVudCBsZXZlbDsgcmVwb3J0LWxldmVsIGdyb3VwcyBhcHBseVxuLy8gdGhyb3VnaCB0aGUgc2hhcmVkIGZpbHRlci1zdGF0ZSBzZXJ2aWNlIGFuZCBtZXJnZSBpbnRvIGV2ZXJ5IHJlcXVlc3QuXG4vLyBQYWdpbmcgYW5kIHNvcnRpbmcgYXJlIHB1c2hlZCBpbnRvIHRoZSBTUUwgd3JhcCBzZXJ2ZXItc2lkZS5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY29tcG9uZW50LWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wb25lbnQtbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIERhdGVQaXBlLFxuICAgIEZzTGlzdE1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50TGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgcHVibGljIHJlcG9ydElkOiBudW1iZXI7XG4gIEBJbnB1dCgpIHB1YmxpYyBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudDtcbiAgQElucHV0KCkgcHVibGljIGdyb3VwczogTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+O1xuXG4gIEBWaWV3Q2hpbGQoRnNMaXN0Q29tcG9uZW50KVxuICBwdWJsaWMgbGlzdENvbXBvbmVudDogRnNMaXN0Q29tcG9uZW50O1xuXG4gIHB1YmxpYyBsaXN0Q29uZmlnOiBGc0xpc3RDb25maWc7XG5cbiAgLy8gQSBwbGFpbiBsaXN0J3MgY29sdW1ucyBhcmUgYXV0aG9yZWQgYW5kIGZpeGVkIGF0IGluaXQuIEEgY3Jvc3MtdGFiJ3MgYXJlXG4gIC8vIHRoZSBwaXZvdCBkaW1lbnNpb24ncyBWQUxVRVMsIHNvIHRoZXkgYXJyaXZlIHdpdGggdGhlIHJvd3MgYW5kIGNoYW5nZVxuICAvLyB3aGVuZXZlciB0aGUgZmlsdGVycyBkbyDigJQgd2hpY2ggaXMgd2h5IHRoaXMgaXMgYSBzaWduYWwgcmF0aGVyIHRoYW4gdGhlXG4gIC8vIG9uZS1zaG90IHJlYWQgaXQgdXNlZCB0byBiZS5cbiAgcHVibGljIGNvbHVtbnMgPSBzaWduYWw8eyBjb2x1bW46IHN0cmluZzsgbGFiZWw/OiBzdHJpbmc7IGZvcm1hdD86IHN0cmluZyB9W10+KFtdKTtcblxuICAvLyBBIGNyb3NzLXRhYiBzb3J0cyBvbmx5IGJ5IGl0cyByb3cta2V5IGNvbHVtbjogZXZlcnkgb3RoZXIgaGVhZGVyIGlzIGFcbiAgLy8gcGl2b3QgdmFsdWUsIGFuZCB0aGUgc2VydmVyIG9yZGVycyB0aGUgbG9uZyByb3dzIGJlZm9yZSBwaXZvdGluZywgc28gYVxuICAvLyBjbGljayBvbiBcIk1hciAyMDI2XCIgaGFzIG5vdGhpbmcgdG8gb3JkZXIgYnkuXG4gIHB1YmxpYyBwaXZvdGVkID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBBIGN1dCByZXN1bHQgaXMgd29yc2UgZm9yIGEgZ3JpZCB0aGFuIGZvciBhIGxpc3Q6IHRoZSBjdXQgbGFuZHMgb24gdGhlIExPTkdcbiAgLy8gcm93cyBiZWZvcmUgdGhlIHJlc2hhcGUsIHNvIGEgcGl2b3QgdmFsdWUgbGl2aW5nIG9ubHkgaW4gdGhlIHRhaWwgdmFuaXNoZXNcbiAgLy8gYXMgYSB3aG9sZSBDT0xVTU4gYW5kIHN0cmFkZGxlZCBjZWxscyBjb21lIGJhY2sgYmxhbmssIGluZGlzdGluZ3Vpc2hhYmxlXG4gIC8vIGZyb20gYSByZWFsIHplcm8uIFRoZSBwYXJlbnQncyB0cnVuY2F0aW9uIGJhbm5lciBuZXZlciBmaXJlcyBmb3IgYSBsaXN0XG4gIC8vIChpdCBvbmx5IHJlbmRlcnMgd2hhdCBfbG9hZCgpIGZldGNoZWQsIHdoaWNoIGxpc3RzIHNraXApLCBzbyB0aGUgd2FybmluZ1xuICAvLyBiZWxvbmdzIGhlcmUuXG4gIHB1YmxpYyB0cnVuY2F0ZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZyA9ICh0aGlzLmNvbXBvbmVudC5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG4gICAgdGhpcy5waXZvdGVkLnNldCghIWNvbmZpZy5waXZvdEJ5Py5jb2x1bW4pO1xuICAgIHRoaXMuY29sdW1ucy5zZXQoY29uZmlnLmNvbHVtbnMgPz8gW10pO1xuXG4gICAgdGhpcy5faW5pdExpc3RDb25maWcoY29uZmlnKTtcblxuICAgIC8vIFJlcG9ydC1sZXZlbCBmaWx0ZXIgY2hhbmdlcyB0aGF0IHNjb3BlIHRoaXMgY29tcG9uZW50IHJlLXJ1biB0aGUgbGlzdC5cbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5jaGFuZ2VzRm9yKHRoaXMuY29tcG9uZW50KVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmxpc3RDb21wb25lbnQ/LnJlbG9hZCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRMaXN0Q29uZmlnKGNvbmZpZzogTGlzdENvbmZpZyk6IHZvaWQge1xuICAgIHRoaXMubGlzdENvbmZpZyA9IHtcbiAgICAgIC8vIEluc2lkZSBhIHJlcG9ydCBjb21wb25lbnQgdGhlIGxpc3QgaXMgYSBjbGVhbiBkYXRhIHBhbmUg4oCUIG5vIHN0YXR1c1xuICAgICAgLy8gYmFyLCBubyByZWxvYWQgYnV0dG9uIChmaWx0ZXIgY2hhbmdlcyBhbHJlYWR5IHJlZmV0Y2gpLlxuICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgIHJlbG9hZDogZmFsc2UsXG4gICAgICAvLyBOZXZlciB0b3VjaCB0aGUgVVJMIG9yIHBlcnNpc3QgZmlsdGVyL3BhZ2luZyBzdGF0ZSDigJQgcmVwb3J0IGZpbHRlcmluZ1xuICAgICAgLy8gaXMgc2Vzc2lvbi1vbmx5LlxuICAgICAgcXVlcnlQYXJhbTogZmFsc2UsXG4gICAgICBwZXJzaXN0OiBmYWxzZSxcbiAgICAgIHNvcnQ6IGNvbmZpZy5zb3J0XG4gICAgICAgID8geyB2YWx1ZTogY29uZmlnLnNvcnQuY29sdW1uLCBkaXJlY3Rpb246IGNvbmZpZy5zb3J0LmRpcmVjdGlvbiA/PyAnYXNjJyB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgLy8gTG9hZC1tb3JlOiB0aGUgbGlzdCBrZWVwcyBhIGZpeGVkLCBzY3JvbGxhYmxlIGhlaWdodCBhbmQgYXBwZW5kcyB0aGVcbiAgICAgIC8vIG5leHQgcGFnZSBpbiBwbGFjZSBpbnN0ZWFkIG9mIHN3YXBwaW5nIHBhZ2VzLiBUaGUgYnV0dG9uIGlzIHBpbm5lZCB0b1xuICAgICAgLy8gdGhlIGJvdHRvbSBvZiB0aGUgc2Nyb2xsIHBhbmUgKHNlZSBjb21wb25lbnQgU0NTUykuXG4gICAgICAvL1xuICAgICAgLy8gVXNlcyB0aGUgT2Zmc2V0IHN0cmF0ZWd5IChvZmZzZXQgKyBsaW1pdCkgcmF0aGVyIHRoYW4gTWFueTogaW5cbiAgICAgIC8vIEBmaXJlc3RpdGNoL2xpc3QgdGhlIHBhZ2luYXRpb24gdGVtcGxhdGUgcmVzb2x2ZXMgYGhhc01hbnlTdHJhdGVneWBcbiAgICAgIC8vIEJFRk9SRSBgbG9hZE1vcmVFbmFibGVkYCwgYW5kIE1hbnkgcmVuZGVycyBhIGZvcndhcmQtb25seSBwYWdlIHBhZ2VyIOKAlFxuICAgICAgLy8gc28gTWFueSB3b3VsZCBzdXBwcmVzcyB0aGUgbG9hZC1tb3JlIGJ1dHRvbiBlbnRpcmVseS4gT2Zmc2V0ICsgbG9hZE1vcmVcbiAgICAgIC8vIGlzIHRoZSBjb21iaW5hdGlvbiB0aGF0IGFjdHVhbGx5IHJlbmRlcnMgYW5kIGFwcGVuZHMuIGBfZmV0Y2hgIGFscmVhZHlcbiAgICAgIC8vIGRlcml2ZXMgYHBhZ2VgIGZyb20gYG9mZnNldGAsIHNvIHRoZSBzZXJ2ZXItc2lkZSB3cmFwIGlzIHVuYWZmZWN0ZWQuXG4gICAgICBwYWdpbmc6IHtcbiAgICAgICAgbGltaXQ6IGNvbmZpZy5wYWdlU2l6ZSA/PyAyNSxcbiAgICAgICAgc3RyYXRlZ3k6IFBhZ2luYXRpb25TdHJhdGVneS5PZmZzZXQsXG4gICAgICB9LFxuICAgICAgbG9hZE1vcmU6IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbGFiZWw6ICdMb2FkIG1vcmUnLFxuICAgICAgICBidXR0b25UeXBlOiAnc3Ryb2tlZCcsXG4gICAgICB9LFxuICAgICAgZmlsdGVyczogdGhpcy5fb3duRmlsdGVycygpLm1hcCgoZmlsdGVyKSA9PiB0aGlzLl9maWx0ZXJJdGVtKGZpbHRlcikpLFxuICAgICAgZmV0Y2g6IChxdWVyeTogYW55KSA9PiB0aGlzLl9mZXRjaChxdWVyeSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRoZSBmaWx0ZXJzIHRoaXMgbGlzdCByZW5kZXJzIGluIGl0cyBvd24gYmFyOiBpdHMgcmVwb3J0X2ZpbHRlcnMgd2hvc2VcbiAgLy8gZ3JvdXAgaXMgY29tcG9uZW50LWxldmVsLiBSZXBvcnQtbGV2ZWwgZ3JvdXBzIHJlbmRlciBpbiB0aGUgcmVwb3J0IGJhci5cbiAgcHJpdmF0ZSBfb3duRmlsdGVycygpOiBSZXBvcnRGaWx0ZXJbXSB7XG4gICAgcmV0dXJuICh0aGlzLmNvbXBvbmVudC5maWx0ZXJzID8/IFtdKVxuICAgICAgLmZpbHRlcigoZmlsdGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmdldChmaWx0ZXIuZmlsdGVyR3JvdXBJZCk7XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlci5lbmFibGVkICYmICghZ3JvdXAgfHwgZ3JvdXAubGV2ZWwgPT09ICdjb21wb25lbnQnIHx8IGdyb3VwLmxldmVsID09PSAnYm90aCcpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9maWx0ZXJJdGVtKGZpbHRlcjogUmVwb3J0RmlsdGVyKTogYW55IHtcbiAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5nZXQoZmlsdGVyLmZpbHRlckdyb3VwSWQpO1xuICAgIGNvbnN0IG5hbWUgPSBgZiR7ZmlsdGVyLmlkfWA7XG4gICAgY29uc3QgbGFiZWwgPSBmaWx0ZXIubGFiZWwgfHwgZ3JvdXA/LmxhYmVsIHx8IGZpbHRlci5maWx0ZXJDb2x1bW47XG5cbiAgICBzd2l0Y2ggKGdyb3VwPy50eXBlKSB7XG4gICAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgdHlwZTogSXRlbVR5cGUuRGF0ZVJhbmdlLFxuICAgICAgICAgIGxhYmVsOiBbYCR7bGFiZWx9IEZyb21gLCBgJHtsYWJlbH0gVG9gXSxcbiAgICAgICAgfTtcblxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLkF1dG9Db21wbGV0ZUNoaXBzLFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIC8vIFRoZSBzZXJ2ZXIgc2VuZHMgeyB2YWx1ZSwgbGFiZWwgfTogdGhlIGZpbHRlciBtYXRjaGVzIG9uIHRoZSB2YWx1ZVxuICAgICAgICAgIC8vIChhbiBlbnRpdHkncyBzdGFibGUgaWQpIHdoaWxlIHRoZSB2aWV3ZXIgcmVhZHMgdGhlIGxhYmVsLlxuICAgICAgICAgIHZhbHVlczogKCkgPT4gdGhpcy5fcmVwb3J0RGF0YS5maWx0ZXJPcHRpb25zKHRoaXMucmVwb3J0SWQsIGZpbHRlci5pZClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBtYXAoKG9wdGlvbnM6IFJlcG9ydEZpbHRlck9wdGlvbltdKSA9PiAob3B0aW9ucyA/PyBbXSlcbiAgICAgICAgICAgICAgICAubWFwKChvcHRpb24pID0+ICh7IG5hbWU6IG9wdGlvbi5sYWJlbCwgdmFsdWU6IG9wdGlvbi52YWx1ZSB9KSkpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgfTtcblxuICAgICAgY2FzZSAna2V5d29yZCc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgdHlwZTogSXRlbVR5cGUuS2V5d29yZCxcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9mZXRjaChxdWVyeTogYW55KTogT2JzZXJ2YWJsZTx7IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107IHBhZ2luZzogYW55IH0+IHtcbiAgICAvLyBNYW55L2xvYWQtbW9yZSBzZW5kcyBgb2Zmc2V0YCArIGBsaW1pdGAgKG5vdCBgcGFnZWApOyBkZXJpdmUgdGhlIHBhZ2Ugc29cbiAgICAvLyB0aGUgc2VydmVyLXNpZGUgd3JhcCBrZWVwcyB3b3JraW5nIHVuY2hhbmdlZC4gUGFnZSBzdHJhdGVneSBzdGlsbCBzZW5kc1xuICAgIC8vIGBwYWdlYCBkaXJlY3RseS5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IHF1ZXJ5LmxpbWl0ID8/IDI1O1xuICAgIGNvbnN0IHBhZ2UgPSBxdWVyeS5wYWdlXG4gICAgICA/PyAocXVlcnkub2Zmc2V0ICE9IG51bGwgPyBNYXRoLmZsb29yKHF1ZXJ5Lm9mZnNldCAvIHBhZ2VTaXplKSArIDEgOiAxKTtcblxuICAgIGNvbnN0IHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSB7XG4gICAgICBwYWdlLFxuICAgICAgcGFnZVNpemUsXG4gICAgfTtcblxuICAgIGNvbnN0IG9yZGVyID0gU3RyaW5nKHF1ZXJ5Lm9yZGVyID8/ICcnKTtcbiAgICBpZiAob3JkZXIpIHtcbiAgICAgIGNvbnN0IFtjb2x1bW4sIGRpcmVjdGlvbl0gPSBvcmRlci5zcGxpdCgnLCcpO1xuICAgICAgc3RhdGUuc29ydCA9IHsgY29sdW1uLCBkaXJlY3Rpb246IGRpcmVjdGlvbiA9PT0gJ2Rlc2MnID8gJ2Rlc2MnIDogJ2FzYycgfTtcbiAgICB9XG5cbiAgICAvLyBSZXBvcnQtbGV2ZWwgdmFsdWVzIGZyb20gdGhlIHNoYXJlZCBzZXNzaW9uIHN0YXRlLCBtZXJnZWQgd2l0aCB0aGlzXG4gICAgLy8gbGlzdCdzIG93biBmaWx0ZXItYmFyIHZhbHVlcyAob3duIHZhbHVlcyB3aW4gcGVyIGZpbHRlcikuXG4gICAgY29uc3QgcmVzb2x2ZWQgPSBuZXcgTWFwPG51bWJlciwgUmVzb2x2ZWRGaWx0ZXJWYWx1ZT4oKTtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQodGhpcy5jb21wb25lbnQpKSB7XG4gICAgICByZXNvbHZlZC5zZXQodmFsdWUuZmlsdGVySWQsIHZhbHVlKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLl9iYXJWYWx1ZXMocXVlcnkpKSB7XG4gICAgICByZXNvbHZlZC5zZXQodmFsdWUuZmlsdGVySWQsIHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YVxuICAgICAgLmNvbXBvbmVudERhdGEodGhpcy5yZXBvcnRJZCwgdGhpcy5jb21wb25lbnQuaWQsIFsuLi5yZXNvbHZlZC52YWx1ZXMoKV0sIHN0YXRlKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoZGF0YTogQ29tcG9uZW50RGF0YSkgPT4ge1xuICAgICAgICAgIC8vIEEgY3Jvc3MtdGFiJ3MgaGVhZGVycyBjb21lIGJhY2sgd2l0aCB0aGUgcm93czogdGhlIHJvdy1rZXkgY29sdW1uXG4gICAgICAgICAgLy8gZmlyc3QsIHRoZW4gb25lIHBlciBwaXZvdCB2YWx1ZS4gUmUtcmVhZCB0aGVtIG9uIGV2ZXJ5IGZldGNoLCBzaW5jZVxuICAgICAgICAgIC8vIGEgZmlsdGVyIGNoYW5nZSBjYW4gYWRkIG9yIHJlbW92ZSBhIGNvbHVtbi5cbiAgICAgICAgICBpZiAodGhpcy5waXZvdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5zZXQodGhpcy5fcGl2b3RDb2x1bW5zKGRhdGEpKTtcbiAgICAgICAgICAgIHRoaXMudHJ1bmNhdGVkLnNldCghIWRhdGEudHJ1bmNhdGVkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YTogZGF0YS5yb3dzID8/IFtdLFxuICAgICAgICAgICAgcGFnaW5nOiB7XG4gICAgICAgICAgICAgIGxpbWl0OiBkYXRhLnBhZ2luZz8ucGFnZVNpemUgPz8gc3RhdGUucGFnZVNpemUsXG4gICAgICAgICAgICAgIHJlY29yZHM6IGRhdGEucGFnaW5nPy50b3RhbCA/PyAoZGF0YS5yb3dzPy5sZW5ndGggPz8gMCksXG4gICAgICAgICAgICAgIHBhZ2U6IGRhdGEucGFnaW5nPy5wYWdlID8/IHN0YXRlLnBhZ2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIEEgY3Jvc3MtdGFiJ3MgY29sdW1ucywgYnVpbHQgZnJvbSB0aGUgd2lyZS4gVGhlIGZpcnN0IGlzIHRoZSByb3cga2V5IGFuZFxuICAvLyBrZWVwcyBpdHMgYXV0aG9yZWQgbGFiZWw7IHRoZSByZXN0IGFyZSBwaXZvdCBWQUxVRVMgdXNlZCBhcyBoZWFkaW5ncy4gV2hlblxuICAvLyB0aGUgcGl2b3QgYXhpcyBpcyBhIHRpbWUgZGltZW5zaW9uIHRoZSBzZXJ2ZXIgc2VuZHMgdGhlIGdyYWluIGl0IGJ1Y2tldGVkXG4gIC8vIGF0LCBzbyBhIHBlcmlvZC1zdGFydCBsaWtlIFwiMjAyNi0wMS0wMVwiIGlzIHNob3duIGFzIFwiSmFuIDIwMjZcIiDigJQgdGhlIHNhbWVcbiAgLy8gZm9ybWF0dGVyIHRoZSBjaGFydCdzIHgtYXhpcyB1c2VzLCBzbyBhIGdyaWQgYW5kIGEgY2hhcnQgb2YgdGhlIHNhbWUgcXVlcnlcbiAgLy8gbGFiZWwgdGhlaXIgcGVyaW9kcyBpZGVudGljYWxseS5cbiAgcHJpdmF0ZSBfcGl2b3RDb2x1bW5zKGRhdGE6IENvbXBvbmVudERhdGEpOiB7IGNvbHVtbjogc3RyaW5nOyBsYWJlbD86IHN0cmluZzsgZm9ybWF0Pzogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgY29uZmlnID0gKHRoaXMuY29tcG9uZW50LmNvbmZpZyA/PyB7fSkgYXMgTGlzdENvbmZpZztcbiAgICBjb25zdCBncmFudWxhcml0eSA9IGRhdGEuZ3JhbnVsYXJpdHk7XG4gICAgY29uc3QgbXVsdGlZZWFyID0gdGhpcy5fc3BhbnNNdWx0aXBsZVllYXJzKGRhdGEuY29sdW1ucyA/PyBbXSk7XG5cbiAgICByZXR1cm4gKGRhdGEuY29sdW1ucyA/PyBbXSkubWFwKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHsgY29sdW1uLCBsYWJlbDogY29uZmlnLnJvd0J5Py5sYWJlbCB8fCBjb2x1bW4gfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uLFxuICAgICAgICBsYWJlbDogZ3JhbnVsYXJpdHkgPyBmb3JtYXRQZXJpb2RMYWJlbChjb2x1bW4sIGdyYW51bGFyaXR5LCBtdWx0aVllYXIpIDogY29sdW1uLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFdoZXRoZXIgdGhlIHBlcmlvZCBjb2x1bW5zIGNyb3NzIGEgeWVhciBib3VuZGFyeSwgd2hpY2ggZGVjaWRlcyBpZiB0aGVcbiAgLy8gZm9ybWF0dGVyIGFwcGVuZHMgdGhlIHllYXIgdG8gZWFjaCBoZWFkaW5nLlxuICBwcml2YXRlIF9zcGFuc011bHRpcGxlWWVhcnMoY29sdW1uczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBjb25zdCB5ZWFycyA9IG5ldyBTZXQoXG4gICAgICBjb2x1bW5zXG4gICAgICAgIC5tYXAoKGNvbHVtbikgPT4gL14oXFxkezR9KS1cXGR7Mn0tXFxkezJ9Ly5leGVjKGNvbHVtbikpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHllYXJzLnNpemUgPiAxO1xuICB9XG5cbiAgLy8gVGhlIGxpc3QncyBvd24gRnNGaWx0ZXIgdmFsdWVzLCByZWFkIGJhY2sgb3V0IG9mIHRoZSBmZXRjaCBxdWVyeSBieSB0aGVcbiAgLy8gYGY8ZmlsdGVySWQ+YCBuYW1pbmcgY29udmVudGlvbi5cbiAgcHJpdmF0ZSBfYmFyVmFsdWVzKHF1ZXJ5OiBhbnkpOiBSZXNvbHZlZEZpbHRlclZhbHVlW10ge1xuICAgIGNvbnN0IHZhbHVlczogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiB0aGlzLl9vd25GaWx0ZXJzKCkpIHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmdldChmaWx0ZXIuZmlsdGVyR3JvdXBJZCk7XG4gICAgICBjb25zdCBuYW1lID0gYGYke2ZpbHRlci5pZH1gO1xuXG4gICAgICBpZiAoZ3JvdXA/LnR5cGUgPT09ICdkYXRlUmFuZ2UnKSB7XG4gICAgICAgIGNvbnN0IGZyb20gPSBkYXRlQm91bmRTdHJpbmcocXVlcnlbYCR7bmFtZX1Gcm9tYF0pO1xuICAgICAgICBjb25zdCB0byA9IGRhdGVCb3VuZFN0cmluZyhxdWVyeVtgJHtuYW1lfVRvYF0pO1xuICAgICAgICBpZiAoZnJvbSB8fCB0bykge1xuICAgICAgICAgIHZhbHVlcy5wdXNoKHsgZmlsdGVySWQ6IGZpbHRlci5pZCwgc3RhcnQ6IGZyb20sIGVuZDogdG8gfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZ3JvdXA/LnR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIC8vIGZzLWZpbHRlciBqb2lucyBhIG11bHRpLXNlbGVjdCBpbnRvIG9uZSBcImEsYlwiIHN0cmluZzsgc3BsaXQgaXQgYmFja1xuICAgICAgICAvLyBzbyBlYWNoIHZhbHVlIGJpbmRzIHNlcGFyYXRlbHkgKGVsc2UgYGNvbCBJTiAoJ2EsYicpYCBtYXRjaGVzIG5vdGhpbmcpLlxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHF1ZXJ5W25hbWVdO1xuICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlcyA9IEFycmF5LmlzQXJyYXkoc2VsZWN0ZWQpXG4gICAgICAgICAgPyBzZWxlY3RlZFxuICAgICAgICAgIDogKHNlbGVjdGVkID8gU3RyaW5nKHNlbGVjdGVkKS5zcGxpdCgnLCcpIDogW10pO1xuICAgICAgICBpZiAoc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsdWVzLnB1c2goeyBmaWx0ZXJJZDogZmlsdGVyLmlkLCB2YWx1ZXM6IHNlbGVjdGVkVmFsdWVzIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBrZXl3b3JkID0gU3RyaW5nKHF1ZXJ5W25hbWVdID8/ICcnKS50cmltKCk7XG4gICAgICAgIGlmIChrZXl3b3JkKSB7XG4gICAgICAgICAgdmFsdWVzLnB1c2goeyBmaWx0ZXJJZDogZmlsdGVyLmlkLCB2YWx1ZToga2V5d29yZCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cbn1cbiIsIkBpZiAodHJ1bmNhdGVkKCkpIHtcbiAgPGRpdiBjbGFzcz1cInBpdm90LXRydW5jYXRlZFwiPlxuICAgIFRoaXMgZ3JpZCB3YXMgYnVpbHQgZnJvbSBhIHBhcnRpYWwgcmVzdWx0LCBzbyBzb21lIGNvbHVtbnMgb3IgdmFsdWVzIG1heSBiZSBtaXNzaW5nLiBOYXJyb3cgaXQgd2l0aCBhIGZpbHRlci5cbiAgPC9kaXY+XG59XG5cbjxmcy1saXN0IFtjb25maWddPVwibGlzdENvbmZpZ1wiPlxuICBAZm9yIChjb2x1bW4gb2YgY29sdW1ucygpOyB0cmFjayBjb2x1bW4uY29sdW1uKSB7XG4gICAgPGZzLWxpc3QtY29sdW1uXG4gICAgICBbbmFtZV09XCJjb2x1bW4uY29sdW1uXCJcbiAgICAgIFt0aXRsZV09XCJjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtblwiXG4gICAgICBbc29ydGFibGVdPVwiIXBpdm90ZWQoKSB8fCAkZmlyc3RcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBmcy1saXN0LWNlbGxcbiAgICAgICAgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgICBAaWYgKGNvbHVtbi5mb3JtYXQgPT09ICdkYXRlJykge1xuICAgICAgICAgIHt7IHJvd1tjb2x1bW4uY29sdW1uXSB8IGRhdGU6ICdtZWRpdW1EYXRlJyB9fVxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICB7eyByb3dbY29sdW1uLmNvbHVtbl0gfX1cbiAgICAgICAgfVxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2ZzLWxpc3QtY29sdW1uPlxuICB9XG48L2ZzLWxpc3Q+XG4iXX0=