vitest 0.0.134 → 0.0.138
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/dist/cli.js +6 -6
- package/dist/{diff-04ac7bc9.js → diff-5dfc7eb4.js} +2 -4
- package/dist/entry.js +86 -20
- package/dist/{global-a033a355.js → global-f971f18f.js} +4 -4
- package/dist/{index-e7a9a813.js → index-314cb4d9.js} +5 -3
- package/dist/index-5d6a5929.js +9255 -0
- package/dist/index-64aafe4b.js +1 -1
- package/dist/index-a6ee95c8.js +8680 -0
- package/dist/index.d.ts +120 -7
- package/dist/index.js +3 -3
- package/dist/{jest-mock-30625866.js → jest-mock-6c629944.js} +4 -3
- package/dist/node.d.ts +111 -4
- package/dist/node.js +3 -3
- package/dist/{setup-55ef85af.js → setup-357bec8d.js} +9 -10
- package/dist/vi-567ba572.js +3462 -0
- package/dist/worker.js +46 -49
- package/package.json +5 -5
- package/dist/externalize-2f63779d.js +0 -9259
- package/dist/index-e909c175.js +0 -63
- package/dist/index-f164d9f3.js +0 -8548
- package/dist/vi-d23b3fa3.js +0 -3461
|
@@ -0,0 +1,3462 @@
|
|
|
1
|
+
import { n as noop, i as isObject } from './index-64aafe4b.js';
|
|
2
|
+
import { i as isMockFunction, a as spyOn, f as fn, s as spies } from './jest-mock-6c629944.js';
|
|
3
|
+
import { c as commonjsGlobal, g as getDefaultExportFromCjs } from './_commonjsHelpers-c9e3b764.js';
|
|
4
|
+
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __defProps = Object.defineProperties;
|
|
7
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
8
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
9
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
10
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
11
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
12
|
+
var __spreadValues = (a, b) => {
|
|
13
|
+
for (var prop in b || (b = {}))
|
|
14
|
+
if (__hasOwnProp.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
if (__getOwnPropSymbols)
|
|
17
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
18
|
+
if (__propIsEnum.call(b, prop))
|
|
19
|
+
__defNormalProp(a, prop, b[prop]);
|
|
20
|
+
}
|
|
21
|
+
return a;
|
|
22
|
+
};
|
|
23
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
24
|
+
function createChainable(keys, fn) {
|
|
25
|
+
function create(obj) {
|
|
26
|
+
const chain2 = function(...args) {
|
|
27
|
+
return fn.apply(obj, args);
|
|
28
|
+
};
|
|
29
|
+
for (const key of keys) {
|
|
30
|
+
Object.defineProperty(chain2, key, {
|
|
31
|
+
get() {
|
|
32
|
+
return create(__spreadProps(__spreadValues({}, obj), { [key]: true }));
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return chain2;
|
|
37
|
+
}
|
|
38
|
+
const chain = create({});
|
|
39
|
+
chain.fn = fn;
|
|
40
|
+
return chain;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const context = {
|
|
44
|
+
tasks: [],
|
|
45
|
+
currentSuite: null
|
|
46
|
+
};
|
|
47
|
+
function collectTask(task) {
|
|
48
|
+
var _a;
|
|
49
|
+
(_a = context.currentSuite) == null ? void 0 : _a.tasks.push(task);
|
|
50
|
+
}
|
|
51
|
+
async function runWithSuite(suite, fn) {
|
|
52
|
+
const prev = context.currentSuite;
|
|
53
|
+
context.currentSuite = suite;
|
|
54
|
+
await fn();
|
|
55
|
+
context.currentSuite = prev;
|
|
56
|
+
}
|
|
57
|
+
function getDefaultTestTimeout() {
|
|
58
|
+
return process.__vitest_worker__.config.testTimeout;
|
|
59
|
+
}
|
|
60
|
+
function getDefaultHookTimeout() {
|
|
61
|
+
return process.__vitest_worker__.config.hookTimeout;
|
|
62
|
+
}
|
|
63
|
+
function withTimeout(fn, _timeout) {
|
|
64
|
+
const timeout = _timeout ?? getDefaultTestTimeout();
|
|
65
|
+
if (timeout <= 0 || timeout === Infinity)
|
|
66
|
+
return fn;
|
|
67
|
+
return (...args) => {
|
|
68
|
+
return Promise.race([fn(...args), new Promise((resolve, reject) => {
|
|
69
|
+
const timer = setTimeout(() => {
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
reject(new Error(`Test timed out in ${timeout}ms.`));
|
|
72
|
+
}, timeout);
|
|
73
|
+
timer.unref();
|
|
74
|
+
})]);
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function ensureAsyncTest(fn) {
|
|
78
|
+
if (!fn.length)
|
|
79
|
+
return fn;
|
|
80
|
+
return () => new Promise((resolve, reject) => {
|
|
81
|
+
const done = (...args) => args[0] ? reject(args[0]) : resolve();
|
|
82
|
+
fn(done);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function normalizeTest(fn, timeout) {
|
|
86
|
+
return withTimeout(ensureAsyncTest(fn), timeout);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const fnMap = new WeakMap();
|
|
90
|
+
const hooksMap = new WeakMap();
|
|
91
|
+
function setFn(key, fn) {
|
|
92
|
+
fnMap.set(key, fn);
|
|
93
|
+
}
|
|
94
|
+
function getFn(key) {
|
|
95
|
+
return fnMap.get(key);
|
|
96
|
+
}
|
|
97
|
+
function setHooks(key, hooks) {
|
|
98
|
+
hooksMap.set(key, hooks);
|
|
99
|
+
}
|
|
100
|
+
function getHooks(key) {
|
|
101
|
+
return hooksMap.get(key);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const suite = createSuite();
|
|
105
|
+
const test$7 = createChainable(["concurrent", "skip", "only", "todo", "fails"], function(name, fn, timeout) {
|
|
106
|
+
getCurrentSuite().test.fn.call(this, name, fn, timeout);
|
|
107
|
+
});
|
|
108
|
+
const describe = suite;
|
|
109
|
+
const it = test$7;
|
|
110
|
+
const defaultSuite = suite("");
|
|
111
|
+
function clearContext() {
|
|
112
|
+
context.tasks.length = 0;
|
|
113
|
+
defaultSuite.clear();
|
|
114
|
+
context.currentSuite = defaultSuite;
|
|
115
|
+
}
|
|
116
|
+
function getCurrentSuite() {
|
|
117
|
+
return context.currentSuite || defaultSuite;
|
|
118
|
+
}
|
|
119
|
+
function createSuiteHooks() {
|
|
120
|
+
return {
|
|
121
|
+
beforeAll: [],
|
|
122
|
+
afterAll: [],
|
|
123
|
+
beforeEach: [],
|
|
124
|
+
afterEach: []
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function createSuiteCollector(name, factory = () => {
|
|
128
|
+
}, mode, concurrent) {
|
|
129
|
+
const tasks = [];
|
|
130
|
+
const factoryQueue = [];
|
|
131
|
+
let suite2;
|
|
132
|
+
initSuite();
|
|
133
|
+
const test2 = createChainable(["concurrent", "skip", "only", "todo", "fails"], function(name2, fn, timeout) {
|
|
134
|
+
const mode2 = this.only ? "only" : this.skip ? "skip" : this.todo ? "todo" : "run";
|
|
135
|
+
const test3 = {
|
|
136
|
+
id: "",
|
|
137
|
+
type: "test",
|
|
138
|
+
name: name2,
|
|
139
|
+
mode: mode2,
|
|
140
|
+
suite: void 0,
|
|
141
|
+
fails: this.fails
|
|
142
|
+
};
|
|
143
|
+
if (this.concurrent || concurrent)
|
|
144
|
+
test3.concurrent = true;
|
|
145
|
+
setFn(test3, normalizeTest(fn || noop, timeout));
|
|
146
|
+
tasks.push(test3);
|
|
147
|
+
});
|
|
148
|
+
const collector = {
|
|
149
|
+
type: "collector",
|
|
150
|
+
name,
|
|
151
|
+
mode,
|
|
152
|
+
test: test2,
|
|
153
|
+
tasks,
|
|
154
|
+
collect,
|
|
155
|
+
clear,
|
|
156
|
+
on: addHook
|
|
157
|
+
};
|
|
158
|
+
function addHook(name2, ...fn) {
|
|
159
|
+
getHooks(suite2)[name2].push(...fn);
|
|
160
|
+
}
|
|
161
|
+
function initSuite() {
|
|
162
|
+
suite2 = {
|
|
163
|
+
id: "",
|
|
164
|
+
type: "suite",
|
|
165
|
+
name,
|
|
166
|
+
mode,
|
|
167
|
+
tasks: []
|
|
168
|
+
};
|
|
169
|
+
setHooks(suite2, createSuiteHooks());
|
|
170
|
+
}
|
|
171
|
+
function clear() {
|
|
172
|
+
tasks.length = 0;
|
|
173
|
+
factoryQueue.length = 0;
|
|
174
|
+
initSuite();
|
|
175
|
+
}
|
|
176
|
+
async function collect(file) {
|
|
177
|
+
factoryQueue.length = 0;
|
|
178
|
+
if (factory)
|
|
179
|
+
await runWithSuite(collector, () => factory(test2));
|
|
180
|
+
const allChildren = await Promise.all([...factoryQueue, ...tasks].map((i) => i.type === "collector" ? i.collect(file) : i));
|
|
181
|
+
suite2.file = file;
|
|
182
|
+
suite2.tasks = allChildren;
|
|
183
|
+
allChildren.forEach((task) => {
|
|
184
|
+
task.suite = suite2;
|
|
185
|
+
if (file)
|
|
186
|
+
task.file = file;
|
|
187
|
+
});
|
|
188
|
+
return suite2;
|
|
189
|
+
}
|
|
190
|
+
collectTask(collector);
|
|
191
|
+
return collector;
|
|
192
|
+
}
|
|
193
|
+
function createSuite() {
|
|
194
|
+
return createChainable(["concurrent", "skip", "only", "todo"], function(name, factory) {
|
|
195
|
+
const mode = this.only ? "only" : this.skip ? "skip" : this.todo ? "todo" : "run";
|
|
196
|
+
return createSuiteCollector(name, factory, mode, this.concurrent);
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
var build = {};
|
|
201
|
+
|
|
202
|
+
var ansiStyles = {exports: {}};
|
|
203
|
+
|
|
204
|
+
(function (module) {
|
|
205
|
+
|
|
206
|
+
const ANSI_BACKGROUND_OFFSET = 10;
|
|
207
|
+
|
|
208
|
+
const wrapAnsi256 = (offset = 0) => code => `\u001B[${38 + offset};5;${code}m`;
|
|
209
|
+
|
|
210
|
+
const wrapAnsi16m = (offset = 0) => (red, green, blue) => `\u001B[${38 + offset};2;${red};${green};${blue}m`;
|
|
211
|
+
|
|
212
|
+
function assembleStyles() {
|
|
213
|
+
const codes = new Map();
|
|
214
|
+
const styles = {
|
|
215
|
+
modifier: {
|
|
216
|
+
reset: [0, 0],
|
|
217
|
+
// 21 isn't widely supported and 22 does the same thing
|
|
218
|
+
bold: [1, 22],
|
|
219
|
+
dim: [2, 22],
|
|
220
|
+
italic: [3, 23],
|
|
221
|
+
underline: [4, 24],
|
|
222
|
+
overline: [53, 55],
|
|
223
|
+
inverse: [7, 27],
|
|
224
|
+
hidden: [8, 28],
|
|
225
|
+
strikethrough: [9, 29]
|
|
226
|
+
},
|
|
227
|
+
color: {
|
|
228
|
+
black: [30, 39],
|
|
229
|
+
red: [31, 39],
|
|
230
|
+
green: [32, 39],
|
|
231
|
+
yellow: [33, 39],
|
|
232
|
+
blue: [34, 39],
|
|
233
|
+
magenta: [35, 39],
|
|
234
|
+
cyan: [36, 39],
|
|
235
|
+
white: [37, 39],
|
|
236
|
+
|
|
237
|
+
// Bright color
|
|
238
|
+
blackBright: [90, 39],
|
|
239
|
+
redBright: [91, 39],
|
|
240
|
+
greenBright: [92, 39],
|
|
241
|
+
yellowBright: [93, 39],
|
|
242
|
+
blueBright: [94, 39],
|
|
243
|
+
magentaBright: [95, 39],
|
|
244
|
+
cyanBright: [96, 39],
|
|
245
|
+
whiteBright: [97, 39]
|
|
246
|
+
},
|
|
247
|
+
bgColor: {
|
|
248
|
+
bgBlack: [40, 49],
|
|
249
|
+
bgRed: [41, 49],
|
|
250
|
+
bgGreen: [42, 49],
|
|
251
|
+
bgYellow: [43, 49],
|
|
252
|
+
bgBlue: [44, 49],
|
|
253
|
+
bgMagenta: [45, 49],
|
|
254
|
+
bgCyan: [46, 49],
|
|
255
|
+
bgWhite: [47, 49],
|
|
256
|
+
|
|
257
|
+
// Bright color
|
|
258
|
+
bgBlackBright: [100, 49],
|
|
259
|
+
bgRedBright: [101, 49],
|
|
260
|
+
bgGreenBright: [102, 49],
|
|
261
|
+
bgYellowBright: [103, 49],
|
|
262
|
+
bgBlueBright: [104, 49],
|
|
263
|
+
bgMagentaBright: [105, 49],
|
|
264
|
+
bgCyanBright: [106, 49],
|
|
265
|
+
bgWhiteBright: [107, 49]
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
// Alias bright black as gray (and grey)
|
|
270
|
+
styles.color.gray = styles.color.blackBright;
|
|
271
|
+
styles.bgColor.bgGray = styles.bgColor.bgBlackBright;
|
|
272
|
+
styles.color.grey = styles.color.blackBright;
|
|
273
|
+
styles.bgColor.bgGrey = styles.bgColor.bgBlackBright;
|
|
274
|
+
|
|
275
|
+
for (const [groupName, group] of Object.entries(styles)) {
|
|
276
|
+
for (const [styleName, style] of Object.entries(group)) {
|
|
277
|
+
styles[styleName] = {
|
|
278
|
+
open: `\u001B[${style[0]}m`,
|
|
279
|
+
close: `\u001B[${style[1]}m`
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
group[styleName] = styles[styleName];
|
|
283
|
+
|
|
284
|
+
codes.set(style[0], style[1]);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
Object.defineProperty(styles, groupName, {
|
|
288
|
+
value: group,
|
|
289
|
+
enumerable: false
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
Object.defineProperty(styles, 'codes', {
|
|
294
|
+
value: codes,
|
|
295
|
+
enumerable: false
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
styles.color.close = '\u001B[39m';
|
|
299
|
+
styles.bgColor.close = '\u001B[49m';
|
|
300
|
+
|
|
301
|
+
styles.color.ansi256 = wrapAnsi256();
|
|
302
|
+
styles.color.ansi16m = wrapAnsi16m();
|
|
303
|
+
styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);
|
|
304
|
+
styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);
|
|
305
|
+
|
|
306
|
+
// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js
|
|
307
|
+
Object.defineProperties(styles, {
|
|
308
|
+
rgbToAnsi256: {
|
|
309
|
+
value: (red, green, blue) => {
|
|
310
|
+
// We use the extended greyscale palette here, with the exception of
|
|
311
|
+
// black and white. normal palette only has 4 greyscale shades.
|
|
312
|
+
if (red === green && green === blue) {
|
|
313
|
+
if (red < 8) {
|
|
314
|
+
return 16;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
if (red > 248) {
|
|
318
|
+
return 231;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return Math.round(((red - 8) / 247) * 24) + 232;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return 16 +
|
|
325
|
+
(36 * Math.round(red / 255 * 5)) +
|
|
326
|
+
(6 * Math.round(green / 255 * 5)) +
|
|
327
|
+
Math.round(blue / 255 * 5);
|
|
328
|
+
},
|
|
329
|
+
enumerable: false
|
|
330
|
+
},
|
|
331
|
+
hexToRgb: {
|
|
332
|
+
value: hex => {
|
|
333
|
+
const matches = /(?<colorString>[a-f\d]{6}|[a-f\d]{3})/i.exec(hex.toString(16));
|
|
334
|
+
if (!matches) {
|
|
335
|
+
return [0, 0, 0];
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
let {colorString} = matches.groups;
|
|
339
|
+
|
|
340
|
+
if (colorString.length === 3) {
|
|
341
|
+
colorString = colorString.split('').map(character => character + character).join('');
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
const integer = Number.parseInt(colorString, 16);
|
|
345
|
+
|
|
346
|
+
return [
|
|
347
|
+
(integer >> 16) & 0xFF,
|
|
348
|
+
(integer >> 8) & 0xFF,
|
|
349
|
+
integer & 0xFF
|
|
350
|
+
];
|
|
351
|
+
},
|
|
352
|
+
enumerable: false
|
|
353
|
+
},
|
|
354
|
+
hexToAnsi256: {
|
|
355
|
+
value: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),
|
|
356
|
+
enumerable: false
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
return styles;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// Make the export immutable
|
|
364
|
+
Object.defineProperty(module, 'exports', {
|
|
365
|
+
enumerable: true,
|
|
366
|
+
get: assembleStyles
|
|
367
|
+
});
|
|
368
|
+
}(ansiStyles));
|
|
369
|
+
|
|
370
|
+
var collections = {};
|
|
371
|
+
|
|
372
|
+
Object.defineProperty(collections, '__esModule', {
|
|
373
|
+
value: true
|
|
374
|
+
});
|
|
375
|
+
collections.printIteratorEntries = printIteratorEntries;
|
|
376
|
+
collections.printIteratorValues = printIteratorValues;
|
|
377
|
+
collections.printListItems = printListItems;
|
|
378
|
+
collections.printObjectProperties = printObjectProperties;
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
382
|
+
*
|
|
383
|
+
* This source code is licensed under the MIT license found in the
|
|
384
|
+
* LICENSE file in the root directory of this source tree.
|
|
385
|
+
*
|
|
386
|
+
*/
|
|
387
|
+
const getKeysOfEnumerableProperties = (object, compareKeys) => {
|
|
388
|
+
const keys = Object.keys(object).sort(compareKeys);
|
|
389
|
+
|
|
390
|
+
if (Object.getOwnPropertySymbols) {
|
|
391
|
+
Object.getOwnPropertySymbols(object).forEach(symbol => {
|
|
392
|
+
if (Object.getOwnPropertyDescriptor(object, symbol).enumerable) {
|
|
393
|
+
keys.push(symbol);
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
return keys;
|
|
399
|
+
};
|
|
400
|
+
/**
|
|
401
|
+
* Return entries (for example, of a map)
|
|
402
|
+
* with spacing, indentation, and comma
|
|
403
|
+
* without surrounding punctuation (for example, braces)
|
|
404
|
+
*/
|
|
405
|
+
|
|
406
|
+
function printIteratorEntries(
|
|
407
|
+
iterator,
|
|
408
|
+
config,
|
|
409
|
+
indentation,
|
|
410
|
+
depth,
|
|
411
|
+
refs,
|
|
412
|
+
printer, // Too bad, so sad that separator for ECMAScript Map has been ' => '
|
|
413
|
+
// What a distracting diff if you change a data structure to/from
|
|
414
|
+
// ECMAScript Object or Immutable.Map/OrderedMap which use the default.
|
|
415
|
+
separator = ': '
|
|
416
|
+
) {
|
|
417
|
+
let result = '';
|
|
418
|
+
let current = iterator.next();
|
|
419
|
+
|
|
420
|
+
if (!current.done) {
|
|
421
|
+
result += config.spacingOuter;
|
|
422
|
+
const indentationNext = indentation + config.indent;
|
|
423
|
+
|
|
424
|
+
while (!current.done) {
|
|
425
|
+
const name = printer(
|
|
426
|
+
current.value[0],
|
|
427
|
+
config,
|
|
428
|
+
indentationNext,
|
|
429
|
+
depth,
|
|
430
|
+
refs
|
|
431
|
+
);
|
|
432
|
+
const value = printer(
|
|
433
|
+
current.value[1],
|
|
434
|
+
config,
|
|
435
|
+
indentationNext,
|
|
436
|
+
depth,
|
|
437
|
+
refs
|
|
438
|
+
);
|
|
439
|
+
result += indentationNext + name + separator + value;
|
|
440
|
+
current = iterator.next();
|
|
441
|
+
|
|
442
|
+
if (!current.done) {
|
|
443
|
+
result += ',' + config.spacingInner;
|
|
444
|
+
} else if (!config.min) {
|
|
445
|
+
result += ',';
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
result += config.spacingOuter + indentation;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
return result;
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Return values (for example, of a set)
|
|
456
|
+
* with spacing, indentation, and comma
|
|
457
|
+
* without surrounding punctuation (braces or brackets)
|
|
458
|
+
*/
|
|
459
|
+
|
|
460
|
+
function printIteratorValues(
|
|
461
|
+
iterator,
|
|
462
|
+
config,
|
|
463
|
+
indentation,
|
|
464
|
+
depth,
|
|
465
|
+
refs,
|
|
466
|
+
printer
|
|
467
|
+
) {
|
|
468
|
+
let result = '';
|
|
469
|
+
let current = iterator.next();
|
|
470
|
+
|
|
471
|
+
if (!current.done) {
|
|
472
|
+
result += config.spacingOuter;
|
|
473
|
+
const indentationNext = indentation + config.indent;
|
|
474
|
+
|
|
475
|
+
while (!current.done) {
|
|
476
|
+
result +=
|
|
477
|
+
indentationNext +
|
|
478
|
+
printer(current.value, config, indentationNext, depth, refs);
|
|
479
|
+
current = iterator.next();
|
|
480
|
+
|
|
481
|
+
if (!current.done) {
|
|
482
|
+
result += ',' + config.spacingInner;
|
|
483
|
+
} else if (!config.min) {
|
|
484
|
+
result += ',';
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
result += config.spacingOuter + indentation;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
return result;
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Return items (for example, of an array)
|
|
495
|
+
* with spacing, indentation, and comma
|
|
496
|
+
* without surrounding punctuation (for example, brackets)
|
|
497
|
+
**/
|
|
498
|
+
|
|
499
|
+
function printListItems(list, config, indentation, depth, refs, printer) {
|
|
500
|
+
let result = '';
|
|
501
|
+
|
|
502
|
+
if (list.length) {
|
|
503
|
+
result += config.spacingOuter;
|
|
504
|
+
const indentationNext = indentation + config.indent;
|
|
505
|
+
|
|
506
|
+
for (let i = 0; i < list.length; i++) {
|
|
507
|
+
result += indentationNext;
|
|
508
|
+
|
|
509
|
+
if (i in list) {
|
|
510
|
+
result += printer(list[i], config, indentationNext, depth, refs);
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
if (i < list.length - 1) {
|
|
514
|
+
result += ',' + config.spacingInner;
|
|
515
|
+
} else if (!config.min) {
|
|
516
|
+
result += ',';
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
result += config.spacingOuter + indentation;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
return result;
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Return properties of an object
|
|
527
|
+
* with spacing, indentation, and comma
|
|
528
|
+
* without surrounding punctuation (for example, braces)
|
|
529
|
+
*/
|
|
530
|
+
|
|
531
|
+
function printObjectProperties(val, config, indentation, depth, refs, printer) {
|
|
532
|
+
let result = '';
|
|
533
|
+
const keys = getKeysOfEnumerableProperties(val, config.compareKeys);
|
|
534
|
+
|
|
535
|
+
if (keys.length) {
|
|
536
|
+
result += config.spacingOuter;
|
|
537
|
+
const indentationNext = indentation + config.indent;
|
|
538
|
+
|
|
539
|
+
for (let i = 0; i < keys.length; i++) {
|
|
540
|
+
const key = keys[i];
|
|
541
|
+
const name = printer(key, config, indentationNext, depth, refs);
|
|
542
|
+
const value = printer(val[key], config, indentationNext, depth, refs);
|
|
543
|
+
result += indentationNext + name + ': ' + value;
|
|
544
|
+
|
|
545
|
+
if (i < keys.length - 1) {
|
|
546
|
+
result += ',' + config.spacingInner;
|
|
547
|
+
} else if (!config.min) {
|
|
548
|
+
result += ',';
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
result += config.spacingOuter + indentation;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
return result;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
var AsymmetricMatcher$1 = {};
|
|
559
|
+
|
|
560
|
+
Object.defineProperty(AsymmetricMatcher$1, '__esModule', {
|
|
561
|
+
value: true
|
|
562
|
+
});
|
|
563
|
+
AsymmetricMatcher$1.test = AsymmetricMatcher$1.serialize = AsymmetricMatcher$1.default = void 0;
|
|
564
|
+
|
|
565
|
+
var _collections$3 = collections;
|
|
566
|
+
|
|
567
|
+
var global$2 = (function () {
|
|
568
|
+
if (typeof globalThis !== 'undefined') {
|
|
569
|
+
return globalThis;
|
|
570
|
+
} else if (typeof global$2 !== 'undefined') {
|
|
571
|
+
return global$2;
|
|
572
|
+
} else if (typeof self !== 'undefined') {
|
|
573
|
+
return self;
|
|
574
|
+
} else if (typeof window !== 'undefined') {
|
|
575
|
+
return window;
|
|
576
|
+
} else {
|
|
577
|
+
return Function('return this')();
|
|
578
|
+
}
|
|
579
|
+
})();
|
|
580
|
+
|
|
581
|
+
var Symbol$2 = global$2['jest-symbol-do-not-touch'] || global$2.Symbol;
|
|
582
|
+
const asymmetricMatcher =
|
|
583
|
+
typeof Symbol$2 === 'function' && Symbol$2.for
|
|
584
|
+
? Symbol$2.for('jest.asymmetricMatcher')
|
|
585
|
+
: 0x1357a5;
|
|
586
|
+
const SPACE$2 = ' ';
|
|
587
|
+
|
|
588
|
+
const serialize$6 = (val, config, indentation, depth, refs, printer) => {
|
|
589
|
+
const stringedValue = val.toString();
|
|
590
|
+
|
|
591
|
+
if (
|
|
592
|
+
stringedValue === 'ArrayContaining' ||
|
|
593
|
+
stringedValue === 'ArrayNotContaining'
|
|
594
|
+
) {
|
|
595
|
+
if (++depth > config.maxDepth) {
|
|
596
|
+
return '[' + stringedValue + ']';
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
return (
|
|
600
|
+
stringedValue +
|
|
601
|
+
SPACE$2 +
|
|
602
|
+
'[' +
|
|
603
|
+
(0, _collections$3.printListItems)(
|
|
604
|
+
val.sample,
|
|
605
|
+
config,
|
|
606
|
+
indentation,
|
|
607
|
+
depth,
|
|
608
|
+
refs,
|
|
609
|
+
printer
|
|
610
|
+
) +
|
|
611
|
+
']'
|
|
612
|
+
);
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
if (
|
|
616
|
+
stringedValue === 'ObjectContaining' ||
|
|
617
|
+
stringedValue === 'ObjectNotContaining'
|
|
618
|
+
) {
|
|
619
|
+
if (++depth > config.maxDepth) {
|
|
620
|
+
return '[' + stringedValue + ']';
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
return (
|
|
624
|
+
stringedValue +
|
|
625
|
+
SPACE$2 +
|
|
626
|
+
'{' +
|
|
627
|
+
(0, _collections$3.printObjectProperties)(
|
|
628
|
+
val.sample,
|
|
629
|
+
config,
|
|
630
|
+
indentation,
|
|
631
|
+
depth,
|
|
632
|
+
refs,
|
|
633
|
+
printer
|
|
634
|
+
) +
|
|
635
|
+
'}'
|
|
636
|
+
);
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
if (
|
|
640
|
+
stringedValue === 'StringMatching' ||
|
|
641
|
+
stringedValue === 'StringNotMatching'
|
|
642
|
+
) {
|
|
643
|
+
return (
|
|
644
|
+
stringedValue +
|
|
645
|
+
SPACE$2 +
|
|
646
|
+
printer(val.sample, config, indentation, depth, refs)
|
|
647
|
+
);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
if (
|
|
651
|
+
stringedValue === 'StringContaining' ||
|
|
652
|
+
stringedValue === 'StringNotContaining'
|
|
653
|
+
) {
|
|
654
|
+
return (
|
|
655
|
+
stringedValue +
|
|
656
|
+
SPACE$2 +
|
|
657
|
+
printer(val.sample, config, indentation, depth, refs)
|
|
658
|
+
);
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
return val.toAsymmetricMatcher();
|
|
662
|
+
};
|
|
663
|
+
|
|
664
|
+
AsymmetricMatcher$1.serialize = serialize$6;
|
|
665
|
+
|
|
666
|
+
const test$6 = val => val && val.$$typeof === asymmetricMatcher;
|
|
667
|
+
|
|
668
|
+
AsymmetricMatcher$1.test = test$6;
|
|
669
|
+
const plugin$6 = {
|
|
670
|
+
serialize: serialize$6,
|
|
671
|
+
test: test$6
|
|
672
|
+
};
|
|
673
|
+
var _default$7 = plugin$6;
|
|
674
|
+
AsymmetricMatcher$1.default = _default$7;
|
|
675
|
+
|
|
676
|
+
var ConvertAnsi = {};
|
|
677
|
+
|
|
678
|
+
var ansiRegex = ({onlyFirst = false} = {}) => {
|
|
679
|
+
const pattern = [
|
|
680
|
+
'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
|
|
681
|
+
'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
|
|
682
|
+
].join('|');
|
|
683
|
+
|
|
684
|
+
return new RegExp(pattern, onlyFirst ? undefined : 'g');
|
|
685
|
+
};
|
|
686
|
+
|
|
687
|
+
Object.defineProperty(ConvertAnsi, '__esModule', {
|
|
688
|
+
value: true
|
|
689
|
+
});
|
|
690
|
+
ConvertAnsi.test = ConvertAnsi.serialize = ConvertAnsi.default = void 0;
|
|
691
|
+
|
|
692
|
+
var _ansiRegex = _interopRequireDefault$2(ansiRegex);
|
|
693
|
+
|
|
694
|
+
var _ansiStyles$1 = _interopRequireDefault$2(ansiStyles.exports);
|
|
695
|
+
|
|
696
|
+
function _interopRequireDefault$2(obj) {
|
|
697
|
+
return obj && obj.__esModule ? obj : {default: obj};
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
/**
|
|
701
|
+
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
702
|
+
*
|
|
703
|
+
* This source code is licensed under the MIT license found in the
|
|
704
|
+
* LICENSE file in the root directory of this source tree.
|
|
705
|
+
*/
|
|
706
|
+
const toHumanReadableAnsi = text =>
|
|
707
|
+
text.replace((0, _ansiRegex.default)(), match => {
|
|
708
|
+
switch (match) {
|
|
709
|
+
case _ansiStyles$1.default.red.close:
|
|
710
|
+
case _ansiStyles$1.default.green.close:
|
|
711
|
+
case _ansiStyles$1.default.cyan.close:
|
|
712
|
+
case _ansiStyles$1.default.gray.close:
|
|
713
|
+
case _ansiStyles$1.default.white.close:
|
|
714
|
+
case _ansiStyles$1.default.yellow.close:
|
|
715
|
+
case _ansiStyles$1.default.bgRed.close:
|
|
716
|
+
case _ansiStyles$1.default.bgGreen.close:
|
|
717
|
+
case _ansiStyles$1.default.bgYellow.close:
|
|
718
|
+
case _ansiStyles$1.default.inverse.close:
|
|
719
|
+
case _ansiStyles$1.default.dim.close:
|
|
720
|
+
case _ansiStyles$1.default.bold.close:
|
|
721
|
+
case _ansiStyles$1.default.reset.open:
|
|
722
|
+
case _ansiStyles$1.default.reset.close:
|
|
723
|
+
return '</>';
|
|
724
|
+
|
|
725
|
+
case _ansiStyles$1.default.red.open:
|
|
726
|
+
return '<red>';
|
|
727
|
+
|
|
728
|
+
case _ansiStyles$1.default.green.open:
|
|
729
|
+
return '<green>';
|
|
730
|
+
|
|
731
|
+
case _ansiStyles$1.default.cyan.open:
|
|
732
|
+
return '<cyan>';
|
|
733
|
+
|
|
734
|
+
case _ansiStyles$1.default.gray.open:
|
|
735
|
+
return '<gray>';
|
|
736
|
+
|
|
737
|
+
case _ansiStyles$1.default.white.open:
|
|
738
|
+
return '<white>';
|
|
739
|
+
|
|
740
|
+
case _ansiStyles$1.default.yellow.open:
|
|
741
|
+
return '<yellow>';
|
|
742
|
+
|
|
743
|
+
case _ansiStyles$1.default.bgRed.open:
|
|
744
|
+
return '<bgRed>';
|
|
745
|
+
|
|
746
|
+
case _ansiStyles$1.default.bgGreen.open:
|
|
747
|
+
return '<bgGreen>';
|
|
748
|
+
|
|
749
|
+
case _ansiStyles$1.default.bgYellow.open:
|
|
750
|
+
return '<bgYellow>';
|
|
751
|
+
|
|
752
|
+
case _ansiStyles$1.default.inverse.open:
|
|
753
|
+
return '<inverse>';
|
|
754
|
+
|
|
755
|
+
case _ansiStyles$1.default.dim.open:
|
|
756
|
+
return '<dim>';
|
|
757
|
+
|
|
758
|
+
case _ansiStyles$1.default.bold.open:
|
|
759
|
+
return '<bold>';
|
|
760
|
+
|
|
761
|
+
default:
|
|
762
|
+
return '';
|
|
763
|
+
}
|
|
764
|
+
});
|
|
765
|
+
|
|
766
|
+
const test$5 = val =>
|
|
767
|
+
typeof val === 'string' && !!val.match((0, _ansiRegex.default)());
|
|
768
|
+
|
|
769
|
+
ConvertAnsi.test = test$5;
|
|
770
|
+
|
|
771
|
+
const serialize$5 = (val, config, indentation, depth, refs, printer) =>
|
|
772
|
+
printer(toHumanReadableAnsi(val), config, indentation, depth, refs);
|
|
773
|
+
|
|
774
|
+
ConvertAnsi.serialize = serialize$5;
|
|
775
|
+
const plugin$5 = {
|
|
776
|
+
serialize: serialize$5,
|
|
777
|
+
test: test$5
|
|
778
|
+
};
|
|
779
|
+
var _default$6 = plugin$5;
|
|
780
|
+
ConvertAnsi.default = _default$6;
|
|
781
|
+
|
|
782
|
+
var DOMCollection$1 = {};
|
|
783
|
+
|
|
784
|
+
Object.defineProperty(DOMCollection$1, '__esModule', {
|
|
785
|
+
value: true
|
|
786
|
+
});
|
|
787
|
+
DOMCollection$1.test = DOMCollection$1.serialize = DOMCollection$1.default = void 0;
|
|
788
|
+
|
|
789
|
+
var _collections$2 = collections;
|
|
790
|
+
|
|
791
|
+
/**
|
|
792
|
+
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
793
|
+
*
|
|
794
|
+
* This source code is licensed under the MIT license found in the
|
|
795
|
+
* LICENSE file in the root directory of this source tree.
|
|
796
|
+
*/
|
|
797
|
+
|
|
798
|
+
/* eslint-disable local/ban-types-eventually */
|
|
799
|
+
const SPACE$1 = ' ';
|
|
800
|
+
const OBJECT_NAMES = ['DOMStringMap', 'NamedNodeMap'];
|
|
801
|
+
const ARRAY_REGEXP = /^(HTML\w*Collection|NodeList)$/;
|
|
802
|
+
|
|
803
|
+
const testName = name =>
|
|
804
|
+
OBJECT_NAMES.indexOf(name) !== -1 || ARRAY_REGEXP.test(name);
|
|
805
|
+
|
|
806
|
+
const test$4 = val =>
|
|
807
|
+
val &&
|
|
808
|
+
val.constructor &&
|
|
809
|
+
!!val.constructor.name &&
|
|
810
|
+
testName(val.constructor.name);
|
|
811
|
+
|
|
812
|
+
DOMCollection$1.test = test$4;
|
|
813
|
+
|
|
814
|
+
const isNamedNodeMap = collection =>
|
|
815
|
+
collection.constructor.name === 'NamedNodeMap';
|
|
816
|
+
|
|
817
|
+
const serialize$4 = (collection, config, indentation, depth, refs, printer) => {
|
|
818
|
+
const name = collection.constructor.name;
|
|
819
|
+
|
|
820
|
+
if (++depth > config.maxDepth) {
|
|
821
|
+
return '[' + name + ']';
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
return (
|
|
825
|
+
(config.min ? '' : name + SPACE$1) +
|
|
826
|
+
(OBJECT_NAMES.indexOf(name) !== -1
|
|
827
|
+
? '{' +
|
|
828
|
+
(0, _collections$2.printObjectProperties)(
|
|
829
|
+
isNamedNodeMap(collection)
|
|
830
|
+
? Array.from(collection).reduce((props, attribute) => {
|
|
831
|
+
props[attribute.name] = attribute.value;
|
|
832
|
+
return props;
|
|
833
|
+
}, {})
|
|
834
|
+
: {...collection},
|
|
835
|
+
config,
|
|
836
|
+
indentation,
|
|
837
|
+
depth,
|
|
838
|
+
refs,
|
|
839
|
+
printer
|
|
840
|
+
) +
|
|
841
|
+
'}'
|
|
842
|
+
: '[' +
|
|
843
|
+
(0, _collections$2.printListItems)(
|
|
844
|
+
Array.from(collection),
|
|
845
|
+
config,
|
|
846
|
+
indentation,
|
|
847
|
+
depth,
|
|
848
|
+
refs,
|
|
849
|
+
printer
|
|
850
|
+
) +
|
|
851
|
+
']')
|
|
852
|
+
);
|
|
853
|
+
};
|
|
854
|
+
|
|
855
|
+
DOMCollection$1.serialize = serialize$4;
|
|
856
|
+
const plugin$4 = {
|
|
857
|
+
serialize: serialize$4,
|
|
858
|
+
test: test$4
|
|
859
|
+
};
|
|
860
|
+
var _default$5 = plugin$4;
|
|
861
|
+
DOMCollection$1.default = _default$5;
|
|
862
|
+
|
|
863
|
+
var DOMElement$1 = {};
|
|
864
|
+
|
|
865
|
+
var markup = {};
|
|
866
|
+
|
|
867
|
+
var escapeHTML$1 = {};
|
|
868
|
+
|
|
869
|
+
Object.defineProperty(escapeHTML$1, '__esModule', {
|
|
870
|
+
value: true
|
|
871
|
+
});
|
|
872
|
+
escapeHTML$1.default = escapeHTML;
|
|
873
|
+
|
|
874
|
+
/**
|
|
875
|
+
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
876
|
+
*
|
|
877
|
+
* This source code is licensed under the MIT license found in the
|
|
878
|
+
* LICENSE file in the root directory of this source tree.
|
|
879
|
+
*/
|
|
880
|
+
function escapeHTML(str) {
|
|
881
|
+
return str.replace(/</g, '<').replace(/>/g, '>');
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
Object.defineProperty(markup, '__esModule', {
|
|
885
|
+
value: true
|
|
886
|
+
});
|
|
887
|
+
markup.printText =
|
|
888
|
+
markup.printProps =
|
|
889
|
+
markup.printElementAsLeaf =
|
|
890
|
+
markup.printElement =
|
|
891
|
+
markup.printComment =
|
|
892
|
+
markup.printChildren =
|
|
893
|
+
void 0;
|
|
894
|
+
|
|
895
|
+
var _escapeHTML = _interopRequireDefault$1(escapeHTML$1);
|
|
896
|
+
|
|
897
|
+
function _interopRequireDefault$1(obj) {
|
|
898
|
+
return obj && obj.__esModule ? obj : {default: obj};
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
/**
|
|
902
|
+
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
903
|
+
*
|
|
904
|
+
* This source code is licensed under the MIT license found in the
|
|
905
|
+
* LICENSE file in the root directory of this source tree.
|
|
906
|
+
*/
|
|
907
|
+
// Return empty string if keys is empty.
|
|
908
|
+
const printProps = (keys, props, config, indentation, depth, refs, printer) => {
|
|
909
|
+
const indentationNext = indentation + config.indent;
|
|
910
|
+
const colors = config.colors;
|
|
911
|
+
return keys
|
|
912
|
+
.map(key => {
|
|
913
|
+
const value = props[key];
|
|
914
|
+
let printed = printer(value, config, indentationNext, depth, refs);
|
|
915
|
+
|
|
916
|
+
if (typeof value !== 'string') {
|
|
917
|
+
if (printed.indexOf('\n') !== -1) {
|
|
918
|
+
printed =
|
|
919
|
+
config.spacingOuter +
|
|
920
|
+
indentationNext +
|
|
921
|
+
printed +
|
|
922
|
+
config.spacingOuter +
|
|
923
|
+
indentation;
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
printed = '{' + printed + '}';
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
return (
|
|
930
|
+
config.spacingInner +
|
|
931
|
+
indentation +
|
|
932
|
+
colors.prop.open +
|
|
933
|
+
key +
|
|
934
|
+
colors.prop.close +
|
|
935
|
+
'=' +
|
|
936
|
+
colors.value.open +
|
|
937
|
+
printed +
|
|
938
|
+
colors.value.close
|
|
939
|
+
);
|
|
940
|
+
})
|
|
941
|
+
.join('');
|
|
942
|
+
}; // Return empty string if children is empty.
|
|
943
|
+
|
|
944
|
+
markup.printProps = printProps;
|
|
945
|
+
|
|
946
|
+
const printChildren = (children, config, indentation, depth, refs, printer) =>
|
|
947
|
+
children
|
|
948
|
+
.map(
|
|
949
|
+
child =>
|
|
950
|
+
config.spacingOuter +
|
|
951
|
+
indentation +
|
|
952
|
+
(typeof child === 'string'
|
|
953
|
+
? printText(child, config)
|
|
954
|
+
: printer(child, config, indentation, depth, refs))
|
|
955
|
+
)
|
|
956
|
+
.join('');
|
|
957
|
+
|
|
958
|
+
markup.printChildren = printChildren;
|
|
959
|
+
|
|
960
|
+
const printText = (text, config) => {
|
|
961
|
+
const contentColor = config.colors.content;
|
|
962
|
+
return (
|
|
963
|
+
contentColor.open + (0, _escapeHTML.default)(text) + contentColor.close
|
|
964
|
+
);
|
|
965
|
+
};
|
|
966
|
+
|
|
967
|
+
markup.printText = printText;
|
|
968
|
+
|
|
969
|
+
const printComment = (comment, config) => {
|
|
970
|
+
const commentColor = config.colors.comment;
|
|
971
|
+
return (
|
|
972
|
+
commentColor.open +
|
|
973
|
+
'<!--' +
|
|
974
|
+
(0, _escapeHTML.default)(comment) +
|
|
975
|
+
'-->' +
|
|
976
|
+
commentColor.close
|
|
977
|
+
);
|
|
978
|
+
}; // Separate the functions to format props, children, and element,
|
|
979
|
+
// so a plugin could override a particular function, if needed.
|
|
980
|
+
// Too bad, so sad: the traditional (but unnecessary) space
|
|
981
|
+
// in a self-closing tagColor requires a second test of printedProps.
|
|
982
|
+
|
|
983
|
+
markup.printComment = printComment;
|
|
984
|
+
|
|
985
|
+
const printElement = (
|
|
986
|
+
type,
|
|
987
|
+
printedProps,
|
|
988
|
+
printedChildren,
|
|
989
|
+
config,
|
|
990
|
+
indentation
|
|
991
|
+
) => {
|
|
992
|
+
const tagColor = config.colors.tag;
|
|
993
|
+
return (
|
|
994
|
+
tagColor.open +
|
|
995
|
+
'<' +
|
|
996
|
+
type +
|
|
997
|
+
(printedProps &&
|
|
998
|
+
tagColor.close +
|
|
999
|
+
printedProps +
|
|
1000
|
+
config.spacingOuter +
|
|
1001
|
+
indentation +
|
|
1002
|
+
tagColor.open) +
|
|
1003
|
+
(printedChildren
|
|
1004
|
+
? '>' +
|
|
1005
|
+
tagColor.close +
|
|
1006
|
+
printedChildren +
|
|
1007
|
+
config.spacingOuter +
|
|
1008
|
+
indentation +
|
|
1009
|
+
tagColor.open +
|
|
1010
|
+
'</' +
|
|
1011
|
+
type
|
|
1012
|
+
: (printedProps && !config.min ? '' : ' ') + '/') +
|
|
1013
|
+
'>' +
|
|
1014
|
+
tagColor.close
|
|
1015
|
+
);
|
|
1016
|
+
};
|
|
1017
|
+
|
|
1018
|
+
markup.printElement = printElement;
|
|
1019
|
+
|
|
1020
|
+
const printElementAsLeaf = (type, config) => {
|
|
1021
|
+
const tagColor = config.colors.tag;
|
|
1022
|
+
return (
|
|
1023
|
+
tagColor.open +
|
|
1024
|
+
'<' +
|
|
1025
|
+
type +
|
|
1026
|
+
tagColor.close +
|
|
1027
|
+
' …' +
|
|
1028
|
+
tagColor.open +
|
|
1029
|
+
' />' +
|
|
1030
|
+
tagColor.close
|
|
1031
|
+
);
|
|
1032
|
+
};
|
|
1033
|
+
|
|
1034
|
+
markup.printElementAsLeaf = printElementAsLeaf;
|
|
1035
|
+
|
|
1036
|
+
Object.defineProperty(DOMElement$1, '__esModule', {
|
|
1037
|
+
value: true
|
|
1038
|
+
});
|
|
1039
|
+
DOMElement$1.test = DOMElement$1.serialize = DOMElement$1.default = void 0;
|
|
1040
|
+
|
|
1041
|
+
var _markup$2 = markup;
|
|
1042
|
+
|
|
1043
|
+
/**
|
|
1044
|
+
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
1045
|
+
*
|
|
1046
|
+
* This source code is licensed under the MIT license found in the
|
|
1047
|
+
* LICENSE file in the root directory of this source tree.
|
|
1048
|
+
*/
|
|
1049
|
+
const ELEMENT_NODE = 1;
|
|
1050
|
+
const TEXT_NODE = 3;
|
|
1051
|
+
const COMMENT_NODE = 8;
|
|
1052
|
+
const FRAGMENT_NODE = 11;
|
|
1053
|
+
const ELEMENT_REGEXP = /^((HTML|SVG)\w*)?Element$/;
|
|
1054
|
+
|
|
1055
|
+
const testHasAttribute = val => {
|
|
1056
|
+
try {
|
|
1057
|
+
return typeof val.hasAttribute === 'function' && val.hasAttribute('is');
|
|
1058
|
+
} catch {
|
|
1059
|
+
return false;
|
|
1060
|
+
}
|
|
1061
|
+
};
|
|
1062
|
+
|
|
1063
|
+
const testNode = val => {
|
|
1064
|
+
const constructorName = val.constructor.name;
|
|
1065
|
+
const {nodeType, tagName} = val;
|
|
1066
|
+
const isCustomElement =
|
|
1067
|
+
(typeof tagName === 'string' && tagName.includes('-')) ||
|
|
1068
|
+
testHasAttribute(val);
|
|
1069
|
+
return (
|
|
1070
|
+
(nodeType === ELEMENT_NODE &&
|
|
1071
|
+
(ELEMENT_REGEXP.test(constructorName) || isCustomElement)) ||
|
|
1072
|
+
(nodeType === TEXT_NODE && constructorName === 'Text') ||
|
|
1073
|
+
(nodeType === COMMENT_NODE && constructorName === 'Comment') ||
|
|
1074
|
+
(nodeType === FRAGMENT_NODE && constructorName === 'DocumentFragment')
|
|
1075
|
+
);
|
|
1076
|
+
};
|
|
1077
|
+
|
|
1078
|
+
const test$3 = val => {
|
|
1079
|
+
var _val$constructor;
|
|
1080
|
+
|
|
1081
|
+
return (
|
|
1082
|
+
(val === null || val === void 0
|
|
1083
|
+
? void 0
|
|
1084
|
+
: (_val$constructor = val.constructor) === null ||
|
|
1085
|
+
_val$constructor === void 0
|
|
1086
|
+
? void 0
|
|
1087
|
+
: _val$constructor.name) && testNode(val)
|
|
1088
|
+
);
|
|
1089
|
+
};
|
|
1090
|
+
|
|
1091
|
+
DOMElement$1.test = test$3;
|
|
1092
|
+
|
|
1093
|
+
function nodeIsText(node) {
|
|
1094
|
+
return node.nodeType === TEXT_NODE;
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
function nodeIsComment(node) {
|
|
1098
|
+
return node.nodeType === COMMENT_NODE;
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1101
|
+
function nodeIsFragment(node) {
|
|
1102
|
+
return node.nodeType === FRAGMENT_NODE;
|
|
1103
|
+
}
|
|
1104
|
+
|
|
1105
|
+
const serialize$3 = (node, config, indentation, depth, refs, printer) => {
|
|
1106
|
+
if (nodeIsText(node)) {
|
|
1107
|
+
return (0, _markup$2.printText)(node.data, config);
|
|
1108
|
+
}
|
|
1109
|
+
|
|
1110
|
+
if (nodeIsComment(node)) {
|
|
1111
|
+
return (0, _markup$2.printComment)(node.data, config);
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
const type = nodeIsFragment(node)
|
|
1115
|
+
? `DocumentFragment`
|
|
1116
|
+
: node.tagName.toLowerCase();
|
|
1117
|
+
|
|
1118
|
+
if (++depth > config.maxDepth) {
|
|
1119
|
+
return (0, _markup$2.printElementAsLeaf)(type, config);
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1122
|
+
return (0, _markup$2.printElement)(
|
|
1123
|
+
type,
|
|
1124
|
+
(0, _markup$2.printProps)(
|
|
1125
|
+
nodeIsFragment(node)
|
|
1126
|
+
? []
|
|
1127
|
+
: Array.from(node.attributes)
|
|
1128
|
+
.map(attr => attr.name)
|
|
1129
|
+
.sort(),
|
|
1130
|
+
nodeIsFragment(node)
|
|
1131
|
+
? {}
|
|
1132
|
+
: Array.from(node.attributes).reduce((props, attribute) => {
|
|
1133
|
+
props[attribute.name] = attribute.value;
|
|
1134
|
+
return props;
|
|
1135
|
+
}, {}),
|
|
1136
|
+
config,
|
|
1137
|
+
indentation + config.indent,
|
|
1138
|
+
depth,
|
|
1139
|
+
refs,
|
|
1140
|
+
printer
|
|
1141
|
+
),
|
|
1142
|
+
(0, _markup$2.printChildren)(
|
|
1143
|
+
Array.prototype.slice.call(node.childNodes || node.children),
|
|
1144
|
+
config,
|
|
1145
|
+
indentation + config.indent,
|
|
1146
|
+
depth,
|
|
1147
|
+
refs,
|
|
1148
|
+
printer
|
|
1149
|
+
),
|
|
1150
|
+
config,
|
|
1151
|
+
indentation
|
|
1152
|
+
);
|
|
1153
|
+
};
|
|
1154
|
+
|
|
1155
|
+
DOMElement$1.serialize = serialize$3;
|
|
1156
|
+
const plugin$3 = {
|
|
1157
|
+
serialize: serialize$3,
|
|
1158
|
+
test: test$3
|
|
1159
|
+
};
|
|
1160
|
+
var _default$4 = plugin$3;
|
|
1161
|
+
DOMElement$1.default = _default$4;
|
|
1162
|
+
|
|
1163
|
+
var Immutable$1 = {};
|
|
1164
|
+
|
|
1165
|
+
Object.defineProperty(Immutable$1, '__esModule', {
|
|
1166
|
+
value: true
|
|
1167
|
+
});
|
|
1168
|
+
Immutable$1.test = Immutable$1.serialize = Immutable$1.default = void 0;
|
|
1169
|
+
|
|
1170
|
+
var _collections$1 = collections;
|
|
1171
|
+
|
|
1172
|
+
/**
|
|
1173
|
+
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
1174
|
+
*
|
|
1175
|
+
* This source code is licensed under the MIT license found in the
|
|
1176
|
+
* LICENSE file in the root directory of this source tree.
|
|
1177
|
+
*/
|
|
1178
|
+
// SENTINEL constants are from https://github.com/facebook/immutable-js
|
|
1179
|
+
const IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@';
|
|
1180
|
+
const IS_LIST_SENTINEL = '@@__IMMUTABLE_LIST__@@';
|
|
1181
|
+
const IS_KEYED_SENTINEL$1 = '@@__IMMUTABLE_KEYED__@@';
|
|
1182
|
+
const IS_MAP_SENTINEL = '@@__IMMUTABLE_MAP__@@';
|
|
1183
|
+
const IS_ORDERED_SENTINEL$1 = '@@__IMMUTABLE_ORDERED__@@';
|
|
1184
|
+
const IS_RECORD_SENTINEL = '@@__IMMUTABLE_RECORD__@@'; // immutable v4
|
|
1185
|
+
|
|
1186
|
+
const IS_SEQ_SENTINEL = '@@__IMMUTABLE_SEQ__@@';
|
|
1187
|
+
const IS_SET_SENTINEL$1 = '@@__IMMUTABLE_SET__@@';
|
|
1188
|
+
const IS_STACK_SENTINEL = '@@__IMMUTABLE_STACK__@@';
|
|
1189
|
+
|
|
1190
|
+
const getImmutableName = name => 'Immutable.' + name;
|
|
1191
|
+
|
|
1192
|
+
const printAsLeaf = name => '[' + name + ']';
|
|
1193
|
+
|
|
1194
|
+
const SPACE = ' ';
|
|
1195
|
+
const LAZY = '…'; // Seq is lazy if it calls a method like filter
|
|
1196
|
+
|
|
1197
|
+
const printImmutableEntries = (
|
|
1198
|
+
val,
|
|
1199
|
+
config,
|
|
1200
|
+
indentation,
|
|
1201
|
+
depth,
|
|
1202
|
+
refs,
|
|
1203
|
+
printer,
|
|
1204
|
+
type
|
|
1205
|
+
) =>
|
|
1206
|
+
++depth > config.maxDepth
|
|
1207
|
+
? printAsLeaf(getImmutableName(type))
|
|
1208
|
+
: getImmutableName(type) +
|
|
1209
|
+
SPACE +
|
|
1210
|
+
'{' +
|
|
1211
|
+
(0, _collections$1.printIteratorEntries)(
|
|
1212
|
+
val.entries(),
|
|
1213
|
+
config,
|
|
1214
|
+
indentation,
|
|
1215
|
+
depth,
|
|
1216
|
+
refs,
|
|
1217
|
+
printer
|
|
1218
|
+
) +
|
|
1219
|
+
'}'; // Record has an entries method because it is a collection in immutable v3.
|
|
1220
|
+
// Return an iterator for Immutable Record from version v3 or v4.
|
|
1221
|
+
|
|
1222
|
+
function getRecordEntries(val) {
|
|
1223
|
+
let i = 0;
|
|
1224
|
+
return {
|
|
1225
|
+
next() {
|
|
1226
|
+
if (i < val._keys.length) {
|
|
1227
|
+
const key = val._keys[i++];
|
|
1228
|
+
return {
|
|
1229
|
+
done: false,
|
|
1230
|
+
value: [key, val.get(key)]
|
|
1231
|
+
};
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1234
|
+
return {
|
|
1235
|
+
done: true,
|
|
1236
|
+
value: undefined
|
|
1237
|
+
};
|
|
1238
|
+
}
|
|
1239
|
+
};
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1242
|
+
const printImmutableRecord = (
|
|
1243
|
+
val,
|
|
1244
|
+
config,
|
|
1245
|
+
indentation,
|
|
1246
|
+
depth,
|
|
1247
|
+
refs,
|
|
1248
|
+
printer
|
|
1249
|
+
) => {
|
|
1250
|
+
// _name property is defined only for an Immutable Record instance
|
|
1251
|
+
// which was constructed with a second optional descriptive name arg
|
|
1252
|
+
const name = getImmutableName(val._name || 'Record');
|
|
1253
|
+
return ++depth > config.maxDepth
|
|
1254
|
+
? printAsLeaf(name)
|
|
1255
|
+
: name +
|
|
1256
|
+
SPACE +
|
|
1257
|
+
'{' +
|
|
1258
|
+
(0, _collections$1.printIteratorEntries)(
|
|
1259
|
+
getRecordEntries(val),
|
|
1260
|
+
config,
|
|
1261
|
+
indentation,
|
|
1262
|
+
depth,
|
|
1263
|
+
refs,
|
|
1264
|
+
printer
|
|
1265
|
+
) +
|
|
1266
|
+
'}';
|
|
1267
|
+
};
|
|
1268
|
+
|
|
1269
|
+
const printImmutableSeq = (val, config, indentation, depth, refs, printer) => {
|
|
1270
|
+
const name = getImmutableName('Seq');
|
|
1271
|
+
|
|
1272
|
+
if (++depth > config.maxDepth) {
|
|
1273
|
+
return printAsLeaf(name);
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1276
|
+
if (val[IS_KEYED_SENTINEL$1]) {
|
|
1277
|
+
return (
|
|
1278
|
+
name +
|
|
1279
|
+
SPACE +
|
|
1280
|
+
'{' + // from Immutable collection of entries or from ECMAScript object
|
|
1281
|
+
(val._iter || val._object
|
|
1282
|
+
? (0, _collections$1.printIteratorEntries)(
|
|
1283
|
+
val.entries(),
|
|
1284
|
+
config,
|
|
1285
|
+
indentation,
|
|
1286
|
+
depth,
|
|
1287
|
+
refs,
|
|
1288
|
+
printer
|
|
1289
|
+
)
|
|
1290
|
+
: LAZY) +
|
|
1291
|
+
'}'
|
|
1292
|
+
);
|
|
1293
|
+
}
|
|
1294
|
+
|
|
1295
|
+
return (
|
|
1296
|
+
name +
|
|
1297
|
+
SPACE +
|
|
1298
|
+
'[' +
|
|
1299
|
+
(val._iter || // from Immutable collection of values
|
|
1300
|
+
val._array || // from ECMAScript array
|
|
1301
|
+
val._collection || // from ECMAScript collection in immutable v4
|
|
1302
|
+
val._iterable // from ECMAScript collection in immutable v3
|
|
1303
|
+
? (0, _collections$1.printIteratorValues)(
|
|
1304
|
+
val.values(),
|
|
1305
|
+
config,
|
|
1306
|
+
indentation,
|
|
1307
|
+
depth,
|
|
1308
|
+
refs,
|
|
1309
|
+
printer
|
|
1310
|
+
)
|
|
1311
|
+
: LAZY) +
|
|
1312
|
+
']'
|
|
1313
|
+
);
|
|
1314
|
+
};
|
|
1315
|
+
|
|
1316
|
+
const printImmutableValues = (
|
|
1317
|
+
val,
|
|
1318
|
+
config,
|
|
1319
|
+
indentation,
|
|
1320
|
+
depth,
|
|
1321
|
+
refs,
|
|
1322
|
+
printer,
|
|
1323
|
+
type
|
|
1324
|
+
) =>
|
|
1325
|
+
++depth > config.maxDepth
|
|
1326
|
+
? printAsLeaf(getImmutableName(type))
|
|
1327
|
+
: getImmutableName(type) +
|
|
1328
|
+
SPACE +
|
|
1329
|
+
'[' +
|
|
1330
|
+
(0, _collections$1.printIteratorValues)(
|
|
1331
|
+
val.values(),
|
|
1332
|
+
config,
|
|
1333
|
+
indentation,
|
|
1334
|
+
depth,
|
|
1335
|
+
refs,
|
|
1336
|
+
printer
|
|
1337
|
+
) +
|
|
1338
|
+
']';
|
|
1339
|
+
|
|
1340
|
+
const serialize$2 = (val, config, indentation, depth, refs, printer) => {
|
|
1341
|
+
if (val[IS_MAP_SENTINEL]) {
|
|
1342
|
+
return printImmutableEntries(
|
|
1343
|
+
val,
|
|
1344
|
+
config,
|
|
1345
|
+
indentation,
|
|
1346
|
+
depth,
|
|
1347
|
+
refs,
|
|
1348
|
+
printer,
|
|
1349
|
+
val[IS_ORDERED_SENTINEL$1] ? 'OrderedMap' : 'Map'
|
|
1350
|
+
);
|
|
1351
|
+
}
|
|
1352
|
+
|
|
1353
|
+
if (val[IS_LIST_SENTINEL]) {
|
|
1354
|
+
return printImmutableValues(
|
|
1355
|
+
val,
|
|
1356
|
+
config,
|
|
1357
|
+
indentation,
|
|
1358
|
+
depth,
|
|
1359
|
+
refs,
|
|
1360
|
+
printer,
|
|
1361
|
+
'List'
|
|
1362
|
+
);
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1365
|
+
if (val[IS_SET_SENTINEL$1]) {
|
|
1366
|
+
return printImmutableValues(
|
|
1367
|
+
val,
|
|
1368
|
+
config,
|
|
1369
|
+
indentation,
|
|
1370
|
+
depth,
|
|
1371
|
+
refs,
|
|
1372
|
+
printer,
|
|
1373
|
+
val[IS_ORDERED_SENTINEL$1] ? 'OrderedSet' : 'Set'
|
|
1374
|
+
);
|
|
1375
|
+
}
|
|
1376
|
+
|
|
1377
|
+
if (val[IS_STACK_SENTINEL]) {
|
|
1378
|
+
return printImmutableValues(
|
|
1379
|
+
val,
|
|
1380
|
+
config,
|
|
1381
|
+
indentation,
|
|
1382
|
+
depth,
|
|
1383
|
+
refs,
|
|
1384
|
+
printer,
|
|
1385
|
+
'Stack'
|
|
1386
|
+
);
|
|
1387
|
+
}
|
|
1388
|
+
|
|
1389
|
+
if (val[IS_SEQ_SENTINEL]) {
|
|
1390
|
+
return printImmutableSeq(val, config, indentation, depth, refs, printer);
|
|
1391
|
+
} // For compatibility with immutable v3 and v4, let record be the default.
|
|
1392
|
+
|
|
1393
|
+
return printImmutableRecord(val, config, indentation, depth, refs, printer);
|
|
1394
|
+
}; // Explicitly comparing sentinel properties to true avoids false positive
|
|
1395
|
+
// when mock identity-obj-proxy returns the key as the value for any key.
|
|
1396
|
+
|
|
1397
|
+
Immutable$1.serialize = serialize$2;
|
|
1398
|
+
|
|
1399
|
+
const test$2 = val =>
|
|
1400
|
+
val &&
|
|
1401
|
+
(val[IS_ITERABLE_SENTINEL] === true || val[IS_RECORD_SENTINEL] === true);
|
|
1402
|
+
|
|
1403
|
+
Immutable$1.test = test$2;
|
|
1404
|
+
const plugin$2 = {
|
|
1405
|
+
serialize: serialize$2,
|
|
1406
|
+
test: test$2
|
|
1407
|
+
};
|
|
1408
|
+
var _default$3 = plugin$2;
|
|
1409
|
+
Immutable$1.default = _default$3;
|
|
1410
|
+
|
|
1411
|
+
var ReactElement$1 = {};
|
|
1412
|
+
|
|
1413
|
+
var reactIs = {exports: {}};
|
|
1414
|
+
|
|
1415
|
+
var reactIs_production_min = {};
|
|
1416
|
+
|
|
1417
|
+
/** @license React v17.0.2
|
|
1418
|
+
* react-is.production.min.js
|
|
1419
|
+
*
|
|
1420
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
1421
|
+
*
|
|
1422
|
+
* This source code is licensed under the MIT license found in the
|
|
1423
|
+
* LICENSE file in the root directory of this source tree.
|
|
1424
|
+
*/
|
|
1425
|
+
var b=60103,c=60106,d=60107,e=60108,f=60114,g=60109,h=60110,k=60112,l=60113,m=60120,n=60115,p=60116,q=60121,r=60122,u=60117,v=60129,w=60131;
|
|
1426
|
+
if("function"===typeof Symbol&&Symbol.for){var x=Symbol.for;b=x("react.element");c=x("react.portal");d=x("react.fragment");e=x("react.strict_mode");f=x("react.profiler");g=x("react.provider");h=x("react.context");k=x("react.forward_ref");l=x("react.suspense");m=x("react.suspense_list");n=x("react.memo");p=x("react.lazy");q=x("react.block");r=x("react.server.block");u=x("react.fundamental");v=x("react.debug_trace_mode");w=x("react.legacy_hidden");}
|
|
1427
|
+
function y(a){if("object"===typeof a&&null!==a){var t=a.$$typeof;switch(t){case b:switch(a=a.type,a){case d:case f:case e:case l:case m:return a;default:switch(a=a&&a.$$typeof,a){case h:case k:case p:case n:case g:return a;default:return t}}case c:return t}}}var z=g,A=b,B=k,C=d,D=p,E=n,F=c,G=f,H=e,I=l;reactIs_production_min.ContextConsumer=h;reactIs_production_min.ContextProvider=z;reactIs_production_min.Element=A;reactIs_production_min.ForwardRef=B;reactIs_production_min.Fragment=C;reactIs_production_min.Lazy=D;reactIs_production_min.Memo=E;reactIs_production_min.Portal=F;reactIs_production_min.Profiler=G;reactIs_production_min.StrictMode=H;
|
|
1428
|
+
reactIs_production_min.Suspense=I;reactIs_production_min.isAsyncMode=function(){return !1};reactIs_production_min.isConcurrentMode=function(){return !1};reactIs_production_min.isContextConsumer=function(a){return y(a)===h};reactIs_production_min.isContextProvider=function(a){return y(a)===g};reactIs_production_min.isElement=function(a){return "object"===typeof a&&null!==a&&a.$$typeof===b};reactIs_production_min.isForwardRef=function(a){return y(a)===k};reactIs_production_min.isFragment=function(a){return y(a)===d};reactIs_production_min.isLazy=function(a){return y(a)===p};reactIs_production_min.isMemo=function(a){return y(a)===n};
|
|
1429
|
+
reactIs_production_min.isPortal=function(a){return y(a)===c};reactIs_production_min.isProfiler=function(a){return y(a)===f};reactIs_production_min.isStrictMode=function(a){return y(a)===e};reactIs_production_min.isSuspense=function(a){return y(a)===l};reactIs_production_min.isValidElementType=function(a){return "string"===typeof a||"function"===typeof a||a===d||a===f||a===v||a===e||a===l||a===m||a===w||"object"===typeof a&&null!==a&&(a.$$typeof===p||a.$$typeof===n||a.$$typeof===g||a.$$typeof===h||a.$$typeof===k||a.$$typeof===u||a.$$typeof===q||a[0]===r)?!0:!1};
|
|
1430
|
+
reactIs_production_min.typeOf=y;
|
|
1431
|
+
|
|
1432
|
+
var reactIs_development = {};
|
|
1433
|
+
|
|
1434
|
+
/** @license React v17.0.2
|
|
1435
|
+
* react-is.development.js
|
|
1436
|
+
*
|
|
1437
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
1438
|
+
*
|
|
1439
|
+
* This source code is licensed under the MIT license found in the
|
|
1440
|
+
* LICENSE file in the root directory of this source tree.
|
|
1441
|
+
*/
|
|
1442
|
+
|
|
1443
|
+
if (process.env.NODE_ENV !== "production") {
|
|
1444
|
+
(function() {
|
|
1445
|
+
|
|
1446
|
+
// ATTENTION
|
|
1447
|
+
// When adding new symbols to this file,
|
|
1448
|
+
// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
|
|
1449
|
+
// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
|
|
1450
|
+
// nor polyfill, then a plain number is used for performance.
|
|
1451
|
+
var REACT_ELEMENT_TYPE = 0xeac7;
|
|
1452
|
+
var REACT_PORTAL_TYPE = 0xeaca;
|
|
1453
|
+
var REACT_FRAGMENT_TYPE = 0xeacb;
|
|
1454
|
+
var REACT_STRICT_MODE_TYPE = 0xeacc;
|
|
1455
|
+
var REACT_PROFILER_TYPE = 0xead2;
|
|
1456
|
+
var REACT_PROVIDER_TYPE = 0xeacd;
|
|
1457
|
+
var REACT_CONTEXT_TYPE = 0xeace;
|
|
1458
|
+
var REACT_FORWARD_REF_TYPE = 0xead0;
|
|
1459
|
+
var REACT_SUSPENSE_TYPE = 0xead1;
|
|
1460
|
+
var REACT_SUSPENSE_LIST_TYPE = 0xead8;
|
|
1461
|
+
var REACT_MEMO_TYPE = 0xead3;
|
|
1462
|
+
var REACT_LAZY_TYPE = 0xead4;
|
|
1463
|
+
var REACT_BLOCK_TYPE = 0xead9;
|
|
1464
|
+
var REACT_SERVER_BLOCK_TYPE = 0xeada;
|
|
1465
|
+
var REACT_FUNDAMENTAL_TYPE = 0xead5;
|
|
1466
|
+
var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1;
|
|
1467
|
+
var REACT_LEGACY_HIDDEN_TYPE = 0xeae3;
|
|
1468
|
+
|
|
1469
|
+
if (typeof Symbol === 'function' && Symbol.for) {
|
|
1470
|
+
var symbolFor = Symbol.for;
|
|
1471
|
+
REACT_ELEMENT_TYPE = symbolFor('react.element');
|
|
1472
|
+
REACT_PORTAL_TYPE = symbolFor('react.portal');
|
|
1473
|
+
REACT_FRAGMENT_TYPE = symbolFor('react.fragment');
|
|
1474
|
+
REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode');
|
|
1475
|
+
REACT_PROFILER_TYPE = symbolFor('react.profiler');
|
|
1476
|
+
REACT_PROVIDER_TYPE = symbolFor('react.provider');
|
|
1477
|
+
REACT_CONTEXT_TYPE = symbolFor('react.context');
|
|
1478
|
+
REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref');
|
|
1479
|
+
REACT_SUSPENSE_TYPE = symbolFor('react.suspense');
|
|
1480
|
+
REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list');
|
|
1481
|
+
REACT_MEMO_TYPE = symbolFor('react.memo');
|
|
1482
|
+
REACT_LAZY_TYPE = symbolFor('react.lazy');
|
|
1483
|
+
REACT_BLOCK_TYPE = symbolFor('react.block');
|
|
1484
|
+
REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block');
|
|
1485
|
+
REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental');
|
|
1486
|
+
symbolFor('react.scope');
|
|
1487
|
+
symbolFor('react.opaque.id');
|
|
1488
|
+
REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode');
|
|
1489
|
+
symbolFor('react.offscreen');
|
|
1490
|
+
REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden');
|
|
1491
|
+
}
|
|
1492
|
+
|
|
1493
|
+
// Filter certain DOM attributes (e.g. src, href) if their values are empty strings.
|
|
1494
|
+
|
|
1495
|
+
var enableScopeAPI = false; // Experimental Create Event Handle API.
|
|
1496
|
+
|
|
1497
|
+
function isValidElementType(type) {
|
|
1498
|
+
if (typeof type === 'string' || typeof type === 'function') {
|
|
1499
|
+
return true;
|
|
1500
|
+
} // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).
|
|
1501
|
+
|
|
1502
|
+
|
|
1503
|
+
if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || type === REACT_DEBUG_TRACING_MODE_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) {
|
|
1504
|
+
return true;
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
if (typeof type === 'object' && type !== null) {
|
|
1508
|
+
if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) {
|
|
1509
|
+
return true;
|
|
1510
|
+
}
|
|
1511
|
+
}
|
|
1512
|
+
|
|
1513
|
+
return false;
|
|
1514
|
+
}
|
|
1515
|
+
|
|
1516
|
+
function typeOf(object) {
|
|
1517
|
+
if (typeof object === 'object' && object !== null) {
|
|
1518
|
+
var $$typeof = object.$$typeof;
|
|
1519
|
+
|
|
1520
|
+
switch ($$typeof) {
|
|
1521
|
+
case REACT_ELEMENT_TYPE:
|
|
1522
|
+
var type = object.type;
|
|
1523
|
+
|
|
1524
|
+
switch (type) {
|
|
1525
|
+
case REACT_FRAGMENT_TYPE:
|
|
1526
|
+
case REACT_PROFILER_TYPE:
|
|
1527
|
+
case REACT_STRICT_MODE_TYPE:
|
|
1528
|
+
case REACT_SUSPENSE_TYPE:
|
|
1529
|
+
case REACT_SUSPENSE_LIST_TYPE:
|
|
1530
|
+
return type;
|
|
1531
|
+
|
|
1532
|
+
default:
|
|
1533
|
+
var $$typeofType = type && type.$$typeof;
|
|
1534
|
+
|
|
1535
|
+
switch ($$typeofType) {
|
|
1536
|
+
case REACT_CONTEXT_TYPE:
|
|
1537
|
+
case REACT_FORWARD_REF_TYPE:
|
|
1538
|
+
case REACT_LAZY_TYPE:
|
|
1539
|
+
case REACT_MEMO_TYPE:
|
|
1540
|
+
case REACT_PROVIDER_TYPE:
|
|
1541
|
+
return $$typeofType;
|
|
1542
|
+
|
|
1543
|
+
default:
|
|
1544
|
+
return $$typeof;
|
|
1545
|
+
}
|
|
1546
|
+
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
case REACT_PORTAL_TYPE:
|
|
1550
|
+
return $$typeof;
|
|
1551
|
+
}
|
|
1552
|
+
}
|
|
1553
|
+
|
|
1554
|
+
return undefined;
|
|
1555
|
+
}
|
|
1556
|
+
var ContextConsumer = REACT_CONTEXT_TYPE;
|
|
1557
|
+
var ContextProvider = REACT_PROVIDER_TYPE;
|
|
1558
|
+
var Element = REACT_ELEMENT_TYPE;
|
|
1559
|
+
var ForwardRef = REACT_FORWARD_REF_TYPE;
|
|
1560
|
+
var Fragment = REACT_FRAGMENT_TYPE;
|
|
1561
|
+
var Lazy = REACT_LAZY_TYPE;
|
|
1562
|
+
var Memo = REACT_MEMO_TYPE;
|
|
1563
|
+
var Portal = REACT_PORTAL_TYPE;
|
|
1564
|
+
var Profiler = REACT_PROFILER_TYPE;
|
|
1565
|
+
var StrictMode = REACT_STRICT_MODE_TYPE;
|
|
1566
|
+
var Suspense = REACT_SUSPENSE_TYPE;
|
|
1567
|
+
var hasWarnedAboutDeprecatedIsAsyncMode = false;
|
|
1568
|
+
var hasWarnedAboutDeprecatedIsConcurrentMode = false; // AsyncMode should be deprecated
|
|
1569
|
+
|
|
1570
|
+
function isAsyncMode(object) {
|
|
1571
|
+
{
|
|
1572
|
+
if (!hasWarnedAboutDeprecatedIsAsyncMode) {
|
|
1573
|
+
hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint
|
|
1574
|
+
|
|
1575
|
+
console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 18+.');
|
|
1576
|
+
}
|
|
1577
|
+
}
|
|
1578
|
+
|
|
1579
|
+
return false;
|
|
1580
|
+
}
|
|
1581
|
+
function isConcurrentMode(object) {
|
|
1582
|
+
{
|
|
1583
|
+
if (!hasWarnedAboutDeprecatedIsConcurrentMode) {
|
|
1584
|
+
hasWarnedAboutDeprecatedIsConcurrentMode = true; // Using console['warn'] to evade Babel and ESLint
|
|
1585
|
+
|
|
1586
|
+
console['warn']('The ReactIs.isConcurrentMode() alias has been deprecated, ' + 'and will be removed in React 18+.');
|
|
1587
|
+
}
|
|
1588
|
+
}
|
|
1589
|
+
|
|
1590
|
+
return false;
|
|
1591
|
+
}
|
|
1592
|
+
function isContextConsumer(object) {
|
|
1593
|
+
return typeOf(object) === REACT_CONTEXT_TYPE;
|
|
1594
|
+
}
|
|
1595
|
+
function isContextProvider(object) {
|
|
1596
|
+
return typeOf(object) === REACT_PROVIDER_TYPE;
|
|
1597
|
+
}
|
|
1598
|
+
function isElement(object) {
|
|
1599
|
+
return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
|
|
1600
|
+
}
|
|
1601
|
+
function isForwardRef(object) {
|
|
1602
|
+
return typeOf(object) === REACT_FORWARD_REF_TYPE;
|
|
1603
|
+
}
|
|
1604
|
+
function isFragment(object) {
|
|
1605
|
+
return typeOf(object) === REACT_FRAGMENT_TYPE;
|
|
1606
|
+
}
|
|
1607
|
+
function isLazy(object) {
|
|
1608
|
+
return typeOf(object) === REACT_LAZY_TYPE;
|
|
1609
|
+
}
|
|
1610
|
+
function isMemo(object) {
|
|
1611
|
+
return typeOf(object) === REACT_MEMO_TYPE;
|
|
1612
|
+
}
|
|
1613
|
+
function isPortal(object) {
|
|
1614
|
+
return typeOf(object) === REACT_PORTAL_TYPE;
|
|
1615
|
+
}
|
|
1616
|
+
function isProfiler(object) {
|
|
1617
|
+
return typeOf(object) === REACT_PROFILER_TYPE;
|
|
1618
|
+
}
|
|
1619
|
+
function isStrictMode(object) {
|
|
1620
|
+
return typeOf(object) === REACT_STRICT_MODE_TYPE;
|
|
1621
|
+
}
|
|
1622
|
+
function isSuspense(object) {
|
|
1623
|
+
return typeOf(object) === REACT_SUSPENSE_TYPE;
|
|
1624
|
+
}
|
|
1625
|
+
|
|
1626
|
+
reactIs_development.ContextConsumer = ContextConsumer;
|
|
1627
|
+
reactIs_development.ContextProvider = ContextProvider;
|
|
1628
|
+
reactIs_development.Element = Element;
|
|
1629
|
+
reactIs_development.ForwardRef = ForwardRef;
|
|
1630
|
+
reactIs_development.Fragment = Fragment;
|
|
1631
|
+
reactIs_development.Lazy = Lazy;
|
|
1632
|
+
reactIs_development.Memo = Memo;
|
|
1633
|
+
reactIs_development.Portal = Portal;
|
|
1634
|
+
reactIs_development.Profiler = Profiler;
|
|
1635
|
+
reactIs_development.StrictMode = StrictMode;
|
|
1636
|
+
reactIs_development.Suspense = Suspense;
|
|
1637
|
+
reactIs_development.isAsyncMode = isAsyncMode;
|
|
1638
|
+
reactIs_development.isConcurrentMode = isConcurrentMode;
|
|
1639
|
+
reactIs_development.isContextConsumer = isContextConsumer;
|
|
1640
|
+
reactIs_development.isContextProvider = isContextProvider;
|
|
1641
|
+
reactIs_development.isElement = isElement;
|
|
1642
|
+
reactIs_development.isForwardRef = isForwardRef;
|
|
1643
|
+
reactIs_development.isFragment = isFragment;
|
|
1644
|
+
reactIs_development.isLazy = isLazy;
|
|
1645
|
+
reactIs_development.isMemo = isMemo;
|
|
1646
|
+
reactIs_development.isPortal = isPortal;
|
|
1647
|
+
reactIs_development.isProfiler = isProfiler;
|
|
1648
|
+
reactIs_development.isStrictMode = isStrictMode;
|
|
1649
|
+
reactIs_development.isSuspense = isSuspense;
|
|
1650
|
+
reactIs_development.isValidElementType = isValidElementType;
|
|
1651
|
+
reactIs_development.typeOf = typeOf;
|
|
1652
|
+
})();
|
|
1653
|
+
}
|
|
1654
|
+
|
|
1655
|
+
if (process.env.NODE_ENV === 'production') {
|
|
1656
|
+
reactIs.exports = reactIs_production_min;
|
|
1657
|
+
} else {
|
|
1658
|
+
reactIs.exports = reactIs_development;
|
|
1659
|
+
}
|
|
1660
|
+
|
|
1661
|
+
Object.defineProperty(ReactElement$1, '__esModule', {
|
|
1662
|
+
value: true
|
|
1663
|
+
});
|
|
1664
|
+
ReactElement$1.test = ReactElement$1.serialize = ReactElement$1.default = void 0;
|
|
1665
|
+
|
|
1666
|
+
var ReactIs = _interopRequireWildcard(reactIs.exports);
|
|
1667
|
+
|
|
1668
|
+
var _markup$1 = markup;
|
|
1669
|
+
|
|
1670
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
1671
|
+
if (typeof WeakMap !== 'function') return null;
|
|
1672
|
+
var cacheBabelInterop = new WeakMap();
|
|
1673
|
+
var cacheNodeInterop = new WeakMap();
|
|
1674
|
+
return (_getRequireWildcardCache = function (nodeInterop) {
|
|
1675
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
1676
|
+
})(nodeInterop);
|
|
1677
|
+
}
|
|
1678
|
+
|
|
1679
|
+
function _interopRequireWildcard(obj, nodeInterop) {
|
|
1680
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
1681
|
+
return obj;
|
|
1682
|
+
}
|
|
1683
|
+
if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {
|
|
1684
|
+
return {default: obj};
|
|
1685
|
+
}
|
|
1686
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
1687
|
+
if (cache && cache.has(obj)) {
|
|
1688
|
+
return cache.get(obj);
|
|
1689
|
+
}
|
|
1690
|
+
var newObj = {};
|
|
1691
|
+
var hasPropertyDescriptor =
|
|
1692
|
+
Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
1693
|
+
for (var key in obj) {
|
|
1694
|
+
if (key !== 'default' && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
1695
|
+
var desc = hasPropertyDescriptor
|
|
1696
|
+
? Object.getOwnPropertyDescriptor(obj, key)
|
|
1697
|
+
: null;
|
|
1698
|
+
if (desc && (desc.get || desc.set)) {
|
|
1699
|
+
Object.defineProperty(newObj, key, desc);
|
|
1700
|
+
} else {
|
|
1701
|
+
newObj[key] = obj[key];
|
|
1702
|
+
}
|
|
1703
|
+
}
|
|
1704
|
+
}
|
|
1705
|
+
newObj.default = obj;
|
|
1706
|
+
if (cache) {
|
|
1707
|
+
cache.set(obj, newObj);
|
|
1708
|
+
}
|
|
1709
|
+
return newObj;
|
|
1710
|
+
}
|
|
1711
|
+
|
|
1712
|
+
/**
|
|
1713
|
+
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
1714
|
+
*
|
|
1715
|
+
* This source code is licensed under the MIT license found in the
|
|
1716
|
+
* LICENSE file in the root directory of this source tree.
|
|
1717
|
+
*/
|
|
1718
|
+
// Given element.props.children, or subtree during recursive traversal,
|
|
1719
|
+
// return flattened array of children.
|
|
1720
|
+
const getChildren = (arg, children = []) => {
|
|
1721
|
+
if (Array.isArray(arg)) {
|
|
1722
|
+
arg.forEach(item => {
|
|
1723
|
+
getChildren(item, children);
|
|
1724
|
+
});
|
|
1725
|
+
} else if (arg != null && arg !== false) {
|
|
1726
|
+
children.push(arg);
|
|
1727
|
+
}
|
|
1728
|
+
|
|
1729
|
+
return children;
|
|
1730
|
+
};
|
|
1731
|
+
|
|
1732
|
+
const getType = element => {
|
|
1733
|
+
const type = element.type;
|
|
1734
|
+
|
|
1735
|
+
if (typeof type === 'string') {
|
|
1736
|
+
return type;
|
|
1737
|
+
}
|
|
1738
|
+
|
|
1739
|
+
if (typeof type === 'function') {
|
|
1740
|
+
return type.displayName || type.name || 'Unknown';
|
|
1741
|
+
}
|
|
1742
|
+
|
|
1743
|
+
if (ReactIs.isFragment(element)) {
|
|
1744
|
+
return 'React.Fragment';
|
|
1745
|
+
}
|
|
1746
|
+
|
|
1747
|
+
if (ReactIs.isSuspense(element)) {
|
|
1748
|
+
return 'React.Suspense';
|
|
1749
|
+
}
|
|
1750
|
+
|
|
1751
|
+
if (typeof type === 'object' && type !== null) {
|
|
1752
|
+
if (ReactIs.isContextProvider(element)) {
|
|
1753
|
+
return 'Context.Provider';
|
|
1754
|
+
}
|
|
1755
|
+
|
|
1756
|
+
if (ReactIs.isContextConsumer(element)) {
|
|
1757
|
+
return 'Context.Consumer';
|
|
1758
|
+
}
|
|
1759
|
+
|
|
1760
|
+
if (ReactIs.isForwardRef(element)) {
|
|
1761
|
+
if (type.displayName) {
|
|
1762
|
+
return type.displayName;
|
|
1763
|
+
}
|
|
1764
|
+
|
|
1765
|
+
const functionName = type.render.displayName || type.render.name || '';
|
|
1766
|
+
return functionName !== ''
|
|
1767
|
+
? 'ForwardRef(' + functionName + ')'
|
|
1768
|
+
: 'ForwardRef';
|
|
1769
|
+
}
|
|
1770
|
+
|
|
1771
|
+
if (ReactIs.isMemo(element)) {
|
|
1772
|
+
const functionName =
|
|
1773
|
+
type.displayName || type.type.displayName || type.type.name || '';
|
|
1774
|
+
return functionName !== '' ? 'Memo(' + functionName + ')' : 'Memo';
|
|
1775
|
+
}
|
|
1776
|
+
}
|
|
1777
|
+
|
|
1778
|
+
return 'UNDEFINED';
|
|
1779
|
+
};
|
|
1780
|
+
|
|
1781
|
+
const getPropKeys$1 = element => {
|
|
1782
|
+
const {props} = element;
|
|
1783
|
+
return Object.keys(props)
|
|
1784
|
+
.filter(key => key !== 'children' && props[key] !== undefined)
|
|
1785
|
+
.sort();
|
|
1786
|
+
};
|
|
1787
|
+
|
|
1788
|
+
const serialize$1 = (element, config, indentation, depth, refs, printer) =>
|
|
1789
|
+
++depth > config.maxDepth
|
|
1790
|
+
? (0, _markup$1.printElementAsLeaf)(getType(element), config)
|
|
1791
|
+
: (0, _markup$1.printElement)(
|
|
1792
|
+
getType(element),
|
|
1793
|
+
(0, _markup$1.printProps)(
|
|
1794
|
+
getPropKeys$1(element),
|
|
1795
|
+
element.props,
|
|
1796
|
+
config,
|
|
1797
|
+
indentation + config.indent,
|
|
1798
|
+
depth,
|
|
1799
|
+
refs,
|
|
1800
|
+
printer
|
|
1801
|
+
),
|
|
1802
|
+
(0, _markup$1.printChildren)(
|
|
1803
|
+
getChildren(element.props.children),
|
|
1804
|
+
config,
|
|
1805
|
+
indentation + config.indent,
|
|
1806
|
+
depth,
|
|
1807
|
+
refs,
|
|
1808
|
+
printer
|
|
1809
|
+
),
|
|
1810
|
+
config,
|
|
1811
|
+
indentation
|
|
1812
|
+
);
|
|
1813
|
+
|
|
1814
|
+
ReactElement$1.serialize = serialize$1;
|
|
1815
|
+
|
|
1816
|
+
const test$1 = val => val != null && ReactIs.isElement(val);
|
|
1817
|
+
|
|
1818
|
+
ReactElement$1.test = test$1;
|
|
1819
|
+
const plugin$1 = {
|
|
1820
|
+
serialize: serialize$1,
|
|
1821
|
+
test: test$1
|
|
1822
|
+
};
|
|
1823
|
+
var _default$2 = plugin$1;
|
|
1824
|
+
ReactElement$1.default = _default$2;
|
|
1825
|
+
|
|
1826
|
+
var ReactTestComponent$1 = {};
|
|
1827
|
+
|
|
1828
|
+
Object.defineProperty(ReactTestComponent$1, '__esModule', {
|
|
1829
|
+
value: true
|
|
1830
|
+
});
|
|
1831
|
+
ReactTestComponent$1.test = ReactTestComponent$1.serialize = ReactTestComponent$1.default = void 0;
|
|
1832
|
+
|
|
1833
|
+
var _markup = markup;
|
|
1834
|
+
|
|
1835
|
+
var global$1 = (function () {
|
|
1836
|
+
if (typeof globalThis !== 'undefined') {
|
|
1837
|
+
return globalThis;
|
|
1838
|
+
} else if (typeof global$1 !== 'undefined') {
|
|
1839
|
+
return global$1;
|
|
1840
|
+
} else if (typeof self !== 'undefined') {
|
|
1841
|
+
return self;
|
|
1842
|
+
} else if (typeof window !== 'undefined') {
|
|
1843
|
+
return window;
|
|
1844
|
+
} else {
|
|
1845
|
+
return Function('return this')();
|
|
1846
|
+
}
|
|
1847
|
+
})();
|
|
1848
|
+
|
|
1849
|
+
var Symbol$1 = global$1['jest-symbol-do-not-touch'] || global$1.Symbol;
|
|
1850
|
+
const testSymbol =
|
|
1851
|
+
typeof Symbol$1 === 'function' && Symbol$1.for
|
|
1852
|
+
? Symbol$1.for('react.test.json')
|
|
1853
|
+
: 0xea71357;
|
|
1854
|
+
|
|
1855
|
+
const getPropKeys = object => {
|
|
1856
|
+
const {props} = object;
|
|
1857
|
+
return props
|
|
1858
|
+
? Object.keys(props)
|
|
1859
|
+
.filter(key => props[key] !== undefined)
|
|
1860
|
+
.sort()
|
|
1861
|
+
: [];
|
|
1862
|
+
};
|
|
1863
|
+
|
|
1864
|
+
const serialize = (object, config, indentation, depth, refs, printer) =>
|
|
1865
|
+
++depth > config.maxDepth
|
|
1866
|
+
? (0, _markup.printElementAsLeaf)(object.type, config)
|
|
1867
|
+
: (0, _markup.printElement)(
|
|
1868
|
+
object.type,
|
|
1869
|
+
object.props
|
|
1870
|
+
? (0, _markup.printProps)(
|
|
1871
|
+
getPropKeys(object),
|
|
1872
|
+
object.props,
|
|
1873
|
+
config,
|
|
1874
|
+
indentation + config.indent,
|
|
1875
|
+
depth,
|
|
1876
|
+
refs,
|
|
1877
|
+
printer
|
|
1878
|
+
)
|
|
1879
|
+
: '',
|
|
1880
|
+
object.children
|
|
1881
|
+
? (0, _markup.printChildren)(
|
|
1882
|
+
object.children,
|
|
1883
|
+
config,
|
|
1884
|
+
indentation + config.indent,
|
|
1885
|
+
depth,
|
|
1886
|
+
refs,
|
|
1887
|
+
printer
|
|
1888
|
+
)
|
|
1889
|
+
: '',
|
|
1890
|
+
config,
|
|
1891
|
+
indentation
|
|
1892
|
+
);
|
|
1893
|
+
|
|
1894
|
+
ReactTestComponent$1.serialize = serialize;
|
|
1895
|
+
|
|
1896
|
+
const test = val => val && val.$$typeof === testSymbol;
|
|
1897
|
+
|
|
1898
|
+
ReactTestComponent$1.test = test;
|
|
1899
|
+
const plugin = {
|
|
1900
|
+
serialize,
|
|
1901
|
+
test
|
|
1902
|
+
};
|
|
1903
|
+
var _default$1 = plugin;
|
|
1904
|
+
ReactTestComponent$1.default = _default$1;
|
|
1905
|
+
|
|
1906
|
+
Object.defineProperty(build, '__esModule', {
|
|
1907
|
+
value: true
|
|
1908
|
+
});
|
|
1909
|
+
build.default = build.DEFAULT_OPTIONS = void 0;
|
|
1910
|
+
var format_1 = build.format = format;
|
|
1911
|
+
var plugins_1 = build.plugins = void 0;
|
|
1912
|
+
|
|
1913
|
+
var _ansiStyles = _interopRequireDefault(ansiStyles.exports);
|
|
1914
|
+
|
|
1915
|
+
var _collections = collections;
|
|
1916
|
+
|
|
1917
|
+
var _AsymmetricMatcher = _interopRequireDefault(
|
|
1918
|
+
AsymmetricMatcher$1
|
|
1919
|
+
);
|
|
1920
|
+
|
|
1921
|
+
var _ConvertAnsi = _interopRequireDefault(ConvertAnsi);
|
|
1922
|
+
|
|
1923
|
+
var _DOMCollection = _interopRequireDefault(DOMCollection$1);
|
|
1924
|
+
|
|
1925
|
+
var _DOMElement = _interopRequireDefault(DOMElement$1);
|
|
1926
|
+
|
|
1927
|
+
var _Immutable = _interopRequireDefault(Immutable$1);
|
|
1928
|
+
|
|
1929
|
+
var _ReactElement = _interopRequireDefault(ReactElement$1);
|
|
1930
|
+
|
|
1931
|
+
var _ReactTestComponent = _interopRequireDefault(
|
|
1932
|
+
ReactTestComponent$1
|
|
1933
|
+
);
|
|
1934
|
+
|
|
1935
|
+
function _interopRequireDefault(obj) {
|
|
1936
|
+
return obj && obj.__esModule ? obj : {default: obj};
|
|
1937
|
+
}
|
|
1938
|
+
|
|
1939
|
+
/**
|
|
1940
|
+
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
1941
|
+
*
|
|
1942
|
+
* This source code is licensed under the MIT license found in the
|
|
1943
|
+
* LICENSE file in the root directory of this source tree.
|
|
1944
|
+
*/
|
|
1945
|
+
|
|
1946
|
+
/* eslint-disable local/ban-types-eventually */
|
|
1947
|
+
const toString = Object.prototype.toString;
|
|
1948
|
+
const toISOString = Date.prototype.toISOString;
|
|
1949
|
+
const errorToString = Error.prototype.toString;
|
|
1950
|
+
const regExpToString = RegExp.prototype.toString;
|
|
1951
|
+
/**
|
|
1952
|
+
* Explicitly comparing typeof constructor to function avoids undefined as name
|
|
1953
|
+
* when mock identity-obj-proxy returns the key as the value for any key.
|
|
1954
|
+
*/
|
|
1955
|
+
|
|
1956
|
+
const getConstructorName = val =>
|
|
1957
|
+
(typeof val.constructor === 'function' && val.constructor.name) || 'Object';
|
|
1958
|
+
/* global window */
|
|
1959
|
+
|
|
1960
|
+
/** Is val is equal to global window object? Works even if it does not exist :) */
|
|
1961
|
+
|
|
1962
|
+
const isWindow = val => typeof window !== 'undefined' && val === window;
|
|
1963
|
+
|
|
1964
|
+
const SYMBOL_REGEXP = /^Symbol\((.*)\)(.*)$/;
|
|
1965
|
+
const NEWLINE_REGEXP = /\n/gi;
|
|
1966
|
+
|
|
1967
|
+
class PrettyFormatPluginError extends Error {
|
|
1968
|
+
constructor(message, stack) {
|
|
1969
|
+
super(message);
|
|
1970
|
+
this.stack = stack;
|
|
1971
|
+
this.name = this.constructor.name;
|
|
1972
|
+
}
|
|
1973
|
+
}
|
|
1974
|
+
|
|
1975
|
+
function isToStringedArrayType(toStringed) {
|
|
1976
|
+
return (
|
|
1977
|
+
toStringed === '[object Array]' ||
|
|
1978
|
+
toStringed === '[object ArrayBuffer]' ||
|
|
1979
|
+
toStringed === '[object DataView]' ||
|
|
1980
|
+
toStringed === '[object Float32Array]' ||
|
|
1981
|
+
toStringed === '[object Float64Array]' ||
|
|
1982
|
+
toStringed === '[object Int8Array]' ||
|
|
1983
|
+
toStringed === '[object Int16Array]' ||
|
|
1984
|
+
toStringed === '[object Int32Array]' ||
|
|
1985
|
+
toStringed === '[object Uint8Array]' ||
|
|
1986
|
+
toStringed === '[object Uint8ClampedArray]' ||
|
|
1987
|
+
toStringed === '[object Uint16Array]' ||
|
|
1988
|
+
toStringed === '[object Uint32Array]'
|
|
1989
|
+
);
|
|
1990
|
+
}
|
|
1991
|
+
|
|
1992
|
+
function printNumber(val) {
|
|
1993
|
+
return Object.is(val, -0) ? '-0' : String(val);
|
|
1994
|
+
}
|
|
1995
|
+
|
|
1996
|
+
function printBigInt(val) {
|
|
1997
|
+
return String(`${val}n`);
|
|
1998
|
+
}
|
|
1999
|
+
|
|
2000
|
+
function printFunction(val, printFunctionName) {
|
|
2001
|
+
if (!printFunctionName) {
|
|
2002
|
+
return '[Function]';
|
|
2003
|
+
}
|
|
2004
|
+
|
|
2005
|
+
return '[Function ' + (val.name || 'anonymous') + ']';
|
|
2006
|
+
}
|
|
2007
|
+
|
|
2008
|
+
function printSymbol(val) {
|
|
2009
|
+
return String(val).replace(SYMBOL_REGEXP, 'Symbol($1)');
|
|
2010
|
+
}
|
|
2011
|
+
|
|
2012
|
+
function printError(val) {
|
|
2013
|
+
return '[' + errorToString.call(val) + ']';
|
|
2014
|
+
}
|
|
2015
|
+
/**
|
|
2016
|
+
* The first port of call for printing an object, handles most of the
|
|
2017
|
+
* data-types in JS.
|
|
2018
|
+
*/
|
|
2019
|
+
|
|
2020
|
+
function printBasicValue(val, printFunctionName, escapeRegex, escapeString) {
|
|
2021
|
+
if (val === true || val === false) {
|
|
2022
|
+
return '' + val;
|
|
2023
|
+
}
|
|
2024
|
+
|
|
2025
|
+
if (val === undefined) {
|
|
2026
|
+
return 'undefined';
|
|
2027
|
+
}
|
|
2028
|
+
|
|
2029
|
+
if (val === null) {
|
|
2030
|
+
return 'null';
|
|
2031
|
+
}
|
|
2032
|
+
|
|
2033
|
+
const typeOf = typeof val;
|
|
2034
|
+
|
|
2035
|
+
if (typeOf === 'number') {
|
|
2036
|
+
return printNumber(val);
|
|
2037
|
+
}
|
|
2038
|
+
|
|
2039
|
+
if (typeOf === 'bigint') {
|
|
2040
|
+
return printBigInt(val);
|
|
2041
|
+
}
|
|
2042
|
+
|
|
2043
|
+
if (typeOf === 'string') {
|
|
2044
|
+
if (escapeString) {
|
|
2045
|
+
return '"' + val.replace(/"|\\/g, '\\$&') + '"';
|
|
2046
|
+
}
|
|
2047
|
+
|
|
2048
|
+
return '"' + val + '"';
|
|
2049
|
+
}
|
|
2050
|
+
|
|
2051
|
+
if (typeOf === 'function') {
|
|
2052
|
+
return printFunction(val, printFunctionName);
|
|
2053
|
+
}
|
|
2054
|
+
|
|
2055
|
+
if (typeOf === 'symbol') {
|
|
2056
|
+
return printSymbol(val);
|
|
2057
|
+
}
|
|
2058
|
+
|
|
2059
|
+
const toStringed = toString.call(val);
|
|
2060
|
+
|
|
2061
|
+
if (toStringed === '[object WeakMap]') {
|
|
2062
|
+
return 'WeakMap {}';
|
|
2063
|
+
}
|
|
2064
|
+
|
|
2065
|
+
if (toStringed === '[object WeakSet]') {
|
|
2066
|
+
return 'WeakSet {}';
|
|
2067
|
+
}
|
|
2068
|
+
|
|
2069
|
+
if (
|
|
2070
|
+
toStringed === '[object Function]' ||
|
|
2071
|
+
toStringed === '[object GeneratorFunction]'
|
|
2072
|
+
) {
|
|
2073
|
+
return printFunction(val, printFunctionName);
|
|
2074
|
+
}
|
|
2075
|
+
|
|
2076
|
+
if (toStringed === '[object Symbol]') {
|
|
2077
|
+
return printSymbol(val);
|
|
2078
|
+
}
|
|
2079
|
+
|
|
2080
|
+
if (toStringed === '[object Date]') {
|
|
2081
|
+
return isNaN(+val) ? 'Date { NaN }' : toISOString.call(val);
|
|
2082
|
+
}
|
|
2083
|
+
|
|
2084
|
+
if (toStringed === '[object Error]') {
|
|
2085
|
+
return printError(val);
|
|
2086
|
+
}
|
|
2087
|
+
|
|
2088
|
+
if (toStringed === '[object RegExp]') {
|
|
2089
|
+
if (escapeRegex) {
|
|
2090
|
+
// https://github.com/benjamingr/RegExp.escape/blob/main/polyfill.js
|
|
2091
|
+
return regExpToString.call(val).replace(/[\\^$*+?.()|[\]{}]/g, '\\$&');
|
|
2092
|
+
}
|
|
2093
|
+
|
|
2094
|
+
return regExpToString.call(val);
|
|
2095
|
+
}
|
|
2096
|
+
|
|
2097
|
+
if (val instanceof Error) {
|
|
2098
|
+
return printError(val);
|
|
2099
|
+
}
|
|
2100
|
+
|
|
2101
|
+
return null;
|
|
2102
|
+
}
|
|
2103
|
+
/**
|
|
2104
|
+
* Handles more complex objects ( such as objects with circular references.
|
|
2105
|
+
* maps and sets etc )
|
|
2106
|
+
*/
|
|
2107
|
+
|
|
2108
|
+
function printComplexValue(
|
|
2109
|
+
val,
|
|
2110
|
+
config,
|
|
2111
|
+
indentation,
|
|
2112
|
+
depth,
|
|
2113
|
+
refs,
|
|
2114
|
+
hasCalledToJSON
|
|
2115
|
+
) {
|
|
2116
|
+
if (refs.indexOf(val) !== -1) {
|
|
2117
|
+
return '[Circular]';
|
|
2118
|
+
}
|
|
2119
|
+
|
|
2120
|
+
refs = refs.slice();
|
|
2121
|
+
refs.push(val);
|
|
2122
|
+
const hitMaxDepth = ++depth > config.maxDepth;
|
|
2123
|
+
const min = config.min;
|
|
2124
|
+
|
|
2125
|
+
if (
|
|
2126
|
+
config.callToJSON &&
|
|
2127
|
+
!hitMaxDepth &&
|
|
2128
|
+
val.toJSON &&
|
|
2129
|
+
typeof val.toJSON === 'function' &&
|
|
2130
|
+
!hasCalledToJSON
|
|
2131
|
+
) {
|
|
2132
|
+
return printer(val.toJSON(), config, indentation, depth, refs, true);
|
|
2133
|
+
}
|
|
2134
|
+
|
|
2135
|
+
const toStringed = toString.call(val);
|
|
2136
|
+
|
|
2137
|
+
if (toStringed === '[object Arguments]') {
|
|
2138
|
+
return hitMaxDepth
|
|
2139
|
+
? '[Arguments]'
|
|
2140
|
+
: (min ? '' : 'Arguments ') +
|
|
2141
|
+
'[' +
|
|
2142
|
+
(0, _collections.printListItems)(
|
|
2143
|
+
val,
|
|
2144
|
+
config,
|
|
2145
|
+
indentation,
|
|
2146
|
+
depth,
|
|
2147
|
+
refs,
|
|
2148
|
+
printer
|
|
2149
|
+
) +
|
|
2150
|
+
']';
|
|
2151
|
+
}
|
|
2152
|
+
|
|
2153
|
+
if (isToStringedArrayType(toStringed)) {
|
|
2154
|
+
return hitMaxDepth
|
|
2155
|
+
? '[' + val.constructor.name + ']'
|
|
2156
|
+
: (min
|
|
2157
|
+
? ''
|
|
2158
|
+
: !config.printBasicPrototype && val.constructor.name === 'Array'
|
|
2159
|
+
? ''
|
|
2160
|
+
: val.constructor.name + ' ') +
|
|
2161
|
+
'[' +
|
|
2162
|
+
(0, _collections.printListItems)(
|
|
2163
|
+
val,
|
|
2164
|
+
config,
|
|
2165
|
+
indentation,
|
|
2166
|
+
depth,
|
|
2167
|
+
refs,
|
|
2168
|
+
printer
|
|
2169
|
+
) +
|
|
2170
|
+
']';
|
|
2171
|
+
}
|
|
2172
|
+
|
|
2173
|
+
if (toStringed === '[object Map]') {
|
|
2174
|
+
return hitMaxDepth
|
|
2175
|
+
? '[Map]'
|
|
2176
|
+
: 'Map {' +
|
|
2177
|
+
(0, _collections.printIteratorEntries)(
|
|
2178
|
+
val.entries(),
|
|
2179
|
+
config,
|
|
2180
|
+
indentation,
|
|
2181
|
+
depth,
|
|
2182
|
+
refs,
|
|
2183
|
+
printer,
|
|
2184
|
+
' => '
|
|
2185
|
+
) +
|
|
2186
|
+
'}';
|
|
2187
|
+
}
|
|
2188
|
+
|
|
2189
|
+
if (toStringed === '[object Set]') {
|
|
2190
|
+
return hitMaxDepth
|
|
2191
|
+
? '[Set]'
|
|
2192
|
+
: 'Set {' +
|
|
2193
|
+
(0, _collections.printIteratorValues)(
|
|
2194
|
+
val.values(),
|
|
2195
|
+
config,
|
|
2196
|
+
indentation,
|
|
2197
|
+
depth,
|
|
2198
|
+
refs,
|
|
2199
|
+
printer
|
|
2200
|
+
) +
|
|
2201
|
+
'}';
|
|
2202
|
+
} // Avoid failure to serialize global window object in jsdom test environment.
|
|
2203
|
+
// For example, not even relevant if window is prop of React element.
|
|
2204
|
+
|
|
2205
|
+
return hitMaxDepth || isWindow(val)
|
|
2206
|
+
? '[' + getConstructorName(val) + ']'
|
|
2207
|
+
: (min
|
|
2208
|
+
? ''
|
|
2209
|
+
: !config.printBasicPrototype && getConstructorName(val) === 'Object'
|
|
2210
|
+
? ''
|
|
2211
|
+
: getConstructorName(val) + ' ') +
|
|
2212
|
+
'{' +
|
|
2213
|
+
(0, _collections.printObjectProperties)(
|
|
2214
|
+
val,
|
|
2215
|
+
config,
|
|
2216
|
+
indentation,
|
|
2217
|
+
depth,
|
|
2218
|
+
refs,
|
|
2219
|
+
printer
|
|
2220
|
+
) +
|
|
2221
|
+
'}';
|
|
2222
|
+
}
|
|
2223
|
+
|
|
2224
|
+
function isNewPlugin(plugin) {
|
|
2225
|
+
return plugin.serialize != null;
|
|
2226
|
+
}
|
|
2227
|
+
|
|
2228
|
+
function printPlugin(plugin, val, config, indentation, depth, refs) {
|
|
2229
|
+
let printed;
|
|
2230
|
+
|
|
2231
|
+
try {
|
|
2232
|
+
printed = isNewPlugin(plugin)
|
|
2233
|
+
? plugin.serialize(val, config, indentation, depth, refs, printer)
|
|
2234
|
+
: plugin.print(
|
|
2235
|
+
val,
|
|
2236
|
+
valChild => printer(valChild, config, indentation, depth, refs),
|
|
2237
|
+
str => {
|
|
2238
|
+
const indentationNext = indentation + config.indent;
|
|
2239
|
+
return (
|
|
2240
|
+
indentationNext +
|
|
2241
|
+
str.replace(NEWLINE_REGEXP, '\n' + indentationNext)
|
|
2242
|
+
);
|
|
2243
|
+
},
|
|
2244
|
+
{
|
|
2245
|
+
edgeSpacing: config.spacingOuter,
|
|
2246
|
+
min: config.min,
|
|
2247
|
+
spacing: config.spacingInner
|
|
2248
|
+
},
|
|
2249
|
+
config.colors
|
|
2250
|
+
);
|
|
2251
|
+
} catch (error) {
|
|
2252
|
+
throw new PrettyFormatPluginError(error.message, error.stack);
|
|
2253
|
+
}
|
|
2254
|
+
|
|
2255
|
+
if (typeof printed !== 'string') {
|
|
2256
|
+
throw new Error(
|
|
2257
|
+
`pretty-format: Plugin must return type "string" but instead returned "${typeof printed}".`
|
|
2258
|
+
);
|
|
2259
|
+
}
|
|
2260
|
+
|
|
2261
|
+
return printed;
|
|
2262
|
+
}
|
|
2263
|
+
|
|
2264
|
+
function findPlugin(plugins, val) {
|
|
2265
|
+
for (let p = 0; p < plugins.length; p++) {
|
|
2266
|
+
try {
|
|
2267
|
+
if (plugins[p].test(val)) {
|
|
2268
|
+
return plugins[p];
|
|
2269
|
+
}
|
|
2270
|
+
} catch (error) {
|
|
2271
|
+
throw new PrettyFormatPluginError(error.message, error.stack);
|
|
2272
|
+
}
|
|
2273
|
+
}
|
|
2274
|
+
|
|
2275
|
+
return null;
|
|
2276
|
+
}
|
|
2277
|
+
|
|
2278
|
+
function printer(val, config, indentation, depth, refs, hasCalledToJSON) {
|
|
2279
|
+
const plugin = findPlugin(config.plugins, val);
|
|
2280
|
+
|
|
2281
|
+
if (plugin !== null) {
|
|
2282
|
+
return printPlugin(plugin, val, config, indentation, depth, refs);
|
|
2283
|
+
}
|
|
2284
|
+
|
|
2285
|
+
const basicResult = printBasicValue(
|
|
2286
|
+
val,
|
|
2287
|
+
config.printFunctionName,
|
|
2288
|
+
config.escapeRegex,
|
|
2289
|
+
config.escapeString
|
|
2290
|
+
);
|
|
2291
|
+
|
|
2292
|
+
if (basicResult !== null) {
|
|
2293
|
+
return basicResult;
|
|
2294
|
+
}
|
|
2295
|
+
|
|
2296
|
+
return printComplexValue(
|
|
2297
|
+
val,
|
|
2298
|
+
config,
|
|
2299
|
+
indentation,
|
|
2300
|
+
depth,
|
|
2301
|
+
refs,
|
|
2302
|
+
hasCalledToJSON
|
|
2303
|
+
);
|
|
2304
|
+
}
|
|
2305
|
+
|
|
2306
|
+
const DEFAULT_THEME = {
|
|
2307
|
+
comment: 'gray',
|
|
2308
|
+
content: 'reset',
|
|
2309
|
+
prop: 'yellow',
|
|
2310
|
+
tag: 'cyan',
|
|
2311
|
+
value: 'green'
|
|
2312
|
+
};
|
|
2313
|
+
const DEFAULT_THEME_KEYS = Object.keys(DEFAULT_THEME);
|
|
2314
|
+
const DEFAULT_OPTIONS = {
|
|
2315
|
+
callToJSON: true,
|
|
2316
|
+
compareKeys: undefined,
|
|
2317
|
+
escapeRegex: false,
|
|
2318
|
+
escapeString: true,
|
|
2319
|
+
highlight: false,
|
|
2320
|
+
indent: 2,
|
|
2321
|
+
maxDepth: Infinity,
|
|
2322
|
+
min: false,
|
|
2323
|
+
plugins: [],
|
|
2324
|
+
printBasicPrototype: true,
|
|
2325
|
+
printFunctionName: true,
|
|
2326
|
+
theme: DEFAULT_THEME
|
|
2327
|
+
};
|
|
2328
|
+
build.DEFAULT_OPTIONS = DEFAULT_OPTIONS;
|
|
2329
|
+
|
|
2330
|
+
function validateOptions(options) {
|
|
2331
|
+
Object.keys(options).forEach(key => {
|
|
2332
|
+
if (!DEFAULT_OPTIONS.hasOwnProperty(key)) {
|
|
2333
|
+
throw new Error(`pretty-format: Unknown option "${key}".`);
|
|
2334
|
+
}
|
|
2335
|
+
});
|
|
2336
|
+
|
|
2337
|
+
if (options.min && options.indent !== undefined && options.indent !== 0) {
|
|
2338
|
+
throw new Error(
|
|
2339
|
+
'pretty-format: Options "min" and "indent" cannot be used together.'
|
|
2340
|
+
);
|
|
2341
|
+
}
|
|
2342
|
+
|
|
2343
|
+
if (options.theme !== undefined) {
|
|
2344
|
+
if (options.theme === null) {
|
|
2345
|
+
throw new Error(`pretty-format: Option "theme" must not be null.`);
|
|
2346
|
+
}
|
|
2347
|
+
|
|
2348
|
+
if (typeof options.theme !== 'object') {
|
|
2349
|
+
throw new Error(
|
|
2350
|
+
`pretty-format: Option "theme" must be of type "object" but instead received "${typeof options.theme}".`
|
|
2351
|
+
);
|
|
2352
|
+
}
|
|
2353
|
+
}
|
|
2354
|
+
}
|
|
2355
|
+
|
|
2356
|
+
const getColorsHighlight = options =>
|
|
2357
|
+
DEFAULT_THEME_KEYS.reduce((colors, key) => {
|
|
2358
|
+
const value =
|
|
2359
|
+
options.theme && options.theme[key] !== undefined
|
|
2360
|
+
? options.theme[key]
|
|
2361
|
+
: DEFAULT_THEME[key];
|
|
2362
|
+
const color = value && _ansiStyles.default[value];
|
|
2363
|
+
|
|
2364
|
+
if (
|
|
2365
|
+
color &&
|
|
2366
|
+
typeof color.close === 'string' &&
|
|
2367
|
+
typeof color.open === 'string'
|
|
2368
|
+
) {
|
|
2369
|
+
colors[key] = color;
|
|
2370
|
+
} else {
|
|
2371
|
+
throw new Error(
|
|
2372
|
+
`pretty-format: Option "theme" has a key "${key}" whose value "${value}" is undefined in ansi-styles.`
|
|
2373
|
+
);
|
|
2374
|
+
}
|
|
2375
|
+
|
|
2376
|
+
return colors;
|
|
2377
|
+
}, Object.create(null));
|
|
2378
|
+
|
|
2379
|
+
const getColorsEmpty = () =>
|
|
2380
|
+
DEFAULT_THEME_KEYS.reduce((colors, key) => {
|
|
2381
|
+
colors[key] = {
|
|
2382
|
+
close: '',
|
|
2383
|
+
open: ''
|
|
2384
|
+
};
|
|
2385
|
+
return colors;
|
|
2386
|
+
}, Object.create(null));
|
|
2387
|
+
|
|
2388
|
+
const getPrintFunctionName = options =>
|
|
2389
|
+
options && options.printFunctionName !== undefined
|
|
2390
|
+
? options.printFunctionName
|
|
2391
|
+
: DEFAULT_OPTIONS.printFunctionName;
|
|
2392
|
+
|
|
2393
|
+
const getEscapeRegex = options =>
|
|
2394
|
+
options && options.escapeRegex !== undefined
|
|
2395
|
+
? options.escapeRegex
|
|
2396
|
+
: DEFAULT_OPTIONS.escapeRegex;
|
|
2397
|
+
|
|
2398
|
+
const getEscapeString = options =>
|
|
2399
|
+
options && options.escapeString !== undefined
|
|
2400
|
+
? options.escapeString
|
|
2401
|
+
: DEFAULT_OPTIONS.escapeString;
|
|
2402
|
+
|
|
2403
|
+
const getConfig = options => {
|
|
2404
|
+
var _options$printBasicPr;
|
|
2405
|
+
|
|
2406
|
+
return {
|
|
2407
|
+
callToJSON:
|
|
2408
|
+
options && options.callToJSON !== undefined
|
|
2409
|
+
? options.callToJSON
|
|
2410
|
+
: DEFAULT_OPTIONS.callToJSON,
|
|
2411
|
+
colors:
|
|
2412
|
+
options && options.highlight
|
|
2413
|
+
? getColorsHighlight(options)
|
|
2414
|
+
: getColorsEmpty(),
|
|
2415
|
+
compareKeys:
|
|
2416
|
+
options && typeof options.compareKeys === 'function'
|
|
2417
|
+
? options.compareKeys
|
|
2418
|
+
: DEFAULT_OPTIONS.compareKeys,
|
|
2419
|
+
escapeRegex: getEscapeRegex(options),
|
|
2420
|
+
escapeString: getEscapeString(options),
|
|
2421
|
+
indent:
|
|
2422
|
+
options && options.min
|
|
2423
|
+
? ''
|
|
2424
|
+
: createIndent(
|
|
2425
|
+
options && options.indent !== undefined
|
|
2426
|
+
? options.indent
|
|
2427
|
+
: DEFAULT_OPTIONS.indent
|
|
2428
|
+
),
|
|
2429
|
+
maxDepth:
|
|
2430
|
+
options && options.maxDepth !== undefined
|
|
2431
|
+
? options.maxDepth
|
|
2432
|
+
: DEFAULT_OPTIONS.maxDepth,
|
|
2433
|
+
min:
|
|
2434
|
+
options && options.min !== undefined ? options.min : DEFAULT_OPTIONS.min,
|
|
2435
|
+
plugins:
|
|
2436
|
+
options && options.plugins !== undefined
|
|
2437
|
+
? options.plugins
|
|
2438
|
+
: DEFAULT_OPTIONS.plugins,
|
|
2439
|
+
printBasicPrototype:
|
|
2440
|
+
(_options$printBasicPr =
|
|
2441
|
+
options === null || options === void 0
|
|
2442
|
+
? void 0
|
|
2443
|
+
: options.printBasicPrototype) !== null &&
|
|
2444
|
+
_options$printBasicPr !== void 0
|
|
2445
|
+
? _options$printBasicPr
|
|
2446
|
+
: true,
|
|
2447
|
+
printFunctionName: getPrintFunctionName(options),
|
|
2448
|
+
spacingInner: options && options.min ? ' ' : '\n',
|
|
2449
|
+
spacingOuter: options && options.min ? '' : '\n'
|
|
2450
|
+
};
|
|
2451
|
+
};
|
|
2452
|
+
|
|
2453
|
+
function createIndent(indent) {
|
|
2454
|
+
return new Array(indent + 1).join(' ');
|
|
2455
|
+
}
|
|
2456
|
+
/**
|
|
2457
|
+
* Returns a presentation string of your `val` object
|
|
2458
|
+
* @param val any potential JavaScript object
|
|
2459
|
+
* @param options Custom settings
|
|
2460
|
+
*/
|
|
2461
|
+
|
|
2462
|
+
function format(val, options) {
|
|
2463
|
+
if (options) {
|
|
2464
|
+
validateOptions(options);
|
|
2465
|
+
|
|
2466
|
+
if (options.plugins) {
|
|
2467
|
+
const plugin = findPlugin(options.plugins, val);
|
|
2468
|
+
|
|
2469
|
+
if (plugin !== null) {
|
|
2470
|
+
return printPlugin(plugin, val, getConfig(options), '', 0, []);
|
|
2471
|
+
}
|
|
2472
|
+
}
|
|
2473
|
+
}
|
|
2474
|
+
|
|
2475
|
+
const basicResult = printBasicValue(
|
|
2476
|
+
val,
|
|
2477
|
+
getPrintFunctionName(options),
|
|
2478
|
+
getEscapeRegex(options),
|
|
2479
|
+
getEscapeString(options)
|
|
2480
|
+
);
|
|
2481
|
+
|
|
2482
|
+
if (basicResult !== null) {
|
|
2483
|
+
return basicResult;
|
|
2484
|
+
}
|
|
2485
|
+
|
|
2486
|
+
return printComplexValue(val, getConfig(options), '', 0, []);
|
|
2487
|
+
}
|
|
2488
|
+
|
|
2489
|
+
const plugins = {
|
|
2490
|
+
AsymmetricMatcher: _AsymmetricMatcher.default,
|
|
2491
|
+
ConvertAnsi: _ConvertAnsi.default,
|
|
2492
|
+
DOMCollection: _DOMCollection.default,
|
|
2493
|
+
DOMElement: _DOMElement.default,
|
|
2494
|
+
Immutable: _Immutable.default,
|
|
2495
|
+
ReactElement: _ReactElement.default,
|
|
2496
|
+
ReactTestComponent: _ReactTestComponent.default
|
|
2497
|
+
};
|
|
2498
|
+
plugins_1 = build.plugins = plugins;
|
|
2499
|
+
var _default = format;
|
|
2500
|
+
build.default = _default;
|
|
2501
|
+
|
|
2502
|
+
const {
|
|
2503
|
+
DOMCollection,
|
|
2504
|
+
DOMElement,
|
|
2505
|
+
Immutable,
|
|
2506
|
+
ReactElement,
|
|
2507
|
+
ReactTestComponent,
|
|
2508
|
+
AsymmetricMatcher
|
|
2509
|
+
} = plugins_1;
|
|
2510
|
+
let PLUGINS = [
|
|
2511
|
+
ReactTestComponent,
|
|
2512
|
+
ReactElement,
|
|
2513
|
+
DOMElement,
|
|
2514
|
+
DOMCollection,
|
|
2515
|
+
Immutable,
|
|
2516
|
+
AsymmetricMatcher
|
|
2517
|
+
];
|
|
2518
|
+
const addSerializer = (plugin) => {
|
|
2519
|
+
PLUGINS = [plugin].concat(PLUGINS);
|
|
2520
|
+
};
|
|
2521
|
+
const getSerializers = () => PLUGINS;
|
|
2522
|
+
|
|
2523
|
+
function equals(a, b, customTesters, strictCheck) {
|
|
2524
|
+
customTesters = customTesters || [];
|
|
2525
|
+
return eq(a, b, [], [], customTesters, strictCheck ? hasKey : hasDefinedKey);
|
|
2526
|
+
}
|
|
2527
|
+
function isAsymmetric(obj) {
|
|
2528
|
+
return !!obj && isA("Function", obj.asymmetricMatch);
|
|
2529
|
+
}
|
|
2530
|
+
function hasAsymmetric(obj, seen = new Set()) {
|
|
2531
|
+
if (seen.has(obj))
|
|
2532
|
+
return false;
|
|
2533
|
+
seen.add(obj);
|
|
2534
|
+
if (isAsymmetric(obj))
|
|
2535
|
+
return true;
|
|
2536
|
+
if (Array.isArray(obj))
|
|
2537
|
+
return obj.some((i) => hasAsymmetric(i, seen));
|
|
2538
|
+
if (obj instanceof Set)
|
|
2539
|
+
return Array.from(obj).some((i) => hasAsymmetric(i, seen));
|
|
2540
|
+
if (isObject(obj))
|
|
2541
|
+
return Object.values(obj).some((v) => hasAsymmetric(v, seen));
|
|
2542
|
+
return false;
|
|
2543
|
+
}
|
|
2544
|
+
function asymmetricMatch(a, b) {
|
|
2545
|
+
const asymmetricA = isAsymmetric(a);
|
|
2546
|
+
const asymmetricB = isAsymmetric(b);
|
|
2547
|
+
if (asymmetricA && asymmetricB)
|
|
2548
|
+
return void 0;
|
|
2549
|
+
if (asymmetricA)
|
|
2550
|
+
return a.asymmetricMatch(b);
|
|
2551
|
+
if (asymmetricB)
|
|
2552
|
+
return b.asymmetricMatch(a);
|
|
2553
|
+
}
|
|
2554
|
+
function eq(a, b, aStack, bStack, customTesters, hasKey2) {
|
|
2555
|
+
let result = true;
|
|
2556
|
+
const asymmetricResult = asymmetricMatch(a, b);
|
|
2557
|
+
if (asymmetricResult !== void 0)
|
|
2558
|
+
return asymmetricResult;
|
|
2559
|
+
for (let i = 0; i < customTesters.length; i++) {
|
|
2560
|
+
const customTesterResult = customTesters[i](a, b);
|
|
2561
|
+
if (customTesterResult !== void 0)
|
|
2562
|
+
return customTesterResult;
|
|
2563
|
+
}
|
|
2564
|
+
if (a instanceof Error && b instanceof Error)
|
|
2565
|
+
return a.message === b.message;
|
|
2566
|
+
if (Object.is(a, b))
|
|
2567
|
+
return true;
|
|
2568
|
+
if (a === null || b === null)
|
|
2569
|
+
return a === b;
|
|
2570
|
+
const className = Object.prototype.toString.call(a);
|
|
2571
|
+
if (className !== Object.prototype.toString.call(b))
|
|
2572
|
+
return false;
|
|
2573
|
+
switch (className) {
|
|
2574
|
+
case "[object Boolean]":
|
|
2575
|
+
case "[object String]":
|
|
2576
|
+
case "[object Number]":
|
|
2577
|
+
if (typeof a !== typeof b) {
|
|
2578
|
+
return false;
|
|
2579
|
+
} else if (typeof a !== "object" && typeof b !== "object") {
|
|
2580
|
+
return Object.is(a, b);
|
|
2581
|
+
} else {
|
|
2582
|
+
return Object.is(a.valueOf(), b.valueOf());
|
|
2583
|
+
}
|
|
2584
|
+
case "[object Date]":
|
|
2585
|
+
return +a === +b;
|
|
2586
|
+
case "[object RegExp]":
|
|
2587
|
+
return a.source === b.source && a.flags === b.flags;
|
|
2588
|
+
}
|
|
2589
|
+
if (typeof a !== "object" || typeof b !== "object")
|
|
2590
|
+
return false;
|
|
2591
|
+
if (isDomNode(a) && isDomNode(b))
|
|
2592
|
+
return a.isEqualNode(b);
|
|
2593
|
+
let length = aStack.length;
|
|
2594
|
+
while (length--) {
|
|
2595
|
+
if (aStack[length] === a)
|
|
2596
|
+
return bStack[length] === b;
|
|
2597
|
+
else if (bStack[length] === b)
|
|
2598
|
+
return false;
|
|
2599
|
+
}
|
|
2600
|
+
aStack.push(a);
|
|
2601
|
+
bStack.push(b);
|
|
2602
|
+
if (className === "[object Array]" && a.length !== b.length)
|
|
2603
|
+
return false;
|
|
2604
|
+
const aKeys = keys(a, hasKey2);
|
|
2605
|
+
let key;
|
|
2606
|
+
let size = aKeys.length;
|
|
2607
|
+
if (keys(b, hasKey2).length !== size)
|
|
2608
|
+
return false;
|
|
2609
|
+
while (size--) {
|
|
2610
|
+
key = aKeys[size];
|
|
2611
|
+
result = hasKey2(b, key) && eq(a[key], b[key], aStack, bStack, customTesters, hasKey2);
|
|
2612
|
+
if (!result)
|
|
2613
|
+
return false;
|
|
2614
|
+
}
|
|
2615
|
+
aStack.pop();
|
|
2616
|
+
bStack.pop();
|
|
2617
|
+
return result;
|
|
2618
|
+
}
|
|
2619
|
+
function keys(obj, hasKey2) {
|
|
2620
|
+
const keys2 = [];
|
|
2621
|
+
for (const key in obj) {
|
|
2622
|
+
if (hasKey2(obj, key))
|
|
2623
|
+
keys2.push(key);
|
|
2624
|
+
}
|
|
2625
|
+
return keys2.concat(Object.getOwnPropertySymbols(obj).filter((symbol) => Object.getOwnPropertyDescriptor(obj, symbol).enumerable));
|
|
2626
|
+
}
|
|
2627
|
+
function hasDefinedKey(obj, key) {
|
|
2628
|
+
return hasKey(obj, key) && obj[key] !== void 0;
|
|
2629
|
+
}
|
|
2630
|
+
function hasKey(obj, key) {
|
|
2631
|
+
return Object.prototype.hasOwnProperty.call(obj, key);
|
|
2632
|
+
}
|
|
2633
|
+
function isA(typeName, value) {
|
|
2634
|
+
return Object.prototype.toString.apply(value) === `[object ${typeName}]`;
|
|
2635
|
+
}
|
|
2636
|
+
function isDomNode(obj) {
|
|
2637
|
+
return obj !== null && typeof obj === "object" && typeof obj.nodeType === "number" && typeof obj.nodeName === "string" && typeof obj.isEqualNode === "function";
|
|
2638
|
+
}
|
|
2639
|
+
const IS_KEYED_SENTINEL = "@@__IMMUTABLE_KEYED__@@";
|
|
2640
|
+
const IS_SET_SENTINEL = "@@__IMMUTABLE_SET__@@";
|
|
2641
|
+
const IS_ORDERED_SENTINEL = "@@__IMMUTABLE_ORDERED__@@";
|
|
2642
|
+
function isImmutableUnorderedKeyed(maybeKeyed) {
|
|
2643
|
+
return !!(maybeKeyed && maybeKeyed[IS_KEYED_SENTINEL] && !maybeKeyed[IS_ORDERED_SENTINEL]);
|
|
2644
|
+
}
|
|
2645
|
+
function isImmutableUnorderedSet(maybeSet) {
|
|
2646
|
+
return !!(maybeSet && maybeSet[IS_SET_SENTINEL] && !maybeSet[IS_ORDERED_SENTINEL]);
|
|
2647
|
+
}
|
|
2648
|
+
const IteratorSymbol = Symbol.iterator;
|
|
2649
|
+
const hasIterator = (object) => !!(object != null && object[IteratorSymbol]);
|
|
2650
|
+
const iterableEquality = (a, b, aStack = [], bStack = []) => {
|
|
2651
|
+
if (typeof a !== "object" || typeof b !== "object" || Array.isArray(a) || Array.isArray(b) || !hasIterator(a) || !hasIterator(b))
|
|
2652
|
+
return void 0;
|
|
2653
|
+
if (a.constructor !== b.constructor)
|
|
2654
|
+
return false;
|
|
2655
|
+
let length = aStack.length;
|
|
2656
|
+
while (length--) {
|
|
2657
|
+
if (aStack[length] === a)
|
|
2658
|
+
return bStack[length] === b;
|
|
2659
|
+
}
|
|
2660
|
+
aStack.push(a);
|
|
2661
|
+
bStack.push(b);
|
|
2662
|
+
const iterableEqualityWithStack = (a2, b2) => iterableEquality(a2, b2, [...aStack], [...bStack]);
|
|
2663
|
+
if (a.size !== void 0) {
|
|
2664
|
+
if (a.size !== b.size) {
|
|
2665
|
+
return false;
|
|
2666
|
+
} else if (isA("Set", a) || isImmutableUnorderedSet(a)) {
|
|
2667
|
+
let allFound = true;
|
|
2668
|
+
for (const aValue of a) {
|
|
2669
|
+
if (!b.has(aValue)) {
|
|
2670
|
+
let has = false;
|
|
2671
|
+
for (const bValue of b) {
|
|
2672
|
+
const isEqual = equals(aValue, bValue, [iterableEqualityWithStack]);
|
|
2673
|
+
if (isEqual === true)
|
|
2674
|
+
has = true;
|
|
2675
|
+
}
|
|
2676
|
+
if (has === false) {
|
|
2677
|
+
allFound = false;
|
|
2678
|
+
break;
|
|
2679
|
+
}
|
|
2680
|
+
}
|
|
2681
|
+
}
|
|
2682
|
+
aStack.pop();
|
|
2683
|
+
bStack.pop();
|
|
2684
|
+
return allFound;
|
|
2685
|
+
} else if (isA("Map", a) || isImmutableUnorderedKeyed(a)) {
|
|
2686
|
+
let allFound = true;
|
|
2687
|
+
for (const aEntry of a) {
|
|
2688
|
+
if (!b.has(aEntry[0]) || !equals(aEntry[1], b.get(aEntry[0]), [iterableEqualityWithStack])) {
|
|
2689
|
+
let has = false;
|
|
2690
|
+
for (const bEntry of b) {
|
|
2691
|
+
const matchedKey = equals(aEntry[0], bEntry[0], [
|
|
2692
|
+
iterableEqualityWithStack
|
|
2693
|
+
]);
|
|
2694
|
+
let matchedValue = false;
|
|
2695
|
+
if (matchedKey === true) {
|
|
2696
|
+
matchedValue = equals(aEntry[1], bEntry[1], [
|
|
2697
|
+
iterableEqualityWithStack
|
|
2698
|
+
]);
|
|
2699
|
+
}
|
|
2700
|
+
if (matchedValue === true)
|
|
2701
|
+
has = true;
|
|
2702
|
+
}
|
|
2703
|
+
if (has === false) {
|
|
2704
|
+
allFound = false;
|
|
2705
|
+
break;
|
|
2706
|
+
}
|
|
2707
|
+
}
|
|
2708
|
+
}
|
|
2709
|
+
aStack.pop();
|
|
2710
|
+
bStack.pop();
|
|
2711
|
+
return allFound;
|
|
2712
|
+
}
|
|
2713
|
+
}
|
|
2714
|
+
const bIterator = b[IteratorSymbol]();
|
|
2715
|
+
for (const aValue of a) {
|
|
2716
|
+
const nextB = bIterator.next();
|
|
2717
|
+
if (nextB.done || !equals(aValue, nextB.value, [iterableEqualityWithStack]))
|
|
2718
|
+
return false;
|
|
2719
|
+
}
|
|
2720
|
+
if (!bIterator.next().done)
|
|
2721
|
+
return false;
|
|
2722
|
+
aStack.pop();
|
|
2723
|
+
bStack.pop();
|
|
2724
|
+
return true;
|
|
2725
|
+
};
|
|
2726
|
+
const hasPropertyInObject = (object, key) => {
|
|
2727
|
+
const shouldTerminate = !object || typeof object !== "object" || object === Object.prototype;
|
|
2728
|
+
if (shouldTerminate)
|
|
2729
|
+
return false;
|
|
2730
|
+
return Object.prototype.hasOwnProperty.call(object, key) || hasPropertyInObject(Object.getPrototypeOf(object), key);
|
|
2731
|
+
};
|
|
2732
|
+
const isObjectWithKeys = (a) => isObject(a) && !(a instanceof Error) && !(a instanceof Array) && !(a instanceof Date);
|
|
2733
|
+
const subsetEquality = (object, subset) => {
|
|
2734
|
+
const subsetEqualityWithContext = (seenReferences = new WeakMap()) => (object2, subset2) => {
|
|
2735
|
+
if (!isObjectWithKeys(subset2))
|
|
2736
|
+
return void 0;
|
|
2737
|
+
return Object.keys(subset2).every((key) => {
|
|
2738
|
+
if (isObjectWithKeys(subset2[key])) {
|
|
2739
|
+
if (seenReferences.has(subset2[key]))
|
|
2740
|
+
return equals(object2[key], subset2[key], [iterableEquality]);
|
|
2741
|
+
seenReferences.set(subset2[key], true);
|
|
2742
|
+
}
|
|
2743
|
+
const result = object2 != null && hasPropertyInObject(object2, key) && equals(object2[key], subset2[key], [
|
|
2744
|
+
iterableEquality,
|
|
2745
|
+
subsetEqualityWithContext(seenReferences)
|
|
2746
|
+
]);
|
|
2747
|
+
seenReferences.delete(subset2[key]);
|
|
2748
|
+
return result;
|
|
2749
|
+
});
|
|
2750
|
+
};
|
|
2751
|
+
return subsetEqualityWithContext()(object, subset);
|
|
2752
|
+
};
|
|
2753
|
+
const typeEquality = (a, b) => {
|
|
2754
|
+
if (a == null || b == null || a.constructor === b.constructor)
|
|
2755
|
+
return void 0;
|
|
2756
|
+
return false;
|
|
2757
|
+
};
|
|
2758
|
+
const arrayBufferEquality = (a, b) => {
|
|
2759
|
+
if (!(a instanceof ArrayBuffer) || !(b instanceof ArrayBuffer))
|
|
2760
|
+
return void 0;
|
|
2761
|
+
const dataViewA = new DataView(a);
|
|
2762
|
+
const dataViewB = new DataView(b);
|
|
2763
|
+
if (dataViewA.byteLength !== dataViewB.byteLength)
|
|
2764
|
+
return false;
|
|
2765
|
+
for (let i = 0; i < dataViewA.byteLength; i++) {
|
|
2766
|
+
if (dataViewA.getUint8(i) !== dataViewB.getUint8(i))
|
|
2767
|
+
return false;
|
|
2768
|
+
}
|
|
2769
|
+
return true;
|
|
2770
|
+
};
|
|
2771
|
+
const sparseArrayEquality = (a, b) => {
|
|
2772
|
+
if (!Array.isArray(a) || !Array.isArray(b))
|
|
2773
|
+
return void 0;
|
|
2774
|
+
const aKeys = Object.keys(a);
|
|
2775
|
+
const bKeys = Object.keys(b);
|
|
2776
|
+
return equals(a, b, [iterableEquality, typeEquality], true) && equals(aKeys, bKeys);
|
|
2777
|
+
};
|
|
2778
|
+
|
|
2779
|
+
const MATCHERS_OBJECT = Symbol.for("matchers-object");
|
|
2780
|
+
if (!Object.prototype.hasOwnProperty.call(global, MATCHERS_OBJECT)) {
|
|
2781
|
+
const defaultState = {
|
|
2782
|
+
assertionCalls: 0,
|
|
2783
|
+
isExpectingAssertions: false,
|
|
2784
|
+
isExpectingAssertionsError: null,
|
|
2785
|
+
expectedAssertionsNumber: null,
|
|
2786
|
+
expectedAssertionsNumberError: null
|
|
2787
|
+
};
|
|
2788
|
+
Object.defineProperty(global, MATCHERS_OBJECT, {
|
|
2789
|
+
value: {
|
|
2790
|
+
state: defaultState
|
|
2791
|
+
}
|
|
2792
|
+
});
|
|
2793
|
+
}
|
|
2794
|
+
const getState = () => global[MATCHERS_OBJECT].state;
|
|
2795
|
+
const setState = (state) => {
|
|
2796
|
+
Object.assign(global[MATCHERS_OBJECT].state, state);
|
|
2797
|
+
};
|
|
2798
|
+
const JestChaiExpect = (chai, utils) => {
|
|
2799
|
+
function def(name, fn) {
|
|
2800
|
+
const addMethod = (n) => {
|
|
2801
|
+
utils.addMethod(chai.Assertion.prototype, n, fn);
|
|
2802
|
+
};
|
|
2803
|
+
if (Array.isArray(name))
|
|
2804
|
+
name.forEach((n) => addMethod(n));
|
|
2805
|
+
else
|
|
2806
|
+
addMethod(name);
|
|
2807
|
+
}
|
|
2808
|
+
const chaiEqual = chai.Assertion.prototype.equal;
|
|
2809
|
+
def("chaiEqual", function(...args) {
|
|
2810
|
+
return chaiEqual.apply(this, args);
|
|
2811
|
+
});
|
|
2812
|
+
["throw", "throws", "Throw"].forEach((m) => {
|
|
2813
|
+
utils.overwriteMethod(chai.Assertion.prototype, m, (_super) => {
|
|
2814
|
+
return function(...args) {
|
|
2815
|
+
const promise = utils.flag(this, "promise");
|
|
2816
|
+
const object = utils.flag(this, "object");
|
|
2817
|
+
if (promise === "rejects") {
|
|
2818
|
+
utils.flag(this, "object", () => {
|
|
2819
|
+
throw object;
|
|
2820
|
+
});
|
|
2821
|
+
}
|
|
2822
|
+
_super.apply(this, args);
|
|
2823
|
+
};
|
|
2824
|
+
});
|
|
2825
|
+
});
|
|
2826
|
+
utils.overwriteMethod(chai.Assertion.prototype, "equal", (_super) => {
|
|
2827
|
+
return function(...args) {
|
|
2828
|
+
const expected = args[0];
|
|
2829
|
+
const actual = utils.flag(this, "object");
|
|
2830
|
+
if (hasAsymmetric(expected)) {
|
|
2831
|
+
this.assert(equals(actual, expected, void 0, true), "not match with #{act}", "should not match with #{act}", actual, expected);
|
|
2832
|
+
} else {
|
|
2833
|
+
_super.apply(this, args);
|
|
2834
|
+
}
|
|
2835
|
+
};
|
|
2836
|
+
});
|
|
2837
|
+
utils.overwriteMethod(chai.Assertion.prototype, "eql", (_super) => {
|
|
2838
|
+
return function(...args) {
|
|
2839
|
+
const expected = args[0];
|
|
2840
|
+
const actual = utils.flag(this, "object");
|
|
2841
|
+
if (hasAsymmetric(expected)) {
|
|
2842
|
+
this.assert(equals(actual, expected), "not match with #{exp}", "should not match with #{exp}", expected, actual);
|
|
2843
|
+
} else {
|
|
2844
|
+
_super.apply(this, args);
|
|
2845
|
+
}
|
|
2846
|
+
};
|
|
2847
|
+
});
|
|
2848
|
+
def("toEqual", function(expected) {
|
|
2849
|
+
return this.eql(expected);
|
|
2850
|
+
});
|
|
2851
|
+
def("toStrictEqual", function(expected) {
|
|
2852
|
+
const obj = utils.flag(this, "object");
|
|
2853
|
+
const equal = equals(obj, expected, [
|
|
2854
|
+
iterableEquality,
|
|
2855
|
+
typeEquality,
|
|
2856
|
+
sparseArrayEquality,
|
|
2857
|
+
arrayBufferEquality
|
|
2858
|
+
], true);
|
|
2859
|
+
return this.assert(equal, "expected #{this} to strictly equal #{exp}", "expected #{this} to not strictly equal #{exp}", expected, obj);
|
|
2860
|
+
});
|
|
2861
|
+
def("toBe", function(expected) {
|
|
2862
|
+
return this.equal(expected);
|
|
2863
|
+
});
|
|
2864
|
+
def("toMatchObject", function(expected) {
|
|
2865
|
+
return this.containSubset(expected);
|
|
2866
|
+
});
|
|
2867
|
+
def("toMatch", function(expected) {
|
|
2868
|
+
if (typeof expected === "string")
|
|
2869
|
+
return this.include(expected);
|
|
2870
|
+
else
|
|
2871
|
+
return this.match(expected);
|
|
2872
|
+
});
|
|
2873
|
+
def("toContain", function(item) {
|
|
2874
|
+
return this.contain(item);
|
|
2875
|
+
});
|
|
2876
|
+
def("toContainEqual", function(expected) {
|
|
2877
|
+
const obj = utils.flag(this, "object");
|
|
2878
|
+
const index = Array.from(obj).findIndex((item) => {
|
|
2879
|
+
return equals(item, expected);
|
|
2880
|
+
});
|
|
2881
|
+
this.assert(index !== -1, "expected #{this} to deep equally contain #{exp}", "expected #{this} to not deep equally contain #{exp}", expected);
|
|
2882
|
+
});
|
|
2883
|
+
def("toBeTruthy", function() {
|
|
2884
|
+
const obj = utils.flag(this, "object");
|
|
2885
|
+
this.assert(Boolean(obj), "expected #{this} to be truthy", "expected #{this} to not be truthy", obj);
|
|
2886
|
+
});
|
|
2887
|
+
def("toBeFalsy", function() {
|
|
2888
|
+
const obj = utils.flag(this, "object");
|
|
2889
|
+
this.assert(!obj, "expected #{this} to be falsy", "expected #{this} to not be falsy", obj);
|
|
2890
|
+
});
|
|
2891
|
+
def("toBeGreaterThan", function(expected) {
|
|
2892
|
+
return this.to.greaterThan(expected);
|
|
2893
|
+
});
|
|
2894
|
+
def("toBeGreaterThanOrEqual", function(expected) {
|
|
2895
|
+
return this.to.greaterThanOrEqual(expected);
|
|
2896
|
+
});
|
|
2897
|
+
def("toBeLessThan", function(expected) {
|
|
2898
|
+
return this.to.lessThan(expected);
|
|
2899
|
+
});
|
|
2900
|
+
def("toBeLessThanOrEqual", function(expected) {
|
|
2901
|
+
return this.to.lessThanOrEqual(expected);
|
|
2902
|
+
});
|
|
2903
|
+
def("toBeNaN", function() {
|
|
2904
|
+
return this.be.NaN;
|
|
2905
|
+
});
|
|
2906
|
+
def("toBeUndefined", function() {
|
|
2907
|
+
return this.be.undefined;
|
|
2908
|
+
});
|
|
2909
|
+
def("toBeNull", function() {
|
|
2910
|
+
return this.be.null;
|
|
2911
|
+
});
|
|
2912
|
+
def("toBeDefined", function() {
|
|
2913
|
+
const negate = utils.flag(this, "negate");
|
|
2914
|
+
utils.flag(this, "negate", false);
|
|
2915
|
+
if (negate)
|
|
2916
|
+
return this.be.undefined;
|
|
2917
|
+
return this.not.be.undefined;
|
|
2918
|
+
});
|
|
2919
|
+
def("toBeInstanceOf", function(obj) {
|
|
2920
|
+
return this.instanceOf(obj);
|
|
2921
|
+
});
|
|
2922
|
+
def("toHaveLength", function(length) {
|
|
2923
|
+
return this.have.length(length);
|
|
2924
|
+
});
|
|
2925
|
+
def("toHaveProperty", function(...args) {
|
|
2926
|
+
return this.have.deep.nested.property(...args);
|
|
2927
|
+
});
|
|
2928
|
+
def("toBeCloseTo", function(received, precision = 2) {
|
|
2929
|
+
const expected = this._obj;
|
|
2930
|
+
let pass = false;
|
|
2931
|
+
let expectedDiff = 0;
|
|
2932
|
+
let receivedDiff = 0;
|
|
2933
|
+
if (received === Infinity && expected === Infinity) {
|
|
2934
|
+
pass = true;
|
|
2935
|
+
} else if (received === -Infinity && expected === -Infinity) {
|
|
2936
|
+
pass = true;
|
|
2937
|
+
} else {
|
|
2938
|
+
expectedDiff = Math.pow(10, -precision) / 2;
|
|
2939
|
+
receivedDiff = Math.abs(expected - received);
|
|
2940
|
+
pass = receivedDiff < expectedDiff;
|
|
2941
|
+
}
|
|
2942
|
+
return this.assert(pass, `expected #{this} to be close to #{exp}, recieved difference is ${receivedDiff}, but expected ${expectedDiff}`, `expected #{this} to not be close to #{exp}, recieved difference is ${receivedDiff}, but expected ${expectedDiff}`, received, expected);
|
|
2943
|
+
});
|
|
2944
|
+
const assertIsMock = (assertion) => {
|
|
2945
|
+
if (!isMockFunction(assertion._obj))
|
|
2946
|
+
throw new TypeError(`${utils.inspect(assertion._obj)} is not a spy or a call to a spy!`);
|
|
2947
|
+
};
|
|
2948
|
+
const getSpy = (assertion) => {
|
|
2949
|
+
assertIsMock(assertion);
|
|
2950
|
+
return assertion._obj;
|
|
2951
|
+
};
|
|
2952
|
+
def(["toHaveBeenCalledTimes", "toBeCalledTimes"], function(number) {
|
|
2953
|
+
const spy = getSpy(this);
|
|
2954
|
+
const spyName = spy.getMockName();
|
|
2955
|
+
const callCount = spy.mock.calls.length;
|
|
2956
|
+
return this.assert(callCount === number, `expected "${spyName}" to be called #{exp} times`, `expected "${spyName}" to not be called #{exp} times`, number, callCount);
|
|
2957
|
+
});
|
|
2958
|
+
def("toHaveBeenCalledOnce", function() {
|
|
2959
|
+
const spy = getSpy(this);
|
|
2960
|
+
const spyName = spy.getMockName();
|
|
2961
|
+
const callCount = spy.mock.calls.length;
|
|
2962
|
+
return this.assert(callCount === 1, `expected "${spyName}" to be called once`, `expected "${spyName}" to not be called once`, 1, callCount);
|
|
2963
|
+
});
|
|
2964
|
+
def(["toHaveBeenCalled", "toBeCalled"], function() {
|
|
2965
|
+
const spy = getSpy(this);
|
|
2966
|
+
const spyName = spy.getMockName();
|
|
2967
|
+
const called = spy.mock.calls.length > 0;
|
|
2968
|
+
return this.assert(called, `expected "${spyName}" to be called at least once`, `expected "${spyName}" to not be called at all`, true, called);
|
|
2969
|
+
});
|
|
2970
|
+
def(["toHaveBeenCalledWith", "toBeCalledWith"], function(...args) {
|
|
2971
|
+
const spy = getSpy(this);
|
|
2972
|
+
const spyName = spy.getMockName();
|
|
2973
|
+
const pass = spy.mock.calls.some((callArg) => equals(callArg, args, [iterableEquality]));
|
|
2974
|
+
return this.assert(pass, `expected "${spyName}" to be called with arguments: #{exp}`, `expected "${spyName}" to not be called with arguments: #{exp}`, args, spy.mock.calls);
|
|
2975
|
+
});
|
|
2976
|
+
const ordinalOf = (i) => {
|
|
2977
|
+
const j = i % 10;
|
|
2978
|
+
const k = i % 100;
|
|
2979
|
+
if (j === 1 && k !== 11)
|
|
2980
|
+
return `${i}st`;
|
|
2981
|
+
if (j === 2 && k !== 12)
|
|
2982
|
+
return `${i}nd`;
|
|
2983
|
+
if (j === 3 && k !== 13)
|
|
2984
|
+
return `${i}rd`;
|
|
2985
|
+
return `${i}th`;
|
|
2986
|
+
};
|
|
2987
|
+
def(["toHaveBeenNthCalledWith", "nthCalledWith"], function(times, ...args) {
|
|
2988
|
+
const spy = getSpy(this);
|
|
2989
|
+
const spyName = spy.getMockName();
|
|
2990
|
+
const nthCall = spy.mock.calls[times - 1];
|
|
2991
|
+
this.assert(equals(nthCall, args, [iterableEquality]), `expected ${ordinalOf(times)} "${spyName}" call to have been called with #{exp}`, `expected ${ordinalOf(times)} "${spyName}" call to not have been called with #{exp}`, args, nthCall);
|
|
2992
|
+
});
|
|
2993
|
+
def(["toHaveBeenLastCalledWith", "lastCalledWith"], function(...args) {
|
|
2994
|
+
const spy = getSpy(this);
|
|
2995
|
+
const spyName = spy.getMockName();
|
|
2996
|
+
const lastCall = spy.mock.calls[spy.calls.length - 1];
|
|
2997
|
+
this.assert(equals(lastCall, args, [iterableEquality]), `expected last "${spyName}" call to have been called with #{exp}`, `expected last "${spyName}" call to not have been called with #{exp}`, args, lastCall);
|
|
2998
|
+
});
|
|
2999
|
+
def(["toThrow", "toThrowError"], function(expected) {
|
|
3000
|
+
return this.to.throw(expected);
|
|
3001
|
+
});
|
|
3002
|
+
def(["toHaveReturned", "toReturn"], function() {
|
|
3003
|
+
const spy = getSpy(this);
|
|
3004
|
+
const spyName = spy.getMockName();
|
|
3005
|
+
const calledAndNotThrew = spy.mock.calls.length > 0 && !spy.mock.results.some(({ type }) => type === "throw");
|
|
3006
|
+
this.assert(calledAndNotThrew, `expected "${spyName}" to be successfully called at least once`, `expected "${spyName}" to not be successfully called`, calledAndNotThrew, !calledAndNotThrew);
|
|
3007
|
+
});
|
|
3008
|
+
def(["toHaveReturnedTimes", "toReturnTimes"], function(times) {
|
|
3009
|
+
const spy = getSpy(this);
|
|
3010
|
+
const spyName = spy.getMockName();
|
|
3011
|
+
const successfullReturns = spy.mock.results.reduce((success, { type }) => type === "throw" ? success : ++success, 0);
|
|
3012
|
+
this.assert(successfullReturns === times, `expected "${spyName}" to be successfully called ${times} times`, `expected "${spyName}" to not be successfully called ${times} times`, `expected number of returns: ${times}`, `received number of returns: ${successfullReturns}`);
|
|
3013
|
+
});
|
|
3014
|
+
def(["toHaveReturnedWith", "toReturnWith"], function(value) {
|
|
3015
|
+
const spy = getSpy(this);
|
|
3016
|
+
const spyName = spy.getMockName();
|
|
3017
|
+
const pass = spy.mock.results.some(({ type, value: result }) => type === "return" && equals(value, result));
|
|
3018
|
+
this.assert(pass, `expected "${spyName}" to be successfully called with #{exp}`, `expected "${spyName}" to not be successfully called with #{exp}`, value);
|
|
3019
|
+
});
|
|
3020
|
+
def(["toHaveLastReturnedWith", "lastReturnedWith"], function(value) {
|
|
3021
|
+
const spy = getSpy(this);
|
|
3022
|
+
const spyName = spy.getMockName();
|
|
3023
|
+
const { value: lastResult } = spy.mock.results[spy.returns.length - 1];
|
|
3024
|
+
const pass = equals(lastResult, value);
|
|
3025
|
+
this.assert(pass, `expected last "${spyName}" call to return #{exp}`, `expected last "${spyName}" call to not return #{exp}`, value, lastResult);
|
|
3026
|
+
});
|
|
3027
|
+
def(["toHaveNthReturnedWith", "nthReturnedWith"], function(nthCall, value) {
|
|
3028
|
+
const spy = getSpy(this);
|
|
3029
|
+
const spyName = spy.getMockName();
|
|
3030
|
+
const isNot = utils.flag(this, "negate");
|
|
3031
|
+
const { type: callType, value: callResult } = spy.mock.results[nthCall - 1];
|
|
3032
|
+
const ordinalCall = `${ordinalOf(nthCall)} call`;
|
|
3033
|
+
if (!isNot && callType === "throw")
|
|
3034
|
+
chai.assert.fail(`expected ${ordinalCall} to return #{exp}, but instead it threw an error`);
|
|
3035
|
+
const nthCallReturn = equals(callResult, value);
|
|
3036
|
+
this.assert(nthCallReturn, `expected ${ordinalCall} "${spyName}" call to return #{exp}`, `expected ${ordinalCall} "${spyName}" call to not return #{exp}`, value, callResult);
|
|
3037
|
+
});
|
|
3038
|
+
utils.addProperty(chai.Assertion.prototype, "resolves", function() {
|
|
3039
|
+
utils.flag(this, "promise", "resolves");
|
|
3040
|
+
const obj = utils.flag(this, "object");
|
|
3041
|
+
const proxy = new Proxy(this, {
|
|
3042
|
+
get: (target, key, reciever) => {
|
|
3043
|
+
const result = Reflect.get(target, key, reciever);
|
|
3044
|
+
if (typeof result !== "function")
|
|
3045
|
+
return result instanceof chai.Assertion ? proxy : result;
|
|
3046
|
+
return async (...args) => {
|
|
3047
|
+
return obj.then((value) => {
|
|
3048
|
+
utils.flag(this, "object", value);
|
|
3049
|
+
return result.call(this, ...args);
|
|
3050
|
+
}, (err) => {
|
|
3051
|
+
throw new Error(`promise rejected "${err}" instead of resolving`);
|
|
3052
|
+
});
|
|
3053
|
+
};
|
|
3054
|
+
}
|
|
3055
|
+
});
|
|
3056
|
+
return proxy;
|
|
3057
|
+
});
|
|
3058
|
+
utils.addProperty(chai.Assertion.prototype, "rejects", function() {
|
|
3059
|
+
utils.flag(this, "promise", "rejects");
|
|
3060
|
+
const obj = utils.flag(this, "object");
|
|
3061
|
+
const wrapper = typeof obj === "function" ? obj() : obj;
|
|
3062
|
+
const proxy = new Proxy(this, {
|
|
3063
|
+
get: (target, key, reciever) => {
|
|
3064
|
+
const result = Reflect.get(target, key, reciever);
|
|
3065
|
+
if (typeof result !== "function")
|
|
3066
|
+
return result instanceof chai.Assertion ? proxy : result;
|
|
3067
|
+
return async (...args) => {
|
|
3068
|
+
return wrapper.then((value) => {
|
|
3069
|
+
throw new Error(`promise resolved "${value}" instead of rejecting`);
|
|
3070
|
+
}, (err) => {
|
|
3071
|
+
utils.flag(this, "object", err);
|
|
3072
|
+
return result.call(this, ...args);
|
|
3073
|
+
});
|
|
3074
|
+
};
|
|
3075
|
+
}
|
|
3076
|
+
});
|
|
3077
|
+
return proxy;
|
|
3078
|
+
});
|
|
3079
|
+
utils.addMethod(chai.expect, "assertions", function assertions(expected) {
|
|
3080
|
+
const error = new Error(`expected number of assertions to be ${expected}, but got ${getState().assertionCalls}`);
|
|
3081
|
+
if (Error.captureStackTrace)
|
|
3082
|
+
Error.captureStackTrace(error, assertions);
|
|
3083
|
+
setState({
|
|
3084
|
+
expectedAssertionsNumber: expected,
|
|
3085
|
+
expectedAssertionsNumberError: error
|
|
3086
|
+
});
|
|
3087
|
+
});
|
|
3088
|
+
utils.addMethod(chai.expect, "hasAssertions", function hasAssertions() {
|
|
3089
|
+
const error = new Error("expected any number of assertion, but got none");
|
|
3090
|
+
if (Error.captureStackTrace)
|
|
3091
|
+
Error.captureStackTrace(error, hasAssertions);
|
|
3092
|
+
setState({
|
|
3093
|
+
isExpectingAssertions: true,
|
|
3094
|
+
isExpectingAssertionsError: error
|
|
3095
|
+
});
|
|
3096
|
+
});
|
|
3097
|
+
utils.addMethod(chai.expect, "addSnapshotSerializer", addSerializer);
|
|
3098
|
+
};
|
|
3099
|
+
|
|
3100
|
+
var mockdate$1 = {exports: {}};
|
|
3101
|
+
|
|
3102
|
+
(function (module, exports) {
|
|
3103
|
+
(function (global, factory) {
|
|
3104
|
+
factory(exports) ;
|
|
3105
|
+
}(commonjsGlobal, (function (exports) {
|
|
3106
|
+
/*! *****************************************************************************
|
|
3107
|
+
Copyright (c) Microsoft Corporation.
|
|
3108
|
+
|
|
3109
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
3110
|
+
purpose with or without fee is hereby granted.
|
|
3111
|
+
|
|
3112
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
3113
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
3114
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
3115
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
3116
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
3117
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
3118
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
3119
|
+
***************************************************************************** */
|
|
3120
|
+
/* global Reflect, Promise */
|
|
3121
|
+
|
|
3122
|
+
var extendStatics = function(d, b) {
|
|
3123
|
+
extendStatics = Object.setPrototypeOf ||
|
|
3124
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
3125
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
3126
|
+
return extendStatics(d, b);
|
|
3127
|
+
};
|
|
3128
|
+
|
|
3129
|
+
function __extends(d, b) {
|
|
3130
|
+
if (typeof b !== "function" && b !== null)
|
|
3131
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
3132
|
+
extendStatics(d, b);
|
|
3133
|
+
function __() { this.constructor = d; }
|
|
3134
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
3135
|
+
}
|
|
3136
|
+
|
|
3137
|
+
var RealDate = Date;
|
|
3138
|
+
var now = null;
|
|
3139
|
+
var MockDate = /** @class */ (function (_super) {
|
|
3140
|
+
__extends(Date, _super);
|
|
3141
|
+
function Date(y, m, d, h, M, s, ms) {
|
|
3142
|
+
_super.call(this) || this;
|
|
3143
|
+
var date;
|
|
3144
|
+
switch (arguments.length) {
|
|
3145
|
+
case 0:
|
|
3146
|
+
if (now !== null) {
|
|
3147
|
+
date = new RealDate(now.valueOf());
|
|
3148
|
+
}
|
|
3149
|
+
else {
|
|
3150
|
+
date = new RealDate();
|
|
3151
|
+
}
|
|
3152
|
+
break;
|
|
3153
|
+
case 1:
|
|
3154
|
+
date = new RealDate(y);
|
|
3155
|
+
break;
|
|
3156
|
+
default:
|
|
3157
|
+
d = typeof d === 'undefined' ? 1 : d;
|
|
3158
|
+
h = h || 0;
|
|
3159
|
+
M = M || 0;
|
|
3160
|
+
s = s || 0;
|
|
3161
|
+
ms = ms || 0;
|
|
3162
|
+
date = new RealDate(y, m, d, h, M, s, ms);
|
|
3163
|
+
break;
|
|
3164
|
+
}
|
|
3165
|
+
return date;
|
|
3166
|
+
}
|
|
3167
|
+
return Date;
|
|
3168
|
+
}(RealDate));
|
|
3169
|
+
MockDate.prototype = RealDate.prototype;
|
|
3170
|
+
MockDate.UTC = RealDate.UTC;
|
|
3171
|
+
MockDate.now = function () {
|
|
3172
|
+
return new MockDate().valueOf();
|
|
3173
|
+
};
|
|
3174
|
+
MockDate.parse = function (dateString) {
|
|
3175
|
+
return RealDate.parse(dateString);
|
|
3176
|
+
};
|
|
3177
|
+
MockDate.toString = function () {
|
|
3178
|
+
return RealDate.toString();
|
|
3179
|
+
};
|
|
3180
|
+
function set(date) {
|
|
3181
|
+
var dateObj = new Date(date.valueOf());
|
|
3182
|
+
if (isNaN(dateObj.getTime())) {
|
|
3183
|
+
throw new TypeError('mockdate: The time set is an invalid date: ' + date);
|
|
3184
|
+
}
|
|
3185
|
+
// @ts-ignore
|
|
3186
|
+
Date = MockDate;
|
|
3187
|
+
now = dateObj.valueOf();
|
|
3188
|
+
}
|
|
3189
|
+
function reset() {
|
|
3190
|
+
Date = RealDate;
|
|
3191
|
+
}
|
|
3192
|
+
var mockdate = {
|
|
3193
|
+
set: set,
|
|
3194
|
+
reset: reset,
|
|
3195
|
+
};
|
|
3196
|
+
|
|
3197
|
+
exports.default = mockdate;
|
|
3198
|
+
exports.reset = reset;
|
|
3199
|
+
exports.set = set;
|
|
3200
|
+
|
|
3201
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
3202
|
+
|
|
3203
|
+
})));
|
|
3204
|
+
}(mockdate$1, mockdate$1.exports));
|
|
3205
|
+
|
|
3206
|
+
var mockdate = /*@__PURE__*/getDefaultExportFromCjs(mockdate$1.exports);
|
|
3207
|
+
|
|
3208
|
+
const originalSetTimeout = global.setTimeout;
|
|
3209
|
+
const originalSetInterval = global.setInterval;
|
|
3210
|
+
const originalClearTimeout = global.clearTimeout;
|
|
3211
|
+
const originalClearInterval = global.clearInterval;
|
|
3212
|
+
const MAX_LOOPS = 1e4;
|
|
3213
|
+
var QueueTaskType;
|
|
3214
|
+
(function(QueueTaskType2) {
|
|
3215
|
+
QueueTaskType2["Interval"] = "interval";
|
|
3216
|
+
QueueTaskType2["Timeout"] = "timeout";
|
|
3217
|
+
QueueTaskType2["Immediate"] = "immediate";
|
|
3218
|
+
})(QueueTaskType || (QueueTaskType = {}));
|
|
3219
|
+
const assertEvery = (assertions, message) => {
|
|
3220
|
+
if (assertions.some((a) => !a))
|
|
3221
|
+
throw new Error(message);
|
|
3222
|
+
};
|
|
3223
|
+
const assertMaxLoop = (times) => {
|
|
3224
|
+
if (times >= MAX_LOOPS)
|
|
3225
|
+
throw new Error("setTimeout/setInterval called 10 000 times. It's possible it stuck in an infinite loop.");
|
|
3226
|
+
};
|
|
3227
|
+
const getNodeTimeout = (id) => {
|
|
3228
|
+
const timer = {
|
|
3229
|
+
ref: () => timer,
|
|
3230
|
+
unref: () => timer,
|
|
3231
|
+
hasRef: () => true,
|
|
3232
|
+
refresh: () => timer,
|
|
3233
|
+
[Symbol.toPrimitive]: () => id
|
|
3234
|
+
};
|
|
3235
|
+
return timer;
|
|
3236
|
+
};
|
|
3237
|
+
class FakeTimers {
|
|
3238
|
+
constructor() {
|
|
3239
|
+
this._advancedTime = 0;
|
|
3240
|
+
this._nestedTime = {};
|
|
3241
|
+
this._scopeId = 0;
|
|
3242
|
+
this._isNested = false;
|
|
3243
|
+
this._isOnlyPending = false;
|
|
3244
|
+
this._spyid = 0;
|
|
3245
|
+
this._isMocked = false;
|
|
3246
|
+
this._tasksQueue = [];
|
|
3247
|
+
this._queueCount = 0;
|
|
3248
|
+
}
|
|
3249
|
+
useFakeTimers() {
|
|
3250
|
+
this._isMocked = true;
|
|
3251
|
+
this.reset();
|
|
3252
|
+
const spyFactory = (spyType, resultBuilder) => {
|
|
3253
|
+
return (cb, ms = 0) => {
|
|
3254
|
+
const id = ++this._spyid;
|
|
3255
|
+
const nestedTo = Object.entries(this._nestedTime).filter(([key]) => Number(key) <= this._scopeId);
|
|
3256
|
+
const nestedMs = nestedTo.reduce((total, [, ms2]) => total + ms2, ms);
|
|
3257
|
+
const call = { id, cb, ms, nestedMs, scopeId: this._scopeId };
|
|
3258
|
+
const task = { type: spyType, call, nested: this._isNested };
|
|
3259
|
+
this.pushTask(task);
|
|
3260
|
+
return resultBuilder(id, cb);
|
|
3261
|
+
};
|
|
3262
|
+
};
|
|
3263
|
+
this._setTimeout = spyOn(global, "setTimeout").mockImplementation(spyFactory(QueueTaskType.Timeout, getNodeTimeout));
|
|
3264
|
+
this._setInterval = spyOn(global, "setInterval").mockImplementation(spyFactory(QueueTaskType.Interval, getNodeTimeout));
|
|
3265
|
+
const clearTimerFactory = (spyType) => (id) => {
|
|
3266
|
+
if (id === void 0)
|
|
3267
|
+
return;
|
|
3268
|
+
const index = this._tasksQueue.findIndex(({ call, type }) => type === spyType && call.id === Number(id));
|
|
3269
|
+
if (index !== -1)
|
|
3270
|
+
this._tasksQueue.splice(index, 1);
|
|
3271
|
+
};
|
|
3272
|
+
this._clearTimeout = spyOn(global, "clearTimeout").mockImplementation(clearTimerFactory(QueueTaskType.Timeout));
|
|
3273
|
+
this._clearInterval = spyOn(global, "clearInterval").mockImplementation(clearTimerFactory(QueueTaskType.Interval));
|
|
3274
|
+
}
|
|
3275
|
+
useRealTimers() {
|
|
3276
|
+
this._isMocked = false;
|
|
3277
|
+
this.reset();
|
|
3278
|
+
global.setTimeout = originalSetTimeout;
|
|
3279
|
+
global.setInterval = originalSetInterval;
|
|
3280
|
+
global.clearTimeout = originalClearTimeout;
|
|
3281
|
+
global.clearInterval = originalClearInterval;
|
|
3282
|
+
}
|
|
3283
|
+
runOnlyPendingTimers() {
|
|
3284
|
+
this.assertMocked();
|
|
3285
|
+
this._isOnlyPending = true;
|
|
3286
|
+
this.runQueue();
|
|
3287
|
+
}
|
|
3288
|
+
runAllTimers() {
|
|
3289
|
+
this.assertMocked();
|
|
3290
|
+
this.runQueue();
|
|
3291
|
+
}
|
|
3292
|
+
advanceTimersByTime(ms) {
|
|
3293
|
+
this.assertMocked();
|
|
3294
|
+
this._advancedTime += ms;
|
|
3295
|
+
this.runQueue();
|
|
3296
|
+
}
|
|
3297
|
+
advanceTimersToNextTimer() {
|
|
3298
|
+
this.assertMocked();
|
|
3299
|
+
this.callQueueItem(0);
|
|
3300
|
+
}
|
|
3301
|
+
getTimerCount() {
|
|
3302
|
+
this.assertMocked();
|
|
3303
|
+
return this._tasksQueue.length;
|
|
3304
|
+
}
|
|
3305
|
+
reset() {
|
|
3306
|
+
var _a, _b, _c, _d;
|
|
3307
|
+
this._advancedTime = 0;
|
|
3308
|
+
this._nestedTime = {};
|
|
3309
|
+
this._isNested = false;
|
|
3310
|
+
this._isOnlyPending = false;
|
|
3311
|
+
this._spyid = 0;
|
|
3312
|
+
this._queueCount = 0;
|
|
3313
|
+
this._tasksQueue = [];
|
|
3314
|
+
(_a = this._clearInterval) == null ? void 0 : _a.mockRestore();
|
|
3315
|
+
(_b = this._clearTimeout) == null ? void 0 : _b.mockRestore();
|
|
3316
|
+
(_c = this._setInterval) == null ? void 0 : _c.mockRestore();
|
|
3317
|
+
(_d = this._setTimeout) == null ? void 0 : _d.mockRestore();
|
|
3318
|
+
}
|
|
3319
|
+
callQueueItem(index) {
|
|
3320
|
+
var _a, _b;
|
|
3321
|
+
const task = this._tasksQueue[index];
|
|
3322
|
+
if (!task)
|
|
3323
|
+
return;
|
|
3324
|
+
const { call, type } = task;
|
|
3325
|
+
this._scopeId = call.id;
|
|
3326
|
+
this._isNested = true;
|
|
3327
|
+
(_a = this._nestedTime)[_b = call.id] ?? (_a[_b] = 0);
|
|
3328
|
+
this._nestedTime[call.id] += call.ms;
|
|
3329
|
+
if (type === "timeout") {
|
|
3330
|
+
this.removeTask(index);
|
|
3331
|
+
} else if (type === "interval") {
|
|
3332
|
+
call.nestedMs += call.ms;
|
|
3333
|
+
const nestedMs = call.nestedMs;
|
|
3334
|
+
const closestTask = this._tasksQueue.findIndex(({ type: type2, call: call2 }) => type2 === "interval" && call2.nestedMs < nestedMs);
|
|
3335
|
+
if (closestTask !== -1 && closestTask !== index)
|
|
3336
|
+
this.ensureQueueOrder();
|
|
3337
|
+
}
|
|
3338
|
+
call.cb();
|
|
3339
|
+
this._queueCount++;
|
|
3340
|
+
}
|
|
3341
|
+
runQueue() {
|
|
3342
|
+
let index = 0;
|
|
3343
|
+
while (this._tasksQueue[index]) {
|
|
3344
|
+
assertMaxLoop(this._queueCount);
|
|
3345
|
+
const { call, nested } = this._tasksQueue[index];
|
|
3346
|
+
if (this._advancedTime && call.nestedMs > this._advancedTime)
|
|
3347
|
+
break;
|
|
3348
|
+
if (this._isOnlyPending && nested) {
|
|
3349
|
+
index++;
|
|
3350
|
+
continue;
|
|
3351
|
+
}
|
|
3352
|
+
this.callQueueItem(index);
|
|
3353
|
+
}
|
|
3354
|
+
}
|
|
3355
|
+
removeTask(index) {
|
|
3356
|
+
if (index === 0)
|
|
3357
|
+
this._tasksQueue.shift();
|
|
3358
|
+
else
|
|
3359
|
+
this._tasksQueue.splice(index, 1);
|
|
3360
|
+
}
|
|
3361
|
+
pushTask(task) {
|
|
3362
|
+
this._tasksQueue.push(task);
|
|
3363
|
+
this.ensureQueueOrder();
|
|
3364
|
+
}
|
|
3365
|
+
ensureQueueOrder() {
|
|
3366
|
+
this._tasksQueue.sort((t1, t2) => {
|
|
3367
|
+
const diff = t1.call.nestedMs - t2.call.nestedMs;
|
|
3368
|
+
if (diff === 0) {
|
|
3369
|
+
if (t1.type === QueueTaskType.Immediate && t2.type !== QueueTaskType.Immediate)
|
|
3370
|
+
return 1;
|
|
3371
|
+
return 0;
|
|
3372
|
+
}
|
|
3373
|
+
return diff;
|
|
3374
|
+
});
|
|
3375
|
+
}
|
|
3376
|
+
assertMocked() {
|
|
3377
|
+
assertEvery([
|
|
3378
|
+
this._isMocked,
|
|
3379
|
+
this._setTimeout,
|
|
3380
|
+
this._setInterval,
|
|
3381
|
+
this._clearTimeout,
|
|
3382
|
+
this._clearInterval
|
|
3383
|
+
], 'timers are not mocked. try calling "vi.useFakeTimers()" first');
|
|
3384
|
+
}
|
|
3385
|
+
}
|
|
3386
|
+
|
|
3387
|
+
class VitestUtils {
|
|
3388
|
+
constructor() {
|
|
3389
|
+
this.spyOn = spyOn;
|
|
3390
|
+
this.fn = fn;
|
|
3391
|
+
this._timers = new FakeTimers();
|
|
3392
|
+
this._mockedDate = null;
|
|
3393
|
+
}
|
|
3394
|
+
useFakeTimers() {
|
|
3395
|
+
return this._timers.useFakeTimers();
|
|
3396
|
+
}
|
|
3397
|
+
useRealTimers() {
|
|
3398
|
+
return this._timers.useRealTimers();
|
|
3399
|
+
}
|
|
3400
|
+
runOnlyPendingTimers() {
|
|
3401
|
+
return this._timers.runOnlyPendingTimers();
|
|
3402
|
+
}
|
|
3403
|
+
runAllTimers() {
|
|
3404
|
+
return this._timers.runAllTimers();
|
|
3405
|
+
}
|
|
3406
|
+
advanceTimersByTime(ms) {
|
|
3407
|
+
return this._timers.advanceTimersByTime(ms);
|
|
3408
|
+
}
|
|
3409
|
+
advanceTimersToNextTimer() {
|
|
3410
|
+
return this._timers.advanceTimersToNextTimer();
|
|
3411
|
+
}
|
|
3412
|
+
getTimerCount() {
|
|
3413
|
+
return this._timers.getTimerCount();
|
|
3414
|
+
}
|
|
3415
|
+
mockCurrentDate(date) {
|
|
3416
|
+
this._mockedDate = date;
|
|
3417
|
+
mockdate.set(date);
|
|
3418
|
+
}
|
|
3419
|
+
restoreCurrentDate() {
|
|
3420
|
+
this._mockedDate = null;
|
|
3421
|
+
mockdate.reset();
|
|
3422
|
+
}
|
|
3423
|
+
getMockedDate() {
|
|
3424
|
+
return this._mockedDate;
|
|
3425
|
+
}
|
|
3426
|
+
mock(path, factory) {
|
|
3427
|
+
}
|
|
3428
|
+
unmock(path) {
|
|
3429
|
+
}
|
|
3430
|
+
async importActual(path) {
|
|
3431
|
+
return {};
|
|
3432
|
+
}
|
|
3433
|
+
async importMock(path) {
|
|
3434
|
+
return {};
|
|
3435
|
+
}
|
|
3436
|
+
mocked(item, _deep = false) {
|
|
3437
|
+
return item;
|
|
3438
|
+
}
|
|
3439
|
+
isMockFunction(fn2) {
|
|
3440
|
+
return isMockFunction(fn2);
|
|
3441
|
+
}
|
|
3442
|
+
clearAllMocks() {
|
|
3443
|
+
__vitest__clearMocks__({ clearMocks: true });
|
|
3444
|
+
spies.forEach((spy) => spy.mockClear());
|
|
3445
|
+
return this;
|
|
3446
|
+
}
|
|
3447
|
+
resetAllMocks() {
|
|
3448
|
+
__vitest__clearMocks__({ mockReset: true });
|
|
3449
|
+
spies.forEach((spy) => spy.mockReset());
|
|
3450
|
+
return this;
|
|
3451
|
+
}
|
|
3452
|
+
restoreAllMocks() {
|
|
3453
|
+
__vitest__clearMocks__({ restoreMocks: true });
|
|
3454
|
+
spies.forEach((spy) => spy.mockRestore());
|
|
3455
|
+
return this;
|
|
3456
|
+
}
|
|
3457
|
+
}
|
|
3458
|
+
const vitest = new VitestUtils();
|
|
3459
|
+
const vi = vitest;
|
|
3460
|
+
|
|
3461
|
+
export { JestChaiExpect as J, getDefaultHookTimeout as a, getState as b, suite as c, describe as d, vi as e, format_1 as f, getCurrentSuite as g, getSerializers as h, it as i, equals as j, iterableEquality as k, subsetEquality as l, isA as m, clearContext as n, defaultSuite as o, plugins_1 as p, setHooks as q, getHooks as r, setState as s, test$7 as t, context as u, vitest as v, withTimeout as w, getFn as x };
|
|
3462
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmktNTY3YmE1NzIuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lL2NoYWluLnRzIiwiLi4vc3JjL3J1bnRpbWUvY29udGV4dC50cyIsIi4uL3NyYy9ydW50aW1lL21hcC50cyIsIi4uL3NyYy9ydW50aW1lL3N1aXRlLnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2Fuc2ktc3R5bGVzQDUuMi4wL25vZGVfbW9kdWxlcy9hbnNpLXN0eWxlcy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmV0dHktZm9ybWF0QDI3LjQuNi9ub2RlX21vZHVsZXMvcHJldHR5LWZvcm1hdC9idWlsZC9jb2xsZWN0aW9ucy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmV0dHktZm9ybWF0QDI3LjQuNi9ub2RlX21vZHVsZXMvcHJldHR5LWZvcm1hdC9idWlsZC9wbHVnaW5zL0FzeW1tZXRyaWNNYXRjaGVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2Fuc2ktcmVnZXhANS4wLjEvbm9kZV9tb2R1bGVzL2Fuc2ktcmVnZXgvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvcGx1Z2lucy9Db252ZXJ0QW5zaS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmV0dHktZm9ybWF0QDI3LjQuNi9ub2RlX21vZHVsZXMvcHJldHR5LWZvcm1hdC9idWlsZC9wbHVnaW5zL0RPTUNvbGxlY3Rpb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvcGx1Z2lucy9saWIvZXNjYXBlSFRNTC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmV0dHktZm9ybWF0QDI3LjQuNi9ub2RlX21vZHVsZXMvcHJldHR5LWZvcm1hdC9idWlsZC9wbHVnaW5zL2xpYi9tYXJrdXAuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvcGx1Z2lucy9ET01FbGVtZW50LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3ByZXR0eS1mb3JtYXRAMjcuNC42L25vZGVfbW9kdWxlcy9wcmV0dHktZm9ybWF0L2J1aWxkL3BsdWdpbnMvSW1tdXRhYmxlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3JlYWN0LWlzQDE3LjAuMi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3JlYWN0LWlzQDE3LjAuMi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3JlYWN0LWlzQDE3LjAuMi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvcGx1Z2lucy9SZWFjdEVsZW1lbnQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvcGx1Z2lucy9SZWFjdFRlc3RDb21wb25lbnQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvaW5kZXguanMiLCIuLi9zcmMvaW50ZWdyYXRpb25zL3NuYXBzaG90L3BvcnQvcGx1Z2lucy50cyIsIi4uL3NyYy9pbnRlZ3JhdGlvbnMvY2hhaS9qZXN0LXV0aWxzLnRzIiwiLi4vc3JjL2ludGVncmF0aW9ucy9jaGFpL2plc3QtZXhwZWN0LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21vY2tkYXRlQDMuMC41L25vZGVfbW9kdWxlcy9tb2NrZGF0ZS9saWIvbW9ja2RhdGUuanMiLCIuLi9zcmMvaW50ZWdyYXRpb25zL3RpbWVycy50cyIsIi4uL3NyYy9pbnRlZ3JhdGlvbnMvdmkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQ2hhaW5hYmxlRnVuY3Rpb248VCBleHRlbmRzIHN0cmluZywgQXJncyBleHRlbmRzIGFueVtdLCBSID0gYW55PiA9IHtcbiAgKC4uLmFyZ3M6IEFyZ3MpOiBSXG59ICYge1xuICBbeCBpbiBUXTogQ2hhaW5hYmxlRnVuY3Rpb248VCwgQXJncywgUj5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNoYWluYWJsZTxUIGV4dGVuZHMgc3RyaW5nLCBBcmdzIGV4dGVuZHMgYW55W10sIFIgPSBhbnk+KFxuICBrZXlzOiBUW10sXG4gIGZuOiAodGhpczogUmVjb3JkPFQsIGJvb2xlYW4gfCB1bmRlZmluZWQ+LCAuLi5hcmdzOiBBcmdzKSA9PiBSLFxuKTogQ2hhaW5hYmxlRnVuY3Rpb248VCwgQXJncywgUj4ge1xuICBmdW5jdGlvbiBjcmVhdGUob2JqOiBSZWNvcmQ8VCwgYm9vbGVhbiB8IHVuZGVmaW5lZD4pIHtcbiAgICBjb25zdCBjaGFpbiA9IGZ1bmN0aW9uKHRoaXM6IGFueSwgLi4uYXJnczogQXJncykge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KG9iaiwgYXJncylcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNoYWluLCBrZXksIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGUoeyAuLi5vYmosIFtrZXldOiB0cnVlIH0pXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gY2hhaW5cbiAgfVxuXG4gIGNvbnN0IGNoYWluID0gY3JlYXRlKHt9IGFzIGFueSkgYXMgYW55XG4gIGNoYWluLmZuID0gZm5cbiAgcmV0dXJuIGNoYWluXG59XG4iLCJpbXBvcnQgdHlwZSB7IEF3YWl0YWJsZSwgRG9uZUNhbGxiYWNrLCBSdW50aW1lQ29udGV4dCwgU3VpdGVDb2xsZWN0b3IsIFRlc3RGdW5jdGlvbiB9IGZyb20gJy4uL3R5cGVzJ1xuXG5leHBvcnQgY29uc3QgY29udGV4dDogUnVudGltZUNvbnRleHQgPSB7XG4gIHRhc2tzOiBbXSxcbiAgY3VycmVudFN1aXRlOiBudWxsLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFRhc2sodGFzazogU3VpdGVDb2xsZWN0b3IpIHtcbiAgY29udGV4dC5jdXJyZW50U3VpdGU/LnRhc2tzLnB1c2godGFzaylcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTdWl0ZShzdWl0ZTogU3VpdGVDb2xsZWN0b3IsIGZuOiAoKCkgPT4gQXdhaXRhYmxlPHZvaWQ+KSkge1xuICBjb25zdCBwcmV2ID0gY29udGV4dC5jdXJyZW50U3VpdGVcbiAgY29udGV4dC5jdXJyZW50U3VpdGUgPSBzdWl0ZVxuICBhd2FpdCBmbigpXG4gIGNvbnRleHQuY3VycmVudFN1aXRlID0gcHJldlxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFRlc3RUaW1lb3V0KCkge1xuICByZXR1cm4gcHJvY2Vzcy5fX3ZpdGVzdF93b3JrZXJfXyEuY29uZmlnIS50ZXN0VGltZW91dFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdEhvb2tUaW1lb3V0KCkge1xuICByZXR1cm4gcHJvY2Vzcy5fX3ZpdGVzdF93b3JrZXJfXyEuY29uZmlnIS5ob29rVGltZW91dFxufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFRpbWVvdXQ8VCBleHRlbmRzKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KT4oZm46IFQsIF90aW1lb3V0PzogbnVtYmVyKTogVCB7XG4gIGNvbnN0IHRpbWVvdXQgPSBfdGltZW91dCA/PyBnZXREZWZhdWx0VGVzdFRpbWVvdXQoKVxuICBpZiAodGltZW91dCA8PSAwIHx8IHRpbWVvdXQgPT09IEluZmluaXR5KVxuICAgIHJldHVybiBmblxuXG4gIHJldHVybiAoKC4uLmFyZ3M6IChUIGV4dGVuZHMgKCguLi5hcmdzOiBpbmZlciBBKSA9PiBhbnkpID8gQSA6IG5ldmVyKSkgPT4ge1xuICAgIHJldHVybiBQcm9taXNlLnJhY2UoW2ZuKC4uLmFyZ3MpLCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRlc3QgdGltZWQgb3V0IGluICR7dGltZW91dH1tcy5gKSlcbiAgICAgIH0sIHRpbWVvdXQpXG4gICAgICB0aW1lci51bnJlZigpXG4gICAgfSldKSBhcyBBd2FpdGFibGU8dm9pZD5cbiAgfSkgYXMgVFxufVxuXG5mdW5jdGlvbiBlbnN1cmVBc3luY1Rlc3QoZm46IFRlc3RGdW5jdGlvbik6ICgpID0+IEF3YWl0YWJsZTx2b2lkPiB7XG4gIGlmICghZm4ubGVuZ3RoKVxuICAgIHJldHVybiBmbiBhcyAoKSA9PiBBd2FpdGFibGU8dm9pZD5cblxuICByZXR1cm4gKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGRvbmU6IERvbmVDYWxsYmFjayA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYXJnc1swXSAvLyByZWplY3Qgb24gdHJ1dGh5IHZhbHVlc1xuICAgICAgPyByZWplY3QoYXJnc1swXSlcbiAgICAgIDogcmVzb2x2ZSgpXG4gICAgZm4oZG9uZSlcbiAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVRlc3QoZm46IFRlc3RGdW5jdGlvbiwgdGltZW91dD86IG51bWJlcik6ICgpID0+IEF3YWl0YWJsZTx2b2lkPiB7XG4gIHJldHVybiB3aXRoVGltZW91dChlbnN1cmVBc3luY1Rlc3QoZm4pLCB0aW1lb3V0KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBd2FpdGFibGUsIFN1aXRlLCBTdWl0ZUhvb2tzLCBUZXN0IH0gZnJvbSAnLi4vdHlwZXMnXG5cbi8vIHVzZSBXZWFrTWFwIGhlcmUgdG8gbWFrZSB0aGUgVGVzdCBhbmQgU3VpdGUgb2JqZWN0IHNlcmlhbGl6YWJsZVxuY29uc3QgZm5NYXAgPSBuZXcgV2Vha01hcCgpXG5jb25zdCBob29rc01hcCA9IG5ldyBXZWFrTWFwKClcblxuZXhwb3J0IGZ1bmN0aW9uIHNldEZuKGtleTogVGVzdCwgZm46ICgpID0+IEF3YWl0YWJsZTx2b2lkPikge1xuICBmbk1hcC5zZXQoa2V5LCBmbilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZuKGtleTogVGVzdCk6ICgpID0+IEF3YWl0YWJsZTx2b2lkPiB7XG4gIHJldHVybiBmbk1hcC5nZXQoa2V5KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0SG9va3Moa2V5OiBTdWl0ZSwgaG9va3M6IFN1aXRlSG9va3MpIHtcbiAgaG9va3NNYXAuc2V0KGtleSwgaG9va3MpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIb29rcyhrZXk6IFN1aXRlKTogU3VpdGVIb29rcyB7XG4gIHJldHVybiBob29rc01hcC5nZXQoa2V5KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBGaWxlLCBSdW5Nb2RlLCBTdWl0ZSwgU3VpdGVDb2xsZWN0b3IsIFN1aXRlSG9va3MsIFRlc3QsIFRlc3RDb2xsZWN0b3IsIFRlc3RGYWN0b3J5LCBUZXN0RnVuY3Rpb24gfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi91dGlscydcbmltcG9ydCB7IGNyZWF0ZUNoYWluYWJsZSB9IGZyb20gJy4vY2hhaW4nXG5pbXBvcnQgeyBjb2xsZWN0VGFzaywgY29udGV4dCwgbm9ybWFsaXplVGVzdCwgcnVuV2l0aFN1aXRlIH0gZnJvbSAnLi9jb250ZXh0J1xuaW1wb3J0IHsgZ2V0SG9va3MsIHNldEZuLCBzZXRIb29rcyB9IGZyb20gJy4vbWFwJ1xuXG4vLyBhcGlzXG5leHBvcnQgY29uc3Qgc3VpdGUgPSBjcmVhdGVTdWl0ZSgpXG5leHBvcnQgY29uc3QgdGVzdDogVGVzdENvbGxlY3RvciA9IGNyZWF0ZUNoYWluYWJsZShcbiAgWydjb25jdXJyZW50JywgJ3NraXAnLCAnb25seScsICd0b2RvJywgJ2ZhaWxzJ10sXG4gIGZ1bmN0aW9uKG5hbWU6IHN0cmluZywgZm4/OiBUZXN0RnVuY3Rpb24sIHRpbWVvdXQ/OiBudW1iZXIpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHVudHlwZWQgaW50ZXJuYWwgcHJvcFxuICAgIGdldEN1cnJlbnRTdWl0ZSgpLnRlc3QuZm4uY2FsbCh0aGlzLCBuYW1lLCBmbiwgdGltZW91dClcbiAgfSxcbilcblxuLy8gYWxpYXNcbmV4cG9ydCBjb25zdCBkZXNjcmliZSA9IHN1aXRlXG5leHBvcnQgY29uc3QgaXQgPSB0ZXN0XG5cbi8vIGltcGxlbWVudGF0aW9uc1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRTdWl0ZSA9IHN1aXRlKCcnKVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDb250ZXh0KCkge1xuICBjb250ZXh0LnRhc2tzLmxlbmd0aCA9IDBcbiAgZGVmYXVsdFN1aXRlLmNsZWFyKClcbiAgY29udGV4dC5jdXJyZW50U3VpdGUgPSBkZWZhdWx0U3VpdGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRTdWl0ZSgpIHtcbiAgcmV0dXJuIGNvbnRleHQuY3VycmVudFN1aXRlIHx8IGRlZmF1bHRTdWl0ZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3VpdGVIb29rcygpIHtcbiAgcmV0dXJuIHtcbiAgICBiZWZvcmVBbGw6IFtdLFxuICAgIGFmdGVyQWxsOiBbXSxcbiAgICBiZWZvcmVFYWNoOiBbXSxcbiAgICBhZnRlckVhY2g6IFtdLFxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN1aXRlQ29sbGVjdG9yKG5hbWU6IHN0cmluZywgZmFjdG9yeTogVGVzdEZhY3RvcnkgPSAoKSA9PiB7IH0sIG1vZGU6IFJ1bk1vZGUsIGNvbmN1cnJlbnQ/OiBib29sZWFuKSB7XG4gIGNvbnN0IHRhc2tzOiAoVGVzdCB8IFN1aXRlIHwgU3VpdGVDb2xsZWN0b3IpW10gPSBbXVxuICBjb25zdCBmYWN0b3J5UXVldWU6IChUZXN0IHwgU3VpdGUgfCBTdWl0ZUNvbGxlY3RvcilbXSA9IFtdXG5cbiAgbGV0IHN1aXRlOiBTdWl0ZVxuXG4gIGluaXRTdWl0ZSgpXG5cbiAgY29uc3QgdGVzdCA9IGNyZWF0ZUNoYWluYWJsZShcbiAgICBbJ2NvbmN1cnJlbnQnLCAnc2tpcCcsICdvbmx5JywgJ3RvZG8nLCAnZmFpbHMnXSxcbiAgICBmdW5jdGlvbihuYW1lOiBzdHJpbmcsIGZuPzogVGVzdEZ1bmN0aW9uLCB0aW1lb3V0PzogbnVtYmVyKSB7XG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5vbmx5ID8gJ29ubHknIDogdGhpcy5za2lwID8gJ3NraXAnIDogdGhpcy50b2RvID8gJ3RvZG8nIDogJ3J1bidcblxuICAgICAgY29uc3QgdGVzdDogVGVzdCA9IHtcbiAgICAgICAgaWQ6ICcnLFxuICAgICAgICB0eXBlOiAndGVzdCcsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG1vZGUsXG4gICAgICAgIHN1aXRlOiB1bmRlZmluZWQhLFxuICAgICAgICBmYWlsczogdGhpcy5mYWlscyxcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmN1cnJlbnQgfHwgY29uY3VycmVudClcbiAgICAgICAgdGVzdC5jb25jdXJyZW50ID0gdHJ1ZVxuXG4gICAgICBzZXRGbih0ZXN0LCBub3JtYWxpemVUZXN0KGZuIHx8IG5vb3AsIHRpbWVvdXQpKVxuICAgICAgdGFza3MucHVzaCh0ZXN0KVxuICAgIH0sXG4gIClcblxuICBjb25zdCBjb2xsZWN0b3I6IFN1aXRlQ29sbGVjdG9yID0ge1xuICAgIHR5cGU6ICdjb2xsZWN0b3InLFxuICAgIG5hbWUsXG4gICAgbW9kZSxcbiAgICB0ZXN0LFxuICAgIHRhc2tzLFxuICAgIGNvbGxlY3QsXG4gICAgY2xlYXIsXG4gICAgb246IGFkZEhvb2ssXG4gIH1cblxuICBmdW5jdGlvbiBhZGRIb29rPFQgZXh0ZW5kcyBrZXlvZiBTdWl0ZUhvb2tzPihuYW1lOiBULCAuLi5mbjogU3VpdGVIb29rc1tUXSkge1xuICAgIGdldEhvb2tzKHN1aXRlKVtuYW1lXS5wdXNoKC4uLmZuIGFzIGFueSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRTdWl0ZSgpIHtcbiAgICBzdWl0ZSA9IHtcbiAgICAgIGlkOiAnJyxcbiAgICAgIHR5cGU6ICdzdWl0ZScsXG4gICAgICBuYW1lLFxuICAgICAgbW9kZSxcbiAgICAgIHRhc2tzOiBbXSxcbiAgICB9XG4gICAgc2V0SG9va3Moc3VpdGUsIGNyZWF0ZVN1aXRlSG9va3MoKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIHRhc2tzLmxlbmd0aCA9IDBcbiAgICBmYWN0b3J5UXVldWUubGVuZ3RoID0gMFxuICAgIGluaXRTdWl0ZSgpXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjb2xsZWN0KGZpbGU/OiBGaWxlKSB7XG4gICAgZmFjdG9yeVF1ZXVlLmxlbmd0aCA9IDBcbiAgICBpZiAoZmFjdG9yeSlcbiAgICAgIGF3YWl0IHJ1bldpdGhTdWl0ZShjb2xsZWN0b3IsICgpID0+IGZhY3RvcnkodGVzdCkpXG5cbiAgICBjb25zdCBhbGxDaGlsZHJlbiA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgWy4uLmZhY3RvcnlRdWV1ZSwgLi4udGFza3NdXG4gICAgICAgIC5tYXAoaSA9PiBpLnR5cGUgPT09ICdjb2xsZWN0b3InID8gaS5jb2xsZWN0KGZpbGUpIDogaSksXG4gICAgKVxuXG4gICAgc3VpdGUuZmlsZSA9IGZpbGVcbiAgICBzdWl0ZS50YXNrcyA9IGFsbENoaWxkcmVuXG5cbiAgICBhbGxDaGlsZHJlbi5mb3JFYWNoKCh0YXNrKSA9PiB7XG4gICAgICB0YXNrLnN1aXRlID0gc3VpdGVcbiAgICAgIGlmIChmaWxlKVxuICAgICAgICB0YXNrLmZpbGUgPSBmaWxlXG4gICAgfSlcblxuICAgIHJldHVybiBzdWl0ZVxuICB9XG5cbiAgY29sbGVjdFRhc2soY29sbGVjdG9yKVxuXG4gIHJldHVybiBjb2xsZWN0b3Jcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3VpdGUoKSB7XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGUoXG4gICAgWydjb25jdXJyZW50JywgJ3NraXAnLCAnb25seScsICd0b2RvJ10sXG4gICAgZnVuY3Rpb24obmFtZTogc3RyaW5nLCBmYWN0b3J5PzogVGVzdEZhY3RvcnkpIHtcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm9ubHkgPyAnb25seScgOiB0aGlzLnNraXAgPyAnc2tpcCcgOiB0aGlzLnRvZG8gPyAndG9kbycgOiAncnVuJ1xuICAgICAgcmV0dXJuIGNyZWF0ZVN1aXRlQ29sbGVjdG9yKG5hbWUsIGZhY3RvcnksIG1vZGUsIHRoaXMuY29uY3VycmVudClcbiAgICB9LFxuICApXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IEFOU0lfQkFDS0dST1VORF9PRkZTRVQgPSAxMDtcblxuY29uc3Qgd3JhcEFuc2kyNTYgPSAob2Zmc2V0ID0gMCkgPT4gY29kZSA9PiBgXFx1MDAxQlskezM4ICsgb2Zmc2V0fTs1OyR7Y29kZX1tYDtcblxuY29uc3Qgd3JhcEFuc2kxNm0gPSAob2Zmc2V0ID0gMCkgPT4gKHJlZCwgZ3JlZW4sIGJsdWUpID0+IGBcXHUwMDFCWyR7MzggKyBvZmZzZXR9OzI7JHtyZWR9OyR7Z3JlZW59OyR7Ymx1ZX1tYDtcblxuZnVuY3Rpb24gYXNzZW1ibGVTdHlsZXMoKSB7XG5cdGNvbnN0IGNvZGVzID0gbmV3IE1hcCgpO1xuXHRjb25zdCBzdHlsZXMgPSB7XG5cdFx0bW9kaWZpZXI6IHtcblx0XHRcdHJlc2V0OiBbMCwgMF0sXG5cdFx0XHQvLyAyMSBpc24ndCB3aWRlbHkgc3VwcG9ydGVkIGFuZCAyMiBkb2VzIHRoZSBzYW1lIHRoaW5nXG5cdFx0XHRib2xkOiBbMSwgMjJdLFxuXHRcdFx0ZGltOiBbMiwgMjJdLFxuXHRcdFx0aXRhbGljOiBbMywgMjNdLFxuXHRcdFx0dW5kZXJsaW5lOiBbNCwgMjRdLFxuXHRcdFx0b3ZlcmxpbmU6IFs1MywgNTVdLFxuXHRcdFx0aW52ZXJzZTogWzcsIDI3XSxcblx0XHRcdGhpZGRlbjogWzgsIDI4XSxcblx0XHRcdHN0cmlrZXRocm91Z2g6IFs5LCAyOV1cblx0XHR9LFxuXHRcdGNvbG9yOiB7XG5cdFx0XHRibGFjazogWzMwLCAzOV0sXG5cdFx0XHRyZWQ6IFszMSwgMzldLFxuXHRcdFx0Z3JlZW46IFszMiwgMzldLFxuXHRcdFx0eWVsbG93OiBbMzMsIDM5XSxcblx0XHRcdGJsdWU6IFszNCwgMzldLFxuXHRcdFx0bWFnZW50YTogWzM1LCAzOV0sXG5cdFx0XHRjeWFuOiBbMzYsIDM5XSxcblx0XHRcdHdoaXRlOiBbMzcsIDM5XSxcblxuXHRcdFx0Ly8gQnJpZ2h0IGNvbG9yXG5cdFx0XHRibGFja0JyaWdodDogWzkwLCAzOV0sXG5cdFx0XHRyZWRCcmlnaHQ6IFs5MSwgMzldLFxuXHRcdFx0Z3JlZW5CcmlnaHQ6IFs5MiwgMzldLFxuXHRcdFx0eWVsbG93QnJpZ2h0OiBbOTMsIDM5XSxcblx0XHRcdGJsdWVCcmlnaHQ6IFs5NCwgMzldLFxuXHRcdFx0bWFnZW50YUJyaWdodDogWzk1LCAzOV0sXG5cdFx0XHRjeWFuQnJpZ2h0OiBbOTYsIDM5XSxcblx0XHRcdHdoaXRlQnJpZ2h0OiBbOTcsIDM5XVxuXHRcdH0sXG5cdFx0YmdDb2xvcjoge1xuXHRcdFx0YmdCbGFjazogWzQwLCA0OV0sXG5cdFx0XHRiZ1JlZDogWzQxLCA0OV0sXG5cdFx0XHRiZ0dyZWVuOiBbNDIsIDQ5XSxcblx0XHRcdGJnWWVsbG93OiBbNDMsIDQ5XSxcblx0XHRcdGJnQmx1ZTogWzQ0LCA0OV0sXG5cdFx0XHRiZ01hZ2VudGE6IFs0NSwgNDldLFxuXHRcdFx0YmdDeWFuOiBbNDYsIDQ5XSxcblx0XHRcdGJnV2hpdGU6IFs0NywgNDldLFxuXG5cdFx0XHQvLyBCcmlnaHQgY29sb3Jcblx0XHRcdGJnQmxhY2tCcmlnaHQ6IFsxMDAsIDQ5XSxcblx0XHRcdGJnUmVkQnJpZ2h0OiBbMTAxLCA0OV0sXG5cdFx0XHRiZ0dyZWVuQnJpZ2h0OiBbMTAyLCA0OV0sXG5cdFx0XHRiZ1llbGxvd0JyaWdodDogWzEwMywgNDldLFxuXHRcdFx0YmdCbHVlQnJpZ2h0OiBbMTA0LCA0OV0sXG5cdFx0XHRiZ01hZ2VudGFCcmlnaHQ6IFsxMDUsIDQ5XSxcblx0XHRcdGJnQ3lhbkJyaWdodDogWzEwNiwgNDldLFxuXHRcdFx0YmdXaGl0ZUJyaWdodDogWzEwNywgNDldXG5cdFx0fVxuXHR9O1xuXG5cdC8vIEFsaWFzIGJyaWdodCBibGFjayBhcyBncmF5IChhbmQgZ3JleSlcblx0c3R5bGVzLmNvbG9yLmdyYXkgPSBzdHlsZXMuY29sb3IuYmxhY2tCcmlnaHQ7XG5cdHN0eWxlcy5iZ0NvbG9yLmJnR3JheSA9IHN0eWxlcy5iZ0NvbG9yLmJnQmxhY2tCcmlnaHQ7XG5cdHN0eWxlcy5jb2xvci5ncmV5ID0gc3R5bGVzLmNvbG9yLmJsYWNrQnJpZ2h0O1xuXHRzdHlsZXMuYmdDb2xvci5iZ0dyZXkgPSBzdHlsZXMuYmdDb2xvci5iZ0JsYWNrQnJpZ2h0O1xuXG5cdGZvciAoY29uc3QgW2dyb3VwTmFtZSwgZ3JvdXBdIG9mIE9iamVjdC5lbnRyaWVzKHN0eWxlcykpIHtcblx0XHRmb3IgKGNvbnN0IFtzdHlsZU5hbWUsIHN0eWxlXSBvZiBPYmplY3QuZW50cmllcyhncm91cCkpIHtcblx0XHRcdHN0eWxlc1tzdHlsZU5hbWVdID0ge1xuXHRcdFx0XHRvcGVuOiBgXFx1MDAxQlske3N0eWxlWzBdfW1gLFxuXHRcdFx0XHRjbG9zZTogYFxcdTAwMUJbJHtzdHlsZVsxXX1tYFxuXHRcdFx0fTtcblxuXHRcdFx0Z3JvdXBbc3R5bGVOYW1lXSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuXG5cdFx0XHRjb2Rlcy5zZXQoc3R5bGVbMF0sIHN0eWxlWzFdKTtcblx0XHR9XG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCBncm91cE5hbWUsIHtcblx0XHRcdHZhbHVlOiBncm91cCxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdFx0fSk7XG5cdH1cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCAnY29kZXMnLCB7XG5cdFx0dmFsdWU6IGNvZGVzLFxuXHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdH0pO1xuXG5cdHN0eWxlcy5jb2xvci5jbG9zZSA9ICdcXHUwMDFCWzM5bSc7XG5cdHN0eWxlcy5iZ0NvbG9yLmNsb3NlID0gJ1xcdTAwMUJbNDltJztcblxuXHRzdHlsZXMuY29sb3IuYW5zaTI1NiA9IHdyYXBBbnNpMjU2KCk7XG5cdHN0eWxlcy5jb2xvci5hbnNpMTZtID0gd3JhcEFuc2kxNm0oKTtcblx0c3R5bGVzLmJnQ29sb3IuYW5zaTI1NiA9IHdyYXBBbnNpMjU2KEFOU0lfQkFDS0dST1VORF9PRkZTRVQpO1xuXHRzdHlsZXMuYmdDb2xvci5hbnNpMTZtID0gd3JhcEFuc2kxNm0oQU5TSV9CQUNLR1JPVU5EX09GRlNFVCk7XG5cblx0Ly8gRnJvbSBodHRwczovL2dpdGh1Yi5jb20vUWl4LS9jb2xvci1jb252ZXJ0L2Jsb2IvM2YwZTBkNGU5MmUyMzU3OTZjY2IxN2Y2ZTg1YzcyMDk0YTY1MWY0OS9jb252ZXJzaW9ucy5qc1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzdHlsZXMsIHtcblx0XHRyZ2JUb0Fuc2kyNTY6IHtcblx0XHRcdHZhbHVlOiAocmVkLCBncmVlbiwgYmx1ZSkgPT4ge1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIGV4dGVuZGVkIGdyZXlzY2FsZSBwYWxldHRlIGhlcmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuXHRcdFx0XHQvLyBibGFjayBhbmQgd2hpdGUuIG5vcm1hbCBwYWxldHRlIG9ubHkgaGFzIDQgZ3JleXNjYWxlIHNoYWRlcy5cblx0XHRcdFx0aWYgKHJlZCA9PT0gZ3JlZW4gJiYgZ3JlZW4gPT09IGJsdWUpIHtcblx0XHRcdFx0XHRpZiAocmVkIDwgOCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIDE2O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChyZWQgPiAyNDgpIHtcblx0XHRcdFx0XHRcdHJldHVybiAyMzE7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIE1hdGgucm91bmQoKChyZWQgLSA4KSAvIDI0NykgKiAyNCkgKyAyMzI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gMTYgK1xuXHRcdFx0XHRcdCgzNiAqIE1hdGgucm91bmQocmVkIC8gMjU1ICogNSkpICtcblx0XHRcdFx0XHQoNiAqIE1hdGgucm91bmQoZ3JlZW4gLyAyNTUgKiA1KSkgK1xuXHRcdFx0XHRcdE1hdGgucm91bmQoYmx1ZSAvIDI1NSAqIDUpO1xuXHRcdFx0fSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdFx0fSxcblx0XHRoZXhUb1JnYjoge1xuXHRcdFx0dmFsdWU6IGhleCA9PiB7XG5cdFx0XHRcdGNvbnN0IG1hdGNoZXMgPSAvKD88Y29sb3JTdHJpbmc+W2EtZlxcZF17Nn18W2EtZlxcZF17M30pL2kuZXhlYyhoZXgudG9TdHJpbmcoMTYpKTtcblx0XHRcdFx0aWYgKCFtYXRjaGVzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFswLCAwLCAwXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCB7Y29sb3JTdHJpbmd9ID0gbWF0Y2hlcy5ncm91cHM7XG5cblx0XHRcdFx0aWYgKGNvbG9yU3RyaW5nLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0XHRcdGNvbG9yU3RyaW5nID0gY29sb3JTdHJpbmcuc3BsaXQoJycpLm1hcChjaGFyYWN0ZXIgPT4gY2hhcmFjdGVyICsgY2hhcmFjdGVyKS5qb2luKCcnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGludGVnZXIgPSBOdW1iZXIucGFyc2VJbnQoY29sb3JTdHJpbmcsIDE2KTtcblxuXHRcdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRcdChpbnRlZ2VyID4+IDE2KSAmIDB4RkYsXG5cdFx0XHRcdFx0KGludGVnZXIgPj4gOCkgJiAweEZGLFxuXHRcdFx0XHRcdGludGVnZXIgJiAweEZGXG5cdFx0XHRcdF07XG5cdFx0XHR9LFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2Vcblx0XHR9LFxuXHRcdGhleFRvQW5zaTI1Njoge1xuXHRcdFx0dmFsdWU6IGhleCA9PiBzdHlsZXMucmdiVG9BbnNpMjU2KC4uLnN0eWxlcy5oZXhUb1JnYihoZXgpKSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gc3R5bGVzO1xufVxuXG4vLyBNYWtlIHRoZSBleHBvcnQgaW1tdXRhYmxlXG5PYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCAnZXhwb3J0cycsIHtcblx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0Z2V0OiBhc3NlbWJsZVN0eWxlc1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5wcmludEl0ZXJhdG9yRW50cmllcyA9IHByaW50SXRlcmF0b3JFbnRyaWVzO1xuZXhwb3J0cy5wcmludEl0ZXJhdG9yVmFsdWVzID0gcHJpbnRJdGVyYXRvclZhbHVlcztcbmV4cG9ydHMucHJpbnRMaXN0SXRlbXMgPSBwcmludExpc3RJdGVtcztcbmV4cG9ydHMucHJpbnRPYmplY3RQcm9wZXJ0aWVzID0gcHJpbnRPYmplY3RQcm9wZXJ0aWVzO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICpcbiAqL1xuY29uc3QgZ2V0S2V5c09mRW51bWVyYWJsZVByb3BlcnRpZXMgPSAob2JqZWN0LCBjb21wYXJlS2V5cykgPT4ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KGNvbXBhcmVLZXlzKTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KS5mb3JFYWNoKHN5bWJvbCA9PiB7XG4gICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bWJvbCkuZW51bWVyYWJsZSkge1xuICAgICAgICBrZXlzLnB1c2goc3ltYm9sKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufTtcbi8qKlxuICogUmV0dXJuIGVudHJpZXMgKGZvciBleGFtcGxlLCBvZiBhIG1hcClcbiAqIHdpdGggc3BhY2luZywgaW5kZW50YXRpb24sIGFuZCBjb21tYVxuICogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoZm9yIGV4YW1wbGUsIGJyYWNlcylcbiAqL1xuXG5mdW5jdGlvbiBwcmludEl0ZXJhdG9yRW50cmllcyhcbiAgaXRlcmF0b3IsXG4gIGNvbmZpZyxcbiAgaW5kZW50YXRpb24sXG4gIGRlcHRoLFxuICByZWZzLFxuICBwcmludGVyLCAvLyBUb28gYmFkLCBzbyBzYWQgdGhhdCBzZXBhcmF0b3IgZm9yIEVDTUFTY3JpcHQgTWFwIGhhcyBiZWVuICcgPT4gJ1xuICAvLyBXaGF0IGEgZGlzdHJhY3RpbmcgZGlmZiBpZiB5b3UgY2hhbmdlIGEgZGF0YSBzdHJ1Y3R1cmUgdG8vZnJvbVxuICAvLyBFQ01BU2NyaXB0IE9iamVjdCBvciBJbW11dGFibGUuTWFwL09yZGVyZWRNYXAgd2hpY2ggdXNlIHRoZSBkZWZhdWx0LlxuICBzZXBhcmF0b3IgPSAnOiAnXG4pIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgY3VycmVudCA9IGl0ZXJhdG9yLm5leHQoKTtcblxuICBpZiAoIWN1cnJlbnQuZG9uZSkge1xuICAgIHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyO1xuICAgIGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcblxuICAgIHdoaWxlICghY3VycmVudC5kb25lKSB7XG4gICAgICBjb25zdCBuYW1lID0gcHJpbnRlcihcbiAgICAgICAgY3VycmVudC52YWx1ZVswXSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBpbmRlbnRhdGlvbk5leHQsXG4gICAgICAgIGRlcHRoLFxuICAgICAgICByZWZzXG4gICAgICApO1xuICAgICAgY29uc3QgdmFsdWUgPSBwcmludGVyKFxuICAgICAgICBjdXJyZW50LnZhbHVlWzFdLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGluZGVudGF0aW9uTmV4dCxcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIHJlZnNcbiAgICAgICk7XG4gICAgICByZXN1bHQgKz0gaW5kZW50YXRpb25OZXh0ICsgbmFtZSArIHNlcGFyYXRvciArIHZhbHVlO1xuICAgICAgY3VycmVudCA9IGl0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgaWYgKCFjdXJyZW50LmRvbmUpIHtcbiAgICAgICAgcmVzdWx0ICs9ICcsJyArIGNvbmZpZy5zcGFjaW5nSW5uZXI7XG4gICAgICB9IGVsc2UgaWYgKCFjb25maWcubWluKSB7XG4gICAgICAgIHJlc3VsdCArPSAnLCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzdWx0ICs9IGNvbmZpZy5zcGFjaW5nT3V0ZXIgKyBpbmRlbnRhdGlvbjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFJldHVybiB2YWx1ZXMgKGZvciBleGFtcGxlLCBvZiBhIHNldClcbiAqIHdpdGggc3BhY2luZywgaW5kZW50YXRpb24sIGFuZCBjb21tYVxuICogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoYnJhY2VzIG9yIGJyYWNrZXRzKVxuICovXG5cbmZ1bmN0aW9uIHByaW50SXRlcmF0b3JWYWx1ZXMoXG4gIGl0ZXJhdG9yLFxuICBjb25maWcsXG4gIGluZGVudGF0aW9uLFxuICBkZXB0aCxcbiAgcmVmcyxcbiAgcHJpbnRlclxuKSB7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgbGV0IGN1cnJlbnQgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgaWYgKCFjdXJyZW50LmRvbmUpIHtcbiAgICByZXN1bHQgKz0gY29uZmlnLnNwYWNpbmdPdXRlcjtcbiAgICBjb25zdCBpbmRlbnRhdGlvbk5leHQgPSBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQ7XG5cbiAgICB3aGlsZSAoIWN1cnJlbnQuZG9uZSkge1xuICAgICAgcmVzdWx0ICs9XG4gICAgICAgIGluZGVudGF0aW9uTmV4dCArXG4gICAgICAgIHByaW50ZXIoY3VycmVudC52YWx1ZSwgY29uZmlnLCBpbmRlbnRhdGlvbk5leHQsIGRlcHRoLCByZWZzKTtcbiAgICAgIGN1cnJlbnQgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgIGlmICghY3VycmVudC5kb25lKSB7XG4gICAgICAgIHJlc3VsdCArPSAnLCcgKyBjb25maWcuc3BhY2luZ0lubmVyO1xuICAgICAgfSBlbHNlIGlmICghY29uZmlnLm1pbikge1xuICAgICAgICByZXN1bHQgKz0gJywnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb247XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBSZXR1cm4gaXRlbXMgKGZvciBleGFtcGxlLCBvZiBhbiBhcnJheSlcbiAqIHdpdGggc3BhY2luZywgaW5kZW50YXRpb24sIGFuZCBjb21tYVxuICogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoZm9yIGV4YW1wbGUsIGJyYWNrZXRzKVxuICoqL1xuXG5mdW5jdGlvbiBwcmludExpc3RJdGVtcyhsaXN0LCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikge1xuICBsZXQgcmVzdWx0ID0gJyc7XG5cbiAgaWYgKGxpc3QubGVuZ3RoKSB7XG4gICAgcmVzdWx0ICs9IGNvbmZpZy5zcGFjaW5nT3V0ZXI7XG4gICAgY29uc3QgaW5kZW50YXRpb25OZXh0ID0gaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHQgKz0gaW5kZW50YXRpb25OZXh0O1xuXG4gICAgICBpZiAoaSBpbiBsaXN0KSB7XG4gICAgICAgIHJlc3VsdCArPSBwcmludGVyKGxpc3RbaV0sIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpIDwgbGlzdC5sZW5ndGggLSAxKSB7XG4gICAgICAgIHJlc3VsdCArPSAnLCcgKyBjb25maWcuc3BhY2luZ0lubmVyO1xuICAgICAgfSBlbHNlIGlmICghY29uZmlnLm1pbikge1xuICAgICAgICByZXN1bHQgKz0gJywnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb247XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBSZXR1cm4gcHJvcGVydGllcyBvZiBhbiBvYmplY3RcbiAqIHdpdGggc3BhY2luZywgaW5kZW50YXRpb24sIGFuZCBjb21tYVxuICogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoZm9yIGV4YW1wbGUsIGJyYWNlcylcbiAqL1xuXG5mdW5jdGlvbiBwcmludE9iamVjdFByb3BlcnRpZXModmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGNvbnN0IGtleXMgPSBnZXRLZXlzT2ZFbnVtZXJhYmxlUHJvcGVydGllcyh2YWwsIGNvbmZpZy5jb21wYXJlS2V5cyk7XG5cbiAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ICs9IGNvbmZpZy5zcGFjaW5nT3V0ZXI7XG4gICAgY29uc3QgaW5kZW50YXRpb25OZXh0ID0gaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgY29uc3QgbmFtZSA9IHByaW50ZXIoa2V5LCBjb25maWcsIGluZGVudGF0aW9uTmV4dCwgZGVwdGgsIHJlZnMpO1xuICAgICAgY29uc3QgdmFsdWUgPSBwcmludGVyKHZhbFtrZXldLCBjb25maWcsIGluZGVudGF0aW9uTmV4dCwgZGVwdGgsIHJlZnMpO1xuICAgICAgcmVzdWx0ICs9IGluZGVudGF0aW9uTmV4dCArIG5hbWUgKyAnOiAnICsgdmFsdWU7XG5cbiAgICAgIGlmIChpIDwga2V5cy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHJlc3VsdCArPSAnLCcgKyBjb25maWcuc3BhY2luZ0lubmVyO1xuICAgICAgfSBlbHNlIGlmICghY29uZmlnLm1pbikge1xuICAgICAgICByZXN1bHQgKz0gJywnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb247XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudGVzdCA9IGV4cG9ydHMuc2VyaWFsaXplID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2NvbGxlY3Rpb25zID0gcmVxdWlyZSgnLi4vY29sbGVjdGlvbnMnKTtcblxudmFyIGdsb2JhbCA9IChmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcztcbiAgfSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBnbG9iYWw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuICB9XG59KSgpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsWydqZXN0LXN5bWJvbC1kby1ub3QtdG91Y2gnXSB8fCBnbG9iYWwuU3ltYm9sO1xuY29uc3QgYXN5bW1ldHJpY01hdGNoZXIgPVxuICB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3JcbiAgICA/IFN5bWJvbC5mb3IoJ2plc3QuYXN5bW1ldHJpY01hdGNoZXInKVxuICAgIDogMHgxMzU3YTU7XG5jb25zdCBTUEFDRSA9ICcgJztcblxuY29uc3Qgc2VyaWFsaXplID0gKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+IHtcbiAgY29uc3Qgc3RyaW5nZWRWYWx1ZSA9IHZhbC50b1N0cmluZygpO1xuXG4gIGlmIChcbiAgICBzdHJpbmdlZFZhbHVlID09PSAnQXJyYXlDb250YWluaW5nJyB8fFxuICAgIHN0cmluZ2VkVmFsdWUgPT09ICdBcnJheU5vdENvbnRhaW5pbmcnXG4gICkge1xuICAgIGlmICgrK2RlcHRoID4gY29uZmlnLm1heERlcHRoKSB7XG4gICAgICByZXR1cm4gJ1snICsgc3RyaW5nZWRWYWx1ZSArICddJztcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgc3RyaW5nZWRWYWx1ZSArXG4gICAgICBTUEFDRSArXG4gICAgICAnWycgK1xuICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludExpc3RJdGVtcykoXG4gICAgICAgIHZhbC5zYW1wbGUsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgIGRlcHRoLFxuICAgICAgICByZWZzLFxuICAgICAgICBwcmludGVyXG4gICAgICApICtcbiAgICAgICddJ1xuICAgICk7XG4gIH1cblxuICBpZiAoXG4gICAgc3RyaW5nZWRWYWx1ZSA9PT0gJ09iamVjdENvbnRhaW5pbmcnIHx8XG4gICAgc3RyaW5nZWRWYWx1ZSA9PT0gJ09iamVjdE5vdENvbnRhaW5pbmcnXG4gICkge1xuICAgIGlmICgrK2RlcHRoID4gY29uZmlnLm1heERlcHRoKSB7XG4gICAgICByZXR1cm4gJ1snICsgc3RyaW5nZWRWYWx1ZSArICddJztcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgc3RyaW5nZWRWYWx1ZSArXG4gICAgICBTUEFDRSArXG4gICAgICAneycgK1xuICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludE9iamVjdFByb3BlcnRpZXMpKFxuICAgICAgICB2YWwuc2FtcGxlLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGluZGVudGF0aW9uLFxuICAgICAgICBkZXB0aCxcbiAgICAgICAgcmVmcyxcbiAgICAgICAgcHJpbnRlclxuICAgICAgKSArXG4gICAgICAnfSdcbiAgICApO1xuICB9XG5cbiAgaWYgKFxuICAgIHN0cmluZ2VkVmFsdWUgPT09ICdTdHJpbmdNYXRjaGluZycgfHxcbiAgICBzdHJpbmdlZFZhbHVlID09PSAnU3RyaW5nTm90TWF0Y2hpbmcnXG4gICkge1xuICAgIHJldHVybiAoXG4gICAgICBzdHJpbmdlZFZhbHVlICtcbiAgICAgIFNQQUNFICtcbiAgICAgIHByaW50ZXIodmFsLnNhbXBsZSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpXG4gICAgKTtcbiAgfVxuXG4gIGlmIChcbiAgICBzdHJpbmdlZFZhbHVlID09PSAnU3RyaW5nQ29udGFpbmluZycgfHxcbiAgICBzdHJpbmdlZFZhbHVlID09PSAnU3RyaW5nTm90Q29udGFpbmluZydcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN0cmluZ2VkVmFsdWUgK1xuICAgICAgU1BBQ0UgK1xuICAgICAgcHJpbnRlcih2YWwuc2FtcGxlLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcylcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHZhbC50b0FzeW1tZXRyaWNNYXRjaGVyKCk7XG59O1xuXG5leHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTtcblxuY29uc3QgdGVzdCA9IHZhbCA9PiB2YWwgJiYgdmFsLiQkdHlwZW9mID09PSBhc3ltbWV0cmljTWF0Y2hlcjtcblxuZXhwb3J0cy50ZXN0ID0gdGVzdDtcbmNvbnN0IHBsdWdpbiA9IHtcbiAgc2VyaWFsaXplLFxuICB0ZXN0XG59O1xudmFyIF9kZWZhdWx0ID0gcGx1Z2luO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gKHtvbmx5Rmlyc3QgPSBmYWxzZX0gPSB7fSkgPT4ge1xuXHRjb25zdCBwYXR0ZXJuID0gW1xuXHRcdCdbXFxcXHUwMDFCXFxcXHUwMDlCXVtbXFxcXF0oKSM7P10qKD86KD86KD86KD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKykqfFthLXpBLVpcXFxcZF0rKD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKikqKT9cXFxcdTAwMDcpJyxcblx0XHQnKD86KD86XFxcXGR7MSw0fSg/OjtcXFxcZHswLDR9KSopP1tcXFxcZEEtUFItVFpjZi1udHFyeT0+PH5dKSknXG5cdF0uam9pbignfCcpO1xuXG5cdHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4sIG9ubHlGaXJzdCA/IHVuZGVmaW5lZCA6ICdnJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudGVzdCA9IGV4cG9ydHMuc2VyaWFsaXplID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2Fuc2lSZWdleCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnYW5zaS1yZWdleCcpKTtcblxudmFyIF9hbnNpU3R5bGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCdhbnNpLXN0eWxlcycpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHtkZWZhdWx0OiBvYmp9O1xufVxuXG4vKipcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5jb25zdCB0b0h1bWFuUmVhZGFibGVBbnNpID0gdGV4dCA9PlxuICB0ZXh0LnJlcGxhY2UoKDAsIF9hbnNpUmVnZXguZGVmYXVsdCkoKSwgbWF0Y2ggPT4ge1xuICAgIHN3aXRjaCAobWF0Y2gpIHtcbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC5yZWQuY2xvc2U6XG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuZ3JlZW4uY2xvc2U6XG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuY3lhbi5jbG9zZTpcbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC5ncmF5LmNsb3NlOlxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LndoaXRlLmNsb3NlOlxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LnllbGxvdy5jbG9zZTpcbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC5iZ1JlZC5jbG9zZTpcbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC5iZ0dyZWVuLmNsb3NlOlxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmJnWWVsbG93LmNsb3NlOlxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmludmVyc2UuY2xvc2U6XG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuZGltLmNsb3NlOlxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmJvbGQuY2xvc2U6XG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQucmVzZXQub3BlbjpcbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC5yZXNldC5jbG9zZTpcbiAgICAgICAgcmV0dXJuICc8Lz4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQucmVkLm9wZW46XG4gICAgICAgIHJldHVybiAnPHJlZD4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuZ3JlZW4ub3BlbjpcbiAgICAgICAgcmV0dXJuICc8Z3JlZW4+JztcblxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmN5YW4ub3BlbjpcbiAgICAgICAgcmV0dXJuICc8Y3lhbj4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuZ3JheS5vcGVuOlxuICAgICAgICByZXR1cm4gJzxncmF5Pic7XG5cbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC53aGl0ZS5vcGVuOlxuICAgICAgICByZXR1cm4gJzx3aGl0ZT4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQueWVsbG93Lm9wZW46XG4gICAgICAgIHJldHVybiAnPHllbGxvdz4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuYmdSZWQub3BlbjpcbiAgICAgICAgcmV0dXJuICc8YmdSZWQ+JztcblxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmJnR3JlZW4ub3BlbjpcbiAgICAgICAgcmV0dXJuICc8YmdHcmVlbj4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuYmdZZWxsb3cub3BlbjpcbiAgICAgICAgcmV0dXJuICc8YmdZZWxsb3c+JztcblxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmludmVyc2Uub3BlbjpcbiAgICAgICAgcmV0dXJuICc8aW52ZXJzZT4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuZGltLm9wZW46XG4gICAgICAgIHJldHVybiAnPGRpbT4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuYm9sZC5vcGVuOlxuICAgICAgICByZXR1cm4gJzxib2xkPic7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH0pO1xuXG5jb25zdCB0ZXN0ID0gdmFsID0+XG4gIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmICEhdmFsLm1hdGNoKCgwLCBfYW5zaVJlZ2V4LmRlZmF1bHQpKCkpO1xuXG5leHBvcnRzLnRlc3QgPSB0ZXN0O1xuXG5jb25zdCBzZXJpYWxpemUgPSAodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikgPT5cbiAgcHJpbnRlcih0b0h1bWFuUmVhZGFibGVBbnNpKHZhbCksIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzKTtcblxuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5jb25zdCBwbHVnaW4gPSB7XG4gIHNlcmlhbGl6ZSxcbiAgdGVzdFxufTtcbnZhciBfZGVmYXVsdCA9IHBsdWdpbjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudGVzdCA9IGV4cG9ydHMuc2VyaWFsaXplID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2NvbGxlY3Rpb25zID0gcmVxdWlyZSgnLi4vY29sbGVjdGlvbnMnKTtcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBsb2NhbC9iYW4tdHlwZXMtZXZlbnR1YWxseSAqL1xuY29uc3QgU1BBQ0UgPSAnICc7XG5jb25zdCBPQkpFQ1RfTkFNRVMgPSBbJ0RPTVN0cmluZ01hcCcsICdOYW1lZE5vZGVNYXAnXTtcbmNvbnN0IEFSUkFZX1JFR0VYUCA9IC9eKEhUTUxcXHcqQ29sbGVjdGlvbnxOb2RlTGlzdCkkLztcblxuY29uc3QgdGVzdE5hbWUgPSBuYW1lID0+XG4gIE9CSkVDVF9OQU1FUy5pbmRleE9mKG5hbWUpICE9PSAtMSB8fCBBUlJBWV9SRUdFWFAudGVzdChuYW1lKTtcblxuY29uc3QgdGVzdCA9IHZhbCA9PlxuICB2YWwgJiZcbiAgdmFsLmNvbnN0cnVjdG9yICYmXG4gICEhdmFsLmNvbnN0cnVjdG9yLm5hbWUgJiZcbiAgdGVzdE5hbWUodmFsLmNvbnN0cnVjdG9yLm5hbWUpO1xuXG5leHBvcnRzLnRlc3QgPSB0ZXN0O1xuXG5jb25zdCBpc05hbWVkTm9kZU1hcCA9IGNvbGxlY3Rpb24gPT5cbiAgY29sbGVjdGlvbi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTmFtZWROb2RlTWFwJztcblxuY29uc3Qgc2VyaWFsaXplID0gKGNvbGxlY3Rpb24sIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG4gIGNvbnN0IG5hbWUgPSBjb2xsZWN0aW9uLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgaWYgKCsrZGVwdGggPiBjb25maWcubWF4RGVwdGgpIHtcbiAgICByZXR1cm4gJ1snICsgbmFtZSArICddJztcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgKGNvbmZpZy5taW4gPyAnJyA6IG5hbWUgKyBTUEFDRSkgK1xuICAgIChPQkpFQ1RfTkFNRVMuaW5kZXhPZihuYW1lKSAhPT0gLTFcbiAgICAgID8gJ3snICtcbiAgICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludE9iamVjdFByb3BlcnRpZXMpKFxuICAgICAgICAgIGlzTmFtZWROb2RlTWFwKGNvbGxlY3Rpb24pXG4gICAgICAgICAgICA/IEFycmF5LmZyb20oY29sbGVjdGlvbikucmVkdWNlKChwcm9wcywgYXR0cmlidXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgcHJvcHNbYXR0cmlidXRlLm5hbWVdID0gYXR0cmlidXRlLnZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wcztcbiAgICAgICAgICAgICAgfSwge30pXG4gICAgICAgICAgICA6IHsuLi5jb2xsZWN0aW9ufSxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgcmVmcyxcbiAgICAgICAgICBwcmludGVyXG4gICAgICAgICkgK1xuICAgICAgICAnfSdcbiAgICAgIDogJ1snICtcbiAgICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludExpc3RJdGVtcykoXG4gICAgICAgICAgQXJyYXkuZnJvbShjb2xsZWN0aW9uKSxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgcmVmcyxcbiAgICAgICAgICBwcmludGVyXG4gICAgICAgICkgK1xuICAgICAgICAnXScpXG4gICk7XG59O1xuXG5leHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTtcbmNvbnN0IHBsdWdpbiA9IHtcbiAgc2VyaWFsaXplLFxuICB0ZXN0XG59O1xudmFyIF9kZWZhdWx0ID0gcGx1Z2luO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXNjYXBlSFRNTDtcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlSFRNTChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucHJpbnRUZXh0ID1cbiAgZXhwb3J0cy5wcmludFByb3BzID1cbiAgZXhwb3J0cy5wcmludEVsZW1lbnRBc0xlYWYgPVxuICBleHBvcnRzLnByaW50RWxlbWVudCA9XG4gIGV4cG9ydHMucHJpbnRDb21tZW50ID1cbiAgZXhwb3J0cy5wcmludENoaWxkcmVuID1cbiAgICB2b2lkIDA7XG5cbnZhciBfZXNjYXBlSFRNTCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9lc2NhcGVIVE1MJykpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDoge2RlZmF1bHQ6IG9ian07XG59XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbi8vIFJldHVybiBlbXB0eSBzdHJpbmcgaWYga2V5cyBpcyBlbXB0eS5cbmNvbnN0IHByaW50UHJvcHMgPSAoa2V5cywgcHJvcHMsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG4gIGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcbiAgY29uc3QgY29sb3JzID0gY29uZmlnLmNvbG9ycztcbiAgcmV0dXJuIGtleXNcbiAgICAubWFwKGtleSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHByb3BzW2tleV07XG4gICAgICBsZXQgcHJpbnRlZCA9IHByaW50ZXIodmFsdWUsIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChwcmludGVkLmluZGV4T2YoJ1xcbicpICE9PSAtMSkge1xuICAgICAgICAgIHByaW50ZWQgPVxuICAgICAgICAgICAgY29uZmlnLnNwYWNpbmdPdXRlciArXG4gICAgICAgICAgICBpbmRlbnRhdGlvbk5leHQgK1xuICAgICAgICAgICAgcHJpbnRlZCArXG4gICAgICAgICAgICBjb25maWcuc3BhY2luZ091dGVyICtcbiAgICAgICAgICAgIGluZGVudGF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRlZCA9ICd7JyArIHByaW50ZWQgKyAnfSc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbmZpZy5zcGFjaW5nSW5uZXIgK1xuICAgICAgICBpbmRlbnRhdGlvbiArXG4gICAgICAgIGNvbG9ycy5wcm9wLm9wZW4gK1xuICAgICAgICBrZXkgK1xuICAgICAgICBjb2xvcnMucHJvcC5jbG9zZSArXG4gICAgICAgICc9JyArXG4gICAgICAgIGNvbG9ycy52YWx1ZS5vcGVuICtcbiAgICAgICAgcHJpbnRlZCArXG4gICAgICAgIGNvbG9ycy52YWx1ZS5jbG9zZVxuICAgICAgKTtcbiAgICB9KVxuICAgIC5qb2luKCcnKTtcbn07IC8vIFJldHVybiBlbXB0eSBzdHJpbmcgaWYgY2hpbGRyZW4gaXMgZW1wdHkuXG5cbmV4cG9ydHMucHJpbnRQcm9wcyA9IHByaW50UHJvcHM7XG5cbmNvbnN0IHByaW50Q2hpbGRyZW4gPSAoY2hpbGRyZW4sIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PlxuICBjaGlsZHJlblxuICAgIC5tYXAoXG4gICAgICBjaGlsZCA9PlxuICAgICAgICBjb25maWcuc3BhY2luZ091dGVyICtcbiAgICAgICAgaW5kZW50YXRpb24gK1xuICAgICAgICAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gcHJpbnRUZXh0KGNoaWxkLCBjb25maWcpXG4gICAgICAgICAgOiBwcmludGVyKGNoaWxkLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcykpXG4gICAgKVxuICAgIC5qb2luKCcnKTtcblxuZXhwb3J0cy5wcmludENoaWxkcmVuID0gcHJpbnRDaGlsZHJlbjtcblxuY29uc3QgcHJpbnRUZXh0ID0gKHRleHQsIGNvbmZpZykgPT4ge1xuICBjb25zdCBjb250ZW50Q29sb3IgPSBjb25maWcuY29sb3JzLmNvbnRlbnQ7XG4gIHJldHVybiAoXG4gICAgY29udGVudENvbG9yLm9wZW4gKyAoMCwgX2VzY2FwZUhUTUwuZGVmYXVsdCkodGV4dCkgKyBjb250ZW50Q29sb3IuY2xvc2VcbiAgKTtcbn07XG5cbmV4cG9ydHMucHJpbnRUZXh0ID0gcHJpbnRUZXh0O1xuXG5jb25zdCBwcmludENvbW1lbnQgPSAoY29tbWVudCwgY29uZmlnKSA9PiB7XG4gIGNvbnN0IGNvbW1lbnRDb2xvciA9IGNvbmZpZy5jb2xvcnMuY29tbWVudDtcbiAgcmV0dXJuIChcbiAgICBjb21tZW50Q29sb3Iub3BlbiArXG4gICAgJzwhLS0nICtcbiAgICAoMCwgX2VzY2FwZUhUTUwuZGVmYXVsdCkoY29tbWVudCkgK1xuICAgICctLT4nICtcbiAgICBjb21tZW50Q29sb3IuY2xvc2VcbiAgKTtcbn07IC8vIFNlcGFyYXRlIHRoZSBmdW5jdGlvbnMgdG8gZm9ybWF0IHByb3BzLCBjaGlsZHJlbiwgYW5kIGVsZW1lbnQsXG4vLyBzbyBhIHBsdWdpbiBjb3VsZCBvdmVycmlkZSBhIHBhcnRpY3VsYXIgZnVuY3Rpb24sIGlmIG5lZWRlZC5cbi8vIFRvbyBiYWQsIHNvIHNhZDogdGhlIHRyYWRpdGlvbmFsIChidXQgdW5uZWNlc3NhcnkpIHNwYWNlXG4vLyBpbiBhIHNlbGYtY2xvc2luZyB0YWdDb2xvciByZXF1aXJlcyBhIHNlY29uZCB0ZXN0IG9mIHByaW50ZWRQcm9wcy5cblxuZXhwb3J0cy5wcmludENvbW1lbnQgPSBwcmludENvbW1lbnQ7XG5cbmNvbnN0IHByaW50RWxlbWVudCA9IChcbiAgdHlwZSxcbiAgcHJpbnRlZFByb3BzLFxuICBwcmludGVkQ2hpbGRyZW4sXG4gIGNvbmZpZyxcbiAgaW5kZW50YXRpb25cbikgPT4ge1xuICBjb25zdCB0YWdDb2xvciA9IGNvbmZpZy5jb2xvcnMudGFnO1xuICByZXR1cm4gKFxuICAgIHRhZ0NvbG9yLm9wZW4gK1xuICAgICc8JyArXG4gICAgdHlwZSArXG4gICAgKHByaW50ZWRQcm9wcyAmJlxuICAgICAgdGFnQ29sb3IuY2xvc2UgK1xuICAgICAgICBwcmludGVkUHJvcHMgK1xuICAgICAgICBjb25maWcuc3BhY2luZ091dGVyICtcbiAgICAgICAgaW5kZW50YXRpb24gK1xuICAgICAgICB0YWdDb2xvci5vcGVuKSArXG4gICAgKHByaW50ZWRDaGlsZHJlblxuICAgICAgPyAnPicgK1xuICAgICAgICB0YWdDb2xvci5jbG9zZSArXG4gICAgICAgIHByaW50ZWRDaGlsZHJlbiArXG4gICAgICAgIGNvbmZpZy5zcGFjaW5nT3V0ZXIgK1xuICAgICAgICBpbmRlbnRhdGlvbiArXG4gICAgICAgIHRhZ0NvbG9yLm9wZW4gK1xuICAgICAgICAnPC8nICtcbiAgICAgICAgdHlwZVxuICAgICAgOiAocHJpbnRlZFByb3BzICYmICFjb25maWcubWluID8gJycgOiAnICcpICsgJy8nKSArXG4gICAgJz4nICtcbiAgICB0YWdDb2xvci5jbG9zZVxuICApO1xufTtcblxuZXhwb3J0cy5wcmludEVsZW1lbnQgPSBwcmludEVsZW1lbnQ7XG5cbmNvbnN0IHByaW50RWxlbWVudEFzTGVhZiA9ICh0eXBlLCBjb25maWcpID0+IHtcbiAgY29uc3QgdGFnQ29sb3IgPSBjb25maWcuY29sb3JzLnRhZztcbiAgcmV0dXJuIChcbiAgICB0YWdDb2xvci5vcGVuICtcbiAgICAnPCcgK1xuICAgIHR5cGUgK1xuICAgIHRhZ0NvbG9yLmNsb3NlICtcbiAgICAnIOKApicgK1xuICAgIHRhZ0NvbG9yLm9wZW4gK1xuICAgICcgLz4nICtcbiAgICB0YWdDb2xvci5jbG9zZVxuICApO1xufTtcblxuZXhwb3J0cy5wcmludEVsZW1lbnRBc0xlYWYgPSBwcmludEVsZW1lbnRBc0xlYWY7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy50ZXN0ID0gZXhwb3J0cy5zZXJpYWxpemUgPSBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfbWFya3VwID0gcmVxdWlyZSgnLi9saWIvbWFya3VwJyk7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbmNvbnN0IEVMRU1FTlRfTk9ERSA9IDE7XG5jb25zdCBURVhUX05PREUgPSAzO1xuY29uc3QgQ09NTUVOVF9OT0RFID0gODtcbmNvbnN0IEZSQUdNRU5UX05PREUgPSAxMTtcbmNvbnN0IEVMRU1FTlRfUkVHRVhQID0gL14oKEhUTUx8U1ZHKVxcdyopP0VsZW1lbnQkLztcblxuY29uc3QgdGVzdEhhc0F0dHJpYnV0ZSA9IHZhbCA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWwuaGFzQXR0cmlidXRlID09PSAnZnVuY3Rpb24nICYmIHZhbC5oYXNBdHRyaWJ1dGUoJ2lzJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuY29uc3QgdGVzdE5vZGUgPSB2YWwgPT4ge1xuICBjb25zdCBjb25zdHJ1Y3Rvck5hbWUgPSB2YWwuY29uc3RydWN0b3IubmFtZTtcbiAgY29uc3Qge25vZGVUeXBlLCB0YWdOYW1lfSA9IHZhbDtcbiAgY29uc3QgaXNDdXN0b21FbGVtZW50ID1cbiAgICAodHlwZW9mIHRhZ05hbWUgPT09ICdzdHJpbmcnICYmIHRhZ05hbWUuaW5jbHVkZXMoJy0nKSkgfHxcbiAgICB0ZXN0SGFzQXR0cmlidXRlKHZhbCk7XG4gIHJldHVybiAoXG4gICAgKG5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiZcbiAgICAgIChFTEVNRU5UX1JFR0VYUC50ZXN0KGNvbnN0cnVjdG9yTmFtZSkgfHwgaXNDdXN0b21FbGVtZW50KSkgfHxcbiAgICAobm9kZVR5cGUgPT09IFRFWFRfTk9ERSAmJiBjb25zdHJ1Y3Rvck5hbWUgPT09ICdUZXh0JykgfHxcbiAgICAobm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBjb25zdHJ1Y3Rvck5hbWUgPT09ICdDb21tZW50JykgfHxcbiAgICAobm9kZVR5cGUgPT09IEZSQUdNRU5UX05PREUgJiYgY29uc3RydWN0b3JOYW1lID09PSAnRG9jdW1lbnRGcmFnbWVudCcpXG4gICk7XG59O1xuXG5jb25zdCB0ZXN0ID0gdmFsID0+IHtcbiAgdmFyIF92YWwkY29uc3RydWN0b3I7XG5cbiAgcmV0dXJuIChcbiAgICAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdm9pZCAwXG4gICAgICA/IHZvaWQgMFxuICAgICAgOiAoX3ZhbCRjb25zdHJ1Y3RvciA9IHZhbC5jb25zdHJ1Y3RvcikgPT09IG51bGwgfHxcbiAgICAgICAgX3ZhbCRjb25zdHJ1Y3RvciA9PT0gdm9pZCAwXG4gICAgICA/IHZvaWQgMFxuICAgICAgOiBfdmFsJGNvbnN0cnVjdG9yLm5hbWUpICYmIHRlc3ROb2RlKHZhbClcbiAgKTtcbn07XG5cbmV4cG9ydHMudGVzdCA9IHRlc3Q7XG5cbmZ1bmN0aW9uIG5vZGVJc1RleHQobm9kZSkge1xuICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFO1xufVxuXG5mdW5jdGlvbiBub2RlSXNDb21tZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERTtcbn1cblxuZnVuY3Rpb24gbm9kZUlzRnJhZ21lbnQobm9kZSkge1xuICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gRlJBR01FTlRfTk9ERTtcbn1cblxuY29uc3Qgc2VyaWFsaXplID0gKG5vZGUsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG4gIGlmIChub2RlSXNUZXh0KG5vZGUpKSB7XG4gICAgcmV0dXJuICgwLCBfbWFya3VwLnByaW50VGV4dCkobm9kZS5kYXRhLCBjb25maWcpO1xuICB9XG5cbiAgaWYgKG5vZGVJc0NvbW1lbnQobm9kZSkpIHtcbiAgICByZXR1cm4gKDAsIF9tYXJrdXAucHJpbnRDb21tZW50KShub2RlLmRhdGEsIGNvbmZpZyk7XG4gIH1cblxuICBjb25zdCB0eXBlID0gbm9kZUlzRnJhZ21lbnQobm9kZSlcbiAgICA/IGBEb2N1bWVudEZyYWdtZW50YFxuICAgIDogbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKCsrZGVwdGggPiBjb25maWcubWF4RGVwdGgpIHtcbiAgICByZXR1cm4gKDAsIF9tYXJrdXAucHJpbnRFbGVtZW50QXNMZWFmKSh0eXBlLCBjb25maWcpO1xuICB9XG5cbiAgcmV0dXJuICgwLCBfbWFya3VwLnByaW50RWxlbWVudCkoXG4gICAgdHlwZSxcbiAgICAoMCwgX21hcmt1cC5wcmludFByb3BzKShcbiAgICAgIG5vZGVJc0ZyYWdtZW50KG5vZGUpXG4gICAgICAgID8gW11cbiAgICAgICAgOiBBcnJheS5mcm9tKG5vZGUuYXR0cmlidXRlcylcbiAgICAgICAgICAgIC5tYXAoYXR0ciA9PiBhdHRyLm5hbWUpXG4gICAgICAgICAgICAuc29ydCgpLFxuICAgICAgbm9kZUlzRnJhZ21lbnQobm9kZSlcbiAgICAgICAgPyB7fVxuICAgICAgICA6IEFycmF5LmZyb20obm9kZS5hdHRyaWJ1dGVzKS5yZWR1Y2UoKHByb3BzLCBhdHRyaWJ1dGUpID0+IHtcbiAgICAgICAgICAgIHByb3BzW2F0dHJpYnV0ZS5uYW1lXSA9IGF0dHJpYnV0ZS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBwcm9wcztcbiAgICAgICAgICB9LCB7fSksXG4gICAgICBjb25maWcsXG4gICAgICBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQsXG4gICAgICBkZXB0aCxcbiAgICAgIHJlZnMsXG4gICAgICBwcmludGVyXG4gICAgKSxcbiAgICAoMCwgX21hcmt1cC5wcmludENoaWxkcmVuKShcbiAgICAgIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG5vZGUuY2hpbGROb2RlcyB8fCBub2RlLmNoaWxkcmVuKSxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudCxcbiAgICAgIGRlcHRoLFxuICAgICAgcmVmcyxcbiAgICAgIHByaW50ZXJcbiAgICApLFxuICAgIGNvbmZpZyxcbiAgICBpbmRlbnRhdGlvblxuICApO1xufTtcblxuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5jb25zdCBwbHVnaW4gPSB7XG4gIHNlcmlhbGl6ZSxcbiAgdGVzdFxufTtcbnZhciBfZGVmYXVsdCA9IHBsdWdpbjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudGVzdCA9IGV4cG9ydHMuc2VyaWFsaXplID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2NvbGxlY3Rpb25zID0gcmVxdWlyZSgnLi4vY29sbGVjdGlvbnMnKTtcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuLy8gU0VOVElORUwgY29uc3RhbnRzIGFyZSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9pbW11dGFibGUtanNcbmNvbnN0IElTX0lURVJBQkxFX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfSVRFUkFCTEVfX0BAJztcbmNvbnN0IElTX0xJU1RfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9MSVNUX19AQCc7XG5jb25zdCBJU19LRVlFRF9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX0tFWUVEX19AQCc7XG5jb25zdCBJU19NQVBfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9NQVBfX0BAJztcbmNvbnN0IElTX09SREVSRURfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9PUkRFUkVEX19AQCc7XG5jb25zdCBJU19SRUNPUkRfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9SRUNPUkRfX0BAJzsgLy8gaW1tdXRhYmxlIHY0XG5cbmNvbnN0IElTX1NFUV9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX1NFUV9fQEAnO1xuY29uc3QgSVNfU0VUX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfU0VUX19AQCc7XG5jb25zdCBJU19TVEFDS19TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX1NUQUNLX19AQCc7XG5cbmNvbnN0IGdldEltbXV0YWJsZU5hbWUgPSBuYW1lID0+ICdJbW11dGFibGUuJyArIG5hbWU7XG5cbmNvbnN0IHByaW50QXNMZWFmID0gbmFtZSA9PiAnWycgKyBuYW1lICsgJ10nO1xuXG5jb25zdCBTUEFDRSA9ICcgJztcbmNvbnN0IExBWlkgPSAn4oCmJzsgLy8gU2VxIGlzIGxhenkgaWYgaXQgY2FsbHMgYSBtZXRob2QgbGlrZSBmaWx0ZXJcblxuY29uc3QgcHJpbnRJbW11dGFibGVFbnRyaWVzID0gKFxuICB2YWwsXG4gIGNvbmZpZyxcbiAgaW5kZW50YXRpb24sXG4gIGRlcHRoLFxuICByZWZzLFxuICBwcmludGVyLFxuICB0eXBlXG4pID0+XG4gICsrZGVwdGggPiBjb25maWcubWF4RGVwdGhcbiAgICA/IHByaW50QXNMZWFmKGdldEltbXV0YWJsZU5hbWUodHlwZSkpXG4gICAgOiBnZXRJbW11dGFibGVOYW1lKHR5cGUpICtcbiAgICAgIFNQQUNFICtcbiAgICAgICd7JyArXG4gICAgICAoMCwgX2NvbGxlY3Rpb25zLnByaW50SXRlcmF0b3JFbnRyaWVzKShcbiAgICAgICAgdmFsLmVudHJpZXMoKSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIHJlZnMsXG4gICAgICAgIHByaW50ZXJcbiAgICAgICkgK1xuICAgICAgJ30nOyAvLyBSZWNvcmQgaGFzIGFuIGVudHJpZXMgbWV0aG9kIGJlY2F1c2UgaXQgaXMgYSBjb2xsZWN0aW9uIGluIGltbXV0YWJsZSB2My5cbi8vIFJldHVybiBhbiBpdGVyYXRvciBmb3IgSW1tdXRhYmxlIFJlY29yZCBmcm9tIHZlcnNpb24gdjMgb3IgdjQuXG5cbmZ1bmN0aW9uIGdldFJlY29yZEVudHJpZXModmFsKSB7XG4gIGxldCBpID0gMDtcbiAgcmV0dXJuIHtcbiAgICBuZXh0KCkge1xuICAgICAgaWYgKGkgPCB2YWwuX2tleXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHZhbC5fa2V5c1tpKytdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiBba2V5LCB2YWwuZ2V0KGtleSldXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbmU6IHRydWUsXG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxuXG5jb25zdCBwcmludEltbXV0YWJsZVJlY29yZCA9IChcbiAgdmFsLFxuICBjb25maWcsXG4gIGluZGVudGF0aW9uLFxuICBkZXB0aCxcbiAgcmVmcyxcbiAgcHJpbnRlclxuKSA9PiB7XG4gIC8vIF9uYW1lIHByb3BlcnR5IGlzIGRlZmluZWQgb25seSBmb3IgYW4gSW1tdXRhYmxlIFJlY29yZCBpbnN0YW5jZVxuICAvLyB3aGljaCB3YXMgY29uc3RydWN0ZWQgd2l0aCBhIHNlY29uZCBvcHRpb25hbCBkZXNjcmlwdGl2ZSBuYW1lIGFyZ1xuICBjb25zdCBuYW1lID0gZ2V0SW1tdXRhYmxlTmFtZSh2YWwuX25hbWUgfHwgJ1JlY29yZCcpO1xuICByZXR1cm4gKytkZXB0aCA+IGNvbmZpZy5tYXhEZXB0aFxuICAgID8gcHJpbnRBc0xlYWYobmFtZSlcbiAgICA6IG5hbWUgK1xuICAgICAgICBTUEFDRSArXG4gICAgICAgICd7JyArXG4gICAgICAgICgwLCBfY29sbGVjdGlvbnMucHJpbnRJdGVyYXRvckVudHJpZXMpKFxuICAgICAgICAgIGdldFJlY29yZEVudHJpZXModmFsKSxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgcmVmcyxcbiAgICAgICAgICBwcmludGVyXG4gICAgICAgICkgK1xuICAgICAgICAnfSc7XG59O1xuXG5jb25zdCBwcmludEltbXV0YWJsZVNlcSA9ICh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG4gIGNvbnN0IG5hbWUgPSBnZXRJbW11dGFibGVOYW1lKCdTZXEnKTtcblxuICBpZiAoKytkZXB0aCA+IGNvbmZpZy5tYXhEZXB0aCkge1xuICAgIHJldHVybiBwcmludEFzTGVhZihuYW1lKTtcbiAgfVxuXG4gIGlmICh2YWxbSVNfS0VZRURfU0VOVElORUxdKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIG5hbWUgK1xuICAgICAgU1BBQ0UgK1xuICAgICAgJ3snICsgLy8gZnJvbSBJbW11dGFibGUgY29sbGVjdGlvbiBvZiBlbnRyaWVzIG9yIGZyb20gRUNNQVNjcmlwdCBvYmplY3RcbiAgICAgICh2YWwuX2l0ZXIgfHwgdmFsLl9vYmplY3RcbiAgICAgICAgPyAoMCwgX2NvbGxlY3Rpb25zLnByaW50SXRlcmF0b3JFbnRyaWVzKShcbiAgICAgICAgICAgIHZhbC5lbnRyaWVzKCksXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgcmVmcyxcbiAgICAgICAgICAgIHByaW50ZXJcbiAgICAgICAgICApXG4gICAgICAgIDogTEFaWSkgK1xuICAgICAgJ30nXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgbmFtZSArXG4gICAgU1BBQ0UgK1xuICAgICdbJyArXG4gICAgKHZhbC5faXRlciB8fCAvLyBmcm9tIEltbXV0YWJsZSBjb2xsZWN0aW9uIG9mIHZhbHVlc1xuICAgIHZhbC5fYXJyYXkgfHwgLy8gZnJvbSBFQ01BU2NyaXB0IGFycmF5XG4gICAgdmFsLl9jb2xsZWN0aW9uIHx8IC8vIGZyb20gRUNNQVNjcmlwdCBjb2xsZWN0aW9uIGluIGltbXV0YWJsZSB2NFxuICAgIHZhbC5faXRlcmFibGUgLy8gZnJvbSBFQ01BU2NyaXB0IGNvbGxlY3Rpb24gaW4gaW1tdXRhYmxlIHYzXG4gICAgICA/ICgwLCBfY29sbGVjdGlvbnMucHJpbnRJdGVyYXRvclZhbHVlcykoXG4gICAgICAgICAgdmFsLnZhbHVlcygpLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICByZWZzLFxuICAgICAgICAgIHByaW50ZXJcbiAgICAgICAgKVxuICAgICAgOiBMQVpZKSArXG4gICAgJ10nXG4gICk7XG59O1xuXG5jb25zdCBwcmludEltbXV0YWJsZVZhbHVlcyA9IChcbiAgdmFsLFxuICBjb25maWcsXG4gIGluZGVudGF0aW9uLFxuICBkZXB0aCxcbiAgcmVmcyxcbiAgcHJpbnRlcixcbiAgdHlwZVxuKSA9PlxuICArK2RlcHRoID4gY29uZmlnLm1heERlcHRoXG4gICAgPyBwcmludEFzTGVhZihnZXRJbW11dGFibGVOYW1lKHR5cGUpKVxuICAgIDogZ2V0SW1tdXRhYmxlTmFtZSh0eXBlKSArXG4gICAgICBTUEFDRSArXG4gICAgICAnWycgK1xuICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludEl0ZXJhdG9yVmFsdWVzKShcbiAgICAgICAgdmFsLnZhbHVlcygpLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGluZGVudGF0aW9uLFxuICAgICAgICBkZXB0aCxcbiAgICAgICAgcmVmcyxcbiAgICAgICAgcHJpbnRlclxuICAgICAgKSArXG4gICAgICAnXSc7XG5cbmNvbnN0IHNlcmlhbGl6ZSA9ICh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG4gIGlmICh2YWxbSVNfTUFQX1NFTlRJTkVMXSkge1xuICAgIHJldHVybiBwcmludEltbXV0YWJsZUVudHJpZXMoXG4gICAgICB2YWwsXG4gICAgICBjb25maWcsXG4gICAgICBpbmRlbnRhdGlvbixcbiAgICAgIGRlcHRoLFxuICAgICAgcmVmcyxcbiAgICAgIHByaW50ZXIsXG4gICAgICB2YWxbSVNfT1JERVJFRF9TRU5USU5FTF0gPyAnT3JkZXJlZE1hcCcgOiAnTWFwJ1xuICAgICk7XG4gIH1cblxuICBpZiAodmFsW0lTX0xJU1RfU0VOVElORUxdKSB7XG4gICAgcmV0dXJuIHByaW50SW1tdXRhYmxlVmFsdWVzKFxuICAgICAgdmFsLFxuICAgICAgY29uZmlnLFxuICAgICAgaW5kZW50YXRpb24sXG4gICAgICBkZXB0aCxcbiAgICAgIHJlZnMsXG4gICAgICBwcmludGVyLFxuICAgICAgJ0xpc3QnXG4gICAgKTtcbiAgfVxuXG4gIGlmICh2YWxbSVNfU0VUX1NFTlRJTkVMXSkge1xuICAgIHJldHVybiBwcmludEltbXV0YWJsZVZhbHVlcyhcbiAgICAgIHZhbCxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGluZGVudGF0aW9uLFxuICAgICAgZGVwdGgsXG4gICAgICByZWZzLFxuICAgICAgcHJpbnRlcixcbiAgICAgIHZhbFtJU19PUkRFUkVEX1NFTlRJTkVMXSA/ICdPcmRlcmVkU2V0JyA6ICdTZXQnXG4gICAgKTtcbiAgfVxuXG4gIGlmICh2YWxbSVNfU1RBQ0tfU0VOVElORUxdKSB7XG4gICAgcmV0dXJuIHByaW50SW1tdXRhYmxlVmFsdWVzKFxuICAgICAgdmFsLFxuICAgICAgY29uZmlnLFxuICAgICAgaW5kZW50YXRpb24sXG4gICAgICBkZXB0aCxcbiAgICAgIHJlZnMsXG4gICAgICBwcmludGVyLFxuICAgICAgJ1N0YWNrJ1xuICAgICk7XG4gIH1cblxuICBpZiAodmFsW0lTX1NFUV9TRU5USU5FTF0pIHtcbiAgICByZXR1cm4gcHJpbnRJbW11dGFibGVTZXEodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcik7XG4gIH0gLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBpbW11dGFibGUgdjMgYW5kIHY0LCBsZXQgcmVjb3JkIGJlIHRoZSBkZWZhdWx0LlxuXG4gIHJldHVybiBwcmludEltbXV0YWJsZVJlY29yZCh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKTtcbn07IC8vIEV4cGxpY2l0bHkgY29tcGFyaW5nIHNlbnRpbmVsIHByb3BlcnRpZXMgdG8gdHJ1ZSBhdm9pZHMgZmFsc2UgcG9zaXRpdmVcbi8vIHdoZW4gbW9jayBpZGVudGl0eS1vYmotcHJveHkgcmV0dXJucyB0aGUga2V5IGFzIHRoZSB2YWx1ZSBmb3IgYW55IGtleS5cblxuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5cbmNvbnN0IHRlc3QgPSB2YWwgPT5cbiAgdmFsICYmXG4gICh2YWxbSVNfSVRFUkFCTEVfU0VOVElORUxdID09PSB0cnVlIHx8IHZhbFtJU19SRUNPUkRfU0VOVElORUxdID09PSB0cnVlKTtcblxuZXhwb3J0cy50ZXN0ID0gdGVzdDtcbmNvbnN0IHBsdWdpbiA9IHtcbiAgc2VyaWFsaXplLFxuICB0ZXN0XG59O1xudmFyIF9kZWZhdWx0ID0gcGx1Z2luO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE3LjAuMlxuICogcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO3ZhciBiPTYwMTAzLGM9NjAxMDYsZD02MDEwNyxlPTYwMTA4LGY9NjAxMTQsZz02MDEwOSxoPTYwMTEwLGs9NjAxMTIsbD02MDExMyxtPTYwMTIwLG49NjAxMTUscD02MDExNixxPTYwMTIxLHI9NjAxMjIsdT02MDExNyx2PTYwMTI5LHc9NjAxMzE7XG5pZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yKXt2YXIgeD1TeW1ib2wuZm9yO2I9eChcInJlYWN0LmVsZW1lbnRcIik7Yz14KFwicmVhY3QucG9ydGFsXCIpO2Q9eChcInJlYWN0LmZyYWdtZW50XCIpO2U9eChcInJlYWN0LnN0cmljdF9tb2RlXCIpO2Y9eChcInJlYWN0LnByb2ZpbGVyXCIpO2c9eChcInJlYWN0LnByb3ZpZGVyXCIpO2g9eChcInJlYWN0LmNvbnRleHRcIik7az14KFwicmVhY3QuZm9yd2FyZF9yZWZcIik7bD14KFwicmVhY3Quc3VzcGVuc2VcIik7bT14KFwicmVhY3Quc3VzcGVuc2VfbGlzdFwiKTtuPXgoXCJyZWFjdC5tZW1vXCIpO3A9eChcInJlYWN0LmxhenlcIik7cT14KFwicmVhY3QuYmxvY2tcIik7cj14KFwicmVhY3Quc2VydmVyLmJsb2NrXCIpO3U9eChcInJlYWN0LmZ1bmRhbWVudGFsXCIpO3Y9eChcInJlYWN0LmRlYnVnX3RyYWNlX21vZGVcIik7dz14KFwicmVhY3QubGVnYWN5X2hpZGRlblwiKX1cbmZ1bmN0aW9uIHkoYSl7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSl7dmFyIHQ9YS4kJHR5cGVvZjtzd2l0Y2godCl7Y2FzZSBiOnN3aXRjaChhPWEudHlwZSxhKXtjYXNlIGQ6Y2FzZSBmOmNhc2UgZTpjYXNlIGw6Y2FzZSBtOnJldHVybiBhO2RlZmF1bHQ6c3dpdGNoKGE9YSYmYS4kJHR5cGVvZixhKXtjYXNlIGg6Y2FzZSBrOmNhc2UgcDpjYXNlIG46Y2FzZSBnOnJldHVybiBhO2RlZmF1bHQ6cmV0dXJuIHR9fWNhc2UgYzpyZXR1cm4gdH19fXZhciB6PWcsQT1iLEI9ayxDPWQsRD1wLEU9bixGPWMsRz1mLEg9ZSxJPWw7ZXhwb3J0cy5Db250ZXh0Q29uc3VtZXI9aDtleHBvcnRzLkNvbnRleHRQcm92aWRlcj16O2V4cG9ydHMuRWxlbWVudD1BO2V4cG9ydHMuRm9yd2FyZFJlZj1CO2V4cG9ydHMuRnJhZ21lbnQ9QztleHBvcnRzLkxhenk9RDtleHBvcnRzLk1lbW89RTtleHBvcnRzLlBvcnRhbD1GO2V4cG9ydHMuUHJvZmlsZXI9RztleHBvcnRzLlN0cmljdE1vZGU9SDtcbmV4cG9ydHMuU3VzcGVuc2U9STtleHBvcnRzLmlzQXN5bmNNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuITF9O2V4cG9ydHMuaXNDb25jdXJyZW50TW9kZT1mdW5jdGlvbigpe3JldHVybiExfTtleHBvcnRzLmlzQ29udGV4dENvbnN1bWVyPWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPT09aH07ZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlcj1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PWd9O2V4cG9ydHMuaXNFbGVtZW50PWZ1bmN0aW9uKGEpe3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJmEuJCR0eXBlb2Y9PT1ifTtleHBvcnRzLmlzRm9yd2FyZFJlZj1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PWt9O2V4cG9ydHMuaXNGcmFnbWVudD1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PWR9O2V4cG9ydHMuaXNMYXp5PWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPT09cH07ZXhwb3J0cy5pc01lbW89ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk9PT1ufTtcbmV4cG9ydHMuaXNQb3J0YWw9ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk9PT1jfTtleHBvcnRzLmlzUHJvZmlsZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk9PT1mfTtleHBvcnRzLmlzU3RyaWN0TW9kZT1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PWV9O2V4cG9ydHMuaXNTdXNwZW5zZT1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PWx9O2V4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlPWZ1bmN0aW9uKGEpe3JldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGF8fGE9PT1kfHxhPT09Znx8YT09PXZ8fGE9PT1lfHxhPT09bHx8YT09PW18fGE9PT13fHxcIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiYoYS4kJHR5cGVvZj09PXB8fGEuJCR0eXBlb2Y9PT1ufHxhLiQkdHlwZW9mPT09Z3x8YS4kJHR5cGVvZj09PWh8fGEuJCR0eXBlb2Y9PT1rfHxhLiQkdHlwZW9mPT09dXx8YS4kJHR5cGVvZj09PXF8fGFbMF09PT1yKT8hMDohMX07XG5leHBvcnRzLnR5cGVPZj15O1xuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNy4wLjJcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IDB4ZWFjYTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IDB4ZWFkMjtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IDB4ZWFjZTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IDB4ZWFkOTtcbnZhciBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IDB4ZWFkYTtcbnZhciBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gMHhlYWQ1O1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSAweGVhZDc7XG52YXIgUkVBQ1RfT1BBUVVFX0lEX1RZUEUgPSAweGVhZTA7XG52YXIgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSAweGVhZTE7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSAweGVhZTI7XG52YXIgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gMHhlYWUzO1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yKSB7XG4gIHZhciBzeW1ib2xGb3IgPSBTeW1ib2wuZm9yO1xuICBSRUFDVF9FTEVNRU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbiAgUkVBQ1RfUE9SVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnBvcnRhbCcpO1xuICBSRUFDVF9GUkFHTUVOVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mcmFnbWVudCcpO1xuICBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xuICBSRUFDVF9QUk9GSUxFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm9maWxlcicpO1xuICBSRUFDVF9QUk9WSURFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm92aWRlcicpO1xuICBSRUFDVF9DT05URVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmNvbnRleHQnKTtcbiAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc3VzcGVuc2UnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG4gIFJFQUNUX01FTU9fVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubWVtbycpO1xuICBSRUFDVF9MQVpZX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxhenknKTtcbiAgUkVBQ1RfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuYmxvY2snKTtcbiAgUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNlcnZlci5ibG9jaycpO1xuICBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpO1xuICBSRUFDVF9TQ09QRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zY29wZScpO1xuICBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Qub3BhcXVlLmlkJyk7XG4gIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5kZWJ1Z190cmFjZV9tb2RlJyk7XG4gIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbiAgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5sZWdhY3lfaGlkZGVuJyk7XG59XG5cbi8vIEZpbHRlciBjZXJ0YWluIERPTSBhdHRyaWJ1dGVzIChlLmcuIHNyYywgaHJlZikgaWYgdGhlaXIgdmFsdWVzIGFyZSBlbXB0eSBzdHJpbmdzLlxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS5cblxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgfHwgZW5hYmxlU2NvcGVBUEkgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSB8fCB0eXBlWzBdID09PSBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBvYmplY3QuJCR0eXBlb2Y7XG5cbiAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgdmFyIHR5cGUgPSBvYmplY3QudHlwZTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG52YXIgQ29udGV4dENvbnN1bWVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xudmFyIENvbnRleHRQcm92aWRlciA9IFJFQUNUX1BST1ZJREVSX1RZUEU7XG52YXIgRWxlbWVudCA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcbnZhciBGb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbnZhciBGcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG52YXIgTGF6eSA9IFJFQUNUX0xBWllfVFlQRTtcbnZhciBNZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xudmFyIFBvcnRhbCA9IFJFQUNUX1BPUlRBTF9UWVBFO1xudmFyIFByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbnZhciBTdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbnZhciBTdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSBmYWxzZTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxOCsuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxOCsuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudGVzdCA9IGV4cG9ydHMuc2VyaWFsaXplID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3RJcyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoJ3JlYWN0LWlzJykpO1xuXG52YXIgX21hcmt1cCA9IHJlcXVpcmUoJy4vbGliL21hcmt1cCcpO1xuXG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHtcbiAgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gbnVsbDtcbiAgdmFyIGNhY2hlQmFiZWxJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTtcbiAgdmFyIGNhY2hlTm9kZUludGVyb3AgPSBuZXcgV2Vha01hcCgpO1xuICByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIChub2RlSW50ZXJvcCkge1xuICAgIHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDtcbiAgfSkobm9kZUludGVyb3ApO1xufVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7XG4gIGlmICghbm9kZUludGVyb3AgJiYgb2JqICYmIG9iai5fX2VzTW9kdWxlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBpZiAob2JqID09PSBudWxsIHx8ICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nKSkge1xuICAgIHJldHVybiB7ZGVmYXVsdDogb2JqfTtcbiAgfVxuICB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApO1xuICBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KG9iaik7XG4gIH1cbiAgdmFyIG5ld09iaiA9IHt9O1xuICB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChrZXkgIT09ICdkZWZhdWx0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvclxuICAgICAgICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld09ialtrZXldID0gb2JqW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIG5ld09iai5kZWZhdWx0ID0gb2JqO1xuICBpZiAoY2FjaGUpIHtcbiAgICBjYWNoZS5zZXQob2JqLCBuZXdPYmopO1xuICB9XG4gIHJldHVybiBuZXdPYmo7XG59XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbi8vIEdpdmVuIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIG9yIHN1YnRyZWUgZHVyaW5nIHJlY3Vyc2l2ZSB0cmF2ZXJzYWwsXG4vLyByZXR1cm4gZmxhdHRlbmVkIGFycmF5IG9mIGNoaWxkcmVuLlxuY29uc3QgZ2V0Q2hpbGRyZW4gPSAoYXJnLCBjaGlsZHJlbiA9IFtdKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICBhcmcuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGdldENoaWxkcmVuKGl0ZW0sIGNoaWxkcmVuKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChhcmcgIT0gbnVsbCAmJiBhcmcgIT09IGZhbHNlKSB7XG4gICAgY2hpbGRyZW4ucHVzaChhcmcpO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufTtcblxuY29uc3QgZ2V0VHlwZSA9IGVsZW1lbnQgPT4ge1xuICBjb25zdCB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bic7XG4gIH1cblxuICBpZiAoUmVhY3RJcy5pc0ZyYWdtZW50KGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuICdSZWFjdC5GcmFnbWVudCc7XG4gIH1cblxuICBpZiAoUmVhY3RJcy5pc1N1c3BlbnNlKGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuICdSZWFjdC5TdXNwZW5zZSc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAoUmVhY3RJcy5pc0NvbnRleHRQcm92aWRlcihlbGVtZW50KSkge1xuICAgICAgcmV0dXJuICdDb250ZXh0LlByb3ZpZGVyJztcbiAgICB9XG5cbiAgICBpZiAoUmVhY3RJcy5pc0NvbnRleHRDb25zdW1lcihlbGVtZW50KSkge1xuICAgICAgcmV0dXJuICdDb250ZXh0LkNvbnN1bWVyJztcbiAgICB9XG5cbiAgICBpZiAoUmVhY3RJcy5pc0ZvcndhcmRSZWYoZWxlbWVudCkpIHtcbiAgICAgIGlmICh0eXBlLmRpc3BsYXlOYW1lKSB7XG4gICAgICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSB0eXBlLnJlbmRlci5kaXNwbGF5TmFtZSB8fCB0eXBlLnJlbmRlci5uYW1lIHx8ICcnO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJydcbiAgICAgICAgPyAnRm9yd2FyZFJlZignICsgZnVuY3Rpb25OYW1lICsgJyknXG4gICAgICAgIDogJ0ZvcndhcmRSZWYnO1xuICAgIH1cblxuICAgIGlmIChSZWFjdElzLmlzTWVtbyhlbGVtZW50KSkge1xuICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID1cbiAgICAgICAgdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLnR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS50eXBlLm5hbWUgfHwgJyc7XG4gICAgICByZXR1cm4gZnVuY3Rpb25OYW1lICE9PSAnJyA/ICdNZW1vKCcgKyBmdW5jdGlvbk5hbWUgKyAnKScgOiAnTWVtbyc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICdVTkRFRklORUQnO1xufTtcblxuY29uc3QgZ2V0UHJvcEtleXMgPSBlbGVtZW50ID0+IHtcbiAgY29uc3Qge3Byb3BzfSA9IGVsZW1lbnQ7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwcm9wcylcbiAgICAuZmlsdGVyKGtleSA9PiBrZXkgIT09ICdjaGlsZHJlbicgJiYgcHJvcHNba2V5XSAhPT0gdW5kZWZpbmVkKVxuICAgIC5zb3J0KCk7XG59O1xuXG5jb25zdCBzZXJpYWxpemUgPSAoZWxlbWVudCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+XG4gICsrZGVwdGggPiBjb25maWcubWF4RGVwdGhcbiAgICA/ICgwLCBfbWFya3VwLnByaW50RWxlbWVudEFzTGVhZikoZ2V0VHlwZShlbGVtZW50KSwgY29uZmlnKVxuICAgIDogKDAsIF9tYXJrdXAucHJpbnRFbGVtZW50KShcbiAgICAgICAgZ2V0VHlwZShlbGVtZW50KSxcbiAgICAgICAgKDAsIF9tYXJrdXAucHJpbnRQcm9wcykoXG4gICAgICAgICAgZ2V0UHJvcEtleXMoZWxlbWVudCksXG4gICAgICAgICAgZWxlbWVudC5wcm9wcyxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LFxuICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgIHJlZnMsXG4gICAgICAgICAgcHJpbnRlclxuICAgICAgICApLFxuICAgICAgICAoMCwgX21hcmt1cC5wcmludENoaWxkcmVuKShcbiAgICAgICAgICBnZXRDaGlsZHJlbihlbGVtZW50LnByb3BzLmNoaWxkcmVuKSxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LFxuICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgIHJlZnMsXG4gICAgICAgICAgcHJpbnRlclxuICAgICAgICApLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGluZGVudGF0aW9uXG4gICAgICApO1xuXG5leHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTtcblxuY29uc3QgdGVzdCA9IHZhbCA9PiB2YWwgIT0gbnVsbCAmJiBSZWFjdElzLmlzRWxlbWVudCh2YWwpO1xuXG5leHBvcnRzLnRlc3QgPSB0ZXN0O1xuY29uc3QgcGx1Z2luID0ge1xuICBzZXJpYWxpemUsXG4gIHRlc3Rcbn07XG52YXIgX2RlZmF1bHQgPSBwbHVnaW47XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnRlc3QgPSBleHBvcnRzLnNlcmlhbGl6ZSA9IGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9tYXJrdXAgPSByZXF1aXJlKCcuL2xpYi9tYXJrdXAnKTtcblxudmFyIGdsb2JhbCA9IChmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcztcbiAgfSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBnbG9iYWw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuICB9XG59KSgpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsWydqZXN0LXN5bWJvbC1kby1ub3QtdG91Y2gnXSB8fCBnbG9iYWwuU3ltYm9sO1xuY29uc3QgdGVzdFN5bWJvbCA9XG4gIHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvclxuICAgID8gU3ltYm9sLmZvcigncmVhY3QudGVzdC5qc29uJylcbiAgICA6IDB4ZWE3MTM1NztcblxuY29uc3QgZ2V0UHJvcEtleXMgPSBvYmplY3QgPT4ge1xuICBjb25zdCB7cHJvcHN9ID0gb2JqZWN0O1xuICByZXR1cm4gcHJvcHNcbiAgICA/IE9iamVjdC5rZXlzKHByb3BzKVxuICAgICAgICAuZmlsdGVyKGtleSA9PiBwcm9wc1trZXldICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC5zb3J0KClcbiAgICA6IFtdO1xufTtcblxuY29uc3Qgc2VyaWFsaXplID0gKG9iamVjdCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+XG4gICsrZGVwdGggPiBjb25maWcubWF4RGVwdGhcbiAgICA/ICgwLCBfbWFya3VwLnByaW50RWxlbWVudEFzTGVhZikob2JqZWN0LnR5cGUsIGNvbmZpZylcbiAgICA6ICgwLCBfbWFya3VwLnByaW50RWxlbWVudCkoXG4gICAgICAgIG9iamVjdC50eXBlLFxuICAgICAgICBvYmplY3QucHJvcHNcbiAgICAgICAgICA/ICgwLCBfbWFya3VwLnByaW50UHJvcHMpKFxuICAgICAgICAgICAgICBnZXRQcm9wS2V5cyhvYmplY3QpLFxuICAgICAgICAgICAgICBvYmplY3QucHJvcHMsXG4gICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LFxuICAgICAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICAgICAgcmVmcyxcbiAgICAgICAgICAgICAgcHJpbnRlclxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogJycsXG4gICAgICAgIG9iamVjdC5jaGlsZHJlblxuICAgICAgICAgID8gKDAsIF9tYXJrdXAucHJpbnRDaGlsZHJlbikoXG4gICAgICAgICAgICAgIG9iamVjdC5jaGlsZHJlbixcbiAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQsXG4gICAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgICByZWZzLFxuICAgICAgICAgICAgICBwcmludGVyXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiAnJyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBpbmRlbnRhdGlvblxuICAgICAgKTtcblxuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5cbmNvbnN0IHRlc3QgPSB2YWwgPT4gdmFsICYmIHZhbC4kJHR5cGVvZiA9PT0gdGVzdFN5bWJvbDtcblxuZXhwb3J0cy50ZXN0ID0gdGVzdDtcbmNvbnN0IHBsdWdpbiA9IHtcbiAgc2VyaWFsaXplLFxuICB0ZXN0XG59O1xudmFyIF9kZWZhdWx0ID0gcGx1Z2luO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5ERUZBVUxUX09QVElPTlMgPSB2b2lkIDA7XG5leHBvcnRzLmZvcm1hdCA9IGZvcm1hdDtcbmV4cG9ydHMucGx1Z2lucyA9IHZvaWQgMDtcblxudmFyIF9hbnNpU3R5bGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCdhbnNpLXN0eWxlcycpKTtcblxudmFyIF9jb2xsZWN0aW9ucyA9IHJlcXVpcmUoJy4vY29sbGVjdGlvbnMnKTtcblxudmFyIF9Bc3ltbWV0cmljTWF0Y2hlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoXG4gIHJlcXVpcmUoJy4vcGx1Z2lucy9Bc3ltbWV0cmljTWF0Y2hlcicpXG4pO1xuXG52YXIgX0NvbnZlcnRBbnNpID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL3BsdWdpbnMvQ29udmVydEFuc2knKSk7XG5cbnZhciBfRE9NQ29sbGVjdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9wbHVnaW5zL0RPTUNvbGxlY3Rpb24nKSk7XG5cbnZhciBfRE9NRWxlbWVudCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9wbHVnaW5zL0RPTUVsZW1lbnQnKSk7XG5cbnZhciBfSW1tdXRhYmxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL3BsdWdpbnMvSW1tdXRhYmxlJykpO1xuXG52YXIgX1JlYWN0RWxlbWVudCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9wbHVnaW5zL1JlYWN0RWxlbWVudCcpKTtcblxudmFyIF9SZWFjdFRlc3RDb21wb25lbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KFxuICByZXF1aXJlKCcuL3BsdWdpbnMvUmVhY3RUZXN0Q29tcG9uZW50Jylcbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ZGVmYXVsdDogb2JqfTtcbn1cblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBsb2NhbC9iYW4tdHlwZXMtZXZlbnR1YWxseSAqL1xuY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuY29uc3QgdG9JU09TdHJpbmcgPSBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZztcbmNvbnN0IGVycm9yVG9TdHJpbmcgPSBFcnJvci5wcm90b3R5cGUudG9TdHJpbmc7XG5jb25zdCByZWdFeHBUb1N0cmluZyA9IFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmc7XG4vKipcbiAqIEV4cGxpY2l0bHkgY29tcGFyaW5nIHR5cGVvZiBjb25zdHJ1Y3RvciB0byBmdW5jdGlvbiBhdm9pZHMgdW5kZWZpbmVkIGFzIG5hbWVcbiAqIHdoZW4gbW9jayBpZGVudGl0eS1vYmotcHJveHkgcmV0dXJucyB0aGUga2V5IGFzIHRoZSB2YWx1ZSBmb3IgYW55IGtleS5cbiAqL1xuXG5jb25zdCBnZXRDb25zdHJ1Y3Rvck5hbWUgPSB2YWwgPT5cbiAgKHR5cGVvZiB2YWwuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgJiYgdmFsLmNvbnN0cnVjdG9yLm5hbWUpIHx8ICdPYmplY3QnO1xuLyogZ2xvYmFsIHdpbmRvdyAqL1xuXG4vKiogSXMgdmFsIGlzIGVxdWFsIHRvIGdsb2JhbCB3aW5kb3cgb2JqZWN0PyBXb3JrcyBldmVuIGlmIGl0IGRvZXMgbm90IGV4aXN0IDopICovXG5cbmNvbnN0IGlzV2luZG93ID0gdmFsID0+IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHZhbCA9PT0gd2luZG93O1xuXG5jb25zdCBTWU1CT0xfUkVHRVhQID0gL15TeW1ib2xcXCgoLiopXFwpKC4qKSQvO1xuY29uc3QgTkVXTElORV9SRUdFWFAgPSAvXFxuL2dpO1xuXG5jbGFzcyBQcmV0dHlGb3JtYXRQbHVnaW5FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhY2spIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzVG9TdHJpbmdlZEFycmF5VHlwZSh0b1N0cmluZ2VkKSB7XG4gIHJldHVybiAoXG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgQXJyYXldJyB8fFxuICAgIHRvU3RyaW5nZWQgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScgfHxcbiAgICB0b1N0cmluZ2VkID09PSAnW29iamVjdCBEYXRhVmlld10nIHx8XG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScgfHxcbiAgICB0b1N0cmluZ2VkID09PSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyB8fFxuICAgIHRvU3RyaW5nZWQgPT09ICdbb2JqZWN0IEludDhBcnJheV0nIHx8XG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgSW50MTZBcnJheV0nIHx8XG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgSW50MzJBcnJheV0nIHx8XG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgVWludDhBcnJheV0nIHx8XG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyB8fFxuICAgIHRvU3RyaW5nZWQgPT09ICdbb2JqZWN0IFVpbnQxNkFycmF5XScgfHxcbiAgICB0b1N0cmluZ2VkID09PSAnW29iamVjdCBVaW50MzJBcnJheV0nXG4gICk7XG59XG5cbmZ1bmN0aW9uIHByaW50TnVtYmVyKHZhbCkge1xuICByZXR1cm4gT2JqZWN0LmlzKHZhbCwgLTApID8gJy0wJyA6IFN0cmluZyh2YWwpO1xufVxuXG5mdW5jdGlvbiBwcmludEJpZ0ludCh2YWwpIHtcbiAgcmV0dXJuIFN0cmluZyhgJHt2YWx9bmApO1xufVxuXG5mdW5jdGlvbiBwcmludEZ1bmN0aW9uKHZhbCwgcHJpbnRGdW5jdGlvbk5hbWUpIHtcbiAgaWYgKCFwcmludEZ1bmN0aW9uTmFtZSkge1xuICAgIHJldHVybiAnW0Z1bmN0aW9uXSc7XG4gIH1cblxuICByZXR1cm4gJ1tGdW5jdGlvbiAnICsgKHZhbC5uYW1lIHx8ICdhbm9ueW1vdXMnKSArICddJztcbn1cblxuZnVuY3Rpb24gcHJpbnRTeW1ib2wodmFsKSB7XG4gIHJldHVybiBTdHJpbmcodmFsKS5yZXBsYWNlKFNZTUJPTF9SRUdFWFAsICdTeW1ib2woJDEpJyk7XG59XG5cbmZ1bmN0aW9uIHByaW50RXJyb3IodmFsKSB7XG4gIHJldHVybiAnWycgKyBlcnJvclRvU3RyaW5nLmNhbGwodmFsKSArICddJztcbn1cbi8qKlxuICogVGhlIGZpcnN0IHBvcnQgb2YgY2FsbCBmb3IgcHJpbnRpbmcgYW4gb2JqZWN0LCBoYW5kbGVzIG1vc3Qgb2YgdGhlXG4gKiBkYXRhLXR5cGVzIGluIEpTLlxuICovXG5cbmZ1bmN0aW9uIHByaW50QmFzaWNWYWx1ZSh2YWwsIHByaW50RnVuY3Rpb25OYW1lLCBlc2NhcGVSZWdleCwgZXNjYXBlU3RyaW5nKSB7XG4gIGlmICh2YWwgPT09IHRydWUgfHwgdmFsID09PSBmYWxzZSkge1xuICAgIHJldHVybiAnJyArIHZhbDtcbiAgfVxuXG4gIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgfVxuXG4gIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG5cbiAgY29uc3QgdHlwZU9mID0gdHlwZW9mIHZhbDtcblxuICBpZiAodHlwZU9mID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBwcmludE51bWJlcih2YWwpO1xuICB9XG5cbiAgaWYgKHR5cGVPZiA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gcHJpbnRCaWdJbnQodmFsKTtcbiAgfVxuXG4gIGlmICh0eXBlT2YgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVzY2FwZVN0cmluZykge1xuICAgICAgcmV0dXJuICdcIicgKyB2YWwucmVwbGFjZSgvXCJ8XFxcXC9nLCAnXFxcXCQmJykgKyAnXCInO1xuICAgIH1cblxuICAgIHJldHVybiAnXCInICsgdmFsICsgJ1wiJztcbiAgfVxuXG4gIGlmICh0eXBlT2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gcHJpbnRGdW5jdGlvbih2YWwsIHByaW50RnVuY3Rpb25OYW1lKTtcbiAgfVxuXG4gIGlmICh0eXBlT2YgPT09ICdzeW1ib2wnKSB7XG4gICAgcmV0dXJuIHByaW50U3ltYm9sKHZhbCk7XG4gIH1cblxuICBjb25zdCB0b1N0cmluZ2VkID0gdG9TdHJpbmcuY2FsbCh2YWwpO1xuXG4gIGlmICh0b1N0cmluZ2VkID09PSAnW29iamVjdCBXZWFrTWFwXScpIHtcbiAgICByZXR1cm4gJ1dlYWtNYXAge30nO1xuICB9XG5cbiAgaWYgKHRvU3RyaW5nZWQgPT09ICdbb2JqZWN0IFdlYWtTZXRdJykge1xuICAgIHJldHVybiAnV2Vha1NldCB7fSc7XG4gIH1cblxuICBpZiAoXG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJyB8fFxuICAgIHRvU3RyaW5nZWQgPT09ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSdcbiAgKSB7XG4gICAgcmV0dXJuIHByaW50RnVuY3Rpb24odmFsLCBwcmludEZ1bmN0aW9uTmFtZSk7XG4gIH1cblxuICBpZiAodG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgU3ltYm9sXScpIHtcbiAgICByZXR1cm4gcHJpbnRTeW1ib2wodmFsKTtcbiAgfVxuXG4gIGlmICh0b1N0cmluZ2VkID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICByZXR1cm4gaXNOYU4oK3ZhbCkgPyAnRGF0ZSB7IE5hTiB9JyA6IHRvSVNPU3RyaW5nLmNhbGwodmFsKTtcbiAgfVxuXG4gIGlmICh0b1N0cmluZ2VkID09PSAnW29iamVjdCBFcnJvcl0nKSB7XG4gICAgcmV0dXJuIHByaW50RXJyb3IodmFsKTtcbiAgfVxuXG4gIGlmICh0b1N0cmluZ2VkID09PSAnW29iamVjdCBSZWdFeHBdJykge1xuICAgIGlmIChlc2NhcGVSZWdleCkge1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2JlbmphbWluZ3IvUmVnRXhwLmVzY2FwZS9ibG9iL21haW4vcG9seWZpbGwuanNcbiAgICAgIHJldHVybiByZWdFeHBUb1N0cmluZy5jYWxsKHZhbCkucmVwbGFjZSgvW1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVnRXhwVG9TdHJpbmcuY2FsbCh2YWwpO1xuICB9XG5cbiAgaWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHByaW50RXJyb3IodmFsKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBIYW5kbGVzIG1vcmUgY29tcGxleCBvYmplY3RzICggc3VjaCBhcyBvYmplY3RzIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlcy5cbiAqIG1hcHMgYW5kIHNldHMgZXRjIClcbiAqL1xuXG5mdW5jdGlvbiBwcmludENvbXBsZXhWYWx1ZShcbiAgdmFsLFxuICBjb25maWcsXG4gIGluZGVudGF0aW9uLFxuICBkZXB0aCxcbiAgcmVmcyxcbiAgaGFzQ2FsbGVkVG9KU09OXG4pIHtcbiAgaWYgKHJlZnMuaW5kZXhPZih2YWwpICE9PSAtMSkge1xuICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gIH1cblxuICByZWZzID0gcmVmcy5zbGljZSgpO1xuICByZWZzLnB1c2godmFsKTtcbiAgY29uc3QgaGl0TWF4RGVwdGggPSArK2RlcHRoID4gY29uZmlnLm1heERlcHRoO1xuICBjb25zdCBtaW4gPSBjb25maWcubWluO1xuXG4gIGlmIChcbiAgICBjb25maWcuY2FsbFRvSlNPTiAmJlxuICAgICFoaXRNYXhEZXB0aCAmJlxuICAgIHZhbC50b0pTT04gJiZcbiAgICB0eXBlb2YgdmFsLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICFoYXNDYWxsZWRUb0pTT05cbiAgKSB7XG4gICAgcmV0dXJuIHByaW50ZXIodmFsLnRvSlNPTigpLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgdHJ1ZSk7XG4gIH1cblxuICBjb25zdCB0b1N0cmluZ2VkID0gdG9TdHJpbmcuY2FsbCh2YWwpO1xuXG4gIGlmICh0b1N0cmluZ2VkID09PSAnW29iamVjdCBBcmd1bWVudHNdJykge1xuICAgIHJldHVybiBoaXRNYXhEZXB0aFxuICAgICAgPyAnW0FyZ3VtZW50c10nXG4gICAgICA6IChtaW4gPyAnJyA6ICdBcmd1bWVudHMgJykgK1xuICAgICAgICAgICdbJyArXG4gICAgICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludExpc3RJdGVtcykoXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgcmVmcyxcbiAgICAgICAgICAgIHByaW50ZXJcbiAgICAgICAgICApICtcbiAgICAgICAgICAnXSc7XG4gIH1cblxuICBpZiAoaXNUb1N0cmluZ2VkQXJyYXlUeXBlKHRvU3RyaW5nZWQpKSB7XG4gICAgcmV0dXJuIGhpdE1heERlcHRoXG4gICAgICA/ICdbJyArIHZhbC5jb25zdHJ1Y3Rvci5uYW1lICsgJ10nXG4gICAgICA6IChtaW5cbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiAhY29uZmlnLnByaW50QmFzaWNQcm90b3R5cGUgJiYgdmFsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBcnJheSdcbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiB2YWwuY29uc3RydWN0b3IubmFtZSArICcgJykgK1xuICAgICAgICAgICdbJyArXG4gICAgICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludExpc3RJdGVtcykoXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgcmVmcyxcbiAgICAgICAgICAgIHByaW50ZXJcbiAgICAgICAgICApICtcbiAgICAgICAgICAnXSc7XG4gIH1cblxuICBpZiAodG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgTWFwXScpIHtcbiAgICByZXR1cm4gaGl0TWF4RGVwdGhcbiAgICAgID8gJ1tNYXBdJ1xuICAgICAgOiAnTWFwIHsnICtcbiAgICAgICAgICAoMCwgX2NvbGxlY3Rpb25zLnByaW50SXRlcmF0b3JFbnRyaWVzKShcbiAgICAgICAgICAgIHZhbC5lbnRyaWVzKCksXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgcmVmcyxcbiAgICAgICAgICAgIHByaW50ZXIsXG4gICAgICAgICAgICAnID0+ICdcbiAgICAgICAgICApICtcbiAgICAgICAgICAnfSc7XG4gIH1cblxuICBpZiAodG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgU2V0XScpIHtcbiAgICByZXR1cm4gaGl0TWF4RGVwdGhcbiAgICAgID8gJ1tTZXRdJ1xuICAgICAgOiAnU2V0IHsnICtcbiAgICAgICAgICAoMCwgX2NvbGxlY3Rpb25zLnByaW50SXRlcmF0b3JWYWx1ZXMpKFxuICAgICAgICAgICAgdmFsLnZhbHVlcygpLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICAgIHJlZnMsXG4gICAgICAgICAgICBwcmludGVyXG4gICAgICAgICAgKSArXG4gICAgICAgICAgJ30nO1xuICB9IC8vIEF2b2lkIGZhaWx1cmUgdG8gc2VyaWFsaXplIGdsb2JhbCB3aW5kb3cgb2JqZWN0IGluIGpzZG9tIHRlc3QgZW52aXJvbm1lbnQuXG4gIC8vIEZvciBleGFtcGxlLCBub3QgZXZlbiByZWxldmFudCBpZiB3aW5kb3cgaXMgcHJvcCBvZiBSZWFjdCBlbGVtZW50LlxuXG4gIHJldHVybiBoaXRNYXhEZXB0aCB8fCBpc1dpbmRvdyh2YWwpXG4gICAgPyAnWycgKyBnZXRDb25zdHJ1Y3Rvck5hbWUodmFsKSArICddJ1xuICAgIDogKG1pblxuICAgICAgICA/ICcnXG4gICAgICAgIDogIWNvbmZpZy5wcmludEJhc2ljUHJvdG90eXBlICYmIGdldENvbnN0cnVjdG9yTmFtZSh2YWwpID09PSAnT2JqZWN0J1xuICAgICAgICA/ICcnXG4gICAgICAgIDogZ2V0Q29uc3RydWN0b3JOYW1lKHZhbCkgKyAnICcpICtcbiAgICAgICAgJ3snICtcbiAgICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludE9iamVjdFByb3BlcnRpZXMpKFxuICAgICAgICAgIHZhbCxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgcmVmcyxcbiAgICAgICAgICBwcmludGVyXG4gICAgICAgICkgK1xuICAgICAgICAnfSc7XG59XG5cbmZ1bmN0aW9uIGlzTmV3UGx1Z2luKHBsdWdpbikge1xuICByZXR1cm4gcGx1Z2luLnNlcmlhbGl6ZSAhPSBudWxsO1xufVxuXG5mdW5jdGlvbiBwcmludFBsdWdpbihwbHVnaW4sIHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpIHtcbiAgbGV0IHByaW50ZWQ7XG5cbiAgdHJ5IHtcbiAgICBwcmludGVkID0gaXNOZXdQbHVnaW4ocGx1Z2luKVxuICAgICAgPyBwbHVnaW4uc2VyaWFsaXplKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpXG4gICAgICA6IHBsdWdpbi5wcmludChcbiAgICAgICAgICB2YWwsXG4gICAgICAgICAgdmFsQ2hpbGQgPT4gcHJpbnRlcih2YWxDaGlsZCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpLFxuICAgICAgICAgIHN0ciA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRlbnRhdGlvbk5leHQgPSBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQ7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICBpbmRlbnRhdGlvbk5leHQgK1xuICAgICAgICAgICAgICBzdHIucmVwbGFjZShORVdMSU5FX1JFR0VYUCwgJ1xcbicgKyBpbmRlbnRhdGlvbk5leHQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZWRnZVNwYWNpbmc6IGNvbmZpZy5zcGFjaW5nT3V0ZXIsXG4gICAgICAgICAgICBtaW46IGNvbmZpZy5taW4sXG4gICAgICAgICAgICBzcGFjaW5nOiBjb25maWcuc3BhY2luZ0lubmVyXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb25maWcuY29sb3JzXG4gICAgICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IFByZXR0eUZvcm1hdFBsdWdpbkVycm9yKGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcHJpbnRlZCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgcHJldHR5LWZvcm1hdDogUGx1Z2luIG11c3QgcmV0dXJuIHR5cGUgXCJzdHJpbmdcIiBidXQgaW5zdGVhZCByZXR1cm5lZCBcIiR7dHlwZW9mIHByaW50ZWR9XCIuYFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcHJpbnRlZDtcbn1cblxuZnVuY3Rpb24gZmluZFBsdWdpbihwbHVnaW5zLCB2YWwpIHtcbiAgZm9yIChsZXQgcCA9IDA7IHAgPCBwbHVnaW5zLmxlbmd0aDsgcCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChwbHVnaW5zW3BdLnRlc3QodmFsKSkge1xuICAgICAgICByZXR1cm4gcGx1Z2luc1twXTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IFByZXR0eUZvcm1hdFBsdWdpbkVycm9yKGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcHJpbnRlcih2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBoYXNDYWxsZWRUb0pTT04pIHtcbiAgY29uc3QgcGx1Z2luID0gZmluZFBsdWdpbihjb25maWcucGx1Z2lucywgdmFsKTtcblxuICBpZiAocGx1Z2luICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHByaW50UGx1Z2luKHBsdWdpbiwgdmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcyk7XG4gIH1cblxuICBjb25zdCBiYXNpY1Jlc3VsdCA9IHByaW50QmFzaWNWYWx1ZShcbiAgICB2YWwsXG4gICAgY29uZmlnLnByaW50RnVuY3Rpb25OYW1lLFxuICAgIGNvbmZpZy5lc2NhcGVSZWdleCxcbiAgICBjb25maWcuZXNjYXBlU3RyaW5nXG4gICk7XG5cbiAgaWYgKGJhc2ljUmVzdWx0ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGJhc2ljUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHByaW50Q29tcGxleFZhbHVlKFxuICAgIHZhbCxcbiAgICBjb25maWcsXG4gICAgaW5kZW50YXRpb24sXG4gICAgZGVwdGgsXG4gICAgcmVmcyxcbiAgICBoYXNDYWxsZWRUb0pTT05cbiAgKTtcbn1cblxuY29uc3QgREVGQVVMVF9USEVNRSA9IHtcbiAgY29tbWVudDogJ2dyYXknLFxuICBjb250ZW50OiAncmVzZXQnLFxuICBwcm9wOiAneWVsbG93JyxcbiAgdGFnOiAnY3lhbicsXG4gIHZhbHVlOiAnZ3JlZW4nXG59O1xuY29uc3QgREVGQVVMVF9USEVNRV9LRVlTID0gT2JqZWN0LmtleXMoREVGQVVMVF9USEVNRSk7XG5jb25zdCBERUZBVUxUX09QVElPTlMgPSB7XG4gIGNhbGxUb0pTT046IHRydWUsXG4gIGNvbXBhcmVLZXlzOiB1bmRlZmluZWQsXG4gIGVzY2FwZVJlZ2V4OiBmYWxzZSxcbiAgZXNjYXBlU3RyaW5nOiB0cnVlLFxuICBoaWdobGlnaHQ6IGZhbHNlLFxuICBpbmRlbnQ6IDIsXG4gIG1heERlcHRoOiBJbmZpbml0eSxcbiAgbWluOiBmYWxzZSxcbiAgcGx1Z2luczogW10sXG4gIHByaW50QmFzaWNQcm90b3R5cGU6IHRydWUsXG4gIHByaW50RnVuY3Rpb25OYW1lOiB0cnVlLFxuICB0aGVtZTogREVGQVVMVF9USEVNRVxufTtcbmV4cG9ydHMuREVGQVVMVF9PUFRJT05TID0gREVGQVVMVF9PUFRJT05TO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucykge1xuICBPYmplY3Qua2V5cyhvcHRpb25zKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgaWYgKCFERUZBVUxUX09QVElPTlMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBwcmV0dHktZm9ybWF0OiBVbmtub3duIG9wdGlvbiBcIiR7a2V5fVwiLmApO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKG9wdGlvbnMubWluICYmIG9wdGlvbnMuaW5kZW50ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5pbmRlbnQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAncHJldHR5LWZvcm1hdDogT3B0aW9ucyBcIm1pblwiIGFuZCBcImluZGVudFwiIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyLidcbiAgICApO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudGhlbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChvcHRpb25zLnRoZW1lID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHByZXR0eS1mb3JtYXQ6IE9wdGlvbiBcInRoZW1lXCIgbXVzdCBub3QgYmUgbnVsbC5gKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudGhlbWUgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBwcmV0dHktZm9ybWF0OiBPcHRpb24gXCJ0aGVtZVwiIG11c3QgYmUgb2YgdHlwZSBcIm9iamVjdFwiIGJ1dCBpbnN0ZWFkIHJlY2VpdmVkIFwiJHt0eXBlb2Ygb3B0aW9ucy50aGVtZX1cIi5gXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBnZXRDb2xvcnNIaWdobGlnaHQgPSBvcHRpb25zID0+XG4gIERFRkFVTFRfVEhFTUVfS0VZUy5yZWR1Y2UoKGNvbG9ycywga2V5KSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPVxuICAgICAgb3B0aW9ucy50aGVtZSAmJiBvcHRpb25zLnRoZW1lW2tleV0gIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG9wdGlvbnMudGhlbWVba2V5XVxuICAgICAgICA6IERFRkFVTFRfVEhFTUVba2V5XTtcbiAgICBjb25zdCBjb2xvciA9IHZhbHVlICYmIF9hbnNpU3R5bGVzLmRlZmF1bHRbdmFsdWVdO1xuXG4gICAgaWYgKFxuICAgICAgY29sb3IgJiZcbiAgICAgIHR5cGVvZiBjb2xvci5jbG9zZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgIHR5cGVvZiBjb2xvci5vcGVuID09PSAnc3RyaW5nJ1xuICAgICkge1xuICAgICAgY29sb3JzW2tleV0gPSBjb2xvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgcHJldHR5LWZvcm1hdDogT3B0aW9uIFwidGhlbWVcIiBoYXMgYSBrZXkgXCIke2tleX1cIiB3aG9zZSB2YWx1ZSBcIiR7dmFsdWV9XCIgaXMgdW5kZWZpbmVkIGluIGFuc2ktc3R5bGVzLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbG9ycztcbiAgfSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG5cbmNvbnN0IGdldENvbG9yc0VtcHR5ID0gKCkgPT5cbiAgREVGQVVMVF9USEVNRV9LRVlTLnJlZHVjZSgoY29sb3JzLCBrZXkpID0+IHtcbiAgICBjb2xvcnNba2V5XSA9IHtcbiAgICAgIGNsb3NlOiAnJyxcbiAgICAgIG9wZW46ICcnXG4gICAgfTtcbiAgICByZXR1cm4gY29sb3JzO1xuICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcblxuY29uc3QgZ2V0UHJpbnRGdW5jdGlvbk5hbWUgPSBvcHRpb25zID0+XG4gIG9wdGlvbnMgJiYgb3B0aW9ucy5wcmludEZ1bmN0aW9uTmFtZSAhPT0gdW5kZWZpbmVkXG4gICAgPyBvcHRpb25zLnByaW50RnVuY3Rpb25OYW1lXG4gICAgOiBERUZBVUxUX09QVElPTlMucHJpbnRGdW5jdGlvbk5hbWU7XG5cbmNvbnN0IGdldEVzY2FwZVJlZ2V4ID0gb3B0aW9ucyA9PlxuICBvcHRpb25zICYmIG9wdGlvbnMuZXNjYXBlUmVnZXggIT09IHVuZGVmaW5lZFxuICAgID8gb3B0aW9ucy5lc2NhcGVSZWdleFxuICAgIDogREVGQVVMVF9PUFRJT05TLmVzY2FwZVJlZ2V4O1xuXG5jb25zdCBnZXRFc2NhcGVTdHJpbmcgPSBvcHRpb25zID0+XG4gIG9wdGlvbnMgJiYgb3B0aW9ucy5lc2NhcGVTdHJpbmcgIT09IHVuZGVmaW5lZFxuICAgID8gb3B0aW9ucy5lc2NhcGVTdHJpbmdcbiAgICA6IERFRkFVTFRfT1BUSU9OUy5lc2NhcGVTdHJpbmc7XG5cbmNvbnN0IGdldENvbmZpZyA9IG9wdGlvbnMgPT4ge1xuICB2YXIgX29wdGlvbnMkcHJpbnRCYXNpY1ByO1xuXG4gIHJldHVybiB7XG4gICAgY2FsbFRvSlNPTjpcbiAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5jYWxsVG9KU09OICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBvcHRpb25zLmNhbGxUb0pTT05cbiAgICAgICAgOiBERUZBVUxUX09QVElPTlMuY2FsbFRvSlNPTixcbiAgICBjb2xvcnM6XG4gICAgICBvcHRpb25zICYmIG9wdGlvbnMuaGlnaGxpZ2h0XG4gICAgICAgID8gZ2V0Q29sb3JzSGlnaGxpZ2h0KG9wdGlvbnMpXG4gICAgICAgIDogZ2V0Q29sb3JzRW1wdHkoKSxcbiAgICBjb21wYXJlS2V5czpcbiAgICAgIG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMuY29tcGFyZUtleXMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBvcHRpb25zLmNvbXBhcmVLZXlzXG4gICAgICAgIDogREVGQVVMVF9PUFRJT05TLmNvbXBhcmVLZXlzLFxuICAgIGVzY2FwZVJlZ2V4OiBnZXRFc2NhcGVSZWdleChvcHRpb25zKSxcbiAgICBlc2NhcGVTdHJpbmc6IGdldEVzY2FwZVN0cmluZyhvcHRpb25zKSxcbiAgICBpbmRlbnQ6XG4gICAgICBvcHRpb25zICYmIG9wdGlvbnMubWluXG4gICAgICAgID8gJydcbiAgICAgICAgOiBjcmVhdGVJbmRlbnQoXG4gICAgICAgICAgICBvcHRpb25zICYmIG9wdGlvbnMuaW5kZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBvcHRpb25zLmluZGVudFxuICAgICAgICAgICAgICA6IERFRkFVTFRfT1BUSU9OUy5pbmRlbnRcbiAgICAgICAgICApLFxuICAgIG1heERlcHRoOlxuICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLm1heERlcHRoICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBvcHRpb25zLm1heERlcHRoXG4gICAgICAgIDogREVGQVVMVF9PUFRJT05TLm1heERlcHRoLFxuICAgIG1pbjpcbiAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5taW4gIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubWluIDogREVGQVVMVF9PUFRJT05TLm1pbixcbiAgICBwbHVnaW5zOlxuICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLnBsdWdpbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG9wdGlvbnMucGx1Z2luc1xuICAgICAgICA6IERFRkFVTFRfT1BUSU9OUy5wbHVnaW5zLFxuICAgIHByaW50QmFzaWNQcm90b3R5cGU6XG4gICAgICAoX29wdGlvbnMkcHJpbnRCYXNpY1ByID1cbiAgICAgICAgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDBcbiAgICAgICAgICA/IHZvaWQgMFxuICAgICAgICAgIDogb3B0aW9ucy5wcmludEJhc2ljUHJvdG90eXBlKSAhPT0gbnVsbCAmJlxuICAgICAgX29wdGlvbnMkcHJpbnRCYXNpY1ByICE9PSB2b2lkIDBcbiAgICAgICAgPyBfb3B0aW9ucyRwcmludEJhc2ljUHJcbiAgICAgICAgOiB0cnVlLFxuICAgIHByaW50RnVuY3Rpb25OYW1lOiBnZXRQcmludEZ1bmN0aW9uTmFtZShvcHRpb25zKSxcbiAgICBzcGFjaW5nSW5uZXI6IG9wdGlvbnMgJiYgb3B0aW9ucy5taW4gPyAnICcgOiAnXFxuJyxcbiAgICBzcGFjaW5nT3V0ZXI6IG9wdGlvbnMgJiYgb3B0aW9ucy5taW4gPyAnJyA6ICdcXG4nXG4gIH07XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVJbmRlbnQoaW5kZW50KSB7XG4gIHJldHVybiBuZXcgQXJyYXkoaW5kZW50ICsgMSkuam9pbignICcpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgcHJlc2VudGF0aW9uIHN0cmluZyBvZiB5b3VyIGB2YWxgIG9iamVjdFxuICogQHBhcmFtIHZhbCBhbnkgcG90ZW50aWFsIEphdmFTY3JpcHQgb2JqZWN0XG4gKiBAcGFyYW0gb3B0aW9ucyBDdXN0b20gc2V0dGluZ3NcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXQodmFsLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgaWYgKG9wdGlvbnMucGx1Z2lucykge1xuICAgICAgY29uc3QgcGx1Z2luID0gZmluZFBsdWdpbihvcHRpb25zLnBsdWdpbnMsIHZhbCk7XG5cbiAgICAgIGlmIChwbHVnaW4gIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHByaW50UGx1Z2luKHBsdWdpbiwgdmFsLCBnZXRDb25maWcob3B0aW9ucyksICcnLCAwLCBbXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYmFzaWNSZXN1bHQgPSBwcmludEJhc2ljVmFsdWUoXG4gICAgdmFsLFxuICAgIGdldFByaW50RnVuY3Rpb25OYW1lKG9wdGlvbnMpLFxuICAgIGdldEVzY2FwZVJlZ2V4KG9wdGlvbnMpLFxuICAgIGdldEVzY2FwZVN0cmluZyhvcHRpb25zKVxuICApO1xuXG4gIGlmIChiYXNpY1Jlc3VsdCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBiYXNpY1Jlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBwcmludENvbXBsZXhWYWx1ZSh2YWwsIGdldENvbmZpZyhvcHRpb25zKSwgJycsIDAsIFtdKTtcbn1cblxuY29uc3QgcGx1Z2lucyA9IHtcbiAgQXN5bW1ldHJpY01hdGNoZXI6IF9Bc3ltbWV0cmljTWF0Y2hlci5kZWZhdWx0LFxuICBDb252ZXJ0QW5zaTogX0NvbnZlcnRBbnNpLmRlZmF1bHQsXG4gIERPTUNvbGxlY3Rpb246IF9ET01Db2xsZWN0aW9uLmRlZmF1bHQsXG4gIERPTUVsZW1lbnQ6IF9ET01FbGVtZW50LmRlZmF1bHQsXG4gIEltbXV0YWJsZTogX0ltbXV0YWJsZS5kZWZhdWx0LFxuICBSZWFjdEVsZW1lbnQ6IF9SZWFjdEVsZW1lbnQuZGVmYXVsdCxcbiAgUmVhY3RUZXN0Q29tcG9uZW50OiBfUmVhY3RUZXN0Q29tcG9uZW50LmRlZmF1bHRcbn07XG5leHBvcnRzLnBsdWdpbnMgPSBwbHVnaW5zO1xudmFyIF9kZWZhdWx0ID0gZm9ybWF0O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luIGFzIFByZXR0eUZvcm1hdFBsdWdpbixcbiAgUGx1Z2lucyBhcyBQcmV0dHlGb3JtYXRQbHVnaW5zLFxufSBmcm9tICdwcmV0dHktZm9ybWF0J1xuaW1wb3J0IHtcbiAgcGx1Z2lucyBhcyBwcmV0dHlGb3JtYXRQbHVnaW5zLFxufSBmcm9tICdwcmV0dHktZm9ybWF0J1xuXG5jb25zdCB7XG4gIERPTUNvbGxlY3Rpb24sXG4gIERPTUVsZW1lbnQsXG4gIEltbXV0YWJsZSxcbiAgUmVhY3RFbGVtZW50LFxuICBSZWFjdFRlc3RDb21wb25lbnQsXG4gIEFzeW1tZXRyaWNNYXRjaGVyLFxufSA9IHByZXR0eUZvcm1hdFBsdWdpbnNcblxubGV0IFBMVUdJTlM6IFByZXR0eUZvcm1hdFBsdWdpbnMgPSBbXG4gIFJlYWN0VGVzdENvbXBvbmVudCxcbiAgUmVhY3RFbGVtZW50LFxuICBET01FbGVtZW50LFxuICBET01Db2xsZWN0aW9uLFxuICBJbW11dGFibGUsXG4gIEFzeW1tZXRyaWNNYXRjaGVyLFxuICAvLyBUT0RPOiB3cml0ZSBzaW5vbiBtb2NrIHNlcmlhbGl6ZXJcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2plc3QvYmxvYi80ZWI0ZjZhNTliNmVhZTBlMDViOGU1MWRkOGNkM2ZkY2ExYzdhZmYxL3BhY2thZ2VzL2plc3Qtc25hcHNob3Qvc3JjL21vY2tTZXJpYWxpemVyLnRzI0w0XG5dXG5cbi8vIFRPRE86IGV4cG9zZSB0aGVzZSBhbmQgYWxsb3cgdXNlciB0byBhZGQgY3VzdG9tIHNlcmlhbGl6ZXJzXG4vLyBQcmVwZW5kIHRvIGxpc3Qgc28gdGhlIGxhc3QgYWRkZWQgaXMgdGhlIGZpcnN0IHRlc3RlZC5cbmV4cG9ydCBjb25zdCBhZGRTZXJpYWxpemVyID0gKHBsdWdpbjogUHJldHR5Rm9ybWF0UGx1Z2luKTogdm9pZCA9PiB7XG4gIFBMVUdJTlMgPSBbcGx1Z2luXS5jb25jYXQoUExVR0lOUylcbn1cblxuZXhwb3J0IGNvbnN0IGdldFNlcmlhbGl6ZXJzID0gKCk6IFByZXR0eUZvcm1hdFBsdWdpbnMgPT4gUExVR0lOU1xuIiwiLypcbkNvcHlyaWdodCAoYykgMjAwOC0yMDE2IFBpdm90YWwgTGFic1xuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcbmEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG53aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG5kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbnBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0b1xudGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG5OT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFXG5MSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OXG5PRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT05cbldJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4qL1xuXG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gJy4uLy4uL3V0aWxzJ1xuaW1wb3J0IHR5cGUgeyBUZXN0ZXIgfSBmcm9tICcuL3R5cGVzJ1xuXG4vLyBFeHRyYWN0ZWQgb3V0IG9mIGphc21pbmUgMi41LjJcbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoXG4gIGE6IHVua25vd24sXG4gIGI6IHVua25vd24sXG4gIGN1c3RvbVRlc3RlcnM/OiBBcnJheTxUZXN0ZXI+LFxuICBzdHJpY3RDaGVjaz86IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgY3VzdG9tVGVzdGVycyA9IGN1c3RvbVRlc3RlcnMgfHwgW11cbiAgcmV0dXJuIGVxKGEsIGIsIFtdLCBbXSwgY3VzdG9tVGVzdGVycywgc3RyaWN0Q2hlY2sgPyBoYXNLZXkgOiBoYXNEZWZpbmVkS2V5KVxufVxuXG5jb25zdCBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FzeW1tZXRyaWMob2JqOiBhbnkpIHtcbiAgcmV0dXJuICEhb2JqICYmIGlzQSgnRnVuY3Rpb24nLCBvYmouYXN5bW1ldHJpY01hdGNoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzQXN5bW1ldHJpYyhvYmo6IGFueSwgc2VlbiA9IG5ldyBTZXQoKSk6IGJvb2xlYW4ge1xuICBpZiAoc2Vlbi5oYXMob2JqKSlcbiAgICByZXR1cm4gZmFsc2VcbiAgc2Vlbi5hZGQob2JqKVxuICBpZiAoaXNBc3ltbWV0cmljKG9iaikpXG4gICAgcmV0dXJuIHRydWVcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSlcbiAgICByZXR1cm4gb2JqLnNvbWUoaSA9PiBoYXNBc3ltbWV0cmljKGksIHNlZW4pKVxuICBpZiAob2JqIGluc3RhbmNlb2YgU2V0KVxuICAgIHJldHVybiBBcnJheS5mcm9tKG9iaikuc29tZShpID0+IGhhc0FzeW1tZXRyaWMoaSwgc2VlbikpXG4gIGlmIChpc09iamVjdChvYmopKVxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKG9iaikuc29tZSh2ID0+IGhhc0FzeW1tZXRyaWModiwgc2VlbikpXG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBhc3ltbWV0cmljTWF0Y2goYTogYW55LCBiOiBhbnkpIHtcbiAgY29uc3QgYXN5bW1ldHJpY0EgPSBpc0FzeW1tZXRyaWMoYSlcbiAgY29uc3QgYXN5bW1ldHJpY0IgPSBpc0FzeW1tZXRyaWMoYilcblxuICBpZiAoYXN5bW1ldHJpY0EgJiYgYXN5bW1ldHJpY0IpXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGlmIChhc3ltbWV0cmljQSlcbiAgICByZXR1cm4gYS5hc3ltbWV0cmljTWF0Y2goYilcblxuICBpZiAoYXN5bW1ldHJpY0IpXG4gICAgcmV0dXJuIGIuYXN5bW1ldHJpY01hdGNoKGEpXG59XG5cbi8vIEVxdWFsaXR5IGZ1bmN0aW9uIGxvdmluZ2x5IGFkYXB0ZWQgZnJvbSBpc0VxdWFsIGluXG4vLyAgIFtVbmRlcnNjb3JlXShodHRwOi8vdW5kZXJzY29yZWpzLm9yZylcbmZ1bmN0aW9uIGVxKFxuICBhOiBhbnksXG4gIGI6IGFueSxcbiAgYVN0YWNrOiBBcnJheTx1bmtub3duPixcbiAgYlN0YWNrOiBBcnJheTx1bmtub3duPixcbiAgY3VzdG9tVGVzdGVyczogQXJyYXk8VGVzdGVyPixcbiAgaGFzS2V5OiBhbnksXG4pOiBib29sZWFuIHtcbiAgbGV0IHJlc3VsdCA9IHRydWVcblxuICBjb25zdCBhc3ltbWV0cmljUmVzdWx0ID0gYXN5bW1ldHJpY01hdGNoKGEsIGIpXG4gIGlmIChhc3ltbWV0cmljUmVzdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGFzeW1tZXRyaWNSZXN1bHRcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGN1c3RvbVRlc3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjdXN0b21UZXN0ZXJSZXN1bHQgPSBjdXN0b21UZXN0ZXJzW2ldKGEsIGIpXG4gICAgaWYgKGN1c3RvbVRlc3RlclJlc3VsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIGN1c3RvbVRlc3RlclJlc3VsdFxuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBFcnJvciAmJiBiIGluc3RhbmNlb2YgRXJyb3IpXG4gICAgcmV0dXJuIGEubWVzc2FnZSA9PT0gYi5tZXNzYWdlXG5cbiAgaWYgKE9iamVjdC5pcyhhLCBiKSlcbiAgICByZXR1cm4gdHJ1ZVxuXG4gIC8vIEEgc3RyaWN0IGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5IGJlY2F1c2UgYG51bGwgPT0gdW5kZWZpbmVkYC5cbiAgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbClcbiAgICByZXR1cm4gYSA9PT0gYlxuXG4gIGNvbnN0IGNsYXNzTmFtZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKVxuICBpZiAoY2xhc3NOYW1lICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYikpXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICBjYXNlICdbb2JqZWN0IEJvb2xlYW5dJzpcbiAgICBjYXNlICdbb2JqZWN0IFN0cmluZ10nOlxuICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG4gICAgICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSB7XG4gICAgICAgIC8vIE9uZSBpcyBhIHByaW1pdGl2ZSwgb25lIGEgYG5ldyBQcmltaXRpdmUoKWBcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIGJvdGggYXJlIHByb3BlciBwcmltaXRpdmVzXG4gICAgICAgIHJldHVybiBPYmplY3QuaXMoYSwgYilcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBib3RoIGFyZSBgbmV3IFByaW1pdGl2ZSgpYHNcbiAgICAgICAgcmV0dXJuIE9iamVjdC5pcyhhLnZhbHVlT2YoKSwgYi52YWx1ZU9mKCkpXG4gICAgICB9XG4gICAgY2FzZSAnW29iamVjdCBEYXRlXSc6XG4gICAgICAvLyBDb2VyY2UgZGF0ZXMgdG8gbnVtZXJpYyBwcmltaXRpdmUgdmFsdWVzLiBEYXRlcyBhcmUgY29tcGFyZWQgYnkgdGhlaXJcbiAgICAgIC8vIG1pbGxpc2Vjb25kIHJlcHJlc2VudGF0aW9ucy4gTm90ZSB0aGF0IGludmFsaWQgZGF0ZXMgd2l0aCBtaWxsaXNlY29uZCByZXByZXNlbnRhdGlvbnNcbiAgICAgIC8vIG9mIGBOYU5gIGFyZSBub3QgZXF1aXZhbGVudC5cbiAgICAgIHJldHVybiArYSA9PT0gK2JcbiAgICAvLyBSZWdFeHBzIGFyZSBjb21wYXJlZCBieSB0aGVpciBzb3VyY2UgcGF0dGVybnMgYW5kIGZsYWdzLlxuICAgIGNhc2UgJ1tvYmplY3QgUmVnRXhwXSc6XG4gICAgICByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3NcbiAgfVxuICBpZiAodHlwZW9mIGEgIT09ICdvYmplY3QnIHx8IHR5cGVvZiBiICE9PSAnb2JqZWN0JylcbiAgICByZXR1cm4gZmFsc2VcblxuICAvLyBVc2UgRE9NMyBtZXRob2QgaXNFcXVhbE5vZGUgKElFPj05KVxuICBpZiAoaXNEb21Ob2RlKGEpICYmIGlzRG9tTm9kZShiKSlcbiAgICByZXR1cm4gYS5pc0VxdWFsTm9kZShiKVxuXG4gIC8vIFVzZWQgdG8gZGV0ZWN0IGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4gIGxldCBsZW5ndGggPSBhU3RhY2subGVuZ3RoXG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIC8vIExpbmVhciBzZWFyY2guIFBlcmZvcm1hbmNlIGlzIGludmVyc2VseSBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZlxuICAgIC8vIHVuaXF1ZSBuZXN0ZWQgc3RydWN0dXJlcy5cbiAgICAvLyBjaXJjdWxhciByZWZlcmVuY2VzIGF0IHNhbWUgZGVwdGggYXJlIGVxdWFsXG4gICAgLy8gY2lyY3VsYXIgcmVmZXJlbmNlIGlzIG5vdCBlcXVhbCB0byBub24tY2lyY3VsYXIgb25lXG4gICAgaWYgKGFTdGFja1tsZW5ndGhdID09PSBhKVxuICAgICAgcmV0dXJuIGJTdGFja1tsZW5ndGhdID09PSBiXG5cbiAgICBlbHNlIGlmIChiU3RhY2tbbGVuZ3RoXSA9PT0gYilcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG4gIC8vIEFkZCB0aGUgZmlyc3Qgb2JqZWN0IHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgYVN0YWNrLnB1c2goYSlcbiAgYlN0YWNrLnB1c2goYilcbiAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIGFuZCBhcnJheXMuXG4gIC8vIENvbXBhcmUgYXJyYXkgbGVuZ3RocyB0byBkZXRlcm1pbmUgaWYgYSBkZWVwIGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5LlxuICBpZiAoY2xhc3NOYW1lID09PSAnW29iamVjdCBBcnJheV0nICYmIGEubGVuZ3RoICE9PSBiLmxlbmd0aClcbiAgICByZXR1cm4gZmFsc2VcblxuICAvLyBEZWVwIGNvbXBhcmUgb2JqZWN0cy5cbiAgY29uc3QgYUtleXMgPSBrZXlzKGEsIGhhc0tleSlcbiAgbGV0IGtleVxuICBsZXQgc2l6ZSA9IGFLZXlzLmxlbmd0aFxuXG4gIC8vIEVuc3VyZSB0aGF0IGJvdGggb2JqZWN0cyBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBwcm9wZXJ0aWVzIGJlZm9yZSBjb21wYXJpbmcgZGVlcCBlcXVhbGl0eS5cbiAgaWYgKGtleXMoYiwgaGFzS2V5KS5sZW5ndGggIT09IHNpemUpXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgd2hpbGUgKHNpemUtLSkge1xuICAgIGtleSA9IGFLZXlzW3NpemVdXG5cbiAgICAvLyBEZWVwIGNvbXBhcmUgZWFjaCBtZW1iZXJcbiAgICByZXN1bHRcbiAgICAgID0gaGFzS2V5KGIsIGtleSlcbiAgICAgICYmIGVxKGFba2V5XSwgYltrZXldLCBhU3RhY2ssIGJTdGFjaywgY3VzdG9tVGVzdGVycywgaGFzS2V5KVxuXG4gICAgaWYgKCFyZXN1bHQpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxuICAvLyBSZW1vdmUgdGhlIGZpcnN0IG9iamVjdCBmcm9tIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgYVN0YWNrLnBvcCgpXG4gIGJTdGFjay5wb3AoKVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24ga2V5cyhvYmo6IG9iamVjdCwgaGFzS2V5OiAob2JqOiBvYmplY3QsIGtleTogc3RyaW5nKSA9PiBib29sZWFuKSB7XG4gIGNvbnN0IGtleXMgPSBbXVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKGhhc0tleShvYmosIGtleSkpXG4gICAgICBrZXlzLnB1c2goa2V5KVxuICB9XG4gIHJldHVybiBrZXlzLmNvbmNhdChcbiAgICAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmopIGFzIEFycmF5PGFueT4pLmZpbHRlcihcbiAgICAgIHN5bWJvbCA9PlxuICAgICAgICAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHN5bWJvbCkgYXMgUHJvcGVydHlEZXNjcmlwdG9yKVxuICAgICAgICAgIC5lbnVtZXJhYmxlLFxuICAgICksXG4gIClcbn1cblxuZnVuY3Rpb24gaGFzRGVmaW5lZEtleShvYmo6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGhhc0tleShvYmosIGtleSkgJiYgb2JqW2tleV0gIT09IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBoYXNLZXkob2JqOiBhbnksIGtleTogc3RyaW5nKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0EodHlwZU5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkodmFsdWUpID09PSBgW29iamVjdCAke3R5cGVOYW1lfV1gXG59XG5cbmZ1bmN0aW9uIGlzRG9tTm9kZShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIG9iaiAhPT0gbnVsbFxuICAgICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSA9PT0gJ251bWJlcidcbiAgICAmJiB0eXBlb2Ygb2JqLm5vZGVOYW1lID09PSAnc3RyaW5nJ1xuICAgICYmIHR5cGVvZiBvYmouaXNFcXVhbE5vZGUgPT09ICdmdW5jdGlvbidcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm5OYW1lRm9yKGZ1bmM6IEZ1bmN0aW9uKSB7XG4gIGlmIChmdW5jLm5hbWUpXG4gICAgcmV0dXJuIGZ1bmMubmFtZVxuXG4gIGNvbnN0IG1hdGNoZXMgPSBmdW5jdGlvblRvU3RyaW5nXG4gICAgLmNhbGwoZnVuYylcbiAgICAubWF0Y2goL14oPzphc3luYyk/XFxzKmZ1bmN0aW9uXFxzKlxcKj9cXHMqKFtcXHckXSspXFxzKlxcKC8pXG4gIHJldHVybiBtYXRjaGVzID8gbWF0Y2hlc1sxXSA6ICc8YW5vbnltb3VzPidcbn1cblxuZnVuY3Rpb24gZ2V0UHJvdG90eXBlKG9iajogb2JqZWN0KSB7XG4gIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YpXG4gICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopXG5cbiAgaWYgKG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IG9iailcbiAgICByZXR1cm4gbnVsbFxuXG4gIHJldHVybiBvYmouY29uc3RydWN0b3IucHJvdG90eXBlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNQcm9wZXJ0eShvYmo6IG9iamVjdCB8IG51bGwsIHByb3BlcnR5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFvYmopXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3BlcnR5KSlcbiAgICByZXR1cm4gdHJ1ZVxuXG4gIHJldHVybiBoYXNQcm9wZXJ0eShnZXRQcm90b3R5cGUob2JqKSwgcHJvcGVydHkpXG59XG5cbi8vIFNFTlRJTkVMIGNvbnN0YW50cyBhcmUgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svaW1tdXRhYmxlLWpzXG5jb25zdCBJU19LRVlFRF9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX0tFWUVEX19AQCdcbmNvbnN0IElTX1NFVF9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX1NFVF9fQEAnXG5jb25zdCBJU19PUkRFUkVEX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfT1JERVJFRF9fQEAnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ltbXV0YWJsZVVub3JkZXJlZEtleWVkKG1heWJlS2V5ZWQ6IGFueSkge1xuICByZXR1cm4gISEoXG4gICAgbWF5YmVLZXllZFxuICAgICYmIG1heWJlS2V5ZWRbSVNfS0VZRURfU0VOVElORUxdXG4gICAgJiYgIW1heWJlS2V5ZWRbSVNfT1JERVJFRF9TRU5USU5FTF1cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbW11dGFibGVVbm9yZGVyZWRTZXQobWF5YmVTZXQ6IGFueSkge1xuICByZXR1cm4gISEoXG4gICAgbWF5YmVTZXRcbiAgICAmJiBtYXliZVNldFtJU19TRVRfU0VOVElORUxdXG4gICAgJiYgIW1heWJlU2V0W0lTX09SREVSRURfU0VOVElORUxdXG4gIClcbn1cblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKi9cbmNvbnN0IEl0ZXJhdG9yU3ltYm9sID0gU3ltYm9sLml0ZXJhdG9yXG5cbmNvbnN0IGhhc0l0ZXJhdG9yID0gKG9iamVjdDogYW55KSA9PlxuICAhIShvYmplY3QgIT0gbnVsbCAmJiBvYmplY3RbSXRlcmF0b3JTeW1ib2xdKVxuXG5leHBvcnQgY29uc3QgaXRlcmFibGVFcXVhbGl0eSA9IChcbiAgYTogYW55LFxuICBiOiBhbnksXG4gIGFTdGFjazogQXJyYXk8YW55PiA9IFtdLFxuICBiU3RhY2s6IEFycmF5PGFueT4gPSBbXSxcbik6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoXG4gICAgdHlwZW9mIGEgIT09ICdvYmplY3QnXG4gICAgfHwgdHlwZW9mIGIgIT09ICdvYmplY3QnXG4gICAgfHwgQXJyYXkuaXNBcnJheShhKVxuICAgIHx8IEFycmF5LmlzQXJyYXkoYilcbiAgICB8fCAhaGFzSXRlcmF0b3IoYSlcbiAgICB8fCAhaGFzSXRlcmF0b3IoYilcbiAgKVxuICAgIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcilcbiAgICByZXR1cm4gZmFsc2VcblxuICBsZXQgbGVuZ3RoID0gYVN0YWNrLmxlbmd0aFxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAvLyBMaW5lYXIgc2VhcmNoLiBQZXJmb3JtYW5jZSBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2ZcbiAgICAvLyB1bmlxdWUgbmVzdGVkIHN0cnVjdHVyZXMuXG4gICAgLy8gY2lyY3VsYXIgcmVmZXJlbmNlcyBhdCBzYW1lIGRlcHRoIGFyZSBlcXVhbFxuICAgIC8vIGNpcmN1bGFyIHJlZmVyZW5jZSBpcyBub3QgZXF1YWwgdG8gbm9uLWNpcmN1bGFyIG9uZVxuICAgIGlmIChhU3RhY2tbbGVuZ3RoXSA9PT0gYSlcbiAgICAgIHJldHVybiBiU3RhY2tbbGVuZ3RoXSA9PT0gYlxuICB9XG4gIGFTdGFjay5wdXNoKGEpXG4gIGJTdGFjay5wdXNoKGIpXG5cbiAgY29uc3QgaXRlcmFibGVFcXVhbGl0eVdpdGhTdGFjayA9IChhOiBhbnksIGI6IGFueSkgPT5cbiAgICBpdGVyYWJsZUVxdWFsaXR5KGEsIGIsIFsuLi5hU3RhY2tdLCBbLi4uYlN0YWNrXSlcblxuICBpZiAoYS5zaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBlbHNlIGlmIChpc0EoJ1NldCcsIGEpIHx8IGlzSW1tdXRhYmxlVW5vcmRlcmVkU2V0KGEpKSB7XG4gICAgICBsZXQgYWxsRm91bmQgPSB0cnVlXG4gICAgICBmb3IgKGNvbnN0IGFWYWx1ZSBvZiBhKSB7XG4gICAgICAgIGlmICghYi5oYXMoYVZhbHVlKSkge1xuICAgICAgICAgIGxldCBoYXMgPSBmYWxzZVxuICAgICAgICAgIGZvciAoY29uc3QgYlZhbHVlIG9mIGIpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzRXF1YWwgPSBlcXVhbHMoYVZhbHVlLCBiVmFsdWUsIFtpdGVyYWJsZUVxdWFsaXR5V2l0aFN0YWNrXSlcbiAgICAgICAgICAgIGlmIChpc0VxdWFsID09PSB0cnVlKVxuICAgICAgICAgICAgICBoYXMgPSB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGFsbEZvdW5kID0gZmFsc2VcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IHZhbHVlIGZyb20gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCB2YWx1ZXMuXG4gICAgICBhU3RhY2sucG9wKClcbiAgICAgIGJTdGFjay5wb3AoKVxuICAgICAgcmV0dXJuIGFsbEZvdW5kXG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQSgnTWFwJywgYSkgfHwgaXNJbW11dGFibGVVbm9yZGVyZWRLZXllZChhKSkge1xuICAgICAgbGV0IGFsbEZvdW5kID0gdHJ1ZVxuICAgICAgZm9yIChjb25zdCBhRW50cnkgb2YgYSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWIuaGFzKGFFbnRyeVswXSlcbiAgICAgICAgICB8fCAhZXF1YWxzKGFFbnRyeVsxXSwgYi5nZXQoYUVudHJ5WzBdKSwgW2l0ZXJhYmxlRXF1YWxpdHlXaXRoU3RhY2tdKVxuICAgICAgICApIHtcbiAgICAgICAgICBsZXQgaGFzID0gZmFsc2VcbiAgICAgICAgICBmb3IgKGNvbnN0IGJFbnRyeSBvZiBiKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkS2V5ID0gZXF1YWxzKGFFbnRyeVswXSwgYkVudHJ5WzBdLCBbXG4gICAgICAgICAgICAgIGl0ZXJhYmxlRXF1YWxpdHlXaXRoU3RhY2ssXG4gICAgICAgICAgICBdKVxuXG4gICAgICAgICAgICBsZXQgbWF0Y2hlZFZhbHVlID0gZmFsc2VcbiAgICAgICAgICAgIGlmIChtYXRjaGVkS2V5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIG1hdGNoZWRWYWx1ZSA9IGVxdWFscyhhRW50cnlbMV0sIGJFbnRyeVsxXSwgW1xuICAgICAgICAgICAgICAgIGl0ZXJhYmxlRXF1YWxpdHlXaXRoU3RhY2ssXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hlZFZhbHVlID09PSB0cnVlKVxuICAgICAgICAgICAgICBoYXMgPSB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGFsbEZvdW5kID0gZmFsc2VcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IHZhbHVlIGZyb20gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCB2YWx1ZXMuXG4gICAgICBhU3RhY2sucG9wKClcbiAgICAgIGJTdGFjay5wb3AoKVxuICAgICAgcmV0dXJuIGFsbEZvdW5kXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYkl0ZXJhdG9yID0gYltJdGVyYXRvclN5bWJvbF0oKVxuXG4gIGZvciAoY29uc3QgYVZhbHVlIG9mIGEpIHtcbiAgICBjb25zdCBuZXh0QiA9IGJJdGVyYXRvci5uZXh0KClcbiAgICBpZiAoXG4gICAgICBuZXh0Qi5kb25lXG4gICAgICB8fCAhZXF1YWxzKGFWYWx1ZSwgbmV4dEIudmFsdWUsIFtpdGVyYWJsZUVxdWFsaXR5V2l0aFN0YWNrXSlcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBpZiAoIWJJdGVyYXRvci5uZXh0KCkuZG9uZSlcbiAgICByZXR1cm4gZmFsc2VcblxuICAvLyBSZW1vdmUgdGhlIGZpcnN0IHZhbHVlIGZyb20gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCB2YWx1ZXMuXG4gIGFTdGFjay5wb3AoKVxuICBiU3RhY2sucG9wKClcbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYGhhc093blByb3BlcnR5KG9iamVjdCwga2V5KWAgdXAgdGhlIHByb3RvdHlwZSBjaGFpbiwgc3RvcHBpbmcgYXQgYE9iamVjdC5wcm90b3R5cGVgLlxuICovXG5jb25zdCBoYXNQcm9wZXJ0eUluT2JqZWN0ID0gKG9iamVjdDogb2JqZWN0LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBzaG91bGRUZXJtaW5hdGVcbiAgICA9ICFvYmplY3QgfHwgdHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcgfHwgb2JqZWN0ID09PSBPYmplY3QucHJvdG90eXBlXG5cbiAgaWYgKHNob3VsZFRlcm1pbmF0ZSlcbiAgICByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gKFxuICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSlcbiAgICB8fCBoYXNQcm9wZXJ0eUluT2JqZWN0KE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpLCBrZXkpXG4gIClcbn1cblxuY29uc3QgaXNPYmplY3RXaXRoS2V5cyA9IChhOiBhbnkpID0+XG4gIGlzT2JqZWN0KGEpXG4gICYmICEoYSBpbnN0YW5jZW9mIEVycm9yKVxuICAmJiAhKGEgaW5zdGFuY2VvZiBBcnJheSlcbiAgJiYgIShhIGluc3RhbmNlb2YgRGF0ZSlcblxuZXhwb3J0IGNvbnN0IHN1YnNldEVxdWFsaXR5ID0gKFxuICBvYmplY3Q6IHVua25vd24sXG4gIHN1YnNldDogdW5rbm93bixcbik6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4ge1xuICAvLyBzdWJzZXRFcXVhbGl0eSBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoZSByZWZlcmVuY2VzXG4gIC8vIGl0IGhhcyBhbHJlYWR5IHZpc2l0ZWQgdG8gYXZvaWQgaW5maW5pdGUgbG9vcHMgaW4gY2FzZVxuICAvLyB0aGVyZSBhcmUgY2lyY3VsYXIgcmVmZXJlbmNlcyBpbiB0aGUgc3Vic2V0IHBhc3NlZCB0byBpdC5cbiAgY29uc3Qgc3Vic2V0RXF1YWxpdHlXaXRoQ29udGV4dFxuICAgID0gKHNlZW5SZWZlcmVuY2VzOiBXZWFrTWFwPG9iamVjdCwgYm9vbGVhbj4gPSBuZXcgV2Vha01hcCgpKSA9PlxuICAgICAgKG9iamVjdDogYW55LCBzdWJzZXQ6IGFueSk6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICBpZiAoIWlzT2JqZWN0V2l0aEtleXMoc3Vic2V0KSlcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHN1YnNldCkuZXZlcnkoKGtleSkgPT4ge1xuICAgICAgICAgIGlmIChpc09iamVjdFdpdGhLZXlzKHN1YnNldFtrZXldKSkge1xuICAgICAgICAgICAgaWYgKHNlZW5SZWZlcmVuY2VzLmhhcyhzdWJzZXRba2V5XSkpXG4gICAgICAgICAgICAgIHJldHVybiBlcXVhbHMob2JqZWN0W2tleV0sIHN1YnNldFtrZXldLCBbaXRlcmFibGVFcXVhbGl0eV0pXG5cbiAgICAgICAgICAgIHNlZW5SZWZlcmVuY2VzLnNldChzdWJzZXRba2V5XSwgdHJ1ZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzdWx0XG4gICAgICAgICAgPSBvYmplY3QgIT0gbnVsbFxuICAgICAgICAgICYmIGhhc1Byb3BlcnR5SW5PYmplY3Qob2JqZWN0LCBrZXkpXG4gICAgICAgICAgJiYgZXF1YWxzKG9iamVjdFtrZXldLCBzdWJzZXRba2V5XSwgW1xuICAgICAgICAgICAgaXRlcmFibGVFcXVhbGl0eSxcbiAgICAgICAgICAgIHN1YnNldEVxdWFsaXR5V2l0aENvbnRleHQoc2VlblJlZmVyZW5jZXMpLFxuICAgICAgICAgIF0pXG4gICAgICAgICAgLy8gVGhlIG1haW4gZ29hbCBvZiB1c2luZyBzZWVuUmVmZXJlbmNlIGlzIHRvIGF2b2lkIGNpcmN1bGFyIG5vZGUgb24gdHJlZS5cbiAgICAgICAgICAvLyBJdCB3aWxsIG9ubHkgaGFwcGVuIHdpdGhpbiBhIHBhcmVudCBhbmQgaXRzIGNoaWxkLCBub3QgYSBub2RlIGFuZCBub2RlcyBuZXh0IHRvIGl0IChzYW1lIGxldmVsKVxuICAgICAgICAgIC8vIFdlIHNob3VsZCBrZWVwIHRoZSByZWZlcmVuY2UgZm9yIGEgcGFyZW50IGFuZCBpdHMgY2hpbGQgb25seVxuICAgICAgICAgIC8vIFRodXMgd2Ugc2hvdWxkIGRlbGV0ZSB0aGUgcmVmZXJlbmNlIGltbWVkaWF0ZWx5IHNvIHRoYXQgaXQgZG9lc24ndCBpbnRlcmZlcmVcbiAgICAgICAgICAvLyBvdGhlciBub2RlcyB3aXRoaW4gdGhlIHNhbWUgbGV2ZWwgb24gdHJlZS5cbiAgICAgICAgICBzZWVuUmVmZXJlbmNlcy5kZWxldGUoc3Vic2V0W2tleV0pXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gIHJldHVybiBzdWJzZXRFcXVhbGl0eVdpdGhDb250ZXh0KCkob2JqZWN0LCBzdWJzZXQpXG59XG5cbmV4cG9ydCBjb25zdCB0eXBlRXF1YWxpdHkgPSAoYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwgfHwgYS5jb25zdHJ1Y3RvciA9PT0gYi5jb25zdHJ1Y3RvcilcbiAgICByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCBhcnJheUJ1ZmZlckVxdWFsaXR5ID0gKFxuICBhOiB1bmtub3duLFxuICBiOiB1bmtub3duLFxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghKGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgIShiIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKVxuICAgIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBkYXRhVmlld0EgPSBuZXcgRGF0YVZpZXcoYSlcbiAgY29uc3QgZGF0YVZpZXdCID0gbmV3IERhdGFWaWV3KGIpXG5cbiAgLy8gQnVmZmVycyBhcmUgbm90IGVxdWFsIHdoZW4gdGhleSBkbyBub3QgaGF2ZSB0aGUgc2FtZSBieXRlIGxlbmd0aFxuICBpZiAoZGF0YVZpZXdBLmJ5dGVMZW5ndGggIT09IGRhdGFWaWV3Qi5ieXRlTGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZVxuXG4gIC8vIENoZWNrIGlmIGV2ZXJ5IGJ5dGUgdmFsdWUgaXMgZXF1YWwgdG8gZWFjaCBvdGhlclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFWaWV3QS5ieXRlTGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZGF0YVZpZXdBLmdldFVpbnQ4KGkpICE9PSBkYXRhVmlld0IuZ2V0VWludDgoaSkpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBzcGFyc2VBcnJheUVxdWFsaXR5ID0gKFxuICBhOiB1bmtub3duLFxuICBiOiB1bmtub3duLFxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhKSB8fCAhQXJyYXkuaXNBcnJheShiKSlcbiAgICByZXR1cm4gdW5kZWZpbmVkXG5cbiAgLy8gQSBzcGFyc2UgYXJyYXkgWywgLCAxXSB3aWxsIGhhdmUga2V5cyBbXCIyXCJdIHdoZXJlYXMgW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAxXSB3aWxsIGhhdmUga2V5cyBbXCIwXCIsIFwiMVwiLCBcIjJcIl1cbiAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhhKVxuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpXG4gIHJldHVybiAoXG4gICAgZXF1YWxzKGEsIGIsIFtpdGVyYWJsZUVxdWFsaXR5LCB0eXBlRXF1YWxpdHldLCB0cnVlKSAmJiBlcXVhbHMoYUtleXMsIGJLZXlzKVxuICApXG59XG4iLCJpbXBvcnQgdHlwZSB7IEVuaGFuY2VkU3B5IH0gZnJvbSAnLi4vamVzdC1tb2NrJ1xuaW1wb3J0IHsgaXNNb2NrRnVuY3Rpb24gfSBmcm9tICcuLi9qZXN0LW1vY2snXG5pbXBvcnQgeyBhZGRTZXJpYWxpemVyIH0gZnJvbSAnLi4vc25hcHNob3QvcG9ydC9wbHVnaW5zJ1xuaW1wb3J0IHR5cGUgeyBDaGFpUGx1Z2luLCBNYXRjaGVyU3RhdGUgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgYXJyYXlCdWZmZXJFcXVhbGl0eSwgZXF1YWxzIGFzIGFzeW1tZXRyaWNFcXVhbHMsIGhhc0FzeW1tZXRyaWMsIGl0ZXJhYmxlRXF1YWxpdHksIHNwYXJzZUFycmF5RXF1YWxpdHksIHR5cGVFcXVhbGl0eSB9IGZyb20gJy4vamVzdC11dGlscydcblxuY29uc3QgTUFUQ0hFUlNfT0JKRUNUID0gU3ltYm9sLmZvcignbWF0Y2hlcnMtb2JqZWN0JylcblxuaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZ2xvYmFsLCBNQVRDSEVSU19PQkpFQ1QpKSB7XG4gIGNvbnN0IGRlZmF1bHRTdGF0ZTogUGFydGlhbDxNYXRjaGVyU3RhdGU+ID0ge1xuICAgIGFzc2VydGlvbkNhbGxzOiAwLFxuICAgIGlzRXhwZWN0aW5nQXNzZXJ0aW9uczogZmFsc2UsXG4gICAgaXNFeHBlY3RpbmdBc3NlcnRpb25zRXJyb3I6IG51bGwsXG4gICAgZXhwZWN0ZWRBc3NlcnRpb25zTnVtYmVyOiBudWxsLFxuICAgIGV4cGVjdGVkQXNzZXJ0aW9uc051bWJlckVycm9yOiBudWxsLFxuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWwsIE1BVENIRVJTX09CSkVDVCwge1xuICAgIHZhbHVlOiB7XG4gICAgICBzdGF0ZTogZGVmYXVsdFN0YXRlLFxuICAgIH0sXG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCBnZXRTdGF0ZSA9IDxTdGF0ZSBleHRlbmRzIE1hdGNoZXJTdGF0ZSA9IE1hdGNoZXJTdGF0ZT4oKTogU3RhdGUgPT5cbiAgKGdsb2JhbCBhcyBhbnkpW01BVENIRVJTX09CSkVDVF0uc3RhdGVcblxuZXhwb3J0IGNvbnN0IHNldFN0YXRlID0gPFN0YXRlIGV4dGVuZHMgTWF0Y2hlclN0YXRlID0gTWF0Y2hlclN0YXRlPihcbiAgc3RhdGU6IFBhcnRpYWw8U3RhdGU+LFxuKTogdm9pZCA9PiB7XG4gIE9iamVjdC5hc3NpZ24oKGdsb2JhbCBhcyBhbnkpW01BVENIRVJTX09CSkVDVF0uc3RhdGUsIHN0YXRlKVxufVxuXG4vLyBKZXN0IEV4cGVjdCBDb21wYWN0XG5leHBvcnQgY29uc3QgSmVzdENoYWlFeHBlY3Q6IENoYWlQbHVnaW4gPSAoY2hhaSwgdXRpbHMpID0+IHtcbiAgZnVuY3Rpb24gZGVmKG5hbWU6IGtleW9mIENoYWkuQXNzZXJ0aW9uIHwgKGtleW9mIENoYWkuQXNzZXJ0aW9uKVtdLCBmbjogKCh0aGlzOiBDaGFpLkFzc2VydGlvblN0YXRpYyAmIENoYWkuQXNzZXJ0aW9uLCAuLi5hcmdzOiBhbnlbXSkgPT4gYW55KSkge1xuICAgIGNvbnN0IGFkZE1ldGhvZCA9IChuOiBrZXlvZiBDaGFpLkFzc2VydGlvbikgPT4ge1xuICAgICAgdXRpbHMuYWRkTWV0aG9kKGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgbiwgZm4pXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmFtZSkpXG4gICAgICBuYW1lLmZvckVhY2gobiA9PiBhZGRNZXRob2QobikpXG5cbiAgICBlbHNlXG4gICAgICBhZGRNZXRob2QobmFtZSlcbiAgfVxuXG4gIC8vIHdlIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBgLmVxdWFsYCwga2VlcCBvcmlnaW5hbCBgLmNoYWlFcXVhbGAgaW4gY2FzZSBuZWVkXG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgY29uc3QgY2hhaUVxdWFsID0gY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLmVxdWFsXG4gIGRlZignY2hhaUVxdWFsJywgZnVuY3Rpb24oLi4uYXJnczogYW55W10pIHtcbiAgICByZXR1cm4gY2hhaUVxdWFsLmFwcGx5KHRoaXMsIGFyZ3MpXG4gIH0pXG5cbiAgOyhbJ3Rocm93JywgJ3Rocm93cycsICdUaHJvdyddIGFzIGNvbnN0KS5mb3JFYWNoKChtKSA9PiB7XG4gICAgdXRpbHMub3ZlcndyaXRlTWV0aG9kKGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgbSwgKF9zdXBlcjogYW55KSA9PiB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odGhpczogQ2hhaS5Bc3NlcnRpb24gJiBDaGFpLkFzc2VydGlvblN0YXRpYywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHV0aWxzLmZsYWcodGhpcywgJ3Byb21pc2UnKVxuICAgICAgICBjb25zdCBvYmplY3QgPSB1dGlscy5mbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgICBpZiAocHJvbWlzZSA9PT0gJ3JlamVjdHMnKSB7XG4gICAgICAgICAgdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgb2JqZWN0XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJncylcbiAgICAgIH1cbiAgICB9KVxuICB9KVxuXG4gIC8vIG92ZXJyaWRlcyBgLmVxdWFsYCBhbmQgYC5lcWxgIHRvIHByb3ZpZGUgY3VzdG9tIGFzc2VydGlvbiBmb3IgYXN5bW1ldHJpYyBlcXVhbGl0eVxuICB1dGlscy5vdmVyd3JpdGVNZXRob2QoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCAnZXF1YWwnLCAoX3N1cGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gZnVuY3Rpb24odGhpczogQ2hhaS5Bc3NlcnRpb24gJiBDaGFpLkFzc2VydGlvblN0YXRpYywgLi4uYXJnczogYW55W10pIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gYXJnc1swXVxuICAgICAgY29uc3QgYWN0dWFsID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgIGlmIChoYXNBc3ltbWV0cmljKGV4cGVjdGVkKSkge1xuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBhc3ltbWV0cmljRXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIHVuZGVmaW5lZCwgdHJ1ZSksXG4gICAgICAgICAgJ25vdCBtYXRjaCB3aXRoICN7YWN0fScsXG4gICAgICAgICAgJ3Nob3VsZCBub3QgbWF0Y2ggd2l0aCAje2FjdH0nLFxuICAgICAgICAgIGFjdHVhbCxcbiAgICAgICAgICBleHBlY3RlZCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgdXRpbHMub3ZlcndyaXRlTWV0aG9kKGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgJ2VxbCcsIChfc3VwZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiBmdW5jdGlvbih0aGlzOiBDaGFpLkFzc2VydGlvbiAmIENoYWkuQXNzZXJ0aW9uU3RhdGljLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBhcmdzWzBdXG4gICAgICBjb25zdCBhY3R1YWwgPSB1dGlscy5mbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgaWYgKGhhc0FzeW1tZXRyaWMoZXhwZWN0ZWQpKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGFzeW1tZXRyaWNFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCksXG4gICAgICAgICAgJ25vdCBtYXRjaCB3aXRoICN7ZXhwfScsXG4gICAgICAgICAgJ3Nob3VsZCBub3QgbWF0Y2ggd2l0aCAje2V4cH0nLFxuICAgICAgICAgIGV4cGVjdGVkLFxuICAgICAgICAgIGFjdHVhbCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBkZWYoJ3RvRXF1YWwnLCBmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIHJldHVybiB0aGlzLmVxbChleHBlY3RlZClcbiAgfSlcblxuICBkZWYoJ3RvU3RyaWN0RXF1YWwnLCBmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIGNvbnN0IG9iaiA9IHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgY29uc3QgZXF1YWwgPSBhc3ltbWV0cmljRXF1YWxzKFxuICAgICAgb2JqLFxuICAgICAgZXhwZWN0ZWQsXG4gICAgICBbXG4gICAgICAgIGl0ZXJhYmxlRXF1YWxpdHksXG4gICAgICAgIHR5cGVFcXVhbGl0eSxcbiAgICAgICAgc3BhcnNlQXJyYXlFcXVhbGl0eSxcbiAgICAgICAgYXJyYXlCdWZmZXJFcXVhbGl0eSxcbiAgICAgIF0sXG4gICAgICB0cnVlLFxuICAgIClcblxuICAgIHJldHVybiB0aGlzLmFzc2VydChcbiAgICAgIGVxdWFsLFxuICAgICAgJ2V4cGVjdGVkICN7dGhpc30gdG8gc3RyaWN0bHkgZXF1YWwgI3tleHB9JyxcbiAgICAgICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBzdHJpY3RseSBlcXVhbCAje2V4cH0nLFxuICAgICAgZXhwZWN0ZWQsXG4gICAgICBvYmosXG4gICAgKVxuICB9KVxuICBkZWYoJ3RvQmUnLCBmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIHJldHVybiB0aGlzLmVxdWFsKGV4cGVjdGVkKVxuICB9KVxuICBkZWYoJ3RvTWF0Y2hPYmplY3QnLCBmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5TdWJzZXQoZXhwZWN0ZWQpXG4gIH0pXG4gIGRlZigndG9NYXRjaCcsIGZ1bmN0aW9uKGV4cGVjdGVkOiBzdHJpbmcgfCBSZWdFeHApIHtcbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJylcbiAgICAgIHJldHVybiB0aGlzLmluY2x1ZGUoZXhwZWN0ZWQpXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHRoaXMubWF0Y2goZXhwZWN0ZWQpXG4gIH0pXG4gIGRlZigndG9Db250YWluJywgZnVuY3Rpb24oaXRlbSkge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW4oaXRlbSlcbiAgfSlcbiAgZGVmKCd0b0NvbnRhaW5FcXVhbCcsIGZ1bmN0aW9uKGV4cGVjdGVkKSB7XG4gICAgY29uc3Qgb2JqID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICBjb25zdCBpbmRleCA9IEFycmF5LmZyb20ob2JqKS5maW5kSW5kZXgoKGl0ZW0pID0+IHtcbiAgICAgIHJldHVybiBhc3ltbWV0cmljRXF1YWxzKGl0ZW0sIGV4cGVjdGVkKVxuICAgIH0pXG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGluZGV4ICE9PSAtMSxcbiAgICAgICdleHBlY3RlZCAje3RoaXN9IHRvIGRlZXAgZXF1YWxseSBjb250YWluICN7ZXhwfScsXG4gICAgICAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgZGVlcCBlcXVhbGx5IGNvbnRhaW4gI3tleHB9JyxcbiAgICAgIGV4cGVjdGVkLFxuICAgIClcbiAgfSlcbiAgZGVmKCd0b0JlVHJ1dGh5JywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgb2JqID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIEJvb2xlYW4ob2JqKSxcbiAgICAgICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIHRydXRoeScsXG4gICAgICAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgdHJ1dGh5JyxcbiAgICAgIG9iaixcbiAgICApXG4gIH0pXG4gIGRlZigndG9CZUZhbHN5JywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgb2JqID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICFvYmosXG4gICAgICAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBmYWxzeScsXG4gICAgICAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgZmFsc3knLFxuICAgICAgb2JqLFxuICAgIClcbiAgfSlcbiAgZGVmKCd0b0JlR3JlYXRlclRoYW4nLCBmdW5jdGlvbihleHBlY3RlZDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMudG8uZ3JlYXRlclRoYW4oZXhwZWN0ZWQpXG4gIH0pXG4gIGRlZigndG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCcsIGZ1bmN0aW9uKGV4cGVjdGVkOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy50by5ncmVhdGVyVGhhbk9yRXF1YWwoZXhwZWN0ZWQpXG4gIH0pXG4gIGRlZigndG9CZUxlc3NUaGFuJywgZnVuY3Rpb24oZXhwZWN0ZWQ6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLnRvLmxlc3NUaGFuKGV4cGVjdGVkKVxuICB9KVxuICBkZWYoJ3RvQmVMZXNzVGhhbk9yRXF1YWwnLCBmdW5jdGlvbihleHBlY3RlZDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMudG8ubGVzc1RoYW5PckVxdWFsKGV4cGVjdGVkKVxuICB9KVxuICBkZWYoJ3RvQmVOYU4nLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5iZS5OYU5cbiAgfSlcbiAgZGVmKCd0b0JlVW5kZWZpbmVkJywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYmUudW5kZWZpbmVkXG4gIH0pXG4gIGRlZigndG9CZU51bGwnLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5iZS5udWxsXG4gIH0pXG4gIGRlZigndG9CZURlZmluZWQnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBuZWdhdGUgPSB1dGlscy5mbGFnKHRoaXMsICduZWdhdGUnKVxuICAgIHV0aWxzLmZsYWcodGhpcywgJ25lZ2F0ZScsIGZhbHNlKVxuXG4gICAgaWYgKG5lZ2F0ZSlcbiAgICAgIHJldHVybiB0aGlzLmJlLnVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHRoaXMubm90LmJlLnVuZGVmaW5lZFxuICB9KVxuICBkZWYoJ3RvQmVJbnN0YW5jZU9mJywgZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZU9mKG9iailcbiAgfSlcbiAgZGVmKCd0b0hhdmVMZW5ndGgnLCBmdW5jdGlvbihsZW5ndGg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmhhdmUubGVuZ3RoKGxlbmd0aClcbiAgfSlcbiAgLy8gZGVzdHJ1Y3R1cmluZywgYmVjYXVzZSBpdCBjaGVja3MgYGFyZ3VtZW50c2AgaW5zaWRlLCBhbmQgdmFsdWUgaXMgcGFzc2luZyBhcyBgdW5kZWZpbmVkYFxuICBkZWYoJ3RvSGF2ZVByb3BlcnR5JywgZnVuY3Rpb24oLi4uYXJnczogW3Byb3BlcnR5OiBzdHJpbmcsIHZhbHVlPzogYW55XSkge1xuICAgIHJldHVybiB0aGlzLmhhdmUuZGVlcC5uZXN0ZWQucHJvcGVydHkoLi4uYXJncylcbiAgfSlcbiAgZGVmKCd0b0JlQ2xvc2VUbycsIGZ1bmN0aW9uKHJlY2VpdmVkOiBudW1iZXIsIHByZWNpc2lvbiA9IDIpIHtcbiAgICBjb25zdCBleHBlY3RlZCA9IHRoaXMuX29ialxuICAgIGxldCBwYXNzID0gZmFsc2VcbiAgICBsZXQgZXhwZWN0ZWREaWZmID0gMFxuICAgIGxldCByZWNlaXZlZERpZmYgPSAwXG5cbiAgICBpZiAocmVjZWl2ZWQgPT09IEluZmluaXR5ICYmIGV4cGVjdGVkID09PSBJbmZpbml0eSkge1xuICAgICAgcGFzcyA9IHRydWVcbiAgICB9XG4gICAgZWxzZSBpZiAocmVjZWl2ZWQgPT09IC1JbmZpbml0eSAmJiBleHBlY3RlZCA9PT0gLUluZmluaXR5KSB7XG4gICAgICBwYXNzID0gdHJ1ZVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGV4cGVjdGVkRGlmZiA9IE1hdGgucG93KDEwLCAtcHJlY2lzaW9uKSAvIDJcbiAgICAgIHJlY2VpdmVkRGlmZiA9IE1hdGguYWJzKGV4cGVjdGVkIC0gcmVjZWl2ZWQpXG4gICAgICBwYXNzID0gcmVjZWl2ZWREaWZmIDwgZXhwZWN0ZWREaWZmXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFzc2VydChcbiAgICAgIHBhc3MsXG4gICAgICBgZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBjbG9zZSB0byAje2V4cH0sIHJlY2lldmVkIGRpZmZlcmVuY2UgaXMgJHtyZWNlaXZlZERpZmZ9LCBidXQgZXhwZWN0ZWQgJHtleHBlY3RlZERpZmZ9YCxcbiAgICAgIGBleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBjbG9zZSB0byAje2V4cH0sIHJlY2lldmVkIGRpZmZlcmVuY2UgaXMgJHtyZWNlaXZlZERpZmZ9LCBidXQgZXhwZWN0ZWQgJHtleHBlY3RlZERpZmZ9YCxcbiAgICAgIHJlY2VpdmVkLFxuICAgICAgZXhwZWN0ZWQsXG4gICAgKVxuICB9KVxuXG4gIGNvbnN0IGFzc2VydElzTW9jayA9IChhc3NlcnRpb246IGFueSkgPT4ge1xuICAgIGlmICghaXNNb2NrRnVuY3Rpb24oYXNzZXJ0aW9uLl9vYmopKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt1dGlscy5pbnNwZWN0KGFzc2VydGlvbi5fb2JqKX0gaXMgbm90IGEgc3B5IG9yIGEgY2FsbCB0byBhIHNweSFgKVxuICB9XG4gIGNvbnN0IGdldFNweSA9IChhc3NlcnRpb246IGFueSkgPT4ge1xuICAgIGFzc2VydElzTW9jayhhc3NlcnRpb24pXG4gICAgcmV0dXJuIGFzc2VydGlvbi5fb2JqIGFzIEVuaGFuY2VkU3B5XG4gIH1cbiAgZGVmKFsndG9IYXZlQmVlbkNhbGxlZFRpbWVzJywgJ3RvQmVDYWxsZWRUaW1lcyddLCBmdW5jdGlvbihudW1iZXI6IG51bWJlcikge1xuICAgIGNvbnN0IHNweSA9IGdldFNweSh0aGlzKVxuICAgIGNvbnN0IHNweU5hbWUgPSBzcHkuZ2V0TW9ja05hbWUoKVxuICAgIGNvbnN0IGNhbGxDb3VudCA9IHNweS5tb2NrLmNhbGxzLmxlbmd0aFxuICAgIHJldHVybiB0aGlzLmFzc2VydChcbiAgICAgIGNhbGxDb3VudCA9PT0gbnVtYmVyLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIGJlIGNhbGxlZCAje2V4cH0gdGltZXNgLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIG5vdCBiZSBjYWxsZWQgI3tleHB9IHRpbWVzYCxcbiAgICAgIG51bWJlcixcbiAgICAgIGNhbGxDb3VudCxcbiAgICApXG4gIH0pXG4gIGRlZigndG9IYXZlQmVlbkNhbGxlZE9uY2UnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzcHkgPSBnZXRTcHkodGhpcylcbiAgICBjb25zdCBzcHlOYW1lID0gc3B5LmdldE1vY2tOYW1lKClcbiAgICBjb25zdCBjYWxsQ291bnQgPSBzcHkubW9jay5jYWxscy5sZW5ndGhcbiAgICByZXR1cm4gdGhpcy5hc3NlcnQoXG4gICAgICBjYWxsQ291bnQgPT09IDEsXG4gICAgICBgZXhwZWN0ZWQgXCIke3NweU5hbWV9XCIgdG8gYmUgY2FsbGVkIG9uY2VgLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIG5vdCBiZSBjYWxsZWQgb25jZWAsXG4gICAgICAxLFxuICAgICAgY2FsbENvdW50LFxuICAgIClcbiAgfSlcbiAgZGVmKFsndG9IYXZlQmVlbkNhbGxlZCcsICd0b0JlQ2FsbGVkJ10sIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHNweSA9IGdldFNweSh0aGlzKVxuICAgIGNvbnN0IHNweU5hbWUgPSBzcHkuZ2V0TW9ja05hbWUoKVxuICAgIGNvbnN0IGNhbGxlZCA9IHNweS5tb2NrLmNhbGxzLmxlbmd0aCA+IDBcbiAgICByZXR1cm4gdGhpcy5hc3NlcnQoXG4gICAgICBjYWxsZWQsXG4gICAgICBgZXhwZWN0ZWQgXCIke3NweU5hbWV9XCIgdG8gYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2VgLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIG5vdCBiZSBjYWxsZWQgYXQgYWxsYCxcbiAgICAgIHRydWUsXG4gICAgICBjYWxsZWQsXG4gICAgKVxuICB9KVxuICBkZWYoWyd0b0hhdmVCZWVuQ2FsbGVkV2l0aCcsICd0b0JlQ2FsbGVkV2l0aCddLCBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgY29uc3Qgc3B5ID0gZ2V0U3B5KHRoaXMpXG4gICAgY29uc3Qgc3B5TmFtZSA9IHNweS5nZXRNb2NrTmFtZSgpXG4gICAgY29uc3QgcGFzcyA9IHNweS5tb2NrLmNhbGxzLnNvbWUoY2FsbEFyZyA9PiBhc3ltbWV0cmljRXF1YWxzKGNhbGxBcmcsIGFyZ3MsIFtpdGVyYWJsZUVxdWFsaXR5XSkpXG4gICAgcmV0dXJuIHRoaXMuYXNzZXJ0KFxuICAgICAgcGFzcyxcbiAgICAgIGBleHBlY3RlZCBcIiR7c3B5TmFtZX1cIiB0byBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHM6ICN7ZXhwfWAsXG4gICAgICBgZXhwZWN0ZWQgXCIke3NweU5hbWV9XCIgdG8gbm90IGJlIGNhbGxlZCB3aXRoIGFyZ3VtZW50czogI3tleHB9YCxcbiAgICAgIGFyZ3MsXG4gICAgICBzcHkubW9jay5jYWxscyxcbiAgICApXG4gIH0pXG4gIGNvbnN0IG9yZGluYWxPZiA9IChpOiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBqID0gaSAlIDEwXG4gICAgY29uc3QgayA9IGkgJSAxMDBcblxuICAgIGlmIChqID09PSAxICYmIGsgIT09IDExKVxuICAgICAgcmV0dXJuIGAke2l9c3RgXG5cbiAgICBpZiAoaiA9PT0gMiAmJiBrICE9PSAxMilcbiAgICAgIHJldHVybiBgJHtpfW5kYFxuXG4gICAgaWYgKGogPT09IDMgJiYgayAhPT0gMTMpXG4gICAgICByZXR1cm4gYCR7aX1yZGBcblxuICAgIHJldHVybiBgJHtpfXRoYFxuICB9XG4gIGRlZihbJ3RvSGF2ZUJlZW5OdGhDYWxsZWRXaXRoJywgJ250aENhbGxlZFdpdGgnXSwgZnVuY3Rpb24odGltZXM6IG51bWJlciwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBzcHkgPSBnZXRTcHkodGhpcylcbiAgICBjb25zdCBzcHlOYW1lID0gc3B5LmdldE1vY2tOYW1lKClcbiAgICBjb25zdCBudGhDYWxsID0gc3B5Lm1vY2suY2FsbHNbdGltZXMgLSAxXVxuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBhc3ltbWV0cmljRXF1YWxzKG50aENhbGwsIGFyZ3MsIFtpdGVyYWJsZUVxdWFsaXR5XSksXG4gICAgICBgZXhwZWN0ZWQgJHtvcmRpbmFsT2YodGltZXMpfSBcIiR7c3B5TmFtZX1cIiBjYWxsIHRvIGhhdmUgYmVlbiBjYWxsZWQgd2l0aCAje2V4cH1gLFxuICAgICAgYGV4cGVjdGVkICR7b3JkaW5hbE9mKHRpbWVzKX0gXCIke3NweU5hbWV9XCIgY2FsbCB0byBub3QgaGF2ZSBiZWVuIGNhbGxlZCB3aXRoICN7ZXhwfWAsXG4gICAgICBhcmdzLFxuICAgICAgbnRoQ2FsbCxcbiAgICApXG4gIH0pXG4gIGRlZihbJ3RvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aCcsICdsYXN0Q2FsbGVkV2l0aCddLCBmdW5jdGlvbiguLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IHNweSA9IGdldFNweSh0aGlzKVxuICAgIGNvbnN0IHNweU5hbWUgPSBzcHkuZ2V0TW9ja05hbWUoKVxuICAgIGNvbnN0IGxhc3RDYWxsID0gc3B5Lm1vY2suY2FsbHNbc3B5LmNhbGxzLmxlbmd0aCAtIDFdXG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGFzeW1tZXRyaWNFcXVhbHMobGFzdENhbGwsIGFyZ3MsIFtpdGVyYWJsZUVxdWFsaXR5XSksXG4gICAgICBgZXhwZWN0ZWQgbGFzdCBcIiR7c3B5TmFtZX1cIiBjYWxsIHRvIGhhdmUgYmVlbiBjYWxsZWQgd2l0aCAje2V4cH1gLFxuICAgICAgYGV4cGVjdGVkIGxhc3QgXCIke3NweU5hbWV9XCIgY2FsbCB0byBub3QgaGF2ZSBiZWVuIGNhbGxlZCB3aXRoICN7ZXhwfWAsXG4gICAgICBhcmdzLFxuICAgICAgbGFzdENhbGwsXG4gICAgKVxuICB9KVxuICBkZWYoWyd0b1Rocm93JywgJ3RvVGhyb3dFcnJvciddLCBmdW5jdGlvbihleHBlY3RlZDogc3RyaW5nIHwgUmVnRXhwKSB7XG4gICAgcmV0dXJuIHRoaXMudG8udGhyb3coZXhwZWN0ZWQpXG4gIH0pXG4gIGRlZihbJ3RvSGF2ZVJldHVybmVkJywgJ3RvUmV0dXJuJ10sIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHNweSA9IGdldFNweSh0aGlzKVxuICAgIGNvbnN0IHNweU5hbWUgPSBzcHkuZ2V0TW9ja05hbWUoKVxuICAgIGNvbnN0IGNhbGxlZEFuZE5vdFRocmV3ID0gc3B5Lm1vY2suY2FsbHMubGVuZ3RoID4gMCAmJiAhc3B5Lm1vY2sucmVzdWx0cy5zb21lKCh7IHR5cGUgfSkgPT4gdHlwZSA9PT0gJ3Rocm93JylcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGNhbGxlZEFuZE5vdFRocmV3LFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIGJlIHN1Y2Nlc3NmdWxseSBjYWxsZWQgYXQgbGVhc3Qgb25jZWAsXG4gICAgICBgZXhwZWN0ZWQgXCIke3NweU5hbWV9XCIgdG8gbm90IGJlIHN1Y2Nlc3NmdWxseSBjYWxsZWRgLFxuICAgICAgY2FsbGVkQW5kTm90VGhyZXcsXG4gICAgICAhY2FsbGVkQW5kTm90VGhyZXcsXG4gICAgKVxuICB9KVxuICBkZWYoWyd0b0hhdmVSZXR1cm5lZFRpbWVzJywgJ3RvUmV0dXJuVGltZXMnXSwgZnVuY3Rpb24odGltZXM6IG51bWJlcikge1xuICAgIGNvbnN0IHNweSA9IGdldFNweSh0aGlzKVxuICAgIGNvbnN0IHNweU5hbWUgPSBzcHkuZ2V0TW9ja05hbWUoKVxuICAgIGNvbnN0IHN1Y2Nlc3NmdWxsUmV0dXJucyA9IHNweS5tb2NrLnJlc3VsdHMucmVkdWNlKChzdWNjZXNzLCB7IHR5cGUgfSkgPT4gdHlwZSA9PT0gJ3Rocm93JyA/IHN1Y2Nlc3MgOiArK3N1Y2Nlc3MsIDApXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBzdWNjZXNzZnVsbFJldHVybnMgPT09IHRpbWVzLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIGJlIHN1Y2Nlc3NmdWxseSBjYWxsZWQgJHt0aW1lc30gdGltZXNgLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIG5vdCBiZSBzdWNjZXNzZnVsbHkgY2FsbGVkICR7dGltZXN9IHRpbWVzYCxcbiAgICAgIGBleHBlY3RlZCBudW1iZXIgb2YgcmV0dXJuczogJHt0aW1lc31gLFxuICAgICAgYHJlY2VpdmVkIG51bWJlciBvZiByZXR1cm5zOiAke3N1Y2Nlc3NmdWxsUmV0dXJuc31gLFxuICAgIClcbiAgfSlcbiAgZGVmKFsndG9IYXZlUmV0dXJuZWRXaXRoJywgJ3RvUmV0dXJuV2l0aCddLCBmdW5jdGlvbih2YWx1ZTogYW55KSB7XG4gICAgY29uc3Qgc3B5ID0gZ2V0U3B5KHRoaXMpXG4gICAgY29uc3Qgc3B5TmFtZSA9IHNweS5nZXRNb2NrTmFtZSgpXG4gICAgY29uc3QgcGFzcyA9IHNweS5tb2NrLnJlc3VsdHMuc29tZSgoeyB0eXBlLCB2YWx1ZTogcmVzdWx0IH0pID0+IHR5cGUgPT09ICdyZXR1cm4nICYmIGFzeW1tZXRyaWNFcXVhbHModmFsdWUsIHJlc3VsdCkpXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBwYXNzLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIGJlIHN1Y2Nlc3NmdWxseSBjYWxsZWQgd2l0aCAje2V4cH1gLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIG5vdCBiZSBzdWNjZXNzZnVsbHkgY2FsbGVkIHdpdGggI3tleHB9YCxcbiAgICAgIHZhbHVlLFxuICAgIClcbiAgfSlcbiAgZGVmKFsndG9IYXZlTGFzdFJldHVybmVkV2l0aCcsICdsYXN0UmV0dXJuZWRXaXRoJ10sIGZ1bmN0aW9uKHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBzcHkgPSBnZXRTcHkodGhpcylcbiAgICBjb25zdCBzcHlOYW1lID0gc3B5LmdldE1vY2tOYW1lKClcbiAgICBjb25zdCB7IHZhbHVlOiBsYXN0UmVzdWx0IH0gPSBzcHkubW9jay5yZXN1bHRzW3NweS5yZXR1cm5zLmxlbmd0aCAtIDFdXG4gICAgY29uc3QgcGFzcyA9IGFzeW1tZXRyaWNFcXVhbHMobGFzdFJlc3VsdCwgdmFsdWUpXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBwYXNzLFxuICAgICAgYGV4cGVjdGVkIGxhc3QgXCIke3NweU5hbWV9XCIgY2FsbCB0byByZXR1cm4gI3tleHB9YCxcbiAgICAgIGBleHBlY3RlZCBsYXN0IFwiJHtzcHlOYW1lfVwiIGNhbGwgdG8gbm90IHJldHVybiAje2V4cH1gLFxuICAgICAgdmFsdWUsXG4gICAgICBsYXN0UmVzdWx0LFxuICAgIClcbiAgfSlcbiAgZGVmKFsndG9IYXZlTnRoUmV0dXJuZWRXaXRoJywgJ250aFJldHVybmVkV2l0aCddLCBmdW5jdGlvbihudGhDYWxsOiBudW1iZXIsIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBzcHkgPSBnZXRTcHkodGhpcylcbiAgICBjb25zdCBzcHlOYW1lID0gc3B5LmdldE1vY2tOYW1lKClcbiAgICBjb25zdCBpc05vdCA9IHV0aWxzLmZsYWcodGhpcywgJ25lZ2F0ZScpIGFzIGJvb2xlYW5cbiAgICBjb25zdCB7IHR5cGU6IGNhbGxUeXBlLCB2YWx1ZTogY2FsbFJlc3VsdCB9ID0gc3B5Lm1vY2sucmVzdWx0c1tudGhDYWxsIC0gMV1cbiAgICBjb25zdCBvcmRpbmFsQ2FsbCA9IGAke29yZGluYWxPZihudGhDYWxsKX0gY2FsbGBcblxuICAgIGlmICghaXNOb3QgJiYgY2FsbFR5cGUgPT09ICd0aHJvdycpXG4gICAgICBjaGFpLmFzc2VydC5mYWlsKGBleHBlY3RlZCAke29yZGluYWxDYWxsfSB0byByZXR1cm4gI3tleHB9LCBidXQgaW5zdGVhZCBpdCB0aHJldyBhbiBlcnJvcmApXG5cbiAgICBjb25zdCBudGhDYWxsUmV0dXJuID0gYXN5bW1ldHJpY0VxdWFscyhjYWxsUmVzdWx0LCB2YWx1ZSlcblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgbnRoQ2FsbFJldHVybixcbiAgICAgIGBleHBlY3RlZCAke29yZGluYWxDYWxsfSBcIiR7c3B5TmFtZX1cIiBjYWxsIHRvIHJldHVybiAje2V4cH1gLFxuICAgICAgYGV4cGVjdGVkICR7b3JkaW5hbENhbGx9IFwiJHtzcHlOYW1lfVwiIGNhbGwgdG8gbm90IHJldHVybiAje2V4cH1gLFxuICAgICAgdmFsdWUsXG4gICAgICBjYWxsUmVzdWx0LFxuICAgIClcbiAgfSlcblxuICB1dGlscy5hZGRQcm9wZXJ0eShjaGFpLkFzc2VydGlvbi5wcm90b3R5cGUsICdyZXNvbHZlcycsIGZ1bmN0aW9uKHRoaXM6IGFueSkge1xuICAgIHV0aWxzLmZsYWcodGhpcywgJ3Byb21pc2UnLCAncmVzb2x2ZXMnKVxuICAgIGNvbnN0IG9iaiA9IHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgY29uc3QgcHJveHk6IGFueSA9IG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQ6ICh0YXJnZXQsIGtleSwgcmVjaWV2ZXIpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBrZXksIHJlY2lldmVyKVxuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgIHJldHVybiByZXN1bHQgaW5zdGFuY2VvZiBjaGFpLkFzc2VydGlvbiA/IHByb3h5IDogcmVzdWx0XG5cbiAgICAgICAgcmV0dXJuIGFzeW5jKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG9iai50aGVuKFxuICAgICAgICAgICAgKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JywgdmFsdWUpXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2FsbCh0aGlzLCAuLi5hcmdzKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHByb21pc2UgcmVqZWN0ZWQgXCIke2Vycn1cIiBpbnN0ZWFkIG9mIHJlc29sdmluZ2ApXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHByb3h5XG4gIH0pXG5cbiAgdXRpbHMuYWRkUHJvcGVydHkoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCAncmVqZWN0cycsIGZ1bmN0aW9uKHRoaXM6IGFueSkge1xuICAgIHV0aWxzLmZsYWcodGhpcywgJ3Byb21pc2UnLCAncmVqZWN0cycpXG4gICAgY29uc3Qgb2JqID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICBjb25zdCB3cmFwcGVyID0gdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJyA/IG9iaigpIDogb2JqIC8vIGZvciBqZXN0IGNvbXBhdFxuICAgIGNvbnN0IHByb3h5OiBhbnkgPSBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0OiAodGFyZ2V0LCBrZXksIHJlY2lldmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5LCByZWNpZXZlcilcblxuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICByZXR1cm4gcmVzdWx0IGluc3RhbmNlb2YgY2hhaS5Bc3NlcnRpb24gPyBwcm94eSA6IHJlc3VsdFxuXG4gICAgICAgIHJldHVybiBhc3luYyguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgIHJldHVybiB3cmFwcGVyLnRoZW4oXG4gICAgICAgICAgICAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHByb21pc2UgcmVzb2x2ZWQgXCIke3ZhbHVlfVwiIGluc3RlYWQgb2YgcmVqZWN0aW5nYClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JywgZXJyKVxuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNhbGwodGhpcywgLi4uYXJncylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pXG5cbiAgICByZXR1cm4gcHJveHlcbiAgfSlcblxuICB1dGlscy5hZGRNZXRob2QoXG4gICAgY2hhaS5leHBlY3QsXG4gICAgJ2Fzc2VydGlvbnMnLFxuICAgIGZ1bmN0aW9uIGFzc2VydGlvbnMoZXhwZWN0ZWQ6IG51bWJlcikge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYGV4cGVjdGVkIG51bWJlciBvZiBhc3NlcnRpb25zIHRvIGJlICR7ZXhwZWN0ZWR9LCBidXQgZ290ICR7Z2V0U3RhdGUoKS5hc3NlcnRpb25DYWxsc31gKVxuICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKVxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnJvciwgYXNzZXJ0aW9ucylcblxuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICBleHBlY3RlZEFzc2VydGlvbnNOdW1iZXI6IGV4cGVjdGVkLFxuICAgICAgICBleHBlY3RlZEFzc2VydGlvbnNOdW1iZXJFcnJvcjogZXJyb3IsXG4gICAgICB9KVxuICAgIH0sXG4gIClcblxuICB1dGlscy5hZGRNZXRob2QoXG4gICAgY2hhaS5leHBlY3QsXG4gICAgJ2hhc0Fzc2VydGlvbnMnLFxuICAgIGZ1bmN0aW9uIGhhc0Fzc2VydGlvbnMoKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignZXhwZWN0ZWQgYW55IG51bWJlciBvZiBhc3NlcnRpb24sIGJ1dCBnb3Qgbm9uZScpXG4gICAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpXG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVycm9yLCBoYXNBc3NlcnRpb25zKVxuXG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGlzRXhwZWN0aW5nQXNzZXJ0aW9uczogdHJ1ZSxcbiAgICAgICAgaXNFeHBlY3RpbmdBc3NlcnRpb25zRXJyb3I6IGVycm9yLFxuICAgICAgfSlcbiAgICB9LFxuICApXG5cbiAgdXRpbHMuYWRkTWV0aG9kKFxuICAgIGNoYWkuZXhwZWN0LFxuICAgICdhZGRTbmFwc2hvdFNlcmlhbGl6ZXInLFxuICAgIGFkZFNlcmlhbGl6ZXIsXG4gIClcbn1cbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6XG4gICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gICAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuTW9ja0RhdGUgPSB7fSkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcbiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxuICAgIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcbiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcbiAgICBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuICAgIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuICAgIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG4gICAgTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuICAgIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbiAgICB9XG5cbiAgICB2YXIgUmVhbERhdGUgPSBEYXRlO1xyXG4gICAgdmFyIG5vdyA9IG51bGw7XHJcbiAgICB2YXIgTW9ja0RhdGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XHJcbiAgICAgICAgX19leHRlbmRzKERhdGUsIF9zdXBlcik7XHJcbiAgICAgICAgZnVuY3Rpb24gRGF0ZSh5LCBtLCBkLCBoLCBNLCBzLCBtcykge1xyXG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xyXG4gICAgICAgICAgICB2YXIgZGF0ZTtcclxuICAgICAgICAgICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlID0gbmV3IFJlYWxEYXRlKG5vdy52YWx1ZU9mKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IG5ldyBSZWFsRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgICAgICBkYXRlID0gbmV3IFJlYWxEYXRlKHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBkID0gdHlwZW9mIGQgPT09ICd1bmRlZmluZWQnID8gMSA6IGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaCA9IGggfHwgMDtcclxuICAgICAgICAgICAgICAgICAgICBNID0gTSB8fCAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHMgPSBzIHx8IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgbXMgPSBtcyB8fCAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgUmVhbERhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gRGF0ZTtcclxuICAgIH0oUmVhbERhdGUpKTtcclxuICAgIE1vY2tEYXRlLnByb3RvdHlwZSA9IFJlYWxEYXRlLnByb3RvdHlwZTtcclxuICAgIE1vY2tEYXRlLlVUQyA9IFJlYWxEYXRlLlVUQztcclxuICAgIE1vY2tEYXRlLm5vdyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IE1vY2tEYXRlKCkudmFsdWVPZigpO1xyXG4gICAgfTtcclxuICAgIE1vY2tEYXRlLnBhcnNlID0gZnVuY3Rpb24gKGRhdGVTdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gUmVhbERhdGUucGFyc2UoZGF0ZVN0cmluZyk7XHJcbiAgICB9O1xyXG4gICAgTW9ja0RhdGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIFJlYWxEYXRlLnRvU3RyaW5nKCk7XHJcbiAgICB9O1xyXG4gICAgZnVuY3Rpb24gc2V0KGRhdGUpIHtcclxuICAgICAgICB2YXIgZGF0ZU9iaiA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcclxuICAgICAgICBpZiAoaXNOYU4oZGF0ZU9iai5nZXRUaW1lKCkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21vY2tkYXRlOiBUaGUgdGltZSBzZXQgaXMgYW4gaW52YWxpZCBkYXRlOiAnICsgZGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBEYXRlID0gTW9ja0RhdGU7XHJcbiAgICAgICAgbm93ID0gZGF0ZU9iai52YWx1ZU9mKCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiByZXNldCgpIHtcclxuICAgICAgICBEYXRlID0gUmVhbERhdGU7XHJcbiAgICB9XHJcbiAgICB2YXIgbW9ja2RhdGUgPSB7XHJcbiAgICAgICAgc2V0OiBzZXQsXHJcbiAgICAgICAgcmVzZXQ6IHJlc2V0LFxyXG4gICAgfTtcblxuICAgIGV4cG9ydHMuZGVmYXVsdCA9IG1vY2tkYXRlO1xuICAgIGV4cG9ydHMucmVzZXQgPSByZXNldDtcbiAgICBleHBvcnRzLnNldCA9IHNldDtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG4iLCIvLyBUT0RPIHNldEltbWVkaWF0ZSwgbmV4dFRpY2ssIHJlcXVlc3RBbmltYXRpb25GcmFtZSwgY2FuY2VsQW5pbWF0aW9uRnJhbWVcbi8vIFRPRE8gYXN5bmMgdGltZXJzXG5cbmltcG9ydCB0eXBlIHsgSmVzdE1vY2tDb21wYXQgfSBmcm9tICcuL2plc3QtbW9jaydcbmltcG9ydCB7IHNweU9uIH0gZnJvbSAnLi9qZXN0LW1vY2snXG5cbmNvbnN0IG9yaWdpbmFsU2V0VGltZW91dCA9IGdsb2JhbC5zZXRUaW1lb3V0XG5jb25zdCBvcmlnaW5hbFNldEludGVydmFsID0gZ2xvYmFsLnNldEludGVydmFsXG5jb25zdCBvcmlnaW5hbENsZWFyVGltZW91dCA9IGdsb2JhbC5jbGVhclRpbWVvdXRcbmNvbnN0IG9yaWdpbmFsQ2xlYXJJbnRlcnZhbCA9IGdsb2JhbC5jbGVhckludGVydmFsXG5cbnR5cGUgQXJndW1lbnRzID0gW2NiOiAoYXJnczogdm9pZCkgPT4gdm9pZCwgbXM/OiBudW1iZXIgfCB1bmRlZmluZWRdXG5cbmNvbnN0IE1BWF9MT09QUyA9IDEwXzAwMFxuXG50eXBlIEZha2VDYWxsID0ge1xuICBjYjogKCkgPT4gYW55XG4gIG1zOiBudW1iZXJcbiAgaWQ6IG51bWJlclxuICBuZXN0ZWRNczogbnVtYmVyXG4gIHNjb3BlSWQ6IG51bWJlclxufVxuXG5lbnVtIFF1ZXVlVGFza1R5cGUge1xuICBJbnRlcnZhbCA9ICdpbnRlcnZhbCcsXG4gIFRpbWVvdXQgPSAndGltZW91dCcsXG4gIEltbWVkaWF0ZSA9ICdpbW1lZGlhdGUnXG59XG5cbmludGVyZmFjZSBRdWV1ZVRhc2sge1xuICB0eXBlOiBRdWV1ZVRhc2tUeXBlXG4gIGNhbGw6IEZha2VDYWxsXG4gIG5lc3RlZDogYm9vbGVhblxufVxuXG5jb25zdCBhc3NlcnRFdmVyeSA9IChhc3NlcnRpb25zOiBhbnlbXSwgbWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gIGlmIChhc3NlcnRpb25zLnNvbWUoYSA9PiAhYSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpXG59XG5cbmNvbnN0IGFzc2VydE1heExvb3AgPSAodGltZXM6IG51bWJlcikgPT4ge1xuICBpZiAodGltZXMgPj0gTUFYX0xPT1BTKVxuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dC9zZXRJbnRlcnZhbCBjYWxsZWQgMTAgMDAwIHRpbWVzLiBJdFxcJ3MgcG9zc2libGUgaXQgc3R1Y2sgaW4gYW4gaW5maW5pdGUgbG9vcC4nKVxufVxuXG4vLyBUT0RPIHNob3VsZCBkbyB3aGF0IE5vZGVKUy5UaW1lb3V0IGRvZXMgb24gcmVmcmVzaFxuY29uc3QgZ2V0Tm9kZVRpbWVvdXQgPSAoaWQ6IG51bWJlcik6IE5vZGVKUy5UaW1lb3V0ID0+IHtcbiAgY29uc3QgdGltZXIgPSB7XG4gICAgcmVmOiAoKSA9PiB0aW1lcixcbiAgICB1bnJlZjogKCkgPT4gdGltZXIsXG4gICAgaGFzUmVmOiAoKSA9PiB0cnVlLFxuICAgIHJlZnJlc2g6ICgpID0+IHRpbWVyLFxuICAgIFtTeW1ib2wudG9QcmltaXRpdmVdOiAoKSA9PiBpZCxcbiAgfVxuXG4gIHJldHVybiB0aW1lclxufVxuXG5leHBvcnQgY2xhc3MgRmFrZVRpbWVycyB7XG4gIHByaXZhdGUgX3NldFRpbWVvdXQhOiBKZXN0TW9ja0NvbXBhdDxBcmd1bWVudHMsIE5vZGVKUy5UaW1lb3V0PlxuICBwcml2YXRlIF9zZXRJbnRlcnZhbCE6IEplc3RNb2NrQ29tcGF0PEFyZ3VtZW50cywgTm9kZUpTLlRpbWVvdXQ+XG5cbiAgcHJpdmF0ZSBfY2xlYXJUaW1lb3V0ITogSmVzdE1vY2tDb21wYXQ8W05vZGVKUy5UaW1lb3V0XSwgdm9pZD5cbiAgcHJpdmF0ZSBfY2xlYXJJbnRlcnZhbCE6IEplc3RNb2NrQ29tcGF0PFtOb2RlSlMuVGltZW91dF0sIHZvaWQ+XG5cbiAgcHJpdmF0ZSBfYWR2YW5jZWRUaW1lID0gMFxuICBwcml2YXRlIF9uZXN0ZWRUaW1lOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge31cbiAgcHJpdmF0ZSBfc2NvcGVJZCA9IDBcbiAgcHJpdmF0ZSBfaXNOZXN0ZWQgPSBmYWxzZVxuICBwcml2YXRlIF9pc09ubHlQZW5kaW5nID0gZmFsc2VcblxuICBwcml2YXRlIF9zcHlpZCA9IDBcblxuICBwcml2YXRlIF9pc01vY2tlZCA9IGZhbHNlXG5cbiAgcHJpdmF0ZSBfdGFza3NRdWV1ZTogUXVldWVUYXNrW10gPSBbXVxuICBwcml2YXRlIF9xdWV1ZUNvdW50ID0gMFxuXG4gIHB1YmxpYyB1c2VGYWtlVGltZXJzKCkge1xuICAgIHRoaXMuX2lzTW9ja2VkID0gdHJ1ZVxuXG4gICAgdGhpcy5yZXNldCgpXG5cbiAgICBjb25zdCBzcHlGYWN0b3J5ID0gKHNweVR5cGU6IFF1ZXVlVGFza1R5cGUsIHJlc3VsdEJ1aWxkZXI6IChpZDogbnVtYmVyLCBjYjogKGFyZ3M6IHZvaWQpID0+IHZvaWQpID0+IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIChjYjogKGFyZ3M6IHZvaWQpID0+IHZvaWQsIG1zID0gMCkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9ICsrdGhpcy5fc3B5aWRcbiAgICAgICAgLy8gYWxsIHRpbWVycyB1cCB1bnRpbCB0aGlzIHBvaW50XG4gICAgICAgIGNvbnN0IG5lc3RlZFRvID0gT2JqZWN0LmVudHJpZXModGhpcy5fbmVzdGVkVGltZSkuZmlsdGVyKChba2V5XSkgPT4gTnVtYmVyKGtleSkgPD0gdGhpcy5fc2NvcGVJZClcbiAgICAgICAgY29uc3QgbmVzdGVkTXMgPSBuZXN0ZWRUby5yZWR1Y2UoKHRvdGFsLCBbLCBtc10pID0+IHRvdGFsICsgbXMsIG1zKVxuICAgICAgICBjb25zdCBjYWxsOiBGYWtlQ2FsbCA9IHsgaWQsIGNiLCBtcywgbmVzdGVkTXMsIHNjb3BlSWQ6IHRoaXMuX3Njb3BlSWQgfVxuICAgICAgICBjb25zdCB0YXNrID0geyB0eXBlOiBzcHlUeXBlLCBjYWxsLCBuZXN0ZWQ6IHRoaXMuX2lzTmVzdGVkIH1cblxuICAgICAgICB0aGlzLnB1c2hUYXNrKHRhc2spXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdEJ1aWxkZXIoaWQsIGNiKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3NldFRpbWVvdXQgPSBzcHlPbihnbG9iYWwsICdzZXRUaW1lb3V0JykubW9ja0ltcGxlbWVudGF0aW9uKHNweUZhY3RvcnkoUXVldWVUYXNrVHlwZS5UaW1lb3V0LCBnZXROb2RlVGltZW91dCkpXG4gICAgdGhpcy5fc2V0SW50ZXJ2YWwgPSBzcHlPbihnbG9iYWwsICdzZXRJbnRlcnZhbCcpLm1vY2tJbXBsZW1lbnRhdGlvbihzcHlGYWN0b3J5KFF1ZXVlVGFza1R5cGUuSW50ZXJ2YWwsIGdldE5vZGVUaW1lb3V0KSlcblxuICAgIGNvbnN0IGNsZWFyVGltZXJGYWN0b3J5ID0gKHNweVR5cGU6IFF1ZXVlVGFza1R5cGUpID0+IChpZDogbnVtYmVyIHwgdW5kZWZpbmVkIHwgTm9kZUpTLlRpbWVvdXQpID0+IHtcbiAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm5cblxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl90YXNrc1F1ZXVlLmZpbmRJbmRleCgoeyBjYWxsLCB0eXBlIH0pID0+IHR5cGUgPT09IHNweVR5cGUgJiYgY2FsbC5pZCA9PT0gTnVtYmVyKGlkKSlcblxuICAgICAgaWYgKGluZGV4ICE9PSAtMSlcbiAgICAgICAgdGhpcy5fdGFza3NRdWV1ZS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuXG4gICAgdGhpcy5fY2xlYXJUaW1lb3V0ID0gc3B5T24oZ2xvYmFsLCAnY2xlYXJUaW1lb3V0JykubW9ja0ltcGxlbWVudGF0aW9uKGNsZWFyVGltZXJGYWN0b3J5KFF1ZXVlVGFza1R5cGUuVGltZW91dCkpXG4gICAgdGhpcy5fY2xlYXJJbnRlcnZhbCA9IHNweU9uKGdsb2JhbCwgJ2NsZWFySW50ZXJ2YWwnKS5tb2NrSW1wbGVtZW50YXRpb24oY2xlYXJUaW1lckZhY3RvcnkoUXVldWVUYXNrVHlwZS5JbnRlcnZhbCkpXG4gIH1cblxuICBwdWJsaWMgdXNlUmVhbFRpbWVycygpIHtcbiAgICB0aGlzLl9pc01vY2tlZCA9IGZhbHNlXG5cbiAgICB0aGlzLnJlc2V0KClcblxuICAgIGdsb2JhbC5zZXRUaW1lb3V0ID0gb3JpZ2luYWxTZXRUaW1lb3V0XG4gICAgZ2xvYmFsLnNldEludGVydmFsID0gb3JpZ2luYWxTZXRJbnRlcnZhbFxuICAgIGdsb2JhbC5jbGVhclRpbWVvdXQgPSBvcmlnaW5hbENsZWFyVGltZW91dFxuICAgIGdsb2JhbC5jbGVhckludGVydmFsID0gb3JpZ2luYWxDbGVhckludGVydmFsXG4gIH1cblxuICBwdWJsaWMgcnVuT25seVBlbmRpbmdUaW1lcnMoKTogdm9pZCB8IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYXNzZXJ0TW9ja2VkKClcblxuICAgIHRoaXMuX2lzT25seVBlbmRpbmcgPSB0cnVlXG4gICAgdGhpcy5ydW5RdWV1ZSgpXG4gIH1cblxuICBwdWJsaWMgcnVuQWxsVGltZXJzKCk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFzc2VydE1vY2tlZCgpXG5cbiAgICB0aGlzLnJ1blF1ZXVlKClcbiAgfVxuXG4gIHB1YmxpYyBhZHZhbmNlVGltZXJzQnlUaW1lKG1zOiBudW1iZXIpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hc3NlcnRNb2NrZWQoKVxuXG4gICAgdGhpcy5fYWR2YW5jZWRUaW1lICs9IG1zXG4gICAgdGhpcy5ydW5RdWV1ZSgpXG4gIH1cblxuICBwdWJsaWMgYWR2YW5jZVRpbWVyc1RvTmV4dFRpbWVyKCk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFzc2VydE1vY2tlZCgpXG5cbiAgICB0aGlzLmNhbGxRdWV1ZUl0ZW0oMClcbiAgfVxuXG4gIHB1YmxpYyBnZXRUaW1lckNvdW50KCk6IG51bWJlciB7XG4gICAgdGhpcy5hc3NlcnRNb2NrZWQoKVxuXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tzUXVldWUubGVuZ3RoXG4gIH1cblxuICBwcml2YXRlIHJlc2V0KCkge1xuICAgIHRoaXMuX2FkdmFuY2VkVGltZSA9IDBcbiAgICB0aGlzLl9uZXN0ZWRUaW1lID0ge31cbiAgICB0aGlzLl9pc05lc3RlZCA9IGZhbHNlXG4gICAgdGhpcy5faXNPbmx5UGVuZGluZyA9IGZhbHNlXG4gICAgdGhpcy5fc3B5aWQgPSAwXG4gICAgdGhpcy5fcXVldWVDb3VudCA9IDBcbiAgICB0aGlzLl90YXNrc1F1ZXVlID0gW11cblxuICAgIHRoaXMuX2NsZWFySW50ZXJ2YWw/Lm1vY2tSZXN0b3JlKClcbiAgICB0aGlzLl9jbGVhclRpbWVvdXQ/Lm1vY2tSZXN0b3JlKClcbiAgICB0aGlzLl9zZXRJbnRlcnZhbD8ubW9ja1Jlc3RvcmUoKVxuICAgIHRoaXMuX3NldFRpbWVvdXQ/Lm1vY2tSZXN0b3JlKClcbiAgfVxuXG4gIHByaXZhdGUgY2FsbFF1ZXVlSXRlbShpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgdGFzayA9IHRoaXMuX3Rhc2tzUXVldWVbaW5kZXhdXG5cbiAgICBpZiAoIXRhc2spIHJldHVyblxuXG4gICAgY29uc3QgeyBjYWxsLCB0eXBlIH0gPSB0YXNrXG5cbiAgICB0aGlzLl9zY29wZUlkID0gY2FsbC5pZFxuICAgIHRoaXMuX2lzTmVzdGVkID0gdHJ1ZVxuXG4gICAgdGhpcy5fbmVzdGVkVGltZVtjYWxsLmlkXSA/Pz0gMFxuICAgIHRoaXMuX25lc3RlZFRpbWVbY2FsbC5pZF0gKz0gY2FsbC5tc1xuXG4gICAgaWYgKHR5cGUgPT09ICd0aW1lb3V0Jykge1xuICAgICAgdGhpcy5yZW1vdmVUYXNrKGluZGV4KVxuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlID09PSAnaW50ZXJ2YWwnKSB7XG4gICAgICBjYWxsLm5lc3RlZE1zICs9IGNhbGwubXNcbiAgICAgIGNvbnN0IG5lc3RlZE1zID0gY2FsbC5uZXN0ZWRNc1xuICAgICAgY29uc3QgY2xvc2VzdFRhc2sgPSB0aGlzLl90YXNrc1F1ZXVlLmZpbmRJbmRleCgoeyB0eXBlLCBjYWxsIH0pID0+IHR5cGUgPT09ICdpbnRlcnZhbCcgJiYgY2FsbC5uZXN0ZWRNcyA8IG5lc3RlZE1zKVxuXG4gICAgICBpZiAoY2xvc2VzdFRhc2sgIT09IC0xICYmIGNsb3Nlc3RUYXNrICE9PSBpbmRleClcbiAgICAgICAgdGhpcy5lbnN1cmVRdWV1ZU9yZGVyKClcbiAgICB9XG5cbiAgICBjYWxsLmNiKClcblxuICAgIHRoaXMuX3F1ZXVlQ291bnQrK1xuICB9XG5cbiAgcHJpdmF0ZSBydW5RdWV1ZSgpIHtcbiAgICBsZXQgaW5kZXggPSAwXG4gICAgd2hpbGUgKHRoaXMuX3Rhc2tzUXVldWVbaW5kZXhdKSB7XG4gICAgICBhc3NlcnRNYXhMb29wKHRoaXMuX3F1ZXVlQ291bnQpXG5cbiAgICAgIGNvbnN0IHsgY2FsbCwgbmVzdGVkIH0gPSB0aGlzLl90YXNrc1F1ZXVlW2luZGV4XVxuXG4gICAgICBpZiAodGhpcy5fYWR2YW5jZWRUaW1lICYmIGNhbGwubmVzdGVkTXMgPiB0aGlzLl9hZHZhbmNlZFRpbWUpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGlmICh0aGlzLl9pc09ubHlQZW5kaW5nICYmIG5lc3RlZCkge1xuICAgICAgICBpbmRleCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FsbFF1ZXVlSXRlbShpbmRleClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVRhc2soaW5kZXg6IG51bWJlcikge1xuICAgIGlmIChpbmRleCA9PT0gMClcbiAgICAgIHRoaXMuX3Rhc2tzUXVldWUuc2hpZnQoKVxuICAgIGVsc2VcbiAgICAgIHRoaXMuX3Rhc2tzUXVldWUuc3BsaWNlKGluZGV4LCAxKVxuICB9XG5cbiAgcHJpdmF0ZSBwdXNoVGFzayh0YXNrOiBRdWV1ZVRhc2spIHtcbiAgICB0aGlzLl90YXNrc1F1ZXVlLnB1c2godGFzaylcbiAgICB0aGlzLmVuc3VyZVF1ZXVlT3JkZXIoKVxuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVRdWV1ZU9yZGVyKCkge1xuICAgIHRoaXMuX3Rhc2tzUXVldWUuc29ydCgodDEsIHQyKSA9PiB7XG4gICAgICBjb25zdCBkaWZmID0gdDEuY2FsbC5uZXN0ZWRNcyAtIHQyLmNhbGwubmVzdGVkTXNcblxuICAgICAgaWYgKGRpZmYgPT09IDApIHtcbiAgICAgICAgaWYgKHQxLnR5cGUgPT09IFF1ZXVlVGFza1R5cGUuSW1tZWRpYXRlICYmIHQyLnR5cGUgIT09IFF1ZXVlVGFza1R5cGUuSW1tZWRpYXRlKVxuICAgICAgICAgIHJldHVybiAxXG5cbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRpZmZcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRNb2NrZWQoKSB7XG4gICAgYXNzZXJ0RXZlcnkoW1xuICAgICAgdGhpcy5faXNNb2NrZWQsXG4gICAgICB0aGlzLl9zZXRUaW1lb3V0LFxuICAgICAgdGhpcy5fc2V0SW50ZXJ2YWwsXG4gICAgICB0aGlzLl9jbGVhclRpbWVvdXQsXG4gICAgICB0aGlzLl9jbGVhckludGVydmFsLFxuICAgIF0sICd0aW1lcnMgYXJlIG5vdCBtb2NrZWQuIHRyeSBjYWxsaW5nIFwidmkudXNlRmFrZVRpbWVycygpXCIgZmlyc3QnKVxuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cblxuaW1wb3J0IG1vY2tkYXRlIGZyb20gJ21vY2tkYXRlJ1xuaW1wb3J0IHsgRmFrZVRpbWVycyB9IGZyb20gJy4vdGltZXJzJ1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlZFNweSwgTWF5YmVNb2NrZWQsIE1heWJlTW9ja2VkRGVlcCB9IGZyb20gJy4vamVzdC1tb2NrJ1xuaW1wb3J0IHsgZm4sIGlzTW9ja0Z1bmN0aW9uLCBzcGllcywgc3B5T24gfSBmcm9tICcuL2plc3QtbW9jaydcblxuY2xhc3MgVml0ZXN0VXRpbHMge1xuICBwcml2YXRlIF90aW1lcnM6IEZha2VUaW1lcnNcbiAgcHJpdmF0ZSBfbW9ja2VkRGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB8IG51bGxcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl90aW1lcnMgPSBuZXcgRmFrZVRpbWVycygpXG4gICAgdGhpcy5fbW9ja2VkRGF0ZSA9IG51bGxcbiAgfVxuXG4gIC8vIHRpbWVyc1xuXG4gIHB1YmxpYyB1c2VGYWtlVGltZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lcnMudXNlRmFrZVRpbWVycygpXG4gIH1cblxuICBwdWJsaWMgdXNlUmVhbFRpbWVycygpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZXJzLnVzZVJlYWxUaW1lcnMoKVxuICB9XG5cbiAgcHVibGljIHJ1bk9ubHlQZW5kaW5nVGltZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lcnMucnVuT25seVBlbmRpbmdUaW1lcnMoKVxuICB9XG5cbiAgcHVibGljIHJ1bkFsbFRpbWVycygpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZXJzLnJ1bkFsbFRpbWVycygpXG4gIH1cblxuICBwdWJsaWMgYWR2YW5jZVRpbWVyc0J5VGltZShtczogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWVycy5hZHZhbmNlVGltZXJzQnlUaW1lKG1zKVxuICB9XG5cbiAgcHVibGljIGFkdmFuY2VUaW1lcnNUb05leHRUaW1lcigpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZXJzLmFkdmFuY2VUaW1lcnNUb05leHRUaW1lcigpXG4gIH1cblxuICBwdWJsaWMgZ2V0VGltZXJDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZXJzLmdldFRpbWVyQ291bnQoKVxuICB9XG5cbiAgLy8gZGF0ZVxuXG4gIHB1YmxpYyBtb2NrQ3VycmVudERhdGUoZGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSkge1xuICAgIHRoaXMuX21vY2tlZERhdGUgPSBkYXRlXG4gICAgbW9ja2RhdGUuc2V0KGRhdGUpXG4gIH1cblxuICBwdWJsaWMgcmVzdG9yZUN1cnJlbnREYXRlKCkge1xuICAgIHRoaXMuX21vY2tlZERhdGUgPSBudWxsXG4gICAgbW9ja2RhdGUucmVzZXQoKVxuICB9XG5cbiAgcHVibGljIGdldE1vY2tlZERhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vY2tlZERhdGVcbiAgfVxuXG4gIC8vIG1vY2tzXG5cbiAgc3B5T24gPSBzcHlPblxuICBmbiA9IGZuXG5cbiAgLy8ganVzdCBoaW50cyBmb3IgdHJhbnNmb3JtZXIgdG8gcmV3cml0ZSBpbXBvcnRzXG5cbiAgLyoqXG4gICAqIE1ha2VzIGFsbCBgaW1wb3J0c2AgdG8gcGFzc2VkIG1vZHVsZSB0byBiZSBtb2NrZWQuXG4gICAqIC0gSWYgdGhlcmUgaXMgYSBmYWN0b3J5LCB3aWxsIHJldHVybiBpdCdzIHJlc3VsdC4gVGhlIGNhbGwgdG8gYHZpLm1vY2tgIGlzIGhvaXN0ZWQgdG8gdGhlIHRvcCBvZiB0aGUgZmlsZSxcbiAgICogc28geW91IGRvbid0IGhhdmUgYWNjZXNzIHRvIHZhcmlhYmxlcyBkZWNsYXJlZCBpbiB0aGUgZ2xvYmFsIGZpbGUgc2NvcGUsIGlmIHlvdSBkaWRuJ3QgcHV0IHRoZW0gYmVmb3JlIGltcG9ydHMhXG4gICAqIC0gSWYgYF9fbW9ja3NfX2AgZm9sZGVyIHdpdGggZmlsZSBvZiB0aGUgc2FtZSBuYW1lIGV4aXN0LCBhbGwgaW1wb3J0cyB3aWxsXG4gICAqIHJldHVybiBpdC5cbiAgICogLSBJZiB0aGVyZSBpcyBubyBgX19tb2Nrc19fYCBmb2xkZXIgb3IgYSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSBpbnNpZGUsIHdpbGwgY2FsbCBvcmlnaW5hbFxuICAgKiBtb2R1bGUgYW5kIG1vY2sgaXQuXG4gICAqIEBwYXJhbSBwYXRoIFBhdGggdG8gdGhlIG1vZHVsZS4gQ2FuIGJlIGFsaWFzZWQsIGlmIHlvdXIgY29uZmlnIHN1cHBvcnMgaXRcbiAgICogQHBhcmFtIGZhY3RvcnkgRmFjdG9yeSBmb3IgdGhlIG1vY2tlZCBtb2R1bGUuIEhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eS5cbiAgICovXG4gIHB1YmxpYyBtb2NrKHBhdGg6IHN0cmluZywgZmFjdG9yeT86ICgpID0+IGFueSkge31cbiAgLyoqXG4gICAqIFJlbW92ZXMgbW9kdWxlIGZyb20gbW9ja2VkIHJlZ2lzdHJ5LiBBbGwgc3Vic2VxdWVudCBjYWxscyB0byBpbXBvcnQgd2lsbFxuICAgKiByZXR1cm4gb3JpZ2luYWwgbW9kdWxlIGV2ZW4gaWYgaXQgd2FzIG1vY2tlZC5cbiAgICogQHBhcmFtIHBhdGggUGF0aCB0byB0aGUgbW9kdWxlLiBDYW4gYmUgYWxpYXNlZCwgaWYgeW91ciBjb25maWcgc3VwcG9ycyBpdFxuICAgKi9cbiAgcHVibGljIHVubW9jayhwYXRoOiBzdHJpbmcpIHt9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgbW9kdWxlLCBieXBhc3NpbmcgYWxsIGNoZWNrcyBpZiBpdCBzaG91bGQgYmUgbW9ja2VkLlxuICAgKiBDYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIG1vY2sgbW9kdWxlIHBhcnRpYWxseS5cbiAgICogQGV4YW1wbGVcbiAgICogdmkubW9jaygnLi9leGFtcGxlJywgYXN5bmMgKCkgPT4ge1xuICAgKiAgY29uc3QgYXhpb3MgPSBhd2FpdCB2aS5pbXBvcnRBY3R1YWwoJy4vZXhhbXBsZScpXG4gICAqXG4gICAqICByZXR1cm4geyAuLi5heGlvcywgZ2V0OiB2aS5mbigpIH1cbiAgICogfSlcbiAgICogQHBhcmFtIHBhdGggUGF0aCB0byB0aGUgbW9kdWxlLiBDYW4gYmUgYWxpYXNlZCwgaWYgeW91ciBjb25maWcgc3VwcG9ycyBpdFxuICAgKiBAcmV0dXJucyBBY3R1YWwgbW9kdWxlIHdpdGhvdXQgc3BpZXNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbXBvcnRBY3R1YWw8VD4ocGF0aDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHt9IGFzIFRcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGEgbW9kdWxlIHdpdGggYWxsIG9mIGl0cyBwcm9wZXJ0aWVzIGFuZCBuZXN0ZWQgcHJvcGVydGllcyBtb2NrZWQuXG4gICAqIEZvciB0aGUgcnVsZXMgYXBwbGllZCwgc2VlIGRvY3MuXG4gICAqIEBwYXJhbSBwYXRoIFBhdGggdG8gdGhlIG1vZHVsZS4gQ2FuIGJlIGFsaWFzZWQsIGlmIHlvdXIgY29uZmlnIHN1cHBvcnMgaXRcbiAgICogQHJldHVybnMgRnVsbHkgbW9ja2VkIG1vZHVsZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGltcG9ydE1vY2s8VD4ocGF0aDogc3RyaW5nKTogUHJvbWlzZTxNYXliZU1vY2tlZERlZXA8VD4+IHtcbiAgICByZXR1cm4ge30gYXMgTWF5YmVNb2NrZWREZWVwPFQ+XG4gIH1cblxuICAvKipcbiAgICogVHlwZSBoZWxwZXJzIGZvciBUeXBlU2NyaXB0LiBJbiByZWFsaXR5IGp1c3QgcmV0dXJucyB0aGUgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZC5cbiAgICogQGV4YW1wbGVcbiAgICogaW1wb3J0IGV4YW1wbGUgZnJvbSAnLi9leGFtcGxlJ1xuICAgKiB2aS5tb2NrKCcuL2V4YW1wbGUnKVxuICAgKlxuICAgKiB0ZXN0KCcxKzEgZXF1YWxzIDInIGFzeW5jICgpID0+IHtcbiAgICogIHZpLm1vY2tlZChleGFtcGxlLmNhbGMpLm1vY2tSZXN0b3JlKClcbiAgICpcbiAgICogIGNvbnN0IHJlcyA9IGV4YW1wbGUuY2FsYygxLCAnKycsIDEpXG4gICAqXG4gICAqICBleHBlY3QocmVzKS50b0JlKDIpXG4gICAqIH0pXG4gICAqIEBwYXJhbSBpdGVtIEFueXRoaW5nIHRoYXQgY2FuIGJlIG1vY2tlZFxuICAgKiBAcGFyYW0gZGVlcCBJZiB0aGUgb2JqZWN0IGlzIGRlZXBseSBtb2NrZWRcbiAgICovXG4gIHB1YmxpYyBtb2NrZWQ8VD4oaXRlbTogVCwgZGVlcD86IGZhbHNlKTogTWF5YmVNb2NrZWQ8VD5cbiAgcHVibGljIG1vY2tlZDxUPihpdGVtOiBULCBkZWVwOiB0cnVlKTogTWF5YmVNb2NrZWREZWVwPFQ+XG4gIHB1YmxpYyBtb2NrZWQ8VD4oaXRlbTogVCwgX2RlZXAgPSBmYWxzZSk6IE1heWJlTW9ja2VkPFQ+IHwgTWF5YmVNb2NrZWREZWVwPFQ+IHtcbiAgICByZXR1cm4gaXRlbSBhcyBhbnlcbiAgfVxuXG4gIHB1YmxpYyBpc01vY2tGdW5jdGlvbihmbjogYW55KTogZm4gaXMgRW5oYW5jZWRTcHkge1xuICAgIHJldHVybiBpc01vY2tGdW5jdGlvbihmbilcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckFsbE1vY2tzKCkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgY2xlYXJpbmcgbW9kdWxlIG1vY2tzXG4gICAgX192aXRlc3RfX2NsZWFyTW9ja3NfXyh7IGNsZWFyTW9ja3M6IHRydWUgfSlcbiAgICBzcGllcy5mb3JFYWNoKHNweSA9PiBzcHkubW9ja0NsZWFyKCkpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHB1YmxpYyByZXNldEFsbE1vY2tzKCkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcmVzZXR0aW5nIG1vZHVsZSBtb2Nrc1xuICAgIF9fdml0ZXN0X19jbGVhck1vY2tzX18oeyBtb2NrUmVzZXQ6IHRydWUgfSlcbiAgICBzcGllcy5mb3JFYWNoKHNweSA9PiBzcHkubW9ja1Jlc2V0KCkpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHB1YmxpYyByZXN0b3JlQWxsTW9ja3MoKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciByZXN0b3JpbmcgbW9kdWxlIG1vY2tzXG4gICAgX192aXRlc3RfX2NsZWFyTW9ja3NfXyh7IHJlc3RvcmVNb2NrczogdHJ1ZSB9KVxuICAgIHNwaWVzLmZvckVhY2goc3B5ID0+IHNweS5tb2NrUmVzdG9yZSgpKVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpdGVzdCA9IG5ldyBWaXRlc3RVdGlscygpXG5leHBvcnQgY29uc3QgdmkgPSB2aXRlc3RcbiJdLCJuYW1lcyI6WyJ0ZXN0IiwiQXN5bW1ldHJpY01hdGNoZXIiLCJfY29sbGVjdGlvbnMiLCJyZXF1aXJlJCQwIiwiZ2xvYmFsIiwiU3ltYm9sIiwiU1BBQ0UiLCJzZXJpYWxpemUiLCJwbHVnaW4iLCJfZGVmYXVsdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfYW5zaVN0eWxlcyIsInJlcXVpcmUkJDEiLCJET01Db2xsZWN0aW9uIiwiZXNjYXBlSFRNTF8xIiwiRE9NRWxlbWVudCIsIl9tYXJrdXAiLCJJbW11dGFibGUiLCJJU19LRVlFRF9TRU5USU5FTCIsIklTX09SREVSRURfU0VOVElORUwiLCJJU19TRVRfU0VOVElORUwiLCJyZWFjdElzTW9kdWxlIiwiUmVhY3RFbGVtZW50IiwiZ2V0UHJvcEtleXMiLCJSZWFjdFRlc3RDb21wb25lbnQiLCJyZXF1aXJlJCQyIiwicmVxdWlyZSQkMyIsInJlcXVpcmUkJDQiLCJyZXF1aXJlJCQ1IiwicmVxdWlyZSQkNiIsInJlcXVpcmUkJDciLCJyZXF1aXJlJCQ4IiwicHJldHR5Rm9ybWF0UGx1Z2lucyIsImFzeW1tZXRyaWNFcXVhbHMiLCJ0aGlzIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztBQUN0QyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7QUFDekMsSUFBSSxpQkFBaUIsR0FBRyxNQUFNLENBQUMseUJBQXlCLENBQUM7QUFDekQsSUFBSSxtQkFBbUIsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUM7QUFDdkQsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7QUFDbkQsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQztBQUN6RCxJQUFJLGVBQWUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxLQUFLLEdBQUcsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDaEssSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLO0FBQy9CLEVBQUUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxJQUFJLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQ2xDLE1BQU0sZUFBZSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDeEMsRUFBRSxJQUFJLG1CQUFtQjtBQUN6QixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVB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cUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLEVBQUMsQ0FBQztBQUNsYyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FB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
|