@firestitch/report 18.10.1 → 18.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/reports/components/component-text/component-text.component.d.ts +1 -0
- package/app/reports/components/component-text/value-embed.plugin.d.ts +25 -1
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +12 -0
- package/app/reports/components/report-component/report-component.component.d.ts +1 -0
- package/app/reports/data/report.data.d.ts +2 -2
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +13 -1
- package/app/reports/export/report-export-collector.service.d.ts +13 -5
- package/app/reports/export/report-filter-lines.d.ts +3 -0
- package/app/reports/filter-text.d.ts +8 -0
- package/app/reports/format.d.ts +1 -0
- package/app/reports/interfaces/report-export-lines-input.interface.d.ts +1 -0
- package/app/reports/report-filter-items.d.ts +9 -0
- package/app/reports/text.d.ts +16 -0
- package/esm2022/app/reports/components/component-text/component-text.component.mjs +34 -22
- package/esm2022/app/reports/components/component-text/value-embed.plugin.mjs +254 -42
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +118 -13
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +30 -11
- package/esm2022/app/reports/data/report.data.mjs +12 -7
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +57 -14
- package/esm2022/app/reports/export/report-export-collector.service.mjs +84 -33
- package/esm2022/app/reports/export/report-filter-lines.mjs +25 -8
- package/esm2022/app/reports/export/report-pdf.service.mjs +31 -21
- package/esm2022/app/reports/export/report-pptx.service.mjs +21 -11
- package/esm2022/app/reports/filter-text.mjs +154 -0
- package/esm2022/app/reports/format.mjs +3 -2
- package/esm2022/app/reports/interfaces/report-export-lines-input.interface.mjs +1 -1
- package/esm2022/app/reports/report-filter-items.mjs +24 -2
- package/esm2022/app/reports/text.mjs +59 -13
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +14 -11
- package/esm2022/app/reports/views/report/report.component.mjs +15 -12
- package/fesm2022/{firestitch-report-echarts-DHEH_K_q.mjs → firestitch-report-echarts-CyHkFToO.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-DHEH_K_q.mjs.map → firestitch-report-echarts-CyHkFToO.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-ZcHTnNKq.mjs → firestitch-report-firestitch-report-DftB7M1o.mjs} +2653 -1955
- package/fesm2022/firestitch-report-firestitch-report-DftB7M1o.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/fesm2022/firestitch-report-firestitch-report-ZcHTnNKq.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Plugin } from '@firestitch/html-editor';
|
|
2
|
-
import { VALUE_TOKEN_PATTERN, valueText, valueToken } from '../../text';
|
|
2
|
+
import { FIELD_TOKEN_PATTERN, VALUE_TOKEN_PATTERN, fieldText, fieldToken, textFields, valueText, valueToken, } from '../../text';
|
|
3
3
|
// How a value chip is marked in the editor. The names follow the embeds of
|
|
4
4
|
// @firestitch/markdown-editor. Attributes rather than a class: the report keeps
|
|
5
5
|
// Froala on inline styles (useClasses: false), and a chip never reaches storage
|
|
@@ -9,11 +9,23 @@ const KEY_ATTRIBUTE = 'data-embed-key';
|
|
|
9
9
|
const MISSING_ATTRIBUTE = 'data-embed-missing';
|
|
10
10
|
const CHIP_SELECTOR = `[${KEY_ATTRIBUTE}]`;
|
|
11
11
|
const VALUE_TYPE = 'value';
|
|
12
|
+
// A field chip ({{page.number}}, {{filter.12}}, …) is marked by its field
|
|
13
|
+
// instead of a key. It has nothing behind it, so none of the guards on value
|
|
14
|
+
// chips (CHIP_SELECTOR) apply to it.
|
|
15
|
+
const FIELD_ATTRIBUTE = 'data-embed-field';
|
|
16
|
+
const FIELD_SELECTOR = `[${FIELD_ATTRIBUTE}]`;
|
|
17
|
+
const FIELD_TYPE = 'field';
|
|
18
|
+
// Either kind of chip.
|
|
19
|
+
const EMBED_SELECTOR = `${CHIP_SELECTOR}, ${FIELD_SELECTOR}`;
|
|
12
20
|
// The page a copy came from, on the clipboard beside its text: values belong
|
|
13
21
|
// to their page, so a value pasted onto another one doesn't come with it.
|
|
14
22
|
const SCOPE_TYPE = 'application/x-fs-report-value-scope';
|
|
15
23
|
// What Froala must keep on a chip when it cleans html it is handed.
|
|
16
|
-
export const VALUE_EMBED_ATTRIBUTES = [
|
|
24
|
+
export const VALUE_EMBED_ATTRIBUTES = [
|
|
25
|
+
TYPE_ATTRIBUTE, KEY_ATTRIBUTE, FIELD_ATTRIBUTE, MISSING_ATTRIBUTE, 'contenteditable',
|
|
26
|
+
];
|
|
27
|
+
// The list inside a Froala dropdown (Froala's own markup).
|
|
28
|
+
const DROPDOWN_LIST_SELECTOR = '.fr-dropdown-list';
|
|
17
29
|
// A brief ring around the chips an edit was stopped at.
|
|
18
30
|
const FLASH = [{ boxShadow: '0 0 0 2px #e15759' }, { boxShadow: '0 0 0 2px transparent' }];
|
|
19
31
|
const FLASH_MS = 700;
|
|
@@ -29,7 +41,13 @@ const HISTORY_COMMANDS = ['undo', 'redo'];
|
|
|
29
41
|
const MODIFIER_KEYS = ['Shift', 'Control', 'Alt', 'AltGraph', 'Meta'];
|
|
30
42
|
// The cells of a table selected as cells (Froala's own marking).
|
|
31
43
|
const SELECTED_CELL = '.fr-selected-cell';
|
|
32
|
-
//
|
|
44
|
+
// The token a chip of either kind stands for.
|
|
45
|
+
function chipToken(chip) {
|
|
46
|
+
return chip.hasAttribute(FIELD_ATTRIBUTE)
|
|
47
|
+
? fieldToken(chip.getAttribute(FIELD_ATTRIBUTE))
|
|
48
|
+
: valueToken(chip.getAttribute(KEY_ATTRIBUTE));
|
|
49
|
+
}
|
|
50
|
+
// Live values and fields inside a text block's editor.
|
|
33
51
|
//
|
|
34
52
|
// Stored html carries a value as a {{value.key}} token. While editing, each
|
|
35
53
|
// token is a chip: one character to the cursor, labeled with the value, and
|
|
@@ -46,6 +64,13 @@ const SELECTED_CELL = '.fr-selected-cell';
|
|
|
46
64
|
// emptying several selected cells, goes through with the chips in it, and is
|
|
47
65
|
// reported as removed() when it took a value's last chip, with the undo that
|
|
48
66
|
// brings them back.
|
|
67
|
+
//
|
|
68
|
+
// A page, report or filter field ({{page.number}}, {{filter.12}}, …) edits as
|
|
69
|
+
// a field chip the same way — one character, labeled, back to its token on the
|
|
70
|
+
// way out — but nothing guards it: a field has nothing behind it to lose.
|
|
71
|
+
// Backspace or Delete takes it out like a character, a selection holding one
|
|
72
|
+
// deletes as any other, and a copy or a cut carries its token to any block of
|
|
73
|
+
// the report. A field chip reports no click.
|
|
49
74
|
export class ValueEmbedPlugin extends Plugin {
|
|
50
75
|
// The editor this plugin serves; null until it is built, and after it is gone.
|
|
51
76
|
_editor = null;
|
|
@@ -94,13 +119,14 @@ export class ValueEmbedPlugin extends Plugin {
|
|
|
94
119
|
});
|
|
95
120
|
this._domListeners = [
|
|
96
121
|
['beforeinput', (event) => this._onBeforeInput(event)],
|
|
97
|
-
['cut', (event) => this.
|
|
122
|
+
['cut', (event) => this._onCut(event)],
|
|
98
123
|
['dragstart', (event) => this._guardSelection(event)],
|
|
99
124
|
['copy', (event) => this._onCopy(event)],
|
|
100
125
|
['click', (event) => this._onClick(event)],
|
|
101
126
|
];
|
|
102
127
|
this._domListeners.forEach(([name, listener]) => el.addEventListener(name, listener, true));
|
|
103
128
|
this._toChips();
|
|
129
|
+
this._fillMenu();
|
|
104
130
|
}
|
|
105
131
|
destroy() {
|
|
106
132
|
const el = this._editor?.el;
|
|
@@ -108,9 +134,50 @@ export class ValueEmbedPlugin extends Plugin {
|
|
|
108
134
|
this._domListeners = [];
|
|
109
135
|
this._editor = null;
|
|
110
136
|
}
|
|
111
|
-
// Relabel every chip: the values arrived or changed, or names
|
|
137
|
+
// Relabel every chip: the values or the fields arrived or changed, or names
|
|
138
|
+
// were toggled. The insert menu follows the values and filters too.
|
|
112
139
|
refresh() {
|
|
113
140
|
this._chips().forEach((chip) => this._label(chip));
|
|
141
|
+
this._fieldChips().forEach((chip) => this._labelField(chip));
|
|
142
|
+
this._fillMenu();
|
|
143
|
+
}
|
|
144
|
+
// Put a token in at the cursor as its chip, in place of any selection: the
|
|
145
|
+
// insert menu. A value comes in as a chip like any other, guarded and read
|
|
146
|
+
// by the block from then on; a field as a field chip. It runs as the menu's
|
|
147
|
+
// toolbar command, so a selection holding values is replaced, and reported,
|
|
148
|
+
// as by any command.
|
|
149
|
+
insert(token) {
|
|
150
|
+
const [embed] = this._embedTokens(token);
|
|
151
|
+
const chip = embed ? this._tokenChip(embed, false) : null;
|
|
152
|
+
const range = chip ? this._range() : null;
|
|
153
|
+
if (!range) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
// The chip goes in where the selection ends, and the selection up to it
|
|
157
|
+
// then comes out through Froala's own delete, the one typing over a
|
|
158
|
+
// selection runs, so paragraphs it spans join as for a typed character.
|
|
159
|
+
// The browser's delete would raise an input event, which Froala saves as
|
|
160
|
+
// an undo step of its own; this one raises none, so one undo takes the
|
|
161
|
+
// whole insert back. And with the chip already between them, the spaces
|
|
162
|
+
// either side of the selection never meet, so neither turns into a
|
|
163
|
+
// non-breaking space.
|
|
164
|
+
const selected = this._inBlocks(range);
|
|
165
|
+
const end = selected.cloneRange();
|
|
166
|
+
end.collapse(false);
|
|
167
|
+
end.insertNode(chip);
|
|
168
|
+
const selection = this._selection();
|
|
169
|
+
if (!selected.collapsed) {
|
|
170
|
+
selected.setEndBefore(chip);
|
|
171
|
+
selection.removeAllRanges();
|
|
172
|
+
selection.addRange(selected);
|
|
173
|
+
this._editor.selection.remove();
|
|
174
|
+
}
|
|
175
|
+
// The cursor goes after the chip, so typing carries on behind it.
|
|
176
|
+
const caret = document.createRange();
|
|
177
|
+
caret.setStartAfter(chip);
|
|
178
|
+
caret.collapse(true);
|
|
179
|
+
selection.removeAllRanges();
|
|
180
|
+
selection.addRange(caret);
|
|
114
181
|
}
|
|
115
182
|
// Put Froala's floating toolbar and a table's popup away, when either is
|
|
116
183
|
// already up as a chip's popover opens: they sit above every overlay.
|
|
@@ -153,6 +220,42 @@ export class ValueEmbedPlugin extends Plugin {
|
|
|
153
220
|
? Array.from(this._editor.el.querySelectorAll(CHIP_SELECTOR))
|
|
154
221
|
: [];
|
|
155
222
|
}
|
|
223
|
+
_fieldChips() {
|
|
224
|
+
return this._editor
|
|
225
|
+
? Array.from(this._editor.el.querySelectorAll(FIELD_SELECTOR))
|
|
226
|
+
: [];
|
|
227
|
+
}
|
|
228
|
+
// Froala writes a dropdown's list once, as its toolbar is built, from the
|
|
229
|
+
// options registered for the command (globally, for every editor), and puts
|
|
230
|
+
// a title on each entry. So the insert menu is filled here instead, for this
|
|
231
|
+
// editor, from what its block has now, and again as that changes. No title:
|
|
232
|
+
// hovering an entry shows nothing.
|
|
233
|
+
_fillMenu() {
|
|
234
|
+
const toolbar = this._editor?.$tb?.get(0);
|
|
235
|
+
const button = toolbar?.querySelector(`.fr-dropdown[data-cmd="${this.config.menu.command}"]`);
|
|
236
|
+
const list = button
|
|
237
|
+
? toolbar.querySelector(`[id="${button.getAttribute('aria-controls')}"] ${DROPDOWN_LIST_SELECTOR}`)
|
|
238
|
+
: null;
|
|
239
|
+
if (!list) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
list.replaceChildren(...this.config.menu.entries().map((entry) => this._menuItem(entry)));
|
|
243
|
+
}
|
|
244
|
+
// An entry as Froala writes one: choosing it runs the command with the
|
|
245
|
+
// token.
|
|
246
|
+
_menuItem(entry) {
|
|
247
|
+
const option = document.createElement('a');
|
|
248
|
+
option.className = 'fr-command';
|
|
249
|
+
option.tabIndex = -1;
|
|
250
|
+
option.setAttribute('role', 'option');
|
|
251
|
+
option.setAttribute('data-cmd', this.config.menu.command);
|
|
252
|
+
option.setAttribute('data-param1', entry.token);
|
|
253
|
+
option.textContent = entry.name;
|
|
254
|
+
const item = document.createElement('li');
|
|
255
|
+
item.setAttribute('role', 'presentation');
|
|
256
|
+
item.append(option);
|
|
257
|
+
return item;
|
|
258
|
+
}
|
|
156
259
|
// How many chips each key has in the block.
|
|
157
260
|
_chipCounts() {
|
|
158
261
|
const counts = new Map();
|
|
@@ -209,7 +312,11 @@ export class ValueEmbedPlugin extends Plugin {
|
|
|
209
312
|
return false;
|
|
210
313
|
}
|
|
211
314
|
this._before = HISTORY_COMMANDS.includes(command) ? null : this._chipCounts();
|
|
212
|
-
|
|
315
|
+
// The insert menu puts a chip in itself, among chips that stay chips: as
|
|
316
|
+
// tokens they would take a cursor just after one to before it.
|
|
317
|
+
if (command !== this.config.menu.command) {
|
|
318
|
+
this._toTokenText();
|
|
319
|
+
}
|
|
213
320
|
}
|
|
214
321
|
// Whether the caret sits inside an element of this editor that `selector`
|
|
215
322
|
// matches.
|
|
@@ -217,9 +324,10 @@ export class ValueEmbedPlugin extends Plugin {
|
|
|
217
324
|
const container = this._editor.selection.element()?.closest?.(selector) ?? null;
|
|
218
325
|
return !!container && this._editor.el.contains(container);
|
|
219
326
|
}
|
|
220
|
-
// Turn every {{value.key}} token in the editor's text into a chip.
|
|
221
|
-
// paste, a token only stays when it was copied on this page and
|
|
222
|
-
// the value; otherwise it goes, and just the text around it is
|
|
327
|
+
// Turn every {{value.key}} and field token in the editor's text into a chip.
|
|
328
|
+
// For a paste, a value's token only stays when it was copied on this page and
|
|
329
|
+
// the page has the value; otherwise it goes, and just the text around it is
|
|
330
|
+
// pasted. A field's always stays: fields belong to the whole report.
|
|
223
331
|
_toChips(pasted = false) {
|
|
224
332
|
const el = this._editor?.el;
|
|
225
333
|
if (!el) {
|
|
@@ -229,7 +337,7 @@ export class ValueEmbedPlugin extends Plugin {
|
|
|
229
337
|
const texts = [];
|
|
230
338
|
while (walker.nextNode()) {
|
|
231
339
|
const text = walker.currentNode;
|
|
232
|
-
if (text.data.includes('{{') && !text.parentElement?.closest(
|
|
340
|
+
if (text.data.includes('{{') && !text.parentElement?.closest(EMBED_SELECTOR)) {
|
|
233
341
|
texts.push(text);
|
|
234
342
|
}
|
|
235
343
|
}
|
|
@@ -239,8 +347,8 @@ export class ValueEmbedPlugin extends Plugin {
|
|
|
239
347
|
return this._pasteScope === this.config.scope() && !!this.config.values()[key];
|
|
240
348
|
}
|
|
241
349
|
_splitText(text, pasted) {
|
|
242
|
-
const
|
|
243
|
-
if (!
|
|
350
|
+
const tokens = this._embedTokens(text.data);
|
|
351
|
+
if (!tokens.length) {
|
|
244
352
|
return;
|
|
245
353
|
}
|
|
246
354
|
// Only non-empty text around the chips, so a selection counted in child
|
|
@@ -252,20 +360,41 @@ export class ValueEmbedPlugin extends Plugin {
|
|
|
252
360
|
}
|
|
253
361
|
};
|
|
254
362
|
let consumed = 0;
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
if (
|
|
259
|
-
fragment.append(
|
|
363
|
+
tokens.forEach((token) => {
|
|
364
|
+
appendText(text.data.slice(consumed, token.index));
|
|
365
|
+
const chip = this._tokenChip(token, pasted);
|
|
366
|
+
if (chip) {
|
|
367
|
+
fragment.append(chip);
|
|
260
368
|
}
|
|
261
|
-
consumed =
|
|
369
|
+
consumed = token.index + token.length;
|
|
262
370
|
});
|
|
263
371
|
appendText(text.data.slice(consumed));
|
|
264
372
|
text.replaceWith(fragment);
|
|
265
373
|
}
|
|
374
|
+
// The value and field tokens in a text, in order.
|
|
375
|
+
_embedTokens(text) {
|
|
376
|
+
const values = Array.from(text.matchAll(VALUE_TOKEN_PATTERN), (match) => ({
|
|
377
|
+
index: match.index,
|
|
378
|
+
length: match[0].length,
|
|
379
|
+
key: match[1].toLowerCase(),
|
|
380
|
+
}));
|
|
381
|
+
const fields = Array.from(text.matchAll(FIELD_TOKEN_PATTERN), (match) => ({
|
|
382
|
+
index: match.index,
|
|
383
|
+
length: match[0].length,
|
|
384
|
+
field: match[1].toLowerCase(),
|
|
385
|
+
}));
|
|
386
|
+
return [...values, ...fields].sort((a, b) => a.index - b.index);
|
|
387
|
+
}
|
|
388
|
+
// The chip a token edits as; null for a pasted value that does not stay.
|
|
389
|
+
_tokenChip(token, pasted) {
|
|
390
|
+
if (token.field) {
|
|
391
|
+
return this._createFieldChip(token.field);
|
|
392
|
+
}
|
|
393
|
+
return !pasted || this._keepsPasted(token.key) ? this._createChip(token.key) : null;
|
|
394
|
+
}
|
|
266
395
|
// Every chip in the editor back to its token, as text.
|
|
267
396
|
_toTokenText() {
|
|
268
|
-
this._chips().forEach((chip) => chip.replaceWith(
|
|
397
|
+
[...this._chips(), ...this._fieldChips()].forEach((chip) => chip.replaceWith(chipToken(chip)));
|
|
269
398
|
}
|
|
270
399
|
_createChip(key) {
|
|
271
400
|
const chip = document.createElement('span');
|
|
@@ -285,19 +414,43 @@ export class ValueEmbedPlugin extends Plugin {
|
|
|
285
414
|
chip.textContent = !value
|
|
286
415
|
? key
|
|
287
416
|
: this.config.showNames() ? value.name : valueText(value);
|
|
288
|
-
|
|
417
|
+
// Named for screen readers only: a title would pop the browser's own
|
|
418
|
+
// tooltip on hover, and a chip's name is shown by its popover on click.
|
|
419
|
+
chip.setAttribute('aria-label', value?.name ?? key);
|
|
289
420
|
chip.toggleAttribute(MISSING_ATTRIBUTE, !value);
|
|
290
421
|
}
|
|
422
|
+
_createFieldChip(field) {
|
|
423
|
+
const chip = document.createElement('span');
|
|
424
|
+
chip.setAttribute(TYPE_ATTRIBUTE, FIELD_TYPE);
|
|
425
|
+
chip.setAttribute(FIELD_ATTRIBUTE, field);
|
|
426
|
+
chip.setAttribute('contenteditable', 'false');
|
|
427
|
+
this._labelField(chip);
|
|
428
|
+
return chip;
|
|
429
|
+
}
|
|
430
|
+
// A field chip reads as the field does in the viewed block, or as its name
|
|
431
|
+
// ('Page number', the filter's label) when names are toggled on. One whose
|
|
432
|
+
// text is empty, a blank keyword filter, reads as its name, so it can still
|
|
433
|
+
// be seen. A filter the block cannot read (the report has no group of it,
|
|
434
|
+
// or it is another page's page filter) reads as the field itself, marked
|
|
435
|
+
// missing. Named for screen readers only, as a value chip is.
|
|
436
|
+
_labelField(chip) {
|
|
437
|
+
const field = chip.getAttribute(FIELD_ATTRIBUTE);
|
|
438
|
+
const context = this.config.fields();
|
|
439
|
+
const name = textFields(context).find((entry) => entry.field === field)?.name;
|
|
440
|
+
chip.textContent = !name
|
|
441
|
+
? field
|
|
442
|
+
: this.config.showNames() ? name : fieldText(field, context) || name;
|
|
443
|
+
chip.setAttribute('aria-label', name ?? field);
|
|
444
|
+
chip.toggleAttribute(MISSING_ATTRIBUTE, !name);
|
|
445
|
+
}
|
|
291
446
|
// The html Froala hands out, with every chip back to its token.
|
|
292
447
|
_toTokens(html) {
|
|
293
|
-
if (!html.includes(KEY_ATTRIBUTE)) {
|
|
448
|
+
if (!html.includes(KEY_ATTRIBUTE) && !html.includes(FIELD_ATTRIBUTE)) {
|
|
294
449
|
return html;
|
|
295
450
|
}
|
|
296
451
|
const template = document.createElement('template');
|
|
297
452
|
template.innerHTML = html;
|
|
298
|
-
template.content.querySelectorAll(
|
|
299
|
-
chip.replaceWith(valueToken(chip.getAttribute(KEY_ATTRIBUTE)));
|
|
300
|
-
});
|
|
453
|
+
template.content.querySelectorAll(EMBED_SELECTOR).forEach((chip) => chip.replaceWith(chipToken(chip)));
|
|
301
454
|
return template.innerHTML;
|
|
302
455
|
}
|
|
303
456
|
_onKeydown(event) {
|
|
@@ -322,8 +475,12 @@ export class ValueEmbedPlugin extends Plugin {
|
|
|
322
475
|
if (!deleting) {
|
|
323
476
|
return;
|
|
324
477
|
}
|
|
325
|
-
const
|
|
326
|
-
|
|
478
|
+
const backward = event.key === 'Backspace';
|
|
479
|
+
const granularity = this._granularity(event);
|
|
480
|
+
const chip = this._adjacentChip(backward, granularity);
|
|
481
|
+
return chip
|
|
482
|
+
? this._block(event, [chip], null)
|
|
483
|
+
: this._removeAdjacentField(event, backward, granularity);
|
|
327
484
|
}
|
|
328
485
|
// A selection is replaced by a deleting key, Enter, a typed character or
|
|
329
486
|
// a cut.
|
|
@@ -366,19 +523,45 @@ export class ValueEmbedPlugin extends Plugin {
|
|
|
366
523
|
const chips = this._chipsIn(range);
|
|
367
524
|
return chips.length ? this._block(event, chips, range) : undefined;
|
|
368
525
|
}
|
|
369
|
-
//
|
|
370
|
-
//
|
|
371
|
-
//
|
|
526
|
+
// Backspace or Delete beside a field chip takes it out like one character,
|
|
527
|
+
// with no prompt: a field has nothing behind it to lose. Done here, as a
|
|
528
|
+
// value's guard would be, rather than left to Froala's own handling of a
|
|
529
|
+
// non-editable element.
|
|
530
|
+
_removeAdjacentField(event, backward, granularity) {
|
|
531
|
+
const reach = this._reach(backward, granularity);
|
|
532
|
+
if (!reach || !this._fieldChipsIn(reach).length) {
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
event.preventDefault();
|
|
536
|
+
event.stopPropagation();
|
|
537
|
+
this._removeRange(reach);
|
|
538
|
+
return false;
|
|
539
|
+
}
|
|
540
|
+
// Cut: stopped when the selection holds a value. One holding a field puts
|
|
541
|
+
// its tokens on the clipboard as a copy does, and so is deleted here: a cut
|
|
542
|
+
// that writes its own clipboard deletes nothing.
|
|
543
|
+
_onCut(event) {
|
|
544
|
+
const range = this._range();
|
|
545
|
+
if (this._guardSelection(event) === false || !range || range.collapsed || !this._fieldChipsIn(range).length) {
|
|
546
|
+
return;
|
|
547
|
+
}
|
|
548
|
+
this._copyTokens(event, range);
|
|
549
|
+
this._removeRange(range);
|
|
550
|
+
}
|
|
551
|
+
// Copying a chip copies its token, so pasting it makes it a chip again: a
|
|
552
|
+
// field's in any block of the report, a value's on the page it was copied
|
|
553
|
+
// on — in this block or another — which goes on the clipboard beside it.
|
|
372
554
|
_onCopy(event) {
|
|
373
555
|
const range = this._range();
|
|
374
|
-
if (!range || range.collapsed || !this._chipsIn(range).length) {
|
|
556
|
+
if (!range || range.collapsed || !(this._chipsIn(range).length || this._fieldChipsIn(range).length)) {
|
|
375
557
|
return;
|
|
376
558
|
}
|
|
559
|
+
this._copyTokens(event, range);
|
|
560
|
+
}
|
|
561
|
+
_copyTokens(event, range) {
|
|
377
562
|
const holder = document.createElement('div');
|
|
378
563
|
holder.append(range.cloneContents());
|
|
379
|
-
holder.querySelectorAll(
|
|
380
|
-
chip.replaceWith(valueToken(chip.getAttribute(KEY_ATTRIBUTE)));
|
|
381
|
-
});
|
|
564
|
+
holder.querySelectorAll(EMBED_SELECTOR).forEach((chip) => chip.replaceWith(chipToken(chip)));
|
|
382
565
|
event.clipboardData.setData('text/plain', this._plainText(holder));
|
|
383
566
|
event.clipboardData.setData('text/html', holder.innerHTML);
|
|
384
567
|
event.clipboardData.setData(SCOPE_TYPE, this.config.scope());
|
|
@@ -454,23 +637,52 @@ export class ValueEmbedPlugin extends Plugin {
|
|
|
454
637
|
const range = selection.getRangeAt(0);
|
|
455
638
|
return this._editor.el.contains(range.commonAncestorContainer) ? range : null;
|
|
456
639
|
}
|
|
640
|
+
// A copy of the range with an end that sits in the editor itself, between
|
|
641
|
+
// blocks (as some browsers leave select-all), moved inside the block beside
|
|
642
|
+
// it, so a chip put at that end lands in a block.
|
|
643
|
+
_inBlocks(range) {
|
|
644
|
+
const root = this._editor.el;
|
|
645
|
+
const inner = range.cloneRange();
|
|
646
|
+
const first = range.startContainer === root ? root.childNodes[range.startOffset] : null;
|
|
647
|
+
if (first && this._editor.node.isBlock(first)) {
|
|
648
|
+
inner.setStart(this._edgeBlock(first, false), 0);
|
|
649
|
+
}
|
|
650
|
+
const last = range.endContainer === root ? root.childNodes[range.endOffset - 1] : null;
|
|
651
|
+
if (last && this._editor.node.isBlock(last)) {
|
|
652
|
+
const block = this._edgeBlock(last, true);
|
|
653
|
+
inner.setEnd(block, block.childNodes.length);
|
|
654
|
+
}
|
|
655
|
+
return inner;
|
|
656
|
+
}
|
|
657
|
+
// The innermost first or last block of a block: a list's item, a table's
|
|
658
|
+
// cell.
|
|
659
|
+
_edgeBlock(block, last) {
|
|
660
|
+
const child = last ? block.lastElementChild : block.firstElementChild;
|
|
661
|
+
return child && this._editor.node.isBlock(child) ? this._edgeBlock(child, last) : block;
|
|
662
|
+
}
|
|
457
663
|
_chipsIn(range) {
|
|
458
664
|
return this._chips().filter((chip) => range.intersectsNode(chip));
|
|
459
665
|
}
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
//
|
|
666
|
+
_fieldChipsIn(range) {
|
|
667
|
+
return this._fieldChips().filter((chip) => range.intersectsNode(chip));
|
|
668
|
+
}
|
|
669
|
+
// The chip a collapsed cursor would delete into.
|
|
464
670
|
_adjacentChip(backward, granularity) {
|
|
671
|
+
const reach = this._reach(backward, granularity);
|
|
672
|
+
return reach ? this._chipsIn(reach)[0] ?? null : null;
|
|
673
|
+
}
|
|
674
|
+
// What a deleting key would take from a collapsed cursor: stretch the
|
|
675
|
+
// selection by what the key deletes, keep what it covers, and put it back.
|
|
676
|
+
// Letting the browser stretch it handles every shape the html takes — a
|
|
677
|
+
// chip inside a bold span, at a line's end, beside an empty text node.
|
|
678
|
+
_reach(backward, granularity) {
|
|
465
679
|
const selection = this._selection();
|
|
466
680
|
const range = selection.getRangeAt(0).cloneRange();
|
|
467
681
|
selection.modify('extend', backward ? 'backward' : 'forward', granularity);
|
|
468
|
-
const
|
|
469
|
-
? this._chipsIn(selection.getRangeAt(0))[0] ?? null
|
|
470
|
-
: null;
|
|
682
|
+
const reach = selection.rangeCount ? selection.getRangeAt(0).cloneRange() : null;
|
|
471
683
|
selection.removeAllRanges();
|
|
472
684
|
selection.addRange(range);
|
|
473
|
-
return
|
|
685
|
+
return reach;
|
|
474
686
|
}
|
|
475
687
|
// How far a deleting key reaches: a word with Ctrl/Alt, to the line's start
|
|
476
688
|
// with Cmd on a Mac, one character otherwise.
|
|
@@ -481,4 +693,4 @@ export class ValueEmbedPlugin extends Plugin {
|
|
|
481
693
|
return event.ctrlKey || event.altKey ? 'word' : 'character';
|
|
482
694
|
}
|
|
483
695
|
}
|
|
484
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWUtZW1iZWQucGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LXRleHQvdmFsdWUtZW1iZWQucGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQWdCLE1BQU0seUJBQXlCLENBQUM7QUFFL0QsT0FBTyxFQUFhLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHbkYsMkVBQTJFO0FBQzNFLGdGQUFnRjtBQUNoRixnRkFBZ0Y7QUFDaEYsc0VBQXNFO0FBQ3RFLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDO0FBQ3pDLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDO0FBQ3ZDLE1BQU0saUJBQWlCLEdBQUcsb0JBQW9CLENBQUM7QUFDL0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxhQUFhLEdBQUcsQ0FBQztBQUMzQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUM7QUFFM0IsNkVBQTZFO0FBQzdFLDBFQUEwRTtBQUMxRSxNQUFNLFVBQVUsR0FBRyxxQ0FBcUMsQ0FBQztBQUV6RCxvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxjQUFjLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFFNUcsd0RBQXdEO0FBQ3hELE1BQU0sS0FBSyxHQUFlLENBQUMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSx1QkFBdUIsRUFBRSxDQUFDLENBQUM7QUFDdkcsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBRXJCLCtFQUErRTtBQUMvRSwyRUFBMkU7QUFDM0UsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUM3RCxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUM7QUFDckMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFDbEUsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDO0FBRXRCLGtFQUFrRTtBQUNsRSxNQUFNLGdCQUFnQixHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRTFDLDBDQUEwQztBQUMxQyxNQUFNLGFBQWEsR0FBRyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUV0RSxpRUFBaUU7QUFDakUsTUFBTSxhQUFhLEdBQUcsbUJBQW1CLENBQUM7QUEwQzFDLDRDQUE0QztBQUM1QyxFQUFFO0FBQ0YsNEVBQTRFO0FBQzVFLDRFQUE0RTtBQUM1RSw2RUFBNkU7QUFDN0Usd0NBQXdDO0FBQ3hDLEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw4REFBOEQ7QUFDOUQsMEVBQTBFO0FBQzFFLEVBQUU7QUFDRixzRUFBc0U7QUFDdEUsNkVBQTZFO0FBQzdFLDZFQUE2RTtBQUM3RSxvQkFBb0I7QUFDcEIsTUFBTSxPQUFPLGdCQUFpQixTQUFRLE1BQU07SUFLMUMsK0VBQStFO0lBQ3ZFLE9BQU8sR0FBUSxJQUFJLENBQUM7SUFDNUIscUVBQXFFO0lBQzdELFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDMUIsMkVBQTJFO0lBQzNFLGtDQUFrQztJQUMxQixhQUFhLEdBQThCLEVBQUUsQ0FBQztJQUN0RCx5RUFBeUU7SUFDakUsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUN6Qix5RUFBeUU7SUFDekUsb0RBQW9EO0lBQzVDLE9BQU8sR0FBK0IsSUFBSSxDQUFDO0lBRW5ELFlBQVksTUFBOEI7UUFDeEMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRU0sVUFBVTtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLE1BQU0sRUFBRSxHQUFnQixNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRXRCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNwRCxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckUseUVBQXlFO1FBQ3pFLGVBQWU7UUFDZixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFvQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDLEtBQXFCLEVBQUUsRUFBRTtZQUN6RCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssRUFBRSxhQUFhLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVuRSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFDSCx3RUFBd0U7UUFDeEUsdUVBQXVFO1FBQ3ZFLGVBQWU7UUFDZixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyRyx3RUFBd0U7UUFDeEUsb0NBQW9DO1FBQ3BDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7WUFDL0IsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNuQixDQUFDLGFBQWEsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFtQixDQUFDLENBQUM7WUFDcEUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckQsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBdUIsQ0FBQyxDQUFDO1lBQzFELENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQW1CLENBQUMsQ0FBQztTQUN6RCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUU1RixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVNLE9BQU87UUFDWixNQUFNLEVBQUUsR0FBNEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDckQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLG1CQUFtQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNoRyxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBRUQsNEVBQTRFO0lBQ3JFLE9BQU87UUFDWixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSxzRUFBc0U7SUFDL0QsV0FBVztRQUNoQixJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSxZQUFZO0lBQ0wsSUFBSTtRQUNULElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxzRUFBc0U7SUFDL0QsU0FBUyxDQUFDLEdBQVc7UUFDMUIsSUFBSSxDQUFDLE1BQU0sRUFBRTthQUNWLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLENBQUM7YUFDMUQsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELGlDQUFpQztJQUMxQixNQUFNLENBQUMsSUFBaUI7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU87UUFDVCxDQUFDO1FBRUQsbUVBQW1FO1FBQ25FLHVFQUF1RTtRQUN2RSwrQ0FBK0M7UUFDL0MsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEMsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxNQUFNO1FBQ1osT0FBTyxJQUFJLENBQUMsT0FBTztZQUNqQixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM3RCxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1QsQ0FBQztJQUVELDRDQUE0QztJQUNwQyxXQUFXO1FBQ2pCLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM3QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsMENBQTBDO0lBQ2xDLGNBQWMsQ0FBQyxNQUFrQztRQUN2RCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztnQkFDbEIsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzFCLEtBQUssRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN4QixJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTthQUN4QixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSwyRUFBMkU7SUFDM0UsdUVBQXVFO0lBQ3ZFLGtDQUFrQztJQUMxQixjQUFjLENBQUMsTUFBVztRQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE9BQWUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDekYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQUNILG9FQUFvRTtRQUNwRSwrREFBK0Q7UUFDL0QsdUVBQXVFO1FBQ3ZFLDBCQUEwQjtRQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDekQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsc0VBQXNFO0lBQ3RFLHVEQUF1RDtJQUMvQyxnQkFBZ0IsQ0FBQyxPQUFlO1FBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFdEIsSUFBSSxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQzlFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHdFQUF3RSxDQUFDLENBQUM7WUFFOUYsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxrRkFBa0YsQ0FBQyxDQUFDO1lBRXhHLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5RSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxXQUFXO0lBQ0gsUUFBUSxDQUFDLFFBQWdCO1FBQy9CLE1BQU0sU0FBUyxHQUFtQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUM7UUFFaEcsT0FBTyxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLDZFQUE2RTtJQUM3RSx1RUFBdUU7SUFDL0QsUUFBUSxDQUFDLE1BQU0sR0FBRyxLQUFLO1FBQzdCLE1BQU0sRUFBRSxHQUE0QixJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNyRCxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sS0FBSyxHQUFXLEVBQUUsQ0FBQztRQUN6QixPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxXQUFtQixDQUFDO1lBQ3hDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUM1RSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU8sWUFBWSxDQUFDLEdBQVc7UUFDOUIsT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVPLFVBQVUsQ0FBQyxJQUFVLEVBQUUsTUFBZTtRQUM1QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLE9BQU87UUFDVCxDQUFDO1FBRUQsd0VBQXdFO1FBQ3hFLHlCQUF5QjtRQUN6QixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFO1lBQ25DLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4QixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUNELFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFDSCxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUV0QyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCx1REFBdUQ7SUFDL0MsWUFBWTtRQUNsQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFFTyxXQUFXLENBQUMsR0FBVztRQUM3QixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsNEVBQTRFO0lBQzVFLDZFQUE2RTtJQUM3RSxvREFBb0Q7SUFDNUMsTUFBTSxDQUFDLElBQWlCO1FBQzlCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV4QyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsS0FBSztZQUN2QixDQUFDLENBQUMsR0FBRztZQUNMLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELGdFQUFnRTtJQUN4RCxTQUFTLENBQUMsSUFBWTtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEQsUUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDMUIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNoRSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQztJQUM1QixDQUFDO0lBRU8sVUFBVSxDQUFDLEtBQW9CO1FBQ3JDLGlEQUFpRDtRQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLFdBQVcsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQztRQUVyRSx1RUFBdUU7UUFDdkUseUVBQXlFO1FBQ3pFLGdDQUFnQztRQUNoQyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0UsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFFOUMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRXJGLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDN0QsQ0FBQztRQUVELHlFQUF5RTtRQUN6RSxTQUFTO1FBQ1QsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDMUUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQztRQUNwRixJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDOUQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRW5DLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckUsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSx3REFBd0Q7SUFDaEQsY0FBYyxDQUFDLEtBQWlCO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM3QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3RELElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ25HLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbkMsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQsc0VBQXNFO0lBQzlELGVBQWUsQ0FBQyxLQUFZO1FBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2hELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVuQyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsNEVBQTRFO0lBQzVFLFNBQVM7SUFDRCxPQUFPLENBQUMsS0FBcUI7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDOUQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3RELElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNuRSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNELEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDN0QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSw2RUFBNkU7SUFDN0UsUUFBUTtJQUNBLFVBQVUsQ0FBQyxNQUFtQjtRQUNwQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyx5Q0FBeUMsQ0FBQztRQUNqRSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUVoQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxRQUFRLENBQUMsS0FBaUI7UUFDaEMsTUFBTSxJQUFJLEdBQUksS0FBSyxDQUFDLE1BQWtCLEVBQUUsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUF1QixDQUFDO1FBQ3ZGLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM5QyxPQUFPO1FBQ1QsQ0FBQztRQUVELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixzRUFBc0U7UUFDdEUsa0VBQWtFO1FBQ2xFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTyxPQUFPLENBQUMsS0FBYTtRQUMzQixPQUFPLENBQUMsQ0FBRSxLQUFLLEVBQUUsTUFBOEIsRUFBRSxPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRU8sTUFBTSxDQUFDLEtBQVksRUFBRSxLQUFvQixFQUFFLEtBQW1CO1FBQ3BFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUV2RCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUNsQixLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDbkIsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDdEUsQ0FBQyxDQUFDO1FBRUgsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sWUFBWSxDQUFDLEtBQVk7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QixTQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDNUIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUxQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0Qix5RUFBeUU7UUFDekUscUNBQXFDO1FBQ3JDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxvRUFBb0U7SUFDcEUsb0NBQW9DO0lBQzVCLFFBQVE7UUFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU8sVUFBVTtRQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRUQsZ0RBQWdEO0lBQ3hDLE1BQU07UUFDWixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMxRCxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQzNCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2hGLENBQUM7SUFFTyxRQUFRLENBQUMsS0FBWTtRQUMzQixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSwwRUFBMEU7SUFDMUUseURBQXlEO0lBQ2pELGFBQWEsQ0FBQyxRQUFpQixFQUFFLFdBQW1CO1FBQzFELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRW5ELFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDM0UsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLFVBQVU7WUFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUk7WUFDbkQsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUVULFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1QixTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSw4Q0FBOEM7SUFDdEMsWUFBWSxDQUFDLEtBQW9CO1FBQ3ZDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7SUFDOUQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5Db25maWcgfSBmcm9tICdAZmlyZXN0aXRjaC9odG1sLWVkaXRvcic7XG5cbmltcG9ydCB7IFRleHRWYWx1ZSwgVkFMVUVfVE9LRU5fUEFUVEVSTiwgdmFsdWVUZXh0LCB2YWx1ZVRva2VuIH0gZnJvbSAnLi4vLi4vdGV4dCc7XG5cblxuLy8gSG93IGEgdmFsdWUgY2hpcCBpcyBtYXJrZWQgaW4gdGhlIGVkaXRvci4gVGhlIG5hbWVzIGZvbGxvdyB0aGUgZW1iZWRzIG9mXG4vLyBAZmlyZXN0aXRjaC9tYXJrZG93bi1lZGl0b3IuIEF0dHJpYnV0ZXMgcmF0aGVyIHRoYW4gYSBjbGFzczogdGhlIHJlcG9ydCBrZWVwc1xuLy8gRnJvYWxhIG9uIGlubGluZSBzdHlsZXMgKHVzZUNsYXNzZXM6IGZhbHNlKSwgYW5kIGEgY2hpcCBuZXZlciByZWFjaGVzIHN0b3JhZ2Vcbi8vIGFueXdheSDigJQgaXQgdHVybnMgYmFjayBpbnRvIGl0cyB7e3ZhbHVlLmtleX19IHRva2VuIG9uIHRoZSB3YXkgb3V0LlxuY29uc3QgVFlQRV9BVFRSSUJVVEUgPSAnZGF0YS1lbWJlZC10eXBlJztcbmNvbnN0IEtFWV9BVFRSSUJVVEUgPSAnZGF0YS1lbWJlZC1rZXknO1xuY29uc3QgTUlTU0lOR19BVFRSSUJVVEUgPSAnZGF0YS1lbWJlZC1taXNzaW5nJztcbmNvbnN0IENISVBfU0VMRUNUT1IgPSBgWyR7S0VZX0FUVFJJQlVURX1dYDtcbmNvbnN0IFZBTFVFX1RZUEUgPSAndmFsdWUnO1xuXG4vLyBUaGUgcGFnZSBhIGNvcHkgY2FtZSBmcm9tLCBvbiB0aGUgY2xpcGJvYXJkIGJlc2lkZSBpdHMgdGV4dDogdmFsdWVzIGJlbG9uZ1xuLy8gdG8gdGhlaXIgcGFnZSwgc28gYSB2YWx1ZSBwYXN0ZWQgb250byBhbm90aGVyIG9uZSBkb2Vzbid0IGNvbWUgd2l0aCBpdC5cbmNvbnN0IFNDT1BFX1RZUEUgPSAnYXBwbGljYXRpb24veC1mcy1yZXBvcnQtdmFsdWUtc2NvcGUnO1xuXG4vLyBXaGF0IEZyb2FsYSBtdXN0IGtlZXAgb24gYSBjaGlwIHdoZW4gaXQgY2xlYW5zIGh0bWwgaXQgaXMgaGFuZGVkLlxuZXhwb3J0IGNvbnN0IFZBTFVFX0VNQkVEX0FUVFJJQlVURVMgPSBbVFlQRV9BVFRSSUJVVEUsIEtFWV9BVFRSSUJVVEUsIE1JU1NJTkdfQVRUUklCVVRFLCAnY29udGVudGVkaXRhYmxlJ107XG5cbi8vIEEgYnJpZWYgcmluZyBhcm91bmQgdGhlIGNoaXBzIGFuIGVkaXQgd2FzIHN0b3BwZWQgYXQuXG5jb25zdCBGTEFTSDogS2V5ZnJhbWVbXSA9IFt7IGJveFNoYWRvdzogJzAgMCAwIDJweCAjZTE1NzU5JyB9LCB7IGJveFNoYWRvdzogJzAgMCAwIDJweCB0cmFuc3BhcmVudCcgfV07XG5jb25zdCBGTEFTSF9NUyA9IDcwMDtcblxuLy8gQ29tbWFuZHMgdGhhdCB3b3VsZCBidWlsZCB3aGF0IHRoZSBzZXJ2ZXIgcmV3cml0ZXMgKFJlcG9ydFRleHRIdG1sKTogYSB0YWJsZVxuLy8gaXMga2VwdCBvbmx5IGJldHdlZW4gcGFyYWdyYXBocywgYW5kIGEgY2VsbCBob2xkcyB3b3JkcyBhbmQgdmFsdWVzIG9ubHkuXG5jb25zdCBUQUJMRV9JTlNFUlRfQ09NTUFORFMgPSBbJ2luc2VydFRhYmxlJywgJ3RhYmxlSW5zZXJ0J107XG5jb25zdCBOT19UQUJMRV9JTlNJREUgPSAnbGksIHRkLCB0aCc7XG5jb25zdCBDRUxMX0NPTU1BTkRTID0gWydmb3JtYXRVTCcsICdmb3JtYXRPTCcsICdwYXJhZ3JhcGhGb3JtYXQnXTtcbmNvbnN0IENFTEwgPSAndGQsIHRoJztcblxuLy8gVW5kbyBhbmQgcmVkbyByZXN0b3JlIGEgc3RlcDsgdGhleSByZW1vdmUgbm90aGluZyBvZiB0aGVpciBvd24uXG5jb25zdCBISVNUT1JZX0NPTU1BTkRTID0gWyd1bmRvJywgJ3JlZG8nXTtcblxuLy8gS2V5cyB0aGF0LCBwcmVzc2VkIGFsb25lLCBlZGl0IG5vdGhpbmcuXG5jb25zdCBNT0RJRklFUl9LRVlTID0gWydTaGlmdCcsICdDb250cm9sJywgJ0FsdCcsICdBbHRHcmFwaCcsICdNZXRhJ107XG5cbi8vIFRoZSBjZWxscyBvZiBhIHRhYmxlIHNlbGVjdGVkIGFzIGNlbGxzIChGcm9hbGEncyBvd24gbWFya2luZykuXG5jb25zdCBTRUxFQ1RFRF9DRUxMID0gJy5mci1zZWxlY3RlZC1jZWxsJztcblxuLy8gQW4gZWRpdCB0aGF0IHdvdWxkIGhhdmUgcmVtb3ZlZCB2YWx1ZXMsIGFuZCB3YXMgc3RvcHBlZC5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdWVFbWJlZEJsb2NrIHtcbiAgY291bnQ6IG51bWJlcjtcbiAgLy8gUHJlc2VudCB3aGVuIHRoZSBlZGl0IHdhcyBvbiBhIHNlbGVjdGlvbjogcmVtb3ZlcyB0aGUgc2VsZWN0aW9uLCB2YWx1ZXNcbiAgLy8gYW5kIGFsbCDigJQgdGhlIGRlbGliZXJhdGUgd2F5IHRocm91Z2guXG4gIHJlbW92ZVNlbGVjdGlvbj86ICgpID0+IHZvaWQ7XG59XG5cbi8vIEFuIGVkaXQgdGhhdCB0b29rIHRoZSBsYXN0IGNoaXAgb2Ygc29tZSB2YWx1ZXMgb3V0IG9mIHRoZSBibG9jazogZGVsZXRpbmdcbi8vIGEgcm93LCBhIGNvbHVtbiBvciBhIHRhYmxlLCBvciBlbXB0eWluZyBjZWxscy4gQWxsb3dlZCwgdmFsdWVzIGFuZCBhbGwuXG5leHBvcnQgaW50ZXJmYWNlIFZhbHVlRW1iZWRSZW1vdmFsIHtcbiAgLy8gVGhlIGtleXMgdGhlIGJsb2NrJ3MgY2hpcHMgbmFtZWQgYmVmb3JlIHRoZSBlZGl0LCBhbmQgYWZ0ZXIgaXQuXG4gIGJlZm9yZTogc3RyaW5nW107XG4gIGFmdGVyOiBzdHJpbmdbXTtcbiAgLy8gVGhlIGVkaXRvcidzIG93biB1bmRvLCB3aGljaCBicmluZ3MgdGhlIGNoaXBzIGJhY2suXG4gIHVuZG86ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdWVFbWJlZFBsdWdpbkNvbmZpZyBleHRlbmRzIFBsdWdpbkNvbmZpZyB7XG4gIC8vIFRoZSBlbGVtZW50IHRoZSBlZGl0b3Igc2l0cyBpbi4gaHRtbC1lZGl0b3IgcmVnaXN0ZXJzIGEgcGx1Z2luIHdpdGggRnJvYWxhXG4gIC8vIGdsb2JhbGx5LCBzbyBGcm9hbGEgaGFuZHMgaXQgZXZlcnkgZWRpdG9yIGJ1aWx0IGFmdGVyd2FyZHM7IGl0IHdvcmtzIG9ubHlcbiAgLy8gZm9yIHRoZSBvbmUgaW5zaWRlIHRoaXMgZWxlbWVudC5cbiAgaG9zdDogKCkgPT4gSFRNTEVsZW1lbnQ7XG4gIC8vIFRoZSBwYWdlJ3MgdmFsdWVzLCBieSBrZXkuIE9uZSB3aG9zZSBudW1iZXIgaXMgc3RpbGwgb24gaXRzIHdheSBpcyBsaXN0ZWRcbiAgLy8gd2l0aCBsb2FkaW5nOiB0cnVlOyBhIGtleSBub3QgbGlzdGVkIGlzIG5vIHZhbHVlIG9mIHRoZSBwYWdlLlxuICB2YWx1ZXM6ICgpID0+IFJlY29yZDxzdHJpbmcsIFRleHRWYWx1ZT47XG4gIC8vIFRoZSBwYWdlIHRoZSBibG9jaydzIHZhbHVlcyBiZWxvbmcgdG8uXG4gIHNjb3BlOiAoKSA9PiBzdHJpbmc7XG4gIC8vIExhYmVsIGNoaXBzIHdpdGggdGhlIHZhbHVlJ3MgbmFtZSBpbnN0ZWFkIG9mIGl0cyBudW1iZXIuXG4gIHNob3dOYW1lczogKCkgPT4gYm9vbGVhbjtcbiAgY2xpY2s6IChrZXk6IHN0cmluZywgY2hpcDogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG4gIGJsb2NrZWQ6IChibG9jazogVmFsdWVFbWJlZEJsb2NrKSA9PiB2b2lkO1xuICByZW1vdmVkOiAocmVtb3ZhbDogVmFsdWVFbWJlZFJlbW92YWwpID0+IHZvaWQ7XG4gIC8vIEEga2V5IHdhcyBwcmVzc2VkIG9yIGEgY29tbWFuZCBpcyBhYm91dCB0byBydW46IHdoYXQgd2FzIHNhaWQgYWJvdXQgdGhlXG4gIC8vIGxhc3QgZWRpdCBubyBsb25nZXIgYXBwbGllcy5cbiAgY2hhbmdlZDogKCkgPT4gdm9pZDtcbiAgLy8gQSBjb21tYW5kIHdhcyByZWZ1c2VkLCBhbmQgd2h5LlxuICByZWZ1c2VkOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vLyBMaXZlIHZhbHVlcyBpbnNpZGUgYSB0ZXh0IGJsb2NrJ3MgZWRpdG9yLlxuLy9cbi8vIFN0b3JlZCBodG1sIGNhcnJpZXMgYSB2YWx1ZSBhcyBhIHt7dmFsdWUua2V5fX0gdG9rZW4uIFdoaWxlIGVkaXRpbmcsIGVhY2hcbi8vIHRva2VuIGlzIGEgY2hpcDogb25lIGNoYXJhY3RlciB0byB0aGUgY3Vyc29yLCBsYWJlbGVkIHdpdGggdGhlIHZhbHVlLCBhbmRcbi8vIHJlcG9ydGluZyBhIGNsaWNrLiBGcm9hbGEncyBodG1sLmdldCBoYW5kcyBiYWNrIHRva2VucyBhZ2Fpbiwgc28gdGhlIGRyYWZ0XG4vLyBhbmQgdGhlIHNhdmVkIGh0bWwgbmV2ZXIgaG9sZCBhIGNoaXAuXG4vL1xuLy8gQSBjaGlwIGNhbid0IGJlIGRlbGV0ZWQgYnkgZWRpdGluZzogQmFja3NwYWNlIG9yIERlbGV0ZSBiZXNpZGUgaXQsIGFuZCBhbnlcbi8vIGRlbGV0aW5nLCB0eXBpbmcgb3ZlciwgY3V0dGluZywgcGFzdGluZyBvdmVyIG9yIGRyYWdnaW5nIG9mIGEgc2VsZWN0aW9uIHRoYXRcbi8vIGhvbGRzIG9uZSwgaXMgc3RvcHBlZCBhbmQgcmVwb3J0ZWQuIEl0IGlzIHRha2VuIG91dCBvbiBwdXJwb3NlIGJ5IHNlbGVjdGluZ1xuLy8gaXQgYW5kIHByZXNzaW5nIERlbGV0ZSwgdGhlbiB0YWtpbmcgdGhlIHN0b3BwZWQgc2VsZWN0aW9uJ3Ncbi8vIHJlbW92ZVNlbGVjdGlvbigpOyBhIHZhbHVlIHRoYXQgd2FzIGRlbGV0ZWQgbGVhdmVzIHRocm91Z2ggcmVtb3ZlS2V5KCkuXG4vL1xuLy8gQSB0YWJsZSBpcyB0aGUgZXhjZXB0aW9uOiBkZWxldGluZyBhIHJvdywgYSBjb2x1bW4gb3IgdGhlIHRhYmxlLCBvclxuLy8gZW1wdHlpbmcgc2V2ZXJhbCBzZWxlY3RlZCBjZWxscywgZ29lcyB0aHJvdWdoIHdpdGggdGhlIGNoaXBzIGluIGl0LCBhbmQgaXNcbi8vIHJlcG9ydGVkIGFzIHJlbW92ZWQoKSB3aGVuIGl0IHRvb2sgYSB2YWx1ZSdzIGxhc3QgY2hpcCwgd2l0aCB0aGUgdW5kbyB0aGF0XG4vLyBicmluZ3MgdGhlbSBiYWNrLlxuZXhwb3J0IGNsYXNzIFZhbHVlRW1iZWRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuXG4gIC8vIFRoZSBiYXNlIGNsYXNzJ3MgY29uZmlnLCB0eXBlZCBmb3IgdGhpcyBwbHVnaW4uXG4gIHB1YmxpYyBkZWNsYXJlIGNvbmZpZzogVmFsdWVFbWJlZFBsdWdpbkNvbmZpZztcblxuICAvLyBUaGUgZWRpdG9yIHRoaXMgcGx1Z2luIHNlcnZlczsgbnVsbCB1bnRpbCBpdCBpcyBidWlsdCwgYW5kIGFmdGVyIGl0IGlzIGdvbmUuXG4gIHByaXZhdGUgX2VkaXRvcjogYW55ID0gbnVsbDtcbiAgLy8gU2V0IHdoaWxlIGEgZGVsaWJlcmF0ZSByZW1vdmFsIHJ1bnMsIHNvIHRoZSBndWFyZHMgbGV0IGl0IHRocm91Z2guXG4gIHByaXZhdGUgX3JlbW92aW5nID0gZmFsc2U7XG4gIC8vIExpc3RlbmVycyBvbiB0aGUgZWRpdGFibGUgZWxlbWVudCwgY2FwdHVyZWQgc28gZWFjaCBydW5zIGJlZm9yZSBGcm9hbGEnc1xuICAvLyBvd24gaGFuZGxlciBmb3IgdGhlIHNhbWUgZXZlbnQuXG4gIHByaXZhdGUgX2RvbUxpc3RlbmVyczogW3N0cmluZywgRXZlbnRMaXN0ZW5lcl1bXSA9IFtdO1xuICAvLyBUaGUgcGFnZSB0aGUgcGFzdGUgdW5kZXIgd2F5IHdhcyBjb3BpZWQgb24gKCcnIHdoZW4gbm90IGZyb20gYSBibG9jaykuXG4gIHByaXZhdGUgX3Bhc3RlU2NvcGUgPSAnJztcbiAgLy8gSG93IG1hbnkgY2hpcHMgZWFjaCBrZXkgaGFkIGFzIHRoZSBjb21tYW5kIHVuZGVyIHdheSBzdGFydGVkOyBudWxsIGZvclxuICAvLyBvbmUgdGhhdCByZW1vdmVzIG5vdGhpbmcgb2YgaXRzIG93biAodW5kbywgcmVkbykuXG4gIHByaXZhdGUgX2JlZm9yZTogTWFwPHN0cmluZywgbnVtYmVyPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogVmFsdWVFbWJlZFBsdWdpbkNvbmZpZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmhvc3QoKS5jb250YWlucyh0aGlzLmVkaXRvci5lbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcbiAgICBjb25zdCBlbDogSFRNTEVsZW1lbnQgPSBlZGl0b3IuZWw7XG4gICAgdGhpcy5fZWRpdG9yID0gZWRpdG9yO1xuXG4gICAgZWRpdG9yLmV2ZW50cy5vbignaHRtbC5zZXQnLCAoKSA9PiB0aGlzLl90b0NoaXBzKCkpO1xuICAgIGVkaXRvci5ldmVudHMub24oJ3Bhc3RlLmFmdGVyJywgKCkgPT4gdGhpcy5fdG9DaGlwcyh0cnVlKSk7XG4gICAgdGhpcy5fd2F0Y2hDb21tYW5kcyhlZGl0b3IpO1xuICAgIGVkaXRvci5ldmVudHMub24oJ2h0bWwuZ2V0JywgKGh0bWw6IHN0cmluZykgPT4gdGhpcy5fdG9Ub2tlbnMoaHRtbCkpO1xuICAgIC8vIEZpcnN0IGluIEZyb2FsYSdzIGNoYWluLCBzbyBpdHMgb3duIEJhY2tzcGFjZSBoYW5kbGluZyBuZXZlciBydW5zIG9uIGFcbiAgICAvLyBzdG9wcGVkIGtleS5cbiAgICBlZGl0b3IuZXZlbnRzLm9uKCdrZXlkb3duJywgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLl9vbktleWRvd24oZXZlbnQpLCB0cnVlKTtcbiAgICBlZGl0b3IuZXZlbnRzLm9uKCdwYXN0ZS5iZWZvcmUnLCAoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiB7XG4gICAgICB0aGlzLl9wYXN0ZVNjb3BlID0gZXZlbnQ/LmNsaXBib2FyZERhdGE/LmdldERhdGEoU0NPUEVfVFlQRSkgPz8gJyc7XG5cbiAgICAgIHJldHVybiB0aGlzLl9ndWFyZFNlbGVjdGlvbihldmVudCk7XG4gICAgfSk7XG4gICAgLy8gQSBwcmVzcyBvbiBhIGNoaXAgb3BlbnMgaXRzIHBvcG92ZXI7IEZyb2FsYSdzIGZsb2F0aW5nIHRvb2xiYXIsIHdoaWNoXG4gICAgLy8gcG9wcyB1cCBvbiBhbnkgcHJlc3MgaW4gdGhlIHRleHQgYW5kIHNpdHMgYWJvdmUgZXZlcnkgb3ZlcmxheSwgc3RheXNcbiAgICAvLyBhd2F5IGZvciBpdC5cbiAgICBlZGl0b3IuZXZlbnRzLm9uKCd0b29sYmFyLnNob3cnLCAoZXZlbnQ/OiBFdmVudCkgPT4gKHRoaXMuX29uQ2hpcChldmVudCkgPyBmYWxzZSA6IHVuZGVmaW5lZCksIHRydWUpO1xuICAgIC8vIE9ubHkgd2hpbGUgaXQgaXMgc3RpbGwgdGhpcyBlZGl0b3I6IHJlb3BlbmluZyBhIGJsb2NrIGJ1aWxkcyB0aGUgbmV4dFxuICAgIC8vIG9uZSBiZWZvcmUgdGhlIGxhc3QgaXMgdG9ybiBkb3duLlxuICAgIGVkaXRvci5ldmVudHMub24oJ2Rlc3Ryb3knLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fZWRpdG9yID09PSBlZGl0b3IpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9kb21MaXN0ZW5lcnMgPSBbXG4gICAgICBbJ2JlZm9yZWlucHV0JywgKGV2ZW50KSA9PiB0aGlzLl9vbkJlZm9yZUlucHV0KGV2ZW50IGFzIElucHV0RXZlbnQpXSxcbiAgICAgIFsnY3V0JywgKGV2ZW50KSA9PiB0aGlzLl9ndWFyZFNlbGVjdGlvbihldmVudCldLFxuICAgICAgWydkcmFnc3RhcnQnLCAoZXZlbnQpID0+IHRoaXMuX2d1YXJkU2VsZWN0aW9uKGV2ZW50KV0sXG4gICAgICBbJ2NvcHknLCAoZXZlbnQpID0+IHRoaXMuX29uQ29weShldmVudCBhcyBDbGlwYm9hcmRFdmVudCldLFxuICAgICAgWydjbGljaycsIChldmVudCkgPT4gdGhpcy5fb25DbGljayhldmVudCBhcyBNb3VzZUV2ZW50KV0sXG4gICAgXTtcbiAgICB0aGlzLl9kb21MaXN0ZW5lcnMuZm9yRWFjaCgoW25hbWUsIGxpc3RlbmVyXSkgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lciwgdHJ1ZSkpO1xuXG4gICAgdGhpcy5fdG9DaGlwcygpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgY29uc3QgZWw6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdGhpcy5fZWRpdG9yPy5lbDtcbiAgICB0aGlzLl9kb21MaXN0ZW5lcnMuZm9yRWFjaCgoW25hbWUsIGxpc3RlbmVyXSkgPT4gZWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIsIHRydWUpKTtcbiAgICB0aGlzLl9kb21MaXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLl9lZGl0b3IgPSBudWxsO1xuICB9XG5cbiAgLy8gUmVsYWJlbCBldmVyeSBjaGlwOiB0aGUgdmFsdWVzIGFycml2ZWQgb3IgY2hhbmdlZCwgb3IgbmFtZXMgd2VyZSB0b2dnbGVkLlxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGlwcygpLmZvckVhY2goKGNoaXApID0+IHRoaXMuX2xhYmVsKGNoaXApKTtcbiAgfVxuXG4gIC8vIFB1dCBGcm9hbGEncyBmbG9hdGluZyB0b29sYmFyIGFuZCBhIHRhYmxlJ3MgcG9wdXAgYXdheSwgd2hlbiBlaXRoZXIgaXNcbiAgLy8gYWxyZWFkeSB1cCBhcyBhIGNoaXAncyBwb3BvdmVyIG9wZW5zOiB0aGV5IHNpdCBhYm92ZSBldmVyeSBvdmVybGF5LlxuICBwdWJsaWMgaGlkZVRvb2xiYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZWRpdG9yPy50b29sYmFyLmhpZGUoKTtcbiAgICB0aGlzLl9lZGl0b3I/LnBvcHVwcy5oaWRlKCd0YWJsZS5lZGl0Jyk7XG4gIH1cblxuICAvLyBUaGUgZWRpdG9yJ3Mgb3duIHVuZG8gb2YgdGhlIGxhc3Qgc3RlcDogd2hhdCBwdXRzIGJhY2sgdGhlIGNoaXBzIGFuIGVkaXRcbiAgLy8gdG9vayBvdXQuXG4gIHB1YmxpYyB1bmRvKCk6IHZvaWQge1xuICAgIHRoaXMuX2VkaXRvcj8uY29tbWFuZHMudW5kbygpO1xuICB9XG5cbiAgLy8gVGFrZSBhIHZhbHVlIG91dCBvZiB0aGUgdGV4dCwgd2hlcmV2ZXIgaXQgYXBwZWFycyDigJQgaXQgd2FzIGRlbGV0ZWQuXG4gIHB1YmxpYyByZW1vdmVLZXkoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGlwcygpXG4gICAgICAuZmlsdGVyKChjaGlwKSA9PiBjaGlwLmdldEF0dHJpYnV0ZShLRVlfQVRUUklCVVRFKSA9PT0ga2V5KVxuICAgICAgLmZvckVhY2goKGNoaXApID0+IHRoaXMucmVtb3ZlKGNoaXApKTtcbiAgfVxuXG4gIC8vIFRha2Ugb25lIGNoaXAgb3V0IG9mIHRoZSB0ZXh0LlxuICBwdWJsaWMgcmVtb3ZlKGNoaXA6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9lZGl0b3I/LmVsLmNvbnRhaW5zKGNoaXApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIGN1cnNvciBnb2VzIGJhY2sgd2hlcmUgdGhlIGNoaXAgd2FzIOKAlCB3aGF0ZXZlciBhc2tlZCBmb3IgdGhlXG4gICAgLy8gcmVtb3ZhbCAoYSBkaWFsb2csIGEgcG9wb3ZlcikgdG9vayB0aGUgZm9jdXMsIGFuZCB3aXRob3V0IGl0IGFuIFVuZG9cbiAgICAvLyBzdHJhaWdodCBhZnRlciB3b3VsZCBuZXZlciByZWFjaCB0aGUgZWRpdG9yLlxuICAgIGNvbnN0IGNhcmV0ID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICBjYXJldC5zZXRTdGFydEJlZm9yZShjaGlwKTtcbiAgICBjYXJldC5jb2xsYXBzZSh0cnVlKTtcblxuICAgIHRoaXMuX2VkaXRvci51bmRvLnNhdmVTdGVwKCk7XG4gICAgY2hpcC5yZW1vdmUoKTtcbiAgICB0aGlzLl9lZGl0b3IuZWwuZm9jdXMoKTtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLl9zZWxlY3Rpb24oKTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKGNhcmV0KTtcbiAgICB0aGlzLl9jaGFuZ2VkKCk7XG4gIH1cblxuICBwcml2YXRlIF9jaGlwcygpOiBIVE1MRWxlbWVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5fZWRpdG9yXG4gICAgICA/IEFycmF5LmZyb20odGhpcy5fZWRpdG9yLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoQ0hJUF9TRUxFQ1RPUikpXG4gICAgICA6IFtdO1xuICB9XG5cbiAgLy8gSG93IG1hbnkgY2hpcHMgZWFjaCBrZXkgaGFzIGluIHRoZSBibG9jay5cbiAgcHJpdmF0ZSBfY2hpcENvdW50cygpOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgICBjb25zdCBjb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIHRoaXMuX2NoaXBzKCkuZm9yRWFjaCgoY2hpcCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gY2hpcC5nZXRBdHRyaWJ1dGUoS0VZX0FUVFJJQlVURSk7XG4gICAgICBjb3VudHMuc2V0KGtleSwgKGNvdW50cy5nZXQoa2V5KSA/PyAwKSArIDEpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvdW50cztcbiAgfVxuXG4gIC8vIFRlbGwgdGhlIGhvc3Qgd2hlbiBhbiBlZGl0IHRvb2sgdGhlIGxhc3QgY2hpcCBvZiBzb21lIGtleSBvdXQgb2YgdGhlXG4gIC8vIGJsb2NrLCBnaXZlbiB0aGUgY291bnRzIGZyb20gYmVmb3JlIGl0LlxuICBwcml2YXRlIF9yZXBvcnRSZW1vdmVkKGJlZm9yZTogTWFwPHN0cmluZywgbnVtYmVyPiB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIWJlZm9yZSB8fCAhdGhpcy5fZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWZ0ZXIgPSB0aGlzLl9jaGlwQ291bnRzKCk7XG4gICAgaWYgKFsuLi5iZWZvcmUua2V5cygpXS5zb21lKChrZXkpID0+ICFhZnRlci5oYXMoa2V5KSkpIHtcbiAgICAgIHRoaXMuY29uZmlnLnJlbW92ZWQoe1xuICAgICAgICBiZWZvcmU6IFsuLi5iZWZvcmUua2V5cygpXSxcbiAgICAgICAgYWZ0ZXI6IFsuLi5hZnRlci5rZXlzKCldLFxuICAgICAgICB1bmRvOiAoKSA9PiB0aGlzLnVuZG8oKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEEgdG9vbGJhciBjb21tYW5kIHNlZXMgdG9rZW5zLCBub3QgY2hpcHM6IENsZWFyIGZvcm1hdHRpbmcgdW53cmFwcyBldmVyeVxuICAvLyBzcGFuLCBhIGNoaXAgaW5jbHVkZWQsIHdoaWNoIHdvdWxkIGxlYXZlIGEgdHlwZWQgbnVtYmVyIGJlaGluZC4gQXJvdW5kIGFcbiAgLy8gdG9rZW4gaXQgZm9ybWF0cyBwbGFpbiB0ZXh0LCBhbmQgdGhlIGNoaXAgY29tZXMgYmFjayBpbnNpZGUgd2hhdGV2ZXJcbiAgLy8gZm9ybWF0dGluZyB0aGUgdG9rZW4gd2FzIGdpdmVuLlxuICBwcml2YXRlIF93YXRjaENvbW1hbmRzKGVkaXRvcjogYW55KTogdm9pZCB7XG4gICAgZWRpdG9yLmV2ZW50cy5vbignY29tbWFuZHMuYmVmb3JlJywgKGNvbW1hbmQ6IHN0cmluZykgPT4gdGhpcy5fb25Db21tYW5kQmVmb3JlKGNvbW1hbmQpKTtcbiAgICBlZGl0b3IuZXZlbnRzLm9uKCdjb21tYW5kcy5hZnRlcicsICgpID0+IHtcbiAgICAgIHRoaXMuX3RvQ2hpcHMoKTtcbiAgICAgIHRoaXMuX3JlcG9ydFJlbW92ZWQodGhpcy5fYmVmb3JlKTtcbiAgICAgIHRoaXMuX2JlZm9yZSA9IG51bGw7XG4gICAgfSk7XG4gICAgLy8gVW5kbyBhbmQgcmVkbyByZXN0b3JlIGEgc3RlcCBhcyBGcm9hbGEgc2F2ZWQgaXQ6IHRoZSBvbmUgYmVmb3JlIGFcbiAgICAvLyBjb21tYW5kIGhvbGRzIHRva2VucywgYXMgdGhlIGNvbW1hbmQgc2F3IHRoZW0uIE5laXRoZXIgZmlyZXNcbiAgICAvLyBjb21tYW5kcy5hZnRlcjogRnJvYWxhJ3MgY29tbWFuZHMudW5kbygpIOKAlCBDdHJsK1osIGFuZCB1bmRvKCkgaGVyZSDigJRcbiAgICAvLyBydW5zIHRoZSB1bmRvIGRpcmVjdGx5LlxuICAgIGVkaXRvci5ldmVudHMub24oJ2NvbW1hbmRzLnVuZG8nLCAoKSA9PiB0aGlzLl90b0NoaXBzKCkpO1xuICAgIGVkaXRvci5ldmVudHMub24oJ2NvbW1hbmRzLnJlZG8nLCAoKSA9PiB0aGlzLl90b0NoaXBzKCkpO1xuICB9XG5cbiAgLy8gRXZlcnkgY29tbWFuZCBzdGFydHMgYSBuZXcgZWRpdC4gT25lIHRoYXQgd291bGQgYnVpbGQgd2hhdCB0aGUgc2VydmVyXG4gIC8vIHJld3JpdGVzIGlzIHJlZnVzZWQgKHJldHVybmluZyBmYWxzZSBjYW5jZWxzIGl0KTsgYW55IG90aGVyIHJ1bnMgb25cbiAgLy8gdG9rZW5zLCBpdHMgY2hpcCBjb3VudHMga2VwdCB0byBzZWUgd2hhdCBpdCByZW1vdmVkLlxuICBwcml2YXRlIF9vbkNvbW1hbmRCZWZvcmUoY29tbWFuZDogc3RyaW5nKTogZmFsc2UgfCB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5jaGFuZ2VkKCk7XG5cbiAgICBpZiAoVEFCTEVfSU5TRVJUX0NPTU1BTkRTLmluY2x1ZGVzKGNvbW1hbmQpICYmIHRoaXMuX2NhcmV0SW4oTk9fVEFCTEVfSU5TSURFKSkge1xuICAgICAgdGhpcy5jb25maWcucmVmdXNlZCgnQSB0YWJsZSBnb2VzIGJldHdlZW4gcGFyYWdyYXBocywgbmV2ZXIgaW5zaWRlIGEgbGlzdCBvciBhbm90aGVyIHRhYmxlLicpO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKENFTExfQ09NTUFORFMuaW5jbHVkZXMoY29tbWFuZCkgJiYgdGhpcy5fY2FyZXRJbihDRUxMKSkge1xuICAgICAgdGhpcy5jb25maWcucmVmdXNlZCgnQSB0YWJsZSBjZWxsIGhvbGRzIHdvcmRzIGFuZCB2YWx1ZXM7IGEgbGlzdCBvciBhIGhlYWRpbmcgZ29lcyBvdXRzaWRlIHRoZSB0YWJsZS4nKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuX2JlZm9yZSA9IEhJU1RPUllfQ09NTUFORFMuaW5jbHVkZXMoY29tbWFuZCkgPyBudWxsIDogdGhpcy5fY2hpcENvdW50cygpO1xuICAgIHRoaXMuX3RvVG9rZW5UZXh0KCk7XG4gIH1cblxuICAvLyBXaGV0aGVyIHRoZSBjYXJldCBzaXRzIGluc2lkZSBhbiBlbGVtZW50IG9mIHRoaXMgZWRpdG9yIHRoYXQgYHNlbGVjdG9yYFxuICAvLyBtYXRjaGVzLlxuICBwcml2YXRlIF9jYXJldEluKHNlbGVjdG9yOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb250YWluZXI6IEVsZW1lbnQgfCBudWxsID0gdGhpcy5fZWRpdG9yLnNlbGVjdGlvbi5lbGVtZW50KCk/LmNsb3Nlc3Q/LihzZWxlY3RvcikgPz8gbnVsbDtcblxuICAgIHJldHVybiAhIWNvbnRhaW5lciAmJiB0aGlzLl9lZGl0b3IuZWwuY29udGFpbnMoY29udGFpbmVyKTtcbiAgfVxuXG4gIC8vIFR1cm4gZXZlcnkge3t2YWx1ZS5rZXl9fSB0b2tlbiBpbiB0aGUgZWRpdG9yJ3MgdGV4dCBpbnRvIGEgY2hpcC4gRm9yIGFcbiAgLy8gcGFzdGUsIGEgdG9rZW4gb25seSBzdGF5cyB3aGVuIGl0IHdhcyBjb3BpZWQgb24gdGhpcyBwYWdlIGFuZCB0aGUgcGFnZSBoYXNcbiAgLy8gdGhlIHZhbHVlOyBvdGhlcndpc2UgaXQgZ29lcywgYW5kIGp1c3QgdGhlIHRleHQgYXJvdW5kIGl0IGlzIHBhc3RlZC5cbiAgcHJpdmF0ZSBfdG9DaGlwcyhwYXN0ZWQgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGVsOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9IHRoaXMuX2VkaXRvcj8uZWw7XG4gICAgaWYgKCFlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZWwsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICBjb25zdCB0ZXh0czogVGV4dFtdID0gW107XG4gICAgd2hpbGUgKHdhbGtlci5uZXh0Tm9kZSgpKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gd2Fsa2VyLmN1cnJlbnROb2RlIGFzIFRleHQ7XG4gICAgICBpZiAodGV4dC5kYXRhLmluY2x1ZGVzKCd7eycpICYmICF0ZXh0LnBhcmVudEVsZW1lbnQ/LmNsb3Nlc3QoQ0hJUF9TRUxFQ1RPUikpIHtcbiAgICAgICAgdGV4dHMucHVzaCh0ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0ZXh0cy5mb3JFYWNoKCh0ZXh0KSA9PiB0aGlzLl9zcGxpdFRleHQodGV4dCwgcGFzdGVkKSk7XG4gIH1cblxuICBwcml2YXRlIF9rZWVwc1Bhc3RlZChrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wYXN0ZVNjb3BlID09PSB0aGlzLmNvbmZpZy5zY29wZSgpICYmICEhdGhpcy5jb25maWcudmFsdWVzKClba2V5XTtcbiAgfVxuXG4gIHByaXZhdGUgX3NwbGl0VGV4dCh0ZXh0OiBUZXh0LCBwYXN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBtYXRjaGVzID0gQXJyYXkuZnJvbSh0ZXh0LmRhdGEubWF0Y2hBbGwoVkFMVUVfVE9LRU5fUEFUVEVSTikpO1xuICAgIGlmICghbWF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IG5vbi1lbXB0eSB0ZXh0IGFyb3VuZCB0aGUgY2hpcHMsIHNvIGEgc2VsZWN0aW9uIGNvdW50ZWQgaW4gY2hpbGRcbiAgICAvLyBub2RlcyBrZWVwcyBpdHMgcGxhY2UuXG4gICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgY29uc3QgYXBwZW5kVGV4dCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZnJhZ21lbnQuYXBwZW5kKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGxldCBjb25zdW1lZCA9IDA7XG4gICAgbWF0Y2hlcy5mb3JFYWNoKChtYXRjaCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTtcbiAgICAgIGFwcGVuZFRleHQodGV4dC5kYXRhLnNsaWNlKGNvbnN1bWVkLCBtYXRjaC5pbmRleCkpO1xuICAgICAgaWYgKCFwYXN0ZWQgfHwgdGhpcy5fa2VlcHNQYXN0ZWQoa2V5KSkge1xuICAgICAgICBmcmFnbWVudC5hcHBlbmQodGhpcy5fY3JlYXRlQ2hpcChrZXkpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN1bWVkID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gICAgfSk7XG4gICAgYXBwZW5kVGV4dCh0ZXh0LmRhdGEuc2xpY2UoY29uc3VtZWQpKTtcblxuICAgIHRleHQucmVwbGFjZVdpdGgoZnJhZ21lbnQpO1xuICB9XG5cbiAgLy8gRXZlcnkgY2hpcCBpbiB0aGUgZWRpdG9yIGJhY2sgdG8gaXRzIHRva2VuLCBhcyB0ZXh0LlxuICBwcml2YXRlIF90b1Rva2VuVGV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGlwcygpLmZvckVhY2goKGNoaXApID0+IGNoaXAucmVwbGFjZVdpdGgodmFsdWVUb2tlbihjaGlwLmdldEF0dHJpYnV0ZShLRVlfQVRUUklCVVRFKSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUNoaXAoa2V5OiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgY2hpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBjaGlwLnNldEF0dHJpYnV0ZShUWVBFX0FUVFJJQlVURSwgVkFMVUVfVFlQRSk7XG4gICAgY2hpcC5zZXRBdHRyaWJ1dGUoS0VZX0FUVFJJQlVURSwga2V5KTtcbiAgICBjaGlwLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ2ZhbHNlJyk7XG4gICAgdGhpcy5fbGFiZWwoY2hpcCk7XG5cbiAgICByZXR1cm4gY2hpcDtcbiAgfVxuXG4gIC8vIEEgY2hpcCByZWFkcyBhcyB0aGUgdmFsdWUgZG9lcyBpbiB0aGUgdmlld2VkIGJsb2NrIOKAlCBpdHMgbnVtYmVyLCB0aGVcbiAgLy8gZWxsaXBzaXMgd2hpbGUgdGhhdCBsb2FkcywgZWxzZSB0aGUgZW0gZGFzaCDigJQgc28gb3BlbmluZyB0aGUgZWRpdG9yIG1vdmVzXG4gIC8vIG5vIHdvcmQ7IG9yIGFzIGl0cyBuYW1lLCB3aGVuIG5hbWVzIGFyZSB0b2dnbGVkIG9uLiBBIGtleSB3aXRoIG5vIHZhbHVlIG9uXG4gIC8vIHRoZSBwYWdlIHJlYWRzIGFzIHRoZSBrZXkgaXRzZWxmLCBtYXJrZWQgbWlzc2luZy5cbiAgcHJpdmF0ZSBfbGFiZWwoY2hpcDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBjaGlwLmdldEF0dHJpYnV0ZShLRVlfQVRUUklCVVRFKTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29uZmlnLnZhbHVlcygpW2tleV07XG5cbiAgICBjaGlwLnRleHRDb250ZW50ID0gIXZhbHVlXG4gICAgICA/IGtleVxuICAgICAgOiB0aGlzLmNvbmZpZy5zaG93TmFtZXMoKSA/IHZhbHVlLm5hbWUgOiB2YWx1ZVRleHQodmFsdWUpO1xuICAgIGNoaXAudGl0bGUgPSB2YWx1ZT8ubmFtZSA/PyBrZXk7XG4gICAgY2hpcC50b2dnbGVBdHRyaWJ1dGUoTUlTU0lOR19BVFRSSUJVVEUsICF2YWx1ZSk7XG4gIH1cblxuICAvLyBUaGUgaHRtbCBGcm9hbGEgaGFuZHMgb3V0LCB3aXRoIGV2ZXJ5IGNoaXAgYmFjayB0byBpdHMgdG9rZW4uXG4gIHByaXZhdGUgX3RvVG9rZW5zKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFodG1sLmluY2x1ZGVzKEtFWV9BVFRSSUJVVEUpKSB7XG4gICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbDtcbiAgICB0ZW1wbGF0ZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoQ0hJUF9TRUxFQ1RPUikuZm9yRWFjaCgoY2hpcCkgPT4ge1xuICAgICAgY2hpcC5yZXBsYWNlV2l0aCh2YWx1ZVRva2VuKGNoaXAuZ2V0QXR0cmlidXRlKEtFWV9BVFRSSUJVVEUpKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGVtcGxhdGUuaW5uZXJIVE1MO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB8IHZvaWQge1xuICAgIC8vIEFueSBrZXkgYnV0IGEgbG9uZSBtb2RpZmllciBzdGFydHMgYSBuZXcgZWRpdC5cbiAgICBpZiAoIU1PRElGSUVSX0tFWVMuaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgdGhpcy5jb25maWcuY2hhbmdlZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlbGV0aW5nID0gZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyB8fCBldmVudC5rZXkgPT09ICdEZWxldGUnO1xuXG4gICAgLy8gRGVsZXRpbmcgYWNyb3NzIHNldmVyYWwgc2VsZWN0ZWQgY2VsbHMgZ29lcyB0aHJvdWdoLCB2YWx1ZXMgYW5kIGFsbDpcbiAgICAvLyBGcm9hbGEgc2F2ZXMgYW4gdW5kbyBzdGVwIGFuZCBlbXB0aWVzIHRoZSBjZWxscywgYW5kIHdoYXQgdGhhdCB0b29rIGlzXG4gICAgLy8gcmVwb3J0ZWQgb25jZSB0aGV5IGFyZSBlbXB0eS5cbiAgICBpZiAoZGVsZXRpbmcgJiYgdGhpcy5fZWRpdG9yLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNURURfQ0VMTCkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgYmVmb3JlID0gdGhpcy5fY2hpcENvdW50cygpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl9yZXBvcnRSZW1vdmVkKGJlZm9yZSkpO1xuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmFuZ2UoKTtcbiAgICBpZiAoIXJhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHJhbmdlLmNvbGxhcHNlZCkge1xuICAgICAgaWYgKCFkZWxldGluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoaXAgPSB0aGlzLl9hZGphY2VudENoaXAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJywgdGhpcy5fZ3JhbnVsYXJpdHkoZXZlbnQpKTtcblxuICAgICAgcmV0dXJuIGNoaXAgPyB0aGlzLl9ibG9jayhldmVudCwgW2NoaXBdLCBudWxsKSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBBIHNlbGVjdGlvbiBpcyByZXBsYWNlZCBieSBhIGRlbGV0aW5nIGtleSwgRW50ZXIsIGEgdHlwZWQgY2hhcmFjdGVyIG9yXG4gICAgLy8gYSBjdXQuXG4gICAgY29uc3QgdHlwaW5nID0gZXZlbnQua2V5Lmxlbmd0aCA9PT0gMSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQubWV0YUtleTtcbiAgICBjb25zdCBjdXR0aW5nID0gKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgZXZlbnQua2V5LnRvTG93ZXJDYXNlKCkgPT09ICd4JztcbiAgICBpZiAoIWRlbGV0aW5nICYmICF0eXBpbmcgJiYgIWN1dHRpbmcgJiYgZXZlbnQua2V5ICE9PSAnRW50ZXInKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2hpcHMgPSB0aGlzLl9jaGlwc0luKHJhbmdlKTtcblxuICAgIHJldHVybiBjaGlwcy5sZW5ndGggPyB0aGlzLl9ibG9jayhldmVudCwgY2hpcHMsIHJhbmdlKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIFRoZSBzYW1lIHJ1bGUgZm9yIGVkaXRzIHRoYXQgYXJyaXZlIHdpdGhvdXQgYSBrZXkgRnJvYWxhIHNlZXM6IGEgcGhvbmVcbiAgLy8ga2V5Ym9hcmQsIGFuIGlucHV0IG1ldGhvZCwgYSBzcGVsbC1jaGVjayByZXBsYWNlbWVudC5cbiAgcHJpdmF0ZSBfb25CZWZvcmVJbnB1dChldmVudDogSW5wdXRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmFuZ2UoKTtcbiAgICBpZiAodGhpcy5fcmVtb3ZpbmcgfHwgIXJhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHJhbmdlLmNvbGxhcHNlZCkge1xuICAgICAgY29uc3QgYmFja3dhcmQgPSBldmVudC5pbnB1dFR5cGUuZW5kc1dpdGgoJ0JhY2t3YXJkJyk7XG4gICAgICBpZiAoZXZlbnQuaW5wdXRUeXBlLnN0YXJ0c1dpdGgoJ2RlbGV0ZScpKSB7XG4gICAgICAgIGNvbnN0IGNoaXAgPSB0aGlzLl9hZGphY2VudENoaXAoYmFja3dhcmQsIGV2ZW50LmlucHV0VHlwZS5pbmNsdWRlcygnV29yZCcpID8gJ3dvcmQnIDogJ2NoYXJhY3RlcicpO1xuICAgICAgICBpZiAoY2hpcCkge1xuICAgICAgICAgIHRoaXMuX2Jsb2NrKGV2ZW50LCBbY2hpcF0sIG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlwcyA9IHRoaXMuX2NoaXBzSW4ocmFuZ2UpO1xuICAgIGlmIChjaGlwcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2Jsb2NrKGV2ZW50LCBjaGlwcywgcmFuZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEN1dCwgZHJhZyBhbmQgcGFzdGUtb3Zlcjogc3RvcHBlZCB3aGVuIHRoZSBzZWxlY3Rpb24gaG9sZHMgYSB2YWx1ZS5cbiAgcHJpdmF0ZSBfZ3VhcmRTZWxlY3Rpb24oZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB8IHZvaWQge1xuICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmFuZ2UoKTtcbiAgICBpZiAodGhpcy5fcmVtb3ZpbmcgfHwgIXJhbmdlIHx8IHJhbmdlLmNvbGxhcHNlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaXBzID0gdGhpcy5fY2hpcHNJbihyYW5nZSk7XG5cbiAgICByZXR1cm4gY2hpcHMubGVuZ3RoID8gdGhpcy5fYmxvY2soZXZlbnQsIGNoaXBzLCByYW5nZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBDb3B5aW5nIGEgdmFsdWUgY29waWVzIGl0cyB0b2tlbiwgYW5kIHRoZSBwYWdlIGl0IHdhcyBjb3BpZWQgb24sIHNvXG4gIC8vIHBhc3RpbmcgaXQgYmFjayBvbiB0aGlzIHBhZ2Ug4oCUIGluIHRoaXMgYmxvY2sgb3IgYW5vdGhlciDigJQgbWFrZXMgaXQgYSBjaGlwXG4gIC8vIGFnYWluLlxuICBwcml2YXRlIF9vbkNvcHkoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9yYW5nZSgpO1xuICAgIGlmICghcmFuZ2UgfHwgcmFuZ2UuY29sbGFwc2VkIHx8ICF0aGlzLl9jaGlwc0luKHJhbmdlKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBob2xkZXIuYXBwZW5kKHJhbmdlLmNsb25lQ29udGVudHMoKSk7XG4gICAgaG9sZGVyLnF1ZXJ5U2VsZWN0b3JBbGwoQ0hJUF9TRUxFQ1RPUikuZm9yRWFjaCgoY2hpcCkgPT4ge1xuICAgICAgY2hpcC5yZXBsYWNlV2l0aCh2YWx1ZVRva2VuKGNoaXAuZ2V0QXR0cmlidXRlKEtFWV9BVFRSSUJVVEUpKSk7XG4gICAgfSk7XG5cbiAgICBldmVudC5jbGlwYm9hcmREYXRhLnNldERhdGEoJ3RleHQvcGxhaW4nLCB0aGlzLl9wbGFpblRleHQoaG9sZGVyKSk7XG4gICAgZXZlbnQuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCd0ZXh0L2h0bWwnLCBob2xkZXIuaW5uZXJIVE1MKTtcbiAgICBldmVudC5jbGlwYm9hcmREYXRhLnNldERhdGEoU0NPUEVfVFlQRSwgdGhpcy5jb25maWcuc2NvcGUoKSk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIC8vIFdoYXQgY29waWVkIGh0bWwgcmVhZHMgYXMgaW4gcGxhaW4gdGV4dDogYSBwYXJhZ3JhcGggb24gaXRzIG93biBsaW5lcywgYVxuICAvLyB0YWJsZSdzIGNlbGxzIHRhYi1zZXBhcmF0ZWQgYW5kIGl0cyByb3dzIG9uIGxpbmVzIG9mIHRoZWlyIG93bi4gVGhhdCBpc1xuICAvLyB0aGUgYnJvd3NlcidzIGlubmVyVGV4dCwgd2hpY2ggb25seSB0ZXh0IGxhaWQgb3V0IG9uIHRoZSBwYWdlIGhhcyDigJQgc29cbiAgLy8gdGhlIGhvbGRlciBpcyBwdXQgb2Zmc2NyZWVuIChub3QgaGlkZGVuOiBoaWRkZW4gdGV4dCBoYXMgbm9uZSkgd2hpbGUgaXQgaXNcbiAgLy8gcmVhZC5cbiAgcHJpdmF0ZSBfcGxhaW5UZXh0KGhvbGRlcjogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGhvbGRlci5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOiBmaXhlZDsgbGVmdDogLTEwMDAwcHg7IHRvcDogMCc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoaG9sZGVyKTtcbiAgICBjb25zdCB0ZXh0ID0gaG9sZGVyLmlubmVyVGV4dDtcbiAgICBob2xkZXIucmVtb3ZlKCk7XG5cbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIHByaXZhdGUgX29uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjaGlwID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KT8uY2xvc2VzdD8uKENISVBfU0VMRUNUT1IpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIWNoaXAgfHwgIXRoaXMuX2VkaXRvcj8uZWwuY29udGFpbnMoY2hpcCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIC8vIEEgcHJlc3MgaW4gYSB0YWJsZSBjZWxsIGNhbiBvcGVuIHRoZSB0YWJsZSdzIHBvcHVwIG9uIG1vdXNldXAsIGp1c3RcbiAgICAvLyBiZWZvcmUgdGhpcyBjbGljazsgYSBjaGlwIGluIGEgY2VsbCBzaG93cyBvbmx5IGl0cyBvd24gcG9wb3Zlci5cbiAgICB0aGlzLl9lZGl0b3IucG9wdXBzLmhpZGUoJ3RhYmxlLmVkaXQnKTtcbiAgICB0aGlzLmNvbmZpZy5jbGljayhjaGlwLmdldEF0dHJpYnV0ZShLRVlfQVRUUklCVVRFKSwgY2hpcCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkNoaXAoZXZlbnQ/OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShldmVudD8udGFyZ2V0IGFzIEVsZW1lbnQgfCB1bmRlZmluZWQpPy5jbG9zZXN0Py4oQ0hJUF9TRUxFQ1RPUik7XG4gIH1cblxuICBwcml2YXRlIF9ibG9jayhldmVudDogRXZlbnQsIGNoaXBzOiBIVE1MRWxlbWVudFtdLCByYW5nZTogUmFuZ2UgfCBudWxsKTogZmFsc2Uge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY2hpcHMuZm9yRWFjaCgoY2hpcCkgPT4gY2hpcC5hbmltYXRlKEZMQVNILCBGTEFTSF9NUykpO1xuXG4gICAgdGhpcy5jb25maWcuYmxvY2tlZCh7XG4gICAgICBjb3VudDogY2hpcHMubGVuZ3RoLFxuICAgICAgLi4uKHJhbmdlID8geyByZW1vdmVTZWxlY3Rpb246ICgpID0+IHRoaXMuX3JlbW92ZVJhbmdlKHJhbmdlKSB9IDoge30pLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlUmFuZ2UocmFuZ2U6IFJhbmdlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9lZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLl9zZWxlY3Rpb24oKTtcbiAgICB0aGlzLl9lZGl0b3IuZWwuZm9jdXMoKTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIHRoaXMuX2VkaXRvci51bmRvLnNhdmVTdGVwKCk7XG4gICAgdGhpcy5fcmVtb3ZpbmcgPSB0cnVlO1xuICAgIC8vIFRoZSBicm93c2VyJ3Mgb3duIGRlbGV0ZSwgc28gdHdvIHBhcmFncmFwaHMgYSBzZWxlY3Rpb24gc3BhbnMgam9pbiB0aGVcbiAgICAvLyB3YXkgdGhleSB3b3VsZCBmb3IgYSBwbGFpbiBEZWxldGUuXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2RlbGV0ZScpO1xuICAgIHRoaXMuX3JlbW92aW5nID0gZmFsc2U7XG4gICAgdGhpcy5fY2hhbmdlZCgpO1xuICB9XG5cbiAgLy8gQW4gZWRpdCBtYWRlIGhlcmUgcmF0aGVyIHRoYW4gdHlwZWQ6IHJlY29yZCBpdCBmb3IgdW5kbywgYW5kIHRlbGxcbiAgLy8gaHRtbC1lZGl0b3Igc28gdGhlIGRyYWZ0IGZvbGxvd3MuXG4gIHByaXZhdGUgX2NoYW5nZWQoKTogdm9pZCB7XG4gICAgdGhpcy5fZWRpdG9yLnVuZG8uc2F2ZVN0ZXAoKTtcbiAgICB0aGlzLl9lZGl0b3IuZXZlbnRzLnRyaWdnZXIoJ2NvbnRlbnRDaGFuZ2VkJyk7XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3Rpb24oKTogU2VsZWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fZWRpdG9yLmVsLm93bmVyRG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gIH1cblxuICAvLyBUaGUgc2VsZWN0aW9uLCB3aGVuIGl0IGlzIGluc2lkZSB0aGlzIGVkaXRvci5cbiAgcHJpdmF0ZSBfcmFuZ2UoKTogUmFuZ2UgfCBudWxsIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLl9lZGl0b3IgPyB0aGlzLl9zZWxlY3Rpb24oKSA6IG51bGw7XG4gICAgaWYgKCFzZWxlY3Rpb24/LnJhbmdlQ291bnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG5cbiAgICByZXR1cm4gdGhpcy5fZWRpdG9yLmVsLmNvbnRhaW5zKHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKSA/IHJhbmdlIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2NoaXBzSW4ocmFuZ2U6IFJhbmdlKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaXBzKCkuZmlsdGVyKChjaGlwKSA9PiByYW5nZS5pbnRlcnNlY3RzTm9kZShjaGlwKSk7XG4gIH1cblxuICAvLyBUaGUgY2hpcCBhIGNvbGxhcHNlZCBjdXJzb3Igd291bGQgZGVsZXRlIGludG86IHN0cmV0Y2ggdGhlIHNlbGVjdGlvbiBieVxuICAvLyB3aGF0IHRoZSBrZXkgZGVsZXRlcywgc2VlIHdoYXQgaXQgY292ZXJzLCBhbmQgcHV0IGl0IGJhY2suIExldHRpbmcgdGhlXG4gIC8vIGJyb3dzZXIgc3RyZXRjaCBpdCBoYW5kbGVzIGV2ZXJ5IHNoYXBlIHRoZSBodG1sIHRha2VzIOKAlCBhIGNoaXAgaW5zaWRlIGFcbiAgLy8gYm9sZCBzcGFuLCBhdCBhIGxpbmUncyBlbmQsIGJlc2lkZSBhbiBlbXB0eSB0ZXh0IG5vZGUuXG4gIHByaXZhdGUgX2FkamFjZW50Q2hpcChiYWNrd2FyZDogYm9vbGVhbiwgZ3JhbnVsYXJpdHk6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5fc2VsZWN0aW9uKCk7XG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jbG9uZVJhbmdlKCk7XG5cbiAgICBzZWxlY3Rpb24ubW9kaWZ5KCdleHRlbmQnLCBiYWNrd2FyZCA/ICdiYWNrd2FyZCcgOiAnZm9yd2FyZCcsIGdyYW51bGFyaXR5KTtcbiAgICBjb25zdCBjaGlwID0gc2VsZWN0aW9uLnJhbmdlQ291bnRcbiAgICAgID8gdGhpcy5fY2hpcHNJbihzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKSlbMF0gPz8gbnVsbFxuICAgICAgOiBudWxsO1xuXG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG5cbiAgICByZXR1cm4gY2hpcDtcbiAgfVxuXG4gIC8vIEhvdyBmYXIgYSBkZWxldGluZyBrZXkgcmVhY2hlczogYSB3b3JkIHdpdGggQ3RybC9BbHQsIHRvIHRoZSBsaW5lJ3Mgc3RhcnRcbiAgLy8gd2l0aCBDbWQgb24gYSBNYWMsIG9uZSBjaGFyYWN0ZXIgb3RoZXJ3aXNlLlxuICBwcml2YXRlIF9ncmFudWxhcml0eShldmVudDogS2V5Ym9hcmRFdmVudCk6IHN0cmluZyB7XG4gICAgaWYgKGV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgIHJldHVybiAnbGluZWJvdW5kYXJ5JztcbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnQuY3RybEtleSB8fCBldmVudC5hbHRLZXkgPyAnd29yZCcgOiAnY2hhcmFjdGVyJztcbiAgfVxufVxuIl19
|
|
696
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWUtZW1iZWQucGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LXRleHQvdmFsdWUtZW1iZWQucGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQWdCLE1BQU0seUJBQXlCLENBQUM7QUFFL0QsT0FBTyxFQUNMLG1CQUFtQixFQUErQixtQkFBbUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQ25ILFVBQVUsR0FDWCxNQUFNLFlBQVksQ0FBQztBQUdwQiwyRUFBMkU7QUFDM0UsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRixzRUFBc0U7QUFDdEUsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUM7QUFDekMsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7QUFDdkMsTUFBTSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQztBQUMvQyxNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQWEsR0FBRyxDQUFDO0FBQzNDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQztBQUUzQiwwRUFBMEU7QUFDMUUsNkVBQTZFO0FBQzdFLHFDQUFxQztBQUNyQyxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztBQUMzQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGVBQWUsR0FBRyxDQUFDO0FBQzlDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQztBQUUzQix1QkFBdUI7QUFDdkIsTUFBTSxjQUFjLEdBQUcsR0FBRyxhQUFhLEtBQUssY0FBYyxFQUFFLENBQUM7QUFFN0QsNkVBQTZFO0FBQzdFLDBFQUEwRTtBQUMxRSxNQUFNLFVBQVUsR0FBRyxxQ0FBcUMsQ0FBQztBQUV6RCxvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUc7SUFDcEMsY0FBYyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCO0NBQ3JGLENBQUM7QUFFRiwyREFBMkQ7QUFDM0QsTUFBTSxzQkFBc0IsR0FBRyxtQkFBbUIsQ0FBQztBQUVuRCx3REFBd0Q7QUFDeEQsTUFBTSxLQUFLLEdBQWUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixFQUFFLENBQUMsQ0FBQztBQUN2RyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUM7QUFFckIsK0VBQStFO0FBQy9FLDJFQUEyRTtBQUMzRSxNQUFNLHFCQUFxQixHQUFHLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQzdELE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQztBQUNyQyxNQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUNsRSxNQUFNLElBQUksR0FBRyxRQUFRLENBQUM7QUFFdEIsa0VBQWtFO0FBQ2xFLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFFMUMsMENBQTBDO0FBQzFDLE1BQU0sYUFBYSxHQUFHLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRXRFLGlFQUFpRTtBQUNqRSxNQUFNLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQztBQW9FMUMsOENBQThDO0FBQzlDLFNBQVMsU0FBUyxDQUFDLElBQWE7SUFDOUIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQztRQUN2QyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNEVBQTRFO0FBQzVFLDRFQUE0RTtBQUM1RSw2RUFBNkU7QUFDN0Usd0NBQXdDO0FBQ3hDLEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw4REFBOEQ7QUFDOUQsMEVBQTBFO0FBQzFFLEVBQUU7QUFDRixzRUFBc0U7QUFDdEUsNkVBQTZFO0FBQzdFLDZFQUE2RTtBQUM3RSxvQkFBb0I7QUFDcEIsRUFBRTtBQUNGLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsNkNBQTZDO0FBQzdDLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxNQUFNO0lBSzFDLCtFQUErRTtJQUN2RSxPQUFPLEdBQVEsSUFBSSxDQUFDO0lBQzVCLHFFQUFxRTtJQUM3RCxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQzFCLDJFQUEyRTtJQUMzRSxrQ0FBa0M7SUFDMUIsYUFBYSxHQUE4QixFQUFFLENBQUM7SUFDdEQseUVBQXlFO0lBQ2pFLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDekIseUVBQXlFO0lBQ3pFLG9EQUFvRDtJQUM1QyxPQUFPLEdBQStCLElBQUksQ0FBQztJQUVuRCxZQUFZLE1BQThCO1FBQ3hDLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVNLFVBQVU7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixNQUFNLEVBQUUsR0FBZ0IsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUV0QixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLHlFQUF5RTtRQUN6RSxlQUFlO1FBQ2YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBb0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxLQUFxQixFQUFFLEVBQUU7WUFDekQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFbkUsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsd0VBQXdFO1FBQ3hFLHVFQUF1RTtRQUN2RSxlQUFlO1FBQ2YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckcsd0VBQXdFO1FBQ3hFLG9DQUFvQztRQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO1lBQy9CLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxhQUFhLEdBQUc7WUFDbkIsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBbUIsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQXVCLENBQUMsQ0FBQztZQUN4RCxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRCxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUF1QixDQUFDLENBQUM7WUFDMUQsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBbUIsQ0FBQyxDQUFDO1NBQ3pELENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRTVGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVNLE9BQU87UUFDWixNQUFNLEVBQUUsR0FBNEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDckQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLG1CQUFtQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNoRyxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLG9FQUFvRTtJQUM3RCxPQUFPO1FBQ1osSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSwyRUFBMkU7SUFDM0UsNEVBQTRFO0lBQzVFLDRFQUE0RTtJQUM1RSxxQkFBcUI7SUFDZCxNQUFNLENBQUMsS0FBYTtRQUN6QixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDMUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPO1FBQ1QsQ0FBQztRQUVELHdFQUF3RTtRQUN4RSxvRUFBb0U7UUFDcEUsd0VBQXdFO1FBQ3hFLHlFQUF5RTtRQUN6RSx1RUFBdUU7UUFDdkUsd0VBQXdFO1FBQ3hFLG1FQUFtRTtRQUNuRSxzQkFBc0I7UUFDdEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQixHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXJCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzVCLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEMsQ0FBQztRQUVELGtFQUFrRTtRQUNsRSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1QixTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsc0VBQXNFO0lBQy9ELFdBQVc7UUFDaEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsWUFBWTtJQUNMLElBQUk7UUFDVCxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsc0VBQXNFO0lBQy9ELFNBQVMsQ0FBQyxHQUFXO1FBQzFCLElBQUksQ0FBQyxNQUFNLEVBQUU7YUFDVixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxDQUFDO2FBQzFELE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxpQ0FBaUM7SUFDMUIsTUFBTSxDQUFDLElBQWlCO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPO1FBQ1QsQ0FBQztRQUVELG1FQUFtRTtRQUNuRSx1RUFBdUU7UUFDdkUsK0NBQStDO1FBQy9DLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1QixTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRU8sTUFBTTtRQUNaLE9BQU8sSUFBSSxDQUFDLE9BQU87WUFDakIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNULENBQUM7SUFFTyxXQUFXO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE9BQU87WUFDakIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDOUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNULENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsNEVBQTRFO0lBQzVFLDZFQUE2RTtJQUM3RSw0RUFBNEU7SUFDNUUsbUNBQW1DO0lBQzNCLFNBQVM7UUFDZixNQUFNLE9BQU8sR0FBNEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxhQUFhLENBQUMsMEJBQTBCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7UUFDOUYsTUFBTSxJQUFJLEdBQUcsTUFBTTtZQUNqQixDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLE1BQU0sQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLE1BQU0sc0JBQXNCLEVBQUUsQ0FBQztZQUNuRyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLFNBQVM7SUFDRCxTQUFTLENBQUMsS0FBcUI7UUFDckMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQztRQUNoQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFELE1BQU0sQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFFaEMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXBCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELDRDQUE0QztJQUNwQyxXQUFXO1FBQ2pCLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM3QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsMENBQTBDO0lBQ2xDLGNBQWMsQ0FBQyxNQUFrQztRQUN2RCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztnQkFDbEIsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzFCLEtBQUssRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN4QixJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTthQUN4QixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSwyRUFBMkU7SUFDM0UsdUVBQXVFO0lBQ3ZFLGtDQUFrQztJQUMxQixjQUFjLENBQUMsTUFBVztRQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE9BQWUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDekYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQUNILG9FQUFvRTtRQUNwRSwrREFBK0Q7UUFDL0QsdUVBQXVFO1FBQ3ZFLDBCQUEwQjtRQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDekQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsc0VBQXNFO0lBQ3RFLHVEQUF1RDtJQUMvQyxnQkFBZ0IsQ0FBQyxPQUFlO1FBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFdEIsSUFBSSxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQzlFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHdFQUF3RSxDQUFDLENBQUM7WUFFOUYsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxrRkFBa0YsQ0FBQyxDQUFDO1lBRXhHLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5RSx5RUFBeUU7UUFDekUsK0RBQStEO1FBQy9ELElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxXQUFXO0lBQ0gsUUFBUSxDQUFDLFFBQWdCO1FBQy9CLE1BQU0sU0FBUyxHQUFtQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUM7UUFFaEcsT0FBTyxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLDhFQUE4RTtJQUM5RSw0RUFBNEU7SUFDNUUscUVBQXFFO0lBQzdELFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSztRQUM3QixNQUFNLEVBQUUsR0FBNEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDckQsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1IsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRSxNQUFNLEtBQUssR0FBVyxFQUFFLENBQUM7UUFDekIsT0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsV0FBbUIsQ0FBQztZQUN4QyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDN0UsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztRQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVPLFlBQVksQ0FBQyxHQUFXO1FBQzlCLE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFTyxVQUFVLENBQUMsSUFBVSxFQUFFLE1BQWU7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1QsQ0FBQztRQUVELHdFQUF3RTtRQUN4RSx5QkFBeUI7UUFDekIsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDbkQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTtZQUNuQyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUMsQ0FBQztRQUNGLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdkIsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNuRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM1QyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEIsQ0FBQztZQUNELFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUV0QyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxrREFBa0Q7SUFDMUMsWUFBWSxDQUFDLElBQVk7UUFDL0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQWMsRUFBRSxDQUFDLENBQUM7WUFDcEYsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1lBQ2xCLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUN2QixHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRTtTQUM1QixDQUFDLENBQUMsQ0FBQztRQUNKLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQ3BGLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztZQUNsQixNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDdkIsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUU7U0FDOUIsQ0FBQyxDQUFDLENBQUM7UUFFSixPQUFPLENBQUMsR0FBRyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQseUVBQXlFO0lBQ2pFLFVBQVUsQ0FBQyxLQUFpQixFQUFFLE1BQWU7UUFDbkQsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxPQUFPLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3RGLENBQUM7SUFFRCx1REFBdUQ7SUFDL0MsWUFBWTtRQUNsQixDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVPLFdBQVcsQ0FBQyxHQUFXO1FBQzdCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWxCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSw0RUFBNEU7SUFDNUUsNkVBQTZFO0lBQzdFLG9EQUFvRDtJQUM1QyxNQUFNLENBQUMsSUFBaUI7UUFDOUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXhDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxLQUFLO1lBQ3ZCLENBQUMsQ0FBQyxHQUFHO1lBQ0wsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1RCxxRUFBcUU7UUFDckUsd0VBQXdFO1FBQ3hFLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxLQUFhO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSwyRUFBMkU7SUFDM0UsNEVBQTRFO0lBQzVFLDBFQUEwRTtJQUMxRSx5RUFBeUU7SUFDekUsOERBQThEO0lBQ3RELFdBQVcsQ0FBQyxJQUFpQjtRQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUM7UUFFOUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUk7WUFDdEIsQ0FBQyxDQUFDLEtBQUs7WUFDUCxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQztRQUN2RSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksS0FBSyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxnRUFBZ0U7SUFDeEQsU0FBUyxDQUFDLElBQVk7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDckUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwRCxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUMxQixRQUFRLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZHLE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQztJQUM1QixDQUFDO0lBRU8sVUFBVSxDQUFDLEtBQW9CO1FBQ3JDLGlEQUFpRDtRQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLFdBQVcsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQztRQUVyRSx1RUFBdUU7UUFDdkUseUVBQXlFO1FBQ3pFLGdDQUFnQztRQUNoQyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0UsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFFOUMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLEtBQUssV0FBVyxDQUFDO1lBQzNDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFFdkQsT0FBTyxJQUFJO2dCQUNULENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQztnQkFDbEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCx5RUFBeUU7UUFDekUsU0FBUztRQUNULE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzFFLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxHQUFHLENBQUM7UUFDcEYsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQzlELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVuQyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3JFLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsd0RBQXdEO0lBQ2hELGNBQWMsQ0FBQyxLQUFpQjtRQUN0QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDN0IsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN0RCxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNuRyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNULElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ25DLENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVELHNFQUFzRTtJQUM5RCxlQUFlLENBQUMsS0FBWTtRQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNoRCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbkMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLHlFQUF5RTtJQUN6RSx5RUFBeUU7SUFDekUsd0JBQXdCO0lBQ2hCLG9CQUFvQixDQUFDLEtBQVksRUFBRSxRQUFpQixFQUFFLFdBQW1CO1FBQy9FLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hELE9BQU87UUFDVCxDQUFDO1FBRUQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXpCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSw0RUFBNEU7SUFDNUUsaURBQWlEO0lBQ3pDLE1BQU0sQ0FBQyxLQUFxQjtRQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM1RyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSwwRUFBMEU7SUFDMUUseUVBQXlFO0lBQ2pFLE9BQU8sQ0FBQyxLQUFxQjtRQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDcEcsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQXFCLEVBQUUsS0FBWTtRQUNyRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTdGLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbkUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzRCxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzdELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSx5RUFBeUU7SUFDekUsNkVBQTZFO0lBQzdFLFFBQVE7SUFDQSxVQUFVLENBQUMsTUFBbUI7UUFDcEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcseUNBQXlDLENBQUM7UUFDakUsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUM5QixNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFaEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sUUFBUSxDQUFDLEtBQWlCO1FBQ2hDLE1BQU0sSUFBSSxHQUFJLEtBQUssQ0FBQyxNQUFrQixFQUFFLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBdUIsQ0FBQztRQUN2RixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDOUMsT0FBTztRQUNULENBQUM7UUFFRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsc0VBQXNFO1FBQ3RFLGtFQUFrRTtRQUNsRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU8sT0FBTyxDQUFDLEtBQWE7UUFDM0IsT0FBTyxDQUFDLENBQUUsS0FBSyxFQUFFLE1BQThCLEVBQUUsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVPLE1BQU0sQ0FBQyxLQUFZLEVBQUUsS0FBb0IsRUFBRSxLQUFtQjtRQUNwRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFdkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDbEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ25CLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3RFLENBQUMsQ0FBQztRQUVILE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLFlBQVksQ0FBQyxLQUFZO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIseUVBQXlFO1FBQ3pFLHFDQUFxQztRQUNyQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLG9DQUFvQztJQUM1QixRQUFRO1FBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVPLFVBQVU7UUFDaEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVELGdEQUFnRDtJQUN4QyxNQUFNO1FBQ1osTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDMUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQztZQUMzQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNoRixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDRFQUE0RTtJQUM1RSxrREFBa0Q7SUFDMUMsU0FBUyxDQUFDLEtBQVk7UUFDNUIsTUFBTSxJQUFJLEdBQWdCLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVqQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsY0FBYyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4RixJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM5QyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBZ0IsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3ZGLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3JELEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSxRQUFRO0lBQ0EsVUFBVSxDQUFDLEtBQWMsRUFBRSxJQUFhO1FBQzlDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUM7UUFFdEUsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzFGLENBQUM7SUFFTyxRQUFRLENBQUMsS0FBWTtRQUMzQixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRU8sYUFBYSxDQUFDLEtBQVk7UUFDaEMsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELGlEQUFpRDtJQUN6QyxhQUFhLENBQUMsUUFBaUIsRUFBRSxXQUFtQjtRQUMxRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUVqRCxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4RCxDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLDJFQUEyRTtJQUMzRSx3RUFBd0U7SUFDeEUsdUVBQXVFO0lBQy9ELE1BQU0sQ0FBQyxRQUFpQixFQUFFLFdBQW1CO1FBQ25ELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRW5ELFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDM0UsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRWpGLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1QixTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSw4Q0FBOEM7SUFDdEMsWUFBWSxDQUFDLEtBQW9CO1FBQ3ZDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7SUFDOUQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5Db25maWcgfSBmcm9tICdAZmlyZXN0aXRjaC9odG1sLWVkaXRvcic7XG5cbmltcG9ydCB7XG4gIEZJRUxEX1RPS0VOX1BBVFRFUk4sIFRleHRUb2tlbkNvbnRleHQsIFRleHRWYWx1ZSwgVkFMVUVfVE9LRU5fUEFUVEVSTiwgZmllbGRUZXh0LCBmaWVsZFRva2VuLCB0ZXh0RmllbGRzLCB2YWx1ZVRleHQsXG4gIHZhbHVlVG9rZW4sXG59IGZyb20gJy4uLy4uL3RleHQnO1xuXG5cbi8vIEhvdyBhIHZhbHVlIGNoaXAgaXMgbWFya2VkIGluIHRoZSBlZGl0b3IuIFRoZSBuYW1lcyBmb2xsb3cgdGhlIGVtYmVkcyBvZlxuLy8gQGZpcmVzdGl0Y2gvbWFya2Rvd24tZWRpdG9yLiBBdHRyaWJ1dGVzIHJhdGhlciB0aGFuIGEgY2xhc3M6IHRoZSByZXBvcnQga2VlcHNcbi8vIEZyb2FsYSBvbiBpbmxpbmUgc3R5bGVzICh1c2VDbGFzc2VzOiBmYWxzZSksIGFuZCBhIGNoaXAgbmV2ZXIgcmVhY2hlcyBzdG9yYWdlXG4vLyBhbnl3YXkg4oCUIGl0IHR1cm5zIGJhY2sgaW50byBpdHMge3t2YWx1ZS5rZXl9fSB0b2tlbiBvbiB0aGUgd2F5IG91dC5cbmNvbnN0IFRZUEVfQVRUUklCVVRFID0gJ2RhdGEtZW1iZWQtdHlwZSc7XG5jb25zdCBLRVlfQVRUUklCVVRFID0gJ2RhdGEtZW1iZWQta2V5JztcbmNvbnN0IE1JU1NJTkdfQVRUUklCVVRFID0gJ2RhdGEtZW1iZWQtbWlzc2luZyc7XG5jb25zdCBDSElQX1NFTEVDVE9SID0gYFske0tFWV9BVFRSSUJVVEV9XWA7XG5jb25zdCBWQUxVRV9UWVBFID0gJ3ZhbHVlJztcblxuLy8gQSBmaWVsZCBjaGlwICh7e3BhZ2UubnVtYmVyfX0sIHt7ZmlsdGVyLjEyfX0sIOKApikgaXMgbWFya2VkIGJ5IGl0cyBmaWVsZFxuLy8gaW5zdGVhZCBvZiBhIGtleS4gSXQgaGFzIG5vdGhpbmcgYmVoaW5kIGl0LCBzbyBub25lIG9mIHRoZSBndWFyZHMgb24gdmFsdWVcbi8vIGNoaXBzIChDSElQX1NFTEVDVE9SKSBhcHBseSB0byBpdC5cbmNvbnN0IEZJRUxEX0FUVFJJQlVURSA9ICdkYXRhLWVtYmVkLWZpZWxkJztcbmNvbnN0IEZJRUxEX1NFTEVDVE9SID0gYFske0ZJRUxEX0FUVFJJQlVURX1dYDtcbmNvbnN0IEZJRUxEX1RZUEUgPSAnZmllbGQnO1xuXG4vLyBFaXRoZXIga2luZCBvZiBjaGlwLlxuY29uc3QgRU1CRURfU0VMRUNUT1IgPSBgJHtDSElQX1NFTEVDVE9SfSwgJHtGSUVMRF9TRUxFQ1RPUn1gO1xuXG4vLyBUaGUgcGFnZSBhIGNvcHkgY2FtZSBmcm9tLCBvbiB0aGUgY2xpcGJvYXJkIGJlc2lkZSBpdHMgdGV4dDogdmFsdWVzIGJlbG9uZ1xuLy8gdG8gdGhlaXIgcGFnZSwgc28gYSB2YWx1ZSBwYXN0ZWQgb250byBhbm90aGVyIG9uZSBkb2Vzbid0IGNvbWUgd2l0aCBpdC5cbmNvbnN0IFNDT1BFX1RZUEUgPSAnYXBwbGljYXRpb24veC1mcy1yZXBvcnQtdmFsdWUtc2NvcGUnO1xuXG4vLyBXaGF0IEZyb2FsYSBtdXN0IGtlZXAgb24gYSBjaGlwIHdoZW4gaXQgY2xlYW5zIGh0bWwgaXQgaXMgaGFuZGVkLlxuZXhwb3J0IGNvbnN0IFZBTFVFX0VNQkVEX0FUVFJJQlVURVMgPSBbXG4gIFRZUEVfQVRUUklCVVRFLCBLRVlfQVRUUklCVVRFLCBGSUVMRF9BVFRSSUJVVEUsIE1JU1NJTkdfQVRUUklCVVRFLCAnY29udGVudGVkaXRhYmxlJyxcbl07XG5cbi8vIFRoZSBsaXN0IGluc2lkZSBhIEZyb2FsYSBkcm9wZG93biAoRnJvYWxhJ3Mgb3duIG1hcmt1cCkuXG5jb25zdCBEUk9QRE9XTl9MSVNUX1NFTEVDVE9SID0gJy5mci1kcm9wZG93bi1saXN0JztcblxuLy8gQSBicmllZiByaW5nIGFyb3VuZCB0aGUgY2hpcHMgYW4gZWRpdCB3YXMgc3RvcHBlZCBhdC5cbmNvbnN0IEZMQVNIOiBLZXlmcmFtZVtdID0gW3sgYm94U2hhZG93OiAnMCAwIDAgMnB4ICNlMTU3NTknIH0sIHsgYm94U2hhZG93OiAnMCAwIDAgMnB4IHRyYW5zcGFyZW50JyB9XTtcbmNvbnN0IEZMQVNIX01TID0gNzAwO1xuXG4vLyBDb21tYW5kcyB0aGF0IHdvdWxkIGJ1aWxkIHdoYXQgdGhlIHNlcnZlciByZXdyaXRlcyAoUmVwb3J0VGV4dEh0bWwpOiBhIHRhYmxlXG4vLyBpcyBrZXB0IG9ubHkgYmV0d2VlbiBwYXJhZ3JhcGhzLCBhbmQgYSBjZWxsIGhvbGRzIHdvcmRzIGFuZCB2YWx1ZXMgb25seS5cbmNvbnN0IFRBQkxFX0lOU0VSVF9DT01NQU5EUyA9IFsnaW5zZXJ0VGFibGUnLCAndGFibGVJbnNlcnQnXTtcbmNvbnN0IE5PX1RBQkxFX0lOU0lERSA9ICdsaSwgdGQsIHRoJztcbmNvbnN0IENFTExfQ09NTUFORFMgPSBbJ2Zvcm1hdFVMJywgJ2Zvcm1hdE9MJywgJ3BhcmFncmFwaEZvcm1hdCddO1xuY29uc3QgQ0VMTCA9ICd0ZCwgdGgnO1xuXG4vLyBVbmRvIGFuZCByZWRvIHJlc3RvcmUgYSBzdGVwOyB0aGV5IHJlbW92ZSBub3RoaW5nIG9mIHRoZWlyIG93bi5cbmNvbnN0IEhJU1RPUllfQ09NTUFORFMgPSBbJ3VuZG8nLCAncmVkbyddO1xuXG4vLyBLZXlzIHRoYXQsIHByZXNzZWQgYWxvbmUsIGVkaXQgbm90aGluZy5cbmNvbnN0IE1PRElGSUVSX0tFWVMgPSBbJ1NoaWZ0JywgJ0NvbnRyb2wnLCAnQWx0JywgJ0FsdEdyYXBoJywgJ01ldGEnXTtcblxuLy8gVGhlIGNlbGxzIG9mIGEgdGFibGUgc2VsZWN0ZWQgYXMgY2VsbHMgKEZyb2FsYSdzIG93biBtYXJraW5nKS5cbmNvbnN0IFNFTEVDVEVEX0NFTEwgPSAnLmZyLXNlbGVjdGVkLWNlbGwnO1xuXG4vLyBBbiBlZGl0IHRoYXQgd291bGQgaGF2ZSByZW1vdmVkIHZhbHVlcywgYW5kIHdhcyBzdG9wcGVkLlxuZXhwb3J0IGludGVyZmFjZSBWYWx1ZUVtYmVkQmxvY2sge1xuICBjb3VudDogbnVtYmVyO1xuICAvLyBQcmVzZW50IHdoZW4gdGhlIGVkaXQgd2FzIG9uIGEgc2VsZWN0aW9uOiByZW1vdmVzIHRoZSBzZWxlY3Rpb24sIHZhbHVlc1xuICAvLyBhbmQgYWxsIOKAlCB0aGUgZGVsaWJlcmF0ZSB3YXkgdGhyb3VnaC5cbiAgcmVtb3ZlU2VsZWN0aW9uPzogKCkgPT4gdm9pZDtcbn1cblxuLy8gQW4gZWRpdCB0aGF0IHRvb2sgdGhlIGxhc3QgY2hpcCBvZiBzb21lIHZhbHVlcyBvdXQgb2YgdGhlIGJsb2NrOiBkZWxldGluZ1xuLy8gYSByb3csIGEgY29sdW1uIG9yIGEgdGFibGUsIG9yIGVtcHR5aW5nIGNlbGxzLiBBbGxvd2VkLCB2YWx1ZXMgYW5kIGFsbC5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdWVFbWJlZFJlbW92YWwge1xuICAvLyBUaGUga2V5cyB0aGUgYmxvY2sncyBjaGlwcyBuYW1lZCBiZWZvcmUgdGhlIGVkaXQsIGFuZCBhZnRlciBpdC5cbiAgYmVmb3JlOiBzdHJpbmdbXTtcbiAgYWZ0ZXI6IHN0cmluZ1tdO1xuICAvLyBUaGUgZWRpdG9yJ3Mgb3duIHVuZG8sIHdoaWNoIGJyaW5ncyB0aGUgY2hpcHMgYmFjay5cbiAgdW5kbzogKCkgPT4gdm9pZDtcbn1cblxuLy8gT25lIGVudHJ5IG9mIHRoZSB0b29sYmFyIGRyb3Bkb3duIHRoYXQgaW5zZXJ0cyB0b2tlbnM6IHRoZSB0b2tlbiwgYW5kIHdoYXRcbi8vIGl0IGlzIGNhbGxlZC5cbmV4cG9ydCBpbnRlcmZhY2UgRW1iZWRNZW51RW50cnkge1xuICB0b2tlbjogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbi8vIEEgdG9rZW4gZm91bmQgaW4gdGhlIGVkaXRvcidzIHRleHQ6IGEgdmFsdWUncyBrZXksIG9yIGEgZmllbGRcbi8vICgncGFnZS5udW1iZXInLCAnZmlsdGVyLjEyJyksIGJvdGggbG93ZXJjYXNlLlxuaW50ZXJmYWNlIEVtYmVkVG9rZW4ge1xuICBpbmRleDogbnVtYmVyO1xuICBsZW5ndGg6IG51bWJlcjtcbiAga2V5Pzogc3RyaW5nO1xuICBmaWVsZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWx1ZUVtYmVkUGx1Z2luQ29uZmlnIGV4dGVuZHMgUGx1Z2luQ29uZmlnIHtcbiAgLy8gVGhlIGVsZW1lbnQgdGhlIGVkaXRvciBzaXRzIGluLiBodG1sLWVkaXRvciByZWdpc3RlcnMgYSBwbHVnaW4gd2l0aCBGcm9hbGFcbiAgLy8gZ2xvYmFsbHksIHNvIEZyb2FsYSBoYW5kcyBpdCBldmVyeSBlZGl0b3IgYnVpbHQgYWZ0ZXJ3YXJkczsgaXQgd29ya3Mgb25seVxuICAvLyBmb3IgdGhlIG9uZSBpbnNpZGUgdGhpcyBlbGVtZW50LlxuICBob3N0OiAoKSA9PiBIVE1MRWxlbWVudDtcbiAgLy8gVGhlIHBhZ2UncyB2YWx1ZXMsIGJ5IGtleS4gT25lIHdob3NlIG51bWJlciBpcyBzdGlsbCBvbiBpdHMgd2F5IGlzIGxpc3RlZFxuICAvLyB3aXRoIGxvYWRpbmc6IHRydWU7IGEga2V5IG5vdCBsaXN0ZWQgaXMgbm8gdmFsdWUgb2YgdGhlIHBhZ2UuXG4gIHZhbHVlczogKCkgPT4gUmVjb3JkPHN0cmluZywgVGV4dFZhbHVlPjtcbiAgLy8gVGhlIHBhZ2UgdGhlIGJsb2NrJ3MgdmFsdWVzIGJlbG9uZyB0by5cbiAgc2NvcGU6ICgpID0+IHN0cmluZztcbiAgLy8gV2hhdCBmaWxscyB0aGUgYmxvY2sncyBwYWdlLCByZXBvcnQgYW5kIGZpbHRlciBmaWVsZHM6IGEgZmllbGQgY2hpcCByZWFkc1xuICAvLyBhcyBpdHMgZmlsbGVkIHRleHQsIGxpa2UgdGhlIHZpZXdlZCBibG9jay5cbiAgZmllbGRzOiAoKSA9PiBUZXh0VG9rZW5Db250ZXh0O1xuICAvLyBUaGUgdG9vbGJhciBkcm9wZG93biB0aGF0IGluc2VydHMgdG9rZW5zIChpbnNlcnQoKSk6IGl0cyBjb21tYW5kLCBhbmRcbiAgLy8gd2hhdCBpdCBsaXN0cywgaW4gb3JkZXIuXG4gIG1lbnU6IHtcbiAgICBjb21tYW5kOiBzdHJpbmc7XG4gICAgZW50cmllczogKCkgPT4gRW1iZWRNZW51RW50cnlbXTtcbiAgfTtcbiAgLy8gTGFiZWwgY2hpcHMgd2l0aCB0aGUgdmFsdWUncyBuYW1lIGluc3RlYWQgb2YgaXRzIG51bWJlciwgYW5kIGZpZWxkIGNoaXBzXG4gIC8vIHdpdGggdGhlIGZpZWxkJ3MgbmFtZSBpbnN0ZWFkIG9mIGl0cyB0ZXh0LlxuICBzaG93TmFtZXM6ICgpID0+IGJvb2xlYW47XG4gIGNsaWNrOiAoa2V5OiBzdHJpbmcsIGNoaXA6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xuICBibG9ja2VkOiAoYmxvY2s6IFZhbHVlRW1iZWRCbG9jaykgPT4gdm9pZDtcbiAgcmVtb3ZlZDogKHJlbW92YWw6IFZhbHVlRW1iZWRSZW1vdmFsKSA9PiB2b2lkO1xuICAvLyBBIGtleSB3YXMgcHJlc3NlZCBvciBhIGNvbW1hbmQgaXMgYWJvdXQgdG8gcnVuOiB3aGF0IHdhcyBzYWlkIGFib3V0IHRoZVxuICAvLyBsYXN0IGVkaXQgbm8gbG9uZ2VyIGFwcGxpZXMuXG4gIGNoYW5nZWQ6ICgpID0+IHZvaWQ7XG4gIC8vIEEgY29tbWFuZCB3YXMgcmVmdXNlZCwgYW5kIHdoeS5cbiAgcmVmdXNlZDogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuLy8gVGhlIHRva2VuIGEgY2hpcCBvZiBlaXRoZXIga2luZCBzdGFuZHMgZm9yLlxuZnVuY3Rpb24gY2hpcFRva2VuKGNoaXA6IEVsZW1lbnQpOiBzdHJpbmcge1xuICByZXR1cm4gY2hpcC5oYXNBdHRyaWJ1dGUoRklFTERfQVRUUklCVVRFKVxuICAgID8gZmllbGRUb2tlbihjaGlwLmdldEF0dHJpYnV0ZShGSUVMRF9BVFRSSUJVVEUpKVxuICAgIDogdmFsdWVUb2tlbihjaGlwLmdldEF0dHJpYnV0ZShLRVlfQVRUUklCVVRFKSk7XG59XG5cbi8vIExpdmUgdmFsdWVzIGFuZCBmaWVsZHMgaW5zaWRlIGEgdGV4dCBibG9jaydzIGVkaXRvci5cbi8vXG4vLyBTdG9yZWQgaHRtbCBjYXJyaWVzIGEgdmFsdWUgYXMgYSB7e3ZhbHVlLmtleX19IHRva2VuLiBXaGlsZSBlZGl0aW5nLCBlYWNoXG4vLyB0b2tlbiBpcyBhIGNoaXA6IG9uZSBjaGFyYWN0ZXIgdG8gdGhlIGN1cnNvciwgbGFiZWxlZCB3aXRoIHRoZSB2YWx1ZSwgYW5kXG4vLyByZXBvcnRpbmcgYSBjbGljay4gRnJvYWxhJ3MgaHRtbC5nZXQgaGFuZHMgYmFjayB0b2tlbnMgYWdhaW4sIHNvIHRoZSBkcmFmdFxuLy8gYW5kIHRoZSBzYXZlZCBodG1sIG5ldmVyIGhvbGQgYSBjaGlwLlxuLy9cbi8vIEEgY2hpcCBjYW4ndCBiZSBkZWxldGVkIGJ5IGVkaXRpbmc6IEJhY2tzcGFjZSBvciBEZWxldGUgYmVzaWRlIGl0LCBhbmQgYW55XG4vLyBkZWxldGluZywgdHlwaW5nIG92ZXIsIGN1dHRpbmcsIHBhc3Rpbmcgb3ZlciBvciBkcmFnZ2luZyBvZiBhIHNlbGVjdGlvbiB0aGF0XG4vLyBob2xkcyBvbmUsIGlzIHN0b3BwZWQgYW5kIHJlcG9ydGVkLiBJdCBpcyB0YWtlbiBvdXQgb24gcHVycG9zZSBieSBzZWxlY3Rpbmdcbi8vIGl0IGFuZCBwcmVzc2luZyBEZWxldGUsIHRoZW4gdGFraW5nIHRoZSBzdG9wcGVkIHNlbGVjdGlvbidzXG4vLyByZW1vdmVTZWxlY3Rpb24oKTsgYSB2YWx1ZSB0aGF0IHdhcyBkZWxldGVkIGxlYXZlcyB0aHJvdWdoIHJlbW92ZUtleSgpLlxuLy9cbi8vIEEgdGFibGUgaXMgdGhlIGV4Y2VwdGlvbjogZGVsZXRpbmcgYSByb3csIGEgY29sdW1uIG9yIHRoZSB0YWJsZSwgb3Jcbi8vIGVtcHR5aW5nIHNldmVyYWwgc2VsZWN0ZWQgY2VsbHMsIGdvZXMgdGhyb3VnaCB3aXRoIHRoZSBjaGlwcyBpbiBpdCwgYW5kIGlzXG4vLyByZXBvcnRlZCBhcyByZW1vdmVkKCkgd2hlbiBpdCB0b29rIGEgdmFsdWUncyBsYXN0IGNoaXAsIHdpdGggdGhlIHVuZG8gdGhhdFxuLy8gYnJpbmdzIHRoZW0gYmFjay5cbi8vXG4vLyBBIHBhZ2UsIHJlcG9ydCBvciBmaWx0ZXIgZmllbGQgKHt7cGFnZS5udW1iZXJ9fSwge3tmaWx0ZXIuMTJ9fSwg4oCmKSBlZGl0cyBhc1xuLy8gYSBmaWVsZCBjaGlwIHRoZSBzYW1lIHdheSDigJQgb25lIGNoYXJhY3RlciwgbGFiZWxlZCwgYmFjayB0byBpdHMgdG9rZW4gb24gdGhlXG4vLyB3YXkgb3V0IOKAlCBidXQgbm90aGluZyBndWFyZHMgaXQ6IGEgZmllbGQgaGFzIG5vdGhpbmcgYmVoaW5kIGl0IHRvIGxvc2UuXG4vLyBCYWNrc3BhY2Ugb3IgRGVsZXRlIHRha2VzIGl0IG91dCBsaWtlIGEgY2hhcmFjdGVyLCBhIHNlbGVjdGlvbiBob2xkaW5nIG9uZVxuLy8gZGVsZXRlcyBhcyBhbnkgb3RoZXIsIGFuZCBhIGNvcHkgb3IgYSBjdXQgY2FycmllcyBpdHMgdG9rZW4gdG8gYW55IGJsb2NrIG9mXG4vLyB0aGUgcmVwb3J0LiBBIGZpZWxkIGNoaXAgcmVwb3J0cyBubyBjbGljay5cbmV4cG9ydCBjbGFzcyBWYWx1ZUVtYmVkUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcblxuICAvLyBUaGUgYmFzZSBjbGFzcydzIGNvbmZpZywgdHlwZWQgZm9yIHRoaXMgcGx1Z2luLlxuICBwdWJsaWMgZGVjbGFyZSBjb25maWc6IFZhbHVlRW1iZWRQbHVnaW5Db25maWc7XG5cbiAgLy8gVGhlIGVkaXRvciB0aGlzIHBsdWdpbiBzZXJ2ZXM7IG51bGwgdW50aWwgaXQgaXMgYnVpbHQsIGFuZCBhZnRlciBpdCBpcyBnb25lLlxuICBwcml2YXRlIF9lZGl0b3I6IGFueSA9IG51bGw7XG4gIC8vIFNldCB3aGlsZSBhIGRlbGliZXJhdGUgcmVtb3ZhbCBydW5zLCBzbyB0aGUgZ3VhcmRzIGxldCBpdCB0aHJvdWdoLlxuICBwcml2YXRlIF9yZW1vdmluZyA9IGZhbHNlO1xuICAvLyBMaXN0ZW5lcnMgb24gdGhlIGVkaXRhYmxlIGVsZW1lbnQsIGNhcHR1cmVkIHNvIGVhY2ggcnVucyBiZWZvcmUgRnJvYWxhJ3NcbiAgLy8gb3duIGhhbmRsZXIgZm9yIHRoZSBzYW1lIGV2ZW50LlxuICBwcml2YXRlIF9kb21MaXN0ZW5lcnM6IFtzdHJpbmcsIEV2ZW50TGlzdGVuZXJdW10gPSBbXTtcbiAgLy8gVGhlIHBhZ2UgdGhlIHBhc3RlIHVuZGVyIHdheSB3YXMgY29waWVkIG9uICgnJyB3aGVuIG5vdCBmcm9tIGEgYmxvY2spLlxuICBwcml2YXRlIF9wYXN0ZVNjb3BlID0gJyc7XG4gIC8vIEhvdyBtYW55IGNoaXBzIGVhY2gga2V5IGhhZCBhcyB0aGUgY29tbWFuZCB1bmRlciB3YXkgc3RhcnRlZDsgbnVsbCBmb3JcbiAgLy8gb25lIHRoYXQgcmVtb3ZlcyBub3RoaW5nIG9mIGl0cyBvd24gKHVuZG8sIHJlZG8pLlxuICBwcml2YXRlIF9iZWZvcmU6IE1hcDxzdHJpbmcsIG51bWJlcj4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFZhbHVlRW1iZWRQbHVnaW5Db25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5ob3N0KCkuY29udGFpbnModGhpcy5lZGl0b3IuZWwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XG4gICAgY29uc3QgZWw6IEhUTUxFbGVtZW50ID0gZWRpdG9yLmVsO1xuICAgIHRoaXMuX2VkaXRvciA9IGVkaXRvcjtcblxuICAgIGVkaXRvci5ldmVudHMub24oJ2h0bWwuc2V0JywgKCkgPT4gdGhpcy5fdG9DaGlwcygpKTtcbiAgICBlZGl0b3IuZXZlbnRzLm9uKCdwYXN0ZS5hZnRlcicsICgpID0+IHRoaXMuX3RvQ2hpcHModHJ1ZSkpO1xuICAgIHRoaXMuX3dhdGNoQ29tbWFuZHMoZWRpdG9yKTtcbiAgICBlZGl0b3IuZXZlbnRzLm9uKCdodG1sLmdldCcsIChodG1sOiBzdHJpbmcpID0+IHRoaXMuX3RvVG9rZW5zKGh0bWwpKTtcbiAgICAvLyBGaXJzdCBpbiBGcm9hbGEncyBjaGFpbiwgc28gaXRzIG93biBCYWNrc3BhY2UgaGFuZGxpbmcgbmV2ZXIgcnVucyBvbiBhXG4gICAgLy8gc3RvcHBlZCBrZXkuXG4gICAgZWRpdG9yLmV2ZW50cy5vbigna2V5ZG93bicsIChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5fb25LZXlkb3duKGV2ZW50KSwgdHJ1ZSk7XG4gICAgZWRpdG9yLmV2ZW50cy5vbigncGFzdGUuYmVmb3JlJywgKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgICAgdGhpcy5fcGFzdGVTY29wZSA9IGV2ZW50Py5jbGlwYm9hcmREYXRhPy5nZXREYXRhKFNDT1BFX1RZUEUpID8/ICcnO1xuXG4gICAgICByZXR1cm4gdGhpcy5fZ3VhcmRTZWxlY3Rpb24oZXZlbnQpO1xuICAgIH0pO1xuICAgIC8vIEEgcHJlc3Mgb24gYSBjaGlwIG9wZW5zIGl0cyBwb3BvdmVyOyBGcm9hbGEncyBmbG9hdGluZyB0b29sYmFyLCB3aGljaFxuICAgIC8vIHBvcHMgdXAgb24gYW55IHByZXNzIGluIHRoZSB0ZXh0IGFuZCBzaXRzIGFib3ZlIGV2ZXJ5IG92ZXJsYXksIHN0YXlzXG4gICAgLy8gYXdheSBmb3IgaXQuXG4gICAgZWRpdG9yLmV2ZW50cy5vbigndG9vbGJhci5zaG93JywgKGV2ZW50PzogRXZlbnQpID0+ICh0aGlzLl9vbkNoaXAoZXZlbnQpID8gZmFsc2UgOiB1bmRlZmluZWQpLCB0cnVlKTtcbiAgICAvLyBPbmx5IHdoaWxlIGl0IGlzIHN0aWxsIHRoaXMgZWRpdG9yOiByZW9wZW5pbmcgYSBibG9jayBidWlsZHMgdGhlIG5leHRcbiAgICAvLyBvbmUgYmVmb3JlIHRoZSBsYXN0IGlzIHRvcm4gZG93bi5cbiAgICBlZGl0b3IuZXZlbnRzLm9uKCdkZXN0cm95JywgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2VkaXRvciA9PT0gZWRpdG9yKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fZG9tTGlzdGVuZXJzID0gW1xuICAgICAgWydiZWZvcmVpbnB1dCcsIChldmVudCkgPT4gdGhpcy5fb25CZWZvcmVJbnB1dChldmVudCBhcyBJbnB1dEV2ZW50KV0sXG4gICAgICBbJ2N1dCcsIChldmVudCkgPT4gdGhpcy5fb25DdXQoZXZlbnQgYXMgQ2xpcGJvYXJkRXZlbnQpXSxcbiAgICAgIFsnZHJhZ3N0YXJ0JywgKGV2ZW50KSA9PiB0aGlzLl9ndWFyZFNlbGVjdGlvbihldmVudCldLFxuICAgICAgWydjb3B5JywgKGV2ZW50KSA9PiB0aGlzLl9vbkNvcHkoZXZlbnQgYXMgQ2xpcGJvYXJkRXZlbnQpXSxcbiAgICAgIFsnY2xpY2snLCAoZXZlbnQpID0+IHRoaXMuX29uQ2xpY2soZXZlbnQgYXMgTW91c2VFdmVudCldLFxuICAgIF07XG4gICAgdGhpcy5fZG9tTGlzdGVuZXJzLmZvckVhY2goKFtuYW1lLCBsaXN0ZW5lcl0pID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIsIHRydWUpKTtcblxuICAgIHRoaXMuX3RvQ2hpcHMoKTtcbiAgICB0aGlzLl9maWxsTWVudSgpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgY29uc3QgZWw6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdGhpcy5fZWRpdG9yPy5lbDtcbiAgICB0aGlzLl9kb21MaXN0ZW5lcnMuZm9yRWFjaCgoW25hbWUsIGxpc3RlbmVyXSkgPT4gZWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIsIHRydWUpKTtcbiAgICB0aGlzLl9kb21MaXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLl9lZGl0b3IgPSBudWxsO1xuICB9XG5cbiAgLy8gUmVsYWJlbCBldmVyeSBjaGlwOiB0aGUgdmFsdWVzIG9yIHRoZSBmaWVsZHMgYXJyaXZlZCBvciBjaGFuZ2VkLCBvciBuYW1lc1xuICAvLyB3ZXJlIHRvZ2dsZWQuIFRoZSBpbnNlcnQgbWVudSBmb2xsb3dzIHRoZSB2YWx1ZXMgYW5kIGZpbHRlcnMgdG9vLlxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGlwcygpLmZvckVhY2goKGNoaXApID0+IHRoaXMuX2xhYmVsKGNoaXApKTtcbiAgICB0aGlzLl9maWVsZENoaXBzKCkuZm9yRWFjaCgoY2hpcCkgPT4gdGhpcy5fbGFiZWxGaWVsZChjaGlwKSk7XG4gICAgdGhpcy5fZmlsbE1lbnUoKTtcbiAgfVxuXG4gIC8vIFB1dCBhIHRva2VuIGluIGF0IHRoZSBjdXJzb3IgYXMgaXRzIGNoaXAsIGluIHBsYWNlIG9mIGFueSBzZWxlY3Rpb246IHRoZVxuICAvLyBpbnNlcnQgbWVudS4gQSB2YWx1ZSBjb21lcyBpbiBhcyBhIGNoaXAgbGlrZSBhbnkgb3RoZXIsIGd1YXJkZWQgYW5kIHJlYWRcbiAgLy8gYnkgdGhlIGJsb2NrIGZyb20gdGhlbiBvbjsgYSBmaWVsZCBhcyBhIGZpZWxkIGNoaXAuIEl0IHJ1bnMgYXMgdGhlIG1lbnUnc1xuICAvLyB0b29sYmFyIGNvbW1hbmQsIHNvIGEgc2VsZWN0aW9uIGhvbGRpbmcgdmFsdWVzIGlzIHJlcGxhY2VkLCBhbmQgcmVwb3J0ZWQsXG4gIC8vIGFzIGJ5IGFueSBjb21tYW5kLlxuICBwdWJsaWMgaW5zZXJ0KHRva2VuOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBbZW1iZWRdID0gdGhpcy5fZW1iZWRUb2tlbnModG9rZW4pO1xuICAgIGNvbnN0IGNoaXAgPSBlbWJlZCA/IHRoaXMuX3Rva2VuQ2hpcChlbWJlZCwgZmFsc2UpIDogbnVsbDtcbiAgICBjb25zdCByYW5nZSA9IGNoaXAgPyB0aGlzLl9yYW5nZSgpIDogbnVsbDtcbiAgICBpZiAoIXJhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIGNoaXAgZ29lcyBpbiB3aGVyZSB0aGUgc2VsZWN0aW9uIGVuZHMsIGFuZCB0aGUgc2VsZWN0aW9uIHVwIHRvIGl0XG4gICAgLy8gdGhlbiBjb21lcyBvdXQgdGhyb3VnaCBGcm9hbGEncyBvd24gZGVsZXRlLCB0aGUgb25lIHR5cGluZyBvdmVyIGFcbiAgICAvLyBzZWxlY3Rpb24gcnVucywgc28gcGFyYWdyYXBocyBpdCBzcGFucyBqb2luIGFzIGZvciBhIHR5cGVkIGNoYXJhY3Rlci5cbiAgICAvLyBUaGUgYnJvd3NlcidzIGRlbGV0ZSB3b3VsZCByYWlzZSBhbiBpbnB1dCBldmVudCwgd2hpY2ggRnJvYWxhIHNhdmVzIGFzXG4gICAgLy8gYW4gdW5kbyBzdGVwIG9mIGl0cyBvd247IHRoaXMgb25lIHJhaXNlcyBub25lLCBzbyBvbmUgdW5kbyB0YWtlcyB0aGVcbiAgICAvLyB3aG9sZSBpbnNlcnQgYmFjay4gQW5kIHdpdGggdGhlIGNoaXAgYWxyZWFkeSBiZXR3ZWVuIHRoZW0sIHRoZSBzcGFjZXNcbiAgICAvLyBlaXRoZXIgc2lkZSBvZiB0aGUgc2VsZWN0aW9uIG5ldmVyIG1lZXQsIHNvIG5laXRoZXIgdHVybnMgaW50byBhXG4gICAgLy8gbm9uLWJyZWFraW5nIHNwYWNlLlxuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5faW5CbG9ja3MocmFuZ2UpO1xuICAgIGNvbnN0IGVuZCA9IHNlbGVjdGVkLmNsb25lUmFuZ2UoKTtcbiAgICBlbmQuY29sbGFwc2UoZmFsc2UpO1xuICAgIGVuZC5pbnNlcnROb2RlKGNoaXApO1xuXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5fc2VsZWN0aW9uKCk7XG4gICAgaWYgKCFzZWxlY3RlZC5jb2xsYXBzZWQpIHtcbiAgICAgIHNlbGVjdGVkLnNldEVuZEJlZm9yZShjaGlwKTtcbiAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShzZWxlY3RlZCk7XG4gICAgICB0aGlzLl9lZGl0b3Iuc2VsZWN0aW9uLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIC8vIFRoZSBjdXJzb3IgZ29lcyBhZnRlciB0aGUgY2hpcCwgc28gdHlwaW5nIGNhcnJpZXMgb24gYmVoaW5kIGl0LlxuICAgIGNvbnN0IGNhcmV0ID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICBjYXJldC5zZXRTdGFydEFmdGVyKGNoaXApO1xuICAgIGNhcmV0LmNvbGxhcHNlKHRydWUpO1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWxlY3Rpb24uYWRkUmFuZ2UoY2FyZXQpO1xuICB9XG5cbiAgLy8gUHV0IEZyb2FsYSdzIGZsb2F0aW5nIHRvb2xiYXIgYW5kIGEgdGFibGUncyBwb3B1cCBhd2F5LCB3aGVuIGVpdGhlciBpc1xuICAvLyBhbHJlYWR5IHVwIGFzIGEgY2hpcCdzIHBvcG92ZXIgb3BlbnM6IHRoZXkgc2l0IGFib3ZlIGV2ZXJ5IG92ZXJsYXkuXG4gIHB1YmxpYyBoaWRlVG9vbGJhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9lZGl0b3I/LnRvb2xiYXIuaGlkZSgpO1xuICAgIHRoaXMuX2VkaXRvcj8ucG9wdXBzLmhpZGUoJ3RhYmxlLmVkaXQnKTtcbiAgfVxuXG4gIC8vIFRoZSBlZGl0b3IncyBvd24gdW5kbyBvZiB0aGUgbGFzdCBzdGVwOiB3aGF0IHB1dHMgYmFjayB0aGUgY2hpcHMgYW4gZWRpdFxuICAvLyB0b29rIG91dC5cbiAgcHVibGljIHVuZG8oKTogdm9pZCB7XG4gICAgdGhpcy5fZWRpdG9yPy5jb21tYW5kcy51bmRvKCk7XG4gIH1cblxuICAvLyBUYWtlIGEgdmFsdWUgb3V0IG9mIHRoZSB0ZXh0LCB3aGVyZXZlciBpdCBhcHBlYXJzIOKAlCBpdCB3YXMgZGVsZXRlZC5cbiAgcHVibGljIHJlbW92ZUtleShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2NoaXBzKClcbiAgICAgIC5maWx0ZXIoKGNoaXApID0+IGNoaXAuZ2V0QXR0cmlidXRlKEtFWV9BVFRSSUJVVEUpID09PSBrZXkpXG4gICAgICAuZm9yRWFjaCgoY2hpcCkgPT4gdGhpcy5yZW1vdmUoY2hpcCkpO1xuICB9XG5cbiAgLy8gVGFrZSBvbmUgY2hpcCBvdXQgb2YgdGhlIHRleHQuXG4gIHB1YmxpYyByZW1vdmUoY2hpcDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2VkaXRvcj8uZWwuY29udGFpbnMoY2hpcCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgY3Vyc29yIGdvZXMgYmFjayB3aGVyZSB0aGUgY2hpcCB3YXMg4oCUIHdoYXRldmVyIGFza2VkIGZvciB0aGVcbiAgICAvLyByZW1vdmFsIChhIGRpYWxvZywgYSBwb3BvdmVyKSB0b29rIHRoZSBmb2N1cywgYW5kIHdpdGhvdXQgaXQgYW4gVW5kb1xuICAgIC8vIHN0cmFpZ2h0IGFmdGVyIHdvdWxkIG5ldmVyIHJlYWNoIHRoZSBlZGl0b3IuXG4gICAgY29uc3QgY2FyZXQgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIGNhcmV0LnNldFN0YXJ0QmVmb3JlKGNoaXApO1xuICAgIGNhcmV0LmNvbGxhcHNlKHRydWUpO1xuXG4gICAgdGhpcy5fZWRpdG9yLnVuZG8uc2F2ZVN0ZXAoKTtcbiAgICBjaGlwLnJlbW92ZSgpO1xuICAgIHRoaXMuX2VkaXRvci5lbC5mb2N1cygpO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuX3NlbGVjdGlvbigpO1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWxlY3Rpb24uYWRkUmFuZ2UoY2FyZXQpO1xuICAgIHRoaXMuX2NoYW5nZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NoaXBzKCk6IEhUTUxFbGVtZW50W10ge1xuICAgIHJldHVybiB0aGlzLl9lZGl0b3JcbiAgICAgID8gQXJyYXkuZnJvbSh0aGlzLl9lZGl0b3IuZWwucXVlcnlTZWxlY3RvckFsbChDSElQX1NFTEVDVE9SKSlcbiAgICAgIDogW107XG4gIH1cblxuICBwcml2YXRlIF9maWVsZENoaXBzKCk6IEhUTUxFbGVtZW50W10ge1xuICAgIHJldHVybiB0aGlzLl9lZGl0b3JcbiAgICAgID8gQXJyYXkuZnJvbSh0aGlzLl9lZGl0b3IuZWwucXVlcnlTZWxlY3RvckFsbChGSUVMRF9TRUxFQ1RPUikpXG4gICAgICA6IFtdO1xuICB9XG5cbiAgLy8gRnJvYWxhIHdyaXRlcyBhIGRyb3Bkb3duJ3MgbGlzdCBvbmNlLCBhcyBpdHMgdG9vbGJhciBpcyBidWlsdCwgZnJvbSB0aGVcbiAgLy8gb3B0aW9ucyByZWdpc3RlcmVkIGZvciB0aGUgY29tbWFuZCAoZ2xvYmFsbHksIGZvciBldmVyeSBlZGl0b3IpLCBhbmQgcHV0c1xuICAvLyBhIHRpdGxlIG9uIGVhY2ggZW50cnkuIFNvIHRoZSBpbnNlcnQgbWVudSBpcyBmaWxsZWQgaGVyZSBpbnN0ZWFkLCBmb3IgdGhpc1xuICAvLyBlZGl0b3IsIGZyb20gd2hhdCBpdHMgYmxvY2sgaGFzIG5vdywgYW5kIGFnYWluIGFzIHRoYXQgY2hhbmdlcy4gTm8gdGl0bGU6XG4gIC8vIGhvdmVyaW5nIGFuIGVudHJ5IHNob3dzIG5vdGhpbmcuXG4gIHByaXZhdGUgX2ZpbGxNZW51KCk6IHZvaWQge1xuICAgIGNvbnN0IHRvb2xiYXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdGhpcy5fZWRpdG9yPy4kdGI/LmdldCgwKTtcbiAgICBjb25zdCBidXR0b24gPSB0b29sYmFyPy5xdWVyeVNlbGVjdG9yKGAuZnItZHJvcGRvd25bZGF0YS1jbWQ9XCIke3RoaXMuY29uZmlnLm1lbnUuY29tbWFuZH1cIl1gKTtcbiAgICBjb25zdCBsaXN0ID0gYnV0dG9uXG4gICAgICA/IHRvb2xiYXIucXVlcnlTZWxlY3RvcihgW2lkPVwiJHtidXR0b24uZ2V0QXR0cmlidXRlKCdhcmlhLWNvbnRyb2xzJyl9XCJdICR7RFJPUERPV05fTElTVF9TRUxFQ1RPUn1gKVxuICAgICAgOiBudWxsO1xuICAgIGlmICghbGlzdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxpc3QucmVwbGFjZUNoaWxkcmVuKC4uLnRoaXMuY29uZmlnLm1lbnUuZW50cmllcygpLm1hcCgoZW50cnkpID0+IHRoaXMuX21lbnVJdGVtKGVudHJ5KSkpO1xuICB9XG5cbiAgLy8gQW4gZW50cnkgYXMgRnJvYWxhIHdyaXRlcyBvbmU6IGNob29zaW5nIGl0IHJ1bnMgdGhlIGNvbW1hbmQgd2l0aCB0aGVcbiAgLy8gdG9rZW4uXG4gIHByaXZhdGUgX21lbnVJdGVtKGVudHJ5OiBFbWJlZE1lbnVFbnRyeSk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgb3B0aW9uLmNsYXNzTmFtZSA9ICdmci1jb21tYW5kJztcbiAgICBvcHRpb24udGFiSW5kZXggPSAtMTtcbiAgICBvcHRpb24uc2V0QXR0cmlidXRlKCdyb2xlJywgJ29wdGlvbicpO1xuICAgIG9wdGlvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtY21kJywgdGhpcy5jb25maWcubWVudS5jb21tYW5kKTtcbiAgICBvcHRpb24uc2V0QXR0cmlidXRlKCdkYXRhLXBhcmFtMScsIGVudHJ5LnRva2VuKTtcbiAgICBvcHRpb24udGV4dENvbnRlbnQgPSBlbnRyeS5uYW1lO1xuXG4gICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gICAgaXRlbS5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAncHJlc2VudGF0aW9uJyk7XG4gICAgaXRlbS5hcHBlbmQob3B0aW9uKTtcblxuICAgIHJldHVybiBpdGVtO1xuICB9XG5cbiAgLy8gSG93IG1hbnkgY2hpcHMgZWFjaCBrZXkgaGFzIGluIHRoZSBibG9jay5cbiAgcHJpdmF0ZSBfY2hpcENvdW50cygpOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgICBjb25zdCBjb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIHRoaXMuX2NoaXBzKCkuZm9yRWFjaCgoY2hpcCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gY2hpcC5nZXRBdHRyaWJ1dGUoS0VZX0FUVFJJQlVURSk7XG4gICAgICBjb3VudHMuc2V0KGtleSwgKGNvdW50cy5nZXQoa2V5KSA/PyAwKSArIDEpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvdW50cztcbiAgfVxuXG4gIC8vIFRlbGwgdGhlIGhvc3Qgd2hlbiBhbiBlZGl0IHRvb2sgdGhlIGxhc3QgY2hpcCBvZiBzb21lIGtleSBvdXQgb2YgdGhlXG4gIC8vIGJsb2NrLCBnaXZlbiB0aGUgY291bnRzIGZyb20gYmVmb3JlIGl0LlxuICBwcml2YXRlIF9yZXBvcnRSZW1vdmVkKGJlZm9yZTogTWFwPHN0cmluZywgbnVtYmVyPiB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIWJlZm9yZSB8fCAhdGhpcy5fZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWZ0ZXIgPSB0aGlzLl9jaGlwQ291bnRzKCk7XG4gICAgaWYgKFsuLi5iZWZvcmUua2V5cygpXS5zb21lKChrZXkpID0+ICFhZnRlci5oYXMoa2V5KSkpIHtcbiAgICAgIHRoaXMuY29uZmlnLnJlbW92ZWQoe1xuICAgICAgICBiZWZvcmU6IFsuLi5iZWZvcmUua2V5cygpXSxcbiAgICAgICAgYWZ0ZXI6IFsuLi5hZnRlci5rZXlzKCldLFxuICAgICAgICB1bmRvOiAoKSA9PiB0aGlzLnVuZG8oKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEEgdG9vbGJhciBjb21tYW5kIHNlZXMgdG9rZW5zLCBub3QgY2hpcHM6IENsZWFyIGZvcm1hdHRpbmcgdW53cmFwcyBldmVyeVxuICAvLyBzcGFuLCBhIGNoaXAgaW5jbHVkZWQsIHdoaWNoIHdvdWxkIGxlYXZlIGEgdHlwZWQgbnVtYmVyIGJlaGluZC4gQXJvdW5kIGFcbiAgLy8gdG9rZW4gaXQgZm9ybWF0cyBwbGFpbiB0ZXh0LCBhbmQgdGhlIGNoaXAgY29tZXMgYmFjayBpbnNpZGUgd2hhdGV2ZXJcbiAgLy8gZm9ybWF0dGluZyB0aGUgdG9rZW4gd2FzIGdpdmVuLlxuICBwcml2YXRlIF93YXRjaENvbW1hbmRzKGVkaXRvcjogYW55KTogdm9pZCB7XG4gICAgZWRpdG9yLmV2ZW50cy5vbignY29tbWFuZHMuYmVmb3JlJywgKGNvbW1hbmQ6IHN0cmluZykgPT4gdGhpcy5fb25Db21tYW5kQmVmb3JlKGNvbW1hbmQpKTtcbiAgICBlZGl0b3IuZXZlbnRzLm9uKCdjb21tYW5kcy5hZnRlcicsICgpID0+IHtcbiAgICAgIHRoaXMuX3RvQ2hpcHMoKTtcbiAgICAgIHRoaXMuX3JlcG9ydFJlbW92ZWQodGhpcy5fYmVmb3JlKTtcbiAgICAgIHRoaXMuX2JlZm9yZSA9IG51bGw7XG4gICAgfSk7XG4gICAgLy8gVW5kbyBhbmQgcmVkbyByZXN0b3JlIGEgc3RlcCBhcyBGcm9hbGEgc2F2ZWQgaXQ6IHRoZSBvbmUgYmVmb3JlIGFcbiAgICAvLyBjb21tYW5kIGhvbGRzIHRva2VucywgYXMgdGhlIGNvbW1hbmQgc2F3IHRoZW0uIE5laXRoZXIgZmlyZXNcbiAgICAvLyBjb21tYW5kcy5hZnRlcjogRnJvYWxhJ3MgY29tbWFuZHMudW5kbygpIOKAlCBDdHJsK1osIGFuZCB1bmRvKCkgaGVyZSDigJRcbiAgICAvLyBydW5zIHRoZSB1bmRvIGRpcmVjdGx5LlxuICAgIGVkaXRvci5ldmVudHMub24oJ2NvbW1hbmRzLnVuZG8nLCAoKSA9PiB0aGlzLl90b0NoaXBzKCkpO1xuICAgIGVkaXRvci5ldmVudHMub24oJ2NvbW1hbmRzLnJlZG8nLCAoKSA9PiB0aGlzLl90b0NoaXBzKCkpO1xuICB9XG5cbiAgLy8gRXZlcnkgY29tbWFuZCBzdGFydHMgYSBuZXcgZWRpdC4gT25lIHRoYXQgd291bGQgYnVpbGQgd2hhdCB0aGUgc2VydmVyXG4gIC8vIHJld3JpdGVzIGlzIHJlZnVzZWQgKHJldHVybmluZyBmYWxzZSBjYW5jZWxzIGl0KTsgYW55IG90aGVyIHJ1bnMgb25cbiAgLy8gdG9rZW5zLCBpdHMgY2hpcCBjb3VudHMga2VwdCB0byBzZWUgd2hhdCBpdCByZW1vdmVkLlxuICBwcml2YXRlIF9vbkNvbW1hbmRCZWZvcmUoY29tbWFuZDogc3RyaW5nKTogZmFsc2UgfCB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5jaGFuZ2VkKCk7XG5cbiAgICBpZiAoVEFCTEVfSU5TRVJUX0NPTU1BTkRTLmluY2x1ZGVzKGNvbW1hbmQpICYmIHRoaXMuX2NhcmV0SW4oTk9fVEFCTEVfSU5TSURFKSkge1xuICAgICAgdGhpcy5jb25maWcucmVmdXNlZCgnQSB0YWJsZSBnb2VzIGJldHdlZW4gcGFyYWdyYXBocywgbmV2ZXIgaW5zaWRlIGEgbGlzdCBvciBhbm90aGVyIHRhYmxlLicpO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKENFTExfQ09NTUFORFMuaW5jbHVkZXMoY29tbWFuZCkgJiYgdGhpcy5fY2FyZXRJbihDRUxMKSkge1xuICAgICAgdGhpcy5jb25maWcucmVmdXNlZCgnQSB0YWJsZSBjZWxsIGhvbGRzIHdvcmRzIGFuZCB2YWx1ZXM7IGEgbGlzdCBvciBhIGhlYWRpbmcgZ29lcyBvdXRzaWRlIHRoZSB0YWJsZS4nKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuX2JlZm9yZSA9IEhJU1RPUllfQ09NTUFORFMuaW5jbHVkZXMoY29tbWFuZCkgPyBudWxsIDogdGhpcy5fY2hpcENvdW50cygpO1xuICAgIC8vIFRoZSBpbnNlcnQgbWVudSBwdXRzIGEgY2hpcCBpbiBpdHNlbGYsIGFtb25nIGNoaXBzIHRoYXQgc3RheSBjaGlwczogYXNcbiAgICAvLyB0b2tlbnMgdGhleSB3b3VsZCB0YWtlIGEgY3Vyc29yIGp1c3QgYWZ0ZXIgb25lIHRvIGJlZm9yZSBpdC5cbiAgICBpZiAoY29tbWFuZCAhPT0gdGhpcy5jb25maWcubWVudS5jb21tYW5kKSB7XG4gICAgICB0aGlzLl90b1Rva2VuVGV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdoZXRoZXIgdGhlIGNhcmV0IHNpdHMgaW5zaWRlIGFuIGVsZW1lbnQgb2YgdGhpcyBlZGl0b3IgdGhhdCBgc2VsZWN0b3JgXG4gIC8vIG1hdGNoZXMuXG4gIHByaXZhdGUgX2NhcmV0SW4oc2VsZWN0b3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvbnRhaW5lcjogRWxlbWVudCB8IG51bGwgPSB0aGlzLl9lZGl0b3Iuc2VsZWN0aW9uLmVsZW1lbnQoKT8uY2xvc2VzdD8uKHNlbGVjdG9yKSA/PyBudWxsO1xuXG4gICAgcmV0dXJuICEhY29udGFpbmVyICYmIHRoaXMuX2VkaXRvci5lbC5jb250YWlucyhjb250YWluZXIpO1xuICB9XG5cbiAgLy8gVHVybiBldmVyeSB7e3ZhbHVlLmtleX19IGFuZCBmaWVsZCB0b2tlbiBpbiB0aGUgZWRpdG9yJ3MgdGV4dCBpbnRvIGEgY2hpcC5cbiAgLy8gRm9yIGEgcGFzdGUsIGEgdmFsdWUncyB0b2tlbiBvbmx5IHN0YXlzIHdoZW4gaXQgd2FzIGNvcGllZCBvbiB0aGlzIHBhZ2UgYW5kXG4gIC8vIHRoZSBwYWdlIGhhcyB0aGUgdmFsdWU7IG90aGVyd2lzZSBpdCBnb2VzLCBhbmQganVzdCB0aGUgdGV4dCBhcm91bmQgaXQgaXNcbiAgLy8gcGFzdGVkLiBBIGZpZWxkJ3MgYWx3YXlzIHN0YXlzOiBmaWVsZHMgYmVsb25nIHRvIHRoZSB3aG9sZSByZXBvcnQuXG4gIHByaXZhdGUgX3RvQ2hpcHMocGFzdGVkID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBlbDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQgPSB0aGlzLl9lZGl0b3I/LmVsO1xuICAgIGlmICghZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGVsLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7XG4gICAgY29uc3QgdGV4dHM6IFRleHRbXSA9IFtdO1xuICAgIHdoaWxlICh3YWxrZXIubmV4dE5vZGUoKSkge1xuICAgICAgY29uc3QgdGV4dCA9IHdhbGtlci5jdXJyZW50Tm9kZSBhcyBUZXh0O1xuICAgICAgaWYgKHRleHQuZGF0YS5pbmNsdWRlcygne3snKSAmJiAhdGV4dC5wYXJlbnRFbGVtZW50Py5jbG9zZXN0KEVNQkVEX1NFTEVDVE9SKSkge1xuICAgICAgICB0ZXh0cy5wdXNoKHRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRleHRzLmZvckVhY2goKHRleHQpID0+IHRoaXMuX3NwbGl0VGV4dCh0ZXh0LCBwYXN0ZWQpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2tlZXBzUGFzdGVkKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Bhc3RlU2NvcGUgPT09IHRoaXMuY29uZmlnLnNjb3BlKCkgJiYgISF0aGlzLmNvbmZpZy52YWx1ZXMoKVtrZXldO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3BsaXRUZXh0KHRleHQ6IFRleHQsIHBhc3RlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHRva2VucyA9IHRoaXMuX2VtYmVkVG9rZW5zKHRleHQuZGF0YSk7XG4gICAgaWYgKCF0b2tlbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT25seSBub24tZW1wdHkgdGV4dCBhcm91bmQgdGhlIGNoaXBzLCBzbyBhIHNlbGVjdGlvbiBjb3VudGVkIGluIGNoaWxkXG4gICAgLy8gbm9kZXMga2VlcHMgaXRzIHBsYWNlLlxuICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgIGNvbnN0IGFwcGVuZFRleHQgPSAodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGZyYWdtZW50LmFwcGVuZCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBsZXQgY29uc3VtZWQgPSAwO1xuICAgIHRva2Vucy5mb3JFYWNoKCh0b2tlbikgPT4ge1xuICAgICAgYXBwZW5kVGV4dCh0ZXh0LmRhdGEuc2xpY2UoY29uc3VtZWQsIHRva2VuLmluZGV4KSk7XG4gICAgICBjb25zdCBjaGlwID0gdGhpcy5fdG9rZW5DaGlwKHRva2VuLCBwYXN0ZWQpO1xuICAgICAgaWYgKGNoaXApIHtcbiAgICAgICAgZnJhZ21lbnQuYXBwZW5kKGNoaXApO1xuICAgICAgfVxuICAgICAgY29uc3VtZWQgPSB0b2tlbi5pbmRleCArIHRva2VuLmxlbmd0aDtcbiAgICB9KTtcbiAgICBhcHBlbmRUZXh0KHRleHQuZGF0YS5zbGljZShjb25zdW1lZCkpO1xuXG4gICAgdGV4dC5yZXBsYWNlV2l0aChmcmFnbWVudCk7XG4gIH1cblxuICAvLyBUaGUgdmFsdWUgYW5kIGZpZWxkIHRva2VucyBpbiBhIHRleHQsIGluIG9yZGVyLlxuICBwcml2YXRlIF9lbWJlZFRva2Vucyh0ZXh0OiBzdHJpbmcpOiBFbWJlZFRva2VuW10ge1xuICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmZyb20odGV4dC5tYXRjaEFsbChWQUxVRV9UT0tFTl9QQVRURVJOKSwgKG1hdGNoKTogRW1iZWRUb2tlbiA9PiAoe1xuICAgICAgaW5kZXg6IG1hdGNoLmluZGV4LFxuICAgICAgbGVuZ3RoOiBtYXRjaFswXS5sZW5ndGgsXG4gICAgICBrZXk6IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCksXG4gICAgfSkpO1xuICAgIGNvbnN0IGZpZWxkcyA9IEFycmF5LmZyb20odGV4dC5tYXRjaEFsbChGSUVMRF9UT0tFTl9QQVRURVJOKSwgKG1hdGNoKTogRW1iZWRUb2tlbiA9PiAoe1xuICAgICAgaW5kZXg6IG1hdGNoLmluZGV4LFxuICAgICAgbGVuZ3RoOiBtYXRjaFswXS5sZW5ndGgsXG4gICAgICBmaWVsZDogbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSxcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gWy4uLnZhbHVlcywgLi4uZmllbGRzXS5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG4gIH1cblxuICAvLyBUaGUgY2hpcCBhIHRva2VuIGVkaXRzIGFzOyBudWxsIGZvciBhIHBhc3RlZCB2YWx1ZSB0aGF0IGRvZXMgbm90IHN0YXkuXG4gIHByaXZhdGUgX3Rva2VuQ2hpcCh0b2tlbjogRW1iZWRUb2tlbiwgcGFzdGVkOiBib29sZWFuKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBpZiAodG9rZW4uZmllbGQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVGaWVsZENoaXAodG9rZW4uZmllbGQpO1xuICAgIH1cblxuICAgIHJldHVybiAhcGFzdGVkIHx8IHRoaXMuX2tlZXBzUGFzdGVkKHRva2VuLmtleSkgPyB0aGlzLl9jcmVhdGVDaGlwKHRva2VuLmtleSkgOiBudWxsO1xuICB9XG5cbiAgLy8gRXZlcnkgY2hpcCBpbiB0aGUgZWRpdG9yIGJhY2sgdG8gaXRzIHRva2VuLCBhcyB0ZXh0LlxuICBwcml2YXRlIF90b1Rva2VuVGV4dCgpOiB2b2lkIHtcbiAgICBbLi4udGhpcy5fY2hpcHMoKSwgLi4udGhpcy5fZmllbGRDaGlwcygpXS5mb3JFYWNoKChjaGlwKSA9PiBjaGlwLnJlcGxhY2VXaXRoKGNoaXBUb2tlbihjaGlwKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlQ2hpcChrZXk6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBjaGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGNoaXAuc2V0QXR0cmlidXRlKFRZUEVfQVRUUklCVVRFLCBWQUxVRV9UWVBFKTtcbiAgICBjaGlwLnNldEF0dHJpYnV0ZShLRVlfQVRUUklCVVRFLCBrZXkpO1xuICAgIGNoaXAuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCAnZmFsc2UnKTtcbiAgICB0aGlzLl9sYWJlbChjaGlwKTtcblxuICAgIHJldHVybiBjaGlwO1xuICB9XG5cbiAgLy8gQSBjaGlwIHJlYWRzIGFzIHRoZSB2YWx1ZSBkb2VzIGluIHRoZSB2aWV3ZWQgYmxvY2sg4oCUIGl0cyBudW1iZXIsIHRoZVxuICAvLyBlbGxpcHNpcyB3aGlsZSB0aGF0IGxvYWRzLCBlbHNlIHRoZSBlbSBkYXNoIOKAlCBzbyBvcGVuaW5nIHRoZSBlZGl0b3IgbW92ZXNcbiAgLy8gbm8gd29yZDsgb3IgYXMgaXRzIG5hbWUsIHdoZW4gbmFtZXMgYXJlIHRvZ2dsZWQgb24uIEEga2V5IHdpdGggbm8gdmFsdWUgb25cbiAgLy8gdGhlIHBhZ2UgcmVhZHMgYXMgdGhlIGtleSBpdHNlbGYsIG1hcmtlZCBtaXNzaW5nLlxuICBwcml2YXRlIF9sYWJlbChjaGlwOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IGNoaXAuZ2V0QXR0cmlidXRlKEtFWV9BVFRSSUJVVEUpO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb25maWcudmFsdWVzKClba2V5XTtcblxuICAgIGNoaXAudGV4dENvbnRlbnQgPSAhdmFsdWVcbiAgICAgID8ga2V5XG4gICAgICA6IHRoaXMuY29uZmlnLnNob3dOYW1lcygpID8gdmFsdWUubmFtZSA6IHZhbHVlVGV4dCh2YWx1ZSk7XG4gICAgLy8gTmFtZWQgZm9yIHNjcmVlbiByZWFkZXJzIG9ubHk6IGEgdGl0bGUgd291bGQgcG9wIHRoZSBicm93c2VyJ3Mgb3duXG4gICAgLy8gdG9vbHRpcCBvbiBob3ZlciwgYW5kIGEgY2hpcCdzIG5hbWUgaXMgc2hvd24gYnkgaXRzIHBvcG92ZXIgb24gY2xpY2suXG4gICAgY2hpcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB2YWx1ZT8ubmFtZSA/PyBrZXkpO1xuICAgIGNoaXAudG9nZ2xlQXR0cmlidXRlKE1JU1NJTkdfQVRUUklCVVRFLCAhdmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlRmllbGRDaGlwKGZpZWxkOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgY2hpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBjaGlwLnNldEF0dHJpYnV0ZShUWVBFX0FUVFJJQlVURSwgRklFTERfVFlQRSk7XG4gICAgY2hpcC5zZXRBdHRyaWJ1dGUoRklFTERfQVRUUklCVVRFLCBmaWVsZCk7XG4gICAgY2hpcC5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsICdmYWxzZScpO1xuICAgIHRoaXMuX2xhYmVsRmllbGQoY2hpcCk7XG5cbiAgICByZXR1cm4gY2hpcDtcbiAgfVxuXG4gIC8vIEEgZmllbGQgY2hpcCByZWFkcyBhcyB0aGUgZmllbGQgZG9lcyBpbiB0aGUgdmlld2VkIGJsb2NrLCBvciBhcyBpdHMgbmFtZVxuICAvLyAoJ1BhZ2UgbnVtYmVyJywgdGhlIGZpbHRlcidzIGxhYmVsKSB3aGVuIG5hbWVzIGFyZSB0b2dnbGVkIG9uLiBPbmUgd2hvc2VcbiAgLy8gdGV4dCBpcyBlbXB0eSwgYSBibGFuayBrZXl3b3JkIGZpbHRlciwgcmVhZHMgYXMgaXRzIG5hbWUsIHNvIGl0IGNhbiBzdGlsbFxuICAvLyBiZSBzZWVuLiBBIGZpbHRlciB0aGUgYmxvY2sgY2Fubm90IHJlYWQgKHRoZSByZXBvcnQgaGFzIG5vIGdyb3VwIG9mIGl0LFxuICAvLyBvciBpdCBpcyBhbm90aGVyIHBhZ2UncyBwYWdlIGZpbHRlcikgcmVhZHMgYXMgdGhlIGZpZWxkIGl0c2VsZiwgbWFya2VkXG4gIC8vIG1pc3NpbmcuIE5hbWVkIGZvciBzY3JlZW4gcmVhZGVycyBvbmx5LCBhcyBhIHZhbHVlIGNoaXAgaXMuXG4gIHByaXZhdGUgX2xhYmVsRmllbGQoY2hpcDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBmaWVsZCA9IGNoaXAuZ2V0QXR0cmlidXRlKEZJRUxEX0FUVFJJQlVURSk7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29uZmlnLmZpZWxkcygpO1xuICAgIGNvbnN0IG5hbWUgPSB0ZXh0RmllbGRzKGNvbnRleHQpLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS5maWVsZCA9PT0gZmllbGQpPy5uYW1lO1xuXG4gICAgY2hpcC50ZXh0Q29udGVudCA9ICFuYW1lXG4gICAgICA/IGZpZWxkXG4gICAgICA6IHRoaXMuY29uZmlnLnNob3dOYW1lcygpID8gbmFtZSA6IGZpZWxkVGV4dChmaWVsZCwgY29udGV4dCkgfHwgbmFtZTtcbiAgICBjaGlwLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIG5hbWUgPz8gZmllbGQpO1xuICAgIGNoaXAudG9nZ2xlQXR0cmlidXRlKE1JU1NJTkdfQVRUUklCVVRFLCAhbmFtZSk7XG4gIH1cblxuICAvLyBUaGUgaHRtbCBGcm9hbGEgaGFuZHMgb3V0LCB3aXRoIGV2ZXJ5IGNoaXAgYmFjayB0byBpdHMgdG9rZW4uXG4gIHByaXZhdGUgX3RvVG9rZW5zKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFodG1sLmluY2x1ZGVzKEtFWV9BVFRSSUJVVEUpICYmICFodG1sLmluY2x1ZGVzKEZJRUxEX0FUVFJJQlVURSkpIHtcbiAgICAgIHJldHVybiBodG1sO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuICAgIHRlbXBsYXRlLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbChFTUJFRF9TRUxFQ1RPUikuZm9yRWFjaCgoY2hpcCkgPT4gY2hpcC5yZXBsYWNlV2l0aChjaGlwVG9rZW4oY2hpcCkpKTtcblxuICAgIHJldHVybiB0ZW1wbGF0ZS5pbm5lckhUTUw7XG4gIH1cblxuICBwcml2YXRlIF9vbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHwgdm9pZCB7XG4gICAgLy8gQW55IGtleSBidXQgYSBsb25lIG1vZGlmaWVyIHN0YXJ0cyBhIG5ldyBlZGl0LlxuICAgIGlmICghTU9ESUZJRVJfS0VZUy5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICB0aGlzLmNvbmZpZy5jaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsZXRpbmcgPSBldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnIHx8IGV2ZW50LmtleSA9PT0gJ0RlbGV0ZSc7XG5cbiAgICAvLyBEZWxldGluZyBhY3Jvc3Mgc2V2ZXJhbCBzZWxlY3RlZCBjZWxscyBnb2VzIHRocm91Z2gsIHZhbHVlcyBhbmQgYWxsOlxuICAgIC8vIEZyb2FsYSBzYXZlcyBhbiB1bmRvIHN0ZXAgYW5kIGVtcHRpZXMgdGhlIGNlbGxzLCBhbmQgd2hhdCB0aGF0IHRvb2sgaXNcbiAgICAvLyByZXBvcnRlZCBvbmNlIHRoZXkgYXJlIGVtcHR5LlxuICAgIGlmIChkZWxldGluZyAmJiB0aGlzLl9lZGl0b3IuZWwucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RFRF9DRUxMKS5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSB0aGlzLl9jaGlwQ291bnRzKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX3JlcG9ydFJlbW92ZWQoYmVmb3JlKSk7XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9yYW5nZSgpO1xuICAgIGlmICghcmFuZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocmFuZ2UuY29sbGFwc2VkKSB7XG4gICAgICBpZiAoIWRlbGV0aW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmFja3dhcmQgPSBldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnO1xuICAgICAgY29uc3QgZ3JhbnVsYXJpdHkgPSB0aGlzLl9ncmFudWxhcml0eShldmVudCk7XG4gICAgICBjb25zdCBjaGlwID0gdGhpcy5fYWRqYWNlbnRDaGlwKGJhY2t3YXJkLCBncmFudWxhcml0eSk7XG5cbiAgICAgIHJldHVybiBjaGlwXG4gICAgICAgID8gdGhpcy5fYmxvY2soZXZlbnQsIFtjaGlwXSwgbnVsbClcbiAgICAgICAgOiB0aGlzLl9yZW1vdmVBZGphY2VudEZpZWxkKGV2ZW50LCBiYWNrd2FyZCwgZ3JhbnVsYXJpdHkpO1xuICAgIH1cblxuICAgIC8vIEEgc2VsZWN0aW9uIGlzIHJlcGxhY2VkIGJ5IGEgZGVsZXRpbmcga2V5LCBFbnRlciwgYSB0eXBlZCBjaGFyYWN0ZXIgb3JcbiAgICAvLyBhIGN1dC5cbiAgICBjb25zdCB0eXBpbmcgPSBldmVudC5rZXkubGVuZ3RoID09PSAxICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5O1xuICAgIGNvbnN0IGN1dHRpbmcgPSAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBldmVudC5rZXkudG9Mb3dlckNhc2UoKSA9PT0gJ3gnO1xuICAgIGlmICghZGVsZXRpbmcgJiYgIXR5cGluZyAmJiAhY3V0dGluZyAmJiBldmVudC5rZXkgIT09ICdFbnRlcicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlwcyA9IHRoaXMuX2NoaXBzSW4ocmFuZ2UpO1xuXG4gICAgcmV0dXJuIGNoaXBzLmxlbmd0aCA/IHRoaXMuX2Jsb2NrKGV2ZW50LCBjaGlwcywgcmFuZ2UpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gVGhlIHNhbWUgcnVsZSBmb3IgZWRpdHMgdGhhdCBhcnJpdmUgd2l0aG91dCBhIGtleSBGcm9hbGEgc2VlczogYSBwaG9uZVxuICAvLyBrZXlib2FyZCwgYW4gaW5wdXQgbWV0aG9kLCBhIHNwZWxsLWNoZWNrIHJlcGxhY2VtZW50LlxuICBwcml2YXRlIF9vbkJlZm9yZUlucHV0KGV2ZW50OiBJbnB1dEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9yYW5nZSgpO1xuICAgIGlmICh0aGlzLl9yZW1vdmluZyB8fCAhcmFuZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocmFuZ2UuY29sbGFwc2VkKSB7XG4gICAgICBjb25zdCBiYWNrd2FyZCA9IGV2ZW50LmlucHV0VHlwZS5lbmRzV2l0aCgnQmFja3dhcmQnKTtcbiAgICAgIGlmIChldmVudC5pbnB1dFR5cGUuc3RhcnRzV2l0aCgnZGVsZXRlJykpIHtcbiAgICAgICAgY29uc3QgY2hpcCA9IHRoaXMuX2FkamFjZW50Q2hpcChiYWNrd2FyZCwgZXZlbnQuaW5wdXRUeXBlLmluY2x1ZGVzKCdXb3JkJykgPyAnd29yZCcgOiAnY2hhcmFjdGVyJyk7XG4gICAgICAgIGlmIChjaGlwKSB7XG4gICAgICAgICAgdGhpcy5fYmxvY2soZXZlbnQsIFtjaGlwXSwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaXBzID0gdGhpcy5fY2hpcHNJbihyYW5nZSk7XG4gICAgaWYgKGNoaXBzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fYmxvY2soZXZlbnQsIGNoaXBzLCByYW5nZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ3V0LCBkcmFnIGFuZCBwYXN0ZS1vdmVyOiBzdG9wcGVkIHdoZW4gdGhlIHNlbGVjdGlvbiBob2xkcyBhIHZhbHVlLlxuICBwcml2YXRlIF9ndWFyZFNlbGVjdGlvbihldmVudDogRXZlbnQpOiBib29sZWFuIHwgdm9pZCB7XG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9yYW5nZSgpO1xuICAgIGlmICh0aGlzLl9yZW1vdmluZyB8fCAhcmFuZ2UgfHwgcmFuZ2UuY29sbGFwc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2hpcHMgPSB0aGlzLl9jaGlwc0luKHJhbmdlKTtcblxuICAgIHJldHVybiBjaGlwcy5sZW5ndGggPyB0aGlzLl9ibG9jayhldmVudCwgY2hpcHMsIHJhbmdlKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIEJhY2tzcGFjZSBvciBEZWxldGUgYmVzaWRlIGEgZmllbGQgY2hpcCB0YWtlcyBpdCBvdXQgbGlrZSBvbmUgY2hhcmFjdGVyLFxuICAvLyB3aXRoIG5vIHByb21wdDogYSBmaWVsZCBoYXMgbm90aGluZyBiZWhpbmQgaXQgdG8gbG9zZS4gRG9uZSBoZXJlLCBhcyBhXG4gIC8vIHZhbHVlJ3MgZ3VhcmQgd291bGQgYmUsIHJhdGhlciB0aGFuIGxlZnQgdG8gRnJvYWxhJ3Mgb3duIGhhbmRsaW5nIG9mIGFcbiAgLy8gbm9uLWVkaXRhYmxlIGVsZW1lbnQuXG4gIHByaXZhdGUgX3JlbW92ZUFkamFjZW50RmllbGQoZXZlbnQ6IEV2ZW50LCBiYWNrd2FyZDogYm9vbGVhbiwgZ3JhbnVsYXJpdHk6IHN0cmluZyk6IGZhbHNlIHwgdm9pZCB7XG4gICAgY29uc3QgcmVhY2ggPSB0aGlzLl9yZWFjaChiYWNrd2FyZCwgZ3JhbnVsYXJpdHkpO1xuICAgIGlmICghcmVhY2ggfHwgIXRoaXMuX2ZpZWxkQ2hpcHNJbihyZWFjaCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLl9yZW1vdmVSYW5nZShyZWFjaCk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDdXQ6IHN0b3BwZWQgd2hlbiB0aGUgc2VsZWN0aW9uIGhvbGRzIGEgdmFsdWUuIE9uZSBob2xkaW5nIGEgZmllbGQgcHV0c1xuICAvLyBpdHMgdG9rZW5zIG9uIHRoZSBjbGlwYm9hcmQgYXMgYSBjb3B5IGRvZXMsIGFuZCBzbyBpcyBkZWxldGVkIGhlcmU6IGEgY3V0XG4gIC8vIHRoYXQgd3JpdGVzIGl0cyBvd24gY2xpcGJvYXJkIGRlbGV0ZXMgbm90aGluZy5cbiAgcHJpdmF0ZSBfb25DdXQoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9yYW5nZSgpO1xuICAgIGlmICh0aGlzLl9ndWFyZFNlbGVjdGlvbihldmVudCkgPT09IGZhbHNlIHx8ICFyYW5nZSB8fCByYW5nZS5jb2xsYXBzZWQgfHwgIXRoaXMuX2ZpZWxkQ2hpcHNJbihyYW5nZSkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY29weVRva2VucyhldmVudCwgcmFuZ2UpO1xuICAgIHRoaXMuX3JlbW92ZVJhbmdlKHJhbmdlKTtcbiAgfVxuXG4gIC8vIENvcHlpbmcgYSBjaGlwIGNvcGllcyBpdHMgdG9rZW4sIHNvIHBhc3RpbmcgaXQgbWFrZXMgaXQgYSBjaGlwIGFnYWluOiBhXG4gIC8vIGZpZWxkJ3MgaW4gYW55IGJsb2NrIG9mIHRoZSByZXBvcnQsIGEgdmFsdWUncyBvbiB0aGUgcGFnZSBpdCB3YXMgY29waWVkXG4gIC8vIG9uIOKAlCBpbiB0aGlzIGJsb2NrIG9yIGFub3RoZXIg4oCUIHdoaWNoIGdvZXMgb24gdGhlIGNsaXBib2FyZCBiZXNpZGUgaXQuXG4gIHByaXZhdGUgX29uQ29weShldmVudDogQ2xpcGJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCByYW5nZSA9IHRoaXMuX3JhbmdlKCk7XG4gICAgaWYgKCFyYW5nZSB8fCByYW5nZS5jb2xsYXBzZWQgfHwgISh0aGlzLl9jaGlwc0luKHJhbmdlKS5sZW5ndGggfHwgdGhpcy5fZmllbGRDaGlwc0luKHJhbmdlKS5sZW5ndGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY29weVRva2VucyhldmVudCwgcmFuZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29weVRva2VucyhldmVudDogQ2xpcGJvYXJkRXZlbnQsIHJhbmdlOiBSYW5nZSk6IHZvaWQge1xuICAgIGNvbnN0IGhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGhvbGRlci5hcHBlbmQocmFuZ2UuY2xvbmVDb250ZW50cygpKTtcbiAgICBob2xkZXIucXVlcnlTZWxlY3RvckFsbChFTUJFRF9TRUxFQ1RPUikuZm9yRWFjaCgoY2hpcCkgPT4gY2hpcC5yZXBsYWNlV2l0aChjaGlwVG9rZW4oY2hpcCkpKTtcblxuICAgIGV2ZW50LmNsaXBib2FyZERhdGEuc2V0RGF0YSgndGV4dC9wbGFpbicsIHRoaXMuX3BsYWluVGV4dChob2xkZXIpKTtcbiAgICBldmVudC5jbGlwYm9hcmREYXRhLnNldERhdGEoJ3RleHQvaHRtbCcsIGhvbGRlci5pbm5lckhUTUwpO1xuICAgIGV2ZW50LmNsaXBib2FyZERhdGEuc2V0RGF0YShTQ09QRV9UWVBFLCB0aGlzLmNvbmZpZy5zY29wZSgpKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgLy8gV2hhdCBjb3BpZWQgaHRtbCByZWFkcyBhcyBpbiBwbGFpbiB0ZXh0OiBhIHBhcmFncmFwaCBvbiBpdHMgb3duIGxpbmVzLCBhXG4gIC8vIHRhYmxlJ3MgY2VsbHMgdGFiLXNlcGFyYXRlZCBhbmQgaXRzIHJvd3Mgb24gbGluZXMgb2YgdGhlaXIgb3duLiBUaGF0IGlzXG4gIC8vIHRoZSBicm93c2VyJ3MgaW5uZXJUZXh0LCB3aGljaCBvbmx5IHRleHQgbGFpZCBvdXQgb24gdGhlIHBhZ2UgaGFzIOKAlCBzb1xuICAvLyB0aGUgaG9sZGVyIGlzIHB1dCBvZmZzY3JlZW4gKG5vdCBoaWRkZW46IGhpZGRlbiB0ZXh0IGhhcyBub25lKSB3aGlsZSBpdCBpc1xuICAvLyByZWFkLlxuICBwcml2YXRlIF9wbGFpblRleHQoaG9sZGVyOiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XG4gICAgaG9sZGVyLnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246IGZpeGVkOyBsZWZ0OiAtMTAwMDBweDsgdG9wOiAwJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChob2xkZXIpO1xuICAgIGNvbnN0IHRleHQgPSBob2xkZXIuaW5uZXJUZXh0O1xuICAgIGhvbGRlci5yZW1vdmUoKTtcblxuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBfb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGNoaXAgPSAoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpPy5jbG9zZXN0Py4oQ0hJUF9TRUxFQ1RPUikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghY2hpcCB8fCAhdGhpcy5fZWRpdG9yPy5lbC5jb250YWlucyhjaGlwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgLy8gQSBwcmVzcyBpbiBhIHRhYmxlIGNlbGwgY2FuIG9wZW4gdGhlIHRhYmxlJ3MgcG9wdXAgb24gbW91c2V1cCwganVzdFxuICAgIC8vIGJlZm9yZSB0aGlzIGNsaWNrOyBhIGNoaXAgaW4gYSBjZWxsIHNob3dzIG9ubHkgaXRzIG93biBwb3BvdmVyLlxuICAgIHRoaXMuX2VkaXRvci5wb3B1cHMuaGlkZSgndGFibGUuZWRpdCcpO1xuICAgIHRoaXMuY29uZmlnLmNsaWNrKGNoaXAuZ2V0QXR0cmlidXRlKEtFWV9BVFRSSUJVVEUpLCBjaGlwKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQ2hpcChldmVudD86IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKGV2ZW50Py50YXJnZXQgYXMgRWxlbWVudCB8IHVuZGVmaW5lZCk/LmNsb3Nlc3Q/LihDSElQX1NFTEVDVE9SKTtcbiAgfVxuXG4gIHByaXZhdGUgX2Jsb2NrKGV2ZW50OiBFdmVudCwgY2hpcHM6IEhUTUxFbGVtZW50W10sIHJhbmdlOiBSYW5nZSB8IG51bGwpOiBmYWxzZSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjaGlwcy5mb3JFYWNoKChjaGlwKSA9PiBjaGlwLmFuaW1hdGUoRkxBU0gsIEZMQVNIX01TKSk7XG5cbiAgICB0aGlzLmNvbmZpZy5ibG9ja2VkKHtcbiAgICAgIGNvdW50OiBjaGlwcy5sZW5ndGgsXG4gICAgICAuLi4ocmFuZ2UgPyB7IHJlbW92ZVNlbGVjdGlvbjogKCkgPT4gdGhpcy5fcmVtb3ZlUmFuZ2UocmFuZ2UpIH0gOiB7fSksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVSYW5nZShyYW5nZTogUmFuZ2UpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2VkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuX3NlbGVjdGlvbigpO1xuICAgIHRoaXMuX2VkaXRvci5lbC5mb2N1cygpO1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuXG4gICAgdGhpcy5fZWRpdG9yLnVuZG8uc2F2ZVN0ZXAoKTtcbiAgICB0aGlzLl9yZW1vdmluZyA9IHRydWU7XG4gICAgLy8gVGhlIGJyb3dzZXIncyBvd24gZGVsZXRlLCBzbyB0d28gcGFyYWdyYXBocyBhIHNlbGVjdGlvbiBzcGFucyBqb2luIHRoZVxuICAgIC8vIHdheSB0aGV5IHdvdWxkIGZvciBhIHBsYWluIERlbGV0ZS5cbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnZGVsZXRlJyk7XG4gICAgdGhpcy5fcmVtb3ZpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9jaGFuZ2VkKCk7XG4gIH1cblxuICAvLyBBbiBlZGl0IG1hZGUgaGVyZSByYXRoZXIgdGhhbiB0eXBlZDogcmVjb3JkIGl0IGZvciB1bmRvLCBhbmQgdGVsbFxuICAvLyBodG1sLWVkaXRvciBzbyB0aGUgZHJhZnQgZm9sbG93cy5cbiAgcHJpdmF0ZSBfY2hhbmdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9lZGl0b3IudW5kby5zYXZlU3RlcCgpO1xuICAgIHRoaXMuX2VkaXRvci5ldmVudHMudHJpZ2dlcignY29udGVudENoYW5nZWQnKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdGlvbigpOiBTZWxlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9lZGl0b3IuZWwub3duZXJEb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIC8vIFRoZSBzZWxlY3Rpb24sIHdoZW4gaXQgaXMgaW5zaWRlIHRoaXMgZWRpdG9yLlxuICBwcml2YXRlIF9yYW5nZSgpOiBSYW5nZSB8IG51bGwge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuX2VkaXRvciA/IHRoaXMuX3NlbGVjdGlvbigpIDogbnVsbDtcbiAgICBpZiAoIXNlbGVjdGlvbj8ucmFuZ2VDb3VudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcblxuICAgIHJldHVybiB0aGlzLl9lZGl0b3IuZWwuY29udGFpbnMocmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIpID8gcmFuZ2UgOiBudWxsO1xuICB9XG5cbiAgLy8gQSBjb3B5IG9mIHRoZSByYW5nZSB3aXRoIGFuIGVuZCB0aGF0IHNpdHMgaW4gdGhlIGVkaXRvciBpdHNlbGYsIGJldHdlZW5cbiAgLy8gYmxvY2tzIChhcyBzb21lIGJyb3dzZXJzIGxlYXZlIHNlbGVjdC1hbGwpLCBtb3ZlZCBpbnNpZGUgdGhlIGJsb2NrIGJlc2lkZVxuICAvLyBpdCwgc28gYSBjaGlwIHB1dCBhdCB0aGF0IGVuZCBsYW5kcyBpbiBhIGJsb2NrLlxuICBwcml2YXRlIF9pbkJsb2NrcyhyYW5nZTogUmFuZ2UpOiBSYW5nZSB7XG4gICAgY29uc3Qgcm9vdDogSFRNTEVsZW1lbnQgPSB0aGlzLl9lZGl0b3IuZWw7XG4gICAgY29uc3QgaW5uZXIgPSByYW5nZS5jbG9uZVJhbmdlKCk7XG5cbiAgICBjb25zdCBmaXJzdCA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyID09PSByb290ID8gcm9vdC5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0XSA6IG51bGw7XG4gICAgaWYgKGZpcnN0ICYmIHRoaXMuX2VkaXRvci5ub2RlLmlzQmxvY2soZmlyc3QpKSB7XG4gICAgICBpbm5lci5zZXRTdGFydCh0aGlzLl9lZGdlQmxvY2soZmlyc3QgYXMgRWxlbWVudCwgZmFsc2UpLCAwKTtcbiAgICB9XG5cbiAgICBjb25zdCBsYXN0ID0gcmFuZ2UuZW5kQ29udGFpbmVyID09PSByb290ID8gcm9vdC5jaGlsZE5vZGVzW3JhbmdlLmVuZE9mZnNldCAtIDFdIDogbnVsbDtcbiAgICBpZiAobGFzdCAmJiB0aGlzLl9lZGl0b3Iubm9kZS5pc0Jsb2NrKGxhc3QpKSB7XG4gICAgICBjb25zdCBibG9jayA9IHRoaXMuX2VkZ2VCbG9jayhsYXN0IGFzIEVsZW1lbnQsIHRydWUpO1xuICAgICAgaW5uZXIuc2V0RW5kKGJsb2NrLCBibG9jay5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlubmVyO1xuICB9XG5cbiAgLy8gVGhlIGlubmVybW9zdCBmaXJzdCBvciBsYXN0IGJsb2NrIG9mIGEgYmxvY2s6IGEgbGlzdCdzIGl0ZW0sIGEgdGFibGUnc1xuICAvLyBjZWxsLlxuICBwcml2YXRlIF9lZGdlQmxvY2soYmxvY2s6IEVsZW1lbnQsIGxhc3Q6IGJvb2xlYW4pOiBFbGVtZW50IHtcbiAgICBjb25zdCBjaGlsZCA9IGxhc3QgPyBibG9jay5sYXN0RWxlbWVudENoaWxkIDogYmxvY2suZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICByZXR1cm4gY2hpbGQgJiYgdGhpcy5fZWRpdG9yLm5vZGUuaXNCbG9jayhjaGlsZCkgPyB0aGlzLl9lZGdlQmxvY2soY2hpbGQsIGxhc3QpIDogYmxvY2s7XG4gIH1cblxuICBwcml2YXRlIF9jaGlwc0luKHJhbmdlOiBSYW5nZSk6IEhUTUxFbGVtZW50W10ge1xuICAgIHJldHVybiB0aGlzLl9jaGlwcygpLmZpbHRlcigoY2hpcCkgPT4gcmFuZ2UuaW50ZXJzZWN0c05vZGUoY2hpcCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmllbGRDaGlwc0luKHJhbmdlOiBSYW5nZSk6IEhUTUxFbGVtZW50W10ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZENoaXBzKCkuZmlsdGVyKChjaGlwKSA9PiByYW5nZS5pbnRlcnNlY3RzTm9kZShjaGlwKSk7XG4gIH1cblxuICAvLyBUaGUgY2hpcCBhIGNvbGxhcHNlZCBjdXJzb3Igd291bGQgZGVsZXRlIGludG8uXG4gIHByaXZhdGUgX2FkamFjZW50Q2hpcChiYWNrd2FyZDogYm9vbGVhbiwgZ3JhbnVsYXJpdHk6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgY29uc3QgcmVhY2ggPSB0aGlzLl9yZWFjaChiYWNrd2FyZCwgZ3JhbnVsYXJpdHkpO1xuXG4gICAgcmV0dXJuIHJlYWNoID8gdGhpcy5fY2hpcHNJbihyZWFjaClbMF0gPz8gbnVsbCA6IG51bGw7XG4gIH1cblxuICAvLyBXaGF0IGEgZGVsZXRpbmcga2V5IHdvdWxkIHRha2UgZnJvbSBhIGNvbGxhcHNlZCBjdXJzb3I6IHN0cmV0Y2ggdGhlXG4gIC8vIHNlbGVjdGlvbiBieSB3aGF0IHRoZSBrZXkgZGVsZXRlcywga2VlcCB3aGF0IGl0IGNvdmVycywgYW5kIHB1dCBpdCBiYWNrLlxuICAvLyBMZXR0aW5nIHRoZSBicm93c2VyIHN0cmV0Y2ggaXQgaGFuZGxlcyBldmVyeSBzaGFwZSB0aGUgaHRtbCB0YWtlcyDigJQgYVxuICAvLyBjaGlwIGluc2lkZSBhIGJvbGQgc3BhbiwgYXQgYSBsaW5lJ3MgZW5kLCBiZXNpZGUgYW4gZW1wdHkgdGV4dCBub2RlLlxuICBwcml2YXRlIF9yZWFjaChiYWNrd2FyZDogYm9vbGVhbiwgZ3JhbnVsYXJpdHk6IHN0cmluZyk6IFJhbmdlIHwgbnVsbCB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5fc2VsZWN0aW9uKCk7XG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jbG9uZVJhbmdlKCk7XG5cbiAgICBzZWxlY3Rpb24ubW9kaWZ5KCdleHRlbmQnLCBiYWNrd2FyZCA/ICdiYWNrd2FyZCcgOiAnZm9yd2FyZCcsIGdyYW51bGFyaXR5KTtcbiAgICBjb25zdCByZWFjaCA9IHNlbGVjdGlvbi5yYW5nZUNvdW50ID8gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpIDogbnVsbDtcblxuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuXG4gICAgcmV0dXJuIHJlYWNoO1xuICB9XG5cbiAgLy8gSG93IGZhciBhIGRlbGV0aW5nIGtleSByZWFjaGVzOiBhIHdvcmQgd2l0aCBDdHJsL0FsdCwgdG8gdGhlIGxpbmUncyBzdGFydFxuICAvLyB3aXRoIENtZCBvbiBhIE1hYywgb25lIGNoYXJhY3RlciBvdGhlcndpc2UuXG4gIHByaXZhdGUgX2dyYW51bGFyaXR5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogc3RyaW5nIHtcbiAgICBpZiAoZXZlbnQubWV0YUtleSkge1xuICAgICAgcmV0dXJuICdsaW5lYm91bmRhcnknO1xuICAgIH1cblxuICAgIHJldHVybiBldmVudC5jdHJsS2V5IHx8IGV2ZW50LmFsdEtleSA/ICd3b3JkJyA6ICdjaGFyYWN0ZXInO1xuICB9XG59XG4iXX0=
|