@firestitch/report 18.5.0 → 18.6.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.
- package/app/reports/components/component-list/component-list.component.d.ts +3 -6
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +4 -4
- package/app/reports/components/report-component/report-component.component.d.ts +5 -5
- package/app/reports/components/timezone-select/timezone-select.component.d.ts +4 -6
- package/app/reports/consts/report-week.const.d.ts +2 -0
- package/app/reports/data/report-ai-chat.data.d.ts +12 -0
- package/app/reports/data/report.data.d.ts +3 -3
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +6 -6
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +5 -0
- package/app/reports/export/report-export-collector.service.d.ts +14 -2
- package/app/reports/export/report-pdf.service.d.ts +14 -1
- package/app/reports/export/report-pptx.service.d.ts +2 -1
- package/app/reports/format.d.ts +7 -0
- package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +7 -0
- package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +7 -0
- package/app/reports/interfaces/report.interface.d.ts +17 -2
- package/app/reports/pipes/report-date.pipe.d.ts +7 -0
- package/app/reports/report-filter-items.d.ts +5 -0
- package/app/reports/report-url-state.d.ts +14 -0
- package/app/reports/services/report-filter-state.service.d.ts +24 -2
- package/app/reports/theme/typography.d.ts +2 -0
- package/app/reports/views/report/fs-ai-report.component.d.ts +16 -8
- package/app/reports/views/report/report.component.d.ts +6 -6
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +29 -104
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +52 -44
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +55 -35
- package/esm2022/app/reports/components/timezone-select/timezone-select.component.mjs +23 -23
- package/esm2022/app/reports/consts/report-week.const.mjs +7 -0
- package/esm2022/app/reports/data/report-ai-chat.data.mjs +25 -0
- package/esm2022/app/reports/data/report.data.mjs +22 -9
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +25 -26
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +38 -13
- package/esm2022/app/reports/export/report-export-collector.service.mjs +92 -28
- package/esm2022/app/reports/export/report-export.service.mjs +11 -8
- package/esm2022/app/reports/export/report-pdf.service.mjs +241 -81
- package/esm2022/app/reports/export/report-pptx.service.mjs +60 -45
- package/esm2022/app/reports/format.mjs +119 -8
- package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/option-builder.mjs +131 -15
- package/esm2022/app/reports/pipes/report-date.pipe.mjs +21 -0
- package/esm2022/app/reports/report-filter-items.mjs +42 -10
- package/esm2022/app/reports/report-url-state.mjs +144 -0
- package/esm2022/app/reports/services/report-filter-state.service.mjs +308 -64
- package/esm2022/app/reports/theme/echarts.mjs +6 -5
- package/esm2022/app/reports/theme/typography.mjs +6 -0
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +191 -90
- package/esm2022/app/reports/views/report/report.component.mjs +64 -62
- package/fesm2022/{firestitch-report-echarts-CtKYuRcT.mjs → firestitch-report-echarts-B9nl9XKM.mjs} +6 -6
- package/fesm2022/firestitch-report-echarts-B9nl9XKM.mjs.map +1 -0
- package/fesm2022/{firestitch-report-firestitch-report-Df1IXrEs.mjs → firestitch-report-firestitch-report-Bb65HEYB.mjs} +1707 -703
- package/fesm2022/firestitch-report-firestitch-report-Bb65HEYB.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/app/reports/dialogs/report-settings/report-settings-default.d.ts +0 -2
- package/esm2022/app/reports/dialogs/report-settings/report-settings-default.mjs +0 -22
- package/fesm2022/firestitch-report-echarts-CtKYuRcT.mjs.map +0 -1
- package/fesm2022/firestitch-report-firestitch-report-Df1IXrEs.mjs.map +0 -1
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import { format } from 'date-fns';
|
|
2
3
|
import { forkJoin, from, map, of } from 'rxjs';
|
|
3
4
|
import { catchError, mergeMap, toArray } from 'rxjs/operators';
|
|
4
5
|
import { ReportData } from '../data/report.data';
|
|
6
|
+
import { formatReportDate, getZonedNow, resolveReportTimezone } from '../format';
|
|
5
7
|
import { GRANULARITY_OPTIONS, } from '../interfaces/report.interface';
|
|
6
8
|
import { dateBoundLabel, loadGroupOptions, resolveOptionValues } from '../report-filter-items';
|
|
7
9
|
import { ReportFilterStateService } from '../services/report-filter-state.service';
|
|
8
10
|
import * as i0 from "@angular/core";
|
|
9
|
-
// Rows fetched for a list component's export table — enough to fill a
|
|
10
|
-
// slide/page table; the cap note covers the rest.
|
|
11
|
-
const LIST_EXPORT_ROWS = 100;
|
|
12
11
|
// How many tile queries an export runs at once.
|
|
13
12
|
//
|
|
14
13
|
// Not a politeness setting — it is the difference between a deck and a broken
|
|
@@ -35,6 +34,55 @@ export function emptyLabel(item) {
|
|
|
35
34
|
export function isFailed(item) {
|
|
36
35
|
return !item.data && item.component.type !== 'text';
|
|
37
36
|
}
|
|
37
|
+
// The lines under the report's name on the PDF title page and the title slide:
|
|
38
|
+
// the export date, the active filters, then what the numbers are measured in.
|
|
39
|
+
// The date is today in the report's zone, the same day its filters resolve
|
|
40
|
+
// "today" to.
|
|
41
|
+
export function coverLines(collected) {
|
|
42
|
+
return [
|
|
43
|
+
format(getZonedNow(resolveReportTimezone(collected.report)), 'MMMM d, yyyy'),
|
|
44
|
+
...collected.filterSummary,
|
|
45
|
+
...collected.contextLines,
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
// An exported list cell, reading like the on-screen cell: the SQL already
|
|
49
|
+
// carries the formatting, so the value goes out verbatim. A date column is the
|
|
50
|
+
// one value the browser renders, and it renders through the same function as
|
|
51
|
+
// the screen, in the report's zone.
|
|
52
|
+
export function exportCell(value, columnFormat, timezone) {
|
|
53
|
+
if (value === null || value === undefined) {
|
|
54
|
+
return '';
|
|
55
|
+
}
|
|
56
|
+
return columnFormat === 'date' ? formatReportDate(value, timezone) : String(value);
|
|
57
|
+
}
|
|
58
|
+
// The columns an exported list table draws. A cross-tab's columns arrive with
|
|
59
|
+
// its rows (the row key first, then one per pivot value), since only the
|
|
60
|
+
// result knows the pivot values; a plain list draws its configured columns,
|
|
61
|
+
// else every column the query returned.
|
|
62
|
+
export function listColumns(component, data) {
|
|
63
|
+
const config = (component.config ?? {});
|
|
64
|
+
if (!config.pivotBy?.column && config.columns?.length) {
|
|
65
|
+
return config.columns;
|
|
66
|
+
}
|
|
67
|
+
return data.columns.map((column) => ({ column }));
|
|
68
|
+
}
|
|
69
|
+
// The heading over each column of listColumns(). A cross-tab's first column
|
|
70
|
+
// is headed by rowBy.label, else its column name, and every other heading is
|
|
71
|
+
// the raw pivot value; a plain list's columns keep their configured labels.
|
|
72
|
+
export function listHeadings(component, data) {
|
|
73
|
+
const config = (component.config ?? {});
|
|
74
|
+
if (config.pivotBy?.column) {
|
|
75
|
+
return data.columns.map((column, index) => (index === 0 ? config.rowBy?.label || column : column));
|
|
76
|
+
}
|
|
77
|
+
return listColumns(component, data).map((column) => column.label || column.column);
|
|
78
|
+
}
|
|
79
|
+
// The last row of an exported list table that stops short of its result: how
|
|
80
|
+
// many rows the file leaves out and where the whole set can be had. Each
|
|
81
|
+
// format fetches its own number of rows (PDF_LIST_ROWS, PPTX_LIST_ROWS), and
|
|
82
|
+
// both name what is left with this one sentence.
|
|
83
|
+
export function moreRowsNotice(remaining) {
|
|
84
|
+
return `… ${remaining} more row(s) — use the component's CSV export for the full dataset`;
|
|
85
|
+
}
|
|
38
86
|
// The pages of a collected report that have at least one tile whose query
|
|
39
87
|
// failed — what the export gate names to the user, and what makes "some of this
|
|
40
88
|
// file is missing" a fact the caller can act on rather than a thing they notice
|
|
@@ -57,7 +105,9 @@ export function failedPageNames(collected) {
|
|
|
57
105
|
export class ReportExportCollectorService {
|
|
58
106
|
_reportData = inject(ReportData);
|
|
59
107
|
_filterState = inject(ReportFilterStateService);
|
|
60
|
-
|
|
108
|
+
// listRows is how many rows each list fetches: the renderer's own cap, since
|
|
109
|
+
// a PDF table continues onto extra pages and a slide table cannot.
|
|
110
|
+
collect(report, listRows) {
|
|
61
111
|
const slots = [];
|
|
62
112
|
report.pages.forEach((page, pageIndex) => {
|
|
63
113
|
for (const component of page.components) {
|
|
@@ -73,12 +123,12 @@ export class ReportExportCollectorService {
|
|
|
73
123
|
// happened to finish first.
|
|
74
124
|
const all$ = slots.length
|
|
75
125
|
? from(slots.map((slot, index) => ({ slot, index })))
|
|
76
|
-
.pipe(mergeMap(({ slot, index }) => this._componentData(report, slot.component)
|
|
126
|
+
.pipe(mergeMap(({ slot, index }) => this._componentData(report, slot.component, listRows)
|
|
77
127
|
.pipe(map((item) => ({ item, index }))), EXPORT_CONCURRENCY), toArray())
|
|
78
128
|
: of([]);
|
|
79
129
|
// The summary rides alongside the component data rather than being built at
|
|
80
130
|
// the end, because naming a select filter's values is itself a request.
|
|
81
|
-
return forkJoin({ collected: all$, filterSummary: this.
|
|
131
|
+
return forkJoin({ collected: all$, filterSummary: this.getFilterSummary(report) })
|
|
82
132
|
.pipe(map(({ collected, filterSummary }) => {
|
|
83
133
|
const pages = report.pages.map((page) => ({ page, components: [] }));
|
|
84
134
|
[...collected]
|
|
@@ -90,34 +140,19 @@ export class ReportExportCollectorService {
|
|
|
90
140
|
report,
|
|
91
141
|
pages,
|
|
92
142
|
filterSummary,
|
|
143
|
+
contextLines: this._contextLines(report),
|
|
93
144
|
};
|
|
94
145
|
}));
|
|
95
146
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
const filters = this._filterState.resolveForComponent(component);
|
|
101
|
-
// A time-series chart carries the viewer's group-by grain so the export
|
|
102
|
-
// re-buckets exactly as the screen does; lists carry their export paging.
|
|
103
|
-
const frequency = this._filterState.frequency();
|
|
104
|
-
const isTimeSeries = component.type === 'chart' && component.config?.xAxis?.kind === 'time';
|
|
105
|
-
const state = component.type === 'list'
|
|
106
|
-
? { page: 1, pageSize: LIST_EXPORT_ROWS }
|
|
107
|
-
: (isTimeSeries && frequency ? { frequency } : {});
|
|
108
|
-
// handlers: false keeps the app's global error dialog out of this. A failed
|
|
109
|
-
// tile is reported once, by the export gate, naming the pages it cost —
|
|
110
|
-
// never as ten stacked modals carrying the database's own wording.
|
|
111
|
-
return this._reportData.componentData(report.id, component.id, filters, state, true, { handlers: false })
|
|
112
|
-
.pipe(map((data) => ({ component, data })), catchError(() => of({ component, data: null })));
|
|
113
|
-
}
|
|
114
|
-
// "Report Period: Jun 12, 2025 – Jun 12, 2026", "Organization: Alnylam - AHP,
|
|
115
|
-
// Alnylam - PH1" — one line per filter group that has an active session value.
|
|
147
|
+
// "Report Period: Jun 12, 2025 – Jun 12, 2026", "Region: North, East" — one
|
|
148
|
+
// line per filter group that has an active session value, then the group-by
|
|
149
|
+
// line. The filter bar as the viewer reads it: the PDF and PowerPoint covers
|
|
150
|
+
// print it, and the report zip export sends it for its notes file.
|
|
116
151
|
//
|
|
117
152
|
// A select group stores ids, so its line has to be named off the option list
|
|
118
153
|
// before it can be printed; a date or keyword group already holds its own
|
|
119
154
|
// display value and resolves synchronously.
|
|
120
|
-
|
|
155
|
+
getFilterSummary(report) {
|
|
121
156
|
const lines = [];
|
|
122
157
|
for (const group of report.filterGroups ?? []) {
|
|
123
158
|
const value = this._filterState.value(group.id);
|
|
@@ -146,6 +181,35 @@ export class ReportExportCollectorService {
|
|
|
146
181
|
}
|
|
147
182
|
return lines.length ? forkJoin(lines) : of([]);
|
|
148
183
|
}
|
|
184
|
+
_componentData(report, component, listRows) {
|
|
185
|
+
if (component.type === 'text') {
|
|
186
|
+
return of({ component, data: null });
|
|
187
|
+
}
|
|
188
|
+
const filters = this._filterState.resolveForComponent(component);
|
|
189
|
+
// A time-series chart carries the viewer's group-by grain so the export
|
|
190
|
+
// re-buckets exactly as the screen does; lists carry their export paging
|
|
191
|
+
// and the viewer's header sort, so the table reads in the screen's order.
|
|
192
|
+
//
|
|
193
|
+
// The time-series check deliberately mirrors the server's canonical
|
|
194
|
+
// ReportQueryRunner::_isTimeSeriesChart, so a product pinned to an older
|
|
195
|
+
// framework does not re-bucket a non-time chart.
|
|
196
|
+
const frequency = this._filterState.frequency();
|
|
197
|
+
const isTimeSeries = component.type === 'chart' && component.config?.xAxis?.kind === 'time';
|
|
198
|
+
const state = component.type === 'list'
|
|
199
|
+
? { page: 1, pageSize: listRows, sort: this._filterState.listSort(component.id) ?? undefined }
|
|
200
|
+
: (isTimeSeries && frequency ? { frequency } : {});
|
|
201
|
+
// handlers: false keeps the app's global error dialog out of this. A failed
|
|
202
|
+
// tile is reported once, by the export gate, naming the pages it cost —
|
|
203
|
+
// never as ten stacked modals carrying the database's own wording.
|
|
204
|
+
return this._reportData.componentData(report.id, component.id, filters, state, true, { handlers: false })
|
|
205
|
+
.pipe(map((data) => ({ component, data })), catchError(() => of({ component, data: null })));
|
|
206
|
+
}
|
|
207
|
+
// The zone the server resolved, as its IANA id. Only the server's value is
|
|
208
|
+
// printed: the browser's zone (resolveReportTimezone's fallback for an older
|
|
209
|
+
// server) is not what the numbers were measured in.
|
|
210
|
+
_contextLines(report) {
|
|
211
|
+
return report.effectiveTimezone ? [`Timezone: ${report.effectiveTimezone}`] : [];
|
|
212
|
+
}
|
|
149
213
|
// One select group's line, with its stored ids resolved to the same names the
|
|
150
214
|
// on-screen chips show — a cover reading "Organization: 8774, 8777" tells the
|
|
151
215
|
// client nothing about what the report covers.
|
|
@@ -170,4 +234,4 @@ export class ReportExportCollectorService {
|
|
|
170
234
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportCollectorService, decorators: [{
|
|
171
235
|
type: Injectable
|
|
172
236
|
}] });
|
|
173
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBRUwsbUJBQW1CLEdBS3BCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9GLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOztBQXNCbkYsc0VBQXNFO0FBQ3RFLGtEQUFrRDtBQUNsRCxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUU3QixnREFBZ0Q7QUFDaEQsRUFBRTtBQUNGLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsZ0ZBQWdGO0FBQ2hGLCtFQUErRTtBQUMvRSxZQUFZO0FBQ1osTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFFN0IscUVBQXFFO0FBQ3JFLEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLGdGQUFnRjtBQUNoRiwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLCtDQUErQztBQUMvQyxNQUFNLFVB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LElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDbkYsQ0FBQztJQUNOLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsdUVBQXVFO0lBQy9ELEtBQUssQ0FBQyxLQUF1QztRQUNuRCxPQUFPLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDdEMsQ0FBQzt3R0FqSlUsNEJBQTRCOzRHQUE1Qiw0QkFBNEI7OzRGQUE1Qiw0QkFBNEI7a0JBRHhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZm9ya0pvaW4sIGZyb20sIG1hcCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1lcmdlTWFwLCB0b0FycmF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQge1xuICBDb21wb25lbnREYXRhLFxuICBHUkFOVUxBUklUWV9PUFRJT05TLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0RmlsdGVyR3JvdXAsXG4gIFJlcG9ydFBhZ2UsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBkYXRlQm91bmRMYWJlbCwgbG9hZEdyb3VwT3B0aW9ucywgcmVzb2x2ZU9wdGlvblZhbHVlcyB9IGZyb20gJy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcblxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3RlZENvbXBvbmVudCB7XG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50O1xuICAvLyBudWxsID0gaXRzIHF1ZXJ5IGZhaWxlZDsgZXhwb3J0cyBzaG93IGEgbm90ZS4gQWx3YXlzIG51bGwgZm9yIGEgdGV4dFxuICAvLyBibG9jaywgd2hpY2ggaGFzIG5vIHF1ZXJ5IOKAlCBzZWUgaXNGYWlsZWQoKS5cbiAgZGF0YTogQ29tcG9uZW50RGF0YSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkUGFnZSB7XG4gIHBhZ2U6IFJlcG9ydFBhZ2U7XG4gIGNvbXBvbmVudHM6IENvbGxlY3RlZENvbXBvbmVudFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3RlZFJlcG9ydCB7XG4gIHJlcG9ydDogUmVwb3J0O1xuICBwYWdlczogQ29sbGVjdGVkUGFnZVtdO1xuICAvLyBIdW1hbi1yZWFkYWJsZSBsaW5lcyBkZXNjcmliaW5nIHRoZSBhY3RpdmUgZmlsdGVycywgZm9yIHRoZSB0aXRsZSBzbGlkZS9wYWdlLlxuICBmaWx0ZXJTdW1tYXJ5OiBzdHJpbmdbXTtcbn1cblxuLy8gUm93cyBmZXRjaGVkIGZvciBhIGxpc3QgY29tcG9uZW50J3MgZXhwb3J0IHRhYmxlIOKAlCBlbm91Z2ggdG8gZmlsbCBhXG4vLyBzbGlkZS9wYWdlIHRhYmxlOyB0aGUgY2FwIG5vdGUgY292ZXJzIHRoZSByZXN0LlxuY29uc3QgTElTVF9FWFBPUlRfUk9XUyA9IDEwMDtcblxuLy8gSG93IG1hbnkgdGlsZSBxdWVyaWVzIGFuIGV4cG9ydCBydW5zIGF0IG9uY2UuXG4vL1xuLy8gTm90IGEgcG9saXRlbmVzcyBzZXR0aW5nIOKAlCBpdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgZGVjayBhbmQgYSBicm9rZW5cbi8vIG9uZS4gVGhlc2UgcXVlcmllcyBhcmUgaGVhdnkgYW5kIHJlYWQgdGhlIHNhbWUgdGFibGVzLCBzbyBmaXJpbmcgYWxsIG9mIHRoZW1cbi8vIHRvZ2V0aGVyIHB1dHMgZXZlcnkgb25lIGluIGNvbnRlbnRpb24gZm9yIHRoZSBzYW1lIGRhdGFiYXNlIGF0IHRoZSBzYW1lXG4vLyBtb21lbnQgYW5kIHRoZXkgY3Jvc3MgdGhlIHN0YXRlbWVudCBjZWlsaW5nIGFzIGEgZ3JvdXA6IG1lYXN1cmVkIG9uIHJlcG9ydFxuLy8gMjgsIHRlbiB0aWxlcyB0aGF0IGVhY2ggYW5zd2VyIGluIDktMjRzIHJ1biBvbmUgYWZ0ZXIgYW5vdGhlciBhbGwgZmFpbGVkIGF0XG4vLyB+MzBzIHdoZW4gcmVsZWFzZWQgdG9nZXRoZXIuIENvbmN1cnJlbmN5IGJ1eXMgd2FsbC1jbG9jayBvbmx5IHVwIHRvIHRoZSBwb2ludFxuLy8gd2hlcmUgdGhlIHF1ZXJpZXMgc3RhcnQgdGFraW5nIGl0IGJhY2sgb2ZmIGVhY2ggb3RoZXIsIGFuZCBwYXN0IHRoYXQgaXQgYnV5c1xuLy8gZmFpbHVyZXMuXG5jb25zdCBFWFBPUlRfQ09OQ1VSUkVOQ1kgPSAzO1xuXG4vLyBXaGF0IGEgY29tcG9uZW50IHdpdGggbm90aGluZyB0byBkcmF3IHByaW50cyBpbiB0aGUgZXhwb3J0ZWQgZmlsZS5cbi8vXG4vLyBUaGUgdHdvIGNhc2VzIG11c3Qgbm90IHJlYWQgYWxpa2UuIEEgdGlsZSB0aGF0IHJldHVybmVkIG5vIHJvd3MgaXMgYSBmaW5kaW5nXG4vLyBhYm91dCB0aGUgcGVyaW9kIOKAlCB0aGUgcmVwb3J0IHdvcmtlZCBhbmQgdGhlIGFuc3dlciBpcyBcIm5vbmVcIi4gQSB0aWxlIHdob3NlXG4vLyBxdWVyeSBmYWlsZWQgaXMgYSBob2xlIGluIHRoZSBmaWxlLCBhbmQgY2FsbGluZyB0aGF0IFwiRGF0YSB1bmF2YWlsYWJsZVwiIHRlbGxzXG4vLyB0aGUgcmVhZGVyIHRoZSBkYXRhIGRvZXMgbm90IGV4aXN0IHdoZW4gd2hhdCBoYXBwZW5lZCBpcyB0aGF0IG5vYm9keSBtYW5hZ2VkXG4vLyB0byBhc2sgZm9yIGl0LiBTaGFyZWQgYnkgYm90aCByZW5kZXJlcnMgc28gdGhlIFBERiBhbmQgdGhlIGRlY2sgY2Fubm90IGVuZCB1cFxuLy8gZGVzY3JpYmluZyB0aGUgc2FtZSBob2xlIHR3byBkaWZmZXJlbnQgd2F5cy5cbmV4cG9ydCBmdW5jdGlvbiBlbXB0eUxhYmVsKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCk6IHN0cmluZyB7XG4gIHJldHVybiBpdGVtLmRhdGEgPyAnTm8gZGF0YScgOiAnQ291bGQgbm90IGJlIGdlbmVyYXRlZCc7XG59XG5cbi8vIFdoZXRoZXIgYSB0aWxlJ3MgcXVlcnkgZmFpbGVkLiBBIHRleHQgYmxvY2sgaGFzIG5vIHF1ZXJ5LCBzbyBpdCBuZXZlciBkaWQuXG5leHBvcnQgZnVuY3Rpb24gaXNGYWlsZWQoaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50KTogYm9vbGVhbiB7XG4gIHJldHVybiAhaXRlbS5kYXRhICYmIGl0ZW0uY29tcG9uZW50LnR5cGUgIT09ICd0ZXh0Jztcbn1cblxuLy8gVGhlIHBhZ2VzIG9mIGEgY29sbGVjdGVkIHJlcG9ydCB0aGF0IGhhdmUgYXQgbGVhc3Qgb25lIHRpbGUgd2hvc2UgcXVlcnlcbi8vIGZhaWxlZCDigJQgd2hhdCB0aGUgZXhwb3J0IGdhdGUgbmFtZXMgdG8gdGhlIHVzZXIsIGFuZCB3aGF0IG1ha2VzIFwic29tZSBvZiB0aGlzXG4vLyBmaWxlIGlzIG1pc3NpbmdcIiBhIGZhY3QgdGhlIGNhbGxlciBjYW4gYWN0IG9uIHJhdGhlciB0aGFuIGEgdGhpbmcgdGhleSBub3RpY2Vcbi8vIGluIHRoZSBQREYgYWZ0ZXJ3YXJkcy5cbmV4cG9ydCBmdW5jdGlvbiBmYWlsZWRQYWdlTmFtZXMoY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQpOiBzdHJpbmdbXSB7XG4gIC8vIE51bWJlcmVkIGJlZm9yZSB0aGUgZmlsdGVyIOKAlCBhbiB1bm5hbWVkIHBhZ2UgNCB0aGF0IGZhaWxlZCBoYXMgdG8gcmVhZFxuICAvLyBcIlBhZ2UgNFwiLCBub3QgXCJQYWdlIDFcIiBiZWNhdXNlIGl0IGhhcHBlbmVkIHRvIGJlIHRoZSBmaXJzdCBmYWlsdXJlLlxuICByZXR1cm4gY29sbGVjdGVkLnBhZ2VzXG4gICAgLm1hcCgocGFnZSwgaW5kZXgpID0+ICh7IHBhZ2UsIG51bWJlcjogaW5kZXggKyAxIH0pKVxuICAgIC5maWx0ZXIoKHsgcGFnZSB9KSA9PiBwYWdlLmNvbXBvbmVudHMuc29tZShpc0ZhaWxlZCkpXG4gICAgLm1hcCgoeyBwYWdlLCBudW1iZXIgfSkgPT4gcGFnZS5wYWdlLm5hbWUgfHwgYFBhZ2UgJHtudW1iZXJ9YCk7XG59XG5cbi8vIEdhdGhlcnMgZXZlcnl0aGluZyBhbiBleHBvcnQgbmVlZHM6IGV2ZXJ5IGNvbXBvbmVudCdzIGRhdGEgYWNyb3NzIEFMTCBwYWdlc1xuLy8gKHRoZSBjYW52YXMgb25seSByZW5kZXJzIHRoZSBhY3RpdmUgcGFnZSwgc28gZXhwb3J0cyBjYW4ndCBzY3JhcGUgdGhlXG4vLyBzY3JlZW4pLCBmZXRjaGVkIGZyZXNoIHdpdGggdGhlIHZpZXdlcidzIGN1cnJlbnQgZmlsdGVyIHN0YXRlLlxuLy9cbi8vIEEgZmFpbGVkIGNvbXBvbmVudCByZXNvbHZlcyB0byBhIG51bGwgYGRhdGFgIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIHdob2xlXG4vLyBjb2xsZWN0aW9uIOKAlCBidXQgdGhhdCBpcyBzbyB0aGUgY2FsbGVyIGNhbiBSRVBPUlQgd2hhdCBmYWlsZWQsIG5vdCBzbyBpdCBjYW5cbi8vIGJlIGlnbm9yZWQ6IHNlZSBmYWlsZWRQYWdlTmFtZXMoKSBhbmQgdGhlIGV4cG9ydCBnYXRlIHRoYXQgdXNlcyBpdC5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRFeHBvcnRDb2xsZWN0b3JTZXJ2aWNlIHtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xuXG4gIHB1YmxpYyBjb2xsZWN0KHJlcG9ydDogUmVwb3J0KTogT2JzZXJ2YWJsZTxDb2xsZWN0ZWRSZXBvcnQ+IHtcbiAgICBjb25zdCBzbG90czogeyBwYWdlSW5kZXg6IG51bWJlcjsgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQgfVtdID0gW107XG5cbiAgICByZXBvcnQucGFnZXMuZm9yRWFjaCgocGFnZSwgcGFnZUluZGV4KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBwYWdlLmNvbXBvbmVudHMpIHtcbiAgICAgICAgc2xvdHMucHVzaCh7IHBhZ2VJbmRleCwgY29tcG9uZW50IH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVGV4dCBibG9ja3MgaGF2ZSBub3RoaW5nIHRvIGZldGNoIOKAlCB0aGV5IHJpZGUgdGhyb3VnaCB3aXRoIG5vIGRhdGEuIFRoZVxuICAgIC8vIGhlYWRlci9mb290ZXIgKHJlcG9ydC5tYXN0ZXIpIGlzIHJlYWQgYnkgdGhlIHJlbmRlcmVycyBzdHJhaWdodCBvZmYgdGhlXG4gICAgLy8gcmVwb3J0IGZvciB0aGUgc2FtZSByZWFzb24uXG5cbiAgICAvLyBSZWxlYXNlZCBhIGZldyBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gYWxsIGF0IG9uY2UuIG1lcmdlTWFwIGNvbXBsZXRlcyBvdXRcbiAgICAvLyBvZiBvcmRlciwgc28gZWFjaCByZXN1bHQgY2FycmllcyB0aGUgc2xvdCBpdCBjYW1lIGZyb20gYW5kIHRoZSByb3dzIGFyZVxuICAgIC8vIGZpbGVkIGJ5IGluZGV4IOKAlCB0aGUgZGVjaydzIHBhZ2Ugb3JkZXIgY2FuJ3QgZGVwZW5kIG9uIHdoaWNoIHF1ZXJ5XG4gICAgLy8gaGFwcGVuZWQgdG8gZmluaXNoIGZpcnN0LlxuICAgIGNvbnN0IGFsbCQgPSBzbG90cy5sZW5ndGhcbiAgICAgID8gZnJvbShzbG90cy5tYXAoKHNsb3QsIGluZGV4KSA9PiAoeyBzbG90LCBpbmRleCB9KSkpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1lcmdlTWFwKFxuICAgICAgICAgICAgKHsgc2xvdCwgaW5kZXggfSkgPT4gdGhpcy5fY29tcG9uZW50RGF0YShyZXBvcnQsIHNsb3QuY29tcG9uZW50KVxuICAgICAgICAgICAgICAucGlwZShtYXAoKGl0ZW0pID0+ICh7IGl0ZW0sIGluZGV4IH0pKSksXG4gICAgICAgICAgICBFWFBPUlRfQ09OQ1VSUkVOQ1ksXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0b0FycmF5KCksXG4gICAgICAgIClcbiAgICAgIDogb2YoW10gYXMgeyBpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQ7IGluZGV4OiBudW1iZXIgfVtdKTtcblxuICAgIC8vIFRoZSBzdW1tYXJ5IHJpZGVzIGFsb25nc2lkZSB0aGUgY29tcG9uZW50IGRhdGEgcmF0aGVyIHRoYW4gYmVpbmcgYnVpbHQgYXRcbiAgICAvLyB0aGUgZW5kLCBiZWNhdXNlIG5hbWluZyBhIHNlbGVjdCBmaWx0ZXIncyB2YWx1ZXMgaXMgaXRzZWxmIGEgcmVxdWVzdC5cbiAgICByZXR1cm4gZm9ya0pvaW4oeyBjb2xsZWN0ZWQ6IGFsbCQsIGZpbHRlclN1bW1hcnk6IHRoaXMuX2ZpbHRlclN1bW1hcnkocmVwb3J0KSB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoeyBjb2xsZWN0ZWQsIGZpbHRlclN1bW1hcnkgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhZ2VzOiBDb2xsZWN0ZWRQYWdlW10gPSByZXBvcnQucGFnZXMubWFwKChwYWdlKSA9PiAoeyBwYWdlLCBjb21wb25lbnRzOiBbXSB9KSk7XG5cbiAgICAgICAgICBbLi4uY29sbGVjdGVkXVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KVxuICAgICAgICAgICAgLmZvckVhY2goKHsgaXRlbSwgaW5kZXggfSkgPT4ge1xuICAgICAgICAgICAgICBwYWdlc1tzbG90c1tpbmRleF0ucGFnZUluZGV4XS5jb21wb25lbnRzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXBvcnQsXG4gICAgICAgICAgICBwYWdlcyxcbiAgICAgICAgICAgIGZpbHRlclN1bW1hcnksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tcG9uZW50RGF0YShyZXBvcnQ6IFJlcG9ydCwgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBPYnNlcnZhYmxlPENvbGxlY3RlZENvbXBvbmVudD4ge1xuICAgIGlmIChjb21wb25lbnQudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICByZXR1cm4gb2YoeyBjb21wb25lbnQsIGRhdGE6IG51bGwgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAvLyBBIHRpbWUtc2VyaWVzIGNoYXJ0IGNhcnJpZXMgdGhlIHZpZXdlcidzIGdyb3VwLWJ5IGdyYWluIHNvIHRoZSBleHBvcnRcbiAgICAvLyByZS1idWNrZXRzIGV4YWN0bHkgYXMgdGhlIHNjcmVlbiBkb2VzOyBsaXN0cyBjYXJyeSB0aGVpciBleHBvcnQgcGFnaW5nLlxuICAgIGNvbnN0IGZyZXF1ZW5jeSA9IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpO1xuICAgIGNvbnN0IGlzVGltZVNlcmllcyA9IGNvbXBvbmVudC50eXBlID09PSAnY2hhcnQnICYmIGNvbXBvbmVudC5jb25maWc/LnhBeGlzPy5raW5kID09PSAndGltZSc7XG4gICAgY29uc3Qgc3RhdGUgPSBjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnXG4gICAgICA/IHsgcGFnZTogMSwgcGFnZVNpemU6IExJU1RfRVhQT1JUX1JPV1MgfVxuICAgICAgOiAoaXNUaW1lU2VyaWVzICYmIGZyZXF1ZW5jeSA/IHsgZnJlcXVlbmN5IH0gOiB7fSk7XG5cbiAgICAvLyBoYW5kbGVyczogZmFsc2Uga2VlcHMgdGhlIGFwcCdzIGdsb2JhbCBlcnJvciBkaWFsb2cgb3V0IG9mIHRoaXMuIEEgZmFpbGVkXG4gICAgLy8gdGlsZSBpcyByZXBvcnRlZCBvbmNlLCBieSB0aGUgZXhwb3J0IGdhdGUsIG5hbWluZyB0aGUgcGFnZXMgaXQgY29zdCDigJRcbiAgICAvLyBuZXZlciBhcyB0ZW4gc3RhY2tlZCBtb2RhbHMgY2FycnlpbmcgdGhlIGRhdGFiYXNlJ3Mgb3duIHdvcmRpbmcuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEuY29tcG9uZW50RGF0YShyZXBvcnQuaWQsIGNvbXBvbmVudC5pZCwgZmlsdGVycywgc3RhdGUsIHRydWUsIHsgaGFuZGxlcnM6IGZhbHNlIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChkYXRhOiBDb21wb25lbnREYXRhKSA9PiAoeyBjb21wb25lbnQsIGRhdGEgfSkpLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKHsgY29tcG9uZW50LCBkYXRhOiBudWxsIH0pKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBcIlJlcG9ydCBQZXJpb2Q6IEp1biAxMiwgMjAyNSDigJMgSnVuIDEyLCAyMDI2XCIsIFwiT3JnYW5pemF0aW9uOiBBbG55bGFtIC0gQUhQLFxuICAvLyBBbG55bGFtIC0gUEgxXCIg4oCUIG9uZSBsaW5lIHBlciBmaWx0ZXIgZ3JvdXAgdGhhdCBoYXMgYW4gYWN0aXZlIHNlc3Npb24gdmFsdWUuXG4gIC8vXG4gIC8vIEEgc2VsZWN0IGdyb3VwIHN0b3JlcyBpZHMsIHNvIGl0cyBsaW5lIGhhcyB0byBiZSBuYW1lZCBvZmYgdGhlIG9wdGlvbiBsaXN0XG4gIC8vIGJlZm9yZSBpdCBjYW4gYmUgcHJpbnRlZDsgYSBkYXRlIG9yIGtleXdvcmQgZ3JvdXAgYWxyZWFkeSBob2xkcyBpdHMgb3duXG4gIC8vIGRpc3BsYXkgdmFsdWUgYW5kIHJlc29sdmVzIHN5bmNocm9ub3VzbHkuXG4gIHByaXZhdGUgX2ZpbHRlclN1bW1hcnkocmVwb3J0OiBSZXBvcnQpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgbGluZXM6IE9ic2VydmFibGU8c3RyaW5nPltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10pIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZmlsdGVyU3RhdGUudmFsdWUoZ3JvdXAuaWQpO1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGFiZWwgPSBncm91cC5sYWJlbCB8fCAnRmlsdGVyJztcblxuICAgICAgaWYgKHZhbHVlLnN0YXJ0IHx8IHZhbHVlLmVuZCkge1xuICAgICAgICBsaW5lcy5wdXNoKG9mKGAke2xhYmVsfTogJHt0aGlzLl9kYXRlKHZhbHVlLnN0YXJ0KX0g4oCTICR7dGhpcy5fZGF0ZSh2YWx1ZS5lbmQpfWApKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUudmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgICAgbGluZXMucHVzaCh0aGlzLl9zZWxlY3RMaW5lKGxhYmVsLCBncm91cCwgcmVwb3J0LmlkLCB2YWx1ZS52YWx1ZXMpKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUudmFsdWU/LnRyaW0oKSkge1xuICAgICAgICBsaW5lcy5wdXNoKG9mKGAke2xhYmVsfTogXCIke3ZhbHVlLnZhbHVlLnRyaW0oKX1cImApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgZ3JvdXAtYnkgZ3JhaW4sIHVuZGVyIHRoZSByZXBvcnQncyBvd24gbmFtZSBmb3IgdGhlIGNvbnRyb2wg4oCUIGEgY292ZXJcbiAgICAvLyBzaGVldCByZWFkaW5nIFwiRnJlcXVlbmN5XCIgd2hlbiB0aGUgcmVwb3J0IGNhbGxzIGl0IFwiUGVyaW9kXCIgZGVzY3JpYmVzIGFcbiAgICAvLyBjb250cm9sIHRoZSByZWFkZXIgY2Fubm90IGZpbmQgb24gc2NyZWVuLlxuICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCk7XG4gICAgaWYgKGdyYW51bGFyaXR5KSB7XG4gICAgICBjb25zdCBvcHRpb24gPSBHUkFOVUxBUklUWV9PUFRJT05TLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IGdyYW51bGFyaXR5KTtcbiAgICAgIGNvbnN0IGxhYmVsID0gcmVwb3J0LmNvbmZpZz8uZ3JvdXBCeT8ubGFiZWwgfHwgJ0dyb3VwIEJ5JztcbiAgICAgIGxpbmVzLnB1c2gob2YoYCR7bGFiZWx9OiAke29wdGlvbj8ubmFtZSA/PyBncmFudWxhcml0eX1gKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmxlbmd0aCA/IGZvcmtKb2luKGxpbmVzKSA6IG9mKFtdKTtcbiAgfVxuXG4gIC8vIE9uZSBzZWxlY3QgZ3JvdXAncyBsaW5lLCB3aXRoIGl0cyBzdG9yZWQgaWRzIHJlc29sdmVkIHRvIHRoZSBzYW1lIG5hbWVzIHRoZVxuICAvLyBvbi1zY3JlZW4gY2hpcHMgc2hvdyDigJQgYSBjb3ZlciByZWFkaW5nIFwiT3JnYW5pemF0aW9uOiA4Nzc0LCA4Nzc3XCIgdGVsbHMgdGhlXG4gIC8vIGNsaWVudCBub3RoaW5nIGFib3V0IHdoYXQgdGhlIHJlcG9ydCBjb3ZlcnMuXG4gIC8vXG4gIC8vIFVzZXMgdGhlIHJlcG9ydCBiYXIncyBvd24gbG9hZGVyIGFuZCByZXNvbHZlciBzbyB0aGUgdHdvIGNhbid0IGRyaWZ0LCB3aGljaFxuICAvLyBhbHNvIG1lYW5zIGEgdmFsdWUgd2hvc2UgZW50aXR5IHdhcyBkZWxldGVkIGtlZXBzIHNob3dpbmcgaXRzIHJhdyBpZCByYXRoZXJcbiAgLy8gdGhhbiBkcm9wcGluZyBvZmYgdGhlIGNvdmVyIGFuZCBzaWxlbnRseSB1bmRlcnN0YXRpbmcgdGhlIGZpbHRlci4gQSBmYWlsZWRcbiAgLy8gb3B0aW9uIGZldGNoIGRlZ3JhZGVzIHRoZSB3aG9sZSBsaW5lIHRvIGlkcyBmb3IgdGhlIHNhbWUgcmVhc29uOiBhbiBleHBvcnRcbiAgLy8gbXVzdCBuZXZlciBmYWlsIG9uIGEgY29zbWV0aWMgbG9va3VwLlxuICBwcml2YXRlIF9zZWxlY3RMaW5lKFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgdmFsdWVzOiB1bmtub3duW10sXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHJlc29sdmVPcHRpb25WYWx1ZXMobG9hZEdyb3VwT3B0aW9ucyhncm91cCwgdGhpcy5fcmVwb3J0RGF0YSwgcmVwb3J0SWQpLCB2YWx1ZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNvbHZlZCkgPT4gYCR7bGFiZWx9OiAke3Jlc29sdmVkLm1hcCgoaXRlbSkgPT4gaXRlbS5uYW1lKS5qb2luKCcsICcpfWApLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKGAke2xhYmVsfTogJHt2YWx1ZXMubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbSkpLmpvaW4oJywgJyl9YCkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFJlbmRlcmVkIG9mZiB0aGUgc2FtZSBjYWxlbmRhciBkYXkgdGhlIGZpbHRlciBzZW5kcyB0byB0aGUgc2VydmVyLCBzbyB0aGVcbiAgLy8gY292ZXIncyBwZXJpb2QgaXMgdGhlIHBlcmlvZCB0aGUgbnVtYmVycyBiZWhpbmQgaXQgd2VyZSBxdWVyaWVkIGZvci5cbiAgcHJpdmF0ZSBfZGF0ZSh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBkYXRlQm91bmRMYWJlbCh2YWx1ZSkgPz8gJ+KApic7XG4gIH1cbn1cbiJdfQ==
|
|
237
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBYyxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakYsT0FBTyxFQUdMLG1CQUFtQixHQU1wQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7QUFpQ25GLGdEQUFnRDtBQUNoRCxFQUFFO0FBQ0YsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSxnRkFBZ0Y7QUFDaEYsK0VBQStFO0FBQy9FLFlBQVk7QUFDWixNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUU3QixxRUFBcUU7QUFDckUsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsZ0ZBQWdGO0FBQ2hG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R0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssS0FBSyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFDOUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ25GLENBQUM7SUFDTixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLHVFQUF1RTtJQUMvRCxLQUFLLENBQUMsS0FBdUM7UUFDbkQsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDO0lBQ3RDLENBQUM7d0dBbEtVLDRCQUE0Qjs0R0FBNUIsNEJBQTRCOzs0RkFBNUIsNEJBQTRCO2tCQUR4QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZvcmtKb2luLCBmcm9tLCBtYXAsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtZXJnZU1hcCwgdG9BcnJheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgZm9ybWF0UmVwb3J0RGF0ZSwgZ2V0Wm9uZWROb3csIHJlc29sdmVSZXBvcnRUaW1lem9uZSB9IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQge1xuICBDb21wb25lbnREYXRhLFxuICBDb21wb25lbnREYXRhU3RhdGUsXG4gIEdSQU5VTEFSSVRZX09QVElPTlMsXG4gIExpc3RDb25maWcsXG4gIFJlcG9ydCxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgUmVwb3J0UGFnZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGRhdGVCb3VuZExhYmVsLCBsb2FkR3JvdXBPcHRpb25zLCByZXNvbHZlT3B0aW9uVmFsdWVzIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkQ29tcG9uZW50IHtcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIC8vIG51bGwgPSBpdHMgcXVlcnkgZmFpbGVkOyBleHBvcnRzIHNob3cgYSBub3RlLiBBbHdheXMgbnVsbCBmb3IgYSB0ZXh0XG4gIC8vIGJsb2NrLCB3aGljaCBoYXMgbm8gcXVlcnkg4oCUIHNlZSBpc0ZhaWxlZCgpLlxuICBkYXRhOiBDb21wb25lbnREYXRhIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0ZWRQYWdlIHtcbiAgcGFnZTogUmVwb3J0UGFnZTtcbiAgY29tcG9uZW50czogQ29sbGVjdGVkQ29tcG9uZW50W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkUmVwb3J0IHtcbiAgcmVwb3J0OiBSZXBvcnQ7XG4gIHBhZ2VzOiBDb2xsZWN0ZWRQYWdlW107XG4gIC8vIEh1bWFuLXJlYWRhYmxlIGxpbmVzIGRlc2NyaWJpbmcgdGhlIGFjdGl2ZSBmaWx0ZXJzLCBmb3IgdGhlIHRpdGxlIHNsaWRlL3BhZ2UuXG4gIGZpbHRlclN1bW1hcnk6IHN0cmluZ1tdO1xuICAvLyBXaGF0IHRoZSBudW1iZXJzIGFyZSBtZWFzdXJlZCBpbiwgZm9yIHRoZSB0aXRsZSBzbGlkZS9wYWdlOiB0aGUgem9uZSB0aGVcbiAgLy8gc2VydmVyIHJlc29sdmVkIGZvciB0aGUgcmVwb3J0LiBFbXB0eSB3aGVuIHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc2VuZCBvbmUsXG4gIC8vIHJhdGhlciB0aGFuIGEgZ3Vlc3MgdGhhdCB3b3VsZCBiZSB3cm9uZyB3aGVuZXZlciB0aGUgZGVmYXVsdCBhcHBsaWVzLlxuICBjb250ZXh0TGluZXM6IHN0cmluZ1tdO1xufVxuXG4vLyBPbmUgZXhwb3J0ZWQgbGlzdCBjb2x1bW46IHRoZSBjZWxsIGtleSBhbmQgaG93IGl0IGlzIHNob3duLlxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRMaXN0Q29sdW1uIHtcbiAgY29sdW1uOiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBmb3JtYXQ/OiBzdHJpbmc7XG59XG5cbi8vIEhvdyBtYW55IHRpbGUgcXVlcmllcyBhbiBleHBvcnQgcnVucyBhdCBvbmNlLlxuLy9cbi8vIE5vdCBhIHBvbGl0ZW5lc3Mgc2V0dGluZyDigJQgaXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGRlY2sgYW5kIGEgYnJva2VuXG4vLyBvbmUuIFRoZXNlIHF1ZXJpZXMgYXJlIGhlYXZ5IGFuZCByZWFkIHRoZSBzYW1lIHRhYmxlcywgc28gZmlyaW5nIGFsbCBvZiB0aGVtXG4vLyB0b2dldGhlciBwdXRzIGV2ZXJ5IG9uZSBpbiBjb250ZW50aW9uIGZvciB0aGUgc2FtZSBkYXRhYmFzZSBhdCB0aGUgc2FtZVxuLy8gbW9tZW50IGFuZCB0aGV5IGNyb3NzIHRoZSBzdGF0ZW1lbnQgY2VpbGluZyBhcyBhIGdyb3VwOiBtZWFzdXJlZCBvbiByZXBvcnRcbi8vIDI4LCB0ZW4gdGlsZXMgdGhhdCBlYWNoIGFuc3dlciBpbiA5LTI0cyBydW4gb25lIGFmdGVyIGFub3RoZXIgYWxsIGZhaWxlZCBhdFxuLy8gfjMwcyB3aGVuIHJlbGVhc2VkIHRvZ2V0aGVyLiBDb25jdXJyZW5jeSBidXlzIHdhbGwtY2xvY2sgb25seSB1cCB0byB0aGUgcG9pbnRcbi8vIHdoZXJlIHRoZSBxdWVyaWVzIHN0YXJ0IHRha2luZyBpdCBiYWNrIG9mZiBlYWNoIG90aGVyLCBhbmQgcGFzdCB0aGF0IGl0IGJ1eXNcbi8vIGZhaWx1cmVzLlxuY29uc3QgRVhQT1JUX0NPTkNVUlJFTkNZID0gMztcblxuLy8gV2hhdCBhIGNvbXBvbmVudCB3aXRoIG5vdGhpbmcgdG8gZHJhdyBwcmludHMgaW4gdGhlIGV4cG9ydGVkIGZpbGUuXG4vL1xuLy8gVGhlIHR3byBjYXNlcyBtdXN0IG5vdCByZWFkIGFsaWtlLiBBIHRpbGUgdGhhdCByZXR1cm5lZCBubyByb3dzIGlzIGEgZmluZGluZ1xuLy8gYWJvdXQgdGhlIHBlcmlvZCDigJQgdGhlIHJlcG9ydCB3b3JrZWQgYW5kIHRoZSBhbnN3ZXIgaXMgXCJub25lXCIuIEEgdGlsZSB3aG9zZVxuLy8gcXVlcnkgZmFpbGVkIGlzIGEgaG9sZSBpbiB0aGUgZmlsZSwgYW5kIGNhbGxpbmcgdGhhdCBcIkRhdGEgdW5hdmFpbGFibGVcIiB0ZWxsc1xuLy8gdGhlIHJlYWRlciB0aGUgZGF0YSBkb2VzIG5vdCBleGlzdCB3aGVuIHdoYXQgaGFwcGVuZWQgaXMgdGhhdCBub2JvZHkgbWFuYWdlZFxuLy8gdG8gYXNrIGZvciBpdC4gU2hhcmVkIGJ5IGJvdGggcmVuZGVyZXJzIHNvIHRoZSBQREYgYW5kIHRoZSBkZWNrIGNhbm5vdCBlbmQgdXBcbi8vIGRlc2NyaWJpbmcgdGhlIHNhbWUgaG9sZSB0d28gZGlmZmVyZW50IHdheXMuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlMYWJlbChpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQpOiBzdHJpbmcge1xuICByZXR1cm4gaXRlbS5kYXRhID8gJ05vIGRhdGEnIDogJ0NvdWxkIG5vdCBiZSBnZW5lcmF0ZWQnO1xufVxuXG4vLyBXaGV0aGVyIGEgdGlsZSdzIHF1ZXJ5IGZhaWxlZC4gQSB0ZXh0IGJsb2NrIGhhcyBubyBxdWVyeSwgc28gaXQgbmV2ZXIgZGlkLlxuZXhwb3J0IGZ1bmN0aW9uIGlzRmFpbGVkKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWl0ZW0uZGF0YSAmJiBpdGVtLmNvbXBvbmVudC50eXBlICE9PSAndGV4dCc7XG59XG5cbi8vIFRoZSBsaW5lcyB1bmRlciB0aGUgcmVwb3J0J3MgbmFtZSBvbiB0aGUgUERGIHRpdGxlIHBhZ2UgYW5kIHRoZSB0aXRsZSBzbGlkZTpcbi8vIHRoZSBleHBvcnQgZGF0ZSwgdGhlIGFjdGl2ZSBmaWx0ZXJzLCB0aGVuIHdoYXQgdGhlIG51bWJlcnMgYXJlIG1lYXN1cmVkIGluLlxuLy8gVGhlIGRhdGUgaXMgdG9kYXkgaW4gdGhlIHJlcG9ydCdzIHpvbmUsIHRoZSBzYW1lIGRheSBpdHMgZmlsdGVycyByZXNvbHZlXG4vLyBcInRvZGF5XCIgdG8uXG5leHBvcnQgZnVuY3Rpb24gY292ZXJMaW5lcyhjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBmb3JtYXQoZ2V0Wm9uZWROb3cocmVzb2x2ZVJlcG9ydFRpbWV6b25lKGNvbGxlY3RlZC5yZXBvcnQpKSwgJ01NTU0gZCwgeXl5eScpLFxuICAgIC4uLmNvbGxlY3RlZC5maWx0ZXJTdW1tYXJ5LFxuICAgIC4uLmNvbGxlY3RlZC5jb250ZXh0TGluZXMsXG4gIF07XG59XG5cbi8vIEFuIGV4cG9ydGVkIGxpc3QgY2VsbCwgcmVhZGluZyBsaWtlIHRoZSBvbi1zY3JlZW4gY2VsbDogdGhlIFNRTCBhbHJlYWR5XG4vLyBjYXJyaWVzIHRoZSBmb3JtYXR0aW5nLCBzbyB0aGUgdmFsdWUgZ29lcyBvdXQgdmVyYmF0aW0uIEEgZGF0ZSBjb2x1bW4gaXMgdGhlXG4vLyBvbmUgdmFsdWUgdGhlIGJyb3dzZXIgcmVuZGVycywgYW5kIGl0IHJlbmRlcnMgdGhyb3VnaCB0aGUgc2FtZSBmdW5jdGlvbiBhc1xuLy8gdGhlIHNjcmVlbiwgaW4gdGhlIHJlcG9ydCdzIHpvbmUuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0Q2VsbCh2YWx1ZTogdW5rbm93biwgY29sdW1uRm9ybWF0OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRpbWV6b25lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBjb2x1bW5Gb3JtYXQgPT09ICdkYXRlJyA/IGZvcm1hdFJlcG9ydERhdGUodmFsdWUsIHRpbWV6b25lKSA6IFN0cmluZyh2YWx1ZSk7XG59XG5cbi8vIFRoZSBjb2x1bW5zIGFuIGV4cG9ydGVkIGxpc3QgdGFibGUgZHJhd3MuIEEgY3Jvc3MtdGFiJ3MgY29sdW1ucyBhcnJpdmUgd2l0aFxuLy8gaXRzIHJvd3MgKHRoZSByb3cga2V5IGZpcnN0LCB0aGVuIG9uZSBwZXIgcGl2b3QgdmFsdWUpLCBzaW5jZSBvbmx5IHRoZVxuLy8gcmVzdWx0IGtub3dzIHRoZSBwaXZvdCB2YWx1ZXM7IGEgcGxhaW4gbGlzdCBkcmF3cyBpdHMgY29uZmlndXJlZCBjb2x1bW5zLFxuLy8gZWxzZSBldmVyeSBjb2x1bW4gdGhlIHF1ZXJ5IHJldHVybmVkLlxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RDb2x1bW5zKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBkYXRhOiBDb21wb25lbnREYXRhKTogRXhwb3J0TGlzdENvbHVtbltdIHtcbiAgY29uc3QgY29uZmlnID0gKGNvbXBvbmVudC5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG5cbiAgaWYgKCFjb25maWcucGl2b3RCeT8uY29sdW1uICYmIGNvbmZpZy5jb2x1bW5zPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gY29uZmlnLmNvbHVtbnM7XG4gIH1cblxuICByZXR1cm4gZGF0YS5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiAoeyBjb2x1bW4gfSkpO1xufVxuXG4vLyBUaGUgaGVhZGluZyBvdmVyIGVhY2ggY29sdW1uIG9mIGxpc3RDb2x1bW5zKCkuIEEgY3Jvc3MtdGFiJ3MgZmlyc3QgY29sdW1uXG4vLyBpcyBoZWFkZWQgYnkgcm93QnkubGFiZWwsIGVsc2UgaXRzIGNvbHVtbiBuYW1lLCBhbmQgZXZlcnkgb3RoZXIgaGVhZGluZyBpc1xuLy8gdGhlIHJhdyBwaXZvdCB2YWx1ZTsgYSBwbGFpbiBsaXN0J3MgY29sdW1ucyBrZWVwIHRoZWlyIGNvbmZpZ3VyZWQgbGFiZWxzLlxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RIZWFkaW5ncyhjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgZGF0YTogQ29tcG9uZW50RGF0YSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29uZmlnID0gKGNvbXBvbmVudC5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG5cbiAgaWYgKGNvbmZpZy5waXZvdEJ5Py5jb2x1bW4pIHtcbiAgICByZXR1cm4gZGF0YS5jb2x1bW5zLm1hcCgoY29sdW1uLCBpbmRleCkgPT4gKGluZGV4ID09PSAwID8gY29uZmlnLnJvd0J5Py5sYWJlbCB8fCBjb2x1bW4gOiBjb2x1bW4pKTtcbiAgfVxuXG4gIHJldHVybiBsaXN0Q29sdW1ucyhjb21wb25lbnQsIGRhdGEpLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtbik7XG59XG5cbi8vIFRoZSBsYXN0IHJvdyBvZiBhbiBleHBvcnRlZCBsaXN0IHRhYmxlIHRoYXQgc3RvcHMgc2hvcnQgb2YgaXRzIHJlc3VsdDogaG93XG4vLyBtYW55IHJvd3MgdGhlIGZpbGUgbGVhdmVzIG91dCBhbmQgd2hlcmUgdGhlIHdob2xlIHNldCBjYW4gYmUgaGFkLiBFYWNoXG4vLyBmb3JtYXQgZmV0Y2hlcyBpdHMgb3duIG51bWJlciBvZiByb3dzIChQREZfTElTVF9ST1dTLCBQUFRYX0xJU1RfUk9XUyksIGFuZFxuLy8gYm90aCBuYW1lIHdoYXQgaXMgbGVmdCB3aXRoIHRoaXMgb25lIHNlbnRlbmNlLlxuZXhwb3J0IGZ1bmN0aW9uIG1vcmVSb3dzTm90aWNlKHJlbWFpbmluZzogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGDigKYgJHtyZW1haW5pbmd9IG1vcmUgcm93KHMpIOKAlCB1c2UgdGhlIGNvbXBvbmVudCdzIENTViBleHBvcnQgZm9yIHRoZSBmdWxsIGRhdGFzZXRgO1xufVxuXG4vLyBUaGUgcGFnZXMgb2YgYSBjb2xsZWN0ZWQgcmVwb3J0IHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgdGlsZSB3aG9zZSBxdWVyeVxuLy8gZmFpbGVkIOKAlCB3aGF0IHRoZSBleHBvcnQgZ2F0ZSBuYW1lcyB0byB0aGUgdXNlciwgYW5kIHdoYXQgbWFrZXMgXCJzb21lIG9mIHRoaXNcbi8vIGZpbGUgaXMgbWlzc2luZ1wiIGEgZmFjdCB0aGUgY2FsbGVyIGNhbiBhY3Qgb24gcmF0aGVyIHRoYW4gYSB0aGluZyB0aGV5IG5vdGljZVxuLy8gaW4gdGhlIFBERiBhZnRlcndhcmRzLlxuZXhwb3J0IGZ1bmN0aW9uIGZhaWxlZFBhZ2VOYW1lcyhjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IHN0cmluZ1tdIHtcbiAgLy8gTnVtYmVyZWQgYmVmb3JlIHRoZSBmaWx0ZXIg4oCUIGFuIHVubmFtZWQgcGFnZSA0IHRoYXQgZmFpbGVkIGhhcyB0byByZWFkXG4gIC8vIFwiUGFnZSA0XCIsIG5vdCBcIlBhZ2UgMVwiIGJlY2F1c2UgaXQgaGFwcGVuZWQgdG8gYmUgdGhlIGZpcnN0IGZhaWx1cmUuXG4gIHJldHVybiBjb2xsZWN0ZWQucGFnZXNcbiAgICAubWFwKChwYWdlLCBpbmRleCkgPT4gKHsgcGFnZSwgbnVtYmVyOiBpbmRleCArIDEgfSkpXG4gICAgLmZpbHRlcigoeyBwYWdlIH0pID0+IHBhZ2UuY29tcG9uZW50cy5zb21lKGlzRmFpbGVkKSlcbiAgICAubWFwKCh7IHBhZ2UsIG51bWJlciB9KSA9PiBwYWdlLnBhZ2UubmFtZSB8fCBgUGFnZSAke251bWJlcn1gKTtcbn1cblxuLy8gR2F0aGVycyBldmVyeXRoaW5nIGFuIGV4cG9ydCBuZWVkczogZXZlcnkgY29tcG9uZW50J3MgZGF0YSBhY3Jvc3MgQUxMIHBhZ2VzXG4vLyAodGhlIGNhbnZhcyBvbmx5IHJlbmRlcnMgdGhlIGFjdGl2ZSBwYWdlLCBzbyBleHBvcnRzIGNhbid0IHNjcmFwZSB0aGVcbi8vIHNjcmVlbiksIGZldGNoZWQgZnJlc2ggd2l0aCB0aGUgdmlld2VyJ3MgY3VycmVudCBmaWx0ZXIgc3RhdGUuXG4vL1xuLy8gQSBmYWlsZWQgY29tcG9uZW50IHJlc29sdmVzIHRvIGEgbnVsbCBgZGF0YWAgcmF0aGVyIHRoYW4gZmFpbGluZyB0aGUgd2hvbGVcbi8vIGNvbGxlY3Rpb24g4oCUIGJ1dCB0aGF0IGlzIHNvIHRoZSBjYWxsZXIgY2FuIFJFUE9SVCB3aGF0IGZhaWxlZCwgbm90IHNvIGl0IGNhblxuLy8gYmUgaWdub3JlZDogc2VlIGZhaWxlZFBhZ2VOYW1lcygpIGFuZCB0aGUgZXhwb3J0IGdhdGUgdGhhdCB1c2VzIGl0LlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2Uge1xuXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG5cbiAgLy8gbGlzdFJvd3MgaXMgaG93IG1hbnkgcm93cyBlYWNoIGxpc3QgZmV0Y2hlczogdGhlIHJlbmRlcmVyJ3Mgb3duIGNhcCwgc2luY2VcbiAgLy8gYSBQREYgdGFibGUgY29udGludWVzIG9udG8gZXh0cmEgcGFnZXMgYW5kIGEgc2xpZGUgdGFibGUgY2Fubm90LlxuICBwdWJsaWMgY29sbGVjdChyZXBvcnQ6IFJlcG9ydCwgbGlzdFJvd3M6IG51bWJlcik6IE9ic2VydmFibGU8Q29sbGVjdGVkUmVwb3J0PiB7XG4gICAgY29uc3Qgc2xvdHM6IHsgcGFnZUluZGV4OiBudW1iZXI7IGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50IH1bXSA9IFtdO1xuXG4gICAgcmVwb3J0LnBhZ2VzLmZvckVhY2goKHBhZ2UsIHBhZ2VJbmRleCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgcGFnZS5jb21wb25lbnRzKSB7XG4gICAgICAgIHNsb3RzLnB1c2goeyBwYWdlSW5kZXgsIGNvbXBvbmVudCB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFRleHQgYmxvY2tzIGhhdmUgbm90aGluZyB0byBmZXRjaCDigJQgdGhleSByaWRlIHRocm91Z2ggd2l0aCBubyBkYXRhLiBUaGVcbiAgICAvLyBoZWFkZXIvZm9vdGVyIChyZXBvcnQubWFzdGVyKSBpcyByZWFkIGJ5IHRoZSByZW5kZXJlcnMgc3RyYWlnaHQgb2ZmIHRoZVxuICAgIC8vIHJlcG9ydCBmb3IgdGhlIHNhbWUgcmVhc29uLlxuXG4gICAgLy8gUmVsZWFzZWQgYSBmZXcgYXQgYSB0aW1lIHJhdGhlciB0aGFuIGFsbCBhdCBvbmNlLiBtZXJnZU1hcCBjb21wbGV0ZXMgb3V0XG4gICAgLy8gb2Ygb3JkZXIsIHNvIGVhY2ggcmVzdWx0IGNhcnJpZXMgdGhlIHNsb3QgaXQgY2FtZSBmcm9tIGFuZCB0aGUgcm93cyBhcmVcbiAgICAvLyBmaWxlZCBieSBpbmRleCDigJQgdGhlIGRlY2sncyBwYWdlIG9yZGVyIGNhbid0IGRlcGVuZCBvbiB3aGljaCBxdWVyeVxuICAgIC8vIGhhcHBlbmVkIHRvIGZpbmlzaCBmaXJzdC5cbiAgICBjb25zdCBhbGwkID0gc2xvdHMubGVuZ3RoXG4gICAgICA/IGZyb20oc2xvdHMubWFwKChzbG90LCBpbmRleCkgPT4gKHsgc2xvdCwgaW5kZXggfSkpKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtZXJnZU1hcChcbiAgICAgICAgICAgICh7IHNsb3QsIGluZGV4IH0pID0+IHRoaXMuX2NvbXBvbmVudERhdGEocmVwb3J0LCBzbG90LmNvbXBvbmVudCwgbGlzdFJvd3MpXG4gICAgICAgICAgICAgIC5waXBlKG1hcCgoaXRlbSkgPT4gKHsgaXRlbSwgaW5kZXggfSkpKSxcbiAgICAgICAgICAgIEVYUE9SVF9DT05DVVJSRU5DWSxcbiAgICAgICAgICApLFxuICAgICAgICAgIHRvQXJyYXkoKSxcbiAgICAgICAgKVxuICAgICAgOiBvZihbXSBhcyB7IGl0ZW06IENvbGxlY3RlZENvbXBvbmVudDsgaW5kZXg6IG51bWJlciB9W10pO1xuXG4gICAgLy8gVGhlIHN1bW1hcnkgcmlkZXMgYWxvbmdzaWRlIHRoZSBjb21wb25lbnQgZGF0YSByYXRoZXIgdGhhbiBiZWluZyBidWlsdCBhdFxuICAgIC8vIHRoZSBlbmQsIGJlY2F1c2UgbmFtaW5nIGEgc2VsZWN0IGZpbHRlcidzIHZhbHVlcyBpcyBpdHNlbGYgYSByZXF1ZXN0LlxuICAgIHJldHVybiBmb3JrSm9pbih7IGNvbGxlY3RlZDogYWxsJCwgZmlsdGVyU3VtbWFyeTogdGhpcy5nZXRGaWx0ZXJTdW1tYXJ5KHJlcG9ydCkgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHsgY29sbGVjdGVkLCBmaWx0ZXJTdW1tYXJ5IH0pID0+IHtcbiAgICAgICAgICBjb25zdCBwYWdlczogQ29sbGVjdGVkUGFnZVtdID0gcmVwb3J0LnBhZ2VzLm1hcCgocGFnZSkgPT4gKHsgcGFnZSwgY29tcG9uZW50czogW10gfSkpO1xuXG4gICAgICAgICAgWy4uLmNvbGxlY3RlZF1cbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleClcbiAgICAgICAgICAgIC5mb3JFYWNoKCh7IGl0ZW0sIGluZGV4IH0pID0+IHtcbiAgICAgICAgICAgICAgcGFnZXNbc2xvdHNbaW5kZXhdLnBhZ2VJbmRleF0uY29tcG9uZW50cy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVwb3J0LFxuICAgICAgICAgICAgcGFnZXMsXG4gICAgICAgICAgICBmaWx0ZXJTdW1tYXJ5LFxuICAgICAgICAgICAgY29udGV4dExpbmVzOiB0aGlzLl9jb250ZXh0TGluZXMocmVwb3J0KSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBcIlJlcG9ydCBQZXJpb2Q6IEp1biAxMiwgMjAyNSDigJMgSnVuIDEyLCAyMDI2XCIsIFwiUmVnaW9uOiBOb3J0aCwgRWFzdFwiIOKAlCBvbmVcbiAgLy8gbGluZSBwZXIgZmlsdGVyIGdyb3VwIHRoYXQgaGFzIGFuIGFjdGl2ZSBzZXNzaW9uIHZhbHVlLCB0aGVuIHRoZSBncm91cC1ieVxuICAvLyBsaW5lLiBUaGUgZmlsdGVyIGJhciBhcyB0aGUgdmlld2VyIHJlYWRzIGl0OiB0aGUgUERGIGFuZCBQb3dlclBvaW50IGNvdmVyc1xuICAvLyBwcmludCBpdCwgYW5kIHRoZSByZXBvcnQgemlwIGV4cG9ydCBzZW5kcyBpdCBmb3IgaXRzIG5vdGVzIGZpbGUuXG4gIC8vXG4gIC8vIEEgc2VsZWN0IGdyb3VwIHN0b3JlcyBpZHMsIHNvIGl0cyBsaW5lIGhhcyB0byBiZSBuYW1lZCBvZmYgdGhlIG9wdGlvbiBsaXN0XG4gIC8vIGJlZm9yZSBpdCBjYW4gYmUgcHJpbnRlZDsgYSBkYXRlIG9yIGtleXdvcmQgZ3JvdXAgYWxyZWFkeSBob2xkcyBpdHMgb3duXG4gIC8vIGRpc3BsYXkgdmFsdWUgYW5kIHJlc29sdmVzIHN5bmNocm9ub3VzbHkuXG4gIHB1YmxpYyBnZXRGaWx0ZXJTdW1tYXJ5KHJlcG9ydDogUmVwb3J0KTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGxpbmVzOiBPYnNlcnZhYmxlPHN0cmluZz5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiByZXBvcnQuZmlsdGVyR3JvdXBzID8/IFtdKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2ZpbHRlclN0YXRlLnZhbHVlKGdyb3VwLmlkKTtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxhYmVsID0gZ3JvdXAubGFiZWwgfHwgJ0ZpbHRlcic7XG5cbiAgICAgIGlmICh2YWx1ZS5zdGFydCB8fCB2YWx1ZS5lbmQpIHtcbiAgICAgICAgbGluZXMucHVzaChvZihgJHtsYWJlbH06ICR7dGhpcy5fZGF0ZSh2YWx1ZS5zdGFydCl9IOKAkyAke3RoaXMuX2RhdGUodmFsdWUuZW5kKX1gKSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlLnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICAgIGxpbmVzLnB1c2godGhpcy5fc2VsZWN0TGluZShsYWJlbCwgZ3JvdXAsIHJlcG9ydC5pZCwgdmFsdWUudmFsdWVzKSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlLnZhbHVlPy50cmltKCkpIHtcbiAgICAgICAgbGluZXMucHVzaChvZihgJHtsYWJlbH06IFwiJHt2YWx1ZS52YWx1ZS50cmltKCl9XCJgKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIGdyb3VwLWJ5IGdyYWluLCB1bmRlciB0aGUgcmVwb3J0J3Mgb3duIG5hbWUgZm9yIHRoZSBjb250cm9sIOKAlCBhIGNvdmVyXG4gICAgLy8gc2hlZXQgcmVhZGluZyBcIkZyZXF1ZW5jeVwiIHdoZW4gdGhlIHJlcG9ydCBjYWxscyBpdCBcIlBlcmlvZFwiIGRlc2NyaWJlcyBhXG4gICAgLy8gY29udHJvbCB0aGUgcmVhZGVyIGNhbm5vdCBmaW5kIG9uIHNjcmVlbi5cbiAgICBjb25zdCBncmFudWxhcml0eSA9IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpO1xuICAgIGlmIChncmFudWxhcml0eSkge1xuICAgICAgY29uc3Qgb3B0aW9uID0gR1JBTlVMQVJJVFlfT1BUSU9OUy5maW5kKChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSBncmFudWxhcml0eSk7XG4gICAgICBjb25zdCBsYWJlbCA9IHJlcG9ydC5jb25maWc/Lmdyb3VwQnk/LmxhYmVsIHx8ICdHcm91cCBCeSc7XG4gICAgICBsaW5lcy5wdXNoKG9mKGAke2xhYmVsfTogJHtvcHRpb24/Lm5hbWUgPz8gZ3JhbnVsYXJpdHl9YCkpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcy5sZW5ndGggPyBmb3JrSm9pbihsaW5lcykgOiBvZihbXSk7XG4gIH1cblxuICBwcml2YXRlIF9jb21wb25lbnREYXRhKHJlcG9ydDogUmVwb3J0LCBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgbGlzdFJvd3M6IG51bWJlcik6IE9ic2VydmFibGU8Q29sbGVjdGVkQ29tcG9uZW50PiB7XG4gICAgaWYgKGNvbXBvbmVudC50eXBlID09PSAndGV4dCcpIHtcbiAgICAgIHJldHVybiBvZih7IGNvbXBvbmVudCwgZGF0YTogbnVsbCB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpO1xuICAgIC8vIEEgdGltZS1zZXJpZXMgY2hhcnQgY2FycmllcyB0aGUgdmlld2VyJ3MgZ3JvdXAtYnkgZ3JhaW4gc28gdGhlIGV4cG9ydFxuICAgIC8vIHJlLWJ1Y2tldHMgZXhhY3RseSBhcyB0aGUgc2NyZWVuIGRvZXM7IGxpc3RzIGNhcnJ5IHRoZWlyIGV4cG9ydCBwYWdpbmdcbiAgICAvLyBhbmQgdGhlIHZpZXdlcidzIGhlYWRlciBzb3J0LCBzbyB0aGUgdGFibGUgcmVhZHMgaW4gdGhlIHNjcmVlbidzIG9yZGVyLlxuICAgIC8vXG4gICAgLy8gVGhlIHRpbWUtc2VyaWVzIGNoZWNrIGRlbGliZXJhdGVseSBtaXJyb3JzIHRoZSBzZXJ2ZXIncyBjYW5vbmljYWxcbiAgICAvLyBSZXBvcnRRdWVyeVJ1bm5lcjo6X2lzVGltZVNlcmllc0NoYXJ0LCBzbyBhIHByb2R1Y3QgcGlubmVkIHRvIGFuIG9sZGVyXG4gICAgLy8gZnJhbWV3b3JrIGRvZXMgbm90IHJlLWJ1Y2tldCBhIG5vbi10aW1lIGNoYXJ0LlxuICAgIGNvbnN0IGZyZXF1ZW5jeSA9IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpO1xuICAgIGNvbnN0IGlzVGltZVNlcmllcyA9IGNvbXBvbmVudC50eXBlID09PSAnY2hhcnQnICYmIGNvbXBvbmVudC5jb25maWc/LnhBeGlzPy5raW5kID09PSAndGltZSc7XG4gICAgY29uc3Qgc3RhdGU6IENvbXBvbmVudERhdGFTdGF0ZSA9IGNvbXBvbmVudC50eXBlID09PSAnbGlzdCdcbiAgICAgID8geyBwYWdlOiAxLCBwYWdlU2l6ZTogbGlzdFJvd3MsIHNvcnQ6IHRoaXMuX2ZpbHRlclN0YXRlLmxpc3RTb3J0KGNvbXBvbmVudC5pZCkgPz8gdW5kZWZpbmVkIH1cbiAgICAgIDogKGlzVGltZVNlcmllcyAmJiBmcmVxdWVuY3kgPyB7IGZyZXF1ZW5jeSB9IDoge30pO1xuXG4gICAgLy8gaGFuZGxlcnM6IGZhbHNlIGtlZXBzIHRoZSBhcHAncyBnbG9iYWwgZXJyb3IgZGlhbG9nIG91dCBvZiB0aGlzLiBBIGZhaWxlZFxuICAgIC8vIHRpbGUgaXMgcmVwb3J0ZWQgb25jZSwgYnkgdGhlIGV4cG9ydCBnYXRlLCBuYW1pbmcgdGhlIHBhZ2VzIGl0IGNvc3Qg4oCUXG4gICAgLy8gbmV2ZXIgYXMgdGVuIHN0YWNrZWQgbW9kYWxzIGNhcnJ5aW5nIHRoZSBkYXRhYmFzZSdzIG93biB3b3JkaW5nLlxuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLmNvbXBvbmVudERhdGEocmVwb3J0LmlkLCBjb21wb25lbnQuaWQsIGZpbHRlcnMsIHN0YXRlLCB0cnVlLCB7IGhhbmRsZXJzOiBmYWxzZSB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoZGF0YTogQ29tcG9uZW50RGF0YSkgPT4gKHsgY29tcG9uZW50LCBkYXRhIH0pKSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZih7IGNvbXBvbmVudCwgZGF0YTogbnVsbCB9KSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gVGhlIHpvbmUgdGhlIHNlcnZlciByZXNvbHZlZCwgYXMgaXRzIElBTkEgaWQuIE9ubHkgdGhlIHNlcnZlcidzIHZhbHVlIGlzXG4gIC8vIHByaW50ZWQ6IHRoZSBicm93c2VyJ3Mgem9uZSAocmVzb2x2ZVJlcG9ydFRpbWV6b25lJ3MgZmFsbGJhY2sgZm9yIGFuIG9sZGVyXG4gIC8vIHNlcnZlcikgaXMgbm90IHdoYXQgdGhlIG51bWJlcnMgd2VyZSBtZWFzdXJlZCBpbi5cbiAgcHJpdmF0ZSBfY29udGV4dExpbmVzKHJlcG9ydDogUmVwb3J0KTogc3RyaW5nW10ge1xuICAgIHJldHVybiByZXBvcnQuZWZmZWN0aXZlVGltZXpvbmUgPyBbYFRpbWV6b25lOiAke3JlcG9ydC5lZmZlY3RpdmVUaW1lem9uZX1gXSA6IFtdO1xuICB9XG5cbiAgLy8gT25lIHNlbGVjdCBncm91cCdzIGxpbmUsIHdpdGggaXRzIHN0b3JlZCBpZHMgcmVzb2x2ZWQgdG8gdGhlIHNhbWUgbmFtZXMgdGhlXG4gIC8vIG9uLXNjcmVlbiBjaGlwcyBzaG93IOKAlCBhIGNvdmVyIHJlYWRpbmcgXCJPcmdhbml6YXRpb246IDg3NzQsIDg3NzdcIiB0ZWxscyB0aGVcbiAgLy8gY2xpZW50IG5vdGhpbmcgYWJvdXQgd2hhdCB0aGUgcmVwb3J0IGNvdmVycy5cbiAgLy9cbiAgLy8gVXNlcyB0aGUgcmVwb3J0IGJhcidzIG93biBsb2FkZXIgYW5kIHJlc29sdmVyIHNvIHRoZSB0d28gY2FuJ3QgZHJpZnQsIHdoaWNoXG4gIC8vIGFsc28gbWVhbnMgYSB2YWx1ZSB3aG9zZSBlbnRpdHkgd2FzIGRlbGV0ZWQga2VlcHMgc2hvd2luZyBpdHMgcmF3IGlkIHJhdGhlclxuICAvLyB0aGFuIGRyb3BwaW5nIG9mZiB0aGUgY292ZXIgYW5kIHNpbGVudGx5IHVuZGVyc3RhdGluZyB0aGUgZmlsdGVyLiBBIGZhaWxlZFxuICAvLyBvcHRpb24gZmV0Y2ggZGVncmFkZXMgdGhlIHdob2xlIGxpbmUgdG8gaWRzIGZvciB0aGUgc2FtZSByZWFzb246IGFuIGV4cG9ydFxuICAvLyBtdXN0IG5ldmVyIGZhaWwgb24gYSBjb3NtZXRpYyBsb29rdXAuXG4gIHByaXZhdGUgX3NlbGVjdExpbmUoXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICB2YWx1ZXM6IHVua25vd25bXSxcbiAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gcmVzb2x2ZU9wdGlvblZhbHVlcyhsb2FkR3JvdXBPcHRpb25zKGdyb3VwLCB0aGlzLl9yZXBvcnREYXRhLCByZXBvcnRJZCksIHZhbHVlcylcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc29sdmVkKSA9PiBgJHtsYWJlbH06ICR7cmVzb2x2ZWQubWFwKChpdGVtKSA9PiBpdGVtLm5hbWUpLmpvaW4oJywgJyl9YCksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoYCR7bGFiZWx9OiAke3ZhbHVlcy5tYXAoKGl0ZW0pID0+IFN0cmluZyhpdGVtKSkuam9pbignLCAnKX1gKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gUmVuZGVyZWQgb2ZmIHRoZSBzYW1lIGNhbGVuZGFyIGRheSB0aGUgZmlsdGVyIHNlbmRzIHRvIHRoZSBzZXJ2ZXIsIHNvIHRoZVxuICAvLyBjb3ZlcidzIHBlcmlvZCBpcyB0aGUgcGVyaW9kIHRoZSBudW1iZXJzIGJlaGluZCBpdCB3ZXJlIHF1ZXJpZWQgZm9yLlxuICBwcml2YXRlIF9kYXRlKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRhdGVCb3VuZExhYmVsKHZhbHVlKSA/PyAn4oCmJztcbiAgfVxufVxuIl19
|
|
@@ -3,8 +3,8 @@ import { FsPrompt } from '@firestitch/prompt';
|
|
|
3
3
|
import { EMPTY, from, of } from 'rxjs';
|
|
4
4
|
import { catchError, switchMap } from 'rxjs/operators';
|
|
5
5
|
import { ReportExportCollectorService, failedPageNames } from './report-export-collector.service';
|
|
6
|
-
import { ReportPdfService } from './report-pdf.service';
|
|
7
|
-
import { ReportPptxService } from './report-pptx.service';
|
|
6
|
+
import { PDF_LIST_ROWS, ReportPdfService } from './report-pdf.service';
|
|
7
|
+
import { PPTX_LIST_ROWS, ReportPptxService } from './report-pptx.service';
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
9
|
// What the user chose when told the export is incomplete. Retry re-runs the
|
|
10
10
|
// whole collection — the queries that failed were killed on a clock, not on
|
|
@@ -28,20 +28,23 @@ export class ReportExportService {
|
|
|
28
28
|
_pptxService = inject(ReportPptxService);
|
|
29
29
|
_prompt = inject(FsPrompt);
|
|
30
30
|
pdf(report) {
|
|
31
|
-
return this._run(report, (collected) => this._pdfService.export(collected));
|
|
31
|
+
return this._run(report, PDF_LIST_ROWS, (collected) => this._pdfService.export(collected));
|
|
32
32
|
}
|
|
33
33
|
powerpoint(report) {
|
|
34
|
-
return this._run(report, (collected) => this._pptxService.export(collected));
|
|
34
|
+
return this._run(report, PPTX_LIST_ROWS, (collected) => this._pptxService.export(collected));
|
|
35
35
|
}
|
|
36
36
|
// Retry re-collects the WHOLE report, not just the tiles that failed. Every
|
|
37
37
|
// number in one file has to have been true at one moment: refetching four
|
|
38
38
|
// tiles and keeping nine from three minutes ago produces a deck whose pages
|
|
39
39
|
// disagree with each other, and nothing on it would say so.
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
//
|
|
41
|
+
// listRows is the format's own list cap, carried into the retry so a second
|
|
42
|
+
// attempt fetches what the first did.
|
|
43
|
+
_run(report, listRows, render) {
|
|
44
|
+
return this._collector.collect(report, listRows)
|
|
42
45
|
.pipe(switchMap((collected) => this._gate(collected)
|
|
43
46
|
.pipe(switchMap((choice) => choice === RETRY
|
|
44
|
-
? this._run(report, render)
|
|
47
|
+
? this._run(report, listRows, render)
|
|
45
48
|
: from(render(collected))))));
|
|
46
49
|
}
|
|
47
50
|
// Resolves to DOWNLOAD when the export is whole (or the user accepted an
|
|
@@ -74,4 +77,4 @@ export class ReportExportService {
|
|
|
74
77
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportService, decorators: [{
|
|
75
78
|
type: Injectable
|
|
76
79
|
}] });
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtZXhwb3J0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxLQUFLLEVBQWMsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3ZELE9BQU8sRUFBbUIsNEJBQTRCLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkgsT0FBTyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7QUFHMUUsNEVBQTRFO0FBQzVFLDRFQUE0RTtBQUM1RSx5RUFBeUU7QUFDekUsNEJBQTRCO0FBQzVCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUN0QixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUM7QUFFNUIsOEVBQThFO0FBQzlFLDhEQUE4RDtBQUM5RCxFQUFFO0FBQ0YsMkVBQTJFO0FBQzNFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLCtFQUErRTtBQUMvRSxnRkFBZ0Y7QUFDaEYsdUNBQXVDO0FBRXZDLE1BQU0sT0FBTyxtQkFBbUI7SUFFdEIsVUFBVSxHQUFHLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ2xELFdBQVcsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN2QyxZQUFZLEdB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cm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuXG5pbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSwgZnJvbSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVwb3J0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbGxlY3RlZFJlcG9ydCwgUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSwgZmFpbGVkUGFnZU5hbWVzIH0gZnJvbSAnLi9yZXBvcnQtZXhwb3J0LWNvbGxlY3Rvci5zZXJ2aWNlJztcbmltcG9ydCB7IFBERl9MSVNUX1JPV1MsIFJlcG9ydFBkZlNlcnZpY2UgfSBmcm9tICcuL3JlcG9ydC1wZGYuc2VydmljZSc7XG5pbXBvcnQgeyBQUFRYX0xJU1RfUk9XUywgUmVwb3J0UHB0eFNlcnZpY2UgfSBmcm9tICcuL3JlcG9ydC1wcHR4LnNlcnZpY2UnO1xuXG5cbi8vIFdoYXQgdGhlIHVzZXIgY2hvc2Ugd2hlbiB0b2xkIHRoZSBleHBvcnQgaXMgaW5jb21wbGV0ZS4gUmV0cnkgcmUtcnVucyB0aGVcbi8vIHdob2xlIGNvbGxlY3Rpb24g4oCUIHRoZSBxdWVyaWVzIHRoYXQgZmFpbGVkIHdlcmUga2lsbGVkIG9uIGEgY2xvY2ssIG5vdCBvblxuLy8gYW55dGhpbmcgYWJvdXQgdGhlIGRhdGEsIHNvIGEgc2Vjb25kIGF0dGVtcHQgYWdhaW5zdCBhIHdhcm1lZCBkYXRhYmFzZVxuLy8gZ2VudWluZWx5IG9mdGVuIHN1Y2NlZWRzLlxuY29uc3QgUkVUUlkgPSAncmV0cnknO1xuY29uc3QgRE9XTkxPQUQgPSAnZG93bmxvYWQnO1xuXG4vLyBSdW5zIGEgcmVwb3J0IGV4cG9ydCBlbmQgdG8gZW5kOiBjb2xsZWN0IGV2ZXJ5IHRpbGUsIHJlZnVzZSB0byB3cml0ZSBhIGZpbGVcbi8vIHRoYXQgaXMgbWlzc2luZyBhbnkgb2YgdGhlbSB3aXRob3V0IHNheWluZyBzbywgdGhlbiByZW5kZXIuXG4vL1xuLy8gVGhlIGdhdGUgaXMgdGhlIHJlYXNvbiB0aGlzIHNpdHMgYmV0d2VlbiB0aGUgY29sbGVjdG9yIGFuZCB0aGUgcmVuZGVyZXJzXG4vLyByYXRoZXIgdGhhbiBpbiBlaXRoZXIgb2YgdGhlbS4gQSBkZWNrIHdpdGggZml2ZSBibGFuayBwYWdlcyBpcyB3b3JzZSB0aGFuIG5vXG4vLyBkZWNrOiBpdCBsb29rcyBmaW5pc2hlZCwgc28gaXQgZ2V0cyBlbWFpbGVkIHRvIGEgY2xpZW50LCBhbmQgdGhlIHBhZ2VzIHRoYXRcbi8vIGFyZSBtaXNzaW5nIGFyZSBleGFjdGx5IHRoZSBvbmVzIG5vYm9keSB0aGlua3MgdG8gY2hlY2suIFRoZSByZW5kZXJlcnMgY2FuXG4vLyBvbmx5IGRlc2NyaWJlIGEgaG9sZSB0aGV5IGFyZSBoYW5kZWQ7IHRoZSBjb2xsZWN0b3Igb25seSBrbm93cyBvbmUgdGlsZSBhdCBhXG4vLyB0aW1lLiBXaGV0aGVyIHRoZSBGSUxFIHNob3VsZCBleGlzdCBpcyBhIGRlY2lzaW9uIGFib3V0IHRoZSB3aG9sZSByZXBvcnQsIGFuZFxuLy8gdGhpcyBpcyB0aGUgb25seSBwbGFjZSB0aGF0IHNlZXMgaXQuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0RXhwb3J0U2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfY29sbGVjdG9yID0gaW5qZWN0KFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2UpO1xuICBwcml2YXRlIF9wZGZTZXJ2aWNlID0gaW5qZWN0KFJlcG9ydFBkZlNlcnZpY2UpO1xuICBwcml2YXRlIF9wcHR4U2VydmljZSA9IGluamVjdChSZXBvcnRQcHR4U2VydmljZSk7XG4gIHByaXZhdGUgX3Byb21wdCA9IGluamVjdChGc1Byb21wdCk7XG5cbiAgcHVibGljIHBkZihyZXBvcnQ6IFJlcG9ydCk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLl9ydW4ocmVwb3J0LCBQREZfTElTVF9ST1dTLCAoY29sbGVjdGVkKSA9PiB0aGlzLl9wZGZTZXJ2aWNlLmV4cG9ydChjb2xsZWN0ZWQpKTtcbiAgfVxuXG4gIHB1YmxpYyBwb3dlcnBvaW50KHJlcG9ydDogUmVwb3J0KTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuX3J1bihyZXBvcnQsIFBQVFhfTElTVF9ST1dTLCAoY29sbGVjdGVkKSA9PiB0aGlzLl9wcHR4U2VydmljZS5leHBvcnQoY29sbGVjdGVkKSk7XG4gIH1cblxuICAvLyBSZXRyeSByZS1jb2xsZWN0cyB0aGUgV0hPTEUgcmVwb3J0LCBub3QganVzdCB0aGUgdGlsZXMgdGhhdCBmYWlsZWQuIEV2ZXJ5XG4gIC8vIG51bWJlciBpbiBvbmUgZmlsZSBoYXMgdG8gaGF2ZSBiZWVuIHRydWUgYXQgb25lIG1vbWVudDogcmVmZXRjaGluZyBmb3VyXG4gIC8vIHRpbGVzIGFuZCBrZWVwaW5nIG5pbmUgZnJvbSB0aHJlZSBtaW51dGVzIGFnbyBwcm9kdWNlcyBhIGRlY2sgd2hvc2UgcGFnZXNcbiAgLy8gZGlzYWdyZWUgd2l0aCBlYWNoIG90aGVyLCBhbmQgbm90aGluZyBvbiBpdCB3b3VsZCBzYXkgc28uXG4gIC8vXG4gIC8vIGxpc3RSb3dzIGlzIHRoZSBmb3JtYXQncyBvd24gbGlzdCBjYXAsIGNhcnJpZWQgaW50byB0aGUgcmV0cnkgc28gYSBzZWNvbmRcbiAgLy8gYXR0ZW1wdCBmZXRjaGVzIHdoYXQgdGhlIGZpcnN0IGRpZC5cbiAgcHJpdmF0ZSBfcnVuKFxuICAgIHJlcG9ydDogUmVwb3J0LFxuICAgIGxpc3RSb3dzOiBudW1iZXIsXG4gICAgcmVuZGVyOiAoY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQpID0+IFByb21pc2U8dm9pZD4sXG4gICk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLl9jb2xsZWN0b3IuY29sbGVjdChyZXBvcnQsIGxpc3RSb3dzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoY29sbGVjdGVkKSA9PiB0aGlzLl9nYXRlKGNvbGxlY3RlZClcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoY2hvaWNlKSA9PiBjaG9pY2UgPT09IFJFVFJZXG4gICAgICAgICAgICAgID8gdGhpcy5fcnVuKHJlcG9ydCwgbGlzdFJvd3MsIHJlbmRlcilcbiAgICAgICAgICAgICAgOiBmcm9tKHJlbmRlcihjb2xsZWN0ZWQpKSksXG4gICAgICAgICAgKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gUmVzb2x2ZXMgdG8gRE9XTkxPQUQgd2hlbiB0aGUgZXhwb3J0IGlzIHdob2xlIChvciB0aGUgdXNlciBhY2NlcHRlZCBhblxuICAvLyBpbmNvbXBsZXRlIG9uZSkgYW5kIHRvIFJFVFJZIHdoZW4gdGhleSB3YW50IGFub3RoZXIgYXR0ZW1wdC4gQ2FuY2VsbGluZ1xuICAvLyBlbmRzIHRoZSBleHBvcnQgcXVpZXRseTogRU1QVFkgY29tcGxldGVzIHdpdGhvdXQgZW1pdHRpbmcsIHNvIG5vdGhpbmdcbiAgLy8gcmVuZGVycyBhbmQgbm8gZXJyb3Igc3VyZmFjZXMg4oCUIHRoZXkga25vdyB3aGF0IHRoZXkganVzdCBkZWNsaW5lZC5cbiAgcHJpdmF0ZSBfZ2F0ZShjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgY29uc3QgZmFpbGVkID0gZmFpbGVkUGFnZU5hbWVzKGNvbGxlY3RlZCk7XG4gICAgaWYgKCFmYWlsZWQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gb2YoRE9XTkxPQUQpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VzID0gZmFpbGVkLmxlbmd0aCA9PT0gMVxuICAgICAgPyBgPHN0cm9uZz4ke2ZhaWxlZFswXX08L3N0cm9uZz4gY291bGQgbm90IGJlIGdlbmVyYXRlZGBcbiAgICAgIDogYCR7ZmFpbGVkLmxlbmd0aH0gcGFnZXMgY291bGQgbm90IGJlIGdlbmVyYXRlZDogPHN0cm9uZz4ke2ZhaWxlZC5qb2luKCc8L3N0cm9uZz4sIDxzdHJvbmc+Jyl9PC9zdHJvbmc+YDtcblxuICAgIHJldHVybiB0aGlzLl9wcm9tcHQuY29uZmlybSh7XG4gICAgICB0aXRsZTogJ0V4cG9ydCBpcyBpbmNvbXBsZXRlJyxcbiAgICAgIHRlbXBsYXRlOiBgJHtwYWdlc30uIFRoaXMgdXN1YWxseSBtZWFucyB0aG9zZSB0aWxlcyB0b29rIHRvbyBsb25nIHRvIGxvYWQuIGBcbiAgICAgICAgKyAnUmV0cnksIG9yIGRvd25sb2FkIHRoZSBmaWxlIHdpdGggdGhvc2UgcGFnZXMgbWFya2VkIGFzIG1pc3NpbmcuJyxcbiAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ1JldHJ5JywgdmFsdWU6IFJFVFJZLCBjb2xvcjogJ3ByaW1hcnknIH0sXG4gICAgICAgIHsgbGFiZWw6ICdEb3dubG9hZCBBbnl3YXknLCB2YWx1ZTogRE9XTkxPQUQsIGNvbG9yOiAnJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQ2FuY2VsJywgY2FuY2VsOiB0cnVlLCBjb2xvcjogJycgfSxcbiAgICAgIF0sXG4gICAgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gRU1QVFkpKTtcbiAgfVxufVxuIl19
|