@datagrok-libraries/utils 0.4.2 → 0.7.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/.eslintrc.json +1 -2
- package/package.json +4 -4
- package/src/computation-view.d.ts +12 -4
- package/src/computation-view.d.ts.map +1 -1
- package/src/computation-view.js +29 -34
- package/src/function-view.d.ts +155 -57
- package/src/function-view.d.ts.map +1 -1
- package/src/function-view.js +384 -253
package/src/function-view.js
CHANGED
|
@@ -9,109 +9,269 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
};
|
|
10
10
|
/* eslint-disable valid-jsdoc */
|
|
11
11
|
/* eslint-disable max-len */
|
|
12
|
-
import wu from 'wu';
|
|
13
|
-
import $ from 'cash-dom';
|
|
14
12
|
import * as grok from 'datagrok-api/grok';
|
|
15
|
-
import * as rxjs from 'rxjs';
|
|
16
13
|
import * as ui from 'datagrok-api/ui';
|
|
17
14
|
import * as DG from 'datagrok-api/dg';
|
|
18
15
|
import ExcelJS from 'exceljs';
|
|
16
|
+
import html2canvas from 'html2canvas';
|
|
17
|
+
import wu from 'wu';
|
|
18
|
+
import $ from 'cash-dom';
|
|
19
19
|
export class FunctionView extends DG.ViewBase {
|
|
20
20
|
constructor(funcCall) {
|
|
21
21
|
super();
|
|
22
|
-
this.onViewInitialized = new rxjs.Subject();
|
|
23
|
-
this.onInputChanged = new rxjs.Subject();
|
|
24
|
-
this.onComputationStarted = new rxjs.Subject(); // emitted on computation start
|
|
25
|
-
this.onComputationCompleted = new rxjs.Subject(); // emitted anyway if computation ended properly or not
|
|
26
|
-
this.onComputationSucceeded = new rxjs.Subject(); // emitted anyway if computation ended properly
|
|
27
|
-
this.onComputationError = new rxjs.Subject(); // emitted anyway if computation ended with error
|
|
28
22
|
this._type = 'function';
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
this.
|
|
23
|
+
/** Export options. Could be overriden partially, using default implementation of each option.
|
|
24
|
+
* @stability Stable
|
|
25
|
+
*/
|
|
26
|
+
this.exportConfig = null;
|
|
27
|
+
this.defaultExportFilename = (format) => {
|
|
28
|
+
return `${this.name} - ${new Date().toLocaleString()}.${this.exportConfig.supportedExtensions[format]}`;
|
|
29
|
+
};
|
|
30
|
+
this.defaultSupportedExportExtensions = () => {
|
|
31
|
+
return {
|
|
32
|
+
'Excel': 'xlsx'
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
this.defaultSupportedExportFormats = () => {
|
|
36
|
+
return ['Excel'];
|
|
37
|
+
};
|
|
38
|
+
this.defaultExport = (format) => __awaiter(this, void 0, void 0, function* () {
|
|
39
|
+
var _a, _b, _c, _d;
|
|
40
|
+
const lastCall = this.lastCall;
|
|
41
|
+
if (!lastCall)
|
|
42
|
+
throw new Error(`Function was not called`);
|
|
43
|
+
if (!this.exportConfig.supportedFormats.includes(format))
|
|
44
|
+
throw new Error(`Format "${format}" is not supported.`);
|
|
45
|
+
if (!this.func)
|
|
46
|
+
throw new Error('The correspoding function is not specified');
|
|
47
|
+
const BLOB_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8';
|
|
48
|
+
const exportWorkbook = new ExcelJS.Workbook();
|
|
49
|
+
const isScalarType = (type) => (DG.TYPES_SCALAR.has(type));
|
|
50
|
+
const isDataFrame = (type) => (type === DG.TYPE.DATA_FRAME);
|
|
51
|
+
const dfInputs = this.func.inputs.filter((input) => isDataFrame(input.propertyType));
|
|
52
|
+
const scalarInputs = this.func.inputs.filter((input) => isScalarType(input.propertyType));
|
|
53
|
+
const dfOutputs = this.func.outputs.filter((output) => isDataFrame(output.propertyType));
|
|
54
|
+
const scalarOutputs = this.func.outputs.filter((output) => isScalarType(output.propertyType));
|
|
55
|
+
const inputParams = [...lastCall.inputParams.values()];
|
|
56
|
+
const outputParams = [...lastCall.outputParams.values()];
|
|
57
|
+
dfInputs.forEach((dfInput) => {
|
|
58
|
+
const visibleTitle = dfInput.options.caption || dfInput.name;
|
|
59
|
+
const currentDfSheet = exportWorkbook.addWorksheet(getSheetName(visibleTitle, DIRECTION.INPUT));
|
|
60
|
+
const currentDf = lastCall.inputs[dfInput.name];
|
|
61
|
+
dfToSheet(currentDfSheet, currentDf);
|
|
62
|
+
});
|
|
63
|
+
if (scalarInputs.length) {
|
|
64
|
+
const inputScalarsSheet = exportWorkbook.addWorksheet('Input scalars');
|
|
65
|
+
scalarsToSheet(inputScalarsSheet, scalarInputs.map((scalarInput) => ({
|
|
66
|
+
caption: scalarInput.options['caption'] || scalarInput.name,
|
|
67
|
+
value: lastCall.inputs[scalarInput.name],
|
|
68
|
+
units: scalarInput.options['units'] || '',
|
|
69
|
+
})));
|
|
70
|
+
}
|
|
71
|
+
dfOutputs.forEach((dfOutput) => {
|
|
72
|
+
const visibleTitle = dfOutput.options.caption || dfOutput.name;
|
|
73
|
+
const currentDfSheet = exportWorkbook.addWorksheet(getSheetName(visibleTitle, DIRECTION.OUTPUT));
|
|
74
|
+
const currentDf = lastCall.outputs[dfOutput.name];
|
|
75
|
+
dfToSheet(currentDfSheet, currentDf);
|
|
76
|
+
});
|
|
77
|
+
if (scalarOutputs.length) {
|
|
78
|
+
const outputScalarsSheet = exportWorkbook.addWorksheet('Output scalars');
|
|
79
|
+
scalarsToSheet(outputScalarsSheet, scalarOutputs.map((scalarOutput) => ({
|
|
80
|
+
caption: scalarOutput.options['caption'] || scalarOutput.name,
|
|
81
|
+
value: lastCall.outputs[scalarOutput.name],
|
|
82
|
+
units: scalarOutput.options['units'] || '',
|
|
83
|
+
})));
|
|
84
|
+
}
|
|
85
|
+
const tabControl = this.resultsTabControl;
|
|
86
|
+
if (tabControl) {
|
|
87
|
+
for (const tabLabel of this.tabsLabels) {
|
|
88
|
+
tabControl.currentPane = tabControl.getPane(tabLabel);
|
|
89
|
+
yield new Promise((r) => setTimeout(r, 100));
|
|
90
|
+
if (tabLabel === 'Input') {
|
|
91
|
+
for (const inputParam of inputParams.filter((inputParam) => inputParam.property.propertyType === DG.TYPE.DATA_FRAME)) {
|
|
92
|
+
const nonGridViewers = inputParam.aux['viewers'].filter((viewer) => viewer.type !== DG.VIEWER.GRID);
|
|
93
|
+
const dfInput = dfInputs.find((input) => input.name === inputParam.name);
|
|
94
|
+
const visibleTitle = dfInput.options.caption || inputParam.name;
|
|
95
|
+
const currentDf = lastCall.inputs[dfInput.name];
|
|
96
|
+
for (const [index, viewer] of nonGridViewers.entries()) {
|
|
97
|
+
if (((_a = viewer.root.parentElement) === null || _a === void 0 ? void 0 : _a.style.display) === 'none') {
|
|
98
|
+
(_b = this.paramGridSwitches.get(inputParam.name)) === null || _b === void 0 ? void 0 : _b.click();
|
|
99
|
+
yield new Promise((r) => setTimeout(r, 50));
|
|
100
|
+
}
|
|
101
|
+
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);
|
|
102
|
+
}
|
|
103
|
+
;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
for (const outputParam of outputParams.filter((outputParam) => outputParam.property.propertyType === DG.TYPE.DATA_FRAME && outputParam.property.category === tabLabel)) {
|
|
108
|
+
const nonGridViewers = outputParam.aux['viewers'].filter((viewer) => viewer.type !== DG.VIEWER.GRID);
|
|
109
|
+
const dfOutput = dfOutputs.find((input) => input.name === outputParam.name);
|
|
110
|
+
const visibleTitle = dfOutput.options.caption || outputParam.name;
|
|
111
|
+
const currentDf = lastCall.outputs[dfOutput.name];
|
|
112
|
+
for (const [index, viewer] of nonGridViewers.entries()) {
|
|
113
|
+
if (((_c = viewer.root.parentElement) === null || _c === void 0 ? void 0 : _c.style.display) === 'none') {
|
|
114
|
+
(_d = this.paramGridSwitches.get(outputParam.name)) === null || _d === void 0 ? void 0 : _d.click();
|
|
115
|
+
yield new Promise((r) => setTimeout(r, 50));
|
|
116
|
+
}
|
|
117
|
+
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);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
;
|
|
124
|
+
}
|
|
125
|
+
const buffer = yield exportWorkbook.xlsx.writeBuffer();
|
|
126
|
+
return new Blob([buffer], { type: BLOB_TYPE });
|
|
127
|
+
});
|
|
128
|
+
// mappping of param to the switchces of their viewers/grids
|
|
129
|
+
this.paramGridSwitches = new Map();
|
|
130
|
+
// mappping of param to their viewers placed on DOM
|
|
131
|
+
this.existingParamViewers = new Map();
|
|
132
|
+
// mappping of param to their html elements
|
|
133
|
+
this.paramSpans = new Map();
|
|
134
|
+
// mappping of tab names to their content
|
|
33
135
|
this.resultTabs = new Map();
|
|
34
136
|
this.resultsDiv = ui.panel([], 'grok-func-results');
|
|
35
|
-
this.controlsRoot = ui.box();
|
|
137
|
+
this.controlsRoot = ui.box(null, { style: { maxWidth: '370px' } });
|
|
36
138
|
this.resultsRoot = ui.box();
|
|
37
139
|
this.historyRoot = ui.divV([], { style: { 'justify-content': 'center' } });
|
|
38
|
-
this.
|
|
39
|
-
this.preparedCall = funcCall;
|
|
40
|
-
this.context = DG.Context.cloneDefault();
|
|
41
|
-
this.controlsRoot.style.maxWidth = '370px';
|
|
140
|
+
this.inputsRoot = ui.panel([], 'grok-func-results, ui-box');
|
|
42
141
|
this.box = true;
|
|
142
|
+
this.context = DG.Context.cloneDefault();
|
|
143
|
+
if (!funcCall)
|
|
144
|
+
return;
|
|
145
|
+
this.linkFunccall(funcCall);
|
|
146
|
+
this.init();
|
|
147
|
+
this.build();
|
|
148
|
+
this.name = funcCall.func.friendlyName;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get current function call of the view
|
|
152
|
+
* @returns The actual funccall associated with the view
|
|
153
|
+
* @stability Stable
|
|
154
|
+
*/
|
|
155
|
+
get funcCall() {
|
|
156
|
+
return this._funcCall;
|
|
43
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Get Func of the view
|
|
160
|
+
* @returns The actual func associated with the view
|
|
161
|
+
* @stability Stable
|
|
162
|
+
*/
|
|
44
163
|
get func() {
|
|
45
|
-
|
|
164
|
+
var _a;
|
|
165
|
+
return (_a = this.funcCall) === null || _a === void 0 ? void 0 : _a.func;
|
|
46
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* Get data of last call of associated function
|
|
169
|
+
* @returns The actual func associated with the view
|
|
170
|
+
* @stability Stable
|
|
171
|
+
*/
|
|
172
|
+
get lastCall() {
|
|
173
|
+
return this._lastCall;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Set data of last call of associated function
|
|
177
|
+
* @stability Stable
|
|
178
|
+
*/
|
|
179
|
+
set lastCall(lastCall) {
|
|
180
|
+
this._lastCall = lastCall;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* View type
|
|
184
|
+
* @stability Stable
|
|
185
|
+
*/
|
|
47
186
|
get type() {
|
|
48
187
|
return this._type;
|
|
49
188
|
}
|
|
50
|
-
|
|
51
|
-
|
|
189
|
+
/**
|
|
190
|
+
* Link FuncCall to the view
|
|
191
|
+
* @param funcCall The actual funccall to be associated with the view
|
|
192
|
+
* @stability Stable
|
|
193
|
+
*/
|
|
194
|
+
linkFunccall(funcCall) {
|
|
195
|
+
this._funcCall = funcCall;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Method for custom logic that could not be placed in the constructor.
|
|
199
|
+
* Any async methods and most of the logic should be placed here.
|
|
200
|
+
* @stability Stable
|
|
201
|
+
*/
|
|
202
|
+
init() {
|
|
52
203
|
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
-
(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
this.singleDfParam = wu(this.func.outputs).filter((p) => p.propertyType == DG.TYPE.DATA_FRAME)
|
|
61
|
-
.toArray().length == 1;
|
|
62
|
-
//var fullRunSection = div();
|
|
63
|
-
//var fullDiv = div('ui-panel', [getFullSection(func, call, fullRunSection)]);
|
|
64
|
-
//htmlSetDisplay(fullDiv, false);
|
|
65
|
-
for (const inParam of wu(this.preparedCall.inputParams.values())
|
|
66
|
-
.filter((p) => p.property.propertyType == DG.TYPE.DATA_FRAME && p.property.options['viewer'] != null)) {
|
|
67
|
-
this.showInputs = true;
|
|
68
|
-
const self = this;
|
|
69
|
-
this.subs.push(inParam.onChanged.subscribe(function (param) {
|
|
70
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
71
|
-
self.clearResults(false);
|
|
204
|
+
if (this.funcCall && this.func) {
|
|
205
|
+
this.funcCall.aux['view'] = this;
|
|
206
|
+
this.funcCall.context = this.context;
|
|
207
|
+
for (const inParam of wu(this.funcCall.inputParams.values())
|
|
208
|
+
.filter((p) => p.property.propertyType == DG.TYPE.DATA_FRAME && p.property.options['viewer'] != null)) {
|
|
209
|
+
this.subs.push(inParam.onChanged.subscribe((param) => __awaiter(this, void 0, void 0, function* () {
|
|
210
|
+
this.clearResults(false);
|
|
72
211
|
param.processOutput();
|
|
73
|
-
|
|
74
|
-
height:
|
|
75
|
-
category: '
|
|
212
|
+
this.appendOutputDf(param, {
|
|
213
|
+
height: 400,
|
|
214
|
+
category: 'Input'
|
|
76
215
|
});
|
|
77
|
-
});
|
|
78
|
-
}
|
|
216
|
+
})));
|
|
217
|
+
}
|
|
79
218
|
}
|
|
80
|
-
//this.controlsRoot.appendChild(fullDiv);
|
|
81
|
-
/*advancedModeSwitch.onChanged.listen((_) {
|
|
82
|
-
if (advancedModeSwitch.value)
|
|
83
|
-
fullRunSection.append(runSection);
|
|
84
|
-
else
|
|
85
|
-
funcDiv.append(runSection);
|
|
86
|
-
htmlSetDisplay(fullDiv, advancedModeSwitch.value);
|
|
87
|
-
htmlSetDisplay(funcDiv, !advancedModeSwitch.value);
|
|
88
|
-
});*/
|
|
89
|
-
//setRibbon();
|
|
90
|
-
this.root.appendChild(this.build());
|
|
91
|
-
/*
|
|
92
|
-
Routing.setPath(this.path, f.name, true);
|
|
93
|
-
*/
|
|
94
|
-
this.name = this.func.friendlyName;
|
|
95
219
|
});
|
|
96
220
|
}
|
|
221
|
+
/**
|
|
222
|
+
* Override to create a fully custom UI including ribbon menus and panels
|
|
223
|
+
* @stability Stable
|
|
224
|
+
*/
|
|
97
225
|
build() {
|
|
226
|
+
this.root.appendChild(this.buildIO());
|
|
227
|
+
this.buildRibbonPanels();
|
|
228
|
+
this.buildHistoryBlock();
|
|
229
|
+
this.buildRibbonMenu();
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Override to create a custom input-output block
|
|
233
|
+
* @returns The HTMLElement with whole UI excluding ribbon menus and panels
|
|
234
|
+
* @stability Stable
|
|
235
|
+
*/
|
|
236
|
+
buildIO() {
|
|
237
|
+
this.exportConfig = {
|
|
238
|
+
supportedExtensions: this.defaultSupportedExportExtensions(),
|
|
239
|
+
supportedFormats: this.defaultSupportedExportFormats(),
|
|
240
|
+
export: this.defaultExport,
|
|
241
|
+
filename: this.defaultExportFilename,
|
|
242
|
+
};
|
|
98
243
|
const inputBlock = this.buildInputBlock();
|
|
99
244
|
const outputBlock = this.buildOutputBlock();
|
|
100
|
-
const ribbonPanels = this.buildRibbonPanels();
|
|
101
|
-
const historyBlock = this.buildHistoryBlock();
|
|
102
245
|
return ui.splitH([inputBlock, outputBlock]);
|
|
103
246
|
}
|
|
247
|
+
/**
|
|
248
|
+
* Override to create a custom input block
|
|
249
|
+
* @returns The HTMLElement with input block UI on the left side by default
|
|
250
|
+
* @stability Stable
|
|
251
|
+
*/
|
|
104
252
|
buildInputBlock() {
|
|
105
|
-
|
|
253
|
+
if (!this.funcCall)
|
|
254
|
+
return this.controlsRoot;
|
|
255
|
+
const funcDiv = ui.div([this.renderRunSection(this.funcCall)], 'ui-div');
|
|
106
256
|
this.controlsRoot.innerHTML = '';
|
|
107
257
|
this.controlsRoot.appendChild(funcDiv);
|
|
108
258
|
return this.controlsRoot;
|
|
109
259
|
}
|
|
260
|
+
/**
|
|
261
|
+
* Override to create a custom output block.
|
|
262
|
+
* @returns The HTMLElement with input block UI on the left side by default
|
|
263
|
+
* @stability Stable
|
|
264
|
+
*/
|
|
110
265
|
buildOutputBlock() {
|
|
111
266
|
this.resultsRoot.innerHTML = '';
|
|
112
267
|
this.resultsRoot.appendChild(this.resultsDiv);
|
|
113
268
|
return this.resultsRoot;
|
|
114
269
|
}
|
|
270
|
+
/**
|
|
271
|
+
* Override to create a custom historical runs control.
|
|
272
|
+
* @returns The HTMLElement with history block UI
|
|
273
|
+
* @stability Experimental
|
|
274
|
+
*/
|
|
115
275
|
buildHistoryBlock() {
|
|
116
276
|
const newHistoryBlock = ui.iconFA('history', () => {
|
|
117
277
|
this.pullRuns().then((historicalRuns) => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -129,164 +289,102 @@ export class FunctionView extends DG.ViewBase {
|
|
|
129
289
|
this.historyRoot.append(newHistoryBlock);
|
|
130
290
|
return newHistoryBlock;
|
|
131
291
|
}
|
|
132
|
-
/**
|
|
292
|
+
/**
|
|
293
|
+
* Looks for {@link supportedExportFormats} members and creates ribbon panel
|
|
294
|
+
* @returns The HTMLElements of ribbonPanels
|
|
295
|
+
* @stability Stable
|
|
296
|
+
*/
|
|
133
297
|
buildRibbonPanels() {
|
|
134
|
-
const newRibbonPanels = [
|
|
135
|
-
|
|
136
|
-
|
|
298
|
+
const newRibbonPanels = [
|
|
299
|
+
...this.getRibbonPanels(),
|
|
300
|
+
[...(this.exportConfig && this.exportConfig.supportedFormats.length > 0) ? [ui.divH([
|
|
301
|
+
ui.comboPopup(ui.iconFA('arrow-to-bottom'), this.exportConfig.supportedFormats, (format) => __awaiter(this, void 0, void 0, function* () { return DG.Utils.download(this.exportConfig.filename(format), yield this.exportConfig.export(format)); })),
|
|
302
|
+
])] : []]
|
|
303
|
+
];
|
|
137
304
|
this.setRibbonPanels(newRibbonPanels);
|
|
138
305
|
return newRibbonPanels;
|
|
139
306
|
}
|
|
140
|
-
/**
|
|
141
|
-
|
|
142
|
-
|
|
307
|
+
/**
|
|
308
|
+
* Override to create a custom ribbon menu on the top.
|
|
309
|
+
* @stability Stable
|
|
310
|
+
*/
|
|
311
|
+
buildRibbonMenu() {
|
|
143
312
|
}
|
|
144
|
-
/**
|
|
145
|
-
*
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
];
|
|
150
|
-
}
|
|
151
|
-
/** Override to provide custom file extensions for exported formats.
|
|
152
|
-
* These formats are available under the "Export" popup on the ribbon panel. */
|
|
153
|
-
get supportedExportExtensions() {
|
|
154
|
-
return {
|
|
155
|
-
'Excel': 'xlsx',
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
/** Override to provide custom export. */
|
|
159
|
-
export(format) {
|
|
313
|
+
/**
|
|
314
|
+
* Saves the computation results to the historical results, returns its id. See also {@link loadRun}.
|
|
315
|
+
* @stability Experimental
|
|
316
|
+
*/
|
|
317
|
+
saveRun() {
|
|
160
318
|
return __awaiter(this, void 0, void 0, function* () {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
const lastCall = this.lastCall;
|
|
164
|
-
if (!lastCall)
|
|
165
|
-
throw new Error(`Function was not called`);
|
|
166
|
-
if (format !== 'Excel')
|
|
167
|
-
throw new Error(`Format "${format}" is not supported.`);
|
|
168
|
-
const BLOB_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8';
|
|
169
|
-
const exportWorkbook = new ExcelJS.Workbook();
|
|
170
|
-
const isScalarType = (type) => (DG.TYPES_SCALAR.has(type));
|
|
171
|
-
const isDataFrame = (type) => (type === DG.TYPE.DATA_FRAME);
|
|
172
|
-
const dfInputs = this.func.inputs.filter((input) => isDataFrame(input.propertyType));
|
|
173
|
-
const scalarInputs = this.func.inputs.filter((input) => isScalarType(input.propertyType));
|
|
174
|
-
const dfOutputs = this.func.outputs.filter((output) => isDataFrame(output.propertyType));
|
|
175
|
-
const scalarOutputs = this.func.outputs.filter((output) => isScalarType(output.propertyType));
|
|
176
|
-
dfInputs.forEach((dfInput) => {
|
|
177
|
-
const visibleTitle = dfInput.options.caption || dfInput.name;
|
|
178
|
-
const currentDfSheet = exportWorkbook.addWorksheet(getSheetName(visibleTitle, DIRECTION.INPUT));
|
|
179
|
-
const currentDf = lastCall.inputs[dfInput.name];
|
|
180
|
-
dfToSheet(currentDfSheet, currentDf);
|
|
181
|
-
});
|
|
182
|
-
if (scalarInputs.length) {
|
|
183
|
-
const inputScalarsSheet = exportWorkbook.addWorksheet('Input scalars');
|
|
184
|
-
scalarsToSheet(inputScalarsSheet, scalarInputs.map((scalarInput) => ({
|
|
185
|
-
caption: scalarInput.options['caption'] || scalarInput.name,
|
|
186
|
-
value: lastCall.inputs[scalarInput.name],
|
|
187
|
-
units: scalarInput.options['units'] || '',
|
|
188
|
-
})));
|
|
189
|
-
}
|
|
190
|
-
dfOutputs.forEach((dfOutput) => {
|
|
191
|
-
const visibleTitle = dfOutput.options.caption || dfOutput.name;
|
|
192
|
-
const currentDfSheet = exportWorkbook.addWorksheet(getSheetName(visibleTitle, DIRECTION.OUTPUT));
|
|
193
|
-
const currentDf = lastCall.outputs[dfOutput.name];
|
|
194
|
-
dfToSheet(currentDfSheet, currentDf);
|
|
195
|
-
});
|
|
196
|
-
if (scalarOutputs.length) {
|
|
197
|
-
const outputScalarsSheet = exportWorkbook.addWorksheet('Output scalars');
|
|
198
|
-
scalarsToSheet(outputScalarsSheet, scalarOutputs.map((scalarOutput) => ({
|
|
199
|
-
caption: scalarOutput.options['caption'] || scalarOutput.name,
|
|
200
|
-
value: lastCall.outputs[scalarOutput.name],
|
|
201
|
-
units: scalarOutput.options['units'] || '',
|
|
202
|
-
})));
|
|
203
|
-
}
|
|
204
|
-
const buffer = yield exportWorkbook.xlsx.writeBuffer();
|
|
205
|
-
return new Blob([buffer], { type: BLOB_TYPE });
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
/** Saves the computation results to the historical results, returns its id. See also {@link loadRun}. */
|
|
209
|
-
saveRun(call) {
|
|
210
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
211
|
-
throw new Error('Method is not implemented');
|
|
212
|
-
/* await grok.dapi.functions.calls.save(call);*/
|
|
319
|
+
//@ts-ignore
|
|
320
|
+
return yield grok.dapi.functions.calls.save(this.lastCall);
|
|
213
321
|
});
|
|
214
322
|
}
|
|
215
|
-
/**
|
|
216
|
-
|
|
323
|
+
/**
|
|
324
|
+
* Loads the specified historical run. See also {@link saveRun}.
|
|
325
|
+
* @stability Experimental
|
|
326
|
+
*/
|
|
327
|
+
loadRun(funcCallId) {
|
|
217
328
|
return __awaiter(this, void 0, void 0, function* () {
|
|
218
|
-
|
|
219
|
-
/* await grok.dapi.functions.calls.find(call.id);*/
|
|
329
|
+
return yield grok.dapi.functions.calls.include('inputs, outputs').find(funcCallId);
|
|
220
330
|
});
|
|
221
331
|
}
|
|
222
|
-
/**
|
|
332
|
+
/**
|
|
333
|
+
* Loads all the function call of this function.
|
|
334
|
+
* Designed to pull hstorical runs in fast manner and the call {@link loadRun} with specified run ID.
|
|
335
|
+
* WARNING: FuncCall inputs/outputs are not included
|
|
336
|
+
* @stability Experimental
|
|
337
|
+
*/
|
|
223
338
|
pullRuns() {
|
|
339
|
+
var _a;
|
|
224
340
|
return __awaiter(this, void 0, void 0, function* () {
|
|
225
|
-
|
|
226
|
-
|
|
341
|
+
const list = grok.dapi.functions.calls.filter(`func.id="${(_a = this.func) === null || _a === void 0 ? void 0 : _a.id}"`).list();
|
|
342
|
+
return list;
|
|
227
343
|
});
|
|
228
344
|
}
|
|
229
|
-
clearResults(switchToOutput = true) {
|
|
230
|
-
const categories = [];
|
|
231
|
-
// resultTabs.clear();
|
|
232
|
-
if (this.showInputs) {
|
|
233
|
-
categories.push('INPUT');
|
|
234
|
-
this.resultTabs.set('INPUT', this.inputsDiv);
|
|
235
|
-
}
|
|
236
|
-
for (const p of this.func.outputs) {
|
|
237
|
-
if (categories.includes(p.category))
|
|
238
|
-
continue;
|
|
239
|
-
categories.push(p.category);
|
|
240
|
-
}
|
|
241
|
-
if ((categories.length > 1 || (categories.length == 1 && categories[0] != 'Misc'))) {
|
|
242
|
-
this.resultsTabControl = DG.TabControl.create();
|
|
243
|
-
for (const c of categories) {
|
|
244
|
-
if (!this.resultTabs.has(c))
|
|
245
|
-
this.resultTabs.set(c, ui.div([], 'ui-panel, grok-func-results'));
|
|
246
|
-
let name = c;
|
|
247
|
-
if (this.showInputs && categories.length == 2 && c == 'Misc')
|
|
248
|
-
name = 'OUTPUT';
|
|
249
|
-
this.resultsTabControl.addPane(name, () => { var _a; return (_a = this.resultTabs.get(c)) !== null && _a !== void 0 ? _a : ui.div(); });
|
|
250
|
-
}
|
|
251
|
-
if (categories.length > 1 && this.showInputs && switchToOutput)
|
|
252
|
-
this.resultsTabControl.currentPane = this.resultsTabControl.panes[1];
|
|
253
|
-
this.resultsDiv = this.resultsTabControl.root;
|
|
254
|
-
}
|
|
255
|
-
this.buildOutputBlock();
|
|
256
|
-
}
|
|
257
345
|
run() {
|
|
258
346
|
return __awaiter(this, void 0, void 0, function* () {
|
|
259
|
-
|
|
347
|
+
if (!this.funcCall)
|
|
348
|
+
throw new Error('The correspoding function is not specified');
|
|
260
349
|
try {
|
|
261
|
-
yield this.
|
|
350
|
+
this.lastCall = yield this.funcCall.call(true, undefined, { processed: true });
|
|
262
351
|
}
|
|
263
352
|
catch (e) {
|
|
264
|
-
// this.onComputationError.next(this.lastCall);
|
|
265
353
|
}
|
|
266
|
-
this.onComputationSucceeded.next(this.lastCall);
|
|
267
354
|
this.outputParametersToView(this.lastCall);
|
|
268
355
|
});
|
|
269
356
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
});
|
|
357
|
+
get isInputPanelRequired() {
|
|
358
|
+
var _a;
|
|
359
|
+
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;
|
|
274
360
|
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
361
|
+
get outParamCategories() {
|
|
362
|
+
return [
|
|
363
|
+
...new Set(this.func.outputs.map((p) => p.category)) // get all output params' categories
|
|
364
|
+
]; // keep only unique of them
|
|
365
|
+
}
|
|
366
|
+
get outputTabsLabels() {
|
|
367
|
+
return [
|
|
368
|
+
...this.outParamCategories,
|
|
369
|
+
...this.outParamCategories.find((val) => val === 'Misc') ? ['Output'] : [], // if no categories are stated, the default category is added
|
|
370
|
+
];
|
|
371
|
+
}
|
|
372
|
+
get tabsLabels() {
|
|
373
|
+
return Object.keys(this.paramToCategoryMap);
|
|
374
|
+
}
|
|
375
|
+
get paramToCategoryMap() {
|
|
376
|
+
const map = {};
|
|
377
|
+
if (this.isInputPanelRequired)
|
|
378
|
+
this.func.inputs.forEach((p) => map['Input'] ? map['Input'].push(p.name) : map['Input'] = [p.name]);
|
|
379
|
+
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]);
|
|
380
|
+
return map;
|
|
284
381
|
}
|
|
285
382
|
renderRunSection(call) {
|
|
286
383
|
return ui.wait(() => __awaiter(this, void 0, void 0, function* () {
|
|
287
384
|
const runButton = ui.bigButton('Run', () => __awaiter(this, void 0, void 0, function* () {
|
|
288
385
|
call.aux['view'] = this.dart;
|
|
289
386
|
yield this.run();
|
|
387
|
+
// this.saveRun();
|
|
290
388
|
}));
|
|
291
389
|
const editor = ui.div();
|
|
292
390
|
const inputs = yield call.buildEditor(editor, { condensed: true });
|
|
@@ -296,57 +394,82 @@ export class FunctionView extends DG.ViewBase {
|
|
|
296
394
|
return editor;
|
|
297
395
|
}));
|
|
298
396
|
}
|
|
299
|
-
|
|
397
|
+
clearResults(switchToOutput = true) {
|
|
398
|
+
const categories = this.tabsLabels;
|
|
399
|
+
if ((categories.length > 1 || (categories.length == 1 && categories[0] != 'Misc'))) {
|
|
400
|
+
this.resultsTabControl = DG.TabControl.create();
|
|
401
|
+
for (const c of categories) {
|
|
402
|
+
if (!this.resultTabs.has(c))
|
|
403
|
+
this.resultTabs.set(c, ui.div([], 'ui-panel, grok-func-results, ui-box'));
|
|
404
|
+
let name = c;
|
|
405
|
+
if (this.isInputPanelRequired && categories.length == 2 && c == 'Misc')
|
|
406
|
+
name = 'OUTPUT';
|
|
407
|
+
this.resultsTabControl.addPane(name, () => { var _a; return (_a = this.resultTabs.get(c)) !== null && _a !== void 0 ? _a : ui.div(); });
|
|
408
|
+
}
|
|
409
|
+
if (categories.length > 1 && this.isInputPanelRequired && switchToOutput)
|
|
410
|
+
this.resultsTabControl.currentPane = this.resultsTabControl.panes[1];
|
|
411
|
+
this.resultsDiv = this.resultsTabControl.root;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
outputParametersToView(call) {
|
|
415
|
+
this.clearResults(true);
|
|
416
|
+
for (const p of call.outputParams.values()) {
|
|
417
|
+
p.processOutput();
|
|
418
|
+
if (p.property.propertyType == DG.TYPE.DATA_FRAME && p.value != null)
|
|
419
|
+
this.appendOutputDf(p, { caption: p.property.name, category: p.property.category });
|
|
420
|
+
else
|
|
421
|
+
this.appendResultScalar(p, { caption: p.property.name, category: p.property.category });
|
|
422
|
+
}
|
|
423
|
+
this.buildOutputBlock();
|
|
424
|
+
}
|
|
425
|
+
appendOutputDf(param, options) {
|
|
300
426
|
var _a, _b, _c, _d, _e;
|
|
301
|
-
const
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
const
|
|
305
|
-
|
|
306
|
-
let existingViewers = this.paramViewers.get(param.name);
|
|
427
|
+
const paramDf = param.value;
|
|
428
|
+
const height = (_a = options === null || options === void 0 ? void 0 : options.height) !== null && _a !== void 0 ? _a : 400;
|
|
429
|
+
const paramViewers = (_b = param.aux['viewers']) !== null && _b !== void 0 ? _b : []; // storing the viewers of Df
|
|
430
|
+
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 : '';
|
|
431
|
+
let existingViewers = this.existingParamViewers.get(param.name);
|
|
307
432
|
if (existingViewers != null) {
|
|
308
433
|
for (const v of existingViewers)
|
|
309
|
-
v.dataFrame =
|
|
434
|
+
v.dataFrame = paramDf;
|
|
310
435
|
return;
|
|
311
436
|
}
|
|
312
437
|
existingViewers !== null && existingViewers !== void 0 ? existingViewers : (existingViewers = []);
|
|
313
|
-
this.
|
|
314
|
-
if (
|
|
315
|
-
|
|
316
|
-
const
|
|
438
|
+
this.existingParamViewers.set(param.name, existingViewers);
|
|
439
|
+
if (paramViewers.length == 0)
|
|
440
|
+
paramViewers.push(paramDf.plot.grid());
|
|
441
|
+
const viewersToHide = [];
|
|
317
442
|
let blocks = 0;
|
|
318
|
-
let
|
|
319
|
-
const gridWrapper = ui.
|
|
320
|
-
const
|
|
443
|
+
let blockWidth = 0;
|
|
444
|
+
const gridWrapper = ui.box(null, { style: { height: '100%' } });
|
|
445
|
+
const isGridSwitchable = wu(paramViewers).every((v) => v.type !== 'Grid');
|
|
321
446
|
$(gridWrapper).hide();
|
|
322
|
-
const getHeader = (
|
|
447
|
+
const getHeader = () => {
|
|
323
448
|
var _a;
|
|
324
|
-
const
|
|
449
|
+
const headerLabel = (_a = paramCaption !== null && paramCaption !== void 0 ? paramCaption : paramDf.name) !== null && _a !== void 0 ? _a : '';
|
|
325
450
|
const header = ui.div([], 'grok-func-results-header');
|
|
326
|
-
if (
|
|
327
|
-
const h = ui.h1(
|
|
328
|
-
ui.Tooltip.bind(h, () =>
|
|
451
|
+
if (headerLabel != '') {
|
|
452
|
+
const h = ui.h1(headerLabel);
|
|
453
|
+
ui.Tooltip.bind(h, () => headerLabel);
|
|
329
454
|
header.appendChild(h);
|
|
330
455
|
}
|
|
331
|
-
if (
|
|
456
|
+
if (isGridSwitchable) {
|
|
332
457
|
const icon = ui.iconSvg('table', (e) => {
|
|
333
458
|
e.stopPropagation();
|
|
334
|
-
ui.setDisplayAll(
|
|
335
|
-
ui.setDisplay(gridWrapper,
|
|
336
|
-
gridWrapper.classList.add(`ui-block-${blockSize}`);
|
|
459
|
+
ui.setDisplayAll(viewersToHide, viewersToHide.some((viewer) => viewer.style.display === 'none'));
|
|
460
|
+
ui.setDisplay(gridWrapper, gridWrapper.style.display === 'none');
|
|
337
461
|
}, 'Show grid');
|
|
338
|
-
if (!sw)
|
|
339
|
-
icon.classList.add('active');
|
|
340
462
|
header.appendChild(icon);
|
|
463
|
+
this.paramGridSwitches.set(param.name, icon);
|
|
341
464
|
}
|
|
342
|
-
if (!grok.shell.tables.includes(
|
|
465
|
+
if (!grok.shell.tables.includes(paramDf)) {
|
|
343
466
|
header.appendChild(ui.icons.add((e) => {
|
|
344
467
|
e.stopPropagation();
|
|
345
|
-
const v = grok.shell.addTableView(
|
|
468
|
+
const v = grok.shell.addTableView(paramDf);
|
|
346
469
|
(() => __awaiter(this, void 0, void 0, function* () {
|
|
347
|
-
for (const viewer of
|
|
470
|
+
for (const viewer of paramViewers) {
|
|
348
471
|
if (viewer.type != 'Grid') {
|
|
349
|
-
const newViewer = yield
|
|
472
|
+
const newViewer = yield paramDf.plot.fromType(viewer.type);
|
|
350
473
|
newViewer.setOptions(viewer.getOptions());
|
|
351
474
|
v.addViewer(newViewer);
|
|
352
475
|
}
|
|
@@ -356,52 +479,47 @@ export class FunctionView extends DG.ViewBase {
|
|
|
356
479
|
}
|
|
357
480
|
return header;
|
|
358
481
|
};
|
|
359
|
-
if (
|
|
360
|
-
|
|
361
|
-
const grid = df.plot.grid();
|
|
362
|
-
grid.root.style.height = `${height}px`;
|
|
482
|
+
if (isGridSwitchable) {
|
|
483
|
+
const grid = paramDf.plot.grid();
|
|
363
484
|
gridWrapper.appendChild(grid.root);
|
|
364
485
|
existingViewers.push(grid);
|
|
365
486
|
}
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
487
|
+
const header = getHeader();
|
|
488
|
+
const wrapper = ui.divH([], { style: { height: '100%' } });
|
|
489
|
+
paramViewers.forEach((viewer) => {
|
|
490
|
+
var _a;
|
|
369
491
|
if ((viewer === null || viewer === void 0 ? void 0 : viewer.tags) == null)
|
|
370
|
-
|
|
492
|
+
return;
|
|
371
493
|
existingViewers.push(viewer);
|
|
372
|
-
const
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
494
|
+
const viewerSize = (_a = viewer.tags['.block-size']) !== null && _a !== void 0 ? _a : 100; // getting `(block: 25)` value; if not defined, it is 100
|
|
495
|
+
viewer.root.style.height = '100%';
|
|
496
|
+
viewer.root.classList.add(`ui-block-${viewerSize}`);
|
|
497
|
+
if (blocks + viewerSize <= 100) {
|
|
498
|
+
viewersToHide.push(wrapper);
|
|
499
|
+
blockWidth += viewerSize;
|
|
377
500
|
}
|
|
378
|
-
blocks +=
|
|
379
|
-
wrapper.appendChild(header);
|
|
380
|
-
header = ui.div([], 'grok-func-results-header');
|
|
501
|
+
blocks += viewerSize;
|
|
381
502
|
wrapper.appendChild(viewer.root);
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
if (totalHeight < height)
|
|
387
|
-
height = totalHeight;
|
|
388
|
-
}
|
|
389
|
-
viewer.root.style.height = `${height}px`;
|
|
390
|
-
this._appendResultElement(wrapper, options === null || options === void 0 ? void 0 : options.category);
|
|
391
|
-
}
|
|
503
|
+
});
|
|
504
|
+
const block = ui.divV([header, wrapper, gridWrapper], { style: { height: `${height}px`, width: `${blockWidth}%` } });
|
|
505
|
+
block.classList.add('ui-box');
|
|
506
|
+
this.appendResultElement(block, options === null || options === void 0 ? void 0 : options.category);
|
|
392
507
|
}
|
|
393
508
|
appendResultScalar(param, options) {
|
|
394
509
|
var _a, _b;
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
this.resultsTabControl
|
|
510
|
+
const span = ui.span([`${(_a = options.caption) !== null && _a !== void 0 ? _a : param.name}: `, `${param.value}`]);
|
|
511
|
+
if (!this.paramSpans.get(param.name)) {
|
|
512
|
+
if (this.resultsTabControl)
|
|
513
|
+
this.resultTabs.get(options.category).appendChild(span);
|
|
514
|
+
else
|
|
515
|
+
this.resultsDiv.appendChild(span);
|
|
398
516
|
}
|
|
399
517
|
else {
|
|
400
|
-
this.
|
|
401
|
-
this.resultsDiv.append(ui.span([`${(_b = options.caption) !== null && _b !== void 0 ? _b : param.name}: `, `${param.value}`]));
|
|
518
|
+
(_b = this.paramSpans.get(param.name)) === null || _b === void 0 ? void 0 : _b.replaceWith(span);
|
|
402
519
|
}
|
|
520
|
+
this.paramSpans.set(param.name, span);
|
|
403
521
|
}
|
|
404
|
-
|
|
522
|
+
appendResultElement(d, category) {
|
|
405
523
|
if (category != null && this.resultsTabControl != undefined && this.resultTabs.get(category) != null)
|
|
406
524
|
this.resultTabs.get(category).appendChild(d);
|
|
407
525
|
else
|
|
@@ -427,6 +545,7 @@ const scalarsToSheet = (sheet, scalars) => {
|
|
|
427
545
|
sheet.getColumn(3).width = Math.max(...scalars.map((scalar) => scalar.units.toString().length), 'Units'.length) * 1.2;
|
|
428
546
|
};
|
|
429
547
|
const dfToSheet = (sheet, df) => {
|
|
548
|
+
console.log(df);
|
|
430
549
|
sheet.addRow(df.columns.names()).font = { bold: true };
|
|
431
550
|
for (let i = 0; i < df.rowCount; i++)
|
|
432
551
|
sheet.addRow([...df.row(i).cells].map((cell) => cell.value));
|
|
@@ -435,4 +554,16 @@ const dfToSheet = (sheet, df) => {
|
|
|
435
554
|
Math.max(...df.columns.byIndex(i).categories.map((category) => category.toString().length), df.columns.byIndex(i).name.length) * 1.2;
|
|
436
555
|
}
|
|
437
556
|
};
|
|
438
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImZ1bmN0aW9uLXZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsZ0NBQWdDO0FBQ2hDLDRCQUE0QjtBQUM1QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxDQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUU5QixNQUFNLE9BQU8sWUFBYSxTQUFRLEVBQUUsQ0FBQyxRQUFRO0lBQzNDLFlBQVksUUFBcUI7UUFDL0IsS0FBSyxFQUFFLENBQUM7UUFXVixzQkFBaUIsR0FBdUIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0QsbUJBQWMsR0FBdUIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFeEQseUJBQW9CLEdBQThCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsK0JBQStCO1FBQ3JHLDJCQUFzQixHQUE4QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLHNEQUFzRDtRQUM5SCwyQkFBc0IsR0FBOEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQywrQ0FBK0M7UUFDdkgsdUJBQWtCLEdBQThCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsaURBQWlEO1FBRTdHLFVBQUssR0FBVyxVQUFVLENBQUM7UUFRbkMsaUJBQVksR0FBOEIsSUFBSSxHQUFHLEVBQXdCLENBQUM7UUFzUjFFLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFD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SSxFQUFFLENBQUMsT0FBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUNuRyxFQUFFLENBQUMsT0FBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDckQsR0FBRyxHQUFHLENBQUM7S0FDWDtBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5pbXBvcnQgd3UgZnJvbSAnd3UnO1xuaW1wb3J0ICQgZnJvbSAnY2FzaC1kb20nO1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyByeGpzIGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgRXhjZWxKUyBmcm9tICdleGNlbGpzJztcblxuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uVmlldyBleHRlbmRzIERHLlZpZXdCYXNlIHtcbiAgY29uc3RydWN0b3IoZnVuY0NhbGw6IERHLkZ1bmNDYWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnByZXBhcmVkQ2FsbCA9IGZ1bmNDYWxsO1xuICAgIHRoaXMuY29udGV4dCA9IERHLkNvbnRleHQuY2xvbmVEZWZhdWx0KCk7XG4gICAgdGhpcy5jb250cm9sc1Jvb3Quc3R5bGUubWF4V2lkdGggPSAnMzcwcHgnO1xuICAgIHRoaXMuYm94ID0gdHJ1ZTtcbiAgfVxuXG4gIGdldCBmdW5jKCkge1xuICAgIHJldHVybiB0aGlzLnByZXBhcmVkQ2FsbCEuZnVuYztcbiAgfVxuXG4gIG9uVmlld0luaXRpYWxpemVkOiByeGpzLlN1YmplY3Q8dm9pZD4gPSBuZXcgcnhqcy5TdWJqZWN0KCk7XG4gIG9uSW5wdXRDaGFuZ2VkOiByeGpzLlN1YmplY3Q8dm9pZD4gPSBuZXcgcnhqcy5TdWJqZWN0KCk7XG5cbiAgb25Db21wdXRhdGlvblN0YXJ0ZWQ6IHJ4anMuU3ViamVjdDxERy5GdW5jQ2FsbD4gPSBuZXcgcnhqcy5TdWJqZWN0KCk7IC8vIGVtaXR0ZWQgb24gY29tcHV0YXRpb24gc3RhcnRcbiAgb25Db21wdXRhdGlvbkNvbXBsZXRlZDogcnhqcy5TdWJqZWN0PERHLkZ1bmNDYWxsPiA9IG5ldyByeGpzLlN1YmplY3QoKTsgLy8gZW1pdHRlZCBhbnl3YXkgaWYgY29tcHV0YXRpb24gZW5kZWQgcHJvcGVybHkgb3Igbm90XG4gIG9uQ29tcHV0YXRpb25TdWNjZWVkZWQ6IHJ4anMuU3ViamVjdDxERy5GdW5jQ2FsbD4gPSBuZXcgcnhqcy5TdWJqZWN0KCk7IC8vIGVtaXR0ZWQgYW55d2F5IGlmIGNvbXB1dGF0aW9uIGVuZGVkIHByb3Blcmx5XG4gIG9uQ29tcHV0YXRpb25FcnJvcjogcnhqcy5TdWJqZWN0PERHLkZ1bmNDYWxsPiA9IG5ldyByeGpzLlN1YmplY3QoKTsgLy8gZW1pdHRlZCBhbnl3YXkgaWYgY29tcHV0YXRpb24gZW5kZWQgd2l0aCBlcnJvclxuXG4gIHByaXZhdGUgX3R5cGU6IHN0cmluZyA9ICdmdW5jdGlvbic7XG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgcmVhZG9ubHkgY29udGV4dDogREcuQ29udGV4dDtcbiAgcHVibGljIHByZXBhcmVkQ2FsbDogREcuRnVuY0NhbGwgfCBudWxsO1xuICBwdWJsaWMgbGFzdENhbGw/OiBERy5GdW5jQ2FsbCB8IG51bGw7XG4gIF9pbnB1dEZpZWxkczogTWFwPHN0cmluZywgREcuSW5wdXRCYXNlPiA9IG5ldyBNYXA8c3RyaW5nLCBERy5JbnB1dEJhc2U+KCk7XG5cbiAgYXN5bmMgaW5pdChmdW5jQ2FsbDogREcuRnVuY0NhbGwpIHtcbiAgICB0aGlzLnByZXBhcmVkQ2FsbCA/Pz0gZnVuY0NhbGw7XG4gICAgLypcbiAgICAgIHZhciBtZXRhID0gRW50aXR5TWV0YS5mb3JFbnRpdHkoZik7XG4gICAgICBmdW5jID0gYXdhaXQgbWV0YS5yZWZyZXNoKGYpO1xuICAgICovXG5cbiAgICB0aGlzLnByZXBhcmVkQ2FsbC5hdXhbJ3ZpZXcnXSA9IHRoaXM7XG4gICAgdGhpcy5wcmVwYXJlZENhbGwuY29udGV4dCA9IHRoaXMuY29udGV4dDtcblxuICAgIHRoaXMuc2luZ2xlRGZQYXJhbSA9IHd1KHRoaXMuZnVuYy5vdXRwdXRzKS5maWx0ZXIoKHApID0+IHAucHJvcGVydHlUeXBlID09IERHLlRZUEUuREFUQV9GUkFNRSlcbiAgICAgIC50b0FycmF5KCkubGVuZ3RoID09IDE7XG4gICAgLy92YXIgZnVsbFJ1blNlY3Rpb24gPSBkaXYoKTtcbiAgICAvL3ZhciBmdWxsRGl2ID0gZGl2KCd1aS1wYW5lbCcsIFtnZXRGdWxsU2VjdGlvbihmdW5jLCBjYWxsLCBmdWxsUnVuU2VjdGlvbildKTtcbiAgICAvL2h0bWxTZXREaXNwbGF5KGZ1bGxEaXYsIGZhbHNlKTtcblxuICAgIGZvciAoY29uc3QgaW5QYXJhbSBvZiB3dSh0aGlzLnByZXBhcmVkQ2FsbC5pbnB1dFBhcmFtcy52YWx1ZXMoKSBhcyBERy5GdW5jQ2FsbFBhcmFtW10pXG4gICAgICAuZmlsdGVyKChwOiBERy5GdW5jQ2FsbFBhcmFtKSA9PlxuICAgICAgICBwLnByb3BlcnR5LnByb3BlcnR5VHlwZSA9PSBERy5UWVBFLkRBVEFfRlJBTUUgJiYgcC5wcm9wZXJ0eS5vcHRpb25zWyd2aWV3ZXInXSAhPSBudWxsKSkge1xuICAgICAgdGhpcy5zaG93SW5wdXRzID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5zdWJzLnB1c2goaW5QYXJhbS5vbkNoYW5nZWQuc3Vic2NyaWJlKGFzeW5jIGZ1bmN0aW9uKHBhcmFtOiBERy5GdW5jQ2FsbFBhcmFtKSB7XG4gICAgICAgIHNlbGYuY2xlYXJSZXN1bHRzKGZhbHNlKTtcbiAgICAgICAgcGFyYW0ucHJvY2Vzc091dHB1dCgpO1xuXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0RGF0YUZyYW1lKHBhcmFtLCB7XG4gICAgICAgICAgaGVpZ2h0OiAoc2VsZi5zaW5nbGVEZlBhcmFtICYmICFncm9rLnNoZWxsLndpbmRvd3MucHJlc2VudGF0aW9uTW9kZSkgPyA2MDAgOiA0MDAsXG4gICAgICAgICAgY2F0ZWdvcnk6ICdJTlBVVCdcbiAgICAgICAgfSk7XG4gICAgICB9KSk7XG4gICAgfVxuXG5cbiAgICAvL3RoaXMuY29udHJvbHNSb290LmFwcGVuZENoaWxkKGZ1bGxEaXYpO1xuXG4gICAgLyphZHZhbmNlZE1vZGVTd2l0Y2gub25DaGFuZ2VkLmxpc3RlbigoXykge1xuICAgICAgaWYgKGFkdmFuY2VkTW9kZVN3aXRjaC52YWx1ZSlcbiAgICAgICAgZnVsbFJ1blNlY3Rpb24uYXBwZW5kKHJ1blNlY3Rpb24pO1xuICAgICAgZWxzZVxuICAgICAgICBmdW5jRGl2LmFwcGVuZChydW5TZWN0aW9uKTtcbiAgICAgIGh0bWxTZXREaXNwbGF5KGZ1bGxEaXYsIGFkdmFuY2VkTW9kZVN3aXRjaC52YWx1ZSk7XG4gICAgICBodG1sU2V0RGlzcGxheShmdW5jRGl2LCAhYWR2YW5jZWRNb2RlU3dpdGNoLnZhbHVlKTtcbiAgICB9KTsqL1xuICAgIC8vc2V0UmliYm9uKCk7XG4gICAgdGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuYnVpbGQoKSk7XG4gICAgLypcbiAgICBSb3V0aW5nLnNldFBhdGgodGhpcy5wYXRoLCBmLm5hbWUsIHRydWUpO1xuICAgICovXG5cbiAgICB0aGlzLm5hbWUgPSB0aGlzLmZ1bmMuZnJpZW5kbHlOYW1lO1xuICB9XG5cbiAgYnVpbGQoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGlucHV0QmxvY2sgPSB0aGlzLmJ1aWxkSW5wdXRCbG9jaygpO1xuICAgIGNvbnN0IG91dHB1dEJsb2NrID0gdGhpcy5idWlsZE91dHB1dEJsb2NrKCk7XG4gICAgY29uc3QgcmliYm9uUGFuZWxzID0gdGhpcy5idWlsZFJpYmJvblBhbmVscygpO1xuICAgIGNvbnN0IGhpc3RvcnlCbG9jayA9IHRoaXMuYnVpbGRIaXN0b3J5QmxvY2soKTtcblxuICAgIHJldHVybiB1aS5zcGxpdEgoW2lucHV0QmxvY2ssIG91dHB1dEJsb2NrXSk7XG4gIH1cblxuICBidWlsZElucHV0QmxvY2soKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGZ1bmNEaXYgPSB1aS5kaXYoW3RoaXMucmVuZGVyUnVuU2VjdGlvbih0aGlzLnByZXBhcmVkQ2FsbCEpXSwgJ3VpLWRpdicpO1xuICAgIHRoaXMuY29udHJvbHNSb290LmlubmVySFRNTCA9ICcnO1xuICAgIHRoaXMuY29udHJvbHNSb290LmFwcGVuZENoaWxkKGZ1bmNEaXYpO1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xzUm9vdDtcbiAgfVxuXG4gIGJ1aWxkT3V0cHV0QmxvY2soKTogSFRNTEVsZW1lbnQge1xuICAgIHRoaXMucmVzdWx0c1Jvb3QuaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5yZXN1bHRzUm9vdC5hcHBlbmRDaGlsZCh0aGlzLnJlc3VsdHNEaXYpO1xuICAgIHJldHVybiB0aGlzLnJlc3VsdHNSb290O1xuICB9XG5cbiAgYnVpbGRIaXN0b3J5QmxvY2soKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IG5ld0hpc3RvcnlCbG9jayA9IHVpLmljb25GQSgnaGlzdG9yeScsICgpID0+IHtcbiAgICAgIHRoaXMucHVsbFJ1bnMoKS50aGVuKGFzeW5jIChoaXN0b3JpY2FsUnVucykgPT4ge1xuICAgICAgICBjb25zdCBtZW51ID0gREcuTWVudS5wb3B1cCgpO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgcnVuIG9mIGhpc3RvcmljYWxSdW5zKSB7XG4gICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgbWVudS5pdGVtKGAke3J1bi5mdW5jLmZyaWVuZGx5TmFtZX0g4oCUICR7aX1gLCBhc3luYyAoKSA9PiB0aGlzLmhpc3RvcmljYWxSdW5TZXJ2aWNlLmxvYWRSdW4ocnVuLmlkKSk7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIG1lbnUuc2hvdygpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5oaXN0b3J5Um9vdC5pbm5lckhUTUwgPSAnJztcbiAgICB0aGlzLmhpc3RvcnlSb290LmFwcGVuZChuZXdIaXN0b3J5QmxvY2spO1xuICAgIHJldHVybiBuZXdIaXN0b3J5QmxvY2s7XG4gIH1cblxuICAvKiogT3ZlcnJpZGUgdG8gY3JlYXRlIGEgY3VzdG9tIGlucHV0IGNvbnRyb2wuICovXG4gIGJ1aWxkUmliYm9uUGFuZWxzKCk6IEhUTUxFbGVtZW50W11bXSB7XG4gICAgY29uc3QgbmV3UmliYm9uUGFuZWxzID0gWy4uLnRoaXMuZ2V0UmliYm9uUGFuZWxzKCksIFt1aS5kaXZIKFtcbiAgICAgIHVpLmNvbWJvUG9wdXAoXG4gICAgICAgIHVpLmljb25GQSgnYXJyb3ctdG8tYm90dG9tJyksXG4gICAgICAgIHRoaXMuc3VwcG9ydGVkRXhwb3J0Rm9ybWF0cyxcbiAgICAgICAgYXN5bmMgKGZvcm1hdDogc3RyaW5nKSA9PiBERy5VdGlscy5kb3dubG9hZCh0aGlzLmV4cG9ydEZpbGVuYW1lKGZvcm1hdCksIGF3YWl0IHRoaXMuZXhwb3J0KGZvcm1hdCkpKSxcbiAgICBdKV1dO1xuICAgIHRoaXMuc2V0UmliYm9uUGFuZWxzKG5ld1JpYmJvblBhbmVscyk7XG4gICAgcmV0dXJuIG5ld1JpYmJvblBhbmVscztcbiAgfVxuXG4gIC8qKiBGaWxlbmFtZSBmb3IgZXhwb3J0ZWQgZmlsZXMuIE92ZXJyaWRlIGZvciBjdXN0b20gbmFtZXMgKi9cbiAgZXhwb3J0RmlsZW5hbWUoZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLm5hbWV9IC0gJHtuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKCl9LiR7dGhpcy5zdXBwb3J0ZWRFeHBvcnRFeHRlbnNpb25zW2Zvcm1hdF19YDtcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0byBwcm92aWRlIHN1cHBvcnRlZCBleHBvcnQgZm9ybWF0cy5cbiAgICogVGhlc2UgZm9ybWF0cyBhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSBcIkV4cG9ydFwiIHBvcHVwIG9uIHRoZSByaWJib24gcGFuZWwuICovXG4gIGdldCBzdXBwb3J0ZWRFeHBvcnRGb3JtYXRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ0V4Y2VsJyxcbiAgICBdO1xuICB9XG5cbiAgLyoqIE92ZXJyaWRlIHRvIHByb3ZpZGUgY3VzdG9tIGZpbGUgZXh0ZW5zaW9ucyBmb3IgZXhwb3J0ZWQgZm9ybWF0cy5cbiAgICogVGhlc2UgZm9ybWF0cyBhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSBcIkV4cG9ydFwiIHBvcHVwIG9uIHRoZSByaWJib24gcGFuZWwuICovXG4gIGdldCBzdXBwb3J0ZWRFeHBvcnRFeHRlbnNpb25zKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB7XG4gICAgICAnRXhjZWwnOiAneGxzeCcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0byBwcm92aWRlIGN1c3RvbSBleHBvcnQuICovXG4gIGFzeW5jIGV4cG9ydChmb3JtYXQ6IHN0cmluZyk6IFByb21pc2U8QmxvYj4ge1xuICAgIGlmICghdGhpcy5mdW5jKSB0aHJvdyBuZXcgRXJyb3IoYE5vIGZ1bmN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB2aWV3YCk7XG5cbiAgICBjb25zdCBsYXN0Q2FsbCA9IHRoaXMubGFzdENhbGw7XG4gICAgaWYgKCFsYXN0Q2FsbCkgdGhyb3cgbmV3IEVycm9yKGBGdW5jdGlvbiB3YXMgbm90IGNhbGxlZGApO1xuXG4gICAgaWYgKGZvcm1hdCAhPT0gJ0V4Y2VsJykgdGhyb3cgbmV3IEVycm9yKGBGb3JtYXQgXCIke2Zvcm1hdH1cIiBpcyBub3Qgc3VwcG9ydGVkLmApO1xuXG4gICAgY29uc3QgQkxPQl9UWVBFID0gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0O2NoYXJzZXQ9VVRGLTgnO1xuICAgIGNvbnN0IGV4cG9ydFdvcmtib29rID0gbmV3IEV4Y2VsSlMuV29ya2Jvb2soKTtcblxuICAgIGNvbnN0IGlzU2NhbGFyVHlwZSA9ICh0eXBlOiBERy5UWVBFKSA9PiAoREcuVFlQRVNfU0NBTEFSLmhhcyh0eXBlKSk7XG5cbiAgICBjb25zdCBpc0RhdGFGcmFtZSA9ICh0eXBlOiBERy5UWVBFKSA9PiAodHlwZSA9PT0gREcuVFlQRS5EQVRBX0ZSQU1FKTtcblxuICAgIGNvbnN0IGRmSW5wdXRzID0gdGhpcy5mdW5jLmlucHV0cy5maWx0ZXIoKGlucHV0KSA9PiBpc0RhdGFGcmFtZShpbnB1dC5wcm9wZXJ0eVR5cGUpKTtcbiAgICBjb25zdCBzY2FsYXJJbnB1dHMgPSB0aGlzLmZ1bmMuaW5wdXRzLmZpbHRlcigoaW5wdXQpID0+IGlzU2NhbGFyVHlwZShpbnB1dC5wcm9wZXJ0eVR5cGUpKTtcbiAgICBjb25zdCBkZk91dHB1dHMgPSB0aGlzLmZ1bmMub3V0cHV0cy5maWx0ZXIoKG91dHB1dCkgPT4gaXNEYXRhRnJhbWUob3V0cHV0LnByb3BlcnR5VHlwZSkpO1xuICAgIGNvbnN0IHNjYWxhck91dHB1dHMgPSB0aGlzLmZ1bmMub3V0cHV0cy5maWx0ZXIoKG91dHB1dCkgPT4gaXNTY2FsYXJUeXBlKG91dHB1dC5wcm9wZXJ0eVR5cGUpKTtcblxuICAgIGRmSW5wdXRzLmZvckVhY2goKGRmSW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHZpc2libGVUaXRsZSA9IGRmSW5wdXQub3B0aW9ucy5jYXB0aW9uIHx8IGRmSW5wdXQubmFtZTtcbiAgICAgIGNvbnN0IGN1cnJlbnREZlNoZWV0ID0gZXhwb3J0V29ya2Jvb2suYWRkV29ya3NoZWV0KGdldFNoZWV0TmFtZSh2aXNpYmxlVGl0bGUsIERJUkVDVElPTi5JTlBVVCkpO1xuXG4gICAgICBjb25zdCBjdXJyZW50RGYgPSAobGFzdENhbGwuaW5wdXRzW2RmSW5wdXQubmFtZV0gYXMgREcuRGF0YUZyYW1lKTtcbiAgICAgIGRmVG9TaGVldChjdXJyZW50RGZTaGVldCwgY3VycmVudERmKTtcbiAgICB9KTtcblxuICAgIGlmIChzY2FsYXJJbnB1dHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpbnB1dFNjYWxhcnNTaGVldCA9IGV4cG9ydFdvcmtib29rLmFkZFdvcmtzaGVldCgnSW5wdXQgc2NhbGFycycpO1xuICAgICAgc2NhbGFyc1RvU2hlZXQoaW5wdXRTY2FsYXJzU2hlZXQsIHNjYWxhcklucHV0cy5tYXAoKHNjYWxhcklucHV0KSA9PiAoe1xuICAgICAgICBjYXB0aW9uOiBzY2FsYXJJbnB1dC5vcHRpb25zWydjYXB0aW9uJ10gfHwgc2NhbGFySW5wdXQubmFtZSxcbiAgICAgICAgdmFsdWU6IGxhc3RDYWxsLmlucHV0c1tzY2FsYXJJbnB1dC5uYW1lXSxcbiAgICAgICAgdW5pdHM6IHNjYWxhcklucHV0Lm9wdGlvbnNbJ3VuaXRzJ10gfHwgJycsXG4gICAgICB9KSkpO1xuICAgIH1cblxuICAgIGRmT3V0cHV0cy5mb3JFYWNoKChkZk91dHB1dCkgPT4ge1xuICAgICAgY29uc3QgdmlzaWJsZVRpdGxlID0gZGZPdXRwdXQub3B0aW9ucy5jYXB0aW9uIHx8IGRmT3V0cHV0Lm5hbWU7XG4gICAgICBjb25zdCBjdXJyZW50RGZTaGVldCA9IGV4cG9ydFdvcmtib29rLmFkZFdvcmtzaGVldChnZXRTaGVldE5hbWUodmlzaWJsZVRpdGxlLCBESVJFQ1RJT04uT1VUUFVUKSk7XG5cbiAgICAgIGNvbnN0IGN1cnJlbnREZiA9IChsYXN0Q2FsbC5vdXRwdXRzW2RmT3V0cHV0Lm5hbWVdIGFzIERHLkRhdGFGcmFtZSk7XG4gICAgICBkZlRvU2hlZXQoY3VycmVudERmU2hlZXQsIGN1cnJlbnREZik7XG4gICAgfSk7XG5cbiAgICBpZiAoc2NhbGFyT3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG91dHB1dFNjYWxhcnNTaGVldCA9IGV4cG9ydFdvcmtib29rLmFkZFdvcmtzaGVldCgnT3V0cHV0IHNjYWxhcnMnKTtcbiAgICAgIHNjYWxhcnNUb1NoZWV0KG91dHB1dFNjYWxhcnNTaGVldCwgc2NhbGFyT3V0cHV0cy5tYXAoKHNjYWxhck91dHB1dCkgPT4gKHtcbiAgICAgICAgY2FwdGlvbjogc2NhbGFyT3V0cHV0Lm9wdGlvbnNbJ2NhcHRpb24nXSB8fCBzY2FsYXJPdXRwdXQubmFtZSxcbiAgICAgICAgdmFsdWU6IGxhc3RDYWxsLm91dHB1dHNbc2NhbGFyT3V0cHV0Lm5hbWVdLFxuICAgICAgICB1bml0czogc2NhbGFyT3V0cHV0Lm9wdGlvbnNbJ3VuaXRzJ10gfHwgJycsXG4gICAgICB9KSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGV4cG9ydFdvcmtib29rLnhsc3gud3JpdGVCdWZmZXIoKTtcblxuICAgIHJldHVybiBuZXcgQmxvYihbYnVmZmVyXSwge3R5cGU6IEJMT0JfVFlQRX0pO1xuICB9XG5cbiAgLyoqIFNhdmVzIHRoZSBjb21wdXRhdGlvbiByZXN1bHRzIHRvIHRoZSBoaXN0b3JpY2FsIHJlc3VsdHMsIHJldHVybnMgaXRzIGlkLiBTZWUgYWxzbyB7QGxpbmsgbG9hZFJ1bn0uICovXG4gIGFzeW5jIHNhdmVSdW4oY2FsbDogREcuRnVuY0NhbGwpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgIC8qIGF3YWl0IGdyb2suZGFwaS5mdW5jdGlvbnMuY2FsbHMuc2F2ZShjYWxsKTsqL1xuICB9XG5cbiAgLyoqIExvYWRzIHRoZSBzcGVjaWZpZWQgaGlzdG9yaWNhbCByZXN1bHRzLiBTZWUgYWxzbyB7QGxpbmsgc2F2ZVJ1bn0uICovXG4gIGFzeW5jIGxvYWRSdW4ocnVuSWQ6IHN0cmluZyk6IFByb21pc2U8REcuRnVuY0NhbGw+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAvKiBhd2FpdCBncm9rLmRhcGkuZnVuY3Rpb25zLmNhbGxzLmZpbmQoY2FsbC5pZCk7Ki9cbiAgfVxuXG4gIC8qKiBMb2FkcyBhbGwgdGhlIGZ1bmN0aW9uIGNhbGwgb2YgdGhpcyBmdW5jdGlvbi4gKi9cbiAgYXN5bmMgcHVsbFJ1bnMoKTogUHJvbWlzZTxERy5GdW5jQ2FsbFtdPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgaXMgbm90IGltcGxlbWVudGVkJyk7XG4gICAgLyogYXdhaXQgZ3Jvay5kYXBpLmZ1bmN0aW9ucy5jYWxscy5saXN0KCk7Ki9cbiAgfVxuXG5cbiAgY2xlYXJSZXN1bHRzKHN3aXRjaFRvT3V0cHV0OiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGNvbnN0IGNhdGVnb3JpZXM6IHN0cmluZ1tdID0gW107XG4gICAgLy8gIHJlc3VsdFRhYnMuY2xlYXIoKTtcbiAgICBpZiAodGhpcy5zaG93SW5wdXRzKSB7XG4gICAgICBjYXRlZ29yaWVzLnB1c2goJ0lOUFVUJyk7XG4gICAgICB0aGlzLnJlc3VsdFRhYnMuc2V0KCdJTlBVVCcsIHRoaXMuaW5wdXRzRGl2KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwIG9mIHRoaXMuZnVuYy5vdXRwdXRzKSB7XG4gICAgICBpZiAoY2F0ZWdvcmllcy5pbmNsdWRlcyhwLmNhdGVnb3J5KSlcbiAgICAgICAgY29udGludWU7XG4gICAgICBjYXRlZ29yaWVzLnB1c2gocC5jYXRlZ29yeSk7XG4gICAgfVxuICAgIGlmICgoY2F0ZWdvcmllcy5sZW5ndGggPiAxIHx8IChjYXRlZ29yaWVzLmxlbmd0aCA9PSAxICYmIGNhdGVnb3JpZXNbMF0gIT0gJ01pc2MnKSkpIHtcbiAgICAgIHRoaXMucmVzdWx0c1RhYkNvbnRyb2wgPSBERy5UYWJDb250cm9sLmNyZWF0ZSgpO1xuICAgICAgZm9yIChjb25zdCBjIG9mIGNhdGVnb3JpZXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlc3VsdFRhYnMuaGFzKGMpKVxuICAgICAgICAgIHRoaXMucmVzdWx0VGFicy5zZXQoYywgdWkuZGl2KFtdLCAndWktcGFuZWwsIGdyb2stZnVuYy1yZXN1bHRzJykpO1xuICAgICAgICBsZXQgbmFtZSA9IGM7XG4gICAgICAgIGlmICh0aGlzLnNob3dJbnB1dHMgJiYgY2F0ZWdvcmllcy5sZW5ndGggPT0gMiAmJiBjID09ICdNaXNjJylcbiAgICAgICAgICBuYW1lID0gJ09VVFBVVCc7XG4gICAgICAgIHRoaXMucmVzdWx0c1RhYkNvbnRyb2wuYWRkUGFuZShuYW1lLCAoKSA9PiB0aGlzLnJlc3VsdFRhYnMuZ2V0KGMpID8/IHVpLmRpdigpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjYXRlZ29yaWVzLmxlbmd0aCA+IDEgJiYgdGhpcy5zaG93SW5wdXRzICYmIHN3aXRjaFRvT3V0cHV0KVxuICAgICAgICB0aGlzLnJlc3VsdHNUYWJDb250cm9sLmN1cnJlbnRQYW5lID0gdGhpcy5yZXN1bHRzVGFiQ29udHJvbC5wYW5lc1sxXTtcbiAgICAgIHRoaXMucmVzdWx0c0RpdiA9IHRoaXMucmVzdWx0c1RhYkNvbnRyb2wucm9vdDtcbiAgICB9XG4gICAgdGhpcy5idWlsZE91dHB1dEJsb2NrKCk7XG4gIH1cblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sYXN0Q2FsbCA9IHRoaXMucHJlcGFyZWRDYWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY29tcHV0ZSh0aGlzLmxhc3RDYWxsISk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gdGhpcy5vbkNvbXB1dGF0aW9uRXJyb3IubmV4dCh0aGlzLmxhc3RDYWxsKTtcbiAgICB9XG4gICAgdGhpcy5vbkNvbXB1dGF0aW9uU3VjY2VlZGVkLm5leHQodGhpcy5sYXN0Q2FsbCEpO1xuXG4gICAgdGhpcy5vdXRwdXRQYXJhbWV0ZXJzVG9WaWV3KHRoaXMubGFzdENhbGwhKTtcbiAgfVxuXG4gIGFzeW5jIGNvbXB1dGUoY2FsbDogREcuRnVuY0NhbGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBjYWxsLmNhbGwodHJ1ZSwgdW5kZWZpbmVkLCB7cHJvY2Vzc2VkOiB0cnVlfSk7XG4gIH1cblxuICBvdXRwdXRQYXJhbWV0ZXJzVG9WaWV3KGNhbGw6IERHLkZ1bmNDYWxsKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclJlc3VsdHModHJ1ZSk7XG4gICAgZm9yIChjb25zdCBwIG9mIGNhbGwub3V0cHV0UGFyYW1zLnZhbHVlcygpIGFzIERHLkZ1bmNDYWxsUGFyYW1bXSkge1xuICAgICAgcC5wcm9jZXNzT3V0cHV0KCk7XG4gICAgICBpZiAocC5wcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT0gREcuVFlQRS5EQVRBX0ZSQU1FICYmIHAudmFsdWUgIT0gbnVsbClcbiAgICAgICAgdGhpcy5hcHBlbmRSZXN1bHREYXRhRnJhbWUocCwge2NhcHRpb246IHAucHJvcGVydHkubmFtZSwgY2F0ZWdvcnk6IHAucHJvcGVydHkuY2F0ZWdvcnl9KTtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhpcy5hcHBlbmRSZXN1bHRTY2FsYXIocCwge2NhcHRpb246IHAucHJvcGVydHkubmFtZSwgY2F0ZWdvcnk6IHAucHJvcGVydHkuY2F0ZWdvcnl9KTtcbiAgICB9XG4gIH1cblxuICByZW5kZXJSdW5TZWN0aW9uKGNhbGw6IERHLkZ1bmNDYWxsKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB1aS53YWl0KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJ1bkJ1dHRvbiA9IHVpLmJpZ0J1dHRvbignUnVuJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjYWxsLmF1eFsndmlldyddID0gdGhpcy5kYXJ0O1xuICAgICAgICBhd2FpdCB0aGlzLnJ1bigpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBlZGl0b3IgPSB1aS5kaXYoKTtcbiAgICAgIGNvbnN0IGlucHV0czogREcuSW5wdXRCYXNlW10gPSBhd2FpdCBjYWxsLmJ1aWxkRWRpdG9yKGVkaXRvciwge2NvbmRlbnNlZDogdHJ1ZX0pO1xuICAgICAgZWRpdG9yLmNsYXNzTGlzdC5hZGQoJ3VpLWZvcm0nKTtcbiAgICAgIGNvbnN0IGJ1dHRvbnMgPSB1aS5kaXZIKFt0aGlzLmhpc3RvcnlSb290LCBydW5CdXR0b25dLCB7c3R5bGU6IHsnanVzdGlmeS1jb250ZW50JzogJ3NwYWNlLWJldHdlZW4nfX0pO1xuICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKGJ1dHRvbnMpO1xuICAgICAgcmV0dXJuIGVkaXRvcjtcbiAgICB9KTtcbiAgfVxuXG4gIHNob3dJbnB1dHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2luZ2xlRGZQYXJhbTogYm9vbGVhbiA9IGZhbHNlO1xuICBwYXJhbVZpZXdlcnM6IE1hcDxzdHJpbmcsIERHLlZpZXdlcltdPiA9IG5ldyBNYXAoKTtcbiAgcmVzdWx0c1RhYkNvbnRyb2w6IERHLlRhYkNvbnRyb2wgfCB1bmRlZmluZWQ7XG4gIHJlc3VsdFRhYnM6IE1hcDxTdHJpbmcsIEhUTUxFbGVtZW50PiA9IG5ldyBNYXAoKTtcbiAgcmVzdWx0c0RpdjogSFRNTEVsZW1lbnQgPSB1aS5wYW5lbChbXSwgJ2dyb2stZnVuYy1yZXN1bHRzJyk7XG4gIGNvbnRyb2xzUm9vdDogSFRNTERpdkVsZW1lbnQgPSB1aS5ib3goKTtcbiAgcmVzdWx0c1Jvb3Q6IEhUTUxEaXZFbGVtZW50ID0gdWkuYm94KCk7XG4gIGhpc3RvcnlSb290OiBIVE1MRGl2RWxlbWVudCA9IHVpLmRpdlYoW10sIHtzdHlsZTogeydqdXN0aWZ5LWNvbnRlbnQnOiAnY2VudGVyJ319KTtcbiAgaW5wdXRzRGl2OiBIVE1MRGl2RWxlbWVudCA9IHVpLnBhbmVsKFtdLCAnZ3Jvay1mdW5jLXJlc3VsdHMnKTtcblxuICBhcHBlbmRSZXN1bHREYXRhRnJhbWUocGFyYW06IERHLkZ1bmNDYWxsUGFyYW0sIG9wdGlvbnM/OiB7IGNhcHRpb24/OiBzdHJpbmcsIGNhdGVnb3J5Pzogc3RyaW5nLCBoZWlnaHQ/OiBudW1iZXIgfSkge1xuICAgIGNvbnN0IGRmID0gcGFyYW0udmFsdWU7XG4gICAgbGV0IGNhcHRpb24gPSBvcHRpb25zPy5jYXB0aW9uO1xuICAgIGxldCBoZWlnaHQgPSBvcHRpb25zPy5oZWlnaHQgPz8gNDAwO1xuICAgIGNvbnN0IHZpZXdlcnM6IERHLlZpZXdlcltdID0gcGFyYW0uYXV4Wyd2aWV3ZXJzJ10gPz8gW107XG4gICAgY2FwdGlvbiA/Pz0gcGFyYW0uYXV4Wyd2aWV3ZXJUaXRsZSddID8/XG4gICAgICAoKHRoaXMuc2luZ2xlRGZQYXJhbSAmJiB2aWV3ZXJzLmxlbmd0aCA9PSAxKSA/ICcnIDogcGFyYW0ucHJvcGVydHkuY2FwdGlvbikgPz8gJyc7XG4gICAgbGV0IGV4aXN0aW5nVmlld2VyczogREcuVmlld2VyW10gfCB1bmRlZmluZWQgPSB0aGlzLnBhcmFtVmlld2Vycy5nZXQocGFyYW0ubmFtZSk7XG4gICAgaWYgKGV4aXN0aW5nVmlld2VycyAhPSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IHYgb2YgZXhpc3RpbmdWaWV3ZXJzKVxuICAgICAgICB2LmRhdGFGcmFtZSA9IGRmO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV4aXN0aW5nVmlld2VycyA/Pz0gW107XG4gICAgdGhpcy5wYXJhbVZpZXdlcnMuc2V0KHBhcmFtLm5hbWUsIGV4aXN0aW5nVmlld2Vycyk7XG4gICAgaWYgKHZpZXdlcnMubGVuZ3RoID09IDApXG4gICAgICB2aWV3ZXJzLnB1c2goZGYucGxvdC5ncmlkKCkpO1xuXG4gICAgY29uc3QgaGlkZUxpc3Q6IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICBsZXQgYmxvY2tzOiBudW1iZXIgPSAwO1xuICAgIGxldCBibG9ja1NpemU6IG51bWJlciA9IDA7XG4gICAgY29uc3QgZ3JpZFdyYXBwZXIgPSB1aS5ibG9jayhbXSk7XG5cbiAgICBjb25zdCBncmlkU3dpdGNoID0gIXd1KHZpZXdlcnMpLnNvbWUoKHY6IERHLlZpZXdlcikgPT4gdi50eXBlID09ICdHcmlkJyk7XG4gICAgJChncmlkV3JhcHBlcikuaGlkZSgpO1xuXG4gICAgY29uc3QgZ2V0SGVhZGVyID0gKHN3OiBib29sZWFuKSA9PiB7XG4gICAgICBjb25zdCBzID0gY2FwdGlvbiA/PyBkZi5uYW1lID8/ICcnO1xuICAgICAgY29uc3QgaGVhZGVyID0gdWkuZGl2KFtdLCAnZ3Jvay1mdW5jLXJlc3VsdHMtaGVhZGVyJyk7XG4gICAgICBpZiAocyAhPSAnJykge1xuICAgICAgICBjb25zdCBoID0gdWkuaDEocyk7XG4gICAgICAgIHVpLlRvb2x0aXAuYmluZChoLCAoKSA9PiBzKTtcbiAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKGgpO1xuICAgICAgfVxuICAgICAgaWYgKGdyaWRTd2l0Y2gpIHtcbiAgICAgICAgY29uc3QgaWNvbiA9IHVpLmljb25TdmcoJ3RhYmxlJywgKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHVpLnNldERpc3BsYXlBbGwoaGlkZUxpc3QsICFzdyk7XG4gICAgICAgICAgdWkuc2V0RGlzcGxheShncmlkV3JhcHBlciwgc3cpO1xuICAgICAgICAgIGdyaWRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoYHVpLWJsb2NrLSR7YmxvY2tTaXplfWApO1xuICAgICAgICB9LCAnU2hvdyBncmlkJyk7XG4gICAgICAgIGlmICghc3cpXG4gICAgICAgICAgaWNvbi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKGljb24pO1xuICAgICAgfVxuICAgICAgaWYgKCFncm9rLnNoZWxsLnRhYmxlcy5pbmNsdWRlcyhkZikpIHtcbiAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKHVpLmljb25zLmFkZCgoZTogYW55KSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBjb25zdCB2ID0gZ3Jvay5zaGVsbC5hZGRUYWJsZVZpZXcoZGYpO1xuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZpZXdlciBvZiB2aWV3ZXJzKSB7XG4gICAgICAgICAgICAgIGlmICh2aWV3ZXIudHlwZSAhPSAnR3JpZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdWaWV3ZXIgPSBhd2FpdCBkZi5wbG90LmZyb21UeXBlKHZpZXdlci50eXBlKSBhcyBERy5WaWV3ZXI7XG4gICAgICAgICAgICAgICAgbmV3Vmlld2VyLnNldE9wdGlvbnModmlld2VyLmdldE9wdGlvbnMoKSk7XG4gICAgICAgICAgICAgICAgdi5hZGRWaWV3ZXIobmV3Vmlld2VyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCk7XG4gICAgICAgIH0sICdBZGQgdG8gd29ya3NwYWNlJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhlYWRlcjtcbiAgICB9O1xuXG4gICAgaWYgKGdyaWRTd2l0Y2gpIHtcbiAgICAgIGdyaWRXcmFwcGVyLmFwcGVuZENoaWxkKGdldEhlYWRlcihmYWxzZSkpO1xuICAgICAgY29uc3QgZ3JpZCA9IGRmLnBsb3QuZ3JpZCgpO1xuICAgICAgZ3JpZC5yb290LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gICAgICBncmlkV3JhcHBlci5hcHBlbmRDaGlsZChncmlkLnJvb3QpO1xuICAgICAgZXhpc3RpbmdWaWV3ZXJzLnB1c2goZ3JpZCk7XG4gICAgfVxuXG4gICAgbGV0IGhlYWRlciA9IGdldEhlYWRlcih0cnVlKTtcbiAgICB0aGlzLl9hcHBlbmRSZXN1bHRFbGVtZW50KGdyaWRXcmFwcGVyLCBvcHRpb25zPy5jYXRlZ29yeSk7XG4gICAgZm9yIChjb25zdCB2aWV3ZXIgb2Ygdmlld2Vycykge1xuICAgICAgaWYgKHZpZXdlcj8udGFncyA9PSBudWxsKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGV4aXN0aW5nVmlld2Vycy5wdXNoKHZpZXdlcik7XG4gICAgICBjb25zdCBibG9jayA9IHZpZXdlci50YWdzWycuYmxvY2stc2l6ZSddID8/IDEwMDtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSB1aS5ibG9jayhbXSwgYHVpLWJsb2NrLSR7YmxvY2t9YCk7XG4gICAgICBpZiAoYmxvY2tzICsgYmxvY2sgPD0gMTAwKSB7XG4gICAgICAgIGhpZGVMaXN0LnB1c2god3JhcHBlcik7XG4gICAgICAgIGJsb2NrU2l6ZSArPSBibG9jaztcbiAgICAgIH1cbiAgICAgIGJsb2NrcyArPSBibG9jaztcbiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoaGVhZGVyKTtcbiAgICAgIGhlYWRlciA9IHVpLmRpdihbXSwgJ2dyb2stZnVuYy1yZXN1bHRzLWhlYWRlcicpO1xuICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZCh2aWV3ZXIucm9vdCk7XG4gICAgICBpZiAodmlld2VyLnR5cGUgPT0gJ2dyaWQnKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgdG90YWxIZWlnaHQgPSB2aWV3ZXIuZ2V0T3B0aW9ucygpWydyb3dIZWlnaHQnXSAqXG4gICAgICAgICAgKHZpZXdlci5kYXRhRnJhbWUhLnJvd0NvdW50ICsgMSk7XG4gICAgICAgIGlmICh0b3RhbEhlaWdodCA8IGhlaWdodClcbiAgICAgICAgICBoZWlnaHQgPSB0b3RhbEhlaWdodDtcbiAgICAgIH1cbiAgICAgIHZpZXdlci5yb290LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gICAgICB0aGlzLl9hcHBlbmRSZXN1bHRFbGVtZW50KHdyYXBwZXIsIG9wdGlvbnM/LmNhdGVnb3J5KTtcbiAgICB9XG4gIH1cblxuICBhcHBlbmRSZXN1bHRTY2FsYXIocGFyYW06IERHLkZ1bmNDYWxsUGFyYW0sIG9wdGlvbnM6IHsgY2FwdGlvbj86IHN0cmluZywgY2F0ZWdvcnk6IHN0cmluZywgaGVpZ2h0PzogbnVtYmVyIH0pIHtcbiAgICBpZiAodGhpcy5yZXN1bHRzVGFiQ29udHJvbCkge1xuICAgICAgdGhpcy5yZXN1bHRzVGFiQ29udHJvbC5nZXRQYW5lKG9wdGlvbnMuY2F0ZWdvcnkpLmNvbnRlbnQuaW5uZXJIVE1MID0gJyc7XG4gICAgICB0aGlzLnJlc3VsdHNUYWJDb250cm9sLmdldFBhbmUob3B0aW9ucy5jYXRlZ29yeSkuY29udGVudC5hcHBlbmQodWkuc3BhbihbYCR7b3B0aW9ucy5jYXB0aW9uID8/IHBhcmFtLm5hbWV9OiBgLCBgJHtwYXJhbS52YWx1ZX1gXSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc3VsdHNEaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICB0aGlzLnJlc3VsdHNEaXYuYXBwZW5kKHVpLnNwYW4oW2Ake29wdGlvbnMuY2FwdGlvbiA/PyBwYXJhbS5uYW1lfTogYCwgYCR7cGFyYW0udmFsdWV9YF0pKTtcbiAgICB9XG4gIH1cblxuICBfYXBwZW5kUmVzdWx0RWxlbWVudChkOiBIVE1MRWxlbWVudCwgY2F0ZWdvcnk/OiBzdHJpbmcpIHtcbiAgICBpZiAoY2F0ZWdvcnkgIT0gbnVsbCAmJiB0aGlzLnJlc3VsdHNUYWJDb250cm9sICE9IHVuZGVmaW5lZCAmJiB0aGlzLnJlc3VsdFRhYnMuZ2V0KGNhdGVnb3J5KSAhPSBudWxsKVxuICAgICAgdGhpcy5yZXN1bHRUYWJzLmdldChjYXRlZ29yeSkhLmFwcGVuZENoaWxkKGQpO1xuICAgIGVsc2VcbiAgICAgIHRoaXMucmVzdWx0c0Rpdi5hcHBlbmRDaGlsZChkKTtcbiAgfVxufVxuXG5jb25zdCBnZXRTaGVldE5hbWUgPSAobmFtZTogc3RyaW5nLCBkaXJlY3Rpb246IERJUkVDVElPTikgPT4ge1xuICBjb25zdCBpZGVhbE5hbWUgPSBgJHtkaXJlY3Rpb259IC0gJHtuYW1lfWA7XG4gIHJldHVybiAoaWRlYWxOYW1lLmxlbmd0aCA+IDMxKSA/IG5hbWUuc3Vic3RyaW5nKDAsIDMyKSA6IGlkZWFsTmFtZTtcbn07XG5cbmVudW0gRElSRUNUSU9OIHtcbiAgSU5QVVQgPSAnSW5wdXQnLFxuICBPVVRQVVQgPSAnT3V0cHV0J1xufVxuXG5jb25zdCBzY2FsYXJzVG9TaGVldCA9IChzaGVldDogRXhjZWxKUy5Xb3Jrc2hlZXQsIHNjYWxhcnM6IHsgY2FwdGlvbjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCB1bml0czogc3RyaW5nIH1bXSkgPT4ge1xuICBzaGVldC5hZGRSb3coWydQYXJhbWV0ZXInLCAnVmFsdWUnLCAnVW5pdHMnXSkuZm9udCA9IHtib2xkOiB0cnVlfTtcbiAgc2NhbGFycy5mb3JFYWNoKChzY2FsYXIpID0+IHtcbiAgICBzaGVldC5hZGRSb3coW3NjYWxhci5jYXB0aW9uLCBzY2FsYXIudmFsdWUsIHNjYWxhci51bml0c10pO1xuICB9KTtcblxuICBzaGVldC5nZXRDb2x1bW4oMSkud2lkdGggPSBNYXRoLm1heChcbiAgICAuLi5zY2FsYXJzLm1hcCgoc2NhbGFyKSA9PiBzY2FsYXIuY2FwdGlvbi50b1N0cmluZygpLmxlbmd0aCksICdQYXJhbWV0ZXInLmxlbmd0aFxuICApICogMS4yO1xuICBzaGVldC5nZXRDb2x1bW4oMikud2lkdGggPSBNYXRoLm1heCguLi5zY2FsYXJzLm1hcCgoc2NhbGFyKSA9PiBzY2FsYXIudmFsdWUudG9TdHJpbmcoKS5sZW5ndGgpLCAnVmFsdWUnLmxlbmd0aCkgKiAxLjI7XG4gIHNoZWV0LmdldENvbHVtbigzKS53aWR0aCA9IE1hdGgubWF4KC4uLnNjYWxhcnMubWFwKChzY2FsYXIpID0+IHNjYWxhci51bml0cy50b1N0cmluZygpLmxlbmd0aCksICdVbml0cycubGVuZ3RoKSAqIDEuMjtcbn07XG5cbmNvbnN0IGRmVG9TaGVldCA9IChzaGVldDogRXhjZWxKUy5Xb3Jrc2hlZXQsIGRmOiBERy5EYXRhRnJhbWUpID0+IHtcbiAgc2hlZXQuYWRkUm93KChkZi5jb2x1bW5zIGFzIERHLkNvbHVtbkxpc3QpLm5hbWVzKCkpLmZvbnQgPSB7Ym9sZDogdHJ1ZX07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGYucm93Q291bnQ7IGkrKylcbiAgICBzaGVldC5hZGRSb3coWy4uLmRmLnJvdyhpKS5jZWxsc10ubWFwKChjZWxsOiBERy5DZWxsKSA9PiBjZWxsLnZhbHVlKSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZi5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgc2hlZXQuZ2V0Q29sdW1uKGkgKyAxKS53aWR0aCA9XG4gICAgICBNYXRoLm1heChcbiAgICAgICAgLi4uKGRmLmNvbHVtbnMgYXMgREcuQ29sdW1uTGlzdCkuYnlJbmRleChpKS5jYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnRvU3RyaW5nKCkubGVuZ3RoKSxcbiAgICAgICAgKGRmLmNvbHVtbnMgYXMgREcuQ29sdW1uTGlzdCkuYnlJbmRleChpKS5uYW1lLmxlbmd0aFxuICAgICAgKSAqIDEuMjtcbiAgfVxufTtcbiJdfQ==
|
|
557
|
+
const plotToSheet = (exportWb, sheet, plot, columnForImage, rowForImage = 0) => __awaiter(void 0, void 0, void 0, function* () {
|
|
558
|
+
const canvas = yield html2canvas(plot, { logging: false });
|
|
559
|
+
const dataUrl = canvas.toDataURL('image/png');
|
|
560
|
+
const imageId = exportWb.addImage({
|
|
561
|
+
base64: dataUrl,
|
|
562
|
+
extension: 'png',
|
|
563
|
+
});
|
|
564
|
+
sheet.addImage(imageId, {
|
|
565
|
+
tl: { col: columnForImage, row: rowForImage },
|
|
566
|
+
ext: { width: canvas.width, height: canvas.height },
|
|
567
|
+
});
|
|
568
|
+
});
|
|
569
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImZ1bmN0aW9uLXZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsZ0NBQWdDO0FBQ2hDLDRCQUE0QjtBQUM1QixPQUFPLEtBQUssSUFBSSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxXQUFXLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLENBQUMsTUFBTSxVQUFVLENBQUM7QUFFekIsTUFBTSxPQUFPLFlBQWEsU0FBUSxFQUFFLENBQUMsUUFBUTtJQU0zQyxZQUFZLFFBQXNCO1FBQ2hDLEtBQUssRUFBRSxDQUFDO1FBSEEsVUFBSyxHQUFXLFVBQVUsQ0FBQztRQTBEckM7O1VBRUU7UUFDRixpQkFBWSxHQWdDRCxJQUFJLENBQUM7UUF3TE4sMEJBQXFCLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRTtZQUNuRCxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDLGNBQWMsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFhLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMzRyxDQUFDLENBQUM7UUFFUSxxQ0FBZ0MsR0FBRyxHQUFHLEVBQUU7WUFDaEQsT0FBTztnQkFDTCxPQUFPLEVBQUUsTUFBTTthQUNoQixDQUFDO1FBQ0osQ0FBQyxDQUFDO1FBRVEsa0NBQTZCLEdBQUcsR0FBRyxFQUFFO1lBQzdDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQixDQUFDLENBQUM7UUFFUSxrQkFBYSxHQUFHLENBQU8sTUFBYyxFQUFFLEVBQUU7O1lBQ2pELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDL0IsSUFBSSxDQUFDLFFBQVE7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBRTFELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBYSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLE1BQU0scUJBQXFCLENBQUMsQ0FBQztZQUVuSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1lBRTlFLE1BQU0sU0FBUyxHQUFHLGlGQUFpRixDQUFDO1lBQ3BHLE1BQU0sY0FBYyxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBRTlDLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFFcEUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFckUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDckYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDMUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDekYsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFFOUYsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQXVCLENBQUM7WUFDN0UsTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQXVCLENBQUM7WUFFL0UsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUMzQixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUM3RCxNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBRWhHLE1BQU0sU0FBUyxHQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBa0IsQ0FBQztnQkFDbEUsU0FBUyxDQUFDLGNBQWMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRTtnQkFDdkIsTUFBTSxpQkFBaUIsR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUN2RSxjQUFjLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDbkUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUk7b0JBQzNELEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7b0JBQ3hDLEtBQUssRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7aUJBQzFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDTjtZQUVELFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDN0IsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDL0QsTUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUVqRyxNQUFNLFNBQVMsR0FBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQWtCLENBQUM7Z0JBQ3BFLFNBQVMsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDdkMsQ0FBQyxDQUFDLENBQUM7WUFHSCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3hCLE1BQU0sa0JBQWtCLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUN6RSxjQUFjLENBQUMsa0JBQWtCLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDdEUsT0FBTyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksWUFBWSxDQUFDLElBQUk7b0JBQzdELEtBQUssRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7b0JBQzFDLEtBQUssRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7aUJBQzNDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDTjtZQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUMxQyxJQUFJLFVBQVUsRUFBRTtnQkFDZCxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ3RDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDdEQsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUM3QyxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUU7d0JBQ3hCLEtBQUssTUFBTSxVQUFVLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTs0QkFDcEgsTUFBTSxjQUFjLEdBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBRXJILE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUN6RSxNQUFNLFlBQVksR0FBRyxPQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDOzRCQUNqRSxNQUFNLFNBQVMsR0FBSSxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxJQUFJLENBQWtCLENBQUM7NEJBRW5FLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0NBQ3RELElBQUksQ0FBQSxNQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSwwQ0FBRSxLQUFLLENBQUMsT0FBTyxNQUFLLE1BQU0sRUFBRTtvQ0FDdkQsTUFBQSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsMENBQUUsS0FBSyxFQUFFLENBQUM7b0NBQ3JELE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztpQ0FDN0M7Z0NBRUQsTUFBTSxXQUFXLENBQ2YsY0FBYyxFQUNkLGNBQWMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDeEUsTUFBTSxDQUFDLElBQUksRUFDWCxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQzVCLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEdBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDaEYsQ0FBQzs2QkFDSDs0QkFBQSxDQUFDO3lCQUNIO3FCQUNGO3lCQUFNO3dCQUNMLEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLEVBQUU7NEJBQ3RLLE1BQU0sY0FBYyxHQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUV0SCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDNUUsTUFBTSxZQUFZLEdBQUcsUUFBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQzs0QkFDbkUsTUFBTSxTQUFTLEdBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFTLENBQUMsSUFBSSxDQUFrQixDQUFDOzRCQUVyRSxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksY0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dDQUN0RCxJQUFJLENBQUEsTUFBQSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsMENBQUUsS0FBSyxDQUFDLE9BQU8sTUFBSyxNQUFNLEVBQUU7b0NBQ3ZELE1BQUEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLDBDQUFFLEtBQUssRUFBRSxDQUFDO29DQUN0RCxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUNBQzdDO2dDQUVELE1BQU0sV0FBVyxDQUNmLGNBQWMsRUFDZCxjQUFjLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQ3pFLE1BQU0sQ0FBQyxJQUFJLEVBQ1gsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUM1QixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2hGLENBQUM7NkJBQ0g7eUJBQ0Y7d0JBQUEsQ0FBQztxQkFDSDtpQkFDRjtnQkFBQSxDQUFDO2FBQ0g7WUFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFdkQsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFBLENBQUM7UUFnRkYsNERBQTREO1FBQ2xELHNCQUFpQixHQUE2QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2xFLG1EQUFtRDtRQUN6Qyx5QkFBb0IsR0FBNkIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNyRSwyQ0FBMkM7UUFDakMsZUFBVSxHQUE2QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzNELHlDQUF5QztRQUMvQixlQUFVLEdBQTZCLElBQUksR0FBRyxFQUFFLENBQUM7UUFFakQsZUFBVSxHQUFnQixFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBRTVELGlCQUFZLEdBQW1CLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxFQUFDLENBQUMsQ0FBQztRQUMxRSxnQkFBVyxHQUFtQixFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkMsZ0JBQVcsR0FBbUIsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBQyxpQkFBaUIsRUFBRSxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDbEYsZUFBVSxHQUFtQixFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1FBaGYvRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFekMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBRXRCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7S0FJQztJQUNELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7O0tBSUM7SUFDRCxJQUFJLElBQUk7O1FBQ04sT0FBTyxNQUFBLElBQUksQ0FBQyxRQUFRLDBDQUFFLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7S0FJQztJQUNELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7OztLQUdDO0lBQ0QsSUFBSSxRQUFRLENBQUMsUUFBaUM7UUFDNUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7S0FHQztJQUNELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBdUNEOzs7O0tBSUM7SUFDTSxZQUFZLENBQUMsUUFBcUI7UUFDdkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7O0tBSUM7SUFDWSxJQUFJOztZQUNmLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUM5QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBRXJDLEtBQUssTUFBTSxPQUFPLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBd0IsQ0FBQztxQkFDL0UsTUFBTSxDQUFDLENBQUMsQ0FBbUIsRUFBRSxFQUFFLENBQzlCLENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFO29CQUMxRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFPLEtBQXVCLEVBQUUsRUFBRTt3QkFDM0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDekIsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO3dCQUV0QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRTs0QkFDekIsTUFBTSxFQUFFLEdBQUc7NEJBQ1gsUUFBUSxFQUFFLE9BQU87eUJBQ2xCLENBQUMsQ0FBQztvQkFDTCxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUM7aUJBQ0w7YUFDRjtRQUNILENBQUM7S0FBQTtJQUVEOzs7S0FHQztJQUNNLEtBQUs7UUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUV0QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7O0tBSUM7SUFDTSxPQUFPO1FBQ1osSUFBSSxDQUFDLFlBQVksR0FBRztZQUNsQixtQkFBbUIsRUFBRSxJQUFJLENBQUMsZ0NBQWdDLEVBQUU7WUFDNUQsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLDZCQUE2QixFQUFFO1lBQ3RELE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYTtZQUMxQixRQUFRLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjtTQUNyQyxDQUFDO1FBRUYsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRTVDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFHRDs7OztLQUlDO0lBQ00sZUFBZTtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7UUFFN0MsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7OztLQUlDO0lBQ00sZ0JBQWdCO1FBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztLQUlDO0lBQ00saUJBQWlCO1FBQ3RCLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtZQUNoRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQU8sY0FBYyxFQUFFLEVBQUU7Z0JBQzVDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDVixLQUFLLE1BQU0sR0FBRyxJQUFJLGNBQWMsRUFBRTtvQkFDaEMsWUFBWTtvQkFDWixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBUyxFQUFFLGdEQUFDLE9BQUEsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUEsR0FBQSxDQUFDLENBQUM7b0JBQ3BHLENBQUMsRUFBRSxDQUFDO2lCQUNMO2dCQUNELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNkLENBQUMsQ0FBQSxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN6QyxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7S0FJQztJQUNELGlCQUFpQjtRQUNmLE1BQU0sZUFBZSxHQUFHO1lBQ3RCLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7d0JBQ2xGLEVBQUUsQ0FBQyxVQUFVLENBQ1gsRUFBRSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxFQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUNsQyxDQUFPLE1BQWMsRUFBRSxFQUFFLGdEQUFDLE9BQUEsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxJQUFJLENBQUMsWUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBLEdBQUEsQ0FBQztxQkFDN0gsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNULENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7O0tBR0M7SUFDTSxlQUFlO0lBRXRCLENBQUM7SUFFRDs7O0tBR0M7SUFDWSxPQUFPOztZQUNsQixZQUFZO1lBQ1osT0FBTyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVMsQ0FBQyxDQUFDO1FBQzlELENBQUM7S0FBQTtJQUVEOzs7S0FHQztJQUNZLE9BQU8sQ0FBQyxVQUFrQjs7WUFDckMsT0FBTyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckYsQ0FBQztLQUFBO0lBRUQ7Ozs7O0tBS0M7SUFDWSxRQUFROzs7WUFDbkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLE1BQUEsSUFBSSxDQUFDLElBQUksMENBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuRixPQUFPLElBQUksQ0FBQzs7S0FDYjtJQUVZLEdBQUc7O1lBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUVsRixJQUFJO2dCQUNGLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7YUFDOUU7WUFBQyxPQUFPLENBQUMsRUFBRTthQUVYO1lBRUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxRQUFTLENBQUMsQ0FBQztRQUM5QyxDQUFDO0tBQUE7SUFxSUQsSUFBYyxvQkFBb0I7O1FBQ2hDLE9BQU8sQ0FBQSxNQUFBLElBQUksQ0FBQyxJQUFJLDBDQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSSxLQUFLLENBQUM7SUFDckgsQ0FBQztJQUVELElBQWMsa0JBQWtCO1FBQzlCLE9BQU87WUFDTCxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsb0NBQW9DO1NBQzNGLENBQUMsQ0FBQywyQkFBMkI7SUFDaEMsQ0FBQztJQUVELElBQWMsZ0JBQWdCO1FBQzVCLE9BQU87WUFDTCxHQUFHLElBQUksQ0FBQyxrQkFBa0I7WUFDMUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSw2REFBNkQ7U0FDMUksQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFjLFVBQVU7UUFDdEIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUFjLGtCQUFrQjtRQUM5QixNQUFNLEdBQUcsR0FBRyxFQUE4QixDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLG9CQUFvQjtZQUMzQixJQUFJLENBQUMsSUFBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRXRHLElBQUksQ0FBQyxJQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFck4sT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBR1MsZ0JBQWdCLENBQUMsSUFBaUI7UUFDMUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQVMsRUFBRTtZQUN4QixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFTLEVBQUU7Z0JBQy9DLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDN0IsTUFBTSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2pCLGtCQUFrQjtZQUNwQixDQUFDLENBQUEsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sTUFBTSxHQUFtQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7WUFDakYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBQyxpQkFBaUIsRUFBRSxlQUFlLEVBQUMsRUFBQyxDQUFDLENBQUM7WUFDdEcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUEsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFlBQVksQ0FBQyxpQkFBMEIsSUFBSTtRQUNqRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRW5DLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxFQUFFO1lBQ2xGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hELEtBQUssTUFBTSxDQUFDLElBQUksVUFBVSxFQUFFO2dCQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUscUNBQXFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1RSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ2IsSUFBSSxJQUFJLENBQUMsb0JBQW9CLElBQUksVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU07b0JBQ3BFLElBQUksR0FBRyxRQUFRLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxXQUFDLE9BQUEsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUNBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFBLEVBQUEsQ0FBQyxDQUFDO2FBQ2hGO1lBQ0QsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLElBQUksY0FBYztnQkFDdEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztTQUMvQztJQUNILENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxJQUFpQjtRQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQXdCLEVBQUU7WUFDaEUsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJO2dCQUNsRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxFQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDOztnQkFDL0UsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxFQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDO1NBQzVGO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQWtCTyxjQUFjLENBQUMsS0FBdUIsRUFBRSxPQUFrRTs7UUFDaEgsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQXFCLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxtQ0FBSSxHQUFHLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQWdCLE1BQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUNBQUksRUFBRSxDQUFDLENBQUMsNEJBQTRCO1FBQzFGLE1BQU0sWUFBWSxHQUFHLE1BQUEsTUFBQSxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxPQUFPLG1DQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLG1DQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxtQ0FBSSxFQUFFLENBQUM7UUFDbEcsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEUsSUFBSSxlQUFlLElBQUksSUFBSSxFQUFFO1lBQzNCLEtBQUssTUFBTSxDQUFDLElBQUksZUFBZTtnQkFDN0IsQ0FBQyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7WUFFeEIsT0FBTztTQUNSO1FBQ0QsZUFBZSxhQUFmLGVBQWUsY0FBZixlQUFlLElBQWYsZUFBZSxHQUFLLEVBQUUsRUFBQztRQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDM0QsSUFBSSxZQUFZLENBQUMsTUFBTSxJQUFJLENBQUM7WUFDMUIsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFekMsTUFBTSxhQUFhLEdBQWtCLEVBQUUsQ0FBQztRQUN4QyxJQUFJLE1BQU0sR0FBVyxDQUFDLENBQUM7UUFDdkIsSUFBSSxVQUFVLEdBQVcsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUMsTUFBTSxFQUFFLE1BQU0sRUFBQyxFQUFDLENBQUMsQ0FBQztRQUU1RCxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUM7UUFDckYsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXRCLE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRTs7WUFDckIsTUFBTSxXQUFXLEdBQUcsTUFBQSxZQUFZLGFBQVosWUFBWSxjQUFaLFlBQVksR0FBSSxPQUFPLENBQUMsSUFBSSxtQ0FBSSxFQUFFLENBQUM7WUFDdkQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztZQUN0RCxJQUFJLFdBQVcsSUFBSSxFQUFFLEVBQUU7Z0JBQ3JCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2QjtZQUNELElBQUksZ0JBQWdCLEVBQUU7Z0JBQ3BCLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ3JDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDcEIsRUFBRSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDakcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUM7Z0JBQ25FLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDaEIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDekIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzlDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDeEMsTUFBTSxDQUFDLFdBQVcsQ0FDaEIsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtvQkFDdEIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUNwQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDM0MsQ0FBQyxHQUFTLEVBQUU7d0JBQ1YsS0FBSyxNQUFNLE1BQU0sSUFBSSxZQUFZLEVBQUU7NEJBQ2pDLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLEVBQUU7Z0NBQ3pCLE1BQU0sU0FBUyxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBYyxDQUFDO2dDQUN4RSxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dDQUMxQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDOzZCQUN4Qjt5QkFDRjtvQkFDSCxDQUFDLENBQUEsQ0FBQyxFQUFFLENBQUM7Z0JBQ1AsQ0FBQyxFQUNELGtCQUFrQixDQUNqQixDQUFDLENBQUM7YUFDTjtZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQztRQUVGLElBQUksZ0JBQWdCLEVBQUU7WUFDcEIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzVCO1FBRUQsTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUM7UUFDM0IsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3ZELFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTs7WUFDOUIsSUFBSSxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxJQUFJLEtBQUksSUFBSTtnQkFDdEIsT0FBTztZQUNULGVBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlCLE1BQU0sVUFBVSxHQUFHLE1BQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsbUNBQUksR0FBRyxDQUFDLENBQUMseURBQXlEO1lBRS9HLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFlBQVksVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNwRCxJQUFJLE1BQU0sR0FBRyxVQUFVLElBQUksR0FBRyxFQUFFO2dCQUM5QixhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM1QixVQUFVLElBQUksVUFBVSxDQUFDO2FBQzFCO1lBQ0QsTUFBTSxJQUFJLFVBQVUsQ0FBQztZQUNyQixPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsVUFBVSxHQUFHLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDakgsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsUUFBUSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEtBQXVCLEVBQUUsT0FBZ0U7O1FBQ2xILE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQUEsT0FBTyxDQUFDLE9BQU8sbUNBQUksS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BDLElBQUksSUFBSSxDQUFDLGlCQUFpQjtnQkFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Z0JBRXpELElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JDO2FBQU07WUFDTCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsMENBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU8sbUJBQW1CLENBQUMsQ0FBYyxFQUFFLFFBQWlCO1FBQzNELElBQUksUUFBUSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUk7WUFDbEcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUU5QyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLFlBQVksR0FBRyxDQUFDLElBQVksRUFBRSxTQUFvQixFQUFFLEVBQUU7SUFDMUQsTUFBTSxTQUFTLEdBQUcsR0FBRyxTQUFTLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDM0MsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDckUsQ0FBQyxDQUFDO0FBRUYsSUFBSyxTQUdKO0FBSEQsV0FBSyxTQUFTO0lBQ1osNEJBQWUsQ0FBQTtJQUNmLDhCQUFpQixDQUFBO0FBQ25CLENBQUMsRUFISSxTQUFTLEtBQVQsU0FBUyxRQUdiO0FBRUQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUF3QixFQUFFLE9BQTRELEVBQUUsRUFBRTtJQUNoSCxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUNsRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDekIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDLENBQUMsQ0FBQztJQUVILEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ2pDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUNqRixHQUFHLEdBQUcsQ0FBQztJQUNSLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDdEgsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUN4SCxDQUFDLENBQUM7QUFFRixNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQXdCLEVBQUUsRUFBZ0IsRUFBRSxFQUFFO0lBQy9ELE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDO0lBQ3JELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRTtRQUNsQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFeEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUs7WUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FDTixHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFDakYsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDbEMsR0FBRyxHQUFHLENBQUM7S0FDWDtBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sV0FBVyxHQUFHLENBQU8sUUFBMEIsRUFBRSxLQUF3QixFQUFFLElBQWlCLEVBQUUsY0FBc0IsRUFBRSxjQUFzQixDQUFDLEVBQUUsRUFBRTtJQUNySixNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxJQUFtQixFQUFFLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7SUFDeEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUU5QyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ2hDLE1BQU0sRUFBRSxPQUFPO1FBQ2YsU0FBUyxFQUFFLEtBQUs7S0FDakIsQ0FBQyxDQUFDO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUU7UUFDdEIsRUFBRSxFQUFFLEVBQUMsR0FBRyxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFDO1FBQzNDLEdBQUcsRUFBRSxFQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFDO0tBQ2xELENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgdmFsaWQtanNkb2MgKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbmltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgRXhjZWxKUyBmcm9tICdleGNlbGpzJztcbmltcG9ydCBodG1sMmNhbnZhcyBmcm9tICdodG1sMmNhbnZhcyc7XG5pbXBvcnQgd3UgZnJvbSAnd3UnO1xuaW1wb3J0ICQgZnJvbSAnY2FzaC1kb20nO1xuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25WaWV3IGV4dGVuZHMgREcuVmlld0Jhc2Uge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29udGV4dDogREcuQ29udGV4dDtcbiAgcHJvdGVjdGVkIF9mdW5jQ2FsbD86IERHLkZ1bmNDYWxsO1xuICBwcm90ZWN0ZWQgX2xhc3RDYWxsPzogREcuRnVuY0NhbGw7XG4gIHByb3RlY3RlZCBfdHlwZTogc3RyaW5nID0gJ2Z1bmN0aW9uJztcblxuICBjb25zdHJ1Y3RvcihmdW5jQ2FsbD86IERHLkZ1bmNDYWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmJveCA9IHRydWU7XG4gICAgdGhpcy5jb250ZXh0ID0gREcuQ29udGV4dC5jbG9uZURlZmF1bHQoKTtcblxuICAgIGlmICghZnVuY0NhbGwpIHJldHVybjtcblxuICAgIHRoaXMubGlua0Z1bmNjYWxsKGZ1bmNDYWxsKTtcbiAgICB0aGlzLmluaXQoKTtcbiAgICB0aGlzLmJ1aWxkKCk7XG4gICAgdGhpcy5uYW1lID0gZnVuY0NhbGwuZnVuYy5mcmllbmRseU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgZnVuY3Rpb24gY2FsbCBvZiB0aGUgdmlld1xuICAgKiBAcmV0dXJucyBUaGUgYWN0dWFsIGZ1bmNjYWxsIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlld1xuICAgKiBAc3RhYmlsaXR5IFN0YWJsZVxuICovXG4gIHB1YmxpYyBnZXQgZnVuY0NhbGwoKTogREcuRnVuY0NhbGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mdW5jQ2FsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgRnVuYyBvZiB0aGUgdmlld1xuICAgKiBAcmV0dXJucyBUaGUgYWN0dWFsIGZ1bmMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2aWV3XG4gICAqIEBzdGFiaWxpdHkgU3RhYmxlXG4gKi9cbiAgZ2V0IGZ1bmMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnVuY0NhbGw/LmZ1bmM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRhdGEgb2YgbGFzdCBjYWxsIG9mIGFzc29jaWF0ZWQgZnVuY3Rpb25cbiAgICogQHJldHVybnMgVGhlIGFjdHVhbCBmdW5jIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlld1xuICAgKiBAc3RhYmlsaXR5IFN0YWJsZVxuICovXG4gIGdldCBsYXN0Q2FsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGFzdENhbGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGRhdGEgb2YgbGFzdCBjYWxsIG9mIGFzc29jaWF0ZWQgZnVuY3Rpb25cbiAgICogQHN0YWJpbGl0eSBTdGFibGVcbiAqL1xuICBzZXQgbGFzdENhbGwobGFzdENhbGw6IERHLkZ1bmNDYWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbGFzdENhbGwgPSBsYXN0Q2FsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWaWV3IHR5cGVcbiAgICogQHN0YWJpbGl0eSBTdGFibGVcbiAqL1xuICBwdWJsaWMgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuXG4gIC8qKiBFeHBvcnQgb3B0aW9ucy4gQ291bGQgYmUgb3ZlcnJpZGVuIHBhcnRpYWxseSwgdXNpbmcgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBlYWNoIG9wdGlvbi5cbiAgICAqIEBzdGFiaWxpdHkgU3RhYmxlXG4gICovXG4gIGV4cG9ydENvbmZpZzoge1xuICAgIC8qKiBPdmVycmlkZSB0byBwcm92aWRlIGN1c3RvbSBleHBvcnQgbG9naWMuXG4gICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24ge0BsaW5rIGRlZmF1bHRFeHBvcnR9IGhlYXZpbHkgcmVsaWVzIG9uIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBidWlsZElPfS5cbiAgICAgICogQHJldHVybnMgQmxvYiB3aXRoIGRhdGEgdG8gYmUgZXhwb3J0ZWQgaW50byB0aGUgZmlsZS5cbiAgICAgICogQHN0YWJpbGl0eSBTdGFibGVcbiAgICAqL1xuICAgIGV4cG9ydDogKChmb3JtYXQ6IHN0cmluZykgPT4gUHJvbWlzZTxCbG9iPik7XG5cblxuICAgIC8qKiBGaWxlbmFtZSBmb3IgZXhwb3J0ZWQgZmlsZXMuIE92ZXJyaWRlIGZvciBjdXN0b20gZmlsZW5hbWVzLlxuICAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHtAbGluayBkZWZhdWx0RXhwb3J0RmlsZW5hbWV9XG4gICAgICAqIEBwYXJhbSBmb3JtYXQgRm9ybWF0IG5hbWUgdG8gYmUgZXhwb3J0ZWRcbiAgICAgICogQHJldHVybnMgVGhlIGFjdHVhbCBmaWxlbmFtZSB0byBiZSB1c2VkIGZvciB0aGUgZ2VuZXJhdGVkIGZpbGUuXG4gICAgICAqIEBzdGFiaWxpdHkgU3RhYmxlXG4gICAgKi9cbiAgICBmaWxlbmFtZTogKChmb3JtYXQ6IHN0cmluZykgPT4gc3RyaW5nKTtcblxuICAgIC8qKiBPdmVycmlkZSB0byBwcm92aWRlIGN1c3RvbSBsaXN0IG9mIHN1cHBvcnRlZCBleHBvcnQgZm9ybWF0cy5cbiAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHtAbGluayBkZWZhdWx0U3VwcG9ydGVkRXhwb3J0Rm9ybWF0c31cbiAgICAgKiBUaGVzZSBmb3JtYXRzIGFyZSBhdmFpbGFibGUgdW5kZXIgdGhlIFwiRXhwb3J0XCIgcG9wdXAgb24gdGhlIHJpYmJvbiBwYW5lbC5cbiAgICAgKiBAcmV0dXJucyBUaGUgYXJyYXkgb2YgZm9ybWF0cyBhdmFpbGFibGUgZm9yIHRoZSBleHBvcnQuXG4gICAgICogQHN0YWJpbGl0eSBTdGFibGVcbiAgICAqL1xuICAgIHN1cHBvcnRlZEZvcm1hdHM6IHN0cmluZ1tdO1xuXG4gICAgLyoqIE92ZXJyaWRlIHRvIHByb3ZpZGUgY3VzdG9tIGZpbGUgZXh0ZW5zaW9ucyBmb3IgZXhwb3J0ZWQgZm9ybWF0cy5cbiAgICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMge0BsaW5rIGRlZmF1bHRTdXBwb3J0ZWRFeHBvcnRFeHRlbnNpb25zfVxuICAgICAgICogVGhlc2UgZXh0ZW5zaW9ucyBhcmUgdXNlZCBpbiBmaWxlbmFtZXMge0BsaW5rIGV4cG9ydEZpbGVuYW1lfS5cbiAgICAgICAqIEByZXR1cm5zIFRoZSBtYXBwaW5nIGJldHdlZW4gc3VwcG9ydGVkIGV4cG9ydCBmb3JtYXRzIGFuZCB0aGVpciBleHRlbnNpb25zLlxuICAgICAgICogQHN0YWJpbGl0eSBTdGFibGVcbiAgICAgKi9cbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIExpbmsgRnVuY0NhbGwgdG8gdGhlIHZpZXdcbiAgICogQHBhcmFtIGZ1bmNDYWxsIFRoZSBhY3R1YWwgZnVuY2NhbGwgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB2aWV3XG4gICAqIEBzdGFiaWxpdHkgU3RhYmxlXG4gKi9cbiAgcHVibGljIGxpbmtGdW5jY2FsbChmdW5jQ2FsbDogREcuRnVuY0NhbGwpIHtcbiAgICB0aGlzLl9mdW5jQ2FsbCA9IGZ1bmNDYWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBmb3IgY3VzdG9tIGxvZ2ljIHRoYXQgY291bGQgbm90IGJlIHBsYWNlZCBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAqIEFueSBhc3luYyBtZXRob2RzIGFuZCBtb3N0IG9mIHRoZSBsb2dpYyBzaG91bGQgYmUgcGxhY2VkIGhlcmUuXG4gICAqIEBzdGFiaWxpdHkgU3RhYmxlXG4gKi9cbiAgcHVibGljIGFzeW5jIGluaXQoKSB7XG4gICAgaWYgKHRoaXMuZnVuY0NhbGwgJiYgdGhpcy5mdW5jKSB7XG4gICAgICB0aGlzLmZ1bmNDYWxsLmF1eFsndmlldyddID0gdGhpcztcbiAgICAgIHRoaXMuZnVuY0NhbGwuY29udGV4dCA9IHRoaXMuY29udGV4dDtcblxuICAgICAgZm9yIChjb25zdCBpblBhcmFtIG9mIHd1KHRoaXMuZnVuY0NhbGwuaW5wdXRQYXJhbXMudmFsdWVzKCkgYXMgREcuRnVuY0NhbGxQYXJhbVtdKVxuICAgICAgICAuZmlsdGVyKChwOiBERy5GdW5jQ2FsbFBhcmFtKSA9PlxuICAgICAgICAgIHAucHJvcGVydHkucHJvcGVydHlUeXBlID09IERHLlRZUEUuREFUQV9GUkFNRSAmJiBwLnByb3BlcnR5Lm9wdGlvbnNbJ3ZpZXdlciddICE9IG51bGwpKSB7XG4gICAgICAgIHRoaXMuc3Vicy5wdXNoKGluUGFyYW0ub25DaGFuZ2VkLnN1YnNjcmliZShhc3luYyAocGFyYW06IERHLkZ1bmNDYWxsUGFyYW0pID0+IHtcbiAgICAgICAgICB0aGlzLmNsZWFyUmVzdWx0cyhmYWxzZSk7XG4gICAgICAgICAgcGFyYW0ucHJvY2Vzc091dHB1dCgpO1xuXG4gICAgICAgICAgdGhpcy5hcHBlbmRPdXRwdXREZihwYXJhbSwge1xuICAgICAgICAgICAgaGVpZ2h0OiA0MDAsXG4gICAgICAgICAgICBjYXRlZ29yeTogJ0lucHV0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRvIGNyZWF0ZSBhIGZ1bGx5IGN1c3RvbSBVSSBpbmNsdWRpbmcgcmliYm9uIG1lbnVzIGFuZCBwYW5lbHNcbiAgICogQHN0YWJpbGl0eSBTdGFibGVcbiAqL1xuICBwdWJsaWMgYnVpbGQoKTogdm9pZCB7XG4gICAgdGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuYnVpbGRJTygpKTtcblxuICAgIHRoaXMuYnVpbGRSaWJib25QYW5lbHMoKTtcbiAgICB0aGlzLmJ1aWxkSGlzdG9yeUJsb2NrKCk7XG4gICAgdGhpcy5idWlsZFJpYmJvbk1lbnUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0byBjcmVhdGUgYSBjdXN0b20gaW5wdXQtb3V0cHV0IGJsb2NrXG4gICAqIEByZXR1cm5zIFRoZSBIVE1MRWxlbWVudCB3aXRoIHdob2xlIFVJIGV4Y2x1ZGluZyByaWJib24gbWVudXMgYW5kIHBhbmVsc1xuICAgKiBAc3RhYmlsaXR5IFN0YWJsZVxuICovXG4gIHB1YmxpYyBidWlsZElPKCk6IEhUTUxFbGVtZW50IHtcbiAgICB0aGlzLmV4cG9ydENvbmZpZyA9IHtcbiAgICAgIHN1cHBvcnRlZEV4dGVuc2lvbnM6IHRoaXMuZGVmYXVsdFN1cHBvcnRlZEV4cG9ydEV4dGVuc2lvbnMoKSxcbiAgICAgIHN1cHBvcnRlZEZvcm1hdHM6IHRoaXMuZGVmYXVsdFN1cHBvcnRlZEV4cG9ydEZvcm1hdHMoKSxcbiAgICAgIGV4cG9ydDogdGhpcy5kZWZhdWx0RXhwb3J0LFxuICAgICAgZmlsZW5hbWU6IHRoaXMuZGVmYXVsdEV4cG9ydEZpbGVuYW1lLFxuICAgIH07XG5cbiAgICBjb25zdCBpbnB1dEJsb2NrID0gdGhpcy5idWlsZElucHV0QmxvY2soKTtcbiAgICBjb25zdCBvdXRwdXRCbG9jayA9IHRoaXMuYnVpbGRPdXRwdXRCbG9jaygpO1xuXG4gICAgcmV0dXJuIHVpLnNwbGl0SChbaW5wdXRCbG9jaywgb3V0cHV0QmxvY2tdKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRvIGNyZWF0ZSBhIGN1c3RvbSBpbnB1dCBibG9ja1xuICAgKiBAcmV0dXJucyBUaGUgSFRNTEVsZW1lbnQgd2l0aCBpbnB1dCBibG9jayBVSSBvbiB0aGUgbGVmdCBzaWRlIGJ5IGRlZmF1bHRcbiAgICogQHN0YWJpbGl0eSBTdGFibGVcbiAqL1xuICBwdWJsaWMgYnVpbGRJbnB1dEJsb2NrKCk6IEhUTUxFbGVtZW50IHtcbiAgICBpZiAoIXRoaXMuZnVuY0NhbGwpIHJldHVybiB0aGlzLmNvbnRyb2xzUm9vdDtcblxuICAgIGNvbnN0IGZ1bmNEaXYgPSB1aS5kaXYoW3RoaXMucmVuZGVyUnVuU2VjdGlvbih0aGlzLmZ1bmNDYWxsKV0sICd1aS1kaXYnKTtcbiAgICB0aGlzLmNvbnRyb2xzUm9vdC5pbm5lckhUTUwgPSAnJztcbiAgICB0aGlzLmNvbnRyb2xzUm9vdC5hcHBlbmRDaGlsZChmdW5jRGl2KTtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sc1Jvb3Q7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdG8gY3JlYXRlIGEgY3VzdG9tIG91dHB1dCBibG9jay5cbiAgICogQHJldHVybnMgVGhlIEhUTUxFbGVtZW50IHdpdGggaW5wdXQgYmxvY2sgVUkgb24gdGhlIGxlZnQgc2lkZSBieSBkZWZhdWx0XG4gICAqIEBzdGFiaWxpdHkgU3RhYmxlXG4gKi9cbiAgcHVibGljIGJ1aWxkT3V0cHV0QmxvY2soKTogSFRNTEVsZW1lbnQge1xuICAgIHRoaXMucmVzdWx0c1Jvb3QuaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5yZXN1bHRzUm9vdC5hcHBlbmRDaGlsZCh0aGlzLnJlc3VsdHNEaXYpO1xuICAgIHJldHVybiB0aGlzLnJlc3VsdHNSb290O1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRvIGNyZWF0ZSBhIGN1c3RvbSBoaXN0b3JpY2FsIHJ1bnMgY29udHJvbC5cbiAgICogQHJldHVybnMgVGhlIEhUTUxFbGVtZW50IHdpdGggaGlzdG9yeSBibG9jayBVSVxuICAgKiBAc3RhYmlsaXR5IEV4cGVyaW1lbnRhbFxuICovXG4gIHB1YmxpYyBidWlsZEhpc3RvcnlCbG9jaygpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgbmV3SGlzdG9yeUJsb2NrID0gdWkuaWNvbkZBKCdoaXN0b3J5JywgKCkgPT4ge1xuICAgICAgdGhpcy5wdWxsUnVucygpLnRoZW4oYXN5bmMgKGhpc3RvcmljYWxSdW5zKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbnUgPSBERy5NZW51LnBvcHVwKCk7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBydW4gb2YgaGlzdG9yaWNhbFJ1bnMpIHtcbiAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICBtZW51Lml0ZW0oYCR7cnVuLmZ1bmMuZnJpZW5kbHlOYW1lfSDigJQgJHtpfWAsIGFzeW5jICgpID0+IHRoaXMuaGlzdG9yaWNhbFJ1blNlcnZpY2UubG9hZFJ1bihydW4uaWQpKTtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgbWVudS5zaG93KCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLmhpc3RvcnlSb290LmlubmVySFRNTCA9ICcnO1xuICAgIHRoaXMuaGlzdG9yeVJvb3QuYXBwZW5kKG5ld0hpc3RvcnlCbG9jayk7XG4gICAgcmV0dXJuIG5ld0hpc3RvcnlCbG9jaztcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rcyBmb3Ige0BsaW5rIHN1cHBvcnRlZEV4cG9ydEZvcm1hdHN9IG1lbWJlcnMgYW5kIGNyZWF0ZXMgcmliYm9uIHBhbmVsXG4gICAqIEByZXR1cm5zIFRoZSBIVE1MRWxlbWVudHMgb2YgcmliYm9uUGFuZWxzXG4gICAqIEBzdGFiaWxpdHkgU3RhYmxlXG4gKi9cbiAgYnVpbGRSaWJib25QYW5lbHMoKTogSFRNTEVsZW1lbnRbXVtdIHtcbiAgICBjb25zdCBuZXdSaWJib25QYW5lbHMgPSBbXG4gICAgICAuLi50aGlzLmdldFJpYmJvblBhbmVscygpLFxuICAgICAgWy4uLih0aGlzLmV4cG9ydENvbmZpZyAmJiB0aGlzLmV4cG9ydENvbmZpZy5zdXBwb3J0ZWRGb3JtYXRzLmxlbmd0aCA+IDApID8gW3VpLmRpdkgoW1xuICAgICAgICB1aS5jb21ib1BvcHVwKFxuICAgICAgICAgIHVpLmljb25GQSgnYXJyb3ctdG8tYm90dG9tJyksXG4gICAgICAgICAgdGhpcy5leHBvcnRDb25maWcuc3VwcG9ydGVkRm9ybWF0cyxcbiAgICAgICAgICBhc3luYyAoZm9ybWF0OiBzdHJpbmcpID0+IERHLlV0aWxzLmRvd25sb2FkKHRoaXMuZXhwb3J0Q29uZmlnIS5maWxlbmFtZShmb3JtYXQpLCBhd2FpdCB0aGlzLmV4cG9ydENvbmZpZyEuZXhwb3J0KGZvcm1hdCkpKSxcbiAgICAgIF0pXTogW11dXG4gICAgXTtcbiAgICB0aGlzLnNldFJpYmJvblBhbmVscyhuZXdSaWJib25QYW5lbHMpO1xuICAgIHJldHVybiBuZXdSaWJib25QYW5lbHM7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdG8gY3JlYXRlIGEgY3VzdG9tIHJpYmJvbiBtZW51IG9uIHRoZSB0b3AuXG4gICAqIEBzdGFiaWxpdHkgU3RhYmxlXG4gKi9cbiAgcHVibGljIGJ1aWxkUmliYm9uTWVudSgpIHtcblxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIHRoZSBjb21wdXRhdGlvbiByZXN1bHRzIHRvIHRoZSBoaXN0b3JpY2FsIHJlc3VsdHMsIHJldHVybnMgaXRzIGlkLiBTZWUgYWxzbyB7QGxpbmsgbG9hZFJ1bn0uXG4gICAqIEBzdGFiaWxpdHkgRXhwZXJpbWVudGFsXG4gKi9cbiAgcHVibGljIGFzeW5jIHNhdmVSdW4oKTogUHJvbWlzZTxERy5GdW5jQ2FsbD4ge1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIHJldHVybiBhd2FpdCBncm9rLmRhcGkuZnVuY3Rpb25zLmNhbGxzLnNhdmUodGhpcy5sYXN0Q2FsbCEpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBzcGVjaWZpZWQgaGlzdG9yaWNhbCBydW4uIFNlZSBhbHNvIHtAbGluayBzYXZlUnVufS5cbiAgICogQHN0YWJpbGl0eSBFeHBlcmltZW50YWxcbiAqL1xuICBwdWJsaWMgYXN5bmMgbG9hZFJ1bihmdW5jQ2FsbElkOiBzdHJpbmcpOiBQcm9taXNlPERHLkZ1bmNDYWxsPiB7XG4gICAgcmV0dXJuIGF3YWl0IGdyb2suZGFwaS5mdW5jdGlvbnMuY2FsbHMuaW5jbHVkZSgnaW5wdXRzLCBvdXRwdXRzJykuZmluZChmdW5jQ2FsbElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhbGwgdGhlIGZ1bmN0aW9uIGNhbGwgb2YgdGhpcyBmdW5jdGlvbi5cbiAgICogRGVzaWduZWQgdG8gcHVsbCBoc3RvcmljYWwgcnVucyBpbiBmYXN0IG1hbm5lciBhbmQgdGhlIGNhbGwge0BsaW5rIGxvYWRSdW59IHdpdGggc3BlY2lmaWVkIHJ1biBJRC5cbiAgICogV0FSTklORzogRnVuY0NhbGwgaW5wdXRzL291dHB1dHMgYXJlIG5vdCBpbmNsdWRlZFxuICAgKiBAc3RhYmlsaXR5IEV4cGVyaW1lbnRhbFxuICovXG4gIHB1YmxpYyBhc3luYyBwdWxsUnVucygpOiBQcm9taXNlPERHLkZ1bmNDYWxsW10+IHtcbiAgICBjb25zdCBsaXN0ID0gZ3Jvay5kYXBpLmZ1bmN0aW9ucy5jYWxscy5maWx0ZXIoYGZ1bmMuaWQ9XCIke3RoaXMuZnVuYz8uaWR9XCJgKS5saXN0KCk7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5mdW5jQ2FsbCkgdGhyb3cgbmV3IEVycm9yKCdUaGUgY29ycmVzcG9kaW5nIGZ1bmN0aW9uIGlzIG5vdCBzcGVjaWZpZWQnKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmxhc3RDYWxsID0gYXdhaXQgdGhpcy5mdW5jQ2FsbC5jYWxsKHRydWUsIHVuZGVmaW5lZCwge3Byb2Nlc3NlZDogdHJ1ZX0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcblxuICAgIH1cblxuICAgIHRoaXMub3V0cHV0UGFyYW1ldGVyc1RvVmlldyh0aGlzLmxhc3RDYWxsISk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVmYXVsdEV4cG9ydEZpbGVuYW1lID0gKGZvcm1hdDogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIGAke3RoaXMubmFtZX0gLSAke25ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKX0uJHt0aGlzLmV4cG9ydENvbmZpZyEuc3VwcG9ydGVkRXh0ZW5zaW9uc1tmb3JtYXRdfWA7XG4gIH07XG5cbiAgcHJvdGVjdGVkIGRlZmF1bHRTdXBwb3J0ZWRFeHBvcnRFeHRlbnNpb25zID0gKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAnRXhjZWwnOiAneGxzeCdcbiAgICB9O1xuICB9O1xuXG4gIHByb3RlY3RlZCBkZWZhdWx0U3VwcG9ydGVkRXhwb3J0Rm9ybWF0cyA9ICgpID0+IHtcbiAgICByZXR1cm4gWydFeGNlbCddO1xuICB9O1xuXG4gIHByb3RlY3RlZCBkZWZhdWx0RXhwb3J0ID0gYXN5bmMgKGZvcm1hdDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgbGFzdENhbGwgPSB0aGlzLmxhc3RDYWxsO1xuICAgIGlmICghbGFzdENhbGwpIHRocm93IG5ldyBFcnJvcihgRnVuY3Rpb24gd2FzIG5vdCBjYWxsZWRgKTtcblxuICAgIGlmICghdGhpcy5leHBvcnRDb25maWchLnN1cHBvcnRlZEZvcm1hdHMuaW5jbHVkZXMoZm9ybWF0KSkgdGhyb3cgbmV3IEVycm9yKGBGb3JtYXQgXCIke2Zvcm1hdH1cIiBpcyBub3Qgc3VwcG9ydGVkLmApO1xuXG4gICAgaWYgKCF0aGlzLmZ1bmMpIHRocm93IG5ldyBFcnJvcignVGhlIGNvcnJlc3BvZGluZyBmdW5jdGlvbiBpcyBub3Qgc3BlY2lmaWVkJyk7XG5cbiAgICBjb25zdCBCTE9CX1RZUEUgPSAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQ7Y2hhcnNldD1VVEYtOCc7XG4gICAgY29uc3QgZXhwb3J0V29ya2Jvb2sgPSBuZXcgRXhjZWxKUy5Xb3JrYm9vaygpO1xuXG4gICAgY29uc3QgaXNTY2FsYXJUeXBlID0gKHR5cGU6IERHLlRZUEUpID0+IChERy5UWVBFU19TQ0FMQVIuaGFzKHR5cGUpKTtcblxuICAgIGNvbnN0IGlzRGF0YUZyYW1lID0gKHR5cGU6IERHLlRZUEUpID0+ICh0eXBlID09PSBERy5UWVBFLkRBVEFfRlJBTUUpO1xuXG4gICAgY29uc3QgZGZJbnB1dHMgPSB0aGlzLmZ1bmMuaW5wdXRzLmZpbHRlcigoaW5wdXQpID0+IGlzRGF0YUZyYW1lKGlucHV0LnByb3BlcnR5VHlwZSkpO1xuICAgIGNvbnN0IHNjYWxhcklucHV0cyA9IHRoaXMuZnVuYy5pbnB1dHMuZmlsdGVyKChpbnB1dCkgPT4gaXNTY2FsYXJUeXBlKGlucHV0LnByb3BlcnR5VHlwZSkpO1xuICAgIGNvbnN0IGRmT3V0cHV0cyA9IHRoaXMuZnVuYy5vdXRwdXRzLmZpbHRlcigob3V0cHV0KSA9PiBpc0RhdGFGcmFtZShvdXRwdXQucHJvcGVydHlUeXBlKSk7XG4gICAgY29uc3Qgc2NhbGFyT3V0cHV0cyA9IHRoaXMuZnVuYy5vdXRwdXRzLmZpbHRlcigob3V0cHV0KSA9PiBpc1NjYWxhclR5cGUob3V0cHV0LnByb3BlcnR5VHlwZSkpO1xuXG4gICAgY29uc3QgaW5wdXRQYXJhbXMgPSBbLi4ubGFzdENhbGwuaW5wdXRQYXJhbXMudmFsdWVzKCldIGFzIERHLkZ1bmNDYWxsUGFyYW1bXTtcbiAgICBjb25zdCBvdXRwdXRQYXJhbXMgPSBbLi4ubGFzdENhbGwub3V0cHV0UGFyYW1zLnZhbHVlcygpXSBhcyBERy5GdW5jQ2FsbFBhcmFtW107XG5cbiAgICBkZklucHV0cy5mb3JFYWNoKChkZklucHV0KSA9PiB7XG4gICAgICBjb25zdCB2aXNpYmxlVGl0bGUgPSBkZklucHV0Lm9wdGlvbnMuY2FwdGlvbiB8fCBkZklucHV0Lm5hbWU7XG4gICAgICBjb25zdCBjdXJyZW50RGZTaGVldCA9IGV4cG9ydFdvcmtib29rLmFkZFdvcmtzaGVldChnZXRTaGVldE5hbWUodmlzaWJsZVRpdGxlLCBESVJFQ1RJT04uSU5QVVQpKTtcblxuICAgICAgY29uc3QgY3VycmVudERmID0gKGxhc3RDYWxsLmlucHV0c1tkZklucHV0Lm5hbWVdIGFzIERHLkRhdGFGcmFtZSk7XG4gICAgICBkZlRvU2hlZXQoY3VycmVudERmU2hlZXQsIGN1cnJlbnREZik7XG4gICAgfSk7XG5cbiAgICBpZiAoc2NhbGFySW5wdXRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgaW5wdXRTY2FsYXJzU2hlZXQgPSBleHBvcnRXb3JrYm9vay5hZGRXb3Jrc2hlZXQoJ0lucHV0IHNjYWxhcnMnKTtcbiAgICAgIHNjYWxhcnNUb1NoZWV0KGlucHV0U2NhbGFyc1NoZWV0LCBzY2FsYXJJbnB1dHMubWFwKChzY2FsYXJJbnB1dCkgPT4gKHtcbiAgICAgICAgY2FwdGlvbjogc2NhbGFySW5wdXQub3B0aW9uc1snY2FwdGlvbiddIHx8IHNjYWxhcklucHV0Lm5hbWUsXG4gICAgICAgIHZhbHVlOiBsYXN0Q2FsbC5pbnB1dHNbc2NhbGFySW5wdXQubmFtZV0sXG4gICAgICAgIHVuaXRzOiBzY2FsYXJJbnB1dC5vcHRpb25zWyd1bml0cyddIHx8ICcnLFxuICAgICAgfSkpKTtcbiAgICB9XG5cbiAgICBkZk91dHB1dHMuZm9yRWFjaCgoZGZPdXRwdXQpID0+IHtcbiAgICAgIGNvbnN0IHZpc2libGVUaXRsZSA9IGRmT3V0cHV0Lm9wdGlvbnMuY2FwdGlvbiB8fCBkZk91dHB1dC5uYW1lO1xuICAgICAgY29uc3QgY3VycmVudERmU2hlZXQgPSBleHBvcnRXb3JrYm9vay5hZGRXb3Jrc2hlZXQoZ2V0U2hlZXROYW1lKHZpc2libGVUaXRsZSwgRElSRUNUSU9OLk9VVFBVVCkpO1xuXG4gICAgICBjb25zdCBjdXJyZW50RGYgPSAobGFzdENhbGwub3V0cHV0c1tkZk91dHB1dC5uYW1lXSBhcyBERy5EYXRhRnJhbWUpO1xuICAgICAgZGZUb1NoZWV0KGN1cnJlbnREZlNoZWV0LCBjdXJyZW50RGYpO1xuICAgIH0pO1xuXG5cbiAgICBpZiAoc2NhbGFyT3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG91dHB1dFNjYWxhcnNTaGVldCA9IGV4cG9ydFdvcmtib29rLmFkZFdvcmtzaGVldCgnT3V0cHV0IHNjYWxhcnMnKTtcbiAgICAgIHNjYWxhcnNUb1NoZWV0KG91dHB1dFNjYWxhcnNTaGVldCwgc2NhbGFyT3V0cHV0cy5tYXAoKHNjYWxhck91dHB1dCkgPT4gKHtcbiAgICAgICAgY2FwdGlvbjogc2NhbGFyT3V0cHV0Lm9wdGlvbnNbJ2NhcHRpb24nXSB8fCBzY2FsYXJPdXRwdXQubmFtZSxcbiAgICAgICAgdmFsdWU6IGxhc3RDYWxsLm91dHB1dHNbc2NhbGFyT3V0cHV0Lm5hbWVdLFxuICAgICAgICB1bml0czogc2NhbGFyT3V0cHV0Lm9wdGlvbnNbJ3VuaXRzJ10gfHwgJycsXG4gICAgICB9KSkpO1xuICAgIH1cblxuICAgIGNvbnN0IHRhYkNvbnRyb2wgPSB0aGlzLnJlc3VsdHNUYWJDb250cm9sO1xuICAgIGlmICh0YWJDb250cm9sKSB7XG4gICAgICBmb3IgKGNvbnN0IHRhYkxhYmVsIG9mIHRoaXMudGFic0xhYmVscykge1xuICAgICAgICB0YWJDb250cm9sLmN1cnJlbnRQYW5lID0gdGFiQ29udHJvbC5nZXRQYW5lKHRhYkxhYmVsKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMTAwKSk7XG4gICAgICAgIGlmICh0YWJMYWJlbCA9PT0gJ0lucHV0Jykge1xuICAgICAgICAgIGZvciAoY29uc3QgaW5wdXRQYXJhbSBvZiBpbnB1dFBhcmFtcy5maWx0ZXIoKGlucHV0UGFyYW0pID0+IGlucHV0UGFyYW0ucHJvcGVydHkucHJvcGVydHlUeXBlID09PSBERy5UWVBFLkRBVEFfRlJBTUUpKSB7XG4gICAgICAgICAgICBjb25zdCBub25HcmlkVmlld2VycyA9IChpbnB1dFBhcmFtLmF1eFsndmlld2VycyddIGFzIERHLlZpZXdlcltdKS5maWx0ZXIoKHZpZXdlcikgPT4gdmlld2VyLnR5cGUgIT09IERHLlZJRVdFUi5HUklEKTtcblxuICAgICAgICAgICAgY29uc3QgZGZJbnB1dCA9IGRmSW5wdXRzLmZpbmQoKGlucHV0KSA9PiBpbnB1dC5uYW1lID09PSBpbnB1dFBhcmFtLm5hbWUpO1xuICAgICAgICAgICAgY29uc3QgdmlzaWJsZVRpdGxlID0gZGZJbnB1dCEub3B0aW9ucy5jYXB0aW9uIHx8IGlucHV0UGFyYW0ubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREZiA9IChsYXN0Q2FsbC5pbnB1dHNbZGZJbnB1dCEubmFtZV0gYXMgREcuRGF0YUZyYW1lKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHZpZXdlcl0gb2Ygbm9uR3JpZFZpZXdlcnMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgIGlmICh2aWV3ZXIucm9vdC5wYXJlbnRFbGVtZW50Py5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtR3JpZFN3aXRjaGVzLmdldChpbnB1dFBhcmFtLm5hbWUpPy5jbGljaygpO1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDUwKSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBhd2FpdCBwbG90VG9TaGVldChcbiAgICAgICAgICAgICAgICBleHBvcnRXb3JrYm9vayxcbiAgICAgICAgICAgICAgICBleHBvcnRXb3JrYm9vay5nZXRXb3Jrc2hlZXQoZ2V0U2hlZXROYW1lKHZpc2libGVUaXRsZSwgRElSRUNUSU9OLklOUFVUKSksXG4gICAgICAgICAgICAgICAgdmlld2VyLnJvb3QsXG4gICAgICAgICAgICAgICAgY3VycmVudERmLmNvbHVtbnMubGVuZ3RoICsgMixcbiAgICAgICAgICAgICAgICAoaW5kZXggPiAwKSA/IE1hdGguY2VpbChub25HcmlkVmlld2Vyc1tpbmRleC0xXS5yb290LmNsaWVudEhlaWdodCAvIDIwKSArIDEgOiAwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG91dHB1dFBhcmFtIG9mIG91dHB1dFBhcmFtcy5maWx0ZXIoKG91dHB1dFBhcmFtKSA9PiBvdXRwdXRQYXJhbS5wcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IERHLlRZUEUuREFUQV9GUkFNRSAmJiBvdXRwdXRQYXJhbS5wcm9wZXJ0eS5jYXRlZ29yeSA9PT0gdGFiTGFiZWwpKSB7XG4gICAgICAgICAgICBjb25zdCBub25HcmlkVmlld2VycyA9IChvdXRwdXRQYXJhbS5hdXhbJ3ZpZXdlcnMnXSBhcyBERy5WaWV3ZXJbXSkuZmlsdGVyKCh2aWV3ZXIpID0+IHZpZXdlci50eXBlICE9PSBERy5WSUVXRVIuR1JJRCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRmT3V0cHV0ID0gZGZPdXRwdXRzLmZpbmQoKGlucHV0KSA9PiBpbnB1dC5uYW1lID09PSBvdXRwdXRQYXJhbS5uYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGVUaXRsZSA9IGRmT3V0cHV0IS5vcHRpb25zLmNhcHRpb24gfHwgb3V0cHV0UGFyYW0ubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREZiA9IChsYXN0Q2FsbC5vdXRwdXRzW2RmT3V0cHV0IS5uYW1lXSBhcyBERy5EYXRhRnJhbWUpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgdmlld2VyXSBvZiBub25HcmlkVmlld2Vycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgaWYgKHZpZXdlci5yb290LnBhcmVudEVsZW1lbnQ/LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1HcmlkU3dpdGNoZXMuZ2V0KG91dHB1dFBhcmFtLm5hbWUpPy5jbGljaygpO1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDUwKSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBhd2FpdCBwbG90VG9TaGVldChcbiAgICAgICAgICAgICAgICBleHBvcnRXb3JrYm9vayxcbiAgICAgICAgICAgICAgICBleHBvcnRXb3JrYm9vay5nZXRXb3Jrc2hlZXQoZ2V0U2hlZXROYW1lKHZpc2libGVUaXRsZSwgRElSRUNUSU9OLk9VVFBVVCkpLFxuICAgICAgICAgICAgICAgIHZpZXdlci5yb290LFxuICAgICAgICAgICAgICAgIGN1cnJlbnREZi5jb2x1bW5zLmxlbmd0aCArIDIsXG4gICAgICAgICAgICAgICAgKGluZGV4ID4gMCkgPyBNYXRoLmNlaWwobm9uR3JpZFZpZXdlcnNbaW5kZXgtMV0ucm9vdC5jbGllbnRIZWlnaHQgLyAyMCkgKyAxIDogMFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGV4cG9ydFdvcmtib29rLnhsc3gud3JpdGVCdWZmZXIoKTtcblxuICAgIHJldHVybiBuZXcgQmxvYihbYnVmZmVyXSwge3R5cGU6IEJMT0JfVFlQRX0pO1xuICB9O1xuXG4gIHByb3RlY3RlZCBnZXQgaXNJbnB1dFBhbmVsUmVxdWlyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnVuYz8uaW5wdXRzLnNvbWUoKHApID0+IHAucHJvcGVydHlUeXBlID09IERHLlRZUEUuREFUQV9GUkFNRSAmJiBwLm9wdGlvbnNbJ3ZpZXdlciddICE9IG51bGwpIHx8IGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBvdXRQYXJhbUNhdGVnb3JpZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLm5ldyBTZXQodGhpcy5mdW5jIS5vdXRwdXRzLm1hcCgocCkgPT4gcC5jYXRlZ29yeSkpIC8vIGdldCBhbGwgb3V0cHV0IHBhcmFtcycgY2F0ZWdvcmllc1xuICAgIF07IC8vIGtlZXAgb25seSB1bmlxdWUgb2YgdGhlbVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBvdXRwdXRUYWJzTGFiZWxzKCkge1xuICAgIHJldHVybiBbXG4gICAgICAuLi50aGlzLm91dFBhcmFtQ2F0ZWdvcmllcyxcbiAgICAgIC4uLnRoaXMub3V0UGFyYW1DYXRlZ29yaWVzLmZpbmQoKHZhbCkgPT4gdmFsID09PSAnTWlzYycpID8gWydPdXRwdXQnXSA6IFtdLCAvLyBpZiBubyBjYXRlZ29yaWVzIGFyZSBzdGF0ZWQsIHRoZSBkZWZhdWx0IGNhdGVnb3J5IGlzIGFkZGVkXG4gICAgXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdGFic0xhYmVscygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5wYXJhbVRvQ2F0ZWdvcnlNYXApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBwYXJhbVRvQ2F0ZWdvcnlNYXAoKSB7XG4gICAgY29uc3QgbWFwID0ge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuICAgIGlmICh0aGlzLmlzSW5wdXRQYW5lbFJlcXVpcmVkKVxuICAgICAgdGhpcy5mdW5jIS5pbnB1dHMuZm9yRWFjaCgocCkgPT4gbWFwWydJbnB1dCddID8gbWFwWydJbnB1dCddLnB1c2gocC5uYW1lKTogbWFwWydJbnB1dCddID0gW3AubmFtZV0pO1xuXG4gICAgdGhpcy5mdW5jIS5vdXRwdXRzLmZvckVhY2goKHApID0+IG1hcFtwLmNhdGVnb3J5ID09PSAnTWlzYycgPyAnT3V0cHV0JzogcC5jYXRlZ29yeV0gPyBtYXBbcC5jYXRlZ29yeSA9PT0gJ01pc2MnID8gJ091dHB1dCc6IHAuY2F0ZWdvcnldLnB1c2gocC5uYW1lKSA6IG1hcFtwLmNhdGVnb3J5ID09PSAnTWlzYycgPyAnT3V0cHV0JzogcC5jYXRlZ29yeV0gPSBbcC5uYW1lXSk7XG5cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cblxuICBwcm90ZWN0ZWQgcmVuZGVyUnVuU2VjdGlvbihjYWxsOiBERy5GdW5jQ2FsbCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdWkud2FpdChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBydW5CdXR0b24gPSB1aS5iaWdCdXR0b24oJ1J1bicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY2FsbC5hdXhbJ3ZpZXcnXSA9IHRoaXMuZGFydDtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW4oKTtcbiAgICAgICAgLy8gdGhpcy5zYXZlUnVuKCk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGVkaXRvciA9IHVpLmRpdigpO1xuICAgICAgY29uc3QgaW5wdXRzOiBERy5JbnB1dEJhc2VbXSA9IGF3YWl0IGNhbGwuYnVpbGRFZGl0b3IoZWRpdG9yLCB7Y29uZGVuc2VkOiB0cnVlfSk7XG4gICAgICBlZGl0b3IuY2xhc3NMaXN0LmFkZCgndWktZm9ybScpO1xuICAgICAgY29uc3QgYnV0dG9ucyA9IHVpLmRpdkgoW3RoaXMuaGlzdG9yeVJvb3QsIHJ1bkJ1dHRvbl0sIHtzdHlsZTogeydqdXN0aWZ5LWNvbnRlbnQnOiAnc3BhY2UtYmV0d2Vlbid9fSk7XG4gICAgICBlZGl0b3IuYXBwZW5kQ2hpbGQoYnV0dG9ucyk7XG4gICAgICByZXR1cm4gZWRpdG9yO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclJlc3VsdHMoc3dpdGNoVG9PdXRwdXQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgY29uc3QgY2F0ZWdvcmllcyA9IHRoaXMudGFic0xhYmVscztcblxuICAgIGlmICgoY2F0ZWdvcmllcy5sZW5ndGggPiAxIHx8IChjYXRlZ29yaWVzLmxlbmd0aCA9PSAxICYmIGNhdGVnb3JpZXNbMF0gIT0gJ01pc2MnKSkpIHtcbiAgICAgIHRoaXMucmVzdWx0c1RhYkNvbnRyb2wgPSBERy5UYWJDb250cm9sLmNyZWF0ZSgpO1xuICAgICAgZm9yIChjb25zdCBjIG9mIGNhdGVnb3JpZXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlc3VsdFRhYnMuaGFzKGMpKVxuICAgICAgICAgIHRoaXMucmVzdWx0VGFicy5zZXQoYywgdWkuZGl2KFtdLCAndWktcGFuZWwsIGdyb2stZnVuYy1yZXN1bHRzLCB1aS1ib3gnKSk7XG4gICAgICAgIGxldCBuYW1lID0gYztcbiAgICAgICAgaWYgKHRoaXMuaXNJbnB1dFBhbmVsUmVxdWlyZWQgJiYgY2F0ZWdvcmllcy5sZW5ndGggPT0gMiAmJiBjID09ICdNaXNjJylcbiAgICAgICAgICBuYW1lID0gJ09VVFBVVCc7XG4gICAgICAgIHRoaXMucmVzdWx0c1RhYkNvbnRyb2wuYWRkUGFuZShuYW1lLCAoKSA9PiB0aGlzLnJlc3VsdFRhYnMuZ2V0KGMpID8/IHVpLmRpdigpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjYXRlZ29yaWVzLmxlbmd0aCA+IDEgJiYgdGhpcy5pc0lucHV0UGFuZWxSZXF1aXJlZCAmJiBzd2l0Y2hUb091dHB1dClcbiAgICAgICAgdGhpcy5yZXN1bHRzVGFiQ29udHJvbC5jdXJyZW50UGFuZSA9IHRoaXMucmVzdWx0c1RhYkNvbnRyb2wucGFuZXNbMV07XG4gICAgICB0aGlzLnJlc3VsdHNEaXYgPSB0aGlzLnJlc3VsdHNUYWJDb250cm9sLnJvb3Q7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvdXRwdXRQYXJhbWV0ZXJzVG9WaWV3KGNhbGw6IERHLkZ1bmNDYWxsKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclJlc3VsdHModHJ1ZSk7XG4gICAgZm9yIChjb25zdCBwIG9mIGNhbGwub3V0cHV0UGFyYW1zLnZhbHVlcygpIGFzIERHLkZ1bmNDYWxsUGFyYW1bXSkge1xuICAgICAgcC5wcm9jZXNzT3V0cHV0KCk7XG4gICAgICBpZiAocC5wcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT0gREcuVFlQRS5EQVRBX0ZSQU1FICYmIHAudmFsdWUgIT0gbnVsbClcbiAgICAgICAgdGhpcy5hcHBlbmRPdXRwdXREZihwLCB7Y2FwdGlvbjogcC5wcm9wZXJ0eS5uYW1lLCBjYXRlZ29yeTogcC5wcm9wZXJ0eS5jYXRlZ29yeX0pO1xuICAgICAgZWxzZSB0aGlzLmFwcGVuZFJlc3VsdFNjYWxhcihwLCB7Y2FwdGlvbjogcC5wcm9wZXJ0eS5uYW1lLCBjYXRlZ29yeTogcC5wcm9wZXJ0eS5jYXRlZ29yeX0pO1xuICAgIH1cbiAgICB0aGlzLmJ1aWxkT3V0cHV0QmxvY2soKTtcbiAgfVxuXG4gIC8vIG1hcHBwaW5nIG9mIHBhcmFtIHRvIHRoZSBzd2l0Y2hjZXMgb2YgdGhlaXIgdmlld2Vycy9ncmlkc1xuICBwcm90ZWN0ZWQgcGFyYW1HcmlkU3dpdGNoZXM6IE1hcDxzdHJpbmcsIEhUTUxFbGVtZW50PiA9IG5ldyBNYXAoKTtcbiAgLy8gbWFwcHBpbmcgb2YgcGFyYW0gdG8gdGhlaXIgdmlld2VycyBwbGFjZWQgb24gRE9NXG4gIHByb3RlY3RlZCBleGlzdGluZ1BhcmFtVmlld2VyczogTWFwPHN0cmluZywgREcuVmlld2VyW10+ID0gbmV3IE1hcCgpO1xuICAvLyBtYXBwcGluZyBvZiBwYXJhbSB0byB0aGVpciBodG1sIGVsZW1lbnRzXG4gIHByb3RlY3RlZCBwYXJhbVNwYW5zOiBNYXA8c3RyaW5nLCBIVE1MRWxlbWVudD4gPSBuZXcgTWFwKCk7XG4gIC8vIG1hcHBwaW5nIG9mIHRhYiBuYW1lcyB0byB0aGVpciBjb250ZW50XG4gIHByb3RlY3RlZCByZXN1bHRUYWJzOiBNYXA8U3RyaW5nLCBIVE1MRWxlbWVudD4gPSBuZXcgTWFwKCk7XG4gIHByb3RlY3RlZCByZXN1bHRzVGFiQ29udHJvbDogREcuVGFiQ29udHJvbCB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJlc3VsdHNEaXY6IEhUTUxFbGVtZW50ID0gdWkucGFuZWwoW10sICdncm9rLWZ1bmMtcmVzdWx0cycpO1xuXG4gIHByb3RlY3RlZCBjb250cm9sc1Jvb3Q6IEhUTUxEaXZFbGVtZW50ID0gdWkuYm94KG51bGwsIHtzdHlsZToge21heFdpZHRoOiAnMzcwcHgnfX0pO1xuICBwcm90ZWN0ZWQgcmVzdWx0c1Jvb3Q6IEhUTUxEaXZFbGVtZW50ID0gdWkuYm94KCk7XG4gIHByb3RlY3RlZCBoaXN0b3J5Um9vdDogSFRNTERpdkVsZW1lbnQgPSB1aS5kaXZWKFtdLCB7c3R5bGU6IHsnanVzdGlmeS1jb250ZW50JzogJ2NlbnRlcid9fSk7XG4gIHByb3RlY3RlZCBpbnB1dHNSb290OiBIVE1MRGl2RWxlbWVudCA9IHVpLnBhbmVsKFtdLCAnZ3Jvay1mdW5jLXJlc3VsdHMsIHVpLWJveCcpO1xuXG4gIHByaXZhdGUgYXBwZW5kT3V0cHV0RGYocGFyYW06IERHLkZ1bmNDYWxsUGFyYW0sIG9wdGlvbnM/OiB7IGNhcHRpb24/OiBzdHJpbmcsIGNhdGVnb3J5Pzogc3RyaW5nLCBoZWlnaHQ/OiBudW1iZXIgfSkge1xuICAgIGNvbnN0IHBhcmFtRGYgPSBwYXJhbS52YWx1ZSBhcyBERy5EYXRhRnJhbWU7XG4gICAgY29uc3QgaGVpZ2h0ID0gb3B0aW9ucz8uaGVpZ2h0ID8/IDQwMDtcbiAgICBjb25zdCBwYXJhbVZpZXdlcnM6IERHLlZpZXdlcltdID0gcGFyYW0uYXV4Wyd2aWV3ZXJzJ10gPz8gW107IC8vIHN0b3JpbmcgdGhlIHZpZXdlcnMgb2YgRGZcbiAgICBjb25zdCBwYXJhbUNhcHRpb24gPSBvcHRpb25zPy5jYXB0aW9uID8/IHBhcmFtLmF1eFsndmlld2VyVGl0bGUnXSA/PyBwYXJhbS5wcm9wZXJ0eS5jYXB0aW9uID8/ICcnO1xuICAgIGxldCBleGlzdGluZ1ZpZXdlcnMgPSB0aGlzLmV4aXN0aW5nUGFyYW1WaWV3ZXJzLmdldChwYXJhbS5uYW1lKTtcbiAgICBpZiAoZXhpc3RpbmdWaWV3ZXJzICE9IG51bGwpIHtcbiAgICAgIGZvciAoY29uc3QgdiBvZiBleGlzdGluZ1ZpZXdlcnMpXG4gICAgICAgIHYuZGF0YUZyYW1lID0gcGFyYW1EZjtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBleGlzdGluZ1ZpZXdlcnMgPz89IFtdO1xuICAgIHRoaXMuZXhpc3RpbmdQYXJhbVZpZXdlcnMuc2V0KHBhcmFtLm5hbWUsIGV4aXN0aW5nVmlld2Vycyk7XG4gICAgaWYgKHBhcmFtVmlld2Vycy5sZW5ndGggPT0gMClcbiAgICAgIHBhcmFtVmlld2Vycy5wdXNoKHBhcmFtRGYucGxvdC5ncmlkKCkpO1xuXG4gICAgY29uc3Qgdmlld2Vyc1RvSGlkZTogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGxldCBibG9ja3M6IG51bWJlciA9IDA7XG4gICAgbGV0IGJsb2NrV2lkdGg6IG51bWJlciA9IDA7XG4gICAgY29uc3QgZ3JpZFdyYXBwZXIgPSB1aS5ib3gobnVsbCwge3N0eWxlOiB7aGVpZ2h0OiAnMTAwJSd9fSk7XG5cbiAgICBjb25zdCBpc0dyaWRTd2l0Y2hhYmxlID0gd3UocGFyYW1WaWV3ZXJzKS5ldmVyeSgodjogREcuVmlld2VyKSA9PiB2LnR5cGUgIT09ICdHcmlkJyk7XG4gICAgJChncmlkV3JhcHBlcikuaGlkZSgpO1xuXG4gICAgY29uc3QgZ2V0SGVhZGVyID0gKCkgPT4ge1xuICAgICAgY29uc3QgaGVhZGVyTGFiZWwgPSBwYXJhbUNhcHRpb24gPz8gcGFyYW1EZi5uYW1lID8/ICcnO1xuICAgICAgY29uc3QgaGVhZGVyID0gdWkuZGl2KFtdLCAnZ3Jvay1mdW5jLXJlc3VsdHMtaGVhZGVyJyk7XG4gICAgICBpZiAoaGVhZGVyTGFiZWwgIT0gJycpIHtcbiAgICAgICAgY29uc3QgaCA9IHVpLmgxKGhlYWRlckxhYmVsKTtcbiAgICAgICAgdWkuVG9vbHRpcC5iaW5kKGgsICgpID0+IGhlYWRlckxhYmVsKTtcbiAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKGgpO1xuICAgICAgfVxuICAgICAgaWYgKGlzR3JpZFN3aXRjaGFibGUpIHtcbiAgICAgICAgY29uc3QgaWNvbiA9IHVpLmljb25TdmcoJ3RhYmxlJywgKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHVpLnNldERpc3BsYXlBbGwodmlld2Vyc1RvSGlkZSwgdmlld2Vyc1RvSGlkZS5zb21lKCh2aWV3ZXIpID0+IHZpZXdlci5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpKTtcbiAgICAgICAgICB1aS5zZXREaXNwbGF5KGdyaWRXcmFwcGVyLCBncmlkV3JhcHBlci5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpO1xuICAgICAgICB9LCAnU2hvdyBncmlkJyk7XG4gICAgICAgIGhlYWRlci5hcHBlbmRDaGlsZChpY29uKTtcbiAgICAgICAgdGhpcy5wYXJhbUdyaWRTd2l0Y2hlcy5zZXQocGFyYW0ubmFtZSwgaWNvbik7XG4gICAgICB9XG4gICAgICBpZiAoIWdyb2suc2hlbGwudGFibGVzLmluY2x1ZGVzKHBhcmFtRGYpKSB7XG4gICAgICAgIGhlYWRlci5hcHBlbmRDaGlsZChcbiAgICAgICAgICB1aS5pY29ucy5hZGQoKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBncm9rLnNoZWxsLmFkZFRhYmxlVmlldyhwYXJhbURmKTtcbiAgICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3Qgdmlld2VyIG9mIHBhcmFtVmlld2Vycykge1xuICAgICAgICAgICAgICAgIGlmICh2aWV3ZXIudHlwZSAhPSAnR3JpZCcpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZpZXdlciA9IGF3YWl0IHBhcmFtRGYucGxvdC5mcm9tVHlwZSh2aWV3ZXIudHlwZSkgYXMgREcuVmlld2VyO1xuICAgICAgICAgICAgICAgICAgbmV3Vmlld2VyLnNldE9wdGlvbnModmlld2VyLmdldE9wdGlvbnMoKSk7XG4gICAgICAgICAgICAgICAgICB2LmFkZFZpZXdlcihuZXdWaWV3ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICdBZGQgdG8gd29ya3NwYWNlJ1xuICAgICAgICAgICkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhlYWRlcjtcbiAgICB9O1xuXG4gICAgaWYgKGlzR3JpZFN3aXRjaGFibGUpIHtcbiAgICAgIGNvbnN0IGdyaWQgPSBwYXJhbURmLnBsb3QuZ3JpZCgpO1xuICAgICAgZ3JpZFdyYXBwZXIuYXBwZW5kQ2hpbGQoZ3JpZC5yb290KTtcbiAgICAgIGV4aXN0aW5nVmlld2Vycy5wdXNoKGdyaWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlciA9IGdldEhlYWRlcigpO1xuICAgIGNvbnN0IHdyYXBwZXIgPSB1aS5kaXZIKFtdLCB7c3R5bGU6IHtoZWlnaHQ6ICcxMDAlJ319KTtcbiAgICBwYXJhbVZpZXdlcnMuZm9yRWFjaCgodmlld2VyKSA9PiB7XG4gICAgICBpZiAodmlld2VyPy50YWdzID09IG51bGwpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGV4aXN0aW5nVmlld2VycyEucHVzaCh2aWV3ZXIpO1xuICAgICAgY29uc3Qgdmlld2VyU2l6ZSA9IHZpZXdlci50YWdzWycuYmxvY2stc2l6ZSddID8/IDEwMDsgLy8gZ2V0dGluZyBgKGJsb2NrOiAyNSlgIHZhbHVlOyBpZiBub3QgZGVmaW5lZCwgaXQgaXMgMTAwXG5cbiAgICAgIHZpZXdlci5yb290LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICAgIHZpZXdlci5yb290LmNsYXNzTGlzdC5hZGQoYHVpLWJsb2NrLSR7dmlld2VyU2l6ZX1gKTtcbiAgICAgIGlmIChibG9ja3MgKyB2aWV3ZXJTaXplIDw9IDEwMCkge1xuICAgICAgICB2aWV3ZXJzVG9IaWRlLnB1c2god3JhcHBlcik7XG4gICAgICAgIGJsb2NrV2lkdGggKz0gdmlld2VyU2l6ZTtcbiAgICAgIH1cbiAgICAgIGJsb2NrcyArPSB2aWV3ZXJTaXplO1xuICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZCh2aWV3ZXIucm9vdCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBibG9jayA9IHVpLmRpdlYoW2hlYWRlciwgd3JhcHBlciwgZ3JpZFdyYXBwZXJdLCB7c3R5bGU6IHtoZWlnaHQ6IGAke2hlaWdodH1weGAsIHdpZHRoOiBgJHtibG9ja1dpZHRofSVgfX0pO1xuICAgIGJsb2NrLmNsYXNzTGlzdC5hZGQoJ3VpLWJveCcpO1xuICAgIHRoaXMuYXBwZW5kUmVzdWx0RWxlbWVudChibG9jaywgb3B0aW9ucz8uY2F0ZWdvcnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBlbmRSZXN1bHRTY2FsYXIocGFyYW06IERHLkZ1bmNDYWxsUGFyYW0sIG9wdGlvbnM6IHsgY2FwdGlvbj86IHN0cmluZywgY2F0ZWdvcnk6IHN0cmluZywgaGVpZ2h0PzogbnVtYmVyIH0pIHtcbiAgICBjb25zdCBzcGFuID0gdWkuc3BhbihbYCR7b3B0aW9ucy5jYXB0aW9uID8/IHBhcmFtLm5hbWV9OiBgLCBgJHtwYXJhbS52YWx1ZX1gXSk7XG4gICAgaWYgKCF0aGlzLnBhcmFtU3BhbnMuZ2V0KHBhcmFtLm5hbWUpKSB7XG4gICAgICBpZiAodGhpcy5yZXN1bHRzVGFiQ29udHJvbClcbiAgICAgICAgdGhpcy5yZXN1bHRUYWJzLmdldChvcHRpb25zLmNhdGVnb3J5KSEuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMucmVzdWx0c0Rpdi5hcHBlbmRDaGlsZChzcGFuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJhbVNwYW5zLmdldChwYXJhbS5uYW1lKT8ucmVwbGFjZVdpdGgoc3Bhbik7XG4gICAgfVxuICAgIHRoaXMucGFyYW1TcGFucy5zZXQocGFyYW0ubmFtZSwgc3Bhbik7XG4gIH1cblxuICBwcml2YXRlIGFwcGVuZFJlc3VsdEVsZW1lbnQoZDogSFRNTEVsZW1lbnQsIGNhdGVnb3J5Pzogc3RyaW5nKSB7XG4gICAgaWYgKGNhdGVnb3J5ICE9IG51bGwgJiYgdGhpcy5yZXN1bHRzVGFiQ29udHJvbCAhPSB1bmRlZmluZWQgJiYgdGhpcy5yZXN1bHRUYWJzLmdldChjYXRlZ29yeSkgIT0gbnVsbClcbiAgICAgIHRoaXMucmVzdWx0VGFicy5nZXQoY2F0ZWdvcnkpIS5hcHBlbmRDaGlsZChkKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLnJlc3VsdHNEaXYuYXBwZW5kQ2hpbGQoZCk7XG4gIH1cbn1cblxuY29uc3QgZ2V0U2hlZXROYW1lID0gKG5hbWU6IHN0cmluZywgZGlyZWN0aW9uOiBESVJFQ1RJT04pID0+IHtcbiAgY29uc3QgaWRlYWxOYW1lID0gYCR7ZGlyZWN0aW9ufSAtICR7bmFtZX1gO1xuICByZXR1cm4gKGlkZWFsTmFtZS5sZW5ndGggPiAzMSkgPyBuYW1lLnN1YnN0cmluZygwLCAzMikgOiBpZGVhbE5hbWU7XG59O1xuXG5lbnVtIERJUkVDVElPTiB7XG4gIElOUFVUID0gJ0lucHV0JyxcbiAgT1VUUFVUID0gJ091dHB1dCdcbn1cblxuY29uc3Qgc2NhbGFyc1RvU2hlZXQgPSAoc2hlZXQ6IEV4Y2VsSlMuV29ya3NoZWV0LCBzY2FsYXJzOiB7IGNhcHRpb246IHN0cmluZywgdmFsdWU6IHN0cmluZywgdW5pdHM6IHN0cmluZyB9W10pID0+IHtcbiAgc2hlZXQuYWRkUm93KFsnUGFyYW1ldGVyJywgJ1ZhbHVlJywgJ1VuaXRzJ10pLmZvbnQgPSB7Ym9sZDogdHJ1ZX07XG4gIHNjYWxhcnMuZm9yRWFjaCgoc2NhbGFyKSA9PiB7XG4gICAgc2hlZXQuYWRkUm93KFtzY2FsYXIuY2FwdGlvbiwgc2NhbGFyLnZhbHVlLCBzY2FsYXIudW5pdHNdKTtcbiAgfSk7XG5cbiAgc2hlZXQuZ2V0Q29sdW1uKDEpLndpZHRoID0gTWF0aC5tYXgoXG4gICAgLi4uc2NhbGFycy5tYXAoKHNjYWxhcikgPT4gc2NhbGFyLmNhcHRpb24udG9TdHJpbmcoKS5sZW5ndGgpLCAnUGFyYW1ldGVyJy5sZW5ndGhcbiAgKSAqIDEuMjtcbiAgc2hlZXQuZ2V0Q29sdW1uKDIpLndpZHRoID0gTWF0aC5tYXgoLi4uc2NhbGFycy5tYXAoKHNjYWxhcikgPT4gc2NhbGFyLnZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoKSwgJ1ZhbHVlJy5sZW5ndGgpICogMS4yO1xuICBzaGVldC5nZXRDb2x1bW4oMykud2lkdGggPSBNYXRoLm1heCguLi5zY2FsYXJzLm1hcCgoc2NhbGFyKSA9PiBzY2FsYXIudW5pdHMudG9TdHJpbmcoKS5sZW5ndGgpLCAnVW5pdHMnLmxlbmd0aCkgKiAxLjI7XG59O1xuXG5jb25zdCBkZlRvU2hlZXQgPSAoc2hlZXQ6IEV4Y2VsSlMuV29ya3NoZWV0LCBkZjogREcuRGF0YUZyYW1lKSA9PiB7XG4gIGNvbnNvbGUubG9nKGRmKTtcbiAgc2hlZXQuYWRkUm93KGRmLmNvbHVtbnMubmFtZXMoKSkuZm9udCA9IHtib2xkOiB0cnVlfTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZi5yb3dDb3VudDsgaSsrKVxuICAgIHNoZWV0LmFkZFJvdyhbLi4uZGYucm93KGkpLmNlbGxzXS5tYXAoKGNlbGw6IERHLkNlbGwpID0+IGNlbGwudmFsdWUpKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRmLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICBzaGVldC5nZXRDb2x1bW4oaSArIDEpLndpZHRoID1cbiAgICAgIE1hdGgubWF4KFxuICAgICAgICAuLi5kZi5jb2x1bW5zLmJ5SW5kZXgoaSkuY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS50b1N0cmluZygpLmxlbmd0aCksXG4gICAgICAgIGRmLmNvbHVtbnMuYnlJbmRleChpKS5uYW1lLmxlbmd0aFxuICAgICAgKSAqIDEuMjtcbiAgfVxufTtcblxuY29uc3QgcGxvdFRvU2hlZXQgPSBhc3luYyAoZXhwb3J0V2I6IEV4Y2VsSlMuV29ya2Jvb2ssIHNoZWV0OiBFeGNlbEpTLldvcmtzaGVldCwgcGxvdDogSFRNTEVsZW1lbnQsIGNvbHVtbkZvckltYWdlOiBudW1iZXIsIHJvd0ZvckltYWdlOiBudW1iZXIgPSAwKSA9PiB7XG4gIGNvbnN0IGNhbnZhcyA9IGF3YWl0IGh0bWwyY2FudmFzKHBsb3QgYXMgSFRNTEVsZW1lbnQsIHtsb2dnaW5nOiBmYWxzZX0pO1xuICBjb25zdCBkYXRhVXJsID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG5cbiAgY29uc3QgaW1hZ2VJZCA9IGV4cG9ydFdiLmFkZEltYWdlKHtcbiAgICBiYXNlNjQ6IGRhdGFVcmwsXG4gICAgZXh0ZW5zaW9uOiAncG5nJyxcbiAgfSk7XG4gIHNoZWV0LmFkZEltYWdlKGltYWdlSWQsIHtcbiAgICB0bDoge2NvbDogY29sdW1uRm9ySW1hZ2UsIHJvdzogcm93Rm9ySW1hZ2V9LFxuICAgIGV4dDoge3dpZHRoOiBjYW52YXMud2lkdGgsIGhlaWdodDogY2FudmFzLmhlaWdodH0sXG4gIH0pO1xufTtcbiJdfQ==
|