@firestitch/report 18.17.1 → 18.17.2
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/data/report.data.d.ts +0 -2
- package/app/reports/export/report-export-collector.service.d.ts +6 -0
- package/app/reports/export/report-export.service.d.ts +1 -0
- package/app/reports/export/report-pdf.service.d.ts +5 -0
- package/esm2022/app/reports/data/report.data.mjs +3 -3
- package/esm2022/app/reports/export/report-export-collector.service.mjs +1 -1
- package/esm2022/app/reports/export/report-export.service.mjs +31 -5
- package/esm2022/app/reports/export/report-pdf.service.mjs +212 -80
- package/esm2022/app/reports/export/report-pptx.service.mjs +4 -1
- package/fesm2022/{firestitch-report-echarts-rzMA7zhn.mjs → firestitch-report-echarts-CBoGhanh.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-rzMA7zhn.mjs.map → firestitch-report-echarts-CBoGhanh.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-DRkNBMic.mjs → firestitch-report-firestitch-report-MBuBuGiA.mjs} +250 -89
- package/fesm2022/firestitch-report-firestitch-report-MBuBuGiA.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/fesm2022/firestitch-report-firestitch-report-DRkNBMic.mjs.map +0 -1
|
@@ -68,12 +68,10 @@ export declare class ReportData<T = any> {
|
|
|
68
68
|
type?: string;
|
|
69
69
|
label?: string;
|
|
70
70
|
level?: string;
|
|
71
|
-
optionsSql?: string;
|
|
72
71
|
groupId?: number;
|
|
73
72
|
}, config?: RequestConfig): Observable<T>;
|
|
74
73
|
updateFilter(reportId: number, filterId: number, changes: {
|
|
75
74
|
label?: string;
|
|
76
|
-
optionsSql?: string;
|
|
77
75
|
enabled?: boolean;
|
|
78
76
|
}, config?: RequestConfig): Observable<T>;
|
|
79
77
|
deleteFilter(reportId: number, filterId: number, config?: RequestConfig): Observable<T>;
|
|
@@ -43,9 +43,15 @@ export interface TextOverflow {
|
|
|
43
43
|
page: string;
|
|
44
44
|
snippet: string;
|
|
45
45
|
}
|
|
46
|
+
export interface UndrawnComponent {
|
|
47
|
+
componentId: number;
|
|
48
|
+
page: string;
|
|
49
|
+
name: string;
|
|
50
|
+
}
|
|
46
51
|
export interface BuiltExport {
|
|
47
52
|
overflows: TextOverflow[];
|
|
48
53
|
overflowNote: string;
|
|
54
|
+
undrawn: UndrawnComponent[];
|
|
49
55
|
save: () => void | Promise<void>;
|
|
50
56
|
}
|
|
51
57
|
export type ExportListColumn = ListColumn & {
|
|
@@ -11,6 +11,7 @@ export declare class ReportExportService {
|
|
|
11
11
|
private _run;
|
|
12
12
|
private _buildAndSave;
|
|
13
13
|
private _failureGate;
|
|
14
|
+
private _undrawnGate;
|
|
14
15
|
private _overflowGate;
|
|
15
16
|
static ɵfac: i0.ɵɵFactoryDeclaration<ReportExportService, never>;
|
|
16
17
|
static ɵprov: i0.ɵɵInjectableDeclaration<ReportExportService>;
|
|
@@ -6,6 +6,8 @@ export declare class ReportPdfService {
|
|
|
6
6
|
build(collected: CollectedReport): Promise<BuiltExport>;
|
|
7
7
|
private _context;
|
|
8
8
|
private _renderPage;
|
|
9
|
+
private _guarded;
|
|
10
|
+
private _undrawnBox;
|
|
9
11
|
private _renderMaster;
|
|
10
12
|
private _recordOverflow;
|
|
11
13
|
private _titlePage;
|
|
@@ -39,10 +41,13 @@ export declare class ReportPdfService {
|
|
|
39
41
|
private _tableOptions;
|
|
40
42
|
private _noticeRow;
|
|
41
43
|
private _measure;
|
|
44
|
+
private _fittingRows;
|
|
42
45
|
private _scratchDocument;
|
|
43
46
|
private _drawTable;
|
|
44
47
|
private _renderContinuation;
|
|
45
48
|
private _renderContinuationMasters;
|
|
49
|
+
private _continuationMargins;
|
|
50
|
+
private _continuationRoom;
|
|
46
51
|
private _continuationMargin;
|
|
47
52
|
private _continuedTitle;
|
|
48
53
|
private _renderKpi;
|
|
@@ -315,14 +315,14 @@ export class ReportData {
|
|
|
315
315
|
}
|
|
316
316
|
// Make one column filterable. `level` (component | report) places a new
|
|
317
317
|
// group; `groupId` instead links into an existing group. A select filter's
|
|
318
|
-
// options are derived from the component
|
|
318
|
+
// options are derived from the component's own query.
|
|
319
319
|
addFilter(reportId, componentId, filter, config = {}) {
|
|
320
320
|
return this._api.post(this._path(`${reportId}/components/${componentId}/filters`), filter, {
|
|
321
321
|
key: 'filter',
|
|
322
322
|
...config,
|
|
323
323
|
});
|
|
324
324
|
}
|
|
325
|
-
// Update a filter — any subset of { label,
|
|
325
|
+
// Update a filter — any subset of { label, enabled }.
|
|
326
326
|
updateFilter(reportId, filterId, changes, config = {}) {
|
|
327
327
|
return this._api.put(this._path(`${reportId}/filters/${filterId}`), changes, {
|
|
328
328
|
key: 'filter',
|
|
@@ -480,4 +480,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
480
480
|
providedIn: 'root',
|
|
481
481
|
}]
|
|
482
482
|
}] });
|
|
483
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGF0YS9yZXBvcnQuZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsS0FBSyxFQUFpQixhQUFhLEVBQWUsTUFBTSxpQkFBaUIsQ0FBQztBQXNCbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQUc1RCwyRUFBMkU7QUFDM0UsOEVBQThFO0FBQzlFLHFGQUFxRjtBQUlyRixNQUFNLE9BQU8sVUFBVTtJQUNiLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFN0IsNkVBQTZFO0lBQzdFLDhFQUE4RTtJQUN2RSxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBRTVCLGtGQUFrRjtJQUNsRixrREFBa0Q7SUFDMUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFO1FBQ3ZCLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDL0QsQ0FBQztJQUVNLE9BQU8sQ0FBQyxRQUFhLEVBQUUsRUFBRSxTQUF3QixFQUFFO1FBQ3hELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFDWixLQUFLLEVBQ0w7WUFDRSxHQUFHLEVBQUUsU0FBUztZQUNkLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsNEVBQTRFO0lBQzVFLDhFQUE4RTtJQUN2RSxJQUFJLENBQUMsUUFBYSxFQUFFLEVBQUUsU0FBd0IsRUFBRTtRQUNyRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxFQUFFLEVBQ1osS0FBSyxFQUNMLE1BQU0sQ0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVNLE1BQU0sQ0FBQyxJQUFZLEVBQUUsaUJBQXlCLElBQUksRUFBRSxTQUF3QixFQUFFO1FBQ25GLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFDWixFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsRUFDeEI7WUFDRSxHQUFHLEVBQUUsUUFBUTtZQUNiLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUseUVBQXlFO0lBQ3pFLDRCQUE0QjtJQUNyQixVQUFVLENBQUMsUUFBZ0IsRUFBRSxjQUE2QixFQUFFLFNBQXdCLEVBQUU7UUFDM0YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQ3pCLEVBQUUsY0FBYyxFQUFFLEVBQ2xCO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRU0sWUFBWSxDQUNqQixJQUFZLEVBQ1osdUJBQStCLElBQUksRUFDbkMsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUNyQixFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxFQUM5QjtZQUNFLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDhFQUE4RTtJQUM5RSw0RUFBNEU7SUFDckUsWUFBWSxDQUNqQixjQUFzQixFQUN0QixNQUErQixFQUMvQixTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxjQUFjLEVBQUUsQ0FBQyxFQUN2QyxNQUFNLEVBQ047WUFDRSxHQUFHLEVBQUUsUUFBUTtZQUNiLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsZ0RBQWdEO0lBQ3pDLFlBQVksQ0FBQyxjQUFzQixFQUFFLFNBQXdCLEVBQUU7UUFDcEUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLGNBQWMsRUFBRSxDQUFDLEVBQ3ZDLEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UsOEJBQThCO0lBQ3ZCLGNBQWMsQ0FBQyxjQUFzQixFQUFFLFNBQXdCLEVBQUU7UUFDdEUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLGNBQWMsV0FBVyxDQUFDLEVBQ2hELEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLE1BQU0sQ0FBQyxRQUFnQixFQUFFLElBQVksRUFBRSxTQUF3QixFQUFFO1FBQ3RFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUN6QixFQUFFLElBQUksRUFBRSxFQUNSO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDhEQUE4RDtJQUM5RCxvRUFBb0U7SUFDcEUsc0VBQXNFO0lBQ3RFLDRFQUE0RTtJQUM1RSx3RUFBd0U7SUFDeEUsZ0VBQWdFO0lBQ3pELE1BQU0sQ0FBQyxRQUFnQixFQUFFLFFBQWlDLEVBQUUsU0FBd0IsRUFBRTtRQUMzRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFDekIsUUFBUSxFQUNSO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsK0RBQStEO0lBQ3hELE9BQU8sQ0FBQyxRQUFnQixFQUFFLFNBQXdCLEVBQUU7UUFDekQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsUUFBUSxDQUFDLEVBQy9CLEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxNQUFNO1lBQ1gsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHdFQUF3RTtJQUN4RSx5RUFBeUU7SUFDekUsa0VBQWtFO0lBQzNELFVBQVUsQ0FDZixRQUFnQixFQUNoQixNQUFjLEVBQ2QsSUFBK0MsRUFDL0MsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxVQUFVLE1BQU0sRUFBRSxDQUFDLEVBQ3pDLElBQUksRUFDSjtZQUNFLEdBQUcsRUFBRSxNQUFNO1lBQ1gsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHVFQUF1RTtJQUN2RSwyRUFBMkU7SUFDM0UsYUFBYTtJQUNOLFVBQVUsQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBRSxTQUF3QixFQUFFO1FBQzVFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFVBQVUsTUFBTSxFQUFFLENBQUMsRUFDekMsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLE1BQU07WUFDWCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLG9FQUFvRTtJQUM3RCxpQkFBaUIsQ0FDdEIsUUFBZ0IsRUFDaEIsU0FBOEMsRUFDOUMsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxrQkFBa0IsQ0FBQyxFQUN6QyxFQUFFLFNBQVMsRUFBRSxFQUNiO1lBQ0UsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDZFQUE2RTtJQUM3RSxvRUFBb0U7SUFDN0QsZUFBZSxDQUNwQixRQUFnQixFQUNoQixXQUFtQixFQUNuQixRQUFpQyxFQUNqQyxTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGVBQWUsV0FBVyxXQUFXLENBQUMsRUFDNUQsUUFBUSxFQUNSO1lBQ0UsR0FBRyxFQUFFLFdBQVc7WUFDaEIsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHlFQUF5RTtJQUN6RSw0RUFBNEU7SUFDNUUsMkRBQTJEO0lBQ3BELE9BQU8sQ0FDWixRQUFnQixFQUNoQixJQUFvRixFQUNwRixTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGFBQWEsQ0FBQyxFQUNwQyxJQUFJLEVBQ0o7WUFDRSxHQUFHLEVBQUUsV0FBVztZQUNoQixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDJFQUEyRTtJQUMzRSx3RUFBd0U7SUFDakUsZUFBZSxDQUNwQixRQUFnQixFQUNoQixXQUFtQixFQUNuQixTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGVBQWUsV0FBVyxFQUFFLENBQUMsRUFDbkQsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLFdBQVc7WUFDaEIsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHFFQUFxRTtJQUNyRSwyREFBMkQ7SUFDcEQsTUFBTSxDQUFDLFFBQWdCLEVBQUUsU0FBd0IsRUFBRTtRQUN4RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFDekIsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLDhFQUE4RTtJQUM5RSxnRUFBZ0U7SUFDekQsUUFBUSxDQUFDLFFBQWdCLEVBQUUsU0FBd0IsRUFBRTtRQUMxRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxXQUFXLENBQUMsRUFDbEMsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLHVFQUF1RTtJQUN2RSwyRUFBMkU7SUFDM0Usc0JBQXNCO0lBQ2YsR0FBRyxDQUFDLFFBQWdCLEVBQUUsU0FBd0IsRUFBRTtRQUNyRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFDekIsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUN2QztZQUNFLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGlFQUFpRTtJQUNqRSwyQkFBMkI7SUFDcEIsYUFBYSxDQUNsQixRQUFnQixFQUNoQixTQUFnRyxFQUNoRyxTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLHVCQUF1QixDQUFDLEVBQzlDLEVBQUUsU0FBUyxFQUFFLEVBQ2I7WUFDRSxHQUFHLEVBQUUsSUFBSTtZQUNULEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsb0VBQW9FO0lBQ3BFLEVBQUU7SUFDRiwyRUFBMkU7SUFDM0UsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSx1Q0FBdUM7SUFDaEMsYUFBYSxDQUNsQixRQUFnQixFQUNoQixXQUFtQixFQUNuQixVQUFpQyxFQUFFLEVBQ25DLFFBQTRCLEVBQUUsRUFDOUIsUUFBUSxHQUFHLEtBQUssRUFDaEIsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxlQUFlLFdBQVcsT0FBTyxDQUFDLEVBQ3hELEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQ3BDO1lBQ0UsR0FBRyxFQUFFLE1BQU07WUFDWCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLDhEQUE4RDtJQUM5RCxtRUFBbUU7SUFDbkUsbUVBQW1FO0lBQ25FLHdFQUF3RTtJQUN4RSwwRUFBMEU7SUFDMUUsOERBQThEO0lBQzlELG1CQUFtQjtJQUNaLGFBQWEsQ0FDbEIsUUFBZ0IsRUFDaEIsV0FBbUIsRUFDbkIsT0FBOEIsRUFDOUIsS0FBeUIsRUFDekIsSUFBaUIsRUFDakIsUUFBUSxHQUFHLEtBQUssRUFDaEIsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyQixhQUFhLENBQUMsSUFBSSxFQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxlQUFlLFdBQVcsT0FBTyxDQUFDLEVBQ3hELEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUMxQyxNQUFNLENBQ1AsQ0FBQztJQUNKLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsMEVBQTBFO0lBQzFFLDBFQUEwRTtJQUMxRSw0RUFBNEU7SUFDNUUsaUVBQWlFO0lBQ2pFLEVBQUU7SUFDRixzRUFBc0U7SUFDdEUsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSxvRkFBb0Y7SUFDcEYseUVBQXlFO0lBQ3pFLG9CQUFvQjtJQUNwQixFQUFFO0lBQ0Ysd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSwwRUFBMEU7SUFDMUUsVUFBVTtJQUNILFVBQVUsQ0FDZixRQUFnQixFQUNoQixNQUFjLEVBQ2QsVUFBaUMsRUFBRSxFQUNuQyxRQUFRLEdBQUcsS0FBSyxFQUNoQixTQUF3QixFQUFFLEVBQzFCLG1CQUE2QixFQUFFO1FBRS9CLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFVBQVUsTUFBTSxTQUFTLENBQUMsRUFDaEQsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQ3ZGO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLDRFQUE0RTtJQUM1RSwyREFBMkQ7SUFDM0QsRUFBRTtJQUNGLDRFQUE0RTtJQUM1RSx5RUFBeUU7SUFDekUsNEVBQTRFO0lBQzVFLHlFQUF5RTtJQUN6RSwwRUFBMEU7SUFDMUUsMEVBQTBFO0lBQzFFLHNFQUFzRTtJQUMvRCxlQUFlLENBQ3BCLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFVBQWlDLEVBQUUsRUFDbkMsUUFBNEIsRUFBRSxFQUM5QixLQUFLLEdBQUcsRUFBRSxFQUNWLFNBQXdCLEVBQUUsRUFDMUIsU0FBNkIsS0FBSztRQUVsQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxlQUFlLFdBQVcsU0FBUyxDQUFDLEVBQzFELEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQ2xFO1lBQ0UsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLDhFQUE4RTtJQUM5RSw4RUFBOEU7SUFDOUUsMkVBQTJFO0lBQzNFLDRFQUE0RTtJQUM1RSxrSEFBa0g7SUFDbEgsaUVBQWlFO0lBQ2pFLHNFQUFzRTtJQUN0RSxzRUFBc0U7SUFDdEUsdUVBQXVFO0lBQ3ZFLDRIQUE0SDtJQUM1SCx1RUFBdUU7SUFDdkUsMEVBQTBFO0lBQzFFLDBFQUEwRTtJQUMxRSxxRUFBcUU7SUFDckUsOEJBQThCO0lBQ3ZCLFlBQVksQ0FDakIsUUFBZ0IsRUFDaEIsVUFBaUMsRUFBRSxFQUNuQyxTQUF3QixJQUFJLEVBQzVCLFlBQXFDLElBQUksRUFDekMsY0FBa0MsRUFBRSxFQUNwQyxTQUE2QyxFQUFFLEVBQy9DLFNBQWlDLEVBQUUsRUFDbkMsU0FBd0IsRUFBRSxFQUMxQixTQUE2QixLQUFLO1FBRWxDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFNBQVMsQ0FBQyxFQUNoQztZQUNFLE9BQU87WUFDUCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDN0IsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25DLGFBQWEsRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ25ELEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakQsR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN4QyxFQUNEO1lBQ0UsR0FBRyxFQUFFLEtBQUs7WUFDVixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsc0VBQXNFO0lBQy9ELGFBQWEsQ0FBQyxRQUFnQixFQUFFLFFBQWdCLEVBQUUsU0FBd0IsRUFBRTtRQUNqRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxZQUFZLFFBQVEsVUFBVSxDQUFDLEVBQ3JELEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxTQUFTO1lBQ2QsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxFQUFFO0lBQ0YsOEVBQThFO0lBQzlFLDJFQUEyRTtJQUMzRSx3RUFBd0U7SUFDeEUsb0VBQW9FO0lBQ3BFLEVBQUU7SUFDRiw4RUFBOEU7SUFDOUUseUVBQXlFO0lBQ3pFLGtDQUFrQztJQUMzQixZQUFZLENBQ2pCLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFNBQXdCLEVBQUU7UUFFMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsZUFBZSxXQUFXLE1BQU0sQ0FBQyxFQUN2RCxFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsSUFBSTtZQUNULEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsNERBQTREO0lBQ3JELGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsV0FBbUIsRUFBRSxTQUF3QixFQUFFO1FBQ3ZGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGVBQWUsV0FBVyxVQUFVLENBQUMsRUFDM0QsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSx5RUFBeUU7SUFDbEUsU0FBUyxDQUNkLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLE1BQXNILEVBQ3RILFNBQXdCLEVBQUU7UUFFMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsZUFBZSxXQUFXLFVBQVUsQ0FBQyxFQUMzRCxNQUFNLEVBQ047WUFDRSxHQUFHLEVBQUUsUUFBUTtZQUNiLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxrRUFBa0U7SUFDM0QsWUFBWSxDQUNqQixRQUFnQixFQUNoQixRQUFnQixFQUNoQixPQUFtRSxFQUNuRSxTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFlBQVksUUFBUSxFQUFFLENBQUMsRUFDN0MsT0FBTyxFQUNQO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsa0VBQWtFO0lBQzNELFlBQVksQ0FBQyxRQUFnQixFQUFFLFFBQWdCLEVBQUUsU0FBd0IsRUFBRTtRQUNoRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxZQUFZLFFBQVEsRUFBRSxDQUFDLEVBQzdDLEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDBFQUEwRTtJQUMxRSw0REFBNEQ7SUFDckQsWUFBWSxDQUFDLFNBQXdCLEVBQUU7UUFDNUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFDMUIsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDZFQUE2RTtJQUN0RSxnQkFBZ0IsQ0FBQyxPQUFlLEVBQUUsU0FBd0IsRUFBRTtRQUNqRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUMxQixFQUFFLE9BQU8sRUFBRSxFQUNYO1lBQ0UsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMkVBQTJFO0lBQ3BFLGtCQUFrQixDQUFDLGFBQXFCLEVBQUUsU0FBd0IsRUFBRTtRQUN6RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixhQUFhLFVBQVUsQ0FBQyxFQUNuRCxFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsSUFBSTtZQUNULEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUN0RSxhQUFhLENBQUMsU0FBd0IsRUFBRTtRQUM3QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyQixNQUFNLEVBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUM1QixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFDaEIsTUFBTSxDQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsOERBQThEO0lBQ3ZELG1CQUFtQixDQUFDLFNBQXdCLEVBQUU7UUFDbkQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUM1QixFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsSUFBSTtZQUNULEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCx5RUFBeUU7SUFDbEUsaUJBQWlCLENBQUMsU0FBd0IsRUFBRTtRQUNqRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEVBQ2pDLEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxPQUFPO1lBQ1osR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDJFQUEyRTtJQUMzRSw0RUFBNEU7SUFDNUUsc0NBQXNDO0lBQy9CLHVCQUF1QixDQUFDLE1BQWMsRUFBRSxTQUF3QixFQUFFO1FBQ3ZFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLE1BQU0sWUFBWSxDQUFDLEVBQ25ELEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxpQkFBaUI7WUFDdEIsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGtGQUFrRjtJQUMzRSxRQUFRLENBQUMsU0FBd0IsRUFBRTtRQUN4QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUN0QixFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsVUFBVTtZQUNmLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsMEVBQTBFO0lBQzFFLDZFQUE2RTtJQUM3RSwwRUFBMEU7SUFDbkUsT0FBTyxDQUFDLFNBQXdCLEVBQUU7UUFDdkMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFDckIsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsc0VBQXNFO0lBQy9ELFlBQVksQ0FBQyxRQUE4QyxFQUFFLFNBQXdCLEVBQUU7UUFDNUYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFDdEIsUUFBUSxFQUNSO1lBQ0UsR0FBRyxFQUFFLFVBQVU7WUFDZixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLDZFQUE2RTtJQUM3RSx3RUFBd0U7SUFDeEUsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUM3RSwyRUFBMkU7SUFDM0UsK0NBQStDO0lBQ3hDLGlCQUFpQixDQUN0QixRQUFnQixFQUNoQixPQUFlLEVBQ2YsT0FBaUMsRUFDakMsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxpQkFBaUIsT0FBTyxFQUFFLENBQUMsRUFDakQsT0FBTyxFQUNQO1lBQ0UsR0FBRyxFQUFFLGFBQWE7WUFDbEIsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHNFQUFzRTtJQUN0RSwwRUFBMEU7SUFDMUUseUVBQXlFO0lBQ3pFLGdDQUFnQztJQUN6QixxQkFBcUIsQ0FDMUIsUUFBZ0IsRUFDaEIsUUFBZ0IsRUFDaEIsSUFBZ0MsRUFDaEMsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxZQUFZLFFBQVEsVUFBVSxDQUFDLEVBQ3JELElBQUksRUFDSjtZQUNFLEdBQUcsRUFBRSxTQUFTO1lBQ2QsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHlFQUF5RTtJQUN6RSxtQkFBbUI7SUFDWixZQUFZLENBQUMsUUFBZ0IsRUFBRSxTQUF3QixFQUFFO1FBQzlELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGVBQWUsQ0FBQyxFQUN0QyxFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsY0FBYztZQUNuQixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMkVBQTJFO0lBQ3BFLGlCQUFpQixDQUN0QixRQUFnQixFQUNoQixXQUErQyxFQUMvQyxTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGVBQWUsQ0FBQyxFQUN0QyxXQUFXLEVBQ1g7WUFDRSxHQUFHLEVBQUUsYUFBYTtZQUNsQixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsNkVBQTZFO0lBQ3RFLGlCQUFpQixDQUN0QixRQUFnQixFQUNoQixtQkFBMkIsRUFDM0IsT0FBaUMsRUFDakMsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxpQkFBaUIsbUJBQW1CLEVBQUUsQ0FBQyxFQUM3RCxPQUFPLEVBQ1A7WUFDRSxHQUFHLEVBQUUsYUFBYTtZQUNsQixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRU0saUJBQWlCLENBQ3RCLFFBQWdCLEVBQ2hCLG1CQUEyQixFQUMzQixTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGlCQUFpQixtQkFBbUIsRUFBRSxDQUFDLEVBQzdELEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxhQUFhO1lBQ2xCLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsNkNBQTZDO0lBQ3RDLHdCQUF3QixDQUM3QixRQUFnQixFQUNoQixvQkFBOEIsRUFDOUIsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSx5QkFBeUIsQ0FBQyxFQUNoRCxFQUFFLG9CQUFvQixFQUFFLEVBQ3hCO1lBQ0UsR0FBRyxFQUFFLGNBQWM7WUFDbkIsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQzt3R0E3ekJVLFVBQVU7NEdBQVYsVUFBVSxjQUZULE1BQU07OzRGQUVQLFVBQVU7a0JBSHRCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEZzQXBpLCBSZXF1ZXN0Q29uZmlnLCBSZXF1ZXN0TWV0aG9kLCBTdHJlYW1FdmVudCB9IGZyb20gJ0BmaXJlc3RpdGNoL2FwaSc7XG5pbXBvcnQgeyBHcmlkUmVxdWVzdCB9IGZyb20gJ0BmaXJlc3RpdGNoL2dyaWQnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlcG9ydEV4cG9ydExpbmUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1leHBvcnQtbGluZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZmlsdGVyLWdyb3VwLWNoYW5nZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck9wdGlvbnNSZXF1ZXN0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMtcmVxdWVzdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWZpbHRlci1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRTYXZlZEZpbHRlckNoYW5nZXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1zYXZlZC1maWx0ZXItY2hhbmdlcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0U2F2ZWRGaWx0ZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1zYXZlZC1maWx0ZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIENoYXJ0R3JhbnVsYXJpdHksXG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgQ29tcG9uZW50RXhwb3J0UmVzcG9uc2UsXG4gIFJlcG9ydENvbXBvbmVudFNxbCxcbiAgUmVwb3J0TG9jYWxlcyxcbiAgUmVwb3J0UGFnZVZhbHVlLFxuICBSZXBvcnRUcmVlLFxuICBSZXNvbHZlZEZpbHRlclZhbHVlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0Rm9ybWF0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZXhwb3J0LWZvcm1hdC50eXBlJztcbmltcG9ydCB7IFZJRVdFUl9GRUFUVVJFUyB9IGZyb20gJy4uL3JlcG9ydC12aWV3ZXItZmVhdHVyZXMnO1xuXG5cbi8vIEFQSSBnYXRld2F5IGZvciB0aGUgUmVwb3J0cyBtb2R1bGUuIEV2ZXJ5IGVuZHBvaW50IGhhbmdzIG9mZiBbYmFzZVBhdGhdLFxuLy8gd2hpY2ggZGVmYXVsdHMgdG8gXCJyZXBvcnRzXCIgKHRoZSBmcmFtZXdvcmsgcmVwb3J0cyBiYWNrZW5kIGF0IC9hcGkvcmVwb3J0cylcbi8vIGFuZCBjYW4gYmUgcmVwb2ludGVkIGJ5IHRoZSBob3N0IHNvIHRoZSBwYWNrYWdlIHN0YXlzIHNlbGYtY29udGFpbmVkIGFuZCBwb3J0YWJsZS5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnREYXRhPFQgPSBhbnk+IHtcbiAgcHJpdmF0ZSBfYXBpID0gaW5qZWN0KEZzQXBpKTtcblxuICAvLyBUaGUgQVBJIHJvb3QgZm9yIGV2ZXJ5IHJlcG9ydHMgZW5kcG9pbnQuIERlZmF1bHRzIHRvIHRoZSBmcmFtZXdvcmsgcmVwb3J0c1xuICAvLyBjb250ZXh0OyBzZXQgaXQgb25jZSAoZS5nLiBmcm9tIHRoZSBob3N0J3MgcmVwb3J0IHBhZ2UpIHRvIG1vdW50IGVsc2V3aGVyZS5cbiAgcHVibGljIGJhc2VQYXRoID0gJ3JlcG9ydHMnO1xuXG4gIC8vIEJ1aWxkIGFuIGVuZHBvaW50IHBhdGggdW5kZXIgdGhlIGNvbmZpZ3VyZWQgYmFzZSwgZS5nLiBfcGF0aCgpID0+IFwiYWkvcmVwb3J0c1wiLFxuICAvLyBfcGF0aChgJHtpZH0vcGFnZXNgKSA9PiBcImFpL3JlcG9ydHMvMTIzL3BhZ2VzXCIuXG4gIHByaXZhdGUgX3BhdGgoc3VmZml4ID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdWZmaXggPyBgJHt0aGlzLmJhc2VQYXRofS8ke3N1ZmZpeH1gIDogdGhpcy5iYXNlUGF0aDtcbiAgfVxuXG4gIHB1YmxpYyByZXBvcnRzKHF1ZXJ5OiBhbnkgPSB7fSwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoKSxcbiAgICAgIHF1ZXJ5LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnRzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gQm90aCBoYWx2ZXMgb2YgdGhlIGxpc3Rpbmcg4oCUIHJlcG9ydHMgQU5EIHRoZSBmb2xkZXJzIHRoZXkgYXJlIGZpbGVkIGludG8g4oCUXG4gIC8vIGZyb20gdGhlIG9uZSBHRVQuIE5vIGBrZXlgLCBiZWNhdXNlIHRoZSB3aG9sZSBwYXlsb2FkIGlzIHRoZSBhbnN3ZXIgaGVyZTtcbiAgLy8gcmVwb3J0cygpIGtlZXBzIGl0cyAncmVwb3J0cycga2V5IGZvciBjYWxsZXJzIHRoYXQgb25seSB3YW50IHRoZSBmbGF0IGxpc3QuXG4gIHB1YmxpYyB0cmVlKHF1ZXJ5OiBhbnkgPSB7fSwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFJlcG9ydFRyZWU+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoKSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgY29uZmlnLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlKG5hbWU6IHN0cmluZywgcmVwb3J0Rm9sZGVySWQ6IG51bWJlciA9IG51bGwsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aCgpLFxuICAgICAgeyBuYW1lLCByZXBvcnRGb2xkZXJJZCB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBGaWxlIGEgcmVwb3J0IHVuZGVyIGEgZm9sZGVyLCBvciBwYXNzIG51bGwgdG8gbW92ZSBpdCB0byB0aGUgcm9vdC4gU2VudFxuICAvLyBleHBsaWNpdGx5IChuZXZlciBvbWl0dGVkKSBzbyB0aGUgYmFja2VuZCBjYW4gdGVsbCBcIm1vdmUgdG8gcm9vdFwiIGZyb21cbiAgLy8gXCJsZWF2ZSB0aGUgZm9sZGVyIGFsb25lXCIuXG4gIHB1YmxpYyBtb3ZlUmVwb3J0KHJlcG9ydElkOiBudW1iZXIsIHJlcG9ydEZvbGRlcklkOiBudW1iZXIgfCBudWxsLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH1gKSxcbiAgICAgIHsgcmVwb3J0Rm9sZGVySWQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUZvbGRlcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50UmVwb3J0Rm9sZGVySWQ6IG51bWJlciA9IG51bGwsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoJ2ZvbGRlcnMnKSxcbiAgICAgIHsgbmFtZSwgcGFyZW50UmVwb3J0Rm9sZGVySWQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZm9sZGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVuYW1lIGFuZC9vciBtb3ZlIGEgZm9sZGVyLiBPbmx5IHRoZSBrZXlzIHBhc3NlZCBhcmUgYWN0ZWQgb24gc2VydmVyLXNpZGUsXG4gIC8vIHNvIGEgcmVuYW1lIG5ldmVyIGRpc3R1cmJzIHRoZSBwYXJlbnQgYW5kIGEgZHJhZyBuZXZlciBkaXN0dXJicyB0aGUgbmFtZS5cbiAgcHVibGljIHVwZGF0ZUZvbGRlcihcbiAgICByZXBvcnRGb2xkZXJJZDogbnVtYmVyLFxuICAgIGZvbGRlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgZm9sZGVycy8ke3JlcG9ydEZvbGRlcklkfWApLFxuICAgICAgZm9sZGVyLFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBTb2Z0LWRlbGV0ZSwgd2hhdGV2ZXIgdGhlIGZvbGRlciBob2xkczogaXRzIGNvbnRlbnRzIGxlYXZlIHRoZSBsaXN0aW5nIHdpdGhcbiAgLy8gaXQsIGFuZCB1bmRlbGV0ZUZvbGRlcigpIGJyaW5ncyB0aGUgbG90IGJhY2suXG4gIHB1YmxpYyBkZWxldGVGb2xkZXIocmVwb3J0Rm9sZGVySWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYGZvbGRlcnMvJHtyZXBvcnRGb2xkZXJJZH1gKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSZXN0b3JlIGEgc29mdC1kZWxldGVkIGZvbGRlciB0aHJvdWdoIGl0cyBvd24gYWN0aW9uIGVuZHBvaW50IOKAlCB0aGUgZm9sZGVyXG4gIC8vIFBVVCBkb2VzIG5vdCBhY2NlcHQgYHN0YXRlYC4gQW55IGRlbGV0ZWQgZm9sZGVyIGFib3ZlIGl0IGlzIHJlc3RvcmVkIHRvbywgc29cbiAgLy8gaXQgbGFuZHMgYmFjayB3aGVyZSBpdCB3YXMuXG4gIHB1YmxpYyB1bmRlbGV0ZUZvbGRlcihyZXBvcnRGb2xkZXJJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYGZvbGRlcnMvJHtyZXBvcnRGb2xkZXJJZH0vdW5kZWxldGVgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lKHJlcG9ydElkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9YCksXG4gICAgICB7IG5hbWUgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVwb3J0IHNldHRpbmdzOiBhbnkgc3Vic2V0IG9mIHsgbmFtZSwgcGFnZVdpZHRoLCBwYWdlSGVpZ2h0LCB0aW1lem9uZSxcbiAgLy8gbG9jYWxlLCBjdXJyZW5jeSwgc3R5bGVzLCBoZWFkZXJGb290ZXIgfSDigJQgc3R5bGVzIGNhcnJ5IHRoZVxuICAvLyByZXBvcnQncyB0eXBvZ3JhcGhpYyBjb25maWcgKGUuZy4gaGVhZGluZyBzaXplKSwgaGVhZGVyRm9vdGVyIHRoZVxuICAvLyBoZWFkZXIvZm9vdGVyIGJhbmQgZGVwdGhzIGluIGluY2hlcy4gVGhlIHBhZ2Ugc2l6ZSBpcyBpbiBpbmNoZXMgYW5kXG4gIC8vIHdpZHRoL2hlaWdodCBnbyB0b2dldGhlci4gbG9jYWxlIChhIEJDUCA0NyB0YWcpIGFuZCBjdXJyZW5jeSAoYW4gSVNPIDQyMTdcbiAgLy8gY29kZSkgYXJlIGVhY2ggc2VudCBvbmx5IHRvIGNoYW5nZSB0aGVtOyAnJyByZXR1cm5zIHRoZSByZXBvcnQgdG8gdGhlXG4gIC8vIGRlZmF1bHQsIGFuZCB0aGUgY3VycmVuY3kgb25seSBuYW1lcyB3aGF0IHRoZSBhbW91bnRzIGFyZSBpbi5cbiAgcHVibGljIHVwZGF0ZShyZXBvcnRJZDogbnVtYmVyLCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAgc2V0dGluZ3MsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFwcGVuZCBhIGJsYW5rIHBhZ2UgdG8gdGhlIHJlcG9ydDsgcmVzb2x2ZXMgdG8gdGhlIG5ldyBwYWdlLlxuICBwdWJsaWMgYWRkUGFnZShyZXBvcnRJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3BhZ2VzYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncGFnZScsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFueSBzdWJzZXQgb2YgeyBuYW1lLCBtYXN0ZXJIaWRkZW4gfS4gQW4gZW1wdHkgbmFtZSBpcyBzdG9yZWQgYXMgbnVsbFxuICAvLyBzZXJ2ZXItc2lkZSwgd2hpY2ggcHV0cyB0aGUgdGFiIGJhY2sgb24gaXRzIHBvc2l0aW9uYWwgXCJQYWdlIE5cIiBsYWJlbDtcbiAgLy8gbWFzdGVySGlkZGVuIGhpZGVzIHRoZSByZXBvcnQncyBoZWFkZXIgYW5kIGZvb3RlciBvbiB0aGlzIHBhZ2UuXG4gIHB1YmxpYyB1cGRhdGVQYWdlKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcGFnZUlkOiBudW1iZXIsXG4gICAgcGFnZTogeyBuYW1lPzogc3RyaW5nOyBtYXN0ZXJIaWRkZW4/OiBib29sZWFuIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vcGFnZXMvJHtwYWdlSWR9YCksXG4gICAgICBwYWdlLFxuICAgICAge1xuICAgICAgICBrZXk6ICdwYWdlJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gRGVsZXRlIGEgcGFnZSBhbmQgZXZlcnl0aGluZyBvbiBpdC4gUmVmdXNlZCBzZXJ2ZXItc2lkZSBmb3IgdGhlIGxhc3RcbiAgLy8gcmVtYWluaW5nIHBhZ2Ug4oCUIGEgcmVwb3J0IHdpdGggbm8gY2FudmFzIGlzIGEgZGVsZXRlZCByZXBvcnQsIG5vdCBhIHBhZ2VcbiAgLy8gb3BlcmF0aW9uLlxuICBwdWJsaWMgZGVsZXRlUGFnZShyZXBvcnRJZDogbnVtYmVyLCBwYWdlSWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3BhZ2VzLyR7cGFnZUlkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3BhZ2UnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBQZXJzaXN0IHRoZSB0YWIgb3JkZXIgYWZ0ZXIgYSBkcmFnIOKAlCB0aGUgd2hvbGUgbGlzdCwgaW4gaXRzIG5ldyBvcmRlciwgc29cbiAgLy8gdGhlIHNlcXVlbmNlIHN0YXlzIGdhcGxlc3Mgd2l0aG91dCB0aGUgc2VydmVyIGluZmVycmluZyB0aGUgbW92ZS5cbiAgcHVibGljIHNhdmVQYWdlUG9zaXRpb25zKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcG9zaXRpb25zOiB7IHBhZ2VJZDogbnVtYmVyOyBvcmRlcjogbnVtYmVyIH1bXSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9wYWdlcy9wb3NpdGlvbnNgKSxcbiAgICAgIHsgcG9zaXRpb25zIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gQ29tcG9uZW50IHNldHRpbmdzOiBhbnkgc3Vic2V0IG9mIHsgdGl0bGUsIHBhZGRpbmcgfSDigJQgdGhlIGh1bWFuLWZhY2luZ1xuICAvLyBkaWFsb2cgZWRpdHMg4oCUIG9yIGEgdGV4dCBibG9jaydzIHsgaHRtbCB9IGZyb20gaXRzIGlubGluZSBlZGl0b3I7IGdlb21ldHJ5XG4gIC8vICh4L3kvdy9oKSBpcyBwZXJzaXN0ZWQgdmlhIHNhdmVQb3NpdGlvbnMgZnJvbSB0aGUgY2FudmFzIGluc3RlYWQuXG4gIHB1YmxpYyB1cGRhdGVDb21wb25lbnQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L3NldHRpbmdzYCksXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnY29tcG9uZW50JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUGxhY2UgYSB0ZXh0IGJsb2NrIOKAlCBvbiBhIHBhZ2UsIG9yIGluIHRoZSBoZWFkZXIvZm9vdGVyIHdoZW4gcGFnZUlkIGlzXG4gIC8vIG9taXR0ZWQuIFRoZSBvbmx5IGNvbXBvbmVudCB0aGUgVUkgY3JlYXRlcyBpdHNlbGY6IGNoYXJ0cywgbGlzdHMgYW5kIEtQSXNcbiAgLy8gbmVlZCBhIHF1ZXJ5IGFuZCBjb21lIGZyb20gdGhlIGNoYXQuIFJlc29sdmVzIHRvIHsgaWQgfS5cbiAgcHVibGljIGFkZFRleHQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICB0ZXh0OiB7IHBhZ2VJZD86IG51bWJlcjsgaHRtbD86IHN0cmluZzsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHNgKSxcbiAgICAgIHRleHQsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2NvbXBvbmVudCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIERlbGV0ZSBvbmUgY29tcG9uZW50IGZyb20gdGhlIGNhbnZhcywgdG9nZXRoZXIgd2l0aCBpdHMgZmlsdGVycyBhbmQgYW55XG4gIC8vIGZpbHRlciBncm91cCB0aGV5IGxlYXZlIGVtcHR5LiBTb2Z0IHNlcnZlci1zaWRlLCBidXQgdGhlcmUgaXMgbm8gcmVzdG9yZVxuICAvLyBhbnl3aGVyZSBpbiB0aGUgVUksIHNvIHRoZSBkaWFsb2cncyBjb25maXJtIHByZXNlbnRzIGl0IGFzIHBlcm1hbmVudC5cbiAgcHVibGljIGRlbGV0ZUNvbXBvbmVudChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZGVsZXRlKFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2NvbXBvbmVudCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNvZnQtZGVsZXRlOiB0aGUgcmVwb3J0IGxlYXZlcyB0aGUgbGlzdGluZyBidXQga2VlcHMgaXRzIHBhZ2VzIGFuZFxuICAvLyBjb21wb25lbnRzLCBzbyB1bmRlbGV0ZSgpIGJyaW5ncyBiYWNrIHRoZSBzYW1lIGRvY3VtZW50LlxuICBwdWJsaWMgZGVsZXRlKHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5kZWxldGUoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgYSBzb2Z0LWRlbGV0ZWQgcmVwb3J0IHRocm91Z2ggaXRzIG93biBhY3Rpb24gZW5kcG9pbnQg4oCUIHRoZSByZXBvcnRcbiAgLy8gUFVUIGRvZXMgbm90IGFjY2VwdCBgc3RhdGVgLiBJdHMgZm9sZGVyIGlzIHJlc3RvcmVkIHRvbyB3aGVuIGl0IGlzIGRlbGV0ZWQsXG4gIC8vIG9yIGluc2lkZSBvbmUgdGhhdCBpcywgc28gdGhlIHJlcG9ydCBsYW5kcyBiYWNrIHdoZXJlIGl0IHdhcy5cbiAgcHVibGljIHVuZGVsZXRlKHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vdW5kZWxldGVgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgYXNzZW1ibGVkIHN0cnVjdHVyZTogcGFnZXMg4oaSIGNvbXBvbmVudHMgKCsgdGhlaXIgZmlsdGVycykgYW5kIHRoZVxuICAvLyByZXBvcnQncyBmaWx0ZXIgZ3JvdXBzLiBgZmVhdHVyZXNgIG5hbWVzIHdoYXQgdGhpcyB2aWV3ZXIgaW1wbGVtZW50c1xuICAvLyAoVklFV0VSX0ZFQVRVUkVTKSwgc28gdGhlIHNlcnZlciBzZW5kcyBldmVyeSBncm91cCBpbiBhIHNoYXBlIHRoZSB2aWV3ZXJcbiAgLy8gY2FuIHNob3cgYW5kIGNsZWFyLlxuICBwdWJsaWMgZ2V0KHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAgeyBmZWF0dXJlczogVklFV0VSX0ZFQVRVUkVTLmpvaW4oJywnKSB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBQZXJzaXN0IGdlb21ldHJ5IGZvciB0aGUgbW92ZWQgY29tcG9uZW50cyBvbmx5IOKAlCBhbnkgc3Vic2V0IG9mXG4gIC8vIHsgeCwgeSwgdywgaCB9IChpbmNoZXMpLlxuICBwdWJsaWMgc2F2ZVBvc2l0aW9ucyhcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIHBvc2l0aW9uczogKHsgY29tcG9uZW50SWQ6IG51bWJlciB9ICYgUGFydGlhbDx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9PilbXSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzL3Bvc2l0aW9uc2ApLFxuICAgICAgeyBwb3NpdGlvbnMgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBPbmUgY29tcG9uZW50J3MgZGF0YS4gVGhlIGJvZHkgY2FycmllcyBldmVyeXRoaW5nIHNlc3Npb24tc2NvcGVkOiB0aGVcbiAgLy8gcmVzb2x2ZWQgZmlsdGVyIHZhbHVlcyBhbmQgdGhlIGNvbXBvbmVudCdzIG93biBpbnRlcmFjdGlvbiBzdGF0ZS5cbiAgLy9cbiAgLy8gYGlzRXhwb3J0YCBtYXJrcyB0aGUgcmVhZCBhcyBwYXJ0IG9mIGEgUERGL1Bvd2VyUG9pbnQgcmVuZGVyLiBUaGUgc2VydmVyXG4gIC8vIGdpdmVzIHRob3NlIGEgbG9uZ2VyIHBlci1zdGF0ZW1lbnQgY2VpbGluZyB0aGFuIGFuIG9uLXNjcmVlbiB0aWxlLCBiZWNhdXNlXG4gIC8vIGEgcmVhZGVyIHdhdGNoaW5nIGFuIGV4cG9ydCBwcm9ncmVzcyBiYXIgY2FuIHdhaXQgZm9yIGEgcXVlcnkgbm9ib2R5IHdvdWxkXG4gIC8vIHRvbGVyYXRlIHdhaXRpbmcgZm9yIG9uIGEgZGFzaGJvYXJkLlxuICBwdWJsaWMgY29tcG9uZW50RGF0YShcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgZmlsdGVyczogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW10sXG4gICAgc3RhdGU6IENvbXBvbmVudERhdGFTdGF0ZSA9IHt9LFxuICAgIGlzRXhwb3J0ID0gZmFsc2UsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vZGF0YWApLFxuICAgICAgeyBmaWx0ZXJzLCBzdGF0ZSwgZXhwb3J0OiBpc0V4cG9ydCB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdkYXRhJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gT25lIGdyaWQgdGlsZSdzIHJlYWQgKFJlcG9ydEdyaWRTb3VyY2UpOiB0aGUgc2FtZSByb3V0ZSBhcyBjb21wb25lbnREYXRhLFxuICAvLyBpdHMgYm9keSdzIGBncmlkYCB0aGUgZ3JpZCdzIHJlcXVlc3QuIFRoZSBhbnN3ZXIgc3RyZWFtcyBhc1xuICAvLyBuZXdsaW5lLWRlbGltaXRlZCBKU09OLCBvbmUgZXZlbnQgcGVyIGxpbmU6IHtyZXBvcnR9IGZpcnN0LCB0aGVuXG4gIC8vIHtncmlkOiBwYXJ0fSBmb3IgZWFjaCBwYXJ0IG9mIHRoZSByZWFkLCBhIGhlYXJ0YmVhdCB7YXR9IGJldHdlZW5cbiAgLy8gc3RhdGVtZW50cywgYW5kIHRoZSBlbnZlbG9wZSB3aXRoIHRoZSByZWFkJ3Mgc3VtbWFyeSBsYXN0LiBUaGUgYm9keSdzXG4gIC8vIGZpbHRlcnMgYW5kIHN0YXRlIG5hcnJvdyB0aGUgcm93cyBhcyB0aGV5IG5hcnJvdyBhbnkgdGlsZSdzOyB0aGUgZ3JpZCdzXG4gIC8vIG93biBjb2x1bW4gZmlsdGVycyB0cmF2ZWwgaW5zaWRlIGdyaWQubGF5b3V0LiBgaXNFeHBvcnRgIGlzXG4gIC8vIGNvbXBvbmVudERhdGEncy5cbiAgcHVibGljIGNvbXBvbmVudEdyaWQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcnM6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSxcbiAgICBzdGF0ZTogQ29tcG9uZW50RGF0YVN0YXRlLFxuICAgIGdyaWQ6IEdyaWRSZXF1ZXN0LFxuICAgIGlzRXhwb3J0ID0gZmFsc2UsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8U3RyZWFtRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnN0cmVhbShcbiAgICAgIFJlcXVlc3RNZXRob2QuUG9zdCxcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vZGF0YWApLFxuICAgICAgeyBmaWx0ZXJzLCBzdGF0ZSwgZXhwb3J0OiBpc0V4cG9ydCwgZ3JpZCB9LFxuICAgICAgY29uZmlnLFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgbnVtYmVycyBvZiBhIHBhZ2UncyB2YWx1ZXMg4oCUIG9yIHRoZSBtYXN0ZXIncywgZm9yIHRoZSBoZWFkZXIgYW5kXG4gIC8vIGZvb3RlciDigJQgaW4gb25lIHJlcXVlc3Q6IGEgcm93IHBlciB2YWx1ZSB0aGF0IHBhZ2UgcmVhZHMsIHNob3duIGJ5IHNvbWVcbiAgLy8gdGV4dCBvciByZWFkIGJ5IGEgZm9ybXVsYSBpdCBzaG93cyAoUmVwb3J0UGFnZVZhbHVlKS4gYGZpbHRlcnNgIGNhcnJpZXNcbiAgLy8gdGhlIHJlc29sdmVkIHZhbHVlcyBmb3IgZXZlcnkgdmFsdWUgb2YgdGhlIGxheWVyIHRvZ2V0aGVyOyBlYWNoIHZhbHVlIHRoZVxuICAvLyBzZXJ2ZXIgcmVhZHMgcGlja3Mgb3V0IGl0cyBvd24uIGBpc0V4cG9ydGAgaXMgY29tcG9uZW50RGF0YSdzLlxuICAvL1xuICAvLyBUaGUgc2VydmVyIHJlYWRzIG9uZSBzdGF0ZW1lbnQgcGVyIGRpc3RpbmN0IHF1ZXJ5ICh2YWx1ZXMgc2hhcmluZyBhXG4gIC8vIHF1ZXJ5IGFuZCBpdHMgZmlsdGVycyBhcmUgZm9sZGVkIGludG8gb25lOyBhIGZvcm11bGEgcnVucyBub25lKSBhbmQgbWF5XG4gIC8vIHN0cmVhbSBhIGtlZXBBbGl2ZSBwdWxzZSBiZWZvcmUgZWFjaCwgc28gYSBzbG93IHBhZ2UgbmV2ZXIgc2l0cyBzaWxlbnRcbiAgLy8gdW50aWwgdGhlIGNvbm5lY3Rpb24gZHJvcHMuIFRoZSBib2R5IHN0YXlzIG9uZSBKU09OIHdpdGggdGhlIHJvd3MgYXQgZGF0YS52YWx1ZXMsXG4gIC8vIHdoaWNoIEZzQXBpIHJlYWRzIHdpdGggdGhlICd2YWx1ZXMnIGtleSwgYXMgZXhwb3J0Q29tcG9uZW50J3Mgc3RyZWFtZWRcbiAgLy8gcmVzcG9uc2UgaXMgcmVhZC5cbiAgLy9cbiAgLy8gYG1hdGNoQW55R3JvdXBJZHNgIGlzIGEgdGlsZSdzIChDb21wb25lbnREYXRhU3RhdGUpOiB3aGlsZSB0aGUgZ3JvdXBzXG4gIC8vIG1hdGNoICdhbnknLCB0aGUgZ3JvdXBzIHRoYXQgY29tYmluZSAodmFsdWVzTWF0Y2hBbnlHcm91cElkcykuIFNlbnQgb25seVxuICAvLyB3aGVuIGl0IGxpc3RzIGFueTsgdGhlIHNlcnZlciBjaGVja3MgZWFjaCB2YWx1ZSBhZ2FpbnN0IGl0IGFzIGl0IGNoZWNrc1xuICAvLyBhIHRpbGUuXG4gIHB1YmxpYyBwYWdlVmFsdWVzKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcGFnZUlkOiBudW1iZXIsXG4gICAgZmlsdGVyczogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW10sXG4gICAgaXNFeHBvcnQgPSBmYWxzZSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgICBtYXRjaEFueUdyb3VwSWRzOiBudW1iZXJbXSA9IFtdLFxuICApOiBPYnNlcnZhYmxlPFJlcG9ydFBhZ2VWYWx1ZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vcGFnZXMvJHtwYWdlSWR9L3ZhbHVlc2ApLFxuICAgICAgeyBmaWx0ZXJzLCBleHBvcnQ6IGlzRXhwb3J0LCAuLi4obWF0Y2hBbnlHcm91cElkcy5sZW5ndGggPyB7IG1hdGNoQW55R3JvdXBJZHMgfSA6IHt9KSB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICd2YWx1ZXMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBFeHBvcnRzIG9uZSBjb21wb25lbnQgdG8gQ1NWIHNlcnZlci1zaWRlOiB0aGUgZmlsZSBpcyB3aGF0IHRoZSBzY3JlZW5cbiAgLy8gc2hvd3MgKGEgY2hhcnQgb3IgS1BJIGFzIHJlbmRlcmVkLCBhIGxpc3QgaW4gZnVsbCBpbiB0aGUgc2NyZWVuJ3Mgb3JkZXIpLlxuICAvLyBUaGUgYmFja2VuZCBzdHJlYW1zIHBlcmNlbnRhZ2UgcHJvZ3Jlc3Mgd2hpbGUgaXQgd3JpdGVzLlxuICAvL1xuICAvLyBrZXk6IG51bGwgb24gcHVycG9zZSwgdW5saWtlIHRoZSBrZXk6ICd1cmwnIHByZXNpZ25lZC1leHBvcnQgcGF0dGVybjogdGhlXG4gIC8vIHJlc3BvbnNlIGFsc28gY2FycmllcyBgbm90ZXNgLCB0aGUgc2VudGVuY2VzIHNheWluZyBob3cgdGhlIGZpbGUgZmFsbHNcbiAgLy8gc2hvcnQgb2YgdGhlIGZ1bGwgcmVzdWx0LCBhbmQgdGhlIGNhbGxlciBoYXMgdG8gc2hvdyB0aGVtIGJlZm9yZSBpdCBoYW5kc1xuICAvLyB0aGUgdXJsIHRvIEZzUHJvY2Vzcy5kb3dubG9hZC4gYHRpdGxlYCBpcyB0aGUgY29tcG9uZW50J3MgdGl0bGUgYXMgdGhlXG4gIC8vIHZpZXdlciByZWFkcyBpdCwgaXRzIHRva2VucyBmaWxsZWQgKCdTaWduLXVwcyDigJQgU2VwdGVtYmVyIDIwMjYnKSwgd2hpY2hcbiAgLy8gdGhlIHNlcnZlciBuYW1lcyB0aGUgZmlsZSBhZnRlci4gYGZvcm1hdGAgJ3hsc3gnIGFza3MgZm9yIGFuIEV4Y2VsIGZpbGVcbiAgLy8gKFJlcG9ydEV4cG9ydEZvcm1hdCk7IGFuIG9sZGVyIHNlcnZlciBpZ25vcmVzIGl0IGFuZCBzZW5kcyB0aGUgQ1NWLlxuICBwdWJsaWMgZXhwb3J0Q29tcG9uZW50KFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgY29tcG9uZW50SWQ6IG51bWJlcixcbiAgICBmaWx0ZXJzOiBSZXNvbHZlZEZpbHRlclZhbHVlW10gPSBbXSxcbiAgICBzdGF0ZTogQ29tcG9uZW50RGF0YVN0YXRlID0ge30sXG4gICAgdGl0bGUgPSAnJyxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgICBmb3JtYXQ6IFJlcG9ydEV4cG9ydEZvcm1hdCA9ICdjc3YnLFxuICApOiBPYnNlcnZhYmxlPENvbXBvbmVudEV4cG9ydFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9leHBvcnRgKSxcbiAgICAgIHsgZmlsdGVycywgc3RhdGUsIHRpdGxlLCAuLi4oZm9ybWF0ICE9PSAnY3N2JyA/IHsgZm9ybWF0IH0gOiB7fSkgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBFeHBvcnRzIEVWRVJZIGNvbXBvbmVudCBvbiB0aGUgcmVwb3J0IOKAlCBvciBvbiBvbmUgcGFnZSDigJQgc2VydmVyLXNpZGUgYW5kXG4gIC8vIHJlc29sdmVzIHRvIGEgcHJlc2lnbmVkIFVSTCBmb3IgYSB6aXAgb2Ygb25lIENTViBwZXIgY29tcG9uZW50LCBmb2xkZXJlZCBieVxuICAvLyBwYWdlLCBwbHVzIGFuICdFeHBvcnQgTm90ZXMudHh0Jy4gYGZpbHRlcnNgIGNhcnJpZXMgdGhlIHJlc29sdmVkIHZhbHVlcyBmb3JcbiAgLy8gZXZlcnkgY29tcG9uZW50IHRvZ2V0aGVyOyBlYWNoIG9uZSBwaWNrcyBvdXQgaXRzIG93bi4gYGZyZXF1ZW5jeWAgaXMgdGhlXG4gIC8vIHJlcG9ydCdzIGdyb3VwLWJ5IGdyYWluICh0aGUgc2VydmVyIHJlLWJ1Y2tldHMgb25seSB0aGUgdGlsZXMgdGhhdCBmb2xsb3dcbiAgLy8gaXQ6IHRpbWUtc2VyaWVzIGNoYXJ0cyBhbmQgdGFibGVzIG92ZXIgYSB0aW1lIGF4aXMpLCBhbmQgYGZpbHRlckxpbmVzYCBpcyB0aGUgZmlsdGVyIGJhciBhcyB0aGUgdmlld2VyIHJlYWRzIGl0XG4gIC8vIChleHBvcnRMaW5lcyksIHdoaWNoIHRoZSBub3RlcyBmaWxlIHdyaXRlcy4gVGhlaXIgdGV4dCBnb2VzIGFzXG4gIC8vIGZpbHRlclN1bW1hcnkgdG9vLCBmb3IgYSBzZXJ2ZXIgdGhhdCBkb2VzIG5vdCByZWFkIGZpbHRlckxpbmVzOyB0aGVcbiAgLy8gbGluZXMgYXJlIGxlZnQgb3V0IHdoZW4gdGhlcmUgYXJlIG5vbmUuIGBzdGF0ZXNgIGlzIGVhY2ggdGlsZSdzIG93blxuICAvLyBzdGF0ZSBieSBjb21wb25lbnQgaWQgKHppcEV4cG9ydFN0YXRlcyksIHNvIGVhY2ggZmlsZSBob2xkcyB3aGF0IGl0c1xuICAvLyB0aWxlIHNob3dzOyBpdCBpcyBsZWZ0IG91dCB3aGVuIG5vIHRpbGUgaGFzIGFueS4gYHRpdGxlc2AgaG9sZHMgZWFjaCBjb21wb25lbnQncyB0aXRsZSBhcyB0aGUgdmlld2VyIHJlYWRzIGl0LCBpdHMgdG9rZW5zXG4gIC8vIGZpbGxlZCwgYnkgY29tcG9uZW50IGlkLCB3aGljaCB0aGUgc2VydmVyIG5hbWVzIHRoZSBjb21wb25lbnQncyBmaWxlXG4gIC8vIGFmdGVyOyBsZWZ0IG91dCB3aGVuIHRoZXJlIGFyZSBub25lLiBgZm9ybWF0YCAneGxzeCcgYXNrcyBmb3Igb25lIEV4Y2VsXG4gIC8vIHdvcmtib29rIGluc3RlYWQgb2YgdGhlIHppcDogYSBOb3RlcyBzaGVldCwgdGhlbiBhIHNoZWV0IHBlciB0aWxlLiBTYW1lXG4gIC8vIGtlZXAtYWxpdmUgY29udHJhY3QgYXMgZXhwb3J0Q29tcG9uZW50LCBvdmVyIGEgbG9uZ2VyIHJ1bjsgY29uc3VtZVxuICAvLyB0aHJvdWdoIEZzUHJvY2Vzcy5kb3dubG9hZC5cbiAgcHVibGljIGV4cG9ydFJlcG9ydChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcnM6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdLFxuICAgIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGwsXG4gICAgZnJlcXVlbmN5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCA9IG51bGwsXG4gICAgZmlsdGVyTGluZXM6IFJlcG9ydEV4cG9ydExpbmVbXSA9IFtdLFxuICAgIHN0YXRlczogUmVjb3JkPG51bWJlciwgQ29tcG9uZW50RGF0YVN0YXRlPiA9IHt9LFxuICAgIHRpdGxlczogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHt9LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICAgIGZvcm1hdDogUmVwb3J0RXhwb3J0Rm9ybWF0ID0gJ2NzdicsXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2V4cG9ydGApLFxuICAgICAge1xuICAgICAgICBmaWx0ZXJzLFxuICAgICAgICAuLi4ocGFnZUlkID8geyBwYWdlSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGZyZXF1ZW5jeSA/IHsgZnJlcXVlbmN5IH0gOiB7fSksXG4gICAgICAgIGZpbHRlclN1bW1hcnk6IGZpbHRlckxpbmVzLm1hcCgobGluZSkgPT4gbGluZS50ZXh0KSxcbiAgICAgICAgLi4uKGZpbHRlckxpbmVzLmxlbmd0aCA/IHsgZmlsdGVyTGluZXMgfSA6IHt9KSxcbiAgICAgICAgLi4uKE9iamVjdC5rZXlzKHN0YXRlcykubGVuZ3RoID8geyBzdGF0ZXMgfSA6IHt9KSxcbiAgICAgICAgLi4uKE9iamVjdC5rZXlzKHRpdGxlcykubGVuZ3RoID8geyB0aXRsZXMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGZvcm1hdCAhPT0gJ2NzdicgPyB7IGZvcm1hdCB9IDoge30pLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAndXJsJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gRGlzdGluY3Qgb3B0aW9ucyBmb3IgYSBzZWxlY3QgZmlsdGVyIChkcml2ZXMgbXVsdGlzZWxlY3QgY29udHJvbHMpLlxuICBwdWJsaWMgZmlsdGVyT3B0aW9ucyhyZXBvcnRJZDogbnVtYmVyLCBmaWx0ZXJJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZmlsdGVycy8ke2ZpbHRlcklkfS9vcHRpb25zYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnb3B0aW9ucycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBzdGF0ZW1lbnQgYSBjb21wb25lbnQgcnVucywgZm9yIHRoZSBTUUwgdGFiLlxuICAvL1xuICAvLyBGZXRjaGVkIHJhdGhlciB0aGFuIHJlYWQgb2ZmIHRoZSBjb21wb25lbnQsIGJlY2F1c2UgYSBERVJJVkVEIGNvbXBvbmVudCBoYXNcbiAgLy8gbm8gc3RvcmVkIFNRTCDigJQgaXQgc3RvcmVzIGEgZG9jdW1lbnQsIGFuZCBpdHMgc3RhdGVtZW50IG9ubHkgZXhpc3RzIG9uY2VcbiAgLy8gdGhlIGJhY2tlbmQgY29tcGlsZXMgdGhhdCBkb2N1bWVudC4gQ29tcGlsZWQgcGVyIHJlcXVlc3QsIGZvciB0aGUgb25lXG4gIC8vIGNvbXBvbmVudCBiZWluZyBsb29rZWQgYXQsIHNvIG9wZW5pbmcgYSByZXBvcnQgbmV2ZXIgcGF5cyBmb3IgaXQuXG4gIC8vXG4gIC8vIGBrZXk6IG51bGxgIGJlY2F1c2UgdGhlIHdob2xlIGVudmVsb3BlIGlzIHRoZSBhbnN3ZXIgaGVyZTogYSBzdGFsZSBkb2N1bWVudFxuICAvLyBjb21lcyBiYWNrIGFzIHsgc3FsOiBudWxsLCBlcnJvciwgZXJyb3JUeXBlIH0gYW5kIHVud3JhcHBpbmcgb25lIGZpZWxkXG4gIC8vIHdvdWxkIHRocm93IHRoZSBkaWFnbm9zaXMgYXdheS5cbiAgcHVibGljIGNvbXBvbmVudFNxbChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8UmVwb3J0Q29tcG9uZW50U3FsPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L3NxbGApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIGNvbXBvbmVudCBTUUwncyBmaWx0ZXJhYmxlIG91dHB1dCBjb2x1bW5zIOKAlCBkcml2ZXMgdGhlIGNvbHVtbiBwaWNrZXJcbiAgLy8gaW4gdGhlIGZpbHRlciBVSSBzbyBhIGNvbHVtbiBuYW1lIGlzIG5ldmVyIHR5cGVkIGJ5IGhhbmQuXG4gIHB1YmxpYyBjb21wb25lbnRDb2x1bW5zKHJlcG9ydElkOiBudW1iZXIsIGNvbXBvbmVudElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L2NvbHVtbnNgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdjb2x1bW5zJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gTWFrZSBvbmUgY29sdW1uIGZpbHRlcmFibGUuIGBsZXZlbGAgKGNvbXBvbmVudCB8IHJlcG9ydCkgcGxhY2VzIGEgbmV3XG4gIC8vIGdyb3VwOyBgZ3JvdXBJZGAgaW5zdGVhZCBsaW5rcyBpbnRvIGFuIGV4aXN0aW5nIGdyb3VwLiBBIHNlbGVjdCBmaWx0ZXInc1xuICAvLyBvcHRpb25zIGFyZSBkZXJpdmVkIGZyb20gdGhlIGNvbXBvbmVudCBTUUwgd2hlbiBvcHRpb25zU3FsIGlzIG9taXR0ZWQuXG4gIHB1YmxpYyBhZGRGaWx0ZXIoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcjogeyBmaWx0ZXJDb2x1bW46IHN0cmluZzsgdHlwZT86IHN0cmluZzsgbGFiZWw/OiBzdHJpbmc7IGxldmVsPzogc3RyaW5nOyBvcHRpb25zU3FsPzogc3RyaW5nOyBncm91cElkPzogbnVtYmVyIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vZmlsdGVyc2ApLFxuICAgICAgZmlsdGVyLFxuICAgICAge1xuICAgICAgICBrZXk6ICdmaWx0ZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBVcGRhdGUgYSBmaWx0ZXIg4oCUIGFueSBzdWJzZXQgb2YgeyBsYWJlbCwgb3B0aW9uc1NxbCwgZW5hYmxlZCB9LlxuICBwdWJsaWMgdXBkYXRlRmlsdGVyKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgZmlsdGVySWQ6IG51bWJlcixcbiAgICBjaGFuZ2VzOiB7IGxhYmVsPzogc3RyaW5nOyBvcHRpb25zU3FsPzogc3RyaW5nOyBlbmFibGVkPzogYm9vbGVhbiB9LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2ZpbHRlcnMvJHtmaWx0ZXJJZH1gKSxcbiAgICAgIGNoYW5nZXMsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZpbHRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSBhIGZpbHRlciAoaXRzIGdyb3VwIGdvZXMgdG9vIHdoZW4gbm90aGluZyBlbHNlIHVzZXMgaXQpLlxuICBwdWJsaWMgZGVsZXRlRmlsdGVyKHJlcG9ydElkOiBudW1iZXIsIGZpbHRlcklkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5kZWxldGUoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9maWx0ZXJzLyR7ZmlsdGVySWR9YCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZmlsdGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIGdsb2JhbCBBSSBrbm93bGVkZ2UgZG9jdW1lbnQgKG9wZXJhdG9yLWF1dGhvcmVkIGFnZW50IGluc3RydWN0aW9ucylcbiAgLy8gYW5kIGl0cyBmdWxsIHZlcnNpb24gaGlzdG9yeTogeyBpbnN0cnVjdGlvbnMsIHZlcnNpb25zIH0uXG4gIHB1YmxpYyBpbnN0cnVjdGlvbnMoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoJ2luc3RydWN0aW9ucycpLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gU2F2ZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCAoYXBwZW5kLW9ubHk7IGFuIHVuY2hhbmdlZCBzYXZlIGlzIGFcbiAgLy8gbm8tb3Agc2VydmVyLXNpZGUpLiBSZXNvbHZlcyB0byB0aGUgc2FtZSB7IGluc3RydWN0aW9ucywgdmVyc2lvbnMgfSBzaGFwZS5cbiAgcHVibGljIHNhdmVJbnN0cnVjdGlvbnMoY29udGVudDogc3RyaW5nLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aCgnaW5zdHJ1Y3Rpb25zJyksXG4gICAgICB7IGNvbnRlbnQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBNYWtlIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQgY3VycmVudCAobm8gbmV3IHJvdyBpcyBjcmVhdGVkKS5cbiAgcHVibGljIHJlc3RvcmVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbklkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgaW5zdHJ1Y3Rpb25zLyR7aW5zdHJ1Y3Rpb25JZH0vcmVzdG9yZWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUnVuIGEgc2VtYW50aWMtZGF0YWJhc2UgYnVpbGQsIHN0cmVhbWVkOiBlbWl0cyBhbiBldmVudCBwZXIgTkRKU09OIGZyYW1lXG4gIC8vICh7IGtpbmQ6ICdsb2cnLCBsaW5lLCBwZXJjZW50IH0gZmVlZCBsaW5lcyBhbmQgeyBraW5kOiAnc2VjdGlvbicgfSBwaGFzZVxuICAvLyBtYXJrZXJzKSBhbmQgY29tcGxldGVzIHdoZW4gdGhlIGJ1aWxkIGVuZHMuIEZlZWQgdGhlIGxpbmVzIGludG8gRnNQcm9jZXNzLlxuICBwdWJsaWMgc2VtYW50aWNCdWlsZChjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5zdHJlYW0oXG4gICAgICAnUE9TVCcsXG4gICAgICB0aGlzLl9wYXRoKCdzZW1hbnRpYy9idWlsZCcpLFxuICAgICAgeyBzdHJlYW06IHRydWUgfSxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuICB9XG5cbiAgLy8gTGF0ZXN0IGJ1aWxkIHN0YXR1cyArIGVudGl0eSBzY29yZWJvYXJkOiB7IGJ1aWxkLCBkZXRhaWwgfS5cbiAgcHVibGljIHNlbWFudGljQnVpbGRTdGF0dXMoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoJ3NlbWFudGljL2J1aWxkJyksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBTdG9wIHRoZSBydW5uaW5nIGJ1aWxkICh0aGUgY3VycmVudCBzZW1hbnRpYyBkYXRhYmFzZSBzdGF5cyBpbiBwbGFjZSkuXG4gIHB1YmxpYyBzZW1hbnRpY0J1aWxkU3RvcChjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoJ3NlbWFudGljL2J1aWxkL3N0b3AnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdidWlsZCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIE9uZSBlbnRpdHkncyBjYWNoZWQgQUktY2xhc3NpZmllZCBjb2RlIGZ1bmN0aW9ucyDigJQgbG9hZGVkIG9uIGV4cGFuZCwgb25lXG4gIC8vIGVudGl0eSBhdCBhIHRpbWUsIGJlY2F1c2UgdGhlIGZ1bGwgc2V0IGFjcm9zcyBhbGwgZW50aXRpZXMgaXMgZmFyIHRvbyBiaWdcbiAgLy8gdG8gc2hpcCBpbnNpZGUgdGhlIHNjb3JlYm9hcmQgY2FsbC5cbiAgcHVibGljIHNlbWFudGljRW50aXR5RnVuY3Rpb25zKGVudGl0eTogc3RyaW5nLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aChgc2VtYW50aWMvZW50aXRpZXMvJHtlbnRpdHl9L2Z1bmN0aW9uc2ApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2VudGl0eUZ1bmN0aW9ucycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSByZXBvcnQgbW9kdWxlJ3MgR2VuZXJhbCBzZXR0aW5ncyAoc2VtYW50aWMtYnVpbGQgY29uY3VycmVuY3kgKyBpdHMgYm91bmRzKS5cbiAgcHVibGljIHNldHRpbmdzKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKCdzZXR0aW5ncycpLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NldHRpbmdzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIGxvY2FsZXMgYW5kIGN1cnJlbmNpZXMgYSByZXBvcnQgY2FuIGJlIHdyaXR0ZW4gaW4sIGZvciB0aGUgcmVwb3J0XG4gIC8vIHNldHRpbmdzJyBMb2NhbGUgYW5kIEN1cnJlbmN5IHNlbGVjdHM6IHRoZSBkZWZhdWx0IGxvY2FsZSwgZWFjaCBvZmZlcmVkXG4gIC8vIGxvY2FsZSB3aXRoIHRoZSBjdXJyZW5jeSBhIHJlcG9ydCBpbiBpdCB1c2VzIHdoZW4gaXQgbmFtZXMgbm9uZSwgYW5kIGV2ZXJ5XG4gIC8vIGN1cnJlbmN5IGNvZGUuIE9ubHkgYSBzZXJ2ZXIgdGhhdCBzZW5kcyBlZmZlY3RpdmVMb2NhbGUgaGFzIHRoaXMgcm91dGUuXG4gIHB1YmxpYyBsb2NhbGVzKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxSZXBvcnRMb2NhbGVzPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKCdsb2NhbGVzJyksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnbG9jYWxlcycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNhdmUgdGhlIEdlbmVyYWwgc2V0dGluZ3M7IHJlc29sdmVzIHRvIHRoZSBzYW1lIHsgc2V0dGluZ3MgfSBzaGFwZS5cbiAgcHVibGljIHNhdmVTZXR0aW5ncyhzZXR0aW5nczogeyBzZW1hbnRpY0J1aWxkQ29uY3VycmVuY3k6IG51bWJlciB9LCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aCgnc2V0dGluZ3MnKSxcbiAgICAgIHNldHRpbmdzLFxuICAgICAge1xuICAgICAgICBrZXk6ICdzZXR0aW5ncycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBhIGZpbHRlciBncm91cCDigJQgaXRzIGV4cG9zdXJlIGxldmVsICgnY29tcG9uZW50JyB8ICdyZXBvcnQnIHwgJ2JvdGgnKSxcbiAgLy8gaXRzIG5hbWUgKGFuIGlkZW50aWZpZXIsIHVuaXF1ZSBpbiB0aGUgcmVwb3J0OyB0aGUgc2VydmVyIHJlZnVzZXMgb25lIHRoYXRcbiAgLy8gYnJlYWtzIHRoZSBydWxlLCB3aXRoIGEgbWVzc2FnZSBuYW1pbmcgdGhlIHByb2JsZW0pLCBpdHMgbGFiZWwgKG5ldmVyXG4gIC8vIGNoYW5nZXMgdGhlIG5hbWUpIGFuZC9vciBpdHMgZGVmYXVsdCB2YWx1ZSAodGhlIHZhbHVlIHNlZWRpbmcgdGhlIHJlcG9ydFxuICAvLyBiYXIgb24gb3BlbikuIFNlbmQgYGRlZmF1bHQ6IG51bGxgIChvciBhbiBlbXB0eSBkZWZhdWx0KSB0byBjbGVhciBpdC4gT25seVxuICAvLyB0aGUga2V5cyBwcm92aWRlZCBhcmUgY2hhbmdlZCwgaW4gdGhlIG9yZGVyIG5hbWUsIGxhYmVsLCBsZXZlbCwgZGVmYXVsdCxcbiAgLy8gc28gYSByZWZ1c2VkIG5hbWUgbGVhdmVzIHRoZSByZXN0IHVud3JpdHRlbi5cbiAgcHVibGljIHVwZGF0ZUZpbHRlckdyb3VwKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgZ3JvdXBJZDogbnVtYmVyLFxuICAgIGNoYW5nZXM6IFJlcG9ydEZpbHRlckdyb3VwQ2hhbmdlcyxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9maWx0ZXJncm91cHMvJHtncm91cElkfWApLFxuICAgICAgY2hhbmdlcyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZmlsdGVyR3JvdXAnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBBIHNlbGVjdCBmaWx0ZXIncyBvcHRpb25zIG5hcnJvd2VkIGJ5IHRoZSBvdGhlciBlbnRyaWVzIG9mIGl0cyB0aWxlXG4gIC8vIChSZXBvcnRGaWx0ZXJPcHRpb25zUmVxdWVzdCksIHdpdGggdGhlIHBpY2tzIGl0IG5hbWVzIGxhYmVsZWQuIE9ubHkgZm9yXG4gIC8vIGEgcmVwb3J0IHdob3NlIHNlcnZlciBsaXN0cyBjYXNjYWRpbmdPcHRpb25zOyBhbnkgb3RoZXIgcmVhZHMgdGhlIGZ1bGxcbiAgLy8gbGlzdCB0aHJvdWdoIGZpbHRlck9wdGlvbnMoKS5cbiAgcHVibGljIGZpbHRlck9wdGlvbnNOYXJyb3dlZChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcklkOiBudW1iZXIsXG4gICAgYm9keTogUmVwb3J0RmlsdGVyT3B0aW9uc1JlcXVlc3QsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8UmVwb3J0RmlsdGVyT3B0aW9ucz4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2ZpbHRlcnMvJHtmaWx0ZXJJZH0vb3B0aW9uc2ApLFxuICAgICAgYm9keSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnb3B0aW9ucycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSByZXBvcnQncyBzYXZlZCBmaWx0ZXJzLCBpbiB0aGVpciBvcmRlci4gU2hhcmVkIGJ5IGV2ZXJ5b25lIHdobyBtYXlcbiAgLy8gb3BlbiB0aGUgcmVwb3J0LlxuICBwdWJsaWMgc2F2ZWRGaWx0ZXJzKHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxSZXBvcnRTYXZlZEZpbHRlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9zYXZlZGZpbHRlcnNgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdzYXZlZEZpbHRlcnMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBBIG5ldyBzYXZlZCBmaWx0ZXI6IGl0cyBuYW1lIGFuZCB0aGUgcmVwb3J0LXdpZGUgZmlsdGVyIHZhbHVlcyBpdCBob2xkcy5cbiAgcHVibGljIGNyZWF0ZVNhdmVkRmlsdGVyKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgc2F2ZWRGaWx0ZXI6IFJlcXVpcmVkPFJlcG9ydFNhdmVkRmlsdGVyQ2hhbmdlcz4sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8UmVwb3J0U2F2ZWRGaWx0ZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9zYXZlZGZpbHRlcnNgKSxcbiAgICAgIHNhdmVkRmlsdGVyLFxuICAgICAge1xuICAgICAgICBrZXk6ICdzYXZlZEZpbHRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlbmFtZXMgYSBzYXZlZCBmaWx0ZXIgb3IgcmVwbGFjZXMgaXRzIHZhbHVlczsgb25seSB0aGUga2V5cyBnaXZlbiBjaGFuZ2UuXG4gIHB1YmxpYyB1cGRhdGVTYXZlZEZpbHRlcihcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIHJlcG9ydFNhdmVkRmlsdGVySWQ6IG51bWJlcixcbiAgICBjaGFuZ2VzOiBSZXBvcnRTYXZlZEZpbHRlckNoYW5nZXMsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8UmVwb3J0U2F2ZWRGaWx0ZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3NhdmVkZmlsdGVycy8ke3JlcG9ydFNhdmVkRmlsdGVySWR9YCksXG4gICAgICBjaGFuZ2VzLFxuICAgICAge1xuICAgICAgICBrZXk6ICdzYXZlZEZpbHRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGVTYXZlZEZpbHRlcihcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIHJlcG9ydFNhdmVkRmlsdGVySWQ6IG51bWJlcixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxSZXBvcnRTYXZlZEZpbHRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZGVsZXRlKFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vc2F2ZWRmaWx0ZXJzLyR7cmVwb3J0U2F2ZWRGaWx0ZXJJZH1gKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdzYXZlZEZpbHRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFBlcnNpc3QgdGhlIHNhdmVkIGZpbHRlcnMnIG9yZGVyIGFmdGVyIGEgZHJhZzogZXZlcnkgaWQsIGluIGl0cyBuZXdcbiAgLy8gb3JkZXIuIFJlc29sdmVzIHRvIHRoZSBsaXN0IGluIHRoYXQgb3JkZXIuXG4gIHB1YmxpYyBzYXZlU2F2ZWRGaWx0ZXJQb3NpdGlvbnMoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICByZXBvcnRTYXZlZEZpbHRlcklkczogbnVtYmVyW10sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8UmVwb3J0U2F2ZWRGaWx0ZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vc2F2ZWRmaWx0ZXJzL3Bvc2l0aW9uc2ApLFxuICAgICAgeyByZXBvcnRTYXZlZEZpbHRlcklkcyB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdzYXZlZEZpbHRlcnMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
483
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGF0YS9yZXBvcnQuZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsS0FBSyxFQUFpQixhQUFhLEVBQWUsTUFBTSxpQkFBaUIsQ0FBQztBQXNCbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQUc1RCwyRUFBMkU7QUFDM0UsOEVBQThFO0FBQzlFLHFGQUFxRjtBQUlyRixNQUFNLE9BQU8sVUFBVTtJQUNiLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFN0IsNkVBQTZFO0lBQzdFLDhFQUE4RTtJQUN2RSxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBRTVCLGtGQUFrRjtJQUNsRixrREFBa0Q7SUFDMUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFO1FBQ3ZCLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDL0QsQ0FBQztJQUVNLE9BQU8sQ0FBQyxRQUFhLEVBQUUsRUFBRSxTQUF3QixFQUFFO1FBQ3hELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFDWixLQUFLLEVBQ0w7WUFDRSxHQUFHLEVBQUUsU0FBUztZQUNkLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsNEVBQTRFO0lBQzVFLDhFQUE4RTtJQUN2RSxJQUFJLENBQUMsUUFBYSxFQUFFLEVBQUUsU0FBd0IsRUFBRTtRQUNyRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxFQUFFLEVBQ1osS0FBSyxFQUNMLE1BQU0sQ0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVNLE1BQU0sQ0FBQyxJQUFZLEVBQUUsaUJBQXlCLElBQUksRUFBRSxTQUF3QixFQUFFO1FBQ25GLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFDWixFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsRUFDeEI7WUFDRSxHQUFHLEVBQUUsUUFBUTtZQUNiLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUseUVBQXlFO0lBQ3pFLDRCQUE0QjtJQUNyQixVQUFVLENBQUMsUUFBZ0IsRUFBRSxjQUE2QixFQUFFLFNBQXdCLEVBQUU7UUFDM0YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQ3pCLEVBQUUsY0FBYyxFQUFFLEVBQ2xCO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRU0sWUFBWSxDQUNqQixJQUFZLEVBQ1osdUJBQStCLElBQUksRUFDbkMsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUNyQixFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxFQUM5QjtZQUNFLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDhFQUE4RTtJQUM5RSw0RUFBNEU7SUFDckUsWUFBWSxDQUNqQixjQUFzQixFQUN0QixNQUErQixFQUMvQixTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxjQUFjLEVBQUUsQ0FBQyxFQUN2QyxNQUFNLEVBQ047WUFDRSxHQUFHLEVBQUUsUUFBUTtZQUNiLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsZ0RBQWdEO0lBQ3pDLFlBQVksQ0FBQyxjQUFzQixFQUFFLFNBQXdCLEVBQUU7UUFDcEUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLGNBQWMsRUFBRSxDQUFDLEVBQ3ZDLEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UsOEJBQThCO0lBQ3ZCLGNBQWMsQ0FBQyxjQUFzQixFQUFFLFNBQXdCLEVBQUU7UUFDdEUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLGNBQWMsV0FBVyxDQUFDLEVBQ2hELEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLE1BQU0sQ0FBQyxRQUFnQixFQUFFLElBQVksRUFBRSxTQUF3QixFQUFFO1FBQ3RFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUN6QixFQUFFLElBQUksRUFBRSxFQUNSO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDhEQUE4RDtJQUM5RCxvRUFBb0U7SUFDcEUsc0VBQXNFO0lBQ3RFLDRFQUE0RTtJQUM1RSx3RUFBd0U7SUFDeEUsZ0VBQWdFO0lBQ3pELE1BQU0sQ0FBQyxRQUFnQixFQUFFLFFBQWlDLEVBQUUsU0FBd0IsRUFBRTtRQUMzRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFDekIsUUFBUSxFQUNSO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsK0RBQStEO0lBQ3hELE9BQU8sQ0FBQyxRQUFnQixFQUFFLFNBQXdCLEVBQUU7UUFDekQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsUUFBUSxDQUFDLEVBQy9CLEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxNQUFNO1lBQ1gsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHdFQUF3RTtJQUN4RSx5RUFBeUU7SUFDekUsa0VBQWtFO0lBQzNELFVBQVUsQ0FDZixRQUFnQixFQUNoQixNQUFjLEVBQ2QsSUFBK0MsRUFDL0MsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxVQUFVLE1BQU0sRUFBRSxDQUFDLEVBQ3pDLElBQUksRUFDSjtZQUNFLEdBQUcsRUFBRSxNQUFNO1lBQ1gsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHVFQUF1RTtJQUN2RSwyRUFBMkU7SUFDM0UsYUFBYTtJQUNOLFVBQVUsQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBRSxTQUF3QixFQUFFO1FBQzVFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFVBQVUsTUFBTSxFQUFFLENBQUMsRUFDekMsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLE1BQU07WUFDWCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLG9FQUFvRTtJQUM3RCxpQkFBaUIsQ0FDdEIsUUFBZ0IsRUFDaEIsU0FBOEMsRUFDOUMsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxrQkFBa0IsQ0FBQyxFQUN6QyxFQUFFLFNBQVMsRUFBRSxFQUNiO1lBQ0UsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDZFQUE2RTtJQUM3RSxvRUFBb0U7SUFDN0QsZUFBZSxDQUNwQixRQUFnQixFQUNoQixXQUFtQixFQUNuQixRQUFpQyxFQUNqQyxTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGVBQWUsV0FBVyxXQUFXLENBQUMsRUFDNUQsUUFBUSxFQUNSO1lBQ0UsR0FBRyxFQUFFLFdBQVc7WUFDaEIsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHlFQUF5RTtJQUN6RSw0RUFBNEU7SUFDNUUsMkRBQTJEO0lBQ3BELE9BQU8sQ0FDWixRQUFnQixFQUNoQixJQUFvRixFQUNwRixTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGFBQWEsQ0FBQyxFQUNwQyxJQUFJLEVBQ0o7WUFDRSxHQUFHLEVBQUUsV0FBVztZQUNoQixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDJFQUEyRTtJQUMzRSx3RUFBd0U7SUFDakUsZUFBZSxDQUNwQixRQUFnQixFQUNoQixXQUFtQixFQUNuQixTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGVBQWUsV0FBVyxFQUFFLENBQUMsRUFDbkQsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLFdBQVc7WUFDaEIsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHFFQUFxRTtJQUNyRSwyREFBMkQ7SUFDcEQsTUFBTSxDQUFDLFFBQWdCLEVBQUUsU0FBd0IsRUFBRTtRQUN4RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFDekIsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLDhFQUE4RTtJQUM5RSxnRUFBZ0U7SUFDekQsUUFBUSxDQUFDLFFBQWdCLEVBQUUsU0FBd0IsRUFBRTtRQUMxRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxXQUFXLENBQUMsRUFDbEMsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLHVFQUF1RTtJQUN2RSwyRUFBMkU7SUFDM0Usc0JBQXNCO0lBQ2YsR0FBRyxDQUFDLFFBQWdCLEVBQUUsU0FBd0IsRUFBRTtRQUNyRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFDekIsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUN2QztZQUNFLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGlFQUFpRTtJQUNqRSwyQkFBMkI7SUFDcEIsYUFBYSxDQUNsQixRQUFnQixFQUNoQixTQUFnRyxFQUNoRyxTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLHVCQUF1QixDQUFDLEVBQzlDLEVBQUUsU0FBUyxFQUFFLEVBQ2I7WUFDRSxHQUFHLEVBQUUsSUFBSTtZQUNULEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsb0VBQW9FO0lBQ3BFLEVBQUU7SUFDRiwyRUFBMkU7SUFDM0UsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSx1Q0FBdUM7SUFDaEMsYUFBYSxDQUNsQixRQUFnQixFQUNoQixXQUFtQixFQUNuQixVQUFpQyxFQUFFLEVBQ25DLFFBQTRCLEVBQUUsRUFDOUIsUUFBUSxHQUFHLEtBQUssRUFDaEIsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxlQUFlLFdBQVcsT0FBTyxDQUFDLEVBQ3hELEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQ3BDO1lBQ0UsR0FBRyxFQUFFLE1BQU07WUFDWCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLDhEQUE4RDtJQUM5RCxtRUFBbUU7SUFDbkUsbUVBQW1FO0lBQ25FLHdFQUF3RTtJQUN4RSwwRUFBMEU7SUFDMUUsOERBQThEO0lBQzlELG1CQUFtQjtJQUNaLGFBQWEsQ0FDbEIsUUFBZ0IsRUFDaEIsV0FBbUIsRUFDbkIsT0FBOEIsRUFDOUIsS0FBeUIsRUFDekIsSUFBaUIsRUFDakIsUUFBUSxHQUFHLEtBQUssRUFDaEIsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyQixhQUFhLENBQUMsSUFBSSxFQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxlQUFlLFdBQVcsT0FBTyxDQUFDLEVBQ3hELEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUMxQyxNQUFNLENBQ1AsQ0FBQztJQUNKLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsMEVBQTBFO0lBQzFFLDBFQUEwRTtJQUMxRSw0RUFBNEU7SUFDNUUsaUVBQWlFO0lBQ2pFLEVBQUU7SUFDRixzRUFBc0U7SUFDdEUsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSxvRkFBb0Y7SUFDcEYseUVBQXlFO0lBQ3pFLG9CQUFvQjtJQUNwQixFQUFFO0lBQ0Ysd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSwwRUFBMEU7SUFDMUUsVUFBVTtJQUNILFVBQVUsQ0FDZixRQUFnQixFQUNoQixNQUFjLEVBQ2QsVUFBaUMsRUFBRSxFQUNuQyxRQUFRLEdBQUcsS0FBSyxFQUNoQixTQUF3QixFQUFFLEVBQzFCLG1CQUE2QixFQUFFO1FBRS9CLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFVBQVUsTUFBTSxTQUFTLENBQUMsRUFDaEQsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQ3ZGO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLDRFQUE0RTtJQUM1RSwyREFBMkQ7SUFDM0QsRUFBRTtJQUNGLDRFQUE0RTtJQUM1RSx5RUFBeUU7SUFDekUsNEVBQTRFO0lBQzVFLHlFQUF5RTtJQUN6RSwwRUFBMEU7SUFDMUUsMEVBQTBFO0lBQzFFLHNFQUFzRTtJQUMvRCxlQUFlLENBQ3BCLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFVBQWlDLEVBQUUsRUFDbkMsUUFBNEIsRUFBRSxFQUM5QixLQUFLLEdBQUcsRUFBRSxFQUNWLFNBQXdCLEVBQUUsRUFDMUIsU0FBNkIsS0FBSztRQUVsQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxlQUFlLFdBQVcsU0FBUyxDQUFDLEVBQzFELEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQ2xFO1lBQ0UsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLDhFQUE4RTtJQUM5RSw4RUFBOEU7SUFDOUUsMkVBQTJFO0lBQzNFLDRFQUE0RTtJQUM1RSxrSEFBa0g7SUFDbEgsaUVBQWlFO0lBQ2pFLHNFQUFzRTtJQUN0RSxzRUFBc0U7SUFDdEUsdUVBQXVFO0lBQ3ZFLDRIQUE0SDtJQUM1SCx1RUFBdUU7SUFDdkUsMEVBQTBFO0lBQzFFLDBFQUEwRTtJQUMxRSxxRUFBcUU7SUFDckUsOEJBQThCO0lBQ3ZCLFlBQVksQ0FDakIsUUFBZ0IsRUFDaEIsVUFBaUMsRUFBRSxFQUNuQyxTQUF3QixJQUFJLEVBQzVCLFlBQXFDLElBQUksRUFDekMsY0FBa0MsRUFBRSxFQUNwQyxTQUE2QyxFQUFFLEVBQy9DLFNBQWlDLEVBQUUsRUFDbkMsU0FBd0IsRUFBRSxFQUMxQixTQUE2QixLQUFLO1FBRWxDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFNBQVMsQ0FBQyxFQUNoQztZQUNFLE9BQU87WUFDUCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDN0IsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25DLGFBQWEsRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ25ELEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakQsR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN4QyxFQUNEO1lBQ0UsR0FBRyxFQUFFLEtBQUs7WUFDVixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsc0VBQXNFO0lBQy9ELGFBQWEsQ0FBQyxRQUFnQixFQUFFLFFBQWdCLEVBQUUsU0FBd0IsRUFBRTtRQUNqRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxZQUFZLFFBQVEsVUFBVSxDQUFDLEVBQ3JELEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxTQUFTO1lBQ2QsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxFQUFFO0lBQ0YsOEVBQThFO0lBQzlFLDJFQUEyRTtJQUMzRSx3RUFBd0U7SUFDeEUsb0VBQW9FO0lBQ3BFLEVBQUU7SUFDRiw4RUFBOEU7SUFDOUUseUVBQXlFO0lBQ3pFLGtDQUFrQztJQUMzQixZQUFZLENBQ2pCLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFNBQXdCLEVBQUU7UUFFMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsZUFBZSxXQUFXLE1BQU0sQ0FBQyxFQUN2RCxFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsSUFBSTtZQUNULEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsNERBQTREO0lBQ3JELGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsV0FBbUIsRUFBRSxTQUF3QixFQUFFO1FBQ3ZGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGVBQWUsV0FBVyxVQUFVLENBQUMsRUFDM0QsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSxzREFBc0Q7SUFDL0MsU0FBUyxDQUNkLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLE1BQWlHLEVBQ2pHLFNBQXdCLEVBQUU7UUFFMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsZUFBZSxXQUFXLFVBQVUsQ0FBQyxFQUMzRCxNQUFNLEVBQ047WUFDRSxHQUFHLEVBQUUsUUFBUTtZQUNiLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxzREFBc0Q7SUFDL0MsWUFBWSxDQUNqQixRQUFnQixFQUNoQixRQUFnQixFQUNoQixPQUE4QyxFQUM5QyxTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFlBQVksUUFBUSxFQUFFLENBQUMsRUFDN0MsT0FBTyxFQUNQO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsa0VBQWtFO0lBQzNELFlBQVksQ0FBQyxRQUFnQixFQUFFLFFBQWdCLEVBQUUsU0FBd0IsRUFBRTtRQUNoRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxZQUFZLFFBQVEsRUFBRSxDQUFDLEVBQzdDLEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDBFQUEwRTtJQUMxRSw0REFBNEQ7SUFDckQsWUFBWSxDQUFDLFNBQXdCLEVBQUU7UUFDNUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFDMUIsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDZFQUE2RTtJQUN0RSxnQkFBZ0IsQ0FBQyxPQUFlLEVBQUUsU0FBd0IsRUFBRTtRQUNqRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUMxQixFQUFFLE9BQU8sRUFBRSxFQUNYO1lBQ0UsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMkVBQTJFO0lBQ3BFLGtCQUFrQixDQUFDLGFBQXFCLEVBQUUsU0FBd0IsRUFBRTtRQUN6RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixhQUFhLFVBQVUsQ0FBQyxFQUNuRCxFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsSUFBSTtZQUNULEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUN0RSxhQUFhLENBQUMsU0FBd0IsRUFBRTtRQUM3QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyQixNQUFNLEVBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUM1QixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFDaEIsTUFBTSxDQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsOERBQThEO0lBQ3ZELG1CQUFtQixDQUFDLFNBQXdCLEVBQUU7UUFDbkQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUM1QixFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsSUFBSTtZQUNULEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCx5RUFBeUU7SUFDbEUsaUJBQWlCLENBQUMsU0FBd0IsRUFBRTtRQUNqRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEVBQ2pDLEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxPQUFPO1lBQ1osR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDJFQUEyRTtJQUMzRSw0RUFBNEU7SUFDNUUsc0NBQXNDO0lBQy9CLHVCQUF1QixDQUFDLE1BQWMsRUFBRSxTQUF3QixFQUFFO1FBQ3ZFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLE1BQU0sWUFBWSxDQUFDLEVBQ25ELEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxpQkFBaUI7WUFDdEIsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGtGQUFrRjtJQUMzRSxRQUFRLENBQUMsU0FBd0IsRUFBRTtRQUN4QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUN0QixFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsVUFBVTtZQUNmLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsMEVBQTBFO0lBQzFFLDZFQUE2RTtJQUM3RSwwRUFBMEU7SUFDbkUsT0FBTyxDQUFDLFNBQXdCLEVBQUU7UUFDdkMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFDckIsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsc0VBQXNFO0lBQy9ELFlBQVksQ0FBQyxRQUE4QyxFQUFFLFNBQXdCLEVBQUU7UUFDNUYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFDdEIsUUFBUSxFQUNSO1lBQ0UsR0FBRyxFQUFFLFVBQVU7WUFDZixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLDZFQUE2RTtJQUM3RSx3RUFBd0U7SUFDeEUsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUM3RSwyRUFBMkU7SUFDM0UsK0NBQStDO0lBQ3hDLGlCQUFpQixDQUN0QixRQUFnQixFQUNoQixPQUFlLEVBQ2YsT0FBaUMsRUFDakMsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxpQkFBaUIsT0FBTyxFQUFFLENBQUMsRUFDakQsT0FBTyxFQUNQO1lBQ0UsR0FBRyxFQUFFLGFBQWE7WUFDbEIsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHNFQUFzRTtJQUN0RSwwRUFBMEU7SUFDMUUseUVBQXlFO0lBQ3pFLGdDQUFnQztJQUN6QixxQkFBcUIsQ0FDMUIsUUFBZ0IsRUFDaEIsUUFBZ0IsRUFDaEIsSUFBZ0MsRUFDaEMsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxZQUFZLFFBQVEsVUFBVSxDQUFDLEVBQ3JELElBQUksRUFDSjtZQUNFLEdBQUcsRUFBRSxTQUFTO1lBQ2QsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHlFQUF5RTtJQUN6RSxtQkFBbUI7SUFDWixZQUFZLENBQUMsUUFBZ0IsRUFBRSxTQUF3QixFQUFFO1FBQzlELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGVBQWUsQ0FBQyxFQUN0QyxFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsY0FBYztZQUNuQixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMkVBQTJFO0lBQ3BFLGlCQUFpQixDQUN0QixRQUFnQixFQUNoQixXQUErQyxFQUMvQyxTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGVBQWUsQ0FBQyxFQUN0QyxXQUFXLEVBQ1g7WUFDRSxHQUFHLEVBQUUsYUFBYTtZQUNsQixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsNkVBQTZFO0lBQ3RFLGlCQUFpQixDQUN0QixRQUFnQixFQUNoQixtQkFBMkIsRUFDM0IsT0FBaUMsRUFDakMsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxpQkFBaUIsbUJBQW1CLEVBQUUsQ0FBQyxFQUM3RCxPQUFPLEVBQ1A7WUFDRSxHQUFHLEVBQUUsYUFBYTtZQUNsQixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRU0saUJBQWlCLENBQ3RCLFFBQWdCLEVBQ2hCLG1CQUEyQixFQUMzQixTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGlCQUFpQixtQkFBbUIsRUFBRSxDQUFDLEVBQzdELEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxhQUFhO1lBQ2xCLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsNkNBQTZDO0lBQ3RDLHdCQUF3QixDQUM3QixRQUFnQixFQUNoQixvQkFBOEIsRUFDOUIsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSx5QkFBeUIsQ0FBQyxFQUNoRCxFQUFFLG9CQUFvQixFQUFFLEVBQ3hCO1lBQ0UsR0FBRyxFQUFFLGNBQWM7WUFDbkIsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQzt3R0E3ekJVLFVBQVU7NEdBQVYsVUFBVSxjQUZULE1BQU07OzRGQUVQLFVBQVU7a0JBSHRCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEZzQXBpLCBSZXF1ZXN0Q29uZmlnLCBSZXF1ZXN0TWV0aG9kLCBTdHJlYW1FdmVudCB9IGZyb20gJ0BmaXJlc3RpdGNoL2FwaSc7XG5pbXBvcnQgeyBHcmlkUmVxdWVzdCB9IGZyb20gJ0BmaXJlc3RpdGNoL2dyaWQnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlcG9ydEV4cG9ydExpbmUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1leHBvcnQtbGluZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZmlsdGVyLWdyb3VwLWNoYW5nZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck9wdGlvbnNSZXF1ZXN0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMtcmVxdWVzdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWZpbHRlci1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRTYXZlZEZpbHRlckNoYW5nZXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1zYXZlZC1maWx0ZXItY2hhbmdlcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0U2F2ZWRGaWx0ZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1zYXZlZC1maWx0ZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIENoYXJ0R3JhbnVsYXJpdHksXG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgQ29tcG9uZW50RXhwb3J0UmVzcG9uc2UsXG4gIFJlcG9ydENvbXBvbmVudFNxbCxcbiAgUmVwb3J0TG9jYWxlcyxcbiAgUmVwb3J0UGFnZVZhbHVlLFxuICBSZXBvcnRUcmVlLFxuICBSZXNvbHZlZEZpbHRlclZhbHVlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0Rm9ybWF0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZXhwb3J0LWZvcm1hdC50eXBlJztcbmltcG9ydCB7IFZJRVdFUl9GRUFUVVJFUyB9IGZyb20gJy4uL3JlcG9ydC12aWV3ZXItZmVhdHVyZXMnO1xuXG5cbi8vIEFQSSBnYXRld2F5IGZvciB0aGUgUmVwb3J0cyBtb2R1bGUuIEV2ZXJ5IGVuZHBvaW50IGhhbmdzIG9mZiBbYmFzZVBhdGhdLFxuLy8gd2hpY2ggZGVmYXVsdHMgdG8gXCJyZXBvcnRzXCIgKHRoZSBmcmFtZXdvcmsgcmVwb3J0cyBiYWNrZW5kIGF0IC9hcGkvcmVwb3J0cylcbi8vIGFuZCBjYW4gYmUgcmVwb2ludGVkIGJ5IHRoZSBob3N0IHNvIHRoZSBwYWNrYWdlIHN0YXlzIHNlbGYtY29udGFpbmVkIGFuZCBwb3J0YWJsZS5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnREYXRhPFQgPSBhbnk+IHtcbiAgcHJpdmF0ZSBfYXBpID0gaW5qZWN0KEZzQXBpKTtcblxuICAvLyBUaGUgQVBJIHJvb3QgZm9yIGV2ZXJ5IHJlcG9ydHMgZW5kcG9pbnQuIERlZmF1bHRzIHRvIHRoZSBmcmFtZXdvcmsgcmVwb3J0c1xuICAvLyBjb250ZXh0OyBzZXQgaXQgb25jZSAoZS5nLiBmcm9tIHRoZSBob3N0J3MgcmVwb3J0IHBhZ2UpIHRvIG1vdW50IGVsc2V3aGVyZS5cbiAgcHVibGljIGJhc2VQYXRoID0gJ3JlcG9ydHMnO1xuXG4gIC8vIEJ1aWxkIGFuIGVuZHBvaW50IHBhdGggdW5kZXIgdGhlIGNvbmZpZ3VyZWQgYmFzZSwgZS5nLiBfcGF0aCgpID0+IFwiYWkvcmVwb3J0c1wiLFxuICAvLyBfcGF0aChgJHtpZH0vcGFnZXNgKSA9PiBcImFpL3JlcG9ydHMvMTIzL3BhZ2VzXCIuXG4gIHByaXZhdGUgX3BhdGgoc3VmZml4ID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdWZmaXggPyBgJHt0aGlzLmJhc2VQYXRofS8ke3N1ZmZpeH1gIDogdGhpcy5iYXNlUGF0aDtcbiAgfVxuXG4gIHB1YmxpYyByZXBvcnRzKHF1ZXJ5OiBhbnkgPSB7fSwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoKSxcbiAgICAgIHF1ZXJ5LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnRzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gQm90aCBoYWx2ZXMgb2YgdGhlIGxpc3Rpbmcg4oCUIHJlcG9ydHMgQU5EIHRoZSBmb2xkZXJzIHRoZXkgYXJlIGZpbGVkIGludG8g4oCUXG4gIC8vIGZyb20gdGhlIG9uZSBHRVQuIE5vIGBrZXlgLCBiZWNhdXNlIHRoZSB3aG9sZSBwYXlsb2FkIGlzIHRoZSBhbnN3ZXIgaGVyZTtcbiAgLy8gcmVwb3J0cygpIGtlZXBzIGl0cyAncmVwb3J0cycga2V5IGZvciBjYWxsZXJzIHRoYXQgb25seSB3YW50IHRoZSBmbGF0IGxpc3QuXG4gIHB1YmxpYyB0cmVlKHF1ZXJ5OiBhbnkgPSB7fSwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFJlcG9ydFRyZWU+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoKSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgY29uZmlnLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlKG5hbWU6IHN0cmluZywgcmVwb3J0Rm9sZGVySWQ6IG51bWJlciA9IG51bGwsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aCgpLFxuICAgICAgeyBuYW1lLCByZXBvcnRGb2xkZXJJZCB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBGaWxlIGEgcmVwb3J0IHVuZGVyIGEgZm9sZGVyLCBvciBwYXNzIG51bGwgdG8gbW92ZSBpdCB0byB0aGUgcm9vdC4gU2VudFxuICAvLyBleHBsaWNpdGx5IChuZXZlciBvbWl0dGVkKSBzbyB0aGUgYmFja2VuZCBjYW4gdGVsbCBcIm1vdmUgdG8gcm9vdFwiIGZyb21cbiAgLy8gXCJsZWF2ZSB0aGUgZm9sZGVyIGFsb25lXCIuXG4gIHB1YmxpYyBtb3ZlUmVwb3J0KHJlcG9ydElkOiBudW1iZXIsIHJlcG9ydEZvbGRlcklkOiBudW1iZXIgfCBudWxsLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH1gKSxcbiAgICAgIHsgcmVwb3J0Rm9sZGVySWQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUZvbGRlcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50UmVwb3J0Rm9sZGVySWQ6IG51bWJlciA9IG51bGwsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoJ2ZvbGRlcnMnKSxcbiAgICAgIHsgbmFtZSwgcGFyZW50UmVwb3J0Rm9sZGVySWQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZm9sZGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVuYW1lIGFuZC9vciBtb3ZlIGEgZm9sZGVyLiBPbmx5IHRoZSBrZXlzIHBhc3NlZCBhcmUgYWN0ZWQgb24gc2VydmVyLXNpZGUsXG4gIC8vIHNvIGEgcmVuYW1lIG5ldmVyIGRpc3R1cmJzIHRoZSBwYXJlbnQgYW5kIGEgZHJhZyBuZXZlciBkaXN0dXJicyB0aGUgbmFtZS5cbiAgcHVibGljIHVwZGF0ZUZvbGRlcihcbiAgICByZXBvcnRGb2xkZXJJZDogbnVtYmVyLFxuICAgIGZvbGRlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgZm9sZGVycy8ke3JlcG9ydEZvbGRlcklkfWApLFxuICAgICAgZm9sZGVyLFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBTb2Z0LWRlbGV0ZSwgd2hhdGV2ZXIgdGhlIGZvbGRlciBob2xkczogaXRzIGNvbnRlbnRzIGxlYXZlIHRoZSBsaXN0aW5nIHdpdGhcbiAgLy8gaXQsIGFuZCB1bmRlbGV0ZUZvbGRlcigpIGJyaW5ncyB0aGUgbG90IGJhY2suXG4gIHB1YmxpYyBkZWxldGVGb2xkZXIocmVwb3J0Rm9sZGVySWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYGZvbGRlcnMvJHtyZXBvcnRGb2xkZXJJZH1gKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSZXN0b3JlIGEgc29mdC1kZWxldGVkIGZvbGRlciB0aHJvdWdoIGl0cyBvd24gYWN0aW9uIGVuZHBvaW50IOKAlCB0aGUgZm9sZGVyXG4gIC8vIFBVVCBkb2VzIG5vdCBhY2NlcHQgYHN0YXRlYC4gQW55IGRlbGV0ZWQgZm9sZGVyIGFib3ZlIGl0IGlzIHJlc3RvcmVkIHRvbywgc29cbiAgLy8gaXQgbGFuZHMgYmFjayB3aGVyZSBpdCB3YXMuXG4gIHB1YmxpYyB1bmRlbGV0ZUZvbGRlcihyZXBvcnRGb2xkZXJJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYGZvbGRlcnMvJHtyZXBvcnRGb2xkZXJJZH0vdW5kZWxldGVgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lKHJlcG9ydElkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9YCksXG4gICAgICB7IG5hbWUgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVwb3J0IHNldHRpbmdzOiBhbnkgc3Vic2V0IG9mIHsgbmFtZSwgcGFnZVdpZHRoLCBwYWdlSGVpZ2h0LCB0aW1lem9uZSxcbiAgLy8gbG9jYWxlLCBjdXJyZW5jeSwgc3R5bGVzLCBoZWFkZXJGb290ZXIgfSDigJQgc3R5bGVzIGNhcnJ5IHRoZVxuICAvLyByZXBvcnQncyB0eXBvZ3JhcGhpYyBjb25maWcgKGUuZy4gaGVhZGluZyBzaXplKSwgaGVhZGVyRm9vdGVyIHRoZVxuICAvLyBoZWFkZXIvZm9vdGVyIGJhbmQgZGVwdGhzIGluIGluY2hlcy4gVGhlIHBhZ2Ugc2l6ZSBpcyBpbiBpbmNoZXMgYW5kXG4gIC8vIHdpZHRoL2hlaWdodCBnbyB0b2dldGhlci4gbG9jYWxlIChhIEJDUCA0NyB0YWcpIGFuZCBjdXJyZW5jeSAoYW4gSVNPIDQyMTdcbiAgLy8gY29kZSkgYXJlIGVhY2ggc2VudCBvbmx5IHRvIGNoYW5nZSB0aGVtOyAnJyByZXR1cm5zIHRoZSByZXBvcnQgdG8gdGhlXG4gIC8vIGRlZmF1bHQsIGFuZCB0aGUgY3VycmVuY3kgb25seSBuYW1lcyB3aGF0IHRoZSBhbW91bnRzIGFyZSBpbi5cbiAgcHVibGljIHVwZGF0ZShyZXBvcnRJZDogbnVtYmVyLCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAgc2V0dGluZ3MsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFwcGVuZCBhIGJsYW5rIHBhZ2UgdG8gdGhlIHJlcG9ydDsgcmVzb2x2ZXMgdG8gdGhlIG5ldyBwYWdlLlxuICBwdWJsaWMgYWRkUGFnZShyZXBvcnRJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3BhZ2VzYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncGFnZScsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFueSBzdWJzZXQgb2YgeyBuYW1lLCBtYXN0ZXJIaWRkZW4gfS4gQW4gZW1wdHkgbmFtZSBpcyBzdG9yZWQgYXMgbnVsbFxuICAvLyBzZXJ2ZXItc2lkZSwgd2hpY2ggcHV0cyB0aGUgdGFiIGJhY2sgb24gaXRzIHBvc2l0aW9uYWwgXCJQYWdlIE5cIiBsYWJlbDtcbiAgLy8gbWFzdGVySGlkZGVuIGhpZGVzIHRoZSByZXBvcnQncyBoZWFkZXIgYW5kIGZvb3RlciBvbiB0aGlzIHBhZ2UuXG4gIHB1YmxpYyB1cGRhdGVQYWdlKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcGFnZUlkOiBudW1iZXIsXG4gICAgcGFnZTogeyBuYW1lPzogc3RyaW5nOyBtYXN0ZXJIaWRkZW4/OiBib29sZWFuIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vcGFnZXMvJHtwYWdlSWR9YCksXG4gICAgICBwYWdlLFxuICAgICAge1xuICAgICAgICBrZXk6ICdwYWdlJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gRGVsZXRlIGEgcGFnZSBhbmQgZXZlcnl0aGluZyBvbiBpdC4gUmVmdXNlZCBzZXJ2ZXItc2lkZSBmb3IgdGhlIGxhc3RcbiAgLy8gcmVtYWluaW5nIHBhZ2Ug4oCUIGEgcmVwb3J0IHdpdGggbm8gY2FudmFzIGlzIGEgZGVsZXRlZCByZXBvcnQsIG5vdCBhIHBhZ2VcbiAgLy8gb3BlcmF0aW9uLlxuICBwdWJsaWMgZGVsZXRlUGFnZShyZXBvcnRJZDogbnVtYmVyLCBwYWdlSWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3BhZ2VzLyR7cGFnZUlkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3BhZ2UnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBQZXJzaXN0IHRoZSB0YWIgb3JkZXIgYWZ0ZXIgYSBkcmFnIOKAlCB0aGUgd2hvbGUgbGlzdCwgaW4gaXRzIG5ldyBvcmRlciwgc29cbiAgLy8gdGhlIHNlcXVlbmNlIHN0YXlzIGdhcGxlc3Mgd2l0aG91dCB0aGUgc2VydmVyIGluZmVycmluZyB0aGUgbW92ZS5cbiAgcHVibGljIHNhdmVQYWdlUG9zaXRpb25zKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcG9zaXRpb25zOiB7IHBhZ2VJZDogbnVtYmVyOyBvcmRlcjogbnVtYmVyIH1bXSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9wYWdlcy9wb3NpdGlvbnNgKSxcbiAgICAgIHsgcG9zaXRpb25zIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gQ29tcG9uZW50IHNldHRpbmdzOiBhbnkgc3Vic2V0IG9mIHsgdGl0bGUsIHBhZGRpbmcgfSDigJQgdGhlIGh1bWFuLWZhY2luZ1xuICAvLyBkaWFsb2cgZWRpdHMg4oCUIG9yIGEgdGV4dCBibG9jaydzIHsgaHRtbCB9IGZyb20gaXRzIGlubGluZSBlZGl0b3I7IGdlb21ldHJ5XG4gIC8vICh4L3kvdy9oKSBpcyBwZXJzaXN0ZWQgdmlhIHNhdmVQb3NpdGlvbnMgZnJvbSB0aGUgY2FudmFzIGluc3RlYWQuXG4gIHB1YmxpYyB1cGRhdGVDb21wb25lbnQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L3NldHRpbmdzYCksXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnY29tcG9uZW50JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUGxhY2UgYSB0ZXh0IGJsb2NrIOKAlCBvbiBhIHBhZ2UsIG9yIGluIHRoZSBoZWFkZXIvZm9vdGVyIHdoZW4gcGFnZUlkIGlzXG4gIC8vIG9taXR0ZWQuIFRoZSBvbmx5IGNvbXBvbmVudCB0aGUgVUkgY3JlYXRlcyBpdHNlbGY6IGNoYXJ0cywgbGlzdHMgYW5kIEtQSXNcbiAgLy8gbmVlZCBhIHF1ZXJ5IGFuZCBjb21lIGZyb20gdGhlIGNoYXQuIFJlc29sdmVzIHRvIHsgaWQgfS5cbiAgcHVibGljIGFkZFRleHQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICB0ZXh0OiB7IHBhZ2VJZD86IG51bWJlcjsgaHRtbD86IHN0cmluZzsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHNgKSxcbiAgICAgIHRleHQsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2NvbXBvbmVudCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIERlbGV0ZSBvbmUgY29tcG9uZW50IGZyb20gdGhlIGNhbnZhcywgdG9nZXRoZXIgd2l0aCBpdHMgZmlsdGVycyBhbmQgYW55XG4gIC8vIGZpbHRlciBncm91cCB0aGV5IGxlYXZlIGVtcHR5LiBTb2Z0IHNlcnZlci1zaWRlLCBidXQgdGhlcmUgaXMgbm8gcmVzdG9yZVxuICAvLyBhbnl3aGVyZSBpbiB0aGUgVUksIHNvIHRoZSBkaWFsb2cncyBjb25maXJtIHByZXNlbnRzIGl0IGFzIHBlcm1hbmVudC5cbiAgcHVibGljIGRlbGV0ZUNvbXBvbmVudChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZGVsZXRlKFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2NvbXBvbmVudCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNvZnQtZGVsZXRlOiB0aGUgcmVwb3J0IGxlYXZlcyB0aGUgbGlzdGluZyBidXQga2VlcHMgaXRzIHBhZ2VzIGFuZFxuICAvLyBjb21wb25lbnRzLCBzbyB1bmRlbGV0ZSgpIGJyaW5ncyBiYWNrIHRoZSBzYW1lIGRvY3VtZW50LlxuICBwdWJsaWMgZGVsZXRlKHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5kZWxldGUoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgYSBzb2Z0LWRlbGV0ZWQgcmVwb3J0IHRocm91Z2ggaXRzIG93biBhY3Rpb24gZW5kcG9pbnQg4oCUIHRoZSByZXBvcnRcbiAgLy8gUFVUIGRvZXMgbm90IGFjY2VwdCBgc3RhdGVgLiBJdHMgZm9sZGVyIGlzIHJlc3RvcmVkIHRvbyB3aGVuIGl0IGlzIGRlbGV0ZWQsXG4gIC8vIG9yIGluc2lkZSBvbmUgdGhhdCBpcywgc28gdGhlIHJlcG9ydCBsYW5kcyBiYWNrIHdoZXJlIGl0IHdhcy5cbiAgcHVibGljIHVuZGVsZXRlKHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vdW5kZWxldGVgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgYXNzZW1ibGVkIHN0cnVjdHVyZTogcGFnZXMg4oaSIGNvbXBvbmVudHMgKCsgdGhlaXIgZmlsdGVycykgYW5kIHRoZVxuICAvLyByZXBvcnQncyBmaWx0ZXIgZ3JvdXBzLiBgZmVhdHVyZXNgIG5hbWVzIHdoYXQgdGhpcyB2aWV3ZXIgaW1wbGVtZW50c1xuICAvLyAoVklFV0VSX0ZFQVRVUkVTKSwgc28gdGhlIHNlcnZlciBzZW5kcyBldmVyeSBncm91cCBpbiBhIHNoYXBlIHRoZSB2aWV3ZXJcbiAgLy8gY2FuIHNob3cgYW5kIGNsZWFyLlxuICBwdWJsaWMgZ2V0KHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAgeyBmZWF0dXJlczogVklFV0VSX0ZFQVRVUkVTLmpvaW4oJywnKSB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBQZXJzaXN0IGdlb21ldHJ5IGZvciB0aGUgbW92ZWQgY29tcG9uZW50cyBvbmx5IOKAlCBhbnkgc3Vic2V0IG9mXG4gIC8vIHsgeCwgeSwgdywgaCB9IChpbmNoZXMpLlxuICBwdWJsaWMgc2F2ZVBvc2l0aW9ucyhcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIHBvc2l0aW9uczogKHsgY29tcG9uZW50SWQ6IG51bWJlciB9ICYgUGFydGlhbDx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9PilbXSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzL3Bvc2l0aW9uc2ApLFxuICAgICAgeyBwb3NpdGlvbnMgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBPbmUgY29tcG9uZW50J3MgZGF0YS4gVGhlIGJvZHkgY2FycmllcyBldmVyeXRoaW5nIHNlc3Npb24tc2NvcGVkOiB0aGVcbiAgLy8gcmVzb2x2ZWQgZmlsdGVyIHZhbHVlcyBhbmQgdGhlIGNvbXBvbmVudCdzIG93biBpbnRlcmFjdGlvbiBzdGF0ZS5cbiAgLy9cbiAgLy8gYGlzRXhwb3J0YCBtYXJrcyB0aGUgcmVhZCBhcyBwYXJ0IG9mIGEgUERGL1Bvd2VyUG9pbnQgcmVuZGVyLiBUaGUgc2VydmVyXG4gIC8vIGdpdmVzIHRob3NlIGEgbG9uZ2VyIHBlci1zdGF0ZW1lbnQgY2VpbGluZyB0aGFuIGFuIG9uLXNjcmVlbiB0aWxlLCBiZWNhdXNlXG4gIC8vIGEgcmVhZGVyIHdhdGNoaW5nIGFuIGV4cG9ydCBwcm9ncmVzcyBiYXIgY2FuIHdhaXQgZm9yIGEgcXVlcnkgbm9ib2R5IHdvdWxkXG4gIC8vIHRvbGVyYXRlIHdhaXRpbmcgZm9yIG9uIGEgZGFzaGJvYXJkLlxuICBwdWJsaWMgY29tcG9uZW50RGF0YShcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgZmlsdGVyczogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW10sXG4gICAgc3RhdGU6IENvbXBvbmVudERhdGFTdGF0ZSA9IHt9LFxuICAgIGlzRXhwb3J0ID0gZmFsc2UsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vZGF0YWApLFxuICAgICAgeyBmaWx0ZXJzLCBzdGF0ZSwgZXhwb3J0OiBpc0V4cG9ydCB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdkYXRhJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gT25lIGdyaWQgdGlsZSdzIHJlYWQgKFJlcG9ydEdyaWRTb3VyY2UpOiB0aGUgc2FtZSByb3V0ZSBhcyBjb21wb25lbnREYXRhLFxuICAvLyBpdHMgYm9keSdzIGBncmlkYCB0aGUgZ3JpZCdzIHJlcXVlc3QuIFRoZSBhbnN3ZXIgc3RyZWFtcyBhc1xuICAvLyBuZXdsaW5lLWRlbGltaXRlZCBKU09OLCBvbmUgZXZlbnQgcGVyIGxpbmU6IHtyZXBvcnR9IGZpcnN0LCB0aGVuXG4gIC8vIHtncmlkOiBwYXJ0fSBmb3IgZWFjaCBwYXJ0IG9mIHRoZSByZWFkLCBhIGhlYXJ0YmVhdCB7YXR9IGJldHdlZW5cbiAgLy8gc3RhdGVtZW50cywgYW5kIHRoZSBlbnZlbG9wZSB3aXRoIHRoZSByZWFkJ3Mgc3VtbWFyeSBsYXN0LiBUaGUgYm9keSdzXG4gIC8vIGZpbHRlcnMgYW5kIHN0YXRlIG5hcnJvdyB0aGUgcm93cyBhcyB0aGV5IG5hcnJvdyBhbnkgdGlsZSdzOyB0aGUgZ3JpZCdzXG4gIC8vIG93biBjb2x1bW4gZmlsdGVycyB0cmF2ZWwgaW5zaWRlIGdyaWQubGF5b3V0LiBgaXNFeHBvcnRgIGlzXG4gIC8vIGNvbXBvbmVudERhdGEncy5cbiAgcHVibGljIGNvbXBvbmVudEdyaWQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcnM6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSxcbiAgICBzdGF0ZTogQ29tcG9uZW50RGF0YVN0YXRlLFxuICAgIGdyaWQ6IEdyaWRSZXF1ZXN0LFxuICAgIGlzRXhwb3J0ID0gZmFsc2UsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8U3RyZWFtRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnN0cmVhbShcbiAgICAgIFJlcXVlc3RNZXRob2QuUG9zdCxcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vZGF0YWApLFxuICAgICAgeyBmaWx0ZXJzLCBzdGF0ZSwgZXhwb3J0OiBpc0V4cG9ydCwgZ3JpZCB9LFxuICAgICAgY29uZmlnLFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgbnVtYmVycyBvZiBhIHBhZ2UncyB2YWx1ZXMg4oCUIG9yIHRoZSBtYXN0ZXIncywgZm9yIHRoZSBoZWFkZXIgYW5kXG4gIC8vIGZvb3RlciDigJQgaW4gb25lIHJlcXVlc3Q6IGEgcm93IHBlciB2YWx1ZSB0aGF0IHBhZ2UgcmVhZHMsIHNob3duIGJ5IHNvbWVcbiAgLy8gdGV4dCBvciByZWFkIGJ5IGEgZm9ybXVsYSBpdCBzaG93cyAoUmVwb3J0UGFnZVZhbHVlKS4gYGZpbHRlcnNgIGNhcnJpZXNcbiAgLy8gdGhlIHJlc29sdmVkIHZhbHVlcyBmb3IgZXZlcnkgdmFsdWUgb2YgdGhlIGxheWVyIHRvZ2V0aGVyOyBlYWNoIHZhbHVlIHRoZVxuICAvLyBzZXJ2ZXIgcmVhZHMgcGlja3Mgb3V0IGl0cyBvd24uIGBpc0V4cG9ydGAgaXMgY29tcG9uZW50RGF0YSdzLlxuICAvL1xuICAvLyBUaGUgc2VydmVyIHJlYWRzIG9uZSBzdGF0ZW1lbnQgcGVyIGRpc3RpbmN0IHF1ZXJ5ICh2YWx1ZXMgc2hhcmluZyBhXG4gIC8vIHF1ZXJ5IGFuZCBpdHMgZmlsdGVycyBhcmUgZm9sZGVkIGludG8gb25lOyBhIGZvcm11bGEgcnVucyBub25lKSBhbmQgbWF5XG4gIC8vIHN0cmVhbSBhIGtlZXBBbGl2ZSBwdWxzZSBiZWZvcmUgZWFjaCwgc28gYSBzbG93IHBhZ2UgbmV2ZXIgc2l0cyBzaWxlbnRcbiAgLy8gdW50aWwgdGhlIGNvbm5lY3Rpb24gZHJvcHMuIFRoZSBib2R5IHN0YXlzIG9uZSBKU09OIHdpdGggdGhlIHJvd3MgYXQgZGF0YS52YWx1ZXMsXG4gIC8vIHdoaWNoIEZzQXBpIHJlYWRzIHdpdGggdGhlICd2YWx1ZXMnIGtleSwgYXMgZXhwb3J0Q29tcG9uZW50J3Mgc3RyZWFtZWRcbiAgLy8gcmVzcG9uc2UgaXMgcmVhZC5cbiAgLy9cbiAgLy8gYG1hdGNoQW55R3JvdXBJZHNgIGlzIGEgdGlsZSdzIChDb21wb25lbnREYXRhU3RhdGUpOiB3aGlsZSB0aGUgZ3JvdXBzXG4gIC8vIG1hdGNoICdhbnknLCB0aGUgZ3JvdXBzIHRoYXQgY29tYmluZSAodmFsdWVzTWF0Y2hBbnlHcm91cElkcykuIFNlbnQgb25seVxuICAvLyB3aGVuIGl0IGxpc3RzIGFueTsgdGhlIHNlcnZlciBjaGVja3MgZWFjaCB2YWx1ZSBhZ2FpbnN0IGl0IGFzIGl0IGNoZWNrc1xuICAvLyBhIHRpbGUuXG4gIHB1YmxpYyBwYWdlVmFsdWVzKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcGFnZUlkOiBudW1iZXIsXG4gICAgZmlsdGVyczogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW10sXG4gICAgaXNFeHBvcnQgPSBmYWxzZSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgICBtYXRjaEFueUdyb3VwSWRzOiBudW1iZXJbXSA9IFtdLFxuICApOiBPYnNlcnZhYmxlPFJlcG9ydFBhZ2VWYWx1ZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vcGFnZXMvJHtwYWdlSWR9L3ZhbHVlc2ApLFxuICAgICAgeyBmaWx0ZXJzLCBleHBvcnQ6IGlzRXhwb3J0LCAuLi4obWF0Y2hBbnlHcm91cElkcy5sZW5ndGggPyB7IG1hdGNoQW55R3JvdXBJZHMgfSA6IHt9KSB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICd2YWx1ZXMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBFeHBvcnRzIG9uZSBjb21wb25lbnQgdG8gQ1NWIHNlcnZlci1zaWRlOiB0aGUgZmlsZSBpcyB3aGF0IHRoZSBzY3JlZW5cbiAgLy8gc2hvd3MgKGEgY2hhcnQgb3IgS1BJIGFzIHJlbmRlcmVkLCBhIGxpc3QgaW4gZnVsbCBpbiB0aGUgc2NyZWVuJ3Mgb3JkZXIpLlxuICAvLyBUaGUgYmFja2VuZCBzdHJlYW1zIHBlcmNlbnRhZ2UgcHJvZ3Jlc3Mgd2hpbGUgaXQgd3JpdGVzLlxuICAvL1xuICAvLyBrZXk6IG51bGwgb24gcHVycG9zZSwgdW5saWtlIHRoZSBrZXk6ICd1cmwnIHByZXNpZ25lZC1leHBvcnQgcGF0dGVybjogdGhlXG4gIC8vIHJlc3BvbnNlIGFsc28gY2FycmllcyBgbm90ZXNgLCB0aGUgc2VudGVuY2VzIHNheWluZyBob3cgdGhlIGZpbGUgZmFsbHNcbiAgLy8gc2hvcnQgb2YgdGhlIGZ1bGwgcmVzdWx0LCBhbmQgdGhlIGNhbGxlciBoYXMgdG8gc2hvdyB0aGVtIGJlZm9yZSBpdCBoYW5kc1xuICAvLyB0aGUgdXJsIHRvIEZzUHJvY2Vzcy5kb3dubG9hZC4gYHRpdGxlYCBpcyB0aGUgY29tcG9uZW50J3MgdGl0bGUgYXMgdGhlXG4gIC8vIHZpZXdlciByZWFkcyBpdCwgaXRzIHRva2VucyBmaWxsZWQgKCdTaWduLXVwcyDigJQgU2VwdGVtYmVyIDIwMjYnKSwgd2hpY2hcbiAgLy8gdGhlIHNlcnZlciBuYW1lcyB0aGUgZmlsZSBhZnRlci4gYGZvcm1hdGAgJ3hsc3gnIGFza3MgZm9yIGFuIEV4Y2VsIGZpbGVcbiAgLy8gKFJlcG9ydEV4cG9ydEZvcm1hdCk7IGFuIG9sZGVyIHNlcnZlciBpZ25vcmVzIGl0IGFuZCBzZW5kcyB0aGUgQ1NWLlxuICBwdWJsaWMgZXhwb3J0Q29tcG9uZW50KFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgY29tcG9uZW50SWQ6IG51bWJlcixcbiAgICBmaWx0ZXJzOiBSZXNvbHZlZEZpbHRlclZhbHVlW10gPSBbXSxcbiAgICBzdGF0ZTogQ29tcG9uZW50RGF0YVN0YXRlID0ge30sXG4gICAgdGl0bGUgPSAnJyxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgICBmb3JtYXQ6IFJlcG9ydEV4cG9ydEZvcm1hdCA9ICdjc3YnLFxuICApOiBPYnNlcnZhYmxlPENvbXBvbmVudEV4cG9ydFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9leHBvcnRgKSxcbiAgICAgIHsgZmlsdGVycywgc3RhdGUsIHRpdGxlLCAuLi4oZm9ybWF0ICE9PSAnY3N2JyA/IHsgZm9ybWF0IH0gOiB7fSkgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBFeHBvcnRzIEVWRVJZIGNvbXBvbmVudCBvbiB0aGUgcmVwb3J0IOKAlCBvciBvbiBvbmUgcGFnZSDigJQgc2VydmVyLXNpZGUgYW5kXG4gIC8vIHJlc29sdmVzIHRvIGEgcHJlc2lnbmVkIFVSTCBmb3IgYSB6aXAgb2Ygb25lIENTViBwZXIgY29tcG9uZW50LCBmb2xkZXJlZCBieVxuICAvLyBwYWdlLCBwbHVzIGFuICdFeHBvcnQgTm90ZXMudHh0Jy4gYGZpbHRlcnNgIGNhcnJpZXMgdGhlIHJlc29sdmVkIHZhbHVlcyBmb3JcbiAgLy8gZXZlcnkgY29tcG9uZW50IHRvZ2V0aGVyOyBlYWNoIG9uZSBwaWNrcyBvdXQgaXRzIG93bi4gYGZyZXF1ZW5jeWAgaXMgdGhlXG4gIC8vIHJlcG9ydCdzIGdyb3VwLWJ5IGdyYWluICh0aGUgc2VydmVyIHJlLWJ1Y2tldHMgb25seSB0aGUgdGlsZXMgdGhhdCBmb2xsb3dcbiAgLy8gaXQ6IHRpbWUtc2VyaWVzIGNoYXJ0cyBhbmQgdGFibGVzIG92ZXIgYSB0aW1lIGF4aXMpLCBhbmQgYGZpbHRlckxpbmVzYCBpcyB0aGUgZmlsdGVyIGJhciBhcyB0aGUgdmlld2VyIHJlYWRzIGl0XG4gIC8vIChleHBvcnRMaW5lcyksIHdoaWNoIHRoZSBub3RlcyBmaWxlIHdyaXRlcy4gVGhlaXIgdGV4dCBnb2VzIGFzXG4gIC8vIGZpbHRlclN1bW1hcnkgdG9vLCBmb3IgYSBzZXJ2ZXIgdGhhdCBkb2VzIG5vdCByZWFkIGZpbHRlckxpbmVzOyB0aGVcbiAgLy8gbGluZXMgYXJlIGxlZnQgb3V0IHdoZW4gdGhlcmUgYXJlIG5vbmUuIGBzdGF0ZXNgIGlzIGVhY2ggdGlsZSdzIG93blxuICAvLyBzdGF0ZSBieSBjb21wb25lbnQgaWQgKHppcEV4cG9ydFN0YXRlcyksIHNvIGVhY2ggZmlsZSBob2xkcyB3aGF0IGl0c1xuICAvLyB0aWxlIHNob3dzOyBpdCBpcyBsZWZ0IG91dCB3aGVuIG5vIHRpbGUgaGFzIGFueS4gYHRpdGxlc2AgaG9sZHMgZWFjaCBjb21wb25lbnQncyB0aXRsZSBhcyB0aGUgdmlld2VyIHJlYWRzIGl0LCBpdHMgdG9rZW5zXG4gIC8vIGZpbGxlZCwgYnkgY29tcG9uZW50IGlkLCB3aGljaCB0aGUgc2VydmVyIG5hbWVzIHRoZSBjb21wb25lbnQncyBmaWxlXG4gIC8vIGFmdGVyOyBsZWZ0IG91dCB3aGVuIHRoZXJlIGFyZSBub25lLiBgZm9ybWF0YCAneGxzeCcgYXNrcyBmb3Igb25lIEV4Y2VsXG4gIC8vIHdvcmtib29rIGluc3RlYWQgb2YgdGhlIHppcDogYSBOb3RlcyBzaGVldCwgdGhlbiBhIHNoZWV0IHBlciB0aWxlLiBTYW1lXG4gIC8vIGtlZXAtYWxpdmUgY29udHJhY3QgYXMgZXhwb3J0Q29tcG9uZW50LCBvdmVyIGEgbG9uZ2VyIHJ1bjsgY29uc3VtZVxuICAvLyB0aHJvdWdoIEZzUHJvY2Vzcy5kb3dubG9hZC5cbiAgcHVibGljIGV4cG9ydFJlcG9ydChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcnM6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdLFxuICAgIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGwsXG4gICAgZnJlcXVlbmN5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCA9IG51bGwsXG4gICAgZmlsdGVyTGluZXM6IFJlcG9ydEV4cG9ydExpbmVbXSA9IFtdLFxuICAgIHN0YXRlczogUmVjb3JkPG51bWJlciwgQ29tcG9uZW50RGF0YVN0YXRlPiA9IHt9LFxuICAgIHRpdGxlczogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHt9LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICAgIGZvcm1hdDogUmVwb3J0RXhwb3J0Rm9ybWF0ID0gJ2NzdicsXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2V4cG9ydGApLFxuICAgICAge1xuICAgICAgICBmaWx0ZXJzLFxuICAgICAgICAuLi4ocGFnZUlkID8geyBwYWdlSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGZyZXF1ZW5jeSA/IHsgZnJlcXVlbmN5IH0gOiB7fSksXG4gICAgICAgIGZpbHRlclN1bW1hcnk6IGZpbHRlckxpbmVzLm1hcCgobGluZSkgPT4gbGluZS50ZXh0KSxcbiAgICAgICAgLi4uKGZpbHRlckxpbmVzLmxlbmd0aCA/IHsgZmlsdGVyTGluZXMgfSA6IHt9KSxcbiAgICAgICAgLi4uKE9iamVjdC5rZXlzKHN0YXRlcykubGVuZ3RoID8geyBzdGF0ZXMgfSA6IHt9KSxcbiAgICAgICAgLi4uKE9iamVjdC5rZXlzKHRpdGxlcykubGVuZ3RoID8geyB0aXRsZXMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGZvcm1hdCAhPT0gJ2NzdicgPyB7IGZvcm1hdCB9IDoge30pLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAndXJsJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gRGlzdGluY3Qgb3B0aW9ucyBmb3IgYSBzZWxlY3QgZmlsdGVyIChkcml2ZXMgbXVsdGlzZWxlY3QgY29udHJvbHMpLlxuICBwdWJsaWMgZmlsdGVyT3B0aW9ucyhyZXBvcnRJZDogbnVtYmVyLCBmaWx0ZXJJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZmlsdGVycy8ke2ZpbHRlcklkfS9vcHRpb25zYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnb3B0aW9ucycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBzdGF0ZW1lbnQgYSBjb21wb25lbnQgcnVucywgZm9yIHRoZSBTUUwgdGFiLlxuICAvL1xuICAvLyBGZXRjaGVkIHJhdGhlciB0aGFuIHJlYWQgb2ZmIHRoZSBjb21wb25lbnQsIGJlY2F1c2UgYSBERVJJVkVEIGNvbXBvbmVudCBoYXNcbiAgLy8gbm8gc3RvcmVkIFNRTCDigJQgaXQgc3RvcmVzIGEgZG9jdW1lbnQsIGFuZCBpdHMgc3RhdGVtZW50IG9ubHkgZXhpc3RzIG9uY2VcbiAgLy8gdGhlIGJhY2tlbmQgY29tcGlsZXMgdGhhdCBkb2N1bWVudC4gQ29tcGlsZWQgcGVyIHJlcXVlc3QsIGZvciB0aGUgb25lXG4gIC8vIGNvbXBvbmVudCBiZWluZyBsb29rZWQgYXQsIHNvIG9wZW5pbmcgYSByZXBvcnQgbmV2ZXIgcGF5cyBmb3IgaXQuXG4gIC8vXG4gIC8vIGBrZXk6IG51bGxgIGJlY2F1c2UgdGhlIHdob2xlIGVudmVsb3BlIGlzIHRoZSBhbnN3ZXIgaGVyZTogYSBzdGFsZSBkb2N1bWVudFxuICAvLyBjb21lcyBiYWNrIGFzIHsgc3FsOiBudWxsLCBlcnJvciwgZXJyb3JUeXBlIH0gYW5kIHVud3JhcHBpbmcgb25lIGZpZWxkXG4gIC8vIHdvdWxkIHRocm93IHRoZSBkaWFnbm9zaXMgYXdheS5cbiAgcHVibGljIGNvbXBvbmVudFNxbChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8UmVwb3J0Q29tcG9uZW50U3FsPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L3NxbGApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIGNvbXBvbmVudCBTUUwncyBmaWx0ZXJhYmxlIG91dHB1dCBjb2x1bW5zIOKAlCBkcml2ZXMgdGhlIGNvbHVtbiBwaWNrZXJcbiAgLy8gaW4gdGhlIGZpbHRlciBVSSBzbyBhIGNvbHVtbiBuYW1lIGlzIG5ldmVyIHR5cGVkIGJ5IGhhbmQuXG4gIHB1YmxpYyBjb21wb25lbnRDb2x1bW5zKHJlcG9ydElkOiBudW1iZXIsIGNvbXBvbmVudElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L2NvbHVtbnNgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdjb2x1bW5zJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gTWFrZSBvbmUgY29sdW1uIGZpbHRlcmFibGUuIGBsZXZlbGAgKGNvbXBvbmVudCB8IHJlcG9ydCkgcGxhY2VzIGEgbmV3XG4gIC8vIGdyb3VwOyBgZ3JvdXBJZGAgaW5zdGVhZCBsaW5rcyBpbnRvIGFuIGV4aXN0aW5nIGdyb3VwLiBBIHNlbGVjdCBmaWx0ZXInc1xuICAvLyBvcHRpb25zIGFyZSBkZXJpdmVkIGZyb20gdGhlIGNvbXBvbmVudCdzIG93biBxdWVyeS5cbiAgcHVibGljIGFkZEZpbHRlcihcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgZmlsdGVyOiB7IGZpbHRlckNvbHVtbjogc3RyaW5nOyB0eXBlPzogc3RyaW5nOyBsYWJlbD86IHN0cmluZzsgbGV2ZWw/OiBzdHJpbmc7IGdyb3VwSWQ/OiBudW1iZXIgfSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9maWx0ZXJzYCksXG4gICAgICBmaWx0ZXIsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZpbHRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBhIGZpbHRlciDigJQgYW55IHN1YnNldCBvZiB7IGxhYmVsLCBlbmFibGVkIH0uXG4gIHB1YmxpYyB1cGRhdGVGaWx0ZXIoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBmaWx0ZXJJZDogbnVtYmVyLFxuICAgIGNoYW5nZXM6IHsgbGFiZWw/OiBzdHJpbmc7IGVuYWJsZWQ/OiBib29sZWFuIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZmlsdGVycy8ke2ZpbHRlcklkfWApLFxuICAgICAgY2hhbmdlcyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZmlsdGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVtb3ZlIGEgZmlsdGVyIChpdHMgZ3JvdXAgZ29lcyB0b28gd2hlbiBub3RoaW5nIGVsc2UgdXNlcyBpdCkuXG4gIHB1YmxpYyBkZWxldGVGaWx0ZXIocmVwb3J0SWQ6IG51bWJlciwgZmlsdGVySWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2ZpbHRlcnMvJHtmaWx0ZXJJZH1gKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmaWx0ZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgZ2xvYmFsIEFJIGtub3dsZWRnZSBkb2N1bWVudCAob3BlcmF0b3ItYXV0aG9yZWQgYWdlbnQgaW5zdHJ1Y3Rpb25zKVxuICAvLyBhbmQgaXRzIGZ1bGwgdmVyc2lvbiBoaXN0b3J5OiB7IGluc3RydWN0aW9ucywgdmVyc2lvbnMgfS5cbiAgcHVibGljIGluc3RydWN0aW9ucyhjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgnaW5zdHJ1Y3Rpb25zJyksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBTYXZlIGEgbmV3IHZlcnNpb24gb2YgdGhlIGRvY3VtZW50IChhcHBlbmQtb25seTsgYW4gdW5jaGFuZ2VkIHNhdmUgaXMgYVxuICAvLyBuby1vcCBzZXJ2ZXItc2lkZSkuIFJlc29sdmVzIHRvIHRoZSBzYW1lIHsgaW5zdHJ1Y3Rpb25zLCB2ZXJzaW9ucyB9IHNoYXBlLlxuICBwdWJsaWMgc2F2ZUluc3RydWN0aW9ucyhjb250ZW50OiBzdHJpbmcsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKCdpbnN0cnVjdGlvbnMnKSxcbiAgICAgIHsgY29udGVudCB9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIE1ha2UgYW4gZWFybGllciB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCBjdXJyZW50IChubyBuZXcgcm93IGlzIGNyZWF0ZWQpLlxuICBwdWJsaWMgcmVzdG9yZUluc3RydWN0aW9uKGluc3RydWN0aW9uSWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGBpbnN0cnVjdGlvbnMvJHtpbnN0cnVjdGlvbklkfS9yZXN0b3JlYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSdW4gYSBzZW1hbnRpYy1kYXRhYmFzZSBidWlsZCwgc3RyZWFtZWQ6IGVtaXRzIGFuIGV2ZW50IHBlciBOREpTT04gZnJhbWVcbiAgLy8gKHsga2luZDogJ2xvZycsIGxpbmUsIHBlcmNlbnQgfSBmZWVkIGxpbmVzIGFuZCB7IGtpbmQ6ICdzZWN0aW9uJyB9IHBoYXNlXG4gIC8vIG1hcmtlcnMpIGFuZCBjb21wbGV0ZXMgd2hlbiB0aGUgYnVpbGQgZW5kcy4gRmVlZCB0aGUgbGluZXMgaW50byBGc1Byb2Nlc3MuXG4gIHB1YmxpYyBzZW1hbnRpY0J1aWxkKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnN0cmVhbShcbiAgICAgICdQT1NUJyxcbiAgICAgIHRoaXMuX3BhdGgoJ3NlbWFudGljL2J1aWxkJyksXG4gICAgICB7IHN0cmVhbTogdHJ1ZSB9LFxuICAgICAgY29uZmlnLFxuICAgICk7XG4gIH1cblxuICAvLyBMYXRlc3QgYnVpbGQgc3RhdHVzICsgZW50aXR5IHNjb3JlYm9hcmQ6IHsgYnVpbGQsIGRldGFpbCB9LlxuICBwdWJsaWMgc2VtYW50aWNCdWlsZFN0YXR1cyhjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgnc2VtYW50aWMvYnVpbGQnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFN0b3AgdGhlIHJ1bm5pbmcgYnVpbGQgKHRoZSBjdXJyZW50IHNlbWFudGljIGRhdGFiYXNlIHN0YXlzIGluIHBsYWNlKS5cbiAgcHVibGljIHNlbWFudGljQnVpbGRTdG9wKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aCgnc2VtYW50aWMvYnVpbGQvc3RvcCcpLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2J1aWxkJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gT25lIGVudGl0eSdzIGNhY2hlZCBBSS1jbGFzc2lmaWVkIGNvZGUgZnVuY3Rpb25zIOKAlCBsb2FkZWQgb24gZXhwYW5kLCBvbmVcbiAgLy8gZW50aXR5IGF0IGEgdGltZSwgYmVjYXVzZSB0aGUgZnVsbCBzZXQgYWNyb3NzIGFsbCBlbnRpdGllcyBpcyBmYXIgdG9vIGJpZ1xuICAvLyB0byBzaGlwIGluc2lkZSB0aGUgc2NvcmVib2FyZCBjYWxsLlxuICBwdWJsaWMgc2VtYW50aWNFbnRpdHlGdW5jdGlvbnMoZW50aXR5OiBzdHJpbmcsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGBzZW1hbnRpYy9lbnRpdGllcy8ke2VudGl0eX0vZnVuY3Rpb25zYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZW50aXR5RnVuY3Rpb25zJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIHJlcG9ydCBtb2R1bGUncyBHZW5lcmFsIHNldHRpbmdzIChzZW1hbnRpYy1idWlsZCBjb25jdXJyZW5jeSArIGl0cyBib3VuZHMpLlxuICBwdWJsaWMgc2V0dGluZ3MoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoJ3NldHRpbmdzJyksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnc2V0dGluZ3MnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgbG9jYWxlcyBhbmQgY3VycmVuY2llcyBhIHJlcG9ydCBjYW4gYmUgd3JpdHRlbiBpbiwgZm9yIHRoZSByZXBvcnRcbiAgLy8gc2V0dGluZ3MnIExvY2FsZSBhbmQgQ3VycmVuY3kgc2VsZWN0czogdGhlIGRlZmF1bHQgbG9jYWxlLCBlYWNoIG9mZmVyZWRcbiAgLy8gbG9jYWxlIHdpdGggdGhlIGN1cnJlbmN5IGEgcmVwb3J0IGluIGl0IHVzZXMgd2hlbiBpdCBuYW1lcyBub25lLCBhbmQgZXZlcnlcbiAgLy8gY3VycmVuY3kgY29kZS4gT25seSBhIHNlcnZlciB0aGF0IHNlbmRzIGVmZmVjdGl2ZUxvY2FsZSBoYXMgdGhpcyByb3V0ZS5cbiAgcHVibGljIGxvY2FsZXMoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFJlcG9ydExvY2FsZXM+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoJ2xvY2FsZXMnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdsb2NhbGVzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gU2F2ZSB0aGUgR2VuZXJhbCBzZXR0aW5nczsgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgeyBzZXR0aW5ncyB9IHNoYXBlLlxuICBwdWJsaWMgc2F2ZVNldHRpbmdzKHNldHRpbmdzOiB7IHNlbWFudGljQnVpbGRDb25jdXJyZW5jeTogbnVtYmVyIH0sIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKCdzZXR0aW5ncycpLFxuICAgICAgc2V0dGluZ3MsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NldHRpbmdzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVXBkYXRlIGEgZmlsdGVyIGdyb3VwIOKAlCBpdHMgZXhwb3N1cmUgbGV2ZWwgKCdjb21wb25lbnQnIHwgJ3JlcG9ydCcgfCAnYm90aCcpLFxuICAvLyBpdHMgbmFtZSAoYW4gaWRlbnRpZmllciwgdW5pcXVlIGluIHRoZSByZXBvcnQ7IHRoZSBzZXJ2ZXIgcmVmdXNlcyBvbmUgdGhhdFxuICAvLyBicmVha3MgdGhlIHJ1bGUsIHdpdGggYSBtZXNzYWdlIG5hbWluZyB0aGUgcHJvYmxlbSksIGl0cyBsYWJlbCAobmV2ZXJcbiAgLy8gY2hhbmdlcyB0aGUgbmFtZSkgYW5kL29yIGl0cyBkZWZhdWx0IHZhbHVlICh0aGUgdmFsdWUgc2VlZGluZyB0aGUgcmVwb3J0XG4gIC8vIGJhciBvbiBvcGVuKS4gU2VuZCBgZGVmYXVsdDogbnVsbGAgKG9yIGFuIGVtcHR5IGRlZmF1bHQpIHRvIGNsZWFyIGl0LiBPbmx5XG4gIC8vIHRoZSBrZXlzIHByb3ZpZGVkIGFyZSBjaGFuZ2VkLCBpbiB0aGUgb3JkZXIgbmFtZSwgbGFiZWwsIGxldmVsLCBkZWZhdWx0LFxuICAvLyBzbyBhIHJlZnVzZWQgbmFtZSBsZWF2ZXMgdGhlIHJlc3QgdW53cml0dGVuLlxuICBwdWJsaWMgdXBkYXRlRmlsdGVyR3JvdXAoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBncm91cElkOiBudW1iZXIsXG4gICAgY2hhbmdlczogUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzLFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2ZpbHRlcmdyb3Vwcy8ke2dyb3VwSWR9YCksXG4gICAgICBjaGFuZ2VzLFxuICAgICAge1xuICAgICAgICBrZXk6ICdmaWx0ZXJHcm91cCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEEgc2VsZWN0IGZpbHRlcidzIG9wdGlvbnMgbmFycm93ZWQgYnkgdGhlIG90aGVyIGVudHJpZXMgb2YgaXRzIHRpbGVcbiAgLy8gKFJlcG9ydEZpbHRlck9wdGlvbnNSZXF1ZXN0KSwgd2l0aCB0aGUgcGlja3MgaXQgbmFtZXMgbGFiZWxlZC4gT25seSBmb3JcbiAgLy8gYSByZXBvcnQgd2hvc2Ugc2VydmVyIGxpc3RzIGNhc2NhZGluZ09wdGlvbnM7IGFueSBvdGhlciByZWFkcyB0aGUgZnVsbFxuICAvLyBsaXN0IHRocm91Z2ggZmlsdGVyT3B0aW9ucygpLlxuICBwdWJsaWMgZmlsdGVyT3B0aW9uc05hcnJvd2VkKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgZmlsdGVySWQ6IG51bWJlcixcbiAgICBib2R5OiBSZXBvcnRGaWx0ZXJPcHRpb25zUmVxdWVzdCxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxSZXBvcnRGaWx0ZXJPcHRpb25zPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZmlsdGVycy8ke2ZpbHRlcklkfS9vcHRpb25zYCksXG4gICAgICBib2R5LFxuICAgICAge1xuICAgICAgICBrZXk6ICdvcHRpb25zJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIHJlcG9ydCdzIHNhdmVkIGZpbHRlcnMsIGluIHRoZWlyIG9yZGVyLiBTaGFyZWQgYnkgZXZlcnlvbmUgd2hvIG1heVxuICAvLyBvcGVuIHRoZSByZXBvcnQuXG4gIHB1YmxpYyBzYXZlZEZpbHRlcnMocmVwb3J0SWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFJlcG9ydFNhdmVkRmlsdGVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3NhdmVkZmlsdGVyc2ApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NhdmVkRmlsdGVycycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEEgbmV3IHNhdmVkIGZpbHRlcjogaXRzIG5hbWUgYW5kIHRoZSByZXBvcnQtd2lkZSBmaWx0ZXIgdmFsdWVzIGl0IGhvbGRzLlxuICBwdWJsaWMgY3JlYXRlU2F2ZWRGaWx0ZXIoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBzYXZlZEZpbHRlcjogUmVxdWlyZWQ8UmVwb3J0U2F2ZWRGaWx0ZXJDaGFuZ2VzPixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxSZXBvcnRTYXZlZEZpbHRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3NhdmVkZmlsdGVyc2ApLFxuICAgICAgc2F2ZWRGaWx0ZXIsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NhdmVkRmlsdGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVuYW1lcyBhIHNhdmVkIGZpbHRlciBvciByZXBsYWNlcyBpdHMgdmFsdWVzOyBvbmx5IHRoZSBrZXlzIGdpdmVuIGNoYW5nZS5cbiAgcHVibGljIHVwZGF0ZVNhdmVkRmlsdGVyKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcmVwb3J0U2F2ZWRGaWx0ZXJJZDogbnVtYmVyLFxuICAgIGNoYW5nZXM6IFJlcG9ydFNhdmVkRmlsdGVyQ2hhbmdlcyxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxSZXBvcnRTYXZlZEZpbHRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vc2F2ZWRmaWx0ZXJzLyR7cmVwb3J0U2F2ZWRGaWx0ZXJJZH1gKSxcbiAgICAgIGNoYW5nZXMsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NhdmVkRmlsdGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZVNhdmVkRmlsdGVyKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcmVwb3J0U2F2ZWRGaWx0ZXJJZDogbnVtYmVyLFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFJlcG9ydFNhdmVkRmlsdGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5kZWxldGUoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9zYXZlZGZpbHRlcnMvJHtyZXBvcnRTYXZlZEZpbHRlcklkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NhdmVkRmlsdGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUGVyc2lzdCB0aGUgc2F2ZWQgZmlsdGVycycgb3JkZXIgYWZ0ZXIgYSBkcmFnOiBldmVyeSBpZCwgaW4gaXRzIG5ld1xuICAvLyBvcmRlci4gUmVzb2x2ZXMgdG8gdGhlIGxpc3QgaW4gdGhhdCBvcmRlci5cbiAgcHVibGljIHNhdmVTYXZlZEZpbHRlclBvc2l0aW9ucyhcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIHJlcG9ydFNhdmVkRmlsdGVySWRzOiBudW1iZXJbXSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxSZXBvcnRTYXZlZEZpbHRlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9zYXZlZGZpbHRlcnMvcG9zaXRpb25zYCksXG4gICAgICB7IHJlcG9ydFNhdmVkRmlsdGVySWRzIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NhdmVkRmlsdGVycycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxufVxuIl19
|