@firestitch/report 18.11.1 → 18.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/reports/components/component-grid/component-grid.component.d.ts +33 -0
- package/app/reports/components/component-grid/report-grid-cell.pipe.d.ts +11 -0
- package/app/reports/components/component-grid/report-grid-formatter.d.ts +9 -0
- package/app/reports/components/report-component/report-component.component.d.ts +0 -1
- package/app/reports/data/report-grid-source.d.ts +22 -0
- package/app/reports/data/report.data.d.ts +3 -1
- package/app/reports/export/report-export-collector.service.d.ts +8 -1
- package/app/reports/export/report-filter-lines.d.ts +2 -0
- package/app/reports/export/report-grid-export.d.ts +20 -0
- package/app/reports/export/report-pdf.service.d.ts +2 -0
- package/app/reports/export/report-pptx.service.d.ts +1 -0
- package/app/reports/group-by.d.ts +3 -0
- package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +2 -0
- package/app/reports/interfaces/report-chat-viewer-tile.interface.d.ts +5 -0
- package/app/reports/interfaces/report-export-snapshot.interface.d.ts +2 -0
- package/app/reports/interfaces/report-grid-config.interface.d.ts +5 -0
- package/app/reports/interfaces/report-grid-line.interface.d.ts +6 -0
- package/app/reports/interfaces/report-grid-params.interface.d.ts +7 -0
- package/app/reports/interfaces/report-grid-report.interface.d.ts +2 -0
- package/app/reports/interfaces/report-grid-session-layout.interface.d.ts +5 -0
- package/app/reports/interfaces/report.interface.d.ts +10 -2
- package/app/reports/report-chat-viewer-state.d.ts +4 -1
- package/app/reports/report-filter-items.d.ts +1 -1
- package/app/reports/report-grid-layout.d.ts +10 -0
- package/app/reports/services/report-filter-state.service.d.ts +13 -0
- package/app/reports/tile-data-state.d.ts +2 -2
- package/esm2022/app/reports/components/component-grid/component-grid.component.mjs +120 -0
- package/esm2022/app/reports/components/component-grid/report-grid-cell.pipe.mjs +41 -0
- package/esm2022/app/reports/components/component-grid/report-grid-formatter.mjs +94 -0
- package/esm2022/app/reports/components/component-text/component-text.component.mjs +1 -1
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +28 -25
- package/esm2022/app/reports/data/report-grid-source.mjs +105 -0
- package/esm2022/app/reports/data/report.data.mjs +15 -4
- package/esm2022/app/reports/export/report-export-collector.service.mjs +72 -7
- package/esm2022/app/reports/export/report-filter-lines.mjs +68 -1
- package/esm2022/app/reports/export/report-grid-export.mjs +48 -0
- package/esm2022/app/reports/export/report-pdf.service.mjs +47 -17
- package/esm2022/app/reports/export/report-pptx.service.mjs +48 -4
- package/esm2022/app/reports/group-by.mjs +13 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-chat-viewer-tile.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-grid-config.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-grid-line.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-grid-params.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-grid-report.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-grid-session-layout.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/report-chat-viewer-state.mjs +21 -6
- package/esm2022/app/reports/report-filter-items.mjs +9 -7
- package/esm2022/app/reports/report-grid-layout.mjs +67 -0
- package/esm2022/app/reports/report-tile.mjs +5 -5
- package/esm2022/app/reports/services/report-filter-state.service.mjs +170 -18
- package/esm2022/app/reports/tile-data-state.mjs +12 -17
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +8 -4
- package/esm2022/app/reports/views/report/report.component.mjs +2 -2
- package/fesm2022/{firestitch-report-echarts-B0RWUjR8.mjs → firestitch-report-echarts-EecIloKo.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-B0RWUjR8.mjs.map → firestitch-report-echarts-EecIloKo.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-CJW0lLdW.mjs → firestitch-report-firestitch-report-DbdLxQSE.mjs} +945 -109
- package/fesm2022/firestitch-report-firestitch-report-DbdLxQSE.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +4 -2
- package/fesm2022/firestitch-report-firestitch-report-CJW0lLdW.mjs.map +0 -1
|
@@ -8,7 +8,8 @@ import { DEFAULT_TEXT_COLOR, DEFAULT_TEXT_SIZE, TEXT_TABLE_BORDER_COLOR, TEXT_TA
|
|
|
8
8
|
import { REPORT_KPI_CHANGE_COLORS, REPORT_KPI_SPARKLINE_COLOR, REPORT_KPI_TRACK_COLOR, REPORT_MUTED_TEXT_COLOR, } from '../theme/palette';
|
|
9
9
|
import { isDrawn } from '../values';
|
|
10
10
|
import { renderChartImage } from './offscreen-chart';
|
|
11
|
-
import { HEADER_FOOTER_NAME, coverLines, emptyLabel, exportCell, exportNoteLines, exportTitle, exportWindowsLine, kpiCardHasExtras, kpiExportHeight, kpiExportParts, listColumns, listHeadings, listTotalsRow, moreRowsNotice, scaledKpiHeights, textOverflow, } from './report-export-collector.service';
|
|
11
|
+
import { HEADER_FOOTER_NAME, coverLines, emptyLabel, exportCell, exportNoteLines, exportTitle, exportWindowsLine, isEmptyTile, kpiCardHasExtras, kpiExportHeight, kpiExportParts, listColumns, listHeadings, listTotalsRow, moreRowsNotice, scaledKpiHeights, textOverflow, } from './report-export-collector.service';
|
|
12
|
+
import { gridExportTable } from './report-grid-export';
|
|
12
13
|
import { ReportTextLayoutService } from './report-text-layout.service';
|
|
13
14
|
import * as i0 from "@angular/core";
|
|
14
15
|
// Inches → points (the PDF unit).
|
|
@@ -71,6 +72,8 @@ const LIST_INDENT = 16;
|
|
|
71
72
|
// What the export's overflow gate says the PDF does with a text block that does
|
|
72
73
|
// not fit its box.
|
|
73
74
|
const PDF_OVERFLOW_NOTE = 'The PDF cuts it off at the bottom of its box.';
|
|
75
|
+
// How far a table's group label steps in per level, points.
|
|
76
|
+
const GRID_INDENT = 8;
|
|
74
77
|
// Builds the PDF client-side with jspdf. The report's unit is inches and PDFs
|
|
75
78
|
// are points at exactly 72/inch, so each report page becomes one PDF page of
|
|
76
79
|
// the exact physical size and components land at their precise positions.
|
|
@@ -512,7 +515,7 @@ export class ReportPdfService {
|
|
|
512
515
|
const y = component.y * PT;
|
|
513
516
|
const w = component.w * PT;
|
|
514
517
|
const h = component.h * PT;
|
|
515
|
-
const title = exportTitle(component, tokens, item.search, item.crumbs);
|
|
518
|
+
const title = exportTitle(component, tokens, item.search, item.crumbs, item.filtered);
|
|
516
519
|
if (title) {
|
|
517
520
|
this._componentTitle(doc, title, x, y, w);
|
|
518
521
|
}
|
|
@@ -533,7 +536,7 @@ export class ReportPdfService {
|
|
|
533
536
|
kept.forEach((line, index) => {
|
|
534
537
|
this._smallLine(doc, this._pdfText(line), x, bodyY + bodyH + index * NOTE_LINE_H, w, 'left', 'italic');
|
|
535
538
|
});
|
|
536
|
-
if (!item.data ||
|
|
539
|
+
if (!item.data || isEmptyTile(item)) {
|
|
537
540
|
this._boxNote(doc, emptyLabel(item), x, bodyY, w, bodyH);
|
|
538
541
|
return;
|
|
539
542
|
}
|
|
@@ -544,6 +547,7 @@ export class ReportPdfService {
|
|
|
544
547
|
break;
|
|
545
548
|
}
|
|
546
549
|
case 'list':
|
|
550
|
+
case 'grid':
|
|
547
551
|
this._renderTable(context, item, x, bodyY, w, bodyH, overflows);
|
|
548
552
|
break;
|
|
549
553
|
case 'kpi':
|
|
@@ -596,12 +600,8 @@ export class ReportPdfService {
|
|
|
596
600
|
// A totals row closes the table once: in the box when every row fits it,
|
|
597
601
|
// else after the last continuation row. Points throughout.
|
|
598
602
|
_renderTable(context, item, x, y, w, h, overflows) {
|
|
599
|
-
const { component, search,
|
|
600
|
-
const
|
|
601
|
-
const head = listHeadings(component, data, context.formatContext.locale, hiddenColumns)
|
|
602
|
-
.map((heading) => this._pdfText(heading));
|
|
603
|
-
const { cells, numeric, foot } = this._tableCells(context, component, data, hiddenColumns);
|
|
604
|
-
const omitted = Math.max(0, (data.paging?.total ?? cells.length) - cells.length);
|
|
603
|
+
const { component, search, filtered } = item;
|
|
604
|
+
const { head, cells, numeric, foot, omitted } = item.table ? this._gridCells(item) : this._listCells(context, item);
|
|
605
605
|
const bottom = context.pageH - (y + h);
|
|
606
606
|
const { fit, columnStyles } = this._measure(context, head, cells, numeric, foot, x, y, w, bottom);
|
|
607
607
|
if (fit === cells.length && omitted === 0) {
|
|
@@ -614,16 +614,46 @@ export class ReportPdfService {
|
|
|
614
614
|
// page.
|
|
615
615
|
const kept = Math.max(0, fit - 1);
|
|
616
616
|
overflows.push({
|
|
617
|
-
component, search, crumbs: item.crumbs, head, numeric, rows: cells.slice(kept), omitted, foot, x, w, columnStyles,
|
|
617
|
+
component, search, crumbs: item.crumbs, filtered, head, numeric, rows: cells.slice(kept), omitted, foot, x, w, columnStyles,
|
|
618
618
|
});
|
|
619
619
|
if (fit >= 1) {
|
|
620
|
-
const body = [...cells.slice(0, kept), this._noticeRow(CONTINUED_NOTICE,
|
|
620
|
+
const body = [...cells.slice(0, kept), this._noticeRow(CONTINUED_NOTICE, numeric.length, true)];
|
|
621
621
|
this._drawTable(context, this._tableOptions(context, head, numeric, body, x, y, w, bottom, columnStyles));
|
|
622
622
|
}
|
|
623
623
|
else {
|
|
624
624
|
this._boxNote(context.doc, CONTINUED_NOTICE, x, y, w, h);
|
|
625
625
|
}
|
|
626
626
|
}
|
|
627
|
+
// A list's heading, rows, totals row and the rows past its fetch.
|
|
628
|
+
_listCells(context, item) {
|
|
629
|
+
const { component, hiddenColumns } = item;
|
|
630
|
+
const data = item.data;
|
|
631
|
+
const head = [listHeadings(component, data, context.formatContext.locale, hiddenColumns).map((heading) => this._pdfText(heading))];
|
|
632
|
+
const { cells, numeric, foot } = this._tableCells(context, component, data, hiddenColumns);
|
|
633
|
+
return { head, cells, numeric, foot, omitted: Math.max(0, (data.paging?.total ?? cells.length) - cells.length) };
|
|
634
|
+
}
|
|
635
|
+
// A table tile's heading rows (spanned as the screen's header), its lines
|
|
636
|
+
// (groups and totals bold, a group's label stepped in by its depth) and its
|
|
637
|
+
// total row, as gridExportTable() lays them out, and the lines past its cap.
|
|
638
|
+
_gridCells(item) {
|
|
639
|
+
const table = gridExportTable(item.table);
|
|
640
|
+
const cell = (exported) => ({
|
|
641
|
+
content: this._pdfText(exported.text),
|
|
642
|
+
colSpan: exported.colSpan,
|
|
643
|
+
rowSpan: exported.rowSpan,
|
|
644
|
+
styles: {
|
|
645
|
+
...(exported.bold ? { fontStyle: 'bold' } : {}),
|
|
646
|
+
...(exported.indent ? { cellPadding: { top: 3, right: 3, bottom: 3, left: 3 + exported.indent * GRID_INDENT } } : {}),
|
|
647
|
+
},
|
|
648
|
+
});
|
|
649
|
+
return {
|
|
650
|
+
head: table.head.map((row) => row.map(cell)),
|
|
651
|
+
cells: table.body.map((row) => row.map(cell)),
|
|
652
|
+
numeric: table.numeric,
|
|
653
|
+
foot: table.foot ? table.foot.map((exported) => this._pdfText(exported.text)) : null,
|
|
654
|
+
omitted: table.moreRows,
|
|
655
|
+
};
|
|
656
|
+
}
|
|
627
657
|
// Each fetched row as the strings its table cells print, in the report's
|
|
628
658
|
// zone, locale and currency, which columns hold formatted numbers, and the
|
|
629
659
|
// totals row (null without one). The columns the viewer hid are left out.
|
|
@@ -650,7 +680,7 @@ export class ReportPdfService {
|
|
|
650
680
|
_tableOptions(context, head, numeric, body, x, startY, w, bottom, columnStyles, foot) {
|
|
651
681
|
return {
|
|
652
682
|
theme: 'grid',
|
|
653
|
-
head
|
|
683
|
+
head,
|
|
654
684
|
body,
|
|
655
685
|
startY,
|
|
656
686
|
margin: { left: x, right: context.pageW - x - w, bottom },
|
|
@@ -762,7 +792,7 @@ export class ReportPdfService {
|
|
|
762
792
|
const bottom = this._continuationMargin(bands.footerHeight);
|
|
763
793
|
const { x, w } = overflow;
|
|
764
794
|
const body = overflow.omitted > 0
|
|
765
|
-
? [...overflow.rows, this._noticeRow(moreRowsNotice(overflow.omitted), overflow.
|
|
795
|
+
? [...overflow.rows, this._noticeRow(moreRowsNotice(overflow.omitted), overflow.numeric.length, false)]
|
|
766
796
|
: overflow.rows;
|
|
767
797
|
// The document's pages the table draws on, in order.
|
|
768
798
|
const pages = [];
|
|
@@ -775,7 +805,7 @@ export class ReportPdfService {
|
|
|
775
805
|
willDrawPage: () => {
|
|
776
806
|
pages.push(doc.getCurrentPageInfo().pageNumber);
|
|
777
807
|
const tokens = this._tokens(context, page, index, pageNumber + pages.length);
|
|
778
|
-
this._componentTitle(doc, this._continuedTitle(overflow.component, tokens, overflow.search, overflow.crumbs), x, top, w);
|
|
808
|
+
this._componentTitle(doc, this._continuedTitle(overflow.component, tokens, overflow.search, overflow.crumbs, overflow.filtered), x, top, w);
|
|
779
809
|
},
|
|
780
810
|
});
|
|
781
811
|
await this._renderContinuationMasters(context, page, index, pageNumber, pages);
|
|
@@ -798,8 +828,8 @@ export class ReportPdfService {
|
|
|
798
828
|
_continuationMargin(band) {
|
|
799
829
|
return band ? band * PT + CONTINUATION_GAP : NO_BAND_MARGIN;
|
|
800
830
|
}
|
|
801
|
-
_continuedTitle(component, tokens, search, crumbs) {
|
|
802
|
-
const title = exportTitle(component, tokens, search, crumbs);
|
|
831
|
+
_continuedTitle(component, tokens, search, crumbs, filtered) {
|
|
832
|
+
const title = exportTitle(component, tokens, search, crumbs, filtered);
|
|
803
833
|
return title ? `${title} (continued)` : 'Continued';
|
|
804
834
|
}
|
|
805
835
|
// A KPI tile: the card the screen draws (kpi-card.ts decides every line),
|
|
@@ -990,4 +1020,4 @@ export class ReportPdfService {
|
|
|
990
1020
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportPdfService, decorators: [{
|
|
991
1021
|
type: Injectable
|
|
992
1022
|
}] });
|
|
993
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBkZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVVsRCxPQUFPLEVBQzJDLFdBQVcsRUFBRSxvQkFBb0IsR0FDbEYsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RELE9BQU8sRUFDTCxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFDaEgsaUJBQWlCLEVBQ2pCLFVBQVUsR0FDWCxNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQ0wsd0JBQXdCLEVBQUUsMEJBQTBCLEVBQUUsc0JBQXNCLEVBQUUsdUJBQXVCLEdBQ3RHLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQzRELGtCQUFrQixFQUNuRixVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUNyRyxlQUFlLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFDM0csWUFB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LENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTyxLQUFLLENBQUMsSUFBWTtRQUN4QixPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDO0lBQzVGLENBQUM7d0dBbm9DVSxnQkFBZ0I7NEdBQWhCLGdCQUFnQjs7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBSZXBvcnRLcGlUcmVuZCB9IGZyb20gJy4uL2VudW1zL3JlcG9ydC1rcGktdHJlbmQuZW51bSc7XG5pbXBvcnQgeyBsYXllckZpbHRlckZpZWxkcyB9IGZyb20gJy4uL2ZpbHRlci10ZXh0JztcbmltcG9ydCB7IHJlc29sdmVSZXBvcnRUaW1lem9uZSB9IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQge1xuICBDb21wb25lbnREYXRhLFxuICBLcGlDb25maWcsXG4gIFJlcG9ydCxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBSZXBvcnRIZWFkZXJGb290ZXIsXG4gIFJlcG9ydFBhZ2UsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBLcGlDYXJkRGVsdGEsIEtwaUNhcmRUYXJnZXQsIEtwaVNwYXJrbGluZVBvaW50LCBrcGlDYXJkVmlldywga3BpU3BhcmtsaW5lR2VvbWV0cnksXG59IGZyb20gJy4uL2twaS1jYXJkJztcbmltcG9ydCB7IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkcgfSBmcm9tICcuLi9sYXlvdXQnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9URVhUX0NPTE9SLCBERUZBVUxUX1RFWFRfU0laRSwgVEVYVF9UQUJMRV9CT1JERVJfQ09MT1IsIFRFWFRfVEFCTEVfQk9SREVSX1dJRFRILCBURVhUX1RBQkxFX0NFTExfUEFERElORyxcbiAgVEVYVF9UQUJMRV9NQVJHSU4sIFRleHRGaWx0ZXJGaWVsZCwgVGV4dFBhcmFncmFwaCwgVGV4dFJ1biwgVGV4dFRhYmxlLCBUZXh0VGFibGVDZWxsLCBUZXh0VG9rZW5Db250ZXh0LCBUZXh0VmFsdWUsXG4gIHRleHRCbG9ja3MsXG59IGZyb20gJy4uL3RleHQnO1xuaW1wb3J0IHtcbiAgUkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTLCBSRVBPUlRfS1BJX1NQQVJLTElORV9DT0xPUiwgUkVQT1JUX0tQSV9UUkFDS19DT0xPUiwgUkVQT1JUX01VVEVEX1RFWFRfQ09MT1IsXG59IGZyb20gJy4uL3RoZW1lL3BhbGV0dGUnO1xuaW1wb3J0IHsgaXNEcmF3biB9IGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgeyByZW5kZXJDaGFydEltYWdlIH0gZnJvbSAnLi9vZmZzY3JlZW4tY2hhcnQnO1xuaW1wb3J0IHtcbiAgQnVpbHRFeHBvcnQsIENvbGxlY3RlZENvbXBvbmVudCwgQ29sbGVjdGVkUGFnZSwgQ29sbGVjdGVkUmVwb3J0LCBIRUFERVJfRk9PVEVSX05BTUUsIEtwaUV4cG9ydEhlaWdodHMsIFRleHRPdmVyZmxvdyxcbiAgY292ZXJMaW5lcywgZW1wdHlMYWJlbCwgZXhwb3J0Q2VsbCwgZXhwb3J0Tm90ZUxpbmVzLCBleHBvcnRUaXRsZSwgZXhwb3J0V2luZG93c0xpbmUsIGtwaUNhcmRIYXNFeHRyYXMsXG4gIGtwaUV4cG9ydEhlaWdodCwga3BpRXhwb3J0UGFydHMsIGxpc3RDb2x1bW5zLCBsaXN0SGVhZGluZ3MsIGxpc3RUb3RhbHNSb3csIG1vcmVSb3dzTm90aWNlLCBzY2FsZWRLcGlIZWlnaHRzLFxuICB0ZXh0T3ZlcmZsb3csXG59IGZyb20gJy4vcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRUZXh0TGF5b3V0U2VydmljZSwgVGV4dFRhYmxlTGF5b3V0IH0gZnJvbSAnLi9yZXBvcnQtdGV4dC1sYXlvdXQuc2VydmljZSc7XG5cblxuLy8gSW5jaGVzIOKGkiBwb2ludHMgKHRoZSBQREYgdW5pdCkuXG5jb25zdCBQVCA9IDcyO1xuXG4vLyBDb21wb25lbnQgdGl0bGUgc3RyaXAgaGVpZ2h0LCBwb2ludHMuXG5jb25zdCBUSVRMRV9IID0gMTg7XG5cbi8vIFRoZSBzbWFsbCBwcmludCBhIGNvbXBvbmVudCBtYXkgY2FycnksIHBvaW50czogdGhlIGRheXMgaXQgcmVhZHMgdW5kZXIgaXRzXG4vLyB0aXRsZSAoYSBzdWJ0aXRsZSBsaW5lKSwgaXRzIG5vdGVzIGF0IHRoZSBmb290IG9mIGl0cyBib3ggKGEgbGluZSBlYWNoKSwgYW5kXG4vLyB0aGUgbGluZXMgb2YgYSBLUEkgY2FyZCB1bmRlciBpdHMgdmFsdWUuIEEgY2hhcnQncyBvciBhIGxpc3QncyBub3RlcyBnaXZlXG4vLyB3YXkgYmVmb3JlIGl0cyBib2R5IHdvdWxkIHNocmluayB1bmRlciBNSU5fQk9EWV9ILlxuY29uc3QgU01BTExfU0laRSA9IDcuNTtcbmNvbnN0IFNVQlRJVExFX0ggPSAxMTtcbmNvbnN0IE5PVEVfTElORV9IID0gMTA7XG5jb25zdCBNSU5fQk9EWV9IID0gNDA7XG5jb25zdCBNVVRFRF9DT0xPUiA9IGAjJHtSRVBPUlRfTVVURURfVEVYVF9DT0xPUn1gO1xuXG4vLyBBIEtQSSBjYXJkJ3MgcGFydHMsIHRvcCB0byBib3R0b20sIHBvaW50cyAoa3BpRXhwb3J0UGFydHMgc2hlZHMgdGhlXG4vLyBzcGFya2xpbmUsIHRoZW4gdGhlIHRhcmdldCwgdGhlbiB0aGUgbm90ZXMgb24gYSBzaG9ydCB0aWxlKS4gVGhlIHZhbHVlJ3Ncbi8vIGJhc2VsaW5lIHNpdHMgS1BJX1ZBTFVFX0JBU0VMSU5FIHVuZGVyIGl0cyB0b3AuXG5jb25zdCBLUElfSEVJR0hUUzogS3BpRXhwb3J0SGVpZ2h0cyA9IHtcbiAgdmFsdWU6IDMwLFxuICBsYWJlbDogMTMsXG4gIGRlbHRhOiAxMyxcbiAgd2luZG93OiBOT1RFX0xJTkVfSCxcbiAgdGFyZ2V0OiBOT1RFX0xJTkVfSCArIDYsXG4gIHNwYXJrbGluZTogMjgsXG4gIG5vdGU6IE5PVEVfTElORV9ILFxufTtcbmNvbnN0IEtQSV9WQUxVRV9CQVNFTElORSA9IDIzO1xuY29uc3QgS1BJX0RFTFRBX1NJWkUgPSA5O1xuLy8gVGhlIGRlbHRhJ3MgdHJpYW5nbGU6IGl0cyBzaWRlLCBhbmQgdGhlIGdhcCBiZWZvcmUgdGhlIGNoYW5nZS5cbmNvbnN0IEtQSV9BUlJPVyA9IDY7XG5jb25zdCBLUElfQVJST1dfR0FQID0gMztcbi8vIFRoZSB0YXJnZXQncyBwcm9ncmVzcyBiYXIsIGFuZCB0aGUgdHJhY2sgaXQgZmlsbHMuXG5jb25zdCBLUElfQkFSX1cgPSAxMjA7XG5jb25zdCBLUElfQkFSX0ggPSAzO1xuY29uc3QgS1BJX1RSQUNLX0NPTE9SID0gYCMke1JFUE9SVF9LUElfVFJBQ0tfQ09MT1J9YDtcbi8vIFRoZSBzcGFya2xpbmUncyB3aWRlc3QgYm94LCBpdHMgdG9wIGFuZCBib3R0b20gaW5zZXQsIGFuZCBpdHMgZG90cycgcmFkaXVzLlxuY29uc3QgS1BJX1NQQVJLTElORV9XID0gMTQwO1xuY29uc3QgS1BJX1NQQVJLTElORV9JTlNFVCA9IDM7XG5jb25zdCBLUElfRE9UX1IgPSAxLjU7XG5cbi8vIFJvd3MgZmV0Y2hlZCBmb3IgYSBsaXN0J3MgUERGIHRhYmxlLiBBIHRhYmxlIHRoYXQgb3V0Z3Jvd3MgaXRzIGJveFxuLy8gY29udGludWVzIG9udG8gcGFnZXMgb2YgaXRzIG93biwgc28gdGhpcyBpcyBob3cgZmFyIGl0IG1heSBydW46IGFib3V0IDEyLTE1XG4vLyBjb250aW51YXRpb24gcGFnZXMgb24gYSBsZXR0ZXIgcGFnZSwgYW5kIGEgdGVudGggb2YgdGhlIHNlcnZlcidzIDUwMDAtcm93XG4vLyBjZWlsaW5nLiBBIGxvbmdlciByZXN1bHQgZW5kcyBpbiBhIG1vcmVSb3dzTm90aWNlKCkgcm93LlxuZXhwb3J0IGNvbnN0IFBERl9MSVNUX1JPV1MgPSA1MDA7XG5cbi8vIEhvdyBmYXIgYSBjb250aW51YXRpb24gdGFibGUgc2l0cyBpbnNpZGUgdGhlIGhlYWRlciBhbmQgZm9vdGVyIGJhbmRzLFxuLy8gcG9pbnRzLiBBIHBhZ2Ugd2l0aCBubyBiYW5kIChvciB3aXRoIHRoZSBtYXN0ZXIgaGlkZGVuKSBrZWVwc1xuLy8gTk9fQkFORF9NQVJHSU4gZnJvbSB0aGF0IGVkZ2UgaW5zdGVhZC5cbmNvbnN0IENPTlRJTlVBVElPTl9HQVAgPSAwLjI1ICogUFQ7XG5jb25zdCBOT19CQU5EX01BUkdJTiA9IDAuNSAqIFBUO1xuY29uc3QgTk9fQkFORFM6IFJlcG9ydEhlYWRlckZvb3RlciA9IHsgaGVhZGVySGVpZ2h0OiAwLCBmb290ZXJIZWlnaHQ6IDAgfTtcblxuLy8gVGhlIGxhc3Qgcm93IG9mIGEgbGlzdCBib3ggd2hvc2Ugcm93cyBjYXJyeSBvbiBwYXN0IGl0LlxuY29uc3QgQ09OVElOVUVEX05PVElDRSA9ICdDb250aW51ZWQgb24gdGhlIGZvbGxvd2luZyBwYWdlcyc7XG5cbi8vIEEgdGV4dCBsaW5lJ3MgaGVpZ2h0IGFzIGEgbXVsdGlwbGUgb2YgaXRzIGxhcmdlc3QgZm9udCBzaXplIOKAlCB0aGUgY2FudmFzXG4vLyBzdHlsZXNoZWV0J3MgbGluZS1oZWlnaHQsIHNvIGEgYmxvY2sgd3JhcHMgYW5kIHN0YWNrcyB0aGUgc2FtZSB3YXkuXG5jb25zdCBURVhUX0xJTkVfSEVJR0hUID0gMS4yNTtcblxuLy8gSG93IGZhciBhIGxpc3QgaXRlbSdzIHRleHQgc2l0cyBmcm9tIHRoZSBibG9jaydzIGVkZ2UsIHBvaW50czsgdGhlIG1hcmtlclxuLy8gaGFuZ3MgaW4gdGhhdCBzcGFjZS5cbmNvbnN0IExJU1RfSU5ERU5UID0gMTY7XG5cbi8vIFdoYXQgdGhlIGV4cG9ydCdzIG92ZXJmbG93IGdhdGUgc2F5cyB0aGUgUERGIGRvZXMgd2l0aCBhIHRleHQgYmxvY2sgdGhhdCBkb2VzXG4vLyBub3QgZml0IGl0cyBib3guXG5jb25zdCBQREZfT1ZFUkZMT1dfTk9URSA9ICdUaGUgUERGIGN1dHMgaXQgb2ZmIGF0IHRoZSBib3R0b20gb2YgaXRzIGJveC4nO1xuXG4vLyBXaGF0IGV2ZXJ5IGRyYXdpbmcgc3RlcCBvZiBvbmUgZXhwb3J0IHNoYXJlcywgYnVpbHQgb25jZSBpbiBidWlsZCgpLlxuLy8gU2l6ZXMgYXJlIHBvaW50cy5cbmludGVyZmFjZSBQZGZFeHBvcnRDb250ZXh0IHtcbiAgZG9jOiBhbnk7XG4gIGF1dG9UYWJsZTogYW55O1xuICBqc1BERjogYW55O1xuICByZXBvcnQ6IFJlcG9ydDtcbiAgdGltZXpvbmU6IHN0cmluZztcbiAgZm9ybWF0Q29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dDtcbiAgcGFnZVc6IG51bWJlcjtcbiAgcGFnZUg6IG51bWJlcjtcbiAgb3JpZW50YXRpb246ICdsYW5kc2NhcGUnIHwgJ3BvcnRyYWl0JztcbiAgLy8gV2hhdCB0aGUgaGVhZGVyIGFuZCBmb290ZXIncyB2YWx1ZSB0b2tlbnMgZmlsbCB3aXRoLCB0aGUgc2FtZSBvbiBldmVyeVxuICAvLyBwYWdlLCBjb250aW51YXRpb24gcGFnZXMgaW5jbHVkZWQgKF9wZGZWYWx1ZXMpLlxuICBtYXN0ZXJWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIFRleHRWYWx1ZT47XG4gIC8vIFdoYXQgdGhlIHt7ZmlsdGVyLjxpZD59fSB0b2tlbnMgZmlsbCB3aXRoLCBldmVyeSBncm91cCdzLCB0aGUgc2FtZSBvblxuICAvLyBldmVyeSBwYWdlOyBhIHBhZ2UgcmVhZHMgaXRzIG93biAobGF5ZXJGaWx0ZXJGaWVsZHMpLlxuICBmaWx0ZXJGaWVsZHM6IFJlY29yZDxudW1iZXIsIFRleHRGaWx0ZXJGaWVsZD47XG4gIC8vIFRoZSBvbmVzIHRoZSBoZWFkZXIgYW5kIGZvb3RlciByZWFkOiBubyBwYWdlIGZpbHRlcidzLlxuICBtYXN0ZXJGaWx0ZXJzOiBSZWNvcmQ8bnVtYmVyLCBUZXh0RmlsdGVyRmllbGQ+O1xuICAvLyBUaGUgdGV4dCBibG9ja3MgY3V0IG9mZiBhdCB0aGUgYm90dG9tIG9mIHRoZWlyIGJveCwgYnkgY29tcG9uZW50IGlkLCBzbyBhXG4gIC8vIGhlYWRlciBvciBmb290ZXIgYmxvY2sgY3V0IG9uIGV2ZXJ5IHBhZ2UgaXMgbGlzdGVkIG9uY2UuXG4gIHRleHRPdmVyZmxvd3M6IE1hcDxudW1iZXIsIFRleHRPdmVyZmxvdz47XG59XG5cbi8vIEEgd29yZCBvZiBhIHdyYXBwZWQgbGluZSAoX3dyYXApOiBpdHMgcnVuLCBpdHMgdGV4dCB3aXRoIGFueSB0cmFpbGluZyBzcGFjZSxcbi8vIGl0cyBmb250IHNpemUgYW5kIGl0cyB3aWR0aCwgcG9pbnRzLlxuaW50ZXJmYWNlIFBkZldvcmQge1xuICBydW46IFRleHRSdW47XG4gIHRleHQ6IHN0cmluZztcbiAgc2l6ZTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xufVxuXG4vLyBXaGVyZSBhIHRleHQgYmxvY2sncyB3b3JkcyBhcmUgZHJhd24sIHBvaW50czogdGhlIGxlZnQgZWRnZSBhbmQgd2lkdGggdGhleVxuLy8gd3JhcCB0bywgdGhlIHRvcCBvZiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBib3R0b20gbm8gbGluZSBtYXkgcnVuIHBhc3QuIEFcbi8vIHRleHQgdGFibGUncyBjZWxsIGRyYXdzIGl0cyB3b3JkcyB0aGUgc2FtZSB3YXksIGluc2lkZSBpdHMgcGFkZGluZy5cbmludGVyZmFjZSBQZGZUZXh0Qm94IHtcbiAgbGVmdDogbnVtYmVyO1xuICB0b3A6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgYm90dG9tOiBudW1iZXI7XG59XG5cbi8vIFdoZXJlIHRoZSBuZXh0IHBhcnQgb2YgYSB0ZXh0IGJsb2NrIHN0YXJ0cywgYW5kIHdoZXRoZXIgdGhlIHBhcnQganVzdCBkcmF3blxuLy8gd2FzIGN1dCBvZmYgYXQgdGhlIGJvdHRvbSBvZiBpdHMgYm94LlxuaW50ZXJmYWNlIFBkZlRleHRDdXJzb3Ige1xuICBjdXJzb3JZOiBudW1iZXI7XG4gIGN1dDogYm9vbGVhbjtcbn1cblxuLy8gQSB0ZXh0IHRhYmxlJ3MgY2VsbCBhcyBhdXRvVGFibGUgdGFrZXMgaXQuIEl0IHByaW50cyBubyB0ZXh0IG9mIGl0cyBvd246IHRoZVxuLy8gY2VsbCdzIHdvcmRzICh0ZXh0Q2VsbCkgYXJlIGRyYXduIGludG8gaXQgb25jZSBpdHMgZ3JpZCBsaW5lcyBhbmQgZmlsbCBhcmVcbi8vIChfZHJhd1RleHRDZWxsKS5cbmludGVyZmFjZSBQZGZUZXh0Q2VsbElucHV0IHtcbiAgY29udGVudDogc3RyaW5nO1xuICBjb2xTcGFuOiBudW1iZXI7XG4gIHJvd1NwYW46IG51bWJlcjtcbiAgdGV4dENlbGw6IFRleHRUYWJsZUNlbGw7XG4gIHN0eWxlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8vIEZpeGVkIGNvbHVtbiB3aWR0aHMsIGJ5IGNvbHVtbiBpbmRleCwgaW4gcG9pbnRzLCBhbmQgdGhlIHJpZ2h0IGFsaWdubWVudCBvZlxuLy8gYSBjb2x1bW4gb2YgZm9ybWF0dGVkIG51bWJlcnMuXG50eXBlIFBkZkNvbHVtblN0eWxlcyA9IFJlY29yZDxudW1iZXIsIHsgY2VsbFdpZHRoOiBudW1iZXI7IGhhbGlnbj86ICdyaWdodCcgfT47XG5cbi8vIEEgdGFibGUgYm9keSBjZWxsOiBwbGFpbiB0ZXh0LCBvciBhIG5vdGljZSByb3cncyBvbmUgY2VsbCBzcGFubmluZyBldmVyeVxuLy8gY29sdW1uLlxudHlwZSBQZGZUYWJsZUNlbGwgPSBzdHJpbmcgfCB7IGNvbnRlbnQ6IHN0cmluZzsgY29sU3BhbjogbnVtYmVyOyBzdHlsZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG5cbi8vIFRoZSByb3dzIG9mIGEgbGlzdCB0aGF0IGRpZCBub3QgZml0IGl0cyBib3gsIGNhcnJpZWQgb250byBjb250aW51YXRpb25cbi8vIHBhZ2VzIGFmdGVyIGl0cyByZXBvcnQgcGFnZS4geCBhbmQgdyBhcmUgdGhlIGJveCdzLCBpbiBwb2ludHMsIGFuZCB0aGVcbi8vIGNvbHVtbiB3aWR0aHMgYW5kIGFsaWdubWVudHMgYXJlIHRoZSBvbmVzIHRoZSBvbi1wYWdlIHRhYmxlIHdhcyBkcmF3biB3aXRoLFxuLy8gc28gdGhlIHRhYmxlIHJlYWRzIGFzIG9uZSBhY3Jvc3MgcGFnZXMuXG5pbnRlcmZhY2UgUGRmVGFibGVPdmVyZmxvdyB7XG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50O1xuICAvLyBUaGUgdGV4dCB0aGUgbGlzdCB3YXMgc2VhcmNoZWQgYnksIGZvciB0aGUgY29udGludWF0aW9uIHRpdGxlLlxuICBzZWFyY2g/OiBzdHJpbmc7XG4gIC8vIFRoZSBjcnVtYnMgb2YgaXRzIGRyaWxsIHBhdGgsIGZvciB0aGUgY29udGludWF0aW9uIHRpdGxlLlxuICBjcnVtYnM/OiBzdHJpbmdbXTtcbiAgaGVhZDogc3RyaW5nW107XG4gIG51bWVyaWM6IGJvb2xlYW5bXTtcbiAgcm93czogc3RyaW5nW11bXTtcbiAgb21pdHRlZDogbnVtYmVyO1xuICAvLyBUaGUgbGlzdCdzIHRvdGFscyByb3csIHdoaWNoIGNsb3NlcyB0aGUgbGFzdCBjb250aW51YXRpb24gcGFnZS5cbiAgZm9vdDogc3RyaW5nW10gfCBudWxsO1xuICB4OiBudW1iZXI7XG4gIHc6IG51bWJlcjtcbiAgY29sdW1uU3R5bGVzOiBQZGZDb2x1bW5TdHlsZXM7XG59XG5cbi8vIEJ1aWxkcyB0aGUgUERGIGNsaWVudC1zaWRlIHdpdGgganNwZGYuIFRoZSByZXBvcnQncyB1bml0IGlzIGluY2hlcyBhbmQgUERGc1xuLy8gYXJlIHBvaW50cyBhdCBleGFjdGx5IDcyL2luY2gsIHNvIGVhY2ggcmVwb3J0IHBhZ2UgYmVjb21lcyBvbmUgUERGIHBhZ2Ugb2Zcbi8vIHRoZSBleGFjdCBwaHlzaWNhbCBzaXplIGFuZCBjb21wb25lbnRzIGxhbmQgYXQgdGhlaXIgcHJlY2lzZSBwb3NpdGlvbnMuXG4vLyBDaGFydHMgYXJlIHJlbmRlcmVkIHRocm91Z2ggYW4gb2Zmc2NyZWVuIEVDaGFydHMgaW5zdGFuY2UgYXQgM8OXIHBpeGVsXG4vLyByYXRpbyDigJQgcGl4ZWwtaWRlbnRpY2FsIHRvIHRoZSBzY3JlZW4sIGNyaXNwIGF0IHByaW50IHNpemUg4oCUIGFuZCB0YWJsZXMgYXJlXG4vLyBkcmF3biB3aXRoIGpzcGRmLWF1dG90YWJsZS4gQm90aCBsaWJyYXJpZXMgbG9hZCBsYXppbHkgaW50byB0aGVpciBvd24gY2h1bmtzLlxuLy9cbi8vIEEgbGlzdCB0YWJsZSBpcyBmaXR0ZWQgdG8gaXRzIGJveCBieSBsYXlpbmcgaXQgb3V0IGZpcnN0LCBuZXZlciBieSBhXG4vLyByb3ctaGVpZ2h0IGVzdGltYXRlLCBzbyBpdCBjYW5ub3Qgc3BpbGwgcGFzdCB0aGUgYm94LiBUaGUgcm93cyB0aGF0IGRvIG5vdFxuLy8gZml0IGNvbnRpbnVlIG9uIHBhZ2VzIG9mIHRoZWlyIG93biBhZnRlciB0aGUgcmVwb3J0IHBhZ2UsIHVuZGVyIHRoZSBzYW1lXG4vLyBoZWFkZXIvZm9vdGVyIGFuZCB3aXRoIHRoZSBzYW1lIGNvbHVtbiB3aWR0aHMsIHVwIHRvIFBERl9MSVNUX1JPV1M7IGFcbi8vIGxvbmdlciByZXN1bHQgZW5kcyBpbiBhIHJvdyBwb2ludGluZyB0byB0aGUgY29tcG9uZW50J3MgQ1NWIGV4cG9ydC5cbi8vXG4vLyBBIHRleHQgYmxvY2sncyB0YWJsZXMgYXJlIGRyYXduIGJ5IGF1dG9UYWJsZSB0b28sIGZyb20gdGhlIGxpbmUgaXRzIHdvcmRzXG4vLyByZWFjaCwgaW4gdGhlIGNvbHVtbiB3aWR0aHMgdGhlIGNhbnZhcyBnaXZlcyB0aGVtIChSZXBvcnRUZXh0TGF5b3V0U2VydmljZSkuXG4vLyBBIHRleHQgYmxvY2sgaXMgY3V0IGF0IHRoZSBib3R0b20gb2YgaXRzIGJveCwgYXMgdGhlIGNhbnZhcyBjbGlwcyBpdCwgYW5kXG4vLyBidWlsZCgpIGhhbmRzIHRoZSBmaWxlIGJhY2sgdW5zYXZlZCB3aXRoIHRoZSBibG9ja3MgaXQgY3V0LCBzbyB0aGUgZXhwb3J0XG4vLyBjYW4gYXNrIGFib3V0IHRoZW0gYmVmb3JlIGl0IHNhdmVzLlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydFBkZlNlcnZpY2Uge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RleHRMYXlvdXQgPSBpbmplY3QoUmVwb3J0VGV4dExheW91dFNlcnZpY2UpO1xuXG4gIHB1YmxpYyBhc3luYyBidWlsZChjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IFByb21pc2U8QnVpbHRFeHBvcnQ+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5fY29udGV4dChjb2xsZWN0ZWQpO1xuXG4gICAgdGhpcy5fdGl0bGVQYWdlKGNvbnRleHQuZG9jLCBjb2xsZWN0ZWQsIGNvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUgpO1xuXG4gICAgLy8gVGhlIHBoeXNpY2FsIHBhZ2UgbnVtYmVyIHt7cGFnZS5udW1iZXJ9fSBwcmludHM6IHJlcG9ydCBwYWdlcyBhbmRcbiAgICAvLyB0aGVpciBjb250aW51YXRpb24gcGFnZXMgYWxpa2UsIHRoZSB0aXRsZSBwYWdlIG5vdCBjb3VudGVkLlxuICAgIGxldCBwYWdlTnVtYmVyID0gMDtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBjb2xsZWN0ZWRQYWdlXSBvZiBjb2xsZWN0ZWQucGFnZXMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBvdmVyZmxvd3M6IFBkZlRhYmxlT3ZlcmZsb3dbXSA9IFtdO1xuICAgICAgcGFnZU51bWJlciArPSAxO1xuXG4gICAgICBhd2FpdCB0aGlzLl9yZW5kZXJQYWdlKGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UsIGluZGV4LCBwYWdlTnVtYmVyLCBvdmVyZmxvd3MpO1xuXG4gICAgICAvLyBFYWNoIGNvbnRpbnVhdGlvbiBhcHBlbmRzIGl0cyBwYWdlcyBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudCwgc29cbiAgICAgIC8vIHR3byBsaXN0cyB0aGF0IG92ZXJmbG93ZWQgb24gb25lIHBhZ2UgZm9sbG93IGl0IGJhY2sgdG8gYmFjay5cbiAgICAgIGZvciAoY29uc3Qgb3ZlcmZsb3cgb2Ygb3ZlcmZsb3dzKSB7XG4gICAgICAgIHBhZ2VOdW1iZXIgPSBhd2FpdCB0aGlzLl9yZW5kZXJDb250aW51YXRpb24oY29udGV4dCwgY29sbGVjdGVkUGFnZS5wYWdlLCBpbmRleCwgcGFnZU51bWJlciwgb3ZlcmZsb3cpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBvdmVyZmxvd3M6IFsuLi5jb250ZXh0LnRleHRPdmVyZmxvd3MudmFsdWVzKCldLFxuICAgICAgb3ZlcmZsb3dOb3RlOiBQREZfT1ZFUkZMT1dfTk9URSxcbiAgICAgIHNhdmU6ICgpID0+IHtcbiAgICAgICAgY29udGV4dC5kb2Muc2F2ZShgJHt0aGlzLl9zbHVnKGNvbGxlY3RlZC5yZXBvcnQubmFtZSl9LnBkZmApO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfY29udGV4dChjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IFByb21pc2U8UGRmRXhwb3J0Q29udGV4dD4ge1xuICAgIGNvbnN0IHJlcG9ydCA9IGNvbGxlY3RlZC5yZXBvcnQ7XG4gICAgY29uc3QgeyBqc1BERiB9ID0gYXdhaXQgaW1wb3J0KCdqc3BkZicpO1xuICAgIGNvbnN0IGF1dG9UYWJsZSA9IChhd2FpdCBpbXBvcnQoJ2pzcGRmLWF1dG90YWJsZScpKS5kZWZhdWx0O1xuXG4gICAgY29uc3QgcGFnZVcgPSByZXBvcnQucGFnZVdpZHRoICogUFQ7XG4gICAgY29uc3QgcGFnZUggPSByZXBvcnQucGFnZUhlaWdodCAqIFBUO1xuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gcGFnZVcgPj0gcGFnZUggPyAnbGFuZHNjYXBlJyA6ICdwb3J0cmFpdCc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZG9jOiBuZXcganNQREYoeyBvcmllbnRhdGlvbiwgdW5pdDogJ3B0JywgZm9ybWF0OiBbcGFnZVcsIHBhZ2VIXSB9KSxcbiAgICAgIGF1dG9UYWJsZSxcbiAgICAgIGpzUERGLFxuICAgICAgcmVwb3J0LFxuICAgICAgdGltZXpvbmU6IHJlc29sdmVSZXBvcnRUaW1lem9uZShyZXBvcnQpLFxuICAgICAgZm9ybWF0Q29udGV4dDogY29sbGVjdGVkLmZvcm1hdENvbnRleHQsXG4gICAgICBwYWdlVyxcbiAgICAgIHBhZ2VILFxuICAgICAgb3JpZW50YXRpb24sXG4gICAgICBtYXN0ZXJWYWx1ZXM6IHRoaXMuX3BkZlZhbHVlcyhjb2xsZWN0ZWQubWFzdGVyVmFsdWVzKSxcbiAgICAgIGZpbHRlckZpZWxkczogY29sbGVjdGVkLmZpbHRlckZpZWxkcyxcbiAgICAgIG1hc3RlckZpbHRlcnM6IGxheWVyRmlsdGVyRmllbGRzKGNvbGxlY3RlZC5maWx0ZXJGaWVsZHMsIHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10sIG51bGwpLFxuICAgICAgdGV4dE92ZXJmbG93czogbmV3IE1hcCgpLFxuICAgIH07XG4gIH1cblxuICAvLyBPbmUgcmVwb3J0IHBhZ2U6IHRoZSBoZWFkZXIgYW5kIGZvb3RlciBmaXJzdCwgdW5kZXIgdGhlIHBhZ2UncyBvd25cbiAgLy8gY29tcG9uZW50cy4gQSBsaXN0IHRoYXQgb3V0Z3Jvd3MgaXRzIGJveCBsZWF2ZXMgaXRzIHJlbWFpbmluZyByb3dzIGluXG4gIC8vIG92ZXJmbG93cy4gVGhlIHBhZ2UncyB0ZXh0IGZpbGxzIGl0cyB2YWx1ZSB0b2tlbnMgd2l0aCB0aGUgcGFnZSdzIHZhbHVlcy5cbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyUGFnZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGNvbGxlY3RlZFBhZ2U6IENvbGxlY3RlZFBhZ2UsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXG4gICAgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IHRva2VucyA9IHRoaXMuX3Rva2Vucyhjb250ZXh0LCBjb2xsZWN0ZWRQYWdlLnBhZ2UsIGluZGV4LCBwYWdlTnVtYmVyKTtcbiAgICBjb25zdCBwYWdlVG9rZW5zID0geyAuLi50b2tlbnMsIHZhbHVlczogdGhpcy5fcGRmVmFsdWVzKGNvbGxlY3RlZFBhZ2UudmFsdWVzKSB9O1xuXG4gICAgZG9jLmFkZFBhZ2UoW2NvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUhdLCBjb250ZXh0Lm9yaWVudGF0aW9uKTtcbiAgICBhd2FpdCB0aGlzLl9yZW5kZXJNYXN0ZXIoY29udGV4dCwgY29sbGVjdGVkUGFnZS5wYWdlLCB0b2tlbnMpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbGxlY3RlZFBhZ2UuY29tcG9uZW50cykge1xuICAgICAgaWYgKGl0ZW0uY29tcG9uZW50LnR5cGUgIT09ICd0ZXh0Jykge1xuICAgICAgICBhd2FpdCB0aGlzLl9yZW5kZXJDb21wb25lbnQoY29udGV4dCwgaXRlbSwgdG9rZW5zLCBvdmVyZmxvd3MpO1xuICAgICAgfSBlbHNlIGlmIChhd2FpdCB0aGlzLl9yZW5kZXJUZXh0KGNvbnRleHQsIGl0ZW0uY29tcG9uZW50LCBwYWdlVG9rZW5zKSkge1xuICAgICAgICB0aGlzLl9yZWNvcmRPdmVyZmxvdyhjb250ZXh0LCBpdGVtLmNvbXBvbmVudCwgdG9rZW5zLnBhZ2VOYW1lLCBwYWdlVG9rZW5zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBUaGUgaGVhZGVyIGFuZCBmb290ZXIsIHRoZWlyIHZhbHVlIHRva2VucyBmaWxsZWQgd2l0aCB0aGUgbWFzdGVyJ3MgdmFsdWVzXG4gIC8vIHdoaWNoZXZlciBwYWdlIHRoZXkgc2l0IG9uOiBhIHJlcG9ydCBwYWdlIG9yIGEgY29udGludWF0aW9uIHBhZ2UuIFRoZXlcbiAgLy8gcmVhZCBubyBwYWdlIGZpbHRlcjogaXRzIHRva2VuIHByaW50cyB0aGUgZW0gZGFzaCB0aGVyZS5cbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyTWFzdGVyKGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsIHBhZ2U6IFJlcG9ydFBhZ2UsIHRva2VuczogVGV4dFRva2VuQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwYWdlLm1hc3RlckhpZGRlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1hc3RlclRva2VucyA9IHsgLi4udG9rZW5zLCB2YWx1ZXM6IGNvbnRleHQubWFzdGVyVmFsdWVzLCBmaWx0ZXJzOiBjb250ZXh0Lm1hc3RlckZpbHRlcnMgfTtcblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIChjb250ZXh0LnJlcG9ydC5tYXN0ZXI/LmNvbXBvbmVudHMgPz8gW10pLmZpbHRlcihpc0RyYXduKSkge1xuICAgICAgaWYgKGF3YWl0IHRoaXMuX3JlbmRlclRleHQoY29udGV4dCwgY29tcG9uZW50LCBtYXN0ZXJUb2tlbnMpKSB7XG4gICAgICAgIHRoaXMuX3JlY29yZE92ZXJmbG93KGNvbnRleHQsIGNvbXBvbmVudCwgSEVBREVSX0ZPT1RFUl9OQU1FLCBtYXN0ZXJUb2tlbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIExpc3RzIGEgdGV4dCBibG9jayB0aGF0IHdhcyBjdXQsIHVuZGVyIHRoZSBwYWdlIHRoZSBleHBvcnQncyBvdmVyZmxvdyBnYXRlXG4gIC8vIG5hbWVzIGl0IGJ5LiBBIGJsb2NrIGN1dCBhZ2FpbiBvbiBhIGxhdGVyIHBhZ2UgKGEgaGVhZGVyIG9yIGZvb3Rlcikga2VlcHNcbiAgLy8gdGhlIGZpcnN0IGVudHJ5LlxuICBwcml2YXRlIF9yZWNvcmRPdmVyZmxvdyhcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIHBhZ2U6IHN0cmluZyxcbiAgICB0b2tlbnM6IFRleHRUb2tlbkNvbnRleHQsXG4gICk6IHZvaWQge1xuICAgIGlmICghY29udGV4dC50ZXh0T3ZlcmZsb3dzLmhhcyhjb21wb25lbnQuaWQpKSB7XG4gICAgICBjb250ZXh0LnRleHRPdmVyZmxvd3Muc2V0KGNvbXBvbmVudC5pZCwgdGV4dE92ZXJmbG93KGNvbXBvbmVudCwgcGFnZSwgdG9rZW5zKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdGl0bGVQYWdlKGRvYzogYW55LCBjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCwgcGFnZVc6IG51bWJlciwgcGFnZUg6IG51bWJlcik6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyOCk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgIGRvYy50ZXh0KGNvbGxlY3RlZC5yZXBvcnQubmFtZSwgNDAsIHBhZ2VIICogMC4zNSk7XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgxMSk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzUyNjA2ZCcpO1xuXG4gICAgZG9jLnRleHQoY292ZXJMaW5lcyhjb2xsZWN0ZWQpLm1hcCgobGluZSkgPT4gdGhpcy5fcGRmVGV4dChsaW5lKSksIDQwLCBwYWdlSCAqIDAuMzUgKyAyNik7XG4gIH1cblxuICAvLyBBIHRleHQgYmxvY2ssIGxhaWQgb3V0IGJ5IGhhbmQ6IGpzUERGIGRyYXdzIHN0cmluZ3MsIG5vdCByaWNoIHRleHQsIHNvIHRoZVxuICAvLyB3b3JkcyBiZXR3ZWVuIGl0cyB0YWJsZXMgYXJlIGRyYXduIGxpbmUgYnkgbGluZSAoX2RyYXdQYXJhZ3JhcGhzKSBhbmQgZWFjaFxuICAvLyB0YWJsZSBieSBhdXRvVGFibGUgZnJvbSB0aGUgbGluZSB0aGUgd29yZHMgYWJvdmUgaXQgcmVhY2hcbiAgLy8gKF9kcmF3VGV4dFRhYmxlKS4gT25seSBhIGJsb2NrIHdpdGggYSB0YWJsZSBpcyBtZWFzdXJlZCwgZm9yIHRoZSBlZGdlc1xuICAvLyBhbmQgY29sdW1uIHdpZHRocyB0aGUgY2FudmFzIGdpdmVzIGl0cyB0YWJsZXMuIFdoYXRldmVyIHJ1bnMgcGFzdFxuICAvLyB0aGUgYmxvY2sncyBoZWlnaHQgaXMgbGVmdCBvZmYg4oCUIHRoZSBjYW52YXMgY2xpcHMgdGhlIGJsb2NrIHRoZXJlIHRvby5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIGFueXRoaW5nIHdhcy5cbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyVGV4dChcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIHRva2VuczogVGV4dFRva2VuQ29udGV4dCxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYm94ID0gdGhpcy5fdGV4dEJveChjb21wb25lbnQpO1xuICAgIGNvbnN0IGJsb2NrcyA9IHRleHRCbG9ja3MoY29tcG9uZW50LmNvbmZpZz8uaHRtbCA/PyAnJywgdG9rZW5zKTtcbiAgICBjb25zdCBsYXlvdXQgPSBibG9ja3Muc29tZSgoYmxvY2spID0+IGJsb2NrLmtpbmQgPT09ICd0YWJsZScpXG4gICAgICA/IGF3YWl0IHRoaXMuX3RleHRMYXlvdXQubWVhc3VyZShjb21wb25lbnQsIHRva2VucylcbiAgICAgIDogbnVsbDtcbiAgICBsZXQgY3Vyc29yWSA9IGJveC50b3A7XG4gICAgbGV0IHRhYmxlSW5kZXggPSAwO1xuICAgIC8vIFRoZSBjdXJzb3Igc2l0cyBvbiBhIHRhYmxlJ3MgYm90dG9tIG1hcmdpbiwgbm90aGluZyBkcmF3biBzaW5jZTogdGhlXG4gICAgLy8gbmV4dCB0YWJsZSdzIHRvcCBtYXJnaW4gaXMgdGhlIHNhbWUgc3BhY2UsIGFzIHR3byBibG9jayBtYXJnaW5zIHRoYXRcbiAgICAvLyBtZWV0IGNvbGxhcHNlIGludG8gb25lIG9uIHRoZSBjYW52YXMuXG4gICAgbGV0IG9uTWFyZ2luID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGJsb2NrIG9mIGJsb2Nrcykge1xuICAgICAgY29uc3QgZHJhd24gPSBibG9jay5raW5kID09PSAndGV4dCdcbiAgICAgICAgPyB0aGlzLl9kcmF3UGFyYWdyYXBocyhjb250ZXh0LmRvYywgYmxvY2sucGFyYWdyYXBocywgYm94LCBjdXJzb3JZKVxuICAgICAgICA6IHRoaXMuX2RyYXdUZXh0VGFibGUoXG4gICAgICAgICAgY29udGV4dCwgYmxvY2sudGFibGUsIGxheW91dD8udGFibGVzW3RhYmxlSW5kZXgrK10gPz8gbnVsbCwgYm94LFxuICAgICAgICAgIG9uTWFyZ2luID8gY3Vyc29yWSA6IGN1cnNvclkgKyBURVhUX1RBQkxFX01BUkdJTixcbiAgICAgICAgKTtcblxuICAgICAgaWYgKGRyYXduLmN1dCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY3Vyc29yWSA9IGRyYXduLmN1cnNvclk7XG4gICAgICBvbk1hcmdpbiA9IGJsb2NrLmtpbmQgPT09ICd0YWJsZScgfHwgKG9uTWFyZ2luICYmICFibG9jay5wYXJhZ3JhcGhzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gV2hlcmUgYSB0ZXh0IGJsb2NrJ3Mgd29yZHMgZ286IGluc2lkZSBpdHMgcGFkZGluZywgZWFjaCBlZGdlIDEvOFwiIHVubGVzc1xuICAvLyBzZXQuXG4gIHByaXZhdGUgX3RleHRCb3goY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBQZGZUZXh0Qm94IHtcbiAgICBjb25zdCBwYWRkaW5nID0gY29tcG9uZW50LmNvbmZpZz8ucGFkZGluZztcbiAgICBjb25zdCBpbnNldCA9ICh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiAodmFsdWUgPz8gREVGQVVMVF9DT01QT05FTlRfUEFERElORykgKiBQVDtcblxuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiBjb21wb25lbnQueCAqIFBUICsgaW5zZXQocGFkZGluZz8ubGVmdCksXG4gICAgICB0b3A6IGNvbXBvbmVudC55ICogUFQgKyBpbnNldChwYWRkaW5nPy50b3ApLFxuICAgICAgd2lkdGg6IGNvbXBvbmVudC53ICogUFQgLSBpbnNldChwYWRkaW5nPy5sZWZ0KSAtIGluc2V0KHBhZGRpbmc/LnJpZ2h0KSxcbiAgICAgIGJvdHRvbTogKGNvbXBvbmVudC55ICsgY29tcG9uZW50LmgpICogUFQgLSBpbnNldChwYWRkaW5nPy5ib3R0b20pLFxuICAgIH07XG4gIH1cblxuICAvLyBQYXJhZ3JhcGhzIGRyYXduIGxpbmUgYnkgbGluZSBmcm9tIGN1cnNvclkgZG93bjogZWFjaCBvbmUncyBydW5zIGFyZSBicm9rZW5cbiAgLy8gaW50byB3b3Jkcywgd3JhcHBlZCB0byB0aGUgYm94J3Mgd2lkdGggYW5kIGRyYXduIHdvcmQgYnkgd29yZCBpbiB0aGVpciBvd25cbiAgLy8gZm9udCwgc2l6ZSBhbmQgY29sb3IsIGEgbGlzdCBpdGVtJ3MgbWFya2VyIGh1bmcgaW4gaXRzIGluZGVudC4gVGhlIGZpcnN0XG4gIC8vIGxpbmUgdGhhdCB3b3VsZCBydW4gcGFzdCB0aGUgYm94J3MgYm90dG9tIGVuZHMgdGhlIGRyYXdpbmcsIGN1dC5cbiAgcHJpdmF0ZSBfZHJhd1BhcmFncmFwaHMoZG9jOiBhbnksIHBhcmFncmFwaHM6IFRleHRQYXJhZ3JhcGhbXSwgYm94OiBQZGZUZXh0Qm94LCBjdXJzb3JZOiBudW1iZXIpOiBQZGZUZXh0Q3Vyc29yIHtcbiAgICBsZXQgeSA9IGN1cnNvclk7XG4gICAgbGV0IGxpc3ROdW1iZXIgPSAwO1xuXG4gICAgZm9yIChjb25zdCBwYXJhZ3JhcGggb2YgcGFyYWdyYXBocykge1xuICAgICAgbGlzdE51bWJlciA9IHBhcmFncmFwaC5idWxsZXQgPT09ICdudW1iZXInID8gbGlzdE51bWJlciArIDEgOiAwO1xuICAgICAgY29uc3QgaW5kZW50ID0gcGFyYWdyYXBoLmJ1bGxldCA/IExJU1RfSU5ERU5UIDogMDtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5fd3JhcChkb2MsIHBhcmFncmFwaCwgYm94LndpZHRoIC0gaW5kZW50KTtcblxuICAgICAgZm9yIChjb25zdCBbbGluZUluZGV4LCBsaW5lXSBvZiBsaW5lcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuX2xpbmVTaXplKHBhcmFncmFwaCwgbGluZSk7XG4gICAgICAgIGlmICh5ICsgc2l6ZSAqIFRFWFRfTElORV9IRUlHSFQgPiBib3guYm90dG9tICsgMC41KSB7XG4gICAgICAgICAgcmV0dXJuIHsgY3Vyc29yWTogeSwgY3V0OiB0cnVlIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGluZUluZGV4ID09PSAwICYmIHBhcmFncmFwaC5idWxsZXQpIHtcbiAgICAgICAgICB0aGlzLl9mb250KGRvYywgbGluZVswXT8ucnVuID8/IHsgdGV4dDogJycgfSwgc2l6ZSk7XG4gICAgICAgICAgZG9jLnRleHQocGFyYWdyYXBoLmJ1bGxldCA9PT0gJ251bWJlcicgPyBgJHtsaXN0TnVtYmVyfS5gIDogJ+KAoicsIGJveC5sZWZ0LCB5ICsgc2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kcmF3TGluZShkb2MsIGxpbmUsIHBhcmFncmFwaC5hbGlnbiwgYm94LmxlZnQgKyBpbmRlbnQsIGJveC53aWR0aCAtIGluZGVudCwgeSArIHNpemUpO1xuICAgICAgICB5ICs9IHNpemUgKiBURVhUX0xJTkVfSEVJR0hUO1xuICAgICAgfVxuXG4gICAgICAvLyBBbiBlbXB0eSBwYXJhZ3JhcGggaXMgc3RpbGwgYSBsaW5lLlxuICAgICAgaWYgKCFsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgeSArPSBERUZBVUxUX1RFWFRfU0laRSAqIFRFWFRfTElORV9IRUlHSFQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY3Vyc29yWTogeSwgY3V0OiBmYWxzZSB9O1xuICB9XG5cbiAgLy8gSG93IGZhciBfZHJhd1BhcmFncmFwaHMgdGFrZXMgaXRzIGN1cnNvciBkb3duIGRyYXdpbmcgdGhlIHBhcmFncmFwaHMgd2hvbGVcbiAgLy8gYXQgYSB3aWR0aC5cbiAgcHJpdmF0ZSBfcGFyYWdyYXBoc0hlaWdodChkb2M6IGFueSwgcGFyYWdyYXBoczogVGV4dFBhcmFncmFwaFtdLCB3aWR0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcGFyYWdyYXBocy5yZWR1Y2UoKGhlaWdodCwgcGFyYWdyYXBoKSA9PiB7XG4gICAgICBjb25zdCBsaW5lcyA9IHRoaXMuX3dyYXAoZG9jLCBwYXJhZ3JhcGgsIHdpZHRoIC0gKHBhcmFncmFwaC5idWxsZXQgPyBMSVNUX0lOREVOVCA6IDApKTtcblxuICAgICAgcmV0dXJuIGhlaWdodCArIChsaW5lcy5sZW5ndGhcbiAgICAgICAgPyBsaW5lcy5yZWR1Y2UoKHN1bSwgbGluZSkgPT4gc3VtICsgdGhpcy5fbGluZVNpemUocGFyYWdyYXBoLCBsaW5lKSAqIFRFWFRfTElORV9IRUlHSFQsIDApXG4gICAgICAgIDogREVGQVVMVF9URVhUX1NJWkUgKiBURVhUX0xJTkVfSEVJR0hUKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIEEgbGluZSdzIGZvbnQgc2l6ZTogaXRzIGxhcmdlc3Qgd29yZCdzLCBhbmQgbmV2ZXIgdW5kZXIgaXRzIHBhcmFncmFwaCdzXG4gIC8vIGZpcnN0IHJ1bidzLlxuICBwcml2YXRlIF9saW5lU2l6ZShwYXJhZ3JhcGg6IFRleHRQYXJhZ3JhcGgsIGxpbmU6IFBkZldvcmRbXSk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KC4uLmxpbmUubWFwKCh3b3JkKSA9PiB3b3JkLnNpemUpLCBwYXJhZ3JhcGgucnVuc1swXT8uZm9udFNpemUgPz8gREVGQVVMVF9URVhUX1NJWkUpO1xuICB9XG5cbiAgLy8gT25lIHdyYXBwZWQgbGluZSBvbiBpdHMgYmFzZWxpbmUsIGFsaWduZWQgd2l0aGluIHRoZSB3aWR0aCBmcm9tIGxlZnQuXG4gIHByaXZhdGUgX2RyYXdMaW5lKFxuICAgIGRvYzogYW55LFxuICAgIGxpbmU6IFBkZldvcmRbXSxcbiAgICBhbGlnbjogVGV4dFBhcmFncmFwaFsnYWxpZ24nXSxcbiAgICBsZWZ0OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGJhc2VsaW5lOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGxpbmVXaWR0aCA9IGxpbmUucmVkdWNlKChzdW0sIHdvcmQpID0+IHN1bSArIHdvcmQud2lkdGgsIDApO1xuICAgIGxldCB4ID0gbGVmdCArIHRoaXMuX2FsaWduT2Zmc2V0KGFsaWduLCB3aWR0aCwgbGluZVdpZHRoKTtcblxuICAgIGZvciAoY29uc3Qgd29yZCBvZiBsaW5lKSB7XG4gICAgICB0aGlzLl9kcmF3V29yZChkb2MsIHdvcmQsIHgsIGJhc2VsaW5lKTtcbiAgICAgIHggKz0gd29yZC53aWR0aDtcbiAgICB9XG4gIH1cblxuICAvLyBBIHRhYmxlIGluIGEgdGV4dCBibG9jaywgZHJhd24gYnkgYXV0b1RhYmxlIGZyb20gdG9wIChfcmVuZGVyVGV4dCBwdXRzIGl0XG4gIC8vIFRFWFRfVEFCTEVfTUFSR0lOIHVuZGVyIHRoZSBsaW5lIHRoZSB3b3JkcyBhYm92ZSBpdCByZWFjaCksIGluIHRoZSBvbmVcbiAgLy8gbG9vayBldmVyeSByZW5kZXJlciBkcmF3cyAoVEVYVF9UQUJMRV8qIGluIHRleHQudHMpLiBJdHMgbGVmdCBlZGdlLCB3aWR0aFxuICAvLyBhbmQgY29sdW1uIHdpZHRocyBhcmUgdGhlIGNhbnZhcydzIChsYXlvdXQpLCBlbHNlIHRoZSBib3gncyB3aWR0aCBzcGxpdFxuICAvLyBldmVubHkuIEEgcm93IGlzIGFzIHRhbGwgYXMgaXRzIGNlbGxzJyB3b3JkcyB3cmFwcGVkIGFzIF9kcmF3UGFyYWdyYXBoc1xuICAvLyB3cmFwcyB0aGVtLCBhbmQgdGhlIHdvcmRzIGFyZSBkcmF3biBpbnRvIGVhY2ggY2VsbCBvbmNlIGF1dG9UYWJsZSBoYXNcbiAgLy8gZHJhd24gaXRzIGdyaWQgbGluZXMgYW5kIGZpbGwgKF9kcmF3VGV4dENlbGwpLCBzbyB0aGV5IGtlZXAgdGhlaXIgcnVucydcbiAgLy8gZm9udHMgYW5kIGNvbG9ycy4gT25seSB0aGUgcm93cyB0aGUgYm94IGhvbGRzIGFyZSBkcmF3biwgYW5kIGEgdGFibGUgdGhhdFxuICAvLyBsb3NlcyBhbnkgaXMgY3V0LiBUaGUgY3Vyc29yIGl0IGxlYXZlcyBpcyBURVhUX1RBQkxFX01BUkdJTiB1bmRlciBpdC5cbiAgcHJpdmF0ZSBfZHJhd1RleHRUYWJsZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIHRhYmxlOiBUZXh0VGFibGUsXG4gICAgbGF5b3V0OiBUZXh0VGFibGVMYXlvdXQgfCBudWxsLFxuICAgIGJveDogUGRmVGV4dEJveCxcbiAgICB0b3A6IG51bWJlcixcbiAgKTogUGRmVGV4dEN1cnNvciB7XG4gICAgaWYgKHRvcCA+PSBib3guYm90dG9tKSB7XG4gICAgICByZXR1cm4geyBjdXJzb3JZOiB0b3AsIGN1dDogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxlZnQgPSBib3gubGVmdCArIChsYXlvdXQ/LmxlZnQgPz8gMCkgKiBQVDtcbiAgICBjb25zdCB3aWR0aCA9IGxheW91dCA/IGxheW91dC53aWR0aCAqIFBUIDogYm94LndpZHRoO1xuICAgIGNvbnN0IGNvbHVtbldpZHRocyA9IGxheW91dD8uY29sdW1uV2lkdGhzLmxlbmd0aCA9PT0gdGFibGUuY29sdW1uc1xuICAgICAgPyBsYXlvdXQuY29sdW1uV2lkdGhzLm1hcCgoY29sdW1uV2lkdGgpID0+IGNvbHVtbldpZHRoICogUFQpXG4gICAgICA6IEFycmF5LmZyb20oeyBsZW5ndGg6IHRhYmxlLmNvbHVtbnMgfSwgKCkgPT4gd2lkdGggLyB0YWJsZS5jb2x1bW5zKTtcbiAgICBjb25zdCBib2R5ID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4gcm93LmNlbGxzLm1hcCgoY2VsbCkgPT4gdGhpcy5fdGV4dENlbGxJbnB1dChjb250ZXh0LmRvYywgY2VsbCwgY29sdW1uV2lkdGhzKSkpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl90ZXh0VGFibGVPcHRpb25zKGNvbnRleHQsIGNvbHVtbldpZHRocywgbGVmdCwgdG9wLCB3aWR0aCwgYm94LmJvdHRvbSk7XG4gICAgY29uc3QgZml0ID0gdGhpcy5fdGV4dFRhYmxlRml0KGNvbnRleHQsIHsgLi4ub3B0aW9ucywgYm9keSB9KTtcblxuICAgIGlmIChmaXQpIHtcbiAgICAgIHRoaXMuX2RyYXdUYWJsZShjb250ZXh0LCB7IC4uLm9wdGlvbnMsIGJvZHk6IHRoaXMuX2tlcHRSb3dzKGJvZHksIGZpdCkgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnNvclk6IGZpdCA/IGNvbnRleHQuZG9jLmxhc3RBdXRvVGFibGUuZmluYWxZICsgVEVYVF9UQUJMRV9NQVJHSU4gOiB0b3AsXG4gICAgICBjdXQ6IGZpdCA8IHRhYmxlLnJvd3MubGVuZ3RoLFxuICAgIH07XG4gIH1cblxuICAvLyBBIHRleHQgdGFibGUncyBjZWxsIGFzIGF1dG9UYWJsZSB0YWtlcyBpdDogaXRzIHNwYW5zIGFuZCBmaWxsIGFuZCwgd2hlbiBpdFxuICAvLyBpcyBvbmUgcm93IHRhbGwsIHRoZSBoZWlnaHQgaXRzIHdvcmRzIG5lZWQgYXQgdGhlIHdpZHRoIGl0IHNwYW5zLiBBIGNlbGxcbiAgLy8gdGhhdCBzcGFucyByb3dzIHNoYXJlcyB0aGVpcnMuXG4gIHByaXZhdGUgX3RleHRDZWxsSW5wdXQoZG9jOiBhbnksIGNlbGw6IFRleHRUYWJsZUNlbGwsIGNvbHVtbldpZHRoczogbnVtYmVyW10pOiBQZGZUZXh0Q2VsbElucHV0IHtcbiAgICBjb25zdCBwYWRkaW5nID0gVEVYVF9UQUJMRV9DRUxMX1BBRERJTkc7XG4gICAgY29uc3Qgd2lkdGggPSBjb2x1bW5XaWR0aHNcbiAgICAgIC5zbGljZShjZWxsLmNvbHVtbiwgY2VsbC5jb2x1bW4gKyBjZWxsLmNvbFNwYW4pXG4gICAgICAucmVkdWNlKChzdW0sIGNvbHVtbldpZHRoKSA9PiBzdW0gKyBjb2x1bW5XaWR0aCwgMCkgLSAyICogcGFkZGluZy5ob3Jpem9udGFsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6ICcnLFxuICAgICAgY29sU3BhbjogY2VsbC5jb2xTcGFuLFxuICAgICAgcm93U3BhbjogY2VsbC5yb3dTcGFuLFxuICAgICAgdGV4dENlbGw6IGNlbGwsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgLi4uKGNlbGwuZmlsbCA/IHsgZmlsbENvbG9yOiBjZWxsLmZpbGwgfSA6IHt9KSxcbiAgICAgICAgLi4uKGNlbGwucm93U3BhbiA9PT0gMVxuICAgICAgICAgID8geyBtaW5DZWxsSGVpZ2h0OiB0aGlzLl9wYXJhZ3JhcGhzSGVpZ2h0KGRvYywgY2VsbC5wYXJhZ3JhcGhzLCB3aWR0aCkgKyAyICogcGFkZGluZy52ZXJ0aWNhbCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyBUaGUgYXV0b1RhYmxlIG9wdGlvbnMgYSB0ZXh0IHRhYmxlJ3MgZHJ5IHJ1biBhbmQgaXRzIGRyYXcgc2hhcmUuIEV2ZXJ5XG4gIC8vIGNvbHVtbiBpcyBsaXN0ZWQgYW5kIGZpeGVkIGF0IGl0cyB3aWR0aDogYXV0b1RhYmxlIHdvdWxkIG90aGVyd2lzZSBjb3VudFxuICAvLyB0aGUgY29sdW1ucyBvZiB0aGUgZmlyc3Qgcm93LCB3aGljaCBtYXkgYmUgbmFycm93ZXIgdGhhbiB0aGUgZ3JpZC4gQSByb3dcbiAgLy8gaXMgbmV2ZXIgc3BsaXQgYXQgdGhlIGJveCdzIGJvdHRvbTogaXQgZml0cyB3aG9sZSBvciBtb3ZlcyBwYXN0IGl0LiBib3R0b21cbiAgLy8gaXMgdGhlIGJveCdzLlxuICBwcml2YXRlIF90ZXh0VGFibGVPcHRpb25zKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29sdW1uV2lkdGhzOiBudW1iZXJbXSxcbiAgICBsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBib3R0b206IG51bWJlcixcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHBhZGRpbmcgPSBURVhUX1RBQkxFX0NFTExfUEFERElORztcblxuICAgIHJldHVybiB7XG4gICAgICB0aGVtZTogJ3BsYWluJyxcbiAgICAgIGNvbHVtbnM6IGNvbHVtbldpZHRocy5tYXAoKF8sIGluZGV4KSA9PiAoeyBkYXRhS2V5OiBpbmRleCB9KSksXG4gICAgICBzdGFydFk6IHRvcCxcbiAgICAgIG1hcmdpbjogeyBsZWZ0LCByaWdodDogY29udGV4dC5wYWdlVyAtIGxlZnQgLSB3aWR0aCwgYm90dG9tOiBjb250ZXh0LnBhZ2VIIC0gYm90dG9tIH0sXG4gICAgICB0YWJsZVdpZHRoOiB3aWR0aCxcbiAgICAgIGNvbHVtblN0eWxlczogT2JqZWN0LmZyb21FbnRyaWVzKGNvbHVtbldpZHRocy5tYXAoKGNlbGxXaWR0aCwgaW5kZXgpID0+IFtpbmRleCwgeyBjZWxsV2lkdGggfV0pKSxcbiAgICAgIHJvd1BhZ2VCcmVhazogJ2F2b2lkJyxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBmb250OiAnaGVsdmV0aWNhJyxcbiAgICAgICAgZm9udFN0eWxlOiAnbm9ybWFsJyxcbiAgICAgICAgZm9udFNpemU6IERFRkFVTFRfVEVYVF9TSVpFLFxuICAgICAgICBjZWxsUGFkZGluZzoge1xuICAgICAgICAgIHRvcDogcGFkZGluZy52ZXJ0aWNhbCwgcmlnaHQ6IHBhZGRpbmcuaG9yaXpvbnRhbCwgYm90dG9tOiBwYWRkaW5nLnZlcnRpY2FsLCBsZWZ0OiBwYWRkaW5nLmhvcml6b250YWwsXG4gICAgICAgIH0sXG4gICAgICAgIGxpbmVDb2xvcjogVEVYVF9UQUJMRV9CT1JERVJfQ09MT1IsXG4gICAgICAgIGxpbmVXaWR0aDogVEVYVF9UQUJMRV9CT1JERVJfV0lEVEgsXG4gICAgICAgIHZhbGlnbjogJ21pZGRsZScsXG4gICAgICAgIHRleHRDb2xvcjogREVGQVVMVF9URVhUX0NPTE9SLFxuICAgICAgfSxcbiAgICAgIGRpZERyYXdDZWxsOiAoaG9vazogYW55KSA9PiB0aGlzLl9kcmF3VGV4dENlbGwoaG9vayksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEhvdyBtYW55IG9mIGEgdGV4dCB0YWJsZSdzIHJvd3MgaXRzIGJveCBob2xkczogdGhlIHJvd3MgYXV0b1RhYmxlIGRyYXdzXG4gIC8vIHdob2xlIG9uIHRoZSBmaXJzdCBwYWdlIHdoZW4gaXQgbGF5cyB0aGUgdGFibGUgb3V0IG9uIGEgc2NyYXRjaCBkb2N1bWVudFxuICAvLyBvZiB0aGUgc2FtZSBwYWdlIHNpemUsIGFzIF9tZWFzdXJlIGRvZXMgZm9yIGEgbGlzdC4gQSByb3cgdGFsbGVyIHRoYW4gYVxuICAvLyBwYWdlIGlzIHNwbGl0IGFjcm9zcyBwYWdlcyByYXRoZXIgdGhhbiBtb3ZlZCwgc28gaXQgZG9lcyBub3QgY291bnQuXG4gIHByaXZhdGUgX3RleHRUYWJsZUZpdChjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IG51bWJlciB7XG4gICAgY29uc3Qgc2NyYXRjaCA9IHRoaXMuX3NjcmF0Y2hEb2N1bWVudChjb250ZXh0KTtcbiAgICBsZXQgZml0ID0gMDtcblxuICAgIGNvbnRleHQuYXV0b1RhYmxlKHNjcmF0Y2gsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBkaWREcmF3Q2VsbDogKGhvb2s6IGFueSkgPT4ge1xuICAgICAgICBpZiAoc2NyYXRjaC5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyID09PSAxICYmICFob29rLnJvdy5zcGFuc011bHRpcGxlUGFnZXMpIHtcbiAgICAgICAgICBmaXQgPSBNYXRoLm1heChmaXQsIGhvb2sucm93LmluZGV4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZml0O1xuICB9XG5cbiAgLy8gVGhlIGZpcnN0IGBmaXRgIHJvd3MsIGEgY2VsbCB0aGF0IHNwYW5zIGRvd24gcGFzdCB0aGUgbGFzdCBvZiB0aGVtIGN1dFxuICAvLyB0aGVyZS5cbiAgcHJpdmF0ZSBfa2VwdFJvd3MoYm9keTogUGRmVGV4dENlbGxJbnB1dFtdW10sIGZpdDogbnVtYmVyKTogUGRmVGV4dENlbGxJbnB1dFtdW10ge1xuICAgIHJldHVybiBib2R5LnNsaWNlKDAsIGZpdCkubWFwKChyb3cpID0+IHJvdy5tYXAoKGlucHV0KSA9PiB7XG4gICAgICBjb25zdCByb3dTcGFuID0gTWF0aC5taW4oaW5wdXQucm93U3BhbiwgZml0IC0gaW5wdXQudGV4dENlbGwucm93KTtcblxuICAgICAgcmV0dXJuIHJvd1NwYW4gPT09IGlucHV0LnJvd1NwYW4gPyBpbnB1dCA6IHsgLi4uaW5wdXQsIHJvd1NwYW4gfTtcbiAgICB9KSk7XG4gIH1cblxuICAvLyBBIHRleHQgdGFibGUgY2VsbCdzIHdvcmRzLCBkcmF3biBvbmNlIGF1dG9UYWJsZSBoYXMgZHJhd24gdGhlIGNlbGw6IGluc2lkZVxuICAvLyBpdHMgcGFkZGluZywgd3JhcHBlZCB0byBpdHMgd2lkdGggYW5kIHBsYWNlZCBieSBpdHMgdmVydGljYWwgYWxpZ25tZW50LCB0aGVcbiAgLy8gbWlkZGxlIHVubGVzcyBzZXQuIExpbmVzIHBhc3QgdGhlIGNlbGwgYXJlIGxlZnQgb2ZmLlxuICBwcml2YXRlIF9kcmF3VGV4dENlbGwoaG9vazogYW55KTogdm9pZCB7XG4gICAgY29uc3QgY2VsbDogVGV4dFRhYmxlQ2VsbCB8IHVuZGVmaW5lZCA9IGhvb2suY2VsbC5yYXc/LnRleHRDZWxsO1xuICAgIGlmICghY2VsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gaG9vay5jZWxsO1xuICAgIGNvbnN0IGJveDogUGRmVGV4dEJveCA9IHtcbiAgICAgIGxlZnQ6IHggKyBob29rLmNlbGwucGFkZGluZygnbGVmdCcpLFxuICAgICAgdG9wOiB5ICsgaG9vay5jZWxsLnBhZGRpbmcoJ3RvcCcpLFxuICAgICAgd2lkdGg6IHdpZHRoIC0gaG9vay5jZWxsLnBhZGRpbmcoJ2hvcml6b250YWwnKSxcbiAgICAgIGJvdHRvbTogeSArIGhlaWdodCAtIGhvb2suY2VsbC5wYWRkaW5nKCdib3R0b20nKSxcbiAgICB9O1xuICAgIGNvbnN0IHNwYXJlID0gTWF0aC5tYXgoMCwgYm94LmJvdHRvbSAtIGJveC50b3AgLSB0aGlzLl9wYXJhZ3JhcGhzSGVpZ2h0KGhvb2suZG9jLCBjZWxsLnBhcmFncmFwaHMsIGJveC53aWR0aCkpO1xuICAgIGNvbnN0IG9mZnNldCA9IGNlbGwudmFsaWduID09PSAndG9wJyA/IDAgOiAoY2VsbC52YWxpZ24gPT09ICdib3R0b20nID8gc3BhcmUgOiBzcGFyZSAvIDIpO1xuXG4gICAgdGhpcy5fZHJhd1BhcmFncmFwaHMoaG9vay5kb2MsIGNlbGwucGFyYWdyYXBocywgYm94LCBib3gudG9wICsgb2Zmc2V0KTtcbiAgfVxuXG4gIC8vIEJyZWFrIGEgcGFyYWdyYXBoJ3MgcnVucyBpbnRvIGxpbmVzIG9mIG1lYXN1cmVkIHdvcmRzIHRoYXQgZml0IHRoZSB3aWR0aC5cbiAgLy8gQSB3b3JkIGtlZXBzIGl0cyB0cmFpbGluZyBzcGFjZSBzbyBzcGFjaW5nIHN1cnZpdmVzIHJ1biBib3VuZGFyaWVzLiBBXG4gIC8vIG5vLWJyZWFrIHNwYWNlIGlzIHBhcnQgb2YgaXRzIHdvcmQsIG5ldmVyIGEgYnJlYWsgYmV0d2VlbiB0d286IGEgbnVtYmVyXG4gIC8vIGdyb3VwZWQgd2l0aCBvbmUgKGZyLUNBJ3MgdGhvdXNhbmRzLCBvciBhIG5hcnJvdyBzcGFjZSBfcGRmVGV4dCB0dXJuZWRcbiAgLy8gaW50byBvbmUpIHN0YXlzIG9uIG9uZSBsaW5lLlxuICBwcml2YXRlIF93cmFwKGRvYzogYW55LCBwYXJhZ3JhcGg6IFRleHRQYXJhZ3JhcGgsIHdpZHRoOiBudW1iZXIpOiBQZGZXb3JkW11bXSB7XG4gICAgY29uc3QgbGluZXM6IFBkZldvcmRbXVtdID0gW107XG4gICAgbGV0IGxpbmU6IFBkZldvcmRbXSA9IFtdO1xuICAgIGxldCBsaW5lV2lkdGggPSAwO1xuXG4gICAgZm9yIChjb25zdCBydW4gb2YgcGFyYWdyYXBoLnJ1bnMpIHtcbiAgICAgIGNvbnN0IHNpemUgPSBydW4uZm9udFNpemUgPz8gREVGQVVMVF9URVhUX1NJWkU7XG4gICAgICB0aGlzLl9mb250KGRvYywgcnVuLCBzaXplKTtcblxuICAgICAgZm9yIChjb25zdCB0ZXh0IG9mIHJ1bi50ZXh0Lm1hdGNoKC8oPzpbXlxcc118XFx1MDBhMCkrW15cXFNcXHUwMGEwXSp8W15cXFNcXHUwMGEwXSsvZykgPz8gW10pIHtcbiAgICAgICAgY29uc3Qgd29yZFdpZHRoID0gZG9jLmdldFRleHRXaWR0aCh0ZXh0KTtcblxuICAgICAgICBpZiAobGluZS5sZW5ndGggJiYgbGluZVdpZHRoICsgd29yZFdpZHRoIC0gdGhpcy5fdHJhaWxpbmdTcGFjZShkb2MsIHRleHQpID4gd2lkdGgpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICBsaW5lV2lkdGggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgbGluZS5wdXNoKHsgcnVuLCB0ZXh0LCBzaXplLCB3aWR0aDogd29yZFdpZHRoIH0pO1xuICAgICAgICBsaW5lV2lkdGggKz0gd29yZFdpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lLmxlbmd0aCkge1xuICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXM7XG4gIH1cblxuICBwcml2YXRlIF9kcmF3V29yZChkb2M6IGFueSwgd29yZDogUGRmV29yZCwgeDogbnVtYmVyLCBiYXNlbGluZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcnVuID0gd29yZC5ydW47XG5cbiAgICBpZiAocnVuLmhpZ2hsaWdodCkge1xuICAgICAgZG9jLnNldEZpbGxDb2xvcihydW4uaGlnaGxpZ2h0KTtcbiAgICAgIGRvYy5yZWN0KHgsIGJhc2VsaW5lIC0gd29yZC5zaXplICogMC45LCB3b3JkLndpZHRoLCB3b3JkLnNpemUgKiAxLjE1LCAnRicpO1xuICAgIH1cblxuICAgIHRoaXMuX2ZvbnQoZG9jLCBydW4sIHdvcmQuc2l6ZSk7XG4gICAgZG9jLnRleHQod29yZC50ZXh0LCB4LCBiYXNlbGluZSk7XG5cbiAgICBjb25zdCBjb2xvciA9IHJ1bi5jb2xvciA/PyBERUZBVUxUX1RFWFRfQ09MT1I7XG4gICAgY29uc3QgaW5rV2lkdGggPSB3b3JkLndpZHRoIC0gdGhpcy5fdHJhaWxpbmdTcGFjZShkb2MsIHdvcmQudGV4dCk7XG4gICAgaWYgKHJ1bi51bmRlcmxpbmUpIHtcbiAgICAgIGRvYy5zZXREcmF3Q29sb3IoY29sb3IpO1xuICAgICAgZG9jLnNldExpbmVXaWR0aCh3b3JkLnNpemUgLyAxNik7XG4gICAgICBkb2MubGluZSh4LCBiYXNlbGluZSArIHdvcmQuc2l6ZSAqIDAuMTIsIHggKyBpbmtXaWR0aCwgYmFzZWxpbmUgKyB3b3JkLnNpemUgKiAwLjEyKTtcbiAgICB9XG4gICAgaWYgKHJ1bi5zdHJpa2UpIHtcbiAgICAgIGRvYy5zZXREcmF3Q29sb3IoY29sb3IpO1xuICAgICAgZG9jLnNldExpbmVXaWR0aCh3b3JkLnNpemUgLyAxNik7XG4gICAgICBkb2MubGluZSh4LCBiYXNlbGluZSAtIHdvcmQuc2l6ZSAqIDAuMywgeCArIGlua1dpZHRoLCBiYXNlbGluZSAtIHdvcmQuc2l6ZSAqIDAuMyk7XG4gICAgfVxuXG4gICAgaWYgKHJ1bi5saW5rKSB7XG4gICAgICBkb2MubGluayh4LCBiYXNlbGluZSAtIHdvcmQuc2l6ZSwgaW5rV2lkdGgsIHdvcmQuc2l6ZSAqIDEuMiwgeyB1cmw6IHJ1bi5saW5rIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGpzUERGJ3Mgc3RhbmRhcmQgZm9udHMgYXJlIEhlbHZldGljYSwgVGltZXMgYW5kIENvdXJpZXI7IGEgYmxvY2sncyBmYWNlIGlzXG4gIC8vIG1hcHBlZCBvbnRvIHdoaWNoZXZlciBvZiB0aGUgdGhyZWUgaXQgcmVzZW1ibGVzLlxuICBwcml2YXRlIF9mb250KGRvYzogYW55LCBydW46IFRleHRSdW4sIHNpemU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZhY2UgPSAocnVuLmZvbnRGYWNlID8/ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGZhbWlseSA9IC9jb3VyaWVyfG1vbm8vLnRlc3QoZmFjZSlcbiAgICAgID8gJ2NvdXJpZXInXG4gICAgICA6ICgvdGltZXN8Z2VvcmdpYXxzZXJpZi8udGVzdChmYWNlKSAmJiAhZmFjZS5pbmNsdWRlcygnc2FucycpID8gJ3RpbWVzJyA6ICdoZWx2ZXRpY2EnKTtcbiAgICBjb25zdCBzdHlsZSA9IHJ1bi5ib2xkICYmIHJ1bi5pdGFsaWNcbiAgICAgID8gJ2JvbGRpdGFsaWMnXG4gICAgICA6IChydW4uYm9sZCA/ICdib2xkJyA6IChydW4uaXRhbGljID8gJ2l0YWxpYycgOiAnbm9ybWFsJykpO1xuXG4gICAgZG9jLnNldEZvbnQoZmFtaWx5LCBzdHlsZSk7XG4gICAgZG9jLnNldEZvbnRTaXplKHNpemUpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IocnVuLmNvbG9yID8/IERFRkFVTFRfVEVYVF9DT0xPUik7XG4gIH1cblxuICBwcml2YXRlIF90cmFpbGluZ1NwYWNlKGRvYzogYW55LCB0ZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IHRyYWlsaW5nID0gdGV4dC5sZW5ndGggLSB0ZXh0LnRyaW1FbmQoKS5sZW5ndGg7XG5cbiAgICByZXR1cm4gdHJhaWxpbmcgPyBkb2MuZ2V0VGV4dFdpZHRoKCcgJykgKiB0cmFpbGluZyA6IDA7XG4gIH1cblxuICBwcml2YXRlIF9hbGlnbk9mZnNldChhbGlnbjogVGV4dFBhcmFncmFwaFsnYWxpZ24nXSwgd2lkdGg6IG51bWJlciwgbGluZVdpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHN3aXRjaCAoYWxpZ24pIHtcbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCAod2lkdGggLSBsaW5lV2lkdGgpIC8gMik7XG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCB3aWR0aCAtIGxpbmVXaWR0aCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICAvLyBXaGF0IHRoZSB0b2tlbnMgb2YgYSB0ZXh0IGJsb2NrIGFuZCBvZiBhIHRpbGUncyB0aXRsZSBmaWxsIHdpdGggb24gdGhpc1xuICAvLyBwYWdlLiBUaGUgbnVtYmVyIGlzIHRoZSBwaHlzaWNhbCBwYWdlIGFtb25nIHRoZSByZXBvcnQncyBwYWdlcyxcbiAgLy8gY29udGludWF0aW9uIHBhZ2VzIGluY2x1ZGVkIOKAlCB0aGUgdGl0bGUgcGFnZSBpcyBub3QgYSByZXBvcnQgcGFnZS4gVGhlXG4gIC8vIG5hbWUgc3RheXMgdGhlIHJlcG9ydCBwYWdlJ3MsIHNvIGEgY29udGludWF0aW9uIHBhZ2UgaXMgbmFtZWQgZm9yIHRoZVxuICAvLyBwYWdlIGl0cyB0YWJsZSBzdGFydGVkIG9uLiBUaGUgZmlsdGVycyBhcmUgdGhlIHJlcG9ydCdzIGFuZCB0aGUgcGFnZSdzXG4gIC8vIG93biBwYWdlIGZpbHRlcnMgKGxheWVyRmlsdGVyRmllbGRzKS5cbiAgcHJpdmF0ZSBfdG9rZW5zKGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsIHBhZ2U6IFJlcG9ydFBhZ2UsIGluZGV4OiBudW1iZXIsIHBhZ2VOdW1iZXI6IG51bWJlcik6IFRleHRUb2tlbkNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlTnVtYmVyLFxuICAgICAgcGFnZU5hbWU6IHBhZ2UubmFtZSB8fCBgUGFnZSAke2luZGV4ICsgMX1gLFxuICAgICAgcmVwb3J0TmFtZTogY29udGV4dC5yZXBvcnQubmFtZSxcbiAgICAgIGZpbHRlcnM6IGxheWVyRmlsdGVyRmllbGRzKGNvbnRleHQuZmlsdGVyRmllbGRzLCBjb250ZXh0LnJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10sIHBhZ2UuaWQpLFxuICAgIH07XG4gIH1cblxuICAvLyBBIHRpbGUgb24gaXRzIHJlcG9ydCBwYWdlLCBpdHMgdGl0bGUncyB0b2tlbnMgZmlsbGVkIHdpdGggdGhhdCBwYWdlJ3MuXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlckNvbXBvbmVudChcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCxcbiAgICB0b2tlbnM6IFRleHRUb2tlbkNvbnRleHQsXG4gICAgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGl0ZW0uY29tcG9uZW50O1xuICAgIC8vIEdlb21ldHJ5IGlzIHN0b3JlZCBpbiBpbmNoZXM7IHRoZSBQREYgZHJhd3MgaW4gcG9pbnRzLlxuICAgIGNvbnN0IHggPSBjb21wb25lbnQueCAqIFBUO1xuICAgIGNvbnN0IHkgPSBjb21wb25lbnQueSAqIFBUO1xuICAgIGNvbnN0IHcgPSBjb21wb25lbnQudyAqIFBUO1xuICAgIGNvbnN0IGggPSBjb21wb25lbnQuaCAqIFBUO1xuXG4gICAgY29uc3QgdGl0bGUgPSBleHBvcnRUaXRsZShjb21wb25lbnQsIHRva2VucywgaXRlbS5zZWFyY2gsIGl0ZW0uY3J1bWJzKTtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIHRoaXMuX2NvbXBvbmVudFRpdGxlKGRvYywgdGl0bGUsIHgsIHksIHcpO1xuICAgIH1cblxuICAgIC8vIEEgY2hhcnQgb3IgbGlzdCB0aGF0IGNvbXBhcmVzIG9yIGhhcyBhIHRpbWVmcmFtZSBuYW1lcyBpdHMgZGF5cyB1bmRlclxuICAgIC8vIHRoZSB0aXRsZSwgYW5kIGl0cyBub3RlcyBzaXQgYXQgdGhlIGZvb3Qgb2YgaXRzIGJveDsgYSBLUEkgY2FyZCBkcmF3c1xuICAgIC8vIGJvdGggaXRzZWxmLiBOZWl0aGVyIHRha2VzIHJvb20gZnJvbSBhIGNvbXBvbmVudCB3aXRob3V0IHRob3NlIGtleXMuXG4gICAgY29uc3QgbG9jYWxlID0gY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZTtcbiAgICBjb25zdCBzdWJ0aXRsZSA9IHRoaXMuX3BkZlRleHQoZXhwb3J0V2luZG93c0xpbmUoaXRlbSwgY29udGV4dC50aW1lem9uZSwgbG9jYWxlKSk7XG4gICAgY29uc3Qgbm90ZXMgPSBjb21wb25lbnQudHlwZSA9PT0gJ2twaScgPyBbXSA6IGV4cG9ydE5vdGVMaW5lcyhpdGVtLCBjb250ZXh0LnRpbWV6b25lLCBsb2NhbGUpO1xuICAgIGNvbnN0IHRvcCA9IHkgKyBUSVRMRV9IICsgKHN1YnRpdGxlID8gU1VCVElUTEVfSCA6IDApO1xuICAgIGNvbnN0IHJvb20gPSBNYXRoLm1heCgyMCwgeSArIGggLSB0b3ApO1xuICAgIGNvbnN0IGtlcHQgPSBub3Rlcy5zbGljZSgwLCBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChyb29tIC0gTUlOX0JPRFlfSCkgLyBOT1RFX0xJTkVfSCkpKTtcblxuICAgIGlmIChzdWJ0aXRsZSkge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgc3VidGl0bGUsIHgsIHkgKyBUSVRMRV9ILCB3LCAnbGVmdCcsICdub3JtYWwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5WSA9IHRvcDtcbiAgICBjb25zdCBib2R5SCA9IE1hdGgubWF4KDIwLCByb29tIC0ga2VwdC5sZW5ndGggKiBOT1RFX0xJTkVfSCk7XG5cbiAgICBrZXB0LmZvckVhY2goKGxpbmUsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KGxpbmUpLCB4LCBib2R5WSArIGJvZHlIICsgaW5kZXggKiBOT1RFX0xJTkVfSCwgdywgJ2xlZnQnLCAnaXRhbGljJyk7XG4gICAgfSk7XG5cbiAgICBpZiAoIWl0ZW0uZGF0YSB8fCAhaXRlbS5kYXRhLnJvd3M/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5fYm94Tm90ZShkb2MsIGVtcHR5TGFiZWwoaXRlbSksIHgsIGJvZHlZLCB3LCBib2R5SCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbXBvbmVudC50eXBlKSB7XG4gICAgICBjYXNlICdjaGFydCc6IHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCByZW5kZXJDaGFydEltYWdlKGNvbXBvbmVudCwgaXRlbS5kYXRhLCB3LCBib2R5SCwgY29udGV4dC5mb3JtYXRDb250ZXh0KTtcbiAgICAgICAgZG9jLmFkZEltYWdlKGltYWdlLCAnUE5HJywgeCwgYm9keVksIHcsIGJvZHlIKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdsaXN0JzpcbiAgICAgICAgdGhpcy5fcmVuZGVyVGFibGUoY29udGV4dCwgaXRlbSwgeCwgYm9keVksIHcsIGJvZHlILCBvdmVyZmxvd3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2twaSc6XG4gICAgICAgIHRoaXMuX3JlbmRlcktwaShjb250ZXh0LCBpdGVtLCB4LCBib2R5WSwgdywgYm9keUgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBPbmUgbGluZSBvZiBzbWFsbCBncmV5IHByaW50LCBjdXQgdG8gdGhlIHdpZHRoIHdpdGggYW4gZWxsaXBzaXM6IGFcbiAgLy8gc3VidGl0bGUsIGEgbm90ZSBvciBhIGxpbmUgb2YgYSBLUEkgY2FyZC4geSBpcyB0aGUgbGluZSdzIHRvcDsgdGhlIGxpbmUgaXNcbiAgLy8gTk9URV9MSU5FX0ggdGFsbCwgdGltZXMgdGhlIHNjYWxlIGEgc2hvcnQgS1BJIHRpbGUgc2hyaW5rcyBpdHMgbGluZXMgYnkuXG4gIHByaXZhdGUgX3NtYWxsTGluZShcbiAgICBkb2M6IGFueSxcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlcixcbiAgICBhbGlnbjogJ2xlZnQnIHwgJ2NlbnRlcicsXG4gICAgc3R5bGU6ICdub3JtYWwnIHwgJ2l0YWxpYycsXG4gICAgc2NhbGUgPSAxLFxuICApOiB2b2lkIHtcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgc3R5bGUpO1xuICAgIGRvYy5zZXRGb250U2l6ZShTTUFMTF9TSVpFICogc2NhbGUpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoTVVURURfQ09MT1IpO1xuICAgIGRvYy50ZXh0KHRoaXMuX2ZpdChkb2MsIHRleHQsIHcpLCBhbGlnbiA9PT0gJ2NlbnRlcicgPyB4ICsgdyAvIDIgOiB4LCB5ICsgU01BTExfU0laRSAqIHNjYWxlLCB7IGFsaWduIH0pO1xuICB9XG5cbiAgLy8gVGhlIHRleHQsIGVsbGlwc2l6ZWQgdG8gdGhlIHdpZHRoIGluIHRoZSBkb2MncyBjdXJyZW50IGZvbnQuXG4gIHByaXZhdGUgX2ZpdChkb2M6IGFueSwgdGV4dDogc3RyaW5nLCB3aWR0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoZG9jLmdldFRleHRXaWR0aCh0ZXh0KSA8PSB3aWR0aCkge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgbGV0IGN1dCA9IHRleHQ7XG4gICAgd2hpbGUgKGN1dC5sZW5ndGggPiAxICYmIGRvYy5nZXRUZXh0V2lkdGgoYCR7Y3V0feKApmApID4gd2lkdGgpIHtcbiAgICAgIGN1dCA9IGN1dC5zbGljZSgwLCAtMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke2N1dC50cmltRW5kKCl94oCmYDtcbiAgfVxuXG4gIC8vIFRoZSBib2xkIHN0cmlwIG92ZXIgYSBjb21wb25lbnQsIGFuZCBvdmVyIGVhY2ggb2YgaXRzIGNvbnRpbnVhdGlvbiBwYWdlcy5cbiAgLy8gQSBkcmlsbGVkIHRpdGxlJ3MgY3J1bWJzIGFyZSB3cml0dGVuIGluIHRoZSByZXBvcnQncyBsb2NhbGUsIHNvIHRoZSB0aXRsZVxuICAvLyBnb2VzIHRocm91Z2ggX3BkZlRleHQgbGlrZSBhbnkgZm9ybWF0dGVkIHRleHQgKHRoZSDigLogYmV0d2VlbiBjcnVtYnMgaXNcbiAgLy8gV2luQW5zaSBhbmQgc3RheXMpLlxuICBwcml2YXRlIF9jb21wb25lbnRUaXRsZShkb2M6IGFueSwgdGl0bGU6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlcik6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSg5KTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgZG9jLnRleHQodGhpcy5fcGRmVGV4dCh0aXRsZSksIHgsIHkgKyAxMCwgeyBtYXhXaWR0aDogdyB9KTtcbiAgfVxuXG4gIC8vIEFuIGl0YWxpYyBncmV5IGxpbmUgY2VudGVyZWQgaW4gYSBjb21wb25lbnQncyBib2R5LCBmb3IgYSBib2R5IHRoYXQgaG9sZHNcbiAgLy8gc29tZXRoaW5nIG90aGVyIHRoYW4gaXRzIGNvbnRlbnQuXG4gIHByaXZhdGUgX2JveE5vdGUoZG9jOiBhbnksIHRleHQ6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdpdGFsaWMnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgZG9jLnRleHQodGV4dCwgeCArIHcgLyAyLCB5ICsgaCAvIDIsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICB9XG5cbiAgLy8gQSBsaXN0J3Mgb24tcGFnZSB0YWJsZS4gQWxsIG9mIGl0cyBmZXRjaGVkIHJvd3MgYXJlIGxhaWQgb3V0IG9uY2UgdG8gbGVhcm5cbiAgLy8gaG93IG1hbnkgdGhlIGJveCBob2xkczsgd2hlbiB0aGV5IGRvIG5vdCBhbGwgZml0LCB0aGUgYm94J3MgbGFzdCByb3cgc2F5c1xuICAvLyB0aGUgdGFibGUgY29udGludWVzIGFuZCB0aGUgcmVzdCBnbyB0byBvdmVyZmxvd3MgZm9yIGNvbnRpbnVhdGlvbiBwYWdlcy5cbiAgLy8gQSBib3ggdG9vIHNob3J0IGZvciBldmVuIHRoZSBoZWFkIGNhcnJpZXMgdGhlIG5vdGljZSBhcyBhIGxpbmUgaW5zdGVhZC5cbiAgLy8gQSB0b3RhbHMgcm93IGNsb3NlcyB0aGUgdGFibGUgb25jZTogaW4gdGhlIGJveCB3aGVuIGV2ZXJ5IHJvdyBmaXRzIGl0LFxuICAvLyBlbHNlIGFmdGVyIHRoZSBsYXN0IGNvbnRpbnVhdGlvbiByb3cuIFBvaW50cyB0aHJvdWdob3V0LlxuICBwcml2YXRlIF9yZW5kZXJUYWJsZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIsXG4gICAgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29tcG9uZW50LCBzZWFyY2gsIGhpZGRlbkNvbHVtbnMgfSA9IGl0ZW07XG4gICAgY29uc3QgZGF0YSA9IGl0ZW0uZGF0YSBhcyBDb21wb25lbnREYXRhO1xuICAgIGNvbnN0IGhlYWQgPSBsaXN0SGVhZGluZ3MoY29tcG9uZW50LCBkYXRhLCBjb250ZXh0LmZvcm1hdENvbnRleHQubG9jYWxlLCBoaWRkZW5Db2x1bW5zKVxuICAgICAgLm1hcCgoaGVhZGluZykgPT4gdGhpcy5fcGRmVGV4dChoZWFkaW5nKSk7XG4gICAgY29uc3QgeyBjZWxscywgbnVtZXJpYywgZm9vdCB9ID0gdGhpcy5fdGFibGVDZWxscyhjb250ZXh0LCBjb21wb25lbnQsIGRhdGEsIGhpZGRlbkNvbHVtbnMpO1xuICAgIGNvbnN0IG9taXR0ZWQgPSBNYXRoLm1heCgwLCAoZGF0YS5wYWdpbmc/LnRvdGFsID8/IGNlbGxzLmxlbmd0aCkgLSBjZWxscy5sZW5ndGgpO1xuICAgIGNvbnN0IGJvdHRvbSA9IGNvbnRleHQucGFnZUggLSAoeSArIGgpO1xuICAgIGNvbnN0IHsgZml0LCBjb2x1bW5TdHlsZXMgfSA9IHRoaXMuX21lYXN1cmUoY29udGV4dCwgaGVhZCwgY2VsbHMsIG51bWVyaWMsIGZvb3QsIHgsIHksIHcsIGJvdHRvbSk7XG5cbiAgICBpZiAoZml0ID09PSBjZWxscy5sZW5ndGggJiYgb21pdHRlZCA9PT0gMCkge1xuICAgICAgdGhpcy5fZHJhd1RhYmxlKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB0aGlzLl90YWJsZU9wdGlvbnMoY29udGV4dCwgaGVhZCwgbnVtZXJpYywgY2VsbHMsIHgsIHksIHcsIGJvdHRvbSwgY29sdW1uU3R5bGVzLCBmb290KSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgbm90aWNlIHRha2VzIHRoZSBwbGFjZSBvZiB0aGUgbGFzdCByb3cgdGhhdCBmaXQsIHNvIHRoYXQgcm93IG1vdmVzXG4gICAgLy8gdG8gdGhlIGNvbnRpbnVhdGlvbi4gb21pdHRlZCA+IDAgbWVhbnMgYSBmdWxsIFBERl9MSVNUX1JPV1MgZmV0Y2gsIHdoaWNoXG4gICAgLy8gbmV2ZXIgZml0cyBvbmUgYm94LCBzbyB0aGUgQ1NWIG5vdGljZSBhbHdheXMgbGFuZHMgb24gYSBjb250aW51YXRpb25cbiAgICAvLyBwYWdlLlxuICAgIGNvbnN0IGtlcHQgPSBNYXRoLm1heCgwLCBmaXQgLSAxKTtcbiAgICBvdmVyZmxvd3MucHVzaCh7XG4gICAgICBjb21wb25lbnQsIHNlYXJjaCwgY3J1bWJzOiBpdGVtLmNydW1icywgaGVhZCwgbnVtZXJpYywgcm93czogY2VsbHMuc2xpY2Uoa2VwdCksIG9taXR0ZWQsIGZvb3QsIHgsIHcsIGNvbHVtblN0eWxlcyxcbiAgICB9KTtcblxuICAgIGlmIChmaXQgPj0gMSkge1xuICAgICAgY29uc3QgYm9keSA9IFsuLi5jZWxscy5zbGljZSgwLCBrZXB0KSwgdGhpcy5fbm90aWNlUm93KENPTlRJTlVFRF9OT1RJQ0UsIGhlYWQubGVuZ3RoLCB0cnVlKV07XG4gICAgICB0aGlzLl9kcmF3VGFibGUoY29udGV4dCwgdGhpcy5fdGFibGVPcHRpb25zKGNvbnRleHQsIGhlYWQsIG51bWVyaWMsIGJvZHksIHgsIHksIHcsIGJvdHRvbSwgY29sdW1uU3R5bGVzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2JveE5vdGUoY29udGV4dC5kb2MsIENPTlRJTlVFRF9OT1RJQ0UsIHgsIHksIHcsIGgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVhY2ggZmV0Y2hlZCByb3cgYXMgdGhlIHN0cmluZ3MgaXRzIHRhYmxlIGNlbGxzIHByaW50LCBpbiB0aGUgcmVwb3J0J3NcbiAgLy8gem9uZSwgbG9jYWxlIGFuZCBjdXJyZW5jeSwgd2hpY2ggY29sdW1ucyBob2xkIGZvcm1hdHRlZCBudW1iZXJzLCBhbmQgdGhlXG4gIC8vIHRvdGFscyByb3cgKG51bGwgd2l0aG91dCBvbmUpLiBUaGUgY29sdW1ucyB0aGUgdmlld2VyIGhpZCBhcmUgbGVmdCBvdXQuXG4gIHByaXZhdGUgX3RhYmxlQ2VsbHMoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgICBkYXRhOiBDb21wb25lbnREYXRhLFxuICAgIGhpZGRlbkNvbHVtbnM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICApOiB7IGNlbGxzOiBzdHJpbmdbXVtdOyBudW1lcmljOiBib29sZWFuW107IGZvb3Q6IHN0cmluZ1tdIHwgbnVsbCB9IHtcbiAgICBjb25zdCBjb2x1bW5zID0gbGlzdENvbHVtbnMoY29tcG9uZW50LCBkYXRhLCBjb250ZXh0LmZvcm1hdENvbnRleHQubG9jYWxlLCBoaWRkZW5Db2x1bW5zKTtcbiAgICBjb25zdCBjZWxscyA9IGRhdGEucm93cy5tYXAoKHJvdykgPT4gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gdGhpcy5fcGRmVGV4dChcbiAgICAgIGV4cG9ydENlbGwocm93W2NvbHVtbi5jb2x1bW5dLCBjb2x1bW4sIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQuZm9ybWF0Q29udGV4dCwgcm93KSxcbiAgICApKSk7XG4gICAgY29uc3QgZm9vdCA9IGxpc3RUb3RhbHNSb3coZGF0YSwgY29sdW1ucywgY29udGV4dC50aW1lem9uZSwgY29udGV4dC5mb3JtYXRDb250ZXh0KTtcblxuICAgIHJldHVybiB7XG4gICAgICBjZWxscyxcbiAgICAgIG51bWVyaWM6IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5udW1lcmljKSxcbiAgICAgIGZvb3Q6IGZvb3QgPyBmb290Lm1hcCgoY2VsbCkgPT4gdGhpcy5fcGRmVGV4dChjZWxsKSkgOiBudWxsLFxuICAgIH07XG4gIH1cblxuICAvLyBUaGUgYXV0b1RhYmxlIG9wdGlvbnMgZXZlcnkgbGlzdCB0YWJsZSBzaGFyZXM6IHRoZSBkcnkgcnVuLCB0aGUgb24tcGFnZVxuICAvLyBkcmF3IGFuZCB0aGUgY29udGludWF0aW9uIHBhZ2VzLCBzbyB0aGUgdGhyZWUgbGF5IGEgdGFibGUgb3V0IGFsaWtlLiBUaGVcbiAgLy8gZm9udCBpcyBuYW1lZCByYXRoZXIgdGhhbiBpbmhlcml0ZWQsIHNpbmNlIHRoZSBkb2MgY2FycmllcyB3aGF0ZXZlciB0aGVcbiAgLy8gbGFzdCB0ZXh0IGRyYXduIGxlZnQgc2V0LiBib3R0b20gaXMgdGhlIG1hcmdpbiB1bmRlciB0aGUgdGFibGUsIHBvaW50cy5cbiAgLy9cbiAgLy8gQSBjb2x1bW4gb2YgZm9ybWF0dGVkIG51bWJlcnMgaXMgcmlnaHQtYWxpZ25lZCwgaXRzIGhlYWRpbmcgYW5kIHRvdGFsXG4gIC8vIHRvbzogdGhlIGJvZHkgdGhyb3VnaCBjb2x1bW5TdHlsZXMsIHdoaWNoIGF1dG9UYWJsZSBhcHBsaWVzIHRvIGJvZHkgY2VsbHNcbiAgLy8gb25seSwgYW5kIHRoZSBoZWFkaW5nIGFuZCB0b3RhbCB0aHJvdWdoIHRoZSBkaWRQYXJzZUNlbGwgaG9vaywgb24gZXZlcnlcbiAgLy8gcGFnZSB0aGUgaGVhZGluZyByZXBlYXRzLiBBIHRvdGFscyByb3cgKGZvb3QpIHByaW50cyBvbmNlLCB1bmRlciB0aGVcbiAgLy8gdGFibGUncyBsYXN0IHJvdywgYm9sZCBvbiB0aGUgYm9yZGVyIGdyYXkuXG4gIHByaXZhdGUgX3RhYmxlT3B0aW9ucyhcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGhlYWQ6IHN0cmluZ1tdLFxuICAgIG51bWVyaWM6IGJvb2xlYW5bXSxcbiAgICBib2R5OiBQZGZUYWJsZUNlbGxbXVtdLFxuICAgIHg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIHc6IG51bWJlciwgYm90dG9tOiBudW1iZXIsXG4gICAgY29sdW1uU3R5bGVzPzogUGRmQ29sdW1uU3R5bGVzLFxuICAgIGZvb3Q/OiBzdHJpbmdbXSB8IG51bGwsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGhlbWU6ICdncmlkJyxcbiAgICAgIGhlYWQ6IFtoZWFkXSxcbiAgICAgIGJvZHksXG4gICAgICBzdGFydFksXG4gICAgICBtYXJnaW46IHsgbGVmdDogeCwgcmlnaHQ6IGNvbnRleHQucGFnZVcgLSB4IC0gdywgYm90dG9tIH0sXG4gICAgICB0YWJsZVdpZHRoOiB3LFxuICAgICAgcm93UGFnZUJyZWFrOiAnYXZvaWQnLFxuICAgICAgc3R5bGVzOiB7IGZvbnQ6ICdoZWx2ZXRpY2EnLCBmb250U3R5bGU6ICdub3JtYWwnLCBmb250U2l6ZTogOCwgY2VsbFBhZGRpbmc6IDMsIHRleHRDb2xvcjogJyMxZjI5MzMnIH0sXG4gICAgICBoZWFkU3R5bGVzOiB7IGZpbGxDb2xvcjogJyM0ZTc5YTcnLCB0ZXh0Q29sb3I6ICcjZmZmZmZmJywgZm9udFN0eWxlOiAnYm9sZCcgfSxcbiAgICAgIGFsdGVybmF0ZVJvd1N0eWxlczogeyBmaWxsQ29sb3I6ICcjZjVmN2ZhJyB9LFxuICAgICAgLi4uKGNvbHVtblN0eWxlcyA/IHsgY29sdW1uU3R5bGVzIH0gOiB7fSksXG4gICAgICAuLi4oZm9vdFxuICAgICAgICA/IHtcbiAgICAgICAgICBmb290OiBbZm9vdF0sXG4gICAgICAgICAgc2hvd0Zvb3Q6ICdsYXN0UGFnZScsXG4gICAgICAgICAgZm9vdFN0eWxlczogeyBmaWxsQ29sb3I6ICcjZTRlN2ViJywgdGV4dENvbG9yOiAnIzFmMjkzMycsIGZvbnRTdHlsZTogJ2JvbGQnIH0sXG4gICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICBkaWRQYXJzZUNlbGw6IChob29rOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKChob29rLnNlY3Rpb24gPT09ICdoZWFkJyB8fCBob29rLnNlY3Rpb24gPT09ICdmb290JykgJiYgbnVtZXJpY1tob29rLmNvbHVtbi5pbmRleF0pIHtcbiAgICAgICAgICBob29rLmNlbGwuc3R5bGVzLmhhbGlnbiA9ICdyaWdodCc7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIEEgbm90aWNlIGFzIGEgdGFibGUgcm93OiBvbmUgaXRhbGljIGdyZXkgY2VsbCBzcGFubmluZyBldmVyeSBjb2x1bW4uIEFcbiAgLy8gc2luZ2xlLWxpbmUgbm90aWNlIGlzIGVsbGlwc2l6ZWQgYXQgdGhlIGJveCdzIHdpZHRoIGFuZCBrZWVwcyB0aGUgZGF0YVxuICAvLyBjZWxscycgZm9udCBzaXplIGFuZCBwYWRkaW5nLCBzbyBpdCBpcyBuZXZlciB0YWxsZXIgdGhhbiB0aGUgZGF0YSByb3dcbiAgLy8gd2hvc2UgcGxhY2UgaXQgdGFrZXMuXG4gIHByaXZhdGUgX25vdGljZVJvdyh0ZXh0OiBzdHJpbmcsIHNwYW46IG51bWJlciwgc2luZ2xlTGluZTogYm9vbGVhbik6IFBkZlRhYmxlQ2VsbFtdIHtcbiAgICByZXR1cm4gW3tcbiAgICAgIGNvbnRlbnQ6IHRleHQsXG4gICAgICBjb2xTcGFuOiBzcGFuLFxuICAgICAgLy8gTGVmdC1hbGlnbmVkIHdoYXRldmVyIHRoZSBmaXJzdCBjb2x1bW4gaXM6IGEgc3Bhbm5lZCBjZWxsIG90aGVyd2lzZVxuICAgICAgLy8gdGFrZXMgY29sdW1uU3R5bGVzWzBdLCByaWdodC1hbGlnbmVkIHdoZW4gdGhhdCBjb2x1bW4gaXMgbnVtZXJpYy5cbiAgICAgIHN0eWxlczoge1xuICAgICAgICBmb250U3R5bGU6ICdpdGFsaWMnLFxuICAgICAgICB0ZXh0Q29sb3I6IE1VVEVEX0NPTE9SLFxuICAgICAgICBoYWxpZ246ICdsZWZ0JyxcbiAgICAgICAgLi4uKHNpbmdsZUxpbmUgPyB7IG92ZXJmbG93OiAnZWxsaXBzaXplJyB9IDoge30pLFxuICAgICAgfSxcbiAgICB9XTtcbiAgfVxuXG4gIC8vIExheXMgZXZlcnkgZmV0Y2hlZCByb3cgb3V0IG9uY2Ugb24gYSBzY3JhdGNoIGRvY3VtZW50IG9mIHRoZSBzYW1lIHBhZ2VcbiAgLy8gc2l6ZSwgd2l0aCB0aGUgb3B0aW9ucyB0aGUgcmVhbCBkcmF3IHVzZXMsIGFuZCByZWFkcyBiYWNrIGhvdyBtYW55IGJvZHlcbiAgLy8gcm93cyB0aGUgYm94J3MgcGFnZSBob2xkcyAoZml0KSBhbmQgdGhlIGNvbHVtbiB3aWR0aHMgYXV0b1RhYmxlIGNob3NlLFxuICAvLyB3aXRoIGVhY2ggbnVtZXJpYyBjb2x1bW4ncyByaWdodCBhbGlnbm1lbnQgbWVyZ2VkIGluLCBzbyB0aGUgb24tcGFnZVxuICAvLyB0YWJsZSBhbmQgaXRzIGNvbnRpbnVhdGlvbiBwYWdlcyBjYXJyeSBib3RoLiBUaGUgdG90YWxzIHJvdyBpcyBsYWlkIG91dFxuICAvLyB0b28sIHNvIHRoZSB3aWR0aHMgaG9sZCBpdCwgYW5kIGEgdGFibGUgd2hvc2Ugcm93cyBmaXQgdGhlIGJveCBidXQgd2hvc2VcbiAgLy8gdG90YWxzIHJvdyBkb2VzIG5vdCBtb3ZlcyBpdHMgbGFzdCByb3cgb24uIGZpdCAwIG1lYW5zIG5vdCBldmVuIG9uZVxuICAvLyBib2R5IHJvdyBmaXRzIHVuZGVyIHRoZSBoZWFkIChvciB0aGUgaGVhZCBpdHNlbGYgZGlkIG5vdCBmaXQpOiBhdXRvVGFibGVcbiAgLy8gbW92ZWQgdG8gYSBuZXcgcGFnZSBiZWZvcmUgZHJhd2luZy4gVGhlIHJlYWwgZG9jdW1lbnQgaXMgdW50b3VjaGVkLlxuICBwcml2YXRlIF9tZWFzdXJlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaGVhZDogc3RyaW5nW10sXG4gICAgY2VsbHM6IHN0cmluZ1tdW10sXG4gICAgbnVtZXJpYzogYm9vbGVhbltdLFxuICAgIGZvb3Q6IHN0cmluZ1tdIHwgbnVsbCxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBib3R0b206IG51bWJlcixcbiAgKTogeyBmaXQ6IG51bWJlcjsgY29sdW1uU3R5bGVzOiBQZGZDb2x1bW5TdHlsZXMgfSB7XG4gICAgY29uc3Qgc2NyYXRjaCA9IHRoaXMuX3NjcmF0Y2hEb2N1bWVudChjb250ZXh0KTtcbiAgICBsZXQgZml0ID0gMDtcblxuICAgIGNvbnRleHQuYXV0b1RhYmxlKHNjcmF0Y2gsIHtcbiAgICAgIC4uLnRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBjZWxscywgeCwgeSwgdywgYm90dG9tLCB1bmRlZmluZWQsIGZvb3QpLFxuICAgICAgZGlkRHJhd0NlbGw6IChob29rOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGhvb2suc2VjdGlvbiA9PT0gJ2JvZHknICYmIHNjcmF0Y2guZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlciA9PT0gMSkge1xuICAgICAgICAgIGZpdCA9IE1hdGgubWF4KGZpdCwgaG9vay5yb3cuaW5kZXggKyAxKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbHVtbnM6IHsgd2lkdGg6IG51bWJlciB9W10gPSBzY3JhdGNoLmxhc3RBdXRvVGFibGUuY29sdW1ucztcbiAgICBjb25zdCBjb2x1bW5TdHlsZXM6IFBkZkNvbHVtblN0eWxlcyA9IHt9O1xuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgICAgY29sdW1uU3R5bGVzW2luZGV4XSA9IG51bWVyaWNbaW5kZXhdXG4gICAgICAgID8geyBjZWxsV2lkdGg6IGNvbHVtbi53aWR0aCwgaGFsaWduOiAncmlnaHQnIH1cbiAgICAgICAgOiB7IGNlbGxXaWR0aDogY29sdW1uLndpZHRoIH07XG4gICAgfSk7XG5cbiAgICAvLyBBIHJvdyB0YWxsZXIgdGhhbiBhIHdob2xlIHBhZ2UgaXMgc3BsaXQgcmF0aGVyIHRoYW4gbW92ZWQsIHNvIGEgbGFzdFxuICAgIC8vIHJvdyB0aGF0IHN0YXJ0ZWQgb24gdGhlIGZpcnN0IHBhZ2UgY2FuIHN0aWxsIGhhdmUgcnVuIHBhc3QgaXQuXG4gICAgaWYgKGZpdCA9PT0gY2VsbHMubGVuZ3RoICYmIHNjcmF0Y2guZ2V0TnVtYmVyT2ZQYWdlcygpID4gMSkge1xuICAgICAgZml0IC09IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZml0LCBjb2x1bW5TdHlsZXMgfTtcbiAgfVxuXG4gIC8vIEEgYmxhbmsgZG9jdW1lbnQgb2YgdGhlIGV4cG9ydCdzIHBhZ2Ugc2l6ZSwgZm9yIGxheWluZyBhIHRhYmxlIG91dCB0byBzZWVcbiAgLy8gd2hhdCBmaXRzIGJlZm9yZSB0aGUgcmVhbCBvbmUgaXMgZHJhd24gb24uXG4gIHByaXZhdGUgX3NjcmF0Y2hEb2N1bWVudChjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0KTogYW55IHtcbiAgICByZXR1cm4gbmV3IGNvbnRleHQuanNQREYoe1xuICAgICAgdW5pdDogJ3B0JyxcbiAgICAgIGZvcm1hdDogW2NvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUhdLFxuICAgICAgb3JpZW50YXRpb246IGNvbnRleHQub3JpZW50YXRpb24sXG4gICAgfSk7XG4gIH1cblxuICAvLyBEcmF3cyBhbiBvbi1wYWdlIHRhYmxlIChhIGxpc3Qncywgb3IgYSB0ZXh0IGJsb2NrJ3MpLCB0aGVuIHJlbW92ZXMgYW55XG4gIC8vIHBhZ2UgdGhlIGRyYXcgYWRkZWQuIFRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbjogdGhlIG1lYXN1cmVkIGZpdCwgdGhlXG4gIC8vIGlkZW50aWNhbCBjb2x1bW4gd2lkdGhzIGFuZCBhIHNpbmdsZS1saW5lIG5vdGljZSBrZWVwIHRoZSB0YWJsZSBpbnNpZGUgaXRzXG4gIC8vIGJveC4gVGhlIGNoZWNrIGV4aXN0cyBzbyBhIHN0cmF5IHBhZ2UgY2FuIG5ldmVyIGNhdGNoIHRoZSByZXBvcnQgcGFnZSdzXG4gIC8vIHJlbWFpbmluZyBjb21wb25lbnRzLlxuICBwcml2YXRlIF9kcmF3VGFibGUoY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCwgb3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBjb25zdCB7IGRvYyB9ID0gY29udGV4dDtcbiAgICBjb25zdCBwYWdlID0gZG9jLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXI7XG4gICAgY29uc3QgcGFnZXMgPSBkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpO1xuXG4gICAgY29udGV4dC5hdXRvVGFibGUoZG9jLCBvcHRpb25zKTtcblxuICAgIHdoaWxlIChkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpID4gcGFnZXMpIHtcbiAgICAgIGRvYy5kZWxldGVQYWdlKGRvYy5nZXROdW1iZXJPZlBhZ2VzKCkpO1xuICAgIH1cblxuICAgIGRvYy5zZXRQYWdlKHBhZ2UpO1xuICB9XG5cbiAgLy8gVGhlIHJvd3Mgb2Ygb25lIGxpc3QgdGhhdCBkaWQgbm90IGZpdCBpdHMgYm94LCBvbiBwYWdlcyBhcHBlbmRlZCBhZnRlclxuICAvLyB0aGUgcmVwb3J0IHBhZ2UsIGVhY2ggd2l0aCB0aGUgcGFnZSdzIGhlYWRlciBhbmQgZm9vdGVyLCB0aGUgdGFibGUnc1xuICAvLyB0aXRsZSBhbmQgaXRzIGhlYWQgYWdhaW4sIHRoZSB0aXRsZSdzIHRva2VucyBmaWxsZWQgd2l0aCB0aGUgcGh5c2ljYWxcbiAgLy8gcGFnZSBpdCBpcyBkcmF3biBvbi4gVGhlIHRhYmxlIHNpdHMgQ09OVElOVUFUSU9OX0dBUCBpbnNpZGUgdGhlIGJhbmRzLlxuICAvLyBSZXR1cm5zIHRoZSBwaHlzaWNhbCBwYWdlIGNvdW50ZXIgYWZ0ZXIgdGhlc2UgcGFnZXMuXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlckNvbnRpbnVhdGlvbihcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIHBhZ2U6IFJlcG9ydFBhZ2UsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXG4gICAgb3ZlcmZsb3c6IFBkZlRhYmxlT3ZlcmZsb3csXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBkb2MgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgYmFuZHMgPSBwYWdlLm1hc3RlckhpZGRlbiA/IE5PX0JBTkRTIDogY29udGV4dC5yZXBvcnQuY29uZmlnPy5oZWFkZXJGb290ZXIgPz8gTk9fQkFORFM7XG4gICAgY29uc3QgdG9wID0gdGhpcy5fY29udGludWF0aW9uTWFyZ2luKGJhbmRzLmhlYWRlckhlaWdodCk7XG4gICAgY29uc3QgYm90dG9tID0gdGhpcy5fY29udGludWF0aW9uTWFyZ2luKGJhbmRzLmZvb3RlckhlaWdodCk7XG4gICAgY29uc3QgeyB4LCB3IH0gPSBvdmVyZmxvdztcbiAgICBjb25zdCBib2R5OiBQZGZUYWJsZUNlbGxbXVtdID0gb3ZlcmZsb3cub21pdHRlZCA+IDBcbiAgICAgID8gWy4uLm92ZXJmbG93LnJvd3MsIHRoaXMuX25vdGljZVJvdyhtb3JlUm93c05vdGljZShvdmVyZmxvdy5vbWl0dGVkKSwgb3ZlcmZsb3cuaGVhZC5sZW5ndGgsIGZhbHNlKV1cbiAgICAgIDogb3ZlcmZsb3cucm93cztcbiAgICAvLyBUaGUgZG9jdW1lbnQncyBwYWdlcyB0aGUgdGFibGUgZHJhd3Mgb24sIGluIG9yZGVyLlxuICAgIGNvbnN0IHBhZ2VzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgZG9jLmFkZFBhZ2UoW2NvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUhdLCBjb250ZXh0Lm9yaWVudGF0aW9uKTtcbiAgICBjb250ZXh0LmF1dG9UYWJsZShkb2MsIHtcbiAgICAgIC4uLnRoaXMuX3RhYmxlT3B0aW9ucyhcbiAgICAgICAgY29udGV4dCwgb3ZlcmZsb3cuaGVhZCwgb3ZlcmZsb3cubnVtZXJpYywgYm9keSwgeCwgdG9wICsgVElUTEVfSCwgdywgYm90dG9tLCBvdmVyZmxvdy5jb2x1bW5TdHlsZXMsXG4gICAgICAgIG92ZXJmbG93LmZvb3QsXG4gICAgICApLFxuICAgICAgbWFyZ2luOiB7IHRvcDogdG9wICsgVElUTEVfSCwgYm90dG9tLCBsZWZ0OiB4LCByaWdodDogY29udGV4dC5wYWdlVyAtIHggLSB3IH0sXG4gICAgICBzaG93SGVhZDogJ2V2ZXJ5UGFnZScsXG4gICAgICAvLyBGaXJlcyBvbiBldmVyeSBwYWdlIHRoZSB0YWJsZSBkcmF3cyBvbiwgdGhlIGZpcnN0IGluY2x1ZGVkLlxuICAgICAgd2lsbERyYXdQYWdlOiAoKSA9PiB7XG4gICAgICAgIHBhZ2VzLnB1c2goZG9jLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXIpO1xuICAgICAgICBjb25zdCB0b2tlbnMgPSB0aGlzLl90b2tlbnMoY29udGV4dCwgcGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIgKyBwYWdlcy5sZW5ndGgpO1xuICAgICAgICB0aGlzLl9jb21wb25lbnRUaXRsZShcbiAgICAgICAgICBkb2MsXG4gICAgICAgICAgdGhpcy5fY29udGludWVkVGl0bGUob3ZlcmZsb3cuY29tcG9uZW50LCB0b2tlbnMsIG92ZXJmbG93LnNlYXJjaCwgb3ZlcmZsb3cuY3J1bWJzKSxcbiAgICAgICAgICB4LFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICB3LFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMuX3JlbmRlckNvbnRpbnVhdGlvbk1hc3RlcnMoY29udGV4dCwgcGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIsIHBhZ2VzKTtcblxuICAgIHJldHVybiBwYWdlTnVtYmVyICsgcGFnZXMubGVuZ3RoO1xuICB9XG5cbiAgLy8gVGhlIGhlYWRlciBhbmQgZm9vdGVyIG9mIGVhY2ggY29udGludWF0aW9uIHBhZ2UsIG51bWJlcmVkIG9uIGZyb21cbiAgLy8gcGFnZU51bWJlci4gVGhleSBnbyBvbiBvbmNlIHRoZSB0YWJsZSBpcyBkcmF3biwgc2luY2UgYSB0ZXh0IGJsb2NrIHdpdGggYVxuICAvLyB0YWJsZSBpcyBtZWFzdXJlZCBiZWZvcmUgaXQgaXMgZHJhd24sIHdoaWNoIGF1dG9UYWJsZSdzIHBhZ2UgaG9vayBjYW5ub3RcbiAgLy8gd2FpdCBmb3I7IHRoZXkgc2l0IGluIHRoZSBiYW5kcywgY2xlYXIgb2YgdGhlIHRhYmxlLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJDb250aW51YXRpb25NYXN0ZXJzKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgcGFnZTogUmVwb3J0UGFnZSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcbiAgICBwYWdlczogbnVtYmVyW10sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuXG4gICAgZm9yIChjb25zdCBbb2Zmc2V0LCBkb2N1bWVudFBhZ2VdIG9mIHBhZ2VzLmVudHJpZXMoKSkge1xuICAgICAgZG9jLnNldFBhZ2UoZG9jdW1lbnRQYWdlKTtcbiAgICAgIGF3YWl0IHRoaXMuX3JlbmRlck1hc3Rlcihjb250ZXh0LCBwYWdlLCB0aGlzLl90b2tlbnMoY29udGV4dCwgcGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIgKyBvZmZzZXQgKyAxKSk7XG4gICAgfVxuXG4gICAgZG9jLnNldFBhZ2UoZG9jLmdldE51bWJlck9mUGFnZXMoKSk7XG4gIH1cblxuICAvLyBUaGUgbWFyZ2luIGEgY29udGludWF0aW9uIHRhYmxlIGtlZXBzIGZyb20gb25lIGVkZ2U6IGluc2lkZSB0aGUgYmFuZCB3aGVuXG4gIC8vIHRoZSBwYWdlIGhhcyBvbmUuXG4gIHByaXZhdGUgX2NvbnRpbnVhdGlvbk1hcmdpbihiYW5kOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBiYW5kID8gYmFuZCAqIFBUICsgQ09OVElOVUFUSU9OX0dBUCA6IE5PX0JBTkRfTUFSR0lOO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29udGludWVkVGl0bGUoXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0LFxuICAgIHNlYXJjaD86IHN0cmluZyxcbiAgICBjcnVtYnM/OiBzdHJpbmdbXSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCB0aXRsZSA9IGV4cG9ydFRpdGxlKGNvbXBvbmVudCwgdG9rZW5zLCBzZWFyY2gsIGNydW1icyk7XG5cbiAgICByZXR1cm4gdGl0bGUgPyBgJHt0aXRsZX0gKGNvbnRpbnVlZClgIDogJ0NvbnRpbnVlZCc7XG4gIH1cblxuICAvLyBBIEtQSSB0aWxlOiB0aGUgY2FyZCB0aGUgc2NyZWVuIGRyYXdzIChrcGktY2FyZC50cyBkZWNpZGVzIGV2ZXJ5IGxpbmUpLFxuICAvLyBzdGFja2VkIGFuZCBjZW50ZXJlZCBpbiB0aGUgYm9keS4gQSBjYXJkIHdpdGggb25seSBpdHMgdmFsdWUgYW5kIGxhYmVsXG4gIC8vIGtlZXBzIHRoZSB0aWxlJ3MgbG9uZy1zdGFuZGluZyBsYXlvdXQuXG4gIHByaXZhdGUgX3JlbmRlcktwaShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGNvbmZpZyA9IGl0ZW0uY29tcG9uZW50LmNvbmZpZyBhcyBLcGlDb25maWc7XG4gICAgY29uc3QgdmlldyA9IGtwaUNhcmRWaWV3KGNvbmZpZywgaXRlbS5kYXRhLCB7IGZvcm1hdDogY29udGV4dC5mb3JtYXRDb250ZXh0LCB0aW1lem9uZTogY29udGV4dC50aW1lem9uZSB9KTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3BkZlRleHQodmlldy52YWx1ZSk7XG4gICAgY29uc3Qgbm90ZXMgPSBleHBvcnROb3RlTGluZXMoaXRlbSwgY29udGV4dC50aW1lem9uZSwgY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZSk7XG5cbiAgICBpZiAoIWtwaUNhcmRIYXNFeHRyYXModmlldywgbm90ZXMpKSB7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICAgIGRvYy5zZXRGb250U2l6ZSgyNik7XG4gICAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgICBkb2MudGV4dCh2YWx1ZSwgeCArIHcgLyAyLCB5ICsgaCAvIDIsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuXG4gICAgICBpZiAodmlldy5sYWJlbCkge1xuICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgICAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgICAgIGRvYy5zZXRUZXh0Q29sb3IoTVVURURfQ09MT1IpO1xuICAgICAgICBkb2MudGV4dCh2aWV3LmxhYmVsLCB4ICsgdyAvIDIsIHkgKyBoIC8gMiArIDE2LCB7IGFsaWduOiAnY2VudGVyJyB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgdGlsZSB0b28gc2hvcnQgZm9yIHRoZSBjYXJkJ3MgbGluZXMgc2hyaW5rcyB0aGVtIGFsbCBhbGlrZS5cbiAgICBjb25zdCBwYXJ0cyA9IGtwaUV4cG9ydFBhcnRzKHZpZXcsIG5vdGVzLCBoLCBLUElfSEVJR0hUUyk7XG4gICAgY29uc3QgaGVpZ2h0cyA9IHNjYWxlZEtwaUhlaWdodHMoS1BJX0hFSUdIVFMsIHBhcnRzLnNjYWxlKTtcbiAgICBsZXQgdG9wID0geSArIE1hdGgubWF4KDAsIChoIC0ga3BpRXhwb3J0SGVpZ2h0KHZpZXcsIHBhcnRzLCBoZWlnaHRzKSkgLyAyKTtcblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyNiAqIHBhcnRzLnNjYWxlKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgZG9jLnRleHQodmFsdWUsIHggKyB3IC8gMiwgdG9wICsgS1BJX1ZBTFVFX0JBU0VMSU5FICogcGFydHMuc2NhbGUsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICAgIHRvcCArPSBoZWlnaHRzLnZhbHVlO1xuXG4gICAgaWYgKHZpZXcubGFiZWwpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoOSAqIHBhcnRzLnNjYWxlKTtcbiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoTVVURURfQ09MT1IpO1xuICAgICAgZG9jLnRleHQodGhpcy5fZml0KGRvYywgdGhpcy5fcGRmVGV4dCh2aWV3LmxhYmVsKSwgdyksIHggKyB3IC8gMiwgdG9wICsgOSAqIHBhcnRzLnNjYWxlLCB7IGFsaWduOiAnY2VudGVyJyB9KTtcbiAgICAgIHRvcCArPSBoZWlnaHRzLmxhYmVsO1xuICAgIH1cblxuICAgIGlmIChwYXJ0cy5kZWx0YSAmJiB2aWV3LmRlbHRhKSB7XG4gICAgICB0aGlzLl9rcGlEZWx0YShkb2MsIHZpZXcuZGVsdGEsIHgsIHRvcCwgdywgcGFydHMuc2NhbGUpO1xuICAgICAgdG9wICs9IGhlaWdodHMuZGVsdGE7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLndpbmRvdykge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dCh2aWV3LndpbmRvdyksIHgsIHRvcCwgdywgJ2NlbnRlcicsICdub3JtYWwnLCBwYXJ0cy5zY2FsZSk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy53aW5kb3c7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLnRhcmdldCAmJiB2aWV3LnRhcmdldCkge1xuICAgICAgdGhpcy5fa3BpVGFyZ2V0KGRvYywgdmlldy50YXJnZXQsIHgsIHRvcCwgdyk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy50YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLnNwYXJrbGluZSAmJiB2aWV3LnNwYXJrbGluZSkge1xuICAgICAgdGhpcy5fa3BpU3BhcmtsaW5lKGRvYywgdmlldy5zcGFya2xpbmUudmFsdWVzLCB2aWV3LnNwYXJrbGluZS5wYXJ0aWFsLCB4LCB0b3AsIHcpO1xuICAgICAgdG9wICs9IGhlaWdodHMuc3BhcmtsaW5lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBwYXJ0cy5ub3Rlcykge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dChsaW5lKSwgeCwgdG9wLCB3LCAnY2VudGVyJywgJ2l0YWxpYycpO1xuICAgICAgdG9wICs9IGhlaWdodHMubm90ZTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgZGVsdGEgcm93LCBjZW50ZXJlZCBhcyBvbmUgZ3JvdXA6IGEgdHJpYW5nbGUgcG9pbnRpbmcgdGhlIHdheSB0aGVcbiAgLy8gdmFsdWUgbW92ZWQgKG5vbmUgd2hlbiB0aGUgc2hvd24gY2hhbmdlIHJvdW5kcyB0byB6ZXJvKSBhbmQgdGhlIGNoYW5nZSBpblxuICAvLyB0aGUgY29sb3Igb2Ygd2hhdCBpdCBtZWFucywgdGhlbiB3aGF0IGl0IGlzIGNvbXBhcmVkIHdpdGggaW4gZ3JleS5cbiAgcHJpdmF0ZSBfa3BpRGVsdGEoZG9jOiBhbnksIGRlbHRhOiBLcGlDYXJkRGVsdGEsIHg6IG51bWJlciwgdG9wOiBudW1iZXIsIHc6IG51bWJlciwgc2NhbGUgPSAxKTogdm9pZCB7XG4gICAgY29uc3QgY29sb3IgPSBgIyR7UkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTW2RlbHRhLnRvbmVdfWA7XG4gICAgY29uc3QgY2hhbmdlID0gdGhpcy5fcGRmVGV4dChkZWx0YS50ZXh0KTtcbiAgICBjb25zdCBzaXplID0gS1BJX0RFTFRBX1NJWkUgKiBzY2FsZTtcbiAgICBjb25zdCBzaWRlID0gS1BJX0FSUk9XICogc2NhbGU7XG4gICAgY29uc3QgYXJyb3cgPSBkZWx0YS50cmVuZCA9PT0gUmVwb3J0S3BpVHJlbmQuRmxhdCA/IDAgOiBzaWRlICsgS1BJX0FSUk9XX0dBUCAqIHNjYWxlO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKHNpemUpO1xuICAgIGNvbnN0IGNoYW5nZVdpZHRoID0gZG9jLmdldFRleHRXaWR0aChjaGFuZ2UpO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICBjb25zdCBjb21wYXJlZCA9IGRlbHRhLmNvbXBhcmVkXG4gICAgICA/IHRoaXMuX2ZpdChkb2MsIGAgJHt0aGlzLl9wZGZUZXh0KGRlbHRhLmNvbXBhcmVkKX1gLCBNYXRoLm1heCgwLCB3IC0gYXJyb3cgLSBjaGFuZ2VXaWR0aCkpXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IHdpZHRoID0gYXJyb3cgKyBjaGFuZ2VXaWR0aCArIChjb21wYXJlZCA/IGRvYy5nZXRUZXh0V2lkdGgoY29tcGFyZWQpIDogMCk7XG4gICAgY29uc3QgYmFzZWxpbmUgPSB0b3AgKyBzaXplO1xuICAgIGxldCBsZWZ0ID0geCArIE1hdGgubWF4KDAsICh3IC0gd2lkdGgpIC8gMik7XG5cbiAgICBpZiAoYXJyb3cpIHtcbiAgICAgIGNvbnN0IHVwID0gZGVsdGEudHJlbmQgPT09IFJlcG9ydEtwaVRyZW5kLlVwO1xuICAgICAgY29uc3QgdGlwID0gdXAgPyBiYXNlbGluZSAtIHNpZGUgOiBiYXNlbGluZTtcbiAgICAgIGNvbnN0IGJhc2UgPSB1cCA/IGJhc2VsaW5lIDogYmFzZWxpbmUgLSBzaWRlO1xuXG4gICAgICBkb2Muc2V0RmlsbENvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy50cmlhbmdsZShsZWZ0LCBiYXNlLCBsZWZ0ICsgc2lkZSwgYmFzZSwgbGVmdCArIHNpZGUgLyAyLCB0aXAsICdGJyk7XG4gICAgICBsZWZ0ICs9IGFycm93O1xuICAgIH1cblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoY29sb3IpO1xuICAgIGRvYy50ZXh0KGNoYW5nZSwgbGVmdCwgYmFzZWxpbmUpO1xuXG4gICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgICBkb2MudGV4dChjb21wYXJlZCwgbGVmdCArIGNoYW5nZVdpZHRoLCBiYXNlbGluZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIHRhcmdldCBsaW5lICgnR29hbDogJDEsMDAwIMK3IDU2JSBvZiB0YXJnZXQnKSBhbmQsIHdoZW4gdGhlIHNlcnZlciBzZW50XG4gIC8vIHRoZSBwcm9ncmVzcywgYSBiYXIgZmlsbGVkIHRoYXQgZmFyOiBncmVlbiBvbmNlIHRoZSB0YXJnZXQgaXMgbWV0LlxuICBwcml2YXRlIF9rcGlUYXJnZXQoZG9jOiBhbnksIHRhcmdldDogS3BpQ2FyZFRhcmdldCwgeDogbnVtYmVyLCB0b3A6IG51bWJlciwgdzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdGV4dCA9IHRhcmdldC5wcm9ncmVzcyA/IGAke3RhcmdldC50ZXh0fSDCtyAke3RhcmdldC5wcm9ncmVzc31gIDogdGFyZ2V0LnRleHQ7XG5cbiAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KHRleHQpLCB4LCB0b3AsIHcsICdjZW50ZXInLCAnbm9ybWFsJyk7XG5cbiAgICBpZiAodGFyZ2V0LmZpbGwgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBiYXJXID0gTWF0aC5taW4odyAqIDAuNiwgS1BJX0JBUl9XKTtcbiAgICBjb25zdCBiYXJYID0geCArICh3IC0gYmFyVykgLyAyO1xuICAgIGNvbnN0IGJhclkgPSB0b3AgKyBOT1RFX0xJTkVfSCArIDE7XG5cbiAgICBkb2Muc2V0RmlsbENvbG9yKEtQSV9UUkFDS19DT0xPUik7XG4gICAgZG9jLnJlY3QoYmFyWCwgYmFyWSwgYmFyVywgS1BJX0JBUl9ILCAnRicpO1xuXG4gICAgaWYgKHRhcmdldC5maWxsID4gMCkge1xuICAgICAgZG9jLnNldEZpbGxDb2xvcihgIyR7UkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTW3RhcmdldC50b25lXX1gKTtcbiAgICAgIGRvYy5yZWN0KGJhclgsIGJhclksIGJhclcgKiB0YXJnZXQuZmlsbCwgS1BJX0JBUl9ILCAnRicpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBzcGFya2xpbmUgaW4gYSBib3ggdW5kZXIgdGhlIGNhcmQncyBsaW5lcywgYXMgdGhlIHNjcmVlbiBkcmF3cyBpdFxuICAvLyAoa3BpU3BhcmtsaW5lR2VvbWV0cnksIGEgMC0xMDAgYm94KTogYSB2ZWN0b3IgbGluZSBwZXIgcnVuIG9mIHZhbHVlcywgYVxuICAvLyBkb3QgZm9yIGEgbG9uZSB2YWx1ZSwgYW5kIHRoZSBsYXN0IHBvaW50J3MgbWFya2VyLCBob2xsb3cgd2hpbGUgaXRzIHBlcmlvZFxuICAvLyBpcyBwYXJ0aWFsLlxuICBwcml2YXRlIF9rcGlTcGFya2xpbmUoXG4gICAgZG9jOiBhbnksXG4gICAgdmFsdWVzOiAobnVtYmVyIHwgbnVsbClbXSxcbiAgICBwYXJ0aWFsOiBib29sZWFuLFxuICAgIHg6IG51bWJlciwgdG9wOiBudW1iZXIsIHc6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBrcGlTcGFya2xpbmVHZW9tZXRyeSh2YWx1ZXMsIHBhcnRpYWwpO1xuICAgIGNvbnN0IGJveFcgPSBNYXRoLm1pbih3ICogMC43LCBLUElfU1BBUktMSU5FX1cpO1xuICAgIGNvbnN0IGJveEggPSBLUElfSEVJR0hUUy5zcGFya2xpbmUgLSAyICogS1BJX1NQQVJLTElORV9JTlNFVDtcbiAgICBjb25zdCBsZWZ0ID0geCArICh3IC0gYm94VykgLyAyO1xuICAgIGNvbnN0IGF0ID0gKHBvaW50OiBLcGlTcGFya2xpbmVQb2ludCkgPT4gKHtcbiAgICAgIHg6IGxlZnQgKyBwb2ludC54ICogYm94VyAvIDEwMCxcbiAgICAgIHk6IHRvcCArIEtQSV9TUEFSS0xJTkVfSU5TRVQgKyBwb2ludC55ICogYm94SCAvIDEwMCxcbiAgICB9KTtcbiAgICBjb25zdCBjb2xvciA9IGAjJHtSRVBPUlRfS1BJX1NQQVJLTElORV9DT0xPUn1gO1xuXG4gICAgZG9jLnNldERyYXdDb2xvcihjb2xvcik7XG4gICAgZG9jLnNldEZpbGxDb2xvcihjb2xvcik7XG4gICAgZG9jLnNldExpbmVXaWR0aCgxKTtcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBnZW9tZXRyeS5saW5lcykge1xuICAgICAgY29uc3QgcG9pbnRzID0gbGluZS5zcGxpdCgnICcpLm1hcCgocGFpcikgPT4ge1xuICAgICAgICBjb25zdCBbcHgsIHB5XSA9IHBhaXIuc3BsaXQoJywnKS5tYXAoTnVtYmVyKTtcblxuICAgICAgICByZXR1cm4gYXQoeyB4OiBweCwgeTogcHkgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0ZXBzID0gcG9pbnRzLnNsaWNlKDEpLm1hcCgocG9pbnQsIGluZGV4KSA9PiBbcG9pbnQueCAtIHBvaW50c1tpbmRleF0ueCwgcG9pbnQueSAtIHBvaW50c1tpbmRleF0ueV0pO1xuXG4gICAgICBkb2MubGluZXMoc3RlcHMsIHBvaW50c1swXS54LCBwb2ludHNbMF0ueSwgWzEsIDFdLCAnUycsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRvdCBvZiBnZW9tZXRyeS5kb3RzKSB7XG4gICAgICBjb25zdCBwb2ludCA9IGF0KGRvdCk7XG4gICAgICBkb2MuY2lyY2xlKHBvaW50LngsIHBvaW50LnksIEtQSV9ET1RfUiwgJ0YnKTtcbiAgICB9XG5cbiAgICBpZiAoZ2VvbWV0cnkubGFzdCkge1xuICAgICAgY29uc3QgcG9pbnQgPSBhdChnZW9tZXRyeS5sYXN0KTtcblxuICAgICAgaWYgKGdlb21ldHJ5Lmxhc3QuaG9sbG93KSB7XG4gICAgICAgIGRvYy5zZXRGaWxsQ29sb3IoJyNmZmZmZmYnKTtcbiAgICAgICAgZG9jLmNpcmNsZShwb2ludC54LCBwb2ludC55LCBLUElfRE9UX1IsICdGRCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jLmNpcmNsZShwb2ludC54LCBwb2ludC55LCBLUElfRE9UX1IsICdGJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQSBmb3JtYXR0ZWQgdmFsdWUgYXMganNQREYgY2FuIGRyYXcgaXQuIEl0cyBzdGFuZGFyZCBmb250cyB3cml0ZSB0ZXh0IGluXG4gIC8vIFdpbkFuc2ksIHdoaWNoIGhhcyB0aGUgbm8tYnJlYWsgc3BhY2UgKFUrMDBBMCwgZnItQ0EncyBkaWdpdCBncm91cGluZykgYnV0XG4gIC8vIG5vdCB0aGUgbmFycm93IG9uZSAoVSsyMDJGLCB3aGljaCBvdGhlciBsb2NhbGVzIGdyb3VwIGFuZCBzcGFjZSB3aXRoKSwgdGhlXG4gIC8vIHRoaW4gYW5kIGhhaXIgc3BhY2VzIChVKzIwMDksIFUrMjAwQSwgd2hpY2ggSW50bCBwdXRzIGFyb3VuZCBhIGRhdGVcbiAgLy8gcmFuZ2UncyBkYXNoOiAnU2VwIDEg4oCTIDMwLCAyMDI2JyksIHRoZSBtaW51cyBzaWduIChVKzIyMTIsIHNvbWUgbG9jYWxlcydcbiAgLy8gbmVnYXRpdmUgc2lnbikgb3IgYSByYW5rIGNoYW5nZSdzIHRyaWFuZ2xlczogZWFjaCB3b3VsZCBwcmludCBhcyBzdHJheVxuICAvLyBnbHlwaHMuIFRoZSBuYXJyb3cgc3BhY2UgYmVjb21lcyBhIG5vLWJyZWFrIHNwYWNlLCBzbyBhIG51bWJlciBzdGlsbCBuZXZlclxuICAvLyB3cmFwcyBhY3Jvc3MgYSBsaW5lOyB0aGUgdGhpbiBhbmQgaGFpciBzcGFjZXMgYSBwbGFpbiBzcGFjZTsgdGhlIG1pbnVzXG4gIC8vIHNpZ24gYSBoeXBoZW47IGFuZCBhIHJhbmsncyByaXNlIGEgcGx1cyBzaWduIGFuZCBpdHMgZmFsbCBhIGh5cGhlblxuICAvLyAoJ+KWsiAyJyByZWFkcyAnKzInKS5cbiAgcHJpdmF0ZSBfcGRmVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0ZXh0XG4gICAgICAucmVwbGFjZSgvXFx1MjAyRi9nLCAnXFx1MDBBMCcpXG4gICAgICAucmVwbGFjZSgvW1xcdTIwMDlcXHUyMDBBXS9nLCAnICcpXG4gICAgICAucmVwbGFjZSgvXFx1MjIxMi9nLCAnLScpXG4gICAgICAucmVwbGFjZSgvXFx1MjVCMlxccz8vZywgJysnKVxuICAgICAgLnJlcGxhY2UoL1xcdTI1QkNcXHM/L2csICctJyk7XG4gIH1cblxuICAvLyBBIGxheWVyJ3MgdmFsdWVzIHdpdGggZWFjaCBudW1iZXIgYXMganNQREYgY2FuIGRyYXcgaXQgKF9wZGZUZXh0KSwgc28gYVxuICAvLyB2YWx1ZSBncm91cGVkIHdpdGggbmFycm93IHNwYWNlcyByZWFkcywgYW5kIHdyYXBzLCBsaWtlIGFueSBvdGhlciBudW1iZXIuXG4gIHByaXZhdGUgX3BkZlZhbHVlcyh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIFRleHRWYWx1ZT4pOiBSZWNvcmQ8c3RyaW5nLCBUZXh0VmFsdWU+IHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHZhbHVlcykubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLnRleHQgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogeyAuLi52YWx1ZSwgdGV4dDogdGhpcy5fcGRmVGV4dCh2YWx1ZS50ZXh0KSB9LFxuICAgIF0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NsdWcobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05XSsvZywgJy0nKS5yZXBsYWNlKC9eLSt8LSskL2csICcnKSB8fCAncmVwb3J0JztcbiAgfVxufVxuIl19
|
|
1023
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBkZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVVsRCxPQUFPLEVBQzJDLFdBQVcsRUFBRSxvQkFBb0IsR0FDbEYsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RELE9BQU8sRUFDTCxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFDaEgsaUJBQWlCLEVBQ2pCLFVBQVUsR0FDWCxNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQ0wsd0JBQXdCLEVBQUUsMEJBQTBCLEVBQUUsc0JBQXNCLEVBQUUsdUJBQXVCLEdBQ3RHLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQzRELGtCQUFrQixFQUNuRixVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFDbEgsZUFBZSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZ0JBQWdC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QUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTVHLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QixHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xCLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFaEMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN6QixHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM1QixHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDaEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMvQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSxzRUFBc0U7SUFDdEUsMkVBQTJFO0lBQzNFLHlFQUF5RTtJQUN6RSw2RUFBNkU7SUFDN0UseUVBQXlFO0lBQ3pFLHFFQUFxRTtJQUNyRSxzQkFBc0I7SUFDZCxRQUFRLENBQUMsSUFBWTtRQUMzQixPQUFPLElBQUk7YUFDUixPQUFPLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQzthQUM1QixPQUFPLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDO2FBQy9CLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDO2FBQ3ZCLE9BQU8sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDO2FBQzFCLE9BQU8sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSw0RUFBNEU7SUFDcEUsVUFBVSxDQUFDLE1BQWlDO1FBQ2xELE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyRSxHQUFHO1lBQ0gsS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7U0FDakYsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRU8sS0FBSyxDQUFDLElBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQztJQUM1RixDQUFDO3dHQW5xQ1UsZ0JBQWdCOzRHQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUmVwb3J0S3BpVHJlbmQgfSBmcm9tICcuLi9lbnVtcy9yZXBvcnQta3BpLXRyZW5kLmVudW0nO1xuaW1wb3J0IHsgbGF5ZXJGaWx0ZXJGaWVsZHMgfSBmcm9tICcuLi9maWx0ZXItdGV4dCc7XG5pbXBvcnQgeyByZXNvbHZlUmVwb3J0VGltZXpvbmUgfSBmcm9tICcuLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgS3BpQ29uZmlnLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgUmVwb3J0SGVhZGVyRm9vdGVyLFxuICBSZXBvcnRQYWdlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgS3BpQ2FyZERlbHRhLCBLcGlDYXJkVGFyZ2V0LCBLcGlTcGFya2xpbmVQb2ludCwga3BpQ2FyZFZpZXcsIGtwaVNwYXJrbGluZUdlb21ldHJ5LFxufSBmcm9tICcuLi9rcGktY2FyZCc7XG5pbXBvcnQgeyBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HIH0gZnJvbSAnLi4vbGF5b3V0JztcbmltcG9ydCB7XG4gIERFRkFVTFRfVEVYVF9DT0xPUiwgREVGQVVMVF9URVhUX1NJWkUsIFRFWFRfVEFCTEVfQk9SREVSX0NPTE9SLCBURVhUX1RBQkxFX0JPUkRFUl9XSURUSCwgVEVYVF9UQUJMRV9DRUxMX1BBRERJTkcsXG4gIFRFWFRfVEFCTEVfTUFSR0lOLCBUZXh0RmlsdGVyRmllbGQsIFRleHRQYXJhZ3JhcGgsIFRleHRSdW4sIFRleHRUYWJsZSwgVGV4dFRhYmxlQ2VsbCwgVGV4dFRva2VuQ29udGV4dCwgVGV4dFZhbHVlLFxuICB0ZXh0QmxvY2tzLFxufSBmcm9tICcuLi90ZXh0JztcbmltcG9ydCB7XG4gIFJFUE9SVF9LUElfQ0hBTkdFX0NPTE9SUywgUkVQT1JUX0tQSV9TUEFSS0xJTkVfQ09MT1IsIFJFUE9SVF9LUElfVFJBQ0tfQ09MT1IsIFJFUE9SVF9NVVRFRF9URVhUX0NPTE9SLFxufSBmcm9tICcuLi90aGVtZS9wYWxldHRlJztcbmltcG9ydCB7IGlzRHJhd24gfSBmcm9tICcuLi92YWx1ZXMnO1xuaW1wb3J0IHsgcmVuZGVyQ2hhcnRJbWFnZSB9IGZyb20gJy4vb2Zmc2NyZWVuLWNoYXJ0JztcbmltcG9ydCB7XG4gIEJ1aWx0RXhwb3J0LCBDb2xsZWN0ZWRDb21wb25lbnQsIENvbGxlY3RlZFBhZ2UsIENvbGxlY3RlZFJlcG9ydCwgSEVBREVSX0ZPT1RFUl9OQU1FLCBLcGlFeHBvcnRIZWlnaHRzLCBUZXh0T3ZlcmZsb3csXG4gIGNvdmVyTGluZXMsIGVtcHR5TGFiZWwsIGV4cG9ydENlbGwsIGV4cG9ydE5vdGVMaW5lcywgZXhwb3J0VGl0bGUsIGV4cG9ydFdpbmRvd3NMaW5lLCBpc0VtcHR5VGlsZSwga3BpQ2FyZEhhc0V4dHJhcyxcbiAga3BpRXhwb3J0SGVpZ2h0LCBrcGlFeHBvcnRQYXJ0cywgbGlzdENvbHVtbnMsIGxpc3RIZWFkaW5ncywgbGlzdFRvdGFsc1JvdywgbW9yZVJvd3NOb3RpY2UsIHNjYWxlZEtwaUhlaWdodHMsXG4gIHRleHRPdmVyZmxvdyxcbn0gZnJvbSAnLi9yZXBvcnQtZXhwb3J0LWNvbGxlY3Rvci5zZXJ2aWNlJztcbmltcG9ydCB7IEdyaWRFeHBvcnRDZWxsLCBncmlkRXhwb3J0VGFibGUgfSBmcm9tICcuL3JlcG9ydC1ncmlkLWV4cG9ydCc7XG5pbXBvcnQgeyBSZXBvcnRUZXh0TGF5b3V0U2VydmljZSwgVGV4dFRhYmxlTGF5b3V0IH0gZnJvbSAnLi9yZXBvcnQtdGV4dC1sYXlvdXQuc2VydmljZSc7XG5cblxuLy8gSW5jaGVzIOKGkiBwb2ludHMgKHRoZSBQREYgdW5pdCkuXG5jb25zdCBQVCA9IDcyO1xuXG4vLyBDb21wb25lbnQgdGl0bGUgc3RyaXAgaGVpZ2h0LCBwb2ludHMuXG5jb25zdCBUSVRMRV9IID0gMTg7XG5cbi8vIFRoZSBzbWFsbCBwcmludCBhIGNvbXBvbmVudCBtYXkgY2FycnksIHBvaW50czogdGhlIGRheXMgaXQgcmVhZHMgdW5kZXIgaXRzXG4vLyB0aXRsZSAoYSBzdWJ0aXRsZSBsaW5lKSwgaXRzIG5vdGVzIGF0IHRoZSBmb290IG9mIGl0cyBib3ggKGEgbGluZSBlYWNoKSwgYW5kXG4vLyB0aGUgbGluZXMgb2YgYSBLUEkgY2FyZCB1bmRlciBpdHMgdmFsdWUuIEEgY2hhcnQncyBvciBhIGxpc3QncyBub3RlcyBnaXZlXG4vLyB3YXkgYmVmb3JlIGl0cyBib2R5IHdvdWxkIHNocmluayB1bmRlciBNSU5fQk9EWV9ILlxuY29uc3QgU01BTExfU0laRSA9IDcuNTtcbmNvbnN0IFNVQlRJVExFX0ggPSAxMTtcbmNvbnN0IE5PVEVfTElORV9IID0gMTA7XG5jb25zdCBNSU5fQk9EWV9IID0gNDA7XG5jb25zdCBNVVRFRF9DT0xPUiA9IGAjJHtSRVBPUlRfTVVURURfVEVYVF9DT0xPUn1gO1xuXG4vLyBBIEtQSSBjYXJkJ3MgcGFydHMsIHRvcCB0byBib3R0b20sIHBvaW50cyAoa3BpRXhwb3J0UGFydHMgc2hlZHMgdGhlXG4vLyBzcGFya2xpbmUsIHRoZW4gdGhlIHRhcmdldCwgdGhlbiB0aGUgbm90ZXMgb24gYSBzaG9ydCB0aWxlKS4gVGhlIHZhbHVlJ3Ncbi8vIGJhc2VsaW5lIHNpdHMgS1BJX1ZBTFVFX0JBU0VMSU5FIHVuZGVyIGl0cyB0b3AuXG5jb25zdCBLUElfSEVJR0hUUzogS3BpRXhwb3J0SGVpZ2h0cyA9IHtcbiAgdmFsdWU6IDMwLFxuICBsYWJlbDogMTMsXG4gIGRlbHRhOiAxMyxcbiAgd2luZG93OiBOT1RFX0xJTkVfSCxcbiAgdGFyZ2V0OiBOT1RFX0xJTkVfSCArIDYsXG4gIHNwYXJrbGluZTogMjgsXG4gIG5vdGU6IE5PVEVfTElORV9ILFxufTtcbmNvbnN0IEtQSV9WQUxVRV9CQVNFTElORSA9IDIzO1xuY29uc3QgS1BJX0RFTFRBX1NJWkUgPSA5O1xuLy8gVGhlIGRlbHRhJ3MgdHJpYW5nbGU6IGl0cyBzaWRlLCBhbmQgdGhlIGdhcCBiZWZvcmUgdGhlIGNoYW5nZS5cbmNvbnN0IEtQSV9BUlJPVyA9IDY7XG5jb25zdCBLUElfQVJST1dfR0FQID0gMztcbi8vIFRoZSB0YXJnZXQncyBwcm9ncmVzcyBiYXIsIGFuZCB0aGUgdHJhY2sgaXQgZmlsbHMuXG5jb25zdCBLUElfQkFSX1cgPSAxMjA7XG5jb25zdCBLUElfQkFSX0ggPSAzO1xuY29uc3QgS1BJX1RSQUNLX0NPTE9SID0gYCMke1JFUE9SVF9LUElfVFJBQ0tfQ09MT1J9YDtcbi8vIFRoZSBzcGFya2xpbmUncyB3aWRlc3QgYm94LCBpdHMgdG9wIGFuZCBib3R0b20gaW5zZXQsIGFuZCBpdHMgZG90cycgcmFkaXVzLlxuY29uc3QgS1BJX1NQQVJLTElORV9XID0gMTQwO1xuY29uc3QgS1BJX1NQQVJLTElORV9JTlNFVCA9IDM7XG5jb25zdCBLUElfRE9UX1IgPSAxLjU7XG5cbi8vIFJvd3MgZmV0Y2hlZCBmb3IgYSBsaXN0J3MgUERGIHRhYmxlLiBBIHRhYmxlIHRoYXQgb3V0Z3Jvd3MgaXRzIGJveFxuLy8gY29udGludWVzIG9udG8gcGFnZXMgb2YgaXRzIG93biwgc28gdGhpcyBpcyBob3cgZmFyIGl0IG1heSBydW46IGFib3V0IDEyLTE1XG4vLyBjb250aW51YXRpb24gcGFnZXMgb24gYSBsZXR0ZXIgcGFnZSwgYW5kIGEgdGVudGggb2YgdGhlIHNlcnZlcidzIDUwMDAtcm93XG4vLyBjZWlsaW5nLiBBIGxvbmdlciByZXN1bHQgZW5kcyBpbiBhIG1vcmVSb3dzTm90aWNlKCkgcm93LlxuZXhwb3J0IGNvbnN0IFBERl9MSVNUX1JPV1MgPSA1MDA7XG5cbi8vIEhvdyBmYXIgYSBjb250aW51YXRpb24gdGFibGUgc2l0cyBpbnNpZGUgdGhlIGhlYWRlciBhbmQgZm9vdGVyIGJhbmRzLFxuLy8gcG9pbnRzLiBBIHBhZ2Ugd2l0aCBubyBiYW5kIChvciB3aXRoIHRoZSBtYXN0ZXIgaGlkZGVuKSBrZWVwc1xuLy8gTk9fQkFORF9NQVJHSU4gZnJvbSB0aGF0IGVkZ2UgaW5zdGVhZC5cbmNvbnN0IENPTlRJTlVBVElPTl9HQVAgPSAwLjI1ICogUFQ7XG5jb25zdCBOT19CQU5EX01BUkdJTiA9IDAuNSAqIFBUO1xuY29uc3QgTk9fQkFORFM6IFJlcG9ydEhlYWRlckZvb3RlciA9IHsgaGVhZGVySGVpZ2h0OiAwLCBmb290ZXJIZWlnaHQ6IDAgfTtcblxuLy8gVGhlIGxhc3Qgcm93IG9mIGEgbGlzdCBib3ggd2hvc2Ugcm93cyBjYXJyeSBvbiBwYXN0IGl0LlxuY29uc3QgQ09OVElOVUVEX05PVElDRSA9ICdDb250aW51ZWQgb24gdGhlIGZvbGxvd2luZyBwYWdlcyc7XG5cbi8vIEEgdGV4dCBsaW5lJ3MgaGVpZ2h0IGFzIGEgbXVsdGlwbGUgb2YgaXRzIGxhcmdlc3QgZm9udCBzaXplIOKAlCB0aGUgY2FudmFzXG4vLyBzdHlsZXNoZWV0J3MgbGluZS1oZWlnaHQsIHNvIGEgYmxvY2sgd3JhcHMgYW5kIHN0YWNrcyB0aGUgc2FtZSB3YXkuXG5jb25zdCBURVhUX0xJTkVfSEVJR0hUID0gMS4yNTtcblxuLy8gSG93IGZhciBhIGxpc3QgaXRlbSdzIHRleHQgc2l0cyBmcm9tIHRoZSBibG9jaydzIGVkZ2UsIHBvaW50czsgdGhlIG1hcmtlclxuLy8gaGFuZ3MgaW4gdGhhdCBzcGFjZS5cbmNvbnN0IExJU1RfSU5ERU5UID0gMTY7XG5cbi8vIFdoYXQgdGhlIGV4cG9ydCdzIG92ZXJmbG93IGdhdGUgc2F5cyB0aGUgUERGIGRvZXMgd2l0aCBhIHRleHQgYmxvY2sgdGhhdCBkb2VzXG4vLyBub3QgZml0IGl0cyBib3guXG5jb25zdCBQREZfT1ZFUkZMT1dfTk9URSA9ICdUaGUgUERGIGN1dHMgaXQgb2ZmIGF0IHRoZSBib3R0b20gb2YgaXRzIGJveC4nO1xuXG4vLyBXaGF0IGV2ZXJ5IGRyYXdpbmcgc3RlcCBvZiBvbmUgZXhwb3J0IHNoYXJlcywgYnVpbHQgb25jZSBpbiBidWlsZCgpLlxuLy8gU2l6ZXMgYXJlIHBvaW50cy5cbmludGVyZmFjZSBQZGZFeHBvcnRDb250ZXh0IHtcbiAgZG9jOiBhbnk7XG4gIGF1dG9UYWJsZTogYW55O1xuICBqc1BERjogYW55O1xuICByZXBvcnQ6IFJlcG9ydDtcbiAgdGltZXpvbmU6IHN0cmluZztcbiAgZm9ybWF0Q29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dDtcbiAgcGFnZVc6IG51bWJlcjtcbiAgcGFnZUg6IG51bWJlcjtcbiAgb3JpZW50YXRpb246ICdsYW5kc2NhcGUnIHwgJ3BvcnRyYWl0JztcbiAgLy8gV2hhdCB0aGUgaGVhZGVyIGFuZCBmb290ZXIncyB2YWx1ZSB0b2tlbnMgZmlsbCB3aXRoLCB0aGUgc2FtZSBvbiBldmVyeVxuICAvLyBwYWdlLCBjb250aW51YXRpb24gcGFnZXMgaW5jbHVkZWQgKF9wZGZWYWx1ZXMpLlxuICBtYXN0ZXJWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIFRleHRWYWx1ZT47XG4gIC8vIFdoYXQgdGhlIHt7ZmlsdGVyLjxpZD59fSB0b2tlbnMgZmlsbCB3aXRoLCBldmVyeSBncm91cCdzLCB0aGUgc2FtZSBvblxuICAvLyBldmVyeSBwYWdlOyBhIHBhZ2UgcmVhZHMgaXRzIG93biAobGF5ZXJGaWx0ZXJGaWVsZHMpLlxuICBmaWx0ZXJGaWVsZHM6IFJlY29yZDxudW1iZXIsIFRleHRGaWx0ZXJGaWVsZD47XG4gIC8vIFRoZSBvbmVzIHRoZSBoZWFkZXIgYW5kIGZvb3RlciByZWFkOiBubyBwYWdlIGZpbHRlcidzLlxuICBtYXN0ZXJGaWx0ZXJzOiBSZWNvcmQ8bnVtYmVyLCBUZXh0RmlsdGVyRmllbGQ+O1xuICAvLyBUaGUgdGV4dCBibG9ja3MgY3V0IG9mZiBhdCB0aGUgYm90dG9tIG9mIHRoZWlyIGJveCwgYnkgY29tcG9uZW50IGlkLCBzbyBhXG4gIC8vIGhlYWRlciBvciBmb290ZXIgYmxvY2sgY3V0IG9uIGV2ZXJ5IHBhZ2UgaXMgbGlzdGVkIG9uY2UuXG4gIHRleHRPdmVyZmxvd3M6IE1hcDxudW1iZXIsIFRleHRPdmVyZmxvdz47XG59XG5cbi8vIEEgd29yZCBvZiBhIHdyYXBwZWQgbGluZSAoX3dyYXApOiBpdHMgcnVuLCBpdHMgdGV4dCB3aXRoIGFueSB0cmFpbGluZyBzcGFjZSxcbi8vIGl0cyBmb250IHNpemUgYW5kIGl0cyB3aWR0aCwgcG9pbnRzLlxuaW50ZXJmYWNlIFBkZldvcmQge1xuICBydW46IFRleHRSdW47XG4gIHRleHQ6IHN0cmluZztcbiAgc2l6ZTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xufVxuXG4vLyBXaGVyZSBhIHRleHQgYmxvY2sncyB3b3JkcyBhcmUgZHJhd24sIHBvaW50czogdGhlIGxlZnQgZWRnZSBhbmQgd2lkdGggdGhleVxuLy8gd3JhcCB0bywgdGhlIHRvcCBvZiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBib3R0b20gbm8gbGluZSBtYXkgcnVuIHBhc3QuIEFcbi8vIHRleHQgdGFibGUncyBjZWxsIGRyYXdzIGl0cyB3b3JkcyB0aGUgc2FtZSB3YXksIGluc2lkZSBpdHMgcGFkZGluZy5cbmludGVyZmFjZSBQZGZUZXh0Qm94IHtcbiAgbGVmdDogbnVtYmVyO1xuICB0b3A6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgYm90dG9tOiBudW1iZXI7XG59XG5cbi8vIFdoZXJlIHRoZSBuZXh0IHBhcnQgb2YgYSB0ZXh0IGJsb2NrIHN0YXJ0cywgYW5kIHdoZXRoZXIgdGhlIHBhcnQganVzdCBkcmF3blxuLy8gd2FzIGN1dCBvZmYgYXQgdGhlIGJvdHRvbSBvZiBpdHMgYm94LlxuaW50ZXJmYWNlIFBkZlRleHRDdXJzb3Ige1xuICBjdXJzb3JZOiBudW1iZXI7XG4gIGN1dDogYm9vbGVhbjtcbn1cblxuLy8gQSB0ZXh0IHRhYmxlJ3MgY2VsbCBhcyBhdXRvVGFibGUgdGFrZXMgaXQuIEl0IHByaW50cyBubyB0ZXh0IG9mIGl0cyBvd246IHRoZVxuLy8gY2VsbCdzIHdvcmRzICh0ZXh0Q2VsbCkgYXJlIGRyYXduIGludG8gaXQgb25jZSBpdHMgZ3JpZCBsaW5lcyBhbmQgZmlsbCBhcmVcbi8vIChfZHJhd1RleHRDZWxsKS5cbmludGVyZmFjZSBQZGZUZXh0Q2VsbElucHV0IHtcbiAgY29udGVudDogc3RyaW5nO1xuICBjb2xTcGFuOiBudW1iZXI7XG4gIHJvd1NwYW46IG51bWJlcjtcbiAgdGV4dENlbGw6IFRleHRUYWJsZUNlbGw7XG4gIHN0eWxlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8vIEZpeGVkIGNvbHVtbiB3aWR0aHMsIGJ5IGNvbHVtbiBpbmRleCwgaW4gcG9pbnRzLCBhbmQgdGhlIHJpZ2h0IGFsaWdubWVudCBvZlxuLy8gYSBjb2x1bW4gb2YgZm9ybWF0dGVkIG51bWJlcnMuXG50eXBlIFBkZkNvbHVtblN0eWxlcyA9IFJlY29yZDxudW1iZXIsIHsgY2VsbFdpZHRoOiBudW1iZXI7IGhhbGlnbj86ICdyaWdodCcgfT47XG5cbi8vIEEgdGFibGUgYm9keSBjZWxsOiBwbGFpbiB0ZXh0LCBvciBhIG5vdGljZSByb3cncyBvbmUgY2VsbCBzcGFubmluZyBldmVyeVxuLy8gY29sdW1uLlxudHlwZSBQZGZUYWJsZUNlbGwgPSBzdHJpbmcgfCB7IGNvbnRlbnQ6IHN0cmluZzsgY29sU3Bhbj86IG51bWJlcjsgcm93U3Bhbj86IG51bWJlcjsgc3R5bGVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcblxuLy8gSG93IGZhciBhIHRhYmxlJ3MgZ3JvdXAgbGFiZWwgc3RlcHMgaW4gcGVyIGxldmVsLCBwb2ludHMuXG5jb25zdCBHUklEX0lOREVOVCA9IDg7XG5cbi8vIFdoYXQgYSBsaXN0J3Mgb3IgYSB0YWJsZSB0aWxlJ3MgdGFibGUgZHJhd3M6IGl0cyBoZWFkaW5nIHJvd3MsIGl0cyBib2R5XG4vLyByb3dzLCB3aGljaCBjb2x1bW5zIGhvbGQgZm9ybWF0dGVkIG51bWJlcnMsIGl0cyB0b3RhbHMgcm93IGFuZCBob3cgbWFueVxuLy8gcm93cyBpdHMgZmV0Y2ggbGVmdCBvdXQuXG5pbnRlcmZhY2UgUGRmVGFibGVQYXJ0cyB7XG4gIGhlYWQ6IFBkZlRhYmxlQ2VsbFtdW107XG4gIGNlbGxzOiBQZGZUYWJsZUNlbGxbXVtdO1xuICBudW1lcmljOiBib29sZWFuW107XG4gIGZvb3Q6IHN0cmluZ1tdIHwgbnVsbDtcbiAgb21pdHRlZDogbnVtYmVyO1xufVxuXG4vLyBUaGUgcm93cyBvZiBhIGxpc3QgdGhhdCBkaWQgbm90IGZpdCBpdHMgYm94LCBjYXJyaWVkIG9udG8gY29udGludWF0aW9uXG4vLyBwYWdlcyBhZnRlciBpdHMgcmVwb3J0IHBhZ2UuIHggYW5kIHcgYXJlIHRoZSBib3gncywgaW4gcG9pbnRzLCBhbmQgdGhlXG4vLyBjb2x1bW4gd2lkdGhzIGFuZCBhbGlnbm1lbnRzIGFyZSB0aGUgb25lcyB0aGUgb24tcGFnZSB0YWJsZSB3YXMgZHJhd24gd2l0aCxcbi8vIHNvIHRoZSB0YWJsZSByZWFkcyBhcyBvbmUgYWNyb3NzIHBhZ2VzLlxuaW50ZXJmYWNlIFBkZlRhYmxlT3ZlcmZsb3cge1xuICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudDtcbiAgLy8gVGhlIHRleHQgdGhlIGxpc3Qgd2FzIHNlYXJjaGVkIGJ5LCBmb3IgdGhlIGNvbnRpbnVhdGlvbiB0aXRsZS5cbiAgc2VhcmNoPzogc3RyaW5nO1xuICAvLyBUaGUgY3J1bWJzIG9mIGl0cyBkcmlsbCBwYXRoLCBmb3IgdGhlIGNvbnRpbnVhdGlvbiB0aXRsZS5cbiAgY3J1bWJzPzogc3RyaW5nW107XG4gIC8vIEEgdGFibGUgd2hvc2UgY29sdW1uIGZpbHRlcnMgbmFycm93ZWQgaXQsIGZvciB0aGUgY29udGludWF0aW9uIHRpdGxlLlxuICBmaWx0ZXJlZD86IGJvb2xlYW47XG4gIC8vIEhlYWRpbmcgcm93cywgdG9wIGZpcnN0OyBhIGxpc3QgaGFzIG9uZS5cbiAgaGVhZDogUGRmVGFibGVDZWxsW11bXTtcbiAgbnVtZXJpYzogYm9vbGVhbltdO1xuICByb3dzOiBQZGZUYWJsZUNlbGxbXVtdO1xuICBvbWl0dGVkOiBudW1iZXI7XG4gIC8vIFRoZSBsaXN0J3MgdG90YWxzIHJvdywgd2hpY2ggY2xvc2VzIHRoZSBsYXN0IGNvbnRpbnVhdGlvbiBwYWdlLlxuICBmb290OiBzdHJpbmdbXSB8IG51bGw7XG4gIHg6IG51bWJlcjtcbiAgdzogbnVtYmVyO1xuICBjb2x1bW5TdHlsZXM6IFBkZkNvbHVtblN0eWxlcztcbn1cblxuLy8gQnVpbGRzIHRoZSBQREYgY2xpZW50LXNpZGUgd2l0aCBqc3BkZi4gVGhlIHJlcG9ydCdzIHVuaXQgaXMgaW5jaGVzIGFuZCBQREZzXG4vLyBhcmUgcG9pbnRzIGF0IGV4YWN0bHkgNzIvaW5jaCwgc28gZWFjaCByZXBvcnQgcGFnZSBiZWNvbWVzIG9uZSBQREYgcGFnZSBvZlxuLy8gdGhlIGV4YWN0IHBoeXNpY2FsIHNpemUgYW5kIGNvbXBvbmVudHMgbGFuZCBhdCB0aGVpciBwcmVjaXNlIHBvc2l0aW9ucy5cbi8vIENoYXJ0cyBhcmUgcmVuZGVyZWQgdGhyb3VnaCBhbiBvZmZzY3JlZW4gRUNoYXJ0cyBpbnN0YW5jZSBhdCAzw5cgcGl4ZWxcbi8vIHJhdGlvIOKAlCBwaXhlbC1pZGVudGljYWwgdG8gdGhlIHNjcmVlbiwgY3Jpc3AgYXQgcHJpbnQgc2l6ZSDigJQgYW5kIHRhYmxlcyBhcmVcbi8vIGRyYXduIHdpdGgganNwZGYtYXV0b3RhYmxlLiBCb3RoIGxpYnJhcmllcyBsb2FkIGxhemlseSBpbnRvIHRoZWlyIG93biBjaHVua3MuXG4vL1xuLy8gQSBsaXN0IHRhYmxlIGlzIGZpdHRlZCB0byBpdHMgYm94IGJ5IGxheWluZyBpdCBvdXQgZmlyc3QsIG5ldmVyIGJ5IGFcbi8vIHJvdy1oZWlnaHQgZXN0aW1hdGUsIHNvIGl0IGNhbm5vdCBzcGlsbCBwYXN0IHRoZSBib3guIFRoZSByb3dzIHRoYXQgZG8gbm90XG4vLyBmaXQgY29udGludWUgb24gcGFnZXMgb2YgdGhlaXIgb3duIGFmdGVyIHRoZSByZXBvcnQgcGFnZSwgdW5kZXIgdGhlIHNhbWVcbi8vIGhlYWRlci9mb290ZXIgYW5kIHdpdGggdGhlIHNhbWUgY29sdW1uIHdpZHRocywgdXAgdG8gUERGX0xJU1RfUk9XUzsgYVxuLy8gbG9uZ2VyIHJlc3VsdCBlbmRzIGluIGEgcm93IHBvaW50aW5nIHRvIHRoZSBjb21wb25lbnQncyBDU1YgZXhwb3J0LlxuLy9cbi8vIEEgdGV4dCBibG9jaydzIHRhYmxlcyBhcmUgZHJhd24gYnkgYXV0b1RhYmxlIHRvbywgZnJvbSB0aGUgbGluZSBpdHMgd29yZHNcbi8vIHJlYWNoLCBpbiB0aGUgY29sdW1uIHdpZHRocyB0aGUgY2FudmFzIGdpdmVzIHRoZW0gKFJlcG9ydFRleHRMYXlvdXRTZXJ2aWNlKS5cbi8vIEEgdGV4dCBibG9jayBpcyBjdXQgYXQgdGhlIGJvdHRvbSBvZiBpdHMgYm94LCBhcyB0aGUgY2FudmFzIGNsaXBzIGl0LCBhbmRcbi8vIGJ1aWxkKCkgaGFuZHMgdGhlIGZpbGUgYmFjayB1bnNhdmVkIHdpdGggdGhlIGJsb2NrcyBpdCBjdXQsIHNvIHRoZSBleHBvcnRcbi8vIGNhbiBhc2sgYWJvdXQgdGhlbSBiZWZvcmUgaXQgc2F2ZXMuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0UGRmU2VydmljZSB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdGV4dExheW91dCA9IGluamVjdChSZXBvcnRUZXh0TGF5b3V0U2VydmljZSk7XG5cbiAgcHVibGljIGFzeW5jIGJ1aWxkKGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogUHJvbWlzZTxCdWlsdEV4cG9ydD4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLl9jb250ZXh0KGNvbGxlY3RlZCk7XG5cbiAgICB0aGlzLl90aXRsZVBhZ2UoY29udGV4dC5kb2MsIGNvbGxlY3RlZCwgY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSCk7XG5cbiAgICAvLyBUaGUgcGh5c2ljYWwgcGFnZSBudW1iZXIge3twYWdlLm51bWJlcn19IHByaW50czogcmVwb3J0IHBhZ2VzIGFuZFxuICAgIC8vIHRoZWlyIGNvbnRpbnVhdGlvbiBwYWdlcyBhbGlrZSwgdGhlIHRpdGxlIHBhZ2Ugbm90IGNvdW50ZWQuXG4gICAgbGV0IHBhZ2VOdW1iZXIgPSAwO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGNvbGxlY3RlZFBhZ2VdIG9mIGNvbGxlY3RlZC5wYWdlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IG92ZXJmbG93czogUGRmVGFibGVPdmVyZmxvd1tdID0gW107XG4gICAgICBwYWdlTnVtYmVyICs9IDE7XG5cbiAgICAgIGF3YWl0IHRoaXMuX3JlbmRlclBhZ2UoY29udGV4dCwgY29sbGVjdGVkUGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIsIG92ZXJmbG93cyk7XG5cbiAgICAgIC8vIEVhY2ggY29udGludWF0aW9uIGFwcGVuZHMgaXRzIHBhZ2VzIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LCBzb1xuICAgICAgLy8gdHdvIGxpc3RzIHRoYXQgb3ZlcmZsb3dlZCBvbiBvbmUgcGFnZSBmb2xsb3cgaXQgYmFjayB0byBiYWNrLlxuICAgICAgZm9yIChjb25zdCBvdmVyZmxvdyBvZiBvdmVyZmxvd3MpIHtcbiAgICAgICAgcGFnZU51bWJlciA9IGF3YWl0IHRoaXMuX3JlbmRlckNvbnRpbnVhdGlvbihjb250ZXh0LCBjb2xsZWN0ZWRQYWdlLnBhZ2UsIGluZGV4LCBwYWdlTnVtYmVyLCBvdmVyZmxvdyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG92ZXJmbG93czogWy4uLmNvbnRleHQudGV4dE92ZXJmbG93cy52YWx1ZXMoKV0sXG4gICAgICBvdmVyZmxvd05vdGU6IFBERl9PVkVSRkxPV19OT1RFLFxuICAgICAgc2F2ZTogKCkgPT4ge1xuICAgICAgICBjb250ZXh0LmRvYy5zYXZlKGAke3RoaXMuX3NsdWcoY29sbGVjdGVkLnJlcG9ydC5uYW1lKX0ucGRmYCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9jb250ZXh0KGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogUHJvbWlzZTxQZGZFeHBvcnRDb250ZXh0PiB7XG4gICAgY29uc3QgcmVwb3J0ID0gY29sbGVjdGVkLnJlcG9ydDtcbiAgICBjb25zdCB7IGpzUERGIH0gPSBhd2FpdCBpbXBvcnQoJ2pzcGRmJyk7XG4gICAgY29uc3QgYXV0b1RhYmxlID0gKGF3YWl0IGltcG9ydCgnanNwZGYtYXV0b3RhYmxlJykpLmRlZmF1bHQ7XG5cbiAgICBjb25zdCBwYWdlVyA9IHJlcG9ydC5wYWdlV2lkdGggKiBQVDtcbiAgICBjb25zdCBwYWdlSCA9IHJlcG9ydC5wYWdlSGVpZ2h0ICogUFQ7XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSBwYWdlVyA+PSBwYWdlSCA/ICdsYW5kc2NhcGUnIDogJ3BvcnRyYWl0JztcblxuICAgIHJldHVybiB7XG4gICAgICBkb2M6IG5ldyBqc1BERih7IG9yaWVudGF0aW9uLCB1bml0OiAncHQnLCBmb3JtYXQ6IFtwYWdlVywgcGFnZUhdIH0pLFxuICAgICAgYXV0b1RhYmxlLFxuICAgICAganNQREYsXG4gICAgICByZXBvcnQsXG4gICAgICB0aW1lem9uZTogcmVzb2x2ZVJlcG9ydFRpbWV6b25lKHJlcG9ydCksXG4gICAgICBmb3JtYXRDb250ZXh0OiBjb2xsZWN0ZWQuZm9ybWF0Q29udGV4dCxcbiAgICAgIHBhZ2VXLFxuICAgICAgcGFnZUgsXG4gICAgICBvcmllbnRhdGlvbixcbiAgICAgIG1hc3RlclZhbHVlczogdGhpcy5fcGRmVmFsdWVzKGNvbGxlY3RlZC5tYXN0ZXJWYWx1ZXMpLFxuICAgICAgZmlsdGVyRmllbGRzOiBjb2xsZWN0ZWQuZmlsdGVyRmllbGRzLFxuICAgICAgbWFzdGVyRmlsdGVyczogbGF5ZXJGaWx0ZXJGaWVsZHMoY29sbGVjdGVkLmZpbHRlckZpZWxkcywgcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSwgbnVsbCksXG4gICAgICB0ZXh0T3ZlcmZsb3dzOiBuZXcgTWFwKCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIE9uZSByZXBvcnQgcGFnZTogdGhlIGhlYWRlciBhbmQgZm9vdGVyIGZpcnN0LCB1bmRlciB0aGUgcGFnZSdzIG93blxuICAvLyBjb21wb25lbnRzLiBBIGxpc3QgdGhhdCBvdXRncm93cyBpdHMgYm94IGxlYXZlcyBpdHMgcmVtYWluaW5nIHJvd3MgaW5cbiAgLy8gb3ZlcmZsb3dzLiBUaGUgcGFnZSdzIHRleHQgZmlsbHMgaXRzIHZhbHVlIHRva2VucyB3aXRoIHRoZSBwYWdlJ3MgdmFsdWVzLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJQYWdlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29sbGVjdGVkUGFnZTogQ29sbGVjdGVkUGFnZSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcbiAgICBvdmVyZmxvd3M6IFBkZlRhYmxlT3ZlcmZsb3dbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkb2MgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgdG9rZW5zID0gdGhpcy5fdG9rZW5zKGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIpO1xuICAgIGNvbnN0IHBhZ2VUb2tlbnMgPSB7IC4uLnRva2VucywgdmFsdWVzOiB0aGlzLl9wZGZWYWx1ZXMoY29sbGVjdGVkUGFnZS52YWx1ZXMpIH07XG5cbiAgICBkb2MuYWRkUGFnZShbY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSF0sIGNvbnRleHQub3JpZW50YXRpb24pO1xuICAgIGF3YWl0IHRoaXMuX3JlbmRlck1hc3Rlcihjb250ZXh0LCBjb2xsZWN0ZWRQYWdlLnBhZ2UsIHRva2Vucyk7XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29sbGVjdGVkUGFnZS5jb21wb25lbnRzKSB7XG4gICAgICBpZiAoaXRlbS5jb21wb25lbnQudHlwZSAhPT0gJ3RleHQnKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3JlbmRlckNvbXBvbmVudChjb250ZXh0LCBpdGVtLCB0b2tlbnMsIG92ZXJmbG93cyk7XG4gICAgICB9IGVsc2UgaWYgKGF3YWl0IHRoaXMuX3JlbmRlclRleHQoY29udGV4dCwgaXRlbS5jb21wb25lbnQsIHBhZ2VUb2tlbnMpKSB7XG4gICAgICAgIHRoaXMuX3JlY29yZE92ZXJmbG93KGNvbnRleHQsIGl0ZW0uY29tcG9uZW50LCB0b2tlbnMucGFnZU5hbWUsIHBhZ2VUb2tlbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBoZWFkZXIgYW5kIGZvb3RlciwgdGhlaXIgdmFsdWUgdG9rZW5zIGZpbGxlZCB3aXRoIHRoZSBtYXN0ZXIncyB2YWx1ZXNcbiAgLy8gd2hpY2hldmVyIHBhZ2UgdGhleSBzaXQgb246IGEgcmVwb3J0IHBhZ2Ugb3IgYSBjb250aW51YXRpb24gcGFnZS4gVGhleVxuICAvLyByZWFkIG5vIHBhZ2UgZmlsdGVyOiBpdHMgdG9rZW4gcHJpbnRzIHRoZSBlbSBkYXNoIHRoZXJlLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJNYXN0ZXIoY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCwgcGFnZTogUmVwb3J0UGFnZSwgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHBhZ2UubWFzdGVySGlkZGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWFzdGVyVG9rZW5zID0geyAuLi50b2tlbnMsIHZhbHVlczogY29udGV4dC5tYXN0ZXJWYWx1ZXMsIGZpbHRlcnM6IGNvbnRleHQubWFzdGVyRmlsdGVycyB9O1xuXG4gICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgKGNvbnRleHQucmVwb3J0Lm1hc3Rlcj8uY29tcG9uZW50cyA/PyBbXSkuZmlsdGVyKGlzRHJhd24pKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5fcmVuZGVyVGV4dChjb250ZXh0LCBjb21wb25lbnQsIG1hc3RlclRva2VucykpIHtcbiAgICAgICAgdGhpcy5fcmVjb3JkT3ZlcmZsb3coY29udGV4dCwgY29tcG9uZW50LCBIRUFERVJfRk9PVEVSX05BTUUsIG1hc3RlclRva2Vucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gTGlzdHMgYSB0ZXh0IGJsb2NrIHRoYXQgd2FzIGN1dCwgdW5kZXIgdGhlIHBhZ2UgdGhlIGV4cG9ydCdzIG92ZXJmbG93IGdhdGVcbiAgLy8gbmFtZXMgaXQgYnkuIEEgYmxvY2sgY3V0IGFnYWluIG9uIGEgbGF0ZXIgcGFnZSAoYSBoZWFkZXIgb3IgZm9vdGVyKSBrZWVwc1xuICAvLyB0aGUgZmlyc3QgZW50cnkuXG4gIHByaXZhdGUgX3JlY29yZE92ZXJmbG93KFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgcGFnZTogc3RyaW5nLFxuICAgIHRva2VuczogVGV4dFRva2VuQ29udGV4dCxcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFjb250ZXh0LnRleHRPdmVyZmxvd3MuaGFzKGNvbXBvbmVudC5pZCkpIHtcbiAgICAgIGNvbnRleHQudGV4dE92ZXJmbG93cy5zZXQoY29tcG9uZW50LmlkLCB0ZXh0T3ZlcmZsb3coY29tcG9uZW50LCBwYWdlLCB0b2tlbnMpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF90aXRsZVBhZ2UoZG9jOiBhbnksIGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0LCBwYWdlVzogbnVtYmVyLCBwYWdlSDogbnVtYmVyKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDI4KTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgZG9jLnRleHQoY29sbGVjdGVkLnJlcG9ydC5uYW1lLCA0MCwgcGFnZUggKiAwLjM1KTtcblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDExKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjNTI2MDZkJyk7XG5cbiAgICBkb2MudGV4dChjb3ZlckxpbmVzKGNvbGxlY3RlZCkubWFwKChsaW5lKSA9PiB0aGlzLl9wZGZUZXh0KGxpbmUpKSwgNDAsIHBhZ2VIICogMC4zNSArIDI2KTtcbiAgfVxuXG4gIC8vIEEgdGV4dCBibG9jaywgbGFpZCBvdXQgYnkgaGFuZDoganNQREYgZHJhd3Mgc3RyaW5ncywgbm90IHJpY2ggdGV4dCwgc28gdGhlXG4gIC8vIHdvcmRzIGJldHdlZW4gaXRzIHRhYmxlcyBhcmUgZHJhd24gbGluZSBieSBsaW5lIChfZHJhd1BhcmFncmFwaHMpIGFuZCBlYWNoXG4gIC8vIHRhYmxlIGJ5IGF1dG9UYWJsZSBmcm9tIHRoZSBsaW5lIHRoZSB3b3JkcyBhYm92ZSBpdCByZWFjaFxuICAvLyAoX2RyYXdUZXh0VGFibGUpLiBPbmx5IGEgYmxvY2sgd2l0aCBhIHRhYmxlIGlzIG1lYXN1cmVkLCBmb3IgdGhlIGVkZ2VzXG4gIC8vIGFuZCBjb2x1bW4gd2lkdGhzIHRoZSBjYW52YXMgZ2l2ZXMgaXRzIHRhYmxlcy4gV2hhdGV2ZXIgcnVucyBwYXN0XG4gIC8vIHRoZSBibG9jaydzIGhlaWdodCBpcyBsZWZ0IG9mZiDigJQgdGhlIGNhbnZhcyBjbGlwcyB0aGUgYmxvY2sgdGhlcmUgdG9vLlxuICAvLyBSZXR1cm5zIHdoZXRoZXIgYW55dGhpbmcgd2FzLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJUZXh0KFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0LFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBib3ggPSB0aGlzLl90ZXh0Qm94KGNvbXBvbmVudCk7XG4gICAgY29uc3QgYmxvY2tzID0gdGV4dEJsb2Nrcyhjb21wb25lbnQuY29uZmlnPy5odG1sID8/ICcnLCB0b2tlbnMpO1xuICAgIGNvbnN0IGxheW91dCA9IGJsb2Nrcy5zb21lKChibG9jaykgPT4gYmxvY2sua2luZCA9PT0gJ3RhYmxlJylcbiAgICAgID8gYXdhaXQgdGhpcy5fdGV4dExheW91dC5tZWFzdXJlKGNvbXBvbmVudCwgdG9rZW5zKVxuICAgICAgOiBudWxsO1xuICAgIGxldCBjdXJzb3JZID0gYm94LnRvcDtcbiAgICBsZXQgdGFibGVJbmRleCA9IDA7XG4gICAgLy8gVGhlIGN1cnNvciBzaXRzIG9uIGEgdGFibGUncyBib3R0b20gbWFyZ2luLCBub3RoaW5nIGRyYXduIHNpbmNlOiB0aGVcbiAgICAvLyBuZXh0IHRhYmxlJ3MgdG9wIG1hcmdpbiBpcyB0aGUgc2FtZSBzcGFjZSwgYXMgdHdvIGJsb2NrIG1hcmdpbnMgdGhhdFxuICAgIC8vIG1lZXQgY29sbGFwc2UgaW50byBvbmUgb24gdGhlIGNhbnZhcy5cbiAgICBsZXQgb25NYXJnaW4gPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgYmxvY2sgb2YgYmxvY2tzKSB7XG4gICAgICBjb25zdCBkcmF3biA9IGJsb2NrLmtpbmQgPT09ICd0ZXh0J1xuICAgICAgICA/IHRoaXMuX2RyYXdQYXJhZ3JhcGhzKGNvbnRleHQuZG9jLCBibG9jay5wYXJhZ3JhcGhzLCBib3gsIGN1cnNvclkpXG4gICAgICAgIDogdGhpcy5fZHJhd1RleHRUYWJsZShcbiAgICAgICAgICBjb250ZXh0LCBibG9jay50YWJsZSwgbGF5b3V0Py50YWJsZXNbdGFibGVJbmRleCsrXSA/PyBudWxsLCBib3gsXG4gICAgICAgICAgb25NYXJnaW4gPyBjdXJzb3JZIDogY3Vyc29yWSArIFRFWFRfVEFCTEVfTUFSR0lOLFxuICAgICAgICApO1xuXG4gICAgICBpZiAoZHJhd24uY3V0KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjdXJzb3JZID0gZHJhd24uY3Vyc29yWTtcbiAgICAgIG9uTWFyZ2luID0gYmxvY2sua2luZCA9PT0gJ3RhYmxlJyB8fCAob25NYXJnaW4gJiYgIWJsb2NrLnBhcmFncmFwaHMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBXaGVyZSBhIHRleHQgYmxvY2sncyB3b3JkcyBnbzogaW5zaWRlIGl0cyBwYWRkaW5nLCBlYWNoIGVkZ2UgMS84XCIgdW5sZXNzXG4gIC8vIHNldC5cbiAgcHJpdmF0ZSBfdGV4dEJveChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IFBkZlRleHRCb3gge1xuICAgIGNvbnN0IHBhZGRpbmcgPSBjb21wb25lbnQuY29uZmlnPy5wYWRkaW5nO1xuICAgIGNvbnN0IGluc2V0ID0gKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpID0+ICh2YWx1ZSA/PyBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HKSAqIFBUO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IGNvbXBvbmVudC54ICogUFQgKyBpbnNldChwYWRkaW5nPy5sZWZ0KSxcbiAgICAgIHRvcDogY29tcG9uZW50LnkgKiBQVCArIGluc2V0KHBhZGRpbmc/LnRvcCksXG4gICAgICB3aWR0aDogY29tcG9uZW50LncgKiBQVCAtIGluc2V0KHBhZGRpbmc/LmxlZnQpIC0gaW5zZXQocGFkZGluZz8ucmlnaHQpLFxuICAgICAgYm90dG9tOiAoY29tcG9uZW50LnkgKyBjb21wb25lbnQuaCkgKiBQVCAtIGluc2V0KHBhZGRpbmc/LmJvdHRvbSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIFBhcmFncmFwaHMgZHJhd24gbGluZSBieSBsaW5lIGZyb20gY3Vyc29yWSBkb3duOiBlYWNoIG9uZSdzIHJ1bnMgYXJlIGJyb2tlblxuICAvLyBpbnRvIHdvcmRzLCB3cmFwcGVkIHRvIHRoZSBib3gncyB3aWR0aCBhbmQgZHJhd24gd29yZCBieSB3b3JkIGluIHRoZWlyIG93blxuICAvLyBmb250LCBzaXplIGFuZCBjb2xvciwgYSBsaXN0IGl0ZW0ncyBtYXJrZXIgaHVuZyBpbiBpdHMgaW5kZW50LiBUaGUgZmlyc3RcbiAgLy8gbGluZSB0aGF0IHdvdWxkIHJ1biBwYXN0IHRoZSBib3gncyBib3R0b20gZW5kcyB0aGUgZHJhd2luZywgY3V0LlxuICBwcml2YXRlIF9kcmF3UGFyYWdyYXBocyhkb2M6IGFueSwgcGFyYWdyYXBoczogVGV4dFBhcmFncmFwaFtdLCBib3g6IFBkZlRleHRCb3gsIGN1cnNvclk6IG51bWJlcik6IFBkZlRleHRDdXJzb3Ige1xuICAgIGxldCB5ID0gY3Vyc29yWTtcbiAgICBsZXQgbGlzdE51bWJlciA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHBhcmFncmFwaCBvZiBwYXJhZ3JhcGhzKSB7XG4gICAgICBsaXN0TnVtYmVyID0gcGFyYWdyYXBoLmJ1bGxldCA9PT0gJ251bWJlcicgPyBsaXN0TnVtYmVyICsgMSA6IDA7XG4gICAgICBjb25zdCBpbmRlbnQgPSBwYXJhZ3JhcGguYnVsbGV0ID8gTElTVF9JTkRFTlQgOiAwO1xuICAgICAgY29uc3QgbGluZXMgPSB0aGlzLl93cmFwKGRvYywgcGFyYWdyYXBoLCBib3gud2lkdGggLSBpbmRlbnQpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtsaW5lSW5kZXgsIGxpbmVdIG9mIGxpbmVzLmVudHJpZXMoKSkge1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5fbGluZVNpemUocGFyYWdyYXBoLCBsaW5lKTtcbiAgICAgICAgaWYgKHkgKyBzaXplICogVEVYVF9MSU5FX0hFSUdIVCA+IGJveC5ib3R0b20gKyAwLjUpIHtcbiAgICAgICAgICByZXR1cm4geyBjdXJzb3JZOiB5LCBjdXQ6IHRydWUgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5lSW5kZXggPT09IDAgJiYgcGFyYWdyYXBoLmJ1bGxldCkge1xuICAgICAgICAgIHRoaXMuX2ZvbnQoZG9jLCBsaW5lWzBdPy5ydW4gPz8geyB0ZXh0OiAnJyB9LCBzaXplKTtcbiAgICAgICAgICBkb2MudGV4dChwYXJhZ3JhcGguYnVsbGV0ID09PSAnbnVtYmVyJyA/IGAke2xpc3ROdW1iZXJ9LmAgOiAn4oCiJywgYm94LmxlZnQsIHkgKyBzaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2RyYXdMaW5lKGRvYywgbGluZSwgcGFyYWdyYXBoLmFsaWduLCBib3gubGVmdCArIGluZGVudCwgYm94LndpZHRoIC0gaW5kZW50LCB5ICsgc2l6ZSk7XG4gICAgICAgIHkgKz0gc2l6ZSAqIFRFWFRfTElORV9IRUlHSFQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEFuIGVtcHR5IHBhcmFncmFwaCBpcyBzdGlsbCBhIGxpbmUuXG4gICAgICBpZiAoIWxpbmVzLmxlbmd0aCkge1xuICAgICAgICB5ICs9IERFRkFVTFRfVEVYVF9TSVpFICogVEVYVF9MSU5FX0hFSUdIVDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBjdXJzb3JZOiB5LCBjdXQ6IGZhbHNlIH07XG4gIH1cblxuICAvLyBIb3cgZmFyIF9kcmF3UGFyYWdyYXBocyB0YWtlcyBpdHMgY3Vyc29yIGRvd24gZHJhd2luZyB0aGUgcGFyYWdyYXBocyB3aG9sZVxuICAvLyBhdCBhIHdpZHRoLlxuICBwcml2YXRlIF9wYXJhZ3JhcGhzSGVpZ2h0KGRvYzogYW55LCBwYXJhZ3JhcGhzOiBUZXh0UGFyYWdyYXBoW10sIHdpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBwYXJhZ3JhcGhzLnJlZHVjZSgoaGVpZ2h0LCBwYXJhZ3JhcGgpID0+IHtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5fd3JhcChkb2MsIHBhcmFncmFwaCwgd2lkdGggLSAocGFyYWdyYXBoLmJ1bGxldCA/IExJU1RfSU5ERU5UIDogMCkpO1xuXG4gICAgICByZXR1cm4gaGVpZ2h0ICsgKGxpbmVzLmxlbmd0aFxuICAgICAgICA/IGxpbmVzLnJlZHVjZSgoc3VtLCBsaW5lKSA9PiBzdW0gKyB0aGlzLl9saW5lU2l6ZShwYXJhZ3JhcGgsIGxpbmUpICogVEVYVF9MSU5FX0hFSUdIVCwgMClcbiAgICAgICAgOiBERUZBVUxUX1RFWFRfU0laRSAqIFRFWFRfTElORV9IRUlHSFQpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLy8gQSBsaW5lJ3MgZm9udCBzaXplOiBpdHMgbGFyZ2VzdCB3b3JkJ3MsIGFuZCBuZXZlciB1bmRlciBpdHMgcGFyYWdyYXBoJ3NcbiAgLy8gZmlyc3QgcnVuJ3MuXG4gIHByaXZhdGUgX2xpbmVTaXplKHBhcmFncmFwaDogVGV4dFBhcmFncmFwaCwgbGluZTogUGRmV29yZFtdKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoLi4ubGluZS5tYXAoKHdvcmQpID0+IHdvcmQuc2l6ZSksIHBhcmFncmFwaC5ydW5zWzBdPy5mb250U2l6ZSA/PyBERUZBVUxUX1RFWFRfU0laRSk7XG4gIH1cblxuICAvLyBPbmUgd3JhcHBlZCBsaW5lIG9uIGl0cyBiYXNlbGluZSwgYWxpZ25lZCB3aXRoaW4gdGhlIHdpZHRoIGZyb20gbGVmdC5cbiAgcHJpdmF0ZSBfZHJhd0xpbmUoXG4gICAgZG9jOiBhbnksXG4gICAgbGluZTogUGRmV29yZFtdLFxuICAgIGFsaWduOiBUZXh0UGFyYWdyYXBoWydhbGlnbiddLFxuICAgIGxlZnQ6IG51bWJlciwgd2lkdGg6IG51bWJlciwgYmFzZWxpbmU6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgbGluZVdpZHRoID0gbGluZS5yZWR1Y2UoKHN1bSwgd29yZCkgPT4gc3VtICsgd29yZC53aWR0aCwgMCk7XG4gICAgbGV0IHggPSBsZWZ0ICsgdGhpcy5fYWxpZ25PZmZzZXQoYWxpZ24sIHdpZHRoLCBsaW5lV2lkdGgpO1xuXG4gICAgZm9yIChjb25zdCB3b3JkIG9mIGxpbmUpIHtcbiAgICAgIHRoaXMuX2RyYXdXb3JkKGRvYywgd29yZCwgeCwgYmFzZWxpbmUpO1xuICAgICAgeCArPSB3b3JkLndpZHRoO1xuICAgIH1cbiAgfVxuXG4gIC8vIEEgdGFibGUgaW4gYSB0ZXh0IGJsb2NrLCBkcmF3biBieSBhdXRvVGFibGUgZnJvbSB0b3AgKF9yZW5kZXJUZXh0IHB1dHMgaXRcbiAgLy8gVEVYVF9UQUJMRV9NQVJHSU4gdW5kZXIgdGhlIGxpbmUgdGhlIHdvcmRzIGFib3ZlIGl0IHJlYWNoKSwgaW4gdGhlIG9uZVxuICAvLyBsb29rIGV2ZXJ5IHJlbmRlcmVyIGRyYXdzIChURVhUX1RBQkxFXyogaW4gdGV4dC50cykuIEl0cyBsZWZ0IGVkZ2UsIHdpZHRoXG4gIC8vIGFuZCBjb2x1bW4gd2lkdGhzIGFyZSB0aGUgY2FudmFzJ3MgKGxheW91dCksIGVsc2UgdGhlIGJveCdzIHdpZHRoIHNwbGl0XG4gIC8vIGV2ZW5seS4gQSByb3cgaXMgYXMgdGFsbCBhcyBpdHMgY2VsbHMnIHdvcmRzIHdyYXBwZWQgYXMgX2RyYXdQYXJhZ3JhcGhzXG4gIC8vIHdyYXBzIHRoZW0sIGFuZCB0aGUgd29yZHMgYXJlIGRyYXduIGludG8gZWFjaCBjZWxsIG9uY2UgYXV0b1RhYmxlIGhhc1xuICAvLyBkcmF3biBpdHMgZ3JpZCBsaW5lcyBhbmQgZmlsbCAoX2RyYXdUZXh0Q2VsbCksIHNvIHRoZXkga2VlcCB0aGVpciBydW5zJ1xuICAvLyBmb250cyBhbmQgY29sb3JzLiBPbmx5IHRoZSByb3dzIHRoZSBib3ggaG9sZHMgYXJlIGRyYXduLCBhbmQgYSB0YWJsZSB0aGF0XG4gIC8vIGxvc2VzIGFueSBpcyBjdXQuIFRoZSBjdXJzb3IgaXQgbGVhdmVzIGlzIFRFWFRfVEFCTEVfTUFSR0lOIHVuZGVyIGl0LlxuICBwcml2YXRlIF9kcmF3VGV4dFRhYmxlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgdGFibGU6IFRleHRUYWJsZSxcbiAgICBsYXlvdXQ6IFRleHRUYWJsZUxheW91dCB8IG51bGwsXG4gICAgYm94OiBQZGZUZXh0Qm94LFxuICAgIHRvcDogbnVtYmVyLFxuICApOiBQZGZUZXh0Q3Vyc29yIHtcbiAgICBpZiAodG9wID49IGJveC5ib3R0b20pIHtcbiAgICAgIHJldHVybiB7IGN1cnNvclk6IHRvcCwgY3V0OiB0cnVlIH07XG4gICAgfVxuXG4gICAgY29uc3QgbGVmdCA9IGJveC5sZWZ0ICsgKGxheW91dD8ubGVmdCA/PyAwKSAqIFBUO1xuICAgIGNvbnN0IHdpZHRoID0gbGF5b3V0ID8gbGF5b3V0LndpZHRoICogUFQgOiBib3gud2lkdGg7XG4gICAgY29uc3QgY29sdW1uV2lkdGhzID0gbGF5b3V0Py5jb2x1bW5XaWR0aHMubGVuZ3RoID09PSB0YWJsZS5jb2x1bW5zXG4gICAgICA/IGxheW91dC5jb2x1bW5XaWR0aHMubWFwKChjb2x1bW5XaWR0aCkgPT4gY29sdW1uV2lkdGggKiBQVClcbiAgICAgIDogQXJyYXkuZnJvbSh7IGxlbmd0aDogdGFibGUuY29sdW1ucyB9LCAoKSA9PiB3aWR0aCAvIHRhYmxlLmNvbHVtbnMpO1xuICAgIGNvbnN0IGJvZHkgPSB0YWJsZS5yb3dzLm1hcCgocm93KSA9PiByb3cuY2VsbHMubWFwKChjZWxsKSA9PiB0aGlzLl90ZXh0Q2VsbElucHV0KGNvbnRleHQuZG9jLCBjZWxsLCBjb2x1bW5XaWR0aHMpKSk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX3RleHRUYWJsZU9wdGlvbnMoY29udGV4dCwgY29sdW1uV2lkdGhzLCBsZWZ0LCB0b3AsIHdpZHRoLCBib3guYm90dG9tKTtcbiAgICBjb25zdCBmaXQgPSB0aGlzLl90ZXh0VGFibGVGaXQoY29udGV4dCwgeyAuLi5vcHRpb25zLCBib2R5IH0pO1xuXG4gICAgaWYgKGZpdCkge1xuICAgICAgdGhpcy5fZHJhd1RhYmxlKGNvbnRleHQsIHsgLi4ub3B0aW9ucywgYm9keTogdGhpcy5fa2VwdFJvd3MoYm9keSwgZml0KSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY3Vyc29yWTogZml0ID8gY29udGV4dC5kb2MubGFzdEF1dG9UYWJsZS5maW5hbFkgKyBURVhUX1RBQkxFX01BUkdJTiA6IHRvcCxcbiAgICAgIGN1dDogZml0IDwgdGFibGUucm93cy5sZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gIC8vIEEgdGV4dCB0YWJsZSdzIGNlbGwgYXMgYXV0b1RhYmxlIHRha2VzIGl0OiBpdHMgc3BhbnMgYW5kIGZpbGwgYW5kLCB3aGVuIGl0XG4gIC8vIGlzIG9uZSByb3cgdGFsbCwgdGhlIGhlaWdodCBpdHMgd29yZHMgbmVlZCBhdCB0aGUgd2lkdGggaXQgc3BhbnMuIEEgY2VsbFxuICAvLyB0aGF0IHNwYW5zIHJvd3Mgc2hhcmVzIHRoZWlycy5cbiAgcHJpdmF0ZSBfdGV4dENlbGxJbnB1dChkb2M6IGFueSwgY2VsbDogVGV4dFRhYmxlQ2VsbCwgY29sdW1uV2lkdGhzOiBudW1iZXJbXSk6IFBkZlRleHRDZWxsSW5wdXQge1xuICAgIGNvbnN0IHBhZGRpbmcgPSBURVhUX1RBQkxFX0NFTExfUEFERElORztcbiAgICBjb25zdCB3aWR0aCA9IGNvbHVtbldpZHRoc1xuICAgICAgLnNsaWNlKGNlbGwuY29sdW1uLCBjZWxsLmNvbHVtbiArIGNlbGwuY29sU3BhbilcbiAgICAgIC5yZWR1Y2UoKHN1bSwgY29sdW1uV2lkdGgpID0+IHN1bSArIGNvbHVtbldpZHRoLCAwKSAtIDIgKiBwYWRkaW5nLmhvcml6b250YWw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogJycsXG4gICAgICBjb2xTcGFuOiBjZWxsLmNvbFNwYW4sXG4gICAgICByb3dTcGFuOiBjZWxsLnJvd1NwYW4sXG4gICAgICB0ZXh0Q2VsbDogY2VsbCxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAuLi4oY2VsbC5maWxsID8geyBmaWxsQ29sb3I6IGNlbGwuZmlsbCB9IDoge30pLFxuICAgICAgICAuLi4oY2VsbC5yb3dTcGFuID09PSAxXG4gICAgICAgICAgPyB7IG1pbkNlbGxIZWlnaHQ6IHRoaXMuX3BhcmFncmFwaHNIZWlnaHQoZG9jLCBjZWxsLnBhcmFncmFwaHMsIHdpZHRoKSArIDIgKiBwYWRkaW5nLnZlcnRpY2FsIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRoZSBhdXRvVGFibGUgb3B0aW9ucyBhIHRleHQgdGFibGUncyBkcnkgcnVuIGFuZCBpdHMgZHJhdyBzaGFyZS4gRXZlcnlcbiAgLy8gY29sdW1uIGlzIGxpc3RlZCBhbmQgZml4ZWQgYXQgaXRzIHdpZHRoOiBhdXRvVGFibGUgd291bGQgb3RoZXJ3aXNlIGNvdW50XG4gIC8vIHRoZSBjb2x1bW5zIG9mIHRoZSBmaXJzdCByb3csIHdoaWNoIG1heSBiZSBuYXJyb3dlciB0aGFuIHRoZSBncmlkLiBBIHJvd1xuICAvLyBpcyBuZXZlciBzcGxpdCBhdCB0aGUgYm94J3MgYm90dG9tOiBpdCBmaXRzIHdob2xlIG9yIG1vdmVzIHBhc3QgaXQuIGJvdHRvbVxuICAvLyBpcyB0aGUgYm94J3MuXG4gIHByaXZhdGUgX3RleHRUYWJsZU9wdGlvbnMoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBjb2x1bW5XaWR0aHM6IG51bWJlcltdLFxuICAgIGxlZnQ6IG51bWJlciwgdG9wOiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgcGFkZGluZyA9IFRFWFRfVEFCTEVfQ0VMTF9QQURESU5HO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW1lOiAncGxhaW4nLFxuICAgICAgY29sdW1uczogY29sdW1uV2lkdGhzLm1hcCgoXywgaW5kZXgpID0+ICh7IGRhdGFLZXk6IGluZGV4IH0pKSxcbiAgICAgIHN0YXJ0WTogdG9wLFxuICAgICAgbWFyZ2luOiB7IGxlZnQsIHJpZ2h0OiBjb250ZXh0LnBhZ2VXIC0gbGVmdCAtIHdpZHRoLCBib3R0b206IGNvbnRleHQucGFnZUggLSBib3R0b20gfSxcbiAgICAgIHRhYmxlV2lkdGg6IHdpZHRoLFxuICAgICAgY29sdW1uU3R5bGVzOiBPYmplY3QuZnJvbUVudHJpZXMoY29sdW1uV2lkdGhzLm1hcCgoY2VsbFdpZHRoLCBpbmRleCkgPT4gW2luZGV4LCB7IGNlbGxXaWR0aCB9XSkpLFxuICAgICAgcm93UGFnZUJyZWFrOiAnYXZvaWQnLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIGZvbnQ6ICdoZWx2ZXRpY2EnLFxuICAgICAgICBmb250U3R5bGU6ICdub3JtYWwnLFxuICAgICAgICBmb250U2l6ZTogREVGQVVMVF9URVhUX1NJWkUsXG4gICAgICAgIGNlbGxQYWRkaW5nOiB7XG4gICAgICAgICAgdG9wOiBwYWRkaW5nLnZlcnRpY2FsLCByaWdodDogcGFkZGluZy5ob3Jpem9udGFsLCBib3R0b206IHBhZGRpbmcudmVydGljYWwsIGxlZnQ6IHBhZGRpbmcuaG9yaXpvbnRhbCxcbiAgICAgICAgfSxcbiAgICAgICAgbGluZUNvbG9yOiBURVhUX1RBQkxFX0JPUkRFUl9DT0xPUixcbiAgICAgICAgbGluZVdpZHRoOiBURVhUX1RBQkxFX0JPUkRFUl9XSURUSCxcbiAgICAgICAgdmFsaWduOiAnbWlkZGxlJyxcbiAgICAgICAgdGV4dENvbG9yOiBERUZBVUxUX1RFWFRfQ09MT1IsXG4gICAgICB9LFxuICAgICAgZGlkRHJhd0NlbGw6IChob29rOiBhbnkpID0+IHRoaXMuX2RyYXdUZXh0Q2VsbChob29rKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gSG93IG1hbnkgb2YgYSB0ZXh0IHRhYmxlJ3Mgcm93cyBpdHMgYm94IGhvbGRzOiB0aGUgcm93cyBhdXRvVGFibGUgZHJhd3NcbiAgLy8gd2hvbGUgb24gdGhlIGZpcnN0IHBhZ2Ugd2hlbiBpdCBsYXlzIHRoZSB0YWJsZSBvdXQgb24gYSBzY3JhdGNoIGRvY3VtZW50XG4gIC8vIG9mIHRoZSBzYW1lIHBhZ2Ugc2l6ZSwgYXMgX21lYXN1cmUgZG9lcyBmb3IgYSBsaXN0LiBBIHJvdyB0YWxsZXIgdGhhbiBhXG4gIC8vIHBhZ2UgaXMgc3BsaXQgYWNyb3NzIHBhZ2VzIHJhdGhlciB0aGFuIG1vdmVkLCBzbyBpdCBkb2VzIG5vdCBjb3VudC5cbiAgcHJpdmF0ZSBfdGV4dFRhYmxlRml0KGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogbnVtYmVyIHtcbiAgICBjb25zdCBzY3JhdGNoID0gdGhpcy5fc2NyYXRjaERvY3VtZW50KGNvbnRleHQpO1xuICAgIGxldCBmaXQgPSAwO1xuXG4gICAgY29udGV4dC5hdXRvVGFibGUoc2NyYXRjaCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGRpZERyYXdDZWxsOiAoaG9vazogYW55KSA9PiB7XG4gICAgICAgIGlmIChzY3JhdGNoLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXIgPT09IDEgJiYgIWhvb2sucm93LnNwYW5zTXVsdGlwbGVQYWdlcykge1xuICAgICAgICAgIGZpdCA9IE1hdGgubWF4KGZpdCwgaG9vay5yb3cuaW5kZXggKyAxKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmaXQ7XG4gIH1cblxuICAvLyBUaGUgZmlyc3QgYGZpdGAgcm93cywgYSBjZWxsIHRoYXQgc3BhbnMgZG93biBwYXN0IHRoZSBsYXN0IG9mIHRoZW0gY3V0XG4gIC8vIHRoZXJlLlxuICBwcml2YXRlIF9rZXB0Um93cyhib2R5OiBQZGZUZXh0Q2VsbElucHV0W11bXSwgZml0OiBudW1iZXIpOiBQZGZUZXh0Q2VsbElucHV0W11bXSB7XG4gICAgcmV0dXJuIGJvZHkuc2xpY2UoMCwgZml0KS5tYXAoKHJvdykgPT4gcm93Lm1hcCgoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHJvd1NwYW4gPSBNYXRoLm1pbihpbnB1dC5yb3dTcGFuLCBmaXQgLSBpbnB1dC50ZXh0Q2VsbC5yb3cpO1xuXG4gICAgICByZXR1cm4gcm93U3BhbiA9PT0gaW5wdXQucm93U3BhbiA/IGlucHV0IDogeyAuLi5pbnB1dCwgcm93U3BhbiB9O1xuICAgIH0pKTtcbiAgfVxuXG4gIC8vIEEgdGV4dCB0YWJsZSBjZWxsJ3Mgd29yZHMsIGRyYXduIG9uY2UgYXV0b1RhYmxlIGhhcyBkcmF3biB0aGUgY2VsbDogaW5zaWRlXG4gIC8vIGl0cyBwYWRkaW5nLCB3cmFwcGVkIHRvIGl0cyB3aWR0aCBhbmQgcGxhY2VkIGJ5IGl0cyB2ZXJ0aWNhbCBhbGlnbm1lbnQsIHRoZVxuICAvLyBtaWRkbGUgdW5sZXNzIHNldC4gTGluZXMgcGFzdCB0aGUgY2VsbCBhcmUgbGVmdCBvZmYuXG4gIHByaXZhdGUgX2RyYXdUZXh0Q2VsbChob29rOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBjZWxsOiBUZXh0VGFibGVDZWxsIHwgdW5kZWZpbmVkID0gaG9vay5jZWxsLnJhdz8udGV4dENlbGw7XG4gICAgaWYgKCFjZWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBob29rLmNlbGw7XG4gICAgY29uc3QgYm94OiBQZGZUZXh0Qm94ID0ge1xuICAgICAgbGVmdDogeCArIGhvb2suY2VsbC5wYWRkaW5nKCdsZWZ0JyksXG4gICAgICB0b3A6IHkgKyBob29rLmNlbGwucGFkZGluZygndG9wJyksXG4gICAgICB3aWR0aDogd2lkdGggLSBob29rLmNlbGwucGFkZGluZygnaG9yaXpvbnRhbCcpLFxuICAgICAgYm90dG9tOiB5ICsgaGVpZ2h0IC0gaG9vay5jZWxsLnBhZGRpbmcoJ2JvdHRvbScpLFxuICAgIH07XG4gICAgY29uc3Qgc3BhcmUgPSBNYXRoLm1heCgwLCBib3guYm90dG9tIC0gYm94LnRvcCAtIHRoaXMuX3BhcmFncmFwaHNIZWlnaHQoaG9vay5kb2MsIGNlbGwucGFyYWdyYXBocywgYm94LndpZHRoKSk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gY2VsbC52YWxpZ24gPT09ICd0b3AnID8gMCA6IChjZWxsLnZhbGlnbiA9PT0gJ2JvdHRvbScgPyBzcGFyZSA6IHNwYXJlIC8gMik7XG5cbiAgICB0aGlzLl9kcmF3UGFyYWdyYXBocyhob29rLmRvYywgY2VsbC5wYXJhZ3JhcGhzLCBib3gsIGJveC50b3AgKyBvZmZzZXQpO1xuICB9XG5cbiAgLy8gQnJlYWsgYSBwYXJhZ3JhcGgncyBydW5zIGludG8gbGluZXMgb2YgbWVhc3VyZWQgd29yZHMgdGhhdCBmaXQgdGhlIHdpZHRoLlxuICAvLyBBIHdvcmQga2VlcHMgaXRzIHRyYWlsaW5nIHNwYWNlIHNvIHNwYWNpbmcgc3Vydml2ZXMgcnVuIGJvdW5kYXJpZXMuIEFcbiAgLy8gbm8tYnJlYWsgc3BhY2UgaXMgcGFydCBvZiBpdHMgd29yZCwgbmV2ZXIgYSBicmVhayBiZXR3ZWVuIHR3bzogYSBudW1iZXJcbiAgLy8gZ3JvdXBlZCB3aXRoIG9uZSAoZnItQ0EncyB0aG91c2FuZHMsIG9yIGEgbmFycm93IHNwYWNlIF9wZGZUZXh0IHR1cm5lZFxuICAvLyBpbnRvIG9uZSkgc3RheXMgb24gb25lIGxpbmUuXG4gIHByaXZhdGUgX3dyYXAoZG9jOiBhbnksIHBhcmFncmFwaDogVGV4dFBhcmFncmFwaCwgd2lkdGg6IG51bWJlcik6IFBkZldvcmRbXVtdIHtcbiAgICBjb25zdCBsaW5lczogUGRmV29yZFtdW10gPSBbXTtcbiAgICBsZXQgbGluZTogUGRmV29yZFtdID0gW107XG4gICAgbGV0IGxpbmVXaWR0aCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHJ1biBvZiBwYXJhZ3JhcGgucnVucykge1xuICAgICAgY29uc3Qgc2l6ZSA9IHJ1bi5mb250U2l6ZSA/PyBERUZBVUxUX1RFWFRfU0laRTtcbiAgICAgIHRoaXMuX2ZvbnQoZG9jLCBydW4sIHNpemUpO1xuXG4gICAgICBmb3IgKGNvbnN0IHRleHQgb2YgcnVuLnRleHQubWF0Y2goLyg/OlteXFxzXXxcXHUwMGEwKStbXlxcU1xcdTAwYTBdKnxbXlxcU1xcdTAwYTBdKy9nKSA/PyBbXSkge1xuICAgICAgICBjb25zdCB3b3JkV2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKHRleHQpO1xuXG4gICAgICAgIGlmIChsaW5lLmxlbmd0aCAmJiBsaW5lV2lkdGggKyB3b3JkV2lkdGggLSB0aGlzLl90cmFpbGluZ1NwYWNlKGRvYywgdGV4dCkgPiB3aWR0aCkge1xuICAgICAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgbGluZSA9IFtdO1xuICAgICAgICAgIGxpbmVXaWR0aCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBsaW5lLnB1c2goeyBydW4sIHRleHQsIHNpemUsIHdpZHRoOiB3b3JkV2lkdGggfSk7XG4gICAgICAgIGxpbmVXaWR0aCArPSB3b3JkV2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxpbmUubGVuZ3RoKSB7XG4gICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcztcbiAgfVxuXG4gIHByaXZhdGUgX2RyYXdXb3JkKGRvYzogYW55LCB3b3JkOiBQZGZXb3JkLCB4OiBudW1iZXIsIGJhc2VsaW5lOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBydW4gPSB3b3JkLnJ1bjtcblxuICAgIGlmIChydW4uaGlnaGxpZ2h0KSB7XG4gICAgICBkb2Muc2V0RmlsbENvbG9yKHJ1bi5oaWdobGlnaHQpO1xuICAgICAgZG9jLnJlY3QoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjksIHdvcmQud2lkdGgsIHdvcmQuc2l6ZSAqIDEuMTUsICdGJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fZm9udChkb2MsIHJ1biwgd29yZC5zaXplKTtcbiAgICBkb2MudGV4dCh3b3JkLnRleHQsIHgsIGJhc2VsaW5lKTtcblxuICAgIGNvbnN0IGNvbG9yID0gcnVuLmNvbG9yID8/IERFRkFVTFRfVEVYVF9DT0xPUjtcbiAgICBjb25zdCBpbmtXaWR0aCA9IHdvcmQud2lkdGggLSB0aGlzLl90cmFpbGluZ1NwYWNlKGRvYywgd29yZC50ZXh0KTtcbiAgICBpZiAocnVuLnVuZGVybGluZSkge1xuICAgICAgZG9jLnNldERyYXdDb2xvcihjb2xvcik7XG4gICAgICBkb2Muc2V0TGluZVdpZHRoKHdvcmQuc2l6ZSAvIDE2KTtcbiAgICAgIGRvYy5saW5lKHgsIGJhc2VsaW5lICsgd29yZC5zaXplICogMC4xMiwgeCArIGlua1dpZHRoLCBiYXNlbGluZSArIHdvcmQuc2l6ZSAqIDAuMTIpO1xuICAgIH1cbiAgICBpZiAocnVuLnN0cmlrZSkge1xuICAgICAgZG9jLnNldERyYXdDb2xvcihjb2xvcik7XG4gICAgICBkb2Muc2V0TGluZVdpZHRoKHdvcmQuc2l6ZSAvIDE2KTtcbiAgICAgIGRvYy5saW5lKHgsIGJhc2VsaW5lIC0gd29yZC5zaXplICogMC4zLCB4ICsgaW5rV2lkdGgsIGJhc2VsaW5lIC0gd29yZC5zaXplICogMC4zKTtcbiAgICB9XG5cbiAgICBpZiAocnVuLmxpbmspIHtcbiAgICAgIGRvYy5saW5rKHgsIGJhc2VsaW5lIC0gd29yZC5zaXplLCBpbmtXaWR0aCwgd29yZC5zaXplICogMS4yLCB7IHVybDogcnVuLmxpbmsgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8ganNQREYncyBzdGFuZGFyZCBmb250cyBhcmUgSGVsdmV0aWNhLCBUaW1lcyBhbmQgQ291cmllcjsgYSBibG9jaydzIGZhY2UgaXNcbiAgLy8gbWFwcGVkIG9udG8gd2hpY2hldmVyIG9mIHRoZSB0aHJlZSBpdCByZXNlbWJsZXMuXG4gIHByaXZhdGUgX2ZvbnQoZG9jOiBhbnksIHJ1bjogVGV4dFJ1biwgc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZmFjZSA9IChydW4uZm9udEZhY2UgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZmFtaWx5ID0gL2NvdXJpZXJ8bW9uby8udGVzdChmYWNlKVxuICAgICAgPyAnY291cmllcidcbiAgICAgIDogKC90aW1lc3xnZW9yZ2lhfHNlcmlmLy50ZXN0KGZhY2UpICYmICFmYWNlLmluY2x1ZGVzKCdzYW5zJykgPyAndGltZXMnIDogJ2hlbHZldGljYScpO1xuICAgIGNvbnN0IHN0eWxlID0gcnVuLmJvbGQgJiYgcnVuLml0YWxpY1xuICAgICAgPyAnYm9sZGl0YWxpYydcbiAgICAgIDogKHJ1bi5ib2xkID8gJ2JvbGQnIDogKHJ1bi5pdGFsaWMgPyAnaXRhbGljJyA6ICdub3JtYWwnKSk7XG5cbiAgICBkb2Muc2V0Rm9udChmYW1pbHksIHN0eWxlKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoc2l6ZSk7XG4gICAgZG9jLnNldFRleHRDb2xvcihydW4uY29sb3IgPz8gREVGQVVMVF9URVhUX0NPTE9SKTtcbiAgfVxuXG4gIHByaXZhdGUgX3RyYWlsaW5nU3BhY2UoZG9jOiBhbnksIHRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgdHJhaWxpbmcgPSB0ZXh0Lmxlbmd0aCAtIHRleHQudHJpbUVuZCgpLmxlbmd0aDtcblxuICAgIHJldHVybiB0cmFpbGluZyA/IGRvYy5nZXRUZXh0V2lkdGgoJyAnKSAqIHRyYWlsaW5nIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgX2FsaWduT2Zmc2V0KGFsaWduOiBUZXh0UGFyYWdyYXBoWydhbGlnbiddLCB3aWR0aDogbnVtYmVyLCBsaW5lV2lkdGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgc3dpdGNoIChhbGlnbikge1xuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsICh3aWR0aCAtIGxpbmVXaWR0aCkgLyAyKTtcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIHdpZHRoIC0gbGluZVdpZHRoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdoYXQgdGhlIHRva2VucyBvZiBhIHRleHQgYmxvY2sgYW5kIG9mIGEgdGlsZSdzIHRpdGxlIGZpbGwgd2l0aCBvbiB0aGlzXG4gIC8vIHBhZ2UuIFRoZSBudW1iZXIgaXMgdGhlIHBoeXNpY2FsIHBhZ2UgYW1vbmcgdGhlIHJlcG9ydCdzIHBhZ2VzLFxuICAvLyBjb250aW51YXRpb24gcGFnZXMgaW5jbHVkZWQg4oCUIHRoZSB0aXRsZSBwYWdlIGlzIG5vdCBhIHJlcG9ydCBwYWdlLiBUaGVcbiAgLy8gbmFtZSBzdGF5cyB0aGUgcmVwb3J0IHBhZ2Uncywgc28gYSBjb250aW51YXRpb24gcGFnZSBpcyBuYW1lZCBmb3IgdGhlXG4gIC8vIHBhZ2UgaXRzIHRhYmxlIHN0YXJ0ZWQgb24uIFRoZSBmaWx0ZXJzIGFyZSB0aGUgcmVwb3J0J3MgYW5kIHRoZSBwYWdlJ3NcbiAgLy8gb3duIHBhZ2UgZmlsdGVycyAobGF5ZXJGaWx0ZXJGaWVsZHMpLlxuICBwcml2YXRlIF90b2tlbnMoY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCwgcGFnZTogUmVwb3J0UGFnZSwgaW5kZXg6IG51bWJlciwgcGFnZU51bWJlcjogbnVtYmVyKTogVGV4dFRva2VuQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICBwYWdlTmFtZTogcGFnZS5uYW1lIHx8IGBQYWdlICR7aW5kZXggKyAxfWAsXG4gICAgICByZXBvcnROYW1lOiBjb250ZXh0LnJlcG9ydC5uYW1lLFxuICAgICAgZmlsdGVyczogbGF5ZXJGaWx0ZXJGaWVsZHMoY29udGV4dC5maWx0ZXJGaWVsZHMsIGNvbnRleHQucmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSwgcGFnZS5pZCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEEgdGlsZSBvbiBpdHMgcmVwb3J0IHBhZ2UsIGl0cyB0aXRsZSdzIHRva2VucyBmaWxsZWQgd2l0aCB0aGF0IHBhZ2Uncy5cbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyQ29tcG9uZW50KFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50LFxuICAgIHRva2VuczogVGV4dFRva2VuQ29udGV4dCxcbiAgICBvdmVyZmxvd3M6IFBkZlRhYmxlT3ZlcmZsb3dbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkb2MgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgY29tcG9uZW50ID0gaXRlbS5jb21wb25lbnQ7XG4gICAgLy8gR2VvbWV0cnkgaXMgc3RvcmVkIGluIGluY2hlczsgdGhlIFBERiBkcmF3cyBpbiBwb2ludHMuXG4gICAgY29uc3QgeCA9IGNvbXBvbmVudC54ICogUFQ7XG4gICAgY29uc3QgeSA9IGNvbXBvbmVudC55ICogUFQ7XG4gICAgY29uc3QgdyA9IGNvbXBvbmVudC53ICogUFQ7XG4gICAgY29uc3QgaCA9IGNvbXBvbmVudC5oICogUFQ7XG5cbiAgICBjb25zdCB0aXRsZSA9IGV4cG9ydFRpdGxlKGNvbXBvbmVudCwgdG9rZW5zLCBpdGVtLnNlYXJjaCwgaXRlbS5jcnVtYnMsIGl0ZW0uZmlsdGVyZWQpO1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgdGhpcy5fY29tcG9uZW50VGl0bGUoZG9jLCB0aXRsZSwgeCwgeSwgdyk7XG4gICAgfVxuXG4gICAgLy8gQSBjaGFydCBvciBsaXN0IHRoYXQgY29tcGFyZXMgb3IgaGFzIGEgdGltZWZyYW1lIG5hbWVzIGl0cyBkYXlzIHVuZGVyXG4gICAgLy8gdGhlIHRpdGxlLCBhbmQgaXRzIG5vdGVzIHNpdCBhdCB0aGUgZm9vdCBvZiBpdHMgYm94OyBhIEtQSSBjYXJkIGRyYXdzXG4gICAgLy8gYm90aCBpdHNlbGYuIE5laXRoZXIgdGFrZXMgcm9vbSBmcm9tIGEgY29tcG9uZW50IHdpdGhvdXQgdGhvc2Uga2V5cy5cbiAgICBjb25zdCBsb2NhbGUgPSBjb250ZXh0LmZvcm1hdENvbnRleHQubG9jYWxlO1xuICAgIGNvbnN0IHN1YnRpdGxlID0gdGhpcy5fcGRmVGV4dChleHBvcnRXaW5kb3dzTGluZShpdGVtLCBjb250ZXh0LnRpbWV6b25lLCBsb2NhbGUpKTtcbiAgICBjb25zdCBub3RlcyA9IGNvbXBvbmVudC50eXBlID09PSAna3BpJyA/IFtdIDogZXhwb3J0Tm90ZUxpbmVzKGl0ZW0sIGNvbnRleHQudGltZXpvbmUsIGxvY2FsZSk7XG4gICAgY29uc3QgdG9wID0geSArIFRJVExFX0ggKyAoc3VidGl0bGUgPyBTVUJUSVRMRV9IIDogMCk7XG4gICAgY29uc3Qgcm9vbSA9IE1hdGgubWF4KDIwLCB5ICsgaCAtIHRvcCk7XG4gICAgY29uc3Qga2VwdCA9IG5vdGVzLnNsaWNlKDAsIE1hdGgubWF4KDAsIE1hdGguZmxvb3IoKHJvb20gLSBNSU5fQk9EWV9IKSAvIE5PVEVfTElORV9IKSkpO1xuXG4gICAgaWYgKHN1YnRpdGxlKSB7XG4gICAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCBzdWJ0aXRsZSwgeCwgeSArIFRJVExFX0gsIHcsICdsZWZ0JywgJ25vcm1hbCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHlZID0gdG9wO1xuICAgIGNvbnN0IGJvZHlIID0gTWF0aC5tYXgoMjAsIHJvb20gLSBrZXB0Lmxlbmd0aCAqIE5PVEVfTElORV9IKTtcblxuICAgIGtlcHQuZm9yRWFjaCgobGluZSwgaW5kZXgpID0+IHtcbiAgICAgIHRoaXMuX3NtYWxsTGluZShkb2MsIHRoaXMuX3BkZlRleHQobGluZSksIHgsIGJvZHlZICsgYm9keUggKyBpbmRleCAqIE5PVEVfTElORV9ILCB3LCAnbGVmdCcsICdpdGFsaWMnKTtcbiAgICB9KTtcblxuICAgIGlmICghaXRlbS5kYXRhIHx8IGlzRW1wdHlUaWxlKGl0ZW0pKSB7XG4gICAgICB0aGlzLl9ib3hOb3RlKGRvYywgZW1wdHlMYWJlbChpdGVtKSwgeCwgYm9keVksIHcsIGJvZHlIKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29tcG9uZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ2NoYXJ0Jzoge1xuICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHJlbmRlckNoYXJ0SW1hZ2UoY29tcG9uZW50LCBpdGVtLmRhdGEsIHcsIGJvZHlILCBjb250ZXh0LmZvcm1hdENvbnRleHQpO1xuICAgICAgICBkb2MuYWRkSW1hZ2UoaW1hZ2UsICdQTkcnLCB4LCBib2R5WSwgdywgYm9keUgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgY2FzZSAnZ3JpZCc6XG4gICAgICAgIHRoaXMuX3JlbmRlclRhYmxlKGNvbnRleHQsIGl0ZW0sIHgsIGJvZHlZLCB3LCBib2R5SCwgb3ZlcmZsb3dzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdrcGknOlxuICAgICAgICB0aGlzLl9yZW5kZXJLcGkoY29udGV4dCwgaXRlbSwgeCwgYm9keVksIHcsIGJvZHlIKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gT25lIGxpbmUgb2Ygc21hbGwgZ3JleSBwcmludCwgY3V0IHRvIHRoZSB3aWR0aCB3aXRoIGFuIGVsbGlwc2lzOiBhXG4gIC8vIHN1YnRpdGxlLCBhIG5vdGUgb3IgYSBsaW5lIG9mIGEgS1BJIGNhcmQuIHkgaXMgdGhlIGxpbmUncyB0b3A7IHRoZSBsaW5lIGlzXG4gIC8vIE5PVEVfTElORV9IIHRhbGwsIHRpbWVzIHRoZSBzY2FsZSBhIHNob3J0IEtQSSB0aWxlIHNocmlua3MgaXRzIGxpbmVzIGJ5LlxuICBwcml2YXRlIF9zbWFsbExpbmUoXG4gICAgZG9jOiBhbnksXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsXG4gICAgYWxpZ246ICdsZWZ0JyB8ICdjZW50ZXInLFxuICAgIHN0eWxlOiAnbm9ybWFsJyB8ICdpdGFsaWMnLFxuICAgIHNjYWxlID0gMSxcbiAgKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsIHN0eWxlKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoU01BTExfU0laRSAqIHNjYWxlKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKE1VVEVEX0NPTE9SKTtcbiAgICBkb2MudGV4dCh0aGlzLl9maXQoZG9jLCB0ZXh0LCB3KSwgYWxpZ24gPT09ICdjZW50ZXInID8geCArIHcgLyAyIDogeCwgeSArIFNNQUxMX1NJWkUgKiBzY2FsZSwgeyBhbGlnbiB9KTtcbiAgfVxuXG4gIC8vIFRoZSB0ZXh0LCBlbGxpcHNpemVkIHRvIHRoZSB3aWR0aCBpbiB0aGUgZG9jJ3MgY3VycmVudCBmb250LlxuICBwcml2YXRlIF9maXQoZG9jOiBhbnksIHRleHQ6IHN0cmluZywgd2lkdGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGRvYy5nZXRUZXh0V2lkdGgodGV4dCkgPD0gd2lkdGgpIHtcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIGxldCBjdXQgPSB0ZXh0O1xuICAgIHdoaWxlIChjdXQubGVuZ3RoID4gMSAmJiBkb2MuZ2V0VGV4dFdpZHRoKGAke2N1dH3igKZgKSA+IHdpZHRoKSB7XG4gICAgICBjdXQgPSBjdXQuc2xpY2UoMCwgLTEpO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtjdXQudHJpbUVuZCgpfeKApmA7XG4gIH1cblxuICAvLyBUaGUgYm9sZCBzdHJpcCBvdmVyIGEgY29tcG9uZW50LCBhbmQgb3ZlciBlYWNoIG9mIGl0cyBjb250aW51YXRpb24gcGFnZXMuXG4gIC8vIEEgZHJpbGxlZCB0aXRsZSdzIGNydW1icyBhcmUgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBzbyB0aGUgdGl0bGVcbiAgLy8gZ29lcyB0aHJvdWdoIF9wZGZUZXh0IGxpa2UgYW55IGZvcm1hdHRlZCB0ZXh0ICh0aGUg4oC6IGJldHdlZW4gY3J1bWJzIGlzXG4gIC8vIFdpbkFuc2kgYW5kIHN0YXlzKS5cbiAgcHJpdmF0ZSBfY29tcG9uZW50VGl0bGUoZG9jOiBhbnksIHRpdGxlOiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIpOiB2b2lkIHtcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgIGRvYy50ZXh0KHRoaXMuX3BkZlRleHQodGl0bGUpLCB4LCB5ICsgMTAsIHsgbWF4V2lkdGg6IHcgfSk7XG4gIH1cblxuICAvLyBBbiBpdGFsaWMgZ3JleSBsaW5lIGNlbnRlcmVkIGluIGEgY29tcG9uZW50J3MgYm9keSwgZm9yIGEgYm9keSB0aGF0IGhvbGRzXG4gIC8vIHNvbWV0aGluZyBvdGhlciB0aGFuIGl0cyBjb250ZW50LlxuICBwcml2YXRlIF9ib3hOb3RlKGRvYzogYW55LCB0ZXh0OiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnaXRhbGljJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDkpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoTVVURURfQ09MT1IpO1xuICAgIGRvYy50ZXh0KHRleHQsIHggKyB3IC8gMiwgeSArIGggLyAyLCB7IGFsaWduOiAnY2VudGVyJyB9KTtcbiAgfVxuXG4gIC8vIEEgbGlzdCdzIG9uLXBhZ2UgdGFibGUuIEFsbCBvZiBpdHMgZmV0Y2hlZCByb3dzIGFyZSBsYWlkIG91dCBvbmNlIHRvIGxlYXJuXG4gIC8vIGhvdyBtYW55IHRoZSBib3ggaG9sZHM7IHdoZW4gdGhleSBkbyBub3QgYWxsIGZpdCwgdGhlIGJveCdzIGxhc3Qgcm93IHNheXNcbiAgLy8gdGhlIHRhYmxlIGNvbnRpbnVlcyBhbmQgdGhlIHJlc3QgZ28gdG8gb3ZlcmZsb3dzIGZvciBjb250aW51YXRpb24gcGFnZXMuXG4gIC8vIEEgYm94IHRvbyBzaG9ydCBmb3IgZXZlbiB0aGUgaGVhZCBjYXJyaWVzIHRoZSBub3RpY2UgYXMgYSBsaW5lIGluc3RlYWQuXG4gIC8vIEEgdG90YWxzIHJvdyBjbG9zZXMgdGhlIHRhYmxlIG9uY2U6IGluIHRoZSBib3ggd2hlbiBldmVyeSByb3cgZml0cyBpdCxcbiAgLy8gZWxzZSBhZnRlciB0aGUgbGFzdCBjb250aW51YXRpb24gcm93LiBQb2ludHMgdGhyb3VnaG91dC5cbiAgcHJpdmF0ZSBfcmVuZGVyVGFibGUoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICAgIG92ZXJmbG93czogUGRmVGFibGVPdmVyZmxvd1tdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbXBvbmVudCwgc2VhcmNoLCBmaWx0ZXJlZCB9ID0gaXRlbTtcbiAgICBjb25zdCB7IGhlYWQsIGNlbGxzLCBudW1lcmljLCBmb290LCBvbWl0dGVkIH0gPSBpdGVtLnRhYmxlID8gdGhpcy5fZ3JpZENlbGxzKGl0ZW0pIDogdGhpcy5fbGlzdENlbGxzKGNvbnRleHQsIGl0ZW0pO1xuICAgIGNvbnN0IGJvdHRvbSA9IGNvbnRleHQucGFnZUggLSAoeSArIGgpO1xuICAgIGNvbnN0IHsgZml0LCBjb2x1bW5TdHlsZXMgfSA9IHRoaXMuX21lYXN1cmUoY29udGV4dCwgaGVhZCwgY2VsbHMsIG51bWVyaWMsIGZvb3QsIHgsIHksIHcsIGJvdHRvbSk7XG5cbiAgICBpZiAoZml0ID09PSBjZWxscy5sZW5ndGggJiYgb21pdHRlZCA9PT0gMCkge1xuICAgICAgdGhpcy5fZHJhd1RhYmxlKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB0aGlzLl90YWJsZU9wdGlvbnMoY29udGV4dCwgaGVhZCwgbnVtZXJpYywgY2VsbHMsIHgsIHksIHcsIGJvdHRvbSwgY29sdW1uU3R5bGVzLCBmb290KSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgbm90aWNlIHRha2VzIHRoZSBwbGFjZSBvZiB0aGUgbGFzdCByb3cgdGhhdCBmaXQsIHNvIHRoYXQgcm93IG1vdmVzXG4gICAgLy8gdG8gdGhlIGNvbnRpbnVhdGlvbi4gb21pdHRlZCA+IDAgbWVhbnMgYSBmdWxsIFBERl9MSVNUX1JPV1MgZmV0Y2gsIHdoaWNoXG4gICAgLy8gbmV2ZXIgZml0cyBvbmUgYm94LCBzbyB0aGUgQ1NWIG5vdGljZSBhbHdheXMgbGFuZHMgb24gYSBjb250aW51YXRpb25cbiAgICAvLyBwYWdlLlxuICAgIGNvbnN0IGtlcHQgPSBNYXRoLm1heCgwLCBmaXQgLSAxKTtcbiAgICBvdmVyZmxvd3MucHVzaCh7XG4gICAgICBjb21wb25lbnQsIHNlYXJjaCwgY3J1bWJzOiBpdGVtLmNydW1icywgZmlsdGVyZWQsIGhlYWQsIG51bWVyaWMsIHJvd3M6IGNlbGxzLnNsaWNlKGtlcHQpLCBvbWl0dGVkLCBmb290LCB4LCB3LCBjb2x1bW5TdHlsZXMsXG4gICAgfSk7XG5cbiAgICBpZiAoZml0ID49IDEpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBbLi4uY2VsbHMuc2xpY2UoMCwga2VwdCksIHRoaXMuX25vdGljZVJvdyhDT05USU5VRURfTk9USUNFLCBudW1lcmljLmxlbmd0aCwgdHJ1ZSldO1xuICAgICAgdGhpcy5fZHJhd1RhYmxlKGNvbnRleHQsIHRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBib2R5LCB4LCB5LCB3LCBib3R0b20sIGNvbHVtblN0eWxlcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ib3hOb3RlKGNvbnRleHQuZG9jLCBDT05USU5VRURfTk9USUNFLCB4LCB5LCB3LCBoKTtcbiAgICB9XG4gIH1cblxuICAvLyBBIGxpc3QncyBoZWFkaW5nLCByb3dzLCB0b3RhbHMgcm93IGFuZCB0aGUgcm93cyBwYXN0IGl0cyBmZXRjaC5cbiAgcHJpdmF0ZSBfbGlzdENlbGxzKGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCk6IFBkZlRhYmxlUGFydHMge1xuICAgIGNvbnN0IHsgY29tcG9uZW50LCBoaWRkZW5Db2x1bW5zIH0gPSBpdGVtO1xuICAgIGNvbnN0IGRhdGEgPSBpdGVtLmRhdGEgYXMgQ29tcG9uZW50RGF0YTtcbiAgICBjb25zdCBoZWFkID0gW2xpc3RIZWFkaW5ncyhjb21wb25lbnQsIGRhdGEsIGNvbnRleHQuZm9ybWF0Q29udGV4dC5sb2NhbGUsIGhpZGRlbkNvbHVtbnMpLm1hcCgoaGVhZGluZykgPT4gdGhpcy5fcGRmVGV4dChoZWFkaW5nKSldO1xuICAgIGNvbnN0IHsgY2VsbHMsIG51bWVyaWMsIGZvb3QgfSA9IHRoaXMuX3RhYmxlQ2VsbHMoY29udGV4dCwgY29tcG9uZW50LCBkYXRhLCBoaWRkZW5Db2x1bW5zKTtcblxuICAgIHJldHVybiB7IGhlYWQsIGNlbGxzLCBudW1lcmljLCBmb290LCBvbWl0dGVkOiBNYXRoLm1heCgwLCAoZGF0YS5wYWdpbmc/LnRvdGFsID8/IGNlbGxzLmxlbmd0aCkgLSBjZWxscy5sZW5ndGgpIH07XG4gIH1cblxuICAvLyBBIHRhYmxlIHRpbGUncyBoZWFkaW5nIHJvd3MgKHNwYW5uZWQgYXMgdGhlIHNjcmVlbidzIGhlYWRlciksIGl0cyBsaW5lc1xuICAvLyAoZ3JvdXBzIGFuZCB0b3RhbHMgYm9sZCwgYSBncm91cCdzIGxhYmVsIHN0ZXBwZWQgaW4gYnkgaXRzIGRlcHRoKSBhbmQgaXRzXG4gIC8vIHRvdGFsIHJvdywgYXMgZ3JpZEV4cG9ydFRhYmxlKCkgbGF5cyB0aGVtIG91dCwgYW5kIHRoZSBsaW5lcyBwYXN0IGl0cyBjYXAuXG4gIHByaXZhdGUgX2dyaWRDZWxscyhpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQpOiBQZGZUYWJsZVBhcnRzIHtcbiAgICBjb25zdCB0YWJsZSA9IGdyaWRFeHBvcnRUYWJsZShpdGVtLnRhYmxlISk7XG4gICAgY29uc3QgY2VsbCA9IChleHBvcnRlZDogR3JpZEV4cG9ydENlbGwpOiBQZGZUYWJsZUNlbGwgPT4gKHtcbiAgICAgIGNvbnRlbnQ6IHRoaXMuX3BkZlRleHQoZXhwb3J0ZWQudGV4dCksXG4gICAgICBjb2xTcGFuOiBleHBvcnRlZC5jb2xTcGFuLFxuICAgICAgcm93U3BhbjogZXhwb3J0ZWQucm93U3BhbixcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAuLi4oZXhwb3J0ZWQuYm9sZCA/IHsgZm9udFN0eWxlOiAnYm9sZCcgfSA6IHt9KSxcbiAgICAgICAgLi4uKGV4cG9ydGVkLmluZGVudCA/IHsgY2VsbFBhZGRpbmc6IHsgdG9wOiAzLCByaWdodDogMywgYm90dG9tOiAzLCBsZWZ0OiAzICsgZXhwb3J0ZWQuaW5kZW50ICogR1JJRF9JTkRFTlQgfSB9IDoge30pLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBoZWFkOiB0YWJsZS5oZWFkLm1hcCgocm93KSA9PiByb3cubWFwKGNlbGwpKSxcbiAgICAgIGNlbGxzOiB0YWJsZS5ib2R5Lm1hcCgocm93KSA9PiByb3cubWFwKGNlbGwpKSxcbiAgICAgIG51bWVyaWM6IHRhYmxlLm51bWVyaWMsXG4gICAgICBmb290OiB0YWJsZS5mb290ID8gdGFibGUuZm9vdC5tYXAoKGV4cG9ydGVkKSA9PiB0aGlzLl9wZGZUZXh0KGV4cG9ydGVkLnRleHQpKSA6IG51bGwsXG4gICAgICBvbWl0dGVkOiB0YWJsZS5tb3JlUm93cyxcbiAgICB9O1xuICB9XG5cbiAgLy8gRWFjaCBmZXRjaGVkIHJvdyBhcyB0aGUgc3RyaW5ncyBpdHMgdGFibGUgY2VsbHMgcHJpbnQsIGluIHRoZSByZXBvcnQnc1xuICAvLyB6b25lLCBsb2NhbGUgYW5kIGN1cnJlbmN5LCB3aGljaCBjb2x1bW5zIGhvbGQgZm9ybWF0dGVkIG51bWJlcnMsIGFuZCB0aGVcbiAgLy8gdG90YWxzIHJvdyAobnVsbCB3aXRob3V0IG9uZSkuIFRoZSBjb2x1bW5zIHRoZSB2aWV3ZXIgaGlkIGFyZSBsZWZ0IG91dC5cbiAgcHJpdmF0ZSBfdGFibGVDZWxscyhcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIGRhdGE6IENvbXBvbmVudERhdGEsXG4gICAgaGlkZGVuQ29sdW1uczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICk6IHsgY2VsbHM6IHN0cmluZ1tdW107IG51bWVyaWM6IGJvb2xlYW5bXTsgZm9vdDogc3RyaW5nW10gfCBudWxsIH0ge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBsaXN0Q29sdW1ucyhjb21wb25lbnQsIGRhdGEsIGNvbnRleHQuZm9ybWF0Q29udGV4dC5sb2NhbGUsIGhpZGRlbkNvbHVtbnMpO1xuICAgIGNvbnN0IGNlbGxzID0gZGF0YS5yb3dzLm1hcCgocm93KSA9PiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB0aGlzLl9wZGZUZXh0KFxuICAgICAgZXhwb3J0Q2VsbChyb3dbY29sdW1uLmNvbHVtbl0sIGNvbHVtbiwgY29udGV4dC50aW1lem9uZSwgY29udGV4dC5mb3JtYXRDb250ZXh0LCByb3cpLFxuICAgICkpKTtcbiAgICBjb25zdCBmb290ID0gbGlzdFRvdGFsc1JvdyhkYXRhLCBjb2x1bW5zLCBjb250ZXh0LnRpbWV6b25lLCBjb250ZXh0LmZvcm1hdENvbnRleHQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNlbGxzLFxuICAgICAgbnVtZXJpYzogY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm51bWVyaWMpLFxuICAgICAgZm9vdDogZm9vdCA/IGZvb3QubWFwKChjZWxsKSA9PiB0aGlzLl9wZGZUZXh0KGNlbGwpKSA6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRoZSBhdXRvVGFibGUgb3B0aW9ucyBldmVyeSBsaXN0IHRhYmxlIHNoYXJlczogdGhlIGRyeSBydW4sIHRoZSBvbi1wYWdlXG4gIC8vIGRyYXcgYW5kIHRoZSBjb250aW51YXRpb24gcGFnZXMsIHNvIHRoZSB0aHJlZSBsYXkgYSB0YWJsZSBvdXQgYWxpa2UuIFRoZVxuICAvLyBmb250IGlzIG5hbWVkIHJhdGhlciB0aGFuIGluaGVyaXRlZCwgc2luY2UgdGhlIGRvYyBjYXJyaWVzIHdoYXRldmVyIHRoZVxuICAvLyBsYXN0IHRleHQgZHJhd24gbGVmdCBzZXQuIGJvdHRvbSBpcyB0aGUgbWFyZ2luIHVuZGVyIHRoZSB0YWJsZSwgcG9pbnRzLlxuICAvL1xuICAvLyBBIGNvbHVtbiBvZiBmb3JtYXR0ZWQgbnVtYmVycyBpcyByaWdodC1hbGlnbmVkLCBpdHMgaGVhZGluZyBhbmQgdG90YWxcbiAgLy8gdG9vOiB0aGUgYm9keSB0aHJvdWdoIGNvbHVtblN0eWxlcywgd2hpY2ggYXV0b1RhYmxlIGFwcGxpZXMgdG8gYm9keSBjZWxsc1xuICAvLyBvbmx5LCBhbmQgdGhlIGhlYWRpbmcgYW5kIHRvdGFsIHRocm91Z2ggdGhlIGRpZFBhcnNlQ2VsbCBob29rLCBvbiBldmVyeVxuICAvLyBwYWdlIHRoZSBoZWFkaW5nIHJlcGVhdHMuIEEgdG90YWxzIHJvdyAoZm9vdCkgcHJpbnRzIG9uY2UsIHVuZGVyIHRoZVxuICAvLyB0YWJsZSdzIGxhc3Qgcm93LCBib2xkIG9uIHRoZSBib3JkZXIgZ3JheS5cbiAgcHJpdmF0ZSBfdGFibGVPcHRpb25zKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaGVhZDogUGRmVGFibGVDZWxsW11bXSxcbiAgICBudW1lcmljOiBib29sZWFuW10sXG4gICAgYm9keTogUGRmVGFibGVDZWxsW11bXSxcbiAgICB4OiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCB3OiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLFxuICAgIGNvbHVtblN0eWxlcz86IFBkZkNvbHVtblN0eWxlcyxcbiAgICBmb290Pzogc3RyaW5nW10gfCBudWxsLFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXG4gICAgICBoZWFkLFxuICAgICAgYm9keSxcbiAgICAgIHN0YXJ0WSxcbiAgICAgIG1hcmdpbjogeyBsZWZ0OiB4LCByaWdodDogY29udGV4dC5wYWdlVyAtIHggLSB3LCBib3R0b20gfSxcbiAgICAgIHRhYmxlV2lkdGg6IHcsXG4gICAgICByb3dQYWdlQnJlYWs6ICdhdm9pZCcsXG4gICAgICBzdHlsZXM6IHsgZm9udDogJ2hlbHZldGljYScsIGZvbnRTdHlsZTogJ25vcm1hbCcsIGZvbnRTaXplOiA4LCBjZWxsUGFkZGluZzogMywgdGV4dENvbG9yOiAnIzFmMjkzMycgfSxcbiAgICAgIGhlYWRTdHlsZXM6IHsgZmlsbENvbG9yOiAnIzRlNzlhNycsIHRleHRDb2xvcjogJyNmZmZmZmYnLCBmb250U3R5bGU6ICdib2xkJyB9LFxuICAgICAgYWx0ZXJuYXRlUm93U3R5bGVzOiB7IGZpbGxDb2xvcjogJyNmNWY3ZmEnIH0sXG4gICAgICAuLi4oY29sdW1uU3R5bGVzID8geyBjb2x1bW5TdHlsZXMgfSA6IHt9KSxcbiAgICAgIC4uLihmb290XG4gICAgICAgID8ge1xuICAgICAgICAgIGZvb3Q6IFtmb290XSxcbiAgICAgICAgICBzaG93Rm9vdDogJ2xhc3RQYWdlJyxcbiAgICAgICAgICBmb290U3R5bGVzOiB7IGZpbGxDb2xvcjogJyNlNGU3ZWInLCB0ZXh0Q29sb3I6ICcjMWYyOTMzJywgZm9udFN0eWxlOiAnYm9sZCcgfSxcbiAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIGRpZFBhcnNlQ2VsbDogKGhvb2s6IGFueSkgPT4ge1xuICAgICAgICBpZiAoKGhvb2suc2VjdGlvbiA9PT0gJ2hlYWQnIHx8IGhvb2suc2VjdGlvbiA9PT0gJ2Zvb3QnKSAmJiBudW1lcmljW2hvb2suY29sdW1uLmluZGV4XSkge1xuICAgICAgICAgIGhvb2suY2VsbC5zdHlsZXMuaGFsaWduID0gJ3JpZ2h0JztcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gQSBub3RpY2UgYXMgYSB0YWJsZSByb3c6IG9uZSBpdGFsaWMgZ3JleSBjZWxsIHNwYW5uaW5nIGV2ZXJ5IGNvbHVtbi4gQVxuICAvLyBzaW5nbGUtbGluZSBub3RpY2UgaXMgZWxsaXBzaXplZCBhdCB0aGUgYm94J3Mgd2lkdGggYW5kIGtlZXBzIHRoZSBkYXRhXG4gIC8vIGNlbGxzJyBmb250IHNpemUgYW5kIHBhZGRpbmcsIHNvIGl0IGlzIG5ldmVyIHRhbGxlciB0aGFuIHRoZSBkYXRhIHJvd1xuICAvLyB3aG9zZSBwbGFjZSBpdCB0YWtlcy5cbiAgcHJpdmF0ZSBfbm90aWNlUm93KHRleHQ6IHN0cmluZywgc3BhbjogbnVtYmVyLCBzaW5nbGVMaW5lOiBib29sZWFuKTogUGRmVGFibGVDZWxsW10ge1xuICAgIHJldHVybiBbe1xuICAgICAgY29udGVudDogdGV4dCxcbiAgICAgIGNvbFNwYW46IHNwYW4sXG4gICAgICAvLyBMZWZ0LWFsaWduZWQgd2hhdGV2ZXIgdGhlIGZpcnN0IGNvbHVtbiBpczogYSBzcGFubmVkIGNlbGwgb3RoZXJ3aXNlXG4gICAgICAvLyB0YWtlcyBjb2x1bW5TdHlsZXNbMF0sIHJpZ2h0LWFsaWduZWQgd2hlbiB0aGF0IGNvbHVtbiBpcyBudW1lcmljLlxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIGZvbnRTdHlsZTogJ2l0YWxpYycsXG4gICAgICAgIHRleHRDb2xvcjogTVVURURfQ09MT1IsXG4gICAgICAgIGhhbGlnbjogJ2xlZnQnLFxuICAgICAgICAuLi4oc2luZ2xlTGluZSA/IHsgb3ZlcmZsb3c6ICdlbGxpcHNpemUnIH0gOiB7fSksXG4gICAgICB9LFxuICAgIH1dO1xuICB9XG5cbiAgLy8gTGF5cyBldmVyeSBmZXRjaGVkIHJvdyBvdXQgb25jZSBvbiBhIHNjcmF0Y2ggZG9jdW1lbnQgb2YgdGhlIHNhbWUgcGFnZVxuICAvLyBzaXplLCB3aXRoIHRoZSBvcHRpb25zIHRoZSByZWFsIGRyYXcgdXNlcywgYW5kIHJlYWRzIGJhY2sgaG93IG1hbnkgYm9keVxuICAvLyByb3dzIHRoZSBib3gncyBwYWdlIGhvbGRzIChmaXQpIGFuZCB0aGUgY29sdW1uIHdpZHRocyBhdXRvVGFibGUgY2hvc2UsXG4gIC8vIHdpdGggZWFjaCBudW1lcmljIGNvbHVtbidzIHJpZ2h0IGFsaWdubWVudCBtZXJnZWQgaW4sIHNvIHRoZSBvbi1wYWdlXG4gIC8vIHRhYmxlIGFuZCBpdHMgY29udGludWF0aW9uIHBhZ2VzIGNhcnJ5IGJvdGguIFRoZSB0b3RhbHMgcm93IGlzIGxhaWQgb3V0XG4gIC8vIHRvbywgc28gdGhlIHdpZHRocyBob2xkIGl0LCBhbmQgYSB0YWJsZSB3aG9zZSByb3dzIGZpdCB0aGUgYm94IGJ1dCB3aG9zZVxuICAvLyB0b3RhbHMgcm93IGRvZXMgbm90IG1vdmVzIGl0cyBsYXN0IHJvdyBvbi4gZml0IDAgbWVhbnMgbm90IGV2ZW4gb25lXG4gIC8vIGJvZHkgcm93IGZpdHMgdW5kZXIgdGhlIGhlYWQgKG9yIHRoZSBoZWFkIGl0c2VsZiBkaWQgbm90IGZpdCk6IGF1dG9UYWJsZVxuICAvLyBtb3ZlZCB0byBhIG5ldyBwYWdlIGJlZm9yZSBkcmF3aW5nLiBUaGUgcmVhbCBkb2N1bWVudCBpcyB1bnRvdWNoZWQuXG4gIHByaXZhdGUgX21lYXN1cmUoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBoZWFkOiBQZGZUYWJsZUNlbGxbXVtdLFxuICAgIGNlbGxzOiBQZGZUYWJsZUNlbGxbXVtdLFxuICAgIG51bWVyaWM6IGJvb2xlYW5bXSxcbiAgICBmb290OiBzdHJpbmdbXSB8IG51bGwsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgYm90dG9tOiBudW1iZXIsXG4gICk6IHsgZml0OiBudW1iZXI7IGNvbHVtblN0eWxlczogUGRmQ29sdW1uU3R5bGVzIH0ge1xuICAgIGNvbnN0IHNjcmF0Y2ggPSB0aGlzLl9zY3JhdGNoRG9jdW1lbnQoY29udGV4dCk7XG4gICAgbGV0IGZpdCA9IDA7XG5cbiAgICBjb250ZXh0LmF1dG9UYWJsZShzY3JhdGNoLCB7XG4gICAgICAuLi50aGlzLl90YWJsZU9wdGlvbnMoY29udGV4dCwgaGVhZCwgbnVtZXJpYywgY2VsbHMsIHgsIHksIHcsIGJvdHRvbSwgdW5kZWZpbmVkLCBmb290KSxcbiAgICAgIGRpZERyYXdDZWxsOiAoaG9vazogYW55KSA9PiB7XG4gICAgICAgIGlmIChob29rLnNlY3Rpb24gPT09ICdib2R5JyAmJiBzY3JhdGNoLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXIgPT09IDEpIHtcbiAgICAgICAgICBmaXQgPSBNYXRoLm1heChmaXQsIGhvb2sucm93LmluZGV4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb2x1bW5zOiB7IHdpZHRoOiBudW1iZXIgfVtdID0gc2NyYXRjaC5sYXN0QXV0b1RhYmxlLmNvbHVtbnM7XG4gICAgY29uc3QgY29sdW1uU3R5bGVzOiBQZGZDb2x1bW5TdHlsZXMgPSB7fTtcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbHVtblN0eWxlc1tpbmRleF0gPSBudW1lcmljW2luZGV4XVxuICAgICAgICA/IHsgY2VsbFdpZHRoOiBjb2x1bW4ud2lkdGgsIGhhbGlnbjogJ3JpZ2h0JyB9XG4gICAgICAgIDogeyBjZWxsV2lkdGg6IGNvbHVtbi53aWR0aCB9O1xuICAgIH0pO1xuXG4gICAgLy8gQSByb3cgdGFsbGVyIHRoYW4gYSB3aG9sZSBwYWdlIGlzIHNwbGl0IHJhdGhlciB0aGFuIG1vdmVkLCBzbyBhIGxhc3RcbiAgICAvLyByb3cgdGhhdCBzdGFydGVkIG9uIHRoZSBmaXJzdCBwYWdlIGNhbiBzdGlsbCBoYXZlIHJ1biBwYXN0IGl0LlxuICAgIGlmIChmaXQgPT09IGNlbGxzLmxlbmd0aCAmJiBzY3JhdGNoLmdldE51bWJlck9mUGFnZXMoKSA+IDEpIHtcbiAgICAgIGZpdCAtPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB7IGZpdCwgY29sdW1uU3R5bGVzIH07XG4gIH1cblxuICAvLyBBIGJsYW5rIGRvY3VtZW50IG9mIHRoZSBleHBvcnQncyBwYWdlIHNpemUsIGZvciBsYXlpbmcgYSB0YWJsZSBvdXQgdG8gc2VlXG4gIC8vIHdoYXQgZml0cyBiZWZvcmUgdGhlIHJlYWwgb25lIGlzIGRyYXduIG9uLlxuICBwcml2YXRlIF9zY3JhdGNoRG9jdW1lbnQoY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCk6IGFueSB7XG4gICAgcmV0dXJuIG5ldyBjb250ZXh0LmpzUERGKHtcbiAgICAgIHVuaXQ6ICdwdCcsXG4gICAgICBmb3JtYXQ6IFtjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIXSxcbiAgICAgIG9yaWVudGF0aW9uOiBjb250ZXh0Lm9yaWVudGF0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gRHJhd3MgYW4gb24tcGFnZSB0YWJsZSAoYSBsaXN0J3MsIG9yIGEgdGV4dCBibG9jaydzKSwgdGhlbiByZW1vdmVzIGFueVxuICAvLyBwYWdlIHRoZSBkcmF3IGFkZGVkLiBUaGF0IHNob3VsZCBuZXZlciBoYXBwZW46IHRoZSBtZWFzdXJlZCBmaXQsIHRoZVxuICAvLyBpZGVudGljYWwgY29sdW1uIHdpZHRocyBhbmQgYSBzaW5nbGUtbGluZSBub3RpY2Uga2VlcCB0aGUgdGFibGUgaW5zaWRlIGl0c1xuICAvLyBib3guIFRoZSBjaGVjayBleGlzdHMgc28gYSBzdHJheSBwYWdlIGNhbiBuZXZlciBjYXRjaCB0aGUgcmVwb3J0IHBhZ2Unc1xuICAvLyByZW1haW5pbmcgY29tcG9uZW50cy5cbiAgcHJpdmF0ZSBfZHJhd1RhYmxlKGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgY29uc3QgeyBkb2MgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgcGFnZSA9IGRvYy5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyO1xuICAgIGNvbnN0IHBhZ2VzID0gZG9jLmdldE51bWJlck9mUGFnZXMoKTtcblxuICAgIGNvbnRleHQuYXV0b1RhYmxlKGRvYywgb3B0aW9ucyk7XG5cbiAgICB3aGlsZSAoZG9jLmdldE51bWJlck9mUGFnZXMoKSA+IHBhZ2VzKSB7XG4gICAgICBkb2MuZGVsZXRlUGFnZShkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpKTtcbiAgICB9XG5cbiAgICBkb2Muc2V0UGFnZShwYWdlKTtcbiAgfVxuXG4gIC8vIFRoZSByb3dzIG9mIG9uZSBsaXN0IHRoYXQgZGlkIG5vdCBmaXQgaXRzIGJveCwgb24gcGFnZXMgYXBwZW5kZWQgYWZ0ZXJcbiAgLy8gdGhlIHJlcG9ydCBwYWdlLCBlYWNoIHdpdGggdGhlIHBhZ2UncyBoZWFkZXIgYW5kIGZvb3RlciwgdGhlIHRhYmxlJ3NcbiAgLy8gdGl0bGUgYW5kIGl0cyBoZWFkIGFnYWluLCB0aGUgdGl0bGUncyB0b2tlbnMgZmlsbGVkIHdpdGggdGhlIHBoeXNpY2FsXG4gIC8vIHBhZ2UgaXQgaXMgZHJhd24gb24uIFRoZSB0YWJsZSBzaXRzIENPTlRJTlVBVElPTl9HQVAgaW5zaWRlIHRoZSBiYW5kcy5cbiAgLy8gUmV0dXJucyB0aGUgcGh5c2ljYWwgcGFnZSBjb3VudGVyIGFmdGVyIHRoZXNlIHBhZ2VzLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJDb250aW51YXRpb24oXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBwYWdlOiBSZXBvcnRQYWdlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxuICAgIG92ZXJmbG93OiBQZGZUYWJsZU92ZXJmbG93LFxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGJhbmRzID0gcGFnZS5tYXN0ZXJIaWRkZW4gPyBOT19CQU5EUyA6IGNvbnRleHQucmVwb3J0LmNvbmZpZz8uaGVhZGVyRm9vdGVyID8/IE5PX0JBTkRTO1xuICAgIGNvbnN0IHRvcCA9IHRoaXMuX2NvbnRpbnVhdGlvbk1hcmdpbihiYW5kcy5oZWFkZXJIZWlnaHQpO1xuICAgIGNvbnN0IGJvdHRvbSA9IHRoaXMuX2NvbnRpbnVhdGlvbk1hcmdpbihiYW5kcy5mb290ZXJIZWlnaHQpO1xuICAgIGNvbnN0IHsgeCwgdyB9ID0gb3ZlcmZsb3c7XG4gICAgY29uc3QgYm9keTogUGRmVGFibGVDZWxsW11bXSA9IG92ZXJmbG93Lm9taXR0ZWQgPiAwXG4gICAgICA/IFsuLi5vdmVyZmxvdy5yb3dzLCB0aGlzLl9ub3RpY2VSb3cobW9yZVJvd3NOb3RpY2Uob3ZlcmZsb3cub21pdHRlZCksIG92ZXJmbG93Lm51bWVyaWMubGVuZ3RoLCBmYWxzZSldXG4gICAgICA6IG92ZXJmbG93LnJvd3M7XG4gICAgLy8gVGhlIGRvY3VtZW50J3MgcGFnZXMgdGhlIHRhYmxlIGRyYXdzIG9uLCBpbiBvcmRlci5cbiAgICBjb25zdCBwYWdlczogbnVtYmVyW10gPSBbXTtcblxuICAgIGRvYy5hZGRQYWdlKFtjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIXSwgY29udGV4dC5vcmllbnRhdGlvbik7XG4gICAgY29udGV4dC5hdXRvVGFibGUoZG9jLCB7XG4gICAgICAuLi50aGlzLl90YWJsZU9wdGlvbnMoXG4gICAgICAgIGNvbnRleHQsIG92ZXJmbG93LmhlYWQsIG92ZXJmbG93Lm51bWVyaWMsIGJvZHksIHgsIHRvcCArIFRJVExFX0gsIHcsIGJvdHRvbSwgb3ZlcmZsb3cuY29sdW1uU3R5bGVzLFxuICAgICAgICBvdmVyZmxvdy5mb290LFxuICAgICAgKSxcbiAgICAgIG1hcmdpbjogeyB0b3A6IHRvcCArIFRJVExFX0gsIGJvdHRvbSwgbGVmdDogeCwgcmlnaHQ6IGNvbnRleHQucGFnZVcgLSB4IC0gdyB9LFxuICAgICAgc2hvd0hlYWQ6ICdldmVyeVBhZ2UnLFxuICAgICAgLy8gRmlyZXMgb24gZXZlcnkgcGFnZSB0aGUgdGFibGUgZHJhd3Mgb24sIHRoZSBmaXJzdCBpbmNsdWRlZC5cbiAgICAgIHdpbGxEcmF3UGFnZTogKCkgPT4ge1xuICAgICAgICBwYWdlcy5wdXNoKGRvYy5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyKTtcbiAgICAgICAgY29uc3QgdG9rZW5zID0gdGhpcy5fdG9rZW5zKGNvbnRleHQsIHBhZ2UsIGluZGV4LCBwYWdlTnVtYmVyICsgcGFnZXMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VGl0bGUoXG4gICAgICAgICAgZG9jLFxuICAgICAgICAgIHRoaXMuX2NvbnRpbnVlZFRpdGxlKG92ZXJmbG93LmNvbXBvbmVudCwgdG9rZW5zLCBvdmVyZmxvdy5zZWFyY2gsIG92ZXJmbG93LmNydW1icywgb3ZlcmZsb3cuZmlsdGVyZWQpLFxuICAgICAgICAgIHgsXG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIHcsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5fcmVuZGVyQ29udGludWF0aW9uTWFzdGVycyhjb250ZXh0LCBwYWdlLCBpbmRleCwgcGFnZU51bWJlciwgcGFnZXMpO1xuXG4gICAgcmV0dXJuIHBhZ2VOdW1iZXIgKyBwYWdlcy5sZW5ndGg7XG4gIH1cblxuICAvLyBUaGUgaGVhZGVyIGFuZCBmb290ZXIgb2YgZWFjaCBjb250aW51YXRpb24gcGFnZSwgbnVtYmVyZWQgb24gZnJvbVxuICAvLyBwYWdlTnVtYmVyLiBUaGV5IGdvIG9uIG9uY2UgdGhlIHRhYmxlIGlzIGRyYXduLCBzaW5jZSBhIHRleHQgYmxvY2sgd2l0aCBhXG4gIC8vIHRhYmxlIGlzIG1lYXN1cmVkIGJlZm9yZSBpdCBpcyBkcmF3biwgd2hpY2ggYXV0b1RhYmxlJ3MgcGFnZSBob29rIGNhbm5vdFxuICAvLyB3YWl0IGZvcjsgdGhleSBzaXQgaW4gdGhlIGJhbmRzLCBjbGVhciBvZiB0aGUgdGFibGUuXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlckNvbnRpbnVhdGlvbk1hc3RlcnMoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBwYWdlOiBSZXBvcnRQYWdlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxuICAgIHBhZ2VzOiBudW1iZXJbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkb2MgfSA9IGNvbnRleHQ7XG5cbiAgICBmb3IgKGNvbnN0IFtvZmZzZXQsIGRvY3VtZW50UGFnZV0gb2YgcGFnZXMuZW50cmllcygpKSB7XG4gICAgICBkb2Muc2V0UGFnZShkb2N1bWVudFBhZ2UpO1xuICAgICAgYXdhaXQgdGhpcy5fcmVuZGVyTWFzdGVyKGNvbnRleHQsIHBhZ2UsIHRoaXMuX3Rva2Vucyhjb250ZXh0LCBwYWdlLCBpbmRleCwgcGFnZU51bWJlciArIG9mZnNldCArIDEpKTtcbiAgICB9XG5cbiAgICBkb2Muc2V0UGFnZShkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpKTtcbiAgfVxuXG4gIC8vIFRoZSBtYXJnaW4gYSBjb250aW51YXRpb24gdGFibGUga2VlcHMgZnJvbSBvbmUgZWRnZTogaW5zaWRlIHRoZSBiYW5kIHdoZW5cbiAgLy8gdGhlIHBhZ2UgaGFzIG9uZS5cbiAgcHJpdmF0ZSBfY29udGludWF0aW9uTWFyZ2luKGJhbmQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGJhbmQgPyBiYW5kICogUFQgKyBDT05USU5VQVRJT05fR0FQIDogTk9fQkFORF9NQVJHSU47XG4gIH1cblxuICBwcml2YXRlIF9jb250aW51ZWRUaXRsZShcbiAgICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgICB0b2tlbnM6IFRleHRUb2tlbkNvbnRleHQsXG4gICAgc2VhcmNoPzogc3RyaW5nLFxuICAgIGNydW1icz86IHN0cmluZ1tdLFxuICAgIGZpbHRlcmVkPzogYm9vbGVhbixcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCB0aXRsZSA9IGV4cG9ydFRpdGxlKGNvbXBvbmVudCwgdG9rZW5zLCBzZWFyY2gsIGNydW1icywgZmlsdGVyZWQpO1xuXG4gICAgcmV0dXJuIHRpdGxlID8gYCR7dGl0bGV9IChjb250aW51ZWQpYCA6ICdDb250aW51ZWQnO1xuICB9XG5cbiAgLy8gQSBLUEkgdGlsZTogdGhlIGNhcmQgdGhlIHNjcmVlbiBkcmF3cyAoa3BpLWNhcmQudHMgZGVjaWRlcyBldmVyeSBsaW5lKSxcbiAgLy8gc3RhY2tlZCBhbmQgY2VudGVyZWQgaW4gdGhlIGJvZHkuIEEgY2FyZCB3aXRoIG9ubHkgaXRzIHZhbHVlIGFuZCBsYWJlbFxuICAvLyBrZWVwcyB0aGUgdGlsZSdzIGxvbmctc3RhbmRpbmcgbGF5b3V0LlxuICBwcml2YXRlIF9yZW5kZXJLcGkoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IGRvYyB9ID0gY29udGV4dDtcbiAgICBjb25zdCBjb25maWcgPSBpdGVtLmNvbXBvbmVudC5jb25maWcgYXMgS3BpQ29uZmlnO1xuICAgIGNvbnN0IHZpZXcgPSBrcGlDYXJkVmlldyhjb25maWcsIGl0ZW0uZGF0YSwgeyBmb3JtYXQ6IGNvbnRleHQuZm9ybWF0Q29udGV4dCwgdGltZXpvbmU6IGNvbnRleHQudGltZXpvbmUgfSk7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9wZGZUZXh0KHZpZXcudmFsdWUpO1xuICAgIGNvbnN0IG5vdGVzID0gZXhwb3J0Tm90ZUxpbmVzKGl0ZW0sIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQuZm9ybWF0Q29udGV4dC5sb2NhbGUpO1xuXG4gICAgaWYgKCFrcGlDYXJkSGFzRXh0cmFzKHZpZXcsIG5vdGVzKSkge1xuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoMjYpO1xuICAgICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgICAgZG9jLnRleHQodmFsdWUsIHggKyB3IC8gMiwgeSArIGggLyAyLCB7IGFsaWduOiAnY2VudGVyJyB9KTtcblxuICAgICAgaWYgKHZpZXcubGFiZWwpIHtcbiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICAgICAgZG9jLnNldEZvbnRTaXplKDkpO1xuICAgICAgICBkb2Muc2V0VGV4dENvbG9yKE1VVEVEX0NPTE9SKTtcbiAgICAgICAgZG9jLnRleHQodmlldy5sYWJlbCwgeCArIHcgLyAyLCB5ICsgaCAvIDIgKyAxNiwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBIHRpbGUgdG9vIHNob3J0IGZvciB0aGUgY2FyZCdzIGxpbmVzIHNocmlua3MgdGhlbSBhbGwgYWxpa2UuXG4gICAgY29uc3QgcGFydHMgPSBrcGlFeHBvcnRQYXJ0cyh2aWV3LCBub3RlcywgaCwgS1BJX0hFSUdIVFMpO1xuICAgIGNvbnN0IGhlaWdodHMgPSBzY2FsZWRLcGlIZWlnaHRzKEtQSV9IRUlHSFRTLCBwYXJ0cy5zY2FsZSk7XG4gICAgbGV0IHRvcCA9IHkgKyBNYXRoLm1heCgwLCAoaCAtIGtwaUV4cG9ydEhlaWdodCh2aWV3LCBwYXJ0cywgaGVpZ2h0cykpIC8gMik7XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoMjYgKiBwYXJ0cy5zY2FsZSk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgIGRvYy50ZXh0KHZhbHVlLCB4ICsgdyAvIDIsIHRvcCArIEtQSV9WQUxVRV9CQVNFTElORSAqIHBhcnRzLnNjYWxlLCB7IGFsaWduOiAnY2VudGVyJyB9KTtcbiAgICB0b3AgKz0gaGVpZ2h0cy52YWx1ZTtcblxuICAgIGlmICh2aWV3LmxhYmVsKSB7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgICAgZG9jLnNldEZvbnRTaXplKDkgKiBwYXJ0cy5zY2FsZSk7XG4gICAgICBkb2Muc2V0VGV4dENvbG9yKE1VVEVEX0NPTE9SKTtcbiAgICAgIGRvYy50ZXh0KHRoaXMuX2ZpdChkb2MsIHRoaXMuX3BkZlRleHQodmlldy5sYWJlbCksIHcpLCB4ICsgdyAvIDIsIHRvcCArIDkgKiBwYXJ0cy5zY2FsZSwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy5sYWJlbDtcbiAgICB9XG5cbiAgICBpZiAocGFydHMuZGVsdGEgJiYgdmlldy5kZWx0YSkge1xuICAgICAgdGhpcy5fa3BpRGVsdGEoZG9jLCB2aWV3LmRlbHRhLCB4LCB0b3AsIHcsIHBhcnRzLnNjYWxlKTtcbiAgICAgIHRvcCArPSBoZWlnaHRzLmRlbHRhO1xuICAgIH1cblxuICAgIGlmIChwYXJ0cy53aW5kb3cpIHtcbiAgICAgIHRoaXMuX3NtYWxsTGluZShkb2MsIHRoaXMuX3BkZlRleHQodmlldy53aW5kb3cpLCB4LCB0b3AsIHcsICdjZW50ZXInLCAnbm9ybWFsJywgcGFydHMuc2NhbGUpO1xuICAgICAgdG9wICs9IGhlaWdodHMud2luZG93O1xuICAgIH1cblxuICAgIGlmIChwYXJ0cy50YXJnZXQgJiYgdmlldy50YXJnZXQpIHtcbiAgICAgIHRoaXMuX2twaVRhcmdldChkb2MsIHZpZXcudGFyZ2V0LCB4LCB0b3AsIHcpO1xuICAgICAgdG9wICs9IGhlaWdodHMudGFyZ2V0O1xuICAgIH1cblxuICAgIGlmIChwYXJ0cy5zcGFya2xpbmUgJiYgdmlldy5zcGFya2xpbmUpIHtcbiAgICAgIHRoaXMuX2twaVNwYXJrbGluZShkb2MsIHZpZXcuc3BhcmtsaW5lLnZhbHVlcywgdmlldy5zcGFya2xpbmUucGFydGlhbCwgeCwgdG9wLCB3KTtcbiAgICAgIHRvcCArPSBoZWlnaHRzLnNwYXJrbGluZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcGFydHMubm90ZXMpIHtcbiAgICAgIHRoaXMuX3NtYWxsTGluZShkb2MsIHRoaXMuX3BkZlRleHQobGluZSksIHgsIHRvcCwgdywgJ2NlbnRlcicsICdpdGFsaWMnKTtcbiAgICAgIHRvcCArPSBoZWlnaHRzLm5vdGU7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGRlbHRhIHJvdywgY2VudGVyZWQgYXMgb25lIGdyb3VwOiBhIHRyaWFuZ2xlIHBvaW50aW5nIHRoZSB3YXkgdGhlXG4gIC8vIHZhbHVlIG1vdmVkIChub25lIHdoZW4gdGhlIHNob3duIGNoYW5nZSByb3VuZHMgdG8gemVybykgYW5kIHRoZSBjaGFuZ2UgaW5cbiAgLy8gdGhlIGNvbG9yIG9mIHdoYXQgaXQgbWVhbnMsIHRoZW4gd2hhdCBpdCBpcyBjb21wYXJlZCB3aXRoIGluIGdyZXkuXG4gIHByaXZhdGUgX2twaURlbHRhKGRvYzogYW55LCBkZWx0YTogS3BpQ2FyZERlbHRhLCB4OiBudW1iZXIsIHRvcDogbnVtYmVyLCB3OiBudW1iZXIsIHNjYWxlID0gMSk6IHZvaWQge1xuICAgIGNvbnN0IGNvbG9yID0gYCMke1JFUE9SVF9LUElfQ0hBTkdFX0NPTE9SU1tkZWx0YS50b25lXX1gO1xuICAgIGNvbnN0IGNoYW5nZSA9IHRoaXMuX3BkZlRleHQoZGVsdGEudGV4dCk7XG4gICAgY29uc3Qgc2l6ZSA9IEtQSV9ERUxUQV9TSVpFICogc2NhbGU7XG4gICAgY29uc3Qgc2lkZSA9IEtQSV9BUlJPVyAqIHNjYWxlO1xuICAgIGNvbnN0IGFycm93ID0gZGVsdGEudHJlbmQgPT09IFJlcG9ydEtwaVRyZW5kLkZsYXQgPyAwIDogc2lkZSArIEtQSV9BUlJPV19HQVAgKiBzY2FsZTtcblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZShzaXplKTtcbiAgICBjb25zdCBjaGFuZ2VXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgoY2hhbmdlKTtcblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgY29uc3QgY29tcGFyZWQgPSBkZWx0YS5jb21wYXJlZFxuICAgICAgPyB0aGlzLl9maXQoZG9jLCBgICR7dGhpcy5fcGRmVGV4dChkZWx0YS5jb21wYXJlZCl9YCwgTWF0aC5tYXgoMCwgdyAtIGFycm93IC0gY2hhbmdlV2lkdGgpKVxuICAgICAgOiAnJztcbiAgICBjb25zdCB3aWR0aCA9IGFycm93ICsgY2hhbmdlV2lkdGggKyAoY29tcGFyZWQgPyBkb2MuZ2V0VGV4dFdpZHRoKGNvbXBhcmVkKSA6IDApO1xuICAgIGNvbnN0IGJhc2VsaW5lID0gdG9wICsgc2l6ZTtcbiAgICBsZXQgbGVmdCA9IHggKyBNYXRoLm1heCgwLCAodyAtIHdpZHRoKSAvIDIpO1xuXG4gICAgaWYgKGFycm93KSB7XG4gICAgICBjb25zdCB1cCA9IGRlbHRhLnRyZW5kID09PSBSZXBvcnRLcGlUcmVuZC5VcDtcbiAgICAgIGNvbnN0IHRpcCA9IHVwID8gYmFzZWxpbmUgLSBzaWRlIDogYmFzZWxpbmU7XG4gICAgICBjb25zdCBiYXNlID0gdXAgPyBiYXNlbGluZSA6IGJhc2VsaW5lIC0gc2lkZTtcblxuICAgICAgZG9jLnNldEZpbGxDb2xvcihjb2xvcik7XG4gICAgICBkb2MudHJpYW5nbGUobGVmdCwgYmFzZSwgbGVmdCArIHNpZGUsIGJhc2UsIGxlZnQgKyBzaWRlIC8gMiwgdGlwLCAnRicpO1xuICAgICAgbGVmdCArPSBhcnJvdztcbiAgICB9XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKGNvbG9yKTtcbiAgICBkb2MudGV4dChjaGFuZ2UsIGxlZnQsIGJhc2VsaW5lKTtcblxuICAgIGlmIChjb21wYXJlZCkge1xuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoTVVURURfQ09MT1IpO1xuICAgICAgZG9jLnRleHQoY29tcGFyZWQsIGxlZnQgKyBjaGFuZ2VXaWR0aCwgYmFzZWxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSB0YXJnZXQgbGluZSAoJ0dvYWw6ICQxLDAwMCDCtyA1NiUgb2YgdGFyZ2V0JykgYW5kLCB3aGVuIHRoZSBzZXJ2ZXIgc2VudFxuICAvLyB0aGUgcHJvZ3Jlc3MsIGEgYmFyIGZpbGxlZCB0aGF0IGZhcjogZ3JlZW4gb25jZSB0aGUgdGFyZ2V0IGlzIG1ldC5cbiAgcHJpdmF0ZSBfa3BpVGFyZ2V0KGRvYzogYW55LCB0YXJnZXQ6IEtwaUNhcmRUYXJnZXQsIHg6IG51bWJlciwgdG9wOiBudW1iZXIsIHc6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRleHQgPSB0YXJnZXQucHJvZ3Jlc3MgPyBgJHt0YXJnZXQudGV4dH0gwrcgJHt0YXJnZXQucHJvZ3Jlc3N9YCA6IHRhcmdldC50ZXh0O1xuXG4gICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dCh0ZXh0KSwgeCwgdG9wLCB3LCAnY2VudGVyJywgJ25vcm1hbCcpO1xuXG4gICAgaWYgKHRhcmdldC5maWxsID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYmFyVyA9IE1hdGgubWluKHcgKiAwLjYsIEtQSV9CQVJfVyk7XG4gICAgY29uc3QgYmFyWCA9IHggKyAodyAtIGJhclcpIC8gMjtcbiAgICBjb25zdCBiYXJZID0gdG9wICsgTk9URV9MSU5FX0ggKyAxO1xuXG4gICAgZG9jLnNldEZpbGxDb2xvcihLUElfVFJBQ0tfQ09MT1IpO1xuICAgIGRvYy5yZWN0KGJhclgsIGJhclksIGJhclcsIEtQSV9CQVJfSCwgJ0YnKTtcblxuICAgIGlmICh0YXJnZXQuZmlsbCA+IDApIHtcbiAgICAgIGRvYy5zZXRGaWxsQ29sb3IoYCMke1JFUE9SVF9LUElfQ0hBTkdFX0NPTE9SU1t0YXJnZXQudG9uZV19YCk7XG4gICAgICBkb2MucmVjdChiYXJYLCBiYXJZLCBiYXJXICogdGFyZ2V0LmZpbGwsIEtQSV9CQVJfSCwgJ0YnKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgc3BhcmtsaW5lIGluIGEgYm94IHVuZGVyIHRoZSBjYXJkJ3MgbGluZXMsIGFzIHRoZSBzY3JlZW4gZHJhd3MgaXRcbiAgLy8gKGtwaVNwYXJrbGluZUdlb21ldHJ5LCBhIDAtMTAwIGJveCk6IGEgdmVjdG9yIGxpbmUgcGVyIHJ1biBvZiB2YWx1ZXMsIGFcbiAgLy8gZG90IGZvciBhIGxvbmUgdmFsdWUsIGFuZCB0aGUgbGFzdCBwb2ludCdzIG1hcmtlciwgaG9sbG93IHdoaWxlIGl0cyBwZXJpb2RcbiAgLy8gaXMgcGFydGlhbC5cbiAgcHJpdmF0ZSBfa3BpU3BhcmtsaW5lKFxuICAgIGRvYzogYW55LFxuICAgIHZhbHVlczogKG51bWJlciB8IG51bGwpW10sXG4gICAgcGFydGlhbDogYm9vbGVhbixcbiAgICB4OiBudW1iZXIsIHRvcDogbnVtYmVyLCB3OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGdlb21ldHJ5ID0ga3BpU3BhcmtsaW5lR2VvbWV0cnkodmFsdWVzLCBwYXJ0aWFsKTtcbiAgICBjb25zdCBib3hXID0gTWF0aC5taW4odyAqIDAuNywgS1BJX1NQQVJLTElORV9XKTtcbiAgICBjb25zdCBib3hIID0gS1BJX0hFSUdIVFMuc3BhcmtsaW5lIC0gMiAqIEtQSV9TUEFSS0xJTkVfSU5TRVQ7XG4gICAgY29uc3QgbGVmdCA9IHggKyAodyAtIGJveFcpIC8gMjtcbiAgICBjb25zdCBhdCA9IChwb2ludDogS3BpU3BhcmtsaW5lUG9pbnQpID0+ICh7XG4gICAgICB4OiBsZWZ0ICsgcG9pbnQueCAqIGJveFcgLyAxMDAsXG4gICAgICB5OiB0b3AgKyBLUElfU1BBUktMSU5FX0lOU0VUICsgcG9pbnQueSAqIGJveEggLyAxMDAsXG4gICAgfSk7XG4gICAgY29uc3QgY29sb3IgPSBgIyR7UkVQT1JUX0tQSV9TUEFSS0xJTkVfQ09MT1J9YDtcblxuICAgIGRvYy5zZXREcmF3Q29sb3IoY29sb3IpO1xuICAgIGRvYy5zZXRGaWxsQ29sb3IoY29sb3IpO1xuICAgIGRvYy5zZXRMaW5lV2lkdGgoMSk7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZ2VvbWV0cnkubGluZXMpIHtcbiAgICAgIGNvbnN0IHBvaW50cyA9IGxpbmUuc3BsaXQoJyAnKS5tYXAoKHBhaXIpID0+IHtcbiAgICAgICAgY29uc3QgW3B4LCBweV0gPSBwYWlyLnNwbGl0KCcsJykubWFwKE51bWJlcik7XG5cbiAgICAgICAgcmV0dXJuIGF0KHsgeDogcHgsIHk6IHB5IH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBzdGVwcyA9IHBvaW50cy5zbGljZSgxKS5tYXAoKHBvaW50LCBpbmRleCkgPT4gW3BvaW50LnggLSBwb2ludHNbaW5kZXhdLngsIHBvaW50LnkgLSBwb2ludHNbaW5kZXhdLnldKTtcblxuICAgICAgZG9jLmxpbmVzKHN0ZXBzLCBwb2ludHNbMF0ueCwgcG9pbnRzWzBdLnksIFsxLCAxXSwgJ1MnLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkb3Qgb2YgZ2VvbWV0cnkuZG90cykge1xuICAgICAgY29uc3QgcG9pbnQgPSBhdChkb3QpO1xuICAgICAgZG9jLmNpcmNsZShwb2ludC54LCBwb2ludC55LCBLUElfRE9UX1IsICdGJyk7XG4gICAgfVxuXG4gICAgaWYgKGdlb21ldHJ5Lmxhc3QpIHtcbiAgICAgIGNvbnN0IHBvaW50ID0gYXQoZ2VvbWV0cnkubGFzdCk7XG5cbiAgICAgIGlmIChnZW9tZXRyeS5sYXN0LmhvbGxvdykge1xuICAgICAgICBkb2Muc2V0RmlsbENvbG9yKCcjZmZmZmZmJyk7XG4gICAgICAgIGRvYy5jaXJjbGUocG9pbnQueCwgcG9pbnQueSwgS1BJX0RPVF9SLCAnRkQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvYy5jaXJjbGUocG9pbnQueCwgcG9pbnQueSwgS1BJX0RPVF9SLCAnRicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEEgZm9ybWF0dGVkIHZhbHVlIGFzIGpzUERGIGNhbiBkcmF3IGl0LiBJdHMgc3RhbmRhcmQgZm9udHMgd3JpdGUgdGV4dCBpblxuICAvLyBXaW5BbnNpLCB3aGljaCBoYXMgdGhlIG5vLWJyZWFrIHNwYWNlIChVKzAwQTAsIGZyLUNBJ3MgZGlnaXQgZ3JvdXBpbmcpIGJ1dFxuICAvLyBub3QgdGhlIG5hcnJvdyBvbmUgKFUrMjAyRiwgd2hpY2ggb3RoZXIgbG9jYWxlcyBncm91cCBhbmQgc3BhY2Ugd2l0aCksIHRoZVxuICAvLyB0aGluIGFuZCBoYWlyIHNwYWNlcyAoVSsyMDA5LCBVKzIwMEEsIHdoaWNoIEludGwgcHV0cyBhcm91bmQgYSBkYXRlXG4gIC8vIHJhbmdlJ3MgZGFzaDogJ1NlcCAxIOKAkyAzMCwgMjAyNicpLCB0aGUgbWludXMgc2lnbiAoVSsyMjEyLCBzb21lIGxvY2FsZXMnXG4gIC8vIG5lZ2F0aXZlIHNpZ24pIG9yIGEgcmFuayBjaGFuZ2UncyB0cmlhbmdsZXM6IGVhY2ggd291bGQgcHJpbnQgYXMgc3RyYXlcbiAgLy8gZ2x5cGhzLiBUaGUgbmFycm93IHNwYWNlIGJlY29tZXMgYSBuby1icmVhayBzcGFjZSwgc28gYSBudW1iZXIgc3RpbGwgbmV2ZXJcbiAgLy8gd3JhcHMgYWNyb3NzIGEgbGluZTsgdGhlIHRoaW4gYW5kIGhhaXIgc3BhY2VzIGEgcGxhaW4gc3BhY2U7IHRoZSBtaW51c1xuICAvLyBzaWduIGEgaHlwaGVuOyBhbmQgYSByYW5rJ3MgcmlzZSBhIHBsdXMgc2lnbiBhbmQgaXRzIGZhbGwgYSBoeXBoZW5cbiAgLy8gKCfilrIgMicgcmVhZHMgJysyJykuXG4gIHByaXZhdGUgX3BkZlRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGV4dFxuICAgICAgLnJlcGxhY2UoL1xcdTIwMkYvZywgJ1xcdTAwQTAnKVxuICAgICAgLnJlcGxhY2UoL1tcXHUyMDA5XFx1MjAwQV0vZywgJyAnKVxuICAgICAgLnJlcGxhY2UoL1xcdTIyMTIvZywgJy0nKVxuICAgICAgLnJlcGxhY2UoL1xcdTI1QjJcXHM/L2csICcrJylcbiAgICAgIC5yZXBsYWNlKC9cXHUyNUJDXFxzPy9nLCAnLScpO1xuICB9XG5cbiAgLy8gQSBsYXllcidzIHZhbHVlcyB3aXRoIGVhY2ggbnVtYmVyIGFzIGpzUERGIGNhbiBkcmF3IGl0IChfcGRmVGV4dCksIHNvIGFcbiAgLy8gdmFsdWUgZ3JvdXBlZCB3aXRoIG5hcnJvdyBzcGFjZXMgcmVhZHMsIGFuZCB3cmFwcywgbGlrZSBhbnkgb3RoZXIgbnVtYmVyLlxuICBwcml2YXRlIF9wZGZWYWx1ZXModmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBUZXh0VmFsdWU+KTogUmVjb3JkPHN0cmluZywgVGV4dFZhbHVlPiB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh2YWx1ZXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICBrZXksXG4gICAgICB2YWx1ZS50ZXh0ID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHsgLi4udmFsdWUsIHRleHQ6IHRoaXMuX3BkZlRleHQodmFsdWUudGV4dCkgfSxcbiAgICBdKSk7XG4gIH1cblxuICBwcml2YXRlIF9zbHVnKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi0rfC0rJC9nLCAnJykgfHwgJ3JlcG9ydCc7XG4gIH1cbn1cbiJdfQ==
|