@cichol/logger 5.4.4 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dists/index.cjs DELETED
@@ -1,558 +0,0 @@
1
- 'use strict';
2
-
3
- var _Object$fromEntries = require('core-js-pure/features/object/from-entries.js');
4
- var _filterInstanceProperty = require('core-js-pure/features/instance/filter.js');
5
- var _mapInstanceProperty = require('core-js-pure/features/instance/map.js');
6
- var _trimInstanceProperty = require('core-js-pure/features/instance/trim.js');
7
- var _Reflect$construct = require('core-js-pure/features/reflect/construct.js');
8
- var http$1 = require('http');
9
- var stream = require('stream');
10
- var util = require('util');
11
- var morgan = require('morgan');
12
- var winston = require('winston');
13
- var _findInstanceProperty = require('core-js-pure/features/instance/find.js');
14
- var _Reflect$apply = require('core-js-pure/features/reflect/apply.js');
15
- var chalk = require('chalk');
16
- var rTracer = require('cls-rtracer');
17
- var luxon = require('luxon');
18
- var _Map = require('core-js-pure/features/map/index.js');
19
- var process = require('process');
20
- var _Symbol$for = require('core-js-pure/features/symbol/for.js');
21
- var _indexOfInstanceProperty = require('core-js-pure/features/instance/index-of.js');
22
- var _sliceInstanceProperty = require('core-js-pure/features/instance/slice.js');
23
- var _startsWithInstanceProperty = require('core-js-pure/features/instance/starts-with.js');
24
- var _includesInstanceProperty = require('core-js-pure/features/instance/includes.js');
25
- var _lastIndexOfInstanceProperty = require('core-js-pure/features/instance/last-index-of.js');
26
- var path = require('path');
27
- var highlight = require('cli-highlight');
28
- var prettyBytes = require('pretty-bytes');
29
- var prettyMs = require('pretty-ms');
30
- var cluster = require('cluster');
31
- require('worker_threads');
32
-
33
- function _interopNamespaceDefault(e) {
34
- var n = Object.create(null);
35
- if (e) {
36
- Object.keys(e).forEach(function (k) {
37
- if (k !== 'default') {
38
- var d = Object.getOwnPropertyDescriptor(e, k);
39
- Object.defineProperty(n, k, d.get ? d : {
40
- enumerable: true,
41
- get: function () { return e[k]; }
42
- });
43
- }
44
- });
45
- }
46
- n.default = e;
47
- return Object.freeze(n);
48
- }
49
-
50
- var winston__namespace = /*#__PURE__*/_interopNamespaceDefault(winston);
51
-
52
- const LoggingLevel = {
53
- // Critical levels. (It will crash the process)
54
- Fatal: 0,
55
- Error: 1,
56
- // Warning levels. (It just report warning information, not crash the process)
57
- Warning: 2,
58
- // Regular level and aliases.
59
- Notice: 3,
60
- Info: 3,
61
- // Maybe sensitive levels. (In general, does not useful)
62
- Http: 4,
63
- Query: 4,
64
- // Loud levels.
65
- Verbose: 5,
66
- Debug: 5
67
- };
68
-
69
- // Constants.
70
- const colorizerMap = new _Map();
71
-
72
- // Helpers.
73
- function createScheme(options) {
74
- const nextIndex = colorizerMap.size;
75
- const colorizer = chalk.bgHex(options.background).hex(options.foreground);
76
- colorizerMap.set(nextIndex, colorizer);
77
- return nextIndex;
78
- }
79
-
80
- // Color definitions.
81
- const ColorValue = {
82
- // Basic colors.
83
- White: '#FFFFFF',
84
- Gray: '#808080',
85
- Black: '#000000',
86
- // Specialized colors.
87
- Critical: '#D63031',
88
- Warning: '#FDCB6E',
89
- Regular: '#0984E3',
90
- Http: '#6AB04C',
91
- Query: '#399AF3'
92
- };
93
- const ColorScheme = {
94
- Critical: createScheme({
95
- background: ColorValue.Critical,
96
- foreground: ColorValue.Black
97
- }),
98
- Warning: createScheme({
99
- background: ColorValue.Warning,
100
- foreground: ColorValue.Black
101
- }),
102
- Regular: createScheme({
103
- background: ColorValue.Regular,
104
- foreground: ColorValue.White
105
- }),
106
- Http: createScheme({
107
- background: ColorValue.Http,
108
- foreground: ColorValue.Black
109
- }),
110
- Query: createScheme({
111
- background: ColorValue.Query,
112
- foreground: ColorValue.Black
113
- }),
114
- Loud: createScheme({
115
- background: ColorValue.Black,
116
- foreground: ColorValue.Gray
117
- })
118
- };
119
- function getChalkOf(colorSet) {
120
- return colorizerMap.get(colorSet) ?? chalk;
121
- }
122
-
123
- // Node.js built-in APIs.
124
-
125
- // Constants.
126
- const {
127
- isTTY
128
- } = process.stdout;
129
- const isNotOnCLI = !isTTY;
130
- function decorateLabel(label, scheme) {
131
- if (isNotOnCLI) return label;
132
- const chalk = getChalkOf(scheme);
133
- const decoratedLabel = chalk.bold(` ${label} `);
134
- return decoratedLabel;
135
- }
136
-
137
- // Type definitions.
138
-
139
- // Constants.
140
- const rootPath = process.cwd();
141
- const conjunction = ` ${chalk.blue('──')} `;
142
- const splat = _Symbol$for('splat');
143
-
144
- // Handler metadata.
145
- const name$8 = 'error';
146
- const level$8 = LoggingLevel.Error;
147
- const label$8 = decorateLabel('ERROR', ColorScheme.Critical);
148
- function simplifyDataURI(dataURI) {
149
- const [, actualContent] = dataURI.split(':');
150
- const pivot = _indexOfInstanceProperty(actualContent).call(actualContent, ',') + 1;
151
- const mimeIndicator = _sliceInstanceProperty(actualContent).call(actualContent, 0, pivot);
152
- const contentPrefix = _sliceInstanceProperty(actualContent).call(actualContent, pivot, pivot + 4);
153
- const contentSuffix = _sliceInstanceProperty(actualContent).call(actualContent, -4);
154
- return `data:${mimeIndicator + contentPrefix}...${contentSuffix}`;
155
- }
156
- function isDataURI(filename) {
157
- return _startsWithInstanceProperty(filename).call(filename, 'data:');
158
- }
159
- function isAbsoluteOrDataURI(filename) {
160
- return path.isAbsolute(filename) || isDataURI(filename);
161
- }
162
- function mapLocationOfErrorThrown(filename) {
163
- let target = path.relative(rootPath, filename);
164
- if (isDataURI(filename)) {
165
- target = chalk.gray(simplifyDataURI(filename));
166
- } else if (_includesInstanceProperty(target).call(target, 'node_modules')) {
167
- target = chalk.gray(_sliceInstanceProperty(target).call(target, _lastIndexOfInstanceProperty(target).call(target, 'node_modules'))).replace(/node_modules[\\/]((?:@[^\\/]+[\\/])?[^\\/]+)(.*)/, (_, moduleName, trailing) => `node_modules${path.sep}${chalk.bold.underline(moduleName)}${chalk.gray(trailing)}`);
168
- } else {
169
- target = `${chalk.gray(path.dirname(target) + path.sep)}${chalk.bold.underline(path.basename(target))}`;
170
- }
171
- return target;
172
- }
173
- function handle$1(data) {
174
- var _context, _context2, _context3;
175
- const {
176
- [splat]: [error] = []
177
- } = data;
178
- if (!(error instanceof Error)) {
179
- return undefined;
180
- }
181
- const {
182
- name: errorName,
183
- message,
184
- stack: rawStack = ''
185
- } = error;
186
- const stack = _mapInstanceProperty(_context = _mapInstanceProperty(_context2 = _mapInstanceProperty(_context3 = _sliceInstanceProperty(rawStack).call(rawStack, errorName.length + message.length + 3).split('\n')).call(_context3, line => line.replace(/^\s+at /g, ''))).call(_context2, line => isAbsoluteOrDataURI(line) ? `<anonymous>${conjunction}${mapLocationOfErrorThrown(line)}` : line)).call(_context, line => line.replace(/^(.+) \((.+)\)$/, (_, contextName, rawLocation) => {
187
- let location = '';
188
- switch (true) {
189
- case rawLocation === '<anonymous>':
190
- {
191
- location = chalk.gray(rawLocation);
192
- break;
193
- }
194
- case isDataURI(rawLocation):
195
- {
196
- location = chalk.gray(simplifyDataURI(rawLocation));
197
- break;
198
- }
199
- case _startsWithInstanceProperty(rawLocation).call(rawLocation, 'node:'):
200
- {
201
- const [filename, occurredLine] = _sliceInstanceProperty(rawLocation).call(rawLocation, 5).split(':');
202
- location = chalk.gray(`https://github.com/${chalk.bold.underline('nodejs')}/node/blob/${process.version}/lib/${filename}.js#L${occurredLine}`);
203
- break;
204
- }
205
- default:
206
- {
207
- const [filename, occurredLine, occurredColumn] = rawLocation.split(':');
208
- if (!path.isAbsolute(filename)) break;
209
- const target = mapLocationOfErrorThrown(path.relative(rootPath, filename));
210
- const trailing = chalk.gray(`:${occurredLine}:${occurredColumn}`);
211
- location = target + trailing;
212
- }
213
- }
214
- return `${contextName}${conjunction}${location}`;
215
- })).join('\n');
216
- const decoratedLabel = decorateLabel(errorName, ColorScheme.Critical);
217
- const payload = `${message}\n\n${stack}\n`;
218
- return {
219
- label: decoratedLabel,
220
- payload
221
- };
222
- }
223
-
224
- var ErrorHandler = /*#__PURE__*/Object.freeze({
225
- __proto__: null,
226
- default: handle$1,
227
- label: label$8,
228
- level: level$8,
229
- name: name$8
230
- });
231
-
232
- // Local helpers.
233
-
234
- // Handler metadata.
235
- const name$7 = 'fatal';
236
- const level$7 = LoggingLevel.Fatal;
237
- const label$7 = decorateLabel('FATAL', ColorScheme.Critical);
238
- // eslint-disable-line no-restricted-exports
239
-
240
- var FatalHandler = /*#__PURE__*/Object.freeze({
241
- __proto__: null,
242
- default: handle$1,
243
- label: label$7,
244
- level: level$7,
245
- name: name$7
246
- });
247
-
248
- // Local helpers.
249
-
250
- // Handler metadata.
251
- const name$6 = 'warning';
252
- const level$6 = LoggingLevel.Warning;
253
- const label$6 = decorateLabel('WARNING', ColorScheme.Warning);
254
- var warning = null;
255
-
256
- var WarningHandler = /*#__PURE__*/Object.freeze({
257
- __proto__: null,
258
- default: warning,
259
- label: label$6,
260
- level: level$6,
261
- name: name$6
262
- });
263
-
264
- // Local helpers.
265
-
266
- // Handler metadata.
267
- const name$5 = 'notice';
268
- const level$5 = LoggingLevel.Notice;
269
- const label$5 = decorateLabel('NOTICE', ColorScheme.Regular);
270
- var notice = null;
271
-
272
- var NoticeHandler = /*#__PURE__*/Object.freeze({
273
- __proto__: null,
274
- default: notice,
275
- label: label$5,
276
- level: level$5,
277
- name: name$5
278
- });
279
-
280
- // Local helpers.
281
-
282
- // Handler metadata.
283
- const name$4 = 'info';
284
- const level$4 = LoggingLevel.Info;
285
- const label$4 = decorateLabel('INFO', ColorScheme.Regular);
286
- var info = null;
287
-
288
- var InfoHandler = /*#__PURE__*/Object.freeze({
289
- __proto__: null,
290
- default: info,
291
- label: label$4,
292
- level: level$4,
293
- name: name$4
294
- });
295
-
296
- // Local helpers.
297
-
298
- // Handler metadata.
299
- const name$3 = 'http';
300
- const level$3 = LoggingLevel.Http;
301
- const label$3 = decorateLabel('HTTP', ColorScheme.Http);
302
- var http = null;
303
-
304
- var HttpHandler = /*#__PURE__*/Object.freeze({
305
- __proto__: null,
306
- default: http,
307
- label: label$3,
308
- level: level$3,
309
- name: name$3
310
- });
311
-
312
- // Highlight.js
313
-
314
- // Type definitions.
315
-
316
- // Handler metadata.
317
- const name$2 = 'query';
318
- const level$2 = LoggingLevel.Query;
319
- const label$2 = decorateLabel('QUERY', ColorScheme.Query);
320
- function handle(data) {
321
- const payload = highlight(data.message, {
322
- language: 'sql'
323
- });
324
- return {
325
- label: label$2,
326
- payload
327
- };
328
- }
329
-
330
- var QueryHandler = /*#__PURE__*/Object.freeze({
331
- __proto__: null,
332
- default: handle,
333
- label: label$2,
334
- level: level$2,
335
- name: name$2
336
- });
337
-
338
- // Local helpers.
339
-
340
- // Handler metadata.
341
- const name$1 = 'verbose';
342
- const level$1 = LoggingLevel.Verbose;
343
- const label$1 = decorateLabel('VERBOSE', ColorScheme.Loud);
344
- var verbose = null;
345
-
346
- var VerboseHandler = /*#__PURE__*/Object.freeze({
347
- __proto__: null,
348
- default: verbose,
349
- label: label$1,
350
- level: level$1,
351
- name: name$1
352
- });
353
-
354
- // Local helpers.
355
-
356
- // Handler metadata.
357
- const name = 'debug';
358
- const level = LoggingLevel.Debug;
359
- const label = decorateLabel('DEBUG', ColorScheme.Loud);
360
- var debug = null;
361
-
362
- var DebugHandler = /*#__PURE__*/Object.freeze({
363
- __proto__: null,
364
- default: debug,
365
- label: label,
366
- level: level,
367
- name: name
368
- });
369
-
370
- // Handler implementations.
371
- const handlers = [FatalHandler, ErrorHandler, WarningHandler, NoticeHandler, InfoHandler, HttpHandler, QueryHandler, VerboseHandler, DebugHandler];
372
-
373
- var formatForCLI = winston.format.printf(data => {
374
- const timestamp = chalk.gray(luxon.DateTime.now().toISO({
375
- includeOffset: true
376
- }));
377
- const handler = _findInstanceProperty(handlers).call(handlers, ({
378
- name
379
- }) => name === data.level);
380
- const fallback = {
381
- label: handler?.label,
382
- payload: data.message
383
- };
384
- const performHandle = handler?.default ?? (() => fallback);
385
-
386
- // Execute handler and then, get decorated payload.
387
- const {
388
- label,
389
- payload
390
- } = _Reflect$apply(performHandle, undefined, [data]) ?? fallback;
391
- let extraFingerprint;
392
- if (handler?.level === LoggingLevel.Http) {
393
- extraFingerprint = data.transactionId ? `(Transaction-ID = ${data.transactionId})` : `(Request-ID = ${rTracer.id()})`;
394
- }
395
- return `${label} ${timestamp}${extraFingerprint ? ` ${extraFingerprint}` : ''}\n${payload}`;
396
- });
397
-
398
- // Node.js built-in APIs.
399
-
400
- // Type definitions.
401
- const ExecutionMode = {
402
- DevelopmentMode: 'development',
403
- ProductionMode: 'production'
404
- };
405
- const ClusteringMode = {
406
- MasterProcess: 0,
407
- WorkerProcess: 1
408
- };
409
- // Exportings.
410
- const executionMode = process.env.NODE_ENV ?? ExecutionMode.DevelopmentMode;
411
- cluster.isPrimary ?? cluster.isMaster ? ClusteringMode.MasterProcess : ClusteringMode.WorkerProcess;
412
-
413
- // Node.js built-in APIs.
414
-
415
- // Type definitions.
416
-
417
- // Helpers.
418
- function decorateStatusCode(statusCode) {
419
- const groupOfCode = Math.floor(Number(statusCode) / 100) * 100;
420
- const baseMessage = `${statusCode} ${http$1.STATUS_CODES[statusCode]}`;
421
- switch (groupOfCode) {
422
- case 200:
423
- {
424
- return chalk.green(baseMessage);
425
- }
426
- case 300:
427
- {
428
- return chalk.magenta(baseMessage);
429
- }
430
- case 400:
431
- case 500:
432
- {
433
- return chalk.red(baseMessage);
434
- }
435
- default:
436
- {
437
- return chalk.gray(baseMessage);
438
- }
439
- }
440
- }
441
- function formatForMorgan(tokens, request, response) {
442
- function _(token, ...subArgs) {
443
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
444
- return tokens[token](request, response, ...subArgs);
445
- }
446
-
447
- // Raw values.
448
- const method = _('method');
449
- const URL = _('url');
450
- const httpVersion = `HTTP/${_('http-version')}`;
451
- const statusCode = Number(_('status'));
452
- const contentLength = Number(_('res', 'content-length') ?? -1);
453
- const responseTime = Number(_('response-time') ?? -1);
454
-
455
- // Decorated values.
456
- const $method = chalk.bold(method);
457
- const $version = chalk.rgb(98, 177, 255)(httpVersion);
458
- const $statusCode = decorateStatusCode(statusCode);
459
- const $contentLength = contentLength >= 0 ? prettyBytes(contentLength) : '? B';
460
- const $responseTime = responseTime >= 0 ? prettyMs(responseTime) : '';
461
-
462
- // Additional information.
463
- const metadata = `(${$contentLength}, ${$responseTime})`;
464
- return [`→ ${$method} ${URL} ${$version}`, `← ${$version} ${$statusCode} ${metadata}`].join('\n');
465
- }
466
- var formatForMorgan$1 = executionMode === ExecutionMode.DevelopmentMode ? formatForMorgan : morgan.combined;
467
-
468
- var _context;
469
-
470
- // Type definitions.
471
-
472
- // Transports.
473
- const {
474
- Console: ConsoleTransport
475
- } = winston__namespace.transports;
476
- class Logger {
477
- static #instance;
478
- #logger = winston__namespace.createLogger({
479
- levels: _Object$fromEntries(_filterInstanceProperty(_context = _mapInstanceProperty(handlers).call(handlers, ({
480
- name,
481
- level
482
- }) => [name, level])).call(_context, ([, level]) => typeof level === 'number')),
483
- level: executionMode === ExecutionMode.ProductionMode ? 'http' : 'verbose',
484
- transports: [new ConsoleTransport({
485
- format: formatForCLI
486
- })],
487
- exitOnError: false
488
- });
489
- #morgan = morgan(formatForMorgan$1, {
490
- stream: new stream.PassThrough({
491
- objectMode: true
492
- }).on('data', data => {
493
- this.log('http', _trimInstanceProperty(data).call(data));
494
- })
495
- });
496
- constructor() {
497
- if (new.target !== Logger) {
498
- throw new ReferenceError('Logger class is not inheritable');
499
- }
500
- if (Logger.#instance) {
501
- throw new ReferenceError('Logger class cannot be constructed in directly');
502
- }
503
- Logger.#instance = this;
504
- }
505
-
506
- /**
507
- * Logging message with specific level.
508
- *
509
- * @param level
510
- * @param message
511
- * @param args Additional metadata.
512
- */
513
-
514
- /**
515
- * Logging HTTP I/O.
516
- *
517
- * @param request Node.js built-in `IncomingMessage` instance from `http` module.
518
- * @param response Node.js built-in `ServerResponse` instance from `http` module.
519
- */
520
-
521
- /**
522
- * Logging errors in detail.
523
- *
524
- * @param error
525
- */
526
-
527
- log(...args) {
528
- const logger = this.#logger;
529
- const format = this.#morgan;
530
- switch (true) {
531
- case args.length >= 2 && args[0] instanceof http$1.IncomingMessage && args[1] instanceof http$1.ServerResponse:
532
- {
533
- const [request, response] = args;
534
- return util.promisify(format)(request, response);
535
- }
536
- case args.length >= 1 && args[0] instanceof Error:
537
- {
538
- const [error, ...data] = args;
539
-
540
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
541
- logger.log('error', error.message, error, ...data);
542
- return undefined;
543
- }
544
- default:
545
- {
546
- const [level, message, ...data] = args;
547
-
548
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
549
- logger.log(level, message, ...data);
550
- return undefined;
551
- }
552
- }
553
- }
554
- }
555
- var logger = _Reflect$construct(Logger, [], Logger);
556
-
557
- module.exports = logger;
558
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzIiwic291cmNlcyI6WyIuLi9zb3VyY2VzL2hlbHBlcnMvbG9nZ2luZy1sZXZlbC50cyIsIi4uL3NvdXJjZXMvaGVscGVycy9jb2xvci1zY2hlbWUudHMiLCIuLi9zb3VyY2VzL2hlbHBlcnMvbGFiZWwtZGVjb3JhdG9yLnRzIiwiLi4vc291cmNlcy9oYW5kbGVycy9lcnJvci50cyIsIi4uL3NvdXJjZXMvaGFuZGxlcnMvZmF0YWwudHMiLCIuLi9zb3VyY2VzL2hhbmRsZXJzL3dhcm5pbmcudHMiLCIuLi9zb3VyY2VzL2hhbmRsZXJzL25vdGljZS50cyIsIi4uL3NvdXJjZXMvaGFuZGxlcnMvaW5mby50cyIsIi4uL3NvdXJjZXMvaGFuZGxlcnMvaHR0cC50cyIsIi4uL3NvdXJjZXMvaGFuZGxlcnMvcXVlcnkudHMiLCIuLi9zb3VyY2VzL2hhbmRsZXJzL3ZlcmJvc2UudHMiLCIuLi9zb3VyY2VzL2hhbmRsZXJzL2RlYnVnLnRzIiwiLi4vc291cmNlcy9oYW5kbGVycy9pbmRleC50cyIsIi4uL3NvdXJjZXMvZm9ybWF0dGVycy9jb21tYW5kLWxpbmUudHMiLCIuLi9zb3VyY2VzL2hlbHBlcnMvY29uc3RhbnRzLnRzIiwiLi4vc291cmNlcy9mb3JtYXR0ZXJzL21vcmdhbi50cyIsIi4uL3NvdXJjZXMvY2xhc3Nlcy9sb2dnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgTG9nZ2luZ0xldmVsID0ge1xuXHQvLyBDcml0aWNhbCBsZXZlbHMuIChJdCB3aWxsIGNyYXNoIHRoZSBwcm9jZXNzKVxuXHRGYXRhbDogMCxcblx0RXJyb3I6IDEsXG5cblx0Ly8gV2FybmluZyBsZXZlbHMuIChJdCBqdXN0IHJlcG9ydCB3YXJuaW5nIGluZm9ybWF0aW9uLCBub3QgY3Jhc2ggdGhlIHByb2Nlc3MpXG5cdFdhcm5pbmc6IDIsXG5cblx0Ly8gUmVndWxhciBsZXZlbCBhbmQgYWxpYXNlcy5cblx0Tm90aWNlOiAzLFxuXHRJbmZvOiAzLFxuXG5cdC8vIE1heWJlIHNlbnNpdGl2ZSBsZXZlbHMuIChJbiBnZW5lcmFsLCBkb2VzIG5vdCB1c2VmdWwpXG5cdEh0dHA6IDQsXG5cdFF1ZXJ5OiA0LFxuXG5cdC8vIExvdWQgbGV2ZWxzLlxuXHRWZXJib3NlOiA1LFxuXHREZWJ1ZzogNSxcbn0gYXMgY29uc3RcblxudHlwZSBMb2dnaW5nTGV2ZWwgPSB0eXBlb2YgTG9nZ2luZ0xldmVsW2tleW9mIHR5cGVvZiBMb2dnaW5nTGV2ZWxdXG5cbmV4cG9ydCBkZWZhdWx0IExvZ2dpbmdMZXZlbFxuIiwiLy8gVGhpcmQtcGFydHkgbW9kdWxlcy5cbmltcG9ydCBjaGFsaywgeyB0eXBlIENoYWxrSW5zdGFuY2UgfSBmcm9tICdjaGFsaydcblxuLy8gQ29uc3RhbnRzLlxuY29uc3QgY29sb3JpemVyTWFwID0gbmV3IE1hcDxudW1iZXIsIENoYWxrSW5zdGFuY2U+KClcblxuLy8gSGVscGVycy5cbmZ1bmN0aW9uIGNyZWF0ZVNjaGVtZShvcHRpb25zOiB7IGJhY2tncm91bmQ6IENvbG9yVmFsdWUsIGZvcmVncm91bmQ6IENvbG9yVmFsdWUgfSk6IG51bWJlciB7XG5cdGNvbnN0IG5leHRJbmRleCA9IGNvbG9yaXplck1hcC5zaXplXG5cdGNvbnN0IGNvbG9yaXplciA9IGNoYWxrLmJnSGV4KG9wdGlvbnMuYmFja2dyb3VuZCkuaGV4KG9wdGlvbnMuZm9yZWdyb3VuZClcblxuXHRjb2xvcml6ZXJNYXAuc2V0KG5leHRJbmRleCwgY29sb3JpemVyKVxuXG5cdHJldHVybiBuZXh0SW5kZXhcbn1cblxuLy8gQ29sb3IgZGVmaW5pdGlvbnMuXG5jb25zdCBDb2xvclZhbHVlID0ge1xuXHQvLyBCYXNpYyBjb2xvcnMuXG5cdFdoaXRlOiAnI0ZGRkZGRicsXG5cdEdyYXk6ICcjODA4MDgwJyxcblx0QmxhY2s6ICcjMDAwMDAwJyxcblxuXHQvLyBTcGVjaWFsaXplZCBjb2xvcnMuXG5cdENyaXRpY2FsOiAnI0Q2MzAzMScsXG5cdFdhcm5pbmc6ICcjRkRDQjZFJyxcblx0UmVndWxhcjogJyMwOTg0RTMnLFxuXHRIdHRwOiAnIzZBQjA0QycsXG5cdFF1ZXJ5OiAnIzM5OUFGMycsXG59IGFzIGNvbnN0XG5cbnR5cGUgQ29sb3JWYWx1ZSA9IHR5cGVvZiBDb2xvclZhbHVlW2tleW9mIHR5cGVvZiBDb2xvclZhbHVlXVxuXG5jb25zdCBDb2xvclNjaGVtZSA9IHtcblx0Q3JpdGljYWw6IGNyZWF0ZVNjaGVtZSh7XG5cdFx0YmFja2dyb3VuZDogQ29sb3JWYWx1ZS5Dcml0aWNhbCxcblx0XHRmb3JlZ3JvdW5kOiBDb2xvclZhbHVlLkJsYWNrLFxuXHR9KSxcblxuXHRXYXJuaW5nOiBjcmVhdGVTY2hlbWUoe1xuXHRcdGJhY2tncm91bmQ6IENvbG9yVmFsdWUuV2FybmluZyxcblx0XHRmb3JlZ3JvdW5kOiBDb2xvclZhbHVlLkJsYWNrLFxuXHR9KSxcblxuXHRSZWd1bGFyOiBjcmVhdGVTY2hlbWUoe1xuXHRcdGJhY2tncm91bmQ6IENvbG9yVmFsdWUuUmVndWxhcixcblx0XHRmb3JlZ3JvdW5kOiBDb2xvclZhbHVlLldoaXRlLFxuXHR9KSxcblxuXHRIdHRwOiBjcmVhdGVTY2hlbWUoe1xuXHRcdGJhY2tncm91bmQ6IENvbG9yVmFsdWUuSHR0cCxcblx0XHRmb3JlZ3JvdW5kOiBDb2xvclZhbHVlLkJsYWNrLFxuXHR9KSxcblxuXHRRdWVyeTogY3JlYXRlU2NoZW1lKHtcblx0XHRiYWNrZ3JvdW5kOiBDb2xvclZhbHVlLlF1ZXJ5LFxuXHRcdGZvcmVncm91bmQ6IENvbG9yVmFsdWUuQmxhY2ssXG5cdH0pLFxuXG5cdExvdWQ6IGNyZWF0ZVNjaGVtZSh7XG5cdFx0YmFja2dyb3VuZDogQ29sb3JWYWx1ZS5CbGFjayxcblx0XHRmb3JlZ3JvdW5kOiBDb2xvclZhbHVlLkdyYXksXG5cdH0pLFxufSBhcyBjb25zdFxuXG50eXBlIENvbG9yU2NoZW1lID0gdHlwZW9mIENvbG9yU2NoZW1lW2tleW9mIHR5cGVvZiBDb2xvclNjaGVtZV1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENoYWxrT2YoY29sb3JTZXQ6IENvbG9yU2NoZW1lKTogQ2hhbGtJbnN0YW5jZSB7XG5cdHJldHVybiBjb2xvcml6ZXJNYXAuZ2V0KGNvbG9yU2V0KSA/PyBjaGFsa1xufVxuXG5leHBvcnQgZGVmYXVsdCBDb2xvclNjaGVtZVxuIiwiLy8gTm9kZS5qcyBidWlsdC1pbiBBUElzLlxuaW1wb3J0IHByb2Nlc3MgZnJvbSAncHJvY2VzcydcblxuLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBDb2xvclNjaGVtZSwgeyBnZXRDaGFsa09mIH0gZnJvbSAnLi9jb2xvci1zY2hlbWUnXG5cbi8vIENvbnN0YW50cy5cbmNvbnN0IHsgaXNUVFkgfSA9IHByb2Nlc3Muc3Rkb3V0XG5jb25zdCBpc05vdE9uQ0xJID0gIWlzVFRZXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlY29yYXRlTGFiZWw8VCBleHRlbmRzIHN0cmluZz4obGFiZWw6IFQsIHNjaGVtZTogQ29sb3JTY2hlbWUpOiBUIHtcblx0aWYgKGlzTm90T25DTEkpIHJldHVybiBsYWJlbFxuXG5cdGNvbnN0IGNoYWxrID0gZ2V0Q2hhbGtPZihzY2hlbWUpXG5cdGNvbnN0IGRlY29yYXRlZExhYmVsID0gY2hhbGsuYm9sZChgICR7bGFiZWx9IGApXG5cblx0cmV0dXJuIGRlY29yYXRlZExhYmVsIGFzIFRcbn1cbiIsIi8vIE5vZGUuanMgYnVpbHQtaW4gQVBJcy5cbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgcHJvY2VzcywgeyB2ZXJzaW9uIH0gZnJvbSAncHJvY2VzcydcblxuLy8gVGhpcmQtcGFydHkgbW9kdWxlcy5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcblxuLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJ1xuaW1wb3J0IENvbG9yU2NoZW1lIGZyb20gJy4uL2hlbHBlcnMvY29sb3Itc2NoZW1lJ1xuaW1wb3J0IGRlY29yYXRlTGFiZWwgZnJvbSAnLi4vaGVscGVycy9sYWJlbC1kZWNvcmF0b3InXG5cbi8vIFR5cGUgZGVmaW5pdGlvbnMuXG50eXBlIExvZ2dpbmdEYXRhID0geyBsZXZlbDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcgfSAmIFJlY29yZDxQcm9wZXJ0eUtleSwgYW55PlxudHlwZSBIYW5kbGVkRGF0YSA9IHsgbGFiZWw6IHN0cmluZywgcGF5bG9hZDogc3RyaW5nIH1cblxuLy8gQ29uc3RhbnRzLlxuY29uc3Qgcm9vdFBhdGggPSBwcm9jZXNzLmN3ZCgpXG5jb25zdCBjb25qdW5jdGlvbiA9IGAgJHtjaGFsay5ibHVlKCfilIDilIAnKX0gYFxuY29uc3Qgc3BsYXQ6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2wuZm9yKCdzcGxhdCcpXG5cbi8vIEhhbmRsZXIgbWV0YWRhdGEuXG5leHBvcnQgY29uc3QgbmFtZSA9ICdlcnJvcidcbmV4cG9ydCBjb25zdCBsZXZlbCA9IExvZ2dpbmdMZXZlbC5FcnJvclxuZXhwb3J0IGNvbnN0IGxhYmVsID0gZGVjb3JhdGVMYWJlbCgnRVJST1InLCBDb2xvclNjaGVtZS5Dcml0aWNhbClcblxuZnVuY3Rpb24gc2ltcGxpZnlEYXRhVVJJKGRhdGFVUkk6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IFsgLCBhY3R1YWxDb250ZW50IF0gPSBkYXRhVVJJLnNwbGl0KCc6Jylcblx0Y29uc3QgcGl2b3QgPSBhY3R1YWxDb250ZW50LmluZGV4T2YoJywnKSArIDFcblx0Y29uc3QgbWltZUluZGljYXRvciA9IGFjdHVhbENvbnRlbnQuc2xpY2UoMCwgcGl2b3QpXG5cdGNvbnN0IGNvbnRlbnRQcmVmaXggPSBhY3R1YWxDb250ZW50LnNsaWNlKHBpdm90LCBwaXZvdCArIDQpXG5cdGNvbnN0IGNvbnRlbnRTdWZmaXggPSBhY3R1YWxDb250ZW50LnNsaWNlKC00KVxuXG5cdHJldHVybiBgZGF0YToke21pbWVJbmRpY2F0b3IgKyBjb250ZW50UHJlZml4fS4uLiR7Y29udGVudFN1ZmZpeH1gXG59XG5cbmZ1bmN0aW9uIGlzRGF0YVVSSShmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdHJldHVybiBmaWxlbmFtZS5zdGFydHNXaXRoKCdkYXRhOicpXG59XG5cbmZ1bmN0aW9uIGlzQWJzb2x1dGVPckRhdGFVUkkoZmlsZW5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gcGF0aC5pc0Fic29sdXRlKGZpbGVuYW1lKSB8fCBpc0RhdGFVUkkoZmlsZW5hbWUpXG59XG5cbmZ1bmN0aW9uIG1hcExvY2F0aW9uT2ZFcnJvclRocm93bihmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcblx0bGV0IHRhcmdldCA9IHBhdGgucmVsYXRpdmUocm9vdFBhdGgsIGZpbGVuYW1lKVxuXG5cdGlmIChpc0RhdGFVUkkoZmlsZW5hbWUpKSB7XG5cdFx0dGFyZ2V0ID0gY2hhbGsuZ3JheShzaW1wbGlmeURhdGFVUkkoZmlsZW5hbWUpKVxuXHR9IGVsc2UgaWYgKHRhcmdldC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJykpIHtcblx0XHR0YXJnZXQgPSBjaGFsay5ncmF5KFxuXHRcdFx0dGFyZ2V0LnNsaWNlKHRhcmdldC5sYXN0SW5kZXhPZignbm9kZV9tb2R1bGVzJykpLFxuXHRcdCkucmVwbGFjZShcblx0XHRcdC9ub2RlX21vZHVsZXNbXFxcXC9dKCg/OkBbXlxcXFwvXStbXFxcXC9dKT9bXlxcXFwvXSspKC4qKS8sXG5cdFx0XHQoXywgbW9kdWxlTmFtZTogc3RyaW5nLCB0cmFpbGluZzogc3RyaW5nKSA9PiAoXG5cdFx0XHRcdGBub2RlX21vZHVsZXMke3BhdGguc2VwfSR7Y2hhbGsuYm9sZC51bmRlcmxpbmUobW9kdWxlTmFtZSl9JHtjaGFsay5ncmF5KHRyYWlsaW5nKX1gXG5cdFx0XHQpLFxuXHRcdClcblx0fSBlbHNlIHtcblx0XHR0YXJnZXQgPSBgJHtjaGFsay5ncmF5KHBhdGguZGlybmFtZSh0YXJnZXQpICsgcGF0aC5zZXApfSR7Y2hhbGsuYm9sZC51bmRlcmxpbmUocGF0aC5iYXNlbmFtZSh0YXJnZXQpKX1gXG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGhhbmRsZShkYXRhOiBMb2dnaW5nRGF0YSk6IEhhbmRsZWREYXRhIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgeyBbc3BsYXRdOiBbIGVycm9yIF0gPSBbXSB9ID0gZGF0YSBhcyBhbnlcblxuXHRpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuXHRcdHJldHVybiB1bmRlZmluZWRcblx0fVxuXG5cdGNvbnN0IHsgbmFtZTogZXJyb3JOYW1lLCBtZXNzYWdlLCBzdGFjazogcmF3U3RhY2sgPSAnJyB9ID0gZXJyb3JcblxuXHRjb25zdCBzdGFjayA9IHJhd1N0YWNrXG5cdFx0LnNsaWNlKGVycm9yTmFtZS5sZW5ndGggKyBtZXNzYWdlLmxlbmd0aCArIDMpXG5cdFx0LnNwbGl0KCdcXG4nKVxuXHRcdC5tYXAobGluZSA9PiBsaW5lLnJlcGxhY2UoL15cXHMrYXQgL2csICcnKSlcblx0XHQubWFwKGxpbmUgPT4gKGlzQWJzb2x1dGVPckRhdGFVUkkobGluZSkgPyBgPGFub255bW91cz4ke2Nvbmp1bmN0aW9ufSR7bWFwTG9jYXRpb25PZkVycm9yVGhyb3duKGxpbmUpfWAgOiBsaW5lKSlcblx0XHQubWFwKGxpbmUgPT4gbGluZS5yZXBsYWNlKC9eKC4rKSBcXCgoLispXFwpJC8sIChfLCBjb250ZXh0TmFtZTogc3RyaW5nLCByYXdMb2NhdGlvbjogc3RyaW5nKSA9PiB7XG5cdFx0XHRsZXQgbG9jYXRpb24gPSAnJ1xuXG5cdFx0XHRzd2l0Y2ggKHRydWUpIHtcblx0XHRcdGNhc2UgKHJhd0xvY2F0aW9uID09PSAnPGFub255bW91cz4nKToge1xuXHRcdFx0XHRsb2NhdGlvbiA9IGNoYWxrLmdyYXkocmF3TG9jYXRpb24pXG5cblx0XHRcdFx0YnJlYWtcblx0XHRcdH1cblxuXHRcdFx0Y2FzZSAoaXNEYXRhVVJJKHJhd0xvY2F0aW9uKSk6IHtcblx0XHRcdFx0bG9jYXRpb24gPSBjaGFsay5ncmF5KHNpbXBsaWZ5RGF0YVVSSShyYXdMb2NhdGlvbikpXG5cblx0XHRcdFx0YnJlYWtcblx0XHRcdH1cblxuXHRcdFx0Y2FzZSAocmF3TG9jYXRpb24uc3RhcnRzV2l0aCgnbm9kZTonKSk6IHtcblx0XHRcdFx0Y29uc3QgWyBmaWxlbmFtZSwgb2NjdXJyZWRMaW5lIF0gPSByYXdMb2NhdGlvbi5zbGljZSg1KS5zcGxpdCgnOicpXG5cblx0XHRcdFx0bG9jYXRpb24gPSBjaGFsay5ncmF5KGBodHRwczovL2dpdGh1Yi5jb20vJHtjaGFsay5ib2xkLnVuZGVybGluZSgnbm9kZWpzJyl9L25vZGUvYmxvYi8ke3ZlcnNpb259L2xpYi8ke2ZpbGVuYW1lfS5qcyNMJHtvY2N1cnJlZExpbmV9YClcblxuXHRcdFx0XHRicmVha1xuXHRcdFx0fVxuXG5cdFx0XHRkZWZhdWx0OiB7XG5cdFx0XHRcdGNvbnN0IFsgZmlsZW5hbWUsIG9jY3VycmVkTGluZSwgb2NjdXJyZWRDb2x1bW4gXSA9IHJhd0xvY2F0aW9uLnNwbGl0KCc6JylcblxuXHRcdFx0XHRpZiAoIXBhdGguaXNBYnNvbHV0ZShmaWxlbmFtZSkpIGJyZWFrXG5cblx0XHRcdFx0Y29uc3QgdGFyZ2V0ID0gbWFwTG9jYXRpb25PZkVycm9yVGhyb3duKHBhdGgucmVsYXRpdmUocm9vdFBhdGgsIGZpbGVuYW1lKSlcblx0XHRcdFx0Y29uc3QgdHJhaWxpbmcgPSBjaGFsay5ncmF5KGA6JHtvY2N1cnJlZExpbmV9OiR7b2NjdXJyZWRDb2x1bW59YClcblxuXHRcdFx0XHRsb2NhdGlvbiA9IHRhcmdldCArIHRyYWlsaW5nXG5cdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBgJHtjb250ZXh0TmFtZX0ke2Nvbmp1bmN0aW9ufSR7bG9jYXRpb259YFxuXHRcdH0pKVxuXHRcdC5qb2luKCdcXG4nKVxuXG5cdGNvbnN0IGRlY29yYXRlZExhYmVsID0gZGVjb3JhdGVMYWJlbChlcnJvck5hbWUsIENvbG9yU2NoZW1lLkNyaXRpY2FsKVxuXHRjb25zdCBwYXlsb2FkID0gYCR7bWVzc2FnZX1cXG5cXG4ke3N0YWNrfVxcbmBcblxuXHRyZXR1cm4geyBsYWJlbDogZGVjb3JhdGVkTGFiZWwsIHBheWxvYWQgfVxufVxuIiwiLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJ1xuaW1wb3J0IENvbG9yU2NoZW1lIGZyb20gJy4uL2hlbHBlcnMvY29sb3Itc2NoZW1lJ1xuaW1wb3J0IGRlY29yYXRlTGFiZWwgZnJvbSAnLi4vaGVscGVycy9sYWJlbC1kZWNvcmF0b3InXG5cbi8vIEhhbmRsZXIgbWV0YWRhdGEuXG5leHBvcnQgY29uc3QgbmFtZSA9ICdmYXRhbCdcbmV4cG9ydCBjb25zdCBsZXZlbCA9IExvZ2dpbmdMZXZlbC5GYXRhbFxuZXhwb3J0IGNvbnN0IGxhYmVsID0gZGVjb3JhdGVMYWJlbCgnRkFUQUwnLCBDb2xvclNjaGVtZS5Dcml0aWNhbClcblxuZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vZXJyb3InIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1leHBvcnRzXG4iLCIvLyBMb2NhbCBoZWxwZXJzLlxuaW1wb3J0IExvZ2dpbmdMZXZlbCBmcm9tICcuLi9oZWxwZXJzL2xvZ2dpbmctbGV2ZWwnXG5pbXBvcnQgQ29sb3JTY2hlbWUgZnJvbSAnLi4vaGVscGVycy9jb2xvci1zY2hlbWUnXG5pbXBvcnQgZGVjb3JhdGVMYWJlbCBmcm9tICcuLi9oZWxwZXJzL2xhYmVsLWRlY29yYXRvcidcblxuLy8gSGFuZGxlciBtZXRhZGF0YS5cbmV4cG9ydCBjb25zdCBuYW1lID0gJ3dhcm5pbmcnXG5leHBvcnQgY29uc3QgbGV2ZWwgPSBMb2dnaW5nTGV2ZWwuV2FybmluZ1xuZXhwb3J0IGNvbnN0IGxhYmVsID0gZGVjb3JhdGVMYWJlbCgnV0FSTklORycsIENvbG9yU2NoZW1lLldhcm5pbmcpXG5cbmV4cG9ydCBkZWZhdWx0IG51bGxcbiIsIi8vIExvY2FsIGhlbHBlcnMuXG5pbXBvcnQgTG9nZ2luZ0xldmVsIGZyb20gJy4uL2hlbHBlcnMvbG9nZ2luZy1sZXZlbCdcbmltcG9ydCBDb2xvclNjaGVtZSBmcm9tICcuLi9oZWxwZXJzL2NvbG9yLXNjaGVtZSdcbmltcG9ydCBkZWNvcmF0ZUxhYmVsIGZyb20gJy4uL2hlbHBlcnMvbGFiZWwtZGVjb3JhdG9yJ1xuXG4vLyBIYW5kbGVyIG1ldGFkYXRhLlxuZXhwb3J0IGNvbnN0IG5hbWUgPSAnbm90aWNlJ1xuZXhwb3J0IGNvbnN0IGxldmVsID0gTG9nZ2luZ0xldmVsLk5vdGljZVxuZXhwb3J0IGNvbnN0IGxhYmVsID0gZGVjb3JhdGVMYWJlbCgnTk9USUNFJywgQ29sb3JTY2hlbWUuUmVndWxhcilcblxuZXhwb3J0IGRlZmF1bHQgbnVsbFxuIiwiLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJ1xuaW1wb3J0IENvbG9yU2NoZW1lIGZyb20gJy4uL2hlbHBlcnMvY29sb3Itc2NoZW1lJ1xuaW1wb3J0IGRlY29yYXRlTGFiZWwgZnJvbSAnLi4vaGVscGVycy9sYWJlbC1kZWNvcmF0b3InXG5cbi8vIEhhbmRsZXIgbWV0YWRhdGEuXG5leHBvcnQgY29uc3QgbmFtZSA9ICdpbmZvJ1xuZXhwb3J0IGNvbnN0IGxldmVsID0gTG9nZ2luZ0xldmVsLkluZm9cbmV4cG9ydCBjb25zdCBsYWJlbCA9IGRlY29yYXRlTGFiZWwoJ0lORk8nLCBDb2xvclNjaGVtZS5SZWd1bGFyKVxuXG5leHBvcnQgZGVmYXVsdCBudWxsXG4iLCIvLyBMb2NhbCBoZWxwZXJzLlxuaW1wb3J0IExvZ2dpbmdMZXZlbCBmcm9tICcuLi9oZWxwZXJzL2xvZ2dpbmctbGV2ZWwnXG5pbXBvcnQgQ29sb3JTY2hlbWUgZnJvbSAnLi4vaGVscGVycy9jb2xvci1zY2hlbWUnXG5pbXBvcnQgZGVjb3JhdGVMYWJlbCBmcm9tICcuLi9oZWxwZXJzL2xhYmVsLWRlY29yYXRvcidcblxuLy8gSGFuZGxlciBtZXRhZGF0YS5cbmV4cG9ydCBjb25zdCBuYW1lID0gJ2h0dHAnXG5leHBvcnQgY29uc3QgbGV2ZWwgPSBMb2dnaW5nTGV2ZWwuSHR0cFxuZXhwb3J0IGNvbnN0IGxhYmVsID0gZGVjb3JhdGVMYWJlbCgnSFRUUCcsIENvbG9yU2NoZW1lLkh0dHApXG5cbmV4cG9ydCBkZWZhdWx0IG51bGxcbiIsIi8vIEhpZ2hsaWdodC5qc1xuaW1wb3J0IGhpZ2hsaWdodCBmcm9tICdjbGktaGlnaGxpZ2h0J1xuXG4vLyBMb2NhbCBoZWxwZXJzLlxuaW1wb3J0IExvZ2dpbmdMZXZlbCBmcm9tICcuLi9oZWxwZXJzL2xvZ2dpbmctbGV2ZWwnXG5pbXBvcnQgQ29sb3JTY2hlbWUgZnJvbSAnLi4vaGVscGVycy9jb2xvci1zY2hlbWUnXG5pbXBvcnQgZGVjb3JhdGVMYWJlbCBmcm9tICcuLi9oZWxwZXJzL2xhYmVsLWRlY29yYXRvcidcblxuLy8gVHlwZSBkZWZpbml0aW9ucy5cbnR5cGUgTG9nZ2luZ0RhdGEgPSB7IGxldmVsOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyB9ICYgUmVjb3JkPFByb3BlcnR5S2V5LCBhbnk+XG50eXBlIEhhbmRsZWREYXRhID0geyBsYWJlbDogc3RyaW5nLCBwYXlsb2FkOiBzdHJpbmcgfVxuXG4vLyBIYW5kbGVyIG1ldGFkYXRhLlxuZXhwb3J0IGNvbnN0IG5hbWUgPSAncXVlcnknXG5leHBvcnQgY29uc3QgbGV2ZWwgPSBMb2dnaW5nTGV2ZWwuUXVlcnlcbmV4cG9ydCBjb25zdCBsYWJlbCA9IGRlY29yYXRlTGFiZWwoJ1FVRVJZJywgQ29sb3JTY2hlbWUuUXVlcnkpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGhhbmRsZShkYXRhOiBMb2dnaW5nRGF0YSk6IEhhbmRsZWREYXRhIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgcGF5bG9hZCA9IGhpZ2hsaWdodChkYXRhLm1lc3NhZ2UsIHsgbGFuZ3VhZ2U6ICdzcWwnIH0pXG5cblx0cmV0dXJuIHsgbGFiZWwsIHBheWxvYWQgfVxufVxuIiwiLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJ1xuaW1wb3J0IENvbG9yU2NoZW1lIGZyb20gJy4uL2hlbHBlcnMvY29sb3Itc2NoZW1lJ1xuaW1wb3J0IGRlY29yYXRlTGFiZWwgZnJvbSAnLi4vaGVscGVycy9sYWJlbC1kZWNvcmF0b3InXG5cbi8vIEhhbmRsZXIgbWV0YWRhdGEuXG5leHBvcnQgY29uc3QgbmFtZSA9ICd2ZXJib3NlJ1xuZXhwb3J0IGNvbnN0IGxldmVsID0gTG9nZ2luZ0xldmVsLlZlcmJvc2VcbmV4cG9ydCBjb25zdCBsYWJlbCA9IGRlY29yYXRlTGFiZWwoJ1ZFUkJPU0UnLCBDb2xvclNjaGVtZS5Mb3VkKVxuXG5leHBvcnQgZGVmYXVsdCBudWxsXG4iLCIvLyBMb2NhbCBoZWxwZXJzLlxuaW1wb3J0IExvZ2dpbmdMZXZlbCBmcm9tICcuLi9oZWxwZXJzL2xvZ2dpbmctbGV2ZWwnXG5pbXBvcnQgQ29sb3JTY2hlbWUgZnJvbSAnLi4vaGVscGVycy9jb2xvci1zY2hlbWUnXG5pbXBvcnQgZGVjb3JhdGVMYWJlbCBmcm9tICcuLi9oZWxwZXJzL2xhYmVsLWRlY29yYXRvcidcblxuLy8gSGFuZGxlciBtZXRhZGF0YS5cbmV4cG9ydCBjb25zdCBuYW1lID0gJ2RlYnVnJ1xuZXhwb3J0IGNvbnN0IGxldmVsID0gTG9nZ2luZ0xldmVsLkRlYnVnXG5leHBvcnQgY29uc3QgbGFiZWwgPSBkZWNvcmF0ZUxhYmVsKCdERUJVRycsIENvbG9yU2NoZW1lLkxvdWQpXG5cbmV4cG9ydCBkZWZhdWx0IG51bGxcbiIsIi8vIEhhbmRsZXIgaW1wbGVtZW50YXRpb25zLlxuaW1wb3J0ICogYXMgRmF0YWxIYW5kbGVyIGZyb20gJy4vZmF0YWwnXG5pbXBvcnQgKiBhcyBFcnJvckhhbmRsZXIgZnJvbSAnLi9lcnJvcidcbmltcG9ydCAqIGFzIFdhcm5pbmdIYW5kbGVyIGZyb20gJy4vd2FybmluZydcbmltcG9ydCAqIGFzIE5vdGljZUhhbmRsZXIgZnJvbSAnLi9ub3RpY2UnXG5pbXBvcnQgKiBhcyBJbmZvSGFuZGxlciBmcm9tICcuL2luZm8nXG5pbXBvcnQgKiBhcyBIdHRwSGFuZGxlciBmcm9tICcuL2h0dHAnXG5pbXBvcnQgKiBhcyBRdWVyeUhhbmRsZXIgZnJvbSAnLi9xdWVyeSdcbmltcG9ydCAqIGFzIFZlcmJvc2VIYW5kbGVyIGZyb20gJy4vdmVyYm9zZSdcbmltcG9ydCAqIGFzIERlYnVnSGFuZGxlciBmcm9tICcuL2RlYnVnJ1xuXG5jb25zdCBoYW5kbGVycyA9IFtcblx0RmF0YWxIYW5kbGVyLFxuXHRFcnJvckhhbmRsZXIsXG5cdFdhcm5pbmdIYW5kbGVyLFxuXHROb3RpY2VIYW5kbGVyLFxuXHRJbmZvSGFuZGxlcixcblx0SHR0cEhhbmRsZXIsXG5cdFF1ZXJ5SGFuZGxlcixcblx0VmVyYm9zZUhhbmRsZXIsXG5cdERlYnVnSGFuZGxlcixcbl1cblxuZXhwb3J0IHR5cGUgTG9nZ2luZ0xldmVsTmFtZSA9ICh0eXBlb2YgaGFuZGxlcnMgZXh0ZW5kcyAoaW5mZXIgVClbXSA/IFQgOiBuZXZlcilbJ25hbWUnXVxuZXhwb3J0IGRlZmF1bHQgaGFuZGxlcnNcbiIsIi8vIFRoaXJkLXBhcnR5IG1vZHVsZXMuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgclRyYWNlciBmcm9tICdjbHMtcnRyYWNlcidcbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnbHV4b24nXG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd3aW5zdG9uJ1xuXG4vLyBMb2NhbCBoZWxwZXJzLlxuaW1wb3J0IExvZ2dpbmdMZXZlbCBmcm9tICcuLi9oZWxwZXJzL2xvZ2dpbmctbGV2ZWwnXG5cbi8vIEhhbmRsZXIgaW1wbGVtZW50YXRpb25zLlxuaW1wb3J0IGhhbmRsZXJzIGZyb20gJy4uL2hhbmRsZXJzJ1xuXG5leHBvcnQgZGVmYXVsdCBmb3JtYXQucHJpbnRmKGRhdGEgPT4ge1xuXHRjb25zdCB0aW1lc3RhbXAgPSBjaGFsay5ncmF5KERhdGVUaW1lLm5vdygpLnRvSVNPKHsgaW5jbHVkZU9mZnNldDogdHJ1ZSB9KSlcblx0Y29uc3QgaGFuZGxlciA9IGhhbmRsZXJzLmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSBkYXRhLmxldmVsKVxuXHRjb25zdCBmYWxsYmFjayA9IHsgbGFiZWw6IGhhbmRsZXI/LmxhYmVsLCBwYXlsb2FkOiBkYXRhLm1lc3NhZ2UgfVxuXHRjb25zdCBwZXJmb3JtSGFuZGxlID0gaGFuZGxlcj8uZGVmYXVsdCA/PyAoKCk6IHR5cGVvZiBmYWxsYmFjayA9PiBmYWxsYmFjaylcblxuXHQvLyBFeGVjdXRlIGhhbmRsZXIgYW5kIHRoZW4sIGdldCBkZWNvcmF0ZWQgcGF5bG9hZC5cblx0Y29uc3QgeyBsYWJlbCwgcGF5bG9hZCB9ID0gUmVmbGVjdC5hcHBseShwZXJmb3JtSGFuZGxlLCB1bmRlZmluZWQsIFsgZGF0YSBdKSA/PyBmYWxsYmFja1xuXG5cdGxldCBleHRyYUZpbmdlcnByaW50OiBzdHJpbmcgfCB1bmRlZmluZWRcblxuXHRpZiAoaGFuZGxlcj8ubGV2ZWwgPT09IExvZ2dpbmdMZXZlbC5IdHRwKSB7XG5cdFx0ZXh0cmFGaW5nZXJwcmludCA9IGRhdGEudHJhbnNhY3Rpb25JZFxuXHRcdFx0PyBgKFRyYW5zYWN0aW9uLUlEID0gJHtkYXRhLnRyYW5zYWN0aW9uSWQgYXMgc3RyaW5nfSlgXG5cdFx0XHQ6IGAoUmVxdWVzdC1JRCA9ICR7clRyYWNlci5pZCgpIGFzIHN0cmluZ30pYFxuXHR9XG5cblx0cmV0dXJuIGAke2xhYmVsIGFzIHN0cmluZ30gJHt0aW1lc3RhbXB9JHtleHRyYUZpbmdlcnByaW50ID8gYCAke2V4dHJhRmluZ2VycHJpbnR9YCA6ICcnfVxcbiR7cGF5bG9hZCBhcyBzdHJpbmd9YFxufSlcbiIsIi8vIE5vZGUuanMgYnVpbHQtaW4gQVBJcy5cbmltcG9ydCBjbHVzdGVyIGZyb20gJ2NsdXN0ZXInXG5pbXBvcnQgeyBlbnYgYXMgZW52aXJvbm1lbnRzIH0gZnJvbSAncHJvY2VzcydcbmltcG9ydCB7IGlzTWFpblRocmVhZCB9IGZyb20gJ3dvcmtlcl90aHJlYWRzJ1xuXG4vLyBUeXBlIGRlZmluaXRpb25zLlxuZXhwb3J0IGNvbnN0IEV4ZWN1dGlvbk1vZGUgPSB7XG5cdERldmVsb3BtZW50TW9kZTogJ2RldmVsb3BtZW50Jyxcblx0UHJvZHVjdGlvbk1vZGU6ICdwcm9kdWN0aW9uJyxcbn0gYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IENsdXN0ZXJpbmdNb2RlID0ge1xuXHRNYXN0ZXJQcm9jZXNzOiAwLFxuXHRXb3JrZXJQcm9jZXNzOiAxLFxufSBhcyBjb25zdFxuXG5leHBvcnQgY29uc3QgVGhyZWFkaW5nTW9kZSA9IHtcblx0TWFpblRocmVhZDogMCxcblx0V29ya2VyVGhyZWFkOiAxLFxufSBhcyBjb25zdFxuXG5leHBvcnQgdHlwZSBFeGVjdXRpb25Nb2RlID0gdHlwZW9mIEV4ZWN1dGlvbk1vZGVba2V5b2YgdHlwZW9mIEV4ZWN1dGlvbk1vZGVdXG5leHBvcnQgdHlwZSBDbHVzdGVyaW5nTW9kZSA9IHR5cGVvZiBDbHVzdGVyaW5nTW9kZVtrZXlvZiB0eXBlb2YgQ2x1c3RlcmluZ01vZGVdXG5leHBvcnQgdHlwZSBUaHJlYWRpbmdNb2RlID0gdHlwZW9mIFRocmVhZGluZ01vZGVba2V5b2YgdHlwZW9mIFRocmVhZGluZ01vZGVdXG5cbi8vIEV4cG9ydGluZ3MuXG5leHBvcnQgY29uc3QgZXhlY3V0aW9uTW9kZSA9IGVudmlyb25tZW50cy5OT0RFX0VOViBhcyBFeGVjdXRpb25Nb2RlID8/IEV4ZWN1dGlvbk1vZGUuRGV2ZWxvcG1lbnRNb2RlXG5cbmV4cG9ydCBjb25zdCBjbHVzdGVyaW5nTW9kZTogQ2x1c3RlcmluZ01vZGUgPSBjbHVzdGVyLmlzUHJpbWFyeSA/PyBjbHVzdGVyLmlzTWFzdGVyXG5cdD8gQ2x1c3RlcmluZ01vZGUuTWFzdGVyUHJvY2Vzc1xuXHQ6IENsdXN0ZXJpbmdNb2RlLldvcmtlclByb2Nlc3NcblxuZXhwb3J0IGNvbnN0IHRocmVhZGluZ01vZGU6IFRocmVhZGluZ01vZGUgPSBpc01haW5UaHJlYWRcblx0PyBUaHJlYWRpbmdNb2RlLk1haW5UaHJlYWRcblx0OiBUaHJlYWRpbmdNb2RlLldvcmtlclRocmVhZFxuIiwiLy8gTm9kZS5qcyBidWlsdC1pbiBBUElzLlxuaW1wb3J0IHtcblx0U1RBVFVTX0NPREVTLFxuXHRJbmNvbWluZ01lc3NhZ2UgYXMgSHR0cFJlcXVlc3QsXG5cdFNlcnZlclJlc3BvbnNlIGFzIEh0dHBSZXNwb25zZSxcbn0gZnJvbSAnaHR0cCdcblxuLy8gVGhpcmQtcGFydHkgbW9kdWxlcy5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcbmltcG9ydCBtb3JnYW4gZnJvbSAnbW9yZ2FuJ1xuaW1wb3J0IHByZXR0eUJ5dGVzIGZyb20gJ3ByZXR0eS1ieXRlcydcbmltcG9ydCBwcmV0dHlNcyBmcm9tICdwcmV0dHktbXMnXG5cbi8vIExvY2FsIGhlbHBlcnMuXG5pbXBvcnQgeyBFeGVjdXRpb25Nb2RlLCBleGVjdXRpb25Nb2RlIH0gZnJvbSAnLi4vaGVscGVycy9jb25zdGFudHMnXG5cbi8vIFR5cGUgZGVmaW5pdGlvbnMuXG5kZWNsYXJlIG1vZHVsZSAnbW9yZ2FuJyB7XG5cdGNvbnN0IGNvbWJpbmVkOiBtb3JnYW4uRm9ybWF0Rm5cbn1cblxuaW50ZXJmYWNlIFRva2VuSW5kZXhlciB7XG5cdFt0b2tlbk5hbWU6IHN0cmluZ106IChcblx0XHRyZXF1ZXN0OiBIdHRwUmVxdWVzdCxcblx0XHRyZXNwb25zZTogSHR0cFJlc3BvbnNlLFxuXHRcdC4uLmFyZ3M6IGFueVtdXG5cdCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkXG59XG5cbi8vIEhlbHBlcnMuXG5mdW5jdGlvbiBkZWNvcmF0ZVN0YXR1c0NvZGUoc3RhdHVzQ29kZToga2V5b2YgdHlwZW9mIFNUQVRVU19DT0RFUyk6IHN0cmluZyB7XG5cdGNvbnN0IGdyb3VwT2ZDb2RlID0gTWF0aC5mbG9vcihOdW1iZXIoc3RhdHVzQ29kZSkgLyAxMDApICogMTAwXG5cdGNvbnN0IGJhc2VNZXNzYWdlID0gYCR7c3RhdHVzQ29kZX0gJHtTVEFUVVNfQ09ERVNbc3RhdHVzQ29kZV0gYXMgc3RyaW5nfWBcblxuXHRzd2l0Y2ggKGdyb3VwT2ZDb2RlKSB7XG5cdGNhc2UgMjAwOiB7XG5cdFx0cmV0dXJuIGNoYWxrLmdyZWVuKGJhc2VNZXNzYWdlKVxuXHR9XG5cblx0Y2FzZSAzMDA6IHtcblx0XHRyZXR1cm4gY2hhbGsubWFnZW50YShiYXNlTWVzc2FnZSlcblx0fVxuXHRjYXNlIDQwMDpcblx0Y2FzZSA1MDA6IHtcblx0XHRyZXR1cm4gY2hhbGsucmVkKGJhc2VNZXNzYWdlKVxuXHR9XG5cblx0ZGVmYXVsdDoge1xuXHRcdHJldHVybiBjaGFsay5ncmF5KGJhc2VNZXNzYWdlKVxuXHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0Rm9yTW9yZ2FuKHRva2VuczogYW55LCByZXF1ZXN0OiBIdHRwUmVxdWVzdCwgcmVzcG9uc2U6IEh0dHBSZXNwb25zZSk6IHN0cmluZyB7XG5cdGZ1bmN0aW9uIF8odG9rZW46IHN0cmluZywgLi4uc3ViQXJnczogYW55W10pOiBzdHJpbmcgfCB2b2lkIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudFxuXHRcdHJldHVybiAodG9rZW5zIGFzIFRva2VuSW5kZXhlcilbdG9rZW5dKHJlcXVlc3QsIHJlc3BvbnNlLCAuLi5zdWJBcmdzKVxuXHR9XG5cblx0Ly8gUmF3IHZhbHVlcy5cblx0Y29uc3QgbWV0aG9kID0gXygnbWV0aG9kJylcblx0Y29uc3QgVVJMID0gXygndXJsJylcblx0Y29uc3QgaHR0cFZlcnNpb24gPSBgSFRUUC8ke18oJ2h0dHAtdmVyc2lvbicpIGFzIHN0cmluZ31gXG5cdGNvbnN0IHN0YXR1c0NvZGUgPSBOdW1iZXIoXygnc3RhdHVzJykpXG5cdGNvbnN0IGNvbnRlbnRMZW5ndGggPSBOdW1iZXIoXygncmVzJywgJ2NvbnRlbnQtbGVuZ3RoJykgPz8gLTEpXG5cdGNvbnN0IHJlc3BvbnNlVGltZSA9IE51bWJlcihfKCdyZXNwb25zZS10aW1lJykgPz8gLTEpXG5cblx0Ly8gRGVjb3JhdGVkIHZhbHVlcy5cblx0Y29uc3QgJG1ldGhvZCA9IGNoYWxrLmJvbGQobWV0aG9kKVxuXHRjb25zdCAkdmVyc2lvbiA9IGNoYWxrLnJnYig5OCwgMTc3LCAyNTUpKGh0dHBWZXJzaW9uKVxuXHRjb25zdCAkc3RhdHVzQ29kZSA9IGRlY29yYXRlU3RhdHVzQ29kZShzdGF0dXNDb2RlKVxuXHRjb25zdCAkY29udGVudExlbmd0aCA9IGNvbnRlbnRMZW5ndGggPj0gMCA/IHByZXR0eUJ5dGVzKGNvbnRlbnRMZW5ndGgpIDogJz8gQidcblx0Y29uc3QgJHJlc3BvbnNlVGltZSA9IHJlc3BvbnNlVGltZSA+PSAwID8gcHJldHR5TXMocmVzcG9uc2VUaW1lKSA6ICcnXG5cblx0Ly8gQWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cblx0Y29uc3QgbWV0YWRhdGEgPSBgKCR7JGNvbnRlbnRMZW5ndGh9LCAkeyRyZXNwb25zZVRpbWV9KWBcblxuXHRyZXR1cm4gW1xuXHRcdGDihpIgJHskbWV0aG9kfSAke1VSTCBhcyBzdHJpbmd9ICR7JHZlcnNpb259YCxcblx0XHRg4oaQICR7JHZlcnNpb259ICR7JHN0YXR1c0NvZGV9ICR7bWV0YWRhdGF9YCxcblx0XS5qb2luKCdcXG4nKVxufVxuXG5leHBvcnQgZGVmYXVsdCBleGVjdXRpb25Nb2RlID09PSBFeGVjdXRpb25Nb2RlLkRldmVsb3BtZW50TW9kZSA/IGZvcm1hdEZvck1vcmdhbiA6IG1vcmdhbi5jb21iaW5lZFxuIiwiLy8gTm9kZS5qcyBidWlsdC1pbiBBUElzLlxuaW1wb3J0IHsgSW5jb21pbmdNZXNzYWdlIGFzIEh0dHBSZXF1ZXN0LCBTZXJ2ZXJSZXNwb25zZSBhcyBIdHRwUmVzcG9uc2UgfSBmcm9tICdodHRwJ1xuaW1wb3J0IHsgUGFzc1Rocm91Z2ggfSBmcm9tICdzdHJlYW0nXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJ1xuXG4vLyBUaGlyZC1wYXJ0eSBtb2R1bGVzLlxuaW1wb3J0IG1vcmdhbiBmcm9tICdtb3JnYW4nXG5pbXBvcnQgKiBhcyB3aW5zdG9uIGZyb20gJ3dpbnN0b24nXG5pbXBvcnQgdHlwZSB7IGxldmVsIGFzIExvZ2dpbmdMZXZlbCwgTG9nZ2VyIGFzIEJhc2VMb2dnZXIgfSBmcm9tICd3aW5zdG9uJ1xuXG4vLyBGb3JtYXR0ZXJzLlxuaW1wb3J0IGZvcm1hdEZvckNMSSBmcm9tICcuLi9mb3JtYXR0ZXJzL2NvbW1hbmQtbGluZSdcbmltcG9ydCBmb3JtYXRGb3JNb3JnYW4gZnJvbSAnLi4vZm9ybWF0dGVycy9tb3JnYW4nXG5cbi8vIExvY2FsIGhlbHBlcnMuXG5pbXBvcnQgeyBFeGVjdXRpb25Nb2RlLCBleGVjdXRpb25Nb2RlIH0gZnJvbSAnLi4vaGVscGVycy9jb25zdGFudHMnXG5cbi8vIEhhbmRsZXIgaW1wbGVtZW50YXRpb25zLlxuaW1wb3J0IHR5cGUgeyBMb2dnaW5nTGV2ZWxOYW1lIH0gZnJvbSAnLi4vaGFuZGxlcnMnXG5pbXBvcnQgaGFuZGxlcnMgZnJvbSAnLi4vaGFuZGxlcnMnXG5cbi8vIFR5cGUgZGVmaW5pdGlvbnMuXG50eXBlIE1vcmdhbiA9IChyZXE6IEh0dHBSZXF1ZXN0LCByZXM6IEh0dHBSZXNwb25zZSwgbmV4dDogKGVycm9yPzogRXJyb3IpID0+IHZvaWQpID0+IHZvaWRcblxuLy8gVHJhbnNwb3J0cy5cbmNvbnN0IHsgQ29uc29sZTogQ29uc29sZVRyYW5zcG9ydCB9ID0gd2luc3Rvbi50cmFuc3BvcnRzXG5cbmNsYXNzIExvZ2dlciB7XG5cdHN0YXRpYyAjaW5zdGFuY2U/OiBMb2dnZXJcblxuXHQjbG9nZ2VyOiBCYXNlTG9nZ2VyID0gd2luc3Rvbi5jcmVhdGVMb2dnZXIoe1xuXHRcdGxldmVsczogT2JqZWN0LmZyb21FbnRyaWVzKFxuXHRcdFx0aGFuZGxlcnNcblx0XHRcdFx0Lm1hcCgoeyBuYW1lLCBsZXZlbCB9KSA9PiBbIG5hbWUsIGxldmVsIF0gYXMgY29uc3QpXG5cdFx0XHRcdC5maWx0ZXIoKFsgLCBsZXZlbCBdKSA9PiB0eXBlb2YgbGV2ZWwgPT09ICdudW1iZXInKSxcblx0XHQpLFxuXG5cdFx0bGV2ZWw6IChleGVjdXRpb25Nb2RlID09PSBFeGVjdXRpb25Nb2RlLlByb2R1Y3Rpb25Nb2RlID8gJ2h0dHAnIDogJ3ZlcmJvc2UnKSBhcyB0eXBlb2YgTG9nZ2luZ0xldmVsLFxuXG5cdFx0dHJhbnNwb3J0czogW1xuXHRcdFx0bmV3IENvbnNvbGVUcmFuc3BvcnQoeyBmb3JtYXQ6IGZvcm1hdEZvckNMSSB9KSxcblx0XHRdLFxuXG5cdFx0ZXhpdE9uRXJyb3I6IGZhbHNlLFxuXHR9KVxuXG5cdCNtb3JnYW46IE1vcmdhbiA9IG1vcmdhbihmb3JtYXRGb3JNb3JnYW4sIHtcblx0XHRzdHJlYW06IG5ldyBQYXNzVGhyb3VnaCh7IG9iamVjdE1vZGU6IHRydWUgfSkub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG5cdFx0XHR0aGlzLmxvZygnaHR0cCcsIGRhdGEudHJpbSgpKVxuXHRcdH0pLFxuXHR9KSBhcyBNb3JnYW5cblxuXHRwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuXHRcdGlmIChuZXcudGFyZ2V0ICE9PSBMb2dnZXIpIHtcblx0XHRcdHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcignTG9nZ2VyIGNsYXNzIGlzIG5vdCBpbmhlcml0YWJsZScpXG5cdFx0fVxuXG5cdFx0aWYgKExvZ2dlci4jaW5zdGFuY2UpIHtcblx0XHRcdHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcignTG9nZ2VyIGNsYXNzIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBpbiBkaXJlY3RseScpXG5cdFx0fVxuXG5cdFx0TG9nZ2VyLiNpbnN0YW5jZSA9IHRoaXNcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dnaW5nIG1lc3NhZ2Ugd2l0aCBzcGVjaWZpYyBsZXZlbC5cblx0ICpcblx0ICogQHBhcmFtIGxldmVsXG5cdCAqIEBwYXJhbSBtZXNzYWdlXG5cdCAqIEBwYXJhbSBhcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEuXG5cdCAqL1xuXHRwdWJsaWMgbG9nKGxldmVsOiBMb2dnaW5nTGV2ZWxOYW1lLCBtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZFxuXG5cdC8qKlxuXHQgKiBMb2dnaW5nIEhUVFAgSS9PLlxuXHQgKlxuXHQgKiBAcGFyYW0gcmVxdWVzdCBOb2RlLmpzIGJ1aWx0LWluIGBJbmNvbWluZ01lc3NhZ2VgIGluc3RhbmNlIGZyb20gYGh0dHBgIG1vZHVsZS5cblx0ICogQHBhcmFtIHJlc3BvbnNlIE5vZGUuanMgYnVpbHQtaW4gYFNlcnZlclJlc3BvbnNlYCBpbnN0YW5jZSBmcm9tIGBodHRwYCBtb2R1bGUuXG5cdCAqL1xuXHRwdWJsaWMgbG9nKHJlcXVlc3Q6IEh0dHBSZXF1ZXN0LCByZXNwb25zZTogSHR0cFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPlxuXG5cdC8qKlxuXHQgKiBMb2dnaW5nIGVycm9ycyBpbiBkZXRhaWwuXG5cdCAqXG5cdCAqIEBwYXJhbSBlcnJvclxuXHQgKi9cblx0cHVibGljIGxvZyhlcnJvcjogRXJyb3IpOiB2b2lkXG5cblx0cHVibGljIGxvZyguLi5hcmdzOiBhbnlbXSk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBsb2dnZXIgPSB0aGlzLiNsb2dnZXJcblx0XHRjb25zdCBmb3JtYXQgPSB0aGlzLiNtb3JnYW5cblxuXHRcdHN3aXRjaCAodHJ1ZSkge1xuXHRcdGNhc2UgKGFyZ3MubGVuZ3RoID49IDIgJiYgYXJnc1swXSBpbnN0YW5jZW9mIEh0dHBSZXF1ZXN0ICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpOiB7XG5cdFx0XHRjb25zdCBbIHJlcXVlc3QsIHJlc3BvbnNlIF0gPSBhcmdzIGFzIFsgSHR0cFJlcXVlc3QsIEh0dHBSZXNwb25zZSBdXG5cblx0XHRcdHJldHVybiBwcm9taXNpZnkoZm9ybWF0KShyZXF1ZXN0LCByZXNwb25zZSlcblx0XHR9XG5cblx0XHRjYXNlIChhcmdzLmxlbmd0aCA+PSAxICYmIGFyZ3NbMF0gaW5zdGFuY2VvZiBFcnJvcik6IHtcblx0XHRcdGNvbnN0IFsgZXJyb3IsIC4uLmRhdGEgXSA9IGFyZ3MgYXMgWyBFcnJvciwgLi4uYW55W10gXVxuXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudFxuXHRcdFx0bG9nZ2VyLmxvZygnZXJyb3InLCBlcnJvci5tZXNzYWdlLCBlcnJvciwgLi4uZGF0YSlcblxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZFxuXHRcdH1cblxuXHRcdGRlZmF1bHQ6IHtcblx0XHRcdGNvbnN0IFsgbGV2ZWwsIG1lc3NhZ2UsIC4uLmRhdGEgXSA9IGFyZ3MgYXMgWyB0eXBlb2YgTG9nZ2luZ0xldmVsLCBzdHJpbmcsIC4uLmFueVtdIF1cblxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnRcblx0XHRcdGxvZ2dlci5sb2cobGV2ZWwsIG1lc3NhZ2UsIC4uLmRhdGEpXG5cblx0XHRcdHJldHVybiB1bmRlZmluZWRcblx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlZmxlY3QuY29uc3RydWN0KExvZ2dlciwgW10sIExvZ2dlcikgYXMgTG9nZ2VyXG4iXSwibmFtZXMiOlsiTG9nZ2luZ0xldmVsIiwiRmF0YWwiLCJFcnJvciIsIldhcm5pbmciLCJOb3RpY2UiLCJJbmZvIiwiSHR0cCIsIlF1ZXJ5IiwiVmVyYm9zZSIsIkRlYnVnIiwiY29sb3JpemVyTWFwIiwiX01hcCIsImNyZWF0ZVNjaGVtZSIsIm9wdGlvbnMiLCJuZXh0SW5kZXgiLCJzaXplIiwiY29sb3JpemVyIiwiY2hhbGsiLCJiZ0hleCIsImJhY2tncm91bmQiLCJoZXgiLCJmb3JlZ3JvdW5kIiwic2V0IiwiQ29sb3JWYWx1ZSIsIldoaXRlIiwiR3JheSIsIkJsYWNrIiwiQ3JpdGljYWwiLCJSZWd1bGFyIiwiQ29sb3JTY2hlbWUiLCJMb3VkIiwiZ2V0Q2hhbGtPZiIsImNvbG9yU2V0IiwiZ2V0IiwiaXNUVFkiLCJwcm9jZXNzIiwic3Rkb3V0IiwiaXNOb3RPbkNMSSIsImRlY29yYXRlTGFiZWwiLCJsYWJlbCIsInNjaGVtZSIsImRlY29yYXRlZExhYmVsIiwiYm9sZCIsInJvb3RQYXRoIiwiY3dkIiwiY29uanVuY3Rpb24iLCJibHVlIiwic3BsYXQiLCJfU3ltYm9sJGZvciIsIm5hbWUiLCJsZXZlbCIsInNpbXBsaWZ5RGF0YVVSSSIsImRhdGFVUkkiLCJhY3R1YWxDb250ZW50Iiwic3BsaXQiLCJwaXZvdCIsIl9pbmRleE9mSW5zdGFuY2VQcm9wZXJ0eSIsImNhbGwiLCJtaW1lSW5kaWNhdG9yIiwiX3NsaWNlSW5zdGFuY2VQcm9wZXJ0eSIsImNvbnRlbnRQcmVmaXgiLCJjb250ZW50U3VmZml4IiwiaXNEYXRhVVJJIiwiZmlsZW5hbWUiLCJfc3RhcnRzV2l0aEluc3RhbmNlUHJvcGVydHkiLCJpc0Fic29sdXRlT3JEYXRhVVJJIiwicGF0aCIsImlzQWJzb2x1dGUiLCJtYXBMb2NhdGlvbk9mRXJyb3JUaHJvd24iLCJ0YXJnZXQiLCJyZWxhdGl2ZSIsImdyYXkiLCJfaW5jbHVkZXNJbnN0YW5jZVByb3BlcnR5IiwiX2xhc3RJbmRleE9mSW5zdGFuY2VQcm9wZXJ0eSIsInJlcGxhY2UiLCJfIiwibW9kdWxlTmFtZSIsInRyYWlsaW5nIiwic2VwIiwidW5kZXJsaW5lIiwiZGlybmFtZSIsImJhc2VuYW1lIiwiaGFuZGxlIiwiZGF0YSIsIl9jb250ZXh0IiwiX2NvbnRleHQyIiwiX2NvbnRleHQzIiwiZXJyb3IiLCJ1bmRlZmluZWQiLCJlcnJvck5hbWUiLCJtZXNzYWdlIiwic3RhY2siLCJyYXdTdGFjayIsIl9tYXBJbnN0YW5jZVByb3BlcnR5IiwibGVuZ3RoIiwibGluZSIsImNvbnRleHROYW1lIiwicmF3TG9jYXRpb24iLCJsb2NhdGlvbiIsIm9jY3VycmVkTGluZSIsInZlcnNpb24iLCJvY2N1cnJlZENvbHVtbiIsImpvaW4iLCJwYXlsb2FkIiwiaGlnaGxpZ2h0IiwibGFuZ3VhZ2UiLCJoYW5kbGVycyIsIkZhdGFsSGFuZGxlciIsIkVycm9ySGFuZGxlciIsIldhcm5pbmdIYW5kbGVyIiwiTm90aWNlSGFuZGxlciIsIkluZm9IYW5kbGVyIiwiSHR0cEhhbmRsZXIiLCJRdWVyeUhhbmRsZXIiLCJWZXJib3NlSGFuZGxlciIsIkRlYnVnSGFuZGxlciIsImZvcm1hdCIsInByaW50ZiIsInRpbWVzdGFtcCIsIkRhdGVUaW1lIiwibm93IiwidG9JU08iLCJpbmNsdWRlT2Zmc2V0IiwiaGFuZGxlciIsIl9maW5kSW5zdGFuY2VQcm9wZXJ0eSIsImZhbGxiYWNrIiwicGVyZm9ybUhhbmRsZSIsImRlZmF1bHQiLCJfUmVmbGVjdCRhcHBseSIsImV4dHJhRmluZ2VycHJpbnQiLCJ0cmFuc2FjdGlvbklkIiwiclRyYWNlciIsImlkIiwiRXhlY3V0aW9uTW9kZSIsIkRldmVsb3BtZW50TW9kZSIsIlByb2R1Y3Rpb25Nb2RlIiwiQ2x1c3RlcmluZ01vZGUiLCJNYXN0ZXJQcm9jZXNzIiwiV29ya2VyUHJvY2VzcyIsImV4ZWN1dGlvbk1vZGUiLCJlbnZpcm9ubWVudHMiLCJOT0RFX0VOViIsImNsdXN0ZXIiLCJpc1ByaW1hcnkiLCJpc01hc3RlciIsImRlY29yYXRlU3RhdHVzQ29kZSIsInN0YXR1c0NvZGUiLCJncm91cE9mQ29kZSIsIk1hdGgiLCJmbG9vciIsIk51bWJlciIsImJhc2VNZXNzYWdlIiwiU1RBVFVTX0NPREVTIiwiZ3JlZW4iLCJtYWdlbnRhIiwicmVkIiwiZm9ybWF0Rm9yTW9yZ2FuIiwidG9rZW5zIiwicmVxdWVzdCIsInJlc3BvbnNlIiwidG9rZW4iLCJzdWJBcmdzIiwibWV0aG9kIiwiVVJMIiwiaHR0cFZlcnNpb24iLCJjb250ZW50TGVuZ3RoIiwicmVzcG9uc2VUaW1lIiwiJG1ldGhvZCIsIiR2ZXJzaW9uIiwicmdiIiwiJHN0YXR1c0NvZGUiLCIkY29udGVudExlbmd0aCIsInByZXR0eUJ5dGVzIiwiJHJlc3BvbnNlVGltZSIsInByZXR0eU1zIiwibWV0YWRhdGEiLCJtb3JnYW4iLCJjb21iaW5lZCIsIkNvbnNvbGUiLCJDb25zb2xlVHJhbnNwb3J0Iiwid2luc3RvbiIsInRyYW5zcG9ydHMiLCJMb2dnZXIiLCJjcmVhdGVMb2dnZXIiLCJsZXZlbHMiLCJfT2JqZWN0JGZyb21FbnRyaWVzIiwiX2ZpbHRlckluc3RhbmNlUHJvcGVydHkiLCJmb3JtYXRGb3JDTEkiLCJleGl0T25FcnJvciIsInN0cmVhbSIsIlBhc3NUaHJvdWdoIiwib2JqZWN0TW9kZSIsIm9uIiwibG9nIiwiX3RyaW1JbnN0YW5jZVByb3BlcnR5IiwiY29uc3RydWN0b3IiLCJuZXciLCJSZWZlcmVuY2VFcnJvciIsImFyZ3MiLCJsb2dnZXIiLCJIdHRwUmVxdWVzdCIsIkh0dHBSZXNwb25zZSIsInByb21pc2lmeSIsIl9SZWZsZWN0JGNvbnN0cnVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsTUFBTUEsWUFBWSxHQUFHO0FBQ3BCO0FBQ0FDLEVBQUFBLEtBQUssRUFBRSxDQUFDO0FBQ1JDLEVBQUFBLEtBQUssRUFBRSxDQUFDO0FBRVI7QUFDQUMsRUFBQUEsT0FBTyxFQUFFLENBQUM7QUFFVjtBQUNBQyxFQUFBQSxNQUFNLEVBQUUsQ0FBQztBQUNUQyxFQUFBQSxJQUFJLEVBQUUsQ0FBQztBQUVQO0FBQ0FDLEVBQUFBLElBQUksRUFBRSxDQUFDO0FBQ1BDLEVBQUFBLEtBQUssRUFBRSxDQUFDO0FBRVI7QUFDQUMsRUFBQUEsT0FBTyxFQUFFLENBQUM7QUFDVkMsRUFBQUEsS0FBSyxFQUFFO0FBQ1IsQ0FBVTs7QUNoQlY7QUFDQSxNQUFNQyxZQUFZLEdBQUcsSUFBQUMsSUFBQSxFQUFnQzs7QUFFckQ7QUFDQSxTQUFTQyxZQUFZQSxDQUFDQyxPQUEyRCxFQUFVO0FBQzFGLEVBQUEsTUFBTUMsU0FB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