@firestitch/report 18.0.27 → 18.0.29
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/report-canvas/report-canvas.component.d.ts +3 -1
- package/app/reports/components/report-component/report-component.component.d.ts +2 -1
- package/app/reports/data/report.data.d.ts +1 -1
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +6 -4
- package/app/reports/export/report-export-collector.service.d.ts +2 -0
- package/app/reports/export/report-export.service.d.ts +15 -0
- package/app/reports/interfaces/report.interface.d.ts +4 -0
- package/app/reports/report-filter-items.d.ts +1 -0
- package/app/reports/views/report/fs-ai-report.component.d.ts +1 -3
- package/app/reports/views/report/report.component.d.ts +1 -3
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +17 -3
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +23 -7
- package/esm2022/app/reports/data/report.data.mjs +8 -3
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +10 -11
- package/esm2022/app/reports/export/report-export-collector.service.mjs +63 -18
- package/esm2022/app/reports/export/report-export.service.mjs +77 -0
- package/esm2022/app/reports/export/report-pdf.service.mjs +3 -2
- package/esm2022/app/reports/export/report-pptx.service.mjs +3 -2
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/report-filter-items.mjs +18 -2
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +32 -20
- package/esm2022/app/reports/views/report/report.component.mjs +33 -21
- package/fesm2022/{firestitch-report-echarts-6sMh877A.mjs → firestitch-report-echarts-DeE74U3a.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-6sMh877A.mjs.map → firestitch-report-echarts-DeE74U3a.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-B8LjVTvx.mjs → firestitch-report-firestitch-report-Nxl-C1w0.mjs} +267 -78
- package/fesm2022/firestitch-report-firestitch-report-Nxl-C1w0.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/fesm2022/firestitch-report-firestitch-report-B8LjVTvx.mjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject } from '@angular/core';
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, inject } from '@angular/core';
|
|
2
2
|
import { FormsModule } from '@angular/forms';
|
|
3
3
|
import { MAT_DIALOG_DATA, MatDialogActions, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';
|
|
4
4
|
import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field';
|
|
@@ -30,6 +30,11 @@ import * as i5 from "@angular/material/tabs";
|
|
|
30
30
|
// immediately and refreshes the in-dialog list.
|
|
31
31
|
// SQL / Config — read-only diagnostics.
|
|
32
32
|
export class ComponentSettingsComponent {
|
|
33
|
+
// A filter was added, removed or re-levelled, so the report's filter groups
|
|
34
|
+
// changed. Those mutations persist the moment they are clicked and the dialog
|
|
35
|
+
// can then be dismissed by a route that carries no result (Escape, backdrop),
|
|
36
|
+
// so the page is told here rather than through the close result.
|
|
37
|
+
filtersChanged = new EventEmitter();
|
|
33
38
|
component;
|
|
34
39
|
report;
|
|
35
40
|
selectedTab = 'settings';
|
|
@@ -54,9 +59,6 @@ export class ComponentSettingsComponent {
|
|
|
54
59
|
dateRange: 'Date range',
|
|
55
60
|
keyword: 'Search text',
|
|
56
61
|
};
|
|
57
|
-
// True once any filter mutation happened — the parent reloads the report so
|
|
58
|
-
// the canvas + report bar reflect the change.
|
|
59
|
-
_changed = false;
|
|
60
62
|
_data = inject(MAT_DIALOG_DATA);
|
|
61
63
|
_dialogRef = inject(MatDialogRef);
|
|
62
64
|
_reportData = inject(ReportData);
|
|
@@ -75,9 +77,6 @@ export class ComponentSettingsComponent {
|
|
|
75
77
|
this._seedFilters(this.report, this.component.id);
|
|
76
78
|
this._loadColumns();
|
|
77
79
|
}
|
|
78
|
-
get hasChanges() {
|
|
79
|
-
return this._changed;
|
|
80
|
-
}
|
|
81
80
|
// Human-friendly name for the inferred interface shown beside each column.
|
|
82
81
|
typeLabel(type) {
|
|
83
82
|
return this._typeLabels[type] ?? type;
|
|
@@ -92,10 +91,10 @@ export class ComponentSettingsComponent {
|
|
|
92
91
|
left: this.paddingLeft,
|
|
93
92
|
},
|
|
94
93
|
};
|
|
95
|
-
return this._reportData.updateComponent(this.report.id, this.component.id, settings)
|
|
94
|
+
return this._reportData.updateComponent(this.report.id, this.component.id, { ...settings })
|
|
96
95
|
.pipe(tap(() => {
|
|
97
96
|
this._message.success('Component saved');
|
|
98
|
-
this._dialogRef.close(
|
|
97
|
+
this._dialogRef.close({ settings });
|
|
99
98
|
}));
|
|
100
99
|
};
|
|
101
100
|
// Flip one exposure (report bar or this component) for a row. We update the
|
|
@@ -153,7 +152,7 @@ export class ComponentSettingsComponent {
|
|
|
153
152
|
// After any filter mutation: re-fetch the report so the dialog's filter list
|
|
154
153
|
// (and the parent canvas, on close) reflect the new groups/levels.
|
|
155
154
|
_afterMutation() {
|
|
156
|
-
this.
|
|
155
|
+
this.filtersChanged.emit();
|
|
157
156
|
this._reportData.get(this.report.id)
|
|
158
157
|
.subscribe((report) => {
|
|
159
158
|
this.report = report;
|
|
@@ -218,4 +217,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
218
217
|
MatTooltip,
|
|
219
218
|
], template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <h1 mat-dialog-title>\n {{ component.title || 'Component' }}\n </h1>\n <mat-dialog-content>\n <mat-tab-group [(selected)]=\"selectedTab\">\n <mat-tab\n label=\"Settings\"\n name=\"settings\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Title\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"title\"\n name=\"title\">\n </mat-form-field>\n <div class=\"subheading-2\">\n Padding\n </div>\n <div class=\"geometry-row\">\n <mat-form-field>\n <mat-label>\n Top\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"0.05\"\n min=\"0\"\n [(ngModel)]=\"paddingTop\"\n name=\"paddingTop\">\n <span matTextSuffix>\n in\n </span>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Right\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"0.05\"\n min=\"0\"\n [(ngModel)]=\"paddingRight\"\n name=\"paddingRight\">\n <span matTextSuffix>\n in\n </span>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Bottom\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"0.05\"\n min=\"0\"\n [(ngModel)]=\"paddingBottom\"\n name=\"paddingBottom\">\n <span matTextSuffix>\n in\n </span>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Left\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"0.05\"\n min=\"0\"\n [(ngModel)]=\"paddingLeft\"\n name=\"paddingLeft\">\n <span matTextSuffix>\n in\n </span>\n </mat-form-field>\n </div>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Filters\"\n name=\"filters\">\n <div class=\"tab-body\">\n @if (columnsError) {\n <div class=\"filters-empty error\">\n {{ columnsError }}\n </div>\n } @else if (rows.length) {\n <!-- Every filterable column. Toggle where its control shows: in\n the report bar, on this component, both, or neither. The\n interface (date range vs value picker) follows the data. -->\n <table class=\"filter-table\">\n <thead>\n <tr>\n <th class=\"filter-col-name\">\n Filter\n </th>\n <th class=\"filter-col-type\">\n Type\n </th>\n <th class=\"filter-col-toggle\">\n Report bar\n </th>\n <th class=\"filter-col-toggle\">\n This component\n </th>\n </tr>\n </thead>\n <tbody>\n @for (row of rows; track row.column) {\n <tr>\n <td class=\"filter-col-name\">\n {{ row.label }}\n </td>\n <td class=\"filter-col-type\">\n {{ typeLabel(row.type) }}\n </td>\n <td class=\"filter-col-toggle\">\n <mat-slide-toggle\n [ngModel]=\"row.report\"\n (ngModelChange)=\"setExposure(row, 'report', $event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n matTooltip=\"Show in the report bar\">\n </mat-slide-toggle>\n </td>\n <td class=\"filter-col-toggle\">\n <mat-slide-toggle\n [ngModel]=\"row.component\"\n (ngModelChange)=\"setExposure(row, 'component', $event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n matTooltip=\"Show on this component\">\n </mat-slide-toggle>\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <div class=\"filters-empty\">\n This component has no filterable columns yet \u2014 give it some SQL first.\n </div>\n }\n </div>\n </mat-tab>\n <mat-tab\n label=\"SQL\"\n name=\"sql\">\n <div class=\"tab-body\">\n <pre class=\"code-block\">\n {{ component.sql }}\n </pre>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Config\"\n name=\"config\">\n <div class=\"tab-body\">\n <pre class=\"code-block\">\n {{ configJson }}\n </pre>\n </div>\n </mat-tab>\n </mat-tab-group>\n </mat-dialog-content>\n <mat-dialog-actions>\n <fs-form-dialog-actions\n [save]=\"selectedTab === 'settings'\"\n [done]=\"selectedTab !== 'settings'\">\n </fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>", styles: ["mat-form-field{width:100%}.tab-body{padding-top:16px}.geometry-row{display:flex;gap:8px}.geometry-row mat-form-field{flex:1}.filter-table{border-spacing:0;width:100%;border-collapse:collapse}.filter-table thead th{color:#8f8f8f;font-weight:400;font-size:85%;text-align:left;padding:8px 16px}.filter-table tbody tr{clip-path:xywh(0 3px 100% calc(100% - 6px) round 10px)}.filter-table tbody td{border:none;background-color:#fafafa;padding:8px 16px;vertical-align:middle;text-align:left}.filter-table .filter-col-name{font-weight:600;color:#1f2933}.filter-table .filter-col-type{color:#7b8794;width:120px}.filter-table .filter-col-toggle,.filter-table th.filter-col-toggle{width:130px;text-align:center}.filters-empty{font-size:13px;color:#7b8794;padding:8px 0 4px}.filters-empty.error{color:#e15759}.code-block{margin:0;padding:10px 12px;background:#1f2933;color:#e4e7eb;border-radius:6px;font-family:JetBrains Mono,Consolas,monospace;font-size:12px;line-height:1.5;white-space:pre-wrap;word-break:break-word;max-height:240px;overflow:auto}\n"] }]
|
|
220
219
|
}] });
|
|
221
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9kaWFsb2dzL2NvbXBvbmVudC1zZXR0aW5ncy9jb21wb25lbnQtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvY29tcG9uZW50LXNldHRpbmdzL2NvbXBvbmVudC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0gsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHaEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVVwRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7QUFjekQsK0JBQStCO0FBQy9CLDhFQUE4RTtBQUM5RSxxRUFBcUU7QUFDckUsOEVBQThFO0FBQzlFLHdFQUF3RTtBQUN4RSw2RUFBNkU7QUFDN0UsMEVBQTBFO0FBQzFFLGtEQUFrRDtBQUNsRCwwQ0FBMEM7QUF3QjFDLE1BQU0sT0FBTywwQkFBMEI7SUFFOUIsU0FBUyxDQUFrQjtJQUMzQixNQUFNLENBQVM7SUFFZixXQUFXLEdBQUcsVUFBVSxDQUFDO0lBRXpCLEtBQUssR0FBRyxFQUFFLENBQUM7SUFFWCxVQUFVLEdBQUcseUJBQXlCLENBQUM7SUFDdkMsWUFBWSxHQUFHLHlCQUF5QixDQUFDO0lBQ3pDLGFBQWEsR0FBRyx5QkFBeUIsQ0FBQztJQUMxQyxXQUFXLEdBQUcseUJBQXlCLENBQUM7SUFFeEMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUV2QixvQ0FBb0M7SUFDcEMsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSxzREFBc0Q7SUFDL0MsSUFBSSxHQUFnQixFQUFFLENBQUM7SUFDdkIsWUFBWSxHQUFrQixJQUFJLENBQUM7SUFFMUMsMENBQTBDO0lBQ2xDLGtCQUFrQixHQUE2QixFQUFFLENBQUM7SUFDbEQsUUFBUSxHQUFtQixFQUFFLENBQUM7SUFDOUIsV0FBVyxHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO0lBRTFDLFdBQVcsR0FBcUM7UUFDL0QsTUFBTSxFQUFFLGFBQWE7UUFDckIsU0FBUyxFQUFFLFlBQVk7UUFDdkIsT0FBTyxFQUFFLGFBQWE7S0FDdkIsQ0FBQztJQUVGLDRFQUE0RTtJQUM1RSw4Q0FBOEM7SUFDdEMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUVSLEtBQUssR0FBbUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2hGLFVBQVUsR0FBRyxNQUFNLENBQTJDLFlBQVksQ0FBQyxDQUFDO0lBQzVFLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QixNQUFNLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFN0MsUUFBUTtRQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUV0QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUV4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7UUFDL0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLEVBQUUsR0FBRyxJQUFJLHlCQUF5QixDQUFDO1FBQzVELElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxFQUFFLEtBQUssSUFBSSx5QkFBeUIsQ0FBQztRQUNoRSxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sRUFBRSxNQUFNLElBQUkseUJBQXlCLENBQUM7UUFDbEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLEVBQUUsSUFBSSxJQUFJLHlCQUF5QixDQUFDO1FBRTlELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXZFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsMkVBQTJFO0lBQ3BFLFNBQVMsQ0FBQyxJQUFzQjtRQUNyQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3hDLENBQUM7SUFFTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1FBQ2pCLE1BQU0sUUFBUSxHQUE0QjtZQUN4QyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsT0FBTyxFQUFFO2dCQUNQLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDcEIsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUN4QixNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWE7Z0JBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVzthQUN2QjtTQUNGLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQzthQUNqRixJQUFJLENBQ0gsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNQLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUMsQ0FBQztJQUVGLDRFQUE0RTtJQUM1RSw2RUFBNkU7SUFDN0UsNkVBQTZFO0lBQzdFLHNFQUFzRTtJQUN0RSxlQUFlO0lBQ1IsV0FBVyxDQUFDLEdBQWMsRUFBRSxNQUE4QixFQUFFLEVBQVc7UUFDNUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVqQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFcEYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbEMsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7WUFFRCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFzQixHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxTQUFTO1lBQzFELENBQUMsQ0FBQyxNQUFNO1lBQ1IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUxQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkcsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFO2dCQUN0RSxZQUFZLEVBQUUsR0FBRyxDQUFDLE1BQU07Z0JBQ3hCLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztnQkFDaEIsS0FBSzthQUNOLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQztJQUNILENBQUM7SUFFRCx3RUFBd0U7SUFDaEUsSUFBSSxDQUFDLE9BQTRCO1FBQ3ZDLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDaEIsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDakMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztTQUM3QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLHFFQUFxRTtJQUM3RCxZQUFZO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2pELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsWUFBWSxLQUFLLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzRixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUVyRixPQUFPO2dCQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtnQkFDckIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2dCQUNqQixLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUs7dUJBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLGFBQWEsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUs7dUJBQ3hELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDbEMsTUFBTSxFQUFFLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLE1BQU07Z0JBQzlDLFNBQVMsRUFBRSxLQUFLLEtBQUssV0FBVyxJQUFJLEtBQUssS0FBSyxNQUFNO2FBQ3JELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsbUVBQW1FO0lBQzNELGNBQWM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFFckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7YUFDakMsU0FBUyxDQUFDLENBQUMsTUFBYyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFVO1FBQy9CLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLEtBQUssRUFBRSxPQUFPLElBQUkseUJBQXlCLENBQUMsQ0FBQztRQUMxRix3RUFBd0U7UUFDeEUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFTyxZQUFZLENBQUMsTUFBYyxFQUFFLFdBQW1CO1FBQ3RELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUxRixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSzthQUMzQixPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7YUFDbEMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLFdBQVcsQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7YUFDakUsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsT0FBaUMsRUFBRSxFQUFFO2dCQUMxQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzdCLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLHNDQUFzQyxDQUFDO2dCQUNwRixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzdCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sU0FBUyxDQUFDLE1BQWM7UUFDOUIsT0FBTyxNQUFNO2FBQ1YsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUM7YUFDdkIsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7YUFDcEIsSUFBSSxFQUFFO2FBQ04sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQzt3R0ExTVUsMEJBQTBCOzRGQUExQiwwQkFBMEIsd0VDM0V2Qyw2aE1BcUxPLHlrQ0QzSEgsV0FBVyxvNENBQ1gsWUFBWSxxbENBQ1osY0FBYyxnTUFDZCxhQUFhLDhCQUNiLFlBQVksbWFBQ1osYUFBYSw2b0JBQ2IsY0FBYywrSEFDZCxnQkFBZ0IseUdBQ2hCLGdCQUFnQiw0SEFDaEIsWUFBWSw0TEFDWixRQUFRLHNEQUNSLFNBQVMscUhBQ1QsUUFBUSxpVUFDUixjQUFjLDBVQUNkLFVBQVU7OzRGQUdELDBCQUEwQjtrQkF2QnRDLFNBQVM7c0NBR1MsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxZQUFZO3dCQUNaLGNBQWM7d0JBQ2QsYUFBYTt3QkFDYixZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxnQkFBZ0I7d0JBQ2hCLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixRQUFRO3dCQUNSLFNBQVM7d0JBQ1QsUUFBUTt3QkFDUixjQUFjO3dCQUNkLFVBQVU7cUJBQ1giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25Jbml0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ0FjdGlvbnMsIE1hdERpYWxvZ0NvbnRlbnQsIE1hdERpYWxvZ1JlZiwgTWF0RGlhbG9nVGl0bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkLCBNYXRMYWJlbCwgTWF0U3VmZml4IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdFNsaWRlVG9nZ2xlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcbmltcG9ydCB7IE1hdFRhYnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgRnNEaWFsb2dNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kaWFsb2cnO1xuaW1wb3J0IHsgRnNGb3JtTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZm9ybSc7XG5pbXBvcnQgeyBGc0xhYmVsTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGFiZWwnO1xuaW1wb3J0IHsgRnNNZXNzYWdlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVzc2FnZSc7XG5pbXBvcnQgeyBGc1RhYnNNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC90YWJzJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQge1xuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0RmlsdGVyLFxuICBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgUmVwb3J0RmlsdGVyTGV2ZWwsXG4gIFJlcG9ydEZpbHRlclR5cGUsXG4gIFJlcG9ydEZpbHRlcmFibGVDb2x1bW4sXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HIH0gZnJvbSAnLi4vLi4vbGF5b3V0JztcblxuXG4vLyBPbmUgcm93IG9mIHRoZSBGaWx0ZXJzIHRhYiBsaXN0aW5nOiBhIGZpbHRlcmFibGUgY29sdW1uLCB0aGUgaW50ZXJmYWNlXG4vLyBpbmZlcnJlZCBmcm9tIGl0cyBkYXRhLCBhbmQgd2hlcmUgaXRzIGZpbHRlciBpcyBleHBvc2VkICh0aGUgdHdvIHRvZ2dsZXMpLlxuaW50ZXJmYWNlIEZpbHRlclJvdyB7XG4gIGNvbHVtbjogc3RyaW5nO1xuICB0eXBlOiBSZXBvcnRGaWx0ZXJUeXBlO1xuICBsYWJlbDogc3RyaW5nO1xuICByZXBvcnQ6IGJvb2xlYW47XG4gIGNvbXBvbmVudDogYm9vbGVhbjtcbn1cblxuXG4vLyBDb21wb25lbnQgc2V0dGluZ3MsIGluIHRhYnM6XG4vLyAgIFNldHRpbmdzIOKAlCB0aXRsZSBhbmQgY29udGVudCBwYWRkaW5nLiBQb3NpdGlvbi9zaXplIGFyZSB0dW5lZCBieSBkcmFnZ2luZ1xuLy8gICBvbiB0aGUgY2FudmFzOyBoZWlnaHQgYmVoYXZpb3VyIGZvbGxvd3MgZnJvbSB0aGUgY29tcG9uZW50IHR5cGUuXG4vLyAgIEZpbHRlcnMgIOKAlCBPTkUgbGlzdGluZyBvZiBldmVyeSBmaWx0ZXJhYmxlIGNvbHVtbiBvbiB0aGlzIGNvbXBvbmVudC4gRWFjaFxuLy8gICByb3cgY2FycmllcyB0d28gdG9nZ2xlczogc2hvdyBpbiB0aGUgcmVwb3J0IGJhciBhbmQvb3Igc2hvdyBvbiB0aGlzXG4vLyAgIGNvbXBvbmVudCAoYm90aCwgZWl0aGVyLCBvciBuZWl0aGVyKS4gVGhlIGludGVyZmFjZSAoZGF0ZSByYW5nZSB2cyB2YWx1ZVxuLy8gICBwaWNrZXIpIGlzIGluZmVycmVkIGZyb20gdGhlIGRhdGEsIG5ldmVyIGNob3Nlbi4gRWFjaCB0b2dnbGUgcGVyc2lzdHNcbi8vICAgaW1tZWRpYXRlbHkgYW5kIHJlZnJlc2hlcyB0aGUgaW4tZGlhbG9nIGxpc3QuXG4vLyAgIFNRTCAvIENvbmZpZyDigJQgcmVhZC1vbmx5IGRpYWdub3N0aWNzLlxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQtc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wb25lbnQtc2V0dGluZ3MuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBGc0Zvcm1Nb2R1bGUsXG4gICAgRnNEaWFsb2dNb2R1bGUsXG4gICAgRnNMYWJlbE1vZHVsZSxcbiAgICBGc1RhYnNNb2R1bGUsXG4gICAgTWF0VGFic01vZHVsZSxcbiAgICBNYXREaWFsb2dUaXRsZSxcbiAgICBNYXREaWFsb2dDb250ZW50LFxuICAgIE1hdERpYWxvZ0FjdGlvbnMsXG4gICAgTWF0Rm9ybUZpZWxkLFxuICAgIE1hdExhYmVsLFxuICAgIE1hdFN1ZmZpeCxcbiAgICBNYXRJbnB1dCxcbiAgICBNYXRTbGlkZVRvZ2dsZSxcbiAgICBNYXRUb29sdGlwLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRTZXR0aW5nc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHVibGljIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50O1xuICBwdWJsaWMgcmVwb3J0OiBSZXBvcnQ7XG5cbiAgcHVibGljIHNlbGVjdGVkVGFiID0gJ3NldHRpbmdzJztcblxuICBwdWJsaWMgdGl0bGUgPSAnJztcblxuICBwdWJsaWMgcGFkZGluZ1RvcCA9IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkc7XG4gIHB1YmxpYyBwYWRkaW5nUmlnaHQgPSBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HO1xuICBwdWJsaWMgcGFkZGluZ0JvdHRvbSA9IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkc7XG4gIHB1YmxpYyBwYWRkaW5nTGVmdCA9IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkc7XG5cbiAgcHVibGljIGNvbmZpZ0pzb24gPSAnJztcblxuICAvLyAtLS0tIGZpbHRlciBtYW5hZ2VtZW50IHN0YXRlIC0tLS1cbiAgLy8gT25lIHJvdyBwZXIgZmlsdGVyYWJsZSBjb2x1bW4uIFRoZSB0d28gYm9vbGVhbnMgZHJpdmUgdGhlIHRvZ2dsZXM7IHdlIGZsaXBcbiAgLy8gdGhlbSBvcHRpbWlzdGljYWxseSBvbiBjbGljayAoc28gdGhlIFVJIG5ldmVyIGJsaW5rcyB3aGlsZSB0aGUgcmVxdWVzdCBpc1xuICAvLyBpbiBmbGlnaHQpIGFuZCByZWNvbmNpbGUgZnJvbSB0aGUgc2VydmVyIG9uIHJlbG9hZC5cbiAgcHVibGljIHJvd3M6IEZpbHRlclJvd1tdID0gW107XG4gIHB1YmxpYyBjb2x1bW5zRXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFRoZSByYXcgaW5wdXRzIHRoZSByb3dzIGFyZSBidWlsdCBmcm9tLlxuICBwcml2YXRlIF9maWx0ZXJhYmxlQ29sdW1uczogUmVwb3J0RmlsdGVyYWJsZUNvbHVtbltdID0gW107XG4gIHByaXZhdGUgX2ZpbHRlcnM6IFJlcG9ydEZpbHRlcltdID0gW107XG4gIHByaXZhdGUgX2dyb3Vwc0J5SWQgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdHlwZUxhYmVsczogUmVjb3JkPFJlcG9ydEZpbHRlclR5cGUsIHN0cmluZz4gPSB7XG4gICAgc2VsZWN0OiAnUGljayB2YWx1ZXMnLFxuICAgIGRhdGVSYW5nZTogJ0RhdGUgcmFuZ2UnLFxuICAgIGtleXdvcmQ6ICdTZWFyY2ggdGV4dCcsXG4gIH07XG5cbiAgLy8gVHJ1ZSBvbmNlIGFueSBmaWx0ZXIgbXV0YXRpb24gaGFwcGVuZWQg4oCUIHRoZSBwYXJlbnQgcmVsb2FkcyB0aGUgcmVwb3J0IHNvXG4gIC8vIHRoZSBjYW52YXMgKyByZXBvcnQgYmFyIHJlZmxlY3QgdGhlIGNoYW5nZS5cbiAgcHJpdmF0ZSBfY2hhbmdlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RhdGE6IHsgcmVwb3J0OiBSZXBvcnQ7IGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50IH0gPSBpbmplY3QoTUFUX0RJQUxPR19EQVRBKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGlhbG9nUmVmID0gaW5qZWN0PE1hdERpYWxvZ1JlZjxDb21wb25lbnRTZXR0aW5nc0NvbXBvbmVudD4+KE1hdERpYWxvZ1JlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21lc3NhZ2UgPSBpbmplY3QoRnNNZXNzYWdlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2RSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlcG9ydCA9IHRoaXMuX2RhdGEucmVwb3J0O1xuICAgIHRoaXMuY29tcG9uZW50ID0gdGhpcy5fZGF0YS5jb21wb25lbnQ7XG5cbiAgICB0aGlzLnRpdGxlID0gdGhpcy5jb21wb25lbnQudGl0bGUgPz8gJyc7XG5cbiAgICBjb25zdCBwYWRkaW5nID0gdGhpcy5jb21wb25lbnQuY29uZmlnPy5wYWRkaW5nO1xuICAgIHRoaXMucGFkZGluZ1RvcCA9IHBhZGRpbmc/LnRvcCA/PyBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HO1xuICAgIHRoaXMucGFkZGluZ1JpZ2h0ID0gcGFkZGluZz8ucmlnaHQgPz8gREVGQVVMVF9DT01QT05FTlRfUEFERElORztcbiAgICB0aGlzLnBhZGRpbmdCb3R0b20gPSBwYWRkaW5nPy5ib3R0b20gPz8gREVGQVVMVF9DT01QT05FTlRfUEFERElORztcbiAgICB0aGlzLnBhZGRpbmdMZWZ0ID0gcGFkZGluZz8ubGVmdCA/PyBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HO1xuXG4gICAgdGhpcy5jb25maWdKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jb21wb25lbnQuY29uZmlnID8/IHt9LCBudWxsLCAyKTtcblxuICAgIHRoaXMuX3NlZWRGaWx0ZXJzKHRoaXMucmVwb3J0LCB0aGlzLmNvbXBvbmVudC5pZCk7XG4gICAgdGhpcy5fbG9hZENvbHVtbnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzQ2hhbmdlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlZDtcbiAgfVxuXG4gIC8vIEh1bWFuLWZyaWVuZGx5IG5hbWUgZm9yIHRoZSBpbmZlcnJlZCBpbnRlcmZhY2Ugc2hvd24gYmVzaWRlIGVhY2ggY29sdW1uLlxuICBwdWJsaWMgdHlwZUxhYmVsKHR5cGU6IFJlcG9ydEZpbHRlclR5cGUpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90eXBlTGFiZWxzW3R5cGVdID8/IHR5cGU7XG4gIH1cblxuICBwdWJsaWMgc2F2ZSA9ICgpID0+IHtcbiAgICBjb25zdCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIHBhZGRpbmc6IHtcbiAgICAgICAgdG9wOiB0aGlzLnBhZGRpbmdUb3AsXG4gICAgICAgIHJpZ2h0OiB0aGlzLnBhZGRpbmdSaWdodCxcbiAgICAgICAgYm90dG9tOiB0aGlzLnBhZGRpbmdCb3R0b20sXG4gICAgICAgIGxlZnQ6IHRoaXMucGFkZGluZ0xlZnQsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS51cGRhdGVDb21wb25lbnQodGhpcy5yZXBvcnQuaWQsIHRoaXMuY29tcG9uZW50LmlkLCBzZXR0aW5ncylcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnQ29tcG9uZW50IHNhdmVkJyk7XG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKHRydWUpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH07XG5cbiAgLy8gRmxpcCBvbmUgZXhwb3N1cmUgKHJlcG9ydCBiYXIgb3IgdGhpcyBjb21wb25lbnQpIGZvciBhIHJvdy4gV2UgdXBkYXRlIHRoZVxuICAvLyByb3cncyBib29sZWFuIGZpcnN0IOKAlCBzbyB0aGUgdG9nZ2xlIHN0YXlzIHB1dCB3aXRoIG5vIGJsaW5rIOKAlCB0aGVuIHBlcnNpc3RcbiAgLy8gYW5kIHJlY29uY2lsZSBvbiByZWxvYWQuIE5laXRoZXIgb24g4oaSIG5vIGZpbHRlciAocmVtb3ZlZCk7IGVpdGhlciBvbiDihpIgdGhlXG4gIC8vIGZpbHRlciBleGlzdHMgYXQgdGhlIGNvbWJpbmVkIGxldmVsLiBUaGUgaW50ZXJmYWNlIHR5cGUgaXMgaW5mZXJyZWRcbiAgLy8gc2VydmVyLXNpZGUuXG4gIHB1YmxpYyBzZXRFeHBvc3VyZShyb3c6IEZpbHRlclJvdywgdGFyZ2V0OiAncmVwb3J0JyB8ICdjb21wb25lbnQnLCBvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHJvd1t0YXJnZXRdID0gb247XG5cbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX2ZpbHRlcnMuZmluZCgoZmlsdGVyKSA9PiBmaWx0ZXIuZmlsdGVyQ29sdW1uID09PSByb3cuY29sdW1uKTtcblxuICAgIGlmICghcm93LnJlcG9ydCAmJiAhcm93LmNvbXBvbmVudCkge1xuICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgIHRoaXMuX3J1bih0aGlzLl9yZXBvcnREYXRhLmRlbGV0ZUZpbHRlcih0aGlzLnJlcG9ydC5pZCwgZXhpc3RpbmcuaWQpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxldmVsOiBSZXBvcnRGaWx0ZXJMZXZlbCA9IHJvdy5yZXBvcnQgJiYgcm93LmNvbXBvbmVudFxuICAgICAgPyAnYm90aCdcbiAgICAgIDogKHJvdy5yZXBvcnQgPyAncmVwb3J0JyA6ICdjb21wb25lbnQnKTtcblxuICAgIGlmIChleGlzdGluZykge1xuICAgICAgdGhpcy5fcnVuKHRoaXMuX3JlcG9ydERhdGEudXBkYXRlRmlsdGVyR3JvdXAodGhpcy5yZXBvcnQuaWQsIGV4aXN0aW5nLmZpbHRlckdyb3VwSWQsIHsgbGV2ZWwgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ydW4odGhpcy5fcmVwb3J0RGF0YS5hZGRGaWx0ZXIodGhpcy5yZXBvcnQuaWQsIHRoaXMuY29tcG9uZW50LmlkLCB7XG4gICAgICAgIGZpbHRlckNvbHVtbjogcm93LmNvbHVtbixcbiAgICAgICAgbGFiZWw6IHJvdy5sYWJlbCxcbiAgICAgICAgbGV2ZWwsXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUnVuIGEgZmlsdGVyIG11dGF0aW9uLCB0aGVuIHJlbG9hZCB0byByZWNvbmNpbGUgdGhlIG9wdGltaXN0aWMgc3RhdGUuXG4gIHByaXZhdGUgX3J1bihyZXF1ZXN0OiBPYnNlcnZhYmxlPHVua25vd24+KTogdm9pZCB7XG4gICAgcmVxdWVzdC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4gdGhpcy5fYWZ0ZXJNdXRhdGlvbigpLFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4gdGhpcy5fbXV0YXRpb25FcnJvcihlcnJvciksXG4gICAgfSk7XG4gIH1cblxuICAvLyBCdWlsZCB0aGUgcm93IHZpZXctbW9kZWwgZnJvbSB0aGUgbG9hZGVkIGNvbHVtbnMgKyBmaWx0ZXJzL2dyb3Vwcy4gRWFjaFxuICAvLyByb3cncyB0b2dnbGVzIHJlZmxlY3Qgd2hlcmUgaXRzIGZpbHRlciBncm91cCBpcyBjdXJyZW50bHkgZXhwb3NlZC5cbiAgcHJpdmF0ZSBfcmVidWlsZFJvd3MoKTogdm9pZCB7XG4gICAgdGhpcy5yb3dzID0gdGhpcy5fZmlsdGVyYWJsZUNvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuX2ZpbHRlcnMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuZmlsdGVyQ29sdW1uID09PSBjb2x1bW4uY29sdW1uKTtcbiAgICAgIGNvbnN0IGxldmVsID0gZmlsdGVyID8gdGhpcy5fZ3JvdXBzQnlJZC5nZXQoZmlsdGVyLmZpbHRlckdyb3VwSWQpPy5sZXZlbCA6IHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uOiBjb2x1bW4uY29sdW1uLFxuICAgICAgICB0eXBlOiBjb2x1bW4udHlwZSxcbiAgICAgICAgbGFiZWw6IGZpbHRlcj8ubGFiZWxcbiAgICAgICAgICB8fCB0aGlzLl9ncm91cHNCeUlkLmdldChmaWx0ZXI/LmZpbHRlckdyb3VwSWQgPz8gLTEpPy5sYWJlbFxuICAgICAgICAgIHx8IHRoaXMuX2h1bWFuaXplKGNvbHVtbi5jb2x1bW4pLFxuICAgICAgICByZXBvcnQ6IGxldmVsID09PSAncmVwb3J0JyB8fCBsZXZlbCA9PT0gJ2JvdGgnLFxuICAgICAgICBjb21wb25lbnQ6IGxldmVsID09PSAnY29tcG9uZW50JyB8fCBsZXZlbCA9PT0gJ2JvdGgnLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEFmdGVyIGFueSBmaWx0ZXIgbXV0YXRpb246IHJlLWZldGNoIHRoZSByZXBvcnQgc28gdGhlIGRpYWxvZydzIGZpbHRlciBsaXN0XG4gIC8vIChhbmQgdGhlIHBhcmVudCBjYW52YXMsIG9uIGNsb3NlKSByZWZsZWN0IHRoZSBuZXcgZ3JvdXBzL2xldmVscy5cbiAgcHJpdmF0ZSBfYWZ0ZXJNdXRhdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcblxuICAgIHRoaXMuX3JlcG9ydERhdGEuZ2V0KHRoaXMucmVwb3J0LmlkKVxuICAgICAgLnN1YnNjcmliZSgocmVwb3J0OiBSZXBvcnQpID0+IHtcbiAgICAgICAgdGhpcy5yZXBvcnQgPSByZXBvcnQ7XG4gICAgICAgIHRoaXMuX3NlZWRGaWx0ZXJzKHJlcG9ydCwgdGhpcy5jb21wb25lbnQuaWQpO1xuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbXV0YXRpb25FcnJvcihlcnJvcjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fbWVzc2FnZS5lcnJvcihlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgPz8gZXJyb3I/Lm1lc3NhZ2UgPz8gJ0ZpbHRlciBvcGVyYXRpb24gZmFpbGVkJyk7XG4gICAgLy8gUmUtc2VlZCBmcm9tIHRoZSBzZXJ2ZXIgc28gdGhlIG9wdGltaXN0aWMgdG9nZ2xlIHNuYXBzIGJhY2sgdG8gdHJ1dGguXG4gICAgdGhpcy5fYWZ0ZXJNdXRhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VlZEZpbHRlcnMocmVwb3J0OiBSZXBvcnQsIGNvbXBvbmVudElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ncm91cHNCeUlkID0gbmV3IE1hcCgocmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSkubWFwKChncm91cCkgPT4gW2dyb3VwLmlkLCBncm91cF0pKTtcblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHJlcG9ydC5wYWdlc1xuICAgICAgLmZsYXRNYXAoKHBhZ2UpID0+IHBhZ2UuY29tcG9uZW50cylcbiAgICAgIC5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gY29tcG9uZW50SWQpO1xuXG4gICAgdGhpcy5fZmlsdGVycyA9IGNvbXBvbmVudD8uZmlsdGVycyA/PyBbXTtcbiAgICB0aGlzLl9yZWJ1aWxkUm93cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9hZENvbHVtbnMoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5jb21wb25lbnRDb2x1bW5zKHRoaXMucmVwb3J0LmlkLCB0aGlzLmNvbXBvbmVudC5pZClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoY29sdW1uczogUmVwb3J0RmlsdGVyYWJsZUNvbHVtbltdKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZmlsdGVyYWJsZUNvbHVtbnMgPSBjb2x1bW5zID8/IFtdO1xuICAgICAgICAgIHRoaXMuX3JlYnVpbGRSb3dzKCk7XG4gICAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbHVtbnNFcnJvciA9IGVycm9yPy5lcnJvcj8ubWVzc2FnZSA/PyAnQ291bGQgbm90IHJlYWQgdGhlIGNvbXBvbmVudCBjb2x1bW5zJztcbiAgICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaHVtYW5pemUoY29sdW1uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb2x1bW5cbiAgICAgIC5yZXBsYWNlKC9bX1xcLV0rL2csICcgJylcbiAgICAgIC5yZXBsYWNlKC9cXHMrL2csICcgJylcbiAgICAgIC50cmltKClcbiAgICAgIC5yZXBsYWNlKC9cXGJcXHcvZywgKGNoYXJhY3RlcikgPT4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCkpO1xuICB9XG59XG4iLCI8Zm9ybVxuICAgIGZzRm9ybVxuICAgIFtzdWJtaXRdPVwic2F2ZVwiPlxuICA8ZnMtZGlhbG9nPlxuICAgIDxoMSBtYXQtZGlhbG9nLXRpdGxlPlxuICAgICAge3sgY29tcG9uZW50LnRpdGxlIHx8ICdDb21wb25lbnQnIH19XG4gICAgPC9oMT5cbiAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgPG1hdC10YWItZ3JvdXAgWyhzZWxlY3RlZCldPVwic2VsZWN0ZWRUYWJcIj5cbiAgICAgICAgPG1hdC10YWJcbiAgICAgICAgICAgIGxhYmVsPVwiU2V0dGluZ3NcIlxuICAgICAgICAgICAgbmFtZT1cInNldHRpbmdzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWNvbHVtbiB0YWItYm9keVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIFRpdGxlXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJoZWFkaW5nLTJcIj5cbiAgICAgICAgICAgICAgUGFkZGluZ1xuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2VvbWV0cnktcm93XCI+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgVG9wXG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICBzdGVwPVwiMC4wNVwiXG4gICAgICAgICAgICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicGFkZGluZ1RvcFwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwicGFkZGluZ1RvcFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIG1hdFRleHRTdWZmaXg+XG4gICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICBSaWdodFxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgc3RlcD1cIjAuMDVcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBhZGRpbmdSaWdodFwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwicGFkZGluZ1JpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gbWF0VGV4dFN1ZmZpeD5cbiAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIEJvdHRvbVxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgc3RlcD1cIjAuMDVcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBhZGRpbmdCb3R0b21cIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cInBhZGRpbmdCb3R0b21cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBtYXRUZXh0U3VmZml4PlxuICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgTGVmdFxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgc3RlcD1cIjAuMDVcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBhZGRpbmdMZWZ0XCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJwYWRkaW5nTGVmdFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIG1hdFRleHRTdWZmaXg+XG4gICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICBsYWJlbD1cIkZpbHRlcnNcIlxuICAgICAgICAgICAgbmFtZT1cImZpbHRlcnNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJvZHlcIj5cbiAgICAgICAgICAgIEBpZiAoY29sdW1uc0Vycm9yKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXJzLWVtcHR5IGVycm9yXCI+XG4gICAgICAgICAgICAgICAge3sgY29sdW1uc0Vycm9yIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAocm93cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPCEtLSBFdmVyeSBmaWx0ZXJhYmxlIGNvbHVtbi4gVG9nZ2xlIHdoZXJlIGl0cyBjb250cm9sIHNob3dzOiBpblxuICAgICAgICAgICAgICAgICAgIHRoZSByZXBvcnQgYmFyLCBvbiB0aGlzIGNvbXBvbmVudCwgYm90aCwgb3IgbmVpdGhlci4gVGhlXG4gICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIChkYXRlIHJhbmdlIHZzIHZhbHVlIHBpY2tlcikgZm9sbG93cyB0aGUgZGF0YS4gLS0+XG4gICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImZpbHRlci10YWJsZVwiPlxuICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiZmlsdGVyLWNvbC1uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImZpbHRlci1jb2wtdHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIFR5cGVcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiZmlsdGVyLWNvbC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICBSZXBvcnQgYmFyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImZpbHRlci1jb2wtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICBAZm9yIChyb3cgb2Ygcm93czsgdHJhY2sgcm93LmNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiZmlsdGVyLWNvbC1uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyByb3cubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZpbHRlci1jb2wtdHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdHlwZUxhYmVsKHJvdy50eXBlKSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiZmlsdGVyLWNvbC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvdy5yZXBvcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZXRFeHBvc3VyZShyb3csICdyZXBvcnQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlNob3cgaW4gdGhlIHJlcG9ydCBiYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZpbHRlci1jb2wtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3cuY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2V0RXhwb3N1cmUocm93LCAnY29tcG9uZW50JywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJTaG93IG9uIHRoaXMgY29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXJzLWVtcHR5XCI+XG4gICAgICAgICAgICAgICAgVGhpcyBjb21wb25lbnQgaGFzIG5vIGZpbHRlcmFibGUgY29sdW1ucyB5ZXQg4oCUIGdpdmUgaXQgc29tZSBTUUwgZmlyc3QuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICBsYWJlbD1cIlNRTFwiXG4gICAgICAgICAgICBuYW1lPVwic3FsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1ib2R5XCI+XG4gICAgICAgICAgICA8cHJlIGNsYXNzPVwiY29kZS1ibG9ja1wiPlxuICAgICAgICAgICAgICB7eyBjb21wb25lbnQuc3FsIH19XG4gICAgICAgICAgICA8L3ByZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICA8bWF0LXRhYlxuICAgICAgICAgICAgbGFiZWw9XCJDb25maWdcIlxuICAgICAgICAgICAgbmFtZT1cImNvbmZpZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYm9keVwiPlxuICAgICAgICAgICAgPHByZSBjbGFzcz1cImNvZGUtYmxvY2tcIj5cbiAgICAgICAgICAgICAge3sgY29uZmlnSnNvbiB9fVxuICAgICAgICAgICAgPC9wcmU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LXRhYj5cbiAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgICAgPGZzLWZvcm0tZGlhbG9nLWFjdGlvbnNcbiAgICAgICAgW3NhdmVdPVwic2VsZWN0ZWRUYWIgPT09ICdzZXR0aW5ncydcIlxuICAgICAgICBbZG9uZV09XCJzZWxlY3RlZFRhYiAhPT0gJ3NldHRpbmdzJ1wiPlxuICAgICAgPC9mcy1mb3JtLWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICA8L2ZzLWRpYWxvZz5cbjwvZm9ybT4iXX0=
|
|
220
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9kaWFsb2dzL2NvbXBvbmVudC1zZXR0aW5ncy9jb21wb25lbnQtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvY29tcG9uZW50LXNldHRpbmdzL2NvbXBvbmVudC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdILE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFF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V0FBVyxvNENBQ1gsWUFBWSxxbENBQ1osY0FBYyxnTUFDZCxhQUFhLDhCQUNiLFlBQVksbWFBQ1osYUFBYSw2b0JBQ2IsY0FBYywrSEFDZCxnQkFBZ0IseUdBQ2hCLGdCQUFnQiw0SEFDaEIsWUFBWSw0TEFDWixRQUFRLHNEQUNSLFNBQVMscUhBQ1QsUUFBUSxpVUFDUixjQUFjLDBVQUNkLFVBQVU7OzRGQUdELDBCQUEwQjtrQkF2QnRDLFNBQVM7c0NBR1MsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxZQUFZO3dCQUNaLGNBQWM7d0JBQ2QsYUFBYTt3QkFDYixZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxnQkFBZ0I7d0JBQ2hCLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixRQUFRO3dCQUNSLFNBQVM7d0JBQ1QsUUFBUTt3QkFDUixjQUFjO3dCQUNkLFVBQVU7cUJBQ1giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nQWN0aW9ucywgTWF0RGlhbG9nQ29udGVudCwgTWF0RGlhbG9nUmVmLCBNYXREaWFsb2dUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZCwgTWF0TGFiZWwsIE1hdFN1ZmZpeCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xyXG5pbXBvcnQgeyBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuXHJcbmltcG9ydCB7IEZzRGlhbG9nTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZGlhbG9nJztcclxuaW1wb3J0IHsgRnNGb3JtTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZm9ybSc7XHJcbmltcG9ydCB7IEZzTGFiZWxNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9sYWJlbCc7XHJcbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xyXG5pbXBvcnQgeyBGc1RhYnNNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC90YWJzJztcclxuXHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudFNldHRpbmdzLFxyXG4gIFJlcG9ydCxcclxuICBSZXBvcnRDb21wb25lbnQsXHJcbiAgUmVwb3J0RmlsdGVyLFxyXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxyXG4gIFJlcG9ydEZpbHRlckxldmVsLFxyXG4gIFJlcG9ydEZpbHRlclR5cGUsXHJcbiAgUmVwb3J0RmlsdGVyYWJsZUNvbHVtbixcclxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HIH0gZnJvbSAnLi4vLi4vbGF5b3V0JztcclxuXHJcblxyXG4vLyBXaGF0IHRoZSBTZXR0aW5ncyB0YWIgaGFuZHMgYmFjayB3aGVuIGl0IHNhdmVzLiBFdmVyeSBvdGhlciBleGl0IChDYW5jZWwsXHJcbi8vIERvbmUsIEVzY2FwZSwgYmFja2Ryb3ApIGNsb3NlcyB3aXRoIG5vIHJlc3VsdCDigJQgZmlsdGVyIHdvcmsgaXMgYW5ub3VuY2VkIGFzIGl0XHJcbi8vIGhhcHBlbnMgaW5zdGVhZCwgdGhyb3VnaCBgZmlsdGVyc0NoYW5nZWRgLlxyXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudFNldHRpbmdzUmVzdWx0IHtcclxuICBzZXR0aW5nczogQ29tcG9uZW50U2V0dGluZ3M7XHJcbn1cclxuXHJcblxyXG4vLyBPbmUgcm93IG9mIHRoZSBGaWx0ZXJzIHRhYiBsaXN0aW5nOiBhIGZpbHRlcmFibGUgY29sdW1uLCB0aGUgaW50ZXJmYWNlXHJcbi8vIGluZmVycmVkIGZyb20gaXRzIGRhdGEsIGFuZCB3aGVyZSBpdHMgZmlsdGVyIGlzIGV4cG9zZWQgKHRoZSB0d28gdG9nZ2xlcykuXHJcbmludGVyZmFjZSBGaWx0ZXJSb3cge1xyXG4gIGNvbHVtbjogc3RyaW5nO1xyXG4gIHR5cGU6IFJlcG9ydEZpbHRlclR5cGU7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICByZXBvcnQ6IGJvb2xlYW47XHJcbiAgY29tcG9uZW50OiBib29sZWFuO1xyXG59XHJcblxyXG5cclxuLy8gQ29tcG9uZW50IHNldHRpbmdzLCBpbiB0YWJzOlxyXG4vLyAgIFNldHRpbmdzIOKAlCB0aXRsZSBhbmQgY29udGVudCBwYWRkaW5nLiBQb3NpdGlvbi9zaXplIGFyZSB0dW5lZCBieSBkcmFnZ2luZ1xyXG4vLyAgIG9uIHRoZSBjYW52YXM7IGhlaWdodCBiZWhhdmlvdXIgZm9sbG93cyBmcm9tIHRoZSBjb21wb25lbnQgdHlwZS5cclxuLy8gICBGaWx0ZXJzICDigJQgT05FIGxpc3Rpbmcgb2YgZXZlcnkgZmlsdGVyYWJsZSBjb2x1bW4gb24gdGhpcyBjb21wb25lbnQuIEVhY2hcclxuLy8gICByb3cgY2FycmllcyB0d28gdG9nZ2xlczogc2hvdyBpbiB0aGUgcmVwb3J0IGJhciBhbmQvb3Igc2hvdyBvbiB0aGlzXHJcbi8vICAgY29tcG9uZW50IChib3RoLCBlaXRoZXIsIG9yIG5laXRoZXIpLiBUaGUgaW50ZXJmYWNlIChkYXRlIHJhbmdlIHZzIHZhbHVlXHJcbi8vICAgcGlja2VyKSBpcyBpbmZlcnJlZCBmcm9tIHRoZSBkYXRhLCBuZXZlciBjaG9zZW4uIEVhY2ggdG9nZ2xlIHBlcnNpc3RzXHJcbi8vICAgaW1tZWRpYXRlbHkgYW5kIHJlZnJlc2hlcyB0aGUgaW4tZGlhbG9nIGxpc3QuXHJcbi8vICAgU1FMIC8gQ29uZmlnIOKAlCByZWFkLW9ubHkgZGlhZ25vc3RpY3MuXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQtc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC1zZXR0aW5ncy5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBGc0Zvcm1Nb2R1bGUsXHJcbiAgICBGc0RpYWxvZ01vZHVsZSxcclxuICAgIEZzTGFiZWxNb2R1bGUsXHJcbiAgICBGc1RhYnNNb2R1bGUsXHJcbiAgICBNYXRUYWJzTW9kdWxlLFxyXG4gICAgTWF0RGlhbG9nVGl0bGUsXHJcbiAgICBNYXREaWFsb2dDb250ZW50LFxyXG4gICAgTWF0RGlhbG9nQWN0aW9ucyxcclxuICAgIE1hdEZvcm1GaWVsZCxcclxuICAgIE1hdExhYmVsLFxyXG4gICAgTWF0U3VmZml4LFxyXG4gICAgTWF0SW5wdXQsXHJcbiAgICBNYXRTbGlkZVRvZ2dsZSxcclxuICAgIE1hdFRvb2x0aXAsXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENvbXBvbmVudFNldHRpbmdzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgLy8gQSBmaWx0ZXIgd2FzIGFkZGVkLCByZW1vdmVkIG9yIHJlLWxldmVsbGVkLCBzbyB0aGUgcmVwb3J0J3MgZmlsdGVyIGdyb3Vwc1xyXG4gIC8vIGNoYW5nZWQuIFRob3NlIG11dGF0aW9ucyBwZXJzaXN0IHRoZSBtb21lbnQgdGhleSBhcmUgY2xpY2tlZCBhbmQgdGhlIGRpYWxvZ1xyXG4gIC8vIGNhbiB0aGVuIGJlIGRpc21pc3NlZCBieSBhIHJvdXRlIHRoYXQgY2FycmllcyBubyByZXN1bHQgKEVzY2FwZSwgYmFja2Ryb3ApLFxyXG4gIC8vIHNvIHRoZSBwYWdlIGlzIHRvbGQgaGVyZSByYXRoZXIgdGhhbiB0aHJvdWdoIHRoZSBjbG9zZSByZXN1bHQuXHJcbiAgcHVibGljIHJlYWRvbmx5IGZpbHRlcnNDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBwdWJsaWMgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XHJcbiAgcHVibGljIHJlcG9ydDogUmVwb3J0O1xyXG5cclxuICBwdWJsaWMgc2VsZWN0ZWRUYWIgPSAnc2V0dGluZ3MnO1xyXG5cclxuICBwdWJsaWMgdGl0bGUgPSAnJztcclxuXHJcbiAgcHVibGljIHBhZGRpbmdUb3AgPSBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HO1xyXG4gIHB1YmxpYyBwYWRkaW5nUmlnaHQgPSBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HO1xyXG4gIHB1YmxpYyBwYWRkaW5nQm90dG9tID0gREVGQVVMVF9DT01QT05FTlRfUEFERElORztcclxuICBwdWJsaWMgcGFkZGluZ0xlZnQgPSBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HO1xyXG5cclxuICBwdWJsaWMgY29uZmlnSnNvbiA9ICcnO1xyXG5cclxuICAvLyAtLS0tIGZpbHRlciBtYW5hZ2VtZW50IHN0YXRlIC0tLS1cclxuICAvLyBPbmUgcm93IHBlciBmaWx0ZXJhYmxlIGNvbHVtbi4gVGhlIHR3byBib29sZWFucyBkcml2ZSB0aGUgdG9nZ2xlczsgd2UgZmxpcFxyXG4gIC8vIHRoZW0gb3B0aW1pc3RpY2FsbHkgb24gY2xpY2sgKHNvIHRoZSBVSSBuZXZlciBibGlua3Mgd2hpbGUgdGhlIHJlcXVlc3QgaXNcclxuICAvLyBpbiBmbGlnaHQpIGFuZCByZWNvbmNpbGUgZnJvbSB0aGUgc2VydmVyIG9uIHJlbG9hZC5cclxuICBwdWJsaWMgcm93czogRmlsdGVyUm93W10gPSBbXTtcclxuICBwdWJsaWMgY29sdW1uc0Vycm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLy8gVGhlIHJhdyBpbnB1dHMgdGhlIHJvd3MgYXJlIGJ1aWx0IGZyb20uXHJcbiAgcHJpdmF0ZSBfZmlsdGVyYWJsZUNvbHVtbnM6IFJlcG9ydEZpbHRlcmFibGVDb2x1bW5bXSA9IFtdO1xyXG4gIHByaXZhdGUgX2ZpbHRlcnM6IFJlcG9ydEZpbHRlcltdID0gW107XHJcbiAgcHJpdmF0ZSBfZ3JvdXBzQnlJZCA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRGaWx0ZXJHcm91cD4oKTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfdHlwZUxhYmVsczogUmVjb3JkPFJlcG9ydEZpbHRlclR5cGUsIHN0cmluZz4gPSB7XHJcbiAgICBzZWxlY3Q6ICdQaWNrIHZhbHVlcycsXHJcbiAgICBkYXRlUmFuZ2U6ICdEYXRlIHJhbmdlJyxcclxuICAgIGtleXdvcmQ6ICdTZWFyY2ggdGV4dCcsXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfZGF0YTogeyByZXBvcnQ6IFJlcG9ydDsgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQgfSA9IGluamVjdChNQVRfRElBTE9HX0RBVEEpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpYWxvZ1JlZiA9IGluamVjdDxNYXREaWFsb2dSZWY8Q29tcG9uZW50U2V0dGluZ3NDb21wb25lbnQsIENvbXBvbmVudFNldHRpbmdzUmVzdWx0Pj4oTWF0RGlhbG9nUmVmKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX21lc3NhZ2UgPSBpbmplY3QoRnNNZXNzYWdlKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jZFJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVwb3J0ID0gdGhpcy5fZGF0YS5yZXBvcnQ7XHJcbiAgICB0aGlzLmNvbXBvbmVudCA9IHRoaXMuX2RhdGEuY29tcG9uZW50O1xyXG5cclxuICAgIHRoaXMudGl0bGUgPSB0aGlzLmNvbXBvbmVudC50aXRsZSA/PyAnJztcclxuXHJcbiAgICBjb25zdCBwYWRkaW5nID0gdGhpcy5jb21wb25lbnQuY29uZmlnPy5wYWRkaW5nO1xyXG4gICAgdGhpcy5wYWRkaW5nVG9wID0gcGFkZGluZz8udG9wID8/IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkc7XHJcbiAgICB0aGlzLnBhZGRpbmdSaWdodCA9IHBhZGRpbmc/LnJpZ2h0ID8/IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkc7XHJcbiAgICB0aGlzLnBhZGRpbmdCb3R0b20gPSBwYWRkaW5nPy5ib3R0b20gPz8gREVGQVVMVF9DT01QT05FTlRfUEFERElORztcclxuICAgIHRoaXMucGFkZGluZ0xlZnQgPSBwYWRkaW5nPy5sZWZ0ID8/IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkc7XHJcblxyXG4gICAgdGhpcy5jb25maWdKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jb21wb25lbnQuY29uZmlnID8/IHt9LCBudWxsLCAyKTtcclxuXHJcbiAgICB0aGlzLl9zZWVkRmlsdGVycyh0aGlzLnJlcG9ydCwgdGhpcy5jb21wb25lbnQuaWQpO1xyXG4gICAgdGhpcy5fbG9hZENvbHVtbnMoKTtcclxuICB9XHJcblxyXG4gIC8vIEh1bWFuLWZyaWVuZGx5IG5hbWUgZm9yIHRoZSBpbmZlcnJlZCBpbnRlcmZhY2Ugc2hvd24gYmVzaWRlIGVhY2ggY29sdW1uLlxyXG4gIHB1YmxpYyB0eXBlTGFiZWwodHlwZTogUmVwb3J0RmlsdGVyVHlwZSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHlwZUxhYmVsc1t0eXBlXSA/PyB0eXBlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmUgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBzZXR0aW5nczogQ29tcG9uZW50U2V0dGluZ3MgPSB7XHJcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxyXG4gICAgICBwYWRkaW5nOiB7XHJcbiAgICAgICAgdG9wOiB0aGlzLnBhZGRpbmdUb3AsXHJcbiAgICAgICAgcmlnaHQ6IHRoaXMucGFkZGluZ1JpZ2h0LFxyXG4gICAgICAgIGJvdHRvbTogdGhpcy5wYWRkaW5nQm90dG9tLFxyXG4gICAgICAgIGxlZnQ6IHRoaXMucGFkZGluZ0xlZnQsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLnVwZGF0ZUNvbXBvbmVudCh0aGlzLnJlcG9ydC5pZCwgdGhpcy5jb21wb25lbnQuaWQsIHsgLi4uc2V0dGluZ3MgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnQ29tcG9uZW50IHNhdmVkJyk7XHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UoeyBzZXR0aW5ncyB9KTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuICB9O1xyXG5cclxuICAvLyBGbGlwIG9uZSBleHBvc3VyZSAocmVwb3J0IGJhciBvciB0aGlzIGNvbXBvbmVudCkgZm9yIGEgcm93LiBXZSB1cGRhdGUgdGhlXHJcbiAgLy8gcm93J3MgYm9vbGVhbiBmaXJzdCDigJQgc28gdGhlIHRvZ2dsZSBzdGF5cyBwdXQgd2l0aCBubyBibGluayDigJQgdGhlbiBwZXJzaXN0XHJcbiAgLy8gYW5kIHJlY29uY2lsZSBvbiByZWxvYWQuIE5laXRoZXIgb24g4oaSIG5vIGZpbHRlciAocmVtb3ZlZCk7IGVpdGhlciBvbiDihpIgdGhlXHJcbiAgLy8gZmlsdGVyIGV4aXN0cyBhdCB0aGUgY29tYmluZWQgbGV2ZWwuIFRoZSBpbnRlcmZhY2UgdHlwZSBpcyBpbmZlcnJlZFxyXG4gIC8vIHNlcnZlci1zaWRlLlxyXG4gIHB1YmxpYyBzZXRFeHBvc3VyZShyb3c6IEZpbHRlclJvdywgdGFyZ2V0OiAncmVwb3J0JyB8ICdjb21wb25lbnQnLCBvbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgcm93W3RhcmdldF0gPSBvbjtcclxuXHJcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX2ZpbHRlcnMuZmluZCgoZmlsdGVyKSA9PiBmaWx0ZXIuZmlsdGVyQ29sdW1uID09PSByb3cuY29sdW1uKTtcclxuXHJcbiAgICBpZiAoIXJvdy5yZXBvcnQgJiYgIXJvdy5jb21wb25lbnQpIHtcclxuICAgICAgaWYgKGV4aXN0aW5nKSB7XHJcbiAgICAgICAgdGhpcy5fcnVuKHRoaXMuX3JlcG9ydERhdGEuZGVsZXRlRmlsdGVyKHRoaXMucmVwb3J0LmlkLCBleGlzdGluZy5pZCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbGV2ZWw6IFJlcG9ydEZpbHRlckxldmVsID0gcm93LnJlcG9ydCAmJiByb3cuY29tcG9uZW50XHJcbiAgICAgID8gJ2JvdGgnXHJcbiAgICAgIDogKHJvdy5yZXBvcnQgPyAncmVwb3J0JyA6ICdjb21wb25lbnQnKTtcclxuXHJcbiAgICBpZiAoZXhpc3RpbmcpIHtcclxuICAgICAgdGhpcy5fcnVuKHRoaXMuX3JlcG9ydERhdGEudXBkYXRlRmlsdGVyR3JvdXAodGhpcy5yZXBvcnQuaWQsIGV4aXN0aW5nLmZpbHRlckdyb3VwSWQsIHsgbGV2ZWwgfSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fcnVuKHRoaXMuX3JlcG9ydERhdGEuYWRkRmlsdGVyKHRoaXMucmVwb3J0LmlkLCB0aGlzLmNvbXBvbmVudC5pZCwge1xyXG4gICAgICAgIGZpbHRlckNvbHVtbjogcm93LmNvbHVtbixcclxuICAgICAgICBsYWJlbDogcm93LmxhYmVsLFxyXG4gICAgICAgIGxldmVsLFxyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBSdW4gYSBmaWx0ZXIgbXV0YXRpb24sIHRoZW4gcmVsb2FkIHRvIHJlY29uY2lsZSB0aGUgb3B0aW1pc3RpYyBzdGF0ZS5cclxuICBwcml2YXRlIF9ydW4ocmVxdWVzdDogT2JzZXJ2YWJsZTx1bmtub3duPik6IHZvaWQge1xyXG4gICAgcmVxdWVzdC5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB0aGlzLl9hZnRlck11dGF0aW9uKCksXHJcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHRoaXMuX211dGF0aW9uRXJyb3IoZXJyb3IpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBCdWlsZCB0aGUgcm93IHZpZXctbW9kZWwgZnJvbSB0aGUgbG9hZGVkIGNvbHVtbnMgKyBmaWx0ZXJzL2dyb3Vwcy4gRWFjaFxyXG4gIC8vIHJvdydzIHRvZ2dsZXMgcmVmbGVjdCB3aGVyZSBpdHMgZmlsdGVyIGdyb3VwIGlzIGN1cnJlbnRseSBleHBvc2VkLlxyXG4gIHByaXZhdGUgX3JlYnVpbGRSb3dzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yb3dzID0gdGhpcy5fZmlsdGVyYWJsZUNvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcclxuICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5fZmlsdGVycy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5maWx0ZXJDb2x1bW4gPT09IGNvbHVtbi5jb2x1bW4pO1xyXG4gICAgICBjb25zdCBsZXZlbCA9IGZpbHRlciA/IHRoaXMuX2dyb3Vwc0J5SWQuZ2V0KGZpbHRlci5maWx0ZXJHcm91cElkKT8ubGV2ZWwgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGNvbHVtbjogY29sdW1uLmNvbHVtbixcclxuICAgICAgICB0eXBlOiBjb2x1bW4udHlwZSxcclxuICAgICAgICBsYWJlbDogZmlsdGVyPy5sYWJlbFxyXG4gICAgICAgICAgfHwgdGhpcy5fZ3JvdXBzQnlJZC5nZXQoZmlsdGVyPy5maWx0ZXJHcm91cElkID8/IC0xKT8ubGFiZWxcclxuICAgICAgICAgIHx8IHRoaXMuX2h1bWFuaXplKGNvbHVtbi5jb2x1bW4pLFxyXG4gICAgICAgIHJlcG9ydDogbGV2ZWwgPT09ICdyZXBvcnQnIHx8IGxldmVsID09PSAnYm90aCcsXHJcbiAgICAgICAgY29tcG9uZW50OiBsZXZlbCA9PT0gJ2NvbXBvbmVudCcgfHwgbGV2ZWwgPT09ICdib3RoJyxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gQWZ0ZXIgYW55IGZpbHRlciBtdXRhdGlvbjogcmUtZmV0Y2ggdGhlIHJlcG9ydCBzbyB0aGUgZGlhbG9nJ3MgZmlsdGVyIGxpc3RcclxuICAvLyAoYW5kIHRoZSBwYXJlbnQgY2FudmFzLCBvbiBjbG9zZSkgcmVmbGVjdCB0aGUgbmV3IGdyb3Vwcy9sZXZlbHMuXHJcbiAgcHJpdmF0ZSBfYWZ0ZXJNdXRhdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsdGVyc0NoYW5nZWQuZW1pdCgpO1xyXG5cclxuICAgIHRoaXMuX3JlcG9ydERhdGEuZ2V0KHRoaXMucmVwb3J0LmlkKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXBvcnQ6IFJlcG9ydCkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVwb3J0ID0gcmVwb3J0O1xyXG4gICAgICAgIHRoaXMuX3NlZWRGaWx0ZXJzKHJlcG9ydCwgdGhpcy5jb21wb25lbnQuaWQpO1xyXG4gICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX211dGF0aW9uRXJyb3IoZXJyb3I6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5fbWVzc2FnZS5lcnJvcihlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgPz8gZXJyb3I/Lm1lc3NhZ2UgPz8gJ0ZpbHRlciBvcGVyYXRpb24gZmFpbGVkJyk7XHJcbiAgICAvLyBSZS1zZWVkIGZyb20gdGhlIHNlcnZlciBzbyB0aGUgb3B0aW1pc3RpYyB0b2dnbGUgc25hcHMgYmFjayB0byB0cnV0aC5cclxuICAgIHRoaXMuX2FmdGVyTXV0YXRpb24oKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NlZWRGaWx0ZXJzKHJlcG9ydDogUmVwb3J0LCBjb21wb25lbnRJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9ncm91cHNCeUlkID0gbmV3IE1hcCgocmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSkubWFwKChncm91cCkgPT4gW2dyb3VwLmlkLCBncm91cF0pKTtcclxuXHJcbiAgICBjb25zdCBjb21wb25lbnQgPSByZXBvcnQucGFnZXNcclxuICAgICAgLmZsYXRNYXAoKHBhZ2UpID0+IHBhZ2UuY29tcG9uZW50cylcclxuICAgICAgLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09PSBjb21wb25lbnRJZCk7XHJcblxyXG4gICAgdGhpcy5fZmlsdGVycyA9IGNvbXBvbmVudD8uZmlsdGVycyA/PyBbXTtcclxuICAgIHRoaXMuX3JlYnVpbGRSb3dzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkQ29sdW1ucygpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JlcG9ydERhdGEuY29tcG9uZW50Q29sdW1ucyh0aGlzLnJlcG9ydC5pZCwgdGhpcy5jb21wb25lbnQuaWQpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChjb2x1bW5zOiBSZXBvcnRGaWx0ZXJhYmxlQ29sdW1uW10pID0+IHtcclxuICAgICAgICAgIHRoaXMuX2ZpbHRlcmFibGVDb2x1bW5zID0gY29sdW1ucyA/PyBbXTtcclxuICAgICAgICAgIHRoaXMuX3JlYnVpbGRSb3dzKCk7XHJcbiAgICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sdW1uc0Vycm9yID0gZXJyb3I/LmVycm9yPy5tZXNzYWdlID8/ICdDb3VsZCBub3QgcmVhZCB0aGUgY29tcG9uZW50IGNvbHVtbnMnO1xyXG4gICAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9odW1hbml6ZShjb2x1bW46IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gY29sdW1uXHJcbiAgICAgIC5yZXBsYWNlKC9bX1xcLV0rL2csICcgJylcclxuICAgICAgLnJlcGxhY2UoL1xccysvZywgJyAnKVxyXG4gICAgICAudHJpbSgpXHJcbiAgICAgIC5yZXBsYWNlKC9cXGJcXHcvZywgKGNoYXJhY3RlcikgPT4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCkpO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybVxuICAgIGZzRm9ybVxuICAgIFtzdWJtaXRdPVwic2F2ZVwiPlxuICA8ZnMtZGlhbG9nPlxuICAgIDxoMSBtYXQtZGlhbG9nLXRpdGxlPlxuICAgICAge3sgY29tcG9uZW50LnRpdGxlIHx8ICdDb21wb25lbnQnIH19XG4gICAgPC9oMT5cbiAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgPG1hdC10YWItZ3JvdXAgWyhzZWxlY3RlZCldPVwic2VsZWN0ZWRUYWJcIj5cbiAgICAgICAgPG1hdC10YWJcbiAgICAgICAgICAgIGxhYmVsPVwiU2V0dGluZ3NcIlxuICAgICAgICAgICAgbmFtZT1cInNldHRpbmdzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWNvbHVtbiB0YWItYm9keVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIFRpdGxlXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJoZWFkaW5nLTJcIj5cbiAgICAgICAgICAgICAgUGFkZGluZ1xuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2VvbWV0cnktcm93XCI+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgVG9wXG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICBzdGVwPVwiMC4wNVwiXG4gICAgICAgICAgICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicGFkZGluZ1RvcFwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwicGFkZGluZ1RvcFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIG1hdFRleHRTdWZmaXg+XG4gICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICBSaWdodFxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgc3RlcD1cIjAuMDVcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBhZGRpbmdSaWdodFwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwicGFkZGluZ1JpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gbWF0VGV4dFN1ZmZpeD5cbiAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIEJvdHRvbVxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgc3RlcD1cIjAuMDVcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBhZGRpbmdCb3R0b21cIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cInBhZGRpbmdCb3R0b21cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBtYXRUZXh0U3VmZml4PlxuICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgTGVmdFxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgc3RlcD1cIjAuMDVcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBhZGRpbmdMZWZ0XCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJwYWRkaW5nTGVmdFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIG1hdFRleHRTdWZmaXg+XG4gICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICBsYWJlbD1cIkZpbHRlcnNcIlxuICAgICAgICAgICAgbmFtZT1cImZpbHRlcnNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJvZHlcIj5cbiAgICAgICAgICAgIEBpZiAoY29sdW1uc0Vycm9yKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXJzLWVtcHR5IGVycm9yXCI+XG4gICAgICAgICAgICAgICAge3sgY29sdW1uc0Vycm9yIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAocm93cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPCEtLSBFdmVyeSBmaWx0ZXJhYmxlIGNvbHVtbi4gVG9nZ2xlIHdoZXJlIGl0cyBjb250cm9sIHNob3dzOiBpblxuICAgICAgICAgICAgICAgICAgIHRoZSByZXBvcnQgYmFyLCBvbiB0aGlzIGNvbXBvbmVudCwgYm90aCwgb3IgbmVpdGhlci4gVGhlXG4gICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIChkYXRlIHJhbmdlIHZzIHZhbHVlIHBpY2tlcikgZm9sbG93cyB0aGUgZGF0YS4gLS0+XG4gICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImZpbHRlci10YWJsZVwiPlxuICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiZmlsdGVyLWNvbC1uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImZpbHRlci1jb2wtdHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIFR5cGVcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiZmlsdGVyLWNvbC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICBSZXBvcnQgYmFyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImZpbHRlci1jb2wtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICBAZm9yIChyb3cgb2Ygcm93czsgdHJhY2sgcm93LmNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiZmlsdGVyLWNvbC1uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyByb3cubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZpbHRlci1jb2wtdHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdHlwZUxhYmVsKHJvdy50eXBlKSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiZmlsdGVyLWNvbC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvdy5yZXBvcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZXRFeHBvc3VyZShyb3csICdyZXBvcnQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlNob3cgaW4gdGhlIHJlcG9ydCBiYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZpbHRlci1jb2wtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3cuY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2V0RXhwb3N1cmUocm93LCAnY29tcG9uZW50JywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJTaG93IG9uIHRoaXMgY29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXJzLWVtcHR5XCI+XG4gICAgICAgICAgICAgICAgVGhpcyBjb21wb25lbnQgaGFzIG5vIGZpbHRlcmFibGUgY29sdW1ucyB5ZXQg4oCUIGdpdmUgaXQgc29tZSBTUUwgZmlyc3QuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICBsYWJlbD1cIlNRTFwiXG4gICAgICAgICAgICBuYW1lPVwic3FsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1ib2R5XCI+XG4gICAgICAgICAgICA8cHJlIGNsYXNzPVwiY29kZS1ibG9ja1wiPlxuICAgICAgICAgICAgICB7eyBjb21wb25lbnQuc3FsIH19XG4gICAgICAgICAgICA8L3ByZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICA8bWF0LXRhYlxuICAgICAgICAgICAgbGFiZWw9XCJDb25maWdcIlxuICAgICAgICAgICAgbmFtZT1cImNvbmZpZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYm9keVwiPlxuICAgICAgICAgICAgPHByZSBjbGFzcz1cImNvZGUtYmxvY2tcIj5cbiAgICAgICAgICAgICAge3sgY29uZmlnSnNvbiB9fVxuICAgICAgICAgICAgPC9wcmU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LXRhYj5cbiAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgICAgPGZzLWZvcm0tZGlhbG9nLWFjdGlvbnNcbiAgICAgICAgW3NhdmVdPVwic2VsZWN0ZWRUYWIgPT09ICdzZXR0aW5ncydcIlxuICAgICAgICBbZG9uZV09XCJzZWxlY3RlZFRhYiAhPT0gJ3NldHRpbmdzJ1wiPlxuICAgICAgPC9mcy1mb3JtLWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICA8L2ZzLWRpYWxvZz5cbjwvZm9ybT4iXX0=
|
|
@@ -1,38 +1,82 @@
|
|
|
1
1
|
import { Injectable, inject } from '@angular/core';
|
|
2
|
-
import { forkJoin, map, of } from 'rxjs';
|
|
3
|
-
import { catchError } from 'rxjs/operators';
|
|
4
|
-
import { format } from 'date-fns';
|
|
2
|
+
import { forkJoin, from, map, of } from 'rxjs';
|
|
3
|
+
import { catchError, mergeMap, toArray } from 'rxjs/operators';
|
|
5
4
|
import { ReportData } from '../data/report.data';
|
|
6
5
|
import { GRANULARITY_OPTIONS, } from '../interfaces/report.interface';
|
|
7
|
-
import { loadGroupOptions, resolveOptionValues } from '../report-filter-items';
|
|
6
|
+
import { dateBoundLabel, loadGroupOptions, resolveOptionValues } from '../report-filter-items';
|
|
8
7
|
import { ReportFilterStateService } from '../services/report-filter-state.service';
|
|
9
8
|
import * as i0 from "@angular/core";
|
|
10
9
|
// Rows fetched for a list component's export table — enough to fill a
|
|
11
10
|
// slide/page table; the cap note covers the rest.
|
|
12
11
|
const LIST_EXPORT_ROWS = 100;
|
|
12
|
+
// How many tile queries an export runs at once.
|
|
13
|
+
//
|
|
14
|
+
// Not a politeness setting — it is the difference between a deck and a broken
|
|
15
|
+
// one. These queries are heavy and read the same tables, so firing all of them
|
|
16
|
+
// together puts every one in contention for the same database at the same
|
|
17
|
+
// moment and they cross the statement ceiling as a group: measured on report
|
|
18
|
+
// 28, ten tiles that each answer in 9-24s run one after another all failed at
|
|
19
|
+
// ~30s when released together. Concurrency buys wall-clock only up to the point
|
|
20
|
+
// where the queries start taking it back off each other, and past that it buys
|
|
21
|
+
// failures.
|
|
22
|
+
const EXPORT_CONCURRENCY = 3;
|
|
23
|
+
// What a component with nothing to draw prints in the exported file.
|
|
24
|
+
//
|
|
25
|
+
// The two cases must not read alike. A tile that returned no rows is a finding
|
|
26
|
+
// about the period — the report worked and the answer is "none". A tile whose
|
|
27
|
+
// query failed is a hole in the file, and calling that "Data unavailable" tells
|
|
28
|
+
// the reader the data does not exist when what happened is that nobody managed
|
|
29
|
+
// to ask for it. Shared by both renderers so the PDF and the deck cannot end up
|
|
30
|
+
// describing the same hole two different ways.
|
|
31
|
+
export function emptyLabel(item) {
|
|
32
|
+
return item.data ? 'No data' : 'Could not be generated';
|
|
33
|
+
}
|
|
34
|
+
// The pages of a collected report that have at least one tile whose query
|
|
35
|
+
// failed — what the export gate names to the user, and what makes "some of this
|
|
36
|
+
// file is missing" a fact the caller can act on rather than a thing they notice
|
|
37
|
+
// in the PDF afterwards.
|
|
38
|
+
export function failedPageNames(collected) {
|
|
39
|
+
// Numbered before the filter — an unnamed page 4 that failed has to read
|
|
40
|
+
// "Page 4", not "Page 1" because it happened to be the first failure.
|
|
41
|
+
return collected.pages
|
|
42
|
+
.map((page, index) => ({ page, number: index + 1 }))
|
|
43
|
+
.filter(({ page }) => page.components.some((item) => !item.data))
|
|
44
|
+
.map(({ page, number }) => page.page.name || `Page ${number}`);
|
|
45
|
+
}
|
|
13
46
|
// Gathers everything an export needs: every component's data across ALL pages
|
|
14
47
|
// (the canvas only renders the active page, so exports can't scrape the
|
|
15
|
-
// screen), fetched fresh with the viewer's current filter state.
|
|
16
|
-
//
|
|
48
|
+
// screen), fetched fresh with the viewer's current filter state.
|
|
49
|
+
//
|
|
50
|
+
// A failed component resolves to a null `data` rather than failing the whole
|
|
51
|
+
// collection — but that is so the caller can REPORT what failed, not so it can
|
|
52
|
+
// be ignored: see failedPageNames() and the export gate that uses it.
|
|
17
53
|
export class ReportExportCollectorService {
|
|
18
54
|
_reportData = inject(ReportData);
|
|
19
55
|
_filterState = inject(ReportFilterStateService);
|
|
20
56
|
collect(report) {
|
|
21
|
-
const requests = [];
|
|
22
57
|
const slots = [];
|
|
23
58
|
report.pages.forEach((page, pageIndex) => {
|
|
24
59
|
for (const component of page.components) {
|
|
25
|
-
slots.push({ pageIndex });
|
|
26
|
-
requests.push(this._componentData(report, component));
|
|
60
|
+
slots.push({ pageIndex, component });
|
|
27
61
|
}
|
|
28
62
|
});
|
|
29
|
-
|
|
63
|
+
// Released a few at a time rather than all at once. mergeMap completes out
|
|
64
|
+
// of order, so each result carries the slot it came from and the rows are
|
|
65
|
+
// filed by index — the deck's page order can't depend on which query
|
|
66
|
+
// happened to finish first.
|
|
67
|
+
const all$ = slots.length
|
|
68
|
+
? from(slots.map((slot, index) => ({ slot, index })))
|
|
69
|
+
.pipe(mergeMap(({ slot, index }) => this._componentData(report, slot.component)
|
|
70
|
+
.pipe(map((item) => ({ item, index }))), EXPORT_CONCURRENCY), toArray())
|
|
71
|
+
: of([]);
|
|
30
72
|
// The summary rides alongside the component data rather than being built at
|
|
31
73
|
// the end, because naming a select filter's values is itself a request.
|
|
32
74
|
return forkJoin({ collected: all$, filterSummary: this._filterSummary(report) })
|
|
33
75
|
.pipe(map(({ collected, filterSummary }) => {
|
|
34
76
|
const pages = report.pages.map((page) => ({ page, components: [] }));
|
|
35
|
-
collected
|
|
77
|
+
[...collected]
|
|
78
|
+
.sort((a, b) => a.index - b.index)
|
|
79
|
+
.forEach(({ item, index }) => {
|
|
36
80
|
pages[slots[index].pageIndex].components.push(item);
|
|
37
81
|
});
|
|
38
82
|
return {
|
|
@@ -51,7 +95,10 @@ export class ReportExportCollectorService {
|
|
|
51
95
|
const state = component.type === 'list'
|
|
52
96
|
? { page: 1, pageSize: LIST_EXPORT_ROWS }
|
|
53
97
|
: (isTimeSeries && frequency ? { frequency } : {});
|
|
54
|
-
|
|
98
|
+
// handlers: false keeps the app's global error dialog out of this. A failed
|
|
99
|
+
// tile is reported once, by the export gate, naming the pages it cost —
|
|
100
|
+
// never as ten stacked modals carrying the database's own wording.
|
|
101
|
+
return this._reportData.componentData(report.id, component.id, filters, state, true, { handlers: false })
|
|
55
102
|
.pipe(map((data) => ({ component, data })), catchError(() => of({ component, data: null })));
|
|
56
103
|
}
|
|
57
104
|
// "Report Period: Jun 12, 2025 – Jun 12, 2026", "Organization: Alnylam - AHP,
|
|
@@ -102,12 +149,10 @@ export class ReportExportCollectorService {
|
|
|
102
149
|
return resolveOptionValues(loadGroupOptions(group, this._reportData, reportId), values)
|
|
103
150
|
.pipe(map((resolved) => `${label}: ${resolved.map((item) => item.name).join(', ')}`), catchError(() => of(`${label}: ${values.map((item) => String(item)).join(', ')}`)));
|
|
104
151
|
}
|
|
152
|
+
// Rendered off the same calendar day the filter sends to the server, so the
|
|
153
|
+
// cover's period is the period the numbers behind it were queried for.
|
|
105
154
|
_date(value) {
|
|
106
|
-
|
|
107
|
-
return '…';
|
|
108
|
-
}
|
|
109
|
-
const date = value instanceof Date ? value : new Date(value);
|
|
110
|
-
return Number.isNaN(date.getTime()) ? String(value) : format(date, 'MMM d, yyyy');
|
|
155
|
+
return dateBoundLabel(value) ?? '…';
|
|
111
156
|
}
|
|
112
157
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportCollectorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
113
158
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportCollectorService });
|
|
@@ -115,4 +160,4 @@ export class ReportExportCollectorService {
|
|
|
115
160
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportCollectorService, decorators: [{
|
|
116
161
|
type: Injectable
|
|
117
162
|
}] });
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFFTCxtQkFBbUIsR0FLcEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7QUFvQm5GLHNFQUFzRTtBQUN0RSxrREFBa0Q7QUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFFN0IsOEVBQThFO0FBQzlFLHdFQUF3RTtBQUN4RSw0RUFBNEU7QUFDNUUsbUVBQW1FO0FBRW5FLE1BQU0sT0FBTyw0QkFBNEI7SUFFL0IsV0FBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqQyxZQUFZLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFFakQsT0FBTyxDQUFDLE1BQWM7UUFDM0IsTUFBTSxRQUFRLEdBQXFDLEVBQUUsQ0FBQztRQUN0RCxNQUFNLEtBQUssR0FBNEIsRUFBRSxDQUFDO1FBRTFDLE1BQU0sQ0FBQyxLQUFLLENBQUMs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QyxFQUM5RSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDbkYsQ0FBQztJQUNOLENBQUM7SUFFTyxLQUFLLENBQUMsS0FBdUM7UUFDbkQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3RCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNwRixDQUFDO3dHQTNIVSw0QkFBNEI7NEdBQTVCLDRCQUE0Qjs7NEZBQTVCLDRCQUE0QjtrQkFEeEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgbWFwLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQge1xuICBDb21wb25lbnREYXRhLFxuICBHUkFOVUxBUklUWV9PUFRJT05TLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0RmlsdGVyR3JvdXAsXG4gIFJlcG9ydFBhZ2UsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBsb2FkR3JvdXBPcHRpb25zLCByZXNvbHZlT3B0aW9uVmFsdWVzIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkQ29tcG9uZW50IHtcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIGRhdGE6IENvbXBvbmVudERhdGEgfCBudWxsOyAvLyBudWxsID0gaXRzIHF1ZXJ5IGZhaWxlZDsgZXhwb3J0cyBzaG93IGEgbm90ZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3RlZFBhZ2Uge1xuICBwYWdlOiBSZXBvcnRQYWdlO1xuICBjb21wb25lbnRzOiBDb2xsZWN0ZWRDb21wb25lbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0ZWRSZXBvcnQge1xuICByZXBvcnQ6IFJlcG9ydDtcbiAgcGFnZXM6IENvbGxlY3RlZFBhZ2VbXTtcbiAgLy8gSHVtYW4tcmVhZGFibGUgbGluZXMgZGVzY3JpYmluZyB0aGUgYWN0aXZlIGZpbHRlcnMsIGZvciB0aGUgdGl0bGUgc2xpZGUvcGFnZS5cbiAgZmlsdGVyU3VtbWFyeTogc3RyaW5nW107XG59XG5cbi8vIFJvd3MgZmV0Y2hlZCBmb3IgYSBsaXN0IGNvbXBvbmVudCdzIGV4cG9ydCB0YWJsZSDigJQgZW5vdWdoIHRvIGZpbGwgYVxuLy8gc2xpZGUvcGFnZSB0YWJsZTsgdGhlIGNhcCBub3RlIGNvdmVycyB0aGUgcmVzdC5cbmNvbnN0IExJU1RfRVhQT1JUX1JPV1MgPSAxMDA7XG5cbi8vIEdhdGhlcnMgZXZlcnl0aGluZyBhbiBleHBvcnQgbmVlZHM6IGV2ZXJ5IGNvbXBvbmVudCdzIGRhdGEgYWNyb3NzIEFMTCBwYWdlc1xuLy8gKHRoZSBjYW52YXMgb25seSByZW5kZXJzIHRoZSBhY3RpdmUgcGFnZSwgc28gZXhwb3J0cyBjYW4ndCBzY3JhcGUgdGhlXG4vLyBzY3JlZW4pLCBmZXRjaGVkIGZyZXNoIHdpdGggdGhlIHZpZXdlcidzIGN1cnJlbnQgZmlsdGVyIHN0YXRlLiBPbmUgZmFpbGVkXG4vLyBjb21wb25lbnQgZGVncmFkZXMgdG8gYSBub3RlIGluIHRoZSBkZWNrLCBuZXZlciBhIGZhaWxlZCBleHBvcnQuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcblxuICBwdWJsaWMgY29sbGVjdChyZXBvcnQ6IFJlcG9ydCk6IE9ic2VydmFibGU8Q29sbGVjdGVkUmVwb3J0PiB7XG4gICAgY29uc3QgcmVxdWVzdHM6IE9ic2VydmFibGU8Q29sbGVjdGVkQ29tcG9uZW50PltdID0gW107XG4gICAgY29uc3Qgc2xvdHM6IHsgcGFnZUluZGV4OiBudW1iZXIgfVtdID0gW107XG5cbiAgICByZXBvcnQucGFnZXMuZm9yRWFjaCgocGFnZSwgcGFnZUluZGV4KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBwYWdlLmNvbXBvbmVudHMpIHtcbiAgICAgICAgc2xvdHMucHVzaCh7IHBhZ2VJbmRleCB9KTtcbiAgICAgICAgcmVxdWVzdHMucHVzaCh0aGlzLl9jb21wb25lbnREYXRhKHJlcG9ydCwgY29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhbGwkID0gcmVxdWVzdHMubGVuZ3RoID8gZm9ya0pvaW4ocmVxdWVzdHMpIDogb2YoW10gYXMgQ29sbGVjdGVkQ29tcG9uZW50W10pO1xuXG4gICAgLy8gVGhlIHN1bW1hcnkgcmlkZXMgYWxvbmdzaWRlIHRoZSBjb21wb25lbnQgZGF0YSByYXRoZXIgdGhhbiBiZWluZyBidWlsdCBhdFxuICAgIC8vIHRoZSBlbmQsIGJlY2F1c2UgbmFtaW5nIGEgc2VsZWN0IGZpbHRlcidzIHZhbHVlcyBpcyBpdHNlbGYgYSByZXF1ZXN0LlxuICAgIHJldHVybiBmb3JrSm9pbih7IGNvbGxlY3RlZDogYWxsJCwgZmlsdGVyU3VtbWFyeTogdGhpcy5fZmlsdGVyU3VtbWFyeShyZXBvcnQpIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh7IGNvbGxlY3RlZCwgZmlsdGVyU3VtbWFyeSB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFnZXM6IENvbGxlY3RlZFBhZ2VbXSA9IHJlcG9ydC5wYWdlcy5tYXAoKHBhZ2UpID0+ICh7IHBhZ2UsIGNvbXBvbmVudHM6IFtdIH0pKTtcbiAgICAgICAgICBjb2xsZWN0ZWQuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHBhZ2VzW3Nsb3RzW2luZGV4XS5wYWdlSW5kZXhdLmNvbXBvbmVudHMucHVzaChpdGVtKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXBvcnQsXG4gICAgICAgICAgICBwYWdlcyxcbiAgICAgICAgICAgIGZpbHRlclN1bW1hcnksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tcG9uZW50RGF0YShyZXBvcnQ6IFJlcG9ydCwgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBPYnNlcnZhYmxlPENvbGxlY3RlZENvbXBvbmVudD4ge1xuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNvbHZlRm9yQ29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgLy8gQSB0aW1lLXNlcmllcyBjaGFydCBjYXJyaWVzIHRoZSB2aWV3ZXIncyBncm91cC1ieSBncmFpbiBzbyB0aGUgZXhwb3J0XG4gICAgLy8gcmUtYnVja2V0cyBleGFjdGx5IGFzIHRoZSBzY3JlZW4gZG9lczsgbGlzdHMgY2FycnkgdGhlaXIgZXhwb3J0IHBhZ2luZy5cbiAgICBjb25zdCBmcmVxdWVuY3kgPSB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3koKTtcbiAgICBjb25zdCBpc1RpbWVTZXJpZXMgPSBjb21wb25lbnQudHlwZSA9PT0gJ2NoYXJ0JyAmJiBjb21wb25lbnQuY29uZmlnPy54QXhpcz8ua2luZCA9PT0gJ3RpbWUnO1xuICAgIGNvbnN0IHN0YXRlID0gY29tcG9uZW50LnR5cGUgPT09ICdsaXN0J1xuICAgICAgPyB7IHBhZ2U6IDEsIHBhZ2VTaXplOiBMSVNUX0VYUE9SVF9ST1dTIH1cbiAgICAgIDogKGlzVGltZVNlcmllcyAmJiBmcmVxdWVuY3kgPyB7IGZyZXF1ZW5jeSB9IDoge30pO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEuY29tcG9uZW50RGF0YShyZXBvcnQuaWQsIGNvbXBvbmVudC5pZCwgZmlsdGVycywgc3RhdGUpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChkYXRhOiBDb21wb25lbnREYXRhKSA9PiAoeyBjb21wb25lbnQsIGRhdGEgfSkpLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKHsgY29tcG9uZW50LCBkYXRhOiBudWxsIH0pKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBcIlJlcG9ydCBQZXJpb2Q6IEp1biAxMiwgMjAyNSDigJMgSnVuIDEyLCAyMDI2XCIsIFwiT3JnYW5pemF0aW9uOiBBbG55bGFtIC0gQUhQLFxuICAvLyBBbG55bGFtIC0gUEgxXCIg4oCUIG9uZSBsaW5lIHBlciBmaWx0ZXIgZ3JvdXAgdGhhdCBoYXMgYW4gYWN0aXZlIHNlc3Npb24gdmFsdWUuXG4gIC8vXG4gIC8vIEEgc2VsZWN0IGdyb3VwIHN0b3JlcyBpZHMsIHNvIGl0cyBsaW5lIGhhcyB0byBiZSBuYW1lZCBvZmYgdGhlIG9wdGlvbiBsaXN0XG4gIC8vIGJlZm9yZSBpdCBjYW4gYmUgcHJpbnRlZDsgYSBkYXRlIG9yIGtleXdvcmQgZ3JvdXAgYWxyZWFkeSBob2xkcyBpdHMgb3duXG4gIC8vIGRpc3BsYXkgdmFsdWUgYW5kIHJlc29sdmVzIHN5bmNocm9ub3VzbHkuXG4gIHByaXZhdGUgX2ZpbHRlclN1bW1hcnkocmVwb3J0OiBSZXBvcnQpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgbGluZXM6IE9ic2VydmFibGU8c3RyaW5nPltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10pIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZmlsdGVyU3RhdGUudmFsdWUoZ3JvdXAuaWQpO1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGFiZWwgPSBncm91cC5sYWJlbCB8fCAnRmlsdGVyJztcblxuICAgICAgaWYgKHZhbHVlLnN0YXJ0IHx8IHZhbHVlLmVuZCkge1xuICAgICAgICBsaW5lcy5wdXNoKG9mKGAke2xhYmVsfTogJHt0aGlzLl9kYXRlKHZhbHVlLnN0YXJ0KX0g4oCTICR7dGhpcy5fZGF0ZSh2YWx1ZS5lbmQpfWApKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUudmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgICAgbGluZXMucHVzaCh0aGlzLl9zZWxlY3RMaW5lKGxhYmVsLCBncm91cCwgcmVwb3J0LmlkLCB2YWx1ZS52YWx1ZXMpKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUudmFsdWU/LnRyaW0oKSkge1xuICAgICAgICBsaW5lcy5wdXNoKG9mKGAke2xhYmVsfTogXCIke3ZhbHVlLnZhbHVlLnRyaW0oKX1cImApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgZ3JvdXAtYnkgZ3JhaW4sIHVuZGVyIHRoZSByZXBvcnQncyBvd24gbmFtZSBmb3IgdGhlIGNvbnRyb2wg4oCUIGEgY292ZXJcbiAgICAvLyBzaGVldCByZWFkaW5nIFwiRnJlcXVlbmN5XCIgd2hlbiB0aGUgcmVwb3J0IGNhbGxzIGl0IFwiUGVyaW9kXCIgZGVzY3JpYmVzIGFcbiAgICAvLyBjb250cm9sIHRoZSByZWFkZXIgY2Fubm90IGZpbmQgb24gc2NyZWVuLlxuICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCk7XG4gICAgaWYgKGdyYW51bGFyaXR5KSB7XG4gICAgICBjb25zdCBvcHRpb24gPSBHUkFOVUxBUklUWV9PUFRJT05TLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IGdyYW51bGFyaXR5KTtcbiAgICAgIGNvbnN0IGxhYmVsID0gcmVwb3J0LmNvbmZpZz8uZ3JvdXBCeT8ubGFiZWwgfHwgJ0dyb3VwIEJ5JztcbiAgICAgIGxpbmVzLnB1c2gob2YoYCR7bGFiZWx9OiAke29wdGlvbj8ubmFtZSA/PyBncmFudWxhcml0eX1gKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmxlbmd0aCA/IGZvcmtKb2luKGxpbmVzKSA6IG9mKFtdKTtcbiAgfVxuXG4gIC8vIE9uZSBzZWxlY3QgZ3JvdXAncyBsaW5lLCB3aXRoIGl0cyBzdG9yZWQgaWRzIHJlc29sdmVkIHRvIHRoZSBzYW1lIG5hbWVzIHRoZVxuICAvLyBvbi1zY3JlZW4gY2hpcHMgc2hvdyDigJQgYSBjb3ZlciByZWFkaW5nIFwiT3JnYW5pemF0aW9uOiA4Nzc0LCA4Nzc3XCIgdGVsbHMgdGhlXG4gIC8vIGNsaWVudCBub3RoaW5nIGFib3V0IHdoYXQgdGhlIHJlcG9ydCBjb3ZlcnMuXG4gIC8vXG4gIC8vIFVzZXMgdGhlIHJlcG9ydCBiYXIncyBvd24gbG9hZGVyIGFuZCByZXNvbHZlciBzbyB0aGUgdHdvIGNhbid0IGRyaWZ0LCB3aGljaFxuICAvLyBhbHNvIG1lYW5zIGEgdmFsdWUgd2hvc2UgZW50aXR5IHdhcyBkZWxldGVkIGtlZXBzIHNob3dpbmcgaXRzIHJhdyBpZCByYXRoZXJcbiAgLy8gdGhhbiBkcm9wcGluZyBvZmYgdGhlIGNvdmVyIGFuZCBzaWxlbnRseSB1bmRlcnN0YXRpbmcgdGhlIGZpbHRlci4gQSBmYWlsZWRcbiAgLy8gb3B0aW9uIGZldGNoIGRlZ3JhZGVzIHRoZSB3aG9sZSBsaW5lIHRvIGlkcyBmb3IgdGhlIHNhbWUgcmVhc29uOiBhbiBleHBvcnRcbiAgLy8gbXVzdCBuZXZlciBmYWlsIG9uIGEgY29zbWV0aWMgbG9va3VwLlxuICBwcml2YXRlIF9zZWxlY3RMaW5lKFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgdmFsdWVzOiB1bmtub3duW10sXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHJlc29sdmVPcHRpb25WYWx1ZXMobG9hZEdyb3VwT3B0aW9ucyhncm91cCwgdGhpcy5fcmVwb3J0RGF0YSwgcmVwb3J0SWQpLCB2YWx1ZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNvbHZlZCkgPT4gYCR7bGFiZWx9OiAke3Jlc29sdmVkLm1hcCgoaXRlbSkgPT4gaXRlbS5uYW1lKS5qb2luKCcsICcpfWApLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKGAke2xhYmVsfTogJHt2YWx1ZXMubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbSkpLmpvaW4oJywgJyl9YCkpLFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RhdGUodmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gJ+KApic7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0ZSA9IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IHZhbHVlIDogbmV3IERhdGUodmFsdWUpO1xuXG4gICAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyBTdHJpbmcodmFsdWUpIDogZm9ybWF0KGRhdGUsICdNTU0gZCwgeXl5eScpO1xuICB9XG59XG4iXX0=
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBRUwsbUJBQW1CLEdBS3BCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9GLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOztBQW9CbkYsc0VBQXNFO0FBQ3RFLGtEQUFrRDtBQUNsRCxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUU3QixnREFBZ0Q7QUFDaEQsRUFBRTtBQUNGLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsZ0ZBQWdGO0FBQ2hGLCtFQUErRTtBQUMvRSxZQUFZO0FBQ1osTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFFN0IscUVBQXFFO0FBQ3JFLEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLGdGQUFnRjtBQUNoRiwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLCtDQUErQztBQUMvQyxNQUFNLFVB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YmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZm9ya0pvaW4sIGZyb20sIG1hcCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1lcmdlTWFwLCB0b0FycmF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQge1xuICBDb21wb25lbnREYXRhLFxuICBHUkFOVUxBUklUWV9PUFRJT05TLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0RmlsdGVyR3JvdXAsXG4gIFJlcG9ydFBhZ2UsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBkYXRlQm91bmRMYWJlbCwgbG9hZEdyb3VwT3B0aW9ucywgcmVzb2x2ZU9wdGlvblZhbHVlcyB9IGZyb20gJy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcblxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3RlZENvbXBvbmVudCB7XG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50O1xuICBkYXRhOiBDb21wb25lbnREYXRhIHwgbnVsbDsgLy8gbnVsbCA9IGl0cyBxdWVyeSBmYWlsZWQ7IGV4cG9ydHMgc2hvdyBhIG5vdGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0ZWRQYWdlIHtcbiAgcGFnZTogUmVwb3J0UGFnZTtcbiAgY29tcG9uZW50czogQ29sbGVjdGVkQ29tcG9uZW50W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkUmVwb3J0IHtcbiAgcmVwb3J0OiBSZXBvcnQ7XG4gIHBhZ2VzOiBDb2xsZWN0ZWRQYWdlW107XG4gIC8vIEh1bWFuLXJlYWRhYmxlIGxpbmVzIGRlc2NyaWJpbmcgdGhlIGFjdGl2ZSBmaWx0ZXJzLCBmb3IgdGhlIHRpdGxlIHNsaWRlL3BhZ2UuXG4gIGZpbHRlclN1bW1hcnk6IHN0cmluZ1tdO1xufVxuXG4vLyBSb3dzIGZldGNoZWQgZm9yIGEgbGlzdCBjb21wb25lbnQncyBleHBvcnQgdGFibGUg4oCUIGVub3VnaCB0byBmaWxsIGFcbi8vIHNsaWRlL3BhZ2UgdGFibGU7IHRoZSBjYXAgbm90ZSBjb3ZlcnMgdGhlIHJlc3QuXG5jb25zdCBMSVNUX0VYUE9SVF9ST1dTID0gMTAwO1xuXG4vLyBIb3cgbWFueSB0aWxlIHF1ZXJpZXMgYW4gZXhwb3J0IHJ1bnMgYXQgb25jZS5cbi8vXG4vLyBOb3QgYSBwb2xpdGVuZXNzIHNldHRpbmcg4oCUIGl0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBkZWNrIGFuZCBhIGJyb2tlblxuLy8gb25lLiBUaGVzZSBxdWVyaWVzIGFyZSBoZWF2eSBhbmQgcmVhZCB0aGUgc2FtZSB0YWJsZXMsIHNvIGZpcmluZyBhbGwgb2YgdGhlbVxuLy8gdG9nZXRoZXIgcHV0cyBldmVyeSBvbmUgaW4gY29udGVudGlvbiBmb3IgdGhlIHNhbWUgZGF0YWJhc2UgYXQgdGhlIHNhbWVcbi8vIG1vbWVudCBhbmQgdGhleSBjcm9zcyB0aGUgc3RhdGVtZW50IGNlaWxpbmcgYXMgYSBncm91cDogbWVhc3VyZWQgb24gcmVwb3J0XG4vLyAyOCwgdGVuIHRpbGVzIHRoYXQgZWFjaCBhbnN3ZXIgaW4gOS0yNHMgcnVuIG9uZSBhZnRlciBhbm90aGVyIGFsbCBmYWlsZWQgYXRcbi8vIH4zMHMgd2hlbiByZWxlYXNlZCB0b2dldGhlci4gQ29uY3VycmVuY3kgYnV5cyB3YWxsLWNsb2NrIG9ubHkgdXAgdG8gdGhlIHBvaW50XG4vLyB3aGVyZSB0aGUgcXVlcmllcyBzdGFydCB0YWtpbmcgaXQgYmFjayBvZmYgZWFjaCBvdGhlciwgYW5kIHBhc3QgdGhhdCBpdCBidXlzXG4vLyBmYWlsdXJlcy5cbmNvbnN0IEVYUE9SVF9DT05DVVJSRU5DWSA9IDM7XG5cbi8vIFdoYXQgYSBjb21wb25lbnQgd2l0aCBub3RoaW5nIHRvIGRyYXcgcHJpbnRzIGluIHRoZSBleHBvcnRlZCBmaWxlLlxuLy9cbi8vIFRoZSB0d28gY2FzZXMgbXVzdCBub3QgcmVhZCBhbGlrZS4gQSB0aWxlIHRoYXQgcmV0dXJuZWQgbm8gcm93cyBpcyBhIGZpbmRpbmdcbi8vIGFib3V0IHRoZSBwZXJpb2Qg4oCUIHRoZSByZXBvcnQgd29ya2VkIGFuZCB0aGUgYW5zd2VyIGlzIFwibm9uZVwiLiBBIHRpbGUgd2hvc2Vcbi8vIHF1ZXJ5IGZhaWxlZCBpcyBhIGhvbGUgaW4gdGhlIGZpbGUsIGFuZCBjYWxsaW5nIHRoYXQgXCJEYXRhIHVuYXZhaWxhYmxlXCIgdGVsbHNcbi8vIHRoZSByZWFkZXIgdGhlIGRhdGEgZG9lcyBub3QgZXhpc3Qgd2hlbiB3aGF0IGhhcHBlbmVkIGlzIHRoYXQgbm9ib2R5IG1hbmFnZWRcbi8vIHRvIGFzayBmb3IgaXQuIFNoYXJlZCBieSBib3RoIHJlbmRlcmVycyBzbyB0aGUgUERGIGFuZCB0aGUgZGVjayBjYW5ub3QgZW5kIHVwXG4vLyBkZXNjcmliaW5nIHRoZSBzYW1lIGhvbGUgdHdvIGRpZmZlcmVudCB3YXlzLlxuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5TGFiZWwoaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGl0ZW0uZGF0YSA/ICdObyBkYXRhJyA6ICdDb3VsZCBub3QgYmUgZ2VuZXJhdGVkJztcbn1cblxuLy8gVGhlIHBhZ2VzIG9mIGEgY29sbGVjdGVkIHJlcG9ydCB0aGF0IGhhdmUgYXQgbGVhc3Qgb25lIHRpbGUgd2hvc2UgcXVlcnlcbi8vIGZhaWxlZCDigJQgd2hhdCB0aGUgZXhwb3J0IGdhdGUgbmFtZXMgdG8gdGhlIHVzZXIsIGFuZCB3aGF0IG1ha2VzIFwic29tZSBvZiB0aGlzXG4vLyBmaWxlIGlzIG1pc3NpbmdcIiBhIGZhY3QgdGhlIGNhbGxlciBjYW4gYWN0IG9uIHJhdGhlciB0aGFuIGEgdGhpbmcgdGhleSBub3RpY2Vcbi8vIGluIHRoZSBQREYgYWZ0ZXJ3YXJkcy5cbmV4cG9ydCBmdW5jdGlvbiBmYWlsZWRQYWdlTmFtZXMoY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQpOiBzdHJpbmdbXSB7XG4gIC8vIE51bWJlcmVkIGJlZm9yZSB0aGUgZmlsdGVyIOKAlCBhbiB1bm5hbWVkIHBhZ2UgNCB0aGF0IGZhaWxlZCBoYXMgdG8gcmVhZFxuICAvLyBcIlBhZ2UgNFwiLCBub3QgXCJQYWdlIDFcIiBiZWNhdXNlIGl0IGhhcHBlbmVkIHRvIGJlIHRoZSBmaXJzdCBmYWlsdXJlLlxuICByZXR1cm4gY29sbGVjdGVkLnBhZ2VzXG4gICAgLm1hcCgocGFnZSwgaW5kZXgpID0+ICh7IHBhZ2UsIG51bWJlcjogaW5kZXggKyAxIH0pKVxuICAgIC5maWx0ZXIoKHsgcGFnZSB9KSA9PiBwYWdlLmNvbXBvbmVudHMuc29tZSgoaXRlbSkgPT4gIWl0ZW0uZGF0YSkpXG4gICAgLm1hcCgoeyBwYWdlLCBudW1iZXIgfSkgPT4gcGFnZS5wYWdlLm5hbWUgfHwgYFBhZ2UgJHtudW1iZXJ9YCk7XG59XG5cbi8vIEdhdGhlcnMgZXZlcnl0aGluZyBhbiBleHBvcnQgbmVlZHM6IGV2ZXJ5IGNvbXBvbmVudCdzIGRhdGEgYWNyb3NzIEFMTCBwYWdlc1xuLy8gKHRoZSBjYW52YXMgb25seSByZW5kZXJzIHRoZSBhY3RpdmUgcGFnZSwgc28gZXhwb3J0cyBjYW4ndCBzY3JhcGUgdGhlXG4vLyBzY3JlZW4pLCBmZXRjaGVkIGZyZXNoIHdpdGggdGhlIHZpZXdlcidzIGN1cnJlbnQgZmlsdGVyIHN0YXRlLlxuLy9cbi8vIEEgZmFpbGVkIGNvbXBvbmVudCByZXNvbHZlcyB0byBhIG51bGwgYGRhdGFgIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIHdob2xlXG4vLyBjb2xsZWN0aW9uIOKAlCBidXQgdGhhdCBpcyBzbyB0aGUgY2FsbGVyIGNhbiBSRVBPUlQgd2hhdCBmYWlsZWQsIG5vdCBzbyBpdCBjYW5cbi8vIGJlIGlnbm9yZWQ6IHNlZSBmYWlsZWRQYWdlTmFtZXMoKSBhbmQgdGhlIGV4cG9ydCBnYXRlIHRoYXQgdXNlcyBpdC5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRFeHBvcnRDb2xsZWN0b3JTZXJ2aWNlIHtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xuXG4gIHB1YmxpYyBjb2xsZWN0KHJlcG9ydDogUmVwb3J0KTogT2JzZXJ2YWJsZTxDb2xsZWN0ZWRSZXBvcnQ+IHtcbiAgICBjb25zdCBzbG90czogeyBwYWdlSW5kZXg6IG51bWJlcjsgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQgfVtdID0gW107XG5cbiAgICByZXBvcnQucGFnZXMuZm9yRWFjaCgocGFnZSwgcGFnZUluZGV4KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBwYWdlLmNvbXBvbmVudHMpIHtcbiAgICAgICAgc2xvdHMucHVzaCh7IHBhZ2VJbmRleCwgY29tcG9uZW50IH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gUmVsZWFzZWQgYSBmZXcgYXQgYSB0aW1lIHJhdGhlciB0aGFuIGFsbCBhdCBvbmNlLiBtZXJnZU1hcCBjb21wbGV0ZXMgb3V0XG4gICAgLy8gb2Ygb3JkZXIsIHNvIGVhY2ggcmVzdWx0IGNhcnJpZXMgdGhlIHNsb3QgaXQgY2FtZSBmcm9tIGFuZCB0aGUgcm93cyBhcmVcbiAgICAvLyBmaWxlZCBieSBpbmRleCDigJQgdGhlIGRlY2sncyBwYWdlIG9yZGVyIGNhbid0IGRlcGVuZCBvbiB3aGljaCBxdWVyeVxuICAgIC8vIGhhcHBlbmVkIHRvIGZpbmlzaCBmaXJzdC5cbiAgICBjb25zdCBhbGwkID0gc2xvdHMubGVuZ3RoXG4gICAgICA/IGZyb20oc2xvdHMubWFwKChzbG90LCBpbmRleCkgPT4gKHsgc2xvdCwgaW5kZXggfSkpKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtZXJnZU1hcChcbiAgICAgICAgICAgICh7IHNsb3QsIGluZGV4IH0pID0+IHRoaXMuX2NvbXBvbmVudERhdGEocmVwb3J0LCBzbG90LmNvbXBvbmVudClcbiAgICAgICAgICAgICAgLnBpcGUobWFwKChpdGVtKSA9PiAoeyBpdGVtLCBpbmRleCB9KSkpLFxuICAgICAgICAgICAgRVhQT1JUX0NPTkNVUlJFTkNZLFxuICAgICAgICAgICksXG4gICAgICAgICAgdG9BcnJheSgpLFxuICAgICAgICApXG4gICAgICA6IG9mKFtdIGFzIHsgaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50OyBpbmRleDogbnVtYmVyIH1bXSk7XG5cbiAgICAvLyBUaGUgc3VtbWFyeSByaWRlcyBhbG9uZ3NpZGUgdGhlIGNvbXBvbmVudCBkYXRhIHJhdGhlciB0aGFuIGJlaW5nIGJ1aWx0IGF0XG4gICAgLy8gdGhlIGVuZCwgYmVjYXVzZSBuYW1pbmcgYSBzZWxlY3QgZmlsdGVyJ3MgdmFsdWVzIGlzIGl0c2VsZiBhIHJlcXVlc3QuXG4gICAgcmV0dXJuIGZvcmtKb2luKHsgY29sbGVjdGVkOiBhbGwkLCBmaWx0ZXJTdW1tYXJ5OiB0aGlzLl9maWx0ZXJTdW1tYXJ5KHJlcG9ydCkgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHsgY29sbGVjdGVkLCBmaWx0ZXJTdW1tYXJ5IH0pID0+IHtcbiAgICAgICAgICBjb25zdCBwYWdlczogQ29sbGVjdGVkUGFnZVtdID0gcmVwb3J0LnBhZ2VzLm1hcCgocGFnZSkgPT4gKHsgcGFnZSwgY29tcG9uZW50czogW10gfSkpO1xuXG4gICAgICAgICAgWy4uLmNvbGxlY3RlZF1cbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleClcbiAgICAgICAgICAgIC5mb3JFYWNoKCh7IGl0ZW0sIGluZGV4IH0pID0+IHtcbiAgICAgICAgICAgICAgcGFnZXNbc2xvdHNbaW5kZXhdLnBhZ2VJbmRleF0uY29tcG9uZW50cy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVwb3J0LFxuICAgICAgICAgICAgcGFnZXMsXG4gICAgICAgICAgICBmaWx0ZXJTdW1tYXJ5LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBvbmVudERhdGEocmVwb3J0OiBSZXBvcnQsIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogT2JzZXJ2YWJsZTxDb2xsZWN0ZWRDb21wb25lbnQ+IHtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpO1xuICAgIC8vIEEgdGltZS1zZXJpZXMgY2hhcnQgY2FycmllcyB0aGUgdmlld2VyJ3MgZ3JvdXAtYnkgZ3JhaW4gc28gdGhlIGV4cG9ydFxuICAgIC8vIHJlLWJ1Y2tldHMgZXhhY3RseSBhcyB0aGUgc2NyZWVuIGRvZXM7IGxpc3RzIGNhcnJ5IHRoZWlyIGV4cG9ydCBwYWdpbmcuXG4gICAgY29uc3QgZnJlcXVlbmN5ID0gdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCk7XG4gICAgY29uc3QgaXNUaW1lU2VyaWVzID0gY29tcG9uZW50LnR5cGUgPT09ICdjaGFydCcgJiYgY29tcG9uZW50LmNvbmZpZz8ueEF4aXM/LmtpbmQgPT09ICd0aW1lJztcbiAgICBjb25zdCBzdGF0ZSA9IGNvbXBvbmVudC50eXBlID09PSAnbGlzdCdcbiAgICAgID8geyBwYWdlOiAxLCBwYWdlU2l6ZTogTElTVF9FWFBPUlRfUk9XUyB9XG4gICAgICA6IChpc1RpbWVTZXJpZXMgJiYgZnJlcXVlbmN5ID8geyBmcmVxdWVuY3kgfSA6IHt9KTtcblxuICAgIC8vIGhhbmRsZXJzOiBmYWxzZSBrZWVwcyB0aGUgYXBwJ3MgZ2xvYmFsIGVycm9yIGRpYWxvZyBvdXQgb2YgdGhpcy4gQSBmYWlsZWRcbiAgICAvLyB0aWxlIGlzIHJlcG9ydGVkIG9uY2UsIGJ5IHRoZSBleHBvcnQgZ2F0ZSwgbmFtaW5nIHRoZSBwYWdlcyBpdCBjb3N0IOKAlFxuICAgIC8vIG5ldmVyIGFzIHRlbiBzdGFja2VkIG1vZGFscyBjYXJyeWluZyB0aGUgZGF0YWJhc2UncyBvd24gd29yZGluZy5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS5jb21wb25lbnREYXRhKHJlcG9ydC5pZCwgY29tcG9uZW50LmlkLCBmaWx0ZXJzLCBzdGF0ZSwgdHJ1ZSwgeyBoYW5kbGVyczogZmFsc2UgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGRhdGE6IENvbXBvbmVudERhdGEpID0+ICh7IGNvbXBvbmVudCwgZGF0YSB9KSksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoeyBjb21wb25lbnQsIGRhdGE6IG51bGwgfSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFwiUmVwb3J0IFBlcmlvZDogSnVuIDEyLCAyMDI1IOKAkyBKdW4gMTIsIDIwMjZcIiwgXCJPcmdhbml6YXRpb246IEFsbnlsYW0gLSBBSFAsXG4gIC8vIEFsbnlsYW0gLSBQSDFcIiDigJQgb25lIGxpbmUgcGVyIGZpbHRlciBncm91cCB0aGF0IGhhcyBhbiBhY3RpdmUgc2Vzc2lvbiB2YWx1ZS5cbiAgLy9cbiAgLy8gQSBzZWxlY3QgZ3JvdXAgc3RvcmVzIGlkcywgc28gaXRzIGxpbmUgaGFzIHRvIGJlIG5hbWVkIG9mZiB0aGUgb3B0aW9uIGxpc3RcbiAgLy8gYmVmb3JlIGl0IGNhbiBiZSBwcmludGVkOyBhIGRhdGUgb3Iga2V5d29yZCBncm91cCBhbHJlYWR5IGhvbGRzIGl0cyBvd25cbiAgLy8gZGlzcGxheSB2YWx1ZSBhbmQgcmVzb2x2ZXMgc3luY2hyb25vdXNseS5cbiAgcHJpdmF0ZSBfZmlsdGVyU3VtbWFyeShyZXBvcnQ6IFJlcG9ydCk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICBjb25zdCBsaW5lczogT2JzZXJ2YWJsZTxzdHJpbmc+W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9maWx0ZXJTdGF0ZS52YWx1ZShncm91cC5pZCk7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsYWJlbCA9IGdyb3VwLmxhYmVsIHx8ICdGaWx0ZXInO1xuXG4gICAgICBpZiAodmFsdWUuc3RhcnQgfHwgdmFsdWUuZW5kKSB7XG4gICAgICAgIGxpbmVzLnB1c2gob2YoYCR7bGFiZWx9OiAke3RoaXMuX2RhdGUodmFsdWUuc3RhcnQpfSDigJMgJHt0aGlzLl9kYXRlKHZhbHVlLmVuZCl9YCkpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZS52YWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgICBsaW5lcy5wdXNoKHRoaXMuX3NlbGVjdExpbmUobGFiZWwsIGdyb3VwLCByZXBvcnQuaWQsIHZhbHVlLnZhbHVlcykpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZS52YWx1ZT8udHJpbSgpKSB7XG4gICAgICAgIGxpbmVzLnB1c2gob2YoYCR7bGFiZWx9OiBcIiR7dmFsdWUudmFsdWUudHJpbSgpfVwiYCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBncm91cC1ieSBncmFpbiwgdW5kZXIgdGhlIHJlcG9ydCdzIG93biBuYW1lIGZvciB0aGUgY29udHJvbCDigJQgYSBjb3ZlclxuICAgIC8vIHNoZWV0IHJlYWRpbmcgXCJGcmVxdWVuY3lcIiB3aGVuIHRoZSByZXBvcnQgY2FsbHMgaXQgXCJQZXJpb2RcIiBkZXNjcmliZXMgYVxuICAgIC8vIGNvbnRyb2wgdGhlIHJlYWRlciBjYW5ub3QgZmluZCBvbiBzY3JlZW4uXG4gICAgY29uc3QgZ3JhbnVsYXJpdHkgPSB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3koKTtcbiAgICBpZiAoZ3JhbnVsYXJpdHkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IEdSQU5VTEFSSVRZX09QVElPTlMuZmluZCgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gZ3JhbnVsYXJpdHkpO1xuICAgICAgY29uc3QgbGFiZWwgPSByZXBvcnQuY29uZmlnPy5ncm91cEJ5Py5sYWJlbCB8fCAnR3JvdXAgQnknO1xuICAgICAgbGluZXMucHVzaChvZihgJHtsYWJlbH06ICR7b3B0aW9uPy5uYW1lID8/IGdyYW51bGFyaXR5fWApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXMubGVuZ3RoID8gZm9ya0pvaW4obGluZXMpIDogb2YoW10pO1xuICB9XG5cbiAgLy8gT25lIHNlbGVjdCBncm91cCdzIGxpbmUsIHdpdGggaXRzIHN0b3JlZCBpZHMgcmVzb2x2ZWQgdG8gdGhlIHNhbWUgbmFtZXMgdGhlXG4gIC8vIG9uLXNjcmVlbiBjaGlwcyBzaG93IOKAlCBhIGNvdmVyIHJlYWRpbmcgXCJPcmdhbml6YXRpb246IDg3NzQsIDg3NzdcIiB0ZWxscyB0aGVcbiAgLy8gY2xpZW50IG5vdGhpbmcgYWJvdXQgd2hhdCB0aGUgcmVwb3J0IGNvdmVycy5cbiAgLy9cbiAgLy8gVXNlcyB0aGUgcmVwb3J0IGJhcidzIG93biBsb2FkZXIgYW5kIHJlc29sdmVyIHNvIHRoZSB0d28gY2FuJ3QgZHJpZnQsIHdoaWNoXG4gIC8vIGFsc28gbWVhbnMgYSB2YWx1ZSB3aG9zZSBlbnRpdHkgd2FzIGRlbGV0ZWQga2VlcHMgc2hvd2luZyBpdHMgcmF3IGlkIHJhdGhlclxuICAvLyB0aGFuIGRyb3BwaW5nIG9mZiB0aGUgY292ZXIgYW5kIHNpbGVudGx5IHVuZGVyc3RhdGluZyB0aGUgZmlsdGVyLiBBIGZhaWxlZFxuICAvLyBvcHRpb24gZmV0Y2ggZGVncmFkZXMgdGhlIHdob2xlIGxpbmUgdG8gaWRzIGZvciB0aGUgc2FtZSByZWFzb246IGFuIGV4cG9ydFxuICAvLyBtdXN0IG5ldmVyIGZhaWwgb24gYSBjb3NtZXRpYyBsb29rdXAuXG4gIHByaXZhdGUgX3NlbGVjdExpbmUoXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICB2YWx1ZXM6IHVua25vd25bXSxcbiAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gcmVzb2x2ZU9wdGlvblZhbHVlcyhsb2FkR3JvdXBPcHRpb25zKGdyb3VwLCB0aGlzLl9yZXBvcnREYXRhLCByZXBvcnRJZCksIHZhbHVlcylcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc29sdmVkKSA9PiBgJHtsYWJlbH06ICR7cmVzb2x2ZWQubWFwKChpdGVtKSA9PiBpdGVtLm5hbWUpLmpvaW4oJywgJyl9YCksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoYCR7bGFiZWx9OiAke3ZhbHVlcy5tYXAoKGl0ZW0pID0+IFN0cmluZyhpdGVtKSkuam9pbignLCAnKX1gKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gUmVuZGVyZWQgb2ZmIHRoZSBzYW1lIGNhbGVuZGFyIGRheSB0aGUgZmlsdGVyIHNlbmRzIHRvIHRoZSBzZXJ2ZXIsIHNvIHRoZVxuICAvLyBjb3ZlcidzIHBlcmlvZCBpcyB0aGUgcGVyaW9kIHRoZSBudW1iZXJzIGJlaGluZCBpdCB3ZXJlIHF1ZXJpZWQgZm9yLlxuICBwcml2YXRlIF9kYXRlKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRhdGVCb3VuZExhYmVsKHZhbHVlKSA/PyAn4oCmJztcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import { FsPrompt } from '@firestitch/prompt';
|
|
3
|
+
import { EMPTY, from, of } from 'rxjs';
|
|
4
|
+
import { catchError, switchMap } from 'rxjs/operators';
|
|
5
|
+
import { ReportExportCollectorService, failedPageNames } from './report-export-collector.service';
|
|
6
|
+
import { ReportPdfService } from './report-pdf.service';
|
|
7
|
+
import { ReportPptxService } from './report-pptx.service';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
// What the user chose when told the export is incomplete. Retry re-runs the
|
|
10
|
+
// whole collection — the queries that failed were killed on a clock, not on
|
|
11
|
+
// anything about the data, so a second attempt against a warmed database
|
|
12
|
+
// genuinely often succeeds.
|
|
13
|
+
const RETRY = 'retry';
|
|
14
|
+
const DOWNLOAD = 'download';
|
|
15
|
+
// Runs a report export end to end: collect every tile, refuse to write a file
|
|
16
|
+
// that is missing any of them without saying so, then render.
|
|
17
|
+
//
|
|
18
|
+
// The gate is the reason this sits between the collector and the renderers
|
|
19
|
+
// rather than in either of them. A deck with five blank pages is worse than no
|
|
20
|
+
// deck: it looks finished, so it gets emailed to a client, and the pages that
|
|
21
|
+
// are missing are exactly the ones nobody thinks to check. The renderers can
|
|
22
|
+
// only describe a hole they are handed; the collector only knows one tile at a
|
|
23
|
+
// time. Whether the FILE should exist is a decision about the whole report, and
|
|
24
|
+
// this is the only place that sees it.
|
|
25
|
+
export class ReportExportService {
|
|
26
|
+
_collector = inject(ReportExportCollectorService);
|
|
27
|
+
_pdfService = inject(ReportPdfService);
|
|
28
|
+
_pptxService = inject(ReportPptxService);
|
|
29
|
+
_prompt = inject(FsPrompt);
|
|
30
|
+
pdf(report) {
|
|
31
|
+
return this._run(report, (collected) => this._pdfService.export(collected));
|
|
32
|
+
}
|
|
33
|
+
powerpoint(report) {
|
|
34
|
+
return this._run(report, (collected) => this._pptxService.export(collected));
|
|
35
|
+
}
|
|
36
|
+
// Retry re-collects the WHOLE report, not just the tiles that failed. Every
|
|
37
|
+
// number in one file has to have been true at one moment: refetching four
|
|
38
|
+
// tiles and keeping nine from three minutes ago produces a deck whose pages
|
|
39
|
+
// disagree with each other, and nothing on it would say so.
|
|
40
|
+
_run(report, render) {
|
|
41
|
+
return this._collector.collect(report)
|
|
42
|
+
.pipe(switchMap((collected) => this._gate(collected)
|
|
43
|
+
.pipe(switchMap((choice) => choice === RETRY
|
|
44
|
+
? this._run(report, render)
|
|
45
|
+
: from(render(collected))))));
|
|
46
|
+
}
|
|
47
|
+
// Resolves to DOWNLOAD when the export is whole (or the user accepted an
|
|
48
|
+
// incomplete one) and to RETRY when they want another attempt. Cancelling
|
|
49
|
+
// ends the export quietly: EMPTY completes without emitting, so nothing
|
|
50
|
+
// renders and no error surfaces — they know what they just declined.
|
|
51
|
+
_gate(collected) {
|
|
52
|
+
const failed = failedPageNames(collected);
|
|
53
|
+
if (!failed.length) {
|
|
54
|
+
return of(DOWNLOAD);
|
|
55
|
+
}
|
|
56
|
+
const pages = failed.length === 1
|
|
57
|
+
? `<strong>${failed[0]}</strong> could not be generated`
|
|
58
|
+
: `${failed.length} pages could not be generated: <strong>${failed.join('</strong>, <strong>')}</strong>`;
|
|
59
|
+
return this._prompt.confirm({
|
|
60
|
+
title: 'Export is incomplete',
|
|
61
|
+
template: `${pages}. This usually means those tiles took too long to load. `
|
|
62
|
+
+ 'Retry, or download the file with those pages marked as missing.',
|
|
63
|
+
buttons: [
|
|
64
|
+
{ label: 'Retry', value: RETRY, color: 'primary' },
|
|
65
|
+
{ label: 'Download Anyway', value: DOWNLOAD, color: '' },
|
|
66
|
+
{ label: 'Cancel', cancel: true, color: '' },
|
|
67
|
+
],
|
|
68
|
+
})
|
|
69
|
+
.pipe(catchError(() => EMPTY));
|
|
70
|
+
}
|
|
71
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
72
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportService });
|
|
73
|
+
}
|
|
74
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportService, decorators: [{
|
|
75
|
+
type: Injectable
|
|
76
|
+
}] });
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtZXhwb3J0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxLQUFLLEVBQWMsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3ZELE9BQU8sRUFBbUIsNEJBQTRCLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBRzFELDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLDRCQUE0QjtBQUM1QixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7QUFDdEIsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDO0FBRTVCLDhFQUE4RTtBQUM5RSw4REFBOEQ7QUFDOUQsRUFBRTtBQUNGLDJFQUEyRTtBQUMzRSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLHVDQUF1QztBQUV2QyxNQUFNLE9BQU8sbUJBQW1CO0lBRXRCLFVBQVUsR0FBRyxNQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUNsRCxXQUFXLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdkMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFNUIsR0FBRyxDQUFDLE1BQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU0sVUFBVSxDQUFDLE1BQWM7UUFDOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLDBFQUEwRTtJQUMxRSw0RUFBNEU7SUFDNUUsNERBQTREO0lBQ3BELElBQUksQ0FBQyxNQUFjLEVBQUUsTUFBcUQ7UUFDaEYsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7YUFDbkMsSUFBSSxDQUNILFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7YUFDM0MsSUFBSSxDQUNILFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxLQUFLLEtBQUs7WUFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztZQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQzdCLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVELHlFQUF5RTtJQUN6RSwwRUFBMEU7SUFDMUUsd0VBQXdFO0lBQ3hFLHFFQUFxRTtJQUM3RCxLQUFLLENBQUMsU0FBMEI7UUFDdEMsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEIsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUMvQixDQUFDLENBQUMsV0FBVyxNQUFNLENBQUMsQ0FBQyxDQUFDLGtDQUFrQztZQUN4RCxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSwwQ0FBMEMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUM7UUFFNUcsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUMxQixLQUFLLEVBQUUsc0JBQXNCO1lBQzdCLFFBQVEsRUFBRSxHQUFHLEtBQUssMERBQTBEO2tCQUN4RSxpRUFBaUU7WUFDckUsT0FBTyxFQUFFO2dCQUNQLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7Z0JBQ2xELEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtnQkFDeEQsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTthQUM3QztTQUNGLENBQUM7YUFDQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbkMsQ0FBQzt3R0F4RFUsbUJBQW1COzRHQUFuQixtQkFBbUI7OzRGQUFuQixtQkFBbUI7a0JBRC9CLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuXG5pbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSwgZnJvbSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVwb3J0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbGxlY3RlZFJlcG9ydCwgUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSwgZmFpbGVkUGFnZU5hbWVzIH0gZnJvbSAnLi9yZXBvcnQtZXhwb3J0LWNvbGxlY3Rvci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFBkZlNlcnZpY2UgfSBmcm9tICcuL3JlcG9ydC1wZGYuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRQcHR4U2VydmljZSB9IGZyb20gJy4vcmVwb3J0LXBwdHguc2VydmljZSc7XG5cblxuLy8gV2hhdCB0aGUgdXNlciBjaG9zZSB3aGVuIHRvbGQgdGhlIGV4cG9ydCBpcyBpbmNvbXBsZXRlLiBSZXRyeSByZS1ydW5zIHRoZVxuLy8gd2hvbGUgY29sbGVjdGlvbiDigJQgdGhlIHF1ZXJpZXMgdGhhdCBmYWlsZWQgd2VyZSBraWxsZWQgb24gYSBjbG9jaywgbm90IG9uXG4vLyBhbnl0aGluZyBhYm91dCB0aGUgZGF0YSwgc28gYSBzZWNvbmQgYXR0ZW1wdCBhZ2FpbnN0IGEgd2FybWVkIGRhdGFiYXNlXG4vLyBnZW51aW5lbHkgb2Z0ZW4gc3VjY2VlZHMuXG5jb25zdCBSRVRSWSA9ICdyZXRyeSc7XG5jb25zdCBET1dOTE9BRCA9ICdkb3dubG9hZCc7XG5cbi8vIFJ1bnMgYSByZXBvcnQgZXhwb3J0IGVuZCB0byBlbmQ6IGNvbGxlY3QgZXZlcnkgdGlsZSwgcmVmdXNlIHRvIHdyaXRlIGEgZmlsZVxuLy8gdGhhdCBpcyBtaXNzaW5nIGFueSBvZiB0aGVtIHdpdGhvdXQgc2F5aW5nIHNvLCB0aGVuIHJlbmRlci5cbi8vXG4vLyBUaGUgZ2F0ZSBpcyB0aGUgcmVhc29uIHRoaXMgc2l0cyBiZXR3ZWVuIHRoZSBjb2xsZWN0b3IgYW5kIHRoZSByZW5kZXJlcnNcbi8vIHJhdGhlciB0aGFuIGluIGVpdGhlciBvZiB0aGVtLiBBIGRlY2sgd2l0aCBmaXZlIGJsYW5rIHBhZ2VzIGlzIHdvcnNlIHRoYW4gbm9cbi8vIGRlY2s6IGl0IGxvb2tzIGZpbmlzaGVkLCBzbyBpdCBnZXRzIGVtYWlsZWQgdG8gYSBjbGllbnQsIGFuZCB0aGUgcGFnZXMgdGhhdFxuLy8gYXJlIG1pc3NpbmcgYXJlIGV4YWN0bHkgdGhlIG9uZXMgbm9ib2R5IHRoaW5rcyB0byBjaGVjay4gVGhlIHJlbmRlcmVycyBjYW5cbi8vIG9ubHkgZGVzY3JpYmUgYSBob2xlIHRoZXkgYXJlIGhhbmRlZDsgdGhlIGNvbGxlY3RvciBvbmx5IGtub3dzIG9uZSB0aWxlIGF0IGFcbi8vIHRpbWUuIFdoZXRoZXIgdGhlIEZJTEUgc2hvdWxkIGV4aXN0IGlzIGEgZGVjaXNpb24gYWJvdXQgdGhlIHdob2xlIHJlcG9ydCwgYW5kXG4vLyB0aGlzIGlzIHRoZSBvbmx5IHBsYWNlIHRoYXQgc2VlcyBpdC5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRFeHBvcnRTZXJ2aWNlIHtcblxuICBwcml2YXRlIF9jb2xsZWN0b3IgPSBpbmplY3QoUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSk7XG4gIHByaXZhdGUgX3BkZlNlcnZpY2UgPSBpbmplY3QoUmVwb3J0UGRmU2VydmljZSk7XG4gIHByaXZhdGUgX3BwdHhTZXJ2aWNlID0gaW5qZWN0KFJlcG9ydFBwdHhTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfcHJvbXB0ID0gaW5qZWN0KEZzUHJvbXB0KTtcblxuICBwdWJsaWMgcGRmKHJlcG9ydDogUmVwb3J0KTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuX3J1bihyZXBvcnQsIChjb2xsZWN0ZWQpID0+IHRoaXMuX3BkZlNlcnZpY2UuZXhwb3J0KGNvbGxlY3RlZCkpO1xuICB9XG5cbiAgcHVibGljIHBvd2VycG9pbnQocmVwb3J0OiBSZXBvcnQpOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5fcnVuKHJlcG9ydCwgKGNvbGxlY3RlZCkgPT4gdGhpcy5fcHB0eFNlcnZpY2UuZXhwb3J0KGNvbGxlY3RlZCkpO1xuICB9XG5cbiAgLy8gUmV0cnkgcmUtY29sbGVjdHMgdGhlIFdIT0xFIHJlcG9ydCwgbm90IGp1c3QgdGhlIHRpbGVzIHRoYXQgZmFpbGVkLiBFdmVyeVxuICAvLyBudW1iZXIgaW4gb25lIGZpbGUgaGFzIHRvIGhhdmUgYmVlbiB0cnVlIGF0IG9uZSBtb21lbnQ6IHJlZmV0Y2hpbmcgZm91clxuICAvLyB0aWxlcyBhbmQga2VlcGluZyBuaW5lIGZyb20gdGhyZWUgbWludXRlcyBhZ28gcHJvZHVjZXMgYSBkZWNrIHdob3NlIHBhZ2VzXG4gIC8vIGRpc2FncmVlIHdpdGggZWFjaCBvdGhlciwgYW5kIG5vdGhpbmcgb24gaXQgd291bGQgc2F5IHNvLlxuICBwcml2YXRlIF9ydW4ocmVwb3J0OiBSZXBvcnQsIHJlbmRlcjogKGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KSA9PiBQcm9taXNlPHZvaWQ+KTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rvci5jb2xsZWN0KHJlcG9ydClcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGNvbGxlY3RlZCkgPT4gdGhpcy5fZ2F0ZShjb2xsZWN0ZWQpXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKGNob2ljZSkgPT4gY2hvaWNlID09PSBSRVRSWVxuICAgICAgICAgICAgICA/IHRoaXMuX3J1bihyZXBvcnQsIHJlbmRlcilcbiAgICAgICAgICAgICAgOiBmcm9tKHJlbmRlcihjb2xsZWN0ZWQpKSksXG4gICAgICAgICAgKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gUmVzb2x2ZXMgdG8gRE9XTkxPQUQgd2hlbiB0aGUgZXhwb3J0IGlzIHdob2xlIChvciB0aGUgdXNlciBhY2NlcHRlZCBhblxuICAvLyBpbmNvbXBsZXRlIG9uZSkgYW5kIHRvIFJFVFJZIHdoZW4gdGhleSB3YW50IGFub3RoZXIgYXR0ZW1wdC4gQ2FuY2VsbGluZ1xuICAvLyBlbmRzIHRoZSBleHBvcnQgcXVpZXRseTogRU1QVFkgY29tcGxldGVzIHdpdGhvdXQgZW1pdHRpbmcsIHNvIG5vdGhpbmdcbiAgLy8gcmVuZGVycyBhbmQgbm8gZXJyb3Igc3VyZmFjZXMg4oCUIHRoZXkga25vdyB3aGF0IHRoZXkganVzdCBkZWNsaW5lZC5cbiAgcHJpdmF0ZSBfZ2F0ZShjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgY29uc3QgZmFpbGVkID0gZmFpbGVkUGFnZU5hbWVzKGNvbGxlY3RlZCk7XG4gICAgaWYgKCFmYWlsZWQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gb2YoRE9XTkxPQUQpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VzID0gZmFpbGVkLmxlbmd0aCA9PT0gMVxuICAgICAgPyBgPHN0cm9uZz4ke2ZhaWxlZFswXX08L3N0cm9uZz4gY291bGQgbm90IGJlIGdlbmVyYXRlZGBcbiAgICAgIDogYCR7ZmFpbGVkLmxlbmd0aH0gcGFnZXMgY291bGQgbm90IGJlIGdlbmVyYXRlZDogPHN0cm9uZz4ke2ZhaWxlZC5qb2luKCc8L3N0cm9uZz4sIDxzdHJvbmc+Jyl9PC9zdHJvbmc+YDtcblxuICAgIHJldHVybiB0aGlzLl9wcm9tcHQuY29uZmlybSh7XG4gICAgICB0aXRsZTogJ0V4cG9ydCBpcyBpbmNvbXBsZXRlJyxcbiAgICAgIHRlbXBsYXRlOiBgJHtwYWdlc30uIFRoaXMgdXN1YWxseSBtZWFucyB0aG9zZSB0aWxlcyB0b29rIHRvbyBsb25nIHRvIGxvYWQuIGBcbiAgICAgICAgKyAnUmV0cnksIG9yIGRvd25sb2FkIHRoZSBmaWxlIHdpdGggdGhvc2UgcGFnZXMgbWFya2VkIGFzIG1pc3NpbmcuJyxcbiAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ1JldHJ5JywgdmFsdWU6IFJFVFJZLCBjb2xvcjogJ3ByaW1hcnknIH0sXG4gICAgICAgIHsgbGFiZWw6ICdEb3dubG9hZCBBbnl3YXknLCB2YWx1ZTogRE9XTkxPQUQsIGNvbG9yOiAnJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQ2FuY2VsJywgY2FuY2VsOiB0cnVlLCBjb2xvcjogJycgfSxcbiAgICAgIF0sXG4gICAgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gRU1QVFkpKTtcbiAgfVxufVxuIl19
|