@datagrok-libraries/utils 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "fullName": "Utils",
7
- "version": "0.5.0",
7
+ "version": "0.6.0",
8
8
  "description": "Common utilities",
9
9
  "dependencies": {
10
10
  "@types/node": "^14.14.37",
@@ -14,7 +14,6 @@
14
14
  "exceljs": "^4.3.0",
15
15
  "html2canvas": "^1.4.1",
16
16
  "node-fetch": "^2.6.0",
17
- "rxjs": "^7.4.0",
18
17
  "wu": "latest"
19
18
  },
20
19
  "devDependencies": {
@@ -24,7 +23,7 @@
24
23
  "eslint": "^8.8.0",
25
24
  "eslint-config-google": "^0.14.0",
26
25
  "ts-loader": "^9.2.6",
27
- "typescript": "^4.2.3"
26
+ "typescript": "^4.6.0"
28
27
  },
29
28
  "scripts": {
30
29
  "link": "npm link",
@@ -15,5 +15,20 @@ import { FunctionView } from './function-view';
15
15
  * - notifications for changing inputs, completion of computations, etc: {@link onInputChanged}
16
16
  * */
17
17
  export declare class ComputationView extends FunctionView {
18
+ /** Override to create bug reporting feature */
19
+ reportBug: (() => Promise<void>) | null;
20
+ /** Filename for exported files. Override for custom names */
21
+ exportFilename(format: string): string;
22
+ /** Override to provide supported export formats.
23
+ * These formats are available under the "Export" popup on the ribbon panel. */
24
+ get supportedExportFormats(): string[];
25
+ /** Override to provide custom file extensions for exported formats.
26
+ * These formats are available under the "Export" popup on the ribbon panel. */
27
+ get supportedExportExtensions(): Record<string, string>;
28
+ /** Override to provide custom export. Obligatory to override if custom {@link buildIO()} or {@link buildOutputBlock()} is overriden. */
29
+ export(format: string): Promise<Blob>;
30
+ buildRibbonMenu(): void;
31
+ /** Override to create a custom input control. */
32
+ buildRibbonPanels(): HTMLElement[][];
18
33
  }
19
34
  //# sourceMappingURL=computation-view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"computation-view.d.ts","sourceRoot":"","sources":["computation-view.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;KAcK;AACL,qBAAa,eAAgB,SAAQ,YAAY;CAEhD"}
1
+ {"version":3,"file":"computation-view.d.ts","sourceRoot":"","sources":["computation-view.ts"],"names":[],"mappings":"AAOA,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;KAcK;AACL,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,+CAA+C;IAC/C,SAAS,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAQ;IAE/C,6DAA6D;IAC7D,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAItC;oFACgF;IAChF,IAAI,sBAAsB,IAAI,MAAM,EAAE,CAIrC;IAED;oFACgF;IAChF,IAAI,yBAAyB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAItD;IAED,wIAAwI;IAClI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuH3C,eAAe;IAmBf,iDAAiD;IACjD,iBAAiB,IAAI,WAAW,EAAE,EAAE;CAarC"}
@@ -1,3 +1,16 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import * as ui from 'datagrok-api/ui';
11
+ import * as DG from 'datagrok-api/dg';
12
+ import ExcelJS from 'exceljs';
13
+ import html2canvas from 'html2canvas';
1
14
  import { FunctionView } from './function-view';
2
15
  /**
3
16
  * Base class for handling Compute models (see https://github.com/datagrok-ai/public/blob/master/help/compute/compute.md).
@@ -15,5 +28,186 @@ import { FunctionView } from './function-view';
15
28
  * - notifications for changing inputs, completion of computations, etc: {@link onInputChanged}
16
29
  * */
17
30
  export class ComputationView extends FunctionView {
31
+ constructor() {
32
+ super(...arguments);
33
+ /** Override to create bug reporting feature */
34
+ this.reportBug = null;
35
+ }
36
+ /** Filename for exported files. Override for custom names */
37
+ exportFilename(format) {
38
+ return `${this.name} - ${new Date().toLocaleString()}.${this.supportedExportExtensions[format]}`;
39
+ }
40
+ /** Override to provide supported export formats.
41
+ * These formats are available under the "Export" popup on the ribbon panel. */
42
+ get supportedExportFormats() {
43
+ return [
44
+ 'Excel',
45
+ ];
46
+ }
47
+ /** Override to provide custom file extensions for exported formats.
48
+ * These formats are available under the "Export" popup on the ribbon panel. */
49
+ get supportedExportExtensions() {
50
+ return {
51
+ 'Excel': 'xlsx',
52
+ };
53
+ }
54
+ /** Override to provide custom export. Obligatory to override if custom {@link buildIO()} or {@link buildOutputBlock()} is overriden. */
55
+ export(format) {
56
+ var _a, _b, _c, _d;
57
+ return __awaiter(this, void 0, void 0, function* () {
58
+ const lastCall = this.lastCall;
59
+ if (!lastCall)
60
+ throw new Error(`Function was not called`);
61
+ if (format !== 'Excel')
62
+ throw new Error(`Format "${format}" is not supported.`);
63
+ if (!this.func)
64
+ throw new Error('The correspoding function is not specified');
65
+ const BLOB_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8';
66
+ const exportWorkbook = new ExcelJS.Workbook();
67
+ const isScalarType = (type) => (DG.TYPES_SCALAR.has(type));
68
+ const isDataFrame = (type) => (type === DG.TYPE.DATA_FRAME);
69
+ const dfInputs = this.func.inputs.filter((input) => isDataFrame(input.propertyType));
70
+ const scalarInputs = this.func.inputs.filter((input) => isScalarType(input.propertyType));
71
+ const dfOutputs = this.func.outputs.filter((output) => isDataFrame(output.propertyType));
72
+ const scalarOutputs = this.func.outputs.filter((output) => isScalarType(output.propertyType));
73
+ const inputParams = [...lastCall.inputParams.values()];
74
+ const outputParams = [...lastCall.outputParams.values()];
75
+ dfInputs.forEach((dfInput) => {
76
+ const visibleTitle = dfInput.options.caption || dfInput.name;
77
+ const currentDfSheet = exportWorkbook.addWorksheet(getSheetName(visibleTitle, DIRECTION.INPUT));
78
+ const currentDf = lastCall.inputs[dfInput.name];
79
+ dfToSheet(currentDfSheet, currentDf);
80
+ });
81
+ if (scalarInputs.length) {
82
+ const inputScalarsSheet = exportWorkbook.addWorksheet('Input scalars');
83
+ scalarsToSheet(inputScalarsSheet, scalarInputs.map((scalarInput) => ({
84
+ caption: scalarInput.options['caption'] || scalarInput.name,
85
+ value: lastCall.inputs[scalarInput.name],
86
+ units: scalarInput.options['units'] || '',
87
+ })));
88
+ }
89
+ dfOutputs.forEach((dfOutput) => {
90
+ const visibleTitle = dfOutput.options.caption || dfOutput.name;
91
+ const currentDfSheet = exportWorkbook.addWorksheet(getSheetName(visibleTitle, DIRECTION.OUTPUT));
92
+ const currentDf = lastCall.outputs[dfOutput.name];
93
+ dfToSheet(currentDfSheet, currentDf);
94
+ });
95
+ if (scalarOutputs.length) {
96
+ const outputScalarsSheet = exportWorkbook.addWorksheet('Output scalars');
97
+ scalarsToSheet(outputScalarsSheet, scalarOutputs.map((scalarOutput) => ({
98
+ caption: scalarOutput.options['caption'] || scalarOutput.name,
99
+ value: lastCall.outputs[scalarOutput.name],
100
+ units: scalarOutput.options['units'] || '',
101
+ })));
102
+ }
103
+ const tabControl = this.resultsTabControl;
104
+ if (tabControl) {
105
+ for (const tabLabel of this.tabsLabels) {
106
+ tabControl.currentPane = tabControl.getPane(tabLabel);
107
+ yield new Promise((r) => setTimeout(r, 100));
108
+ if (tabLabel === 'Input') {
109
+ for (const inputParam of inputParams.filter((inputParam) => inputParam.property.propertyType === DG.TYPE.DATA_FRAME)) {
110
+ const nonGridViewers = inputParam.aux['viewers'].filter((viewer) => viewer.type !== DG.VIEWER.GRID);
111
+ const dfInput = dfInputs.find((input) => input.name === inputParam.name);
112
+ const visibleTitle = dfInput.options.caption || inputParam.name;
113
+ const currentDf = lastCall.inputs[dfInput.name];
114
+ for (const [index, viewer] of nonGridViewers.entries()) {
115
+ if (((_a = viewer.root.parentElement) === null || _a === void 0 ? void 0 : _a.style.display) === 'none') {
116
+ (_b = this.paramGridSwitches.get(inputParam.name)) === null || _b === void 0 ? void 0 : _b.click();
117
+ yield new Promise((r) => setTimeout(r, 50));
118
+ }
119
+ yield plotToSheet(exportWorkbook, exportWorkbook.getWorksheet(getSheetName(visibleTitle, DIRECTION.INPUT)), viewer.root, currentDf.columns.length + 2, (index > 0) ? Math.ceil(nonGridViewers[index - 1].root.clientHeight / 20) + 1 : 0);
120
+ }
121
+ ;
122
+ }
123
+ }
124
+ else {
125
+ for (const outputParam of outputParams.filter((outputParam) => outputParam.property.propertyType === DG.TYPE.DATA_FRAME && outputParam.property.category === tabLabel)) {
126
+ const nonGridViewers = outputParam.aux['viewers'].filter((viewer) => viewer.type !== DG.VIEWER.GRID);
127
+ const dfOutput = dfOutputs.find((input) => input.name === outputParam.name);
128
+ const visibleTitle = dfOutput.options.caption || outputParam.name;
129
+ const currentDf = lastCall.outputs[dfOutput.name];
130
+ for (const [index, viewer] of nonGridViewers.entries()) {
131
+ if (((_c = viewer.root.parentElement) === null || _c === void 0 ? void 0 : _c.style.display) === 'none') {
132
+ (_d = this.paramGridSwitches.get(outputParam.name)) === null || _d === void 0 ? void 0 : _d.click();
133
+ yield new Promise((r) => setTimeout(r, 50));
134
+ }
135
+ yield plotToSheet(exportWorkbook, exportWorkbook.getWorksheet(getSheetName(visibleTitle, DIRECTION.OUTPUT)), viewer.root, currentDf.columns.length + 2, (index > 0) ? Math.ceil(nonGridViewers[index - 1].root.clientHeight / 20) + 1 : 0);
136
+ }
137
+ }
138
+ ;
139
+ }
140
+ }
141
+ ;
142
+ }
143
+ const buffer = yield exportWorkbook.xlsx.writeBuffer();
144
+ return new Blob([buffer], { type: BLOB_TYPE });
145
+ });
146
+ }
147
+ buildRibbonMenu() {
148
+ if (this.supportedExportFormats.length === 0 && !this.reportBug && !this.helpUrl)
149
+ return;
150
+ const ribbonMenu = this.ribbonMenu.group('Model');
151
+ if (this.supportedExportFormats.length > 0) {
152
+ ribbonMenu
153
+ .group('Export')
154
+ .items(this.supportedExportFormats, (format) => __awaiter(this, void 0, void 0, function* () { return DG.Utils.download(this.exportFilename(format), yield this.export(format)); }))
155
+ .endGroup();
156
+ }
157
+ if (this.reportBug)
158
+ ribbonMenu.item('Report a bug', () => this.reportBug());
159
+ if (this.helpUrl)
160
+ ribbonMenu.item('Help', () => window.open(this.helpUrl));
161
+ }
162
+ /** Override to create a custom input control. */
163
+ buildRibbonPanels() {
164
+ const newRibbonPanels = [
165
+ ...this.getRibbonPanels(),
166
+ [...(this.supportedExportFormats.length > 0) ? [ui.divH([
167
+ ui.comboPopup(ui.iconFA('arrow-to-bottom'), this.supportedExportFormats, (format) => __awaiter(this, void 0, void 0, function* () { return DG.Utils.download(this.exportFilename(format), yield this.export(format)); })),
168
+ ])] : []]
169
+ ];
170
+ this.setRibbonPanels(newRibbonPanels);
171
+ return newRibbonPanels;
172
+ }
18
173
  }
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0YXRpb24tdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbXB1dGF0aW9uLXZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRTdDOzs7Ozs7Ozs7Ozs7OztLQWNLO0FBQ0wsTUFBTSxPQUFPLGVBQWdCLFNBQVEsWUFBWTtDQUVoRCIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbi8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovXG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHtGdW5jdGlvblZpZXd9IGZyb20gJy4vZnVuY3Rpb24tdmlldyc7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgaGFuZGxpbmcgQ29tcHV0ZSBtb2RlbHMgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vZGF0YWdyb2stYWkvcHVibGljL2Jsb2IvbWFzdGVyL2hlbHAvY29tcHV0ZS9jb21wdXRlLm1kKS5cbiAqIEluIG1vc3QgY2FzZXMsIHRoZSBjb21wdXRhdGlvbiBpcyBhIHNpbXBsZSB7QGxpbmsgRnVuY31cbiAqIEV4dGVuZCBpdCBpbiBjYXNlcyB3aGVyZSBhIGJlaGF2aW9yIG9yIFVJIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHtAbGluayBGdW5jdGlvblZpZXd9IGlzIG5lZWRlZC5cbiAqXG4gKiBJdCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uYWxpdHkgb3V0LW9mLXRoZS1ib3gsIHdoZXJlIGVhY2ggc2VjdGlvbiBjb3VsZCBiZSBjdXN0b21pemVkOlxuICogLSBhIHN0cnVjdHVyZWQgd2F5IHRvIHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcnM6IHtAbGluayBwYXJhbWV0ZXJzfVxuICogLSBnZW5lcmljIHdheSB0byBnZW5lcmF0ZSBVSSBmb3IgaW5wdXRzLCBvdXRwdXRzLCBhbmQgaW50ZXJhY3Rpdml0eSAocnVubmluZyB0aGUgbW9kZWwsIGV0YylcbiAqICAgLSBwZXJzaXN0aW5nIGhpc3RvcmljYWwgcmVzdWx0cyB0byB0aGUgZGIgKHZpYSB7QGxpbmsgcGFyYW1ldGVyc30pXG4gKiAtIGV4cG9ydCAodG8gRXhjZWwgYW5kIFBERik6IHtAbGluayBleHBvcnR9XG4gKiAtIGVhc3kgbG9hZGluZyBvZiBoaXN0b3JpY2FsIHJ1bnNcbiAqIC0gcm91dGluZ1xuICogLSBlbnRlcmluZyB0aGUgcmVhbCwgbWVhc3VyZWQgKGFzIG9wcG9zZWQgdG8gcHJlZGljdGVkKSB2YWx1ZXMgbWFudWFsbHlcbiAqIC0gbm90aWZpY2F0aW9ucyBmb3IgY2hhbmdpbmcgaW5wdXRzLCBjb21wbGV0aW9uIG9mIGNvbXB1dGF0aW9ucywgZXRjOiB7QGxpbmsgb25JbnB1dENoYW5nZWR9XG4gKiAqL1xuZXhwb3J0IGNsYXNzIENvbXB1dGF0aW9uVmlldyBleHRlbmRzIEZ1bmN0aW9uVmlldyB7XG5cbn1cbiJdfQ==
174
+ const getSheetName = (name, direction) => {
175
+ const idealName = `${direction} - ${name}`;
176
+ return (idealName.length > 31) ? name.substring(0, 32) : idealName;
177
+ };
178
+ var DIRECTION;
179
+ (function (DIRECTION) {
180
+ DIRECTION["INPUT"] = "Input";
181
+ DIRECTION["OUTPUT"] = "Output";
182
+ })(DIRECTION || (DIRECTION = {}));
183
+ const scalarsToSheet = (sheet, scalars) => {
184
+ sheet.addRow(['Parameter', 'Value', 'Units']).font = { bold: true };
185
+ scalars.forEach((scalar) => {
186
+ sheet.addRow([scalar.caption, scalar.value, scalar.units]);
187
+ });
188
+ sheet.getColumn(1).width = Math.max(...scalars.map((scalar) => scalar.caption.toString().length), 'Parameter'.length) * 1.2;
189
+ sheet.getColumn(2).width = Math.max(...scalars.map((scalar) => scalar.value.toString().length), 'Value'.length) * 1.2;
190
+ sheet.getColumn(3).width = Math.max(...scalars.map((scalar) => scalar.units.toString().length), 'Units'.length) * 1.2;
191
+ };
192
+ const dfToSheet = (sheet, df) => {
193
+ sheet.addRow(df.columns.names()).font = { bold: true };
194
+ for (let i = 0; i < df.rowCount; i++)
195
+ sheet.addRow([...df.row(i).cells].map((cell) => cell.value));
196
+ for (let i = 0; i < df.columns.length; i++) {
197
+ sheet.getColumn(i + 1).width =
198
+ Math.max(...df.columns.byIndex(i).categories.map((category) => category.toString().length), df.columns.byIndex(i).name.length) * 1.2;
199
+ }
200
+ };
201
+ const plotToSheet = (exportWb, sheet, plot, columnForImage, rowForImage = 0) => __awaiter(void 0, void 0, void 0, function* () {
202
+ const canvas = yield html2canvas(plot, { logging: false });
203
+ const dataUrl = canvas.toDataURL('image/png');
204
+ const imageId = exportWb.addImage({
205
+ base64: dataUrl,
206
+ extension: 'png',
207
+ });
208
+ sheet.addImage(imageId, {
209
+ tl: { col: columnForImage, row: rowForImage },
210
+ ext: { width: canvas.width, height: canvas.height },
211
+ });
212
+ });
213
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0YXRpb24tdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbXB1dGF0aW9uLXZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBR0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLFdBQVcsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRTdDOzs7Ozs7Ozs7Ozs7OztLQWNLO0FBQ0wsTUFBTSxPQUFPLGVBQWdCLFNBQVEsWUFBWTtJQUFqRDs7UUFDRSwrQ0FBK0M7UUFDL0MsY0FBUyxHQUFpQyxJQUFJLENBQUM7SUFnTGpELENBQUM7SUE5S0MsNkRBQTZEO0lBQzdELGNBQWMsQ0FBQyxNQUFjO1FBQzNCLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFLENBQUMsY0FBYyxFQUFFLElBQUksSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDbkcsQ0FBQztJQUVEO29GQUNnRjtJQUNoRixJQUFJLHNCQUFzQjtRQUN4QixPQUFPO1lBQ0wsT0FBTztTQUNSLENBQUM7SUFDSixDQUFDO0lBRUQ7b0ZBQ2dGO0lBQ2hGLElBQUkseUJBQXlCO1FBQzNCLE9BQU87WUFDTCxPQUFPLEVBQUUsTUFBTTtTQUNoQixDQUFDO0lBQ0osQ0FBQztJQUVELHdJQUF3STtJQUNsSSxNQUFNLENBQUMsTUFBYzs7O1lBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDL0IsSUFBSSxDQUFDLFFBQVE7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBRTFELElBQUksTUFBTSxLQUFLLE9BQU87Z0JBQUUs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T0FBTyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7SUFDeEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUU5QyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ2hDLE1BQU0sRUFBRSxPQUFPO1FBQ2YsU0FBUyxFQUFFLEtBQUs7S0FDakIsQ0FBQyxDQUFDO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUU7UUFDdEIsRUFBRSxFQUFFLEVBQUMsR0FBRyxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFDO1FBQzNDLEdBQUcsRUFBRSxFQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFDO0tBQ2xELENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuLyogZXNsaW50LWRpc2FibGUgdmFsaWQtanNkb2MgKi9cbmltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgRXhjZWxKUyBmcm9tICdleGNlbGpzJztcbmltcG9ydCBodG1sMmNhbnZhcyBmcm9tICdodG1sMmNhbnZhcyc7XG5pbXBvcnQge0Z1bmN0aW9uVmlld30gZnJvbSAnLi9mdW5jdGlvbi12aWV3JztcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBoYW5kbGluZyBDb21wdXRlIG1vZGVscyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhZ3Jvay1haS9wdWJsaWMvYmxvYi9tYXN0ZXIvaGVscC9jb21wdXRlL2NvbXB1dGUubWQpLlxuICogSW4gbW9zdCBjYXNlcywgdGhlIGNvbXB1dGF0aW9uIGlzIGEgc2ltcGxlIHtAbGluayBGdW5jfVxuICogRXh0ZW5kIGl0IGluIGNhc2VzIHdoZXJlIGEgYmVoYXZpb3Igb3IgVUkgbm90IHN1cHBvcnRlZCBieSB0aGUge0BsaW5rIEZ1bmN0aW9uVmlld30gaXMgbmVlZGVkLlxuICpcbiAqIEl0IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25hbGl0eSBvdXQtb2YtdGhlLWJveCwgd2hlcmUgZWFjaCBzZWN0aW9uIGNvdWxkIGJlIGN1c3RvbWl6ZWQ6XG4gKiAtIGEgc3RydWN0dXJlZCB3YXkgdG8gcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyczoge0BsaW5rIHBhcmFtZXRlcnN9XG4gKiAtIGdlbmVyaWMgd2F5IHRvIGdlbmVyYXRlIFVJIGZvciBpbnB1dHMsIG91dHB1dHMsIGFuZCBpbnRlcmFjdGl2aXR5IChydW5uaW5nIHRoZSBtb2RlbCwgZXRjKVxuICogICAtIHBlcnNpc3RpbmcgaGlzdG9yaWNhbCByZXN1bHRzIHRvIHRoZSBkYiAodmlhIHtAbGluayBwYXJhbWV0ZXJzfSlcbiAqIC0gZXhwb3J0ICh0byBFeGNlbCBhbmQgUERGKToge0BsaW5rIGV4cG9ydH1cbiAqIC0gZWFzeSBsb2FkaW5nIG9mIGhpc3RvcmljYWwgcnVuc1xuICogLSByb3V0aW5nXG4gKiAtIGVudGVyaW5nIHRoZSByZWFsLCBtZWFzdXJlZCAoYXMgb3Bwb3NlZCB0byBwcmVkaWN0ZWQpIHZhbHVlcyBtYW51YWxseVxuICogLSBub3RpZmljYXRpb25zIGZvciBjaGFuZ2luZyBpbnB1dHMsIGNvbXBsZXRpb24gb2YgY29tcHV0YXRpb25zLCBldGM6IHtAbGluayBvbklucHV0Q2hhbmdlZH1cbiAqICovXG5leHBvcnQgY2xhc3MgQ29tcHV0YXRpb25WaWV3IGV4dGVuZHMgRnVuY3Rpb25WaWV3IHtcbiAgLyoqIE92ZXJyaWRlIHRvIGNyZWF0ZSBidWcgcmVwb3J0aW5nIGZlYXR1cmUgKi9cbiAgcmVwb3J0QnVnOiAoKCkgPT4gUHJvbWlzZTx2b2lkPikgfCBudWxsID0gbnVsbDtcblxuICAvKiogRmlsZW5hbWUgZm9yIGV4cG9ydGVkIGZpbGVzLiBPdmVycmlkZSBmb3IgY3VzdG9tIG5hbWVzICovXG4gIGV4cG9ydEZpbGVuYW1lKGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5uYW1lfSAtICR7bmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpfS4ke3RoaXMuc3VwcG9ydGVkRXhwb3J0RXh0ZW5zaW9uc1tmb3JtYXRdfWA7XG4gIH1cblxuICAvKiogT3ZlcnJpZGUgdG8gcHJvdmlkZSBzdXBwb3J0ZWQgZXhwb3J0IGZvcm1hdHMuXG4gICAgKiBUaGVzZSBmb3JtYXRzIGFyZSBhdmFpbGFibGUgdW5kZXIgdGhlIFwiRXhwb3J0XCIgcG9wdXAgb24gdGhlIHJpYmJvbiBwYW5lbC4gKi9cbiAgZ2V0IHN1cHBvcnRlZEV4cG9ydEZvcm1hdHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnRXhjZWwnLFxuICAgIF07XG4gIH1cblxuICAvKiogT3ZlcnJpZGUgdG8gcHJvdmlkZSBjdXN0b20gZmlsZSBleHRlbnNpb25zIGZvciBleHBvcnRlZCBmb3JtYXRzLlxuICAgICogVGhlc2UgZm9ybWF0cyBhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSBcIkV4cG9ydFwiIHBvcHVwIG9uIHRoZSByaWJib24gcGFuZWwuICovXG4gIGdldCBzdXBwb3J0ZWRFeHBvcnRFeHRlbnNpb25zKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB7XG4gICAgICAnRXhjZWwnOiAneGxzeCcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0byBwcm92aWRlIGN1c3RvbSBleHBvcnQuIE9ibGlnYXRvcnkgdG8gb3ZlcnJpZGUgaWYgY3VzdG9tIHtAbGluayBidWlsZElPKCl9IG9yIHtAbGluayBidWlsZE91dHB1dEJsb2NrKCl9IGlzIG92ZXJyaWRlbi4gKi9cbiAgYXN5bmMgZXhwb3J0KGZvcm1hdDogc3RyaW5nKTogUHJvbWlzZTxCbG9iPiB7XG4gICAgY29uc3QgbGFzdENhbGwgPSB0aGlzLmxhc3RDYWxsO1xuICAgIGlmICghbGFzdENhbGwpIHRocm93IG5ldyBFcnJvcihgRnVuY3Rpb24gd2FzIG5vdCBjYWxsZWRgKTtcblxuICAgIGlmIChmb3JtYXQgIT09ICdFeGNlbCcpIHRocm93IG5ldyBFcnJvcihgRm9ybWF0IFwiJHtmb3JtYXR9XCIgaXMgbm90IHN1cHBvcnRlZC5gKTtcblxuICAgIGlmICghdGhpcy5mdW5jKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjb3JyZXNwb2RpbmcgZnVuY3Rpb24gaXMgbm90IHNwZWNpZmllZCcpO1xuXG4gICAgY29uc3QgQkxPQl9UWVBFID0gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0O2NoYXJzZXQ9VVRGLTgnO1xuICAgIGNvbnN0IGV4cG9ydFdvcmtib29rID0gbmV3IEV4Y2VsSlMuV29ya2Jvb2soKTtcblxuICAgIGNvbnN0IGlzU2NhbGFyVHlwZSA9ICh0eXBlOiBERy5UWVBFKSA9PiAoREcuVFlQRVNfU0NBTEFSLmhhcyh0eXBlKSk7XG5cbiAgICBjb25zdCBpc0RhdGFGcmFtZSA9ICh0eXBlOiBERy5UWVBFKSA9PiAodHlwZSA9PT0gREcuVFlQRS5EQVRBX0ZSQU1FKTtcblxuICAgIGNvbnN0IGRmSW5wdXRzID0gdGhpcy5mdW5jLmlucHV0cy5maWx0ZXIoKGlucHV0KSA9PiBpc0RhdGFGcmFtZShpbnB1dC5wcm9wZXJ0eVR5cGUpKTtcbiAgICBjb25zdCBzY2FsYXJJbnB1dHMgPSB0aGlzLmZ1bmMuaW5wdXRzLmZpbHRlcigoaW5wdXQpID0+IGlzU2NhbGFyVHlwZShpbnB1dC5wcm9wZXJ0eVR5cGUpKTtcbiAgICBjb25zdCBkZk91dHB1dHMgPSB0aGlzLmZ1bmMub3V0cHV0cy5maWx0ZXIoKG91dHB1dCkgPT4gaXNEYXRhRnJhbWUob3V0cHV0LnByb3BlcnR5VHlwZSkpO1xuICAgIGNvbnN0IHNjYWxhck91dHB1dHMgPSB0aGlzLmZ1bmMub3V0cHV0cy5maWx0ZXIoKG91dHB1dCkgPT4gaXNTY2FsYXJUeXBlKG91dHB1dC5wcm9wZXJ0eVR5cGUpKTtcblxuICAgIGNvbnN0IGlucHV0UGFyYW1zID0gWy4uLmxhc3RDYWxsLmlucHV0UGFyYW1zLnZhbHVlcygpXSBhcyBERy5GdW5jQ2FsbFBhcmFtW107XG4gICAgY29uc3Qgb3V0cHV0UGFyYW1zID0gWy4uLmxhc3RDYWxsLm91dHB1dFBhcmFtcy52YWx1ZXMoKV0gYXMgREcuRnVuY0NhbGxQYXJhbVtdO1xuXG4gICAgZGZJbnB1dHMuZm9yRWFjaCgoZGZJbnB1dCkgPT4ge1xuICAgICAgY29uc3QgdmlzaWJsZVRpdGxlID0gZGZJbnB1dC5vcHRpb25zLmNhcHRpb24gfHwgZGZJbnB1dC5uYW1lO1xuICAgICAgY29uc3QgY3VycmVudERmU2hlZXQgPSBleHBvcnRXb3JrYm9vay5hZGRXb3Jrc2hlZXQoZ2V0U2hlZXROYW1lKHZpc2libGVUaXRsZSwgRElSRUNUSU9OLklOUFVUKSk7XG5cbiAgICAgIGNvbnN0IGN1cnJlbnREZiA9IChsYXN0Q2FsbC5pbnB1dHNbZGZJbnB1dC5uYW1lXSBhcyBERy5EYXRhRnJhbWUpO1xuICAgICAgZGZUb1NoZWV0KGN1cnJlbnREZlNoZWV0LCBjdXJyZW50RGYpO1xuICAgIH0pO1xuXG4gICAgaWYgKHNjYWxhcklucHV0cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGlucHV0U2NhbGFyc1NoZWV0ID0gZXhwb3J0V29ya2Jvb2suYWRkV29ya3NoZWV0KCdJbnB1dCBzY2FsYXJzJyk7XG4gICAgICBzY2FsYXJzVG9TaGVldChpbnB1dFNjYWxhcnNTaGVldCwgc2NhbGFySW5wdXRzLm1hcCgoc2NhbGFySW5wdXQpID0+ICh7XG4gICAgICAgIGNhcHRpb246IHNjYWxhcklucHV0Lm9wdGlvbnNbJ2NhcHRpb24nXSB8fCBzY2FsYXJJbnB1dC5uYW1lLFxuICAgICAgICB2YWx1ZTogbGFzdENhbGwuaW5wdXRzW3NjYWxhcklucHV0Lm5hbWVdLFxuICAgICAgICB1bml0czogc2NhbGFySW5wdXQub3B0aW9uc1sndW5pdHMnXSB8fCAnJyxcbiAgICAgIH0pKSk7XG4gICAgfVxuXG4gICAgZGZPdXRwdXRzLmZvckVhY2goKGRmT3V0cHV0KSA9PiB7XG4gICAgICBjb25zdCB2aXNpYmxlVGl0bGUgPSBkZk91dHB1dC5vcHRpb25zLmNhcHRpb24gfHwgZGZPdXRwdXQubmFtZTtcbiAgICAgIGNvbnN0IGN1cnJlbnREZlNoZWV0ID0gZXhwb3J0V29ya2Jvb2suYWRkV29ya3NoZWV0KGdldFNoZWV0TmFtZSh2aXNpYmxlVGl0bGUsIERJUkVDVElPTi5PVVRQVVQpKTtcblxuICAgICAgY29uc3QgY3VycmVudERmID0gKGxhc3RDYWxsLm91dHB1dHNbZGZPdXRwdXQubmFtZV0gYXMgREcuRGF0YUZyYW1lKTtcbiAgICAgIGRmVG9TaGVldChjdXJyZW50RGZTaGVldCwgY3VycmVudERmKTtcbiAgICB9KTtcblxuXG4gICAgaWYgKHNjYWxhck91dHB1dHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBvdXRwdXRTY2FsYXJzU2hlZXQgPSBleHBvcnRXb3JrYm9vay5hZGRXb3Jrc2hlZXQoJ091dHB1dCBzY2FsYXJzJyk7XG4gICAgICBzY2FsYXJzVG9TaGVldChvdXRwdXRTY2FsYXJzU2hlZXQsIHNjYWxhck91dHB1dHMubWFwKChzY2FsYXJPdXRwdXQpID0+ICh7XG4gICAgICAgIGNhcHRpb246IHNjYWxhck91dHB1dC5vcHRpb25zWydjYXB0aW9uJ10gfHwgc2NhbGFyT3V0cHV0Lm5hbWUsXG4gICAgICAgIHZhbHVlOiBsYXN0Q2FsbC5vdXRwdXRzW3NjYWxhck91dHB1dC5uYW1lXSxcbiAgICAgICAgdW5pdHM6IHNjYWxhck91dHB1dC5vcHRpb25zWyd1bml0cyddIHx8ICcnLFxuICAgICAgfSkpKTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJDb250cm9sID0gdGhpcy5yZXN1bHRzVGFiQ29udHJvbDtcbiAgICBpZiAodGFiQ29udHJvbCkge1xuICAgICAgZm9yIChjb25zdCB0YWJMYWJlbCBvZiB0aGlzLnRhYnNMYWJlbHMpIHtcbiAgICAgICAgdGFiQ29udHJvbC5jdXJyZW50UGFuZSA9IHRhYkNvbnRyb2wuZ2V0UGFuZSh0YWJMYWJlbCk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDEwMCkpO1xuICAgICAgICBpZiAodGFiTGFiZWwgPT09ICdJbnB1dCcpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGlucHV0UGFyYW0gb2YgaW5wdXRQYXJhbXMuZmlsdGVyKChpbnB1dFBhcmFtKSA9PiBpbnB1dFBhcmFtLnByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gREcuVFlQRS5EQVRBX0ZSQU1FKSkge1xuICAgICAgICAgICAgY29uc3Qgbm9uR3JpZFZpZXdlcnMgPSAoaW5wdXRQYXJhbS5hdXhbJ3ZpZXdlcnMnXSBhcyBERy5WaWV3ZXJbXSkuZmlsdGVyKCh2aWV3ZXIpID0+IHZpZXdlci50eXBlICE9PSBERy5WSUVXRVIuR1JJRCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRmSW5wdXQgPSBkZklucHV0cy5maW5kKChpbnB1dCkgPT4gaW5wdXQubmFtZSA9PT0gaW5wdXRQYXJhbS5uYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGVUaXRsZSA9IGRmSW5wdXQhLm9wdGlvbnMuY2FwdGlvbiB8fCBpbnB1dFBhcmFtLm5hbWU7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGYgPSAobGFzdENhbGwuaW5wdXRzW2RmSW5wdXQhLm5hbWVdIGFzIERHLkRhdGFGcmFtZSk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW2luZGV4LCB2aWV3ZXJdIG9mIG5vbkdyaWRWaWV3ZXJzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICBpZiAodmlld2VyLnJvb3QucGFyZW50RWxlbWVudD8uc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbUdyaWRTd2l0Y2hlcy5nZXQoaW5wdXRQYXJhbS5uYW1lKT8uY2xpY2soKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCA1MCkpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYXdhaXQgcGxvdFRvU2hlZXQoXG4gICAgICAgICAgICAgICAgZXhwb3J0V29ya2Jvb2ssXG4gICAgICAgICAgICAgICAgZXhwb3J0V29ya2Jvb2suZ2V0V29ya3NoZWV0KGdldFNoZWV0TmFtZSh2aXNpYmxlVGl0bGUsIERJUkVDVElPTi5JTlBVVCkpLFxuICAgICAgICAgICAgICAgIHZpZXdlci5yb290LFxuICAgICAgICAgICAgICAgIGN1cnJlbnREZi5jb2x1bW5zLmxlbmd0aCArIDIsXG4gICAgICAgICAgICAgICAgKGluZGV4ID4gMCkgPyBNYXRoLmNlaWwobm9uR3JpZFZpZXdlcnNbaW5kZXgtMV0ucm9vdC5jbGllbnRIZWlnaHQgLyAyMCkgKyAxIDogMFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChjb25zdCBvdXRwdXRQYXJhbSBvZiBvdXRwdXRQYXJhbXMuZmlsdGVyKChvdXRwdXRQYXJhbSkgPT4gb3V0cHV0UGFyYW0ucHJvcGVydHkucHJvcGVydHlUeXBlID09PSBERy5UWVBFLkRBVEFfRlJBTUUgJiYgb3V0cHV0UGFyYW0ucHJvcGVydHkuY2F0ZWdvcnkgPT09IHRhYkxhYmVsKSkge1xuICAgICAgICAgICAgY29uc3Qgbm9uR3JpZFZpZXdlcnMgPSAob3V0cHV0UGFyYW0uYXV4Wyd2aWV3ZXJzJ10gYXMgREcuVmlld2VyW10pLmZpbHRlcigodmlld2VyKSA9PiB2aWV3ZXIudHlwZSAhPT0gREcuVklFV0VSLkdSSUQpO1xuXG4gICAgICAgICAgICBjb25zdCBkZk91dHB1dCA9IGRmT3V0cHV0cy5maW5kKChpbnB1dCkgPT4gaW5wdXQubmFtZSA9PT0gb3V0cHV0UGFyYW0ubmFtZSk7XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlVGl0bGUgPSBkZk91dHB1dCEub3B0aW9ucy5jYXB0aW9uIHx8IG91dHB1dFBhcmFtLm5hbWU7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGYgPSAobGFzdENhbGwub3V0cHV0c1tkZk91dHB1dCEubmFtZV0gYXMgREcuRGF0YUZyYW1lKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHZpZXdlcl0gb2Ygbm9uR3JpZFZpZXdlcnMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgIGlmICh2aWV3ZXIucm9vdC5wYXJlbnRFbGVtZW50Py5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtR3JpZFN3aXRjaGVzLmdldChvdXRwdXRQYXJhbS5uYW1lKT8uY2xpY2soKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCA1MCkpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYXdhaXQgcGxvdFRvU2hlZXQoXG4gICAgICAgICAgICAgICAgZXhwb3J0V29ya2Jvb2ssXG4gICAgICAgICAgICAgICAgZXhwb3J0V29ya2Jvb2suZ2V0V29ya3NoZWV0KGdldFNoZWV0TmFtZSh2aXNpYmxlVGl0bGUsIERJUkVDVElPTi5PVVRQVVQpKSxcbiAgICAgICAgICAgICAgICB2aWV3ZXIucm9vdCxcbiAgICAgICAgICAgICAgICBjdXJyZW50RGYuY29sdW1ucy5sZW5ndGggKyAyLFxuICAgICAgICAgICAgICAgIChpbmRleCA+IDApID8gTWF0aC5jZWlsKG5vbkdyaWRWaWV3ZXJzW2luZGV4LTFdLnJvb3QuY2xpZW50SGVpZ2h0IC8gMjApICsgMSA6IDBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuXG4gICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZXhwb3J0V29ya2Jvb2sueGxzeC53cml0ZUJ1ZmZlcigpO1xuXG4gICAgcmV0dXJuIG5ldyBCbG9iKFtidWZmZXJdLCB7dHlwZTogQkxPQl9UWVBFfSk7XG4gIH1cblxuICBidWlsZFJpYmJvbk1lbnUoKSB7XG4gICAgaWYgKHRoaXMuc3VwcG9ydGVkRXhwb3J0Rm9ybWF0cy5sZW5ndGggPT09IDAgJiYgIXRoaXMucmVwb3J0QnVnICYmICF0aGlzLmhlbHBVcmwpIHJldHVybjtcblxuICAgIGNvbnN0IHJpYmJvbk1lbnUgPSB0aGlzLnJpYmJvbk1lbnUuZ3JvdXAoJ01vZGVsJyk7XG5cbiAgICBpZiAodGhpcy5zdXBwb3J0ZWRFeHBvcnRGb3JtYXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJpYmJvbk1lbnVcbiAgICAgICAgLmdyb3VwKCdFeHBvcnQnKVxuICAgICAgICAuaXRlbXModGhpcy5zdXBwb3J0ZWRFeHBvcnRGb3JtYXRzLCBhc3luYyAoZm9ybWF0OiBzdHJpbmcpID0+IERHLlV0aWxzLmRvd25sb2FkKHRoaXMuZXhwb3J0RmlsZW5hbWUoZm9ybWF0KSwgYXdhaXQgdGhpcy5leHBvcnQoZm9ybWF0KSkpXG4gICAgICAgIC5lbmRHcm91cCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlcG9ydEJ1ZylcbiAgICAgIHJpYmJvbk1lbnUuaXRlbSgnUmVwb3J0IGEgYnVnJywgKCkgPT4gdGhpcy5yZXBvcnRCdWchKCkpO1xuXG4gICAgaWYgKHRoaXMuaGVscFVybClcbiAgICAgIHJpYmJvbk1lbnUuaXRlbSgnSGVscCcsICgpID0+IHdpbmRvdy5vcGVuKHRoaXMuaGVscFVybCEpKTtcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0byBjcmVhdGUgYSBjdXN0b20gaW5wdXQgY29udHJvbC4gKi9cbiAgYnVpbGRSaWJib25QYW5lbHMoKTogSFRNTEVsZW1lbnRbXVtdIHtcbiAgICBjb25zdCBuZXdSaWJib25QYW5lbHMgPSBbXG4gICAgICAuLi50aGlzLmdldFJpYmJvblBhbmVscygpLFxuICAgICAgWy4uLih0aGlzLnN1cHBvcnRlZEV4cG9ydEZvcm1hdHMubGVuZ3RoID4gMCkgPyBbdWkuZGl2SChbXG4gICAgICAgIHVpLmNvbWJvUG9wdXAoXG4gICAgICAgICAgdWkuaWNvbkZBKCdhcnJvdy10by1ib3R0b20nKSxcbiAgICAgICAgICB0aGlzLnN1cHBvcnRlZEV4cG9ydEZvcm1hdHMsXG4gICAgICAgICAgYXN5bmMgKGZvcm1hdDogc3RyaW5nKSA9PiBERy5VdGlscy5kb3dubG9hZCh0aGlzLmV4cG9ydEZpbGVuYW1lKGZvcm1hdCksIGF3YWl0IHRoaXMuZXhwb3J0KGZvcm1hdCkpKSxcbiAgICAgIF0pXTogW11dXG4gICAgXTtcbiAgICB0aGlzLnNldFJpYmJvblBhbmVscyhuZXdSaWJib25QYW5lbHMpO1xuICAgIHJldHVybiBuZXdSaWJib25QYW5lbHM7XG4gIH1cbn1cblxuY29uc3QgZ2V0U2hlZXROYW1lID0gKG5hbWU6IHN0cmluZywgZGlyZWN0aW9uOiBESVJFQ1RJT04pID0+IHtcbiAgY29uc3QgaWRlYWxOYW1lID0gYCR7ZGlyZWN0aW9ufSAtICR7bmFtZX1gO1xuICByZXR1cm4gKGlkZWFsTmFtZS5sZW5ndGggPiAzMSkgPyBuYW1lLnN1YnN0cmluZygwLCAzMikgOiBpZGVhbE5hbWU7XG59O1xuXG5lbnVtIERJUkVDVElPTiB7XG4gIElOUFVUID0gJ0lucHV0JyxcbiAgT1VUUFVUID0gJ091dHB1dCdcbn1cblxuY29uc3Qgc2NhbGFyc1RvU2hlZXQgPSAoc2hlZXQ6IEV4Y2VsSlMuV29ya3NoZWV0LCBzY2FsYXJzOiB7IGNhcHRpb246IHN0cmluZywgdmFsdWU6IHN0cmluZywgdW5pdHM6IHN0cmluZyB9W10pID0+IHtcbiAgc2hlZXQuYWRkUm93KFsnUGFyYW1ldGVyJywgJ1ZhbHVlJywgJ1VuaXRzJ10pLmZvbnQgPSB7Ym9sZDogdHJ1ZX07XG4gIHNjYWxhcnMuZm9yRWFjaCgoc2NhbGFyKSA9PiB7XG4gICAgc2hlZXQuYWRkUm93KFtzY2FsYXIuY2FwdGlvbiwgc2NhbGFyLnZhbHVlLCBzY2FsYXIudW5pdHNdKTtcbiAgfSk7XG5cbiAgc2hlZXQuZ2V0Q29sdW1uKDEpLndpZHRoID0gTWF0aC5tYXgoXG4gICAgLi4uc2NhbGFycy5tYXAoKHNjYWxhcikgPT4gc2NhbGFyLmNhcHRpb24udG9TdHJpbmcoKS5sZW5ndGgpLCAnUGFyYW1ldGVyJy5sZW5ndGhcbiAgKSAqIDEuMjtcbiAgc2hlZXQuZ2V0Q29sdW1uKDIpLndpZHRoID0gTWF0aC5tYXgoLi4uc2NhbGFycy5tYXAoKHNjYWxhcikgPT4gc2NhbGFyLnZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoKSwgJ1ZhbHVlJy5sZW5ndGgpICogMS4yO1xuICBzaGVldC5nZXRDb2x1bW4oMykud2lkdGggPSBNYXRoLm1heCguLi5zY2FsYXJzLm1hcCgoc2NhbGFyKSA9PiBzY2FsYXIudW5pdHMudG9TdHJpbmcoKS5sZW5ndGgpLCAnVW5pdHMnLmxlbmd0aCkgKiAxLjI7XG59O1xuXG5jb25zdCBkZlRvU2hlZXQgPSAoc2hlZXQ6IEV4Y2VsSlMuV29ya3NoZWV0LCBkZjogREcuRGF0YUZyYW1lKSA9PiB7XG4gIHNoZWV0LmFkZFJvdygoZGYuY29sdW1ucyBhcyBERy5Db2x1bW5MaXN0KS5uYW1lcygpKS5mb250ID0ge2JvbGQ6IHRydWV9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRmLnJvd0NvdW50OyBpKyspXG4gICAgc2hlZXQuYWRkUm93KFsuLi5kZi5yb3coaSkuY2VsbHNdLm1hcCgoY2VsbDogREcuQ2VsbCkgPT4gY2VsbC52YWx1ZSkpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGYuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgIHNoZWV0LmdldENvbHVtbihpICsgMSkud2lkdGggPVxuICAgICAgTWF0aC5tYXgoXG4gICAgICAgIC4uLihkZi5jb2x1bW5zIGFzIERHLkNvbHVtbkxpc3QpLmJ5SW5kZXgoaSkuY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS50b1N0cmluZygpLmxlbmd0aCksXG4gICAgICAgIChkZi5jb2x1bW5zIGFzIERHLkNvbHVtbkxpc3QpLmJ5SW5kZXgoaSkubmFtZS5sZW5ndGhcbiAgICAgICkgKiAxLjI7XG4gIH1cbn07XG5cbmNvbnN0IHBsb3RUb1NoZWV0ID0gYXN5bmMgKGV4cG9ydFdiOiBFeGNlbEpTLldvcmtib29rLCBzaGVldDogRXhjZWxKUy5Xb3Jrc2hlZXQsIHBsb3Q6IEhUTUxFbGVtZW50LCBjb2x1bW5Gb3JJbWFnZTogbnVtYmVyLCByb3dGb3JJbWFnZTogbnVtYmVyID0gMCkgPT4ge1xuICBjb25zdCBjYW52YXMgPSBhd2FpdCBodG1sMmNhbnZhcyhwbG90IGFzIEhUTUxFbGVtZW50LCB7bG9nZ2luZzogZmFsc2V9KTtcbiAgY29uc3QgZGF0YVVybCA9IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpO1xuXG4gIGNvbnN0IGltYWdlSWQgPSBleHBvcnRXYi5hZGRJbWFnZSh7XG4gICAgYmFzZTY0OiBkYXRhVXJsLFxuICAgIGV4dGVuc2lvbjogJ3BuZycsXG4gIH0pO1xuICBzaGVldC5hZGRJbWFnZShpbWFnZUlkLCB7XG4gICAgdGw6IHtjb2w6IGNvbHVtbkZvckltYWdlLCByb3c6IHJvd0ZvckltYWdlfSxcbiAgICBleHQ6IHt3aWR0aDogY2FudmFzLndpZHRoLCBoZWlnaHQ6IGNhbnZhcy5oZWlnaHR9LFxuICB9KTtcbn07XG4iXX0=
@@ -1,26 +1,27 @@
1
- import * as rxjs from 'rxjs';
2
1
  import * as DG from 'datagrok-api/dg';
3
2
  export declare class FunctionView extends DG.ViewBase {
4
- constructor(funcCall: DG.FuncCall | null);
5
- get func(): DG.Func;
6
- onViewInitialized: rxjs.Subject<void>;
7
- onInputChanged: rxjs.Subject<void>;
8
- onComputationStarted: rxjs.Subject<DG.FuncCall>;
9
- onComputationCompleted: rxjs.Subject<DG.FuncCall>;
10
- onComputationSucceeded: rxjs.Subject<DG.FuncCall>;
11
- onComputationError: rxjs.Subject<DG.FuncCall>;
3
+ constructor(funcCall?: DG.FuncCall);
4
+ get func(): DG.Func | undefined;
12
5
  private _type;
13
6
  get type(): string;
14
7
  get isInputPanelRequired(): boolean;
8
+ get outParamCategories(): string[];
9
+ get outputTabsLabels(): string[];
15
10
  get tabsLabels(): string[];
11
+ get paramToCategoryMap(): Record<string, string[]>;
16
12
  readonly context: DG.Context;
17
- preparedCall: DG.FuncCall | null;
18
- lastCall: DG.FuncCall | null;
19
- protected outputCategories: string[];
20
- protected paramToCategoryMap: Record<string, string[]>;
21
- init(funcCall: DG.FuncCall): Promise<void>;
13
+ protected _funcCall?: DG.FuncCall;
14
+ protected lastCall?: DG.FuncCall;
15
+ /** Link FuncCall to the view */
16
+ linkFunccall(funcCall: DG.FuncCall): void;
17
+ /** Get copy of FuncCall of the view */
18
+ get funcCall(): DG.FuncCall | undefined;
19
+ /** Init custom logic */
20
+ init(): void;
22
21
  /** Override to create a fully custom UI */
23
- build(): HTMLElement;
22
+ build(): void;
23
+ /** Override to create a custom input-output block */
24
+ buildIO(): HTMLElement;
24
25
  /** Override to create a custom input block. */
25
26
  buildInputBlock(): HTMLElement;
26
27
  /** Override to create a custom output block. */
@@ -31,33 +32,20 @@ export declare class FunctionView extends DG.ViewBase {
31
32
  buildRibbonPanels(): HTMLElement[][];
32
33
  /** Override to create a custom ribbon menu on the top. */
33
34
  buildRibbonMenu(): void;
34
- /** Override to create bug reporting feature */
35
- reportBug: (() => Promise<void>) | null;
36
- /** Filename for exported files. Override for custom names */
37
- exportFilename(format: string): string;
38
- /** Override to provide supported export formats.
39
- * These formats are available under the "Export" popup on the ribbon panel. */
40
- get supportedExportFormats(): string[];
41
- /** Override to provide custom file extensions for exported formats.
42
- * These formats are available under the "Export" popup on the ribbon panel. */
43
- get supportedExportExtensions(): Record<string, string>;
44
- /** Override to provide custom export. Obligatory to override if custom {@link build()} or {@link buildOutputBlock()} is overriden. */
45
- export(format: string): Promise<Blob>;
46
35
  /** Saves the computation results to the historical results, returns its id. See also {@link loadRun}. */
47
- saveRun(call: DG.FuncCall): Promise<string>;
36
+ saveRun(): Promise<DG.FuncCall>;
48
37
  /** Loads the specified historical results. See also {@link saveRun}. */
49
- loadRun(runId: string): Promise<DG.FuncCall>;
38
+ loadRun(funcCallId: string): Promise<DG.FuncCall>;
50
39
  /** Loads all the function call of this function. */
40
+ /** ACHTUNG: FuncCall inputs/outputs are not included */
51
41
  pullRuns(): Promise<DG.FuncCall[]>;
52
42
  clearResults(switchToOutput?: boolean): void;
53
43
  run(): Promise<void>;
54
44
  compute(call: DG.FuncCall): Promise<void>;
55
45
  outputParametersToView(call: DG.FuncCall): void;
56
46
  renderRunSection(call: DG.FuncCall): HTMLElement;
57
- showInputs: boolean;
58
- singleDfParam: boolean;
59
47
  paramGridSwitches: Map<string, HTMLElement>;
60
- paramViewers: Map<string, DG.Viewer[]>;
48
+ existingParamViewers: Map<string, DG.Viewer[]>;
61
49
  paramSpans: Map<string, HTMLElement>;
62
50
  resultTabs: Map<String, HTMLElement>;
63
51
  resultsTabControl: DG.TabControl | undefined;
@@ -65,8 +53,8 @@ export declare class FunctionView extends DG.ViewBase {
65
53
  controlsRoot: HTMLDivElement;
66
54
  resultsRoot: HTMLDivElement;
67
55
  historyRoot: HTMLDivElement;
68
- inputsDiv: HTMLDivElement;
69
- appendResultDataFrame(param: DG.FuncCallParam, options?: {
56
+ inputsRoot: HTMLDivElement;
57
+ appendOutputDf(param: DG.FuncCallParam, options?: {
70
58
  caption?: string;
71
59
  category?: string;
72
60
  height?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"function-view.d.ts","sourceRoot":"","sources":["function-view.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"function-view.d.ts","sourceRoot":"","sources":["function-view.ts"],"names":[],"mappings":"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"}
@@ -12,113 +12,109 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
12
12
  import wu from 'wu';
13
13
  import $ from 'cash-dom';
14
14
  import * as grok from 'datagrok-api/grok';
15
- import * as rxjs from 'rxjs';
16
15
  import * as ui from 'datagrok-api/ui';
17
16
  import * as DG from 'datagrok-api/dg';
18
- import ExcelJS from 'exceljs';
19
- import html2canvas from 'html2canvas';
20
17
  export class FunctionView extends DG.ViewBase {
21
18
  constructor(funcCall) {
22
19
  super();
23
- this.onViewInitialized = new rxjs.Subject();
24
- this.onInputChanged = new rxjs.Subject();
25
- this.onComputationStarted = new rxjs.Subject(); // emitted on computation start
26
- this.onComputationCompleted = new rxjs.Subject(); // emitted anyway if computation ended properly or not
27
- this.onComputationSucceeded = new rxjs.Subject(); // emitted anyway if computation ended properly
28
- this.onComputationError = new rxjs.Subject(); // emitted anyway if computation ended with error
29
20
  this._type = 'function';
30
- this.lastCall = null;
31
- this.outputCategories = [];
32
- this.paramToCategoryMap = {};
33
- /** Override to create bug reporting feature */
34
- this.reportBug = null;
35
- // flag to show or not the "Input" tab
36
- this.showInputs = false;
37
- this.singleDfParam = false;
38
21
  // mappping of param to the switchces of their viewers/grids
39
22
  this.paramGridSwitches = new Map();
40
- // mappping of param to their viewers
41
- this.paramViewers = new Map();
23
+ // mappping of param to their viewers placed on DOM
24
+ this.existingParamViewers = new Map();
42
25
  // mappping of param to their html elements
43
26
  this.paramSpans = new Map();
44
27
  // mappping of tab names to their content
45
28
  this.resultTabs = new Map();
46
29
  this.resultsDiv = ui.panel([], 'grok-func-results');
47
- this.controlsRoot = ui.box();
30
+ this.controlsRoot = ui.box(null, { style: { maxWidth: '370px' } });
48
31
  this.resultsRoot = ui.box();
49
32
  this.historyRoot = ui.divV([], { style: { 'justify-content': 'center' } });
50
- this.inputsDiv = ui.panel([], 'grok-func-results, ui-box');
51
- this.preparedCall = funcCall;
52
- this.context = DG.Context.cloneDefault();
53
- this.controlsRoot.style.maxWidth = '370px';
33
+ this.inputsRoot = ui.panel([], 'grok-func-results, ui-box');
54
34
  this.box = true;
55
- if (funcCall)
56
- this.init(funcCall);
35
+ this.context = DG.Context.cloneDefault();
36
+ if (!funcCall)
37
+ return;
38
+ this.linkFunccall(funcCall);
39
+ this.init();
40
+ this.build();
57
41
  }
58
42
  get func() {
59
- return this.preparedCall.func;
43
+ var _a;
44
+ return (_a = this.funcCall) === null || _a === void 0 ? void 0 : _a.func;
60
45
  }
61
46
  get type() {
62
47
  return this._type;
63
48
  }
64
49
  get isInputPanelRequired() {
65
- return this.func.inputs.some((p) => p.propertyType == DG.TYPE.DATA_FRAME && p.options['viewer'] != null);
50
+ var _a;
51
+ return ((_a = this.func) === null || _a === void 0 ? void 0 : _a.inputs.some((p) => p.propertyType == DG.TYPE.DATA_FRAME && p.options['viewer'] != null)) || false;
52
+ }
53
+ get outParamCategories() {
54
+ return [
55
+ ...new Set(this.func.outputs.map((p) => p.category)) // get all output params' categories
56
+ ]; // keep only unique of them
57
+ }
58
+ get outputTabsLabels() {
59
+ return [
60
+ ...this.outParamCategories,
61
+ ...this.outParamCategories.find((val) => val === 'Misc') ? ['Output'] : [], // if no categories are stated, the default category is added
62
+ ];
66
63
  }
67
64
  get tabsLabels() {
68
65
  return Object.keys(this.paramToCategoryMap);
69
66
  }
70
- init(funcCall) {
71
- var _a;
72
- return __awaiter(this, void 0, void 0, function* () {
73
- (_a = this.preparedCall) !== null && _a !== void 0 ? _a : (this.preparedCall = funcCall);
74
- this.preparedCall.aux['view'] = this;
75
- this.preparedCall.context = this.context;
76
- this.singleDfParam = wu(this.func.outputs).filter((p) => p.propertyType == DG.TYPE.DATA_FRAME)
77
- .toArray().length == 1;
78
- for (const inParam of wu(this.preparedCall.inputParams.values())
67
+ get paramToCategoryMap() {
68
+ const map = {};
69
+ if (this.isInputPanelRequired)
70
+ this.func.inputs.forEach((p) => map['Input'] ? map['Input'].push(p.name) : map['Input'] = [p.name]);
71
+ this.func.outputs.forEach((p) => map[p.category === 'Misc' ? 'Output' : p.category] ? map[p.category === 'Misc' ? 'Output' : p.category].push(p.name) : map[p.category === 'Misc' ? 'Output' : p.category] = [p.name]);
72
+ return map;
73
+ }
74
+ /** Link FuncCall to the view */
75
+ linkFunccall(funcCall) {
76
+ this._funcCall = funcCall;
77
+ }
78
+ /** Get copy of FuncCall of the view */
79
+ get funcCall() {
80
+ return this._funcCall;
81
+ }
82
+ /** Init custom logic */
83
+ init() {
84
+ if (this.funcCall && this.func) {
85
+ this.funcCall.aux['view'] = this;
86
+ this.funcCall.context = this.context;
87
+ for (const inParam of wu(this.funcCall.inputParams.values())
79
88
  .filter((p) => p.property.propertyType == DG.TYPE.DATA_FRAME && p.property.options['viewer'] != null)) {
80
- this.showInputs = true;
81
- const self = this;
82
- this.subs.push(inParam.onChanged.subscribe(function (param) {
83
- return __awaiter(this, void 0, void 0, function* () {
84
- self.clearResults(false);
85
- param.processOutput();
86
- self.appendResultDataFrame(param, {
87
- height: (self.singleDfParam && !grok.shell.windows.presentationMode) ? 600 : 400,
88
- category: 'Input'
89
- });
89
+ this.subs.push(inParam.onChanged.subscribe((param) => __awaiter(this, void 0, void 0, function* () {
90
+ this.clearResults(false);
91
+ param.processOutput();
92
+ this.appendOutputDf(param, {
93
+ height: 400,
94
+ category: 'Input'
90
95
  });
91
- }));
96
+ })));
92
97
  }
93
- const outParamCategories = [
94
- ...new Set(this.func.outputs
95
- .map((p) => p.category) // get all output params' categories
96
- .filter((category) => category !== 'Misc') // filter out the default ones
97
- )
98
- ]; // keep only unique of them
99
- this.outputCategories = [
100
- ...!outParamCategories.length ? ['Output'] : [],
101
- ...outParamCategories,
102
- ];
103
- if (this.isInputPanelRequired)
104
- this.func.inputs.forEach((p) => this.paramToCategoryMap['Input'] ? this.paramToCategoryMap['Input'].push(p.name) : this.paramToCategoryMap['Input'] = [p.name]);
105
- this.func.outputs.forEach((p) => this.paramToCategoryMap[p.category === 'Misc' ? 'Output' : p.category] ? this.paramToCategoryMap[p.category === 'Misc' ? 'Output' : p.category].push(p.name) : this.paramToCategoryMap[p.category === 'Misc' ? 'Output' : p.category] = [p.name]);
106
- this.root.appendChild(this.build());
107
- this.buildRibbonPanels();
108
- this.buildHistoryBlock();
109
- this.buildRibbonMenu();
110
- this.name = this.func.friendlyName;
111
- });
98
+ }
112
99
  }
113
100
  /** Override to create a fully custom UI */
114
101
  build() {
102
+ this.root.appendChild(this.buildIO());
103
+ this.buildRibbonPanels();
104
+ this.buildHistoryBlock();
105
+ this.buildRibbonMenu();
106
+ }
107
+ /** Override to create a custom input-output block */
108
+ buildIO() {
115
109
  const inputBlock = this.buildInputBlock();
116
110
  const outputBlock = this.buildOutputBlock();
117
111
  return ui.splitH([inputBlock, outputBlock]);
118
112
  }
119
113
  /** Override to create a custom input block. */
120
114
  buildInputBlock() {
121
- const funcDiv = ui.div([this.renderRunSection(this.preparedCall)], 'ui-div');
115
+ if (!this.funcCall)
116
+ return this.controlsRoot;
117
+ const funcDiv = ui.div([this.renderRunSection(this.funcCall)], 'ui-div');
122
118
  this.controlsRoot.innerHTML = '';
123
119
  this.controlsRoot.appendChild(funcDiv);
124
120
  return this.controlsRoot;
@@ -149,200 +145,59 @@ export class FunctionView extends DG.ViewBase {
149
145
  }
150
146
  /** Override to create a custom input control. */
151
147
  buildRibbonPanels() {
152
- const newRibbonPanels = [
153
- ...this.getRibbonPanels(),
154
- [...(this.supportedExportFormats.length > 0) ? [ui.divH([
155
- ui.comboPopup(ui.iconFA('arrow-to-bottom'), this.supportedExportFormats, (format) => __awaiter(this, void 0, void 0, function* () { return DG.Utils.download(this.exportFilename(format), yield this.export(format)); })),
156
- ])] : []]
157
- ];
158
- this.setRibbonPanels(newRibbonPanels);
159
- return newRibbonPanels;
148
+ return this.getRibbonPanels();
160
149
  }
161
150
  /** Override to create a custom ribbon menu on the top. */
162
151
  buildRibbonMenu() {
163
- if (this.supportedExportFormats.length === 0 && !this.reportBug && !this.helpUrl)
164
- return;
165
- const ribbonMenu = this.ribbonMenu.group('Model');
166
- if (this.supportedExportFormats.length > 0) {
167
- ribbonMenu
168
- .group('Export')
169
- .items(this.supportedExportFormats, (format) => __awaiter(this, void 0, void 0, function* () { return DG.Utils.download(this.exportFilename(format), yield this.export(format)); }))
170
- .endGroup();
171
- }
172
- if (this.reportBug)
173
- ribbonMenu.item('Report a bug', () => this.reportBug());
174
- if (this.helpUrl)
175
- ribbonMenu.item('Get help', () => window.open(this.helpUrl));
176
- }
177
- /** Filename for exported files. Override for custom names */
178
- exportFilename(format) {
179
- return `${this.name} - ${new Date().toLocaleString()}.${this.supportedExportExtensions[format]}`;
180
- }
181
- /** Override to provide supported export formats.
182
- * These formats are available under the "Export" popup on the ribbon panel. */
183
- get supportedExportFormats() {
184
- return [
185
- 'Excel',
186
- ];
187
- }
188
- /** Override to provide custom file extensions for exported formats.
189
- * These formats are available under the "Export" popup on the ribbon panel. */
190
- get supportedExportExtensions() {
191
- return {
192
- 'Excel': 'xlsx',
193
- };
194
- }
195
- /** Override to provide custom export. Obligatory to override if custom {@link build()} or {@link buildOutputBlock()} is overriden. */
196
- export(format) {
197
- var _a, _b, _c, _d;
198
- return __awaiter(this, void 0, void 0, function* () {
199
- if (!this.func)
200
- throw new Error(`No function is associated with view`);
201
- const lastCall = this.lastCall;
202
- if (!lastCall)
203
- throw new Error(`Function was not called`);
204
- if (format !== 'Excel')
205
- throw new Error(`Format "${format}" is not supported.`);
206
- const BLOB_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8';
207
- const exportWorkbook = new ExcelJS.Workbook();
208
- const isScalarType = (type) => (DG.TYPES_SCALAR.has(type));
209
- const isDataFrame = (type) => (type === DG.TYPE.DATA_FRAME);
210
- const dfInputs = this.func.inputs.filter((input) => isDataFrame(input.propertyType));
211
- const scalarInputs = this.func.inputs.filter((input) => isScalarType(input.propertyType));
212
- const dfOutputs = this.func.outputs.filter((output) => isDataFrame(output.propertyType));
213
- const scalarOutputs = this.func.outputs.filter((output) => isScalarType(output.propertyType));
214
- const inputParams = [...lastCall.inputParams.values()];
215
- const outputParams = [...lastCall.outputParams.values()];
216
- dfInputs.forEach((dfInput) => {
217
- const visibleTitle = dfInput.options.caption || dfInput.name;
218
- const currentDfSheet = exportWorkbook.addWorksheet(getSheetName(visibleTitle, DIRECTION.INPUT));
219
- const currentDf = lastCall.inputs[dfInput.name];
220
- dfToSheet(currentDfSheet, currentDf);
221
- });
222
- if (scalarInputs.length) {
223
- const inputScalarsSheet = exportWorkbook.addWorksheet('Input scalars');
224
- scalarsToSheet(inputScalarsSheet, scalarInputs.map((scalarInput) => ({
225
- caption: scalarInput.options['caption'] || scalarInput.name,
226
- value: lastCall.inputs[scalarInput.name],
227
- units: scalarInput.options['units'] || '',
228
- })));
229
- }
230
- dfOutputs.forEach((dfOutput) => {
231
- const visibleTitle = dfOutput.options.caption || dfOutput.name;
232
- const currentDfSheet = exportWorkbook.addWorksheet(getSheetName(visibleTitle, DIRECTION.OUTPUT));
233
- const currentDf = lastCall.outputs[dfOutput.name];
234
- dfToSheet(currentDfSheet, currentDf);
235
- });
236
- if (scalarOutputs.length) {
237
- const outputScalarsSheet = exportWorkbook.addWorksheet('Output scalars');
238
- scalarsToSheet(outputScalarsSheet, scalarOutputs.map((scalarOutput) => ({
239
- caption: scalarOutput.options['caption'] || scalarOutput.name,
240
- value: lastCall.outputs[scalarOutput.name],
241
- units: scalarOutput.options['units'] || '',
242
- })));
243
- }
244
- const tabControl = this.resultsTabControl;
245
- if (tabControl) {
246
- for (const tabLabel of this.tabsLabels) {
247
- tabControl.currentPane = tabControl.getPane(tabLabel);
248
- yield new Promise((r) => setTimeout(r, 100));
249
- if (tabLabel === 'Input') {
250
- for (const inputParam of inputParams.filter((inputParam) => inputParam.property.propertyType === DG.TYPE.DATA_FRAME)) {
251
- const nonGridViewers = inputParam.aux['viewers'].filter((viewer) => viewer.type !== DG.VIEWER.GRID);
252
- const dfInput = dfInputs.find((input) => input.name === inputParam.name);
253
- const visibleTitle = dfInput.options.caption || inputParam.name;
254
- const currentDf = lastCall.inputs[dfInput.name];
255
- for (const [index, viewer] of nonGridViewers.entries()) {
256
- if (((_a = viewer.root.parentElement) === null || _a === void 0 ? void 0 : _a.style.display) === 'none') {
257
- (_b = this.paramGridSwitches.get(inputParam.name)) === null || _b === void 0 ? void 0 : _b.click();
258
- yield new Promise((r) => setTimeout(r, 50));
259
- }
260
- yield plotToSheet(exportWorkbook, exportWorkbook.getWorksheet(getSheetName(visibleTitle, DIRECTION.INPUT)), viewer.root, currentDf.columns.length + 2, (index > 0) ? Math.ceil(nonGridViewers[index - 1].root.clientHeight / 20) + 1 : 0);
261
- }
262
- ;
263
- }
264
- }
265
- else {
266
- for (const outputParam of outputParams.filter((outputParam) => outputParam.property.propertyType === DG.TYPE.DATA_FRAME && outputParam.property.category === tabLabel)) {
267
- const nonGridViewers = outputParam.aux['viewers'].filter((viewer) => viewer.type !== DG.VIEWER.GRID);
268
- const dfOutput = dfOutputs.find((input) => input.name === outputParam.name);
269
- const visibleTitle = dfOutput.options.caption || outputParam.name;
270
- const currentDf = lastCall.outputs[dfOutput.name];
271
- for (const [index, viewer] of nonGridViewers.entries()) {
272
- if (((_c = viewer.root.parentElement) === null || _c === void 0 ? void 0 : _c.style.display) === 'none') {
273
- (_d = this.paramGridSwitches.get(outputParam.name)) === null || _d === void 0 ? void 0 : _d.click();
274
- yield new Promise((r) => setTimeout(r, 50));
275
- }
276
- yield plotToSheet(exportWorkbook, exportWorkbook.getWorksheet(getSheetName(visibleTitle, DIRECTION.OUTPUT)), viewer.root, currentDf.columns.length + 2, (index > 0) ? Math.ceil(nonGridViewers[index - 1].root.clientHeight / 20) + 1 : 0);
277
- }
278
- }
279
- ;
280
- }
281
- }
282
- ;
283
- }
284
- const buffer = yield exportWorkbook.xlsx.writeBuffer();
285
- return new Blob([buffer], { type: BLOB_TYPE });
286
- });
287
152
  }
288
153
  /** Saves the computation results to the historical results, returns its id. See also {@link loadRun}. */
289
- saveRun(call) {
154
+ saveRun() {
290
155
  return __awaiter(this, void 0, void 0, function* () {
291
- throw new Error('Method is not implemented');
292
- /* await grok.dapi.functions.calls.save(call);*/
156
+ //@ts-ignore
157
+ return yield grok.dapi.functions.calls.save(this.funcCall);
293
158
  });
294
159
  }
295
160
  /** Loads the specified historical results. See also {@link saveRun}. */
296
- loadRun(runId) {
161
+ loadRun(funcCallId) {
297
162
  return __awaiter(this, void 0, void 0, function* () {
298
- throw new Error('Method is not implemented');
299
- /* await grok.dapi.functions.calls.find(call.id);*/
163
+ return yield grok.dapi.functions.calls.include('inputs, outputs').find(funcCallId);
300
164
  });
301
165
  }
302
166
  /** Loads all the function call of this function. */
167
+ /** ACHTUNG: FuncCall inputs/outputs are not included */
303
168
  pullRuns() {
169
+ var _a;
304
170
  return __awaiter(this, void 0, void 0, function* () {
305
- throw new Error('Method is not implemented');
306
- /* await grok.dapi.functions.calls.list();*/
171
+ return yield grok.dapi.functions.calls.filter(`func.id="${(_a = this.func) === null || _a === void 0 ? void 0 : _a.id}"`).list();
307
172
  });
308
173
  }
309
174
  clearResults(switchToOutput = true) {
310
- const categories = [];
311
- // this.resultTabs.clear();
312
- if (this.showInputs) {
313
- categories.push('Input');
314
- this.resultTabs.set('Input', this.inputsDiv);
315
- }
316
- for (const p of this.func.outputs) {
317
- if (categories.includes(p.category))
318
- continue;
319
- categories.push(p.category);
320
- }
175
+ const categories = this.tabsLabels;
321
176
  if ((categories.length > 1 || (categories.length == 1 && categories[0] != 'Misc'))) {
322
177
  this.resultsTabControl = DG.TabControl.create();
323
178
  for (const c of categories) {
324
179
  if (!this.resultTabs.has(c))
325
180
  this.resultTabs.set(c, ui.div([], 'ui-panel, grok-func-results, ui-box'));
326
181
  let name = c;
327
- if (this.showInputs && categories.length == 2 && c == 'Misc')
182
+ if (this.isInputPanelRequired && categories.length == 2 && c == 'Misc')
328
183
  name = 'OUTPUT';
329
184
  this.resultsTabControl.addPane(name, () => { var _a; return (_a = this.resultTabs.get(c)) !== null && _a !== void 0 ? _a : ui.div(); });
330
185
  }
331
- if (categories.length > 1 && this.showInputs && switchToOutput)
186
+ if (categories.length > 1 && this.isInputPanelRequired && switchToOutput)
332
187
  this.resultsTabControl.currentPane = this.resultsTabControl.panes[1];
333
188
  this.resultsDiv = this.resultsTabControl.root;
334
189
  }
335
190
  }
336
191
  run() {
337
192
  return __awaiter(this, void 0, void 0, function* () {
193
+ if (!this.funcCall)
194
+ throw new Error('The correspoding function is not specified');
338
195
  try {
339
- yield this.compute(this.preparedCall);
196
+ yield this.compute(this.funcCall);
340
197
  }
341
198
  catch (e) {
342
- // this.onComputationError.next(this.lastCall);
343
199
  }
344
- this.onComputationSucceeded.next(this.lastCall);
345
- this.lastCall = this.preparedCall;
200
+ this.lastCall = this.funcCall;
346
201
  this.outputParametersToView(this.lastCall);
347
202
  });
348
203
  }
@@ -356,7 +211,7 @@ export class FunctionView extends DG.ViewBase {
356
211
  for (const p of call.outputParams.values()) {
357
212
  p.processOutput();
358
213
  if (p.property.propertyType == DG.TYPE.DATA_FRAME && p.value != null)
359
- this.appendResultDataFrame(p, { caption: p.property.name, category: p.property.category });
214
+ this.appendOutputDf(p, { caption: p.property.name, category: p.property.category });
360
215
  else
361
216
  this.appendResultScalar(p, { caption: p.property.name, category: p.property.category });
362
217
  }
@@ -376,32 +231,31 @@ export class FunctionView extends DG.ViewBase {
376
231
  return editor;
377
232
  }));
378
233
  }
379
- appendResultDataFrame(param, options) {
380
- var _a, _b, _c, _d;
234
+ appendOutputDf(param, options) {
235
+ var _a, _b, _c, _d, _e;
381
236
  const paramDf = param.value;
382
- let caption = options === null || options === void 0 ? void 0 : options.caption;
383
237
  const height = (_a = options === null || options === void 0 ? void 0 : options.height) !== null && _a !== void 0 ? _a : 400;
384
- const viewers = (_b = param.aux['viewers']) !== null && _b !== void 0 ? _b : []; // storing the viewers of Df
385
- caption !== null && caption !== void 0 ? caption : (caption = (_d = (_c = param.aux['viewerTitle']) !== null && _c !== void 0 ? _c : ((this.singleDfParam && viewers.length == 1) ? '' : param.property.caption)) !== null && _d !== void 0 ? _d : '');
386
- let existingViewers = this.paramViewers.get(param.name);
238
+ const paramViewers = (_b = param.aux['viewers']) !== null && _b !== void 0 ? _b : []; // storing the viewers of Df
239
+ const paramCaption = (_e = (_d = (_c = options === null || options === void 0 ? void 0 : options.caption) !== null && _c !== void 0 ? _c : param.aux['viewerTitle']) !== null && _d !== void 0 ? _d : param.property.caption) !== null && _e !== void 0 ? _e : '';
240
+ let existingViewers = this.existingParamViewers.get(param.name);
387
241
  if (existingViewers != null) {
388
242
  for (const v of existingViewers)
389
243
  v.dataFrame = paramDf;
390
244
  return;
391
245
  }
392
246
  existingViewers !== null && existingViewers !== void 0 ? existingViewers : (existingViewers = []);
393
- this.paramViewers.set(param.name, existingViewers);
394
- if (viewers.length == 0)
395
- viewers.push(paramDf.plot.grid());
247
+ this.existingParamViewers.set(param.name, existingViewers);
248
+ if (paramViewers.length == 0)
249
+ paramViewers.push(paramDf.plot.grid());
396
250
  const viewersToHide = [];
397
251
  let blocks = 0;
398
252
  let blockWidth = 0;
399
253
  const gridWrapper = ui.box(null, { style: { height: '100%' } });
400
- const isGridSwitchable = wu(viewers).every((v) => v.type !== 'Grid');
254
+ const isGridSwitchable = wu(paramViewers).every((v) => v.type !== 'Grid');
401
255
  $(gridWrapper).hide();
402
256
  const getHeader = () => {
403
257
  var _a;
404
- const headerLabel = (_a = caption !== null && caption !== void 0 ? caption : paramDf.name) !== null && _a !== void 0 ? _a : '';
258
+ const headerLabel = (_a = paramCaption !== null && paramCaption !== void 0 ? paramCaption : paramDf.name) !== null && _a !== void 0 ? _a : '';
405
259
  const header = ui.div([], 'grok-func-results-header');
406
260
  if (headerLabel != '') {
407
261
  const h = ui.h1(headerLabel);
@@ -422,7 +276,7 @@ export class FunctionView extends DG.ViewBase {
422
276
  e.stopPropagation();
423
277
  const v = grok.shell.addTableView(paramDf);
424
278
  (() => __awaiter(this, void 0, void 0, function* () {
425
- for (const viewer of viewers) {
279
+ for (const viewer of paramViewers) {
426
280
  if (viewer.type != 'Grid') {
427
281
  const newViewer = yield paramDf.plot.fromType(viewer.type);
428
282
  newViewer.setOptions(viewer.getOptions());
@@ -441,7 +295,7 @@ export class FunctionView extends DG.ViewBase {
441
295
  }
442
296
  const header = getHeader();
443
297
  const wrapper = ui.divH([], { style: { height: '100%' } });
444
- viewers.forEach((viewer) => {
298
+ paramViewers.forEach((viewer) => {
445
299
  var _a;
446
300
  if ((viewer === null || viewer === void 0 ? void 0 : viewer.tags) == null)
447
301
  return;
@@ -481,43 +335,4 @@ export class FunctionView extends DG.ViewBase {
481
335
  this.resultsDiv.appendChild(d);
482
336
  }
483
337
  }
484
- const getSheetName = (name, direction) => {
485
- const idealName = `${direction} - ${name}`;
486
- return (idealName.length > 31) ? name.substring(0, 32) : idealName;
487
- };
488
- var DIRECTION;
489
- (function (DIRECTION) {
490
- DIRECTION["INPUT"] = "Input";
491
- DIRECTION["OUTPUT"] = "Output";
492
- })(DIRECTION || (DIRECTION = {}));
493
- const scalarsToSheet = (sheet, scalars) => {
494
- sheet.addRow(['Parameter', 'Value', 'Units']).font = { bold: true };
495
- scalars.forEach((scalar) => {
496
- sheet.addRow([scalar.caption, scalar.value, scalar.units]);
497
- });
498
- sheet.getColumn(1).width = Math.max(...scalars.map((scalar) => scalar.caption.toString().length), 'Parameter'.length) * 1.2;
499
- sheet.getColumn(2).width = Math.max(...scalars.map((scalar) => scalar.value.toString().length), 'Value'.length) * 1.2;
500
- sheet.getColumn(3).width = Math.max(...scalars.map((scalar) => scalar.units.toString().length), 'Units'.length) * 1.2;
501
- };
502
- const dfToSheet = (sheet, df) => {
503
- sheet.addRow(df.columns.names()).font = { bold: true };
504
- for (let i = 0; i < df.rowCount; i++)
505
- sheet.addRow([...df.row(i).cells].map((cell) => cell.value));
506
- for (let i = 0; i < df.columns.length; i++) {
507
- sheet.getColumn(i + 1).width =
508
- Math.max(...df.columns.byIndex(i).categories.map((category) => category.toString().length), df.columns.byIndex(i).name.length) * 1.2;
509
- }
510
- };
511
- const plotToSheet = (exportWb, sheet, plot, columnForImage, rowForImage = 0) => __awaiter(void 0, void 0, void 0, function* () {
512
- const canvas = yield html2canvas(plot, { logging: false });
513
- const dataUrl = canvas.toDataURL('image/png');
514
- const imageId = exportWb.addImage({
515
- base64: dataUrl,
516
- extension: 'png',
517
- });
518
- sheet.addImage(imageId, {
519
- tl: { col: columnForImage, row: rowForImage },
520
- ext: { width: canvas.width, height: canvas.height },
521
- });
522
- });
523
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImZ1bmN0aW9uLXZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsZ0NBQWdDO0FBQ2hDLDRCQUE0QjtBQUM1QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxDQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLFdBQVcsTUFBTSxhQUFhLENBQUM7QUFFdEMsTUFBTSxPQUFPLFlBQWEsU0FBUSxFQUFFLENBQUMsUUFBUTtJQUMzQyxZQUFZLFFBQTRCO1FBQ3RDLEtBQUssRUFBRSxDQUFDO1FBY1Ysc0JBQWlCLEdBQXVCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNELG1CQUFjLEdBQXVCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRXhELHlCQUFvQixHQUE4QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLCtCQUErQjtRQUNyRywyQkFBc0IsR0FBOEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxzREFBc0Q7UUFDOUgsMkJBQXNCLEdBQThCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsK0NBQStDO1FBQ3ZILHVCQUFrQixHQUE4QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLGlEQUFpRDtRQUU3RyxVQUFLLEdBQVcsVUFBVSxDQUFDO1FBZTVCLGFBQVEsR0FBdUIsSUFBSSxDQUFDO1FBQ2pDLHFCQUFn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QUFHLENBQUMsQ0FBQyxDQUFDLEtBQUs7WUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FDTixHQUFJLEVBQUUsQ0FBQyxPQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQ25HLEVBQUUsQ0FBQyxPQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyRCxHQUFHLEdBQUcsQ0FBQztLQUNYO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQUcsQ0FBTyxRQUEwQixFQUFFLEtBQXdCLEVBQUUsSUFBaUIsRUFBRSxjQUFzQixFQUFFLGNBQXNCLENBQUMsRUFBRSxFQUFFO0lBQ3JKLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLElBQW1CLEVBQUUsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztJQUN4RSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRTlDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDaEMsTUFBTSxFQUFFLE9BQU87UUFDZixTQUFTLEVBQUUsS0FBSztLQUNqQixDQUFDLENBQUM7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRTtRQUN0QixFQUFFLEVBQUUsRUFBQyxHQUFHLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUM7UUFDM0MsR0FBRyxFQUFFLEVBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUM7S0FDbEQsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFBLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0IHd1IGZyb20gJ3d1JztcbmltcG9ydCAkIGZyb20gJ2Nhc2gtZG9tJztcbmltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgcnhqcyBmcm9tICdyeGpzJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IEV4Y2VsSlMgZnJvbSAnZXhjZWxqcyc7XG5pbXBvcnQgaHRtbDJjYW52YXMgZnJvbSAnaHRtbDJjYW52YXMnO1xuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25WaWV3IGV4dGVuZHMgREcuVmlld0Jhc2Uge1xuICBjb25zdHJ1Y3RvcihmdW5jQ2FsbDogREcuRnVuY0NhbGwgfCBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnByZXBhcmVkQ2FsbCA9IGZ1bmNDYWxsO1xuICAgIHRoaXMuY29udGV4dCA9IERHLkNvbnRleHQuY2xvbmVEZWZhdWx0KCk7XG4gICAgdGhpcy5jb250cm9sc1Jvb3Quc3R5bGUubWF4V2lkdGggPSAnMzcwcHgnO1xuICAgIHRoaXMuYm94ID0gdHJ1ZTtcblxuICAgIGlmIChmdW5jQ2FsbClcbiAgICAgIHRoaXMuaW5pdChmdW5jQ2FsbCk7XG4gIH1cblxuICBnZXQgZnVuYygpIHtcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlZENhbGwhLmZ1bmM7XG4gIH1cblxuICBvblZpZXdJbml0aWFsaXplZDogcnhqcy5TdWJqZWN0PHZvaWQ+ID0gbmV3IHJ4anMuU3ViamVjdCgpO1xuICBvbklucHV0Q2hhbmdlZDogcnhqcy5TdWJqZWN0PHZvaWQ+ID0gbmV3IHJ4anMuU3ViamVjdCgpO1xuXG4gIG9uQ29tcHV0YXRpb25TdGFydGVkOiByeGpzLlN1YmplY3Q8REcuRnVuY0NhbGw+ID0gbmV3IHJ4anMuU3ViamVjdCgpOyAvLyBlbWl0dGVkIG9uIGNvbXB1dGF0aW9uIHN0YXJ0XG4gIG9uQ29tcHV0YXRpb25Db21wbGV0ZWQ6IHJ4anMuU3ViamVjdDxERy5GdW5jQ2FsbD4gPSBuZXcgcnhqcy5TdWJqZWN0KCk7IC8vIGVtaXR0ZWQgYW55d2F5IGlmIGNvbXB1dGF0aW9uIGVuZGVkIHByb3Blcmx5IG9yIG5vdFxuICBvbkNvbXB1dGF0aW9uU3VjY2VlZGVkOiByeGpzLlN1YmplY3Q8REcuRnVuY0NhbGw+ID0gbmV3IHJ4anMuU3ViamVjdCgpOyAvLyBlbWl0dGVkIGFueXdheSBpZiBjb21wdXRhdGlvbiBlbmRlZCBwcm9wZXJseVxuICBvbkNvbXB1dGF0aW9uRXJyb3I6IHJ4anMuU3ViamVjdDxERy5GdW5jQ2FsbD4gPSBuZXcgcnhqcy5TdWJqZWN0KCk7IC8vIGVtaXR0ZWQgYW55d2F5IGlmIGNvbXB1dGF0aW9uIGVuZGVkIHdpdGggZXJyb3JcblxuICBwcml2YXRlIF90eXBlOiBzdHJpbmcgPSAnZnVuY3Rpb24nO1xuICBwdWJsaWMgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNJbnB1dFBhbmVsUmVxdWlyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnVuYy5pbnB1dHMuc29tZSgocCkgPT4gcC5wcm9wZXJ0eVR5cGUgPT0gREcuVFlQRS5EQVRBX0ZSQU1FICYmIHAub3B0aW9uc1sndmlld2VyJ10gIT0gbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRhYnNMYWJlbHMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucGFyYW1Ub0NhdGVnb3J5TWFwKTtcbiAgfVxuXG4gIHJlYWRvbmx5IGNvbnRleHQ6IERHLkNvbnRleHQ7XG4gIHB1YmxpYyBwcmVwYXJlZENhbGw6IERHLkZ1bmNDYWxsIHwgbnVsbDtcbiAgcHVibGljIGxhc3RDYWxsOiBERy5GdW5jQ2FsbCB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgb3V0cHV0Q2F0ZWdvcmllcyA9IFtdIGFzIHN0cmluZ1tdO1xuICBwcm90ZWN0ZWQgcGFyYW1Ub0NhdGVnb3J5TWFwID0ge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuXG4gIGFzeW5jIGluaXQoZnVuY0NhbGw6IERHLkZ1bmNDYWxsKSB7XG4gICAgdGhpcy5wcmVwYXJlZENhbGwgPz89IGZ1bmNDYWxsO1xuXG4gICAgdGhpcy5wcmVwYXJlZENhbGwuYXV4Wyd2aWV3J10gPSB0aGlzO1xuICAgIHRoaXMucHJlcGFyZWRDYWxsLmNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG5cbiAgICB0aGlzLnNpbmdsZURmUGFyYW0gPSB3dSh0aGlzLmZ1bmMub3V0cHV0cykuZmlsdGVyKChwKSA9PiBwLnByb3BlcnR5VHlwZSA9PSBERy5UWVBFLkRBVEFfRlJBTUUpXG4gICAgICAudG9BcnJheSgpLmxlbmd0aCA9PSAxO1xuXG4gICAgZm9yIChjb25zdCBpblBhcmFtIG9mIHd1KHRoaXMucHJlcGFyZWRDYWxsLmlucHV0UGFyYW1zLnZhbHVlcygpIGFzIERHLkZ1bmNDYWxsUGFyYW1bXSlcbiAgICAgIC5maWx0ZXIoKHA6IERHLkZ1bmNDYWxsUGFyYW0pID0+XG4gICAgICAgIHAucHJvcGVydHkucHJvcGVydHlUeXBlID09IERHLlRZUEUuREFUQV9GUkFNRSAmJiBwLnByb3BlcnR5Lm9wdGlvbnNbJ3ZpZXdlciddICE9IG51bGwpKSB7XG4gICAgICB0aGlzLnNob3dJbnB1dHMgPSB0cnVlO1xuICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICB0aGlzLnN1YnMucHVzaChpblBhcmFtLm9uQ2hhbmdlZC5zdWJzY3JpYmUoYXN5bmMgZnVuY3Rpb24ocGFyYW06IERHLkZ1bmNDYWxsUGFyYW0pIHtcbiAgICAgICAgc2VsZi5jbGVhclJlc3VsdHMoZmFsc2UpO1xuICAgICAgICBwYXJhbS5wcm9jZXNzT3V0cHV0KCk7XG5cbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHREYXRhRnJhbWUocGFyYW0sIHtcbiAgICAgICAgICBoZWlnaHQ6IChzZWxmLnNpbmdsZURmUGFyYW0gJiYgIWdyb2suc2hlbGwud2luZG93cy5wcmVzZW50YXRpb25Nb2RlKSA/IDYwMCA6IDQwMCxcbiAgICAgICAgICBjYXRlZ29yeTogJ0lucHV0J1xuICAgICAgICB9KTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRQYXJhbUNhdGVnb3JpZXMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFxuICAgICAgICB0aGlzLmZ1bmMhLm91dHB1dHNcbiAgICAgICAgICAubWFwKChwKSA9PiBwLmNhdGVnb3J5KSAvLyBnZXQgYWxsIG91dHB1dCBwYXJhbXMnIGNhdGVnb3JpZXNcbiAgICAgICAgICAuZmlsdGVyKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkgIT09ICdNaXNjJykgLy8gZmlsdGVyIG91dCB0aGUgZGVmYXVsdCBvbmVzXG4gICAgICApXTsgLy8ga2VlcCBvbmx5IHVuaXF1ZSBvZiB0aGVtXG5cbiAgICB0aGlzLm91dHB1dENhdGVnb3JpZXMgPSBbXG4gICAgICAuLi4hb3V0UGFyYW1DYXRlZ29yaWVzLmxlbmd0aCA/IFsnT3V0cHV0J10gOiBbXSwgLy8gaWYgbm8gY2F0ZWdvcmllcyBhcmUgc3RhdGVkLCB0aGUgZGVmYXVsdCBjYXRlZ29yeSBpcyBhZGRlZFxuICAgICAgLi4ub3V0UGFyYW1DYXRlZ29yaWVzLFxuICAgIF07XG5cbiAgICBpZiAodGhpcy5pc0lucHV0UGFuZWxSZXF1aXJlZClcbiAgICAgIHRoaXMuZnVuYy5pbnB1dHMuZm9yRWFjaCgocCkgPT4gdGhpcy5wYXJhbVRvQ2F0ZWdvcnlNYXBbJ0lucHV0J10gPyB0aGlzLnBhcmFtVG9DYXRlZ29yeU1hcFsnSW5wdXQnXS5wdXNoKHAubmFtZSk6IHRoaXMucGFyYW1Ub0NhdGVnb3J5TWFwWydJbnB1dCddID0gW3AubmFtZV0pO1xuXG4gICAgdGhpcy5mdW5jLm91dHB1dHMuZm9yRWFjaCgocCkgPT4gdGhpcy5wYXJhbVRvQ2F0ZWdvcnlNYXBbcC5jYXRlZ29yeSA9PT0gJ01pc2MnID8gJ091dHB1dCc6IHAuY2F0ZWdvcnldID8gdGhpcy5wYXJhbVRvQ2F0ZWdvcnlNYXBbcC5jYXRlZ29yeSA9PT0gJ01pc2MnID8gJ091dHB1dCc6IHAuY2F0ZWdvcnldLnB1c2gocC5uYW1lKSA6IHRoaXMucGFyYW1Ub0NhdGVnb3J5TWFwW3AuY2F0ZWdvcnkgPT09ICdNaXNjJyA/ICdPdXRwdXQnOiBwLmNhdGVnb3J5XSA9IFtwLm5hbWVdKTtcblxuICAgIHRoaXMucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmJ1aWxkKCkpO1xuXG4gICAgdGhpcy5idWlsZFJpYmJvblBhbmVscygpO1xuICAgIHRoaXMuYnVpbGRIaXN0b3J5QmxvY2soKTtcbiAgICB0aGlzLmJ1aWxkUmliYm9uTWVudSgpO1xuXG4gICAgdGhpcy5uYW1lID0gdGhpcy5mdW5jLmZyaWVuZGx5TmFtZTtcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0byBjcmVhdGUgYSBmdWxseSBjdXN0b20gVUkgKi9cbiAgYnVpbGQoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGlucHV0QmxvY2sgPSB0aGlzLmJ1aWxkSW5wdXRCbG9jaygpO1xuICAgIGNvbnN0IG91dHB1dEJsb2NrID0gdGhpcy5idWlsZE91dHB1dEJsb2NrKCk7XG5cbiAgICByZXR1cm4gdWkuc3BsaXRIKFtpbnB1dEJsb2NrLCBvdXRwdXRCbG9ja10pO1xuICB9XG5cbiAgLyoqIE92ZXJyaWRlIHRvIGNyZWF0ZSBhIGN1c3RvbSBpbnB1dCBibG9jay4gKi9cbiAgYnVpbGRJbnB1dEJsb2NrKCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBmdW5jRGl2ID0gdWkuZGl2KFt0aGlzLnJlbmRlclJ1blNlY3Rpb24odGhpcy5wcmVwYXJlZENhbGwhKV0sICd1aS1kaXYnKTtcbiAgICB0aGlzLmNvbnRyb2xzUm9vdC5pbm5lckhUTUwgPSAnJztcbiAgICB0aGlzLmNvbnRyb2xzUm9vdC5hcHBlbmRDaGlsZChmdW5jRGl2KTtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sc1Jvb3Q7XG4gIH1cblxuICAvKiogT3ZlcnJpZGUgdG8gY3JlYXRlIGEgY3VzdG9tIG91dHB1dCBibG9jay4gKi9cbiAgYnVpbGRPdXRwdXRCbG9jaygpOiBIVE1MRWxlbWVudCB7XG4gICAgdGhpcy5yZXN1bHRzUm9vdC5pbm5lckhUTUwgPSAnJztcbiAgICB0aGlzLnJlc3VsdHNSb290LmFwcGVuZENoaWxkKHRoaXMucmVzdWx0c0Rpdik7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0c1Jvb3Q7XG4gIH1cblxuICAvKiogT3ZlcnJpZGUgdG8gY3JlYXRlIGEgY3VzdG9tIGhpc3RvcmljYWwgcnVucyBjb250cm9sLiAqL1xuICBidWlsZEhpc3RvcnlCbG9jaygpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgbmV3SGlzdG9yeUJsb2NrID0gdWkuaWNvbkZBKCdoaXN0b3J5JywgKCkgPT4ge1xuICAgICAgdGhpcy5wdWxsUnVucygpLnRoZW4oYXN5bmMgKGhpc3RvcmljYWxSdW5zKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbnUgPSBERy5NZW51LnBvcHVwKCk7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBydW4gb2YgaGlzdG9yaWNhbFJ1bnMpIHtcbiAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICBtZW51Lml0ZW0oYCR7cnVuLmZ1bmMuZnJpZW5kbHlOYW1lfSDigJQgJHtpfWAsIGFzeW5jICgpID0+IHRoaXMuaGlzdG9yaWNhbFJ1blNlcnZpY2UubG9hZFJ1bihydW4uaWQpKTtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgbWVudS5zaG93KCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLmhpc3RvcnlSb290LmlubmVySFRNTCA9ICcnO1xuICAgIHRoaXMuaGlzdG9yeVJvb3QuYXBwZW5kKG5ld0hpc3RvcnlCbG9jayk7XG4gICAgcmV0dXJuIG5ld0hpc3RvcnlCbG9jaztcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0byBjcmVhdGUgYSBjdXN0b20gaW5wdXQgY29udHJvbC4gKi9cbiAgYnVpbGRSaWJib25QYW5lbHMoKTogSFRNTEVsZW1lbnRbXVtdIHtcbiAgICBjb25zdCBuZXdSaWJib25QYW5lbHMgPSBbXG4gICAgICAuLi50aGlzLmdldFJpYmJvblBhbmVscygpLFxuICAgICAgWy4uLih0aGlzLnN1cHBvcnRlZEV4cG9ydEZvcm1hdHMubGVuZ3RoID4gMCkgPyBbdWkuZGl2SChbXG4gICAgICAgIHVpLmNvbWJvUG9wdXAoXG4gICAgICAgICAgdWkuaWNvbkZBKCdhcnJvdy10by1ib3R0b20nKSxcbiAgICAgICAgICB0aGlzLnN1cHBvcnRlZEV4cG9ydEZvcm1hdHMsXG4gICAgICAgICAgYXN5bmMgKGZvcm1hdDogc3RyaW5nKSA9PiBERy5VdGlscy5kb3dubG9hZCh0aGlzLmV4cG9ydEZpbGVuYW1lKGZvcm1hdCksIGF3YWl0IHRoaXMuZXhwb3J0KGZvcm1hdCkpKSxcbiAgICAgIF0pXTogW11dXG4gICAgXTtcbiAgICB0aGlzLnNldFJpYmJvblBhbmVscyhuZXdSaWJib25QYW5lbHMpO1xuICAgIHJldHVybiBuZXdSaWJib25QYW5lbHM7XG4gIH1cblxuICAvKiogT3ZlcnJpZGUgdG8gY3JlYXRlIGEgY3VzdG9tIHJpYmJvbiBtZW51IG9uIHRoZSB0b3AuICovXG4gIGJ1aWxkUmliYm9uTWVudSgpIHtcbiAgICBpZiAodGhpcy5zdXBwb3J0ZWRFeHBvcnRGb3JtYXRzLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5yZXBvcnRCdWcgJiYgIXRoaXMuaGVscFVybCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmliYm9uTWVudSA9IHRoaXMucmliYm9uTWVudS5ncm91cCgnTW9kZWwnKTtcblxuICAgIGlmICh0aGlzLnN1cHBvcnRlZEV4cG9ydEZvcm1hdHMubGVuZ3RoID4gMCkge1xuICAgICAgcmliYm9uTWVudVxuICAgICAgICAuZ3JvdXAoJ0V4cG9ydCcpXG4gICAgICAgIC5pdGVtcyh0aGlzLnN1cHBvcnRlZEV4cG9ydEZvcm1hdHMsIGFzeW5jIChmb3JtYXQ6IHN0cmluZykgPT4gREcuVXRpbHMuZG93bmxvYWQodGhpcy5leHBvcnRGaWxlbmFtZShmb3JtYXQpLCBhd2FpdCB0aGlzLmV4cG9ydChmb3JtYXQpKSlcbiAgICAgICAgLmVuZEdyb3VwKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVwb3J0QnVnKVxuICAgICAgcmliYm9uTWVudS5pdGVtKCdSZXBvcnQgYSBidWcnLCAoKSA9PiB0aGlzLnJlcG9ydEJ1ZyEoKSk7XG5cbiAgICBpZiAodGhpcy5oZWxwVXJsKVxuICAgICAgcmliYm9uTWVudS5pdGVtKCdHZXQgaGVscCcsICgpID0+IHdpbmRvdy5vcGVuKHRoaXMuaGVscFVybCEpKTtcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0byBjcmVhdGUgYnVnIHJlcG9ydGluZyBmZWF0dXJlICovXG4gIHJlcG9ydEJ1ZzogKCgpID0+IFByb21pc2U8dm9pZD4pIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEZpbGVuYW1lIGZvciBleHBvcnRlZCBmaWxlcy4gT3ZlcnJpZGUgZm9yIGN1c3RvbSBuYW1lcyAqL1xuICBleHBvcnRGaWxlbmFtZShmb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMubmFtZX0gLSAke25ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKX0uJHt0aGlzLnN1cHBvcnRlZEV4cG9ydEV4dGVuc2lvbnNbZm9ybWF0XX1gO1xuICB9XG5cbiAgLyoqIE92ZXJyaWRlIHRvIHByb3ZpZGUgc3VwcG9ydGVkIGV4cG9ydCBmb3JtYXRzLlxuICAgKiBUaGVzZSBmb3JtYXRzIGFyZSBhdmFpbGFibGUgdW5kZXIgdGhlIFwiRXhwb3J0XCIgcG9wdXAgb24gdGhlIHJpYmJvbiBwYW5lbC4gKi9cbiAgZ2V0IHN1cHBvcnRlZEV4cG9ydEZvcm1hdHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnRXhjZWwnLFxuICAgIF07XG4gIH1cblxuICAvKiogT3ZlcnJpZGUgdG8gcHJvdmlkZSBjdXN0b20gZmlsZSBleHRlbnNpb25zIGZvciBleHBvcnRlZCBmb3JtYXRzLlxuICAgKiBUaGVzZSBmb3JtYXRzIGFyZSBhdmFpbGFibGUgdW5kZXIgdGhlIFwiRXhwb3J0XCIgcG9wdXAgb24gdGhlIHJpYmJvbiBwYW5lbC4gKi9cbiAgZ2V0IHN1cHBvcnRlZEV4cG9ydEV4dGVuc2lvbnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdFeGNlbCc6ICd4bHN4JyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIE92ZXJyaWRlIHRvIHByb3ZpZGUgY3VzdG9tIGV4cG9ydC4gT2JsaWdhdG9yeSB0byBvdmVycmlkZSBpZiBjdXN0b20ge0BsaW5rIGJ1aWxkKCl9IG9yIHtAbGluayBidWlsZE91dHB1dEJsb2NrKCl9IGlzIG92ZXJyaWRlbi4gKi9cbiAgYXN5bmMgZXhwb3J0KGZvcm1hdDogc3RyaW5nKTogUHJvbWlzZTxCbG9iPiB7XG4gICAgaWYgKCF0aGlzLmZ1bmMpIHRocm93IG5ldyBFcnJvcihgTm8gZnVuY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoIHZpZXdgKTtcblxuICAgIGNvbnN0IGxhc3RDYWxsID0gdGhpcy5sYXN0Q2FsbDtcbiAgICBpZiAoIWxhc3RDYWxsKSB0aHJvdyBuZXcgRXJyb3IoYEZ1bmN0aW9uIHdhcyBub3QgY2FsbGVkYCk7XG5cbiAgICBpZiAoZm9ybWF0ICE9PSAnRXhjZWwnKSB0aHJvdyBuZXcgRXJyb3IoYEZvcm1hdCBcIiR7Zm9ybWF0fVwiIGlzIG5vdCBzdXBwb3J0ZWQuYCk7XG5cbiAgICBjb25zdCBCTE9CX1RZUEUgPSAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQ7Y2hhcnNldD1VVEYtOCc7XG4gICAgY29uc3QgZXhwb3J0V29ya2Jvb2sgPSBuZXcgRXhjZWxKUy5Xb3JrYm9vaygpO1xuXG4gICAgY29uc3QgaXNTY2FsYXJUeXBlID0gKHR5cGU6IERHLlRZUEUpID0+IChERy5UWVBFU19TQ0FMQVIuaGFzKHR5cGUpKTtcblxuICAgIGNvbnN0IGlzRGF0YUZyYW1lID0gKHR5cGU6IERHLlRZUEUpID0+ICh0eXBlID09PSBERy5UWVBFLkRBVEFfRlJBTUUpO1xuXG4gICAgY29uc3QgZGZJbnB1dHMgPSB0aGlzLmZ1bmMuaW5wdXRzLmZpbHRlcigoaW5wdXQpID0+IGlzRGF0YUZyYW1lKGlucHV0LnByb3BlcnR5VHlwZSkpO1xuICAgIGNvbnN0IHNjYWxhcklucHV0cyA9IHRoaXMuZnVuYy5pbnB1dHMuZmlsdGVyKChpbnB1dCkgPT4gaXNTY2FsYXJUeXBlKGlucHV0LnByb3BlcnR5VHlwZSkpO1xuICAgIGNvbnN0IGRmT3V0cHV0cyA9IHRoaXMuZnVuYy5vdXRwdXRzLmZpbHRlcigob3V0cHV0KSA9PiBpc0RhdGFGcmFtZShvdXRwdXQucHJvcGVydHlUeXBlKSk7XG4gICAgY29uc3Qgc2NhbGFyT3V0cHV0cyA9IHRoaXMuZnVuYy5vdXRwdXRzLmZpbHRlcigob3V0cHV0KSA9PiBpc1NjYWxhclR5cGUob3V0cHV0LnByb3BlcnR5VHlwZSkpO1xuXG4gICAgY29uc3QgaW5wdXRQYXJhbXMgPSBbLi4ubGFzdENhbGwuaW5wdXRQYXJhbXMudmFsdWVzKCldIGFzIERHLkZ1bmNDYWxsUGFyYW1bXTtcbiAgICBjb25zdCBvdXRwdXRQYXJhbXMgPSBbLi4ubGFzdENhbGwub3V0cHV0UGFyYW1zLnZhbHVlcygpXSBhcyBERy5GdW5jQ2FsbFBhcmFtW107XG5cbiAgICBkZklucHV0cy5mb3JFYWNoKChkZklucHV0KSA9PiB7XG4gICAgICBjb25zdCB2aXNpYmxlVGl0bGUgPSBkZklucHV0Lm9wdGlvbnMuY2FwdGlvbiB8fCBkZklucHV0Lm5hbWU7XG4gICAgICBjb25zdCBjdXJyZW50RGZTaGVldCA9IGV4cG9ydFdvcmtib29rLmFkZFdvcmtzaGVldChnZXRTaGVldE5hbWUodmlzaWJsZVRpdGxlLCBESVJFQ1RJT04uSU5QVVQpKTtcblxuICAgICAgY29uc3QgY3VycmVudERmID0gKGxhc3RDYWxsLmlucHV0c1tkZklucHV0Lm5hbWVdIGFzIERHLkRhdGFGcmFtZSk7XG4gICAgICBkZlRvU2hlZXQoY3VycmVudERmU2hlZXQsIGN1cnJlbnREZik7XG4gICAgfSk7XG5cbiAgICBpZiAoc2NhbGFySW5wdXRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgaW5wdXRTY2FsYXJzU2hlZXQgPSBleHBvcnRXb3JrYm9vay5hZGRXb3Jrc2hlZXQoJ0lucHV0IHNjYWxhcnMnKTtcbiAgICAgIHNjYWxhcnNUb1NoZWV0KGlucHV0U2NhbGFyc1NoZWV0LCBzY2FsYXJJbnB1dHMubWFwKChzY2FsYXJJbnB1dCkgPT4gKHtcbiAgICAgICAgY2FwdGlvbjogc2NhbGFySW5wdXQub3B0aW9uc1snY2FwdGlvbiddIHx8IHNjYWxhcklucHV0Lm5hbWUsXG4gICAgICAgIHZhbHVlOiBsYXN0Q2FsbC5pbnB1dHNbc2NhbGFySW5wdXQubmFtZV0sXG4gICAgICAgIHVuaXRzOiBzY2FsYXJJbnB1dC5vcHRpb25zWyd1bml0cyddIHx8ICcnLFxuICAgICAgfSkpKTtcbiAgICB9XG5cbiAgICBkZk91dHB1dHMuZm9yRWFjaCgoZGZPdXRwdXQpID0+IHtcbiAgICAgIGNvbnN0IHZpc2libGVUaXRsZSA9IGRmT3V0cHV0Lm9wdGlvbnMuY2FwdGlvbiB8fCBkZk91dHB1dC5uYW1lO1xuICAgICAgY29uc3QgY3VycmVudERmU2hlZXQgPSBleHBvcnRXb3JrYm9vay5hZGRXb3Jrc2hlZXQoZ2V0U2hlZXROYW1lKHZpc2libGVUaXRsZSwgRElSRUNUSU9OLk9VVFBVVCkpO1xuXG4gICAgICBjb25zdCBjdXJyZW50RGYgPSAobGFzdENhbGwub3V0cHV0c1tkZk91dHB1dC5uYW1lXSBhcyBERy5EYXRhRnJhbWUpO1xuICAgICAgZGZUb1NoZWV0KGN1cnJlbnREZlNoZWV0LCBjdXJyZW50RGYpO1xuICAgIH0pO1xuXG5cbiAgICBpZiAoc2NhbGFyT3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG91dHB1dFNjYWxhcnNTaGVldCA9IGV4cG9ydFdvcmtib29rLmFkZFdvcmtzaGVldCgnT3V0cHV0IHNjYWxhcnMnKTtcbiAgICAgIHNjYWxhcnNUb1NoZWV0KG91dHB1dFNjYWxhcnNTaGVldCwgc2NhbGFyT3V0cHV0cy5tYXAoKHNjYWxhck91dHB1dCkgPT4gKHtcbiAgICAgICAgY2FwdGlvbjogc2NhbGFyT3V0cHV0Lm9wdGlvbnNbJ2NhcHRpb24nXSB8fCBzY2FsYXJPdXRwdXQubmFtZSxcbiAgICAgICAgdmFsdWU6IGxhc3RDYWxsLm91dHB1dHNbc2NhbGFyT3V0cHV0Lm5hbWVdLFxuICAgICAgICB1bml0czogc2NhbGFyT3V0cHV0Lm9wdGlvbnNbJ3VuaXRzJ10gfHwgJycsXG4gICAgICB9KSkpO1xuICAgIH1cblxuICAgIGNvbnN0IHRhYkNvbnRyb2wgPSB0aGlzLnJlc3VsdHNUYWJDb250cm9sO1xuICAgIGlmICh0YWJDb250cm9sKSB7XG4gICAgICBmb3IgKGNvbnN0IHRhYkxhYmVsIG9mIHRoaXMudGFic0xhYmVscykge1xuICAgICAgICB0YWJDb250cm9sLmN1cnJlbnRQYW5lID0gdGFiQ29udHJvbC5nZXRQYW5lKHRhYkxhYmVsKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMTAwKSk7XG4gICAgICAgIGlmICh0YWJMYWJlbCA9PT0gJ0lucHV0Jykge1xuICAgICAgICAgIGZvciAoY29uc3QgaW5wdXRQYXJhbSBvZiBpbnB1dFBhcmFtcy5maWx0ZXIoKGlucHV0UGFyYW0pID0+IGlucHV0UGFyYW0ucHJvcGVydHkucHJvcGVydHlUeXBlID09PSBERy5UWVBFLkRBVEFfRlJBTUUpKSB7XG4gICAgICAgICAgICBjb25zdCBub25HcmlkVmlld2VycyA9IChpbnB1dFBhcmFtLmF1eFsndmlld2VycyddIGFzIERHLlZpZXdlcltdKS5maWx0ZXIoKHZpZXdlcikgPT4gdmlld2VyLnR5cGUgIT09IERHLlZJRVdFUi5HUklEKTtcblxuICAgICAgICAgICAgY29uc3QgZGZJbnB1dCA9IGRmSW5wdXRzLmZpbmQoKGlucHV0KSA9PiBpbnB1dC5uYW1lID09PSBpbnB1dFBhcmFtLm5hbWUpO1xuICAgICAgICAgICAgY29uc3QgdmlzaWJsZVRpdGxlID0gZGZJbnB1dCEub3B0aW9ucy5jYXB0aW9uIHx8IGlucHV0UGFyYW0ubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREZiA9IChsYXN0Q2FsbC5pbnB1dHNbZGZJbnB1dCEubmFtZV0gYXMgREcuRGF0YUZyYW1lKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHZpZXdlcl0gb2Ygbm9uR3JpZFZpZXdlcnMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgIGlmICh2aWV3ZXIucm9vdC5wYXJlbnRFbGVtZW50Py5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtR3JpZFN3aXRjaGVzLmdldChpbnB1dFBhcmFtLm5hbWUpPy5jbGljaygpO1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDUwKSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBhd2FpdCBwbG90VG9TaGVldChcbiAgICAgICAgICAgICAgICBleHBvcnRXb3JrYm9vayxcbiAgICAgICAgICAgICAgICBleHBvcnRXb3JrYm9vay5nZXRXb3Jrc2hlZXQoZ2V0U2hlZXROYW1lKHZpc2libGVUaXRsZSwgRElSRUNUSU9OLklOUFVUKSksXG4gICAgICAgICAgICAgICAgdmlld2VyLnJvb3QsXG4gICAgICAgICAgICAgICAgY3VycmVudERmLmNvbHVtbnMubGVuZ3RoICsgMixcbiAgICAgICAgICAgICAgICAoaW5kZXggPiAwKSA/IE1hdGguY2VpbChub25HcmlkVmlld2Vyc1tpbmRleC0xXS5yb290LmNsaWVudEhlaWdodCAvIDIwKSArIDEgOiAwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG91dHB1dFBhcmFtIG9mIG91dHB1dFBhcmFtcy5maWx0ZXIoKG91dHB1dFBhcmFtKSA9PiBvdXRwdXRQYXJhbS5wcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IERHLlRZUEUuREFUQV9GUkFNRSAmJiBvdXRwdXRQYXJhbS5wcm9wZXJ0eS5jYXRlZ29yeSA9PT0gdGFiTGFiZWwpKSB7XG4gICAgICAgICAgICBjb25zdCBub25HcmlkVmlld2VycyA9IChvdXRwdXRQYXJhbS5hdXhbJ3ZpZXdlcnMnXSBhcyBERy5WaWV3ZXJbXSkuZmlsdGVyKCh2aWV3ZXIpID0+IHZpZXdlci50eXBlICE9PSBERy5WSUVXRVIuR1JJRCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRmT3V0cHV0ID0gZGZPdXRwdXRzLmZpbmQoKGlucHV0KSA9PiBpbnB1dC5uYW1lID09PSBvdXRwdXRQYXJhbS5uYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGVUaXRsZSA9IGRmT3V0cHV0IS5vcHRpb25zLmNhcHRpb24gfHwgb3V0cHV0UGFyYW0ubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREZiA9IChsYXN0Q2FsbC5vdXRwdXRzW2RmT3V0cHV0IS5uYW1lXSBhcyBERy5EYXRhRnJhbWUpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgdmlld2VyXSBvZiBub25HcmlkVmlld2Vycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgaWYgKHZpZXdlci5yb290LnBhcmVudEVsZW1lbnQ/LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1HcmlkU3dpdGNoZXMuZ2V0KG91dHB1dFBhcmFtLm5hbWUpPy5jbGljaygpO1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDUwKSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBhd2FpdCBwbG90VG9TaGVldChcbiAgICAgICAgICAgICAgICBleHBvcnRXb3JrYm9vayxcbiAgICAgICAgICAgICAgICBleHBvcnRXb3JrYm9vay5nZXRXb3Jrc2hlZXQoZ2V0U2hlZXROYW1lKHZpc2libGVUaXRsZSwgRElSRUNUSU9OLk9VVFBVVCkpLFxuICAgICAgICAgICAgICAgIHZpZXdlci5yb290LFxuICAgICAgICAgICAgICAgIGN1cnJlbnREZi5jb2x1bW5zLmxlbmd0aCArIDIsXG4gICAgICAgICAgICAgICAgKGluZGV4ID4gMCkgPyBNYXRoLmNlaWwobm9uR3JpZFZpZXdlcnNbaW5kZXgtMV0ucm9vdC5jbGllbnRIZWlnaHQgLyAyMCkgKyAxIDogMFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG5cbiAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBleHBvcnRXb3JrYm9vay54bHN4LndyaXRlQnVmZmVyKCk7XG5cbiAgICByZXR1cm4gbmV3IEJsb2IoW2J1ZmZlcl0sIHt0eXBlOiBCTE9CX1RZUEV9KTtcbiAgfVxuXG4gIC8qKiBTYXZlcyB0aGUgY29tcHV0YXRpb24gcmVzdWx0cyB0byB0aGUgaGlzdG9yaWNhbCByZXN1bHRzLCByZXR1cm5zIGl0cyBpZC4gU2VlIGFsc28ge0BsaW5rIGxvYWRSdW59LiAqL1xuICBhc3luYyBzYXZlUnVuKGNhbGw6IERHLkZ1bmNDYWxsKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAvKiBhd2FpdCBncm9rLmRhcGkuZnVuY3Rpb25zLmNhbGxzLnNhdmUoY2FsbCk7Ki9cbiAgfVxuXG4gIC8qKiBMb2FkcyB0aGUgc3BlY2lmaWVkIGhpc3RvcmljYWwgcmVzdWx0cy4gU2VlIGFsc28ge0BsaW5rIHNhdmVSdW59LiAqL1xuICBhc3luYyBsb2FkUnVuKHJ1bklkOiBzdHJpbmcpOiBQcm9taXNlPERHLkZ1bmNDYWxsPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgaXMgbm90IGltcGxlbWVudGVkJyk7XG4gICAgLyogYXdhaXQgZ3Jvay5kYXBpLmZ1bmN0aW9ucy5jYWxscy5maW5kKGNhbGwuaWQpOyovXG4gIH1cblxuICAvKiogTG9hZHMgYWxsIHRoZSBmdW5jdGlvbiBjYWxsIG9mIHRoaXMgZnVuY3Rpb24uICovXG4gIGFzeW5jIHB1bGxSdW5zKCk6IFByb21pc2U8REcuRnVuY0NhbGxbXT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgIC8qIGF3YWl0IGdyb2suZGFwaS5mdW5jdGlvbnMuY2FsbHMubGlzdCgpOyovXG4gIH1cblxuXG4gIGNsZWFyUmVzdWx0cyhzd2l0Y2hUb091dHB1dDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBjb25zdCBjYXRlZ29yaWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIC8vIHRoaXMucmVzdWx0VGFicy5jbGVhcigpO1xuICAgIGlmICh0aGlzLnNob3dJbnB1dHMpIHtcbiAgICAgIGNhdGVnb3JpZXMucHVzaCgnSW5wdXQnKTtcbiAgICAgIHRoaXMucmVzdWx0VGFicy5zZXQoJ0lucHV0JywgdGhpcy5pbnB1dHNEaXYpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5mdW5jLm91dHB1dHMpIHtcbiAgICAgIGlmIChjYXRlZ29yaWVzLmluY2x1ZGVzKHAuY2F0ZWdvcnkpKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGNhdGVnb3JpZXMucHVzaChwLmNhdGVnb3J5KTtcbiAgICB9XG4gICAgaWYgKChjYXRlZ29yaWVzLmxlbmd0aCA+IDEgfHwgKGNhdGVnb3JpZXMubGVuZ3RoID09IDEgJiYgY2F0ZWdvcmllc1swXSAhPSAnTWlzYycpKSkge1xuICAgICAgdGhpcy5yZXN1bHRzVGFiQ29udHJvbCA9IERHLlRhYkNvbnRyb2wuY3JlYXRlKCk7XG4gICAgICBmb3IgKGNvbnN0IGMgb2YgY2F0ZWdvcmllcykge1xuICAgICAgICBpZiAoIXRoaXMucmVzdWx0VGFicy5oYXMoYykpXG4gICAgICAgICAgdGhpcy5yZXN1bHRUYWJzLnNldChjLCB1aS5kaXYoW10sICd1aS1wYW5lbCwgZ3Jvay1mdW5jLXJlc3VsdHMsIHVpLWJveCcpKTtcbiAgICAgICAgbGV0IG5hbWUgPSBjO1xuICAgICAgICBpZiAodGhpcy5zaG93SW5wdXRzICYmIGNhdGVnb3JpZXMubGVuZ3RoID09IDIgJiYgYyA9PSAnTWlzYycpXG4gICAgICAgICAgbmFtZSA9ICdPVVRQVVQnO1xuICAgICAgICB0aGlzLnJlc3VsdHNUYWJDb250cm9sLmFkZFBhbmUobmFtZSwgKCkgPT4gdGhpcy5yZXN1bHRUYWJzLmdldChjKSA/PyB1aS5kaXYoKSk7XG4gICAgICB9XG4gICAgICBpZiAoY2F0ZWdvcmllcy5sZW5ndGggPiAxICYmIHRoaXMuc2hvd0lucHV0cyAmJiBzd2l0Y2hUb091dHB1dClcbiAgICAgICAgdGhpcy5yZXN1bHRzVGFiQ29udHJvbC5jdXJyZW50UGFuZSA9IHRoaXMucmVzdWx0c1RhYkNvbnRyb2wucGFuZXNbMV07XG4gICAgICB0aGlzLnJlc3VsdHNEaXYgPSB0aGlzLnJlc3VsdHNUYWJDb250cm9sLnJvb3Q7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbXB1dGUodGhpcy5wcmVwYXJlZENhbGwhKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyB0aGlzLm9uQ29tcHV0YXRpb25FcnJvci5uZXh0KHRoaXMubGFzdENhbGwpO1xuICAgIH1cbiAgICB0aGlzLm9uQ29tcHV0YXRpb25TdWNjZWVkZWQubmV4dCh0aGlzLmxhc3RDYWxsISk7XG4gICAgdGhpcy5sYXN0Q2FsbCA9IHRoaXMucHJlcGFyZWRDYWxsO1xuXG4gICAgdGhpcy5vdXRwdXRQYXJhbWV0ZXJzVG9WaWV3KHRoaXMubGFzdENhbGwhKTtcbiAgfVxuXG4gIGFzeW5jIGNvbXB1dGUoY2FsbDogREcuRnVuY0NhbGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBjYWxsLmNhbGwodHJ1ZSwgdW5kZWZpbmVkLCB7cHJvY2Vzc2VkOiB0cnVlfSk7XG4gIH1cblxuICBvdXRwdXRQYXJhbWV0ZXJzVG9WaWV3KGNhbGw6IERHLkZ1bmNDYWxsKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclJlc3VsdHModHJ1ZSk7XG4gICAgZm9yIChjb25zdCBwIG9mIGNhbGwub3V0cHV0UGFyYW1zLnZhbHVlcygpIGFzIERHLkZ1bmNDYWxsUGFyYW1bXSkge1xuICAgICAgcC5wcm9jZXNzT3V0cHV0KCk7XG4gICAgICBpZiAocC5wcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT0gREcuVFlQRS5EQVRBX0ZSQU1FICYmIHAudmFsdWUgIT0gbnVsbClcbiAgICAgICAgdGhpcy5hcHBlbmRSZXN1bHREYXRhRnJhbWUocCwge2NhcHRpb246IHAucHJvcGVydHkubmFtZSwgY2F0ZWdvcnk6IHAucHJvcGVydHkuY2F0ZWdvcnl9KTtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhpcy5hcHBlbmRSZXN1bHRTY2FsYXIocCwge2NhcHRpb246IHAucHJvcGVydHkubmFtZSwgY2F0ZWdvcnk6IHAucHJvcGVydHkuY2F0ZWdvcnl9KTtcbiAgICB9XG4gICAgdGhpcy5idWlsZE91dHB1dEJsb2NrKCk7XG4gIH1cblxuICByZW5kZXJSdW5TZWN0aW9uKGNhbGw6IERHLkZ1bmNDYWxsKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB1aS53YWl0KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJ1bkJ1dHRvbiA9IHVpLmJpZ0J1dHRvbignUnVuJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjYWxsLmF1eFsndmlldyddID0gdGhpcy5kYXJ0O1xuICAgICAgICBhd2FpdCB0aGlzLnJ1bigpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBlZGl0b3IgPSB1aS5kaXYoKTtcbiAgICAgIGNvbnN0IGlucHV0czogREcuSW5wdXRCYXNlW10gPSBhd2FpdCBjYWxsLmJ1aWxkRWRpdG9yKGVkaXRvciwge2NvbmRlbnNlZDogdHJ1ZX0pO1xuICAgICAgZWRpdG9yLmNsYXNzTGlzdC5hZGQoJ3VpLWZvcm0nKTtcbiAgICAgIGNvbnN0IGJ1dHRvbnMgPSB1aS5kaXZIKFt0aGlzLmhpc3RvcnlSb290LCBydW5CdXR0b25dLCB7c3R5bGU6IHsnanVzdGlmeS1jb250ZW50JzogJ3NwYWNlLWJldHdlZW4nfX0pO1xuICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKGJ1dHRvbnMpO1xuICAgICAgcmV0dXJuIGVkaXRvcjtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGZsYWcgdG8gc2hvdyBvciBub3QgdGhlIFwiSW5wdXRcIiB0YWJcbiAgc2hvd0lucHV0czogYm9vbGVhbiA9IGZhbHNlO1xuICBzaW5nbGVEZlBhcmFtOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIG1hcHBwaW5nIG9mIHBhcmFtIHRvIHRoZSBzd2l0Y2hjZXMgb2YgdGhlaXIgdmlld2Vycy9ncmlkc1xuICBwYXJhbUdyaWRTd2l0Y2hlczogTWFwPHN0cmluZywgSFRNTEVsZW1lbnQ+ID0gbmV3IE1hcCgpO1xuICAvLyBtYXBwcGluZyBvZiBwYXJhbSB0byB0aGVpciB2aWV3ZXJzXG4gIHBhcmFtVmlld2VyczogTWFwPHN0cmluZywgREcuVmlld2VyW10+ID0gbmV3IE1hcCgpO1xuICAvLyBtYXBwcGluZyBvZiBwYXJhbSB0byB0aGVpciBodG1sIGVsZW1lbnRzXG4gIHBhcmFtU3BhbnM6IE1hcDxzdHJpbmcsIEhUTUxFbGVtZW50PiA9IG5ldyBNYXAoKTtcbiAgLy8gbWFwcHBpbmcgb2YgdGFiIG5hbWVzIHRvIHRoZWlyIGNvbnRlbnRcbiAgcmVzdWx0VGFiczogTWFwPFN0cmluZywgSFRNTEVsZW1lbnQ+ID0gbmV3IE1hcCgpO1xuICByZXN1bHRzVGFiQ29udHJvbDogREcuVGFiQ29udHJvbCB8IHVuZGVmaW5lZDtcbiAgcmVzdWx0c0RpdjogSFRNTEVsZW1lbnQgPSB1aS5wYW5lbChbXSwgJ2dyb2stZnVuYy1yZXN1bHRzJyk7XG4gIGNvbnRyb2xzUm9vdDogSFRNTERpdkVsZW1lbnQgPSB1aS5ib3goKTtcbiAgcmVzdWx0c1Jvb3Q6IEhUTUxEaXZFbGVtZW50ID0gdWkuYm94KCk7XG4gIGhpc3RvcnlSb290OiBIVE1MRGl2RWxlbWVudCA9IHVpLmRpdlYoW10sIHtzdHlsZTogeydqdXN0aWZ5LWNvbnRlbnQnOiAnY2VudGVyJ319KTtcbiAgaW5wdXRzRGl2OiBIVE1MRGl2RWxlbWVudCA9IHVpLnBhbmVsKFtdLCAnZ3Jvay1mdW5jLXJlc3VsdHMsIHVpLWJveCcpO1xuXG4gIGFwcGVuZFJlc3VsdERhdGFGcmFtZShwYXJhbTogREcuRnVuY0NhbGxQYXJhbSwgb3B0aW9ucz86IHsgY2FwdGlvbj86IHN0cmluZywgY2F0ZWdvcnk/OiBzdHJpbmcsIGhlaWdodD86IG51bWJlciB9KSB7XG4gICAgY29uc3QgcGFyYW1EZiA9IHBhcmFtLnZhbHVlIGFzIERHLkRhdGFGcmFtZTtcbiAgICBsZXQgY2FwdGlvbiA9IG9wdGlvbnM/LmNhcHRpb247XG4gICAgY29uc3QgaGVpZ2h0ID0gb3B0aW9ucz8uaGVpZ2h0ID8/IDQwMDtcbiAgICBjb25zdCB2aWV3ZXJzOiBERy5WaWV3ZXJbXSA9IHBhcmFtLmF1eFsndmlld2VycyddID8/IFtdOyAvLyBzdG9yaW5nIHRoZSB2aWV3ZXJzIG9mIERmXG4gICAgY2FwdGlvbiA/Pz0gcGFyYW0uYXV4Wyd2aWV3ZXJUaXRsZSddID8/IC8vIGRlc2NyaXB0aW9uIG9mIHRoZSB2aWV3ZXIgP1xuICAgICAgKCh0aGlzLnNpbmdsZURmUGFyYW0gJiYgdmlld2Vycy5sZW5ndGggPT0gMSkgPyAnJyA6IHBhcmFtLnByb3BlcnR5LmNhcHRpb24pID8/ICcnO1xuICAgIGxldCBleGlzdGluZ1ZpZXdlcnMgPSB0aGlzLnBhcmFtVmlld2Vycy5nZXQocGFyYW0ubmFtZSk7XG4gICAgaWYgKGV4aXN0aW5nVmlld2VycyAhPSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IHYgb2YgZXhpc3RpbmdWaWV3ZXJzKVxuICAgICAgICB2LmRhdGFGcmFtZSA9IHBhcmFtRGY7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV4aXN0aW5nVmlld2VycyA/Pz0gW107XG4gICAgdGhpcy5wYXJhbVZpZXdlcnMuc2V0KHBhcmFtLm5hbWUsIGV4aXN0aW5nVmlld2Vycyk7XG4gICAgaWYgKHZpZXdlcnMubGVuZ3RoID09IDApXG4gICAgICB2aWV3ZXJzLnB1c2gocGFyYW1EZi5wbG90LmdyaWQoKSk7XG5cbiAgICBjb25zdCB2aWV3ZXJzVG9IaWRlOiBIVE1MRWxlbWVudFtdID0gW107XG4gICAgbGV0IGJsb2NrczogbnVtYmVyID0gMDtcbiAgICBsZXQgYmxvY2tXaWR0aDogbnVtYmVyID0gMDtcbiAgICBjb25zdCBncmlkV3JhcHBlciA9IHVpLmJveChudWxsLCB7c3R5bGU6IHtoZWlnaHQ6ICcxMDAlJ319KTtcblxuICAgIGNvbnN0IGlzR3JpZFN3aXRjaGFibGUgPSB3dSh2aWV3ZXJzKS5ldmVyeSgodjogREcuVmlld2VyKSA9PiB2LnR5cGUgIT09ICdHcmlkJyk7XG4gICAgJChncmlkV3JhcHBlcikuaGlkZSgpO1xuXG4gICAgY29uc3QgZ2V0SGVhZGVyID0gKCkgPT4ge1xuICAgICAgY29uc3QgaGVhZGVyTGFiZWwgPSBjYXB0aW9uID8/IHBhcmFtRGYubmFtZSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRlciA9IHVpLmRpdihbXSwgJ2dyb2stZnVuYy1yZXN1bHRzLWhlYWRlcicpO1xuICAgICAgaWYgKGhlYWRlckxhYmVsICE9ICcnKSB7XG4gICAgICAgIGNvbnN0IGggPSB1aS5oMShoZWFkZXJMYWJlbCk7XG4gICAgICAgIHVpLlRvb2x0aXAuYmluZChoLCAoKSA9PiBoZWFkZXJMYWJlbCk7XG4gICAgICAgIGhlYWRlci5hcHBlbmRDaGlsZChoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0dyaWRTd2l0Y2hhYmxlKSB7XG4gICAgICAgIGNvbnN0IGljb24gPSB1aS5pY29uU3ZnKCd0YWJsZScsIChlKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB1aS5zZXREaXNwbGF5QWxsKHZpZXdlcnNUb0hpZGUsIHZpZXdlcnNUb0hpZGUuc29tZSgodmlld2VyKSA9PiB2aWV3ZXIuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSk7XG4gICAgICAgICAgdWkuc2V0RGlzcGxheShncmlkV3JhcHBlciwgZ3JpZFdyYXBwZXIuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKTtcbiAgICAgICAgfSwgJ1Nob3cgZ3JpZCcpO1xuICAgICAgICBoZWFkZXIuYXBwZW5kQ2hpbGQoaWNvbik7XG4gICAgICAgIHRoaXMucGFyYW1HcmlkU3dpdGNoZXMuc2V0KHBhcmFtLm5hbWUsIGljb24pO1xuICAgICAgfVxuICAgICAgaWYgKCFncm9rLnNoZWxsLnRhYmxlcy5pbmNsdWRlcyhwYXJhbURmKSkge1xuICAgICAgICBoZWFkZXIuYXBwZW5kQ2hpbGQoXG4gICAgICAgICAgdWkuaWNvbnMuYWRkKChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBjb25zdCB2ID0gZ3Jvay5zaGVsbC5hZGRUYWJsZVZpZXcocGFyYW1EZik7XG4gICAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZpZXdlciBvZiB2aWV3ZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZpZXdlci50eXBlICE9ICdHcmlkJykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Vmlld2VyID0gYXdhaXQgcGFyYW1EZi5wbG90LmZyb21UeXBlKHZpZXdlci50eXBlKSBhcyBERy5WaWV3ZXI7XG4gICAgICAgICAgICAgICAgICBuZXdWaWV3ZXIuc2V0T3B0aW9ucyh2aWV3ZXIuZ2V0T3B0aW9ucygpKTtcbiAgICAgICAgICAgICAgICAgIHYuYWRkVmlld2VyKG5ld1ZpZXdlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgJ0FkZCB0byB3b3Jrc3BhY2UnXG4gICAgICAgICAgKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGVhZGVyO1xuICAgIH07XG5cbiAgICBpZiAoaXNHcmlkU3dpdGNoYWJsZSkge1xuICAgICAgY29uc3QgZ3JpZCA9IHBhcmFtRGYucGxvdC5ncmlkKCk7XG4gICAgICBncmlkV3JhcHBlci5hcHBlbmRDaGlsZChncmlkLnJvb3QpO1xuICAgICAgZXhpc3RpbmdWaWV3ZXJzLnB1c2goZ3JpZCk7XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVyID0gZ2V0SGVhZGVyKCk7XG4gICAgY29uc3Qgd3JhcHBlciA9IHVpLmRpdkgoW10sIHtzdHlsZToge2hlaWdodDogJzEwMCUnfX0pO1xuICAgIHZpZXdlcnMuZm9yRWFjaCgodmlld2VyKSA9PiB7XG4gICAgICBpZiAodmlld2VyPy50YWdzID09IG51bGwpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGV4aXN0aW5nVmlld2VycyEucHVzaCh2aWV3ZXIpO1xuICAgICAgY29uc3Qgdmlld2VyU2l6ZSA9IHZpZXdlci50YWdzWycuYmxvY2stc2l6ZSddID8/IDEwMDsgLy8gZ2V0dGluZyBgKGJsb2NrOiAyNSlgIHZhbHVlOyBpZiBub3QgZGVmaW5lZCwgaXQgaXMgMTAwXG5cbiAgICAgIHZpZXdlci5yb290LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICAgIHZpZXdlci5yb290LmNsYXNzTGlzdC5hZGQoYHVpLWJsb2NrLSR7dmlld2VyU2l6ZX1gKTtcbiAgICAgIGlmIChibG9ja3MgKyB2aWV3ZXJTaXplIDw9IDEwMCkge1xuICAgICAgICB2aWV3ZXJzVG9IaWRlLnB1c2god3JhcHBlcik7XG4gICAgICAgIGJsb2NrV2lkdGggKz0gdmlld2VyU2l6ZTtcbiAgICAgIH1cbiAgICAgIGJsb2NrcyArPSB2aWV3ZXJTaXplO1xuICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZCh2aWV3ZXIucm9vdCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBibG9jayA9IHVpLmRpdlYoW2hlYWRlciwgd3JhcHBlciwgZ3JpZFdyYXBwZXJdLCB7c3R5bGU6IHtoZWlnaHQ6IGAke2hlaWdodH1weGAsIHdpZHRoOiBgJHtibG9ja1dpZHRofSVgfX0pO1xuICAgIGJsb2NrLmNsYXNzTGlzdC5hZGQoJ3VpLWJveCcpO1xuICAgIHRoaXMuX2FwcGVuZFJlc3VsdEVsZW1lbnQoYmxvY2ssIG9wdGlvbnM/LmNhdGVnb3J5KTtcbiAgfVxuXG4gIGFwcGVuZFJlc3VsdFNjYWxhcihwYXJhbTogREcuRnVuY0NhbGxQYXJhbSwgb3B0aW9uczogeyBjYXB0aW9uPzogc3RyaW5nLCBjYXRlZ29yeTogc3RyaW5nLCBoZWlnaHQ/OiBudW1iZXIgfSkge1xuICAgIGNvbnN0IHNwYW4gPSB1aS5zcGFuKFtgJHtvcHRpb25zLmNhcHRpb24gPz8gcGFyYW0ubmFtZX06IGAsIGAke3BhcmFtLnZhbHVlfWBdKTtcbiAgICBpZiAoIXRoaXMucGFyYW1TcGFucy5nZXQocGFyYW0ubmFtZSkpIHtcbiAgICAgIGlmICh0aGlzLnJlc3VsdHNUYWJDb250cm9sKVxuICAgICAgICB0aGlzLnJlc3VsdFRhYnMuZ2V0KG9wdGlvbnMuY2F0ZWdvcnkpIS5hcHBlbmRDaGlsZChzcGFuKTtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhpcy5yZXN1bHRzRGl2LmFwcGVuZENoaWxkKHNwYW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcmFtU3BhbnMuZ2V0KHBhcmFtLm5hbWUpPy5yZXBsYWNlV2l0aChzcGFuKTtcbiAgICB9XG4gICAgdGhpcy5wYXJhbVNwYW5zLnNldChwYXJhbS5uYW1lLCBzcGFuKTtcbiAgfVxuXG4gIF9hcHBlbmRSZXN1bHRFbGVtZW50KGQ6IEhUTUxFbGVtZW50LCBjYXRlZ29yeT86IHN0cmluZykge1xuICAgIGlmIChjYXRlZ29yeSAhPSBudWxsICYmIHRoaXMucmVzdWx0c1RhYkNvbnRyb2wgIT0gdW5kZWZpbmVkICYmIHRoaXMucmVzdWx0VGFicy5nZXQoY2F0ZWdvcnkpICE9IG51bGwpXG4gICAgICB0aGlzLnJlc3VsdFRhYnMuZ2V0KGNhdGVnb3J5KSEuYXBwZW5kQ2hpbGQoZCk7XG4gICAgZWxzZVxuICAgICAgdGhpcy5yZXN1bHRzRGl2LmFwcGVuZENoaWxkKGQpO1xuICB9XG59XG5cbmNvbnN0IGdldFNoZWV0TmFtZSA9IChuYW1lOiBzdHJpbmcsIGRpcmVjdGlvbjogRElSRUNUSU9OKSA9PiB7XG4gIGNvbnN0IGlkZWFsTmFtZSA9IGAke2RpcmVjdGlvbn0gLSAke25hbWV9YDtcbiAgcmV0dXJuIChpZGVhbE5hbWUubGVuZ3RoID4gMzEpID8gbmFtZS5zdWJzdHJpbmcoMCwgMzIpIDogaWRlYWxOYW1lO1xufTtcblxuZW51bSBESVJFQ1RJT04ge1xuICBJTlBVVCA9ICdJbnB1dCcsXG4gIE9VVFBVVCA9ICdPdXRwdXQnXG59XG5cbmNvbnN0IHNjYWxhcnNUb1NoZWV0ID0gKHNoZWV0OiBFeGNlbEpTLldvcmtzaGVldCwgc2NhbGFyczogeyBjYXB0aW9uOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIHVuaXRzOiBzdHJpbmcgfVtdKSA9PiB7XG4gIHNoZWV0LmFkZFJvdyhbJ1BhcmFtZXRlcicsICdWYWx1ZScsICdVbml0cyddKS5mb250ID0ge2JvbGQ6IHRydWV9O1xuICBzY2FsYXJzLmZvckVhY2goKHNjYWxhcikgPT4ge1xuICAgIHNoZWV0LmFkZFJvdyhbc2NhbGFyLmNhcHRpb24sIHNjYWxhci52YWx1ZSwgc2NhbGFyLnVuaXRzXSk7XG4gIH0pO1xuXG4gIHNoZWV0LmdldENvbHVtbigxKS53aWR0aCA9IE1hdGgubWF4KFxuICAgIC4uLnNjYWxhcnMubWFwKChzY2FsYXIpID0+IHNjYWxhci5jYXB0aW9uLnRvU3RyaW5nKCkubGVuZ3RoKSwgJ1BhcmFtZXRlcicubGVuZ3RoXG4gICkgKiAxLjI7XG4gIHNoZWV0LmdldENvbHVtbigyKS53aWR0aCA9IE1hdGgubWF4KC4uLnNjYWxhcnMubWFwKChzY2FsYXIpID0+IHNjYWxhci52YWx1ZS50b1N0cmluZygpLmxlbmd0aCksICdWYWx1ZScubGVuZ3RoKSAqIDEuMjtcbiAgc2hlZXQuZ2V0Q29sdW1uKDMpLndpZHRoID0gTWF0aC5tYXgoLi4uc2NhbGFycy5tYXAoKHNjYWxhcikgPT4gc2NhbGFyLnVuaXRzLnRvU3RyaW5nKCkubGVuZ3RoKSwgJ1VuaXRzJy5sZW5ndGgpICogMS4yO1xufTtcblxuY29uc3QgZGZUb1NoZWV0ID0gKHNoZWV0OiBFeGNlbEpTLldvcmtzaGVldCwgZGY6IERHLkRhdGFGcmFtZSkgPT4ge1xuICBzaGVldC5hZGRSb3coKGRmLmNvbHVtbnMgYXMgREcuQ29sdW1uTGlzdCkubmFtZXMoKSkuZm9udCA9IHtib2xkOiB0cnVlfTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZi5yb3dDb3VudDsgaSsrKVxuICAgIHNoZWV0LmFkZFJvdyhbLi4uZGYucm93KGkpLmNlbGxzXS5tYXAoKGNlbGw6IERHLkNlbGwpID0+IGNlbGwudmFsdWUpKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRmLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICBzaGVldC5nZXRDb2x1bW4oaSArIDEpLndpZHRoID1cbiAgICAgIE1hdGgubWF4KFxuICAgICAgICAuLi4oZGYuY29sdW1ucyBhcyBERy5Db2x1bW5MaXN0KS5ieUluZGV4KGkpLmNhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkudG9TdHJpbmcoKS5sZW5ndGgpLFxuICAgICAgICAoZGYuY29sdW1ucyBhcyBERy5Db2x1bW5MaXN0KS5ieUluZGV4KGkpLm5hbWUubGVuZ3RoXG4gICAgICApICogMS4yO1xuICB9XG59O1xuXG5jb25zdCBwbG90VG9TaGVldCA9IGFzeW5jIChleHBvcnRXYjogRXhjZWxKUy5Xb3JrYm9vaywgc2hlZXQ6IEV4Y2VsSlMuV29ya3NoZWV0LCBwbG90OiBIVE1MRWxlbWVudCwgY29sdW1uRm9ySW1hZ2U6IG51bWJlciwgcm93Rm9ySW1hZ2U6IG51bWJlciA9IDApID0+IHtcbiAgY29uc3QgY2FudmFzID0gYXdhaXQgaHRtbDJjYW52YXMocGxvdCBhcyBIVE1MRWxlbWVudCwge2xvZ2dpbmc6IGZhbHNlfSk7XG4gIGNvbnN0IGRhdGFVcmwgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcblxuICBjb25zdCBpbWFnZUlkID0gZXhwb3J0V2IuYWRkSW1hZ2Uoe1xuICAgIGJhc2U2NDogZGF0YVVybCxcbiAgICBleHRlbnNpb246ICdwbmcnLFxuICB9KTtcbiAgc2hlZXQuYWRkSW1hZ2UoaW1hZ2VJZCwge1xuICAgIHRsOiB7Y29sOiBjb2x1bW5Gb3JJbWFnZSwgcm93OiByb3dGb3JJbWFnZX0sXG4gICAgZXh0OiB7d2lkdGg6IGNhbnZhcy53aWR0aCwgaGVpZ2h0OiBjYW52YXMuaGVpZ2h0fSxcbiAgfSk7XG59O1xuIl19
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImZ1bmN0aW9uLXZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsZ0NBQWdDO0FBQ2hDLDRCQUE0QjtBQUM1QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxDQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE1BQU0sT0FBTyxZQUFhLFNBQVEsRUFBRSxDQUFDLFFBQVE7SUFDM0MsWUFBWSxRQUFzQjtRQUNoQyxLQUFLLEVBQUUsQ0FBQztRQWVGLFVBQUssR0FBVyxVQUFVLENBQUM7UUF1Tm5DLDREQUE0RDtRQUM1RCxzQkFBaUIsR0FBNkIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN4RCxtREFBbUQ7UUFDbkQseUJBQW9CLEdBQTZCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDM0QsMkNBQTJDO1FBQzNDLGVBQVUsR0FBNkIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNqRCx5Q0FBeUM7UUFDekMsZUFBVSxHQUE2QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWpELGVBQVUsR0FBZ0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUM1RCxpQkFBWSxHQUFtQixFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDMUUsZ0JBQVcsR0FBbUIsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZDLGdCQUFXLEdBQW1CLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUMsS0FBSyxFQUFF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LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0IHd1IGZyb20gJ3d1JztcbmltcG9ydCAkIGZyb20gJ2Nhc2gtZG9tJztcbmltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmV4cG9ydCBjbGFzcyBGdW5jdGlvblZpZXcgZXh0ZW5kcyBERy5WaWV3QmFzZSB7XG4gIGNvbnN0cnVjdG9yKGZ1bmNDYWxsPzogREcuRnVuY0NhbGwpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYm94ID0gdHJ1ZTtcbiAgICB0aGlzLmNvbnRleHQgPSBERy5Db250ZXh0LmNsb25lRGVmYXVsdCgpO1xuXG4gICAgaWYgKCFmdW5jQ2FsbCkgcmV0dXJuO1xuXG4gICAgdGhpcy5saW5rRnVuY2NhbGwoZnVuY0NhbGwpO1xuICAgIHRoaXMuaW5pdCgpO1xuICAgIHRoaXMuYnVpbGQoKTtcbiAgfVxuXG4gIGdldCBmdW5jKCkge1xuICAgIHJldHVybiB0aGlzLmZ1bmNDYWxsPy5mdW5jO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHlwZTogc3RyaW5nID0gJ2Z1bmN0aW9uJztcbiAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzSW5wdXRQYW5lbFJlcXVpcmVkKCkge1xuICAgIHJldHVybiB0aGlzLmZ1bmM/LmlucHV0cy5zb21lKChwKSA9PiBwLnByb3BlcnR5VHlwZSA9PSBERy5UWVBFLkRBVEFfRlJBTUUgJiYgcC5vcHRpb25zWyd2aWV3ZXInXSAhPSBudWxsKSB8fCBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb3V0UGFyYW1DYXRlZ29yaWVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICAuLi5uZXcgU2V0KHRoaXMuZnVuYyEub3V0cHV0cy5tYXAoKHApID0+IHAuY2F0ZWdvcnkpKSAvLyBnZXQgYWxsIG91dHB1dCBwYXJhbXMnIGNhdGVnb3JpZXNcbiAgICBdOyAvLyBrZWVwIG9ubHkgdW5pcXVlIG9mIHRoZW1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgb3V0cHV0VGFic0xhYmVscygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4udGhpcy5vdXRQYXJhbUNhdGVnb3JpZXMsXG4gICAgICAuLi50aGlzLm91dFBhcmFtQ2F0ZWdvcmllcy5maW5kKCh2YWwpID0+IHZhbCA9PT0gJ01pc2MnKSA/IFsnT3V0cHV0J10gOiBbXSwgLy8gaWYgbm8gY2F0ZWdvcmllcyBhcmUgc3RhdGVkLCB0aGUgZGVmYXVsdCBjYXRlZ29yeSBpcyBhZGRlZFxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRhYnNMYWJlbHMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucGFyYW1Ub0NhdGVnb3J5TWFwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyYW1Ub0NhdGVnb3J5TWFwKCkge1xuICAgIGNvbnN0IG1hcCA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgICBpZiAodGhpcy5pc0lucHV0UGFuZWxSZXF1aXJlZClcbiAgICAgIHRoaXMuZnVuYyEuaW5wdXRzLmZvckVhY2goKHApID0+IG1hcFsnSW5wdXQnXSA/IG1hcFsnSW5wdXQnXS5wdXNoKHAubmFtZSk6IG1hcFsnSW5wdXQnXSA9IFtwLm5hbWVdKTtcblxuICAgIHRoaXMuZnVuYyEub3V0cHV0cy5mb3JFYWNoKChwKSA9PiBtYXBbcC5jYXRlZ29yeSA9PT0gJ01pc2MnID8gJ091dHB1dCc6IHAuY2F0ZWdvcnldID8gbWFwW3AuY2F0ZWdvcnkgPT09ICdNaXNjJyA/ICdPdXRwdXQnOiBwLmNhdGVnb3J5XS5wdXNoKHAubmFtZSkgOiBtYXBbcC5jYXRlZ29yeSA9PT0gJ01pc2MnID8gJ091dHB1dCc6IHAuY2F0ZWdvcnldID0gW3AubmFtZV0pO1xuXG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHJlYWRvbmx5IGNvbnRleHQ6IERHLkNvbnRleHQ7XG4gIHByb3RlY3RlZCBfZnVuY0NhbGw/OiBERy5GdW5jQ2FsbDtcbiAgcHJvdGVjdGVkIGxhc3RDYWxsPzogREcuRnVuY0NhbGw7XG5cbiAgLyoqIExpbmsgRnVuY0NhbGwgdG8gdGhlIHZpZXcgKi9cbiAgcHVibGljIGxpbmtGdW5jY2FsbChmdW5jQ2FsbDogREcuRnVuY0NhbGwpIHtcbiAgICB0aGlzLl9mdW5jQ2FsbCA9IGZ1bmNDYWxsO1xuICB9XG5cbiAgLyoqIEdldCBjb3B5IG9mIEZ1bmNDYWxsIG9mIHRoZSB2aWV3ICovXG4gIHB1YmxpYyBnZXQgZnVuY0NhbGwoKTogREcuRnVuY0NhbGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mdW5jQ2FsbDtcbiAgfVxuXG4gIC8qKiBJbml0IGN1c3RvbSBsb2dpYyAqL1xuICBpbml0KCkge1xuICAgIGlmICh0aGlzLmZ1bmNDYWxsICYmIHRoaXMuZnVuYykge1xuICAgICAgdGhpcy5mdW5jQ2FsbC5hdXhbJ3ZpZXcnXSA9IHRoaXM7XG4gICAgICB0aGlzLmZ1bmNDYWxsLmNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG5cbiAgICAgIGZvciAoY29uc3QgaW5QYXJhbSBvZiB3dSh0aGlzLmZ1bmNDYWxsLmlucHV0UGFyYW1zLnZhbHVlcygpIGFzIERHLkZ1bmNDYWxsUGFyYW1bXSlcbiAgICAgICAgLmZpbHRlcigocDogREcuRnVuY0NhbGxQYXJhbSkgPT5cbiAgICAgICAgICBwLnByb3BlcnR5LnByb3BlcnR5VHlwZSA9PSBERy5UWVBFLkRBVEFfRlJBTUUgJiYgcC5wcm9wZXJ0eS5vcHRpb25zWyd2aWV3ZXInXSAhPSBudWxsKSkge1xuICAgICAgICB0aGlzLnN1YnMucHVzaChpblBhcmFtLm9uQ2hhbmdlZC5zdWJzY3JpYmUoYXN5bmMgKHBhcmFtOiBERy5GdW5jQ2FsbFBhcmFtKSA9PiB7XG4gICAgICAgICAgdGhpcy5jbGVhclJlc3VsdHMoZmFsc2UpO1xuICAgICAgICAgIHBhcmFtLnByb2Nlc3NPdXRwdXQoKTtcblxuICAgICAgICAgIHRoaXMuYXBwZW5kT3V0cHV0RGYocGFyYW0sIHtcbiAgICAgICAgICAgIGhlaWdodDogNDAwLFxuICAgICAgICAgICAgY2F0ZWdvcnk6ICdJbnB1dCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0byBjcmVhdGUgYSBmdWxseSBjdXN0b20gVUkgKi9cbiAgYnVpbGQoKTogdm9pZCB7XG4gICAgdGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuYnVpbGRJTygpKTtcblxuICAgIHRoaXMuYnVpbGRSaWJib25QYW5lbHMoKTtcbiAgICB0aGlzLmJ1aWxkSGlzdG9yeUJsb2NrKCk7XG4gICAgdGhpcy5idWlsZFJpYmJvbk1lbnUoKTtcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0byBjcmVhdGUgYSBjdXN0b20gaW5wdXQtb3V0cHV0IGJsb2NrICovXG4gIGJ1aWxkSU8oKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGlucHV0QmxvY2sgPSB0aGlzLmJ1aWxkSW5wdXRCbG9jaygpO1xuICAgIGNvbnN0IG91dHB1dEJsb2NrID0gdGhpcy5idWlsZE91dHB1dEJsb2NrKCk7XG5cbiAgICByZXR1cm4gdWkuc3BsaXRIKFtpbnB1dEJsb2NrLCBvdXRwdXRCbG9ja10pO1xuICB9XG5cbiAgLyoqIE92ZXJyaWRlIHRvIGNyZWF0ZSBhIGN1c3RvbSBpbnB1dCBibG9jay4gKi9cbiAgYnVpbGRJbnB1dEJsb2NrKCk6IEhUTUxFbGVtZW50IHtcbiAgICBpZiAoIXRoaXMuZnVuY0NhbGwpIHJldHVybiB0aGlzLmNvbnRyb2xzUm9vdDtcblxuICAgIGNvbnN0IGZ1bmNEaXYgPSB1aS5kaXYoW3RoaXMucmVuZGVyUnVuU2VjdGlvbih0aGlzLmZ1bmNDYWxsKV0sICd1aS1kaXYnKTtcbiAgICB0aGlzLmNvbnRyb2xzUm9vdC5pbm5lckhUTUwgPSAnJztcbiAgICB0aGlzLmNvbnRyb2xzUm9vdC5hcHBlbmRDaGlsZChmdW5jRGl2KTtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sc1Jvb3Q7XG4gIH1cblxuICAvKiogT3ZlcnJpZGUgdG8gY3JlYXRlIGEgY3VzdG9tIG91dHB1dCBibG9jay4gKi9cbiAgYnVpbGRPdXRwdXRCbG9jaygpOiBIVE1MRWxlbWVudCB7XG4gICAgdGhpcy5yZXN1bHRzUm9vdC5pbm5lckhUTUwgPSAnJztcbiAgICB0aGlzLnJlc3VsdHNSb290LmFwcGVuZENoaWxkKHRoaXMucmVzdWx0c0Rpdik7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0c1Jvb3Q7XG4gIH1cblxuICAvKiogT3ZlcnJpZGUgdG8gY3JlYXRlIGEgY3VzdG9tIGhpc3RvcmljYWwgcnVucyBjb250cm9sLiAqL1xuICBidWlsZEhpc3RvcnlCbG9jaygpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgbmV3SGlzdG9yeUJsb2NrID0gdWkuaWNvbkZBKCdoaXN0b3J5JywgKCkgPT4ge1xuICAgICAgdGhpcy5wdWxsUnVucygpLnRoZW4oYXN5bmMgKGhpc3RvcmljYWxSdW5zKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbnUgPSBERy5NZW51LnBvcHVwKCk7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBydW4gb2YgaGlzdG9yaWNhbFJ1bnMpIHtcbiAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICBtZW51Lml0ZW0oYCR7cnVuLmZ1bmMuZnJpZW5kbHlOYW1lfSDigJQgJHtpfWAsIGFzeW5jICgpID0+IHRoaXMuaGlzdG9yaWNhbFJ1blNlcnZpY2UubG9hZFJ1bihydW4uaWQpKTtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgbWVudS5zaG93KCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLmhpc3RvcnlSb290LmlubmVySFRNTCA9ICcnO1xuICAgIHRoaXMuaGlzdG9yeVJvb3QuYXBwZW5kKG5ld0hpc3RvcnlCbG9jayk7XG4gICAgcmV0dXJuIG5ld0hpc3RvcnlCbG9jaztcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0byBjcmVhdGUgYSBjdXN0b20gaW5wdXQgY29udHJvbC4gKi9cbiAgYnVpbGRSaWJib25QYW5lbHMoKTogSFRNTEVsZW1lbnRbXVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSaWJib25QYW5lbHMoKTtcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0byBjcmVhdGUgYSBjdXN0b20gcmliYm9uIG1lbnUgb24gdGhlIHRvcC4gKi9cbiAgYnVpbGRSaWJib25NZW51KCkge1xuXG4gIH1cblxuICAvKiogU2F2ZXMgdGhlIGNvbXB1dGF0aW9uIHJlc3VsdHMgdG8gdGhlIGhpc3RvcmljYWwgcmVzdWx0cywgcmV0dXJucyBpdHMgaWQuIFNlZSBhbHNvIHtAbGluayBsb2FkUnVufS4gKi9cbiAgYXN5bmMgc2F2ZVJ1bigpOiBQcm9taXNlPERHLkZ1bmNDYWxsPiB7XG4gICAgLy9AdHMtaWdub3JlXG4gICAgcmV0dXJuIGF3YWl0IGdyb2suZGFwaS5mdW5jdGlvbnMuY2FsbHMuc2F2ZSh0aGlzLmZ1bmNDYWxsISk7XG4gIH1cblxuICAvKiogTG9hZHMgdGhlIHNwZWNpZmllZCBoaXN0b3JpY2FsIHJlc3VsdHMuIFNlZSBhbHNvIHtAbGluayBzYXZlUnVufS4gKi9cbiAgYXN5bmMgbG9hZFJ1bihmdW5jQ2FsbElkOiBzdHJpbmcpOiBQcm9taXNlPERHLkZ1bmNDYWxsPiB7XG4gICAgcmV0dXJuIGF3YWl0IGdyb2suZGFwaS5mdW5jdGlvbnMuY2FsbHMuaW5jbHVkZSgnaW5wdXRzLCBvdXRwdXRzJykuZmluZChmdW5jQ2FsbElkKTtcbiAgfVxuXG4gIC8qKiBMb2FkcyBhbGwgdGhlIGZ1bmN0aW9uIGNhbGwgb2YgdGhpcyBmdW5jdGlvbi4gKi9cbiAgLyoqIEFDSFRVTkc6IEZ1bmNDYWxsIGlucHV0cy9vdXRwdXRzIGFyZSBub3QgaW5jbHVkZWQgKi9cbiAgYXN5bmMgcHVsbFJ1bnMoKTogUHJvbWlzZTxERy5GdW5jQ2FsbFtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGdyb2suZGFwaS5mdW5jdGlvbnMuY2FsbHMuZmlsdGVyKGBmdW5jLmlkPVwiJHt0aGlzLmZ1bmM/LmlkfVwiYCkubGlzdCgpO1xuICB9XG5cbiAgY2xlYXJSZXN1bHRzKHN3aXRjaFRvT3V0cHV0OiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGNvbnN0IGNhdGVnb3JpZXMgPSB0aGlzLnRhYnNMYWJlbHM7XG5cbiAgICBpZiAoKGNhdGVnb3JpZXMubGVuZ3RoID4gMSB8fCAoY2F0ZWdvcmllcy5sZW5ndGggPT0gMSAmJiBjYXRlZ29yaWVzWzBdICE9ICdNaXNjJykpKSB7XG4gICAgICB0aGlzLnJlc3VsdHNUYWJDb250cm9sID0gREcuVGFiQ29udHJvbC5jcmVhdGUoKTtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBjYXRlZ29yaWVzKSB7XG4gICAgICAgIGlmICghdGhpcy5yZXN1bHRUYWJzLmhhcyhjKSlcbiAgICAgICAgICB0aGlzLnJlc3VsdFRhYnMuc2V0KGMsIHVpLmRpdihbXSwgJ3VpLXBhbmVsLCBncm9rLWZ1bmMtcmVzdWx0cywgdWktYm94JykpO1xuICAgICAgICBsZXQgbmFtZSA9IGM7XG4gICAgICAgIGlmICh0aGlzLmlzSW5wdXRQYW5lbFJlcXVpcmVkICYmIGNhdGVnb3JpZXMubGVuZ3RoID09IDIgJiYgYyA9PSAnTWlzYycpXG4gICAgICAgICAgbmFtZSA9ICdPVVRQVVQnO1xuICAgICAgICB0aGlzLnJlc3VsdHNUYWJDb250cm9sLmFkZFBhbmUobmFtZSwgKCkgPT4gdGhpcy5yZXN1bHRUYWJzLmdldChjKSA/PyB1aS5kaXYoKSk7XG4gICAgICB9XG4gICAgICBpZiAoY2F0ZWdvcmllcy5sZW5ndGggPiAxICYmIHRoaXMuaXNJbnB1dFBhbmVsUmVxdWlyZWQgJiYgc3dpdGNoVG9PdXRwdXQpXG4gICAgICAgIHRoaXMucmVzdWx0c1RhYkNvbnRyb2wuY3VycmVudFBhbmUgPSB0aGlzLnJlc3VsdHNUYWJDb250cm9sLnBhbmVzWzFdO1xuICAgICAgdGhpcy5yZXN1bHRzRGl2ID0gdGhpcy5yZXN1bHRzVGFiQ29udHJvbC5yb290O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuZnVuY0NhbGwpIHRocm93IG5ldyBFcnJvcignVGhlIGNvcnJlc3BvZGluZyBmdW5jdGlvbiBpcyBub3Qgc3BlY2lmaWVkJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb21wdXRlKHRoaXMuZnVuY0NhbGwpO1xuICAgIH0gY2F0Y2ggKGUpIHtcblxuICAgIH1cbiAgICB0aGlzLmxhc3RDYWxsID0gdGhpcy5mdW5jQ2FsbDtcblxuICAgIHRoaXMub3V0cHV0UGFyYW1ldGVyc1RvVmlldyh0aGlzLmxhc3RDYWxsISk7XG4gIH1cblxuICBhc3luYyBjb21wdXRlKGNhbGw6IERHLkZ1bmNDYWxsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgY2FsbC5jYWxsKHRydWUsIHVuZGVmaW5lZCwge3Byb2Nlc3NlZDogdHJ1ZX0pO1xuICB9XG5cbiAgb3V0cHV0UGFyYW1ldGVyc1RvVmlldyhjYWxsOiBERy5GdW5jQ2FsbCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJSZXN1bHRzKHRydWUpO1xuICAgIGZvciAoY29uc3QgcCBvZiBjYWxsLm91dHB1dFBhcmFtcy52YWx1ZXMoKSBhcyBERy5GdW5jQ2FsbFBhcmFtW10pIHtcbiAgICAgIHAucHJvY2Vzc091dHB1dCgpO1xuICAgICAgaWYgKHAucHJvcGVydHkucHJvcGVydHlUeXBlID09IERHLlRZUEUuREFUQV9GUkFNRSAmJiBwLnZhbHVlICE9IG51bGwpXG4gICAgICAgIHRoaXMuYXBwZW5kT3V0cHV0RGYocCwge2NhcHRpb246IHAucHJvcGVydHkubmFtZSwgY2F0ZWdvcnk6IHAucHJvcGVydHkuY2F0ZWdvcnl9KTtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhpcy5hcHBlbmRSZXN1bHRTY2FsYXIocCwge2NhcHRpb246IHAucHJvcGVydHkubmFtZSwgY2F0ZWdvcnk6IHAucHJvcGVydHkuY2F0ZWdvcnl9KTtcbiAgICB9XG4gICAgdGhpcy5idWlsZE91dHB1dEJsb2NrKCk7XG4gIH1cblxuICByZW5kZXJSdW5TZWN0aW9uKGNhbGw6IERHLkZ1bmNDYWxsKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB1aS53YWl0KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJ1bkJ1dHRvbiA9IHVpLmJpZ0J1dHRvbignUnVuJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjYWxsLmF1eFsndmlldyddID0gdGhpcy5kYXJ0O1xuICAgICAgICBhd2FpdCB0aGlzLnJ1bigpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBlZGl0b3IgPSB1aS5kaXYoKTtcbiAgICAgIGNvbnN0IGlucHV0czogREcuSW5wdXRCYXNlW10gPSBhd2FpdCBjYWxsLmJ1aWxkRWRpdG9yKGVkaXRvciwge2NvbmRlbnNlZDogdHJ1ZX0pO1xuICAgICAgZWRpdG9yLmNsYXNzTGlzdC5hZGQoJ3VpLWZvcm0nKTtcbiAgICAgIGNvbnN0IGJ1dHRvbnMgPSB1aS5kaXZIKFt0aGlzLmhpc3RvcnlSb290LCBydW5CdXR0b25dLCB7c3R5bGU6IHsnanVzdGlmeS1jb250ZW50JzogJ3NwYWNlLWJldHdlZW4nfX0pO1xuICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKGJ1dHRvbnMpO1xuICAgICAgcmV0dXJuIGVkaXRvcjtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIG1hcHBwaW5nIG9mIHBhcmFtIHRvIHRoZSBzd2l0Y2hjZXMgb2YgdGhlaXIgdmlld2Vycy9ncmlkc1xuICBwYXJhbUdyaWRTd2l0Y2hlczogTWFwPHN0cmluZywgSFRNTEVsZW1lbnQ+ID0gbmV3IE1hcCgpO1xuICAvLyBtYXBwcGluZyBvZiBwYXJhbSB0byB0aGVpciB2aWV3ZXJzIHBsYWNlZCBvbiBET01cbiAgZXhpc3RpbmdQYXJhbVZpZXdlcnM6IE1hcDxzdHJpbmcsIERHLlZpZXdlcltdPiA9IG5ldyBNYXAoKTtcbiAgLy8gbWFwcHBpbmcgb2YgcGFyYW0gdG8gdGhlaXIgaHRtbCBlbGVtZW50c1xuICBwYXJhbVNwYW5zOiBNYXA8c3RyaW5nLCBIVE1MRWxlbWVudD4gPSBuZXcgTWFwKCk7XG4gIC8vIG1hcHBwaW5nIG9mIHRhYiBuYW1lcyB0byB0aGVpciBjb250ZW50XG4gIHJlc3VsdFRhYnM6IE1hcDxTdHJpbmcsIEhUTUxFbGVtZW50PiA9IG5ldyBNYXAoKTtcbiAgcmVzdWx0c1RhYkNvbnRyb2w6IERHLlRhYkNvbnRyb2wgfCB1bmRlZmluZWQ7XG4gIHJlc3VsdHNEaXY6IEhUTUxFbGVtZW50ID0gdWkucGFuZWwoW10sICdncm9rLWZ1bmMtcmVzdWx0cycpO1xuICBjb250cm9sc1Jvb3Q6IEhUTUxEaXZFbGVtZW50ID0gdWkuYm94KG51bGwsIHtzdHlsZToge21heFdpZHRoOiAnMzcwcHgnfX0pO1xuICByZXN1bHRzUm9vdDogSFRNTERpdkVsZW1lbnQgPSB1aS5ib3goKTtcbiAgaGlzdG9yeVJvb3Q6IEhUTUxEaXZFbGVtZW50ID0gdWkuZGl2VihbXSwge3N0eWxlOiB7J2p1c3RpZnktY29udGVudCc6ICdjZW50ZXInfX0pO1xuICBpbnB1dHNSb290OiBIVE1MRGl2RWxlbWVudCA9IHVpLnBhbmVsKFtdLCAnZ3Jvay1mdW5jLXJlc3VsdHMsIHVpLWJveCcpO1xuXG4gIGFwcGVuZE91dHB1dERmKHBhcmFtOiBERy5GdW5jQ2FsbFBhcmFtLCBvcHRpb25zPzogeyBjYXB0aW9uPzogc3RyaW5nLCBjYXRlZ29yeT86IHN0cmluZywgaGVpZ2h0PzogbnVtYmVyIH0pIHtcbiAgICBjb25zdCBwYXJhbURmID0gcGFyYW0udmFsdWUgYXMgREcuRGF0YUZyYW1lO1xuICAgIGNvbnN0IGhlaWdodCA9IG9wdGlvbnM/LmhlaWdodCA/PyA0MDA7XG4gICAgY29uc3QgcGFyYW1WaWV3ZXJzOiBERy5WaWV3ZXJbXSA9IHBhcmFtLmF1eFsndmlld2VycyddID8/IFtdOyAvLyBzdG9yaW5nIHRoZSB2aWV3ZXJzIG9mIERmXG4gICAgY29uc3QgcGFyYW1DYXB0aW9uID0gb3B0aW9ucz8uY2FwdGlvbiA/PyBwYXJhbS5hdXhbJ3ZpZXdlclRpdGxlJ10gPz8gcGFyYW0ucHJvcGVydHkuY2FwdGlvbiA/PyAnJztcbiAgICBsZXQgZXhpc3RpbmdWaWV3ZXJzID0gdGhpcy5leGlzdGluZ1BhcmFtVmlld2Vycy5nZXQocGFyYW0ubmFtZSk7XG4gICAgaWYgKGV4aXN0aW5nVmlld2VycyAhPSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IHYgb2YgZXhpc3RpbmdWaWV3ZXJzKVxuICAgICAgICB2LmRhdGFGcmFtZSA9IHBhcmFtRGY7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV4aXN0aW5nVmlld2VycyA/Pz0gW107XG4gICAgdGhpcy5leGlzdGluZ1BhcmFtVmlld2Vycy5zZXQocGFyYW0ubmFtZSwgZXhpc3RpbmdWaWV3ZXJzKTtcbiAgICBpZiAocGFyYW1WaWV3ZXJzLmxlbmd0aCA9PSAwKVxuICAgICAgcGFyYW1WaWV3ZXJzLnB1c2gocGFyYW1EZi5wbG90LmdyaWQoKSk7XG5cbiAgICBjb25zdCB2aWV3ZXJzVG9IaWRlOiBIVE1MRWxlbWVudFtdID0gW107XG4gICAgbGV0IGJsb2NrczogbnVtYmVyID0gMDtcbiAgICBsZXQgYmxvY2tXaWR0aDogbnVtYmVyID0gMDtcbiAgICBjb25zdCBncmlkV3JhcHBlciA9IHVpLmJveChudWxsLCB7c3R5bGU6IHtoZWlnaHQ6ICcxMDAlJ319KTtcblxuICAgIGNvbnN0IGlzR3JpZFN3aXRjaGFibGUgPSB3dShwYXJhbVZpZXdlcnMpLmV2ZXJ5KCh2OiBERy5WaWV3ZXIpID0+IHYudHlwZSAhPT0gJ0dyaWQnKTtcbiAgICAkKGdyaWRXcmFwcGVyKS5oaWRlKCk7XG5cbiAgICBjb25zdCBnZXRIZWFkZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBoZWFkZXJMYWJlbCA9IHBhcmFtQ2FwdGlvbiA/PyBwYXJhbURmLm5hbWUgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkZXIgPSB1aS5kaXYoW10sICdncm9rLWZ1bmMtcmVzdWx0cy1oZWFkZXInKTtcbiAgICAgIGlmIChoZWFkZXJMYWJlbCAhPSAnJykge1xuICAgICAgICBjb25zdCBoID0gdWkuaDEoaGVhZGVyTGFiZWwpO1xuICAgICAgICB1aS5Ub29sdGlwLmJpbmQoaCwgKCkgPT4gaGVhZGVyTGFiZWwpO1xuICAgICAgICBoZWFkZXIuYXBwZW5kQ2hpbGQoaCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNHcmlkU3dpdGNoYWJsZSkge1xuICAgICAgICBjb25zdCBpY29uID0gdWkuaWNvblN2ZygndGFibGUnLCAoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdWkuc2V0RGlzcGxheUFsbCh2aWV3ZXJzVG9IaWRlLCB2aWV3ZXJzVG9IaWRlLnNvbWUoKHZpZXdlcikgPT4gdmlld2VyLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykpO1xuICAgICAgICAgIHVpLnNldERpc3BsYXkoZ3JpZFdyYXBwZXIsIGdyaWRXcmFwcGVyLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJyk7XG4gICAgICAgIH0sICdTaG93IGdyaWQnKTtcbiAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKGljb24pO1xuICAgICAgICB0aGlzLnBhcmFtR3JpZFN3aXRjaGVzLnNldChwYXJhbS5uYW1lLCBpY29uKTtcbiAgICAgIH1cbiAgICAgIGlmICghZ3Jvay5zaGVsbC50YWJsZXMuaW5jbHVkZXMocGFyYW1EZikpIHtcbiAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKFxuICAgICAgICAgIHVpLmljb25zLmFkZCgoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgY29uc3QgdiA9IGdyb2suc2hlbGwuYWRkVGFibGVWaWV3KHBhcmFtRGYpO1xuICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCB2aWV3ZXIgb2YgcGFyYW1WaWV3ZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZpZXdlci50eXBlICE9ICdHcmlkJykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Vmlld2VyID0gYXdhaXQgcGFyYW1EZi5wbG90LmZyb21UeXBlKHZpZXdlci50eXBlKSBhcyBERy5WaWV3ZXI7XG4gICAgICAgICAgICAgICAgICBuZXdWaWV3ZXIuc2V0T3B0aW9ucyh2aWV3ZXIuZ2V0T3B0aW9ucygpKTtcbiAgICAgICAgICAgICAgICAgIHYuYWRkVmlld2VyKG5ld1ZpZXdlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgJ0FkZCB0byB3b3Jrc3BhY2UnXG4gICAgICAgICAgKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGVhZGVyO1xuICAgIH07XG5cbiAgICBpZiAoaXNHcmlkU3dpdGNoYWJsZSkge1xuICAgICAgY29uc3QgZ3JpZCA9IHBhcmFtRGYucGxvdC5ncmlkKCk7XG4gICAgICBncmlkV3JhcHBlci5hcHBlbmRDaGlsZChncmlkLnJvb3QpO1xuICAgICAgZXhpc3RpbmdWaWV3ZXJzLnB1c2goZ3JpZCk7XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVyID0gZ2V0SGVhZGVyKCk7XG4gICAgY29uc3Qgd3JhcHBlciA9IHVpLmRpdkgoW10sIHtzdHlsZToge2hlaWdodDogJzEwMCUnfX0pO1xuICAgIHBhcmFtVmlld2Vycy5mb3JFYWNoKCh2aWV3ZXIpID0+IHtcbiAgICAgIGlmICh2aWV3ZXI/LnRhZ3MgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgZXhpc3RpbmdWaWV3ZXJzIS5wdXNoKHZpZXdlcik7XG4gICAgICBjb25zdCB2aWV3ZXJTaXplID0gdmlld2VyLnRhZ3NbJy5ibG9jay1zaXplJ10gPz8gMTAwOyAvLyBnZXR0aW5nIGAoYmxvY2s6IDI1KWAgdmFsdWU7IGlmIG5vdCBkZWZpbmVkLCBpdCBpcyAxMDBcblxuICAgICAgdmlld2VyLnJvb3Quc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgICAgdmlld2VyLnJvb3QuY2xhc3NMaXN0LmFkZChgdWktYmxvY2stJHt2aWV3ZXJTaXplfWApO1xuICAgICAgaWYgKGJsb2NrcyArIHZpZXdlclNpemUgPD0gMTAwKSB7XG4gICAgICAgIHZpZXdlcnNUb0hpZGUucHVzaCh3cmFwcGVyKTtcbiAgICAgICAgYmxvY2tXaWR0aCArPSB2aWV3ZXJTaXplO1xuICAgICAgfVxuICAgICAgYmxvY2tzICs9IHZpZXdlclNpemU7XG4gICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHZpZXdlci5yb290KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGJsb2NrID0gdWkuZGl2VihbaGVhZGVyLCB3cmFwcGVyLCBncmlkV3JhcHBlcl0sIHtzdHlsZToge2hlaWdodDogYCR7aGVpZ2h0fXB4YCwgd2lkdGg6IGAke2Jsb2NrV2lkdGh9JWB9fSk7XG4gICAgYmxvY2suY2xhc3NMaXN0LmFkZCgndWktYm94Jyk7XG4gICAgdGhpcy5fYXBwZW5kUmVzdWx0RWxlbWVudChibG9jaywgb3B0aW9ucz8uY2F0ZWdvcnkpO1xuICB9XG5cbiAgYXBwZW5kUmVzdWx0U2NhbGFyKHBhcmFtOiBERy5GdW5jQ2FsbFBhcmFtLCBvcHRpb25zOiB7IGNhcHRpb24/OiBzdHJpbmcsIGNhdGVnb3J5OiBzdHJpbmcsIGhlaWdodD86IG51bWJlciB9KSB7XG4gICAgY29uc3Qgc3BhbiA9IHVpLnNwYW4oW2Ake29wdGlvbnMuY2FwdGlvbiA/PyBwYXJhbS5uYW1lfTogYCwgYCR7cGFyYW0udmFsdWV9YF0pO1xuICAgIGlmICghdGhpcy5wYXJhbVNwYW5zLmdldChwYXJhbS5uYW1lKSkge1xuICAgICAgaWYgKHRoaXMucmVzdWx0c1RhYkNvbnRyb2wpXG4gICAgICAgIHRoaXMucmVzdWx0VGFicy5nZXQob3B0aW9ucy5jYXRlZ29yeSkhLmFwcGVuZENoaWxkKHNwYW4pO1xuICAgICAgZWxzZVxuICAgICAgICB0aGlzLnJlc3VsdHNEaXYuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFyYW1TcGFucy5nZXQocGFyYW0ubmFtZSk/LnJlcGxhY2VXaXRoKHNwYW4pO1xuICAgIH1cbiAgICB0aGlzLnBhcmFtU3BhbnMuc2V0KHBhcmFtLm5hbWUsIHNwYW4pO1xuICB9XG5cbiAgX2FwcGVuZFJlc3VsdEVsZW1lbnQoZDogSFRNTEVsZW1lbnQsIGNhdGVnb3J5Pzogc3RyaW5nKSB7XG4gICAgaWYgKGNhdGVnb3J5ICE9IG51bGwgJiYgdGhpcy5yZXN1bHRzVGFiQ29udHJvbCAhPSB1bmRlZmluZWQgJiYgdGhpcy5yZXN1bHRUYWJzLmdldChjYXRlZ29yeSkgIT0gbnVsbClcbiAgICAgIHRoaXMucmVzdWx0VGFicy5nZXQoY2F0ZWdvcnkpIS5hcHBlbmRDaGlsZChkKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLnJlc3VsdHNEaXYuYXBwZW5kQ2hpbGQoZCk7XG4gIH1cbn1cbiJdfQ==